pax_global_header00006660000000000000000000000064143312752270014520gustar00rootroot0000000000000052 comment=7cccdc1efcd165f36582c73b43634006e1f5ad17 gamgi-0.17.5/000077500000000000000000000000001433127522700126765ustar00rootroot00000000000000gamgi-0.17.5/AUTHORS000066400000000000000000000003431433127522700137460ustar00rootroot00000000000000Carlos Pereira first author, source code, web site, documentation. Jakub Szypulka Tango! icons. Andre Truter old rpms and debs. gamgi-0.17.5/CONTRIBUTORS000066400000000000000000000032761433127522700145660ustar00rootroot00000000000000We would like to thank the following people, for their contributions to GAMGI. Without them, GAMGI would be just a dream: - Brian Paul, for creating Mesa, and all the people in the mesa3d-users@lists.sourceforge.net mailling list, for their expert assistance. - The hundreds of developers that created GTK, Havoc Pennington and all the people in the gtk-app-devel-list@gnome.org mailling list, for their expert assistance and spirit of community. - Janne Lof, for writing GTKGLArea. - James Clark, for creating Expat, and all the people in the expat-discuss@lists.sourceforge.net mailling list, who continued the project, for their assistance. - SGI, for freely providing the code for the trackball routines, implemented by Gavin Bell (with help from Thant Tessman, David M. Ciemiewicz, Mark Grossman, Henry Moreton, and Paul Haeberli). - Jose Luis Martins, for the Voronoi bond algorithm. - Sun Microsystems and the X Consortium, for the Roman and Roman Mono Space stroked fonts. - Allen V. Hershey and the U.S. Naval Weapons Laboratory, Norman Wolcott and the U.S. National Bureau of Standards, Bob Beach and Thomas Wolff, for the Hershey stroked fonts. - James Marshall and several other people, who published excellent documentation and code on the web, explaining the HTTP protocol. - Jarle Aase and several other people, who published excellent documentation and code on the web, explaining the FTP protocol. - Serguei Patchkovskii, for the point symmetry code. - Allen Barnett, for the OGLFT library, which code was used for the extruded fonts - Linas Vepstas, for the GLE library, which code was used for the extruded fonts - The FreeType Team, for the library to handle TrueType fonts gamgi-0.17.5/DISTROS000066400000000000000000000033471433127522700137570ustar00rootroot00000000000000- ENVIRONMENT VARIABLES - GAMGI requires two environment variables, GAMGI_HELP and GAMGI_TEXT. GAMGI_HELP should point to the directory doc/, where the Help documentation files are. GAMGI_TEXT should indicate where are the ten Bitstream Vera Truetype fonts, that are also distributed by GAMGI: VeraBI.ttf VeraMoBd.ttf VeraMoIt.ttf VeraSeBd.ttf Vera.ttf VeraBd.ttf VeraIt.ttf VeraMoBI.ttf VeraMono.ttf VeraSe.ttf If your distribution does not come with these files, just set GAMGI_TEXT to the directory src/io/fonts/. If your distribution already has these files, remove src/io/fonts/ and point GAMGI_TEXT to the system directory containing them. For example, in Debian: /usr/share/fonts/truetype/ttf-bitstream-vera/ The best solution is probably to launch gamgi from a wrapper script, as in the following working example, that reads files from the command line and automatically sets GAMGI_HELP and GAMGI_TEXT: #!/bin/sh GAMGI_HELP=/usr/local/gamgi/doc export GAMGI_HELP GAMGI_TEXT=/usr/share/fonts/truetype/ttf-bitstream-vera export GAMGI_TEXT exec /usr/local/bin/gamgi "$@" To check that these variables are properly set, select File->Import and choose dat/text/keyboard.xml, then select Help->Current. - DATA FILES - The wrapper script above can be used to read any data files from the command line (see the man page). - MAN PAGES - The GAMGI man page is at doc/man/, with instructions. - ICONS - The GAMGI icons are at doc/icon/. Currently only rasterized transparent png images are available, with 316x316, 128x128, 48x48, 32x32, 22x22, 16x16 pixels. Read doc/icon/icon.html to see the images and an explanation. If GAMGI is part of your distribution, we would be delighted to know about it, just send us a note, to . gamgi-0.17.5/INSTALL000066400000000000000000000050751433127522700137360ustar00rootroot00000000000000- COMPILATION - 1) GAMGI requires the following libraries (latest releases suggested): GtkGLext 1.0, Mesa, Gtk 2.0, Atk-1.0, Pango-1.0, Cairo, Glib-2.0, Expat, Freetype 2.0. Both library (.so) and header (.h) files must be installed, before compiling GAMGI. Modern Linux distributions come with all these files, often already installed. Installing GtkGLext 1.0 forces the installation of all the other libraries (except Expat). 2) When the files are not in standard locations, edit src/make_local to add your local paths. Some of the most common PC and Mac configurations are commented below. 3) To change compile options edit the file "make_rules" (not needed). 4) Type "make" to create and "make clean" to remove object files and executable. - INSTALLATION - 5) We suggest creating a root directory "gamgi" the first time and then unarchive the tarball inside, this way automatically creating a sub-directory "gamgi_version" for each new version. For example, /opt/gamgi/ or /usr/local/gamgi/ or /home/carlos/gamgi. We suggest creating two links, one inside the "gamgi" directory: ln -s gamgi_version gamgi and another inside the "/usr/local/bin" directory, for example: ln -s ~/gamgi/gamgi/src/gamgi gamgi With the second link GAMGI can be seen everywhere, and when installing a new version, we need only to change the first link. 6) Set the environment variable "GAMGI_HELP", to let Gamgi know where are the local documentation files. For example, add a line as this to file ~/.bashrc (or ~/.profile, in some systems): GAMGI_HELP=~/gamgi/gamgi/doc; export GAMGI_HELP 7) Set the environment variable "GAMGI_TEXT", to indicate where are the DeJaVu TrueType fonts used by GAMGI. For example, if these fonts are in /usr/share/fonts/truetype/ttf-dejavu, the usual place for most Linux distributions, just add this line to file ~/.bashrc (or ~/.profile, in some systems): GAMGI_TEXT=/usr/share/fonts/truetype/ttf-dejavu; export GAMGI_TEXT If these fonts are not available, just download them from dejavu.sourceforge.net, www.gamgi.org or ftp.gamgi.org. 8) Set the environment variable "BROWSER", to let GAMGI know which browser to launch, in case "Help Remote" is solicited. For example, add a line as this to file ~/.bashrc (or ~/.profile, in some systems): BROWSER=firefox; export BROWSER - HELP - 9) Compiling and installing GAMGI is trivial, _as_long_as_ all libraries can be seen at compile time, link time and run time. If problems arise, please see doc/installation/. To contact the author send a message to . 10) To install a man page and an icon, see DISTROS. gamgi-0.17.5/SUPPORTERS000066400000000000000000000004641433127522700143530ustar00rootroot00000000000000Materials Engineering Department, Instituto Superior Técnico, Lisboa, for financial and academic support. GALTEC, Instituto Superior Técnico, Lisboa, for legal support. Luís Santos, for many good ideias regarding GAMGI graphic interfaces. José Castello Branco, for his UNIX expert advice and assistance. gamgi-0.17.5/dat/000077500000000000000000000000001433127522700134465ustar00rootroot00000000000000gamgi-0.17.5/dat/all.xml000066400000000000000000000123421433127522700147420ustar00rootroot00000000000000 gamgi-0.17.5/dat/assembly/000077500000000000000000000000001433127522700152655ustar00rootroot00000000000000gamgi-0.17.5/dat/assembly/recursive.xml000066400000000000000000000003101433127522700200100ustar00rootroot00000000000000 gamgi-0.17.5/dat/atom/000077500000000000000000000000001433127522700144065ustar00rootroot00000000000000gamgi-0.17.5/dat/atom/solid.xml000066400000000000000000000000701433127522700162370ustar00rootroot00000000000000 gamgi-0.17.5/dat/atom/wired.xml000066400000000000000000000000701433127522700162370ustar00rootroot00000000000000 gamgi-0.17.5/dat/bond/000077500000000000000000000000001433127522700143705ustar00rootroot00000000000000gamgi-0.17.5/dat/bond/solid.xml000066400000000000000000000000701433127522700162210ustar00rootroot00000000000000 gamgi-0.17.5/dat/bond/wired.xml000066400000000000000000000000701433127522700162210ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/000077500000000000000000000000001433127522700143655ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/Al_M/000077500000000000000000000000001433127522700151755ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/Al_M/Al3Nb_bw.xml000066400000000000000000000113531433127522700173110ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/Al_M/Al4Cr_ab.xml000066400000000000000000011334331433127522700172760ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/Al_M/Al4Cr_ab_abc.txt000066400000000000000000000003541433127522700201140ustar00rootroot00000000000000group 194 P6_3/mmc Al4Cr alloy left: along direction [001] right: in perspective hP lattice a = 1.998 nm c = 2.467 nm Amelia Almeida, Desenvolvimento de Ligas Aluminio-Metal de Transicao por Sintese Assistida por Laser, PhD thesis gamgi-0.17.5/dat/cell/Al_M/Al4Cr_abc.xml000066400000000000000000011332131433127522700174350ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/Al_M/Al5Mo_h.xml000066400000000000000000000265341433127522700171550ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/Al_M/Al5Mo_h_bw.xml000066400000000000000000000267011433127522700176410ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/Al_M/Al5Mo_r.xml000066400000000000000000000675671433127522700172020ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/Al_M/Al7Cr.xml000066400000000000000000000547301433127522700166400ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/Al_M/Al7Cr_bw.xml000066400000000000000000000555561433127522700173370ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/Al_M/screen_Al4Cr_ab_abc.xml000066400000000000000000007136501433127522700214460ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/Al_M/screen_Al5Mo_h_r.xml000066400000000000000000000436511433127522700210340ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/etc/000077500000000000000000000000001433127522700151405ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/etc/berilo.xml000066400000000000000000001100001433127522700171260ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/etc/blenda.xml000066400000000000000000000053141433127522700171120ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/etc/calcite.xml000066400000000000000000000371561433127522700173020ustar00rootroot00000000000000 -3.7771 7.2019 7.1088 -1.8536 8.3124 7.1088 -1.8536 6.0913 7.1088 1 3 0 1 2 -1.2823 5.7615 1.4218 0.6412 4.6510 1.4218 0.6412 6.8720 1.4218 1 3 0 1 2 0.6412 3.9913 7.1088 -1.2823 2.8807 7.1088 0.6412 1.7702 7.1088 1 3 0 1 2 -0.6412 4.6510 9.9523 1.2823 5.7615 9.9523 -0.6412 6.8720 9.9523 1 3 0 1 2 -3.1360 8.3124 15.6393 -1.2125 7.2019 15.6393 -3.1360 6.0913 15.6393 1 3 0 1 2 3.1360 2.5509 1.4217 1.2125 1.4404 1.4218 3.1360 0.3298 1.4217 1 3 0 1 2 5.6308 6.8720 1.4218 5.6308 4.6510 1.4217 3.7073 5.7615 1.4218 1 3 0 1 2 1.8536 5.4316 4.2653 3.7771 4.3211 4.2653 1.8536 3.2106 4.2653 1 3 0 1 2 1.8536 2.5509 9.9523 3.7771 1.4404 9.9522 1.8536 0.3298 9.9522 1 3 0 1 2 3.1360 8.3124 7.1088 3.1360 6.0913 7.1088 1.2125 7.2019 7.1088 1 3 0 1 2 3.1360 5.4316 12.7958 3.1360 3.2106 12.7958 1.2125 4.3211 12.7958 1 3 0 1 2 -0.6412 1.7702 15.6393 1.2823 2.8807 15.6393 -0.6412 3.9913 15.6393 1 3 0 1 2 1.8536 6.0913 15.6393 3.7771 7.2019 15.6393 1.8536 8.3124 15.6393 1 3 0 1 2 8.1256 2.5509 1.4217 8.1256 0.3298 1.4217 6.2021 1.4404 1.4217 1 3 0 1 2 5.6308 3.9913 7.1087 3.7073 2.8807 7.1087 5.6308 1.7702 7.1087 1 3 0 1 2 4.3484 4.6510 9.9523 6.2719 5.7615 9.9523 4.3484 6.8720 9.9523 1 3 0 1 2 4.3484 1.7702 15.6392 4.3484 3.9913 15.6393 6.2719 2.8807 15.6392 1 3 0 1 2 6.8432 0.3298 9.9522 8.7667 1.4404 9.9522 6.8432 2.5509 9.9522 1 3 0 1 2 gamgi-0.17.5/dat/cell/etc/calcite_solid.xml000066400000000000000000000202061433127522700204600ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/etc/calcite_wired.xml000066400000000000000000000202061433127522700204600ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/etc/fluorapatite.txt000066400000000000000000000012461433127522700204030ustar00rootroot00000000000000Fluorapatite: Ca10(PO4)6F2 Space group: 176 lattice parameters: Ca10(PO4)6F2 Ca10(PO4)6(OH)2 9.3642 6.8811 9.4166 6.8745 Wyckoff: Ca 4f, z = 0.001 Ca 6h, x = 0.246 y = 0.993 P 6h, x = 0.400 y = 0.369 O 6h, x = 0.329 y = 0.484 O 6h, x = 0.589 y = 0.466 O 12i, x = 0.348 y = 0.259 z = 0.073 F 2a Source: 1) Posner A.S., A. Perloff, and A.F. Diorio, Acta Cryst. 11, 308 (1958) (Wyckoff positions) 2) Anthony J.W., Bideaux R.A., Bladh K.W., and Nichols M.C., Handbook of Mineralogy, http://www.handbookofmineralogy.org/ (hydroxylapatite lattice parameters) 3) Chinthaka Silva G.W., Longzhou Ma, Hemmers O., Lindle D., Micron 39, 269 (2088) (fluorapatite lattice parameters) gamgi-0.17.5/dat/cell/etc/fluorapatite.xml000066400000000000000000000235541433127522700203720ustar00rootroot00000000000000 3.3337 3.7791 1.7203 0.8147 3.9251 1.7203 2.0461 2.1004 0.5023 2.0461 2.1004 2.9382 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -1.6060 4.7766 5.1608 -2.9919 2.6681 5.1608 -0.7960 2.8222 3.9429 -0.7960 2.8222 6.3788 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.4246 0.9975 1.7203 6.5222 0.7218 2.9382 5.5577 -1.2570 1.7203 6.5222 0.7218 0.5023 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.2881 3.3331 1.7203 5.4781 5.2875 2.9382 7.6740 5.4416 1.7203 5.4781 5.2875 0.5023 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 1.3484 4.3305 5.1608 2.6360 6.0092 6.3788 3.8674 4.1846 5.1608 2.6360 6.0092 3.9429 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.2575 7.1121 5.1608 -0.8756 9.3666 5.1608 -1.8401 7.3879 3.9429 -1.8401 7.3879 6.3788 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 gamgi-0.17.5/dat/cell/etc/olivina.xml000066400000000000000000000311411433127522700173230ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/etc/screen_YBa2Cu3O7-x.xml000066400000000000000000001354631433127522700210200ustar00rootroot00000000000000 7.6452 5.8313 7.2532 7.6449 9.7185 7.2533 5.7337 7.7748 7.2661 9.5563 7.7751 7.2661 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.6451 5.8313 4.4267 5.7336 7.7748 4.4139 7.6448 9.7186 4.4267 9.5563 7.7751 4.4138 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.8221 9.7183 4.4268 5.7336 7.7748 4.4139 3.8224 5.8310 4.4268 1.9109 7.7746 4.4140 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.8225 5.8310 7.2534 3.8222 9.7182 7.2535 1.9110 7.7744 7.2664 5.7337 7.7748 7.2661 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.8225 9.7181 16.1071 5.7340 7.7746 16.0941 3.8228 5.8308 16.1070 1.9113 7.7743 16.0942 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.6455 5.8310 16.1069 5.7340 7.7746 16.0941 7.6452 9.7183 16.1069 9.5567 7.7748 16.0940 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.8229 5.8308 18.9336 5.7341 7.7746 18.9465 3.8226 9.7180 18.9336 1.9115 7.7743 18.9465 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.6456 5.8310 18.9335 9.5568 7.7748 18.9463 7.6453 9.7182 18.9335 5.7341 7.7746 18.9465 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.8227 1.9439 4.4267 1.9112 3.8873 4.4140 3.8224 5.8310 4.4268 5.7339 3.8876 4.4138 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.6454 1.9441 4.4266 7.6451 5.8313 4.4267 9.5566 3.8879 4.4137 5.7339 3.8876 4.4138 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.8225 5.8310 7.2534 3.8228 1.9438 7.2533 5.7340 3.8875 7.2661 1.9112 3.8873 7.2662 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.6454 1.9441 7.2531 9.5567 3.8877 7.2660 7.6452 5.8313 7.2532 5.7340 3.8875 7.2661 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.6458 1.9439 16.1067 5.7342 3.8874 16.0941 7.6455 5.8310 16.1069 9.5570 3.8877 16.0939 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.6459 1.9438 18.9334 9.5571 3.8875 18.9462 7.6456 5.8310 18.9335 5.7343 3.8873 18.9463 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.8229 5.8308 18.9336 1.9117 3.8870 18.9465 3.8232 1.9435 18.9335 5.7343 3.8873 18.9463 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.8228 5.8308 16.1070 3.8230 1.9437 16.1069 1.9115 3.8871 16.0942 5.7342 3.8874 16.0941 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.6451 7.7749 9.8230 7.6449 9.7185 7.2533 7.6452 5.8313 7.2532 5.7337 7.7748 7.2661 9.5563 7.7751 7.2661 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 7.6449 7.7749 1.8570 7.6451 5.8313 4.4267 7.6448 9.7186 4.4267 5.7336 7.7748 4.4139 9.5563 7.7751 4.4138 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 3.8222 7.7747 1.8572 3.8221 9.7183 4.4268 3.8224 5.8310 4.4268 5.7336 7.7748 4.4139 1.9109 7.7746 4.4140 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 3.8225 7.7746 9.8231 3.8222 9.7182 7.2535 3.8225 5.8310 7.2534 1.9110 7.7744 7.2664 5.7337 7.7748 7.2661 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 3.8226 7.7744 13.5374 3.8225 9.7181 16.1071 3.8228 5.8308 16.1070 5.7340 7.7746 16.0941 1.9113 7.7743 16.0942 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 7.6453 7.7747 13.5372 7.6455 5.8310 16.1069 7.6452 9.7183 16.1069 5.7340 7.7746 16.0941 9.5567 7.7748 16.0940 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 3.8229 7.7743 21.5033 3.8229 5.8308 18.9336 3.8226 9.7180 18.9336 5.7341 7.7746 18.9465 1.9115 7.7743 18.9465 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 7.6456 7.7746 21.5031 7.6456 5.8310 18.9335 7.6453 9.7182 18.9335 9.5568 7.7748 18.9463 5.7341 7.7746 18.9465 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 3.8225 3.8876 1.8571 3.8227 1.9439 4.4267 3.8224 5.8310 4.4268 1.9112 3.8873 4.4140 5.7339 3.8876 4.4138 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 7.6451 3.8878 1.8570 7.6451 5.8313 4.4267 7.6454 1.9441 4.4266 9.5566 3.8879 4.4137 5.7339 3.8876 4.4138 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 3.8227 3.8874 9.8230 3.8228 1.9438 7.2533 3.8225 5.8310 7.2534 5.7340 3.8875 7.2661 1.9112 3.8873 7.2662 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 7.6454 3.8876 9.8229 7.6454 1.9441 7.2531 7.6452 5.8313 7.2532 9.5567 3.8877 7.2660 5.7340 3.8875 7.2661 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 7.6456 3.8876 13.5372 7.6458 1.9439 16.1067 7.6455 5.8310 16.1069 5.7342 3.8874 16.0941 9.5570 3.8877 16.0939 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 7.6458 3.8874 21.5031 7.6459 1.9438 18.9334 7.6456 5.8310 18.9335 9.5571 3.8875 18.9462 5.7343 3.8873 18.9463 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 3.8231 3.8871 21.5031 3.8229 5.8308 18.9336 3.8232 1.9435 18.9335 1.9117 3.8870 18.9465 5.7343 3.8873 18.9463 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 3.8228 3.8873 13.5373 3.8230 1.9437 16.1069 3.8228 5.8308 16.1070 1.9115 3.8871 16.0942 5.7342 3.8874 16.0941 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 3.8224 9.7181 11.6803 3.8226 7.7744 13.5374 3.8226 5.8309 11.6802 3.8225 7.7746 9.8231 1 4 0 1 2 3 7.6450 9.7184 11.6802 7.6453 7.7747 13.5372 7.6453 5.8312 11.6800 7.6451 7.7749 9.8230 1 4 0 1 2 3 3.8229 1.9437 11.6801 3.8228 3.8873 13.5373 3.8226 5.8309 11.6802 3.8227 3.8874 9.8230 1 4 0 1 2 3 7.6453 5.8312 11.6800 7.6454 3.8876 9.8229 7.6456 1.9440 11.6800 7.6456 3.8876 13.5372 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/etc/screen_blenda.xml000066400000000000000000000205761433127522700204600ustar00rootroot00000000000000 5.4047 2.7044 2.7026 5.4053 0.0013 -0.0004 2.7028 0.0007 2.7028 2.7021 2.7036 -0.0002 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.7024 2.7037 5.4057 -0.0006 0.0002 5.4058 -0.0011 2.7031 2.7028 2.7028 0.0007 2.7028 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.7024 2.7037 5.4057 5.4044 5.4074 5.4056 5.4047 2.7044 2.7026 2.7018 5.4067 2.7028 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.7018 5.4067 2.7028 2.7021 2.7036 -0.0002 -0.0011 2.7031 2.7028 -0.0019 5.4060 -0.0002 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 gamgi-0.17.5/dat/cell/etc/sodalite.xml000066400000000000000000000546751433127522700175070ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/glasses/000077500000000000000000000000001433127522700160265ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/glasses/rcp100.xml000066400000000000000000000314341433127522700175620ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/interstices/000077500000000000000000000000001433127522700167215ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/interstices/polyhedra.xml000066400000000000000000000347051433127522700214430ustar00rootroot00000000000000 1.4139 2.8280 1.4143 1.4139 1.4139 2.8282 -0.0001 1.4139 1.4141 2.8279 1.4140 1.4143 1.4139 0.0000 1.4141 1.4140 1.4141 0.0002 8 3 2 0 5 3 4 2 5 3 0 1 3 3 1 0 2 3 1 2 4 3 3 1 4 3 0 3 5 3 3 4 5 1.4138 4.2419 2.8284 -0.0002 4.2419 1.4143 1.4138 5.6560 1.4144 1.4139 4.2421 0.0003 2.8278 4.2420 1.4144 1.4139 2.8280 1.4143 8 3 1 2 3 3 0 1 5 3 1 0 2 3 2 0 4 3 3 2 4 3 1 3 5 3 3 4 5 3 4 0 5 4.2419 2.8281 1.4143 2.8280 2.8281 0.0003 2.8279 1.4140 1.4143 2.8279 2.8279 2.8283 1.4139 2.8280 1.4143 2.8278 4.2420 1.4144 8 3 0 1 5 3 2 0 3 3 1 4 5 3 1 0 2 3 1 2 4 3 2 3 4 3 3 0 5 3 4 3 5 4.2420 1.4141 0.0002 5.6559 1.4141 1.4143 4.2419 2.8281 1.4143 4.2419 1.4139 2.8283 2.8279 1.4140 1.4143 4.2419 0.0001 1.4142 8 3 1 2 3 3 0 1 5 3 1 0 2 3 2 0 4 3 3 2 4 3 1 3 5 3 3 4 5 3 4 0 5 2.8278 4.2420 1.4144 4.2419 4.2421 0.0005 4.2418 5.6561 1.4146 4.2419 2.8281 1.4143 4.2418 4.2419 2.8285 5.6559 4.2421 1.4146 8 3 1 2 5 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 3 3 1 5 3 2 4 5 3 4 3 5 2.3089 2.3091 0.0001 2.3090 0.0001 0.0000 2.3090 -0.0000 2.3091 1.1544 1.1545 1.1545 2.3088 2.3090 2.3091 3.4635 1.1546 1.1546 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 -0.0001 2.3090 0.0000 -0.0001 2.3089 2.3091 2.3089 2.3091 0.0001 1.1544 3.4635 1.1546 2.3088 2.3090 2.3091 1.1544 1.1545 1.1545 8 3 1 0 5 3 2 0 3 3 0 1 3 3 4 1 5 3 2 3 4 3 3 1 4 3 0 2 5 3 2 4 5 1.1544 1.1545 1.1545 1.1544 3.4635 1.1546 3.4633 3.4636 1.1547 2.3089 2.3091 0.0001 3.4635 1.1546 1.1546 2.3088 2.3090 2.3091 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 4 5 3 0 3 4 3 3 2 4 3 2 1 5 3 4 2 5 2.3089 2.3091 0.0001 2.3088 2.3090 2.3091 4.6180 2.3091 0.0002 3.4633 3.4636 1.1547 4.6179 2.3091 2.3092 3.4635 1.1546 1.1546 8 3 1 0 5 3 2 0 3 3 0 1 3 3 2 3 4 3 3 1 4 3 0 2 5 3 2 4 5 3 4 1 5 2.3088 2.3090 2.3091 2.3088 4.6180 2.3091 2.3089 2.3091 0.0001 1.1544 3.4635 1.1546 2.3089 4.6180 0.0002 3.4633 3.4636 1.1547 8 3 1 0 5 3 2 0 3 3 0 1 3 3 4 1 5 3 2 3 4 3 3 1 4 3 0 2 5 3 2 4 5 gamgi-0.17.5/dat/cell/interstices/solid.xml000066400000000000000000000325731433127522700205670ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/interstices/wired.xml000066400000000000000000000315261433127522700205640ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/link/000077500000000000000000000000001433127522700153225ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/link/link1.xml000066400000000000000000000007331433127522700170650ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/link/link2.xml000066400000000000000000000010021433127522700170540ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/link/link3.xml000066400000000000000000000005741433127522700170720ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/link/link4.xml000066400000000000000000000006311433127522700170650ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/link/link5.xml000066400000000000000000000006561433127522700170750ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/link/link6.xml000066400000000000000000000006721433127522700170740ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/link/link7.xml000066400000000000000000000006321433127522700170710ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/link/link8.xml000066400000000000000000000005351433127522700170740ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/martensite/000077500000000000000000000000001433127522700165405ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/martensite/martensite_bain.xml000066400000000000000000000133611433127522700224320ustar00rootroot00000000000000 7.0300 3.5150 0.0000 0.0000 3.5150 0.0000 0.0000 0.0000 0.0000 7.0300 -0.0000 -0.0000 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/martensite/martensite_kurdjumov.xml000066400000000000000000000143421433127522700235470ustar00rootroot00000000000000 3.5150 0.0000 0.0000 0.0000 3.5150 0.0000 0.0000 0.0000 3.5150 1 3 0 1 2 3.5150 3.5150 3.5150 7.0300 -0.0000 3.5150 7.0300 3.5150 -0.0000 1 3 0 1 2 3.5152 0.0003 3.5148 1.7580 1.7670 3.5152 3.5182 3.5184 0.0030 5.2725 1.7576 -0.0003 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/martensite/martensite_nishiyama.xml000066400000000000000000000143151433127522700235030ustar00rootroot00000000000000 3.5150 0.0000 0.0000 0.0000 3.5150 0.0000 0.0000 0.0000 3.5150 1 3 0 1 2 3.5150 3.5150 3.5150 7.0300 -0.0000 3.5150 7.0300 3.5150 -0.0000 1 3 0 1 2 3.5152 0.0003 3.5148 1.7580 1.7670 3.5152 3.5182 3.5184 0.0030 5.2725 1.7576 -0.0003 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/polymers/000077500000000000000000000000001433127522700162375ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/polymers/o-HDPE.xml000066400000000000000000001442571433127522700177520ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/polymers/o-HDPE_screen.xml000066400000000000000000003642141433127522700213060ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/silica/000077500000000000000000000000001433127522700156315ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/silica/cristobalite.txt000066400000000000000000000005571433127522700210650ustar00rootroot00000000000000SiO2 - Cristobalite (beta) Lattice parameters: 7.16 Radius: Si 1.1760 (half-distance) O: 0.6037 (half-distance) Space group: 227 Wyckoff positions: Si 2a O 4c Cristobalite_111.xml: Cells: 1 x 1 x 1 Change: -0.125, -0.125, -0.125 Cristobalite_222.xml: Cells: 2 x 2 x 2 Cutoff: Nodes Polytopes: Neighbours 4 Source: http://www.minweb.co.uk/quartz/bcridata.html gamgi-0.17.5/dat/cell/silica/cristobalite.xml000066400000000000000000000301101433127522700210320ustar00rootroot00000000000000 0.8950 4.4750 2.6850 2.6850 6.2650 2.6850 2.6850 4.4750 0.8950 0.8950 6.2650 0.8950 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.6850 4.4750 0.8950 1.7900 5.3700 1.7900 2.6850 6.2650 2.6850 0.8950 6.2650 0.8950 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.4750 4.4750 6.2650 6.2650 4.4750 4.4750 4.4750 6.2650 4.4750 6.2650 6.2650 6.2650 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.2650 4.4750 4.4750 4.4750 6.2650 4.4750 5.3700 5.3700 5.3700 6.2650 6.2650 6.2650 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.4750 0.8950 2.6850 6.2650 2.6850 2.6850 6.2650 0.8950 0.8950 4.4750 2.6850 0.8950 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.2650 2.6850 2.6850 5.3700 1.7900 1.7900 4.4750 2.6850 0.8950 6.2650 0.8950 0.8950 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.8950 0.8950 6.2650 2.6850 0.8950 4.4750 0.8950 2.6850 4.4750 2.6850 2.6850 6.2650 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.6850 0.8950 4.4750 2.6850 2.6850 6.2650 1.7900 1.7900 5.3700 0.8950 0.8950 6.2650 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 gamgi-0.17.5/dat/cell/silica/quartz.txt000066400000000000000000000006301433127522700177170ustar00rootroot00000000000000SiO2 - Quartz (beta) Lattice parameters: 4.9965 5.4546 Radius: Si 1.1760 (half-distance) O: 0.6037 (half-distance) Space group: 180 Wyckoff positions: Si 6g, x = 0.5 O 12k, x = 0.4147, y = 0.2078, z = 0.1666 Cells: 3 x 3 x 3 Cutoff: Nodes Polytopes: Neighbours 4 References 1) Y le Page and G Donnay (1976) Acta Crystallographica, B, 32, 2456. 2) http://www.uwgb.edu/dutchs/Petrology/Silica%20Poly.HTM gamgi-0.17.5/dat/cell/silica/quartz.xml000066400000000000000000003141071433127522700177070ustar00rootroot00000000000000 0.9453 3.4279 0.9087 2.5005 2.5326 2.7269 1.2491 2.1635 1.8182 1.5529 0.8992 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 5.9418 3.4279 0.9087 7.4970 2.5326 2.7269 6.2456 2.1635 1.8182 6.5494 0.8992 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 10.9383 3.4279 0.9087 12.4935 2.5326 2.7269 11.2421 2.1635 1.8182 11.5459 0.8992 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.5005 2.5326 2.7269 1.5529 0.8992 0.9087 -0.0022 1.7944 2.7269 0.9453 3.4279 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.4970 2.5326 2.7269 6.5494 0.8992 0.9087 4.9943 1.7944 2.7269 5.9418 3.4279 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 9.9908 1.7944 2.7269 10.9383 3.4279 0.9087 12.4935 2.5326 2.7269 11.5459 0.8992 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -2.5005 6.1215 2.7269 0.0022 6.8597 2.7269 -0.9453 5.2263 0.9087 -1.5529 7.7550 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.9987 6.8597 2.7269 4.0512 5.2263 0.9087 2.4960 6.1215 2.7269 3.4436 7.7550 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 9.9952 6.8597 2.7269 9.0477 5.2263 0.9087 7.4925 6.1215 2.7269 8.4401 7.7550 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -4.9987 10.4486 2.7269 -2.4960 11.1868 2.7269 -3.4436 9.5534 0.9087 -4.0512 12.0821 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.5005 11.1868 2.7269 1.5529 9.5534 0.9087 -0.0022 10.4486 2.7269 0.9453 12.0821 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -3.4436 9.5534 0.9087 -4.9987 10.4486 2.7269 -3.7474 10.8177 1.8182 -4.0512 12.0821 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 1.5529 9.5534 0.9087 -0.0022 10.4486 2.7269 1.2491 10.8177 1.8182 0.9453 12.0821 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.9943 10.4486 2.7269 7.4970 11.1868 2.7269 6.5494 9.5534 0.9087 5.9418 12.0821 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.5494 9.5534 0.9087 4.9943 10.4486 2.7269 6.2456 10.8177 1.8182 5.9418 12.0821 0.9087 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.9453 3.4279 6.3633 -0.9431 3.4318 4.5451 -0.9453 5.2263 6.3633 0.9431 5.2224 4.5451 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.0534 3.4318 4.5451 4.9943 1.7944 2.7269 3.4413 0.8953 4.5451 2.5005 2.5326 2.7269 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 8.4378 0.8953 4.5451 7.4970 2.5326 2.7269 9.0499 3.4318 4.5451 9.9908 1.7944 2.7269 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 1.5552 7.7589 4.5451 0.9431 5.2224 4.5451 0.0022 6.8597 2.7269 2.4960 6.1215 2.7269 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.5517 7.7589 4.5451 5.9396 5.2224 4.5451 4.9987 6.8597 2.7269 7.4925 6.1215 2.7269 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -1.5552 9.5495 4.5451 -0.9431 12.0860 4.5451 -0.0022 10.4486 2.7269 -2.4960 11.1868 2.7269 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.4413 9.5495 4.5451 4.0534 12.0860 4.5451 4.9943 10.4486 2.7269 2.5005 11.1868 2.7269 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.5005 2.5326 8.1815 1.5529 0.8992 6.3633 -0.0022 1.7944 8.1815 0.9453 3.4279 6.3633 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.4970 2.5326 8.1815 6.5494 0.8992 6.3633 4.9943 1.7944 8.1815 5.9418 3.4279 6.3633 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 9.9908 1.7944 8.1815 10.9383 3.4279 6.3633 12.4935 2.5326 8.1815 11.5459 0.8992 6.3633 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.0022 6.8597 8.1815 -0.9453 5.2263 6.3633 -2.5005 6.1215 8.1815 -1.5529 7.7550 6.3633 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.0512 5.2263 6.3633 5.9396 5.2224 4.5451 5.9418 3.4279 6.3633 4.0534 3.4318 4.5451 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 9.0477 5.2263 6.3633 10.9383 3.4279 6.3633 9.0499 3.4318 4.5451 10.9361 5.2224 4.5451 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -1.5529 7.7550 6.3633 -3.4436 9.5534 6.3633 -1.5552 9.5495 4.5451 -3.4413 7.7589 4.5451 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 1.5529 9.5534 6.3633 3.4413 9.5495 4.5451 3.4436 7.7550 6.3633 1.5552 7.7589 4.5451 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.9987 6.8597 8.1815 2.4960 6.1215 8.1815 3.4436 7.7550 6.3633 4.0512 5.2263 6.3633 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 9.9952 6.8597 8.1815 7.4925 6.1215 8.1815 8.4401 7.7550 6.3633 9.0477 5.2263 6.3633 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -4.9987 10.4486 8.1815 -2.4960 11.1868 8.1815 -3.4436 9.5534 6.3633 -4.0512 12.0821 6.3633 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -0.0022 10.4486 8.1815 2.5005 11.1868 8.1815 1.5529 9.5534 6.3633 0.9453 12.0821 6.3633 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.9943 10.4486 8.1815 5.9418 12.0821 6.3633 7.4970 11.1868 8.1815 6.5494 9.5534 6.3633 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.5494 9.5534 6.3633 8.4378 9.5495 4.5451 8.4401 7.7550 6.3633 6.5517 7.7589 4.5451 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -0.9453 5.2263 11.8179 0.9453 3.4279 11.8179 -0.9431 3.4318 9.9997 0.9431 5.2224 9.9997 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.0534 3.4318 9.9997 4.9943 1.7944 8.1815 3.4413 0.8953 9.9997 2.5005 2.5326 8.1815 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 8.4378 0.8953 9.9997 9.0499 3.4318 9.9997 9.9908 1.7944 8.1815 7.4970 2.5326 8.1815 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 1.5552 7.7589 9.9997 0.9431 5.2224 9.9997 0.0022 6.8597 8.1815 2.4960 6.1215 8.1815 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.0512 5.2263 11.8179 5.9418 3.4279 11.8179 4.0534 3.4318 9.9997 5.9396 5.2224 9.9997 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 9.0477 5.2263 11.8179 10.9383 3.4279 11.8179 9.0499 3.4318 9.9997 10.9361 5.2224 9.9997 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -1.5529 7.7550 11.8179 -3.4413 7.7589 9.9997 -3.4436 9.5534 11.8179 -1.5552 9.5495 9.9997 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.4436 7.7550 11.8179 1.5552 7.7589 9.9997 1.5529 9.5534 11.8179 3.4413 9.5495 9.9997 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.5517 7.7589 9.9997 7.4925 6.1215 8.1815 5.9396 5.2224 9.9997 4.9987 6.8597 8.1815 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -1.5552 9.5495 9.9997 -0.9431 12.0860 9.9997 -0.0022 10.4486 8.1815 -2.4960 11.1868 8.1815 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.4413 9.5495 9.9997 4.0534 12.0860 9.9997 4.9943 10.4486 8.1815 2.5005 11.1868 8.1815 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -0.0022 1.7944 13.6361 0.9453 3.4279 11.8179 2.5005 2.5326 13.6361 1.5529 0.8992 11.8179 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.4970 2.5326 13.6361 4.9943 1.7944 13.6361 5.9418 3.4279 11.8179 6.5494 0.8992 11.8179 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 12.4935 2.5326 13.6361 9.9908 1.7944 13.6361 10.9383 3.4279 11.8179 11.5459 0.8992 11.8179 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.0022 6.8597 13.6361 -0.9453 5.2263 11.8179 -2.5005 6.1215 13.6361 -1.5529 7.7550 11.8179 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.4960 6.1215 13.6361 3.4436 7.7550 11.8179 4.9987 6.8597 13.6361 4.0512 5.2263 11.8179 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 9.9952 6.8597 13.6361 7.4925 6.1215 13.6361 8.4401 7.7550 11.8179 9.0477 5.2263 11.8179 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -4.9987 10.4486 13.6361 -2.4960 11.1868 13.6361 -3.4436 9.5534 11.8179 -4.0512 12.0821 11.8179 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -0.0022 10.4486 13.6361 0.9453 12.0821 11.8179 2.5005 11.1868 13.6361 1.5529 9.5534 11.8179 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.9943 10.4486 13.6361 7.4970 11.1868 13.6361 6.5494 9.5534 11.8179 5.9418 12.0821 11.8179 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.5494 9.5534 11.8179 8.4378 9.5495 9.9997 8.4401 7.7550 11.8179 6.5517 7.7589 9.9997 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.0534 3.4318 15.4543 2.5005 2.5326 13.6361 3.7474 2.1635 14.5456 3.4413 0.8953 15.4543 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 9.0499 3.4318 15.4543 7.4970 2.5326 13.6361 8.7439 2.1635 14.5456 8.4378 0.8953 15.4543 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.4413 0.8953 15.4543 2.5005 2.5326 13.6361 4.0534 3.4318 15.4543 4.9943 1.7944 13.6361 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 8.4378 0.8953 15.4543 7.4970 2.5326 13.6361 9.0499 3.4318 15.4543 9.9908 1.7944 13.6361 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.9431 5.2224 15.4543 1.5552 7.7589 15.4543 2.4960 6.1215 13.6361 0.0022 6.8597 13.6361 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.5517 7.7589 15.4543 5.9396 5.2224 15.4543 4.9987 6.8597 13.6361 7.4925 6.1215 13.6361 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -0.9431 12.0860 15.4543 -0.0022 10.4486 13.6361 -1.5552 9.5495 15.4543 -2.4960 11.1868 13.6361 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.0534 12.0860 15.4543 4.9943 10.4486 13.6361 3.4413 9.5495 15.4543 2.5005 11.1868 13.6361 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -1.5552 9.5495 15.4543 -0.0022 10.4486 13.6361 -1.2491 10.8177 14.5456 -0.9431 12.0860 15.4543 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 3.4413 9.5495 15.4543 4.9943 10.4486 13.6361 3.7474 10.8177 14.5456 4.0534 12.0860 15.4543 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 gamgi-0.17.5/dat/cell/silica/trydimite.txt000066400000000000000000000004431433127522700204050ustar00rootroot00000000000000SiO2 - Trydimite (beta) Lattice parameters: 5.03 8.22 Radius: Si 1.1760 (half-distance) O: 0.6037 (half-distance) Space group: 194 Wyckoff positions: Si 4f, z = 0.44 O 2c O 6g Cells: 2 x 2 x 2 Cutoff: Nodes Polytopes: Neighbours 4 Source: inst.eecs.berkeley.edu/~ee230/sp04/hw/hw2.pdf gamgi-0.17.5/dat/cell/silica/trydimite.xml000066400000000000000000001360061433127522700203730ustar00rootroot00000000000000 2.5150 7.2602 2.0550 2.5150 8.7122 -0.0000 3.7725 6.5342 -0.0000 1.2575 6.5342 -0.0000 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.5150 7.2602 2.0550 2.5150 8.7122 4.1100 1.2575 6.5342 4.1100 3.7725 6.5342 4.1100 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 5.0300 5.8081 6.1650 5.0300 4.3561 4.1100 3.7725 6.5342 4.1100 6.2875 6.5342 4.1100 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.5150 7.2602 10.2750 1.2575 6.5342 8.2200 2.5150 8.7122 8.2200 3.7725 6.5342 8.2200 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 5.0300 5.8081 6.1650 6.2875 6.5342 8.2200 3.7725 6.5342 8.2200 5.0300 4.3561 8.2200 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 5.0300 5.8081 14.3850 6.2875 6.5342 12.3300 5.0300 4.3561 12.3300 3.7725 6.5342 12.3300 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.5150 7.2602 10.2750 3.7725 6.5342 12.3300 2.5150 8.7122 12.3300 1.2575 6.5342 12.3300 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 5.0300 5.8081 14.3850 6.2875 6.5342 16.4400 3.7725 6.5342 16.4400 5.0300 4.3561 16.4400 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -2.5150 7.2602 2.0550 -3.7725 6.5342 -0.0000 -2.5150 8.7122 -0.0000 -1.2575 6.5342 -0.0000 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 5.0300 2.9041 2.0550 5.0300 4.3561 -0.0000 6.2875 2.1781 -0.0000 3.7725 2.1781 -0.0000 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -2.5150 7.2602 2.0550 -1.2575 6.5342 4.1100 -2.5150 8.7122 4.1100 -3.7725 6.5342 4.1100 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.0000 5.8081 6.1650 0.0000 4.3561 4.1100 -1.2575 6.5342 4.1100 1.2575 6.5342 4.1100 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 5.0300 2.9041 2.0550 5.0300 4.3561 4.1100 3.7725 2.1781 4.1100 6.2875 2.1781 4.1100 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.5450 1.4520 6.1650 7.5450 0.0000 4.1100 6.2875 2.1781 4.1100 8.8025 2.1781 4.1100 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -2.5150 7.2602 10.2750 -3.7725 6.5342 8.2200 -2.5150 8.7122 8.2200 -1.2575 6.5342 8.2200 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.0000 5.8081 6.1650 1.2575 6.5342 8.2200 -1.2575 6.5342 8.2200 0.0000 4.3561 8.2200 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 5.0300 2.9041 10.2750 5.0300 4.3561 8.2200 6.2875 2.1781 8.2200 3.7725 2.1781 8.2200 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.5450 1.4520 6.1650 8.8025 2.1781 8.2200 6.2875 2.1781 8.2200 7.5450 0.0000 8.2200 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -2.5150 7.2602 10.2750 -1.2575 6.5342 12.3300 -2.5150 8.7122 12.3300 -3.7725 6.5342 12.3300 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.0000 5.8081 14.3850 0.0000 4.3561 12.3300 -1.2575 6.5342 12.3300 1.2575 6.5342 12.3300 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 5.0300 2.9041 10.2750 6.2875 2.1781 12.3300 5.0300 4.3561 12.3300 3.7725 2.1781 12.3300 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.5450 1.4520 14.3850 7.5450 0.0000 12.3300 6.2875 2.1781 12.3300 8.8025 2.1781 12.3300 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.0000 5.8081 14.3850 -1.2575 6.5342 16.4400 0.0000 4.3561 16.4400 1.2575 6.5342 16.4400 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 7.5450 1.4520 14.3850 7.5450 0.0000 16.4400 8.8025 2.1781 16.4400 6.2875 2.1781 16.4400 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -0.0000 2.9041 2.0550 -0.0000 4.3561 -0.0000 1.2575 2.1781 -0.0000 -1.2575 2.1781 -0.0000 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -0.0000 2.9041 2.0550 0.0000 4.3561 4.1100 -1.2575 2.1781 4.1100 1.2575 2.1781 4.1100 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.5150 1.4520 6.1650 2.5150 0.0000 4.1100 1.2575 2.1781 4.1100 3.7725 2.1781 4.1100 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.0000 2.9041 10.2750 -1.2575 2.1781 8.2200 0.0000 4.3561 8.2200 1.2575 2.1781 8.2200 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.5150 1.4520 6.1650 2.5150 0.0000 8.2200 3.7725 2.1781 8.2200 1.2575 2.1781 8.2200 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.5150 1.4520 14.3850 3.7725 2.1781 12.3300 2.5150 0.0000 12.3300 1.2575 2.1781 12.3300 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.0000 2.9041 10.2750 -1.2575 2.1781 12.3300 1.2575 2.1781 12.3300 0.0000 4.3561 12.3300 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 2.5150 1.4520 14.3850 3.7725 2.1781 16.4400 1.2575 2.1781 16.4400 2.5150 0.0000 16.4400 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 gamgi-0.17.5/dat/cell/structures/000077500000000000000000000000001433127522700166105ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/structures/README000066400000000000000000000012471433127522700174740ustar00rootroot00000000000000************** * Structures * ************** The files in this directory describe important cristalline structures. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** 1) Marc de Graef and Michael E. McHenry, Structure of Materials, an Introduction to Crystallography, Diffraction, and Symmetry, Cambridge University Press, 2007 http://som.web.cmu.edu/frames.html 2) Yet-Ming Chiang, Dunbar Birnie III, W. David Kingery, Physical Ceramics, Principles for Ceramic Science and Engineering, John Wiley & Sons, The MIT series in Materials Science & Engineering, 1997 3) Mineral Web, http://www.minweb.co.uk/ gamgi-0.17.5/dat/cell/structures/s001_Cu_cfc.txt000066400000000000000000000007641433127522700213050ustar00rootroot00000000000000Structure 1 Prototype: Cu StrukturBericht / Pearson: A1 / cF4 Lattice parameter: Cu Ag Au Al 3.615 4.086 4.078 4.049 Ni Pd Pt Pb 3.524 3.891 3.924 4.950 Radius: Cu 1.2780 (half-distance) 1. Building with space group (s001.xml): Group: 225 Wyckoff positions: Cu 1a 2. Building with structural unit (s1.xml): Bravais lattice: cF Cu: 0.0, 0.0, 0.0 View: Cu: style solid, size 1.0, variancy 1.0, scale 0.4 CuCu: style solid, method length, color 0.5,0.5,0.5 scale 0.5 gamgi-0.17.5/dat/cell/structures/s001_Cu_cfc.xml000066400000000000000000000152541433127522700212660ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s002_W_bcc.txt000066400000000000000000000007351433127522700211370ustar00rootroot00000000000000Structure 2 Prototype: W StrukturBericht / Pearson: A2 / cI2 Lattice parameter: W Fe Cr 3.1650 2.8664 2.8846 Mo Ta Ba 3.1469 3.3026 5.0190 Radius: W 1.3705 (half-distance) 1. Building with space group (s002.xml): Group: 229 Wyckoff positions: W 1a 2. Building with structural unit (s002.xml): Bravais lattice: cI W: 0.0, 0.0, 0.0 View: W: style solid, size 1.0, variancy 1.0, scale 0.4 WW: style solid, method length, color 0.5,0.5,0.5 scale 0.8 gamgi-0.17.5/dat/cell/structures/s002_W_bcc.xml000066400000000000000000000051531433127522700211170ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s003_Mg_hcp.txt000066400000000000000000000016401433127522700213140ustar00rootroot00000000000000Structure 3 Prototype: Mg StrukturBericht / Pearson: A3 / hP2 lattice parameter: Mg Be 3.209 5.210 (1.624) 2.286 3.583 (1.567) Zn Cd 2.665 4.947 (1.856) 2.979 5.617 (1.886) Ti Zr 2.950 4.679 (1.586) 3.232 5.148 (1.593) Ru Os 2.706 4.282 (1.582) 2.735 4.319 (1.579) Re Sm 2.761 4.458 (1.615) 2.625 3.621 (1.379) Radius: Mg 1.5895 (half-distance) 1. Building with group space (s003a.xml): Group: 194 Wyckoff positions: Mg 2d 2. Building with conventional cell (s003b.xml): Change -0.66667 (2/3), -0.33333 (1/3), -0.25 (1/4) 3. Building with structural unit (s003b.xml): Bravais lattice: hP Mg: 0.0, 0.0, 0.0 Mg: 2/3, 1/3, 1/2 4. Node inversion simmetry (s003c.xml): Structure 1: yes Structure 2: no View: Mg: style solid, size 1.0, variancy 1.0, scale 0.4 MgMg style solid, method length, color 0.5,0.5,0.5 scale 0.6 gamgi-0.17.5/dat/cell/structures/s003a_Mg_hcp.xml000066400000000000000000000053631433127522700214440ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s003b_Mg_hcp.xml000066400000000000000000000202331433127522700214360ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s003c_inversion.xml000066400000000000000000000370771433127522700222740ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s004_AuCu.txt000066400000000000000000000010071433127522700207520ustar00rootroot00000000000000Structure 4 Prototype: AuCu StrukturBericht / Pearson: L1_0 / tP4 lattice parameter: AuCu AgTi 3.963 3.671 4.104 4.077 AlTi CoPt 3.984 4.065 3.806 3.684 CrPd FePd 3.879 3.802 3.852 3.723 MnNi PtZn 3.690 3.490 4.026 3.474 Radius: Au 1.4420 (half-distance) Cu 1.2780 (half-distance) 1. Building with group space (s004.xml): Group: 123 Wyckoff positions: Au 2e Cu 1a Cu 1c View: Au: style solid, size 1.0, variancy 1.0, scale 0.3 Cu: style solid, size 1.0, variancy 1.0, scale 0.3 gamgi-0.17.5/dat/cell/structures/s004_AuCu.xml000066400000000000000000000045301433127522700207370ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s005_AuCu3.txt000066400000000000000000000006731433127522700210460ustar00rootroot00000000000000Structure 5 Prototype: AuCu3 StrukturBericht / Pearson: L1_2 / cP4 lattice parameter: AuCu3 AgPt3 AlNi3 TiZn3 3.749 3.900 3.572 3.932 AlPt3 Al3Er Al3U Pd3Y 3.876 4.215 4.287 4.074 Radius: Au 1.4420 (half-distance) Cu 1.2780 (half-distance) 1. Building with group space (s005.xml): Group: 221 Wyckoff positions: Au 1a Cu 3c Au: style solid, size 1.0, variancy 1.0, scale 0.3 Cu: style solid, size 1.0, variancy 1.0, scale 0.3 gamgi-0.17.5/dat/cell/structures/s005_AuCu3.xml000066400000000000000000000045361433127522700210310ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s006_C_diamond.txt000066400000000000000000000007771433127522700220110ustar00rootroot00000000000000Structure 6 Prototype: C (diamond) StrukturBericht / Pearson: A4 / cF8 lattice parameter: C Si 3.56 5.431 Ge a-Sn 5.657 6.491 Radius: C 0.7130 (half-distance) 1. Building with space group (s006.xml): Group: 227 Wyckoff positions: C 2a Change: -0.125 (1/8) -0.125 (1/8) -0.125 (1/8) 2. Building with structural unit (s006.xml): Bravais lattice: cF C: 0.0, 0.0, 0.0 C: 1/4, 1/4, 1/4 View: C: style solid, size 1.0, variancy 1.0, scale 0.4 CC style solid, method length, color 0.5,0.5,0.5 scale 0.6 gamgi-0.17.5/dat/cell/structures/s006_C_diamond.xml000066400000000000000000000113451433127522700217630ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s007_NaCl.txt000066400000000000000000000013741433127522700207440ustar00rootroot00000000000000Structure 7 Prototype: NaCl StrukturBericht / Pearson: B1 / cF8 lattice parameter: NaCl MgO FeO 5.640 4.213 4.307 MgS BaSe CaTe 5.200 6.600 6.356 LiF BrNa TiN 4.027 5.977 4.240 Radius: Na 1.0200 (Shannon radius for charge +1 coordination 6) Cl 1.8100 (Shannon radius for charge -1 coordination 6) 1. Building with space group (s007a.xml): Group: 225 Wyckoff positions: Cl 1a Na 1b 2. Building with non conventional cell (s007b.xml): Change 0.25, 0.25, 0.25 3. Building with structural unit (s007a.xml): Bravais lattice: cF Cl: 0.0, 0.0, 0.0 Na: 0.5, 0.0, 0.0 3. Building with Wigner Seitz (s007c.xml): Cell type: Wigner-Seitz View: Cl: style solid, size 1.0, variancy 1.0, scale 0.4 Na: style solid, size 1.0, variancy 1.0, scale 0.4 gamgi-0.17.5/dat/cell/structures/s007a_NaCl.xml000066400000000000000000000103041433127522700210570ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s007b_NaCl.xml000066400000000000000000000031701433127522700210630ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s007c_NaCl.xml000066400000000000000000000026221433127522700210650ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s008_BiF3.txt000066400000000000000000000012171433127522700206470ustar00rootroot00000000000000Structure 8 Prototype: BiF3 StrukturBericht / Pearson: D0_3 /cF16 lattice parameter: BiF3 BiLi3 Cd3Pr 5.865 6.722 7.200 CeMg3 Cu3Sb Fe3Si 7.438 6.010 5.662 Mg3Pr AlFe3 Mn3Si 7.430 5.780 5.722 Radius: Bi 1.1700 (Shannon radius for charge +3 coordination 8) F 1.3100 (Shannon radius for charge -1 coordination 4) 1. Building with space group (s008a.xml): Group: 225 Wyckoff positions: Bi 1a F 1b F 2c 2. Building with bcc-type cell (s008b.xml): Change: 0.25 0.25 0.25 View: Bi: style solid, size 1.0, variancy 1.0, scale 0.2 F: style solid, size 1.0, variancy 1.0, scale 0.2 BiF: style solid, method length, color 0.5,0.5,0.5 scale 0.6 gamgi-0.17.5/dat/cell/structures/s008a_BiF3.xml000066400000000000000000000231661433127522700210000ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s008b_BiF3.xml000066400000000000000000000226731433127522700210030ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s009_AlCu2Mn_heusler.txt000066400000000000000000000014661433127522700230630ustar00rootroot00000000000000Structure 9 Prototype: AlCu2Mn (Heusler) StrukturBericht / Pearson: L2_1 / cF16 lattice parameters: AlCu2Mn Cu2MnSb Cu2FeSn 5.949 6.097 5.930 AlCu2Hf AlNi2Ti GaMnNi2 6.172 5.850 - Co2MnSn AlCo2Nb AlCo2Ta 5.989 5.946 5.927 Radius: Cu 1.2780 (half-distance) Al 1.4315 (half-distance) Mn 1.3655 (half-distance) 1. Building with space group (s009a.xml): 225 Wyckoff positions: Cu 2c Al 1a Mn 1b 2. Building with bcc-type cell (s9b.xml): Change: 0.25 0.25 0.25 View: Cu: style solid, size 1.0, variancy 1.0, scale 0.2 Al: style solid, size 1.0, variancy 1.0, scale 0.2 Mn: style solid, size 1.0, variancy 1.0, scale 0.2 CuMn: style solid, method length, color 0.5,0.5,0.5 scale 0.4 Information: http://en.wikipedia.org/wiki/Heusler_alloy AlCu2Mn: TCurie = 357oC GaMnNi2: ferromagnetic shape memory alloys gamgi-0.17.5/dat/cell/structures/s009a_AlCu2Mn_heusler.xml000066400000000000000000000214461433127522700232050ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s009b_AlCu2Mn_heusler.xml000066400000000000000000000215231433127522700232020ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s010_CsCl.txt000066400000000000000000000007741433127522700207500ustar00rootroot00000000000000Structure 10 Prototype: CsCl StrukturBericht / Pearson: B2 / cP2 lattice parameter: CsCl BrCs AlCo Ag Mg 4.123 4.286 2.862 3.280 CoTi CuZn FeTi NiTi 2.986 2.945 2.976 2.972 Radius: Cs 1.0200 (Shannon radius for charge +1 coordination 8) Cl 1.8100 (Shannon radius for charge -1 coordination 8) 1. Building with space group (s010.xml): Group: 221 Wyckoff positions: Cl 1b Cs 1a View: Cl: style solid, size 1.0, variancy 1.0, scale 0.4 Cs: style solid, size 1.0, variancy 1.0, scale 0.4 gamgi-0.17.5/dat/cell/structures/s010_CsCl.xml000066400000000000000000000034171433127522700207260ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s011_ZnS_blenda.txt000066400000000000000000000011361433127522700221350ustar00rootroot00000000000000Structure 11 Prototype: ZnS StrukturBericht / Pearson: B3 / cF8 lattice parameters: ZnS AlP BeSe SeZn 5.406 5.451 5.070 5.667 TeZn GaP AsGa GaSb 6.103 5.448 5.653 6.095 InP CdTe AlAs 5.869 6.481 5.662 Radius: Zn: 0.600 (Shannon radius for charge +2 coordination 4) S: 1.840 (Shannon radius for charge -2 coordination 6: 4 not available) 1. Building with space group (s011.xml): Group: 216 Wyckoff positions: Zn 1c S 1a View: S: style solid, size 1.0, variancy 1.0, scale 0.3 Zn: style solid, size 1.0, variancy 1.0, scale 0.3 ZnS: style solid, method length, color 0.5,0.5,0.5 scale 0.5 gamgi-0.17.5/dat/cell/structures/s011_ZnS_blenda.xml000066400000000000000000000117741433127522700221270ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s012_CaF2_fluorite.txt000066400000000000000000000011021433127522700225340ustar00rootroot00000000000000Structure 12 Prototype: CaF2 (fluorite) StrukturBericht / Pearson: C1 / cF12 lattice parameters: CaF2 F2Sr BaCl2 5.463 5.800 7.311 O2Pb O2U Li2O 5.349 5.372 4.611 Na2Se K2S ORb2 6.823 7.406 6.740 Radius: Ca: 1.12 (Shannon radius for charge +2 coordination 8) F: 1.31 (Shannon radius for charge -1 coordination 4) 1. Building with space group (s012.xml): Group: 225 Wyckoff positions: Ca 1a F 2c View: Ca: style solid, size 1.0, variancy 1.0, scale 0.3 F: style solid, size 1.0, variancy 1.0, scale 0.3 CaF: style solid, method length, color 0.5,0.5,0.5 scale 0.5 gamgi-0.17.5/dat/cell/structures/s012_CaF2_fluorite.xml000066400000000000000000000170771433127522700225370ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s013_CuFeS2_chalcopyrite.txt000066400000000000000000000015731433127522700237220ustar00rootroot00000000000000Structure 13 Prototype: CuFeS2 (chalcopyrite) StrukturBericht / Pearson: E1_1 / tI16 lattice parameters: CuFeS2 AgAlTe2 5.24 10.3 6.296 11.83 AlCuSe2 CdGeP2 5.605 10.90 5.738 10.765 Radius: Cu 1.2780 (half-distance) Fe 1.2410 (half-distance) S 1.0250 (half-distance) 1. Building with space group (s013.xml): Group: 122 Wyckoff positions: Cu 2a Fe 2b S 4d, x = 0.25 View: Cu: style solid, size 1.0, variancy 1.0, scale 1.0 Fe: style solid, size 1.0, variancy 1.0, scale 1.0 S: style solid, size 1.0, variancy 1.0, scale 1.0 SCu: style solid, method length, color 0.5,0.5,0.5 scale 0.4 SFe: style solid, method length, color 0.5,0.5,0.5 scale 0.4 Information: http://en.wikipedia.org/wiki/Chalcopyrite Chalcopyrite is closely related to zinc blende ZnS. The unit cell is twice as large, reflecting an alternation of Cu+ and Fe3+ ions replacing Zn2+ ions in adjacent cells. gamgi-0.17.5/dat/cell/structures/s013_CuFeS2_chalcopyrite.xml000066400000000000000000000127361433127522700237060ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s014_ZnS_wurtzite.txt000066400000000000000000000011671433127522700226140ustar00rootroot00000000000000Structure 14 Prototype: ZnS (wurtzite) StrukturBericht / Pearson: B4 / hP4 lattice parameters: ZnS ZnO 3.81 6.23 3.35 5.22 BP GaN 3.562 5.90 3.190 5.189 Radius: Zn: 0.600 (Shannon radius for charge +2 coordination 4) S: 1.840 (Shannon radius for charge -2 coordination 6: 4 not available) 1. Building with space group (s014.xml): 186 Wyckoff positions: Zn 2b, z = 0.0 S 2b, z = 0.375 (3/8) Change 0.33333 (1/3), 0.66666 (2/3), 0.125 (1/8) View: Zn: style solid, size 1.0, variancy 1.0, scale 0.3 S: style solid, size 1.0, variancy 1.0, scale 0.3 ZnS: style solid, method length, color 0.5,0.5,0.5 scale 0.5 gamgi-0.17.5/dat/cell/structures/s014_ZnS_wurtzite.xml000066400000000000000000000174461433127522700226040ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s015_NiAs.txt000066400000000000000000000014311433127522700207520ustar00rootroot00000000000000Structure 15 Prototype: NiAs StrukturBericht / Pearson: B8_1 / hP4 lattice parameters: NiAs AuSe 3.6 5.01 4.12 5.39 NbSb CrS 4.270 5.447 3.419 5.550 Radius: Ni: 1.2460 (half-distance) As: 1.2450 (half-distance) 1. Building with space group (s015a.xml): 194 Wyckoff positions: Ni 2a As 2c Cell: primitive 2. Building with conventional cell (s015b.xml): Change: 0.66666 (1/3) 0.33333 (2/3) 0.25 (1/4) View: Ni: style solid, size 1.0, variancy 1.0, scale 0.3 As: style solid, size 1.0, variancy 1.0, scale 0.3 NiAs: style solid, method length, color 0.5,0.5,0.5 scale 0.7 Information: http://www.science.uwaterloo.ca/~cchieh/cact/applychem/inorgsolid.html The NiAs structure can be viewed as the hcp packing of As anions with the Ni ions occupying the octahedral sites. gamgi-0.17.5/dat/cell/structures/s015a_NiAs.xml000066400000000000000000000074301433127522700211010ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s015b_NiAs.xml000066400000000000000000000064631433127522700211070ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s016_Ni3Sn.txt000066400000000000000000000011461433127522700210560ustar00rootroot00000000000000Structure 16 Prototype: Ni3Sn StrukturBericht / Pearson: D0_19 / hP8 lattice parameters: Ni3Sn Fe3Ga 5.275 4.234 5.20 4.26 InTi3 Al3Sm 5.89 4.76 6.380 4.597 Radius: Ni: 1.2460 (half-distance) Sn: 1.4050 (half-distance) 1. Building with space group (s016a.xml): 194 Wyckoff positions: Ni 6h, x = 0.83333 (5/6) Sn 2c Change: 0.66666 (1/3) 0.33333 (2/3) 0.25 (1/4) 2. Building with primitive cell (s16b.xml): Cell: primitive View: Ni: style solid, size 1.0, variancy 1.0, scale 0.3 Sn: style solid, size 1.0, variancy 1.0, scale 0.3 NiSn: style solid, method length, color 0.5,0.5,0.5 scale 0.5 gamgi-0.17.5/dat/cell/structures/s016a_Ni3Sn.xml000066400000000000000000000144771433127522700212130ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s016b_Ni3Sn.xml000066400000000000000000000031371433127522700212030ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s017_aLa.txt000066400000000000000000000006341433127522700206230ustar00rootroot00000000000000Structure 17 Prototype: alpha-La StrukturBericht / Pearson: A3' / hP4 lattice parameters: a-La Nd 3.77 12.1596 3.6562 11.8056 Gd Sm 3.402 11.047 3.565 11.1456 Radius: La: 1.8695 (half-distance) 1. Building with space group (s017.xml): 194 Wyckoff positions: La 2a La 2c View: La: style solid, size 1.0, variancy 1.0, scale 0.3 CuCu: style solid, method length, color 0.5,0.5,0.5 scale 1.0 gamgi-0.17.5/dat/cell/structures/s017_aLa.xml000066400000000000000000000217151433127522700206070ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s018_bSn.txt000066400000000000000000000006051433127522700206470ustar00rootroot00000000000000Structure 18 Prototype: beta-Sn StrukturBericht / Pearson: A5 / tI4 lattice parameters: b-Sn Ge 5.8197 3.1750 4.9585 2.7463 Radius: Sn: 1.8695 (half-distance) 1. Building with space group (s018.xml): 141 Wyckoff positions: Sn 2a Change: 0.0, 0.25, -0.125 View: Sn: style solid, size 1.0, variancy 1.0, scale 0.2 SnSn: style solid, method length, color 0.5,0.5,0.5 scale 0.6 gamgi-0.17.5/dat/cell/structures/s018_bSn.xml000066400000000000000000000072471433127522700206410ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s019_In.txt000066400000000000000000000004411433127522700204720ustar00rootroot00000000000000Structure 19 Prototype: In StrukturBericht / Pearson: A6 / tI2 lattice parameters: In Pa 4.598 4.947 3.925 3.238 Radius: In: 1.6255 (half-distance) 1. Building with space group (s019.xml): 139 Wyckoff positions: In 1a View: In: style solid, size 1.0, variancy 1.0, scale 0.4 gamgi-0.17.5/dat/cell/structures/s019_In.xml000066400000000000000000000032101433127522700204500ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s020_As.txt000066400000000000000000000006301433127522700204570ustar00rootroot00000000000000Structure 20 Prototype: As StrukturBericht / Pearson: A7 / hR2 lattice parameters: As Bi 3.760 10.547 4.546 11.862 Radius: As: 1.2450 (half-distance) 1. Building with space group (s020.xml): 166 Wyckoff positions: As 2c, z = 0.2271 Change 0.0, 0.0, -0.2271 Cells: 2x2x1 View: As: style solid, size 1.0, variancy 1.0, scale 0.4 AsAs: style solid, method length, color 0.5,0.5,0.5 scale 0.6 gamgi-0.17.5/dat/cell/structures/s020_As.xml000066400000000000000000000235761433127522700204560ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s021_gSe.txt000066400000000000000000000007661433127522700206450ustar00rootroot00000000000000Structure 21 Prototype: gamma-Se StrukturBericht / Pearson: A8 / hP3 lattice parameters: Se Te 4.366 4.959 4.527 5.921 Radius: Se: 1.1605 (half-distance) 1. Building with space group (s021a.xml): 152 Wyckoff positions: Se 1a, x = 0.7364 Cells 2 x 2 x 1 1. Building with different volume (s021b.xml): Cells 1 x 1 x 3 View: Se: style solid, size 1.0, variancy 1.0, scale 0.3 SeSe: style solid, method length, color 0.5,0.5,0.5 scale 0.7 Features: Helix 3_1 of Se atoms along the c axis. gamgi-0.17.5/dat/cell/structures/s021a_gSe.xml000066400000000000000000000273161433127522700207670ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s021b_gSe.xml000066400000000000000000000175171433127522700207720ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s022_C_graphite.txt000066400000000000000000000005421433127522700221650ustar00rootroot00000000000000Structure 22 Prototype: C (Graphite) StrukturBericht / Pearson: A9 / hP4 lattice parameter: C 2.464 6.711 Radius: C 0.7130 (half-distance) 1. Building with space group (s022.xml): Group: 194 Wyckoff positions: C 2b C 2c Cells: 2x2x1 View: C: style solid, size 1.0, variancy 1.0, scale 0.3 CC style solid, method length, color 0.5,0.5,0.5 scale 0.7 gamgi-0.17.5/dat/cell/structures/s022_C_graphite.xml000066400000000000000000000427541433127522700221610ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s023_aHg.txt000066400000000000000000000004251433127522700206200ustar00rootroot00000000000000Structure 23 Prototype: alpha-Hg StrukturBericht / Pearson: A10 / hR1 lattice parameter: Hg 3.464 6.677 Radius: Hg 1.5025 (half-distance) 1. Building with space group (s023.xml): Group: 166 Wyckoff positions: Hg 1a View: Hg: style solid, size 1.0, variancy 1.0, scale 0.5 gamgi-0.17.5/dat/cell/structures/s023_aHg.xml000066400000000000000000000052111433127522700205770ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s024_Ga.txt000066400000000000000000000011371433127522700204520ustar00rootroot00000000000000Structure 24 Prototype: alpha-Ga StrukturBericht / Pearson: A10 / oC8 lattice parameters: Ga 4.517 7.645 4.511 Radius: Ga: 1.2210 (half-distance) 1. Building with space group (s024a.xml): 64 Wyckoff positions: 4f, y = 0.1525, z = 0.079 Bond length: 1) 2.3 to 2.5 2) 2.6 to 2.8 2. Building with different bonds and cells (s024b.xml): Bond length: 1) 2.3 to 2.5 2) 2.6 to 2.71 Cells 2 x 1 x 2 View: Ga: style solid, size 1.0, variancy 1.0, scale 0.3 GaGa 2.4 Angstrom: style solid, method length, color 0.5,0.5,0.5 scale 1.0 GaGa 2.7 Angstrom: style solid, method length, color 0.8,0.8,0.8 scale 0.6 gamgi-0.17.5/dat/cell/structures/s024a_Ga.xml000066400000000000000000000107311433127522700205740ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s024b_Ga.xml000066400000000000000000000245301433127522700205770ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s025_aMn.txt000066400000000000000000000006401433127522700206350ustar00rootroot00000000000000Structure 25 Prototype: alpha-Mn StrukturBericht / Pearson: A12 / cI58 lattice parameters: Mn 8.894 Radius: Mn: 1.3655 (half-distance) 1. Building with space group (s025.xml): 217 Wyckoff positions: 1a 4c, x = 0.317 12g, x = 0.356, z = 0.42 12g, x = 0.089, z = 0.278 Cells 1 x 1 x 1 View: Mn: style solid, size 1.0, variancy 1.0, scale 0.3 MnMn: style solid, method length default, color 0.5,0.5,0.5 scale 0.3 gamgi-0.17.5/dat/cell/structures/s025_aMn.xml000066400000000000000000000752621433127522700206320ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s026_bMn.txt000066400000000000000000000005501433127522700206370ustar00rootroot00000000000000Structure 26 Prototype: beta-Mn StrukturBericht / Pearson: A13 / cP20 lattice parameters: Mn 6.315 Radius: Mn: 1.3655 (half-distance) 1. Building with space group (s026.xml): 213 Wyckoff positions: 8c, x = 0.0636 12d, y = 0.2022 Cells 1 x 1 x 1 View: Mn: style solid, size 0.8, variancy 0.0, scale 1.0 MnMn: method length default, style solid, scale 1.0 gamgi-0.17.5/dat/cell/structures/s026_bMn.xml000066400000000000000000000151501433127522700206220ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s027_aU.txt000066400000000000000000000004461433127522700204750ustar00rootroot00000000000000Structure 27 Prototype: alpha-U StrukturBericht / Pearson: A20 / oC4 lattice parameters: a-U 2.854 2.854 4.955 Radius: U: 1.3850 (half-distance) 1. Building with space group (s027.xml): Group: 63 Wyckoff positions: U 2c, y = 0.1025 View: U: style solid, size 0.8, variancy 0.0, scale 1.0 gamgi-0.17.5/dat/cell/structures/s027_aU.xml000066400000000000000000000022071433127522700204530ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s028_Al3Ti.txt000066400000000000000000000006601433127522700210430ustar00rootroot00000000000000Structure 28 Prototype: Al3Ti StrukturBericht / Pearson: D0_22 / tI8 Lattice parameters: Al3Ti Al3Ta 3.836 8.579 3.837 8.550 Al3Hf Ga3Ta 3.928 8.888 3.836 8.579 Pt3V Pd3V 3.839 7.796 3.850 7.750 Radius: Al 1.4315 (half-distance) Ti 1.4480 (half-distance) 1. Building with space group (s028.xml): Group: 139 Wyckoff positions: Ti 1a Al 1b, 2d View: Al,Ti: style solid, size 0.8, variancy 0.0, scale 1.0 gamgi-0.17.5/dat/cell/structures/s028_Al3Ti.xml000066400000000000000000000043751433127522700210330ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s029_Cr3Si.txt000066400000000000000000000006731433127522700210570ustar00rootroot00000000000000Structure 29 Prototype: Cr3Si StrukturBericht / Pearson: A15 / cP8 Lattice parameters: Cr3Si AuZr3 GeMo3 IrTi3 4.555 5.486 4.932 5.0087 CoV3 Mo3Os BiNb3 Re7V3 4.676 4.9689 5.320 4.8783 Ti4Tl Nb0.38Si0.24V0.38 5.256 4.915 Radius: Cr 1.2490 (half-distance) Si 1.1760 (half-distance) 1. Building with space group (s029.xml): Group: 223 Wyckoff positions: Cr 6c Si 2a View: Si,Cr: style solid, size 0.8, variancy 0.0, scale 1.0 gamgi-0.17.5/dat/cell/structures/s029_Cr3Si.xml000066400000000000000000000135311433127522700210350ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s030_Al3Zr4.txt000066400000000000000000000010371433127522700211360ustar00rootroot00000000000000Structure 30 Prototype: Al3Zr4 StrukturBericht / Pearson: - / hP7 Lattice parameters: Al3Zr4 Al0.40Nb0.10Zr0.50 5.433 5.390 5.368 5.333 Al3Hf4 Al0.33Cu0.10Zr0.57 5.331 5.414 5.375 5.390 Radius: Al 1.4315 (half-distance) Zr 1.5895 (half-distance) 1. Building with space group (s030.xml): Group: 174 Wyckoff positions: Al 3j, x = 0.33333 (1/3), y = 0.16667 (2/6) Zr 1b, 1f, 2h, z = 0.25 (1/4) View: Al,Zr: style solid, size 0.8, variancy 0.0, scale 1.0 AlZr: style solid, method length, color 0.5,0.5,0.5, size 0.3, scale 0.7 gamgi-0.17.5/dat/cell/structures/s030_Al3Zr4.xml000066400000000000000000000101651433127522700211210ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s032_Cu2Mg_laves.txt000066400000000000000000000010101433127522700222170ustar00rootroot00000000000000Structure 32 Prototype: Cu2Mg StrukturBericht / Pearson: C15 / cF24 Lattice parameter: Cu2Mg Be2Ta CaNi2 7.048 6.51 7.239 DyMn2 EuPt2 Fe2Tb 7.56 7.714 7.40 Li2Pt Mg2Sn Mg2Si 7.60 6.762 6.352 Radius: Cu 1.2780 (half-distance) Mg 1.5985 (half-distance) 1. Building with space group (s032.xml): Group: 227 Wyckoff positions: Cu 4d Mg 2a Change: -0.125, -0.125, -0.125 View: Cu,Mg: style solid, size 1.0, variancy 1.0, scale 0.25 CuCu: style solid, method length, color 0.5,0.5,0.5, size 0.5, scale 0.5 gamgi-0.17.5/dat/cell/structures/s032_Cu2Mg_laves.xml000066400000000000000000000206131433127522700222120ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s033_MgZn2_laves.txt000066400000000000000000000010241433127522700222450ustar00rootroot00000000000000Structure 33 Prototype: MgZn2 StrukturBericht / Pearson: C14 / hP12 Lattice parameter: MgZn2 Al2Hf 5.221 8.567 5.24 8.68 BeV2 Cu2Yb 4.385 7.130 5.260 8.567 Co2Nb Mn3SiW 2 4.835 7.860 4.76 7.75 Radius: Mg 1.5985 (half-distance) Zn 1.3325 (half-distance) 1. Building with space group (s033.xml): Group: 194 Wyckoff positions: Mg 4f, z = 0.0629 Zn 2a Zn 6h, x = 0.8305 View: Mg,Zn: style solid, size 1.0, variancy 1.0, scale 0.25 ZnZn: style solid, method length, color 0.5,0.5,0.5, size 0.5, scale 0.5 gamgi-0.17.5/dat/cell/structures/s033_MgZn2_laves.xml000066400000000000000000000130601433127522700222310ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s034_MgNi2_laves.txt000066400000000000000000000010711433127522700222270ustar00rootroot00000000000000Structure 34 Prototype: MgNi2 StrukturBericht / Pearson: C36 / hP24 Lattice parameter: MgNi2 EuNi2 4.805 15.770 5.39 17.49 HfZn2 Cr2Ti 5.19 16.89 4.932 16.01 HfMn2 Cr2Zr 5.016 16.37 5.100 16.61 Radius: Mg 1.5985 (half-distance) Ni 1.2460 (half-distance) 1. Building with space group (s034.xml): Group: 194 Wyckoff positions: Mg 4e, z = 0.094 Mg 4f, z = 0.844 Ni 4f, z = 0.125 Ni 6g Ni 6h, x = 0.16667 View: Mg,Ni: style solid, size 1.0, variancy 1.0, scale 0.25 NiNi style solid, method length, color 0.5,0.5,0.5, size 0.5, scale 0.5 gamgi-0.17.5/dat/cell/structures/s034_MgNi2_laves.xml000066400000000000000000000300331433127522700222100ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s043_AuBe5.txt000066400000000000000000000007511433127522700210260ustar00rootroot00000000000000Structure 43 Prototype: AuBe5 StrukturBericht / Pearson: C15_b / cF24 Lattice parameter: AuBe5 Ni5U Cu5Gd 6.085 6.780 7.06 Cu5Tm AgCu4Gd Ni0.66Zn0.17Zr0.17 6.991 7.163 6.792 Radius: Au 1.4420 (half-distance) Be 1.1130 (half-distance) 1. Building with space group (s043.xml): Group: 216 Wyckoff positions: Au 1a Be 1c Be 4e, x = 0.625 (5/8) View: Au,Be: style solid, size 1.0, variancy 1.0, scale 0.25 FeC: style solid, method length, size 0.5, color 0.5,0.5,0.5, scale 0.5 gamgi-0.17.5/dat/cell/structures/s043_AuBe5.xml000066400000000000000000000212351433127522700210070ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s047_CaCu5.txt000066400000000000000000000010151433127522700210230ustar00rootroot00000000000000Structure 47 Prototype: CaCu5 StrukturBericht / Pearson: D2_d / hP6 Lattice parameter: CaCu5 Co5Sm 5.082 4.078 5.0002 3.964 Au5Ba NdPt 5 5.55690 4.542 5.345 4.391 AlCu4Er GdRh3Si2 5.029 4.139 5.505 3.549 Radius: Ca 1.9735 (half-distance) Cu 1.2780 (half-distance) 1. Building with space group (s047.xml): Group: 191 Wyckoff positions: Ca 1a Cu 2c Cu 3g View: Ca,Cu: style solid, size 1.0, variancy 1.0, scale 0.25 CaCu: style solid, method length, size 0.5, color 0.5,0.5,0.5, scale 0.5 gamgi-0.17.5/dat/cell/structures/s047_CaCu5.xml000066400000000000000000000115371433127522700210160ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s055_Fe3C.txt000066400000000000000000000007271433127522700206530ustar00rootroot00000000000000Structure 55 Prototype: Fe3C StrukturBericht / Pearson: - / oP16 Lattice parameter: Fe3C 5.0787 6.7297 4.5144 Radius: Fe 1.2410 (half-distance) C 0.7130 (half-distance) 1. Building with space group (s055.xml): Group: 62 Wyckoff positions: Fe 4c, x = 0.044, z = 0.837 Fe 8d, x = 0.181, y = 0.063, z = 0.337 C 4c, x = 0.881, z = 0.431. View: Fe,C: style solid, size 0.8, variancy 0.0, scale 1.0 FeC: style solid, method length, size 0.5, color 0.5,0.5,0.5, scale 1.0 gamgi-0.17.5/dat/cell/structures/s055_Fe3C.xml000066400000000000000000000136061433127522700206340ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s056_Fe2B.txt000066400000000000000000000005471433127522700206520ustar00rootroot00000000000000Structure 56 Prototype: Fe2B StrukturBericht / Pearson: - / tI12 Lattice parameter: Fe2B 5.109 4.249 Radius: Fe 1.2410 B 0.7945 1. Building with space group (s056.xml): Group: 140 Wyckoff positions: Fe 4h, x = 0.1661 B 2a View: Fe,B: style solid, size 1.0, variancy 1.0, scale 0.25 FeB: style solid, method length, size 0.5, color 0.5,0.5,0.5, scale 0.5 gamgi-0.17.5/dat/cell/structures/s056_Fe2B.xml000066400000000000000000000164111433127522700206300ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s058_Al2O3_corundum.txt000066400000000000000000000007161433127522700226700ustar00rootroot00000000000000Structure 58 Prototype: Al2O3 StrukturBericht / Pearson: D5_1 / hR30 Lattice parameter: Al2O3 4.7617 12.9947 Radius: Al3+ 0.5350, coordination 6 O2- 1.3800 coordination 4 1. Building with space group (s058.xml): Group: 167 Wyckoff positions: Al 4c, z = 0.3521 O 6e, x = 0.3065 View: Al: style solid, size 1.0, variancy 0.2, scale 0.5 O: style solid, size 1.0, variancy 0.2, scale 0.5 AlO: style solid, method length, size 0.5, color 0.0,0.8,0.0 scale 0.5 gamgi-0.17.5/dat/cell/structures/s058_Al2O3_corundum.xml000066400000000000000000000554201433127522700226530ustar00rootroot00000000000000 -0.7297 4.0131 11.9118 1.4595 2.7492 11.9118 -0.7297 1.4852 11.9118 0.9214 4.1238 9.7460 -1.6511 2.8598 9.7460 0.7297 1.2639 9.7460 8 3 1 2 5 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 3 3 1 5 3 2 4 5 3 4 3 5 0.7297 4.0131 5.4145 0.7297 1.4852 5.4145 -1.4595 2.7492 5.4145 1.6511 2.8598 3.2487 -0.9214 4.1238 3.2487 -0.7297 1.2639 3.2487 8 3 1 2 5 3 2 4 5 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 3 3 1 5 3 4 3 5 3.1106 2.6385 1.0829 0.9214 1.3746 1.0829 3.1106 0.1107 1.0829 4.0320 1.2639 3.2487 1.6511 2.8598 3.2487 1.4595 0.0000 3.2487 8 3 2 0 3 3 1 2 5 3 1 0 2 3 0 1 4 3 3 0 4 3 2 3 5 3 3 4 5 3 4 1 5 1.6511 0.1107 7.5802 3.8403 1.3746 7.5802 1.6511 2.6385 7.5802 3.3022 -0.0000 9.7460 0.7297 1.2639 9.7460 3.1106 2.8598 9.7460 8 3 1 2 5 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 3 3 1 5 3 2 4 5 3 4 3 5 2.3808 1.3746 6.2535 2.3809 1.3746 8.9070 2.3809 4.1238 8.4193 0.0000 2.7492 6.7412 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 gamgi-0.17.5/dat/cell/structures/s059_CatiO3.txt000066400000000000000000000006121433127522700212120ustar00rootroot00000000000000Structure 59 Prototype: CatiO3 StrukturBericht / Pearson: E2_1 / cP5 Lattice parameter: CaTiO3 MgSiO3 3.795 3.48 Radius: Ca2+ 1.43 (charge +2, coordination 12) Ti4+ 0.6050 (charge +4, coordination 6) O2- 1.4 (charge -2, coordination 6) 1. Building with space group (s059.xml): Group: 221 Wyckoff positions: Ca 1a Ti 1b O 3c View: Ca,Ti,O: style solid, size 0.5, variancy 0.0, scale 1.0 gamgi-0.17.5/dat/cell/structures/s059_CatiO3.xml000066400000000000000000000045651433127522700212060ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s060_MgAl2O4_spinel.txt000066400000000000000000000014121433127522700225760ustar00rootroot00000000000000Structure 60 Prototype: MgAl2O4 StrukturBericht / Pearson: H1_1 / cF56 Lattice parameter: MgAl2O4 ZnAl2O4 8.08 8.12 Fe3O4 (Zn,Mn,Fe)(Fe,Mn)2O4 8.4 8.42 FeCr2O4 8.36 Radius: Mg 1.5895 (half-distance) Al 1.4315 (half-distance) O 0.6037 (half-distance) 1. Building with space group (s060a.xml): Group: 227 Wyckoff positions: Mg 2a Al 4d O 8e, x = 0.25 Planes: (222), Start to End 2. Building with conventional cell (s060b.xml): Change -0.25, -0.25, -0.25 Planes: (008), Start to End 3. Building with polytopes (s060c.xml): Change -0.25, -0.25, -0.25 Mg tetrahedra, 8 (all) Al octahedra, 7 (inside) View: Mg,Al,O: style solid, size 0.5, variancy 0.0, scale 1.0 Mg tetrahedra: color 0.54, 1.0, 0.0 (Mg color) Al octahedra: color 0.75, 0.65, 0.65 (Al color) gamgi-0.17.5/dat/cell/structures/s060a_MgAl2O4_spinel.xml000066400000000000000000000356521433127522700227350ustar00rootroot00000000000000 0.0000 0.0000 4.0400 4.0400 0.0000 0.0000 0.0000 4.0400 0.0000 1 3 0 1 2 0.0000 -0.0000 8.0800 8.0800 0.0000 0.0000 0.0000 8.0800 -0.0000 1 3 0 1 2 0.0000 4.0400 8.0800 4.0400 0.0000 8.0800 8.0800 0.0000 4.0400 8.0800 4.0400 0.0000 4.0400 8.0800 0.0000 0.0000 8.0800 4.0400 1 6 0 1 2 3 4 5 0.0000 8.0800 8.0800 8.0800 -0.0000 8.0800 8.0800 8.0800 -0.0000 1 3 0 1 2 4.0400 8.0800 8.0800 8.0800 4.0400 8.0800 8.0800 8.0800 4.0400 1 3 0 1 2 gamgi-0.17.5/dat/cell/structures/s060b_MgAl2O4_spinel.xml000066400000000000000000000572371433127522700227410ustar00rootroot00000000000000 8.0800 8.0800 0.0000 0.0000 8.0800 0.0000 0.0000 0.0000 0.0000 8.0800 0.0000 0.0000 1 4 0 1 2 3 0.0000 0.0000 1.0100 8.0800 0.0000 1.0100 8.0800 8.0800 1.0100 0.0000 8.0800 1.0100 1 4 0 1 2 3 0.0000 0.0000 2.0200 8.0800 0.0000 2.0200 8.0800 8.0800 2.0200 0.0000 8.0800 2.0200 1 4 0 1 2 3 0.0000 0.0000 3.0300 8.0800 0.0000 3.0300 8.0800 8.0800 3.0300 0.0000 8.0800 3.0300 1 4 0 1 2 3 0.0000 0.0000 4.0400 8.0800 0.0000 4.0400 8.0800 8.0800 4.0400 0.0000 8.0800 4.0400 1 4 0 1 2 3 0.0000 0.0000 5.0500 8.0800 0.0000 5.0500 8.0800 8.0800 5.0500 0.0000 8.0800 5.0500 1 4 0 1 2 3 0.0000 0.0000 6.0600 8.0800 0.0000 6.0600 8.0800 8.0800 6.0600 0.0000 8.0800 6.0600 1 4 0 1 2 3 0.0000 0.0000 7.0700 8.0800 0.0000 7.0700 8.0800 8.0800 7.0700 0.0000 8.0800 7.0700 1 4 0 1 2 3 8.0800 8.0800 8.0800 0.0000 8.0800 8.0800 0.0000 0.0000 8.0800 8.0800 0.0000 8.0800 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/structures/s060c_MgAl2O4_spinel.xml000066400000000000000000000652231433127522700227340ustar00rootroot00000000000000 2.0200 2.0200 4.0400 4.0400 -0.0000 4.0400 4.0400 2.0200 2.0200 4.0400 4.0400 4.0400 4.0400 2.0200 6.0600 6.0600 2.0200 4.0400 8 3 2 0 3 3 1 2 5 3 1 0 2 3 0 1 4 3 3 0 4 3 2 3 5 3 3 4 5 3 4 1 5 6.0600 2.0200 8.0800 6.0600 4.0400 6.0600 6.0600 -0.0000 6.0600 4.0400 2.0200 6.0600 6.0600 2.0200 4.0400 8.0800 2.0200 6.0600 8 3 1 0 5 3 2 0 3 3 0 1 3 3 2 3 4 3 3 1 4 3 0 2 5 3 2 4 5 3 4 1 5 2.0200 0.0000 2.0200 4.0400 2.0200 2.0200 -0.0000 2.0200 2.0200 2.0200 2.0200 4.0400 2.0200 2.0200 0.0000 2.0200 4.0400 2.0200 8 3 2 0 3 3 0 1 3 3 2 3 5 3 1 0 4 3 0 2 4 3 3 1 5 3 1 4 5 3 4 2 5 4.0400 2.0200 2.0200 4.0400 4.0400 0.0000 4.0400 4.0400 4.0400 6.0600 4.0400 2.0200 4.0400 6.0600 2.0200 2.0200 4.0400 2.0200 8 3 1 0 5 3 2 0 3 3 0 1 3 3 2 3 4 3 3 1 4 3 0 2 5 3 2 4 5 3 4 1 5 2.0200 4.0400 6.0600 2.0200 2.0200 4.0400 -0.0000 4.0400 4.0400 2.0200 6.0600 4.0400 2.0200 4.0400 2.0200 4.0400 4.0400 4.0400 8 3 0 1 5 3 2 0 3 3 1 0 2 3 1 2 4 3 2 3 4 3 3 0 5 3 1 4 5 3 4 3 5 6.0600 6.0600 0.0000 6.0600 6.0600 4.0400 6.0600 8.0800 2.0200 4.0400 6.0600 2.0200 6.0600 4.0400 2.0200 8.0800 6.0600 2.0200 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 2.0200 6.0600 4.0400 2.0200 4.0400 6.0600 2.0200 8.0800 6.0600 -0.0000 6.0600 6.0600 4.0400 6.0600 6.0600 2.0200 6.0600 8.0800 8 3 2 0 3 3 0 1 3 3 2 3 5 3 1 0 4 3 0 2 4 3 3 1 5 3 1 4 5 3 4 2 5 4.0399 4.0393 8.0804 4.0398 2.0194 6.0604 2.0196 2.0195 8.0802 2.0201 4.0396 6.0602 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 -0.0003 -0.0000 4.0400 2.0199 2.0197 4.0401 -0.0002 2.0199 6.0600 2.0194 -0.0004 6.0602 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.0600 4.0390 6.0606 4.0404 6.0593 6.0604 6.0605 6.0590 4.0405 4.0403 4.0393 4.0404 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 6.0607 8.0790 6.0605 6.0602 6.0590 8.0806 8.0803 6.0587 6.0607 8.0805 8.0787 8.0808 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 0.0007 6.0600 2.0201 0.0006 4.0400 0.0001 2.0208 6.0597 0.0002 2.0204 4.0396 2.0202 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.0407 6.0594 2.0204 2.0206 6.0596 4.0402 4.0409 8.0794 4.0404 2.0210 8.0797 2.0203 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 8.0802 4.0387 4.0407 6.0604 4.0390 2.0205 8.0801 2.0188 2.0206 6.0600 2.0191 4.0405 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 4.0401 2.0194 2.0203 4.0400 -0.0006 0.0003 6.0602 2.0191 0.0005 6.0598 -0.0009 2.0204 4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 gamgi-0.17.5/dat/cell/structures/s061_CdI2.txt000066400000000000000000000005721433127522700206470ustar00rootroot00000000000000Structure 61 Prototype: CdI2 StrukturBericht / Pearson: C6 / hP5 Lattice parameters: CdI2 4.224 6.859 Radius: I: 1.3330 (half-distance) Cd: 1.4895 (half-distance) 1. Building with space group (s061.xml): Group: 164 Wyckoff positions: Cd 1a I 2d, z = 0.2492 Cells: 3 x 3 x 1 Cutoff: Nodes Polytopes: Neighbours 6 View: I,Cd: style solid, size 1.0, variancy 1.0, scale 0.25 gamgi-0.17.5/dat/cell/structures/s061_CdI2.xml000066400000000000000000000531571433127522700206370ustar00rootroot00000000000000 2.1120 8.5355 -1.7093 -2.1120 8.5355 -1.7093 2.1120 6.0968 1.7093 0.0000 9.7549 1.7093 -2.1120 6.0968 1.7093 -0.0000 4.8775 -1.7093 8 3 1 0 5 3 2 0 3 3 0 1 3 3 2 3 4 3 3 1 4 3 0 2 5 3 2 4 5 3 4 1 5 4.2240 4.8775 -1.7093 2.1120 6.0968 1.7093 6.3360 6.0968 1.7093 2.1120 8.5355 -1.7093 6.3360 8.5355 -1.7093 4.2240 9.7549 1.7093 8 3 1 2 5 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 3 3 1 5 3 2 4 5 3 4 3 5 2.1120 1.2194 -1.7093 4.2240 2.4387 1.7093 4.2240 4.8775 -1.7093 -0.0000 4.8775 -1.7093 -0.0000 2.4387 1.7093 2.1120 6.0968 1.7093 8 3 2 0 3 3 1 2 5 3 1 0 2 3 0 1 4 3 3 0 4 3 2 3 5 3 3 4 5 3 4 1 5 8.4480 4.8775 -1.7093 8.4480 2.4387 1.7093 6.3360 6.0968 1.7093 4.2240 4.8775 -1.7093 6.3360 1.2194 -1.7093 4.2240 2.4387 1.7093 8 3 2 0 3 3 1 2 5 3 1 0 2 3 0 1 4 3 3 0 4 3 2 3 5 3 3 4 5 3 4 1 5 4.2240 4.8775 5.1497 -0.0000 4.8775 5.1497 4.2240 2.4387 8.5683 2.1120 6.0968 8.5683 2.1120 1.2194 5.1497 0.0000 2.4387 8.5683 8 3 2 0 3 3 0 1 3 3 2 3 5 3 1 0 4 3 0 2 4 3 3 1 5 3 1 4 5 3 4 2 5 8.4480 2.4387 8.5683 8.4480 4.8775 5.1497 4.2240 2.4387 8.5683 6.3360 6.0968 8.5683 4.2240 4.8775 5.1497 6.3360 1.2194 5.1497 8 3 1 0 5 3 2 0 3 3 0 1 3 3 2 3 4 3 3 1 4 3 0 2 5 3 2 4 5 3 4 1 5 -2.1120 6.0968 8.5683 -0.0000 4.8775 5.1497 -2.1120 8.5355 5.1497 -0.0000 9.7549 8.5683 2.1120 8.5355 5.1497 2.1120 6.0968 8.5683 8 3 0 1 5 3 2 0 3 3 1 0 2 3 1 2 4 3 2 3 4 3 3 0 5 3 1 4 5 3 4 3 5 6.3360 8.5355 5.1497 2.1120 8.5355 5.1497 4.2240 4.8775 5.1497 6.3360 6.0968 8.5683 4.2240 9.7549 8.5683 2.1120 6.0968 8.5683 8 3 2 0 3 3 1 2 5 3 1 0 2 3 0 1 4 3 3 0 4 3 2 3 5 3 3 4 5 3 4 1 5 gamgi-0.17.5/dat/cell/structures/s062_TiO2_rutile.txt000066400000000000000000000010521433127522700222620ustar00rootroot00000000000000Structure 62 Prototype: TiO2 (Rutile) StrukturBericht / Pearson: C4 / tP6 Lattice parameter: TiO2 4.537 2.958 Radius: Ti4+: 0.6050 (Shannon radius for charge +4 coordination 6) O2-: 1.36 (Shannon radius for charge -2 coordination 3) 1. Building with space group (s062a.xml): Group: 136 Wyckoff positions: Ti 2a O 4f, x = 0.3053 Cells: 1 x 1 x 2 2. Building with polytopes (s062b.xml): Cell Link: Cutoff Nodes Group Create: Local, O, 6 View: Ti,O: style solid, size 1.0, variancy 1.0, scale 0.3 TiO: style solid, method length, size 0.1, scale 1.0 gamgi-0.17.5/dat/cell/structures/s062a_TiO2_rutile.xml000066400000000000000000000132771433127522700224200ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s062b_TiO2_rutile.xml000066400000000000000000000377241433127522700224240ustar00rootroot00000000000000 3.6536 0.8834 4.4370 1.3851 1.3851 2.9580 0.8834 3.6536 4.4370 3.1519 3.1519 2.9580 1.3851 1.3851 5.9160 3.1519 3.1519 5.9160 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 1.3851 5.9221 5.9160 -0.8834 5.4204 7.3950 -1.3851 3.1519 5.9160 0.8834 3.6536 7.3950 -0.8834 5.4204 4.4370 0.8834 3.6536 4.4370 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 1.3851 1.3851 5.9160 -1.3851 -1.3851 5.9160 0.8834 -0.8834 4.4370 0.8834 -0.8834 7.3950 -0.8834 0.8834 4.4370 -0.8834 0.8834 7.3950 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 1.3851 1.3851 2.9580 -0.8834 0.8834 4.4370 -1.3851 -1.3851 2.9580 0.8834 -0.8834 4.4370 0.8834 -0.8834 1.4790 -0.8834 0.8834 1.4790 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.9221 1.3851 2.9580 5.4204 -0.8834 1.4790 3.1519 -1.3851 2.9580 3.6536 0.8834 1.4790 3.6536 0.8834 4.4370 5.4204 -0.8834 4.4370 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.9221 5.9221 5.9160 3.6536 5.4204 7.3950 3.1519 3.1519 5.9160 5.4204 3.6536 7.3950 3.6536 5.4204 4.4370 5.4204 3.6536 4.4370 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 5.9221 1.3851 5.9160 3.6536 0.8834 7.3950 3.1519 -1.3851 5.9160 5.4204 -0.8834 7.3950 5.4204 -0.8834 4.4370 3.6536 0.8834 4.4370 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.9221 5.9221 2.9580 3.1519 3.1519 2.9580 5.4204 3.6536 4.4370 3.6536 5.4204 4.4370 5.4204 3.6536 1.4790 3.6536 5.4204 1.4790 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 1.3851 5.9221 2.9580 -0.8834 5.4204 1.4790 -1.3851 3.1519 2.9580 -0.8834 5.4204 4.4370 0.8834 3.6536 4.4370 0.8834 3.6536 1.4790 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 3.6536 0.8834 1.4790 0.8834 3.6536 1.4790 3.1519 3.1519 -0.0000 1.3851 1.3851 -0.0000 3.1519 3.1519 2.9580 1.3851 1.3851 2.9580 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 gamgi-0.17.5/dat/cell/structures/s065_ZnWO4.txt000066400000000000000000000007461433127522700210560ustar00rootroot00000000000000Structure 65 Prototype: ZnWO4 StrukturBericht / Pearson: - / mP12 Lattice parameters: ZnWO4 4.72 5.7 4.95 90.15 (beta = AC) Radius: Zn: (half-distance) W: (half-distance) O: (half-distance) 1. Building with space group (s065.xml): Group: 13 Wyckoff positions: Zn 2f, y = 0.674 W 2e, y = 0.2662 O 4g, x = 0.22, y = 0.11, z = 0.95 O 4g, x = 0.26, y = 0.38, z = 0.39 View: Zn,W,O: style solid, size 0.8, variancy 0.0, scale 1.0 ZnO,WO: style solid, method length, size 0.2, scale 1.0 gamgi-0.17.5/dat/cell/structures/s065_ZnWO4.xml000066400000000000000000000072711433127522700210370ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s098_SiO2_bquartz.txt000066400000000000000000000012731433127522700224630ustar00rootroot00000000000000Structure 98 Prototype: SiO2 beta-Quartz StrukturBericht / Pearson: - / hP9 Lattice parameters: SiO2 4.9965 5.4546 Radius: I: 1.3330 (half-distance) Cd: 1.4895 (half-distance) 1. Building with space group (s098.xml): Group: 180 Wyckoff positions: Si 6g, x = 0.5 O 12k, x = 0.4147, y = 0.2078, z = 0.1666 Cells: 3 x 3 x 1 Cutoff: Nodes Polytopes: Neighbours 6 View: I,Cd: style solid, size 1.0, variancy 1.0, scale 0.25 ii) b-quartz Structure Hexagonal Space Group: P6222 (No. 180) a=4.9965 ~E c=5.4546 ~E a=b=90.0, g=120.0 Z=3 Atomic Positional Parameters Si 6g 0.5000 0.0000 0.0000 O 12k 0.4147 0.2078 0.1666 References Y le Page and G Donnay (1976) Acta Crystallographica, B, 32, 2456. gamgi-0.17.5/dat/cell/structures/s098_SiO2_bquartz.xml000066400000000000000000000203311433127522700224400ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s103_Ice_Ic.txt000066400000000000000000000006751433127522700212420ustar00rootroot00000000000000Structure 103 Prototype: Ice-Ic StrukturBericht / Pearson: - / cF24 lattice parameters: Ice-Ic 6.35 Radius: O: 0.6037 (half-distance) H: 0.3706 (half-distance) 1. Building with space group (s103.xml): Group: 227 Wyckoff positions: O 2a H 4c Change: -0.125, -0.125, -0.125 View: O: style solid, size 1.0, variancy 1.0, scale 0.7 H: style solid, size 1.0, variancy 1.0, scale 0.7 OH: style solid, method length, color 0.5,0.5,0.5 scale 0.5 gamgi-0.17.5/dat/cell/structures/s103_Ice_Ic.xml000066400000000000000000000213731433127522700212210ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s104_CO2_cubic.txt000066400000000000000000000007031433127522700216500ustar00rootroot00000000000000Structure 104 Prototype: CO2-cubic StrukturBericht / Pearson: - / cP12 lattice parameters: CO2-cubic 5.056 Radius: O: 0.6037 (half-distance) C: 0.7130 (half-distance) 1. Building with space group (s104.xml): Group: 205 Wyckoff positions: O 8c, x = 0.1324 C 4a Cells: 2 x 2 x 2 View: O: style solid, size 1.0, variancy 1.0, scale 0.3 C: style solid, size 1.0, variancy 1.0, scale 0.3 OC: style solid, method length, color 0.5,0.5,0.5 scale 0.6 gamgi-0.17.5/dat/cell/structures/s104_CO2_cubic.xml000066400000000000000000000221011433127522700216250ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s105_C6H6.txt000066400000000000000000000012621433127522700205700ustar00rootroot00000000000000Structure 105 Prototype: C6H6 StrukturBericht / Pearson: - / oP48 lattice parameters: C6H6 7.44 9.55 6.92 Radius: C: 0.7130 (half-distance) H: 0.3706 (half-distance) 1. Building with space group (s105.xml): Group: 61 Cells: 2 x 2 x 2 Wyckoff positions: C 8c, x = -0.0569, y = 0.1387, z = -0.0054 C 8c, x = -0.1335, y = 0.046, z = 0.1264 C 8c, x = -0.0774, y = -0.0925, z = 0.1295 H 8c, x = -0.0976, y = 0.2477, z = -0.0177 H 8c, x = -0.2409, y = 0.0794, z = 0.2218 H 8c, x = -0.1371, y = -0.1631, z = 0.2312 View: C: style solid, size 1.0, variancy 1.0, scale 0.3 H: style solid, size 1.0, variancy 1.0, scale 0.3 CH: style solid, method length, color 0.5,0.5,0.5 scale 0.4 gamgi-0.17.5/dat/cell/structures/s105_C6H6.xml000066400000000000000000001214031433127522700205510ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/structures/s106_C8O46_ice_clathrate.txt000066400000000000000000000006171433127522700235400ustar00rootroot00000000000000Structure 106 Prototype: C8O46 StrukturBericht / Pearson: - / cP48 lattice parameters: C8O46 10.734 Radius: C: 0.7130 (half-distance) O: 0.6037 (half-distance) 1. Building with space group (s106.xml): Group: 223 Wyckoff positions: C 2a C 6d O 6c O 16i, x = 0.18459 O 24K, y = 0.30939, z = 0.11770 View: C: style solid O: style solid OO: style solid, method length, color 1.0,1.0,1.0 scale 0.6 gamgi-0.17.5/dat/cell/structures/s106_C8O46_ice_clathrate.xml000066400000000000000000000466551433127522700235350ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/styles.xml000066400000000000000000000035501433127522700164350ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/styles_bw.xml000066400000000000000000000037251433127522700171310ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/000077500000000000000000000000001433127522700176275ustar00rootroot00000000000000gamgi-0.17.5/dat/cell/superconductors/README000066400000000000000000000000571433127522700205110ustar00rootroot00000000000000N2 (P = 1 atm) melting T: 63 K boiling T: 77 K gamgi-0.17.5/dat/cell/superconductors/s01_La2CuO4.txt000066400000000000000000000012201433127522700221570ustar00rootroot00000000000000Superconductor (Tc = 38K): (La,Ba)2CuO4 Structure: 0201 Space group: 139 Lattice parameters: 3.7873 13.2883 Wyckoff positions: La,Ba 2e, z = 0.3606 Cu 1a O 2c O 2e, z = 0.1828 1. with Cell (s01a.xml): Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s01b.xml): Cells: 2 x 2 x 2 Neighbours: O Number: 6 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 J.D. Jorgensen, H.-B. Schuttler, D.G. Hinks, D.W. Capone II, K. Zhang, M.B. Brodsky, and D.J. Scalapino, Phys. Rev. Lett. 58, 1024 (1987) gamgi-0.17.5/dat/cell/superconductors/s01a_La2CuO4.xml000066400000000000000000000340031433127522700223060ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s01b_La2CuO4.xml000066400000000000000000000401661433127522700223160ustar00rootroot00000000000000 5.6809 1.8937 9.0733 5.6809 1.8937 4.2150 5.6809 0.0000 6.6442 3.7873 1.8937 6.6442 7.5746 1.8937 6.6442 5.6809 3.7873 6.6441 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 1.8936 1.8937 9.0733 1.8936 0.0000 6.6442 1.8936 1.8937 4.2150 3.7873 1.8937 6.6442 -0.0000 1.8937 6.6441 1.8936 3.7873 6.6441 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 5.6809 1.8937 17.5033 5.6809 0.0000 19.9325 5.6809 1.8937 22.3616 3.7873 1.8937 19.9324 5.6809 3.7873 19.9324 7.5746 1.8937 19.9325 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.6810 5.6810 4.2150 5.6809 3.7873 6.6441 5.6809 5.6810 9.0733 3.7873 5.6810 6.6441 7.5746 5.6810 6.6441 5.6810 7.5746 6.6441 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 3.7873 3.7873 10.8592 3.7873 3.7873 15.7174 3.7873 1.8937 13.2883 5.6809 3.7873 13.2883 3.7873 5.6810 13.2883 1.8936 3.7873 13.2883 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 1.8936 1.8937 17.5033 1.8936 0.0000 19.9325 1.8936 1.8937 22.3616 -0.0000 1.8937 19.9324 3.7873 1.8937 19.9324 1.8936 3.7873 19.9324 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 1.8936 5.6810 9.0733 3.7873 5.6810 6.6441 1.8937 5.6810 4.2150 1.8937 7.5746 6.6441 -0.0000 5.6810 6.6441 1.8936 3.7873 6.6441 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.6809 5.6810 17.5033 3.7873 5.6810 19.9324 5.6809 5.6810 22.3616 5.6809 7.5746 19.9324 7.5746 5.6810 19.9324 5.6809 3.7873 19.9324 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 1.8936 5.6810 17.5033 1.8936 5.6810 22.3616 -0.0000 5.6810 19.9324 1.8936 3.7873 19.9324 3.7873 5.6810 19.9324 1.8936 7.5746 19.9324 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 gamgi-0.17.5/dat/cell/superconductors/s02_Nd2CuO4-x.txt000066400000000000000000000010671433127522700224430ustar00rootroot00000000000000Superconductor (Tc = 24K): (Nd,Ce)2CuO4-x Structure: 0201 T' Space group: 139 Lattice parameters: 3.95 12.07 Wyckoff positions: Nd,Ce 2e, z = 0.3513 Cu 1a O 2c O 2d 1. with Cell (s02a.xml): Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s02b.xml): Cells: 2 x 2 x 2 Neighbours: O Number: 4 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 Y. Tokura, H. Takagi, and S. Uchida, Nature 337, 345 (1989) gamgi-0.17.5/dat/cell/superconductors/s02a_Nd2CuO4-x.xml000066400000000000000000000302221433127522700225600ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s02b_Nd2CuO4-x.xml000066400000000000000000000310251433127522700225630ustar00rootroot00000000000000 1.9750 3.9500 6.0350 0.0000 1.9750 6.0350 1.9750 -0.0000 6.0350 3.9500 1.9750 6.0350 1 4 0 1 2 3 1.9750 7.9000 6.0350 0.0000 5.9250 6.0350 1.9750 3.9500 6.0350 3.9500 5.9250 6.0350 1 4 0 1 2 3 5.9250 3.9500 6.0350 7.9000 1.9750 6.0350 5.9250 -0.0000 6.0350 3.9500 1.9750 6.0350 1 4 0 1 2 3 5.9250 7.9000 6.0350 7.9000 5.9250 6.0350 5.9250 3.9500 6.0350 3.9500 5.9250 6.0350 1 4 0 1 2 3 3.9500 1.9750 12.0700 5.9250 3.9500 12.0700 3.9500 5.9250 12.0700 1.9750 3.9500 12.0700 1 4 0 1 2 3 1.9750 -0.0000 18.1050 3.9500 1.9750 18.1050 1.9750 3.9500 18.1050 0.0000 1.9750 18.1050 1 4 0 1 2 3 1.9750 7.9000 18.1050 3.9500 5.9250 18.1050 1.9750 3.9500 18.1050 0.0000 5.9250 18.1050 1 4 0 1 2 3 5.9250 -0.0000 18.1050 3.9500 1.9750 18.1050 5.9250 3.9500 18.1050 7.9000 1.9750 18.1050 1 4 0 1 2 3 5.9250 3.9500 18.1050 3.9500 5.9250 18.1050 5.9250 7.9000 18.1050 7.9000 5.9250 18.1050 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/superconductors/s03_Nd2CuO4.txt000066400000000000000000000014751433127522700222020ustar00rootroot00000000000000Superconductor (Tc = 35K): (Nd,Sr,Ce)2CuO4 Structure: 0201 T* Space group: 129 Lattice parameters: 3.86 12.50 Wyckoff positions: Nd,Sr,Ce 2c, z = 0.3893 Nd,Sr,Ce 2c, z = 0.1035 Cu 2c, z = 0.7490 O 4f, z = 0.2378 O 8j, x = 0.2958, z = 0.5709 O 2a Change Wyckoff: O 8j -> O 2c, z = 0.5709 1. with Cell (s03a.xml): Cell Change XYZ: -0.25, -0.25, -0.7490 Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s03b.xml): Cell Change XYZ: -0.25, -0.25, -0.7490 Cells: 2 x 2 x 2 Neighbours: O Number: 5 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 F. Izumi, E. Takayama-Muromachi, A. Fujimori, T. Kamiyama, H. Asano, J. Akimitsu, and H. Sawa, Physica C 158, 440 (1989) gamgi-0.17.5/dat/cell/superconductors/s03a_Nd2CuO4.xml000066400000000000000000000264331433127522700223250ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s03b_Nd2CuO4.xml000066400000000000000000000343441433127522700223260ustar00rootroot00000000000000 1.9300 5.7900 8.5013 -0.0000 5.7900 6.1100 1.9300 7.7200 6.1100 1.9300 3.8600 6.1100 3.8600 5.7900 6.1100 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7900 5.7900 8.5013 5.7900 3.8600 6.1100 3.8600 5.7900 6.1100 5.7900 7.7200 6.1100 7.7200 5.7900 6.1100 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7900 5.7900 21.0013 3.8600 5.7900 18.6100 5.7900 7.7200 18.6100 7.7200 5.7900 18.6100 5.7900 3.8600 18.6100 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7900 1.9300 8.5013 3.8600 1.9300 6.1100 5.7900 3.8600 6.1100 7.7200 1.9300 6.1100 5.7900 -0.0000 6.1100 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 3.8600 3.8600 10.2738 3.8600 5.7900 12.6650 1.9300 3.8600 12.6650 3.8600 1.9300 12.6650 5.7900 3.8600 12.6650 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9300 5.7900 21.0013 -0.0000 5.7900 18.6100 1.9300 7.7200 18.6100 1.9300 3.8600 18.6100 3.8600 5.7900 18.6100 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9300 1.9300 8.5013 -0.0000 1.9300 6.1100 1.9300 3.8600 6.1100 3.8600 1.9300 6.1100 1.9300 -0.0000 6.1100 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9300 1.9300 21.0013 -0.0000 1.9300 18.6100 1.9300 3.8600 18.6100 1.9300 -0.0000 18.6100 3.8600 1.9300 18.6100 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7900 1.9300 21.0013 3.8600 1.9300 18.6100 5.7900 3.8600 18.6100 5.7900 -0.0000 18.6100 7.7200 1.9300 18.6100 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 gamgi-0.17.5/dat/cell/superconductors/s04_HgBa2CuO4+x.txt000066400000000000000000000012631433127522700227010ustar00rootroot00000000000000Superconductor (Tc = 98K): HgBa2CuO4+x Structure: 1201 Space group: 123 Lattice parameters: 3.875 9.5132 Wyckoff positions: Ba 2g, z = 0.2980 Hg 1c Cu 1d O 2e O 2h, z = 0.2078 O 1a 1. with Cell (s04a.xml): Cell Change XYZ: 0.5, 0.5, 0.5 Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s04b.xml): Cells: 2 x 2 x 2 Neighbours: O Number: 6 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 J.L. Wagner, P.G. Radaelli, D.G. Hinks, J.D. Jorgensen, J.F. Mitchell, B. Dabrowski, and G.S. Knapp, M.A. Beno Physica C 210, 311 (1993) gamgi-0.17.5/dat/cell/superconductors/s04a_HgBa2CuO4+x.xml000066400000000000000000000235131433127522700230250ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s04b_HgBa2CuO4+x.xml000066400000000000000000000335621433127522700230330ustar00rootroot00000000000000 1.9375 5.8125 7.5364 1.9375 5.8125 1.9768 3.8750 5.8125 4.7566 1.9375 3.8750 4.7566 0.0000 5.8125 4.7566 1.9375 7.7500 4.7566 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 5.8125 5.8125 7.5364 5.8125 7.7500 4.7566 5.8125 5.8125 1.9768 3.8750 5.8125 4.7566 5.8125 3.8750 4.7566 7.7500 5.8125 4.7566 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.8125 5.8125 11.4900 5.8125 5.8125 17.0496 5.8125 3.8750 14.2698 7.7500 5.8125 14.2698 3.8750 5.8125 14.2698 5.8125 7.7500 14.2698 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 1.9375 5.8125 11.4900 1.9375 5.8125 17.0496 0.0000 5.8125 14.2698 1.9375 3.8750 14.2698 3.8750 5.8125 14.2698 1.9375 7.7500 14.2698 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 1.9375 1.9375 7.5364 1.9375 1.9375 1.9768 3.8750 1.9375 4.7566 1.9375 -0.0000 4.7566 1.9375 3.8750 4.7566 0.0000 1.9375 4.7566 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 5.8125 1.9375 7.5364 3.8750 1.9375 4.7566 5.8125 1.9375 1.9768 5.8125 -0.0000 4.7566 7.7500 1.9375 4.7566 5.8125 3.8750 4.7566 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 1.9375 1.9375 11.4900 1.9375 3.8750 14.2698 1.9375 1.9375 17.0496 3.8750 1.9375 14.2698 1.9375 0.0000 14.2698 0.0000 1.9375 14.2698 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.8125 1.9375 11.4900 7.7500 1.9375 14.2698 5.8125 1.9375 17.0496 5.8125 0.0000 14.2698 3.8750 1.9375 14.2698 5.8125 3.8750 14.2698 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 gamgi-0.17.5/dat/cell/superconductors/s05_PbEu2Sr2Cu2O9.txt000066400000000000000000000012751433127522700231520ustar00rootroot00000000000000Superconductor (Tc = 25K): (Pb,Cu)(Eu,Ce)2(Sr,Eu)2Cu2O9 Structure: 1201 T* Space group: 139 Lattice parameters: 3.80 29.60 Wyckoff positions: Pb,Cu 1a Eu,Ce 2e, z = 0.2942 Sr,Eu 2e, z = 0.4245 Cu 2e, z = 0.1423 O 1b O 2e, z = 0.0660 O 4g, z = 0.3540 O 2d 1. with Cell (s05a.xml): Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s05b.xml): Cells: 2 x 2 x 2 Neighbours: O Number: 5 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 T. Maeda, K. Sakuyama, S. Koriyama, A. Ichinose, H. Yamauchi, and S. Tanaka, Physica C 169, 133 (1990) gamgi-0.17.5/dat/cell/superconductors/s05a_PbEu2Sr2Cu2O9.xml000066400000000000000000000643071433127522700233010ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s05b_PbEu2Sr2Cu2O9.xml000066400000000000000000000725341433127522700233030ustar00rootroot00000000000000 1.9000 1.9000 12.8464 3.8000 1.9000 10.4784 1.9000 0.0000 10.4784 -0.0000 1.9000 10.4784 1.9000 3.8000 10.4784 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9000 5.7000 12.8464 1.9000 7.6000 10.4784 1.9000 3.8000 10.4784 -0.0000 5.7000 10.4784 3.8000 5.7000 10.4784 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 1.9000 5.7000 16.7536 1.9000 7.6000 19.1216 1.9000 3.8000 19.1216 3.8000 5.7000 19.1216 -0.0000 5.7000 19.1216 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7000 5.7000 12.8464 5.7000 7.6000 10.4784 5.7000 3.8000 10.4784 3.8000 5.7000 10.4784 7.6000 5.7000 10.4784 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 1.9000 1.9000 16.7536 -0.0000 1.9000 19.1216 1.9000 0.0000 19.1216 1.9000 3.8000 19.1216 3.8000 1.9000 19.1216 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7000 1.9000 12.8464 5.7000 3.8000 10.4784 7.6000 1.9000 10.4784 3.8000 1.9000 10.4784 5.7000 0.0000 10.4784 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7000 1.9000 16.7536 7.6000 1.9000 19.1216 5.7000 3.8000 19.1216 3.8000 1.9000 19.1216 5.7000 0.0000 19.1216 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7000 5.7000 16.7536 5.7000 3.8000 19.1216 7.6000 5.7000 19.1216 3.8000 5.7000 19.1216 5.7000 7.6000 19.1216 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 3.8000 3.8000 27.6464 3.8000 1.9000 25.2784 1.9000 3.8000 25.2784 3.8000 5.7000 25.2784 5.7000 3.8000 25.2784 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 3.8000 3.8000 31.5536 1.9000 3.8000 33.9216 3.8000 1.9000 33.9216 3.8000 5.7000 33.9216 5.7000 3.8000 33.9216 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9000 1.9000 42.4464 1.9000 0.0000 40.0784 -0.0000 1.9000 40.0784 3.8000 1.9000 40.0784 1.9000 3.8000 40.0784 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9000 5.7000 42.4464 1.9000 3.8000 40.0784 -0.0000 5.7000 40.0784 1.9000 7.6000 40.0784 3.8000 5.7000 40.0784 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9000 5.7000 46.3536 3.8000 5.7000 48.7216 1.9000 7.6000 48.7216 1.9000 3.8000 48.7216 -0.0000 5.7000 48.7216 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7000 5.7000 42.4464 5.7000 3.8000 40.0784 3.8000 5.7000 40.0784 7.6000 5.7000 40.0784 5.7000 7.6000 40.0784 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9000 1.9000 46.3536 1.9000 0.0000 48.7216 3.8000 1.9000 48.7216 1.9000 3.8000 48.7216 -0.0000 1.9000 48.7216 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7000 1.9000 42.4464 3.8000 1.9000 40.0784 5.7000 3.8000 40.0784 5.7000 0.0000 40.0784 7.6000 1.9000 40.0784 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7000 1.9000 46.3536 7.6000 1.9000 48.7216 5.7000 3.8000 48.7216 5.7000 0.0000 48.7216 3.8000 1.9000 48.7216 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7000 5.7000 46.3536 5.7000 3.8000 48.7216 7.6000 5.7000 48.7216 3.8000 5.7000 48.7216 5.7000 7.6000 48.7216 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 gamgi-0.17.5/dat/cell/superconductors/s06_Eu2Ba2Cu3O10-x.txt000066400000000000000000000012641433127522700231430ustar00rootroot00000000000000Superconductor (Tc = 43K): (Eu,Ce)2(Ba,Eu)2Cu3O10-x Structure: 1201 T*F Space group: 139 Lattice parameters: 3.8504 28.4598 Wyckoff positions: Eu,Ce 2e, z = 0.2942 Ba,Eu 2e, z = 0.4245 Cu 1a, Cu 2e, z = 0.1423 O 2c O 2e, z = 0.0663 O 4g, z = 0.3540 O 2d 1. with Cell (s06a.xml): Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s06b.xml): Cells: 2 x 2 x 2 Neighbours: O Number: 5 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 H. Sawa, K. Obara, J. Akimitsu, Y. Matsui, and S. Horiuchi, J. Phys. Soc. Japan 58, 2252 (1989) gamgi-0.17.5/dat/cell/superconductors/s06a_Eu2Ba2Cu3O10-x.xml000066400000000000000000000727441433127522700233000ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s06b_Eu2Ba2Cu3O10-x.xml000066400000000000000000000735651433127522700233030ustar00rootroot00000000000000 5.7756 5.7756 12.3430 5.7756 3.8504 10.0748 3.8504 5.7756 10.0748 7.7008 5.7756 10.0748 5.7756 7.7008 10.0748 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7756 5.7756 16.1168 5.7756 3.8504 18.3850 5.7756 7.7008 18.3850 3.8504 5.7756 18.3850 7.7008 5.7756 18.3850 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 1.9252 5.7756 12.3430 1.9252 7.7008 10.0748 3.8504 5.7756 10.0748 1.9252 3.8504 10.0748 -0.0000 5.7756 10.0748 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7756 1.9252 12.3430 5.7756 -0.0000 10.0748 3.8504 1.9252 10.0748 7.7008 1.9252 10.0748 5.7756 3.8504 10.0748 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9252 5.7756 16.1168 1.9252 7.7008 18.3850 -0.0000 5.7756 18.3850 3.8504 5.7756 18.3850 1.9252 3.8504 18.3850 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9252 1.9252 12.3430 1.9252 -0.0000 10.0748 1.9252 3.8504 10.0748 3.8504 1.9252 10.0748 -0.0000 1.9252 10.0748 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 1.9252 1.9252 16.1168 -0.0000 1.9252 18.3850 1.9252 -0.0000 18.3850 3.8504 1.9252 18.3850 1.9252 3.8504 18.3850 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7756 1.9252 16.1168 3.8504 1.9252 18.3850 5.7756 -0.0000 18.3850 7.7008 1.9252 18.3850 5.7756 3.8504 18.3850 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 3.8504 3.8504 26.5729 3.8504 1.9252 24.3047 1.9252 3.8504 24.3047 3.8504 5.7756 24.3047 5.7756 3.8504 24.3047 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 3.8504 3.8504 30.3467 5.7756 3.8504 32.6149 3.8504 5.7756 32.6149 1.9252 3.8504 32.6149 3.8504 1.9252 32.6149 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9252 5.7756 40.8028 1.9252 3.8504 38.5346 -0.0000 5.7756 38.5346 3.8504 5.7756 38.5346 1.9252 7.7008 38.5346 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7756 5.7756 40.8028 5.7756 7.7008 38.5346 5.7756 3.8504 38.5346 3.8504 5.7756 38.5346 7.7008 5.7756 38.5346 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7756 5.7756 44.5766 5.7756 7.7008 46.8448 5.7756 3.8504 46.8448 7.7008 5.7756 46.8448 3.8504 5.7756 46.8448 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7756 1.9252 40.8028 5.7756 3.8504 38.5346 7.7008 1.9252 38.5346 3.8504 1.9252 38.5346 5.7756 -0.0000 38.5346 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9252 5.7756 44.5766 1.9252 7.7008 46.8448 -0.0000 5.7756 46.8448 3.8504 5.7756 46.8448 1.9252 3.8504 46.8448 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7756 1.9252 44.5766 3.8504 1.9252 46.8448 5.7756 -0.0000 46.8448 5.7756 3.8504 46.8448 7.7008 1.9252 46.8448 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9252 1.9252 40.8028 1.9252 -0.0000 38.5346 -0.0000 1.9252 38.5346 3.8504 1.9252 38.5346 1.9252 3.8504 38.5346 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9252 1.9252 44.5766 1.9252 -0.0000 46.8448 1.9252 3.8504 46.8448 -0.0000 1.9252 46.8448 3.8504 1.9252 46.8448 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 gamgi-0.17.5/dat/cell/superconductors/s07_TlCO3Sr4Cu2O7.txt000066400000000000000000000016111433127522700231150ustar00rootroot00000000000000Superconductor (Tc = 70K): (Tl,Pb)(CO3)Sr4Cu2O7 Structure: 1201 / 1201 Space group: 123 Lattice parameters: 3.8200 16.5200 Wyckoff positions: Tl,Pb 1a C 1b Sr 2h, z = 0.1596 Sr 2h, z = 0.3725 Cu 2g, z = 0.2654 O 4n, x = 0.67, occupancy = 0.25 O 2g, z = 0.1210 O 8s, x = 0.1620 z = 0.4140, occupancy = 0.25 O 4m, x = 0.3160, occupancy = 0.25 O 4i, z = 0.2770 Wyckoff change: O 4n -> O 1c O 8s -> O 2g, z = 0.4140 O 4m -> remove 3/4 of O 1. with Cell (s07a.xml): Cell Change XYZ: 0.0, 0.0, -0.2654 2. with Polytopes (s07b.xml): Cell Change XYZ: 0.5, 0.5, 0.5 Cells: 2 x 2 x 2 Neighbours: O Number: 6 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 M. Huve, C. Michel, A. Maignan, M. Hervieu, C. Martin, and B. Raveau Physica C 205, 219 (1993) gamgi-0.17.5/dat/cell/superconductors/s07a_TlCO3Sr4Cu2O7.xml000066400000000000000000000403161433127522700232440ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s07b_TlCO3Sr4Cu2O7.xml000066400000000000000000000675501433127522700232560ustar00rootroot00000000000000 1.9100 5.7300 1.4207 1.9100 5.7300 6.2611 0.0000 5.7300 3.6840 1.9100 3.8200 3.6840 1.9100 7.6400 3.6840 3.8200 5.7300 3.6840 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 1.9100 1.9100 1.4207 1.9100 3.8200 3.6840 1.9100 1.9100 6.2611 3.8200 1.9100 3.6840 0.0000 1.9100 3.6840 1.9100 -0.0000 3.6840 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 1.9100 1.9100 15.0993 1.9100 1.9100 10.2589 3.8200 1.9100 12.8360 1.9100 -0.0000 12.8360 1.9100 3.8200 12.8360 0.0000 1.9100 12.8360 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 1.9100 5.7300 15.0993 -0.0000 5.7300 12.8360 1.9100 5.7300 10.2589 1.9100 3.8200 12.8360 1.9100 7.6400 12.8360 3.8200 5.7300 12.8360 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 1.9100 5.7300 17.9407 1.9100 5.7300 22.7811 1.9100 3.8200 20.2040 3.8200 5.7300 20.2040 -0.0000 5.7300 20.2040 1.9100 7.6400 20.2040 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 5.7300 1.9100 1.4207 5.7300 3.8200 3.6840 5.7300 1.9100 6.2611 7.6400 1.9100 3.6840 5.7300 -0.0000 3.6840 3.8200 1.9100 3.6840 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.7300 5.7300 1.4207 5.7300 5.7300 6.2611 3.8200 5.7300 3.6840 5.7300 3.8200 3.6840 7.6400 5.7300 3.6840 5.7300 7.6400 3.6840 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 5.7300 5.7300 15.0993 5.7300 5.7300 10.2589 5.7300 3.8200 12.8360 3.8200 5.7300 12.8360 5.7300 7.6400 12.8360 7.6400 5.7300 12.8360 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 1.9100 1.9100 17.9407 -0.0000 1.9100 20.2040 1.9100 1.9100 22.7811 1.9100 3.8200 20.2040 3.8200 1.9100 20.2040 1.9100 0.0000 20.2040 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 1.9100 1.9100 31.6193 1.9100 1.9100 26.7789 -0.0000 1.9100 29.3560 1.9100 3.8200 29.3560 3.8200 1.9100 29.3560 1.9100 0.0000 29.3560 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 1.9100 5.7300 31.6193 1.9100 7.6400 29.3560 1.9100 5.7300 26.7789 -0.0000 5.7300 29.3560 1.9100 3.8200 29.3560 3.8200 5.7300 29.3560 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.7300 1.9100 15.0993 5.7300 0.0000 12.8360 5.7300 1.9100 10.2589 7.6400 1.9100 12.8360 5.7300 3.8200 12.8360 3.8200 1.9100 12.8360 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.7300 1.9100 17.9407 5.7300 1.9100 22.7811 7.6400 1.9100 20.2040 5.7300 3.8200 20.2040 5.7300 0.0000 20.2040 3.8200 1.9100 20.2040 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 5.7300 5.7300 17.9407 5.7300 5.7300 22.7811 3.8200 5.7300 20.2040 5.7300 3.8200 20.2040 5.7300 7.6400 20.2040 7.6400 5.7300 20.2040 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 5.7300 5.7300 31.6193 5.7300 7.6400 29.3560 5.7300 5.7300 26.7789 3.8200 5.7300 29.3560 5.7300 3.8200 29.3560 7.6400 5.7300 29.3560 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.7300 1.9100 31.6193 7.6400 1.9100 29.3560 5.7300 1.9100 26.7789 5.7300 3.8200 29.3560 5.7300 0.0000 29.3560 3.8200 1.9100 29.3560 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 gamgi-0.17.5/dat/cell/superconductors/s08_Tl2Ba2CuO6.txt000066400000000000000000000014611433127522700225470ustar00rootroot00000000000000Superconductor (Tc = 95K): Tl2Ba2CuO6 Structure: 2201 Space group: 139 Lattice parameters: 3.8637 23.1392 Wyckoff positions: Tl 2e, z = 0.2971 Ba 2e, z = 0.0847 Cu 1b O 2c O 2e, z = 0.3827 O 8n, y = 0.1043 z = 0.2104, Occupancy = 0.25 Wyckoff change: O 8n -> 2e, z = 0.2104 1. with Cell (s08a.xml): Cell Change XYZ: 0.0, 0.0, 0.5 Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s08b.xml): Cell Change XYZ: 0.0, 0.0, 0.5 Cells: 2 x 2 x 2 Neighbours: O Number: 6 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 F. Izumi, J.D. Jorgensen, Y. Shimakawa, Y. Kubo, T. Manoko, S. Pei, T. Matsumoto, R.L. Hitterman, and Y. Kanke, Physica C 193, 426 (1992) gamgi-0.17.5/dat/cell/superconductors/s08a_Tl2Ba2CuO6.xml000066400000000000000000000503551433127522700226770ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s08b_Tl2Ba2CuO6.xml000066400000000000000000000432271433127522700227000ustar00rootroot00000000000000 1.9318 5.7955 14.2838 1.9318 3.8637 11.5696 1.9318 5.7955 8.8554 3.8637 5.7955 11.5696 1.9318 7.7274 11.5696 -0.0000 5.7955 11.5696 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.7955 5.7955 8.8554 5.7955 5.7955 14.2838 5.7956 7.7274 11.5696 3.8637 5.7955 11.5696 5.7955 3.8637 11.5696 7.7274 5.7955 11.5696 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 1.9318 1.9318 14.2838 1.9318 -0.0000 11.5696 1.9318 1.9318 8.8554 3.8637 1.9318 11.5696 1.9318 3.8637 11.5696 -0.0000 1.9318 11.5696 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.7955 1.9318 14.2838 5.7955 -0.0000 11.5696 5.7955 1.9318 8.8554 7.7274 1.9318 11.5696 3.8637 1.9318 11.5696 5.7955 3.8637 11.5696 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 3.8637 3.8637 25.8534 3.8637 3.8637 20.4250 3.8637 1.9318 23.1392 1.9318 3.8637 23.1392 5.7955 3.8637 23.1392 3.8637 5.7955 23.1392 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 1.9318 5.7955 31.9946 1.9318 7.7274 34.7088 1.9318 5.7955 37.4230 3.8637 5.7955 34.7088 -0.0000 5.7955 34.7088 1.9318 3.8637 34.7088 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 5.7955 5.7955 31.9946 5.7955 3.8637 34.7088 5.7955 5.7955 37.4230 3.8637 5.7955 34.7088 7.7274 5.7955 34.7088 5.7955 7.7274 34.7088 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 1.9318 1.9318 31.9946 1.9318 1.9318 37.4230 1.9318 -0.0000 34.7088 3.8637 1.9318 34.7088 -0.0000 1.9318 34.7088 1.9318 3.8637 34.7088 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 5.7955 1.9318 31.9946 7.7274 1.9318 34.7088 5.7955 1.9318 37.4230 5.7955 -0.0000 34.7088 3.8637 1.9318 34.7088 5.7955 3.8637 34.7088 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 gamgi-0.17.5/dat/cell/superconductors/s09_Bi2Sr2Gd2Cu2O10.txt000066400000000000000000000015131433127522700232550ustar00rootroot00000000000000Superconductor (Tc = 34K): Bi2Sr2(Gd,Ce)2Cu2O10 Structure: 2201 T* Space group: 129 Lattice parameters: 3.85 17.88 Wyckoff positions: Bi 2c, z = 0.089 Sr 2c, z = 0.7800 Gd,Ce 2c, z = 0.5750 Cu 2c, z = 0.3270 O 4f, z = 0.3270 O 2c, z = 0.2260 O 2b O 2c, z = 0.911 1. with Cell (s10a.xml): Cell Change XYZ: -0.25, -0.25, -0.327 Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s10b.xml): Cell Change XYZ: -0.25, -0.25, -0.327 Cells: 2 x 2 x 2 Neighbours: O Number: 5 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 (Errata: data -> O4 is missing; image -> O4 and Bi are swapped) T. Arima, Y. Tokura, H. Takagi, S. Uchida, R. Beyers, and J.B. Torrance, Physica C 168, 79 (1990) gamgi-0.17.5/dat/cell/superconductors/s09a_Bi2Sr2Gd2Cu2O10.xml000066400000000000000000000402631433127522700234040ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s09b_Bi2Sr2Gd2Cu2O10.xml000066400000000000000000000360331433127522700234050ustar00rootroot00000000000000 3.8500 1.9250 24.0665 5.7750 0.0000 24.0665 5.7750 3.8500 24.0665 5.7750 1.9250 25.8724 7.7000 1.9250 24.0665 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 3.8500 5.7750 24.0665 5.7750 3.8500 24.0665 5.7750 7.7000 24.0665 5.7750 5.7750 25.8724 7.7000 5.7750 24.0665 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 3.8500 1.9250 6.1865 5.7750 0.0000 6.1865 5.7750 3.8500 6.1865 5.7750 1.9250 7.9924 7.7000 1.9250 6.1865 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 -0.0000 1.9250 24.0665 1.9250 0.0000 24.0665 1.9250 3.8500 24.0665 1.9250 1.9250 25.8724 3.8500 1.9250 24.0665 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 -0.0000 5.7750 24.0665 1.9250 3.8500 24.0665 3.8500 5.7750 24.0665 1.9250 5.7750 25.8724 1.9250 7.7000 24.0665 5 3 1 2 3 3 0 1 3 4 1 0 4 2 3 0 3 4 3 3 2 4 5.7750 3.8500 17.8800 3.8500 1.9250 17.8800 1.9250 3.8500 17.8800 3.8500 3.8500 16.0741 3.8500 5.7750 17.8800 5 3 1 2 3 3 0 1 3 4 1 0 4 2 3 0 3 4 3 3 2 4 3.8500 5.7750 6.1865 5.7750 3.8500 6.1865 7.7000 5.7750 6.1865 5.7750 5.7750 7.9924 5.7750 7.7000 6.1865 5 3 1 2 3 3 0 1 3 4 1 0 4 2 3 0 3 4 3 3 2 4 3.8500 1.9250 6.1865 1.9250 3.8500 6.1865 1.9250 0.0000 6.1865 1.9250 1.9250 7.9924 -0.0000 1.9250 6.1865 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 3.8500 5.7750 6.1865 -0.0000 5.7750 6.1865 1.9250 3.8500 6.1865 1.9250 5.7750 7.9924 1.9250 7.7000 6.1865 5 3 1 2 3 3 2 0 3 4 1 4 0 2 3 1 3 4 3 3 0 4 gamgi-0.17.5/dat/cell/superconductors/s10_Pb2Sr2Cu2O6.txt000066400000000000000000000014111433127522700226410ustar00rootroot00000000000000Superconductor (Tc = 32K): Pb2(Sr,La)2Cu2O6 Structure: 3201 Space group: 53 Lattice parameters: 5.3119 5.4140 12.629 Wyckoff positions: Pb 2g, z = 0.3603 Sr,La 2h, z = 0.1384 Cu 1a, Cu 1d, O 2f, O 2g, z = 0.1890 O 2h, z = 0.3510 Change group: 53 -> 123 Change parameters: 5.3119 5.4140 -> 3.7561 1. with Cell (s10a.xml): Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s10b.xml): Cells: 2 x 2 x 2 Neighbours: O Number: 6 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 (Errata: data -> O4 is missing; image -> O4 and Bi are swapped) F.J.M. Benschop, W.T. Fu, and W.J.A. Maaskant, Physica C 184, 311 (1991) gamgi-0.17.5/dat/cell/superconductors/s10a_Pb2Sr2Cu2O6.xml000066400000000000000000000240251433127522700227710ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s10b_Pb2Sr2Cu2O6.xml000066400000000000000000000351601433127522700227740ustar00rootroot00000000000000 1.8780 5.6341 8.7014 1.8780 5.6341 3.9276 1.8780 7.5122 6.3145 3.7561 5.6341 6.3145 1.8780 3.7561 6.3145 0.0000 5.6341 6.3145 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 1.8780 1.8780 8.7014 1.8780 1.8780 3.9276 3.7561 1.8780 6.3145 1.8780 0.0000 6.3145 1.8780 3.7561 6.3145 -0.0000 1.8780 6.3145 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 5.6342 1.8780 3.9276 5.6341 1.8780 8.7014 3.7561 1.8780 6.3145 5.6342 0.0000 6.3145 5.6341 3.7561 6.3145 7.5122 1.8780 6.3145 8 3 1 2 3 3 2 0 3 3 1 3 5 3 0 2 4 3 2 1 4 3 3 0 5 3 0 4 5 3 4 1 5 5.6341 5.6342 8.7014 5.6341 5.6341 3.9276 3.7561 5.6341 6.3145 5.6342 7.5122 6.3145 7.5122 5.6341 6.3145 5.6341 3.7561 6.3145 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 1.8781 5.6341 21.3304 3.7561 5.6341 18.9435 1.8780 5.6342 16.5566 1.8780 7.5122 18.9435 1.8781 3.7561 18.9435 0.0000 5.6341 18.9435 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 1.8780 1.8781 21.3304 1.8781 3.7561 18.9435 1.8780 1.8780 16.5566 0.0000 1.8780 18.9435 1.8780 0.0000 18.9435 3.7561 1.8781 18.9435 8 3 1 2 3 3 1 0 5 3 0 1 3 3 0 3 4 3 3 2 4 3 2 1 5 3 0 4 5 3 4 2 5 5.6342 5.6341 21.3304 5.6341 5.6342 16.5566 5.6342 3.7561 18.9435 3.7561 5.6341 18.9435 5.6341 7.5122 18.9435 7.5122 5.6341 18.9435 8 3 1 2 3 3 2 0 3 3 0 2 5 3 1 3 4 3 3 0 4 3 2 1 5 3 1 4 5 3 4 0 5 5.6341 1.8781 21.3304 3.7561 1.8781 18.9435 5.6342 1.8780 16.5566 5.6342 -0.0000 18.9435 5.6342 3.7561 18.9435 7.5122 1.8780 18.9435 8 3 1 2 3 3 0 1 3 3 0 3 5 3 1 0 4 3 2 1 4 3 3 2 5 3 2 4 5 3 4 0 5 gamgi-0.17.5/dat/cell/superconductors/s11_La2CaCu2O6.txt000066400000000000000000000014451433127522700225210ustar00rootroot00000000000000Superconductor (Tc = 58 K): (La,Sr,Ca)3Cu2O6 Structure: 0212 Space group: 139 Lattice parameters: 3.8208 19.5993 Wyckoff positions: La,Sr 2e, z = 0.1766 Ca 1a Cu 2e, z = 0.5866 O 4g, z = 0.0821 O 2e, z = 0.7036 1. with Cell (s11a.xml): Cell Change XYZ: 0.0, 0.0, -0.5866 Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s11b.xml): Cell Change XYZ: 0.0, 0.0, 0.5 Cells: 2 x 2 x 2 Neighbours: O Number: 5 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 (Errata: data -> O4 is missing; image -> O4 and Bi are swapped) R.J. Cava, A. Santoro, J.J. Krajewski, R.M. Fleming, J.V. Wasczak, W.F. Peck Jr., and P. Marsh, Physica C 172, 138 (1990) gamgi-0.17.5/dat/cell/superconductors/s11a_La2CaCu2O6.xml000066400000000000000000000402161433127522700226420ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s11b_La2CaCu2O6.xml000066400000000000000000000664321433127522700226530ustar00rootroot00000000000000 1.9104 1.9104 5.8092 1.9104 3.8208 8.1905 -0.0000 1.9104 8.1905 1.9104 0.0000 8.1905 3.8208 1.9104 8.1905 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9104 1.9104 13.7901 -0.0000 1.9104 11.4088 1.9104 3.8208 11.4088 3.8208 1.9104 11.4088 1.9104 0.0000 11.4088 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9104 5.7312 5.8092 0.0000 5.7312 8.1905 1.9104 3.8208 8.1905 3.8208 5.7312 8.1905 1.9104 7.6416 8.1905 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9104 5.7312 13.7901 1.9104 7.6416 11.4088 1.9104 3.8208 11.4088 -0.0000 5.7312 11.4088 3.8208 5.7312 11.4088 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7312 5.7312 5.8092 5.7312 3.8208 8.1905 7.6416 5.7312 8.1905 5.7312 7.6416 8.1905 3.8208 5.7312 8.1905 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7312 5.7312 13.7901 5.7312 3.8208 11.4088 5.7312 7.6416 11.4088 7.6416 5.7312 11.4088 3.8208 5.7312 11.4088 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3.8208 3.8208 15.6089 3.8208 1.9104 17.9902 5.7312 3.8208 17.9902 3.8208 5.7312 17.9902 1.9104 3.8208 17.9902 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9104 5.7312 25.4085 1.9104 3.8208 27.7898 3.8208 5.7312 27.7898 1.9104 7.6416 27.7898 -0.0000 5.7312 27.7898 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9104 5.7312 33.3894 1.9104 3.8208 31.0081 1.9104 7.6416 31.0081 3.8208 5.7312 31.0081 -0.0000 5.7312 31.0081 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7312 1.9104 5.8092 5.7312 0.0000 8.1905 7.6416 1.9104 8.1905 5.7312 3.8208 8.1905 3.8208 1.9104 8.1905 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7312 1.9104 13.7901 5.7312 3.8208 11.4088 7.6416 1.9104 11.4088 5.7312 0.0000 11.4088 3.8208 1.9104 11.4088 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 3.8208 3.8208 23.5897 3.8208 5.7312 21.2084 3.8208 1.9104 21.2084 1.9104 3.8208 21.2084 5.7312 3.8208 21.2084 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 1.9104 1.9104 25.4085 1.9104 3.8208 27.7898 -0.0000 1.9104 27.7898 1.9104 0.0000 27.7898 3.8208 1.9104 27.7898 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9104 1.9104 33.3894 3.8208 1.9104 31.0081 1.9104 0.0000 31.0081 1.9104 3.8208 31.0081 -0.0000 1.9104 31.0081 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7312 1.9104 25.4085 3.8208 1.9104 27.7898 5.7312 0.0000 27.7898 5.7312 3.8208 27.7898 7.6416 1.9104 27.7898 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7312 1.9104 33.3894 3.8208 1.9104 31.0081 5.7312 3.8208 31.0081 5.7312 0.0000 31.0081 7.6416 1.9104 31.0081 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7312 5.7312 25.4085 5.7312 7.6416 27.7898 3.8208 5.7312 27.7898 5.7312 3.8208 27.7898 7.6416 5.7312 27.7898 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7312 5.7312 33.3894 3.8208 5.7312 31.0081 5.7312 7.6416 31.0081 5.7312 3.8208 31.0081 7.6416 5.7312 31.0081 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 gamgi-0.17.5/dat/cell/superconductors/s12_TlBa2CaCu2O7-x.txt000066400000000000000000000014231433127522700232520ustar00rootroot00000000000000Superconductor (Tc = 103 K): TlBa2CaCu2O7-x Structure: 1212 Space group: 123 Lattice parameters: 3.8566 12.754 Wyckoff positions: Ba 2h, z = 0.2842 Tl 1b Ca 1c Cu 2g, z = 0.1255 O 4i, z = 0.1210 O 2g, z = 0.3421 O 1d 1. with Cell (s12a.xml): Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s12b.xml): Cell Change XYZ: 0.5, 0.5, 0.5 Cells: 2 x 2 x 2 Neighbours: O Number: 5 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 (Errata: data -> O4 is missing; image -> O4 and Bi are swapped) B. Morosin, D.S. Ginley, P.F.Hlava, M.J. Carr, R.J. Baughman, J.E. Schirber, E.L. Venturini, and J.F. Kwak Physica C 152, 413 (1988) gamgi-0.17.5/dat/cell/superconductors/s12a_TlBa2CaCu2O7-x.xml000066400000000000000000000244121433127522700233770ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s12b_TlBa2CaCu2O7-x.xml000066400000000000000000000570361433127522700234100ustar00rootroot00000000000000 1.9283 1.9283 10.7401 1.9283 0.0000 7.9202 0.0000 1.9283 7.9202 3.8566 1.9283 7.9202 1.9283 3.8566 7.9202 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9283 1.9283 2.0139 1.9283 3.8566 4.8338 0.0000 1.9283 4.8338 1.9283 -0.0000 4.8338 3.8566 1.9283 4.8338 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9283 5.7849 10.7401 1.9283 3.8566 7.9202 0.0000 5.7849 7.9202 1.9283 7.7132 7.9202 3.8566 5.7849 7.9202 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9283 5.7849 2.0139 1.9283 3.8566 4.8338 3.8566 5.7849 4.8338 0.0000 5.7849 4.8338 1.9283 7.7132 4.8338 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9283 5.7849 14.7679 1.9283 7.7132 17.5878 -0.0000 5.7849 17.5878 1.9283 3.8566 17.5878 3.8566 5.7849 17.5878 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7849 1.9283 2.0139 5.7849 3.8566 4.8338 3.8566 1.9283 4.8338 5.7849 -0.0000 4.8338 7.7132 1.9283 4.8338 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7849 5.7849 2.0139 5.7849 3.8566 4.8338 7.7132 5.7849 4.8338 5.7849 7.7132 4.8338 3.8566 5.7849 4.8338 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7849 5.7849 10.7401 3.8566 5.7849 7.9202 5.7849 7.7132 7.9202 7.7132 5.7849 7.9202 5.7849 3.8566 7.9202 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9283 1.9283 14.7679 1.9283 3.8566 17.5878 -0.0000 1.9283 17.5878 3.8566 1.9283 17.5878 1.9283 0.0000 17.5878 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9283 1.9283 23.4941 -0.0000 1.9283 20.6742 1.9283 3.8566 20.6742 3.8566 1.9283 20.6742 1.9283 0.0000 20.6742 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9283 5.7849 23.4941 1.9283 3.8566 20.6742 -0.0000 5.7849 20.6742 3.8566 5.7849 20.6742 1.9283 7.7132 20.6742 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7849 1.9283 10.7401 5.7849 0.0000 7.9202 5.7849 3.8566 7.9202 7.7132 1.9283 7.9202 3.8566 1.9283 7.9202 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7849 1.9283 23.4941 5.7849 0.0000 20.6742 5.7849 3.8566 20.6742 7.7132 1.9283 20.6742 3.8566 1.9283 20.6742 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7849 1.9283 14.7679 7.7132 1.9283 17.5878 5.7849 3.8566 17.5878 3.8566 1.9283 17.5878 5.7849 0.0000 17.5878 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7849 5.7849 23.4941 5.7849 3.8566 20.6742 3.8566 5.7849 20.6742 5.7849 7.7132 20.6742 7.7132 5.7849 20.6742 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7849 5.7849 14.7679 5.7849 3.8566 17.5878 7.7132 5.7849 17.5878 3.8566 5.7849 17.5878 5.7849 7.7132 17.5878 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 gamgi-0.17.5/dat/cell/superconductors/s13_YBa2Cu3O7-x.txt000066400000000000000000000014021433127522700226360ustar00rootroot00000000000000Superconductor (Tc = 92K): YBa2Cu3O7-x Structure: 1212 C Space group: 47 Lattice parameters: 3.8227 3.8872 11.6802 Wyckoff positions: Y 1h Ba 2t, z = 0.1843 Cu 1a Cu 2q, z = 0.3556 O 1e O 2s, z = 0.3779 O 2r, z = 0.379 O 2q, z = 0.159 1. with Cell (s13a.xml): Radius: Half-Distance, Size: 1.0, Variancy: 1.0, Scale: 0.25 2. with Polytopes (s13b.xml): Cell Change XYZ: 0.5, 0.5, 0.0 Cells: 2 x 2 x 2 Neighbours: O Number: 5, 4 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 J.D. Jorgensen, B.W. Veal, A.P. Paulikas, L.J. Nowicki, G.W. Crabtree, H. Claus, and W.K. Kwok, Phys. Rev. B. 41, 1863 (1990) gamgi-0.17.5/dat/cell/superconductors/s13a_YBa2Cu3O7-x.xml000066400000000000000000000262501433127522700227700ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s13b_YBa2Cu3O7-x.xml000066400000000000000000000664341433127522700230010ustar00rootroot00000000000000 1.9114 5.8308 1.8572 1.9113 3.8872 4.4268 1.9114 7.7744 4.4268 0.0000 5.8308 4.4139 3.8227 5.8308 4.4139 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 1.9113 1.9436 9.8230 1.9114 3.8872 7.2534 1.9113 -0.0000 7.2534 0.0000 1.9436 7.2663 3.8227 1.9436 7.2663 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 1.9114 1.9436 1.8572 1.9113 -0.0000 4.4268 1.9113 3.8872 4.4268 -0.0000 1.9436 4.4139 3.8227 1.9436 4.4139 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 1.9114 5.8308 9.8230 1.9114 3.8872 7.2534 1.9114 7.7744 7.2534 3.8227 5.8308 7.2663 0.0000 5.8308 7.2663 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 1.9113 5.8308 13.5374 1.9113 3.8872 16.1070 1.9113 7.7744 16.1070 -0.0000 5.8308 16.0941 3.8227 5.8308 16.0941 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 5.7340 1.9436 1.8572 5.7341 3.8872 4.4268 5.7340 -0.0000 4.4268 7.6454 1.9436 4.4139 3.8227 1.9436 4.4139 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 5.7341 5.8308 1.8572 5.7341 3.8872 4.4268 5.7341 7.7744 4.4268 3.8227 5.8308 4.4139 7.6454 5.8308 4.4139 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 5.7340 5.8308 9.8230 5.7340 3.8872 7.2534 5.7341 7.7744 7.2534 7.6454 5.8308 7.2663 3.8227 5.8308 7.2663 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 1.9113 1.9436 13.5374 1.9113 3.8872 16.1070 1.9113 0.0000 16.1070 3.8227 1.9436 16.0941 -0.0000 1.9436 16.0941 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 1.9113 1.9436 21.5032 1.9113 0.0000 18.9336 1.9113 3.8872 18.9336 3.8227 1.9436 18.9465 -0.0000 1.9436 18.9465 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 1.9113 5.8308 21.5032 1.9113 3.8872 18.9336 1.9113 7.7744 18.9336 3.8227 5.8308 18.9465 -0.0000 5.8308 18.9465 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 5.7340 1.9436 9.8230 5.7340 0.0000 7.2534 5.7340 3.8872 7.2534 7.6454 1.9436 7.2663 3.8227 1.9436 7.2663 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 5.7340 1.9436 13.5374 5.7340 0.0000 16.1070 5.7340 3.8872 16.1070 3.8227 1.9436 16.0941 7.6454 1.9436 16.0941 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 5.7340 5.8308 21.5032 5.7340 3.8872 18.9336 5.7340 7.7744 18.9336 7.6454 5.8308 18.9465 3.8227 5.8308 18.9465 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 5.7340 5.8308 13.5374 5.7340 7.7744 16.1070 5.7340 3.8872 16.1070 7.6454 5.8308 16.0941 3.8227 5.8308 16.0941 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 5.7340 1.9436 21.5032 5.7340 3.8872 18.9336 5.7340 0.0000 18.9336 3.8227 1.9436 18.9465 7.6454 1.9436 18.9465 6 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3 2 1 4 1.9113 3.8872 11.6802 1.9113 1.9436 9.8230 1.9113 0.0000 11.6802 1.9113 1.9436 13.5374 1 4 0 1 2 3 5.7340 0.0000 11.6802 5.7340 1.9436 13.5374 5.7340 3.8872 11.6802 5.7340 1.9436 9.8230 1 4 0 1 2 3 1.9113 7.7744 11.6802 1.9113 5.8308 9.8230 1.9113 3.8872 11.6802 1.9113 5.8308 13.5374 1 4 0 1 2 3 5.7340 3.8872 11.6802 5.7340 5.8308 9.8230 5.7340 7.7744 11.6802 5.7340 5.8308 13.5374 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/superconductors/s14_Tl2Ba2CaCu2O8.txt000066400000000000000000000016121433127522700230720ustar00rootroot00000000000000Superconductor (Tc = 118K): Tl2Ba2CaCu2O8 Structure: 2212 Space group: 139 Lattice parameters: 3.8550 29.318 Wyckoff positions: Ca 1a Tl 8m, x = 0.5, z = 0.2136 Ba 2e, z = 0.1218 Cu 8m, x = 0.5, z = 0.0540 O 4g, z = 0.0531 O 8m, x = 0.5, z = 0.1461 O 16o, x = 0.6040, y = 0.5, z = 0.2815 Change Wyckoff: O 16o -> O 2e, z = 0.2136 1. with Cell (s14a.xml): Cell Change XYZ: 0.5, 0.5, -0.0540 Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s14b.xml): Cell Change XYZ: 0.5, 0.5, 0.0 Cells: 2 x 2 x 2 Neighbours: O Number: 5 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 M. A. Subramanian, J.C. Calabrese, C. C. Torardi, J. Gopalakrishnan, T. R. Askew, R. B. Flippen, K.J. Morrissey, U. Chowdhry, and A.W. Sleight, Nature 332, 420 (1988) gamgi-0.17.5/dat/cell/superconductors/s14a_Tl2Ba2CaCu2O8.xml000066400000000000000000000604431433127522700232230ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s14b_Tl2Ba2CaCu2O8.xml000066400000000000000000000740301433127522700232210ustar00rootroot00000000000000 1.9275 1.9275 10.3756 1.9275 3.8550 13.1022 -0.0000 1.9275 13.1022 1.9275 0.0000 13.1022 3.8550 1.9275 13.1022 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9275 1.9275 18.9424 -0.0000 1.9275 16.2158 1.9275 3.8550 16.2158 1.9275 0.0000 16.2158 3.8550 1.9275 16.2158 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9275 5.7825 10.3756 -0.0000 5.7825 13.1022 1.9275 3.8550 13.1022 1.9275 7.7100 13.1022 3.8550 5.7825 13.1022 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9275 5.7825 18.9424 1.9275 3.8550 16.2158 -0.0000 5.7825 16.2158 3.8550 5.7825 16.2158 1.9275 7.7100 16.2158 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7825 1.9275 10.3756 5.7825 3.8550 13.1022 3.8550 1.9275 13.1022 7.7100 1.9275 13.1022 5.7825 0.0000 13.1022 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7825 5.7825 10.3756 3.8550 5.7825 13.1022 7.7100 5.7825 13.1022 5.7825 7.7100 13.1022 5.7825 3.8550 13.1022 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7825 5.7825 18.9424 7.7100 5.7825 16.2158 3.8550 5.7825 16.2158 5.7825 7.7100 16.2158 5.7825 3.8550 16.2158 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3.8550 3.8550 25.0346 3.8550 5.7825 27.7612 1.9275 3.8550 27.7612 3.8550 1.9275 27.7612 5.7825 3.8550 27.7612 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9275 5.7825 39.6936 1.9275 7.7100 42.4202 -0.0000 5.7825 42.4202 1.9275 3.8550 42.4202 3.8550 5.7825 42.4202 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7825 1.9275 18.9424 3.8550 1.9275 16.2158 5.7825 3.8550 16.2158 7.7100 1.9275 16.2158 5.7825 0.0000 16.2158 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 3.8550 3.8550 33.6014 1.9275 3.8550 30.8748 3.8550 5.7825 30.8748 3.8550 1.9275 30.8748 5.7825 3.8550 30.8748 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9275 1.9275 39.6936 1.9275 3.8550 42.4202 -0.0000 1.9275 42.4202 1.9275 0.0000 42.4202 3.8550 1.9275 42.4202 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9275 1.9275 48.2604 1.9275 3.8550 45.5338 3.8550 1.9275 45.5338 -0.0000 1.9275 45.5338 1.9275 0.0000 45.5338 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9275 5.7825 48.2604 1.9275 7.7100 45.5338 3.8550 5.7825 45.5338 -0.0000 5.7825 45.5338 1.9275 3.8550 45.5338 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7825 1.9275 39.6936 5.7825 0.0000 42.4202 5.7825 3.8550 42.4202 3.8550 1.9275 42.4202 7.7100 1.9275 42.4202 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7825 1.9275 48.2604 3.8550 1.9275 45.5338 5.7825 3.8550 45.5338 5.7825 0.0000 45.5338 7.7100 1.9275 45.5338 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7825 5.7825 39.6936 5.7825 7.7100 42.4202 3.8550 5.7825 42.4202 5.7825 3.8550 42.4202 7.7100 5.7825 42.4202 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7825 5.7825 48.2604 7.7100 5.7825 45.5338 3.8550 5.7825 45.5338 5.7825 7.7100 45.5338 5.7825 3.8550 45.5338 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 gamgi-0.17.5/dat/cell/superconductors/s17_Pb2Sr2YCu3O8.txt000066400000000000000000000014131433127522700230060ustar00rootroot00000000000000Superconductor (Tc = 70K): Pb2Sr2YCu3O8 Structure: 3212 Space group: 65 Lattice parameters: 5.390 5.430 15.730 Wyckoff positions: Sr 2h, z = 0.2207 Cu 2g, z = 0.1062 Pb 2g, z = 0.3883 Y 1c Cu 1d O 2g, z = 0.2514 O 2h, z = 0.3849 O 4i, z = 0.0918 Change: Group 65 -> Group 123 5.390 5.430 -> 5.410 1. with Cell (s17a.xml): Bond: Color 0.5,0.5,0.5, Scale 0.5 2. with Polytopes (s17b.xml): Cell Change XYZ: -0.5, -0.5, -0.5 Cells: 2 x 2 x 2 Neighbours: O Number: 5 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 R.J. Caca, M. Marezio, J.J. Krajewski, W.F. Peck Jr, A. Santoro, and F. Beech, Physica C 157, 272 (1989) gamgi-0.17.5/dat/cell/superconductors/s17a_Pb2Sr2YCu3O8.xml000066400000000000000000000231231433127522700231320ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s17b_Pb2Sr2YCu3O8.xml000066400000000000000000000576511433127522700231500ustar00rootroot00000000000000 2.7050 -0.0000 9.3090 5.4100 2.7050 9.3090 2.7050 5.4100 9.3090 2.7050 2.7050 11.8195 0.0000 2.7050 9.3090 5 3 1 2 3 3 0 1 3 4 1 0 4 2 3 0 3 4 3 3 2 4 2.7050 -0.0000 6.4210 0.0000 2.7050 6.4210 2.7050 5.4100 6.4210 2.7050 2.7050 3.9105 5.4100 2.7050 6.4210 5 3 1 2 3 3 0 1 3 4 1 0 4 2 3 0 3 4 3 3 2 4 2.7050 5.4100 9.3090 5.4100 8.1150 9.3090 0.0000 8.1150 9.3090 2.7050 8.1150 11.8195 2.7050 10.8200 9.3090 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 2.7050 5.4100 6.4210 -0.0000 8.1150 6.4210 2.7050 10.8200 6.4210 2.7050 8.1150 3.9105 5.4100 8.1150 6.4210 5 3 1 2 3 3 0 1 3 4 1 0 4 2 3 0 3 4 3 3 2 4 2.7050 -0.0000 22.1510 0.0000 2.7050 22.1510 5.4100 2.7050 22.1510 2.7050 2.7050 19.6405 2.7050 5.4100 22.1510 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 2.7050 5.4100 22.1510 0.0000 8.1150 22.1510 5.4100 8.1150 22.1510 2.7050 8.1150 19.6405 2.7050 10.8200 22.1510 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 5.4100 8.1150 25.0390 2.7050 10.8200 25.0390 2.7050 5.4100 25.0390 2.7050 8.1150 27.5495 0.0000 8.1150 25.0390 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 8.1150 5.4100 6.4210 5.4100 8.1150 6.4210 8.1150 10.8200 6.4210 8.1150 8.1150 3.9105 10.8200 8.1150 6.4210 5 3 1 2 3 3 0 1 3 4 1 0 4 2 3 0 3 4 3 3 2 4 2.7050 5.4100 25.0390 2.7050 -0.0000 25.0390 5.4100 2.7050 25.0390 2.7050 2.7050 27.5495 0.0000 2.7050 25.0390 5 3 1 2 3 3 2 0 3 4 1 4 0 2 3 1 3 4 3 3 0 4 5.4100 2.7050 6.4210 8.1150 5.4100 6.4210 8.1150 0.0000 6.4210 8.1150 2.7050 3.9105 10.8200 2.7050 6.4210 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 10.8200 2.7050 9.3090 8.1150 5.4100 9.3090 8.1150 -0.0000 9.3090 8.1150 2.7050 11.8195 5.4100 2.7050 9.3090 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 5.4100 8.1150 9.3090 8.1150 5.4100 9.3090 8.1150 10.8200 9.3090 8.1150 8.1150 11.8195 10.8200 8.1150 9.3090 5 3 2 0 3 3 0 1 3 4 1 0 2 4 3 2 3 4 3 3 1 4 8.1150 -0.0000 25.0390 8.1150 5.4100 25.0390 5.4100 2.7050 25.0390 8.1150 2.7050 27.5495 10.8200 2.7050 25.0390 5 3 1 2 3 3 2 0 3 4 1 4 0 2 3 1 3 4 3 3 0 4 8.1150 -0.0000 22.1510 8.1150 5.4100 22.1510 10.8200 2.7050 22.1510 8.1150 2.7050 19.6405 5.4100 2.7050 22.1510 5 3 1 2 3 3 2 0 3 4 1 4 0 2 3 1 3 4 3 3 0 4 8.1150 10.8200 25.0390 5.4100 8.1150 25.0390 8.1150 5.4100 25.0390 8.1150 8.1150 27.5495 10.8200 8.1150 25.0390 5 3 1 2 3 3 0 1 3 4 1 0 4 2 3 0 3 4 3 3 2 4 10.8200 8.1150 22.1510 8.1150 5.4100 22.1510 5.4100 8.1150 22.1510 8.1150 8.1150 19.6405 8.1150 10.8200 22.1510 5 3 1 2 3 3 0 1 3 4 1 0 4 2 3 0 3 4 3 3 2 4 gamgi-0.17.5/dat/cell/superconductors/s18_PbBaYSrCu3O8.txt000066400000000000000000000012661433127522700231140ustar00rootroot00000000000000Superconductor (Tc = 50K): PbBaYSrCu3O8 Structure: 0223 Space group: 139 Lattice parameters: 3.842 27.66 Wyckoff positions: Ba,Pb 2e, z = 0.2900 Y,Sr 2e, z = 0.4370 Cu 1a Cu 2e, z = 0.1220 O 2c O 2e, z = 0.2000 O 4g, z = 0.1180 1. with Cell (s18a.xml): Bond: Color 0.5,0.5,0.5, Scale 0.32 2. with Polytopes (s18b.xml): Cells: 2 x 2 x 2 Neighbours: O Number: 5, 4 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 T. Rouillon, R.Retoux, D. Groult, C. Michel, M. Hervieu, J. Provost, and B. Raveau, J. Solid State Chem. 78, 322 (1989) gamgi-0.17.5/dat/cell/superconductors/s18a_PbBaYSrCu3O8.xml000066400000000000000000000556401433127522700232430ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s18b_PbBaYSrCu3O8.xml000066400000000000000000000644701433127522700232450ustar00rootroot00000000000000 1.9210 5.7630 19.3620 1.9210 3.8420 17.0939 -0.0000 5.7630 17.0939 1.9210 7.6840 17.0939 3.8420 5.7630 17.0939 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9210 1.9210 19.3620 3.8420 1.9210 17.0939 -0.0000 1.9210 17.0939 1.9210 3.8420 17.0939 1.9210 -0.0000 17.0939 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7630 1.9210 19.3620 3.8420 1.9210 17.0939 5.7630 3.8420 17.0939 5.7630 -0.0000 17.0939 7.6840 1.9210 17.0939 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7630 5.7630 19.3620 7.6840 5.7630 17.0939 3.8420 5.7630 17.0939 5.7630 7.6840 17.0939 5.7630 3.8420 17.0939 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 3.8420 3.8420 22.1280 3.8420 5.7630 24.3961 1.9210 3.8420 24.3961 5.7630 3.8420 24.3961 3.8420 1.9210 24.3961 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 3.8420 3.8420 33.1920 5.7630 3.8420 30.9239 1.9210 3.8420 30.9239 3.8420 5.7630 30.9239 3.8420 1.9210 30.9239 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 1.9210 1.9210 35.9580 3.8420 1.9210 38.2261 1.9210 3.8420 38.2261 1.9210 0.0000 38.2261 -0.0000 1.9210 38.2261 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9210 5.7630 35.9580 1.9210 7.6840 38.2261 -0.0000 5.7630 38.2261 3.8420 5.7630 38.2261 1.9210 3.8420 38.2261 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7630 5.7630 35.9580 3.8420 5.7630 38.2261 7.6840 5.7630 38.2261 5.7630 7.6840 38.2261 5.7630 3.8420 38.2261 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7630 1.9210 35.9580 3.8420 1.9210 38.2261 5.7630 0.0000 38.2261 5.7630 3.8420 38.2261 7.6840 1.9210 38.2261 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9210 3.8420 13.8300 3.8420 5.7630 13.8300 1.9210 7.6840 13.8300 -0.0000 5.7630 13.8300 1 4 0 1 2 3 3.8420 1.9210 13.8300 1.9210 0.0000 13.8300 -0.0000 1.9210 13.8300 1.9210 3.8420 13.8300 1 4 0 1 2 3 5.7630 3.8420 13.8300 7.6840 1.9210 13.8300 5.7630 0.0000 13.8300 3.8420 1.9210 13.8300 1 4 0 1 2 3 5.7630 7.6840 13.8300 3.8420 5.7630 13.8300 5.7630 3.8420 13.8300 7.6840 5.7630 13.8300 1 4 0 1 2 3 5.7630 3.8420 27.6600 3.8420 1.9210 27.6600 1.9210 3.8420 27.6600 3.8420 5.7630 27.6600 1 4 0 1 2 3 1.9210 3.8420 41.4900 -0.0000 5.7630 41.4900 1.9210 7.6840 41.4900 3.8420 5.7630 41.4900 1 4 0 1 2 3 3.8420 5.7630 41.4900 5.7630 3.8420 41.4900 7.6840 5.7630 41.4900 5.7630 7.6840 41.4900 1 4 0 1 2 3 -0.0000 1.9210 41.4900 1.9210 3.8420 41.4900 3.8420 1.9210 41.4900 1.9210 0.0000 41.4900 1 4 0 1 2 3 5.7630 0.0000 41.4900 7.6840 1.9210 41.4900 5.7630 3.8420 41.4900 3.8420 1.9210 41.4900 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/superconductors/s19_TlBa2Ca2Cu3O9+x.txt000066400000000000000000000013731433127522700233500ustar00rootroot00000000000000Superconductor (Tc = 123 K): s19_TlBa2Ca2Cu3O9+x Structure: 1223 Space group: 123 Lattice parameters: 3.8429 15.8710 Wyckoff positions: Tl 1a Ba 2h, z = 0.1760 Ca 2h, z = 0.3970 Cu 1b, Cu 2g, z = 0.3020 O 2e O 4i, z = 0.3040 O 2g, z = 0.1320 O 1c 1. with Cell (s19a.xml): Cell Change XYZ: 0.0, 0.0, 0.5 Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s19b.xml): Cell Change XYZ: 0.5, 0.5, 0.0 Cells: 2 x 2 x 2 Neighbours: O Number: 5, 4 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 S.S.P. Parkin, V.Y. Lee, A.I. Nazzal, R. Savoy, R. Beyers, and S.J. LaPlaca, Phys. Rev. Lett. 61, 750 (1988) gamgi-0.17.5/dat/cell/superconductors/s19a_TlBa2Ca2Cu3O9+x.xml000066400000000000000000000366521433127522700235020ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s19b_TlBa2Ca2Cu3O9+x.xml000066400000000000000000000537611433127522700235030ustar00rootroot00000000000000 1.9215 5.7644 13.7760 1.9215 3.8429 11.0462 -0.0000 5.7644 11.0462 3.8429 5.7644 11.0462 1.9215 7.6858 11.0462 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7643 1.9215 13.7760 7.6858 1.9215 11.0462 5.7644 0.0000 11.0462 5.7643 3.8429 11.0462 3.8429 1.9215 11.0462 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9214 1.9215 13.7760 1.9215 3.8429 11.0462 3.8429 1.9215 11.0462 -0.0000 1.9215 11.0462 1.9214 0.0000 11.0462 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7643 5.7644 13.7760 3.8429 5.7644 11.0462 5.7644 7.6858 11.0462 7.6858 5.7644 11.0462 5.7643 3.8429 11.0462 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9214 1.9215 17.9660 -0.0000 1.9215 20.6958 1.9215 0.0000 20.6958 3.8429 1.9215 20.6958 1.9214 3.8429 20.6958 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9214 5.7644 17.9660 1.9214 3.8429 20.6958 1.9215 7.6858 20.6958 -0.0000 5.7644 20.6958 3.8429 5.7644 20.6958 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7644 5.7644 17.9660 5.7644 7.6858 20.6958 3.8429 5.7644 20.6958 5.7643 3.8429 20.6958 7.6858 5.7644 20.6958 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7644 1.9215 17.9660 5.7643 3.8429 20.6958 5.7643 0.0000 20.6958 7.6858 1.9215 20.6958 3.8429 1.9215 20.6958 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7643 3.8429 23.8065 7.6858 5.7644 23.8065 5.7643 7.6858 23.8065 3.8429 5.7644 23.8065 1 4 0 1 2 3 5.7643 3.8429 23.8065 3.8429 1.9215 23.8065 5.7643 0.0000 23.8065 7.6858 1.9215 23.8065 1 4 0 1 2 3 1.9214 3.8429 23.8065 3.8429 1.9215 23.8065 1.9214 0.0000 23.8065 -0.0000 1.9215 23.8065 1 4 0 1 2 3 3.8429 5.7644 23.8065 1.9214 3.8429 23.8065 -0.0000 5.7644 23.8065 1.9214 7.6858 23.8065 1 4 0 1 2 3 1.9214 0.0000 7.9355 3.8429 1.9215 7.9355 1.9214 3.8429 7.9355 -0.0000 1.9215 7.9355 1 4 0 1 2 3 1.9214 7.6858 7.9355 3.8429 5.7644 7.9355 1.9215 3.8429 7.9355 0.0000 5.7644 7.9355 1 4 0 1 2 3 5.7643 3.8429 7.9355 7.6858 5.7644 7.9355 5.7643 7.6858 7.9355 3.8429 5.7643 7.9355 1 4 0 1 2 3 3.8429 1.9214 7.9355 5.7644 3.8429 7.9355 7.6858 1.9215 7.9355 5.7644 0.0000 7.9355 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/superconductors/s25_Tl2Ba2Ca4Cu5O14.txt000066400000000000000000000015251433127522700232430ustar00rootroot00000000000000Superconductor (Tc = 105 K): Tl2Ba2Ca4Cu5O14 Structure: 2245 Space group: 139 Lattice parameters: 3.85 48.2 Wyckoff positions: Ca 8m, x = 0.5 z = 0.0320 Ca 8m, x = 0.5 z = 0.0960 Tl 2e, z = 0.2250 Ba 8m, x = 0.5 z = 0.1680 Cu 1a Cu 2e, z = 0.0640 Cu 2e, z = 0.1280 O 2c O 4g, z = 0.0640 O 4g, z = 0.1280 O 2e, z = 0.1680 O 8m, x = 0.5 z = 0.2250 1. with Cell (s25a.xml): Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s25b.xml): Cells: 2 x 2 x 2 Neighbours: O Number: 5, 4 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 (Errata: Tl and O5 are swapped) S. Nakajima, M. Kikuchi, Y. Syono, T. Oku, D. Shindo, K. Hiraga, N. Kobayashi, H. Iwasaki, and Y. Muto, Physica C 158, 471 (1989) gamgi-0.17.5/dat/cell/superconductors/s25a_Tl2Ba2Ca4Cu5O14.xml000066400000000000000000001305511433127522700233670ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s25b_Tl2Ba2Ca4Cu5O14.xml000066400000000000000000001225101433127522700233640ustar00rootroot00000000000000 3.8500 3.8500 56.2976 5.7750 3.8500 54.3696 3.8500 1.9250 54.3696 1.9250 3.8500 54.3696 3.8500 5.7750 54.3696 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 3.8500 3.8500 40.1024 3.8500 1.9250 42.0304 5.7750 3.8500 42.0304 1.9250 3.8500 42.0304 3.8500 5.7750 42.0304 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9250 1.9250 64.2024 3.8500 1.9250 66.1304 1.9250 3.8500 66.1304 -0.0000 1.9250 66.1304 1.9250 0.0000 66.1304 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 5.7750 1.9250 64.2024 5.7750 3.8500 66.1304 3.8500 1.9250 66.1304 5.7750 0.0000 66.1304 7.7000 1.9250 66.1304 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9250 5.7750 64.2024 3.8500 5.7750 66.1304 -0.0000 5.7750 66.1304 1.9250 3.8500 66.1304 1.9250 7.7000 66.1304 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7750 5.7750 64.2024 3.8500 5.7750 66.1304 7.7000 5.7750 66.1304 5.7750 7.7000 66.1304 5.7750 3.8500 66.1304 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 5.7750 5.7750 32.1976 3.8500 5.7750 30.2696 5.7750 7.7000 30.2696 5.7750 3.8500 30.2696 7.7000 5.7750 30.2696 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 5.7750 1.9250 32.1976 5.7750 3.8500 30.2696 7.7000 1.9250 30.2696 5.7750 0.0000 30.2696 3.8500 1.9250 30.2696 5 4 1 2 3 4 3 2 0 3 3 1 0 2 3 0 1 4 3 3 0 4 1.9250 1.9250 32.1976 1.9250 0.0000 30.2696 -0.0000 1.9250 30.2696 3.8500 1.9250 30.2696 1.9250 3.8500 30.2696 5 4 1 2 4 3 3 0 1 3 3 1 0 2 3 2 0 4 3 0 3 4 1.9250 5.7750 32.1976 1.9250 7.7000 30.2696 1.9250 3.8500 30.2696 -0.0000 5.7750 30.2696 3.8500 5.7750 30.2696 5 4 1 4 2 3 3 2 0 3 3 0 1 3 3 1 0 4 3 0 2 4 -0.0000 5.7750 24.1000 1.9250 3.8500 24.1000 3.8500 5.7750 24.1000 1.9250 7.7000 24.1000 1 4 0 1 2 3 -0.0000 1.9250 24.1000 1.9250 -0.0000 24.1000 3.8500 1.9250 24.1000 1.9250 3.8500 24.1000 1 4 0 1 2 3 -0.0000 1.9250 27.1848 1.9250 -0.0000 27.1848 3.8500 1.9250 27.1848 1.9250 3.8500 27.1848 1 4 0 1 2 3 -0.0000 5.7750 27.1848 1.9250 3.8500 27.1848 3.8500 5.7750 27.1848 1.9250 7.7000 27.1848 1 4 0 1 2 3 3.8500 1.9250 27.1848 5.7750 0.0000 27.1848 7.7000 1.9250 27.1848 5.7750 3.8500 27.1848 1 4 0 1 2 3 5.7750 3.8500 24.1000 7.7000 1.9250 24.1000 5.7750 -0.0000 24.1000 3.8500 1.9250 24.1000 1 4 0 1 2 3 3.8500 5.7750 27.1848 5.7750 3.8500 27.1848 7.7000 5.7750 27.1848 5.7750 7.7000 27.1848 1 4 0 1 2 3 7.7000 5.7750 24.1000 5.7750 7.7000 24.1000 3.8500 5.7750 24.1000 5.7750 3.8500 24.1000 1 4 0 1 2 3 1.9250 3.8500 45.1152 3.8500 1.9250 45.1152 5.7750 3.8500 45.1152 3.8500 5.7750 45.1152 1 4 0 1 2 3 5.7750 3.8500 51.2848 3.8500 1.9250 51.2848 1.9250 3.8500 51.2848 3.8500 5.7750 51.2848 1 4 0 1 2 3 5.7750 3.8500 48.2000 3.8500 1.9250 48.2000 1.9250 3.8500 48.2000 3.8500 5.7750 48.2000 1 4 0 1 2 3 3.8500 1.9250 69.2152 1.9250 0.0000 69.2152 -0.0000 1.9250 69.2152 1.9250 3.8500 69.2152 1 4 0 1 2 3 3.8500 1.9250 72.3000 1.9250 3.8500 72.3000 -0.0000 1.9250 72.3000 1.9250 0.0000 72.3000 1 4 0 1 2 3 1.9250 7.7000 69.2152 -0.0000 5.7750 69.2152 1.9250 3.8500 69.2152 3.8500 5.7750 69.2152 1 4 0 1 2 3 1.9250 7.7000 72.3000 3.8500 5.7750 72.3000 1.9250 3.8500 72.3000 -0.0000 5.7750 72.3000 1 4 0 1 2 3 5.7750 0.0000 69.2152 7.7000 1.9250 69.2152 5.7750 3.8500 69.2152 3.8500 1.9250 69.2152 1 4 0 1 2 3 5.7750 3.8500 69.2152 7.7000 5.7750 69.2152 5.7750 7.7000 69.2152 3.8500 5.7750 69.2152 1 4 0 1 2 3 7.7000 5.7750 72.3000 5.7750 3.8500 72.3000 3.8500 5.7750 72.3000 5.7750 7.7000 72.3000 1 4 0 1 2 3 5.7750 3.8500 72.3000 7.7000 1.9250 72.3000 5.7750 0.0000 72.3000 3.8500 1.9250 72.3000 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/superconductors/s26_BaCuO2.txt000066400000000000000000000011351433127522700220750ustar00rootroot00000000000000Superconductor (Tc = 90K): (Ba,Sr)CuO2 Structure: 0 2 "oo -1" oo Space group: 123 Lattice parameters: 3.93 3.47 Wyckoff positions: Ba,Sr 1d Cu 1a O 2f 1. with Cell (s26a.xml): Bond: Color 0.5,0.5,0.5, Scale 0.4 2. with Polytopes (s26b.xml): Cell Change XYZ: 0.5, 0.5, 0.5 Cells: 2 x 2 x 2 Neighbours: O Number: 4 References: H. Shaked, P.M. Keane, J.C. Rodriguez, F.F. Owen, R.L. Hitterman, J.D. Jorgensen, Crystal structures of the High-Tc Superconducting Copper-Oxides, Physica C, Elsevier Science, Amsterdam, 1994 M. Takano, M. Azuma, Z. Hiroi, Y. Bando, and Y. Takeda, Physica C 176 441 (1991) gamgi-0.17.5/dat/cell/superconductors/s26a_BaCuO2.xml000066400000000000000000000115741433127522700222270ustar00rootroot00000000000000 gamgi-0.17.5/dat/cell/superconductors/s26b_BaCuO2.xml000066400000000000000000000237671433127522700222370ustar00rootroot00000000000000 3.9300 1.9650 1.7350 1.9650 0.0000 1.7350 0.0000 1.9650 1.7350 1.9650 3.9300 1.7350 1 4 0 1 2 3 3.9300 5.8950 1.7350 1.9650 3.9300 1.7350 -0.0000 5.8950 1.7350 1.9650 7.8600 1.7350 1 4 0 1 2 3 3.9300 5.8950 5.2050 1.9650 3.9300 5.2050 -0.0000 5.8950 5.2050 1.9650 7.8600 5.2050 1 4 0 1 2 3 5.8950 7.8600 1.7350 3.9300 5.8950 1.7350 5.8950 3.9300 1.7350 7.8600 5.8950 1.7350 1 4 0 1 2 3 1.9650 3.9300 5.2050 3.9300 1.9650 5.2050 1.9650 -0.0000 5.2050 -0.0000 1.9650 5.2050 1 4 0 1 2 3 7.8600 1.9650 1.7350 5.8950 3.9300 1.7350 3.9300 1.9650 1.7350 5.8950 0.0000 1.7350 1 4 0 1 2 3 7.8600 1.9650 5.2050 5.8950 0.0000 5.2050 3.9300 1.9650 5.2050 5.8950 3.9300 5.2050 1 4 0 1 2 3 5.8950 7.8600 5.2050 7.8600 5.8950 5.2050 5.8950 3.9300 5.2050 3.9300 5.8950 5.2050 1 4 0 1 2 3 gamgi-0.17.5/dat/cell/tetragonal.xml000066400000000000000000000035141433127522700172520ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/000077500000000000000000000000001433127522700151275ustar00rootroot00000000000000gamgi-0.17.5/dat/cluster/H2O.xml000066400000000000000000000007431433127522700162450ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/c476.xml000066400000000000000000000655041433127522700163460ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/c60.xml000066400000000000000000000100461433127522700162420ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/ccc111.xml000066400000000000000000000012321433127522700166220ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/ccc211.xml000066400000000000000000000017271433127522700166340ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/cfc111.xml000066400000000000000000000016701433127522700166330ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/cfc333.xml000066400000000000000000000233561433127522700166460ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/cs111.xml000066400000000000000000000011431433127522700165000ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/dna.xml000066400000000000000000001201371433127522700164170ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/hs.xml000066400000000000000000000017251433127522700162700ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/line3_a.xml000066400000000000000000000005021433127522700171600ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/line3_b.xml000066400000000000000000000005021433127522700171610ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/line8.xml000066400000000000000000000012301433127522700166640ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/pbc1.xml000066400000000000000000000003161433127522700164760ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/pbc4.xml000066400000000000000000000007551433127522700165100ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/pbc5.xml000066400000000000000000000006661433127522700165120ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/pbc6.xml000066400000000000000000000007571433127522700165140ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/pbc8.xml000066400000000000000000000011411433127522700165020ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/plane11_a.xml000066400000000000000000000005751433127522700174210ustar00rootroot00000000000000 gamgi-0.17.5/dat/cluster/plane11_b.xml000066400000000000000000000005761433127522700174230ustar00rootroot00000000000000 gamgi-0.17.5/dat/gamgi/000077500000000000000000000000001433127522700145325ustar00rootroot00000000000000gamgi-0.17.5/dat/gamgi/atom.xml000066400000000000000000000000771433127522700162200ustar00rootroot00000000000000 gamgi-0.17.5/dat/gamgi/document.xml000066400000000000000000000011121433127522700170650ustar00rootroot00000000000000 "> &inside0;"> ]> &inside1; &outside1; gamgi-0.17.5/dat/gamgi/document1.xml000066400000000000000000000004331433127522700171530ustar00rootroot00000000000000 &outside2; gamgi-0.17.5/dat/gamgi/document2.xml000066400000000000000000000003211433127522700171500ustar00rootroot00000000000000 gamgi-0.17.5/dat/group/000077500000000000000000000000001433127522700146025ustar00rootroot00000000000000gamgi-0.17.5/dat/group/group.xml000066400000000000000000000060121433127522700164570ustar00rootroot00000000000000 -1.7191 0.0105 -0.0000 -0.6289 3.0922 0.0000 4.1929 2.6101 0.0000 4.2138 0.3669 -0.0000 1.5304 -1.5828 -0.0000 1 5 0 1 2 3 4 gamgi-0.17.5/dat/help/000077500000000000000000000000001433127522700143765ustar00rootroot00000000000000gamgi-0.17.5/dat/help/config.xml000066400000000000000000000002461433127522700163670ustar00rootroot00000000000000 gamgi-0.17.5/dat/light/000077500000000000000000000000001433127522700145555ustar00rootroot00000000000000gamgi-0.17.5/dat/light/diffuse.xml000066400000000000000000000002371433127522700167260ustar00rootroot00000000000000 gamgi-0.17.5/dat/light/greenish.xml000066400000000000000000000004021433127522700170770ustar00rootroot00000000000000 gamgi-0.17.5/dat/light/grey.xml000066400000000000000000000004051433127522700162440ustar00rootroot00000000000000 gamgi-0.17.5/dat/light/halloween.xml000066400000000000000000000022451433127522700172600ustar00rootroot00000000000000 gamgi-0.17.5/dat/light/laser.xml000066400000000000000000000005571433127522700164140ustar00rootroot00000000000000 gamgi-0.17.5/dat/light/q10.xml000066400000000000000000000021201433127522700156730ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/000077500000000000000000000000001433127522700152535ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/all.xml000066400000000000000000000100041433127522700165400ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/000077500000000000000000000000001433127522700173625ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/aminoacids/README000066400000000000000000000010651433127522700202440ustar00rootroot00000000000000************** * Aminoacids * ************** The files in this directory describe the 20 aminoacids usually found in proteines. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) the Mathmol library of molecular structures, Scientific Visualization Center, New York University: http://www.nyu.edu/pages/mathmol/library/index.html Structural information was obtained from: 2) Luis S. Campos, Entender a Bioquímica, 3ª Edição, Escolar Editora (2002) gamgi-0.17.5/dat/molecule/aminoacids/alanine.xml000066400000000000000000000027061433127522700215200ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/arginine.xml000066400000000000000000000054271433127522700217100ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/asparagine.xml000066400000000000000000000035521433127522700222230ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/aspartic_acid.xml000066400000000000000000000034121433127522700226720ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/cysteine.xml000066400000000000000000000030551433127522700217320ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/glutamic_acid.xml000066400000000000000000000040771433127522700227010ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/glutamine.xml000066400000000000000000000042531433127522700220750ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/glycine.xml000066400000000000000000000022131433127522700215340ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/histidine.xml000066400000000000000000000043301433127522700220640ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/isoleucine.xml000066400000000000000000000045631433127522700222530ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/leucine.xml000066400000000000000000000045461433127522700215410ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/lysine.xml000066400000000000000000000052351433127522700214140ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/methionine.xml000066400000000000000000000042401433127522700222430ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/phenalalanine.xml000066400000000000000000000051151433127522700227050ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/proline.xml000066400000000000000000000036071433127522700215620ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/serine.xml000066400000000000000000000030541433127522700213730ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/threonine.xml000066400000000000000000000035501433127522700221020ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/tryptophan.xml000066400000000000000000000060361433127522700223210ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/tyrosine.xml000066400000000000000000000052651433127522700217700ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/aminoacids/valine.xml000066400000000000000000000040651433127522700213670ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/000077500000000000000000000000001433127522700177435ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/coordination/FeCH35Cp2.xml000066400000000000000000000124751433127522700217600ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/PCH32CH2C6H5.xml000066400000000000000000000066421433127522700221370ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/PCH32CH3.xml000066400000000000000000000063771433127522700215570ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/PCH33C6H23.xml000066400000000000000000000147531433127522700217250ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/PCH3C6H43.xml000066400000000000000000000112011433127522700216250ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/PCH3O2C6H33.xml000066400000000000000000000142321433127522700220340ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/PPh2CH2_cis.xml000066400000000000000000000126141433127522700223750ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/PPh2CH2_trans.xml000066400000000000000000000126171433127522700227510ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/Ptbutyl3.xml000066400000000000000000000102741433127522700222170ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/README000066400000000000000000000011671433127522700206300ustar00rootroot00000000000000**************** * Coordination * **************** The files in this directory describe common coordination compounds. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) Scot Wherland, Crystal Structure Data for Common Ions, Molecules, and Complexes Including Metalloproteins and their Metal Sites, Department of Chemistry, Washington State University: http://www.wsu.edu/~wherland/wwwlist01.htm Structural information was obtained from: 2) The Cambridge Crystallographic Data Centre: http://www.ccdc.cam.ac.uk/ gamgi-0.17.5/dat/molecule/coordination/TiAnCl3_f.xml000066400000000000000000000045771433127522700222040ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/TiAnCl3_m.xml000066400000000000000000000045721433127522700222060ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/VPyr3Cl3_m.xml000066400000000000000000000077771433127522700223500ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/WCO6.xml000066400000000000000000000027071433127522700212110ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/ZrCp3.xml000066400000000000000000000064031433127522700214310ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/tiron.xml000066400000000000000000000051001433127522700216140ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/coordination/vanadocene.xml000066400000000000000000000044011433127522700225670ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/000077500000000000000000000000001433127522700163775ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/drugs/README000066400000000000000000000011761433127522700172640ustar00rootroot00000000000000********* * Drugs * ********* The files in this directory describe common drugs. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) the Mathmol library of molecular structures, Scientific Visualization Center, New York University: http://www.nyu.edu/pages/mathmol/library/index.html 2) Richard Cornelius, Fei Liu and Jeff Frey, the Molecules website, Lebanon Valley College: http://www.molecules.org/ Structural information was obtained from: 3) Luis S. Campos, Entender a Bioquímica, 3ª Edição, Escolar Editora (2002) gamgi-0.17.5/dat/molecule/drugs/adrenaline.xml000066400000000000000000000055651433127522700212360ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/aspirin.xml000066400000000000000000000046061433127522700205740ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/azt.xml000066400000000000000000000071411433127522700177220ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/barbiturate.xml000066400000000000000000000073711433127522700214350ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/caffeine.xml000066400000000000000000000052501433127522700206630ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/cisplantin.xml000066400000000000000000000023531433127522700212700ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/codeine.xml000066400000000000000000000114121433127522700205260ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/heroine.xml000066400000000000000000000127501433127522700205570ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/ibuprofen.xml000066400000000000000000000071231433127522700211150ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/morphine.xml000066400000000000000000000107171433127522700207500ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/nicotine.xml000066400000000000000000000056301433127522700207350ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/streptomycin.xml000066400000000000000000000207531433127522700216700ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/taxol.xml000066400000000000000000000303401433127522700202500ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/thc.xml000066400000000000000000000133221433127522700177000ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/valium.xml000066400000000000000000000074051433127522700204240ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/drugs/zantac.xml000066400000000000000000000116721433127522700204100ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/000077500000000000000000000000001433127522700167275ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/flavors/README000066400000000000000000000006131433127522700176070ustar00rootroot00000000000000*********** * Flavors * *********** The files in this directory describe common flavors. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) Glactone's CD-ROM of PDB Files, Department of Chemistry, Georgia State University: http://chemistry.gsu.edu/cwcs/MM-CD/workshop02/readme.htm gamgi-0.17.5/dat/molecule/flavors/almonds1.xml000066400000000000000000000032421433127522700211700ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/almonds2.xml000066400000000000000000000007121433127522700211700ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/basil1.xml000066400000000000000000000061141433127522700206260ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/basil2.xml000066400000000000000000000044131433127522700206270ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/basil_cardamon.xml000066400000000000000000000061711433127522700224140ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/basil_cloves_roses.xml000066400000000000000000000052461433127522700233400ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/cardamom.xml000066400000000000000000000056451433127522700212460ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/cardamom_ginger.xml000066400000000000000000000061721433127522700225750ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/cardamon.xml000066400000000000000000000061331433127522700212400ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/cinnamon.xml000066400000000000000000000041321433127522700212530ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/cumin.xml000066400000000000000000000050751433127522700205730ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/garlic.xml000066400000000000000000000037231433127522700207170ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/ginger.xml000066400000000000000000000061551433127522700207330ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/ginger_lemon.xml000066400000000000000000000056111433127522700221210ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/mustard.xml000066400000000000000000000023741433127522700211360ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/peaches.xml000066400000000000000000000075001433127522700210630ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/peppermint1.xml000066400000000000000000000064441433127522700217250ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/peppermint2.xml000066400000000000000000000061421433127522700217210ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/roses1.xml000066400000000000000000000060761433127522700206760ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/roses2.xml000066400000000000000000000061211433127522700206660ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/roses3.xml000066400000000000000000000042541433127522700206740ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/sassafras.xml000066400000000000000000000047771433127522700214560ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/flavors/thyme.xml000066400000000000000000000054021433127522700206000ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/000077500000000000000000000000001433127522700174175ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/fullerenes/C100_D5d.xml000066400000000000000000000303111433127522700212360ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C180.xml000066400000000000000000000542521433127522700205640ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C20_C100.xml000066400000000000000000002145501433127522700211570ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C20_Ih.xml000066400000000000000000000050531433127522700211100ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C240.xml000066400000000000000000000732141433127522700205600ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C24_D6d.xml000066400000000000000000000060321433127522700211670ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C260.xml000066400000000000000000001002101433127522700205450ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C26_D3h.xml000066400000000000000000000064211433127522700211740ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C28_Td.xml000066400000000000000000000070061433127522700211270ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C30_D5h.xml000066400000000000000000000073761433127522700212030ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C320.xml000066400000000000000000001171441433127522700205600ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C32_D3d.xml000066400000000000000000000077661433127522700212020ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C34_C3v.xml000066400000000000000000000103611433127522700212060ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C36_D6h.xml000066400000000000000000000107441433127522700212030ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C38_D3h.xml000066400000000000000000000113321433127522700211740ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C40_D5d.xml000066400000000000000000000117221433127522700211660ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C42_D3.xml000066400000000000000000000123111433127522700210150ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C44_T.xml000066400000000000000000000126771433127522700207730ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C46_C3.xml000066400000000000000000000132641433127522700210300ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C48_D6d.xml000066400000000000000000000136561433127522700212070ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C500.xml000066400000000000000000001740411433127522700205570ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C50_D5h.xml000066400000000000000000000142431433127522700211740ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C52_T.xml000066400000000000000000000146331433127522700207640ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C540.xml000066400000000000000000002061241433127522700205610ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C60_Ih.xml000066400000000000000000000165671433127522700211300ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C60_cfc_atoms.xml000066400000000000000000010424051433127522700225150ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C60_cfc_polyhedra.xml000066400000000000000000001071541433127522700233630ustar00rootroot00000000000000 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 -0.9999 0.7485 -3.3283 0.3888 1.1760 -3.3318 -1.9435 1.4581 -2.5944 -1.0224 -0.7043 -3.3286 -1.5410 2.6272 -1.8311 -0.2124 3.0361 -1.8345 0.7737 2.2944 -2.6014 1.2244 -0.0126 -3.3343 -2.9523 0.7472 -1.8278 2.0116 2.2749 -1.8408 -2.3010 2.6388 -0.5929 0.3522 -1.1746 -3.3323 0.4160 3.4748 -0.6001 -1.9877 -1.3846 -2.5951 -3.1733 1.4770 -0.5910 -2.9740 -0.6427 -1.8282 1.7905 3.0043 -0.6038 2.4086 -0.0312 -2.6064 2.8110 1.1377 -1.8432 -1.6997 3.0587 0.5882 -0.3111 3.4859 0.5847 0.7020 -2.3049 -2.6024 -3.4066 0.7857 0.5922 -1.6221 -2.5658 -1.8323 -3.2179 -1.3654 -0.5916 2.3782 2.5650 0.5771 2.7743 -1.2126 -1.8438 -1.9435 2.3362 1.8249 3.4252 0.6787 -0.6090 0.3033 3.0270 1.8190 -0.3069 -3.0159 -1.8359 1.9397 -2.3244 -1.8418 -3.4295 -0.6669 0.5918 -2.7783 1.2248 1.8267 1.6183 2.5766 1.8154 -2.3825 -2.5540 -0.5942 3.2136 1.3765 0.5746 -0.7057 2.3165 2.5857 3.4024 -0.7740 -0.6093 -2.4131 0.0435 2.5896 -2.8156 -1.1255 1.8262 1.9837 1.3952 2.5783 0.3071 -3.4746 -0.6016 -0.3563 1.1863 3.3158 1.6956 -3.0473 -0.6053 2.9697 0.6534 1.8112 -1.7950 -2.9926 0.5868 -1.2290 0.0247 3.3177 3.1687 -1.4657 0.5738 1.0182 0.7154 3.3120 -2.0164 -2.2628 1.8237 -0.4206 -3.4632 0.5830 2.9476 -0.7364 1.8109 2.2965 -2.6274 0.5759 -0.3938 -1.1642 3.3150 0.9950 -0.7373 3.3114 -0.7789 -2.2825 2.5845 1.9385 -1.4471 2.5774 0.2073 -3.0244 1.8176 1.5360 -2.6158 1.8140 32 5 0 1 7 11 3 6 1 6 9 18 17 7 5 49 43 47 54 55 6 1 0 2 4 5 6 5 30 21 31 44 42 6 9 16 25 36 28 18 5 4 2 8 14 10 5 9 6 5 12 16 6 5 4 10 19 20 12 5 15 13 23 35 24 6 11 7 17 26 31 21 6 8 15 24 32 22 14 6 0 3 13 15 8 2 5 20 19 27 37 29 5 17 18 28 38 26 6 16 12 20 29 34 25 6 10 14 22 33 27 19 6 42 44 53 59 58 51 5 36 25 34 41 45 5 53 48 52 57 59 6 57 55 54 56 58 59 6 44 31 26 38 48 53 6 13 3 11 21 30 23 6 45 41 49 55 57 52 6 32 24 35 46 50 40 6 35 23 30 42 51 46 5 22 32 40 39 33 6 39 40 50 56 54 47 6 37 27 33 39 47 43 6 34 29 37 43 49 41 6 28 36 45 52 48 38 5 50 46 51 58 56 gamgi-0.17.5/dat/molecule/fullerenes/C70_D5h.xml000066400000000000000000000211131433127522700211700ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C720.xml000066400000000000000000002634341433127522700205700ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C72_D6d.xml000066400000000000000000000215021433127522700211710ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C74_D3h.xml000066400000000000000000000220721433127522700211770ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C76_Td.xml000066400000000000000000000224571433127522700211410ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C78_D3h.xml000066400000000000000000000230471433127522700212060ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C80_D5d.xml000066400000000000000000000234361433127522700211770ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C82_C3v.xml000066400000000000000000000240241433127522700212120ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C84_Td.xml000066400000000000000000000244141433127522700211330ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C86_D3.xml000066400000000000000000000250021433127522700210260ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C90_D5h.xml000066400000000000000000000257551433127522700212120ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C92_T.xml000066400000000000000000000263651433127522700207750ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C94_C3v.xml000066400000000000000000000267551433127522700212320ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C96_D6h.xml000066400000000000000000000273431433127522700212140ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/C98_D3.xml000066400000000000000000000277261433127522700210500ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/fullerenes/README000066400000000000000000000011521433127522700202760ustar00rootroot00000000000000************** * Fullerenes * ************** The files in this directory describe fullerenes, from C20 to C720. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) Mitsuho Yoshida, Fullerene Structure Library: http://www.cochem2.tutkie.tut.ac.jp/Fuller/fsl/fsl.html Structural information was obtained from: 2) Marc de Graef and Michael E. McHenry, Structure of Materials, an Introduction to Crystallography, Diffraction, and Symmetry, Cambridge University Press, 2007 http://som.web.cmu.edu/frames.html gamgi-0.17.5/dat/molecule/glasses/000077500000000000000000000000001433127522700167145ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/glasses/Nb2SiGe.xml000066400000000000000000000203261433127522700206320ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/glasses/NbSiGe.xml000066400000000000000000000145031433127522700205500ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/000077500000000000000000000000001433127522700177505ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/hydrocarbons/README000066400000000000000000000011061433127522700206260ustar00rootroot00000000000000****************** * Hidrocarbonets * ****************** The files in this directory describe common hydrocarbons. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) the Mathmol library of molecular structures, Scientific Visualization Center, New York University: http://www.nyu.edu/pages/mathmol/library/index.html Structural information was obtained from: 2) Pine S.H., Hendrickson J.B., Cram D.J., Hammond G.S., Organic Chemistry, McGraw-Hill, 4th Edition (1980) gamgi-0.17.5/dat/molecule/hydrocarbons/benzene.xml000066400000000000000000000027021433127522700221210ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/butadiene.xml000066400000000000000000000022331433127522700224320ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/butane.xml000066400000000000000000000030361433127522700217520ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/cyclohexane.xml000066400000000000000000000037361433127522700230050ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/dinitrobenzene.xml000066400000000000000000000035021433127522700235110ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/ethane.xml000066400000000000000000000016551433127522700217450ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/ethylene.xml000066400000000000000000000013611433127522700223100ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/graphite.xml000066400000000000000000000552151433127522700223050ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/heptane.xml000066400000000000000000000047061433127522700221250ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/hexane.xml000066400000000000000000000042201433127522700217400ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/methane.xml000066400000000000000000000012031433127522700221070ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/octane.xml000066400000000000000000000054061433127522700217500ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/pentane.xml000066400000000000000000000035241433127522700221300ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/propane.xml000066400000000000000000000023441433127522700221410ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/pyrene.xml000066400000000000000000000060141433127522700217750ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/hydrocarbons/tetrabutylammonium.xml000066400000000000000000000150411433127522700244350ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/lipids/000077500000000000000000000000001433127522700165375ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/lipids/README000066400000000000000000000010101433127522700174070ustar00rootroot00000000000000********** * Lipids * ********** The files in this directory describe common lipids. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) the Mathmol library of molecular structures, Scientific Visualization Center, New York University: http://www.nyu.edu/pages/mathmol/library/index.html Structural information was obtained from: 2) Luis S. Campos, Entender a Bioquímica, 3ª Edição, Escolar Editora (2002) gamgi-0.17.5/dat/molecule/lipids/arachidonic.xml000066400000000000000000000133141433127522700215270ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/lipids/dlpe.xml000066400000000000000000000255761433127522700202240ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/lipids/dmpg.xml000066400000000000000000000571451433127522700202240ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/lipids/dppc.xml000066400000000000000000000272671433127522700202250ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/lipids/linoleic.xml000066400000000000000000000127521433127522700210660ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/lipids/oleic.xml000066400000000000000000000132261433127522700203600ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/lipids/palmitic.xml000066400000000000000000000123431433127522700210660ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/lipids/stearic.xml000066400000000000000000000135401433127522700207160ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/000077500000000000000000000000001433127522700172515ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/nanotubes/1clustermn.xml000066400000000000000000005476651433127522700221170ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/README000066400000000000000000000017111433127522700201310ustar00rootroot00000000000000************* * Nanotubes * ************* The files in this directory describe achiral Armchair (n,n) and Zigzag (n,0) nanotubes. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** 1) Structural data: Young-Kyun Kwon, the Nanotube Site, Michigan State University: http://www.pa.msu.edu/~ykkwon/Nanotubes/coordinates.html TubeGen 3.4, J. T. Frey and D. J. Doren, University of Delaware, 2011 http://turin.nss.udel.edu/research/tubegenonline.html 2) Related links: http://www.pa.msu.edu/cmp/csc/nanotube.html http://en.wikipedia.org/wiki/CoNTub http://en.wikipedia.org/wiki/List_of_software_for_nanostructures_modeling http://jcrystal.com/steffenweber/gallery/NanoTubes/NanoTubes.html 3) Strip algebra: Melchor, S.; Khokhriakov, N.V.; Savinskii, S.S. (1999). "Geometry of Multi-Tube Carbon Clusters and Electronic Transmission in Nanotube Contacts". Molecular Engineering 8 (4): 315 - 344. gamgi-0.17.5/dat/molecule/nanotubes/armchair_10_10.xml000066400000000000000000000576421433127522700223770ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/armchair_2_2.xml000066400000000000000000000100061433127522700222200ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/armchair_5_5.xml000066400000000000000000000275411433127522700222420ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/armchair_6_6.xml000066400000000000000000000344001433127522700222340ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/armchair_7_7.xml000066400000000000000000000412501433127522700222370ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/armchair_8_8.xml000066400000000000000000000461201433127522700222420ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/armchair_9_9.xml000066400000000000000000000527701433127522700222540ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/chiral_10_5.xml000066400000000000000000001372331433127522700217720ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/chiral_10_5_long.xml000066400000000000000000002173561433127522700230160ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/chiral_10_5_multiple.xml000066400000000000000000003464261433127522700237130ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/chiral_6_5.xml000066400000000000000000001314541433127522700217160ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/chiral_7_5.xml000066400000000000000000001534311433127522700217160ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/chiral_8_5.xml000066400000000000000000000511401433127522700217110ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/chiral_9_5.xml000066400000000000000000002252621433127522700217220ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/nanotubes.xml000066400000000000000000005632411433127522700220040ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/zigzag_10_0.xml000066400000000000000000000275411433127522700220160ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/zigzag_11_0.xml000066400000000000000000000320551433127522700220130ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/zigzag_12_0.xml000066400000000000000000000344011433127522700220110ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/zigzag_13_0.xml000066400000000000000000000367251433127522700220250ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/zigzag_14_0.xml000066400000000000000000000412511433127522700220140ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/zigzag_15_0.xml000066400000000000000000000435751433127522700220300ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/zigzag_16_0.xml000066400000000000000000000461211433127522700220170ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/zigzag_17_0.xml000066400000000000000000000504451433127522700220240ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/zigzag_18_0.xml000066400000000000000000000527711433127522700220310ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nanotubes/zigzag_9_0.xml000066400000000000000000000252611433127522700217430ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/nucleotides/000077500000000000000000000000001433127522700175715ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/nucleotides/DNA.xml000066400000000000000000001201411433127522700207140ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/photosynthesis/000077500000000000000000000000001433127522700203565ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/photosynthesis/README000066400000000000000000000026661433127522700212500ustar00rootroot00000000000000****************** * Photosynthesis * ****************** The files in this directory describe molecules participating in photosynthesis. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) the Mathmol library of molecular structures, Scientific Visualization Center, New York University: http://www.nyu.edu/pages/mathmol/library/index.html 2) Glactone's CD-ROM of PDB Files, Department of Chemistry, Georgia State University: http://chemistry.gsu.edu/cwcs/MM-CD/workshop02/readme.htm Structural information was obtained from: 3) Luis S. Campos, Entender a Bioquímica, 3ª Edição, Escolar Editora (2002) 4) Gerard Kleywegt, Hetero-compound Information Centre, Department of Cell and Molecular Biology, Uppsala University: http://xray.bmc.uu.se/hicup/ 5) Helen M. Berman, John Westbrook, Zukang Feng, Gary Gilliland, T. N. Bhat, Helge Weissig, Ilya N. Shindyalov and Philip E. Bourne, the Protein Data Bank, Research Collaboratory for Structural Bioinformatics, Department of Chemistry, Rutgers University, USA, National Institute of Standards and Technology, USA, San Diego Supercomputer Center, University of California, San Diego, USA, Department of Pharmacology, University of California, San Diego, USA and The Burnham Institute, California, San Diego, USA: http://www.rcsb.org/pdb/ http://nar.oupjournals.org/cgi/content/full/28/1/235 gamgi-0.17.5/dat/molecule/photosynthesis/carotene_b.xml000066400000000000000000000242511433127522700232050ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/photosynthesis/chlorophyll_a.xml000066400000000000000000000356761433127522700237600ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/photosynthesis/cytochrome.xml000066400000000000000000000212131433127522700232530ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/photosynthesis/pheophytin.xml000066400000000000000000000365171433127522700233030ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/photosynthesis/prc.xml000066400000000000000000001546211433127522700216750ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/photosynthesis/quinone.xml000066400000000000000000000310471433127522700225630ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/polymers/000077500000000000000000000000001433127522700171255ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/polymers/pp.xml000066400000000000000000000106421433127522700202710ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/polymers/pvc.xml000066400000000000000000000062711433127522700204450ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/proteines/000077500000000000000000000000001433127522700172635ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/proteines/Protein.xml000066400000000000000000010124651433127522700214360ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/000077500000000000000000000000001433127522700172335ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/silicates/README000066400000000000000000000005541433127522700201170ustar00rootroot00000000000000************* * Silicates * ************* The files in this directory describe silicate clusters. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) Carlos Pereira, PhD thesis, The Royal Institution of Great Britain, University College London (1997) gamgi-0.17.5/dat/molecule/silicates/q10.xml000066400000000000000000000020241433127522700203540ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q21.xml000066400000000000000000000032021433127522700203550ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q21q12.xml000066400000000000000000000043701433127522700207100ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q22q13q11.xml000066400000000000000000000051401433127522700212310ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q22q14q13q11.xml000066400000000000000000000056631433127522700215710ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q22q21.xml000066400000000000000000000055631433127522700207160ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q23q21q12c.xml000066400000000000000000000063341433127522700214030ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q23q21q12t.xml000066400000000000000000000063201433127522700214170ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q31q13.xml000066400000000000000000000055531433127522700207160ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q31q13q12.xml000066400000000000000000000067511433127522700212430ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q32.xml000066400000000000000000000037361433127522700203730ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q32q13q11.xml000066400000000000000000000063121433127522700212340ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q32q21.xml000066400000000000000000000067331433127522700207170ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q32q23c.xml000066400000000000000000000056651433127522700210670ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q32q23e.xml000066400000000000000000000056671433127522700210730ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q33q12q11.xml000066400000000000000000000056701433127522700212420ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q41q14.xml000066400000000000000000000067321433127522700207200ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q42.xml000066400000000000000000000051241433127522700203650ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q42q14.xml000066400000000000000000000056741433127522700207250ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q52.xml000066400000000000000000000063131433127522700203670ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q62.xml000066400000000000000000000075001433127522700203670ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/q83.xml000066400000000000000000000077251433127522700204030ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/teos.xml000066400000000000000000000067311433127522700207360ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/silicates/tmos.xml000066400000000000000000000043601433127522700207420ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/000077500000000000000000000000001433127522700163635ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/small/CCl4.xml000066400000000000000000000012041433127522700176270ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/EtOH.xml000066400000000000000000000022661433127522700177120ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/H2O.xml000066400000000000000000000007451433127522700175030ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/H2O2.xml000066400000000000000000000010311433127522700175520ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/H2O_H2O.xml000066400000000000000000000014531433127522700201500ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/H2SO4.xml000066400000000000000000000015471433127522700177130ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/H3O.xml000066400000000000000000000011471433127522700175010ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/H3PO4.xml000066400000000000000000000016741433127522700177120ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/HCl.xml000066400000000000000000000005141433127522700175530ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/MeOH.xml000066400000000000000000000015261433127522700177010ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/NH3.xml000066400000000000000000000010331433127522700174720ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/O3.xml000066400000000000000000000006631433127522700173730ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/OH.xml000066400000000000000000000005541433127522700174170ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/small/README000066400000000000000000000014631433127522700172470ustar00rootroot00000000000000********* * Small * ********* The files in this directory describe small molecules. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) Richard Cornelius, Fei Liu and Jeff Frey, the Molecules website, Lebanon Valley College: http://www.molecules.org/ 2) Scot Wherland, Crystal Structure Data for Common Ions, Molecules, and Complexes Including Metalloproteins and their Metal Sites, Department of Chemistry, Washington State University: http://www.wsu.edu/~wherland/wwwlist01.htm 3) Carlos Pereira, PhD thesis, The Royal Institution of Great Britain, University College London (1997) Structural information was obtained from: 4) The Cambridge Crystallographic Data Centre: http://www.ccdc.cam.ac.uk/ gamgi-0.17.5/dat/molecule/small/S8.xml000066400000000000000000000017201433127522700173770ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/styles1.xml000066400000000000000000000167741433127522700174200ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/styles2.xml000066400000000000000000000366161433127522700174160ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/styles2_bw.xml000066400000000000000000000375461433127522700201110ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/000077500000000000000000000000001433127522700165575ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/sugars/README000066400000000000000000000012321433127522700174350ustar00rootroot00000000000000********** * Sugars * ********** The files in this directory describe common sugars. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) the Mathmol library of molecular structures, Scientific Visualization Center, New York University: http://www.nyu.edu/pages/mathmol/library/index.html 2) Glactone's CD-ROM of PDB Files, Department of Chemistry, Georgia State University: http://chemistry.gsu.edu/cwcs/MM-CD/workshop02/readme.htm Structural information was obtained from: 3) Luis S. Campos, Entender a Bioquímica, 3ª Edição, Escolar Editora (2002) gamgi-0.17.5/dat/molecule/sugars/amylopectin.xml000066400000000000000000000157061433127522700216360ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/amylose.xml000066400000000000000000000114061433127522700207540ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/cellobiose.xml000066400000000000000000000114231433127522700214220ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/cellulose.xml000066400000000000000000000156741433127522700213050ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/d_galactose.xml000066400000000000000000000051331433127522700215500ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/d_glucose.xml000066400000000000000000000051341433127522700212500ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/d_mannose.xml000066400000000000000000000051151433127522700212460ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/d_xylose.xml000066400000000000000000000042551433127522700211350ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/fructose.xml000066400000000000000000000051161433127522700211360ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/glycogen.xml000066400000000000000000000222731433127522700211160ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/l_glucose.xml000066400000000000000000000051301433127522700212540ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/lactose.xml000066400000000000000000000114141433127522700207340ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/maltose.xml000066400000000000000000000114141433127522700207460ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/sugars/sucrose.xml000066400000000000000000000114161433127522700207670ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/surfactants/000077500000000000000000000000001433127522700176105ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/surfactants/all.xml000066400000000000000000001117001433127522700211020ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/surfactants/c12e5.xml000066400000000000000000000315431433127522700211570ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/surfactants/ctab.xml000066400000000000000000000247251433127522700212550ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/surfactants/las.xml000066400000000000000000000222431433127522700211140ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/000077500000000000000000000000001433127522700171445ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/symmetry/.xml000066400000000000000000000004171433127522700177470ustar00rootroot00000000000000 6 0 0 06 0 0 21 1 0 12 0.995037 0.099504 11 -0.500000 -0.866025 12 -0.411346 -0.911479 11 -0.500000 0.866025 12 -0.583691 0.811976 1 gamgi-0.17.5/dat/molecule/symmetry/C0v.xml000066400000000000000000000001731433127522700203170ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C0v_C6.xml000066400000000000000000000006001433127522700206420ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C1.xml000066400000000000000000000003111433127522700201240ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C12.xml000066400000000000000000000032001433127522700202060ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C12h.xml000066400000000000000000000033021433127522700203610ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C12v.xml000066400000000000000000000015631433127522700204060ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C15h.xml000066400000000000000000000041101433127522700203620ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C2.xml000066400000000000000000000003631433127522700201340ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C24.xml000066400000000000000000000062301433127522700202170ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C24h.xml000066400000000000000000000063321433127522700203720ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C24v.xml000066400000000000000000000031771433127522700204140ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C25h.xml000066400000000000000000000065351433127522700204000ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C27h.xml000066400000000000000000000071411433127522700203740ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C2h.xml000066400000000000000000000003161433127522700203020ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C2v.xml000066400000000000000000000002411433127522700203150ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C3.xml000066400000000000000000000006071433127522700201360ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C30_Ih.xml000066400000000000000000000033441433127522700206370ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C30h.xml000066400000000000000000000077461433127522700204010ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C3h.xml000066400000000000000000000006561433127522700203120ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C3h_OC.xml000066400000000000000000000021271433127522700206660ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C3v.xml000066400000000000000000000003461433127522700203240ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C3v_SNC3H9.xml000066400000000000000000000015051433127522700213110ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C3v_SNO3.xml000066400000000000000000000005031433127522700211210ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C4.xml000066400000000000000000000006221433127522700201340ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C4h.xml000066400000000000000000000006711433127522700203100ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C4v.xml000066400000000000000000000003571433127522700203270ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C5.xml000066400000000000000000000010671433127522700201410ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C5h.xml000066400000000000000000000011361433127522700203060ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C5v.xml000066400000000000000000000004771433127522700203330ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C6.xml000066400000000000000000000012451433127522700201400ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C6h.xml000066400000000000000000000012001433127522700202770ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C6v.xml000066400000000000000000000005721433127522700203300ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C7.xml000066400000000000000000000014451433127522700201430ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C7h.xml000066400000000000000000000014001433127522700203020ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C7v.xml000066400000000000000000000006721433127522700203320ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C8.xml000066400000000000000000000016131433127522700201410ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C8h.xml000066400000000000000000000016611433127522700203140ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/C8v.xml000066400000000000000000000007531433127522700203330ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Ci.xml000066400000000000000000000004331433127522700202210ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Cs.xml000066400000000000000000000002401433127522700202270ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Cs_Cyclopropane.xml000066400000000000000000000010411433127522700227450ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D0h.xml000066400000000000000000000002411433127522700202760ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D10d.xml000066400000000000000000000024731433127522700203640ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D11d.xml000066400000000000000000000026751433127522700203710ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D12.xml000066400000000000000000000030771433127522700202230ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D12d.xml000066400000000000000000000030771433127522700203670ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D12h.xml000066400000000000000000000014631433127522700203700ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D13d.xml000066400000000000000000000033011433127522700203560ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D13h.xml000066400000000000000000000015641433127522700203730ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D14d.xml000066400000000000000000000035031433127522700203630ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D15d.xml000066400000000000000000000037051433127522700203700ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D15h.xml000066400000000000000000000017671433127522700204020ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D16d.xml000066400000000000000000000041071433127522700203660ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D16h.xml000066400000000000000000000020671433127522700203750ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D17d.xml000066400000000000000000000043111433127522700203640ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D18d.xml000066400000000000000000000045131433127522700203710ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D18h.xml000066400000000000000000000022711433127522700203740ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D19d.xml000066400000000000000000000047151433127522700203760ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D2.xml000066400000000000000000000003341433127522700201330ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D20d.xml000066400000000000000000000051171433127522700203630ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D21d.xml000066400000000000000000000053211433127522700203610ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D22d.xml000066400000000000000000000055231433127522700203660ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D23d.xml000066400000000000000000000057251433127522700203730ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D24.xml000066400000000000000000000061271433127522700202250ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D24d.xml000066400000000000000000000061271433127522700203710ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D24h.xml000066400000000000000000000030771433127522700203760ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D25d.xml000066400000000000000000000063321433127522700203700ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D26d.xml000066400000000000000000000065331433127522700203740ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D27d.xml000066400000000000000000000067351433127522700204010ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D27h.xml000066400000000000000000000034031433127522700203720ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D28d.xml000066400000000000000000000071371433127522700203770ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D29d.xml000066400000000000000000000073411433127522700203750ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D2d.xml000066400000000000000000000003151433127522700202760ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D2h.xml000066400000000000000000000003131433127522700203000ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D2h_C5.xml000066400000000000000000000005141433127522700206320ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D3.xml000066400000000000000000000005631433127522700201400ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D30d.xml000066400000000000000000000075431433127522700203710ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D30h.xml000066400000000000000000000037051433127522700203710ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D3d.xml000066400000000000000000000005321433127522700203000ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D3h.xml000066400000000000000000000003001433127522700202750ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D3h_C74.xml000066400000000000000000000103161433127522700207220ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D4.xml000066400000000000000000000007361433127522700201430ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D4d.xml000066400000000000000000000010351433127522700203000ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D4h.xml000066400000000000000000000004251433127522700203060ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D5.xml000066400000000000000000000011121433127522700201310ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D5d.xml000066400000000000000000000011121433127522700202750ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D5h.xml000066400000000000000000000005451433127522700203120ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D6.xml000066400000000000000000000012661433127522700201440ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D6d.xml000066400000000000000000000012651433127522700203070ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D6h.xml000066400000000000000000000005241433127522700203100ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D7.xml000066400000000000000000000014431433127522700201420ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D7d.xml000066400000000000000000000014421433127522700203050ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D7h.xml000066400000000000000000000006241433127522700203120ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D8.xml000066400000000000000000000016161433127522700201450ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D8d.xml000066400000000000000000000016151433127522700203100ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D8h.xml000066400000000000000000000010211433127522700203030ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/D9d.xml000066400000000000000000000022711433127522700203100ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/I.xml000066400000000000000000000071331433127522700200620ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Ih.xml000066400000000000000000000014011433127522700202220ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Ih_C12.xml000066400000000000000000000013331433127522700206330ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Ih_C20.xml000066400000000000000000000022171433127522700206340ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Kh.xml000066400000000000000000000001241433127522700202250ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/O.xml000066400000000000000000000025111433127522700200630ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Oh.xml000066400000000000000000000005131433127522700202330ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Oh_Cubane.xml000066400000000000000000000007761433127522700215230ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/README000066400000000000000000000016601433127522700200270ustar00rootroot00000000000000************ * Symmetry * ************ The files in this directory exemplify all the chemical point groups of symmetry with n <= 8, where n is the main rotation axis. They were prepared for Gamgi, by Carlos Pereira: http://www.gamgi.org/ **************** * Bibliography * **************** Structural data was obtained from: 1) Serguei Patchkovskii, to test the program Symmetry: http://www.cobalt.chem.ucalgary.ca/ps/symmetry/ 2) Tullio Pilati and Alessandra Forni, to test the program Symmol: http://ccp14.minerals.csiro.au/ccp/web-mirrors/symmol/~pila/ 3) P.Seiler, J.D.Dunitz (1982) Acta Crystallogr., B38, 1741, and then included with Symmol 4) Rudolf Hundt - Bonn, and then included with Symmol Structural information was obtained from: 5) Burns G., Glazer A. M., Space Groups for Solid State Scientists, Academic Press (1990) 6) Folhas de Química-Física Molecular, Alcácer L., Calado J., AEIST - secção de folhas, IST, (1978) gamgi-0.17.5/dat/molecule/symmetry/S10.xml000066400000000000000000000024731433127522700202370ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S12.xml000066400000000000000000000030771433127522700202420ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S14.xml000066400000000000000000000035031433127522700202360ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S16.xml000066400000000000000000000041071433127522700202410ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S18.xml000066400000000000000000000045131433127522700202440ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S20.xml000066400000000000000000000051171433127522700202360ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S22.xml000066400000000000000000000055231433127522700202410ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S24.xml000066400000000000000000000061271433127522700202440ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S30.xml000066400000000000000000000075431433127522700202440ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S4.xml000066400000000000000000000005641433127522700201610ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S6.xml000066400000000000000000000012131433127522700201530ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/S8.xml000066400000000000000000000015451433127522700201650ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T.xml000066400000000000000000000011631433127522700200720ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.01_Ih_C180.xml000066400000000000000000000542521433127522700215130ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.1_D5d_Ferrocene.xml000066400000000000000000000022551433127522700230000ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.1_D5h_C50.xml000066400000000000000000000055521433127522700214260ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.1_Td_Adamantane.xml000066400000000000000000000030071433127522700230500ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.2_C2v_Fluorophenyl.xml000066400000000000000000000013011433127522700235640ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.2_C3v_NS_CH3_3.xml000066400000000000000000000015071433127522700223060ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.2_D6h_Benzene.xml000066400000000000000000000013071433127522700224610ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.2_I_C260.xml000066400000000000000000000352311433127522700212570ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.2_Ih_C60.xml000066400000000000000000000100661433127522700213440ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.4_C3h_Ir6P3.xml000066400000000000000000000010731433127522700217340ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.5_D3d_Cyclohexane.xml000066400000000000000000000037341433127522700233370ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.5_S4_PtAuClSPC.xml000066400000000000000000000017761433127522700224530ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/T0.9_Oh_NiOC.xml000066400000000000000000000143111433127522700216160ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Td.xml000066400000000000000000000004171433127522700202370ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Td_C28.xml000066400000000000000000000031711433127522700206530ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Td_C476.xml000066400000000000000000000655221433127522700207520ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/symmetry/Th.xml000066400000000000000000000025121433127522700202410ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/zeolites/000077500000000000000000000000001433127522700171115ustar00rootroot00000000000000gamgi-0.17.5/dat/molecule/zeolites/Zeolite1.xml000066400000000000000000000266261433127522700213430ustar00rootroot00000000000000 gamgi-0.17.5/dat/molecule/zeolites/Zeolite2.xml000066400000000000000000000213161433127522700213330ustar00rootroot00000000000000 gamgi-0.17.5/dat/orbital/000077500000000000000000000000001433127522700151025ustar00rootroot00000000000000gamgi-0.17.5/dat/orbital/6s_a.xml000066400000000000000000000010661433127522700164570ustar00rootroot00000000000000 gamgi-0.17.5/dat/orbital/6s_b.xml000066400000000000000000000010611433127522700164530ustar00rootroot00000000000000 gamgi-0.17.5/dat/orbital/screen_3d_all.xml000066400000000000000000000035211433127522700203220ustar00rootroot00000000000000 gamgi-0.17.5/dat/orbital/screen_6gz4_6s.xml000066400000000000000000000022041433127522700203630ustar00rootroot00000000000000 gamgi-0.17.5/dat/orbital/screen_6px.xml000066400000000000000000000012431433127522700177000ustar00rootroot00000000000000 gamgi-0.17.5/dat/plane/000077500000000000000000000000001433127522700145455ustar00rootroot00000000000000gamgi-0.17.5/dat/plane/plane_cP001.xml000066400000000000000000000073521433127522700172400ustar00rootroot00000000000000 gamgi-0.17.5/dat/plane/plane_cP110.xml000066400000000000000000000074201433127522700172350ustar00rootroot00000000000000 gamgi-0.17.5/dat/plane/plane_direction_cP001.xml000066400000000000000000000075251433127522700213020ustar00rootroot00000000000000 gamgi-0.17.5/dat/plane/plane_direction_hP001.xml000066400000000000000000000075431433127522700213070ustar00rootroot00000000000000 gamgi-0.17.5/dat/plane/plane_direction_hR003.xml000066400000000000000000000045211433127522700213040ustar00rootroot00000000000000 gamgi-0.17.5/dat/plane/plane_hP001.xml000066400000000000000000000073701433127522700172450ustar00rootroot00000000000000 gamgi-0.17.5/dat/plane/screen_calchopirite_barbiturate.xml000066400000000000000000000267161433127522700236740ustar00rootroot00000000000000 0.0000 5.2890 10.4230 5.2890 0.0000 10.4230 5.2890 0.0000 0.0000 0.0000 5.2890 0.0000 1 4 0 1 2 3 -0.7272 -3.3616 -1.3783 -1.2974 -3.4604 -0.6036 -2.9491 -3.5088 1.2936 -5.0025 -2.2798 1.7719 -4.7398 -1.0991 -0.2405 -3.9616 -0.2819 -2.2930 1 6 0 1 2 3 4 5 gamgi-0.17.5/dat/plane/screen_direction_plane_ranges.xml000066400000000000000000000320131433127522700233230ustar00rootroot00000000000000 2.5000 0.8660 3.2666 2.5000 0.8660 0.0000 -0.5000 6.0622 0.0000 -0.5000 6.0622 3.2666 1 4 0 1 2 3 3.0000 1.7321 0.0000 -0.5000 7.7942 0.0000 -0.5000 7.7942 3.2666 3.0000 1.7321 3.2666 1 4 0 1 2 3 0.0000 8.6603 3.2666 4.0000 1.7321 3.2666 4.0000 1.7321 0.0000 0.0000 8.6603 0.0000 1 4 0 1 2 3 1.0000 8.6603 3.2666 4.5000 2.5981 3.2666 4.5000 2.5981 0.0000 1.0000 8.6603 0.0000 1 4 0 1 2 3 5.5000 2.5981 3.2666 5.5000 2.5981 0.0000 1.5000 9.5263 0.0000 1.5000 9.5263 3.2666 1 4 0 1 2 3 6.0000 3.4641 3.2666 6.0000 3.4641 0.0000 2.5000 9.5263 0.0000 2.5000 9.5263 3.2666 1 4 0 1 2 3 3.0000 10.3923 0.0000 3.0000 10.3923 3.2666 7.0000 3.4641 3.2666 7.0000 3.4641 0.0000 1 4 0 1 2 3 gamgi-0.17.5/dat/plane/screen_planes_directions.xml000066400000000000000000000452451433127522700223450ustar00rootroot00000000000000 2.5000 4.3301 1.4700 3.0000 3.4641 1.3066 3.0000 1.7321 0.8167 2.5000 0.8660 0.4900 1.0000 0.0000 0.0000 -0.5000 0.8660 0.0000 -0.5000 2.5981 0.4900 0.0000 3.4641 0.8166 1.5000 4.3301 1.3066 1 9 0 1 2 3 4 5 6 7 8 3.1000 -4.5000 3.4025 3.1000 -4.5325 2.5000 3.1000 -4.5325 1.5000 3.1000 -4.5000 0.5975 3.1000 -4.4675 0.5000 3.1000 1.5325 -1.5000 3.1000 4.5000 -1.5975 3.1000 7.5000 -1.5975 3.1000 10.4675 -1.5000 3.1000 10.5000 -1.4025 3.1000 10.5325 -0.5000 3.1000 10.5325 0.5000 3.1000 10.5000 1.4025 3.1000 10.4675 1.5000 3.1000 4.4675 3.5000 3.1000 1.5000 3.5975 3.1000 -1.5000 3.5975 3.1000 -4.4675 3.5000 1 18 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 -5.4666 8.2903 1.5000 -5.3834 8.2097 2.0000 0.8166 2.2097 4.0000 2.2834 0.7903 4.0000 8.4834 -5.2097 2.0000 8.5666 -5.2903 1.5000 8.4834 -5.2097 1.0000 2.2834 0.7903 -1.0000 0.8166 2.2097 -1.0000 -5.3834 8.2097 1.0000 1 10 0 1 2 3 4 5 6 7 8 9 -6.2000 4.5293 1.4903 -6.2000 4.4707 1.5097 -4.7676 3.0000 1.5379 4.5324 -6.0000 1.5379 4.7676 -6.0000 1.4621 5.3834 -5.2097 1.0000 5.3834 3.7903 -2.0000 3.9166 5.2097 -2.0000 -5.3834 5.2097 1.0000 1 9 0 1 2 3 4 5 6 7 8 3.1000 0.0000 -3.9230 3.1000 0.2463 -3.9153 3.1000 0.4917 -3.8921 3.1000 0.7351 -3.8535 3.1000 0.9756 -3.7998 3.1000 1.2123 -3.7310 3.1000 1.4442 -3.6475 3.1000 1.6703 -3.5496 3.1000 1.8899 -3.4378 3.1000 2.1021 -3.3123 3.1000 2.3059 -3.1738 3.1000 2.5006 -3.0227 3.1000 2.6855 -2.8598 3.1000 2.8598 -2.6855 3.1000 3.0227 -2.5006 3.1000 3.1738 -2.3059 3.1000 3.3123 -2.1021 3.1000 3.4378 -1.8899 3.1000 3.5496 -1.6703 3.1000 3.6475 -1.4442 3.1000 3.7310 -1.2123 3.1000 3.7998 -0.9756 3.1000 3.8535 -0.7351 3.1000 3.8921 -0.4917 3.1000 3.9153 -0.2463 3.1000 3.9230 0.0000 3.1000 3.9153 0.2463 3.1000 3.8921 0.4917 3.1000 3.8535 0.7351 3.1000 3.7998 0.9756 3.1000 3.7310 1.2123 3.1000 3.6475 1.4442 3.1000 3.5496 1.6703 3.1000 3.4378 1.8899 3.1000 3.3123 2.1021 3.1000 3.1738 2.3059 3.1000 3.0227 2.5006 3.1000 2.8598 2.6855 3.1000 2.6855 2.8598 3.1000 2.5006 3.0227 3.1000 2.3059 3.1738 3.1000 2.1021 3.3123 3.1000 1.8899 3.4378 3.1000 1.6703 3.5496 3.1000 1.4442 3.6475 3.1000 1.2123 3.7310 3.1000 0.9756 3.7998 3.1000 0.7351 3.8535 3.1000 0.4917 3.8921 3.1000 0.2463 3.9153 3.1000 -0.0000 3.9230 3.1000 -0.2463 3.9153 3.1000 -0.4917 3.8921 3.1000 -0.7351 3.8535 3.1000 -0.9756 3.7998 3.1000 -1.2123 3.7310 3.1000 -1.4442 3.6475 3.1000 -1.6703 3.5496 3.1000 -1.8899 3.4378 3.1000 -2.1021 3.3123 3.1000 -2.3059 3.1738 3.1000 -2.5006 3.0227 3.1000 -2.6855 2.8598 3.1000 -2.8598 2.6855 3.1000 -3.0227 2.5006 3.1000 -3.1738 2.3059 3.1000 -3.3123 2.1021 3.1000 -3.4378 1.8899 3.1000 -3.5496 1.6703 3.1000 -3.6475 1.4442 3.1000 -3.7310 1.2123 3.1000 -3.7998 0.9756 3.1000 -3.8535 0.7351 3.1000 -3.8921 0.4917 3.1000 -3.9153 0.2463 3.1000 -3.9230 0.0000 3.1000 -3.9153 -0.2463 3.1000 -3.8921 -0.4917 3.1000 -3.8535 -0.7351 3.1000 -3.7998 -0.9756 3.1000 -3.7310 -1.2123 3.1000 -3.6475 -1.4442 3.1000 -3.5496 -1.6703 3.1000 -3.4378 -1.8899 3.1000 -3.3123 -2.1021 3.1000 -3.1738 -2.3059 3.1000 -3.0227 -2.5006 3.1000 -2.8598 -2.6855 3.1000 -2.6855 -2.8598 3.1000 -2.5006 -3.0227 3.1000 -2.3059 -3.1738 3.1000 -2.1021 -3.3123 3.1000 -1.8899 -3.4378 3.1000 -1.6703 -3.5496 3.1000 -1.4442 -3.6475 3.1000 -1.2123 -3.7310 3.1000 -0.9756 -3.7998 3.1000 -0.7351 -3.8535 3.1000 -0.4917 -3.8921 3.1000 -0.2463 -3.9153 1 100 0 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 3.8288 -0.7053 -3.1373 3.6827 -0.5639 -3.3347 3.5279 -0.4141 -3.5189 3.3651 -0.2566 -3.6892 3.1950 -0.0919 -3.8450 3.0181 0.0792 -3.9856 2.8353 0.2562 -4.1104 2.6472 0.4382 -4.2190 2.4546 0.6246 -4.3110 2.2582 0.8147 -4.3860 2.0588 1.0077 -4.4437 1.8571 1.2028 -4.4838 1.6541 1.3992 -4.5062 1.4505 1.5963 -4.5109 1.2470 1.7932 -4.4977 1.0446 1.9891 -4.4668 0.8440 2.1833 -4.4183 0.6459 2.3749 -4.3523 0.4512 2.5634 -4.2691 0.2606 2.7478 -4.1691 0.0750 2.9275 -4.0527 -0.1051 3.1017 -3.9202 -0.2788 3.2698 -3.7723 -0.4455 3.4312 -3.6095 -0.6046 3.5851 -3.4325 -0.7553 3.7309 -3.2419 -0.8971 3.8682 -3.0385 -1.0295 3.9963 -2.8231 -1.1519 4.1147 -2.5966 -1.2638 4.2230 -2.3598 -1.3648 4.3208 -2.1137 -1.4546 4.4076 -1.8593 -1.5326 4.4832 -1.5975 -1.5987 4.5472 -1.3295 -1.6526 4.5993 -1.0562 -1.6940 4.6394 -0.7787 -1.7229 4.6673 -0.4981 -1.7390 4.6829 -0.2156 -1.7423 4.6861 0.0678 -1.7329 4.6770 0.3509 -1.7107 4.6555 0.6326 -1.6758 4.6217 0.9118 -1.6284 4.5758 1.1875 -1.5686 4.5180 1.4584 -1.4968 4.4485 1.7236 -1.4131 4.3675 1.9820 -1.3179 4.2754 2.2325 -1.2116 4.1725 2.4743 -1.0946 4.0593 2.7063 -0.9674 3.9362 2.9276 -0.8304 3.8036 3.1373 -0.6843 3.6622 3.3347 -0.5295 3.5124 3.5189 -0.3667 3.3549 3.6892 -0.1966 3.1902 3.8450 -0.0197 3.0191 3.9856 0.1631 2.8422 4.1104 0.3512 2.6601 4.2190 0.5438 2.4737 4.3110 0.7402 2.2836 4.3860 0.9396 2.0907 4.4437 1.1412 1.8956 4.4838 1.3443 1.6991 4.5062 1.5479 1.5020 4.5109 1.7513 1.3052 4.4977 1.9538 1.1092 4.4668 2.1544 0.9151 4.4183 2.3525 0.7234 4.3523 2.5472 0.5350 4.2691 2.7378 0.3506 4.1691 2.9234 0.1709 4.0527 3.1035 -0.0034 3.9202 3.2772 -0.1715 3.7723 3.4439 -0.3328 3.6095 3.6029 -0.4867 3.4325 3.7537 -0.6326 3.2419 3.8955 -0.7698 3.0385 4.0279 -0.8979 2.8231 4.1503 -1.0164 2.5966 4.2622 -1.1247 2.3598 4.3632 -1.2225 2.1137 4.4529 -1.3093 1.8593 4.5310 -1.3848 1.5975 4.5971 -1.4488 1.3295 4.6510 -1.5010 1.0562 4.6924 -1.5411 0.7787 4.7213 -1.5690 0.4981 4.7374 -1.5846 0.2156 4.7407 -1.5878 -0.0678 4.7313 -1.5786 -0.3509 4.7090 -1.5571 -0.6326 4.6742 -1.5234 -0.9118 4.6268 -1.4775 -1.1875 4.5670 -1.4197 -1.4584 4.4952 -1.3501 -1.7236 4.4115 -1.2692 -1.9820 4.3163 -1.1771 -2.2325 4.2100 -1.0742 -2.4743 4.0930 -0.9610 -2.7063 3.9658 -0.8379 -2.9276 1 100 0 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 4.9617 0.0462 -0.6159 4.9381 0.3406 -0.7065 4.8961 0.6347 -0.7909 4.8358 0.9274 -0.8691 4.7574 1.2175 -0.9405 4.6614 1.5039 -1.0050 4.5479 1.7855 -1.0622 4.4176 2.0611 -1.1121 4.2709 2.3296 -1.1542 4.1084 2.5900 -1.1886 3.9307 2.8413 -1.2151 3.7386 3.0825 -1.2335 3.5327 3.3126 -1.2438 3.3140 3.5306 -1.2459 3.0832 3.7359 -1.2399 2.8413 3.9274 -1.2257 2.5892 4.1046 -1.2034 2.3280 4.2666 -1.1732 2.0586 4.4129 -1.1350 1.7821 4.5429 -1.0892 1.4997 4.6560 -1.0358 1.2124 4.7518 -0.9750 0.9214 4.8299 -0.9072 0.6277 4.8901 -0.8325 0.3327 4.9320 -0.7513 0.0373 4.9556 -0.6639 -0.2571 4.9607 -0.5706 -0.5495 4.9473 -0.4718 -0.8386 4.9154 -0.3679 -1.1234 4.8653 -0.2594 -1.4027 4.7970 -0.1465 -1.6755 4.7108 -0.0298 -1.9405 4.6072 0.0902 -2.1969 4.4865 0.2132 -2.4435 4.3491 0.3385 -2.6795 4.1956 0.4658 -2.9038 4.0267 0.5945 -3.1156 3.8430 0.7241 -3.3141 3.6452 0.8540 -3.4985 3.4341 0.9839 -3.6680 3.2105 1.1131 -3.8219 2.9753 1.2411 -3.9598 2.7295 1.3675 -4.0810 2.4739 1.4918 -4.1850 2.2097 1.6134 -4.2714 1.9379 1.7319 -4.3400 1.6595 1.8468 -4.3903 1.3756 1.9577 -4.4223 1.0874 2.0641 -4.4358 0.7959 2.1656 -4.4308 0.5024 2.2618 -4.4072 0.2081 2.3523 -4.3652 -0.0861 2.4368 -4.3048 -0.3788 2.5149 -4.2265 -0.6689 2.5864 -4.1304 -0.9553 2.6508 -4.0170 -1.2369 2.7081 -3.8867 -1.5125 2.7579 -3.7400 -1.7810 2.8001 -3.5775 -2.0414 2.8345 -3.3998 -2.2927 2.8609 -3.2076 -2.5339 2.8793 -3.0018 -2.7639 2.8896 -2.7830 -2.9820 2.8918 -2.5523 -3.1873 2.8857 -2.3104 -3.3788 2.8716 -2.0583 -3.5560 2.8493 -1.7971 -3.7180 2.8190 -1.5277 -3.8643 2.7809 -1.2512 -3.9942 2.7350 -0.9688 -4.1074 2.6816 -0.6815 -4.2032 2.6209 -0.3904 -4.2813 2.5530 -0.0968 -4.3415 2.4784 0.1983 -4.3834 2.3972 0.4936 -4.4070 2.3098 0.7880 -4.4121 2.2165 1.0804 -4.3986 2.1177 1.3695 -4.3668 2.0138 1.6543 -4.3166 1.9052 1.9337 -4.2483 1.7924 2.2064 -4.1622 1.6757 2.4714 -4.0586 1.5556 2.7278 -3.9378 1.4327 2.9745 -3.8005 1.3073 3.2104 -3.6470 1.1801 3.4347 -3.4781 1.0514 3.6466 -3.2944 0.9218 3.8450 -3.0965 0.7918 4.0294 -2.8854 0.6620 4.1989 -2.6618 0.5328 4.3529 -2.4267 0.4047 4.4907 -2.1808 0.2783 4.6119 -1.9253 0.1541 4.7159 -1.6611 0.0324 4.8023 -1.3893 -0.0861 4.8709 -1.1108 -0.2010 4.9213 -0.8270 -0.3118 4.9533 -0.5387 -0.4182 4.9668 -0.2473 -0.5197 1 100 0 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 1.0000 0.0000 0.0000 1.0000 1.0000 0.0000 1.0000 1.0000 1.0000 1.0000 0.0000 1.0000 1 4 0 1 2 3 0.0000 1.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 1.0000 1.0000 0.0000 0.0000 1 4 0 1 2 3 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 0.0000 1.0000 0.0000 1 3 0 1 2 gamgi-0.17.5/dat/text/000077500000000000000000000000001433127522700144325ustar00rootroot00000000000000gamgi-0.17.5/dat/text/fonts.xml000066400000000000000000000026611433127522700163120ustar00rootroot00000000000000 gamgi-0.17.5/dat/text/keyboard.xml000066400000000000000000000013661433127522700167620ustar00rootroot00000000000000 gamgi-0.17.5/dat/text/wired.xml000066400000000000000000000046031433127522700162710ustar00rootroot00000000000000 gamgi-0.17.5/doc/000077500000000000000000000000001433127522700134435ustar00rootroot00000000000000gamgi-0.17.5/doc/LICENSE000066400000000000000000001045131433127522700144540ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gamgi-0.17.5/doc/bibliography/000077500000000000000000000000001433127522700161165ustar00rootroot00000000000000gamgi-0.17.5/doc/bibliography/scientific.html000066400000000000000000000046171433127522700211340ustar00rootroot00000000000000 GAMGI Bibliography: Scientific
Bibliography Scientific
 

Crystalography:

  • Ed. Hahn Th., International Tables for Crystalography - Volume A - Space Group Symmetry, Kluwer (2002)
  • Burns G., Glazer A. M., Space Groups for Solid State Scientists, Academic Press (1990)
  • Ed. Hahn Th., Brief Teaching Edition of - International Tables for Crystalography - Volume A - Space Group Symmetry, Kluwer (1996)
  • Hammond C., The Basics of Crystallography and Diffraction, International Union of Crystallography, Oxford Science Publications (2001)
  • Ed. Giacovazzo C., Giacovazzo C., Monaco H. L., Viterbo D., Scordari F., Gilli G., Zanoti G., Catti M., Fundamentals of Crystallography and Diffraction, International Union of Crystallography, Oxford Science Publications (1992)

Atomic Structure

  • Y. Chiang, D. Birnie III and W. Kingery, Physical Ceramics: Principles for Ceramic Science and Engineering, The MIT series, John Wiley & Sons (1997)
  • C. Kittel, Introduction to Solid State Physics, John Wiley & Sons (1986)

Voronoi Algorithms

  • R. E. Moore and I. O. Angell, Voronoi Polygons and Polyhedra, J. of Computational Physics, 105, 301 (1993)
  • R. Sedgewick, Algorithms in C, 3rd Edition, (1998)
  • Cunha L.V., Desenho Tecnico, Calouste Gulbenkian Foundation, Lisboa, 4th Edition
  • A.M. Kraynik, D.A. Reinelt F. Swol, Structure of Random Monodisperse Foam, Physical Review E 67, 031403 (2003)

RCP algorithms

  • M. Bargiel and J. Moscinski, C-language program for the irregular close packing of hard spheres, Comp. Phys. Comm., 64, 183 (1991)
  • W. S. Jodrey and E. M. Tory, Computer simulation of close random packing of equal spheres, Phys. Rev. A, 32-4, 2347 (1985)
gamgi-0.17.5/doc/bibliography/technical.html000066400000000000000000000077041433127522700207460ustar00rootroot00000000000000 GAMGI Bibliography: Technical
Bibliography Scientific
 

Linux programming:

  • Petersen R., Linux Programmer's Reference, McGraw-Hill (1998)
  • Wall K., Watson M., Whitis M., Linux Programming Unleashed, SAMS (1999)
  • Mitchell M. Oldham J., Samuel A., Advanced Linux Programming, New Riders (2001)
  • Neveln B., Linux Assembly Language Programming, Prentice Hall (2000)

C programming:

  • Kernighan B. & Ritchie D., The C Programming Language, Prentice Hall (1988)
  • Perry J., Advanced C Programming, PWS Publishing Company (1998)
  • Linden P., Expert C Programming, Prentice Hall (1994)

Programming tools:

  • Stallman R., McGrath R., GNU Make, Free Software Foundation (1998)
  • Fogel K., Open Source Development with CVS, CoriolisOpen Press (1999)
  • Bailey E. C., Maximum RPM, SAMS Publishing (1997)

OpenGL programming:

  • Neider J., Davis T., Woo M., OpenGL Programming Guide, Addison-Wesley Publishing Company (1993)
  • Kilgard M., OpenGL Programming for the X Window System, Addison-Wesley Publishing Company (1996)
  • Ed. Shreiner D., OpenGL Reference Manual, Addison-Wesley Publishing Company (2000)
  • Hill F., Computer Graphics using OpenGL, Prentice Hall (2001)

Graphics programming:

  • Ed. Deloura M., Game Programming Gems, Charles River Media (2000)
  • Computer Graphics - A Programming Approach, McGraw-Hill (1987)
  • Rourke J., Computational Geometry in C, Cambridge University Press (1998)
  • Berg M., Kreveld M., Overmars M., Schwarzkopf O., Computational Geometry, Springer Verlag (2000)

Gtk Programming:

  • Harlow E., Developing Linux Applications with Gtk+ and Gdk+, New Riders (1999)
  • Pennington H., Gtk+/Gnome Application Development, New Riders (1999)

XML programming:

  • Arciniegas F., XML Developer's Guide, McGraw-Hill (2001)
  • Laurent S., XML Elements of Style, McGraw-Hill (2000)
  • Brown M. C., XML Processing with Perl, Python, and PHP, Sybex (2002)

Computer Algorithms:

  • Press W., Teukolsky S., Vetterling W., Flannery B., Numerical Recipes in C - The Art of Scientific Programming, Cambridge University Press (1992)
  • Horowitz E., Sahni S., Rajasekaran S., Computer Algorithms, Computer Science Press (1998)
  • Sedgewick R., Algorithms in C, Addison-Wesley (1999)

Programming Style:

  • Kernighan B., Plauger P., The Elements of Programming Style, McGraw-Hill (1978)
  • Kernighan B., Pike R., The Practice of Programming, Addison-Wesley (1999)

Designing Graphic User Interfaces:

  • Mullet K., Sano D., Designing Visual Interfaces, SunSoftPress - Prentice Hall (1995)

Perl programming:

  • Schwartz R., Phoenix T., Learning Perl, O'Reilly & Associates (2001)
  • Wall L., Programming Perl, O'Reilly & Associates (1996)

Python programming:

  • Lutz M., Ascher D., Learning Python, O'Reilly & Associates (2001)

CSS design:

  • Andrew R., The CSS Anthology, Sitepoint Pty. Ltd. (2004)
  • Wyke-Smith C., Stylin' with CSS, New Riders (2005)
  • Cederholm D., Bulletproof Web Design, New Riders (2006)
gamgi-0.17.5/doc/changelogs/000077500000000000000000000000001433127522700155555ustar00rootroot00000000000000gamgi-0.17.5/doc/changelogs/changelogs.html000077700000000000000000000000001433127522700237202changelogs17.htmlustar00rootroot00000000000000gamgi-0.17.5/doc/changelogs/changelogs07.html000066400000000000000000000412551433127522700207330ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.07
GAMGI 0.08
 
Finished and tested gtk_light_modify. This completes the create, modify and remove mechanisms for atoms, bonds, cells, lights, and layers, plus create, remove mechanims for windows and remove mechanims for molecules. gtk_select mechanisms are partly implemented for all GAMGI objects but need to be rewritten and extended after GTK2.0 comes out.

What is new:

  • gtk_light_modify fully implemented.
  • gtk_cell_modify improved.

What is next:

  • Add documentation.
  • Clean bugs.
  • Clean data.
  • Write gtk_cell_link.
  • Add XML support.
GAMGI 0.07.31
 
Lots of gtk changes. Next version should be GAMGI 0.08

What is new:

  • gtk_layer_modify fully implemented.
  • gtk_layer_create improved.
  • gtk_light_create rewritten.
  • Working on gtk_light_modify.

What is next:

  • Finish gtk_light_modify.c.
  • Add documentation.
  • Clean bugs.
GAMGI 0.07.30
 
Cleaning and documentation.

What is new:

  • Makefiles cleaned: files are not included in subsets anymore and are just listed in alphabetic order instead. Files on each directory are thus compiled in the same order as they appear when listed with the ls command.
  • Added documentation to phys_cell.c.
  • gtk_layer_remove updated, so layers can be selected and removed with a pop up menu, just like lights.
  • Cleaned and renamed gtk_layer_create, gtk_gamgi_reset, gtk_gamgi_exit, gtk_window_create and main_convert files.
  • Corrected a mistake on atom_modify.c
  • Removed a memory leak: GtkStyles were copied but not removed, gtk_style_unref (style) to the rescue.
  • Just started gtk_layer_modify.

What is next:

  • Finish light_modify.c.
  • Implement layer_modify.c.
  • Clean cell_modify.c a bit more.
  • Improve comments and other documentation in phys_cell*.c files.
GAMGI 0.07.29
 
changed gtk_remove_* functions to new style. cleaned and improved gtk_modify_* functions.

What is new:

  • gtk_atom_remove, gtk_bond_remove, gtk_molecule_remove, gtk_cell_remove, gtk_light_remove and gtk_layer_remove changed to new (global) style.
  • gtk_atom_modify and gtk_atom_create changed to conform to new (global) style.
  • gtk_atom_modify_press and gtk_bond_modify_press slightly improved.
  • Removed Nodes and Faces imcompatibility in WS mode, in both gtk_cell_create.c and gtk_cell_modify.c files.
  • gtk_cell_modify.c substantially improved, everything seems fine except gtk_atom_modify_ok, which needs more error test checking.
  • a critical bug concerning rhombus cells was removed from phys_cell.c
  • More work on gtk_light_modify.c, it is not finished though.
  • gtk_light_remove.c completed.

What is next:

  • Finish light_modify.c.
  • Clean cell_modify.c.
  • Improve comments and other documentation in gamgi_phys_cell* and gamgi_gtk_cell* files.
GAMGI 0.07.28
 
Euler angles and Hexagonal Conventional cells are done. Documentation and GTK stuff is all that is left to achieve version 0.08.

What is new:

  • reading and applying Euler angles is done. This was done for cells but applies for any other GAMGI object.
  • Hexagonal Conventional cells are done. This is a special case that must be handled differently.

What is next:

  • Remove Nodes and Faces imcompatibility in WS mode.
  • Finish cell_modify.c.
  • Finish light_modify.c.
  • Improve light_remove, molecule_remove, atom_remove, bond_remove, cell_remove.
  • Improve atom_modify.
  • Improve comments and other documentation in gamgi_phys_cell* files.
GAMGI 0.07.27
 
Important improvements in WS and other cells. GAMGI 0.08 is getting closer.

What is new:

  • Handling WS cells is completed, for all systems but Romboedric P, Monoclinic and Triclinic. This includes all the possible parameter permutations.
  • Handling cell orientation, using Euler angles, is completed, in what regards cell_create.c. Measuring Euler angles, in what regards cell_modify.c, is not done yet.
  • In FACES mode, the cell inside is now visible, after entering in.

What is next:

  • Measure Euler angles in cells.
  • Remove Nodes and Faces imcompatibility in WS mode.
  • Start Hexagonal conventional cell.
  • Finish cell_modify.c.
  • Finish light_modify.c.
  • Improve light_remove, molecule_remove, atom_remove, bond_remove, cell_remove.
  • Improve atom_modify.
GAMGI 0.07.26
 
Lots of improvments on WS cells.

What is new:

  • Hexagonal P WS cells is included in Orthorhombic C WS cells, so there are only Orthorhombic WS cells now: Hexagonal, Cubic and Tetragonal are particular cases. WS cells for Romboedric, Monoclinic and Triclinic systems are not handled currently.
  • The general architecture to handle faces and lines in WS cells was considerably improved, so now all cases are handled by a single function: loops_8, loops_12, loops_14 and lines_18.
  • Filtering faces and lines for Faces and Edges modes in Orthorhombic I and Orthorhombic F WS cells is completed, for all possible orientations (permutations).
  • Filtering faces and lines for Faces and Edges modes in Orthorhombic C (including Hexagonal P) is partially done.

What is next:

  • Complete filtering faces and lines for Faces and Edges modes in Orthorhombic C (including Hexagonal P).
  • Improve cell_modify, which still has problems.
  • Complete work on gamgi_gtk_light_modify.
  • Change global mode interface on atom_modify. Change data interface on atom_create and atom_modify.
  • Change global mode interface on atom_remove, bond_remove, molecule_remove, light_remove and layer_remove.
GAMGI 0.07.25
 
Essentially work on filtering faces and lines in WS cells.

What is new:

  • Filtering faces and lines for Faces and Edges modes in Orthrhombic I and Orthrhombic C is mostly done.
  • All Cubic and Tetragonal WS cells were removed and included as particular cases of Orthrhombic cells.
  • More cleaning on cell_create and cell_modify.
  • A good solution for storing data to rotate cells is set but not implemented.

What is next:

  • put final touches on cell_modify.
  • Complete work on gamgi_gtk_light_modify.
  • Handle Faces and Edges modes in Orthrhombic F cell, by filtering faces and lines.
  • The faces description in WS cells with the same faces topology should be handled by a single, common, function.
  • Change global mode interface on atom_modify. Change data interface on atom_create and atom_modify.
  • Change global mode interface on atom_remove, bond_remove, molecule_remove, light_remove and layer_remove.
GAMGI 0.07.24
 
Cell_modify is implemented. Orthorhombic I WS cells are implemented.

What is new:

  • cell_modify is essentially done, needs only some finishing touches.
  • The three Orthorhombic I WS cells are implemented and tested.
  • Global mode interface has been changed in light_modify and bond_modify.

What is next:

  • put final touches on cell_modify.
  • Complete work on gamgi_gtk_light_modify.
  • Handle Faces and Vertices modes in most WS cells, by filtering faces, loops and lines.
  • The faces description in WS cells with the same faces topology should be handled by a single, common, function.
  • Change global mode interface on atom_modify. Change data interface on atom_create and atom_modify.
  • Change global mode interface on atom_remove, bond_remove, molecule_remove, light_remove and layer_remove.
GAMGI 0.07.23
 
Implementation of cell_modify, light_modify, plus improvements on cell_create, atom_modify, bond_modify.

What is new:

  • Significant improvements have been made to cell_create and cell_modify dialogs.
  • Data transport from cell to cell_modify dialog is done. Most signals and callbacks are in place.
  • Data transport from cell to cell_modify dialog is done, including the selection popup menu. Most signals and callbacks are in place.
  • Improvements have been added to atom_modify and bond_modify dialogs.
  • Calculations for the three Orthorhombic I WS cells are done.

What is next:

  • Complete work on gamgi_gtk_cell_modify.
  • Complete work on gamgi_gtk_light_modify.
  • Handle Faces and Vertices modes in most WS cells, by filtering faces, loops and lines.
  • Add code to handle the three Orthorhombic I WS cells.
  • The faces description in WS cells with the same faces topology should be handled by a single, common, function.
GAMGI 0.07.22
 
General cleaning on group operations; Start adding code for light modify.

What is new:

  • work on gamgi_gtk_light_modify just started, the dialog is already in place but most of the callbacks are not.
  • GAMGI_VERTICES enumeration and static_vertices routines changed to GAMGI_EDGES and static_edges, respectively. The name is better and shorter, solving a GUI little problem with lack of space in gamgi_gtk_cell_modify.
  • gamgi_gtk_group_measure and gamgi_gtk_group_modify were totally cleaned. In particular, undo works with gamgi_gtk_group_modify.
  • handling translation when creating cells is done. The equivalent for rotation needs to be analysed more carefully.

What is next:

  • Complete work on gamgi_gtk_light_modify.
  • Handle Faces and Vertices modes in most WS cells, by filtering faces, loops and lines.
  • Add code to handle the three Orthorhombic I WS cells.
  • The faces description in WS cells with the same faces topology should be handled by a single, common, function.
  • start doing gamgi_gtk_cell_modify.
GAMGI 0.07.21
 
More work on WS cells.

What is new:

  • The problem of ordering the lattice parameters is definitely solved. Basically the length parameters are sorted (and the angle parameters are swaped) and a matrix keeps record of the whole transformation. Global sorting is decomposed in pair sortings, that can be described by rotations. The final resulting matrix is inverted so the vertices can be allocated in the standard orientation and then transformed back multiplying by that inverse matrix. This works with all lattices, including trigonal, monoclinic, and triclinic, where angles are not necessarily 90 degrees.
  • Code was added to determine the determinant, adjunct, transpose and inverse of 3x3 matrices.
  • matrix_absolute, matrix_relative, vector_absolute, vector_relative, replace and expand matrix_set, vector_set.
  • Code was added to reduce number of points in Vertices mode in Hexagonal_P and Orthorhombic_C WS cells.
  • A math file containing sort routines, including sort2 and sort3 for doubles and longs, was added and used in chem_bond.c and phys_cell.c.
  • Code was added to handle the case where the user requested a WS cell not done yet: Rhomboedric_P, Monoclinic_P, Monoclinic_B, Orthorhombic_I, Triclinic_P.

What is next:

  • Handle Faces and Vertices modes in most WS cells, by filtering faces, loops and lines.
  • Add code to handle the three Orthorhombic I WS cells.
  • The faces description in WS cells with the same faces topology should be handled by a single, common, function.
  • Handle translation and rotation operations ordered by the user in the dialog box.
GAMGI 0.07.20
 
Code to handle WS cell objects was improved.

What is new:

  • A function was added to remove unused points, loops and lines in WS cells. This function is required to clean the arrays, in Faces and Vertices modes (where inner points, faces and lines are not considered).
  • Orthorhombic F WS cells are now implemented.
  • Code to handle Hexagonal P and Orthorhombic C WS cells was partially rewritten, because in the Faces mode, the faces must use the loops array while the frame must use the lines array.
  • The wired loops test was slightly changed to handle these two new cases, which never use the loops array.
  • Code was added to initialise loops and lines arrays, in WS cells that require the cleaning function mentioned above.

What is next:

  • Everything is now ready for the final assault to handle Faces and Vertices modes for most WS cells.
  • Add code to handle the three Orthorhombic I WS cells.
  • The faces description in WS cells with the same faces topology should be handled by a single, common, function.
  • Add sort2 and sort3 functions to handle tetragonal and orthorhombic parameters in a simple, systematic way.
  • When the parameter order is changed, rotate cells in the end, so they appear with the expected orientation.
  • Add message for WS cells which will be written later: Rhomboedric, Monoclinic and Triclinic.
  • Handle translation and rotation operations ordered by the user in the dialog box.
GAMGI 0.07.19
 
Code to handle cell objects was improved. A bug was corrected in the history mechanism.

What is new:

  • Code was added to free the memory allocated for cell arrays, when cells objects are removed.
  • Code was added to copy cell arrays and other relevant parameters, when cells objects are copied.
  • The history mechanism is working for cell create and cell remove operations.
  • A bug was discovered and corrected in the history mechanism.
  • Code was added for the Vertices option in Hexagonal WS cells.

What is next:

  • Code to remove inner faces when using Faces or Vertices options in most WS cells.
  • Code to clean arrays after removing inner faces when using Faces or Vertices options in most WS cells.
  • Code to handle simultaneously Faces option and Vertices mode, in Hexagonal WS cells.
GAMGI 0.07.18
 
Code to implement Wigner-Seitz cells was improved.

What is new:

  • Routines to implement Body, Faces and Vertices options in Orthorhombic P, Tetragonal P and Cubic P WS cells were rewritten using better algorithms.
  • Routines to implement Tetragonal I low c/a, Tetragonal I high c/a, Orthorhombic C, and Hexagonal P WS cells were written.

What is next:

  • Code to free arrays memory when removing cell objects.
  • Code to copy arrays when copying cell objects.
  • Code to remove inner faces when using Faces or Vertices options in most WS cells.
  • Code to clean arrays after removing inner faces when using Faces or Vertices options in most WS cells.
  • Code to handle the Vertices option in Hexagonal WS cells.
gamgi-0.17.5/doc/changelogs/changelogs08.html000066400000000000000000001376151433127522700207420ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.08
GAMGI 0.09
11th December 2002
Enough is enough, here it is, GAMGI 0.09! Improvements from previous version are mainly in the usability front. Time to start completely new code!

What is new:

  • Configuration data modified in <gamgi><gamgi/> blocks can now be reset further down in other <gamgi><gamgi/> blocks. This is quite usefull when users want to temporarily change default parameters, and then return to the previous values (without having to specifically set them).
  • Clarified a long standing visual bug in the wired bond drawing code. Finding a solution is easy, finding the best solution is more difficult.
  • Added minimum width and height parameters in window configuration (default width and height parameters were already there).
  • Added a correction factor to make layer transitions from perspective to orthographic projections and vice-versa as smooth as possible, which means objects should have approximately the same size in both projections.
  • Copied the most recent manual and format documentation, plus faqs and changelogs, to $GAMGI/doc. In particular, the full Users Manual is now linked directly to Help->Current and Help->Tutorial in GAMGI, though it is in HTML and GAMGI currently handles it as raw text only, so it takes a bit to find the actual info among the HTML garbage ;-).
  • Cleaned gamgi_global_main.c and added gamgi_global_main.h for consistency and documentation purposes.
  • Updated the screenshots formats, so they can now be handled by most browsers and operating systems.

What is next:

  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Write the Cell Link section of the GAMGI users manual, in www.gamgi.org.
  • Write the Attributes section of the GML users manual, in www.gamgi.org.
GAMGI 0.08.30
8th December 2002
Variable rendering attributes are implemented. A problem solved and a bug removed. More documentation available from http://www.gamgi.org/.

What is new:

  • Solved a problem with the positional code (involving the Euler angles) in gtk_cell_modify.
  • Added Fasttrack web page to http://www.gamgi.org/
  • Added FAQs web pages to http://www.gamgi.org/
  • Added Coders Bibliography web page to http://www.gamgi.org/
  • I decided to change the entire website to XHTML 1.0 in the next couple of months, to take profit of Cascading Style Sheets (CSS) and to make it easier to parse these HTML files using XML tools.
  • Added Formats web pages to http://www.gamgi.org/. These pages are a first draft of the documentation that we aim to write, describing the XML native format used in GAMGI to handle both object and configuration data.
  • Found and removed a bug in the bond_scan code, introduced in the previous version.
  • Added variable width and slices to render atoms and bonds, this way allowing users to change on the fly the rendering quality (and speed) when handling atoms and bonds. Before, this could be done only at compile time.

What is next:

  • Improve Help availability.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Write the Cell Link section of the GAMGI users manual, in www.gamgi.org.
  • Write the Attributes section of the GML users manual, in www.gamgi.org.
  • Clean code, add more comments, in preparation for GAMGI 0.09.
  • Improve layer usage consistency.
  • Add defaults to <gamgi><gamgi/> blocks.
GAMGI 0.08.29
15th November 2002
Variable atom spheres and bond cylinders are implemented, so the only thing that needs to be done before stamping the oficial GAMGI 0.09 version is to improve documentation.

What is new:

  • A consistency problem related with rotation and translation in cell_create and cell_modify was removed.
  • engine_remove_soft functions were removed and replaced by engine_link_list functions, allowing much more flexibility but with the same goal: allow users to link objects to the parent of the current parent (typically before this is removed).
  • changed functions names: engine_copy -> engine_copy_out, engine_copy_hard -> engine_copy, engine_remove ->remove_out and engine_remove_hard -> engine_remove.
  • added functions mesa_rotate_out and mesa_translate_out and solved the consistency problem mentioned above.
  • Variable atom and bond size is now working and can be modified importing apropriate XML GAMGI files. This is fundamental to show compact cristalline structures.
  • Moved About from the Help to the Gamgi menu.

What is next:

  • Improve Help availability.
  • Write the Technical Description, in www.gamgi.org. with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Clean code, add more comments, in preparation for GAMGI 0.09.
  • Improve layer usage consistency.
GAMGI 0.08.28
10th November 2002
Cell Link for Conventional Hexagonal Cells is now working fine, so Cell Link is basically done. GAMGI 0.09 is now very close.

What is new:

  • Cell Link for Conventional Hexagonal Cells is now working fine.
  • The Extended Cutoff mode in Cell Link should be working fine now for all cells: in this mode, outside nodes and filtering are both turned off.
  • We now work with negative object coordinates in primitive axes (except Wigner-Seitz cells, where coordinates must be positive), to avoid round-off error problems.
  • Conventional volumes for Hexagonal lattices are working fine again for all FACES and BORDER options (this was broken in the previous release, in order to change the cell origin).
  • A bug was found and corrected in gtk_atom_create.c and gtk_atom_modify.c. The element testing in gtk_atom_create.c, gtk_atom_modify.c, and gtk_bond_create.c is now much cleaner.
  • An elegant, user-friendly, solution for the question of variable sphere radius in atoms was devised. We will take this as a general configuration option, so users can decide which method to use and can change it anytime they want, either through the control panel (not implemented yet) or importing XML GAMGI files (implemented). The only disadvantage of this solution is that users will not be allowed to choose this in a atom-by-atom or layer-by-layer basis, the change is global, for all atoms of the same style. Different styles (solid versus wired) have independent choices. Anyway, if one day we decide to do this on a atom-by-atom basis, it will be easy to change.
  • Improvements in the Shell tool.

What is next:

  • Implement variable sphere radius.
  • Write the Technical Description, in www.gamgi.org, with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Clean code, add more comments, in preparation for GAMGI 0.09.
  • Add ftp support to download remote files.
GAMGI 0.08.27
28th October 2002
GAMGI is running fine on Mac OS X. Cell Link is now working fine for Rhombus, Sphere, and Conventional Centered Cells. Work in Cell Link for Conventional Hexagonal Cells is evolving well and should be solved for next version.

What is new:

  • Back to GAMGI! The problem in Cell Link regarding how to generate the contributions of the nodes that are outside the cell has been solved, by creating a second, auxiliary, cell, that surrounds the real one. This problem occurred in all Centered Lattices in Conventional Volumes, in Rhombus and Spheres volumes.
  • An algorithm to handle Cell Link for Conventional Hexagonal Cells has been partly implemented.
  • The origin of Conventional Hexagonal Cells was moved from the center to the lower corner, because that is the right choice: 1) the origin is the same as in other volumes; 2) the pattern rules algorithm works in a logical and simple way with this choice. As a result, the code to remove loops and lines is temporarly broken. It will be working again in the next version.
  • large file names should be handled in a safe way now. Limits for names in XML documents were increased.
  • GAMGI is now running on Mac OS X too, with the X Window System (XFree86), thanks to the Fink project!
  • The socket programming code to fetch a http server is also running fine on the Mac OS X version.
  • swaped the order of the app and lib headers, so the app headers appear first. This is because the app headers already contain the global lib headers, which might be needed to the other local lib headers (the socket code was not compiling in Mac OS X because of this).
  • removed a minor ANSI incorrection in the help tutorial code.

What is next:

  • Work out link functionality for Hexagonal Conventional cell.
  • Use variable sphere radius.
  • Write the Technical Description, in www.gamgi.org. with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add ftp support to download remote files.
  • Clean code, in preparation for GAMGI 0.09.
GAMGI 0.08.26
17th July 2002
Help Current, Help Topic, Help Search, Help Tutorial and Help Remote functionality is implemented and working fine.

What is new:

  • Help Current, Help Topic, Help Search, Help Tutorial and Help Remote functionality is implemented and working fine. This first version works with .txt files. Futurely we will change to .xml help files, to allow for more powerfull text formating and presentation. This shouldn't be much of a change, as GAMGI data and config files are already .xml files.
  • Help About has been added.
  • An Algorithm to add link functionality for Hexagonal lattices with Conventional cell volumes has been partly worked out.

What is next:

  • Build container cell to link nodes correctly in PACKED mode.
  • Work out link functionality for Hexagonal Conventional cell.
  • Use variable sphere radius.
  • Write the Technical Description, in www.gamgi.org. with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add ftp support to download remote files.
  • Clean code, in preparation for GAMGI 0.09.
GAMGI 0.08.25
9th July 2002
Laboratory, conventional and primitive axes can now be indicated for all the 5 cell volumes allowed in GAMGI.

What is new:

  • Cells are now centered using only the nodes. This is faster and should always work well, but the main reason is stability: this guarantees that the cell center doesn't change when atoms and other child objects are added to assymetrical positions.
  • Laboratory (plus Conventional and Primitive) referentials are now supported in Cell Link, to set the position of the linked object.
  • gamgi_phys_cell_link was much improved, and already supports all the 5 cell volumes. In particular, automatic conversion between coordinates in different referentials is working now, for all possible cases.
  • The PACKED mode needs improvements, because nodes outside can also contribute to the cell contents, for all 5 volume representations. The problem is solved conceptually but this has not been implemented yet.
  • Cleaned gamgi_gtk_dialog and added support for beep configuration.
  • Added support for mouse configuration.
  • Added support for undo/save number of levels configuration.

What is next:

  • Write the Technical Description, in www.gamgi.org, with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add ftp support to download remote files.
  • Clean code, in preparation for GAMGI 0.09.
GAMGI 0.08.24
23th June 2002
This is the first version where structural cells can be easily made from atoms. From here to version 0.09 is mostly cleaning code and writing documentation.

What is new:

  • Parent objects in GML files, indicated with id references must now be in the scope determined by the child container. The algorithm seems to be consistent in all cases, and makes object hierarchy flexible enough, without allowing the type of file anarchy that was previously possible, where objects could point to parents anywhere, even in different files, a potentially hazardous and silly situation.
  • Element names are now searched using a hash table. The table has 127 positions, thus some are empty, but in compensation it is guaranteed that each hash list has no more than 2 element names. This speeds up element name search for large amounts of data (large files).
  • atoms can now be linked to cells in any position, by indicating its coordinates relatively to either the conventional or primitive vectors. This works for all cell volumes supported by GAMGI. This is a first step to general origin and orientation functionality, which will be done later, when container objects are better handled. Adding objects in the laboratory referential will be done later as well.
  • Atoms whose coordinates fall outside of the chosen cell volume are filtered out, if users whish so. This is working for all cell volumes supported by GAMGI except Wigner-Seitz cells. ;-)
  • A bug was found and corrected in engine_cell_copy: conventional and primitive vectors were not copied, thus the undo mechanism was compromised.
  • A bug was found and corrected in phys_cell_link: The node start and end indexes were not correct for F lattices.
  • A bug was found and corrected in math_matrix_inverse: The determinant was multiplying instead of dividing ;-)
  • Implement algorithm to import bonds automatically, in GML files, using Element and Voronoi methods, providing all the functionality currently available from the GUI: postponed. We should find a better, integrated, solution for non-static, algorithmic information, as this, probably by using the log files, where commands, rather than data, are stored.

What is next:

  • Write the Technical Description, in www.gamgi.org, with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add ftp support to download remote files.
  • Clean code, in preparation for GAMGI 0.09.
GAMGI 0.08.23
6th June 2002
GAMGI is now running on Mac hardware. The rules and (the code) to import bonds are now more solid and elegant.

What is new:

  • GAMGI is now running on Mac hardware: Linux Yellow Dog 2.2 on G4 Titanium 550.
  • Very serious bugs corrected: 4 dangling pointers (causing GAMGI to crash on the Mac) found and corrected.
  • A minor warning on the socket code was also corrected.
  • A 1-line check was added to prevent GAMGI from crashing on KDE, where WINDOWID is not defined.
  • The warning about WINDOWID absence was also removed.
  • gdk_window_set_decorations was reintroduced to handle WM decorations in Escape and Page_Up/Page_Down actions (and then removed again, see below).
  • gamgi_engine_find_parent is buggy, a better algorithm is in the way: corrected.
  • minor sound details on selection corrected.
  • Expat: the way objects point to parents has changed when the parent is not explicitly indicated, allowing a simpler, more solid hierarchy. Among other advantages, this makes possible to use a single find routine to check common parents under a given scope in both import and export XML operations. In particular this makes completly impossible, by design, to create bonds between atoms that are not in the same layer or even window, for example, which was not tested before and therefore made possible.
  • Expat: The algorithm to import bonds is now simpler, more elegant, and definitely much more solid, because bonds between atoms out of scope are not tolerated anymore. Speed should be just slightly slower, nothing really dramatic. These changes in the inner core of our XML import code are not systematically tested yet, so a few corrections might be needed and added in the next few days, when more systematic checking will take place.
  • Regarding window manager environments, the situation on Yellow Dog 2.2 (should be the same on Red Hat 7.2) is the following:
    • No environment implements a BROWSER variable anymore. This might be quite reasonable, but in practise it means that users must now set this variable to their prefered browser, if they wish to use Help->Remote in GAMGI.
    • Enlightenment: fullscreen mode works, even without set_decorations, WINDOWID is defined, and console button works.
    • Window Maker: fullscreen mode works only after hiding, set_decorations and show again. Without set_decorations everyting is hidden except the window bar. WINDOWID is defined and console button works.
    • twm: fullscreen mode does not work, even after hiding, set_decorations and show again (the window bar is not hidden). Without set_decorations everyting is hidden except the window bar. WINDOWID is defined and console button works.
    • Gnome (Sawfish): fullscreen mode does not work, even after hiding, set_decorations and show again (the window bar is not hidden). Without set_decorations everyting is hidden except the window bar. WINDOWID is defined but console button does not work.
    • KDE (kwm): fullscreen mode does not work, even after hiding, set_decorations and show again (the task bar is not hidden). Without set_decorations everyting is hidden except the window bar and the task bar. WINDOWID is not defined so console button does not work and is now hidden by GAMGI without warning.
    • Enlightement is currently the WM that best works with GAMGI, and the only tested so far where all the GAMGI functionality is available.

What is next:

  • Add automatic bonding in GML input files.
  • Implement code to set the coordinates of objects in cells relatively to nodes, for various types of referentials, namely conventional and primitive vectors.
  • Write the Technical Description, in www.gamgi.org, with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add ftp support to download remote files.
GAMGI 0.08.22
24th May 2002
This the first version that exports bonds (and then imports correctly the exported file).

What is new:

  • Bonds are now exported to native XML files in a solid and fast way. GAMGI is able to import the previously exported bonds, closing the cycle.
  • Code cleaning: this is the first version that compiles with -Wall -ansi -pedantic options without warnings due to GAMGI code.

What is next:

  • Handle bond importing in a better way.
  • Add automatic bonding in GML input files.
  • Implement code to set the coordinates of objects in cells relatively to nodes, for various types of referentials, namely conventional and primitive vectors.
  • Write the Technical Description, in www.gamgi.org, with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add ftp support to download remote files.
GAMGI 0.08.21
18th May 2002
GAMGI now works also with 16 color bits. The work to link objects to cell nodes using occupancy rules is completed.

What is new:

  • Object selection now works with 16 color bits per pixel (plus 24 and 32 as before), making it easier to use GAMGI on partly supported graphic cards and older hardware.
  • Cleaned the code handling rotate, move and scale operations.
  • Implemented Light modification with the mouse.
  • Added A, B, C and I nodes to the Cell Linking functionality. This completes the work related with nodes occupancy rules.
  • Improved the HTML online version of the users manual.

What is next:

  • Add automatic bonding in GML input files.
  • Handle bond importing and exporting in a clever way.
  • Implement code to set the coordinates of objects in cells relatively to nodes, for various types of referentials, namely conventional and primitive vectors.
  • Write the Technical Description, in www.gamgi.org, with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add ftp support to download remote files.
GAMGI 0.08.20
1st May 2002
Picking local objects is completed and name search in XML files should be much faster now, for large data files, thanks to an optimized hash table.

What is new:

  • Name search in XML input files now uses a a hash table, where the size and the multiplier can be independently controled and optimized. This is much faster for large input files and marginally slower for small input files (where speed is not an issue anyway).
  • Objects without visual representation (layers, lights, windows, the whole gamgi), and all the recursive objects (texts, groups, clusters and assemblies), can now be selected and changed in a consistent and simple way with the mouse, as done before for non-recursive objects with a visual representation (atoms, bonds, molecules, cells, etc.).
  • Corrected a minor error when exporting layer modelview data.
  • The name of http://files is properly checked when launched from the command line.
  • Closes the default window when more windows are launched from files imported from the command line.

What is next:

  • Write the Technical Description, in www.gamgi.org, with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add automatic bonding in GML input files.
  • Handle bond importing and exporting in a clever way.
GAMGI 0.08.19
24th April 2002
GAMGI can now read XML data and config files from any HTTP web server.

What is new:

  • GAMGI can now load XML files from any HTTP server in the world, which will be usefull to create online resource databases. For example, gamgi local_file.xml http://hostname/remote_file.xml, launches GAMGI, then loads local_file.xml and then loads remote_file.xml from hostname HHTP server.
  • The sections Group Measure and Group Modify of the User Manual are written.
  • The sections Cell Modify, Light Modify and Layer Modify of the User Manual are written, although information about inconsistent parameters when changing cells and lights is still missing.

What is next:

  • Add ftp support to download remote files.
  • Write the Technical Description, in www.gamgi.org, with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Handle pattern rules for Conventional cell volumes.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add automatic bonding in GML input files.
  • Handle bond importing and exporting in a clever way.
  • Keep cleaning gamgi_chem and gamgi_mesa.
GAMGI 0.08.18
7th April 2002
No code changes, a draft of the Users Manual is available, covering more than 50% of current GAMGI functionality.

What is new:

  • The Users Manual draft covers the general interface, interactivity, and functionality, plus how to create, modify and remove bonds and atoms, how to create and remove cells, lights and layers, plus similar information for objects that are not fully operational as groups, molecules, clusters and assemblies (about 58 pg in the postscript version).
  • The Scientific, Legal, Contributors sections in the Description part in www.gamgi.org are available.
  • The Mailing Lists and Links sections in the Contacts part in www.gamgi.org are available.

What is next:

  • Write the sections Group Measure, Group Modify, Cell Modify, Light Modify, Layer Modify of the Users Manual draft.
  • Write the Technical Description, in www.gamgi.org, with sections Mission and Libraries.
  • Prepare FAQs, screenshots, etc.
  • Handle pattern rules for Conventional cell volumes.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add automatic bonding in GML input files.
  • Handle bond importing and exporting in a clever way.
  • Keep cleaning gamgi_chem and gamgi_mesa.
GAMGI 0.08.17
11th February 2002
The pattern rules governing node occupancy seem to be working fine now for Primitive, Wigner-Seitz, Rhombus and Sphere cell volumes.

What is new:

  • Added code to link atoms to cells, basically to test the pattern rules and the visual scale.
  • The pattern rules governing node occupancy were cleaned, simplified, some bugs were removed, and were reasonably tested. They seem to be working fine now for Primitive, Wigner-Seitz, Rhombus and Sphere cell volumes.
  • The gamgi directory tree is now divided in src, data and docs.
  • Started adding data in GAMGI XML format: fancy molecules, cells, lights, atom and bond config, etc.
  • Minor corrections on gamgi_expat_* files.
  • Started writing FAQs for Users Introduction and Troubleshooting.

What is next:

  • Handle pattern rules for Conventional cell volumes.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Write FAQs for: Users and Coders, Introduction and Troubleshooting.
  • Add automatic bonding in GML input files.
  • Handle bond importing and exporting in a clever way.
  • Keep cleaning gamgi_chem and gamgi_mesa.
GAMGI 0.08.16
29th January 2002
The basic infra-structure to import and export data and config XML files is done.

What is new:

  • Completed the design and implementation of the XML import config algorithms, for all objects.
  • Added import config parameters for atoms and bonds. Default masses, radius, colors, different ways of dealing with default bond limits, default drawing style, etc., can now be changed directly throughout GAMGI importing config XML files.
  • Fine tuned syncronisation between import and export files.
  • Added Help Search and Help Tutorial interfaces and basic working.

What is next:

  • Write code to read from files to GtkText widgets in Help dialogs.
  • Keep developing gtk_cell_link.
  • Add automatic bonding in GML input files.
  • Handle bond importing and exporting in a clever way.
  • Keep cleaning gamgi_chem and gamgi_mesa.
GAMGI 0.08.15
23th January 2002
Work to export and import XML files with data and config info continues. A free program that determines all point symmetry groups is working fine here. This is the first GAMGI release to pass the 80,000 LOC barrier.

What is new:

  • Layer, Light and Cell objects can now be properly exported (but not Bonds yet, though).
  • A Import Cell parameter bug corrected.
  • Infrastructure to export configuration added.
  • Many small changes on gamgi_global* functions, to allow import config to work correctly, even in a multithreading environment.
  • Configurable bond range data added.
  • Minor work on gamgi.org site.
  • Last but not the least, a free program called Symmetry, developed by Dr. Serguei Patchkovskii, is able to determine all point symmetry groups, using brute force, and is running fine here, passing the tests supplied for all groups (about 2,000 lines of C code)! Serguei specifically allowed us to integrate Symmetry on GAMGI (actually another GPL program is already using Symmetry). Definitely great news!

What is next:

  • Add code to import configuration info from XML files, as done already for data info. This will increase considerably GAMGI usability.
  • Add code to export configuration info from XML files, as done already for data info.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Keep developing gtk_cell_link.
  • Add automatic bonding in GML input files.
  • Keep cleaning gamgi_chem and gamgi_mesa.
GAMGI 0.08.14
14th January 2002
Added code to export GAMGI data to XML files.

What is new:

  • GAMGI can now be called from the command line with unlimited XML input files as arguments.
  • Help Search added. It will look for keywords, such as GAMGI labels.
  • More work on Help Topic and Help Current.
  • Makefile cleanups.
  • gamgi_expat_export* and gamgi_expat_export_data* already contain the infra-structure required to export all sorts of data info (except bonds) to XML files.
  • Started writing on gamgi_expat_export_config.

What is next:

  • Add code to import configuration info from XML files, as done already for data info.
  • Add code to export configuration info from XML files, as done already for data info.
  • Write code to read from files to GtkText widgets in Help dialogs.
  • Keep developing gtk_cell_link.
  • Add automatic bonding in GML input files.
  • Keep cleaning gamgi_chem and gamgi_mesa.
GAMGI 0.08.13
3th January 2002
Added picking for recursive objects, lots of cleaning, slashed 3 bugs, including the top-dog. :-)

What is new:

  • picking recursive objects on the screen is now fully consistent and easy to use, picking always the child, then going up, and finally using a pop menu (as in layers and lights).
  • Removing cluster, assembly and group objects is now working, even when recursion happens (local mode only).
  • Lots of cleaning on gamgi_mesa* functions, particularly regarding *gtk-*_press functions.
  • More engine_* and gtk_* cleaning.
  • The long-time diffuse light bug was eventually tracked down to a Mesa bug. Workarounds are in place and soon this will be gone.
  • A memory corruption bug was found and corrected: when removing recursive objects as text, group, cluster and assembly, some list addressing was done incorrectly.
  • ModelView and Projection Matrixes, used to put atoms on the 3D space, were obtained in the wrong place, resulting in wrong positioning when the layer scale was different from the default value (1.0).

What is next:

  • Write code to read from files to GtkText widgets in Help dialogs.
  • Add code to handle configuration information from XML files, as done already for data information.
  • Write code to export data and configuration XML files that follow the GML rules.
  • Keep developing gtk_cell_link.
  • Add automatic bonding in GML input files.
  • Keep cleaning gamgi_chem and gamgi_mesa.
GAMGI 0.08.12
13th Dezembro 2002
Added functionality for creating, linking and removing containers (assembly, cluster, molecule, group).

What is new:

  • Added gtk_assembly_create*, gtk_assembly_link*, gtk_assembly_remove*
  • Added gtk_cluster_create*, gtk_cluster_link*, gtk_cluster_remove*
  • Added gtk_molecule_create*, gtk_molecule_link*, gtk_molecule_remove*
  • Added gtk_group_create*, gtk_group_link*, gtk_group_remove*
  • Implemented a first version of Help Remote (currently just pointing out to www.gamgi.org).
  • Fixed a mem leak and cleaned the code for the combo box in gtk_bond_create/modify*.
  • GtkCTrees are now added directly using container_add, instead of using viewport as before, so it can handle 10,0000 objects correctly now.

What is next:

  • Write code to read from files to GtkText widgets in Help dialogs.
  • Add automatic bonding in GML input files.
  • Write code to export data and configuration XML files that follow the GML rules.
  • Keep developing gtk_cell_link.
  • Add more documentation: comments, headers, etc.
  • Clean gamgi_chem and gamgi_mesa code.
GAMGI 0.08.11
 
The infrastructure to allocate configuration data has been created, so configuration data can now be changed at run time, instead of compile time, as before.

What is new:

  • gamgi_global_start*, and gamgi_global_end* functions added, to add and remove default configuration data.
  • gamgi_chem_atom_start* functions added, to initialise configuration atomic data used by GAMGI, as masses, radius and colors.
  • Configuration data is now taken from gamgi->object_class structures, instead of directly from #define statements as before.
  • Demo1 and Demo2 removed.

What is next:

  • Write code to read from files to GtkText widgets in Help dialogs.
  • Implement a first version of Help Remote.
  • Add automatic bonding in GML input files.
  • Write code to export data and configuration XML files that follow the GML rules.
  • Keep developing gtk_cell_link.
  • Add more documentation: comments, headers, etc.
  • Clean gamgi_chem and gamgi_mesa code.
GAMGI 0.08.10
 
Replaced GtkTree by GtkCTree widgets everwhere in GAMGI. Common mechanism for Current Help and Topic Help in place.

What is new:

  • GtkTree widgets used in Select dialogs were all ported to GtkCTree.
  • Atom colors are float again, before they were unsigned short.
  • math_convert functions were removed, after general cleaning.
  • gamgi_gtk_time_show function activated again in gamgi_gtk_window_create.
  • Common Help handling for Help Current and Help Topic is now in place.
  • gamgi_expat_data* and gamgi_mesa_start* cleaning (when possible, set defaults before reading gml files).

What is next:

  • Write code to read from files to GtkText widgets in Help dialogs.
  • Implement a first version of Help Remote.
  • Add automatic bonding in GML input files.
  • Write code to export data and configuration XML files that follow the GML rules.
  • Keep developing gtk_cell_link.
  • Add more documentation: comments, headers, etc.
  • Clean gamgi_chem and gamgi_mesa code.
GAMGI 0.08.9
 
It's Help season down here.

What is new:

  • The Help Topic dialog is implemented, first using GtkTree and later using GtkCTree (better).
  • The Help Current dialog is just started.

What is next:

  • Develop Help Current, and the actual infra-structure to build Help dialogs, with GtkText.
  • Implement a first version of Help Remote.
  • Port GtkTrees to GtkCTrees in Object Select dialogs.
  • Add automatic bonding in GML input files.
  • Write code to export data and configuration XML files that follow the GML rules.
  • Keep developing gtk_cell_link.
  • Add more documentation: comments, headers, etc.
  • Clean gamgi_chem and gamgi_mesa code.
GAMGI 0.08.8
 
All object parameters handled in GUI mode can now be handled in standalone (XML) mode. Trees in Select dialogs are correct again.

What is new:

  • I decided to improve/develop the mechanisms involving GtkTree and GtkText widgets in GTK 1.2, instead of waiting for GTK 2.0.
  • All object parameters that could be defined so far in GUI mode, can now be defined also in standalone mode, importing XML files.
  • New tests, empty and resources, were added to handle layers in windows and exceeded number of lights.
  • New gamgi_mesa_start_* functions were added to allow clean definition of default parameters, particularly for new window and layer objects, defined from XML files and also from the GUI.
  • window_create*, gamgi_bottom_* and gamgi_reset* functions slightly changed to accomodate the new way to enter windows, layers and the mesa_start functions above.
  • The action enumeration was extended to include all select dialogs, plus import and export file dialogs.
  • The object trees in the select dialogs are working again (the old way to calculate each top tree was incorrect since the history mechanism was added, 11 months ago).
  • gamgi_engine_dlist_bond_* functions were changed to list objects in the right order (go from last object to first one, to compensate the stack effect).
  • New gamgi_engine_dlist_bond_* functions were added to handle the top tree in bond select dialogs.
  • The archive file to download, containing the GAMGI source code, is now better organised, including not just source code and related files.

What is next:

  • Add automatic bonding in GML input files.
  • Write code to export data and configuration XML files that follow the GML rules.
  • Keep developing gtk_cell_link.
  • Add more documentation: comments, headers, etc.
  • Clean gamgi_chem and gamgi_mesa code.
GAMGI 0.08.7
 
Code to read external files (even recursively) and globally address every kind of GAMGI object is now implemented in the code importing XML files.

What is new:

  • Recursive XML External General Entities are implemented and tested.
  • Global linking using id/idref addressing was extended to all objects (not only bonds).
  • Error messages were considerably improved, always reporting the line number and file name of the file where the offending object starts.
  • The DTDs defining GML were divided in three files: gamgi.dtd, the main one, that essentially calls gamgi_data.dtd, that describes data information, and gamgi_config.dtd, that describes config information.

What is next:

  • Add automatic bonding in GML input files.
  • Write code to export data and configuration XML files that follow the GML rules.
  • Keep developing gtk_cell_link.
  • Add more documentation: comments, headers, etc.
  • Clean gamgi_chem and gamgi_mesa code.
GAMGI 0.08.6
 
Almost all the infra structure required to read GAMGI native XML files is now in place.

What is new:

  • A solid method to handle global tests involving incompatible and missing parameters is in place.
  • Global bonds are implemented, using global id and idref identifiers.
  • real and integer io_token functions were replaced by float/double and int/long functions. This makes GAMGI more robust and avoids subtle but potentially serious memory corruption.

What is next:

  • Implement XML external general entities.
  • Update the DTD defining GML: gamgi.dtd.
  • Write code to export data and configuration XML files that follow the GML rules.
  • Keep developing gtk_cell_link.
  • Add more documentation: comments, headers, etc.
  • Clean gamgi_chem and gamgi_mesa code.
GAMGI 0.08.5
 
Lots of progress in the XML front.

What is new:

  • data and configuration information can now be freely mixed in input/output files with GML (GAMGI Markup Language) format.
  • The overall architecture and lay-out for the gml parser is now (mostly) settled down.
  • Code to import and check data is mostly in place, except bonds.
  • XML internal general entities are working.
  • Tests and Errors for most cases are in place, including file open and read errors, XML parsing errors, unknown elements and attributes, wrong attribute values, wrong root element, wrong DTD, wrong public identifier and wrong child object.
  • The gamgi object is again created and removed dynamically, when GAMGI starts and ends (as in GAMGI 0.0.1), instead of statically, as before.
  • The last references to system disappeared from GAMGI code, replaced by gamgi. This avoids confusion with the system standard function and reinforces the concept of the whole program as a singleton, global, object, called gamgi.
  • Improvements on gamgi_io_token.c.
  • Descontinued some type definitions, to simplify things.

What is next:

  • Complete code to import data and configuration XML files that follow the GML rules.
  • Implement XML external general entities.
  • Update the DTD defining GML: gamgi.dtd.
  • Write code to export data and configuration XML files that follow the GML rules.
  • Keep developing gtk_cell_link.
  • Add more documentation: comments, headers, etc.
  • Clean gamgi_mesa code.
GAMGI 0.08.4
 
XML configuration files are mostly implemented and tested.

What is new:

  • GAMGI data and config files specifications, gamgi_data.dtd and gamgi_config.dtd, were improved. A default gamgi_config.xml configuration file was written.
  • GAMGI can now read almost all the information that should be required in the XML-based configuration files, thanks to the expat library.
  • The global information, in the gamgi structure, is now in a separate header, gamgi_global.h, in the global directory, together with gamgi_global_main.c.
  • New functions added to gamgi_io_token.c.
  • makefiles were considerably simplified.

What is next:

  • Start working on gamgi_expat_import_data.
  • Keep developing gtk_cell_link.
  • Add more documentation: comments, headers, etc.
  • Clean gamgi_mesa code.
GAMGI 0.08.3
 
The cell rules algorithm was extended to rhombus and sphere modes. XML DTDs for GAMGI data and configuration files were specified.

What is new:

  • The algorithm to fill cell nodes according to rules is now working for rhombus sphere modes. Thus all volume modes are now supported.
  • XML document data type specifications (DTDs) for GAMGI data and config files have been developed: gamgi_data.dtd and gamgi_config.dtd.
  • This is the first GAMGI version with gamgi_expat* functions integrated in the GAMGI code.
  • makefiles were cleaned.

What is next:

  • Write code to read XML config files and apply to GAMGI defaults.
  • Develop gtk_cell_link.
  • Add more documentation: comments, headers, etc.
  • Clean gamgi_mesa code.
GAMGI 0.08.2
 
The algorithm to fill cell nodes according to rules is done. Work on the XML stuff has started. A small leap...

What is new:

  • The EXPAT library was choosen to parse GAMGI XML files. Needless to say, this is a long term decision. EXPAT is a non-validating SAX-type parser, that powers Mozilla and Perl, among other high-profile projects. EXPAT was written in C, by James Clark, the main force pushing the XML technical comitee. EXPAT is widely considered as the fastest XML parser available so far and is distributed with a MIT license. It is simple, fast, free and written in pure C. Exactly what the doctor said.
  • Started working on a DTD for GAMGI.
  • The algorithm to add or remove objects to cell nodes according to flexible filling rules is now implemented and apparently working well. A working gtk_cell_link is now just a matter of time. It is not done for Rhombus and Sphere volumes though.
  • More code cleaning.

What is next:

  • Add more documentation: comments, headers, etc.
  • Clean gamgi_mesa code.
  • Develop gtk_cell_link.
  • Work on the XML stuff.
GAMGI 0.08.1
 
Data improvements. Bugs removed. Started gtk_cell_link.

What is new:

  • All enumerations and definitions now have a second prefix indicating the source directory where they are declared.
  • Handling press_key_event signals was corrected, so now they work well with the command entry in the tools section.
  • i) dialog box actions, ii) pick selections and iii) rotate, move, scale tool operations are now 3 totally independent operations and work well together.
  • gtk_cell_link was started.

What is next:

  • Add documentation.
  • Finish cleaning code.
  • Continue writting gtk_cell_link.
  • Start working on XML support.
GAMGI old
 
Changelogs for older releases can be found here.

gamgi-0.17.5/doc/changelogs/changelogs09.html000066400000000000000000002576261433127522700207500ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.09
GAMGI 0.10
21st July 2004
Updated and extended the Interfaces documentation. Objects can now be selected using also the Object->Select Dialogs. Started working on the implementation of the 230 crystallographic space groups of symmetry.

What is new:

  • The redundant Wyckoff positions are now counted and removed.
  • The positions and driver arrays for the 230 space groups are fully working, generating all the Wyckoff positions for a given (x,y,z) set of coordinates (needs more testing though).
  • Refined the report produced by Cluster->Measure->Voronoi.
  • Improved documentation for Cluster->Measure->Voronoi.
  • Wrote documentation for Cluster->Measure.
  • Wrote documentation for Molecule->Measure and Molecule->Measure->Symmetry.
  • Checked all the examples in molecule/symmetry to test the point symmetry code. They all work now, with different tolerances though.
  • The positions and driver arrays for all the 230 space groups are written and tested, making possible in the close future to support crystal building from space group information, an important goal for GAMGI.
  • Checked ALL the Wyckoff positions, for the 230 space groups, against the International Tables of Crystallography, 5th Edition, 2002. From now on, to get space groups working on GAMGI what is still required is essentially automatic work, the same for all groups.
  • Generated all the Wyckoff positions, in electronic format, for all the space groups of crystallography, using the Altwyk program. This is clearly work post-Gamgi 0.1.
  • Fixed a minor inconsistency: exported windows should not exceed 2 times the screen size, the maximum limit accepted for imported windows.
  • Updated documentation for Layer->Create, Light->Create, Atom->Create and Bond->Create.
  • Added documentation for code style, architecture and libraries.
  • Window parameters x,y,w,h can now take values in the ranges [-screen_width, +screen_width], [-screen_height, +screen_height] [GAMGI_GTK_WINDOW_WIDTH_MIN, 2 * screen_width] and [GAMGI_GTK_WINDOW_HEIGHT_MIN, 2 * screen_height]. This solves the problem with negative x,y coordinates (meaning a window with its top corner outside the screen). Gtk 1.2 ignores the negative coordinates but that is not a real problem.
  • Added size,red,green,blue defaults in gamgi_gtk_bond_create (this was already done in gamgi_gtk_atom_create for size,variancy). Added size,variancy defaults in gamgi_gtk_atom_modify and size,red,green,blue in gamgi_gtk_bond_modify, when changing to wired and no color. Added error checking when changing size,variancy in gamgi_gtk_atom_modify and size,red,green,blue in gamgi_gtk_bond_modify: style must be solid and color must be TRUE.
  • Minor website cleanings: CSS/XHTML files, TODO tag for undone tasks, updating interfaces introduction.
  • Improved the object_create documentation files for the container objects: Group, Cluster, Molecule, Assembly.
  • Improved the object_modify documentation files.
  • Improved the documentation files for Group->Measure and Group->Modify.
  • Improved the documentation files for the Help dialogs.
  • Wrote the documentation files for the Object->Select dialogs.
  • Improved the documentation files for the Object->Remove dialogs.
  • Removed a bug in the Voronoi volume code: an int was used instead of a real.
  • Splited the code in gamgi_gtk_select.c by files as gamgi_gtk_text_select.c, one for each class of object, and connected the Object->Select dialogs with the code to select individual objects.

What is next:

  • Create gtk/objects directories and move gamgi_gtk_object_* files to there.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Implement one or two crystallographic space groups, just as a proof-of-concept, in order to fix the architecture for the whole code handling this functionality. After that, adding the other space groups should be a task as mechanical as possible, essentially adding the data prescribed in the International Critical Tables.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.28
1st June 2004
Completed the Cluster->Measure interface for the Voronoi code and improved light functionality. GAMGI 0.1 is now very close.

What is new:

  • The connection between the Voronoi code for clusters and the dialog Cluster->Measure is done: now all input data can be controled from the graphic interface, and all output data is exported to the report dialog.
  • Improved specular light effects, in curved surfaces, by adding a large OpenGL Material Shininess factor.
  • Specular light components are working fine again. The problem was glMaterial functions which were removed some time ago. Without them, the default for specular light components is (0.0, 0.0, 0.0, 1.0), so they were not shown.
  • Cleaned the gamgi_gtk_light_modify.c code and removed a bug just introduced, when we added defaults for directional, positional and spot lights.
  • Completed the basic layout for the Cluster->Measure->Voronoi Gtk dialog.
  • Upgraded Mesa for Mesa6.0.1, the latest release. Unfortunately there is a bug in this version, regarding the pre-compiled list of the GLUsphere: a black spot appears in the middle. Without the pre-compiled list, the GLUsphere looks fine. We use this to draw atoms in solid mode :-(
  • Found and removed a second bug in gamgi_gtk_light_modify: for directional lights, the direction was not inverted, when initialised, so light would be coming from the other side.
  • Found and removed a simple but nasty bug: in gamgi_gtk_light_modify, some variables were called before they were initialised.
  • Added light defaults to Light->Create and Light->Modify.
  • Added Help->Current and Help->Topic documentation for level0 dialogs showing GtkText reports: currently this affects Molecule->Measure->Symmetry and Cluster->Measure->Voronoi.
  • By default, scale factors are now presented with three decimal figures.
  • Documentation improvements: updated the tutorials on cell interstices and light effects.
  • Website improvements (download section: ftp and http).
  • Found and removed a simple but nasty bug in the mesa code: the maximum,minimum scale parameters were too far away from 1.0, causing core dumps, when exceeded.
  • Found and removed a bug in the code exporting bonds: size and red,green,blue parameters were always exported when different from the default, independently of the style and color parameters.
  • Improved the www.gamgi.org frontpage.
  • Completed the documentation refering to File Formats.

What is next:

  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.27
12th May 2004
The code to handle Voronoi tesselations is mostly done: statistical and graphical aspects are essentially completed. We still need to handle a few topological inconsistencies and build a proper Gtk dialog to handle the options.

What is new:

  • Calculated the remaining Voronoi edge properties. GAMGI is now calculating a grand total of 23 geometrical and topological properties for the Voronoi tesselation.
  • Calculated Voronoi face angles and some of the edge properties.
  • Determined local and global edges (common to various polyhedrons).
  • Determined global vertices from local vertices, using cells.
  • Added more Voronoi topological properties to report.
  • More cleaning and testing for the Voronoi code.
  • Testing the numerical stability of the Voronoi code: seems good, under control, but it is not a trivial task.
  • Cleaned the sort-merge routines for lists of slist/dlist nodes.
  • Added standard deviation for all the Voronoi Tesselation properties where it makes sense.
  • Completed the calculation of statistical data from the Voronoi Tesselation: we have now 18 properties which should cover everything people needed.
  • The Voronoi volumes, areas, distances, are now calculated. With double precision, the total volume for DNA (698 atoms) calculated from the outer planar boundaries and calculated by summing the volume of the 698 polyhedrons gives the same value, for (at least) the first 11 figures!
  • Moved the functions to merge and sort linked lists from phys/gamgi_phys_voronoi.c to gamgi_engine_lists.c, where they belong.
  • Apparently we have a good algorithm O(e) to clean and handle the Voronoi edges.
  • Apparently we have a good algorithm O(v) to clean and handle the Voronoi vertices.
  • Cleaned a bit more the Voronoi code and filtered the inner faces, so the inside of the Voronoi volume can now be seen.

What is next:

  • Redesign the www.gamgi.org front page, using improved CSS techniques.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.26
15th April 2004
The code to determine Voronoi polyhedra is now working fast and correctly, with both outer planes and periodic boundary conditions. A big win for GAMGI.

What is new:

  • White smoke! Everything is now working fine, for all tested systems (including the 698 atoms of DNA), in raw and PBC modes. It is fast and stable, without collisions. Definitely very good news for GAMGI!
  • We have zero collisions with periodic boundary conditions, for small systems. This happens even when we consider the virtual neighbours, i.e., if seed 6 has a face with neighbour 17 in virtual system -1 0 +1, then seed 17 must have a face with neighbour 6 in virtual system +1 0 -1.
  • We studied the numerical stability of the Voronoi code in raw mode. For small systems this seems to be working fine: we have 0 collisions and faces have always at least 3 vertices. We have now a reasonable understanding of the dynamic stability of the algorithm. The algorithm is stable, unless wrong tolerance parameters are used.
  • Cleaned the Voronoi code. It is much easier to understand and maintain now.
  • Voronoi faces are now orientated immediately after the polyhedron is created, which is required because we must calculate the areas immediately, to check if the faces are too small and should be discarded. To avoid multiple scans, we add all the vertices in a single scan, using lists for simplicity (we use merge sort to sort the lists).
  • The Voronoi clusters are now painted with the corresponding seed atom colors.
  • The PBC method is now also working and is very, very fast indeed. Not widely tested yet, it's higly likely that still contains bugs, that show up in large systems.
  • The new Voronoi algorithm is working in raw mode. Very fast, but still shows problems in large systems, due to bugs.
  • The coordinate generators and controllers for both raw and pbc (general image convention) conditions are in place for the new, much faster, much better, Voronoi algorithm.
  • Removed old files from the download section at www.gamgi.org and ftp.gamgi.org.
  • More experiences with GNU-arch: creating remote mirrors from local archives and local mirrors from remote archives is working fine with sftp.

What is next:

  • Improve the Voronoi code, with and without PBC conditions.
  • Redesign the www.gamgi.org front page, using improved CSS techniques.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.25
16th March 2004
Replaced Tables by CSS layout in www.gamgi.org. Improved Formats documentation. Help->Topic now includes all the Interfaces and Formats sections.

What is new:

  • Help->Topic now includes all the Formats and Interfaces sections, essentially including all the documentation that exists except FAQs.
  • GAMGI is now reading the XHTML help files, with the new style.
  • Completed the CSS changes into the XHTML website code. As a result, the remote help functionality is temporarily broken :-)
  • Added the id attribute to light objects when importing XML files. Lights cannot own other objects, so this is not very useful, but in some cases might help documenting the data in the file.
  • Changed axis to axes in window and layer labels. Improved slightly the layout for Layer->Create and Layer->Modify interfaces.
  • Everything except the manuals has now been converted to the new CSS layout and improvements.
  • website improvements: started replacing the layout tables by CSS divs in all the gamgi.org website. This enhances separation between style and contents, makes the pages easier to maintain, and more light because the style file is downloaded only once and then stays in memory.

What is next:

  • Improve the Voronoi code, with and without PBC conditions.
  • Redesign the www.gamgi.org front page, using improved CSS techniques.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.24
5th March 2004
The first version of the Voronoi tesselation code is now working.

What is new:

  • The first algorithm is now implemented and seems to be working fine: no collisions and the images look nice. More testing is required though.
  • We have a new algorithm, easy to implement, that should be much faster and should work well with PBC conditions. We will implement it on a second stage.
  • Speeding techniques using vertices do not work, because seeds can share vertices without sharing faces.
  • Definitely the minimum image convention does not work for Voronoy tesselation with periodic boundary conditions, because the closest image is not enough to correctly determine al the polyhedra.
  • The Voronoi code is progressing well: faces have been tested with several crystallographic systems, with 1D and 2D systems and large random systems. It takes now about 30s on this old computer for 698 seeds DNA. No collisions were found when float tolerances are 1.0E-4 to 1.0E-4 or smaller. Vertices are now calculated, and the results are correct so far. With PBC conditions, about 160 collisions were found for DNA 698 seeds, perhaps because the PBC code has not been tested so far, so it might still contain errors.
  • Removed once for all the extension bug, which by mistake was not properly removed in the version before.
  • Corrected a bug in the memory engine lists: a slist node was allocated as a dlist node. This is inofensive, as long as a slist does not try to work as a dlist node, a fairly unlikely event.

What is next:

  • Improve the Voronoi code, with and without PBC conditions.
  • Redesign the www.gamgi.org front page, using improved CSS techniques.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.23
14th February 2004
Fixed bugs. Improved the Formats documentation. Added part of the code needed to calculate Voronoi polyhedra.

What is new:

  • Cleaned the Voronoi code.
  • Improved the Formats documentation, which now includes object information for atoms, bonds, texts, groups, molecules, clusters, assemblies.
  • The Voronoi code is doing good progress, and all the problems seem to be solved (famous last words!).
  • In some cases it is useful to have wired bonds with a color chosen by the user, so this is allowed now. Moreover, this solution is definitely simpler for both users and coders.
  • Definitely "gamgi_gdk_get_root_origin" is not working properly (it gave y = -17 for a window coordinate, an impossible value). Changed to "gamgi_gdk_get_root_origin" instead. Probably the best solution is really to scrap altogether the window x,y origin parameters.
  • Found and removed a bug: when exporting wired atoms the size parameter was exported, even if this parameter is only for solid atoms (the size parameter initially is set to 1.0, but the default is different, 0.8).
  • Found and removed a simple-to-remove but difficult-to-find-nasty bug: we had this code, "strrchr (fullname, '.') + 1;" which should crash when '.' is not found. Unfortunately it seems that it crashes only sometimes, making it difficult to spot.
  • Started writing a full scale 3D Voronoi code to build Voronoi cells for any general, amorphous atomic system. I think the most difficult part is done :-).
  • Player with the mechanism provided by GTK 1.2 to refresh the interface while the process is busy: "while (gtk_events_pending()) gtk_main_iteration()". It works as expected but definitely this is not something to implement now because it requires software locks in several places, otherwise nasty things start occurring ;-).
  • Replaced float fmod by int % in the point symmetry code.
  • Revised and updated the documentation on XML formats to import configuration data, which is now fairly complete.
  • Added code to import/export bond covalency, which we forgot to include before.
  • Added a layer error check: far must be larger than near.
  • Found and removed a bug in the lightning code (thanks Maura): By default, when OpenGL/GAMGI starts, glNormal is set to (0.0, 0.0, 1.0). When solid atoms, wired/solid cells or perhaps solid bonds are created, the glNormal vector changes and the last vector becomes still effective in the end, effectively being used to draw other objects and thus corrupting them: wired objects suddenly become too dark when different, completely independent, objects are created. Now we explicitly reset glNormal to (0.0, 0.0, 1.0) everytime we change it (or OpenGL functions change it).
  • Gamgi now imports .xyz files containing atomic data, both from local disk, or through HTTP and FTP protocols.
  • Found and corrected a bug in gamgi_engine_copy_out_cell.c: the cell group information was not copied, so sometimes the Undo/Save mechanism would result in wrong group information.
  • Found and corrected a bug in gamgi_mesa_scan.c: it was glEnable-glDisable (GL_CULL_FACE) instead of glDisable-glEnable (GL_CULL_FACE). This prevented selecting a cell when inside its volume.
  • Found and corrected a bug in gamgi_expat_import_html: the html structure was not removed in the end.
  • Separated the expat code from the import code, so different file formats, namely xyz, can now be imported.
  • Found and corrected a bug in gamgi_engine_dlist.c: Added gamgi_engine_dlist_atom_window and gamgi_engine_dlist_atom_gamgi, so now all atoms will be correctly exported in xyz format, even when the object currently selected is Window or Gamgi.

What is next:

  • Implement full 3D Voronoi code, with and without PBC conditions.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve documentation and website.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.22
15th December 2003
Redesigned the code handling cell symmetry and lattice parameters in Cell->Create and Cell->Modify. Fixed bugs.

What is new:

  • Redesigned the code handling lattice parameters, which is now the same for Cell->Create, Cell->Modify and XML Cell Create tasks. This removes a few inconsistencies in the code handling Cell->Modify and is easier to maintain.
  • Removed a bug in gamgi_io_file: postscript files were open twice.
  • Atomic data can now be exported (again) in xyz format.
  • Updated gamgi_engine_count.c.
  • Another round of clean-up in the point symmetry code: now the calculation is essentially controlled by initial tolerance (before optimization) and final tolerance (after optimization). These two parameters are now controled directly by the users, in the Molecule->Measure dialog.
  • Added error messages to Group->Modify, when atoms are aligned: these messages were there long ago, but for some reason were moved and ultimately removed somehow.
  • Removed two bugs related with colored bonds: Bond->Create was not initializing the default color style when in Solid mode; More important, gamgi_mesa_start_bond was initializing bond->color as in bond_class->color even when the default style was wired. That initialization should occur only when the default style is solid.
  • Found and removed a bug in the code handling the top,medium,bottom window flags: instead of -1,+1 we should have TRUE,FALSE.
  • Removed inconsistency in the code handling the top,medium,bottom window flags: F1,F2,F3 mechanisms are now disabled in fullcreen mode. This avoids tricky inconsistency in the flags controlling the top,medium,bottom menus and users don't really need this.
  • Found and removed a bug in the graphic engine, when rendering colored bonds: the PushMatrix-PopMatrix instructions were not properly nested.
  • Apparently we have a solid, clean, solution for the inconsistency in the Cell->Modify parameters.
  • Playing with GNU-arch: it looks quite nice. Somewhere down the road we should look forward to move GAMGI development to Gnu-Arch CVS.

What is next:

  • Improve GAMGI usability with gtk_events_pending, etc.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve documentation and website.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.21
5th December 2003
Added a mode to interactively move,rotate the observer. Before we could only interactively move,rotate the objects. Added Hexagonal axis for the Conventional Cell (Obverse orientation).

What is new:

  • Cleaned the code handling Gtk timers.
  • Added a timer for the messages shown at the Statusbar when the ruler is active.
  • The way we handle Cell parameters (and possibly Symmetry) in Cell->Modify is definitely broken. It should be not too difficult to fix and clean this.
  • Found and Fixed a bug: when doing Undo or Save, the selected object and layer were not updated.
  • For the Rhombohedric Lattice, added Hexagonal axis for the Conventional Cell (Obverse orientation), maintaining Rhombohedric axis for the Primitive Cell. The pattern occupancy rules are also working for the Conventional Rhombohedric cell.
  • Added a confirmation dialog before removing a Layer. The rationale is: all objects below layer can be recovered using the Undo mechanism, objects that cannot be recovered this way, Gamgi, Window, Layer, should have a confirmation dialog.
  • As a result of the travelling mode introduction, improved gamgi_gtk_layer_create, gamgi_gtk_layer_modify and gamgi_expat_object_import, to cope with the differences.
  • As a result of the travelling mode introduction, added an axis button in the tools menu and updated the tools menu code accordingly.
  • Added the travelling mode to Rotate,Move the observer rather than the objects. This required changing also the mode to Rotate,Move the objects because the view referential now can be anything and we still want Rotate,Move operations to be related to the observer referential, not the (fixed) laboratory referential (as before). The changes are valid for Rotate,Move operations executed by: 1) dragging the mouse; 2) pressing the mouse over the ruler. Absolute and Relative Rotate,Move applied by calling Object Modify windows remain the same: these values should always be refered to the (fixed) laboratory referential.
  • Added a statusbar message describing the current Rotate,Move,Scale values, when the ruler mode is active.
  • Cleaned gamgi_gtk_window_reset and gamgi_gtk_gamgi_reset.
  • Removed a minor bug in gamgi_text_modify: fonts were not modified, because the option_menu name changed and was not updated.
  • Removed a bug in the code exporting cell symmetry, that was due to a old, nou updated group initialization: (group = -1 instead of group = 0).
  • Redesigned the documentation structure in gamgi.org. In particular, interfaces and formats documentation are now well integrated. As the documentation paths changed (in both http://www.gamgi.org/ and ftp://ftp.gamgi.org/gamgi/), the paths in GAMGI code pointing to help documentation were changed accordingly. Older versions of Gamgi looking for remote Help information in gamgi.org will fail due to this path change.
  • Updated the projects.html page.
  • Added new screenshots, thanks Maura.
  • Removed a bug: the flag controlling <pre></pre> tags in Help files was not changing.

What is next:

  • Improve Point Symmetry Tolerance.
  • Improve GAMGI usability with gtk_events_pending, etc.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve documentation and website.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.20
8th November 2003
Implemented Atom->Config and cleaned code.

What is new:

  • Another round of clean-up in gamgi_gtk_cell_modify and gamgi_gtk_cell_create.
  • Updated the GML files in dat/light and dat/cell. All files in dat/ are supposed to be up-to-date now.
  • Found and removed a GUI bug in gamgi_gtk_cell_modify: before the three cell symmetry parameters were independent, so for example changing the system would keep the old group and an error was triggered if the system and the group were not compatible. Now the three parameters are coupled: when they are all empty, Gamgi uses the old (unmodified) values; otherwise Gamgi ignores the old three parameters and attempts to get the new symmetry using only the new parameters. Definitely this is the logical way to handle this.
  • Corrected a few mistake bugs in gamgi_expat_import_object and gamgi_expat_export_object: the required angle for monoclinic cells is now ac, and for rombohedric cells is now bc.
  • Corrected a few mistake bugs in gamgi_gtk_text_modify: option_menu_name is now option_menu_style and text contents was not properly reset.
  • Improved the code to check string size in gamgi_gtk_help.
  • Removed the size test from gamgi_io_token_create, as only gamgi_global_resources_help needs this; added gamgi_io_token_check_create to be used by gamgi_global_resources_help (with the size test).
  • Added tests for Help incompatible attributes in gamgi_gtk_help_config and gamgi_expat_import_config. Cleaned gamgi_gtk_help.
  • Wrote and tested code to export all the Help config data.
  • Updated gamgi_global_main.c and gamgi_global_resources: the color bits per pixel and the (GAMGI, BROWSER) environment variables are now checked in a much proper and elegant way.
  • Redesigned the way local,remote,browser Help paths are stored: now they are all allocated in dynamic memory. Adapted gamgi_global_resources, gamgi_gtk_help_config and gamgi_expat_import_config to the new method.
  • For the sake of simplicity, removed the following OpenGL types: GLfloat and GLubyte, replaced by float and unsigned char.
  • For the sake of simplicity, removed the following gamgi types: gamgi_long, gamgi_ulong and gamgi_uint, replaced by long, unsigned long and unsigned int.
  • Added ftp://ftp.gamgi.org/gamgi/ to the list of available remote help addresses: before, only http://www.gamgi.org/ was available. Currently this is not very usefull, because both http and ftp servers are in the same computer, but it is an important proof-of-concept for us.
  • For the sake of simplicity, replaced the following Gtk types: 1) gpointer by void *; 2) gint by int and gamgi_bool.
  • Completed all the functionality for the Atom->Config dialog.
  • Improved the tests for importing GML atom config data.
  • Cleaned the GAMGI_MATH_TOLERANCE parameters.
  • Fixed the Gtk layout for Atom->Config dialog.
  • Removed old size code in gamgi_engine_start.c and removed a bug in gamgi_mesa_draw.c and gamgi_mesa_scan.c: size is local in solid mode but is global in wired mode.
  • Cleaned the atomic charge code (everything depends now of GAMGI_CHEM_CHARGE_MAX, as it should).
  • Improved /dat/molecule/coordination and /dat/molecule/flavors.
  • Cleaned gamgi_engine.h, gamgi_gtk.h, gamgi_mesa.h, gamgi_math.h, gamgi_phys.h, gamgi_chem.h, gamgi_expat.h and gamgi_io.h (added parameters GAMGI_MATH_SIZE and GAMGI_MATH_VARIANCY).

What is next:

  • Improve Point Symmetry Tolerance.
  • Improve GAMGI usability with gtk_events_pending, etc.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve documentation and website.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.19
21th October 2003
Text objects can now be imported and exported. Completed the code to export config data. Improved Atom->Create and Atom->Modify dialogs.

What is new:

  • Wrote static_init for gamgi_gtk_text_modify, gamgi_gtk_bond_modify, gamgi_gtk_atom_modify and gamgi_gtk_cell_modify.
  • Completed the new Atom->Create and Atom->Modify dialogs, and corrected some bugs in the new Bond->Modify dialog.
  • Fixed the new layout for Atom->Create and Atom->Modify dialogs, that contains the new parameters Size and Variancy, that help to control the way atoms look in Solid style.
  • Fixed graphic engine for recursive text objects: scale, rotate and move now works well in all cases when a text object contains other text object which in turn contains other text object, etc. The mechanism is the same used before to link atoms to cells. This is definitely good news for our graphic engine.
  • In text objects, replaced tabs and newlines by spaces, so we have the same behaviour for text objects imported from (Gtk) dialogs and (Expat XML) files. Gtk dialogs preserve tabs and newlines but Expat replaces them by spaces, according to XML rules, as text contents is entered as an attribute value. Futurely we should add some meta characters to allow newlines and tabs in GAMGI text contents.
  • Added static_init and static_reset to gamgi_gtk_text_create.
  • Added code to export text objects, including all the text parameters currently recognized.
  • Added code to import text objects, including all the text parameters currently recognized.
  • Changed the line width for wired Text objects to the value recommended in the GNU Plotutils package (1.48).
  • Added Darmstadtium (Z=110) to the list of recognized atomic elements.
  • Cleaned gamgi_gtk_text_modify and gamgi_gtk_bond_modify: removed redundant char * pointers.
  • Added automatic bond length detection to gamgi_gtk_bond_config (exactly as in gamgi_gtk_bond_ccreate).
  • Cleaned gamgi_gtk_bond_create, gamgi_gtk_layer_create and gamgi_gtk_light_modify: added static_init functions.
  • Removed the following types: gamgi_char (i.e. char), gamgi_uchar (i.e. unsigned char), gamgi_void (i.e. void *), gamgi_short (i.e. short) and gamgi_ushort (i.e. unsigned short). There is no real point in using these types and it makes thinks less clear for the unitiated... ;-)
  • Improved layout for Text->Create and Text->Modify dialogs.
  • Added code to export local (specific for each atomic element pair) non-default bond config data.This completes the export config code.
  • Added code to export local (specific for each atomic element) non-default atom config data.

What is next:

  • Improve Point Symmetry Tolerance.
  • Improve GAMGI usability with gtk_events_pending, etc.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Implement dynamic Text functionality.
  • Improve Manuals documentation.
  • Improve Formats documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.18
7th October 2003
Implemented Bond->Config and redesigned Bond->Create and Bond->Modify dialogs.

What is new:

  • Separated widget creation from data presentation in gamgi_gtk_layer_config, gamgi_gtk_help_config and gamgi_gtk_gamgi_config.
  • Separated widget creation from data presentation in gamgi_gtk_bond_config by adding static_init. We are going to implement this criterium in all other dialogs.
  • Completed the new Bond->Modify dialog.
  • Removed redundant char pointers from gamgi_gtk_cell_modify and gamgi_gtk_layer_modify.
  • In the file style.css that describes www.gamgi.org, replaced "text-indent: 20%;" (which is not recognized by IE, resulting in a empty page) by "text-indent: 35px;" which works fine with both Mozilla and IE.
  • The Bond->Config dialog is implemented and tested.
  • Fixed the Gtk layout for Bond->Config, which includes all the view parameters for Bonds (except scale: the default should always be 1.0, as for all other objects).
  • Fixed the new Gtk layout for Bond->Modify, which includes all the view parameters for Bonds.
  • Started playing with arch, the new control revision system.
  • Compiled and installed Mailman. Created the lists: mailman (just for administrative purposes), users and coders. We just need to add the old texts and email addresses before we are up and running, as before, but this time in full control (as far as you are in full control on IT these days...)!
  • Completed the new Bond->Create dialog and cleaned the code creating bonds.
  • Moved gamgi.org to Instituto Superior Técnico, Lisboa.
  • Fixed the new Gtk layout for Bond->Create, which includes all the view parameters for Bonds.
  • When the selected object is Gamgi or Window, removed the code to scale,move,rotate the current layer, introduced weeks ago. This allows users to specificaly select those objects to prevent unwanted rotations,moves,scales. As the current object is now permanently shown in the statusbar, users can immeadiately see if they are selecting Window or Gamgi by mistake.
  • The window->focus object and window->layer objects are now indicated in the statusbar (first on red, then on the default color).
  • The website download section now supports FTP also.
  • Created mechanisms to show,update,reset window->focus object and window->layer layer in each window statusbar, to increase usability. When objects are selected, these mechanisms are already working. They are not implemented yet when objects are created,modified,removed though.
  • To increase usability, added the following characters "()[]{}<>+-." to the list of allowed characters in object names. This is useful for example in coordination compounds, and planes, directions as well.

What is next:

  • Improve Point Symmetry Tolerance.
  • Improve GAMGI usability with gtk_events_pending, etc.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Implement dynamic Text functionality.
  • Improve Manuals documentation.
  • Improve Formats documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.17
10th September 2003
Added Gamgi->Config and Layer->Config dialogs. Added new styles to represent Atoms and Bonds.

What is new:

  • Added color,red,green,blue parameters to expat functions that export bond object,config data.
  • Added color,red,green,blue parameters to expat functions that import bond object,config data.
  • Added size,variancy parameters to atom,bond objects in import,export expat functions.
  • Added the global parameters to gamgi->atom,gamgi->bond in export expat functions.
  • Removed gamgi->window->x, gamgi->window->y, gamgi->window->width, and gamgi->window->height: users don't really want to configure these parameters.
  • Added a new style to represent bonds, where these have their own color, exactly as in plastic models.
  • Solved the text color and alignment issues, in GtkStatusBar: This allows our statusbar messages to be much more friendly.
  • Added variancy,size parameters for atoms and bond size parameters for bonds. Previously these parameters were defined globally only. This means that now we can have very different atom, bond styles in the same space: layer, cell, cluster, molecule, group, etc.
  • Cleaned the code handling the layer perspective parameters.
  • Cleaned the code handling the layer modelview parameters.
  • Added and tested the Gamgi->Config dialog.
  • Removed negative color components in lights: users don't need this and is confusing.
  • Added and tested the Layer->Config dialog.
  • Removed a bug in the gamgi_gtk_key.c keystroke handling code and cleaned the code.

What is next:

  • Improve Point Symmetry Tolerance.
  • Improve GAMGI usability with gtk_events_pending, etc.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Implement dynamic Text functionality.
  • Improve Manuals documentation.
  • Improve Formats documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.16
2nd September 2003
Essentially a cleaning release.

What is new:

  • Elements without config parameters now give an error when imported with any config parameters (instead of being silently ignored, as before).
  • Added a tolerance (GAMGI_MATH_TOLERANCE) in all floating point comparisons that occur in gamgi_expat_export_object.c and gamgi_expat_export_config.c.
  • Removed gamgi->gamgi->font: users don't really want to configure these parameters.
  • Removed gamgi->layer->axis, gamgi->layer->visibility_in, gamgi->layer->visibility_in, gamgi->layer->[red,gree,blue]: users don't really want to configure these parameters.
  • Removed gamgi->cell->red, gamgi->cell->red, gamgi->cell->red: users don't really want to configure these parameters.
  • Removed gamgi->light->ambient_[rgb], gamgi->light->diffuse_[rgb], gamgi->light->specular_[rgb]: users don't really want to configure these parameters.
  • Added code to export all the gamgi->layer config parameters.
  • Replaced GAMGI_MATH_ZERO_OFFSET by GAMGI_MATH_TOLERANCE, GAMGI_MATH_LENGTH_TOLERANCE, GAMGI_MATH_ANGLE_TOLERANCE and GAMGI_MATH_CELL_TOLERANCE.
  • Removed gamgi->window->top, gamgi->window->medium, gamgi->window->bottom: users don't really want to configure these parameters.
  • Added code to export all the gamgi->gamgi config parameters.
  • Removed gamgi->gamgi->color, gamgi->gamgi->order, gamgi->gamgi->scale and gamgi->gamgi->attenuation: users don't really want to configure these parameters.
  • Removed a few usability glitches: window origin and size are now exported, text_create dialogs are not automatically removed, conventional volume is now the cells default.
  • Improved www.gamgi.org and changed the style to (IBM) blue colors.
  • Cleaned the tools menu and hruler code, and moved it from gamgi_gtk_bottom.c to gamgi_gtk_window.c (former gamgi_gtk_window.c).
  • The code collecting global resources is now reunited in a single file, gamgi_global_resources. Previously this code was in gamgi_global_main, gamgi_global_start and gamgi_mesa_resources.
  • Improved the usability of the rotate,scale,move tool buttons: added an active (red) color when the button is active and removed the noisy beep when the button is selected.
  • Cleaned the file writing code, so now there is only one fprintf function and only one error checking function, when writing to disk. For example .xml and .ps files are now handled by the same functions.
  • Added File->Config in Window top menu and Help topic menu.
  • Removed the Scope code (container, contents,etc.) in the dialogs to remove objects, until we write this stuff, which at the moment can only confuse users.

What is next:

  • Improve Point Symmetry Tolerance.
  • Improve GAMGI usability with gtk_events_pending, etc.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Implement dynamic Text functionality.
  • Improve Manuals documentation.
  • Improve Formats documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.15
22th August 2003
Solved two OpenGL issues (half-bonds and partial transparency), cleaned the XML (GML) object exporting code and added all the required infra-structure to export XML (GML) config data.

What is new:

  • Added the infra-structure required to export XML/GML config data. The code is simple and elegant, thus easy to maintain. Now we just have to add all the config parameters... ;-)
  • Redesigned the code that exports XML/GML object data. The code is much more elegant now, output writing errors can now be properly checked, element smart closing is now working for all elements (even gml), and the layout is now properly established to soon start writing config data.
  • Found and removed a bug in gamgi_expat_export.c: bonds were never printed out when the object with focus was Gamgi, due to the scope searched when bond parent is determined.
  • Added layer parameters visibility_in, visibility_out to gamgi_expat_import_object, gamgi_expat_import_config and gamgi_expat_export_object.
  • Solved the problem of partial layer visibility, replacing Fog by Blending OpenGL funcionality. It does exactly what we want and is much faster, because it does not depend of the objects depth (as Fog) and is done only once, after all translucid layers have been rendered (with Fog it was done for each translucid layer). As a side-effect, now translucid layers are represented first and then the transparent layers (and finally the current layer, as before). This is essentially required by the blending mechanism, and it makes sense, as transparent layers should have priority over translucid layers.
  • Solved the problem of less-than-perfect half-bond rendering due to floating point innacuracies and the way OpenGL handles lines. This was probably our top bug now, because it seriously compromised the quality of bond representations, both wired and solid.

What is next:

  • Improve Point Symmetry Tolerance.
  • Improve GAMGI usability with gtk_events_pending, etc.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Implement dynamic Text functionality.
  • Improve Manuals documentation.
  • Improve Formats documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.14
13th August 2003
Added about 250 new structures to $GAMGI/dat/molecule/. Added the first config dialog: Help->Config. Corrected several bugs.

What is new:

  • Added automatically a slash "/" for both local and remote pathnames, as a / too much is ok, a / too little is ko.
  • Found and removed a little bug with symlinks for Help->Search: when using Local+Browser, that resulted in browsers not finding the CSS style, because the real and linked files were at different directory depths. Changed keywords/ to users/keywords/, so both files have now the same depth.
  • Updated Help->Config on GML files, so now users can configure directly on its default GML file the documentation source, the documentation agent and their pathnames.
  • Added Help->Config, so now users can configure on-the-fly the documentation source, the documentation agent and their pathnames.
  • Simplified the whole window model: now task0, help0 and config dialogs are exactly the same. gamgi->help0 is handled by window->task0, gamgi->help1 is replaced by window->help. For final users, there are now task0, task1 (non-modal, fixed, local) help (non-modal non-fixed, local), and question, message (modal, fixed, global) dialogs.
  • Added more structures to the $GAMGI/dat/molecule/fullerenes directory.
  • Replaced gamgi_gtk_help_text (used locally and also in gamgi_gtk_help_start) and static_text (used in gamgi_gtk_molecule_measure) by a single function, gamgi_gtk_dialog_text_create.
  • Added Config topics to Help->Topic tree.
  • Removed Config options for width, height in Help and other GtkText widgets: we don't really need this.
  • Improved window menus: 1) now menuitems are aligned some space from left; 2) options not available yet changed to grey; 3) added menuitems for Config, at the very end, after separators, to emphasize that this is different.
  • Sent messages to people maintainig structural databases, asking if they are happy we use their data to create our GML files.
  • Added bonds to the fullerenes structures, in the $GAMGI/dat/molecule/fullerenes directory.
  • Added more molecules to the sugars directory, from the Glactone's CD-ROM of PDB Files.
  • Added a new directory $GAMGI/dat/molecule/flavors, containing molecules producing flavors and fragrances, from the Glactone's CD-ROM of PDB Files.
  • Added a new directory $GAMGI/dat/molecule/silicates, containing silicate clusters that I studied during my PhD.
  • Added a new directory $GAMGI/dat/molecule/hydrocarbons, containing hydrocarbons from the Mathmol molecular library.
  • In Group->Modify, when torsion is set to 0, sometimes the atom seems to disappear. Actually this is not a bug. What happens is, for some specific angles (typically this happens for CH3 methyl groups with tetrahedral angles), after modifying the atom coordinates, the new atom position becomes exactly the same as for some other atom around, so both atoms occupy the same visual point and it looks as if the modified atom had disappeared, which is definitely not the case. This is not really a bug, it is the correct procedure, the solution is just to press Undo and next time to choose better the atom sequence to define the torsion angle.
  • Added a new directory $GAMGI/dat/molecule/photosynthesis, containing molecules from Mathmol molecular library that participating in photosynthesis.
  • Changed default colors for N, P, Na, Cl and S. Esentially these are the usual CPK colors, with minor modifications.
  • Added a new directory $GAMGI/dat/molecule/sugars, containing the sugars in the Mathmol molecular library.
  • Eventually I made my mind about colors for elements in the periodoc table of elements: we will define colors one by one, according to the properties of the elements, according to the CPK model, and making sure that each element has a different color.
  • Added a new directory $GAMGI/dat/molecule/lipids, containing the lipids in the Mathmol molecular library.
  • Found and removed a bug in the bond creating bonds: Both atoms must be marked in the first scan, otherwise bonded atoms might be marked too late, the ids are not written to output and bonds parent ids are wrong.
  • Found and removed a little bug on the XML exporting code: default atom type and mass are printed for isolated atoms. There are actually two problems here, the mass and type bugs are unrelated. The mass bug was removed in a satistactory way, by decreasing the default masses to 4 decimal figures only, so default masses for atoms created on GAMGI and from GML files are the same. This consistency will go away, however, if users decrease the decimal figures used to represent mass, as default masses created from GAMGI will have less significant numbers than masses created from GML files, so they will be different and will be printed by default in output files. The type bug was removed by requiring always a non-empty type, and setting the same default for both GUI and GML IO mechanisms.
  • Added a new directory $GAMGI/dat/molecule/drugs, containing most common drugs, from different sources.
  • Added a new directory $GAMGI/dat/molecule/nanotube, containing Armchair (n,n) and Zigzag (n,0) nanotubes.
  • Converted the aminoacids section of Mathmol to GML: the 20 proteic amonoacids that form the building blocks of life are now in $GAMGI/dat/molecule/life.
  • Added another group of structures to $GAMGI/dat/molecule/symmetry, created by Tullio Pilati, Alessandra Forni, to test the program Symmol, plus P.Seiler, J.D.Dunitz and Rudolf Hundt.
  • It seems the gtk bug on file_selection only happens with the gtk library compiled in Suse 8.1, probably due to the choice of compiling flags they used to build it. When downloading Gtk directly from www.gtk.org and compilling it myself, the problem disapears.

What is next:

  • Improve Point Symmetry Tolerance.
  • Improve GAMGI usability with gtk_events_pending, etc.
  • Rewrite the entire bond drwaing code.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Implement dynamic Text functionality.
  • Improve Manuals documentation.
  • Improve Formats documentation.
  • Review the entire GAMGI code, file by file.
GAMGI 0.09.13
31th July 2003
This version completes work that we have been developing in the previous releases: point group determination, system/lattice/group cell symmetry. Counting down to GAMGI 0.10.

What is new:

  • Found and removed a bug in the code exporting cells, (introduced in version 0.09.7): the origin position was never printed out, because cell->points is now constant, after we changed the way cells are rotated and moved.
  • The new system/lattice/group way of handling cell symmetry is now implemented in GAMGI XML importing and exporting code. This also means that all the cell files in $GAMGI/dat must be changed to the new format.
  • Implemented a color periodic table, where colors are a function of atomic numbers only. Chemical usability might not be optimal though, needs improvements.
  • Found a bug in Gtk1.2.10,in gtk_file_selection, that shows up in File->Import: after double-clicking several times, a gtk warning is shown about gtk_object_set_data with unknown object. Fortunately not a critical bug.
  • Found and removed a bug: conventional axes were mistakenly used when building spherical and rhombus cell volumes, instead of primitive axes as it should: corrected.
  • Moved the Monoclinic crystallographic system from the second-setting (c unique axis) to the first-setting (b-unique axis). The advantage of this change is that the Monoclinic base-centered lattice can now be defined as C-centered, exactly as the Orthorhombic base-centered lattice. Therefore all base-centered lattices are now handled in GAMGI as C-based, with considerable advantages for everyone. Unfortunately, The International Tables of Crystallography and most crystallographic sources handle Orthorhombic space groups 38-41 as A-centered, so for these 4 space groups we use a different setting to transform them in C-centered space groups, as can be seen in the list of space groups produced by Cell->Create or Cell->Modify (the exact procedure is described in International Tables of Crystallography). This implies to permut cell parameters and atom coordinates according to the transformation (a,b,c)->(b,c.a), relatively to the values printed in International Tables of Crystallography. Fortunately this only happens for these 4 space groups, out of 230. Moreover, these 4 space groups are not very common in Nature.
  • Added 0 for space groups, as a way to reset previous group information in Cell->Modify. In Cell->Create, empty and 0 mean the same (unknown group). In Cell->Modify, empty means keep current group information, 0 means set group to 0 (unknown).
  • Cleaned the mechanism to select Gamgi, Window and Layer using a double click (before, Status bar was not updated and the beep sound was not activated, in this special case).
  • Moreover, in name of simplicity, removed the parent(s) identification in the Status bar message, when an object is selected.
  • Improved the usability when Gamgi or Window is selected: now Gamgi checks if the object with focus is Gamgi or Window, and when it is, GAMGI automatically uses the current layer to rotate, translate and scale (either with the mouse or using the ruler).
  • Added test files for all point groups of symmetry, in Gamgi XML format (copied from Serguei Patchkovskii's symmetry code).
  • Cleaned the reporting section of the point symmetry code.
  • Molecule->Measure can now be used to determine the chemical point group of symmetry. We need to fine tune the various tolerances used to determine the symmetry elements though.
  • Added a function with a variable argument list, to insert text in GtkText with printf variable formats. Used this function to clean Help->Start and Molecule->Measure.
  • Moved the color settings for showing information, from gamgi->help to gamgi->gamgi, as they are going to be used throughout GAMGI, not just in the Help section.
  • Removed the configuration options for width_min, height_min, both for top windows and help windows. This information should not be configurable, really. Of course it can still be changed at compile time.

What is next:

  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Convert the EXAMPLE symmetry files of Symmol to GAMGI GML native format.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Implement dynamic Text functionality.
  • Improve Manuals documentation.
  • Improve Formats documentation.
GAMGI 0.09.12
21th July 2003
Introduced crystallographic space groups of symmetry in GAMGI. This is mostly a working release, several things are not properly tested or are in development (the change Monoclinic B->C, for example).

What is new:

  • Improved and cleaned the Systems/Lattices/Groups interface in Cell->Create and Cell->Modify.
  • Started the process of improving the way we handle Monoclinic base-centered lattices (change from B-centerd to C-centered) and Rombohedric lattices (add conventional hexagonal axes, obverse orientation, and modify the orientation of the primitive, rombohedral, cell, to make both conveniently compatible).
  • Automatic sensitive/insensitive mechanisms to handle valid/invalid lattice parameters are now fully working, including systems, lattices and space groups.
  • Cleaned names for functions and arrays regarding cell crystal and text font code.
  • Changed the order of the angles defining lattice parameters, so below each a,b,c axis is now the corresponding alpha, beta, gamma angle, as usually defined in Crystalography.
  • Merged the Systems/Lattices/Groups interface with Cell->Create and Cell->Modify.
  • Removed a couple of bugs in the "static_changed" routines of the Cell crystal interface.
  • Completed the interface that will be used in Cell->Create and Cell->Modify to handle simultaneously systems, lattices and space groups.
  • Clarified the issue of handling point group symmetry, considering all symmetry operations (chemical groups) and considering only operations compatible with translation symmetry (crystallographic groups).
  • We are going to implement conventional cells for rombohedric lattices using obverse hexagonal axes.
  • We are going to change centered monoclinic lattices from the first setting (B-centered) to the second setting setting (C-centered), so all base-centered lattices are C-based (and not B- or A-based).
  • We are going to change the order of the crystal angle parameters, so each angle will appear immediately below the corresponding normal axis (i.e. bc below a, ac below b and ab below c).

What is next:

  • Improve the code determining point group symmetry.
  • Complete basic Help documentation.
  • Implement dynamic Text functionality.
  • Add Help configuration from XML files.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Convert to XML Gamgi format the files describing all the point symmetry groups with rotation order not larger than 8.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.11
5th July 2003
Merged the point symmetry code (though it is not usable yet) and added Help->Start. This is mostly a working release.

What is new:

  • Added xyz files describing all point symmetry groups with rotation order not larger than 8 to $GAMGI/data/molecule/symmetry.
  • Minor updates in copyrights and people attributions.
  • Ported the point symmetry code to GAMGI. Made a brief test, it seems to be working, but is not usable yet.
  • Improved minor aspects in the point symmetry code, regarding D0h, C0v and Kh groups (with infinite rotation axes).
  • There is a free code to determine all the elements of symmetry in space groups, written by J. Luis Martins, that we can adapt to run in Gamgi. This includes lattice and point operations, plus screw rotations and glides. Definitely good news!
  • We have now a good solution to handle space groups in Gamgi and use this information to create cristal structures.
  • The point symmetry code now calculates all the symmetry operations, for all groups.
  • Cleaned the optimization section of the point symmetry code.
  • Found and removed a bug in the code to link Wigner_Seitz cells: the closer node is not necessarily one of the eight vertices of the primitive cell that contains the object, it can be the vertex of an adjacent primitive cell (in fact this problem should occur only for triclinic, monoclinic and trigonal lattices, exactly the lattices where we are not calculating WS cells yet).
  • More cleaning work in the point symmetry code.
  • Started working on the point crystallographic groups: we can now convert about half of the chemical group cases to its corresponding crystallographic groups.
  • After finding the chemical group, an exaustive set of tests is now applied (for any rotation order) to ensure that the symmetry elements found are consistent with the group.
  • The rotation order limitation is gone. Now we can have chemical groups with any rotation order (D237d, C128v...).
  • The string comparison to get the group is gone. Now we have a proper algorithm to get all the chemical groups.
  • Point symmetry code: removed all the memleaks; clarified some points, thanks to Serguei.
  • Found another code to determine pont group symmetry, very similar in its goals (but with totally different algorithms) to SYMMETRY: SYMMOL.
  • Point symmetry code: updated the macros, cleaned again the whole thing. We need to remove memleaks and understand the optimization code; after that we need to implement a generic algorithm to get the point group, this way removing all the current dependencies on rotation order. After that, we can start thinking about porting it to GAMGI!
  • More progress on the point symmetry code: i) we have now a global understanding of the code; ii) after cleaning the code, it runs 10% faster; iii) the global variables are gone; iv) the set of tests now includes all the groups that the code can currently detect; v) we are working on the algorithm to get the point group, to replace the current string comparison, this way allowing us to obtain chemical groups with higher, unlimited, rotation axes.
  • The point symmetry code to find the improper rotation axes is essentially understood.
  • Added Help Start, minor refinements in the help documentation and organization, added a slash internally to the path of the GAMGI environment variable, because a slash too little is bad but a slash too much is ok.
  • More progress regarding point symmetry code: the code to find the proper rotation axes is understood (infinite, two-fold and higher order axis, without limit).
  • Point symmetry code: the reporting functions are under control.
  • Added functionality to change all the Help configuration data from GML (XML) files, including control data (local, browser), color data (background, foreground, title, bold, link) and geometry data (width, height, width_min, height_min).
  • Improved Help Tutorial.
  • Good progress on the point symmetry code: inversion and reflection are mostly under control.

What is next:

  • Improve the code determining point group symmetry.
  • Complete basic Help documentation.
  • Implement dynamic Text functionality.
  • Add Help configuration from XML files.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Convert to XML Gamgi format the files describing all the point symmetry groups with rotation order not larger than 8.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.10
23th May 2003
This release completes the basic Help infra-structure in GAMGI: Help->Current, Help->Topic, Help->Search and Help->Tutorial are all working fine, happilly reading the XHTML files (Help->Start will be added soon).

What is new:

  • Updated the Help documentation.
  • Cleaned the Current, Topic, Search and Tutorial Help options.
  • Current, Topic, Search and Tutorial Helps are now working fine with XHTML files, with local and remote data, with gamgi and browser agent.
  • Added proper space handling to documentation Help dialogs. Ascii characters with accents (essentially representing ISO-8859-1 character set) are accepted. Special symbols, that start with an ampersand, are handled automatically.
  • Removed a bug in gamgi_expat_import.c: on line of code that was impossible to be executed but potentially damaging because it was a potential source of confusion (and it would crash GAMGI if one day we changed the logic and the test would start to be executed).
  • Added fonts and colors to documentation Help dialogs.
  • Working on the code to determine the point group of symmetry of atomic structures, written by Serguei Patchkovskii. Currently the code uses brute force algorithms, and can determine all point groups of symmetry, as long as there are no proper axes with order bigger than 8, and improper axes with order bigger than 10. Good progress ;-).
  • Replaced "black" color by NULL on top window buttons and menu_items, so theme colors will work fine now. However, highlight "red" color on Help, Remove, Close, etc. buttons and menu_items is still enforced, to emphasize these labels.
  • Renewed this domain name gamgi.org, with domainsnext.com, until 2005 September 12th.
  • Merged all the code using gdk_color in a single set of functions, defined in gamgi_gtk_dialog.c.

What is next:

  • Keep working on the code determining point group symmetry.
  • Implement Help->Start (hard-coded in GAMGI).
  • Complete basic Help documentation.
  • Implement dynamic Text functionality.
  • Add Help configuration from XML files.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.9
9th May 2003
This is the first release that gracefully handles XHTML Help files, an important step for GAMGI Documentation.

What is new:

  • Set default and minimum dimensions for Help documentation windows.
  • The new code to handle Help files, allowing users 4 options, using local or remote (HTTP) documentation and using GAMGI or a browser as the retrieving agent, is now working, for Help->Current, Help->Topic, Help->Search and Help->Tutorial, (for Help->Tutorial there is still a little path problem to solve).
  • GAMGI is now handling XHTML Help files, an important step in achieving a good documentation infra-structure for GAMGI.
  • Moved the expat errors from expat/ to io/, as a first step to implement a unified error handling procedure.
  • Changed the "Progress" menu item to a "Demo" menu item with a submenu with a menu item "Progress" (this is just tested and proved code).
  • Removed the "Control" menu item, as we are going to do this differently anyway (directly on each object menu).
  • The Help Search menus are working again (still as xhtml red as txt).
  • Save current layer in history before importing GML files, so users can undo it later on: done.
  • Rewrote the code that recursively stores GML file names. It is much simpler and easier to maintain now, and seems to work just fine.
  • The merge of the GML and XHTML code trees is now completed. Cleaned the whole import expat code, which now looks elegant and simple to maintain.
  • The merge of the codes handling GML and XHTML error messages is now completed.
  • Removed a double bug in the Expat code reading XML window size.
  • Minor website improvements: improved <img> tags and added <a> tags, updated status of Mesa bugs, added a section regarding WM environment, in the install documentation chapter.
  • The basic machinery to handle Help XHTML files is now in place.
  • Moved the error routines out of gamgi_expat_import.c, in preparation to handle Help XML files with the same code base.
  • Corrected end of gamgi_expat_import_config and gamgi_expat_import_data.
  • Improved static_import and static_file in gamgi_expat_import.c and static_parse in gamgi_io_file.c, so: 1) All files (including XML files defined internally) are now routed through the same routines and parsed in the same way; 2) The length of filename and fullname (including protocol, hostname, pathname and filename) are now safely checked, for all files, in a single place.
  • The fullscreen code was left commented by mistake. Corrected.

What is next:

  • Reunite all code handling gtk colors in a single place.
  • Improve Help colors, fonts, formats, etc., when GAMGI is the agent (instead of an external browser).
  • Fix the code to handle Help->Tutorial.
  • Start implementing point group symmetry.
  • Improve Text functionality.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.8
18th April 2003
GAMGI is now importing files from FTP connections and exporting rasterized color Postscript files. All the code handling files has been cleaned and reunited in the file gamgi_io_file.c.

What is new:

  • GAMGI is now importing files also from FTP connections, using automatic anonymous login, exactly as browsers do.
  • Improved the HTTP code and removed two bugs on it: 1) HTTP connections with long headers would be rejected; 2) everything before the first "<" character would be ignored, instead of flagged as an XML error.
  • Web site improvements: 1) links look better; 2) fonts look better; 3) added links to HTTP and FTP resources.
  • Reorganized the code that actually reads and parses XML files, so now this is done by a single routine, which doesn't know if the data comes from a local file or from HTTP or FTP connections.
  • Improved the ftp client code, which now looks solid and ready for production.
  • I think we have a winner design to the problem of handling automatic text objects (to automatically measure lengths, angles, dihedrals, etc...): for each automatic measurement, the common atom parent must own the master text object and each atom must own a slave text object. This should work fine both with online and XML file descriptions (using ids to link the text objects).
  • Cleaned gamgi_mesa_gl_area.*, gamgi_mesa_pick.*, and gamgi_file_io.* (which now contains the ps code) and removed the files gamgi_io_file_ps.*. Integrating the ftp client code should be quite easy now.
  • Removed a long time bug in the filename parsing code.
  • GAMGI is now exporting color encapsulated postscript files, (that Ghostview and Gimp can read) of the rasterized drawing areas (vectorial representations are still far away), using the free code that Mark Kilgard wrote for the OpenGL green book.
  • We have decided how to implement the interface for configuration data: clicking on the top menu labels with the right button.This is simple, elegant and technically it is easy to implement and maintain.
  • Started collecting all functions that open, read and close files (including shell and dialog parsing) in a single file gamgi_io_file.c. This is in preparation for the ftp client and also to prepare important improvements in the help mechanisms suppoted by GAMGI.
  • Inverted the vector direction in directional lights, so it has the same physical meaning in directional and positional lights, always pointing from the light source to the light destination.
  • The FTP client code is now working fine, with the PASV mode (the most modern). This means that soon it will be possible to fetch XML GAMGI files using the FTP protocol. GAMGI already supports HTTP 1.0 and HTTP 1.1 (the most modern) protocols.
  • Added a tutorial on directional, positional and spot lights.
  • Found and removed a bug in the light code: when rotating a light (direction) with the mouse, it was working fine for directional but not for spot lights, because OpenGL handles these lights differently.
  • Removed the old files that imported/exported xyz simple files.

What is next:

  • Start implementing point group symmetry.
  • Improve Text functionality.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.7
26th March 2003
Major changes in the graphic engine handling cell and text objects. Code to read local and HTTP files is now much more robust.

What is new:

  • Layers are now scaling to layer->center, instead of (0,0,0) as before
  • Changed completely the way cell coordinates are handled: before we were centering and rotating and moving the whole bunch of coordinates, now we are updating only the origin, the center, and a rotation quaternion. As a result: 1) handling large cells should be noticeably faster; 2) floating point degradation is totally avoided. Lots of things had to be changed to achieve this but the code looks pretty solid at the moment.
  • Found and removed a bug in the HTTP code: in HTTP connections, the block size can be smaller than requested, depending of the net connection. We went through all the HTTP code, and thanks to the expert advice on the Expat mailling list, this code is now fully working, looks really solid, and is much simpler and elegant than before.
  • We did good progress in the FTP client for GAMGI.
  • The functions calculating the center, for each kind of object, are now reunited in a single file: gamgi_mesa_center_out.c.
  • Text objects are now scaled, rotated and translated exactly as Cell objects.
  • Handling termination in local XML files is more solid now.
  • Found a floating point precision bug in the code showing bonds: actually this is a Mesa5.0 bug, Brian said this bug was already removed and next release Mesa5.0.1 will be fine.
  • Updated to latest Expat release: Expat1.95.6
  • Updated this trusted computer to Suse Linux 8.1.
  • Gamgi is now running on SGI Irix, with four R12000 Processors.
  • Cleaned the code used to handle Text objects.

What is next:

  • Start implementing point group symmetry.
  • Improve Text functionality.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.6
3rd March 2003
Text Modify has been implemented, Cell Link for Hexagonal Cells is more solid, several other important bugs have been removed.

What is new:

  • Decided to change again the way of scaling objects.
  • Text Modify is now fully working, including orientation (Euler angles, etc.).
  • The origin in Cell Create can now be indicated by pointing directly with the mouse, as happens already with Texts and Atoms.
  • Gamgi loaded 290,000 atoms in about 50 sec, in a Pentium II 400MHz based machine.
  • Implemented conversion from rotation matrix to quaternion, and from rotation matrix to Euler angles. These operations are required to handle text and other objects, and complete the set of rotation transformations that we will ever need in GAMGI.
  • Found and removed a bug in the matrix->quaternion code (equations in the book Games Programming Gems were incorrect...).
  • Solved a long standing mistery related with quaternions and the corresponding transformation matrix, as they were implemented in GAMGI (taken from GtkGLArea and the green book): three mathematical bugs combined gave the right answer. Very difficult to spot, because it worked (with a few workarounds, for consistency with other rotations techniques), and correcting one or two bugs would break the whole thing, only correcting all the three bugs at once (in different sections of the code...) things started working again...
  • Improved CSS and XHTML page alignment in the website: it should work essentially fine now for most browsers, old and new...
  • How to convert a rotation matrix to a quaternion is a solved issue (we need this to modify text and other objects).
  • Reunited all mathematical functions dealing with Euler angles and quaternions in files math_euler.* and math_quaternion.*
  • Found and removed two bugs related with Cell Link of Hexagonal cells: the >if< logic was broken.
  • Found and removed a bug related with Cell Modify of Hexagonal Conventional cells: the nodes were not translated in the end.
  • Web site improvments, including tutorials on CCC, CFC and HC interstices.
  • Started looking into Patchkovskii's symmetry code to determine point group symmetry.
  • Found and corrected a bug in the axis code (axis status was not mesa_started or engine_copied, resulting sometimes in unwanted axis).

What is next:

  • Start implementing point group symmetry.
  • Improve Text functionality.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.5
12th February 2003
Improved the font data formats and text handling. Corrected several minor problems.

What is new:

  • Improved the ref/unref mechanism to control which fonts must be in memory at a given time.
  • Found amd removed a bug when writing beam lights (the angle parameter was missing).
  • Removed the light material parameters, as they are not currently used.
  • Found and removed a potential bug when creating a light from a file. Cleaned the code initializing colors in lights and layers.
  • Implemented the layer XYZ axis functionality.
  • Implemented in and out partial visibility, using Fog: objects in partially visible layers, merge with the background.
  • Found and removed a bug in the text scaling code: text was scaling around the center, not around the origin.
  • Found and removed a bug in the cell rendering code (it was introduced on purpose, for testing, somewhere around gamgi 0.08.28, and later we forgot to remove it).
  • Found and removed a bug in the layer switching mode (the gl_area was not updated after changing layers).
  • Found and removed a bug in the code that adds quaternions.
  • Removed the arrays for Hershey fonts that are redundant in the 32-126 ASCII range.
  • Removed the y-coordinate for each character translation, which was always 0.0.
  • Each individual stroked font is now compiled only when there is at least one text object using it, and is removed immediately when it is not being used anymore. Previously all fonts were compiled at launch time and removed only in the end.
  • Cleaned the whole font format and removed the lines arrays, which were used to drive the font drawing.

What is next:

  • Start implementing point group symmetry.
  • Improve Text functionality.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.4
3th February 2003
Added Hershey stroked fonts, for text objects. This is just a working release, to save data, not a general purpose version.

What is new:

  • Implemented the following Hershey stroked fonts (from char 32 to 126): Sans, Sans_Bold, Sans_Symbol, Serif, Serif_Bold, Serif_Symbol, Serif_Symbol_Bold, Script, Script_Bold, Gothic_English, Gothic_German, Gothic_Italian
  • Improved the font handling architecture, in particular, data coming from different sources is now stored in different files.
  • We should change the font data format, from float to byte, to decrease memory usage. We should also decrease the size of the font files, to decrease disk usage. More importantly, we need to compile fonts only on demand, removing the fonts when they are not used anymore. This can be done using references, and OpenGL generate lists facilities.

What is next:

  • Start implementing point group symmetry.
  • Improve Text functionality.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.3
28th January 2003
Improvements on Text objects.

What is new:

  • Clarified a problem of consistency between two rotating functions.
  • Cleaned Links, Projects and Install html pages.
  • Defined style for html pages in Formats documentation.
  • Added Formats documentation for Gamgi configuration.
  • Wrote Formats documentation for Window, Layer, Atom and Bond configuration (not available yet).
  • Text objects are moving, scaling and rotating.
  • The global model to rotate texts is working well, even when texts and cells (where the model is different) are rotating simultaneously. This is good news, because it means that texts will be fast and we don't need to rely on plan B ;-)
  • Hershey fonts are already included in the source code, although they are not implemented yet. The encoding mechanism is fully understood though, which means that it should not be difficult to implement them (just boring...).
  • A second version of the Text Create task dialog is implemented, allowing users to control almost all the relevant parameters, and choosing the position directly with the mouse.
  • A first version of the Text Modify task dialog is already reading input but still not changing it.
  • Minor cleanups in the mesa_center_* code.
  • Minor cleanups in gtk_dialog.c and gtk_atom_modify.c code.

What is next:

  • Start implementing point group symmetry.
  • Improve Text functionality.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.2
18th January 2003
Roman and Mono_Roman stroked fonts (from Sun) are implemented, marking the oficial beginning of text objects in GAMGI.

What is new:

  • The bug in Mesa shared pre-compiled lists was removed, apparently in Mesa 4.0.3, and is definitely not present in the latest release, Mesa 5.0. :-)
  • Removed a bug in the mesa code that originated blurred lines in cells when drawn for the first time.
  • The Roman and Mono_Roman stroked fonts freely available from Sun Microsystems, that are included with both GLUT and Freeglut, are now implemented in GAMGI, as part of the text object functionality.
  • Cleaned gtk (function names, layer parameters), and expat code (layer parameters).
  • Implemented gtk_text_remove and created a first version for gtk_text_create, so it is possible now to create and remove a text object in GAMGI, though much improvements are needed.
  • Obtained the atomic structure (from MathMol database) for many interesting molecules (though they are still in pdb format).
  • Obtained the set of default CPK element colors used in Rasmol, though not for all elements. Unfortunately this set of colors is different from the one used by InsightII, though it might be equal to the one used by Cerius2, we need to investigate more.

What is next:

  • Improve Text functionality, and start implementing the Text Modify task dialog.
  • Convert the pdb format of the MathMol molecules to GAMGI GML native format.
  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
GAMGI 0.09.1
11th January 2003
Changed the website to XHTML1.0 and CSS1.0.

What is new:

  • Changed the entire website to XHTML1.0 and CSS1.0. The advantages are: 1) the style (fonts, colors, dimensions...) for the whole website is now defined in a single file, making it much easier to change and improve the web pages; 2) the web pages are simpler, because they don't contain style information; 3) The web pages are now in XML format, the same used natively in GAMGI (although the language is different, of course), thus we expect to obtain important sinergies. In paticular, this means that GAMGI will be able to read pages from the GAMGI website, so all the help documentation can be written in XHTML and used both in the website and in GAMGI directly, in the Help functionality.
  • Added Cell Link documentation to show how ocuppancy patterns work.
  • Added the file $GAMGI/dat/all.xml, containing all the parameters that GAMGI currently understands and improved several other examples in the same $GAMGI/dat/ data distribution.
  • improved the DTDs in $GAMGI/doc/dtd/, which now include all the accepted parameters and are conforming with all.xml
  • cleaned the code in gamgi_expat_import_config and gamgi_expat_import_data, to handle missing parameters, according to all.xml
  • deleted the code to remove a window when more windows are launched at startup, because there was a bug in it and because we need to think more about the best way to handle these situations.
  • found a nasty bug :-( when multiple windows are open and closed, which occurs with Mesa 4.0.2 and Mesa 4.0, but not with Mesa 3.0. Apparently this is a bug that found its way to Mesa newest releases, in the code handling shared, pre-compiled, OpenGL lists.
  • Corrected a few minor bugs in gamgi_gtk_help_current.c and gamgi_gtk_help_topic.c, and updated the documentation path in gamgi_io.h

What is next:

  • Write the Technical Description, in www.gamgi.org. with sections Libraries, Style and Architecture.
  • Improve the Formats documentation.
  • Try to solve a couple of minor and major bugs related with Mesa.
  • Time to write new code and decrease the size of the list shown above in the hacker section!
GAMGI old
 
Changelogs for older releases can be found here.

gamgi-0.17.5/doc/changelogs/changelogs10.html000066400000000000000000001271661433127522700207330ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.10
GAMGI 0.11
8th June 2005
Completed the conversion from chemical to crystallographic point groups of symmetry, thus ending the 0.10 series. Major achievements in this series: implemented the 230 space groups of symmetry, 3D extruded Truetype fonts, reciprocal lattice, stereographic projection, radical Voronoi tesselation, conversion from chemical to crystallographic point symmetry.

What is new:

  • Cleaned the m,C2 sort functions in gamgi_chem_symmetry.c.
  • When the point group is Undefined, in Periodic (restricted) mode, the elements with impossible rotation orders (not 6, 4, 3, 2) are now discarded. All other elements are shown (even if they are notoriously incompatible with periodicity, as for example too many mirror planes).
  • Updated Molecule->Measure and Molecule->Measure->Symmetry Help documentation, regarding chemical and crystallographic point groups.
  • Converted chemical Ih,I to crystallographic Th,T point groups: there are 5 sets of axes/planes to choose from when converting icosahedral to cubic groups.
  • Cleaned the code to convert chemical to crystallographic point groups, except I,Ih groups.
  • Removed an error when converting Dnd chemical to crystallographic point groups: C2h exists when n is odd and D2 exists when n is even.
  • Converted Dnd chemical groups to Crystallographic Dnd, C6v, C4v, C3v, D6, D4, D3, S6, S4, Ci, Cs and Ci.
  • Redesigned the chemical to crystallographic conversion code. It is much simpler, solid and easier to maintain, now.
  • Added Reduced International notation to identify point groups when applying crystallographic restrictions.
  • Added code to sort m, C2 elements oriented along the main direction.
  • Added T, Th, Oh building routines (to convert I, Ih, Kh chemical groups).
  • Chemical or Crystallographic point symmetry can now be selected in the Molecule->Measure dialog.
  • More cleaning in the code converting chemical to crystallographic point groups.
  • Converted chemical Dnh and Cnh to crystallographic (Dnh, C2v) and (Cnh, Cs) point groups, respectively. Tested against structures with higher rotation orders, written automatically, such as D30h and C30h. Added the XML files and the building utility to dat/.
  • We need to guarantee that, when they exist, the first plane is the horizontal plane and the first C2 axis is the vertical C2 axis, so the conversion between chemical and crystallographic point symmetry produces proper geometry for all symmetry elements.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.12
22th May 2005
Implemented the so-called Radical Voronoi Tesselation, where different polyhedra have different weights (given by the atomic radius) and added anisotropy tensor results. Improved the way area/node is handled in non-Miller planes. Improved the point group symmetry code, and started converting unrestricted (chemical) to restricted (crystallographic) point group information in non-periodic structures.

What is new:

  • Wrote utilities to automatically create molecule files with arbitrarily high orders, for Cn, Dn, Cnv, Sn groups.
  • Tested for chemical and crystalographic groups, for S10, S12, S14, S16, S18, S20, S22, S24, S30.
  • Conversion from chemical Cnv and Sn to crystallographic Cnv, Sn, Cn and Ci point groups is done.
  • Tested symmetry operations for C12, C24 and D12, D24 groups. Added C12.xml, C24.xml and D12.xml, D24.xml examples to dat/molecule/symmetry.
  • When 6 and 4 axes are both present in the chemical group, the crystallographic group can have as main order 4 or 6. Done for Cn and Dn groups.
  • Conversion from chemical Cnv and Dn to crystallographic Cnv, Dn, Cs and C2 point groups is done.
  • Conversion from chemical to crystallographic Cn point group is done.
  • Conversion from chemical Coov, Dooh and Kh to crystallographic C4v/C6v and D4h/D6h point groups is done: elegant and solid.
  • Improved the point symmetry code, in order to implement restricted (crystallographic) point group symmetry.
  • Simplified primitive reciprocal lattice colors: (0.5, 0.5, 0.5). It's simple, reliable, and almost always a good choice.
  • When creating (Cell->Measure) the reciprocal of a centered lattice, with a conventional volume, users can now choose to represent also the reciprocal of the corresponding primitive lattice.
  • Added screenshots to www.gamgi.org, showing stereographic projections and reciprocal lattices.
  • Updated cell_create.html, cell_modify.html and plane_measure.html documentation.
  • Cleaned the tutorial code: the names of the tutorial functions are now independent of their order, so this can be changed, and new tutorials added in any ranking position, without conflicts.
  • Added a new tutorial showing how to build a crystalline cell of Orthorhombic Polyethylene, using space group and Wyckoff positions data.
  • Updated the tutorial on Directional,Positional,Spot Lights.
  • Voronoi tesselation: added a variancy parameter in the Cluster->Measure dialog to control the partition weight scaling.
  • Voronoi tesselation: the radical tesselation, with different weigths for different polyhedra (defined by the atomic radius) seems to be working fine.
  • Cleaned Voronoi code and added atomic radius, in preparation for Radical Tesselation.
  • For planes with indices higher than Miller, the area/node now gives an error message. For planes with Miller indices or below, the area/node for Miller planes is shown.
  • Cleaned Voronoi code: lists of face vertices can be made cyclic now. Simplified static_face_orientate. Removed redundant static_angle.
  • Voronoi tesselation: the system tensor anisotropy and the polyhedron scalar anisotropy are now calculated. Cleaned code.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.11
6th April 2005
Improved the Voronoi Tesselation code, the Reciprocal Lattice code, the Stereographic Projection code, simplified the paths to get documentation, data and source files.

What is new:

  • Redesigned the reciprocal lattice code, to handle simultaneously the primitive lattice in centered lattices, and completed the special cases: hR and tI.
  • Cleaned gamgi_mesa.h.
  • Increased slightly the point size used to draw cell nodes, so these are still visible when another cell is present.
  • Found and removed a bug in Cell->Measure: the Gtk error dialog did not show up when an error was found. Some code automatically removed the task AND the message dialog without checking for errors.
  • When transforming a direct into a reciprocal lattice, when the direct lattice is centered, the corresponding primitive lattice can now be also transformed.
  • Updated documentation and data in http://www.gamgi.org/ and ftp://ftp.gamgi.org/gamgi/.
  • Improved name handling for planes and directions in gamgi_expat_export_object.c.
  • Corrected a little bug in gamgi_expat_export_object.c: plane->pole and plane->trace were compared to FALSE, not TRUE.
  • Improved name and error handling for Planes and Directions in gamgi_expat_import_object.c.
  • Stereographic Projection: added new pole symbols (masks) for planes and directions, so when they are in the same spot, planes and directions can still be seen (and measured), even if they use the same color.
  • Voronoi tesselation: face angles are now measured.
  • Removed a bug in Direction->Measure and Plane->Measure: in some cases (Plane-Direction and Direction-Plane angles) X flushing/synchronization was not done properly: now an expose event is triggered immediately after scanning for an object in the back buffer.
  • Changed the Stereographic Projection, so now only the planes and directions that are above can be seen.
  • Improved website documentation about Gamgi installation.
  • Improved error detection in Atom->Measure, Direction->Measure, Plane->measure dialogs.
  • Sections of the GAMGI website which are not related with documentation (like screenshot images), are not included anymore in the doc/ tree, resulting in much smaller documentation tarballs.
  • The paths to documentation files are much shorter and simpler now. This is valid for local files, that come with the distribution, and files available from http://www.gamgi.org/ and ftp://ftp.gamgi.org/.
  • Rotate,Move,Scale now also works when the selected object is Window, updating all layers in the window, both in Axes and Objects mode.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.10
8th March 2005
Created new dialogs Atom->Measure, Plane->Measure, Direction->Measure. Several new properties involving angles, lengths, areas can now be measured. Crystallographic planes,directions can now be imported,exported to XML files.

What is new:

  • Distances between an atom and a 2-atom direction, and an atom and a 3-atom plane can now be measured.
  • Distances between an atom and a crystallographic direction, and an atom and a crystallographic plane can now be measured.
  • Distances between nodes in crystallographic directions, linear and planar node densities can now be measured.
  • Angles between crystallographic planes, directions and planes with directions can now be measured.
  • Implemented the Atom->Measure dialog with the new GUI rules and removed the Group->Measure dialog, replaced by Atom->Measure.
  • Improved and cleaned gamgi_gtk_plane_measure.c and gamgi_gtk_direction_measure.c, so now the dialogs Plane->Measure and Direction->Measure are much more user-friendly.
  • Implemented the new Plane->Measure dialog.
  • Designed and implemented the Direction->Measure dialog.
  • Improved the whole GUI strategy to handle measuring properties.
  • Plane, Direction objects can now be imported from XML files.
  • Updated documentation for Cell->Measure and Plane->Measure.
  • Plane, Direction objects can now be exported to XML files.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.9
6th February 2005
Added Wigner-Seitz cells for hR rhombohedral lattices. Improved stereographic projection for planes and directions. Improved reciprocal lattice functionality.

What is new:

  • Filtered inner faces for hR high and low Wigner-Seitz cells.
  • The high c/a Wigner-Seitz cell for the hR lattice is working.
  • Found and removed a bug in gamgi_expat_import_object.c: Wigner-Seitz cells for monoclinic and triclinic lattices (not implemented yet) were not flagged down as an error.
  • The low c/a Wigner-Seitz cell for the hR lattice is working.
  • Calculated the coordinates for both Wigner-Seitz hR cells, with low and high c/a.
  • Cleaned the plane,direction code, including gamgi_engine_start.c, gamgi_engine_copy_out.c, gamgi_phys_projection.c and gamgi_math_plane_measure.c.
  • Improved the interface handling the reciprocal lattice constant.
  • The reciprocal lattice constant can be chosen now. The new default is the so-called Bravais polar lattice constant, where the volume per node is equal for direct and reciprocal lattices.
  • Improved Stereographic Projection: i) when a pole points to the half-sphere below, the inverted direction is now used; ii) only the trace in the half-sphere above is now represented;
  • Corrected Layer->Create and Light->Select HTML Help pages.
  • When calculating the area per node, multiple planes are taken into account: distance between adjacent planes is 1/2 or 1/3.
  • Added dialog Plane->Measure. Currently only measures the distance between adjacent planes, and the area per node.

What is next:

  • Add XML input/output functionality for plane/direction objects.
  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.8
11th January 2005
Removed a couple of serious bugs, in Space groups, Reciprocal Lattice and Voronoi Tesselation. Plane->Select, Plane->Remove, Direction->Select, Direction->Remove dialogs are implemented and working. Plane->Create and Direction->Create have more features, are more robust and user-friendly.

What is new:

  • Found and removed a fresh bug in Planes,Directions: origin was not initialized, sometimes producing erratic values.
  • Disabled Scale,Move,Rotate for Planes,Directions, when they are the selected objects. Initialized Plane and Direction origin to Cell origin. All this needs to be improved in the future.
  • Implemented Plane->Remove and Direction->Remove dialogs, so single Planes and Directions can now be easily removed.
  • Improved Plane->Select and Direction->Select dialogs, which now recognize and select planes and directions, respectively.
  • Improved Plane->Create and Direction->Create dialogs, which now support both conventional and primitive vectors. Moreover, both dialogs are now initialized and reset.
  • Cleaned gamgi_gtk_cell_measure.c. In particular, current layer parameters are now copied to the new layer, when determining the reciprocal lattice, instead of using the default layer parameters as before.
  • Found and removed a bug in the reciprocal lattice code: parameters for R cells were still determined with the pre-GAMGI 0.10.5 convention of using primitive rather than conventional hexagonal parameters to define R cells.
  • In stereographic projection, added code to get directions normal to planes, using reciprocal lattice vectors. Added code to handle plane and direction indices based in conventional and primitive vectors.
  • Found and removed a bug in the reciprocal lattice code, related with the cell center: center was calculated too late.
  • Corrected edge faces and edge lengths, for topologies not well formed, in the Voronoi code. Cleaned the statistics part.
  • Found and removed a bug in the Voronoi code: when the topology is not well formed (aka C60), an infinite loop could appear.
  • Updated documentation about Euler angles, Text objects, the Freetype library and the GAMGI_TEXT environment variable.
  • Found a removed a bug in the Cell Link code: the inside_triangles routine was receiving always the first coordinates.

What is next:

  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.7
29th December 2004
Started working on crystallographic plane and direction objects: stereographic projection is working, including Wulff (mostly used in Materials Science) and Schmidt (mostly used in Geological Sciences) projections. A bug was fixed in the Euler angles code.

What is new:

  • Updated the pathnames in the gtk/*/* files.
  • Wrote gamgi_gtk_plane_create.c: the Plane>Create dialog is working, for both Wulff and Schmidt projections, for all planes, colors, poles and traces.
  • Found and removed a rather old bug in the function gamgi_math_euler_from_axis: sometimes the Euler angles were wrong: 90 instead of 270. Cleaned the Euler angles code.
  • Andre made new rpms for GAMGI 0.10.6 and Suse9.x. Cleaned the HTTP and FTP download sections, at www.gamgi.org.
  • Wulff and Schmidt stereographic projections are now rotating fine, in interactive mode (with the mouse or the ruler).
  • Updated gamgi_mesa_draw and gamgi_mesa_scan, to work with planes and directions.
  • Updated gamgi_engine_create, gamgi_engine_start, gamgi_engine_copy_out, gamgi_engine_remove, to work with planes and directions.
  • Adapted and cleaned gamgi_expat_import_object and gamgi_expat_export_object, in preparation for the stereographic projection cell representation.
  • Adapted and cleaned gamgi_gtk_cell_create and gamgi_gtk_cell_modify, in preparation for the stereographic projection cell representation.
  • We have now a simple and flexible model to handle everything that is needed with stereographic projections: we will add a new tupe of cell representation, a projection, specifically to contain and handle planes and directions. Multiple cells and relations between them will be handled by Assembies (including epitaxial relations).
  • Pole and trace representations seem to be working fine, for both Wulff and Schmidt projections, for all types of lattices, for all possible rotations.
  • Started working on Plane and Direction objects.
  • The mathematical constructions needed to handle Stereographic (Wullf) and Schmith projections are worked out.

What is next:

  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.6
7th December 2004
This is a cleaning release: reviewed the Voronoi code and removed a serious bug, improved the way Light shininess is handled, added an environment variable so solid fonts can now be easily found, clarified that code exporting to raster .ps files is fine and usable.

What is new:

  • Found and removed a bug in the Voronoi code: the number of faces per edge was not properly calculated. Edges are now are linked for each polyhedron AND for each face.
  • Added code to find equivalent vertices and edges, when using periodic boundary conditions, in the Voronoi code.
  • Cleaned the Voronoi code. Searching for redundant vertices now requires looking only into 8 rather than 27 cells.
  • Added a new environment variable, GAMGI_TEXT, to indicate the path to Vera truetype fonts.
  • Cleaned the postscript exporting code.
  • Clarified why the postscript code was not working properly: in Gimp we need to use a resolution of 72dpi (the default is 100). In practise this means that exporting to .ps files is working fine. We tested this issue also on Windows, on 3 programs, and all of them worked fine with our .ps files.
  • Cleaned again the text font code. Now when a text object is modified, the font glyphs must be available (even if they were previously compiled), otherwise an error is triggered.
  • Special XML characters must be translated to predefined entities when exporting, otherwise they cannot be reimported. Fixed.
  • Improved the way we handled Light shininess: Shininess is disabled for 0.0, is minimum close to 0.0 and is maximum for 1.0.
  • Only wired text objects need line width control. Fixed.
  • Added a new screenshot about crystallographic space groups.

What is next:

  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.5
10th November 2004
Updated/added documentation for Text and Light formats, and Text and Cell dialogs. Improved solid fonts code. Rhombohedral cells now are defined with conventional (hexagonal) cell parameters.

What is new:

  • Added a new screenshot, showing how the Cell->Link dialog is used to create a crystal using space group information.
  • Updated help documentation for Cell->Create, Cell->Modify and Cell->Link.
  • Found two bugs in the code handling solid fonts, resulting in segmentation faults when font files are modified or removed AFTER removing the font files. Removed one, by checking first if glyphs must be compiled. Removed the other by checking if the glyphs are available, when calculating the text center.
  • When solid Truetype fonts are not found, the error message produced now shows the name of the file that is missing, both in Gtk Text->Create, Text->Modify dialogs and from XML files.
  • Rhombohedral cells are now defined using a,c hexagonal cell parameters rather than a,bc rhombohedral parameters as before. This affects only the lattices for the 7 R space groups. Essentially crystallographers tend to define cells belonging to these groups using hexagonal, not rhombohedral, parameters. Moreover, this case was an exception, from now on parameters are always for the conventional cell, which is simpler for users and coders alike.
  • Added a screenshot to gamgi.org with stroked and extruded fonts, illuminated with directional and spot lights.
  • Updated format documentation for <light></light> (Create) and <gamgi><light></light></gamgi> (Config) blocks in XML files.
  • Updated format documentation for <text></text> (Create) and <gamgi><text></text></gamgi> (Config) blocks in XML files.
  • Updated documentation for Text->Create and Text->Modify dialogs.
  • Scaled up very slightly the wired fonts, so wired and solid and fonts now look essentially the same size.
  • Changed the expected names for the 10 Vera Truetype files, back to the original names in Suse 9.0, hopefully this wil help finding these files in other Linux distributions.
  • Added documentation for Cell->Measure, for the reciprocal lattice transformation.
  • Added the relevant original Allen Barnett's comments to the extruded fonts code, plus metrics information taken from the Freetype documentation.
  • Cleaned the code in gamgi_mesa_text.c; defined the scaling procedure for solid fonts, so wired and scaled fonts look the same size; calculated the center for solid text objects.

What is next:

  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.4
11th November 2004
Text and Light properties can now be configured, both from GUI dialogs and XML files. Solid (extruded) Truetype fonts can now be created/modified from GUI dialogs and imported/exported to XML files.

What is new:

  • When objects and lights have null overlapping color components, the light cannot iluminate the object and the object becomes invisible. This more testing, and perhaps an option for Light Materials functionality.
  • Found and removed a bug in the code initialising text objects: font was started, so a core dump would be produced when a parsing error was found as the font engine would try wrongly to decrease the glyph count.
  • Cleaned all the text font engine code and improved the text font API, to acommodate all the GUI and XML code needs. The dialogs Text->Create and Tex->Modify and the XML import/export files are now be handling wired and solid fonts just fine (famous last words!).
  • Solid fonts are now working fine. The code to center the text objects, for both wired and solid fonts has been redesigned and is working. Removed gamgi_mesa_center_out.
  • Wired fonts are working again, in all cases, with the new font engine. Cleaned the text code. Solid fonts are working, but still need some work.
  • Changed completely the text font engine. Before, when a glyph was required, the whole font was compiled. Now only the glyphs actually needed are compiled. This is important mainly because the new solid fonts require much more resources.
  • Refined the GUI handling Systems,Lattices,Groups in Cell->Create and Cell->Modify: the toggle buttons handling the Systems,Lattices,Groups Lists can now be used to create AND remove the dialogs. Previous methods to close these dialogs (Cancel button and WM decorations) remain available, of course.
  • Removed a bug in the the Cluster Voronoi code: the statictics for global edge lengths were calculated using redundant edges, not just the real ones.
  • Updated the website Links and Contributors pages, to include all the contributions for the extruded fonts code.
  • Cleaned and integrated further the text code: Removed files gamgi_gtk_text and gamgi_mesa_extruded and added the code to gamgi_gtk_text_config, gamgi_gtk_text_modify and gamgi_mesa_text.
  • Wired (tested) and Solid (not integrated yet) fonts can now be imported and exported to GAMGI XML files.
  • Found a bug in the XML export code: the XML space offset is not correct for text configuration data: Fixed. We were sending garbage, instead of the right argument, to a function. Surprising that this was not found before...
  • Light and Text configuration parameters can now be exported to XML files. Corrected a minor bug in the XML layer export code: the decimal precision was wrong for some position components.
  • Modified Text->Create and Text->Modify dialogs so they are now ready to work with both Wired and Solid fonts.
  • Default Text Style, Color, and Solid and Wired fonts, can now be configured, selecting Text->Config or importing config data from XML files.
  • Materials Light Shininess and default Light components can now be configured, selecting Light->Config or importing config data from XML files.

What is next:

  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.3
16th October 2004
Solid extruded fonts are now working on GAMGI, thanks to Allen Barnett and Linas Vepstas, of OGLFT and GLE libraries, respectively, which code we used, and the team developing the FreeType library, which is now required. A screenshot is available here. The interface with the user is not built yet, so this is just a working release, not for final users.

What is new:

  • Removed the global variables introduced earlier in the extruded fonts code.
  • After sorting out a few glitches, the extruded fonts are now running great on GAMGI!. Wait for the screenshots...
  • GAMGI compiles with the solid font code: the FreeType library is now required to compile and run GAMGI.
  • Cleaned the solid fonts code a bit more. There is a bug with lights and Scalef probably due to unormalized normal vectors, which was already in the original code.
  • The solid fonts code has now less than 800 lines and the extrusion code is fully understood.
  • Cleaned and merged the OGLFT and GLE C codes into a single file, with just 844 lines.
  • Introduced C-based dynamic arrays, a new type of data object inspired in C++ <vector>, that should help to reduce the number of reallocs directly hard-coded in GAMGI, making the code more elegant and simpler to maintain.
  • Removed the last C++ header in the OGLFT code, <vector>, and converted the last C++ bits to C. The whole code is now ansi C and works fine.
  • Removed C++ standard libraries, <map> and <list>, in the OGLFT code, and replaced by GAMGI lists.
  • Simplified the GLE code to 122 lines only, and removed all the macros.
  • Reduced all the code to render solid fonts to 3 files (.c and .cpp and .h), plus a bunch of macros.
  • The GLE code to render solid fonts is now down to 420 lines in .c files and 633 lines in .h files, and the GLE and OGLFT codes are working fine together, producing exactly the same output as the pristine GLE and OGLFT libraries combined. From now on, it should be just a matter of time until we have solid fonts in GAMGI, linking against the FreeType library! Of course this is only possible due to the hard work of Linas Vepstas (GLE), Allen Barnett (OGLFT), and all the people working on the FreeType library, many, many thanks to all!
  • The whole OGLFT code to render solid fonts is now down to less than 800 lines, including header and demo code. Started working on the GLE library.
  • Stripped down solid.cpp to 766 and solid.h to 82 lines only. Essentially we have now to replace the STL functionality by our own to have pure C code. Moreover, the code doesn't look too difficult to understand.
  • We have a working example showing a message with a solid font, stripped down from the OGLFT C++ library, with two files, solid.cpp (1048 lines) and solid.h (320 lines) only.
  • We have a working model for 3D solid (extruded) fonts, which requires three libraries: Freetype, OGLFT and GLE. Our goal is to adapt the OGLFT and GLE code to GAMGI, to decrease the number of dependencies, keeping just Freetype, which is a larger lib and is one of the dependencies of Gtk2.0, so we will need it anyway if we move to Gtk2.0.

What is next:

  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.2
16th September 2004
Reciprocal lattices can now be determined for all 14 Bravais lattices. A bug was removed in the code converting primitive to conventional axes in Rombohedral lattices.

What is new:

  • Cleaned the reciprocal lattice code.
  • Tested the OpenGL Light and Materials properties. Apparently we are following the best solution on this.
  • The orientation of reciprocal Triclinic and Monoclinic lattices is not correct: a change in orientation occurs in the transformation that we are not taking into account. Solved: get the rotation matrix that takes the conventional vectors in the standard orientation to the final orientation.
  • Decreased the minimum and maximum number of slices used to draw atomic spheres to 4 and 64, respectively.
  • The reciprocal lattice stuff seems to be finished, apparently is working correctly in all cases, even the tricky ones involving multiple rotations around different centers.
  • Reciprocal lattice for Tetragonal I is tricky because we do not work with the F reciprocal lattice but with the equivalent I lattice, so we need to scale and rotate 45 degrees. Reciprocal lattice for Hexagonal P is tricky because a rotation of 30 degrees occurs during the transformation.
  • Found and removed a bug in gamgi_phys_cell_create: the hexagonal height in rombohedric cells was wrong. As a result of this, the reciprocal lattice now works fine for this case.
  • Reciprocal lattices seem to be working fine, except for Hexagonal P, Hexagonal R and Tetragonal I.
  • Using Freetype, OGLFT and GLE, we have demos with solid fonts rotating fine. The problem now is how to adapt this to GAMGI.
  • Thanks to Andre, we have new packages available, for Gamgi 0.10.1: rpms for Suse 9.1, and for the first time, deb packages as well, for Woody 3.0 r1.
  • Renewed gamgi.org, which is now valid until 2010.

What is next:

  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.10.1
3rd September 2004
The 230 crystallographic groups are now fully working. The structures linked to Wigner-Seitz cells are greatly improved. Distributed the gtk code by several sub-directories.

What is new:

  • The methodology to convert direct to reciprocal Bravais lattices seems to be clarified, hopefully this will be working soon.
  • The algorithm to link Wigner-Seitz cells to atoms showing all the relevant atoms and the proper symmetry is working fine.
  • Cleaned the gamgi_phys_cell_link.c code that handles the container cell, including static_cell and the if statement to call it.
  • Refined the cell link interface: users are not allowed anymore to add nodes to conventional volumes or to remove nodes from the other volumes.
  • Removed a bug in gamgi_phys_space.c code that prevented cell link to work correctly when only a motif was entered.
  • The code to handle space group information is completed and seems to be working well, though it is not properly tested yet. It should be able to build crystals for all 230 space groups, for all Wyckoff sites, for all types of cell volumes. Moreover, users can combine space group information with node selection and occupancy rules.
  • Merged and updated gamgi_phys_space.c, gamgi_phys_cell_link.c and gamgi_gtk_cell_link.c (found and removed a typo bug in gamgi_phys_cell_link.c affecting the size of the outside cell when the volume is a sphere).
  • Updated the HTTP and FTP website sections.
  • Prepared the dialog and layer infra-structure to determine and show reciprocal lattices for cell objects.
  • Completed and added the 230 arrays describing Wyckoff site symmetry.
  • Writing the Wyckoff site symmetry in arrays (one for each group, as for positions and drivers): more than half is done.
  • More cleaning on gamgi_gtk_cell_link.c, which is now ready to handle all the space group information.
  • The Cell->Link dialog is automatically creating and removing menuitems for all Wyckoff positions, for all the 230 space groups.
  • Redesigned the Cell->Link dialog: added Wyckoff positions and removed Directions.
  • When importing files from the command line, the code printing the current layer and object in the statusbar was not correct: removed the bug, removed the variables windows_top and layer_top, and cleaned the code.
  • Created sub-directories in src/gtk, for each object classe, to avoid hundreds of files in a single directory. Changed the makefiles accordingly (it is still possible to compile Gamgi from any of the directories containing source code).
  • The standalone code to generate Wyckoff positions for all the sites of the 230 space groups seems to be working fine. When repeated positions are found, it also tries to find a Wyckoff site with lower multiplicity (and higher symmetry) that generates the same positions.

What is next:

  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI old
 
Changelogs for older releases can be found here.

gamgi-0.17.5/doc/changelogs/changelogs11.html000066400000000000000000001603741433127522700207320ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.11
GAMGI 0.12
24th September 2006
Completed the code to build arbitrary ranges of crystallographic directions belonging to the same family. Planes and directions can now be created passing through a given node or between planes with a given order. Improved the code to measure lengths between planes, directions and atoms. Planes and directions with any order or node can now be exported and imported to XML GAMGI format. Removed some numerical bugs, mainly in the code to build directions.

What is new:

  • Fixed some links and added images that were missing in the users documentation.
  • Distances between atoms and atomic planes can now be calculated, for independent and independent planes.
  • Found and removed a bug in gamgi_chem_symmetry.c: in static_try_m0, negative d[n] components could produce wrong results.
  • Distances between atoms and planes (points) in reciprocal space are now calculated. Previously we calculated the distance to the plane passing through the origin.
  • Distances between independent directions and atoms are now properly calculated. Updated this calculation for projected directions.
  • Simplified the code to obtain a rotated and translated point, without using the object center.
  • Distances between directions and atoms are now properly calculated, for directions not going through the cell origin (this was already done for planes).
  • The direction node position is now imported, as o1,o2,o3,o4 parameters.
  • Added random pictures to www.gamgi.org front page.
  • Directions now maintain the node coordinates in primitive or conventional vectors, the vectors defined for the indices.
  • The direction node position is now exported, as o1,o2,o3,o4 parameters.
  • The object name in planes and directions was always exported, even when it was the default: fixed.
  • A old, deprecated, visibility XML parameter (none) was still exported instead of the new one (no): fixed.
  • Improved the way crystallographic planes and directions are tested throughout the code.
  • Found and removed a bug, in the code to build directions in ranges: a variable was not properly initialized in static_segment, in gamgi_phys_direction.c, resulting in crashes when points were too close.
  • When defining direction ranges, plane indices too small (multiple planes) are allowed, but plane indices too large (Lauer planes) are not (because the conversion makes no sense).
  • Multiple indices are not allowed for directions, but they are allowed for planes (Laue reflections).
  • Found and removed a bug, in the code to build directions in ranges: some directions were not created due to numerical errors, when the plane was tangent to the cell. The third point needed to define a plane is now chosen in such a way that the section of the plane inside the cell is maximized, eliminating the problem.
  • Found and removed a bug in the procedure to create directions in cell volumes: the routine to create 3 orthogonal points was broken.
  • The procedure to create ranges of crystallographic directions from two family planes in the direction zone is working fine.
  • Crystallographic planes can now be created specifying either a range of orders or a specific node on the plane.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.17
30th July 2006
Atomic planes and directions can now be created in any atomic container object, and the planes and directions can be taken away, as independent objects, with all the atoms and bonds inside. Wrote the second level and improved the first level dialogs to support all the functionality to create planes and directions passing through an arbitrary node or to create an arbitrary range of planes and directions.

What is new:

  • Completed the code controlling all the interactivity in the first and second level dialogs Plane->Create and Direction->Create.
  • Wrote the Plane->Node and Direction->Range second level dialogs, for Plane->Create and Direction->Create. Both first and second level dialogs look fine now.
  • Updated the Plane->Create and Direction->Create dialogs, to receive node and range information.
  • Added gamgi_math_function.c and gamgi_math_plane.c files.
  • Solved the diophantine equations needed to get the node intersection between two planes belonging to the same direction.
  • Added code to generate a single direction passing through an arbitrary node o1,o2,o3, not necessarily 000.
  • Determined relations between primitive and conventional Miller indices for planes of all Bravais lattices.
  • Added code to generate a single plane passing through a given node, primitive or conventional.
  • Improved direction code: rotation,translation is working fine for all all sorts of direction objects.
  • Added code to create directions from 2 atoms and to link atoms closer than thickness to directions.
  • Improved the interface Plane->Create, cleaned code in gamgi_gtk_plane_create.c and gamgi_phys_plane.c, fixed a recent dangling pointer.
  • Atomic planes can now be created from any arbitrary parent object, with the parent atoms also copied.
  • Prepared screenshots for the GAMGI 0.12 series.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.16
29th June 2006
Reorganized the crystallographic plane and direction code. Crystallographic planes and directions can now be automatic or independent objects. Crystallographic families of planes can now be generated for a given range, including the whole cell volume. Independent crystallographic planes can now include automatically all the atoms within a given thickness. Redesigned the frontpage and improved the styling of www.gamgi.org.

What is new:

  • Plane polygons are now illuminated from both sides, using glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE).
  • Independent crystallographic planes can now include automatically all the atoms within a given thickness. This is quite usefull for crystalline structure analysis.
  • gamgi_gtk_direction_create.c is now importing the new direction data: 2 atom identifiers, automatic/independent, thickness, start and end order, scale. Thickness and direction order is not working yet though.
  • Spam against the lists is increasing. All mail going from non members to GAMGI lists is now automatically discarded. Before it was kept for aproval.
  • gamgi_gtk_plane_create.c is now importing the new plane data: 3 atom identifiers, automatic/independent, thickness, start and end order, scale. Apart from atomic planes and thickness everything else is now working.
  • Cleaned the code to build directions, in gamgi_phys_direction.c and gamgi_math_polygon.c.
  • Fixed a little bug in direction rendering code: the line width was different in gamgi_mesa_draw.c and gamgi_mesa_scan.c.
  • Independent directions now can be rotated, translated and scaled on their own. Automatic directions rotate, translate and scale the immediate parent above.
  • The plane-atom distance for polygonal planes of any order is now correctly measured.
  • Independent planes now can be rotated, translated and scaled on their own. Automatic planes rotate, translate and scale the immediate parent above.
  • Whole ranges of crystallographic planes belonging to the same family can now be created automatically.
  • A order parameter can now be used in XML files to indicate which plane in the family should be considered.
  • Planes in direct space, intersecting the cell axes in (n/h, n/k, n/l) can now be represented for any value of n. Before, only n = 1, the usual default, was possible.
  • Code related with planes and directions is now in gamgi_phys_plane.c and gamgi_phys_direction.c, respectively. Moved code to get plane and directions vectors to these files. Cleaned code in gamgi_phys_plane.c and gamgi_phys_direction.c
  • Redesigned the www.gamgi.org front page.
  • Fixed the links in the tutorials in www.gamgi.org.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.15
31th May 2006
The GAMGI Help system is working again, with files fetched locally, by HTTP or FTP, using GAMGI or a external browser, including the new notebook-style Help files that emulate the GAMGI task dialogs. Improved documentation. Two simple but crashing bugs were found and removed, afecting Molecule->Remove, Cell->Create and Cell->Modify.

What is new:

  • Updated documentation in bond/create_lengtht.html
  • Updated the titles for all html files in gamgi.org and distributed with GAMGI.
  • More improvements in the Help mechanism and data.
  • Now Help automatically shows the documentation page covering the notebook open page.
  • Updated the Help->Start information.
  • Found and removed a simple but crashing bug in gamgi_gtk_cell_create.c: and gamgi_gtk_cell_modify.c: "button_origin" instead of "button_translation".
  • Found and removed a simple but crashing bug in gamgi_gtk_molecule_remove.c: "toggle_button_global" instead of "button_global".
  • Updated code reading Help documentation, in gamgi_expat.h, gamgi_expat_import.c and gamgi_expat_import_help.c. Gamgi can read now all board- and notebook-style documentation pages.
  • Updated the INSTALL file distributed with Gamgi.
  • Changed the GAMGI environment variable to GAMGI_HELP, which now points directly to the doc/ directory.
  • Help Search is working fine, with a browser.
  • Help Tutorial is working again, with a browser.
  • Help Current is working again, with a browser.
  • Help Topic is working again, with a browser.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.14
11th May 2006
Wrote documentation for all the the working Config dialogs. Updated and wrote documentation for all the working Create dialogs (except Atom). Updated and wrote Tutorials. Improved the website.

What is new:

  • Wrote documentation for second level cell symmetry dialogs: Systems, Lattices and Groups.
  • Wrote documentation for Stereographic and Equivalent projections, for planes and directions.
  • Rewrote the frontpage, with the same layout but better CSS and markup code.
  • Wrote the Interfaces documentation for the Direction->Create dialog.
  • Wrote the Interfaces documentation for the Plane->Create dialog.
  • Added two tutorials to build CsCl and NaCl cristalline structures.
  • Updated the three tutorials on BCC, CFC and HCP interstices.
  • Added a tutorial to build a structure cell of calcite (CaCO3).
  • Updated the tutorial on orthorhombic polyethylene.
  • Updated the Interfaces documentation for the Cell->Create dialog.
  • Updated the Interfaces documentation for Text->Create and Bond->Create dialogs.
  • Wrote the Interfaces documentation for the second level dialogs Cell Align Rotation and Cell Align Translation.
  • Updated the Interfaces documentation for the Cell->Link dialog.
  • Updated the Interfaces documentation for Layer->Create and Light->Create dialogs.
  • Wrote the Help Interfaces documentation for all Object->Config dialogs (except Atom): Gamgi, Window, Layer, Light, Text, Bond, Help.
  • Changed the <gamgi> XML attribute Beep to Sound, to be consistent with the graphic interface.
  • Created the file infrastructure for Help Interfaces.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.13
10th April 2006
Redesigned the dialogs Bond->Create, Bond->Modify and Bond->Config. Redesigned and improved functionality for dialogs Plane->Create and Direction->Create. Updated documentation for all Formats documentation (except for Atom).

What is new:

  • Found and removed a bug in gamgi_gtk_cell_modify.c: in static_press, static_volume must appear before static_faces.
  • Replaced RHOMBUS, Rhombus, rhombus by PARALLELEPIPED, Parallelepiped, parallelepiped everywhere (the correct name for this Cell volume).
  • Changed the <gamgi> XML attributes background_r, background_g, background_b, foreground_r, foreground_g, foreground_b to base_r, base_g, base_b, text_r, text_g, text_b, to be consistent with the Gamgi->Config dialog.
  • Converted style and upgraded file formats documentation for Window, Help and Gamgi.
  • Converted style and upgraded file formats documentation for Orbital, Group, Molecule, Cluster, Arrow, Shape, Graph and Assembly.
  • Improved error checking for light colors in both interfaces and files.
  • Converted style and upgraded file formats documentation for Text, Layer, Bond, Light objects.
  • Redesigned the Bond->Config dialog according to the new style.
  • Found and removed a bug: Laue planes were not properly recognized in the reciprocal lattice (the reciprocal lattice was used, not the direct lattice), producing bogus area/node in Plane->Measure for I,F lattices.
  • Solved all the Gtk difficulties related with the implementation of notebook style Helps.
  • Redesigned the dialog Direction->Create according to the new style and cleaned the code. This dialog now includes many other options, similar to Plane->Create.
  • Redesigned the dialog Plane->Create according to the new style and cleaned the code. This dialog now includes many other options to implement futurely, for atom-based planes, independent planes (which own copies of the atoms in the plane), ranges of family planes, etc.
  • More improvements in www.gamgi.org: some pages have now the new notebook style.
  • The RCP code now includes a geometric and topological neighbour analysis.
  • Simplified tables and fixed the frontpage in www.gamgi.org.
  • Changed all files in www.gamgi.org to new CSS and XHTML.
  • Redesigned the dialogs Bond->Create and Bond->Modify according to the new style and cleaned the code.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.12
13th March 2006
Moved everything in gamgi.org, except Documentation->Interfaces and the frontpage, to new XHTML and CSS styles, with simpler markup and much heavier use of CSS. Notebook and Menu pure CSS pages are now used. Double and triple bonds are now properly represented in both Wired and Solid modes. With few modifications (C,Si,Na...), the default color scheme used by Gabedit for atomic elements has been adopted (resulting in a much more colorful Periodic Table).

What is new:

  • Moved Documentation Tutorials to the new tab-based style.
  • Apart from the Reference Manual for Interfaces, everything in www.gamgi.org should have been upgraded by now to the new XHTML and CSS, including Documentation.
  • Improved double and triple solid bond design, which is closer to chemical reality. These bonds are also rendered with pre-compiled lists now.
  • Gabedit has a periodic table with default colors for all elements GAMGI is now using this color scheme, with a few modifications (C green, Si yellow, Na blue, N lighter blue, S lighetr yellow).
  • Double and triple bonds are now represented as double and triple lines in solid mode.
  • Double and triple bonds are now represented as double and triple lines in wired mode.
  • Updated documentation in www.gamgi.org: Description, Installation, Code, Manuals, Bibliography, etc. Tested CSS and XHTML validity.
  • Started moving www.gamgi.org to new code, with simpler XHTML markup, better CSS and more elegant and intuitive interfaces for users. As a result, remote help support might be temporarily unreliable.
  • Successfuly compiled Gamgi on Intel-based 64 bits computers running Suse Linux 10.0 x86_64. Added the configuration to make_local.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.11
23th February 2006
Removed a couple of showstopper bugs affecting Cell->Create and Cell->Modify. The Random Close Packing is now fully working in Cell->Link. Global object linking is completed, though it is only implemented so far in Cell->Link. Fixed size settings were removed from all GAMGI dialogs, so changing fonts should be fine now.

What is new:

  • Completed global object linking, in gamgi_gtk_object_link.c, seems to be working fine. Implemented only in Cell->Link so far. Apart from objects with special needs (Atoms, Planes, Directions) it will be trivial to extend this to all the other objects.
  • Improved documentation: installation requirements.
  • Upgraded for the latest Mesa 6.4.2 (solves a light bug), Freetype 2.1.10 and Expat 2.0.0 releases. Everything seems to be working fine.
  • With Mesa 5.0.2, a GLU sphere sets normal to (0,0,0), and needs glNormal3d (0.0, 0.0, 1.0) at draw_layer to correct the effect. Mesa 6.4.2, the last version, works fine.
  • Found and removed a bug that crashed GAMGI after the RCP report was produced: the press code didn't know about the dialog change.
  • Thanks to Daniel Burka, from the Silver Orange Laboratories, who created the initial version, we have now a web tabs-based template to show our Help documentation, available here.
  • A single function, in gamgi_gtk_dialog.c, is now used to create all reports in GAMGI, as in Voronoi tesselation, RCP construction and point symmetry analysis.
  • The RCP building algorithm is now fully working, in the Cell->Link dialog. A report dialog shows the results. Input parameters were tested and are now safely controlled.
  • Removed a simple but nasty bug (thanks Pedro) that crashed GAMGI when pressing the screen with open System/Lattice/Group dialogs in Cell->Create, Cell->Modify.
  • Improved static_system, static_lattice, static_group, in gamgi_gtk_cell_symmetry.c, in particular removed all fixed size settings. All dialogs in GAMGI are now size independent, so they should look fine with any font.
  • Removed font and slide bar settings from the xterm command launched by the Shell button.
  • Text->Create does not reset contents anymore, after creating Text objects. This is more user-friendly and is consistent with other object create dialogs, for example Cell->Create and Atom->create.
  • Removed size settings for: Vectors option menus in Direction->Create and Plane->Create, Align buttons in Cell->Create and Cell->Modify, List buttons in Cell->Create and Cell->Modify.
  • Found and removed a bug in gamgi_mesa_axes.c: the length of the axes was wrongly calculated. Improved the code.
  • Cleaned font menu handling in gamgi_gtk_text_create.c, gamgi_gtk_text_modify.c and gamgi_gtk_text_config.c.
  • Changed the static_row function in gamgi_gtk_help_tutorial.c, to avoid the bug in clist code reported below, although the bug was never found in Help->Tutorial.
  • Removed size settings for: Vectors option menus in Cell->Link, Align->Translation, Align->Rotation; Plane/Direction option menus in Align->Translation, Align->Rotation; Planes button in Cell->Measure. With larger fonts, these widgets were clipping the text labels. Widget sizes should always be calculated automatically, anyway. These problems still exist on Text->Create, Text->Modify and Window top menus.
  • Found and removed a nasty, old bug in gamgi_gtk_cell_symmetry, that crashed GAMGI (at least) when compiled with -O3, after pressing a List button in Cell->Create or Cell->Modify dialogs.
  • Found and removed a minor, harmless bug in gamgi_mesa_text.c: height was useless.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.10
8th February 2006
Cleaned code and redesigned the dialogs Layer->Config, Light->Config, Text->Config, Gamgi->Config, Help->Config, Window->Config. Cleaned code and improved the design for dialogs Atom->Measure, Plane->Measure and Direction->Measure. All object parsing and identification, in all dialogs, is now centralized in a small number of functions in gamgi_gtk_object.c Wrote the interface to enter data to generate RCP structures. The Cell->Link dialog was redesigned to futurely handle link of Objects but also different kinds of algorithm construction, including the RCP.

What is new:

  • Improved CSS on www.gamgi.org.
  • Redesigned and cleaned the dialogs Gamgi->Config and Window->Config.
  • Redesigned and cleaned the dialog Text->Config, according to the new rules.
  • Moved gamgi_gtk_gamgi_* code to gtk/gamgi/ directory.
  • Added Rg (Roentgenium, Z = 111), to the list of accepted atom elements in GAMGI.
  • Redesigned and cleaned the dialogs Help->Config, Layer->Config and Light->Config, according to the new rules.
  • Cleaned the code and improved the design of the dialogs Atom->Measure, Direction->Measure, Plane->Measure.
  • Improved the Cell->Link dialog: used/unused notebook pages are now automatically shown/hidden.
  • Removed menu fixed sizing and cleaned in Cell, Layer, Light, Text GTK code, to avoid problems with fonts.
  • Improved gamgi_gtk_cell_link.c, to accept the RCP code.
  • Replaced previous object parsing code in *modify*, *link* and *measure* GTK code by gamgi_gtk_object_number and gamgi_gtk_object_name_number calls. All object parsing is now centralized in gamgi_gtk_object.c.
  • Found and removed a bug (a typo) in gamgi_gtk_cell_measure.c, causing GAMGI to crash.
  • Replaced previous object parsing code in *create* and *remove* GTK code by gamgi_gtk_object_name and gamgi_gtk_object_name_number calls.
  • Improved gamgi_gtk_object.c, to centralize ALL object parsing.
  • Improved gamgi_engine_link.c, gamgi_engine_find.c and created gamgi_gtk_object.c, in preparation for global linking.
  • Improved gamgi_gtk_cell_create.c: clicking the mouse only results in Cell creation if Align Position is disabled.
  • Added gamgi_gtk_object.c, to allow centralised object recognition.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.9
13th January 2006
Epitaxial relations and all sort of complex Cell position and orientation relations with the current Layer and other Cells are now fully working, for all types of Cells. Redesigned the object selection system, so now there is a single entry point for ALL object selection in GAMGI. The global object selection mechanism is now implemented. Redesigned the Cell->Link dialog, and added functionality to allow global Cell linking with other objects. Removed a couple of bugs in gtk code and math code.

What is new:

  • Revised gamgi_math_measure.c, to correct origin and rotation issues.
  • Corrected Cell translation with a reference Layer, in gamgi_gtk_cell_align.c.
  • Complex rotation and translation relations between multiple Cells and the current Layer are now working fine and can be easily established, including all sorts of epitaxial relations. Polished gamgi_gtk_cell_align.c, together with gamgi_gtk_cell_create.c and gamgi_gtk_cell_modify.c.
  • Found and removed a very simple but nasty bug (a typo), just introduced in the current version, resulting in wrong Cell->Link behaviour. Checked gamgi_gtk_cell_create.c and gamgi_gtk_cell_modify.c for equivalent typos.
  • Improved gamgi_gtk_cell_position.c, so second level dialogs in Cell->Create and Cell->Modify are now ready to handle translation, rotation cell alignments.
  • Improved gamgi_gtk_cell_link.c, so Cell->Link is now ready to handle object, static and dynamic linking modes.
  • Simplified notation in gamgi_gtk_*.c files: item instead of menu_item, menu instead of option_menu in get_data/set_data functions, button instead of toggle_button.
  • Found and removed a bug in the Cell translation code: the origin translation, after a change of origin, was wrong, when rotations were involved.
  • The mechanism to perform global object linking is working fine (tested in Cell->Link) and is simple and robust.
  • All functions are now working with the new selection functions. Improved the gamgi_mesa_select.c layout.
  • Converted gamgi_gtk_modify* and gamgi_gtk_remove* functions to new selection architecture.
  • Redesigned the whole object selection architecture: there is now a single function managing the whole procedure, with a callback mechanism, making object selection code much more elegant and easier to maintain and expand.
  • Gamgi is running on my IBM ThinkPad T43, with Ubuntu Breezy 5.10 (with all library dependencies compiled by myself).
  • Redesigned the dialog Layer->Link, according to the new style. Started preparing global object links with this dialog.
  • Added two screenshots to www.gamgi.org.
  • Found and removed a bug in Cell->Modify: in three get_data calls the old name Origin was still used, instead of Translation, causing Gamgi to crash.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.8
21th December 2005
Redesigned completely the dialogs Light->Create and Light->Modify, Layer->Create and Layer->Modify, Text->Create and Texte->Modify. Implemented all the GUI funcionality for the second level dialogs Cell->Translation and Cell->Rotation. Found and removed a Light bug affecting the Layer background color. Found and removed a bug in Cell->Modify affecting the Cell position.

What is new:

  • Implemented all the Gtk-related functionality in the dialogs Align->Translation and Align->Rotation.
  • Redesigned the dialogs Text->Create and Text->Modify, according to the new style used in Cell->Create and Cell->Modify.
  • Implemented Align->Translation and Align->Rotation dialogs in Cell->Create and Cell->Modify, to allow complex Cell positioning.
  • Found and removed two bugs in gamgi_gtk_cell_modify: in Absolute and Relative modes, the base was the physical instead of the logical origin, leading to wrong cell positions in two cases.
  • Improved error checking in gamgi_gtk_cell_modify, regarding origin node.
  • Found and removed a bug: when using a light background color, this changed AFTER the first draw, when lights were created. Disabling lighting before the layer blend code solves the problem, so now the background color remains always constant.
  • Improved Cell->Create and Cell->Modify dialogs, to accept level 1 dialogs, to align cell origin and orientation.
  • Redesigned the dialogs Layer->Create and Light->Modify, according to the new style used in Cell->Create and Cell->Modify.
  • Redesigned the dialogs Light->Create and Light->Modify, according to the new style used in Cell->Create and Cell->Modify.
  • To allow users to change the language immediately, without restarting GAMGI, we are planning to store dialog labels and messages in XML files.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.7
2nd December 2005
A fast version of the Jodrey algorithm to generate Random Close Packed Structures (RCP) has been developed and tested. The XML formats documentation has been fully updated. The word GAMGI is now a European Union Trademark.

What is new:

  • Integrated the RCP code in GAMGI: gamgi_phys_rcp.[c,h].
  • A new version of the RCP code, with double lists for ranges and going only until density = 0.65, shows no improvements.
  • The new implementation of the RCP Jodrey algorithm is about 7 times faster for 50,000 atoms than before.
  • The word GAMGI is now a registered trademark in all 25 countries of the European Union!
  • In the RCP code, cell lists should be single but range lists should be double, as data concentrates in the same range list, at end of the calculation.
  • The new implementation of the RCP Jodrey algorithm is about 20 times faster than the previous version, for a 500 atom system.
  • Added <float.h> to the list of primary libs included in gamgi_engine.h.
  • Updated the formats documentation for all config data.
  • Updated the formats documentation for all object data.
  • A new version of the RCP code, separating all atoms from their pairs, shows no improvements.
  • A second version of the Jodrey algorithm is now running, based on cells, about 8.5 times faster for a 500 atom system.
  • Implemented the Jodrey algorithm to build a Random Close Packing (RCP) atomic glass, with periodic boundary conditions.
  • Updated XML DTDs for all object and config data.
  • Found and removed a bug in gamgi_phys_cell_link for Sphere and Parallelepiped Volumes, with Objects cutoff: the first node is no longer the origin, so atom coordinates were wrong.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.6
22th October 2005
The Cell->Create and Cell->Modify dialogs are completely new, providing a simpler interface and more functionality: Cells axes and the Cell node (000) can now be easily controled using these dialogs. Crystallographic Planes and Directions in direct space can now be imported/exported to GAMGI XML files.

What is new:

  • Simplified static_apply_object in gamgi_expat_import.c.
  • Direct space visual representations of Planes and Directions can now be exported/imported to GAMGI XML files.
  • All the new Origin functionality is now fully available from the Cell->Modify dialog.
  • Cleaned gamgi_gtk_cell_create* and gamgi_gtk_cell_modify* files.
  • Found and removed a subtle bug in gamgi_gtk_cell_modify.c: enable menus before changing their order, otherwise...
  • Merged gamgi_phys_wyckoff* into gamgi_phys_symmetry* files, so all arrays with crystallographic data are now in the same file.
  • Renamed gamgi_gtk_cell_crystal* and gamgi_phys_crystal* as gamgi_gtk_cell_symmetry* and gamgi_phys_symmetry*, respectively.
  • Redesigned the Cell->Modify dialog, as Cell->Create before, to support more Cell functionality.
  • All the origin functionality is now working in the new Cell->Create dialog. This includes nodes (primitive and centered) and axes, with both primitive and conventional vectors.
  • Redesigned the Dialog->Create dialog, which is now based on a notebook widget, to support more Cell functionality.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.5
8th October 2005
Completed the reorganization of the Cell Link code, which is now simpler and can handle any origin node (000) change, making the GAMGI patterns to link nodes even more useful. These origin changes are now properly handled in reciprocal lattice transformations and the plane (hkl) indexing in the reciprocal lattice is also ready to support them (the GUI code is still lacking). New screenshots.

What is new:

  • The plane indexing for all reciprocal lattices and cell volumes, when the cell origin, node (000), is moved to any other arbitrary node (inside the cell or not), is completed and tested. This should be the last major task to adapt all the GAMGI Cell code to work with arbitrary node (000) positioning. What remains to be done is Gtk code.
  • Improved quaternion identification globally.
  • Improved the code handling cell origin and cell axes in gamgi_expat_import_object.c and gamgi_expat_export_object.c.
  • The Reciprocal Lattice transformation now handles gracefully any change in cell origin, node (000), for all Cell lattices and volumes.
  • More gamgi_phys_cell_link.c cleaning.
  • Made a full backup for /home/gamgi/ at www_gamgi_org.
  • Added new screenshots, from Amelia Almeida PhD thesis, showing Al-based intermetallic compounds.
  • Cleaned again gamgi_phys_cell_link.c, which is now more powerful, more elegant and much simpler to maintain.
  • New Cell->Link is now working for Wigner-Seitz Cell volumes.
  • Updated the gamgi_phys_cell.c API, so same functions can also be used in gamgi_phys_cell_link.c code.
  • Added Debian Sid/Sarge default configuration to make_local, thanks to Carlos A. Neves, Instituto de Química da Universidade de São Paulo.
  • New Cell->Link is now working for R nodes in Conventional Cell volumes.
  • New Cell->Link is now working for C nodes in Conventional Cell volumes.
  • New Cell->Link is now working for B nodes in Conventional Cell volumes.
  • New Cell->Link is now working for A nodes in Conventional Cell volumes.
  • New Cell->Link is now working for I nodes in Conventional Cell volumes.
  • New Cell->Link is now working for P nodes in Conventional Cell volumes.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.4
26th September 2005
Planes and Directions can now be represented outside the Cell Volume. Removed a bug when drawing bonds. The cell origin can now be changed to any node, even outside the Cell volume. Cell axes can now be represented, with primitive or conventional vectors. Cell->Link already works with arbitrary cell origins, for Primitive, Parallelepiped, Sphere, Conventional Hexagonal Cell Volumes, allowing many more patterns to fill Cells. Most indexing work to translate planes in the reciprocal lattice, when the cell origin changes, is done.

What is new:

  • Replaced static_parallelepiped_sphere_points and static_parallelepiped_sphere_index in gamgi_phys_cell_link by common functions static_primitive_points and static_primitive_index, valid also for conventional cases.
  • Removed the special (000) node position in Sphere and Parallelepiped Cell volumes. Code to create node coordinates and indexes is now simpler, but the node (000) is not necessarily the first in the array.
  • Cell->Link is now working fine (including replication) when the lattice is hP and the Volume is Conventional.
  • Cell->Link is now working fine (including replication) when the cell origin is moved, for Primitive volumes.
  • Cell->Link is now working fine when the cell origin is moved, for Sphere and Parallelepiped volumes.
  • Introduced functions gamgi_math_cell_orientation_get and gamgi_math_cell_orientation_get, so now the interface with a cell position/orientation is exclusively done through these 4 get/set (mentioned below) functions.
  • Separated gamgi_math_cell_position in gamgi_math_cell_orientation_set and gamgi_math_cell_position_set, so the interface with these functions is cleaner. These functions shift the cell to the new origin node.
  • The cell (000) node origin can now be changed to any other lattice, using conventional or primitive vectors coordinates. The notation 000, 110, 101, 011, 111, 211, 122 is used to indicate inner nodes in conventional cells.
  • Origin axes (conventional or primitive) can now be imported and exported to GAMGI XML files.
  • Developed (and tested) functions to convert nodes from conventional to primitive coordinates and vice-versa.
  • Cell axes can now be represented in Conventional and Primitive vectors. The new code is used also for Layer axes. Both Cell and Layer axes are also drawn in scan mode.
  • Found and removed a serious old bug affecting vertical bonds and axes: the rotation axis could be (0,0,0).
  • Rewrote the code to built axes for layers and for cells.
  • When the reciprocal lattice is determined, the origin should be always at (000) (users can change the origin after that).
  • Found and removed a bug in gamgi_phys_plane.c: in gamgi_math_polygon_scan (), use cell_new->points instead of cell->points, as the two arrays might be different.
  • Found and removed a typo (but potentially harmful) in gamgi_math_vector_translation: n3 instead of n2.
  • When the Cell origin changes, Planes and Directions are represented correctly now, in direct space.
  • When the Cell origin changes, properties measured from Planes in the reciprocal space are correctly calculated now.
  • Planes,Directions outside the Cell volume can now be created safely (the representation is built with the 3,2 points used to define the object.
  • When the Cell origin changes, the Planes in the reciprocal space are correctly identified now.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.3
10th August 2005
Crystallographic planes and directions can now be directly visualized. Sphere and Parallelepiped volumes now have the standard default orientation and the code is much simpler. Cleaned and reorganized important sections of the crystallographic code. Found and removed a nasty memory bug that went unnoticed for years.

What is new:

  • Direct visualizations of crystallographic Planes and Directions can now be easily created, without restrictions, for all types of Cell volumes.
  • Replaced Cell Rhombus by Cell Parallelepiped (the correct name) in all gamgi_phys code. Extend futurely to the whole code and documentation.
  • Lots of cleaning in gamgi_phys_cell_create.c, gamgi_phys_cell.c and gamgi_phys_plane.c: more than 2000 code lines were moved away or made redundant.
  • Cell->Link is working again, with the new code for Cell Rhombus and Sphere volumes.
  • Rewrote all the code covering Cell Parallelepiped and Sphere volumes. This is much simpler and easier to maintain than the tricky code we had before. Moreover, now both Cell Parallelogram and Sphere volumes obey the standard orientation for conventional cells.
  • Found and removed a nasty bug, that went unnoticed for years: points = cell->points was missing in functions handling centered cells in gamgi_phys_cell_create.c. It worked because points was defined just before, to the same address, and by "chance" it was still valid!
  • Started cleaning all the crystallographic code. Rhombus and Sphere in reciprocal lattice are now fully working with the new code.
  • Polygon functions are now reunited in the file gamgi_math_polygon.c, which helps cleaning the Cell code.
  • Cell rhombus volumes are now built with the same orientation as the other cell volumes, with the conventional vectors along the main axes.
  • Uncoupled the code to find nodes inside a sphere and to get the node range to search, used somewhere else. Fixed this code.
  • Crystallographic directions can now be seen as segments, for all volumes and types of cells.
  • Found and removed a bug in gamgi_phys_plane.c: in spherical volumes, horizontal planes as (001) produced bogus rotation matrices.
  • Replaced triangle_fans by a single loop, when describing a plane by a polygon.
  • Implemented a 3D version of the Graham's algorithm to build convex polygons, much simpler than our previous algorithm.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.11.2
16th July 2005
Crystallographic planes can now be represented by polygons, for all volumes, with minor restrictions. The Cell orientation in a Spherical volume is now the same as for Conventional, Primitive, Wigner-Seitz cell volumes.

What is new:

  • Polygonal planes now works for spherical Cell volumes.
  • Found and removed a bug: sometimes GAMGI crashes in gamgi_engine_copy_out_cluster, after modifying a Layer after using Save several times after various Voronoi tesselations. Reason: n_paints was not copied.
  • Polygonal planes now support cell rotations and translations, before and after plane creation.
  • Polygonal planes are now working, still with shortcomings.
  • The code to get a direct, polygonal, representation of a plane is partly written and seems to work fine.
  • Replaced large and complex static_sphere code in gamgi_phys_cell_create.c, gamgi_phys_cell_link.c and gamgi_phys_plane.c by small, simple and slightly slower code (not critical, as these functions run only once when creating, linking or measuring cells). Moreover, the node orientation in Sphere volume is now the same as for Conventional, Primitive and Wigner-Seitz volumes.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI 0.11.1
4th July 2005
Crystallographic planes are now working fine in the reciprocal space, for all Bravais lattices and cell volumes. Corrected several errors in the Rhombus cell volume code.

What is new:

  • The planes in the reciprocal lattice are now rotating and translating fine.
  • The atom-plane and atom-direction for crystallographic planes and directions are now measured from the atom to the cell origin.
  • All the plane properties are now measured correctly when the plane is directly linked to its reciprocal space cell.
  • The distance per node now measures the real distance, when the direction indices are multiple.
  • Redesigned the code to get hkl (reciprocal space) and uvw (direct space) vectors in cells and cleaned code accordingly: gamgi_math_measure.c and gamgi_mesa_rotate_out.c.
  • Found and removed a bug in the Cell Link code for Rhombus volumes: the y node coordinates can be negative, when cells have angles larger than 90 degrees.
  • Found and removed a bug in the Cell Create code for Rhombus volumes: node positions were not correctly generated.
  • Found and removed a bug in the Cell Link code for Rhombus volumes: the length increases for the outer cell were wrong.
  • Determined the plane positions for all lattices and volumes in the reciprocal space.
  • Determined the plane indices for all lattices and volumes in the reciprocal space.
  • Planes can now be automatically added to reciprocal space lattices.
  • Cleaned the toolbar,statusbar color code in gamgi_gtk_window.c and gamgi_gtk_statusbar.c.
  • The statusbar now shows accumulated Rotate,Move,Scale actions done with the ruler.
  • Rotate,Move,Scale ruler parameters can now be imported.
  • Rotate,Move,Scale ruler parameters can now be exported.
  • Cleaned gamgi_gtk_statusbar.c.
  • Added file_import.html and file_export.html documentation files to Help->Current and Help->Topic.
  • The ruler now supports accurate, step-by-step incremental values, for Rotate, Move and Scale.
  • Added the Window->Config dialog, to set the max,step parameters needed to improve the rotate,move,scale ruler functionality.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Improve Move and Rotate interactive usability.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
  • Review the entire GAMGI code, file by file.
GAMGI old
 
gamgi-0.17.5/doc/changelogs/changelogs12.html000066400000000000000000001270651433127522700207330ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.12
GAMGI 0.13
2nd February 2008
Grabed data on the most important isotopes (masses, abundances, half-life times) and radius (natural element atom-atom distances, effective and calculated atomic radius, covalent, van der Walls). Grabed data on the widely used Shannon ionic radius (depending on valence, coordination and spin). Although already merged with GAMGI, all this data is not available yet for final users (except covalent radius). Prepared glib_gtk_gtkgl.tar.gz, containg all the old glib, gtk and gtkglarea .h and .so files needed to compile GAMGI on x86, x86_64 and ppc architectures, available from ftp://ftp.gamgi.org/gamgi/src/. Fixed a bug in Plane->Create.

What is new:

  • Updated the INSTALL file included with the GAMGI tarball.
  • Merged the new data and drivers on mass, ionic radius and atomic radius with GAMGI.
  • Wrote and tested the driver to handle the various atomic radius.
  • Added data describing radius: natural atom-atom distances in elements, atomic (effective and calculated) and van der Waals radius (currently GAMGI comes only with covalent radius). Many thanks to Luis Veiros, who helped collecting this data. Source: Web_of_Elements.
  • GAMGI comes only with covalent radius.
  • Wrote and tested the driver to handle the shannon ionic radius.
  • Wrote and tested the driver to handle the isotopic data.
  • Added data describing the well known Shannon ionic radius, published in Acta Crystallographica in 1976 for most elements, as a function of valence, coordination and spin, and widely used today, namely in ceramics books. Many thanks to Pedro Isidoro, who sent me copies of the 1969 and 1976 Shannon papers.
  • Added data describing the main isotopes for all elements, including abundances and half-life times. Source: Wikipedia, Web_of_Elements, and others.
  • Prepared a file, glib_gtk_gtkgl.tar.gz, containg all the glib, gtk and gtkglarea .h and .so files needed to compile GAMGI on x86, x86_64 and ppc architectures, available from ftp://ftp.gamgi.org/gamgi/src/.
  • Found and removed a little bug in Plane->Create: when the initial and final order was the same, the order was always 1.

What is next:

  • Redesign Atom->Create and Atom->Modify, according with the new notebook style, with more properties, including a wide range of atomic radius.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Port GAMGI to GTK 2.* or (3.*).
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.12
3rd December 2007
Wrote tutorials about Point Symmetry and Voronoi Tesselation and added older tutorials to the GAMGI Help mechanism. Redesigned Cell->Measure, which can be used now to analyse Geometry, Voronoi Tesselation and Reciprocal Lattice. Improved Plane->Create, Plane->Modify, Direction->Create, Direction->Modify, slashing several important positioning bugs. Plane->Modify, Direction->Modify and XML files fully work now with autonomy All. Removed two bugs gone unnoticed with some gcc versions, resulting in a warning and an error, when compiling. If no major problems are found, next release will be 0.13.

What is new:

  • Changed the default colors for GAMGI text documentation.
  • Soved a positioning bug in Plane->Modify and Direction->Modify, when going to atomic planes, directions from objects with a different position.
  • Solved a positioning bug in Plane->Create and Direction->Create, with atomic planes and positions, introduced with last release changes.
  • Solved a positioning bug in Plane->Modify and Direction->Modify, when changing from All to Partial or None Autonomy, introduced with the Autonomy All new code.
  • Fixed a bug when importing planes, directions with autonomy ALL from XML files.
  • Atomic and crystallographic planes and directions can now be modified in all cases where old or new Autonomy is All.
  • Updated the dialog dimensions for Help->Tutorial and Help->Topic.
  • We are planning to port GAMGI to GTK 2* (or perhaps 3*), as this seems to be the most reasonable long-term solution for GAMGI. Even OLPC, a notoriously unbloated project, is using GTK2 these days. (with Python).
  • Added a two-page tutorial on Voronoi tesselation.
  • Added a two-page tutorial on Point Symmetry analysis.
  • Added <ctype.h> in gamgi_gtk_help_dialog.c, to avoid a warning silently accepted by gcc 3.3.4.
  • Removed a parsing error (void left) in gamgi_gtk_gamgi_exit, silently accepted by gcc 3.3.4.
  • Tested and cleaned gamgi_phys_reciprocal.c, with shifted cell node origin: no bugs found.
  • Fixed a XML glitch in formats/text/create_contents.html.
  • Updated the documentation information on www.gamgi.org.
  • Added the tutorials on occupancy rules, nanostructure and RCP, available from the documentation, to the interface Help subsystem.
  • Removed gamgi_math_cell_transform, replaced by gamgi_math_position_rotation, gamgi_math_position_translation.
  • Simplified the position code in gamgi_phys_plane, gamgi_phys_direction, gamgi_phys_cell_link and gamgi_phys_rcp (the cell center is no longer needed in these functions).
  • Found a old bug in the bond code: when the selected object has only one of the atoms, bond->first changes when rotating, moving. We think we have a good solution for this structural problem, even for the future, when most objects will be allowed to have multiple, unlimited, parents: attribute ids to internal tasks.
  • Cracked a problem regarding rotation and translation of planes and directions imported from XML files.
  • Moved Cell->Measure to the new style and added Geometry and Voronoi methods, as in Group-, Molecule- and Cluster->Measure dialogs.
  • Removed a simple bug just introduced in gamgi_gtk_direction_create.c, that crashed GAMGI when attempting to create an atomic direction.
  • Solved partially a positioning problem when importing atomic planes, directions, with Partial Autonomy.

What is next:

  • Redesign Atom->Create and Atom->Modify, according with the new notebook style, with more properties, including a wide range of atomic radius.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Port GAMGI to GTK 2.* or (3.*).
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.11
25th October 2007
Improved the usability of the dialogs Plane->Modify and Direction->Modify. Crystallographic and atomic planes and directions with Partial Autonomy, can now be arbitrarily positioned. Redesigned and reunited in a single file the code to position objects, which is now much more consistent, simpler, and easier to maintain. Replaced Layer, Plane, Direction enumerations by a common one, easier to understand. Replaced XML possible values yes,partial,no by all,partial,none, for visibility_in, visibility_out in layers and autonomy in planes, directions, to be consistent with the dialogs.

What is new:

  • Temporarily disabled Plane->Modify and Direction->Modify, when the old or new Autonomy is All, until we find the best approach to the problems involved.
  • Harmonised the error messages when a feature is not supported yet.
  • Changing arbitrary positions for atomic planes and directions is now working fine, when done from Plane->Modify or Direction->Modify.
  • Simplified and improved the functions in gamgi_math_position.c
  • Removed gamgi_math_plane.c and gamgi_math_function.c and reunited the code inside in a single file, gamgi_math_diophantine.c, covering all the functions related with Diophantine equations.
  • Redesigned all the mathematic rotation, translation code for text, direction, plane, cell objects. This critical code is now much simpler and reunited in a single file: gamgi_math_position.c.
  • Crystallographic planes and directions with autonomy partial or none are now working fine with arbitrary orientation and child objects.
  • Simplified the code handling position and orientation for cells, planes, directions, making it much easier to understand and maintain.
  • The position of planes and directions is now reset before modifying them, in Plane->Modify and Direction->Modify, so the positions of the child objects are correct afterwards.
  • Updated formats documentation for layer and plane, direction.
  • In XML files, replaced parameters yes, partial, no, in layers (visibility_in, visibility_out), planes (autonomy) and directions (autonomy) by all, partial, none.
  • Replaced enumerations TRANSPARENT, TRANSLUCID, OPAQUE (layers) and INDEPENDENT, AUTONOMOUS, AUTOMATIC (planes,directions) by a single enumeration ALL, PARTIAL, NONE.
  • Added gamgi_math_direction.c, currently to handle direction positioning code.
  • The positioning code for crystallographic planes and directions is now well tested and is working fine, after fixing a few rotation, translation issues.
  • Crystallographic planes with autonomy Partial or All can now be exported,imported with arbitrary position and orientation.
  • Plane,Direction position and orientation is now exported, imported to XML files, when the autonomy is Partial or All.
  • When the type of plane,direction changes in Plane->Modify, Direction->Modify, the same defaults as in Plane->Modify, Direction->Create are shown.
  • Added GTK_WIDGET_VISIBLE macros to improve the interface behaviour in Plane->Modify and Direction->Modify.
  • Added rotation and translation to molecule and group containers.
  • Controling position and orientation in Plane->Modify is now working fine, for polygon crystallographic planes.
  • Added a page Position to Plane->Modify and Direction->Modify.
  • Fine tuned Plane->Modify and Direction->Modify behaviour. Fixed default values for projection and autonomy parameters of planes/directions.
  • Corrected a bug in gamgi_engine_find_object() when Gamgi is the selected object, and improved the code in gamgi_engine_find_object(). As a result simplified static_bond_parent() in gamgi_expat_export.

What is next:

  • Write tutotials about Point symmetry analysis, Voronoi analysis and Plane,Direction usage, including atoms.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.10
19th September 2007
Added a Geometry method in Group->Measure, Molecule->Measure and Cluster->Measure, that reports all the bond lengths, angles and torsions, including the number of occurrences, the minimum and maximum values, the average and standard deviation. Updated the Help code and documentation for Geometry, Symmetry and Voronoi methods in Group->Measure, Molecule->Measure and Cluster->Measure and RCP documentation in Cell->Link.

What is new:

  • Added gamgi_io_x3d.c to receive the exporting x3d code.
  • Removed a little bug in the xyz exporting code: when the selected object was a single atom, it was not exported.
  • Removed gamgi_engine_dlist_atom_scope, replaced by gamgi_engine_dlist_atom_object, which is more general.
  • Updated the Help code for the RCP method in Cell->Link. Wrote the documentation for the RCP report produced.
  • Updated the Help code related with Measure dialogs for Group, Molecule and Cluster, related with, Geometry, Symmetry and Voronoi.
  • Updated all the documentation for Geometry,Symmetry and Voronoi measure methods for Group, Molecule and Cluster.
  • The Geometry method is now fully working for Groups, Molecules and Clusters.
  • Bond length, angle and torsion sequences in the measure method Geometry are now ordered.
  • Bond lengths are now calculated in the measure method Geometry. Bond angles and torsions need some redesign.
  • Most of the Geometry method is now tested and working.
  • Linked the method Geometry in Group->Measure, Molecule->Measure and Cluster->Measure.
  • Wrote most of the code to implement the geometry method, to report bond lengths, angles and torsions in groups, molecules and clusters, including minimum and maximum values, average and standard deviation.

What is next:

  • Write tutotials about Point symmetry analysis, Voronoi analysis and Plane,Direction usage, including atoms.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.9
31th August 2007
Fixed a bug in the Wigner-Seitz cell code that crashed GAMGI when applying space group information, with more than one Wyckoff position (thanks Pedro, for spotting this one!). Point Symmetry and Voronoi tesselation analysis can now be done for Group, Molecule and Cluster objects. The dialogs for these methods are new, according to the notebook model. Solved a couple of glitches with ppm, png, tiff and jpeg exporting formats. Started playing with X3D.

What is new:

  • Solved a little problem in gamgi_gtk_measure_voronoi_init, affecting the default View page in the Voronoi method.
  • Added new scientific links to the Links page (Thanks Pedro!).
  • Created the dialog Group->Measure, that is now measuring the same methods as Molecule->Measure and Cluster->Measure.
  • The dialogs Molecule->Measure and Cluster->Measure are now measuring Symmetry, Voronoi methods, and is ready for any other methods, such as geometry.
  • Redesigned parts of the code in gamgi_gtk_molecule_measure.c, gamgi_gtk_cluster_measure.c and gamgi_gtk_cell_measure.c, in order to share this functionality among the various Object->Measure dialogs.
  • Redesigned the Cluster->Measure dialog, according to the new style.
  • Redesigned the Cell->Measure dialog, according to the new style.
  • Redesigned the Molecule->Measure dialog, according to the new style.
  • Updated the gamgi.org link pages. Reviewed all the links and added new scientific links.
  • Wrote information for GAMGI-supported ppm, png, tiff and jpg file formats. Fixed a detail in the ppm format (comment in the second instead of fourth line).
  • Fixed a old bug in the Wigner-Seitz Cell Link code, that crashed GAMGI when multiple positions were generated, from space group information (thanks Pedro!).
  • Fixed a glitch in the code exporting .png files: a typo added to test code malfuctioning was left there (letter 'a' at line 723 at gamgi_io_file.c) actually preventing png from working.
  • Fixed a glitch in the code exporting .ppm files: the last end of line was missing (sent to stdout actually!).
  • Started writing code to export X3D files. The header and the root node are done. Xj3D hapilly loaded GAMGI first (empty!) X3d file.

What is next:

  • Write tutotials about Point symmetry analysis, Voronoi analysis and Plane,Direction usage, including atoms.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.8
2nd August 2007
GAMGI can now export .ppm files (natively) plus .png, jpeg and .tiff (thanks to pnmtopng, pnmtojpeg and pnmtotiff). Removed a trivial but crashing bug in Group->Modify (added last release). Wrote documentation for all the Object->Remove and Object->Modify dialogs. Wrote documentation for Plane and Direction interfaces and formats. Updated Help->Current, Help->Topic and Help->Start code to account for all the changes. Updated small changes in Bond and Cell labels, in interfaces, formats and documentation, including Tutorials. Updated gamgi.org to reflect all the documentation and label changes.

What is new:

  • Wrote XML Format documentation to create crystallographic and atomic planes and directions.
  • Updated Help->Current and Help->Topic, to account for recent changes in Cell, Plane, Direction and Bond interfaces and formats.
  • Updated Help Formats documentation for Cell and Bond.
  • Wrote the Help documentation for Direction->Modify.
  • Wrote the Help documentation for Plane->Modify.
  • Updated all the Installation documentation.
  • Fixed a trivial but nasty bug in Group->Modify (introduced last release): this old, soon to be replaced, dialog has no Global button, so GAMGI crashed when pressing the mouse on screen.
  • Deleted *0.11.* old files from ftp.gamgi.org.
  • Rewrote the Help documentation for Cell->Modify.
  • Rewrote the Help documentation for Bond->Modify. Improved the labels in Bond->Create and Bond->Modify dialogs (Mode, Type instead of Type, Strength).
  • Rewrote the Help documentation for Light->Modify.
  • Rewrote the Help documentation for Layer->Modify.
  • Rewrote the Help documentation for Text->Modify.
  • Updated the Help documentation for Assembly->Link, Cluster->Link, Text->Link and Group->Link (recursive objects).
  • Updated Plane->Create and Direction->Create Help documentation.
  • Fixed a bug in the new Layer->Remove dialog: the All mode was always assumed when deciding if a new current layer was needed.
  • Wrote the Help documentation for the new Object->Remove dialogs.
  • GAMGI can now export any top window graphic area in png, jpeg or tiff formats, thanks to the standalone programs pnmtopng, pnmtojpeg and pnmtotiff.
  • GAMGI can now export any top window graphic area in ppm format.

What is next:

  • Write tutotials about Point symmetry analysis, Voronoi analysis and Plane,Direction usage, including atoms.
  • Improve documentation all around.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.7
14th July 2007
The Object->Remove dialogs were all rewritten, according to the notebook style, providing much more funcionality. Plane->Modify and Direction->Modify can now be used in most situations, but positioning is not done yet. Fixed a serious bug (added 4 releases ago) crashing GAMGI when multiple top windows were used simultaneously. Improved a few XML/GUI labels and rules for mouse handling in dialogs.

What is new:

  • From now on, the id of objects selected with the mouse in Object->Remove dialogs overwrite the previous id contents.
  • Found and removed a nasty bug introduced: GAMGI was crashing when pressing in a different window, in Create,Remove,etc. dialogs ;-). Apparently introduced in release 0.12.3, when global selection was "improved", in Link,Copy,Select dialogs.
  • Rewrote the Window->Close dialog, using the new notebook style, with several new removing options.
  • Fixed a dangling pointer in the new code to handle remove dialogs.
  • Rewrote the Direction->Remove dialog, using the new notebook style, with several new removing options.
  • Rewrote the Plane->Remove dialog, using the new notebook style, with several new removing options.
  • Rewrote the Layer->Remove dialog, using the new notebook style, with several new removing options.
  • Rewrote the Light->Remove dialog, using the new notebook style.
  • Added an option to remove Bonds in all Object->Remove dialogs.
  • Fixed a bug in Link and Remove dialogs: check properly if the current object is affected when removing or moving an object. Improved gamgi_engine_find_object.c to work also with bonds.
  • Fixed the path for documentation in Help->Start.
  • Rewrote the Assembly->Remove dialog, using the new notebook style, with several new removing options.
  • Rewrote the Cell->Remove dialog, using the new notebook style, with several new removing options.
  • Rewrote the Cluster->Remove dialog, using the new notebook style, with several new removing options.
  • Rewrote the Molecule->Remove dialog, using the new notebook style, with several new removing options.
  • Rewrote the Group->Remove dialog, using the new notebook style, with several new removing options.
  • Rewrote the Text->Remove dialog, using the new notebook style, with several new removing options.
  • Rewrote the Atom->Remove dialog, using the new notebook style, with several new removing options.
  • Crystallographic and atomic planes,directions can now be easily modified using Plane->Modify and Direction->Modify. Positioning is not done yet.
  • Updated XML files in dat/ to new type,autonomy labels.
  • Changed Model to Type in plane, direction objects.
  • Changed Volume to Type in cell objects.
  • Changed Dependence to Autonomy in plane, direction objects.

What is next:

  • Improve documentation all around.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.6
27th June 2007
Atomic planes and directions can now be imported and exported to XML files. Crystallographic planes and directions can now be modified using the improved Plane->Modify and Direction->Modify dialogs. Updated the model to handle planes and directions. Improved error checking and fixed bugs for planes and directions.

What is new:

  • Fixed some glitches in Plane->Modify and Direction->Modify.
  • Crystallographic planes and directions can now be modified with Direction->Modify and Plane->Modify, as long as atoms are not involved.
  • Found and fixed a bug: when linking an atom elsewhere, bonds were not correctly removed, because the list of bonds was corrupted in the process.
  • When the atoms defining atomic planes,directions are removed or linked elsewhere, the planes,directions are removed, after saving the child objects to the immediate parent above.
  • Crystallographic planes and directions can not be linked to different objects, even if they are Cells. Atomic planes and directions can be freely linked to other objects, even in different layers and windows.
  • Recursive objects can now be linked above to objects of the same class that initially were below.
  • Improved the Plane->Modify interface.
  • All parameters to modify are now imported in Direction->Modify.
  • All parameters to modify are now imported in Plane->Modify.
  • Error checking for XML planes and directions is now comprehensive and simple to maintain. In particular this fixes the crashing bug for cell planes and directions without cell, with direct parents.
  • Improved code handling plane order in gamgi_gtk_plane_create.c
  • Atomic planes and directions are now properly checked for errors when imported from XML files.
  • Another round of improvements on atomic planes,directions code.
  • Atomic planes and directions can now be imported and exported, for all dependence modes: Yes, Partial and No. The corresponding safety tests are not implemented yet though.
  • Fixed a problem when creating crystallographic direction ranges: the node now obtained is the one along the direction that is closer to the cell (translated) origin.
  • Improved crystallographic Plane code: removed gamgi_phys_plane_node.
  • Separated the atomic Plane, Direction code, so this can be used to import atomic XML Plane, Directions.
  • Added documentation for xyz, postscript files.
  • Plane,Direction parameters Reference,Dependence,Thickness are now imported,exported fine for crystallographic planes.

What is next:

  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.5
19th April 2007
Created Plane->Modify and Direction->Modify dialogs, improved Plane->Create and Direction->Create dialogs, redesigned Plane, Direction functionality, and the way Plane, Direction are handled internally. Simplified code, removed bugs, fixed the standard xyz format.

What is new:

  • Improved center determination for a set of objects, using specific weights for each object class, so rotations with the mouse are slightly more intuitive and faster.
  • Added center, origin, quaternion to group, molecule and assembly containers (these were already included in the other containers: cluster and cell).
  • Fixed the rules to modify AUTOMATIC, AUTONOMOUS and INDEPENDENT plane,directions.
  • Improved the gtk code, interface for Plane->Create, Direction->Create, Plane->Modify and Direction->Modify.
  • Added a reference parameter for plane,direction objects, to properly identify the reference used to build these objects.
  • Added checks for atom parents when creating atomic planes, directions.
  • New direction modes Automatic, Autonomous, Independent are implemented and working fine.
  • New plane modes Automatic, Autonomous, Independent are working fine. Key atoms cannot have planes, directions as parents. Key atoms are reordered in the beginning.
  • Fixed a bug in gamgi_expat_import afecting Plane,Direction projection: default mode must be added here, when cell is known.
  • Changed again Plane and Direction dependency rules: futurely these objects will have Automatic, Autonomous or Independent types of connection with the defining objects, Cell or Atoms.
  • Fixed a bug in gamgi_gtk_object_independent: returned FALSE instead of TRUE, so objects could not link.
  • Fixed a bug in gamgi_phys_plane_atoms, gamgi_phys_direction_atoms: atom positions must be projected when added to polygon, line.
  • Updated phys, gtk, mesa code to handle the new link,thickness parameters for plane,direction.
  • The 04 menu is now handled in a common way (and solved a little bug) in Cell, Plane and Direction dialogs.
  • Fixed the behaviour for dialogs Plane->Modify and Direction->Modify.
  • Fixed the layout for dialogs Plane->Modify and Direction->Modify.
  • Improved the way Link and Thickness parameters are handled in dialogs Plane->Create and Direction->Create.
  • Created the dialogs Plane->Modify and Direction->Modify.
  • Fixed the xyz format, to conform with the usual specification of this format: element names instead of numbers and a comment second line.
  • Corrected a bug in the Voronoi code: in some cases, the borders limit could be zero, triggering nans. In principle this affected speed only. Cleaned the Voronoi code.
  • Updated the GAMGI XML files with planes,directions in stereographic projections, to work with the new model parameter.
  • Poles and Traces for a given plane,direction in a stereographic projection are now created as independent objects.
  • Changed the way used to control the representation of planes and directions. The XML parameters plane, trace, polygon have been replaced by a single parameter model, with values: pole, trace, polygon, line, reciprocal.

What is next:

  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.4
15th December 2006
Implemented the dialogs Window->Copy, Layer->Copy, Light->Copy, Assembly->Copy, Cell->Copy, Cluster->Copy, Molecule->Copy, Group->Copy, Text->Copy. Wrote two tutorials showing how to use the occupancy rules implemented in GAMGI, to build non-crystalline structures with cells.

What is new:

  • The window and layer containing the copied objects now raise automatically to the top and are set as current layer and object.
  • Implemented the dialog Window->Copy, in gamgi_gtk_window_copy.c. Data not copied (in gamgi_engine_copy_out_window) must be initialized.
  • Implemented the dialog Layer->Copy, in gamgi_gtk_layer_copy.c.
  • Implemented the dialog Light->Copy, in gamgi_gtk_light_copy.c.
  • Implemented the dialog Cell->Copy, in gamgi_gtk_cell_copy.c.
  • Implemented the dialog Assembly->Copy, in gamgi_gtk_assembly_copy.c.
  • Found a bug in the code to copy objects: when exporting bonds, in some cases the bond parents identification was wrong. It seems the problem is gone, as we cannot reproduce it anymore. The code looks fine. Perhaps a recompilation fixed the problem.
  • Implemented the dialog Cluster->Copy, in gamgi_gtk_cluster_copy.c.
  • Implemented the dialog Molecule->Copy, in gamgi_gtk_molecule_copy.c.
  • Implemented the dialog Text->Copy, in gamgi_gtk_text_copy.c.
  • Added a tutorial showing how to create non crystalline structures, using GAMGI pattern occupancy rules, in Cell->Link.
  • Added a tutorial and a screenshot showing how to create a multilayer nanostructure, using GAMGI pattern occupancy rules, in Cell->Link.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.3
26th November 2006
Global selection between layers is implemented, making object linking operations much easier. Implemented the dialog Atom->Copy. Implemented the Link All method in the Window->Link dialog. Reorganized the Gtk window code. Wrote documentation for the Object->Link dialogs and Atom->Copy. Updated the documentation for Object->Measure dialogs, plus Plane->Create and Direction->Create dialogs.

What is new:

  • Updated the documentation for the dialogs Plane->Create and Direction->Create.
  • Updated Help->Current and Help->Tutorial dialogs, to include all the help files about the new Link->Object dialogs, plus the Atom->Copy dialog.
  • Removed a memory leak added in the previous release in the code to avoid half-bonds in linked objects (a list was not removed). Added a simple but general procedure to avoid half-bonds, when copying objects. So far only implemented in the Atom->Copy dialog.
  • Reorganized the Gtk window code: created gamgi_gtk_window_remove.* files, renamed gamgi_gtk_window.* to gamgi_gtk_window_create.*, cleaned code in gamgi_gtk_reset.* and gamgi_gtk_exit.* files.
  • The method link All, in the Window->Link dialog, is implemented.
  • Updated the documentation for Plane->Measure and Direction->Measure dialogs.
  • Updated the documentation for the Atom->Measure dialog.
  • Added documentation for the new Atom->Copy dialog.
  • Added documentation for all the new Object->Link dialogs.
  • The first Copy dialog, dialog Atom->Copy, is now fully operational.
  • Created the dialog Atom->Copy, in gamgi_gtk_atom_copy.c.
  • Cleaned code in gamgi_mesa_select.c.
  • A friend pointed us to a GPL code to calculate diffraction patterns. This promises to be very useful to GAMGI.
  • Linking objects is now greatly simplified, as objects not in the current layer (in the same or in a different window) can be easily selected.
  • In Object->Link dialogs, the second object address is now global for all linking methods (In Cell->Link, this address was global only for the Object linking method).

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.2
6th November 2006
This is essentially a bug-fix release, correcting several problems related mostly with the new Object->Link dialogs implemented in the previous release and with the graphic engine.

What is new:

  • Found and removed a bug in gamgi_mesa_select.c: when a window was selected, the raised and updated window was the current one.
  • Removed a GlFlush() and a glClear (GL_COLOR_BUFFER_BIT) in gamgi_mesa_drawing and a gtk_widget_queue_draw (window->area) in gamgi_mesa_scan. They seem to be all redundant.
  • Wrote and tested code to pick objects in other layers below the current layer, with the mouse. This is needed for eficient object linking.
  • Cleaned the local,global object selection code, in gamgi_mesa_area.c and gamgi_mesa_select.c files.
  • Found and removed a long standing bug: in Orthographic Layers, when creating new objects as Texts, Cells, Atoms, with the mouse, a very large z coordinate was given to them, when no other object was already there. Now the new objects receive the same depth as the Center of the current Layer (Orthographic or in Perspective).
  • Fixed the way atom scaling was done in gamgi_mesa_draw_atom and gamgi_mesa_scan_atom: it worked fine for the atoms, but not for the child objects, as texts.
  • Fixed a bug in gamgi_gtk_select_ctree_bond: the nodes describing texts linked to bonds were duplicated, because the corresponding function call was called twice.
  • Fixed a bug in gamgi_mesa_draw.c: when child objects were linked to bonds, they would change the atom color.
  • Fixed a bug in gamgi_mesa_rotate.c and gamgi_mesa_translate.c: rotation, translation data only propagated to bond child elements when the selected object was the bond.
  • Added Bond to the list of objects that can be linked above in Text->Link dialogs. This was missing before.
  • Removed a bug in static_clean in gamgi_gtk_bond_link.c, crashing GAMGI because the menu_above does not exist here.
  • Fixed the link between layers and objects containing bonds to atoms outside: these bonds are now automatically removed before the link is applied.
  • Fixed the link between windows and layers (before a crash would take place when the layer was the last one or the current one).
  • When the last layer is removed or linked to a different window, a new layer is now automatically created (before, the action was refused and an error message was shown).
  • Improved static_reset, static_clean, in gamgi_gtk_*_link.c functions, to handle better Object->Link dialogs.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.12.1
18th October 2006
Implemented the dialogs Window->Link, Layer->Link, Light->Link, Plane->Link, Direction->Link, Atom->Link, Bond->Link, Text->Link. Redesined and implemented the dialogs Assembly->Link, Cluster->Link, Molecule->Link, Group->Link. Removed a couple of bugs. Added a tutorial showing how to build a Random Close Packing (RCP) structure.

What is new:

  • Found and removed a bug in gamgi_mesa_draw_assembly and gamgi_mesa_scan_assembly: the final glPopMatrix was missing.
  • Found and removed a bug in gamgi_engine_find_layer: it did not work for bonds, as the parent addressing is different.
  • Implemented the Bond->Link dialog: bonds can now be linked to arbitrary objects, not necessarily in the same window.
  • Implemented the Direction->Link dialog: directions can now be linked to arbitrary objects, not necessarily in the same window.
  • Implemented the Plane->Link dialog: planes can now be linked to arbitrary objects, not necessarily in the same window.
  • Implemented the Light->Link dialog: lights can now be linked to arbitrary layers, not necessarily in the same window.
  • Implemented the Window->Link dialog: windows can now be linked to arbitrary layers, even in other windows, keeping the Undo,Save history lists of those layers.
  • Implemented the Layer->Link dialog: layer objects can now be linked to all types of objects, below and above, in hierarchy.
  • Implemented the Text->Link dialog: text objects can now be linked to all types of objects, below and above, in hierarchy.
  • Updated the Assembly->Link dialog: assemblies can now be linked to all types of objects, below and above, in hierarchy.
  • Updated the Group->Link dialog: groups can now be linked to all types of objects, below and above, in hierarchy.
  • Updated the Cluster->Link dialog: clusters can now be linked to all types of objects, below and above, in hierarchy.
  • Updated the Molecule->Link dialog: molecules can now be linked to all types of objects, below and above, in hierarchy.
  • Laue and multiple planes are now rejected when creating planes passing through nodes incompatible with their indices.
  • Redesigned the way current object and layer are updated in windows statusbar, fixing a bug occurring when the current object was Gamgi and multiple top windows were in use.
  • Fixed screenshot links in www.gamgi.org.
  • Found and removed a bug in Cluster->Measure: when trying to perform a Voronoi tesselation from a Voronoi output cluster, GAMGI was not properly checking for the absence of atoms, resulting in a segmentation fault.
  • Added a tutorial on how to build RCP structures.
  • Website improvements: dynamic images, new screenshots, repaired broken links.

What is next:

  • Add Plane->Modify and Direction->Modify functionality.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Add Object->Copy dialogs with basic copy functionality.
  • Add Contents and Container options in Object->Remove dialogs.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Implement global selection, including global picking algorithms and selection dialogs that include all the selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI old
 
gamgi-0.17.5/doc/changelogs/changelogs13.html000066400000000000000000001677271433127522700207450ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.13
GAMGI 0.14
23rd September 2009
Added 9 geometry and 9 topology properties to the report produced by Group->Create in Polytope mode. Implemented and tested Group->Modify for Polytopes, including transitions in Autonomy and type of polytope: polyhedron, plane, direction. Added Help documentation for Group->Create, Group->Modify, Atom->Create, Atom->Modify. Fixed bugs. New screenshot.

What is new:

  • Enough testing... this is it, GAMGI 0.14!
  • Fixed a few error handling issues in Group->Modify and Group->Create.
  • Moved parent initialization from gamgi_engine_copy_out.c to gamgi_engine_copy.c, so copy_out functions can be used elsewhere without erasing parent information.
  • Group->Modify is working fine in Autonomy mode: All -> None.
  • Fixed a bug in Plane->Modify and Direction->Modify: origin and euler were not initialized, before entering the new values.
  • Group->Modify is working fine in these Autonomy transitions: None -> None, None -> All and All -> All. All -> None is not working yet. Partial Autonomy is not going to be supported soon.
  • Position and orientation is working for Group->Create for all cases, and for Group->Modify when Autonomy is NONE.
  • Further improvements in Group->Modify: GUI, behaviour.
  • Group->Modify is working, except position and orientation.
  • Improved the Group->Modify interface and behaviour.
  • Found and temporarily fixed a bug (disabled autonomy option for planes, directions coming from polytope code): currently atomic planes and directions created from Group->Create cannot support all the functionality available from Plane->Create or Direction->Create (due to single inheritance, exactly as Group->Create). These planes, directions can then be easily modified, including Autonomy, with Plane->Modify or Direction->Modify.
  • Modified the way gamgi_chem_polytope and gamgi_gtk_group_create transfer data, so it works also for gamgi_gtk_group_modify.
  • Fixed two bugs in polytope code: Scale was not updated and color was wrong in one case when creating planes or directions.
  • Created a YBa2Cu3O7 screenshot showing 2D and 3D polytopes.
  • Group->Create Polytope is now reporting 9 geometry properties: polyhedron volumes, areas, lengths and aberrations, face areas, lengths and aberrations, edge lengths and angles.
  • and edge lengths.
  • Added Help->Current and Help->Topic support for Group->Create->Polytope and Group->Modify->Polytope. Previously this was available only for Group->Create and Group->Modify.
  • Found and removed a Group->Create bug: the current action was GROUP_CREATE but it should be GROUP_CREATE_POLYTOPE.
  • Group->Create Polytope is now reporting 9 topology properties: number of polyhedrons, faces, edges and vertices, number of faces, edges and vertices per polyhedron, number of edges|vertices per edge, number of faces|edges per vertex.
  • The Web, Help->Current and Help->Topic are now reading the new documentation for Atom->Modify, Atom->Config, Group->Create, Group->Modify.
  • Updated documentation for dialog Atom->Config.
  • Increased CSS notebook ul width to 60em to avoid tag wrapping in Atom->Modify.
  • Updated documentation for the new dialog Group->Modify.
  • Updated documentation for the new dialog Atom->Modify.
  • Fixed a bug in polytope code: the central atom color should be used, not the color for the central atom element.
  • Wrote documentation for the new dialog Group->Create.

What is next:

  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.15
10th August 2009
Designed, implemented and tested a new algorithm to merge coplanar faces in 3D polytopes. Tolerance for visible and coplanar polytope faces in now controled by users in Group->Create. Improved layout for Atom->Create and Atom->Modify interfaces. Replaced a wide range of GTK 1 deprecated functions by new GTK 2 routines. Fixed a few drawing bugs.

What is new:

  • Tolerance for visible and coplanar faces is now defined directly by users (including disabling face merging).
  • Fixed for Groups the bug previously found for Clusters related with different scaling for Container and Polytope types.
  • The new algorithm to merge coplanar faces is working fine, even with rather complex examples, with 50,000 atoms!
  • Implemented a new algorithm to merge coplanar faces in 3D polytopes.
  • Found and removed a bug: Cluster objects of Container and Polytope types must be scaled in different ways. This problem applies also to Group, Molecule and Association objects.
  • Removed the polytope code to merge coplanar faces, as this is plagued to raise lots of problems due to finite floating point numerical precision. Merging faces will be done only in the end, after the polytope calculation, a much more solid solution.
  • Profiled the polytope code with 50,000 atoms in a cube and on a sphere: we got exactly the same results (3.000000 and 79.000000 sec, respectively) with or without speedups. Therefore removed speedups, to simplify the code and make it less error prone.
  • Improved the View page layout, in Atom->Create and Atom->Modify dialogs.
  • The rendering thickness for Cell and Group wired objects is different: fixed.
  • Found a bug related with half-bonds in Atom->Modify.
  • Removed first and second GTK_OBJECT casts in g_signal_connect_swaped calls.
  • Removed GTK_OBJECT cast in g_signal_connect_after calls.
  • Clarified a problem and filled a bug report for Gnome MetaCity related with gtk_window_set_transient and fullscreen mode that afects Gamgi.
  • Replaced deprecated GTK function: gtk_menu_append. Except in old files gamgi_gtk_file_export.c and gamgi_gtk_file_import.c, that will be replaced soon, no GTK deprecated functions are now used in Gamgi.
  • Removed option_menu widgets and fixed g_object_get_data labels in static_rotation_ok in gamgi_gtk_cell_align.c. When converting to GTK 2 combo boxes, this was left unfinished, so Gamgi would crash immediately when attempting to align a Cell with the Layer or another Cell.
  • Replaced deprecated GTK function: gtk_window_set_policy.
  • Replaced GTK 1 progress by GTK 2 progress bar widget.
  • Replaced deprecated GTK functions: gtk_notebook_set_homogeneous_tabs, gtk_notebook_set_page, gtk_signal_handler_block_by_func and gtk_signal_handler_unblock_by_func.
  • Improved make_rules, following the suggestions of Daniel Leidert, from the Debichem group, packaging Gamgi for the Debian distribution.
  • Prepared screenshots showing the new polytope code.

What is next:

  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.14
15th July 2009
Fixed a couple of bugs in chem and gtk code, including a nasty brown paper bag that crashed the new polytope code in many systems. Everything that can be measured with Atom->Measure can now be modified with the new Atom->Modify dialog. The oldest dialog in Gamgi, Group->Modify, has been replaced by an entirely different dialog, to modify Groups, including polytopes.

What is new:

  • Added bond cleaning when creating Polytopes and improved this cleaning for Planes and Directions.
  • Improved layout for View page in Atom->Create and Atom->Modify. Variancy is now a combo box entry, with 0.0 and 1.0 sugestions.
  • Improved layout for View page in Bond->Modify and Atom->Modify.
  • Fixed position for Autonomy combo box in Plane->Modify and Direction->Modify dialogs.
  • Completed interface behaviour in Group->Modify dialog.
  • Improved Scale behaviour in Group->Modify, Plane->Modify, Direction->Modify dialogs.
  • Replaced Property by Quantity in Plane->Measure and Direction->Measure dialogs.
  • Designed and implemented the new Group->Modify dialog.
  • Modifying atom-2atom distances is now working fine. All the quantities that can be measured with Atom->Measure can now be modified with the new dialog Atom->Modify.
  • Modifying atom-direction distances is now working fine.
  • Modifying atom-3atom distances is now working fine.
  • Modifying atom-plane distances is now working fine for all cases.
  • Fixed a old bug when modifying a torsion angle: the terminal branches of the second atom should change as well, not just the first atom and its terminal branches.
  • The only task dialog in GAMGI still from the first generation, Group->Modify, has been removed. It will be replaced soon by a dialog handling Polytopes, among other things.
  • All the functionality previously available in Group->Modify is now available in Atom->Modify, in the mode Geometry.
  • Completed all the GTK code for the new Atom->Modify dialog.
  • The new Atom->Modify dialog will be used to set all the quantities that are measured in Atom->Measure, replacing the old Group->Modify dialog that will be used to modify Group objects such as polytopes.
  • The new Atom->Modify dialog is almost finished: removed a sync bug resulting in a GTK warning.
  • Found and removed a bug in gamgi_chem_geometry.c: sequence array off limits by 1, for bond angles.
  • Removed all warnings at -O3 compilation level, on Fedora 9.
  • Found and removed a crashing bug in gamgi_chem_polytope.c: in static_vertex_create, first total should not be there.
  • Found and removed a bug in gamgi_gtk_atom_modify.c: when style changes, update draw, not atom->draw.
  • Designed the new Group->Modify dialog: based on Atom->Measure and Group->Create, the first page has radio buttons to jump between the two sets of pages (Atoms and Polytope). Opens initially in one of the two sets (Atoms), in the second page, to preserve a rule always followed in GAMGI GUIs: users are required to fill only the starting visible notebook page, all the others are optional or have suitable defaults.

What is next:

  • Complete the 3D polytope code, including documentation.
  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.13
13th May 2009
Improved, tested, cleaned the polytope code and redesigned the way data is stored to increase maintenance and readibility. Added speedups to make the code more efficient. This code builds a 3D convex hull for 50,000 atoms under 3 seconds on my desktop system. Moved the corresponding graphic interface from Cell->Link to Group->Create. Added new options (Autonomy) and defaults (color, neighbour elements, number of neighbours). Removed (GTK 1) GTK_OBJECT casts for all g_signal_connect calls.

What is new:

  • Removed the GTK_OBJECT () cast (from GTK 1) in g_signal_connect calls, in all src/*/*c and src/*/*/*c files (but not in g_signal_connect_after and g_signal_connect_swapped calls).
  • Removed Polytope code from Cell->Link (this is now in Group->Create).
  • In the polytope code, added error checks to see if: 1) the selected atom is outside the current object selection; 2) Global mode is wrongly used with unrestricted neighbour distance.
  • Added parameter autonomy to Group objects, as in Planes and Directions. Autonomy All and None are now working fine for Groups created by the Polytope code.
  • When building polytopes, use central atom default color, when neighbour element is undefined and default neighbour color cannot be used.
  • The central atom is now added, in first place, to new 1d-, 2d- and 3d- polytopes, just before the neighbour atoms.
  • Found and removed a bug in the polytope code: each new Group object should belong to the first parent above the corresponding central Atom that is at least a Group object, not to the current selection.
  • Redesigned the interface for Group->Create: it looks clean and functional now.
  • The polytope code is now available from Group->Create.
  • The polytope code is now working fine for a cube with 50,000 atoms! (screenshot soon...). It looks fast also (about 2-3 seconds on my 2 year old system).
  • Found and removed a bug in the speedup code.
  • Added speedup code to accelerate search for conflicts and edges in arrays.
  • Debugged polytope code with new data structures.
  • Changed policy for types and macros: from now on, these will be local when usage is local, instead of being defined in global headers, as before.
  • Redesigned data structures for faces, edges and vertices in polytope code. The new structures are much easier to maintain and understand.

What is next:

  • Rewrite Group->Modify, to include Polytopes and upgraded Atoms mode.
  • Complete the 3D polytope code, including documentation.
  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.12
28th April 2009
The polytope code seems to be working fine now, in 1D (automatically producing a range of atomic directions), 2D ((automatically producing a range of atomic planes) and 3D conditions (automatically producing a range of polyhedra atomic groups). In the last case, the array-based (for speed) 3D convex hull incremental algorithm, with conflict lists, is still operating with restrictions (the code to handle and merge coplanar faces is still switched off). Moreover, no documentation is currently avalable. The code is temporarily available from Cell->Link and then Link Polytope (though we plan to move it to Group->Create instead). This functionality is very important to describe crystallographic structures such as minerals, superconductors, etc. but also to analyse glasses, liquids, etc. We are now getting close to GAMGI 0.14.

What is new:

  • The planar polytope code, building atomic planes, is working.
  • The linear polytope code, building atomic directions, is working.
  • The topology arrays (faces, edges, vertices) should be replaced by structures containing arrays, to improve maintenance.
  • Testing the polytope code: seems to be working fine!
  • Decreasing tolerance to 1.0E-10 fixed numerical problems with the incremental algorithm in the polytope code (coplanar code switched off).
  • the same conflict might be retrieved from both faces around the visible edge: we have now a simple solution to this bug: use a unique identifier everytime we get conflicts for a new face.
  • Solved the realloc bugs due to outdated array memory addresses.
  • Debugging the core polytope code (currently without coplanar faces) is doing good progress.
  • Simplified the code handling the initial polytope.
  • Simplified,reviewed the polytope code handling faces,vertices arrays.
  • Completed and tested the polytope code related with conflict lists.

What is next:

  • Complete the 3D polytope code, including documentation.
  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.11
29th March 2009
All the GTK 1 menus have now been replaced by GTK 2 Combo boxes. Wrote the GTK interface (currently only in Cell->Link) to build 3D and 2D polytopes around central atoms. Improved polytope code and wrote the remaining sampling code needed to get polytope neighbours. Debugged and tested all the polytope sampling, starting, exporting code, except the core incremental algorithm code. Fixed a bug in the XML code importing crystallographic directions with centered nodes.

What is new:

  • Improved static_group and static_cluster in gamgi_io_x3d.c
  • Updated gamgi_mesa_scan and gamgi_io_x3d for group objects.
  • The polytope code is now building the initial tetrahedron for all central atoms. All users options are working fine, including lights.
  • Centering polytope groups is now working fine (rotations, scaling).
  • The code building the initial tetrahedron, for the polytope incremental algorithm, is working fine. The final exporting code is also working fine.
  • The default color for Planes and Directions (in XML, GTK interfaces), can now be configured from GAMGI XML files.
  • Found and removed a bug in the gamgi_expat_import_object.c: o4 node coordinates were not properly imported for Directions, resulting in a error.
  • Inverted the distance-ordered neihbours, so farthest atoms are added first in the polytope incremental algorithm, thus potentially removing closer atoms and decreasing the number of expensive polyhedra recalculations.
  • Simplified the polytope code: removed array xyz (using array neighbours instead), removed routines static_visible, static_coplanar, static_mix, static_valid_tetrahedron (using new routine static_mix instead), removed variable t_neighbours (using n_vertices instead).
  • Wrote the polytope code to build the initial tetrahedron, orientated counter-clockwise.
  • Fixed a name conflict between Random and Polytope Link methods.
  • Fixed a bug when measuring notebook size: in some cases, this size is given by tag size. Solution: hide tags when measuring size.
  • Added View (Style, Color) parameters to Polytope Cell->Link interface.
  • The routines to create,reset,free topology arrays in the polytope code are running fine.
  • The routines to scan neighbours in the polytope code are now working fine.
  • Wrote all the (cell based) scanning code needed to find the closest neighbours for each central atom in the polytope building code.
  • Implemented a dialog to build arbitrary polytopes from Cell->Link dialogs.
  • Converted the last GTK 1 Option Menus (Cell Type) in Cell Create and Cell Modify to GTK 2 Combo Boxes.
  • Converted Borders GTK 1 option_menu to GTK 2 combo box, in gamgi_gtk_cell_create.c and gamgi_gtk_cell_modify.c.
  • Converted Faces, Nodes GTK 1 option_menus to GTK 2 combo boxes, in gamgi_gtk_cell_modify.c.
  • Fixed the X3D bond child scaling code (Tiago Farto).

What is next:

  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.10
7th January 2009
Fixed a few copyright issues raised by the Debian legal team. This release includes most of the code needed to implement a fast, sophisticated 3D convex hull incremental algorithm. This is array-based (to be faster), with arrays of cell lists (to speed up sampling), conflict lists (to be NlogN), can handle coplanar issues, arbitrarily large faces, periodic boundary conditions, etc. It will be useful to describe arbitrary sets of arbitrary polyhedra defined by atoms, such as in superconductors, silicates, glasses, etc.

What is new:

  • Wrote, cleaned, redesigned segments of the 3D convex hull code.
  • Finnished most of the (3D convex hull) code to build arbitrary polytopes.
  • Updated the Group object, to receive the new polytope functionality.
  • Redesigned the new chemical polytope code.
  • Morten Kjeldgaard (Ubuntu) pointed my attention to GL2PS: an OpenGL to PostScript printing library. This looks very, very interesting for the future.
  • Improved the Postscript header. GAMGI now understands and accepts both .ps and .eps name extensions.
  • Fixed the legal issues regarding Mark Kilgard's green book code. Many thanks to Mark Kilgard, for clarifying the issues raised by Michael Banck.
  • Anonymous ftp.gamgi.org is working fine again.
  • Fixed the legal copyrights and notices in gamgi_io_file and gamgi_mesa_area covering Mark Kilgard's code explained in the book: OpenGL programming for the X Window System.
  • Fixed the legal copyrights and notices in gamgi_mesa_text and gamgi_io_x3d_render files covering OGLFT and GLE libraries. Thanks to Morten Kjeldgaard (Ubuntu) and Michael Banck (Debian) for raising these issues.
  • Moved www.gamgi.org to a new computer. Everything is working fine except anonymous ftp. Hopefully this will be back soon.
  • The hard core of the array-based 3D convex hull algorithm, with conflict lists and coplanar handling, is now in place, but has not been tested yet.
  • Started implementing a fast (NlogN) 3D convex hull algorithm, (using arrays to be faster, as in the Voronoi code). This will allow users to generate arbitrary polytopes with GAMGI. This is particularly useful in Crystallography (silicates, superconductors, etc.) to represent tetrahedrons, octahedrons, etc. A 2D convex hull algorithm has been already implemented in order to describe polygonal planes.

What is next:

  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.9
30th October 2008
This release merges all the X3D (the new XML version of VRML) code developed by Tiago Farto, after extensive cleaning. This includes code to describe all the objects currently supported by GAMGI, as layers, cells, clusters, molecules, groups, planes, directions, atoms, bonds and texts. As X3D handles a single 3D space (while GAMGI handles multiple 3D spaces through layers), only objects in the current layer are exported, the other layers are ignored.

What is new:

  • Cleaned and tested cylinder bonds code in static_bond in gamgi_io_x3d.c.
  • Cleaned and tested line bonds code in static_bond in gamgi_io_x3d.c.
  • Cleaned gamgi_io_x3d.c: static_scale, static_unscale, static_text, static_orbital, static_atom, static_direction, static_plane, static_group, static_molecule, static_cluster, static_cell, static_assembly, static_layer.
  • Merged all the X3D (the new XML version of VRML) code developed by Tiago Farto, after cleaning (files gamgi_io_x3d.c and gamgi_io_x3d_render.c.). This includes code to describe all the objects currently supported by GAMGI, as layers, cells, clusters, molecules, groups, planes, directions, atoms, bonds and texts. Thanks Tiago, for this very nice work!.
  • Replaced h_addr by h_addr_list[0] in gamgi_io_socket.c, as suggested by Morten Kjeldgaard (Ubuntu), as h_addr has been deprecated in version 2.8 of libc6, that will be used in Ubuntu 8.10. Thanks Morten!.
  • Removed file dat/cell/polymers/polyethylene_sulfide.cif, that is not used at all by GAMGI and cannot be distributed, from both my latest distribution and GAMGI 0.13.8, released a few weeks ago. Thanks to Morten Kjeldgaard (Ubuntu), for noticing this.

What is next:

  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.8
3rd August 2008
This is a bug fix release. Several new and old bugs, simple but puzzling and affecting productivity, were clarified and removed. Converted Cell Align option menus (Gtk 1) to combo boxes (Gtk 2).

What is new:

  • Fixed a simple but old and relevant bug in the Expat code: conventional axes were exported when they should be primitive.
  • Fixed a bug with Gtk 2.0 code: the window bottom bar must be hidden after showing the window, otherwise this does not work properly when coming from XML files.
  • Replaced all the GTK 1 option menus in gamgi_gtk_cell_align by GTK 2 combo boxes and cleaned the code.
  • Fixed a Gtk warning in Atom->Config: Charge entry is not there.
  • Changed sligthly the mass, radius, charge defaults policy: all atoms must now have valid mass, radius, charge. For Dummy atoms the default mass and radius is 1.0. Elements without a known radius get radius from the lower element that has one. For all elements default charge is 0.0
  • Reorganized all the atomic mass, radius, color data in Gamgi: all this data is now stored in arrays in gamgi_chem_property.c.
  • Synced mass, radius atomic defaults with the new mass, radius data.
  • Fixed a bug in Gtk code: when pressing with the mouse on the ruler and move,rotate,scale mode was off, garbage messages would show up.
  • Fixed the mathematical algorithm to solve systems of two linear Diophantine equations: we were missing some solutions because we were not taking into account all the infinite intermediate solutions.

What is next:

  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.7
8th July 2008
Added mass data for most important isotopes, including isotope abundance and half-life (source: wikipedia). Added radius data including natural half-distances, effective and calculated atomic radius, effective and calculated (2008) covalent radius, Van der Waals radius (webelements). Added the widely used Shannon ionic radius, depending of valence and coordination (Acta Cryst. paper). Cleaned and replaced option menus by combo boxes in Cell->Link, Cell->Create and Cell->Modify. Added new screenshots. Improved Help information for exported type formats, Atom->Create and Atom->Modify. Many thanks to Pedro Isidoro and Luis Veiros, who contributed to this release (providing the Shannon original papers and collecting atomic data).

What is new:

  • Fixed warnings in gamgi_phys_cell_link due to discarded attributes.
  • From now on, for ALL atoms, including Dummy (Du), atomic mass and radius must always be positive and charge can take any real value.
  • Updated Cell->Link, Atom->Create, Atom->Modify Help documentation.
  • Added mass, radius information to documentation covering Atom->Create and Atom->Modify.
  • Cleaned the interface and behaviour of Cell->Link.
  • Replaced all option menus (GTK 1) in Cell->Link by combo boxes (GTK 2).
  • Changed Atom->Create and Atom->Modify Help documentation for notebook style. Updated Help->Current and Help->Topic accordingly.
  • Added 5 new screenshots, to represent the 0.13 series.
  • Simplified notation for mass and radius data, available from Atom->Create and Atom->Modify.
  • The 2008 covalent radius are now fully working on Gamgi.
  • Grabed from WebElements the new (2008) calculated covalent radius, available for Z <= 96.
  • Updated effective and calculated atomic radius data, from WebElements.
  • The complete ionic Shannon (1976) radius are now fully working on Gamgi.
  • The atomic radius information for all elements, including half-distance in natural state, atomic effective, atomic calculated, covalent and Van der Waals radius, is now working.
  • The isotopic information for all elements, including isotope abundance, half-life and excited states, is now working.
  • Replaced the option menu (GTK 1) Scope, in Cell->Remove, by a combo box (GTK 2).
  • Added a new size, GAMGI_ENGINE_STRING, currently 50, for pair values.
  • Replaced option menu (GTK 1) Borders, in Object->Measure dialogs by combo box (GTK 2).
  • Added main introduction file main.html to Help->Current.
  • Added JPEG, PNG, TIFF, PPM, PS, XYZ files to Help->Topic->Introduction.
  • Added Interfaces, Formats files to Help->Topic. Cleaned headers.
  • The XML Cell parameter "o_vectors" is now "origin_vectors".
  • In Cell->Create and Cell->Modify, improved the Origin page interface and behaviour.
  • Replaced option menus (GTK 1) origin vectors, axes, axes vectors, in Cell->Create and Cell->Modify by combo boxes (GTK 2).
  • In Gtk Combo Boxes, the renderer should be added AFTER the tree store. In Gtk Tree Views the renderer should be added BEFORE the tree store. All Combo Boxes and Tree Views now follow this rule.
  • Replaced o4 option menus (GTK 1) by combo boxes (GTK 2) in Cell->Create, Cell->Modify.
  • Replaced o4 option menus (GTK 1) by combo boxes (GTK 2) in Plane->Create, Plane->Modify, Direction->Create, Direction->Modify.
  • Fixed a little offset bug when handling the reference combo box in Direction->Modify, in static_autonomy (introduced in GAMGI 0.13.5).
  • Updated the make_local file: the default configuration should work fine for Fedora 8.0, Ubunty 7.10, Suse 10.3, Mandriva 2008 on xf86 machines. The commented configuration for the same distributions on amd64 is exactly the same, except lib is replaced everywhere by lib64.
  • Updated the users mailling list address in Help->Start.
  • Added second level dialogs to show atomic mass, radius and charge, from Atom->Create, Atom->Config and Atom->Config.
  • We have now clear ideias on how to implement general, powerful polytopes in GAMGI to describe atomic structures. Each polytope will be created as an independent Group object, from Group->Link, Molecule->Link, Cluster->Link or Cell->Link, entering the number of neighbours or the desired neighbour shell thickness. Each procedure will create just one or all the equivalent polytopes. From the math point of view, an incremental algorithm, with conflicting information, a O(n) algorithm, will be used to calculate the arbitrarily complex 3D convex hulls we need to build.

What is next:

  • Replace everywhere GtkCombo and GtkOptionMenu by GtkComboBox.
  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Redesign Atom->Create and Atom->Modify, according with the new notebook style, with more properties, including a wide range of atomic radius.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.6
4th June 2008
Redesigned entirely Atom->Create, Atom->Modify and Atom->Config, as notebook dialogs, including new parameters: element number, atom temperature and occupancy (to handle diffraction data). This is also ready to merge detailed mass, radius and charge information. Replaced most dynamic Option Menus (GTK 1) by ComboBoxes (GTK 2). Removed a simple bug in Light->Modify (added in the previous release), that turned this dialog almost unnusable. Used the icons made by Jakub to show a favicon at www.gamgi.org. The code by Tiago Farto to export to X3D format is almost finished.

What is new:

  • Updated gamgi_expat_import_help.c, to support the CSS attributes image/png and icon, introduced to indicate the favicon image.
  • Updated the Authors page.
  • Atom new config attribute, temperature, can now be imported,exported to XML files.
  • Atom new attributes, temperature and occupancy, can now be imported,exported to XML files.
  • Redesigned Atom->Config according to the notebook style and added new functionality: atom temperature, element number.
  • Fixed a bug in Light->Modify: essentially a typo, resulting in Error messages when trying to modify even simple lights.
  • Redesigned Atom->Modify according to the notebook style and added new functionality: atom temperature, occupancy, element number.
  • Added a favicon (actually gamgi16.png) to www.gamgi.org (and doc/ documentation).
  • Synced doc/ and www.gamgi.org/ documentation.
  • Redesigned Atom->Create according to the notebook style and added new functionality: atom temperature, occupancy, element number.
  • Replaced Option Menus by Combo Boxes in Group->Remove, Molecule->Remove, Cluster->Link.
  • Played with favicons for www.gamgi.org.
  • Replaced Option Menus by Combo Boxes in Group->Link, Molecule->Link, Cluster->Link.
  • Replaced Option Menus by Combo Boxes in Assembly->Link, Assembly->Remove.
  • Replaced Option Menus by Combo Boxes in Plane->Link, Direction->Link.
  • Replaced Option Menus by Combo Boxes in Plane->Remove, Direction->Remove.
  • Replaced dynamic Option Menus in Text->Create, Text->Modify, Text->Config by dynamic Option Boxes.
  • Replaced Option Menus by Combo Boxes in Text->Remove, Bond->Remove, Atom->Remove, Light->Remove, Layer->Remove, Window->Remove.
  • Replaced Option Menus by Combo Boxes in Text->Link, Bond->Link, Atom->Link, Light->Link, Layer->Link, Window->Link.

What is next:

  • Replace everywhere GtkCombo and GtkOptionMenu by GtkComboBox.
  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Redesign Atom->Create and Atom->Modify, according with the new notebook style, with more properties, including a wide range of atomic radius.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.5
12th May 2008
Replaced Combos (GTK 1) by ComboBoxEntries (GTK 2). Replaced most static Option Menus (GTK 1) by ComboBoxes (GTK 2). Fullscreen mode is working again, in Enlightenment, Gnome, KDE, XFCE, BlackBox, IceWM, etc. Topics in Help->Topic and Help->Tutorial can now be selected with double click. Fixed the window size in Select and File dialogs. GAMGI comes now with its own Tango! icons, beatifully created by Jakub Szypulka!. Renewed gamgi.org until September 2015.

What is new:

  • Replaced the two Property option menus in Atom->Measure, by Combo Boxes.
  • Replaced all eight gtk_combo_box_entry_new_text constructions by gtk_combo_box_entry_new, which is lower-level, more flexible.
  • Replaced the four Method option menus in Group->Measure, Molecule->Measure, Cluster->Measure, Cell->Measure by Combo Boxes.
  • Replaced the Light Type option Menu in Light->Modify by a Combo Box.
  • Replaced the seven Projection, Type, Reference and Instance Option Menus in Plane->Modify and Direction->Modify by Combo Boxes.
  • Replaced the four Vector Option Menus in Plane->Create, Plane->Modify, Direction->Create, Direction->Modify, by Combo Boxes.
  • Replaced the four Autonomy Option Menus in Plane->Create, Plane->Modify, Direction->Create, Direction->Modify, by Combo Boxes.
  • Replaced all gtk_combo_box_new_text by gtk_combo_box_new, which is the same, but with much more control.
  • We have a working model to replace dynamic option menus, with variable options and sensitivities.
  • Cleaned mesa_gamgi_text: simplified static_extrusion and removed extruded->extra (these vertices are now saved in extruded->vertices).
  • Updated fullscreen mode, including Page_Up and Page_Down. This works now on all Linux tested environments: Enlightenment, Gnome, KDE, BlackBox, IceWm, XFCE.
  • Double-click now works in both Help->Topic and Help->Tutorial.
  • Increased the size for File->Import and File->Export dialogs.
  • Changed x,y,x and r,g,b labels to X,Y,Z and R,G,B, to be consistent with the general rule that the first letter in labels is uppercase.
  • Replaced OptionMenu by ComboBox for Projection, Visibility_in, Visibility_out and Axes menus in Layer->Modify.
  • Replaced OptionMenu by ComboBox for Style and Color menus in Bond->Create, Bond->Modify, Bond->Config and Text->Config.
  • Fullscreen mode is working again, with GTK-2.0. Tested on Enlightenment, IceWM, BlackBox, KDE, Gnome, XFCE.
  • GAMGI has now its own Tango! icons icons, beatifully desined by Jakub Szypulka!
  • Replaced deprecated gdk functions, so GAMGI now compiles fine with -DGDK_DISABLE_DEPRECATED flag.
  • Increased size for Object->Select dialogs.
  • Fixed a visual bug in Plane->Measure: the dialog changed size when the selected option changed.
  • Fixed size in Cell->Link and Help->Config and clarified the entry sizes globally.
  • Fixed a few calls to set button state: toogle buttons should use gtk_toggle_button_set_active, radio buttons should use gtk_button_clicked.
  • Replaced OptionMenu by ComboBox for Style menus in Text->Create and Text->Modify.
  • We have a working model to replace static GTK 1 OptionMenus by GTK 2 ComboBoxes.
  • Replaced GtkCombo by GtkComboBox in Atom->Config, Atom->Create and Atom->Modify.
  • Replaced GtkCombo by GtkComboBox in Bond->Config, Bond->Create and Bond->Modify.
  • Renewed gamgi.org for another 5 years, so it is available until September 2015.
  • Replaced everywhere direct checks on GTK_TOGGLE_BUTTON (button)->active by calls to function gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)).
  • We have a simple working model for Gtk 2.0 ComboBox, to replace Gtk 1.0 Combo widgets.
  • Replaced gtk_radio_button_group() by gtk_radio_button_get_group() everywhere.

What is next:

  • Replace everywhere GtkCombo and GtkOptionMenu by GtkComboBox.
  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Redesign Atom->Create and Atom->Modify, according with the new notebook style, with more properties, including a wide range of atomic radius.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.4
1st April 2008
Replaced GtkClists in Cell dialogs Systems, Lattices, Groups, plus Help->Tutorial, for GtkTreeview with GtkListstores. Replaced GtkCTrees in Help->Topic plus all GtkCTrees in Object->Select dialogs by GtkTreeview with GtkTreestores. Simplified recursive object selection code that crashed GAMGI, at the -O3 level of optimization. Replaced more Gtk-1.0 by Gtk-2.0 functions. We are much closer to have a completely Gtk-2.0 based GAMGI now.

What is new:

  • Replaced everywhere gtk_timeout_remove by g_source_remove.
  • Replaced everywhere gtk_timeout_add by g_timeout_add.
  • Replaced everywhere gtk_container_border_width by gtk_container_set_border_width.
  • Found and removed a crashing bug in gamgi_mesa_select.c, when compiling with -O3. Simplifying the code eliminates the problem.
  • Replaced GtkCTree by GtkTreeview in all Object->Select dialogs. This means that all Gtk 1.0 GtkCTrees and GtkClists have now been replaced by Gtk 2.0 GtkTreeviews.
  • >Replaced GtkCTree by GtkTreeview in Help->Topic and improved Help->Tutorial: the model is now almost the same for these List and Tree Help dialogs.
  • Aligned pages in Help Tutorial.
  • The model for building Trees with GtkTreeView seems clear now.
  • Replaced GtkClist by GtkTreeview in Cell Symmetry second level dialogs: Systems, Lattices and Groups. So all deprecated GtkClists in GAMGI have now been replaced by GtkTreeview widgets.
  • Replaced GtkClist by GtkTreeview in Help->Tutorial.
  • We have now working models to replace all GtkClists by GtkTreeviews.

What is next:

  • Replace everywhere GtkCombo and GtkOptionMenu by GtkComboBox.
  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Redesign Atom->Create and Atom->Modify, according with the new notebook style, with more properties, including a wide range of atomic radius.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.3
23th March 2008
Replaced GtkText by GtkTextview everywhere in GAMGI, so GTK_ENABLE_BROKEN is no longer needed to compile with Gtk-2.0. Fixed bugs in locale, Ctr-C, atomic radius, dialogs size and widget focus. Updated documentation to reflect the change to Gtk-2.0/GtkGLext-1.0 libraries. Improved man page and icons.

What is new:

  • Replaced gtk_style_unref() by g_object_unref() everywhere.
  • Problems with gtk_widget_modify_fg|bg|base.c: moved back to style calls.
  • Updated documentation: all the Installation files.
  • Updated documentation: Requirements (front page, installation, project technical) and Formats Attributes (manuals introduction).
  • Updated cell/create_symmetry.html and cell/modify_symmetry documentation.
  • All Help documentation is now shown with Gtk 2.0 GtkTextView instead of Gtk 1.2 GtkText. #define GTK_ENABLE_BROKEN is no longer needed.
  • Help->Start and all sorts of Group/Molecule/Cluster/Cell reports are now working fine with Gtk 2.0 GtkTextView instead of Gtk 1.2 GtkText.
  • Replaced Gtk 1.2 style code in gamgi_gtk_dialog.c by Gtk 2.0 gtk_widget_modify_[base|fg|bg].c calls.
  • Replaced everywhere gtk_widget_grab_default by gtk_widget_grab_focus .
  • Replaced GtkText by GtkTextView in Text->Create and Text->Modify.
  • Fixed a bug in decimal number separator: when LC_ALL=french or other comma-based country, everything worked with commas, but data files (dot-based) could not be imported. For the time being everything will work in dots. We will come to this again when GAMGI interfaces get translated to other non-english languages. This is explained in the man page.
  • Fixed a bug in gamgi_expat_export_object: when atomic radius is -1 (not defined), it should not be exported.
  • Fixed the sizes for dialog Help->Tutorial, and Cell second level dialogs System, Lattice, Group.
  • Solved the accelerator group bug (Ctr-C not working): "key_realease_event" was handled before the accelerator. Solution: use g_signal_connect_after for keys.
  • GAMGI has now its own icon. Still needs some expert work. Tiago Farto, thanks for the transparency!
  • Made clear in the documentation that monoclinic base-centered cells in GAMGI always use cell choice 1 (with unique axis b).

What is next:

  • Replace GtkTrees and GtkClists by GtkTreeviews.
  • Replace GtkFileSelection by GtkFileChooserWidget.
  • Redesign Atom->Create and Atom->Modify, according with the new notebook style, with more properties, including a wide range of atomic radius.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.2
5th March 2008
Ported GAMGI to GTK 2.0/GTKGLext 1.0. Apart from very minor details everything seems to be working fine. This was essential to guarantee the GAMGI future. Some widgets still need to be replaced but the main issues are solved. Added a man page, images for icons, instructions for distributions. Fixed light, plane, direction bugs.

What is new:

  • Remove a warning and fixed a bug in both gamgi_gtk_plane_modify and gamgi_gtk_direction_modify.
  • Added a DISTROS file with instructions for distributions.
  • Fixed a simple, just introduced, crashing bug in gamgi_gtk_light_create: a g_object_set_data function was removed by mistake when porting to GTK 2.0.
  • Replaced Gtkglarea by Gtkglext library and modified the code in gamgi_mesa_area, gamgi_mesa_select and gamgi_global_main accordingly. GAMGI is now running apparently fine with Gtkglext, with multiple drawing areas, shared pre-compiled lists and window-independent OpenGL resources.
  • We have only one show stopper bug now, in gtkglarea code, crashing GAMGI with GTK 2.0 on exit.
  • Removed an resulting in lots of warnings when starting a top window (GTK complaining about NULL pointers to functions in callbacks).
  • Reduced the number of const char * issues to only two.
  • Fixed combo boxes entry size in gamgi_gtk_bond_create and gamgi_gtk_bond_modify.
  • replaced gtk_signal_connect_while_alive by g_signal_connect calls.
  • Fixed problemas in window statusbar, with gtk_statusbar_set_has_resize_grip (statusbar, FALSE).
  • First and second level dialogs seem to be working fine.
  • Top menus are now working fine, but position, width should be improved.
  • Replaced gtk_object_set_data, gtk_object_get_data, by g_object_set_data, g_object_get_data. Replaced GTK_OBJECT by G_OBJECT.
  • Gamgi is linking and running, sort of, on GTK 2.0, with #define GTK_ENABLE_BROKEN.
  • Replaced gtk_entry_new_with_max_length and gtk_widget_set_usize by gtk_entry_new, gtk_entry_set_width_chars, gtk_entry_set_max_length.
  • Created a man page for Gamgi, with all the basic surviving skills.
  • Started the process to create an icon for Gamgi: http://www.gamgi.org/icon/.
  • Changed gtk_widget_set_usize to gtk_widget_set_size_request functions.
  • Commented gtk_accel_group_new Ctr-C acceleration.
  • Commented gtk_signal_connect_while_alive functions.
  • Changed gtk_signal_connect_object to g_signal_connect_swapped functions.
  • Changed all GTK_SIGNAL_FUNC to G_CALLBACK macros.
  • Changed all gtk_signal_connect to g_signal_connect functions.
  • Added DISABLE_DEPRECATED cflags to make_rules.
  • Added library GtkGLArea 2.0. GAMGI is now compiling (but not linking yet) with GTK 2.0 and GtkGLArea 2.0.
  • Replaced all char *name by const char *name, in gtk_entry_get_text commands, to avoid warnings.
  • Commented all gtk_widget_set_usize commands, to compile.
  • Started a new development branch, to move GAMGI to GTK 2. Updated the make_rules file accordingly.
  • Found and removed a light bug: exporting shininess with 2 decimal figures resulted in parameter loss. Increased to 4 decimal figures.

What is next:

  • Redesign Atom->Create and Atom->Modify, according with the new notebook style, with more properties, including a wide range of atomic radius.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.13.1
14th February 2008
Analysed, cleaned, removed all issues generating warnings when compiling with -O3 added to default gcc -g -Wall -ansi, in both xf86 and xf86_64 architectures, with gcc 3.3.4 (Suse 10.0) and gcc 4.1.2 (Fedora 8), plus pointer_to_int and int_to_pointer conversions in non-32 bit machines. Found and removed 4 actual bugs in the process.

What is new:

  • Cleaned array addressing in gamgi_phys_wigner (static_orthorhombic_c, static_orthorhombic_f, static_orthorhombic_i_high, static_orthorhombic_i_low, static_rhombohedral_high and static_rhombohedral_low).
  • gcc 4.1.2 on xf86_64: cleaned all issues generating warnings when compiling with -O3 added to default gcc -g -Wall -ansi.
  • gcc 4.1.2 on xf86_64: cleaned all int-to-pointer and pointer-to-int conversions generating warnings in chem/ and expat/ code when compiling with default gcc -g -Wall -ansi.
  • gcc 4.1.2 on xf86_64: cleaned all int-to-pointer and pointer-to-int conversions generating warnings in mesa/ code when compiling with default gcc -g -Wall -ansi.
  • gcc 4.1.2 on xf86_64: cleaned all int-to-pointer and pointer-to-int conversions generating warnings in gtk/ code when compiling with default gcc -g -Wall -ansi.
  • gcc 4.1.2 on xf86_64: cleaned all int-to-pointer and pointer-to-int conversions generating warnings in engine/ code when compiling with default gcc -g -Wall -ansi. These conversions are now handled by properly designed macros, which are also easily found with grep.
  • gcc 3.3.4 on xf86: cleaned all issues in phys/ code generating warnings when compiling with -O3 added to default gcc -g -Wall -ansi.
  • gcc 3.3.4 on xf86: cleaned all issues in gtk/ code generating warnings when compiling (gcc 3.3.4 on xf86) with -O3 added to default gcc -g -Wall -ansi (one real bug found in gamgi_gtk_cell_modify.c: one truely missing initialization).
  • gcc 3.3.4 on xf86: cleaned all issues in chem/ code generating warnings when compiling with -O3 added to default gcc -g -Wall -ansi (two real bugs found in gamgi_chem_symmetry.c: one truely missing initialization and two code lines wrongly exchanged).
  • gcc 3.3.4 on xf86: cleaned all issues in math/ and mesa/ code generating warnings when compiling with -O3 added to default gcc -g -Wall -ansi.
  • gcc 3.3.4 on xf86: cleaned all issues in engine/ and expat/ code generating warnings when compiling with -O3 added to default gcc -g -Wall -ansi (one real bug found in gamgi_expat_import_object.c: a variable depending on the order of function argument handling, which is implementation dependent).

What is next:

  • Redesign Atom->Create and Atom->Modify, according with the new notebook style, with more properties, including a wide range of atomic radius.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Port GAMGI to GTK 2.* or (3.*).
  • Replace set/get_data functions by structures defined in gtk/gamgi_object.h headers.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI old
 
gamgi-0.17.5/doc/changelogs/changelogs14.html000066400000000000000000001271641433127522700207350ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.14
GAMGI 0.15
16th December 2010
Wrote Plane->Select, Direction->Select, Plane->Copy and Direction->Copy. Fixed bugs in Group->Modify, Group->Copy and elsewhere. All dialogs now support lists except the Modify dialogs for Group, Plane, Direction, as these objects must be rethinked anyway.

What is new:

  • Found and removed a bug in Group->Modify: even auxiliary groups need a number, to avoid corruption when removed.
  • Found and removed a bug in Group->Modify: central atom existence was not properly checked, resulting in possible crashes.
  • Group->Link is now working fine with single objects and lists of objects.
  • The new Plane->Link and Direction->Link dialogs are now working fine with single objects and lists of objects.
  • Updated interface for Plane->Link and Direction->Link dialogs.
  • Error handling improvements on Plane->Copy, Direction->Copy and Group->Copy.
  • Implemented and tested dialog Group->Copy.
  • Futurely Object->Copy dialogs should allow copies to other destinations, not just layers.
  • Implemented and tested dialogs Plane->Copy and Direction->Copy.
  • O1, O2, O3, O4 node coordinates can now be used to select lists of planes. Tested Plane->Select for all specific direction properties.
  • O1, O2, O3, O4 node coordinates can now be used to select lists of directions. Tested Direction->Select for all specific direction properties.
  • All relevant Plane and Direction properties are now available in Plane->Select adn Direction->Select, except O1, O2, O3, O4.
  • Fixed two interface bugs in Plane->Create and Plane->Modify related with O4 node combo box: no default and no Local option.
  • Added Autonomy Partial to Group objects and Style (Wired|Solid) to Plane, Direction objects, in Object->Select dialogs, although these properties have not been implemented yet.
  • Added all relevant properties properties to Group->Select, Plane->Select, Direction->Select dialogs (not working yet).
  • Fixed a little bug in all Object->Select dialogs.
  • Plane->Select and Direction->Select can now be used to select lists of Planes and Directions.
  • Rewrote Group->Modify, to support lists of objects. It is working again, currently only for one object.
  • Designed a simple data model to handle focus of single objects or lists of objects.
  • Designed a simple way for users to set focus to arbitrary lists of objects (so they can be rotated, moved, scaled simultaneosuly).

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.14.11
26th October 2010
Implemented Object->Link for lists of objects, for all classes of objects supported by GAMGI, except Plane and Direction. All GAMGI objects seem to be working fine now, with lists of objects, for all suitable tasks (Object->Copy, Object->Link, Object->Modify, Object->remove) except Planes and Directions (next release!). In general, the code to handle lists of objects is becoming simpler and more robust.

What is new:

  • Found and removed a bug in the lists code: the color of object labels was not updated when new windows were created.
  • Redesigned the code to update top menu label colors, to indicate which objects have lists currently active.
  • Found and removed two interface bugs in Cell->Link related with node occupancy.
  • Cell->Link is now working fine for all methods, Object, Crystal and Glass (renamed from Random), for one Cell or for a list of Cells.
  • Simplified Object->Link code with gamgi_gtk_object_raise.
  • Bond->Link is now working fine for all cases.
  • Molecule->Link is now working fine for all cases.
  • Text->Link, Group->Link, Cluster->Link, Assembly->Link are now working fine for all cases.
  • Light->Link is now working fine for all cases.
  • More improvements for Atom->Link and Layer->Link dialogs.
  • Layer->Link is now working fine for all cases.
  • Found and removed a bug in all Object->Copy dialogs affecting the mouse interaction with the dialog.
  • Improved Atom->Link: static_apply and static_ok_global.
  • Working on Object->Link dialogs. Window->Link is now working fine for all cases.
  • Synced gamgi and gamgi_exp files: src/ and doc/.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.14.10
20th September 2010
Added more criteria to create lists of objects in Object->Select dialogs. Added functionality to Object->Copy dialogs, for objects and lists of objects. Added functionality to Object->Link dialogs. Atom->Link is now working for lists of objects. Improved the Cell->Link interface, to support important new functionality. Removed three bugs, two graphic ones, the other in the lists of objects code. We are now counting down to GAMGI 0.15.

What is new:

  • Replaced Shift by Change in Cell->Link, to keep Shift for Object mode in Object->Link dialogs, similar to Object->Copy dialogs.
  • All Object->Copy dialogs are now working fine with the new features and visual.
  • Redesigned the Layer/Local options in Object->Copy dialogs.
  • Many small refinements in Object->Copy dialogs and Atom->Link.
  • Layer->Copy is now working fine: a variable was not initialized.
  • Atom->Link is now working fine for all possible cases.
  • Improved code for Object->Modify and Object->Copy dialogs.
  • Added functionality to Atom->Link: lists of objects can be linked above and below, linked objects can be shifted.
  • After Atom->Link, started preparing the other Object->Link dialogs to support lists of objects. Updated the button selecting an object or an object list, for all Object->Link dialogs.
  • Mouse handling in Object->Copy and Object->Select dialogs is working fine, with the new functionality.
  • Replaced labels Atom, Bond, etc. in Object->Create dialogs by label Name as this is more consistent with Object->Modify dialogs.
  • Implemented all the functionality for Object->Copy dialogs, including lists of objects (seems fine but needs more testing).
  • Improved GTK code for dialogs: Atom->Copy, Light->Copy, Text->Copy, Cell->Copy, Cluster->Copy, Molecule->Copy, Assembly-Copy, Group->Copy.
  • All working Object->Select dialogs support now selection by name and by parent.
  • Atoms can now be selected by name and by parent using Atom->Select.
  • Found and removed a typo bug in the code to set the color of object selection rectangles. With some positional lights, a white color in a selection rectangle might look black (mesa bug?).
  • Found and removed a bug in Undo,Save code: when pressing Cancel, in some cases the image was not immediately updated.
  • Found and removed a bug in the lists code: Gamgi->Reset tried to change a Gtk label after removing its own Gtk parent window.
  • Atom->Copy is now working with new (name, location) functionality.
  • Link->Atom is now working with both atoms and lists of atoms.
  • The interface to translate and rotate Wyckoff positions, in Cell->Link, is now available through a simple netbook page, instead of second-level dialogs as before.
  • Researching CIF file format: we plan to export GAMGI to this format.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.14.9
24th August 2010
Lists of Cells, Lights, Layers (previously selected using the Object->Select dialogs) can now be easily modified using the Object->Modify dialogs. Lists of Atoms, Texts, Lights, Layers, Windows, Cells, Molecules, Clusters (previously selected using the Object->Select dialogs) can now be easily copied using the Object->Copy dialogs. Removed two bugs in the new lists code that crashed GAMGI is some situations.

What is new:

  • Copy->Cluster is now working with clusters and lists of clusters.
  • Copy->Molecule is now working with molecules and lists of molecules.
  • Copy->Cell is now working with cells and lists of cells.
  • Copy->Window is now working with windows and lists of windows.
  • Copy->Layer is now working with layers and lists of layers.
  • Copy->Light is now working with lights and lists of lights.
  • Found and removed a crashing bug in the lists code, with more than one window: the gtk window is removed before the window child objects, so when removing these, the gtk window is not there anymore.
  • Copy->Text is now working with texts and lists of texts.
  • Copy->Atom is now working with atoms and lists of atoms.
  • Improved the way current object and layer are handled, for objects and lists of objects, in dialogs Atom->Modify, Bond->Modify, Text->Modify, Cell->Modify, Light->Modify and Layer->Modify. Deprecated gamgi_gtk_statusbar_modify and gamgi_gtk_statusbar_layer, added gamgi_global_selection_layer.
  • Lists of layers (previously created with Layer->Select) can now be easily modified with Layer->Modify.
  • Found and removed a crashing bug introduced last release in Text->Modify: when handling lists with more than one text, with undefined style but defined font, the new font became corrupted.
  • More improvements in the lists code, in Atom->Modify, Bond->Modify, Text->Modify, Cell->Modify, Light->Modify, Layer->Modify: common error handling, focus change in the end, etc.
  • Added local enumerations to the lists code in Light->Modify, Text->Modify, Atom->Modify, Bond->Modify, Cell->Modify, Layer->Modify.c, making the code much easier to read and maintain.
  • Light colors can now be modified in Absolute or Relative modes.
  • Lists of lights (previously created with Light->Select) can now be easily modified with Light->Modify.
  • Cleaned the lists code in Atom->Modify, Bond->Modify, Text->Modify, Cell->Modify and Light->Modify.
  • Lists of cells (previously created with Cell->Select) can now be easily modified with Cell->Modify.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.14.8
19th July 2010
The properties of arbitrary lists of atoms, bonds, texts (previously selected with Select dialogs) can now be easly specified with the Modify dialogs (pressing the List button). In the next releases, this will be extended to the other objects. Replaced deprecated macros GTK_WIDGET_VISIBLE, GTK_WIDGET_SENSITIVE by gtk_widget_get_visible, gtk_widget_is_sensitive calls. Replaced direct addressing widget->window, widget->allocation by gtk_widget_get_window and gtk_widget_get_allocation calls (GAMGI needs now GTK 2.18 to compile). Removed a buffer overflow that crashed GAMGI when building crystals of the space group 230.

What is new:

  • Lists of texts (previously created with Text->Select) can now be easily modified (for any property recognized by Gamgi) with Text->Modify.
  • Lists of bonds (previously created with Bond->Select) can now be easily modified with Bond->Modify.
  • Lists of atoms can now be easily modified with Atom->Modify! For efficiency reasons, dialog data is first imported to a cache, from where atoms or lists of atoms are modified.
  • GTK 3.0: replaced widget->window direct addressing by gtk_widget_get_window calls (since GTK 2.14).
  • GTK 3.0: replaced deprecated macros GTK_WIDGET_VISIBLE by gtk_widget_get_visible calls (since GTK 2.18).
  • GTK 3.0: Replaced deprecated macros GTK_WIDGET_SENSITIVE by gtk_widget_is_sensitive calls (since GTK 2.18).
  • GTK 3.0: replaced widget->allocation direct addressing by gtk_widget_get_allocation calls (since GTK 2.18).
  • Removed a buffer overflow, found when building crystals with group 230: some wyckoff strings do not fit in a 20 char array.
  • www. gamgi.org and ftp.gamgi.org hardware failure: replaced, reinstalled system disk, copied previous data.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.14.7
4th April 2010
This is a bug-fix release. Fixed a GL context bug when multiple windows were open, that could produce no rendering. Fixed memory leaks in handling fonts. Fixed how messages were produced when DejaVu fonts were not found, that could crash GAMGI. Updated old documentation, and the Help system, that could crash GAMGI. Fixed the way mouse dragging is handled that could stop mouse dragging. Corrected ionic radius for S and Sb. Prepared a new, experimental, release that does not require the GTKGLExt library (for X Window System only).

What is new:

  • Found and removed a bug in gamgi_chem_property.c: the ionic radius for S and Sb were wrong. Checked all ionic radius.
  • Improved www.gamgi.org front page.
  • Truetype fonts are now checked in the same way in Text->Create, Text->Modify and importing from file, in a slightly more robust way than before. Error messages are handled in a much better way. Fixed a bug in Text->Modify resulting in text object names not being properly updated.
  • Found and removed a memory leak in gamgi_mesa_text_font_increase: when an error occurs, remove font glyph array created before.
  • Found and removed a memory leak in gamgi_gtk_text_create and gamgi_gtk_atom_modify: contents is allocated and must be freed.
  • Found and removed a nasty bug, introduced some time ago in the code handling the mouse, in gamgi_mesa_area_notify.c, that in many cases could stop the mouse from dragging.
  • Updated www.gamgi.org/interfaces/, some documentation was old.
  • Found and removed a bug introduced when moving to DejaVu fonts: for some fonts the filename had more chars than those expected in the error string message, resulting in crashs when those fonts were not found.
  • Updated documentation for installation: in some systems (Ubuntu 9.10 for example) the environment variables must be set in ~/.profile, instead of ~/.bashrc.
  • Updated gamgi_gtk_help_current.c and gamgi_gtk_help_topic.c: code for atom copy files was too old, resulting in crashes when calling documentation for Atom->Copy.
  • Updated and fixed typos on doc/tutorials: for example the method Independent in Cell->Link is now called Crystal.
  • The new code that does not require GTKGLExt is working fine with GAMGI on Fedora 8 (Gtk 2.12.8), including creating and removing multiple contexts on the fly, and sharing pre-compiled OpenGL lists.
  • Wrote a GTK/OpenGL program that seems to work without GTKGLExt! Tested so far on Fedora 8 (Gtk 2.12.8) and Ubuntu 9.10 (Gtk 2.18.3). It requires only glx.h (distributed with Mesa) and gdkx.h (distributed with GTK). We need to test this much more, namely with shared lists, removing and adding GLcontexts, etc., but if we managed to succeed, it could be really good news for users and maintainers!
  • Added initialization tests for GTK, GTKGLExt and OpenGL.
  • Rewrote gamgi_mesa_area_create: gamgi->glconfig and gamgi->glcontext are no longer needed.
  • Added "et al." in Gamgi->About dialog.
  • Found and fixed a nasty, old bug, introduced when moving from GtkGLArea to GtkGLExt: when a top window was removed, Open GL lists previously created no longer worked in new windows. Solution: instead of using the GL context of the window that was created in first place, just use the GL context of the window that is currently the first one.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.14.6
9th February 2010
Improved Object->Select dialogs. All Object->Remove dialogs can now handle lists of objects with the same functionality as for single objects (this is the first application of the selection lists that we have been implementing since Gamgi 0.14). Cell->Link now supports shifts in translations and rotations for each node, in Crystal mode (this is very useful, to change the lattice origin and for people doing research on Defects in Crystals). Adapted the ruler code for Gtk 3.0. Fixed a few bugs in Cell->Modify, Cell->Link and in the Tools section.

What is new:

  • Added error message for empty lists in all Object->Remove dialogs.
  • Layer->Remove can now be used to remove lists of layers.
  • In Object->Remove dialogs, in List mode, the selection lists are now automatically removed only when objects of that class are actually removed (and not its child objects).
  • Window->Remove can now be used to remove lists of windows.
  • Implemented new dialogs Cluster->Select, Molecule->Select and Group->Select.
  • Removed useless, old dialogs Orbital->Select, Graph->Select, Arrow->Select and Shape->Select.
  • Cluster->Remove, Molecule->Remove, Group->Remove, Plane->Remove and Direction->Remove can now be used to remove lists of objects.
  • Text>Remove can now be used to remove lists of texts.
  • Implemented lists in Cell->Remove, Assembly->Remove and Light->Remove.
  • Improved layout for Text->Select, Bond->Select, Atom->Select, Light->Select, Layer->Select, Window->Select, Assembly->Select and Cell->Select dialogs.
  • Simplified the code to remove lists of objects.
  • Improved the mechanism to remove lists of objects: no need to copy the list of objects before removing them. This works fine even for recursive objects.
  • Text>Remove can now be used to remove lists of texts.
  • Bond>Remove can now be used to remove lists of bonds.
  • The very first application of the selection lists is now in place: Atom->Remove can now be used to remove an atom or a list of atoms.
  • Implemented functions to copy lists of dlist and slist nodes.
  • Found and removed a bug in Cell->Modify: the cell origin was not correctly reset to zero, resulting in wrong center coordinates for cell.
  • Changed the way Wyckoff positions are handled: they should be in the range ]-1, +1[ when rotation shift is applied (not in [0, +1[ as before).
  • Implemented Rotation Shift in Cell->Link (in Method Crystal).
  • Found and removed a bug in Scale tool button (added when converting to Gtk 3.0): passed button instead of label, resulting in wrong behaviour.
  • Gtk 3.0: replaced ruler->position direct access by calls to gtk_ruler_get_range and gtk_ruler_set_range.
  • Implemented Translation Shift in Cell->Link (in Method Crystal).
  • Improved significantly the layout for dialogs Translation Shift, Rotation Shift and Cell->Link, resulting from the new Shift functionality.
  • Wrote most of the code to handle Translation and Rotation Shifts, when building Crystals in Cell->Link. This is important for researchers working in Defects in Crystals.
  • Found and removed two little bugs in gamgi_io_file.c, afecting the error message produced when a file could not be exported.
  • Found and removed two bugs in static_type, in gamgi_gtk_cell_modify.c, related with Projection (introduced when changing to GTK 2.0).

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.14.5
20th January 2010
Implemented a simple and powerful method to select any class of visual objects inside an arbitrary rectangle on any window. Improved the behaviour of Object->Select dialogs. Implemented the new dialogs Window->Select and Assembly->Select.

What is new:

  • Removed two visual bugs in Method comboboxes in all Objet->Select dialogs: submenus now have no titles and have all the same size.
  • Selection inside a mouse defined rectangle is now working fine also in Text->Select (recursive), Bond->Select, Assembly->Select (recursive) and Cell->Select.
  • The new Assembly->Select dialog is fully working.
  • Changed atom Type by atom Label, in Atom->Create, Atom->Modify, Atom->Config and XML files (attribute "type" was replaced by "label"). Changed Element by Type in notebook tags, and Name by Element in notebook pages. Updated documentation accordingly.
  • The new Window->Select dialog is fully working.
  • Completed the code to grab objects inside mouse defined rectangles. And it seems to be working fine! Needs much more testing though. We are much closer to version 0.15!
  • We have a good method to add Atoms to Cells with translations and rotations relatively to their normal positions. This is important for people doing research in Defects in Crystals.
  • Found and removed a bug in expat export code for window: either export both x,y or none. The same for width,height.
  • Improved gamgi_mesa_grab.c, to select objects by region.
  • gamgi->box[4,5] are useless: use window->begin_x, window->begin_y instead.
  • Debugged the selection rectangle behaviour, everything is working fine now. All the Mesa/GTK code related with the user interaction is done.
  • Added "button_release_event" signal to OpenGL area.
  • Increased partially visible layer merging factor from 0.2 to 0.4
  • Wrote and tested selection rectangle alpha blending for object selection by region. This completes the static part of this code.
  • Wrote and tested 2D pixel accurate selection rectangle for object selection by region, including move and resize little squares.
  • Objects can be picked only in Pick mode. Until now, this was confusing for users.
  • Wrote the code to scan objects by color, with unlimited depths, to implement object selection by region.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.14.4
29th December 2009
Implemented the new dialogs: Text->Select, Bond->Select, Cell->Select, Light->Select, Layer->Select. Improved Atom->Select. Updated some GTK code to work with GTK 3.0. Updated documentation, fixed bugs.

What is new:

  • Synced with www.gamgi.org/: dat/, doc/formats/, doc/interfaces, doc/tutorials, doc/bibliography, doc/installation and doc/man.
  • The new Light->Select dialog is fully working.
  • Found and removed a bug in Cell->Align (in Cell->Modify): rotation and translation alignment are working again for all transformed Cells and current Layer.
  • Found (Valgrind) and removed a bug in gamgi_gtk_window_create.c: window->mode was used before initialization.
  • Synced documentation and Help system, regarding Bond->Create, Bond->Modify, Cell->Create, Cell->Modify and all the Object->Link dialogs.
  • Improved labels in Object->Link dialogs: Method instead of Link.
  • Improved make_rules, as suggested by Adriano Couto.
  • Fixed a bug in gamgi_gtk_group_modify.c: the selection pointer recently added, was not initialized here.
  • Simplified and reduced code for dialogs: Atom->Select, Bond->Select, Text->Select, Layer->Select, Cell->Select.
  • Converted dialog Cell->Select to combo box submenus.
  • Converted dialog Text->Select to combo box submenus.
  • Converted dialog Bond->Select to combo box submenus.
  • Converted dialog Atom->Select to combo box submenus.
  • Tested new combo box submenus with Gtk 2.18.3: they work fine.
  • Improved label consistency in Layer->Create, Layer->Modify, Bond->Create and Bond->Modify.
  • Improved make_rules, as suggested by Jasper Lievisse Adriaanse from OpenBSD.
  • Completed the new Layer->Select dialog, with combo box submenus.
  • Improved the position and size of the top menus in main windows.
  • The new Layer->Select dialog is working.
  • The new Cell->Select dialog is now working fine for all methods.
  • Added more methods to Text->Select and Bond->Select.
  • Implemented and tested new Bond->Select dialog.
  • Improved Text->Select and Atom->Select functionality.
  • The new Text->Select dialog is now working fine, with improvements over Atom->Select: Method values can now be selected from combo boxes or combo box entries, not just entries.
  • Daniel Leidert, from Debian, updated man/page, mainly bold and italic highlighting. Thanks Daniel!
  • GTK 3.0: Removed all 181 instances in GAMGI of deprecated GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT)
  • GTK 3.0: Replaced all 67 instances in GAMGI of deprecated GTK_BIN (widget)->child by gtk_bin_get_child (GTK_BIN (widget));

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.14.3
30th November 2009
The new Atom->Select is now fully working for all methods, except selecting objects by region. The infrastructure to handle global lists of objects is in place. Replaced Vera by DeJaVu Truetype fonts. Updated documentation, fixed bugs.

What is new:

  • Updated Help->Current, Help->Topic and doc/interfaces for File->Import, File->Export, Atom->Select documentation.
  • Updated technical links in www.gamgi.org.
  • Wrote documentation for new dialogs: File->Import, File->Export, Atom->Select.
  • New objects can now be added to List Current in Atom->Select.
  • Found and removed a bug related with new gamgi_global_selection code: on exit, selection lists were removed too late.
  • Found and removed a bug in new gamgi_gtk_atom_select.c: the list Before was not always removed.
  • Removed directory io/fonts, as the 12 DejaVu fonts are too large to be distributed with GAMGI. They come with every Linux distribution and can be easily obtaned from dejavu-fonts.org or www.gamgi.org, ftp.gamgi.org.
  • Updated the INSTALL file coming with GAMGI distribution, regarding Vera to DejaVu font changes.
  • Updated documentation for Extruded fonts: 12 DejaVu fonts instead of 10 Vera fonts, plus two new labels, "serif_italic" and "serif_bold_italic".
  • Replaced default path for TrueType fonts, in GAMGI_IO_PATH_TRUETYPE, from "/usr/X11/lib/X11/fonts/truetype/" to "/usr/share/fonts/truetype/ttf-dejavu/".
  • DejaVu Truetype fonts used to build 3D extruded fonts are no longer distributed with Gamgi, due to space reasons. Although these files come with most Linux distributions, they are also available from www.gamgi.org and ftp.gamgi.org, as a convinience.
  • Replaced BitStream Vera by DejaVu TrueType fonts for 3D Solid (extruded) fonts. DejaVu fonts are derived from Vera, so visual differences are minimal and the license is based on the previous one.
  • Improved the model used to flag which atoms are selected: this works now also with lists of recursive objects, such as texts, groups, which would crash before when objects removed recursively appeared later in the selected list.
  • Atom->Select, our prototype for Object->Select dialogs, is now robust, simple, elegant and definitely ready for general usage. Three methods for object selection have been implemented so far: 1) property ranges (16 properties implemented for Atom objects), 2) GTK list clicking and 3) OpenGL representation clicking. We expect to add futurely a very useful fourth method: selecting objects inside a rectangle indicated with the mouse in a OpenGL graphic area.
  • More tests on Atom->Select: fixed a logical bug in static_press.
  • Cleaned gamgi_gtk_atom_select.c, replaced signal "unmap" by "destroy" to free Before list, actually removed node list Before.
  • Implemented and tested the third selection method in Atom->Select: press Ctrl and click on the OpenGL visual representation of an atom with the mouse, if this atom is in the Current list it gets automatically selected on the GtkTreeView.
  • All *_press global functions receive now the pointer to GdkEventButton that fully describes the button press.
  • How to get Ctrl-Click events is now clear, thanks to Emmanuel Rodriguez from gtk-app-devel-list.
  • Replaced scale limits 0.0, DBL_MAX by GAMGI_MESA_SCALE_LOWER, GAMGI_MESA_SCALE_UPPER in all Object->Create and Object->Modify dialogs, plus all Expat import object functions.
  • All the selection-by-property functions in Atom->Select are now implemented.
  • Simplified selection-by-property functions in Atom->Select.
  • Atom->Select now has selection methods for Mass, Radius, Charge, Temperature and Occupancy.
  • The GTK functions to select object rows from code are working! This is very important because we need this to select objects directly from the OpenGL graphic area.
  • Wrote functions gamgi_engine_slist_invert and gamgi_engine_dlist_invert, to invert slist and dlist lists.
  • Improved gamgi_gtk_atom_select.c code: the Pick code is much simpler and faster, the Undo list is removed everytime Atom->Select is unmaped, all lists of atoms are now properly ordered, in a elegant way.
  • Object selection by mouse clicking directly on the Treeview is working.
  • Added a (hidden) object column to treeviews listing objects, this is needed to speedup object selection from the treeview.
  • Improved and tested Atom->Select: this is now ready for general usage.
  • Added -lgdkglext-x11-1.0 to make_rules, as GAMGI failed to build with the new linker binutils-gold, already used in some Unix systems. Many thanks to Peter Fritzsche, from Debian, who found and fixed the problem.
  • The new Atom->Select dialog is already working: list of atoms can be selected, according to property criteria choosen by users.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.14.2
31th October 2009
This is mainly a bug-fix release: replaced two deprecated castings preventing GAMGI from compiling in newer systems, simplified the visual layout for all the 161 notebook pages in task dialogs, fixed several glitches and bugs related with GTK interfaces, wrote the interface for the new Atom->Select dialog. Compiles on Ubuntu 9.10 (x86) without warnings, at the -O3 -Wall -ansi -DGTK_DISABLE_DEPRECATED level.

What is new:

  • Improved parsing and security in gamgi_gtk_file_chooser.
  • Added some lateral padding into all GAMGI GtkTextView widgets: it looks better.
  • GAMGI is now compiling without warnings on brand new Ubuntu 9.10 (Gtk 2.18.3), with options: -O3 -Wall -ansi -DG*_DISABLE_DEPRECATED.
  • Removed several warnings due to non used return values, in functions write, system, getcwd. GAMGI is now compiling without warnings (Gtk 2.16) on Ubuntu 9.04, with options: -g -O3 -Wall -ansi -DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED.
  • All Text dialogs in GAMGI have now the same contour width.
  • Removed frames and cleaned Cell dialogs.
  • Removed frames and cleaned Plane, Direction dialogs.
  • Removed frames and cleaned all Measure dialogs.
  • Replaced N by Zn in ZNS Blenda data files distributed with GAMGI.
  • Removed frames and cleaned Assembly, Molecule, Cluster dialogs.
  • Removed frames and cleaned Layer, Bond dialogs.
  • Wrote the new GTK layout for Atom->Select dialog. This is another step in the way to implement real selection of objects in GAMGI.
  • Removed frames and cleaned all Link, Copy, Remove dialogs.
  • Removed Xterm and Console buttons from the Tools bar: this functionaliy can easily be called from outside GAMGI and is difficult to get right, because it deppends of the WM and of personnal preferences.
  • Removed frames and cleaned Window, Text, Light dialogs.
  • Replaced deprecated GtkSignalFunc by G_CALLBACK() on gamgi_gtk_select.c. In new systems, with GTK 2.18.3, GAMGI fails to compile because of this. Thanks to Daniel Leidert (from Debian) and Pedro Isidoro, who directed my attention to this!
  • Removed frames and cleaned Gamgi, Help, Atom dialogs.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI 0.14.1
22nd October 2009
Implemented and tested (Linux/Mac OS X) new GtkFileChooser dialogs, using only GTK 2.* low-level widgets, so we have the new technology without the constrainments imposed by the oficial GTK 2.* gtkFileChooser dialog. GAMGI is now compiling fine with flags -DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED and should be ready for GTK 3.0. Added most of the low-level engine code to handle multiple object selection.

What is new:

  • Completed the new File->Import and File->Export dialogs.
  • Implemented all the security checks needed to handle files and folders coming from an hostile environment.
  • All the functionality used in the new file chooser is available and running fine on Mac OS X.
  • Sorting Folders and Files in the new file chooser is now working fine.
  • Filtering Folders and Files in the new file chooser is now working fine.
  • All the technical issues related with the new file chooser dialogs to implement in Gamgi seem now to be solved (famous last words!).
  • The basic infra-structure to handle the new File->Import and File->Export file choosers seems to be working fine.
  • The low-level infra-structure to handle global selection of objects is now in place.
  • Active modes such as Axes, Rotate, Move, Scale (tools menu) and Lists of objects (main menu) are now shown in green to distinguish from highlights, represented in red.
  • Improved the way ruler data is shown in the statusbar: always present and shown in default color.
  • New screenshots!

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
  • Improve selection dialogs, including list selection methods.
  • Implement multiple object picking, including a dynamic frame with moving ants and dragging anchors, to select multiple objects and images from the screen.
GAMGI old
 
gamgi-0.17.5/doc/changelogs/changelogs15.html000066400000000000000000001000311433127522700207160ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.15
GAMGI 0.16
6th August 2012
This release formally completes the work started in October 2009 with GAMGI 0.14.2 to handle lists of objects everywhere in GAMGI. Fixed bugs in Group->Modify, Plane->Modify and Direction->Modify, so these tasks are now more solid and powerful, for single objects and lists of objects. Upgraded documentation for all Object->Modify task dialogs. Upgraded Help->Current and Help->Topic accordingly. Added three more copper oxide superconductor structure and info files.

What is new:

  • Synced gamgi/ and gamgi_exp/ source, data and documentation trees.
  • Solved a problem in Plane->Modify and Direction->Modify preventing many useful tasks: previously old planes, directions were removed and replaced by new instances, so Lists could not be used to modify Type, Scope properties.
  • Added info and structure files for supercondutors Pb2Sr2YCu3O8 and PbBaYSrCu3O8.
  • Improved Plane->Modify and Direction->Modify: when List is selected, Reference must be Local, as Cell and Atoms modes are not possible.
  • Updated Group->Modify, Plane->Modify and Direction->Modify.
  • Updated documentation for Layer->Modify, Cell->Modify, Light->Modify.
  • Updated documentation for Text->Modify, Bond->Modify, Atom->Modify.
  • Fixed two little bugs in gamgi_gtk_group_modify.c: cache.radius should be initialized to DBL_MAX, not 0.0; the dialog should be directed to ...GROUP_MODIFY, not ...GROUP_CREATE, involving different documentation files.
  • Updated documentation for Plane->Modify, Direction->Modify, Group->Create, Group->Modify.
  • Updated Help->Current and Help->Topic for Group->Create and Group->Modify.
  • Started updating documentation for all Object->Modify dialogs.
  • Created the structure and info files for Tl2Ba2CaCu2O8 superconductor.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.15.8
6th June 2012
Fixed a serious bug in all gamgi_engine_filter functions, that could result in crashes, namely in Plane->Create and Direction->Create. Group_>Modify is now fully working, with objects and lists of objects, making this the first release where all dialogs support lists of objects. Added structure and information files for 16 of the most important cooper oxide superconductors.

What is new:

  • Synced gamgi_0.15.8 and gamgi_exp_0.15.8.
  • Completed the new dialog Group->Modify. This is the last GAMGI dialog to fully work with object lists! Only documentation will be added from now on until major release 0.16.
  • Group->Modify can now be used to change automatically Color and Style for all objects inside a Container Group.
  • Group->Modify is essentially done, with objects and lists of objects, for all types: Container, Polytope and Local.
  • Modifying Groups to types Container and Polytope is now working fine in Group->Modify.
  • Removed parameters Atom, Element, Number, from Group objects: they are still used to build polytopes but are not saved anymore.
  • Fixed the new Group->Modify interface.
  • Removed parameters Structure, Filter, Visible, Coplanar from Group objects: they are still used to build polytopes but are not saved anymore.
  • Improved dialogs: Cell->Link, Group->Create and Group->Modify.
  • Another superconductor structure: Tl2Ba2Ca4Cu5O14.
  • Two more superconductor structures: La2CaCu2O6 and TlBa2CaCu2O7-x.
  • Three more superconductor structures: Tl2Ba2CuO6, Bi2Sr2(Gd,Ce)2Cu2O10, and Pb2(Sr,La)2Cu2O6.
  • A third crash on Atom->Select->Region after static_grab_pixels. Removed the O3 optimization to see if the problem subsists.
  • Another crash on Atom->Select->Region, after static_grab_pixels, this time compiled with -g.
  • Added structure and info for another superconductor: (Tl,Pb)(CO3)Sr4Cu2O7.
  • Improved the way defaults are handled for Wyckoff positions in Cell->Link.
  • Added fluoroapatite/hydroxylapatite structure to dat/cell/etc/.
  • Added structures for Copper Oxide high-Tc superconductors to dat/cell/.
  • Added structures for chiral nanotubes to dat/mplecule/nanotubes.
  • Found and removed a serious bug in gamgi_engine_filter.c functions: dlist nodes were called after being removed... This might explain also a crash reported earlier in static_grab_objects from Atom->Select with Method Region.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.15.7
15th April 2012
Added structure (xml) and data (txt) files for the following model structures: alpha-Mn, beta-Mn, alpha-U, Al3Ti, Cr3Si, Al3Zr4, Fe3C (cementite), Al2O3 (corundum), CatiO3 (perovskite), MgAl2O4 (spinel), Fe2B, CdI2, beta-quartz, AuBe5, CaCu5, TiO2 (rutile), ZnWO4, plus Laves phases Cu2Mg, MgZn2, MgNi2. Added models for martensitic transformation: Bain, Nishiyama - Wassermann and Kurdjumov - Sachs. Added graphene structure to illustrate carbon nanotube (p,q) classification. Fixed a bug in Plane->Modify and Direction->Modify. Added screenshots about object lists to www.gamgi.org.

What is new:

  • Added more crystalline structures: Fe2B, CdI2, beta-quartz.
  • Added more crystalline structures: AuBe5, CaCu5, TiO2 (rutile), ZnWO4, plus Laves phases Cu2Mg, MgZn2, MgNi2.
  • Added models for martensitic transformations: Bain, Nishiyama - Wassermann and Kurdjumov - Sachs.
  • Added graphene based structure, to illustrate (zig-zag, arm-chair and chiral) carbon nanotube (p,q) designation.
  • Added more crystalline structures: alpha-Mn, beta-Mn, alpha-U, Al3Ti, Cr3Si, Al3Zr4, Fe3C, Al2O3 (corundum), CatiO3 (perovskite), MgAl2O4 (spinel).
  • A crash occurred in static_grab_objects. Select Region is working fine under heavy loads. Researching (and compiling with -g).
  • Added new screenshots, showing Atom->Select, to select lists of atoms, and Plane->List, to build lists of plane families.
  • Found and removed a bug in Plane->Modify and Direction->Modify: polygon Plane and line Direction wrongly showed default stereographic projection data, when the Cell was not linked. Fixed two related check tests.

What is next:

  • Add object lists to Group->Modify, the only task dialog where lists of objects are not integrated yet.
  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.15.6
11th February 2012
Arbitrary lists of crystallographic families of (hkl) planes and [uvw] directions can now be easily created, for all models supported, with Plane->Create and Direction->Create. Arbitrary lists of Planes and Directions (previously selected with Plane->Select and Direction->Select) can now be handled exactly as a single object, with Plane->Modify and Direction->Modify. Fixed a few bugs.

What is new:

  • Arbitrary sets of (hkl) planes can now be easily created with Plane->Create, for all models supported.
  • Further improvements in Direction->Create and Direction->Modify, to list atoms only once and to properly remove the template direction.
  • Arbitrary sets of [uvw] directions can now be easily created with Direction->Create, for all models supported except Range (which uses data specific for a given uvw family).
  • More improvements in Plane->Create->List and Direction->Create->List dialogs. This is now ready to implement in first level dialogs.
  • Added second level dialog Direction->Create->List to automatically create arbitrary sets uvw of crystallographic directions.
  • The second level dialog Plane->Create->List, to automatically create arbitrary sets hkl of crystallographic planes, is working fine.
  • Including/excluding ranges of plane indices in a GtkTreeView is now working in Plane->Create->List second level dialog.
  • Resumed work on creating automatically ranges hkl of crystallographic planes and directions previously selected.
  • Plane->Modify and Direction->Modify are working fine and ready general usage, even with lists of objects. Plane->Modify should be more user-friendly for cells with a reciprocal lattice.
  • Found and removed a bug in gamgi_engine_copy.c: directions belonging to planes were not copied, affecting for example the Undo and Save mechanisms.
  • Plane->Modify and Direction->Modify seems to be working fine for all cases now. Needs more testing.
  • Fixed a crashing bug in Plane->Create and Direction->Create, when attempting to build atomic planes, directions with filtered atoms.
  • Fixed a crashing bug in Plane->Create and Direction->Create, when attempting to create atomic planes, directions with atoms belonging to planes, directions.
  • Improved Plane->Modify and Direction->Modify behaviour.
  • Eliminated plane->atoms, plane->structure, plane->filter, plane->thickness.
  • Eliminated direction->atoms, direction->structure, direction->filter, direction->thickness.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.15.5
1st September 2011
Lists of arbitrary objects can now be exported, exactly as any other object currently selected. Added a Help->Tips entry in the Help menu, covering importants advices to increase GAMGI usability. Updated all the information for Plane->Create, Plane->Modify, Direction->Create, Direction->Modify. Rewrote Plane->Modify and Direction->Modify, which are now working with lists of Planes and Directions, still in a reduced, provisory mode. Added several important crystalline structures to /dat/cell/structures.

What is new:

  • Synced gamgi/ and gamgi_exp/ branches.
  • Cleaned gamgi_gtk_plane_modify.*, gamgi_gtk_direction_modify.*, removed gamgi_phys_plane_reference.
  • Fixed name changing in Plane->Modify and Direction->Modify.
  • Direction->Modify is now working fine for all types of Directions, (cristalline and atomic, poles, traces, direct space lines), when arrays are not modified, including lists of Directions.
  • Plane->Modify is now working fine for all types of Planes, (cristalline and atomic, poles, traces, reciprocal lattice vectors, direct space polygons), when arrays are not modified, including lists of Planes.
  • Solved several issues regarding Plane->Modify and Direction->Modify: modifying Planes,Directions is now possible, when its Cell,Atoms parents are not there anymore. Seeing planes,directions properties is now much easier. Modifying reciprocal lattice plane vectors is now possible.
  • Added more tips to Help->Tips.
  • Wrote static_ok_local, static_ok_global and static_grab in gamgi_gtk_plane_modify.c and gamgi_gtk_direction_modify.c.
  • Reviewd all the Direction->Modify interface. Futurely it will be simpler and more powerful. Currently is not working.
  • Reviewd all the Plane->Modify interface. Futurely it will be simpler and more powerful. Currently is not working.
  • Updated Help documentation for Direction->Create and Direction->Modify.
  • Updated Help documentation for Plane->Create and Plane->Modify.
  • Lists of objects can now be exported, for all classes of objects. Bonds between members of the list are ignored.
  • Lists of bonds, and a single bond, are now exported with the parent atoms.
  • Fixed a bug: Gamgi (meaning all) could not be selected.
  • Added a new Help->Tips section, with advices about all sort of topics related with GAMGI usage, that should prove quite useful even for experienced users.
  • Bonds can now be selected according to their bond length.
  • Added a model of a ice_clathrate with 46 water molecules.
  • Added C60 cfc structure, with atoms,bonds or polyhedra.
  • Added Ice-Ic, solid CO2 (dry ice) and solid C6H6 cristalline structures to /dat/cell/structures.
  • Added alpha-La, beta-Sn, In, As, gamma-Se, alpha-Hg cristalline structures to /dat/cell/structures.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.15.4
19th June 2011
Fixed space groups 119, 120, 121, 122. Solved a problem with interactive handling lists of recursive objects. Fixed new and old bugs in light scaling, Layer->Modify, Plane->Create. Fixed a bug in ClCs tutorial, fixed outdated interstice cell data files. Created xml and info txt data files for the most relevant cfc, bcc, hcp derived cristalline structures. Implemented a dialog to generate lists of families of crystallographic planes. Implemented a unique task identifier, to futurely handle operations such as drawing in a safer way.

What is new:

  • Added the most important cristalline structures derived from cfc, bcc, hcp to dat/cell/structures.
  • Synced gamgi/ and gamgi_exp/ code trees.
  • Found and removed a recent bug in scale code: individual lights were not scaling with the mouse.
  • Fixed dat/cell/interstices/ files that still used type instead of label to designate atom types.
  • Built Chalcopyrite with space group 122: the structure is correct.
  • Space groups 119, 120, 121, 122 were given as P groups, should be I. Fixed. Group 119 had positions a,b,c,d with symmetry -42m, should be -4m2. Fixed. Checked lattice and symmetry labels for all other tetragonal groups: they are correct. Checked Wyckoff positions for groups 119, 120, 121, 122: they are correct.
  • Found and removed a bug in Plane->Create: area tolerance to dismiss plane creation in a range is too small.
  • Found and removed a bug in Layer->Modify: layer names were not copied.
  • Started buiding a comprehensive data base of representative crystallographic structures, based on the book "Structure of Materials, by M. de Graef and M. E. McHenry".
  • Designed a GTK dialog to handle lists of crystallographic planes in Plane->Create.
  • Fixed a HTML glitch in the CsCl tutorial.
  • Started building a dialog to create ranges of crystallographic planes.
  • Replaced the id mechanism to handle translation, rotation of lists of recursive objects, by the much simpler, slightly faster, marking algorithm that also works for scaling. Rotation, translation, scaling of lists of recursive objects works fine now, and the new algorithm does not interfere with all the other translation, rotation mechanisms devised earlier. This essentially completes the conceptual work, planned 10 years ago, but only initiated in October 2009, to handle lists of objects exactly as a single object.
  • Designed, implemented a simple, fast algorithm to scale lists of recursive objects. It works also for rotations, translations.
  • Started working on gamgi_gtk_plane_set.c and gamgi_gtk_direction_set.c, to create flexible sets of crystallographic planes and directions.
  • A unique id number is now generated for all rotation tasks, for example to avoid repetitions when rotating lists of recursive objects.
  • A unique id number is now generated for all translation tasks, for example to avoid repetitions when translating lists of recursive objects, such as texts, groups, clusters or assemblies.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.15.3
21st May 2011
Global lists of pre-selected objects can now be rotated, translated, scaled exactly as before for a local single object (to grab focus for a list of objects, just press the mouse middle button over the corresponding object class button, in the main menu, and then over the Gamgi button). Updated all the local and web documentation for Object->Copy and Object->Link dialogs, available for example through the Help tools.

What is new:

  • Synced gamgi/src and gamgi_exp/src code branches.
  • Synced all the interfaces documentation: www.gamgi.org, ftp.gamgi.org, gamgi_doc and gamgi-exp_doc. Fixed a tag position inconsistency in CSS notebook code.
  • Updated the documentation for all the Object->Link dialogs.
  • When giving focus to a list of objects, now checks first if the list is empty.
  • Updated the documentation for all the Object->Copy dialogs.
  • Fixed a little GUI bug in Layer->Copy: (disable Local in object mode).
  • Developed a flexible, simple, fast, mechanism to identify each instance of tasks such as rotating and drawing with a unique id, to properly handle multi reentrance in the same object.
  • Removed gamgi_global_selection_draw, replaced by equal function gamgi_mesa_draw_gamgi.
  • Added code to implement task ids: tasks such as drawing, scaling, rotating, translating will have a unique id attached, to prevent bugs in objects with multiple parents, such as bonds, and lists of recursive objects, such as texts, groups, clusters and assemblies.
  • Lists of pre-selected objects can now be interactively scaled (dragging the mouse or clicking the ruler), exactly as before for a single object.
  • Lists of pre-selected objects can now be interactively translated (dragging the mouse or clicking the ruler), exactly as before for a single object. It works quite fast for 1500 atoms, on two different windows!
  • Lists of pre-selected objects can now be interactively rotated (dragging the mouse or clicking the ruler), exactly as before for a single object (needs more testing).
  • Code disabling selection lists when listed objects are removed is now also disabling global focus for those lists.
  • We are a step closer to rotate,move,scale lists of previously selected objects: code to select objects or lists of objects, including statusbar info and all the required internal data (just gamgi->focus), are now working fine.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.15.2
22nd April 2011
GAMGI code is now compiling fine with SINGLE_INCLUDES and SEAL_ENABLE enabled, so miggrating to GTK-3.0 should be relatively easy. Fixed minor GUI bugs in all Object->Copy and Object->Link dialogs. Polygon data imported from XML files is now properly checked. Updated Help files for Object->Copy, Object->Select, Object->Link dialogs, and updated Help->Current and Help->Topic accordingly. Changed XML formats for polygon Planes and line Directions and updated dat/ files accordingly. Objects can now be rotated,moved, scaled in all open windows simultaneously.

What is new:

  • Addded -I/usr/include/gdk-pixbuf-2.0/ to PATH_GTK_H in make_local, as this is required at least by Ubuntu 10.10.
  • Synced gamgi/src/ and gamgi_exp/src/.
  • Synced gamgi/doc/interfaces/, gamgi_exp/doc/interfaces/, www.gamgi.org/interfaces/ and ftp.gamgi.org/interfaces/.
  • Updated Help->Topic, to support the files documenting the new Object->Copy, Object->Select and Object->Link dialogs.
  • Updated Help->Current, to support the files documenting the new Object->Copy, Object->Select and Object->Link dialogs.
  • Updated the Help file infrastructure, to document all the new Object->Copy, Object->Select and Object->Link dialogs.
  • Interactive rotation, translation, scaling now works fine for all windows simultaneously (after selecting Gamgi as current object).
  • Updated planes,directions in XML files in dat/plane and dat/cell, to conform with the new format for polygons and lines.
  • Fixed group->type and added cluster->type, so both types of Group and Cluster objects can now be correctly exported/imported to XML files.
  • Added x,y,z, center_x,center_y,center_z, e1,e2,e3 to Cluster objects.
  • Changed cx,cy,z by center_x, center_y, center_z parameters in XML files, for Plane, Group and Cluster objects.
  • Changed the way geometry is described in Line Directions in XML files.
  • Fixed a GUI bug in all Copy and Link dialogs: the first object must be local, which means in the current layer (before, objects in different layers could be selected, as long as the window was the same).
  • Reviewed and tested further all the code to import planes and directions from XML files. This is now robust and simpler than before.
  • Cdata arrays for Cluster, Group, Plane, Direction polygons and lines are now properly tested when importing XML files.
  • GAMGI is now compiling and running fine with -DG_DISABLE_SINGLE_INCLUDES, -DATK_DISABLE_SINGLE_INCLUDES, -DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES, -DGTK_DISABLE_SINGLE_INCLUDES. As GTKGLExt does not support yet these directives, only the GAMGI version marked gamgi_exp (without GTKGLExt) can be currently built with *_SINGLE_INCLUDES enabled.
  • GAMGI is now compiling and running fine with -DGSEAL_ENABLE enabled.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.15.1
16th February 2011
Coordination polyhedra groups and Voronoi polyhedra clusters can now be exported/imported from GAMGI XML files. Polygon planes and Line directions can also be exported/imported from GAMGI XML files, as totally independent objects, so they don't depend anymore from Cell or Atom objects. Planes and Directions represented in stereographic projections can now be scaled as any other object. Improved the functionality offered in Plane->Create, Direction->Create and Group->Create (Structure and Filter menus). Removed all the code involving the ugly concept of dependency, envolving Plane, Direction and Group objects. Direction->Measure and Plane->Measure now can calculate also the geometrical area and length, respectively. Fixed bugs in Bond->Create and Direction->Measure and cleaned code.

What is new:

  • For the first time, polytope Groups can now be imported,exported to XML files, with the new data model.
  • Directions can be imported/exported again to XML files, with the new data model. All types of directions seem to be working fine.
  • Planes can be imported/exported again to XML files, with the new data model. All types of planes seem to be working fine, except planes on the reciprocal lattice.
  • Cracked down the way to properly position Planes, Directions and Groups imported from polygonal data in XML files.
  • Fixed a new bug in Reciprocal lattice: when selecting a plane, it would wrongly move, rotate the cross.
  • Planes, Directions cannot be linked to another object when they are not polygons, lines (Stereographic projection, reciprocal lattice.
  • Measuring area, length, with Plane->Measure, Direction->Measure just produces an error when Plane, Direction is not a polygon, line.
  • Plane->Measure, Direction->Measure for crystalographic Planes, Directions works fine when parent is no longer a Cell, producing just an error.
  • Crystalographic Planes, Directions now can still exist when parent is no longer a Cell, when they are polygons or lines.
  • Voronoi clusters and Coordination groups can now be exported, imported, still with limitations: position and orientation data is still missing.
  • All polygon data can now be exported and imported from GAMGI XML files.
  • Most of the code to import polygon data, to describe Clusters, Groups, Planes, Directions, in a easy and solid way, is now in place.
  • Plane->Measure and Direction->Measure now support plane geometrical area and direction geometric length.
  • Added functions to calculate Plane geometrical area and Direction geometrical length.
  • Fixed a bug in Direction->Measure: the distance between nodes in some cases was a multiple of the correct value, for centered lattices.
  • Wrote code to build polygon arrays from XML files.
  • glPolygonOffset is now (1,1) for Planes and (2,2) for Cells, so Planes have visual priority over Cells.
  • Planes rendered as polygons now have a border, with the background color, which is good to distinguish them.
  • Completed a full review of the functionality for Plane->Create, Direction->Create and Group->Create.
  • The Structure options are now fully working on Plane->Create and Direction->Create (similar to Autonomy options before).
  • Improved Plane->Create, Direction->Create: now there are 4 different policies to filter atoms in Planes, Directions.
  • Improved Group->Create: now there are 4 different policies to filter atoms around central atom.
  • Improved gamgi_chem_polytope code: the number of Planes, Directions created, and ignored Groups, due to improper atom coordinates are now fully reported.
  • Fixed a new bug in Bond->Remove: graphic area not immediately refreshed, in Local mode.
  • Introduced a new parameter Structure, meaning how atoms are transported to new object: Copy, Link or None.
  • Got rid of gamgi_phys_plane_compatible, gamgi_phys_direction_compatible: another ugly concept that does not solve the issue: atom superposition.
  • Planes and Directions in stereographic projections and reciprocal lattice now can be scaled as any other object (increasing/decreasing the width).
  • Planes and Directions in Trace mode (in Projection Cells) can now be scaled (changing line width) exactly as any other object.
  • GAMGI can now export array data everytime that is necessary, for example in Clusters, Groups, Planes and Directions.
  • Removed gamgi_chem_atom_unlink: removing atoms should never remove automatically container objects. If it makes sense or not that is a user prorrogative. This represents a change in policy, in how to handle planes, directions and groups. These objects can be handled, exported, imported even if they cannot be fully reconstructed. gamgi_chem_atom_unlink, gamgi_gtk_object_independence and autonomy code were among the ugliest code in GAMGI.
  • Removed test function gamgi_gtk_object_independence: all objects must be fully independent and can be save to files. If it makes sense or not that is a user prorrogative.
  • Removed parameter Autonomy from Plane, Direction and Group objects. Futurely these objects will always have Autonomy All.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Add plane area and direction length to Plane->Measure and Direction->Measure.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI old
 
gamgi-0.17.5/doc/changelogs/changelogs16.html000066400000000000000000000722161433127522700207340ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.15
GAMGI new
 
New developments in code, documentation and website are reported here.
GAMGI 0.17.1
7th March 2014
Reviewed all Formats documentation and updated for Cluster, Group, Plane, Direction objects. Changed type for reference in XML group elements. Updated Orbital interface. Reviewed GtK and OpenGL interface. Renewed gamgi.org domain name until 2020 and GAMGI EU trademark until 2024. Started using sha256sum to checksum distribution tarball files.

What is new:

  • Fixed a bug just introduced: we cannot unref the GDK visual after removing a GL context. Just removed this code. Apparently GTK does this when the widget is destroyed.
  • Improved gamgi_gtk_area.c, used in the X version of GAMGI, that replaces the GTKGLExt library by our own GLX-based code. Javier Cabezas ported this code to GTK 3 and is working fine! Back ported changes so the differences between the code for GTK 2 and GTK 3 are absolutely minimal.
  • We cannot use r,g,b colors because of a,b,c cell axes.
  • Improved Axes layout in Orbital->Create and Orbital->Modify dialogs.
  • Changed label Model to Scope in Orbital->Create and Orbital->Modify and changed Help interface accordingly.
  • Checked all Help Formats documentation pages.
  • Updated Help documentation for Cluster Formats.
  • cluster->paints arrays are no longer zero-terminated.
  • Synced gamgi and gamgi_exp branches.
  • In XML files, in group elements, replaced attribute type by reference.
  • Updated Help documentation for Plane and Direction Formats.
  • Updated Help documentation for Group Interfaces and Formats.
  • Renewed the EU trademark GAMGI until 2024.
  • Updated the source code and documentation license to GPL v3.
  • Started using sha256sum to checksum all distribution files.
  • Renewed the gamgi.org domain name registration until 2020.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write documentation about lists of objects.
  • Write documentation about Orbitals.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.17
20th December 2013
Fixed a math bug in the Hydrogen orbital code. Fixed the way the Debye-Waller atomic temperature factor is handled. Fixed a makefile bug in the release without GtkGlExt. Orbital->Select is now fully working. Simplified the way axes are handled for orbitals. Added more options to create lists of directions and planes. Updated documentation for Formats and Interfaces, regarding orbitals, directions, planes. Changed some XML attributes for cell, direction, plane elements.

What is new:

  • Fixed a makefile bug (introduced in gamgi0.15.6) in the GAMGI branch that does not require the GtkGlExt library: the make_rules contained gtkglext dependencies that should not be there.
  • Planes, Directions can now be seleted by projection net: Wulff or Schmidt.
  • Synced code, documentation and data files between gamgi and gamgi_exp distribution trees.
  • Checked dat/orbital XML files to update orbital axes attributes.
  • Checked all dat/ XML files to replace attribute type by label, in atom elements.
  • Checked all dat/ XML files to replace attribute type by model, in plane, direction, cell elements.
  • For the sake of consistency, replaced globally the name projection by net in direction and plane code and XML elements.
  • For the sake of consistency, replaced globally the name type by model in cell, plane, direction code and XML elements.
  • Changed label Type to Model in Cell->Create and Cell->Modify.
  • Changed label Method to Type in Bond->Create.
  • Updated Help->Formats documentation for XML Plane and Direction objects.
  • Updated Help->Interfaces documentation for Type and Projection in Plane->Create, Plane->Modify, Direction->Create, Direction->Modify.
  • The Debye-Waller atomic temperature can now take values only between 0.0 (blue) and 100.0 (red) as is usual in this analysis.
  • Updated Interfaces and Formats documentation for Bond objects.
  • Fixed the default Debye-Waller atomic temperature: the new value is 0.0, corresponding to an atom with a well known position.
  • Updated Formats documentation for Atom and Cell objects.
  • Help->Current and Help->Topic can now read the documentation for Orbital->Modify.
  • Wrote documentation for Orbital->Modify.
  • Updated documentation for Orbital->Create.
  • Orbital axes are now handled in a much simpler way, in Orbital->Create, Orbital->Modify and XML native files.
  • Orbital->Select is now working fine for all options, including the many properties that can be used to select orbitals.
  • Simplified slightly the functions gamgi_gtk_select_*.c.
  • Fixed two bugs in the H orbitals code, introduced in GAMGI 0.16.6: 1) the terms rho**L (from Laguerre polynomials) and 1/r**L (from Legendre functions) cancel each other, apart from a constant that was missing. 2) the default radius calculation was missing the rho**L term.
  • Lists of Planes can now be selected by model: Polygon, Pole, Trace, Vector.
  • Lists of Directions can now be selected by model: Line, Pole, Trace.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write documentation about lists of objects.
  • Write documentation about Orbitals.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.16.8
31st October 2013
Fixed several important bugs related with: object selection by region, Reset of multiple windows with Lists selected, creating multiple crystallographic Plane/Direction ranges, building RCP structures. Fixed other bugs related with: Pole/Trace simultaneous creation, crystallographic Plane/Direction names, visual aspect and object selection in stereographic projections with Poles and Traces. Lists of Orbitals are now working fine. Orbital->Select is already working for some options.

What is new:

  • In Stereographic Projections, raised slightly the z-height in pole bitmaps (GAMGI_MESA_OFFSET_BITMAP), so these always appear above traces. This fixes a visual glitch but also makes it much easier to select poles with traces around, as colors are now clearly separated.
  • Synced gamgi and gamgi_exp code branchs.
  • Updated static_press in Plane->Modify and Direcyion->Modify, so the object name is not overwritten by automatic name setting.
  • Automatic name changing in Plane->Modify and Direction->Modify is working fine now, for crystallographic planes,diretcions.
  • Found and removed a bug in Plane->Create and Direction->Create: in some cases, the object name indicated by the user was ignored.
  • Found and removed a serious bug in Plane->Create and Direction->Create: after creating planes/directions using lists previously created with the List second level dialog, these were not properly reset. In some circunstances this could crash GAMGI.
  • Found and removed a bug in Plane->Create and Direction->Create: Pole and Trace were not created simultaneosuly, when required, only one each time.
  • Orbital->Select is now working. Lists of Orbitals can be copied, linked, selected, modified, removed, as for other objects.
  • Synced gamgi and gamgi_exp code branchs.
  • Fixed Cell->Link: it is working (again) fine for lists of Cells, in Object (above and below), Crystal and Random modes.
  • Found and removed a simple but serious bug: when multiple windows were open and a list of objects was active and selected as the current object, Reset (but not Exit) would crash Gamgi.
  • Cell->Link Random (RCP) was not working: replaced by older code. Cell->Link needs more work.
  • Compiling again with -O3 flag.
  • Fixed a serious bug in all Object->Select dialogs, in the method Region: when the sampling rectangle was not fully inside the graphic area, some of the sampled colors would be undefined and GAMGI would crash when pressing Ok. The crashes were detected a long time ago, but the cause was unclear until now.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write documentation about lists of objects.
  • Write documentation about Orbitals.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.16.7
3rd September 2013
Implemented Orbital->Modify, which is now working fine for single orbitals (lists of orbitals should be supported in the next release). Added automatic name change in Atom->Modify and Orbital->Modify. Simplified the way Laguerre polynomials and Legendre functions are calculated in gamgi_chem_orbital.c.

What is new:

  • Synced gamgi/dat and gamgi_exp/dat data trees.
  • Synced gamgi/doc and gamgi_exp/doc documentation trees.
  • Synced gamgi/src and gamgi_exp/src code trees.
  • Fixed more GUI glitches in Orbital->Modify.
  • Fixed Orbital->Modify crashes: orbital->dots must be reset to 0.
  • www.gamgi.org and ftp.gamgi.org are now served from a VM hosted at the IT center at the Lisboa University. Hopefully this means more reliable connections and less time down.
  • Automatic name changing in Orbital->Modify is working fine now.
  • Automatic name changing in Atom->Modify is working fine now.
  • Implemented automatic name changing in Atom->Modify.
  • Implemented automatic name changing in Orbital->Modify.
  • Orbital->Modify is now working for single orbitals. Lists of orbitals should be working in the next release.
  • Translation, Rotation, are now working fine for Orbital->Modify.
  • static_apply for Orbital->Modify is mostly done.
  • Completed static_grab for Orbital->Modify.
  • Added static_ok_global and static_ok_local for Orbital->Modify.
  • Completed static_press for Orbital->Modify.
  • The GUI behaviour for Orbital->Modify is almost completed.
  • Started working on Orbital->Modify and Orbital->Select.
  • Updated gamgi_mesa_pick.c and gamgi_mesa_grab.c to take into account solid representations of orbitals.
  • Fixed a little bug in the orbital axes mesa drawing code.
  • Laguerre polynomials have a factor r**L (L = angular quantum number) that cancels exactly with the factor 1/r**L of the Legendre functions, so the mathematical descriptions of the H orbitals become much simpler! Thanks to Jose Luis Martins for pointing me to this! For such low probability densities (1E-6), the numerical issues are so sensitive that the orbital visual representations come a bit different, even for L=1, after this simplification.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.16.6
21st June 2013
Hydrogen orbitals can now be represented in GAMGI as polygonal isosurfaces. As before (with orbitals represented as clouds of dots), users can choose which octants to see. The orbitals look really fantastic, as the screenshots show. Fixed few minor bugs in the GTK and Expat orbital code.

What is new:

  • Synced gamgi/dat and gamgi_exp/dat source code trees.
  • Synced gamgi/src and gamgi_exp/src source code trees.
  • Added screenshots showing the new representations for orbitals.
  • Slightly increased theta, phi accuracy when determining the orbital default sampling radius: tested against (6,5,-5) orbital (6hy5).
  • Debugged code to perform signal interpolation in solid orbitals. Is working fine now! This was really the last obstacle to have a world class orbital representation in GAMGI! Time for screenshots! Futurely we will try to reduce the number of vertices, normals and triangles, and we might implement Gorauld shading, but none of this will change the scientific and visual capabilities of our current model. A glass of Port to celebrate!
  • Implemented a method to perform signal interpolation in solid orbitals, to solve the signal change innaccuracy problem found earlier.
  • Cleaned code in gamgi_chem_orbital.c and gamgi_chem_orbital.h.
  • Fixed a bug: the orbital probability density was not properly exported to XML files.
  • Orbital axes are now simpler to use and have more options.
  • The signal code is working now: 3D orbitals look really fantastic, but the signal code must refined, as the lack of interpolation results in too much visual noise when the signal changes.
  • Fixed the code to swap positive and negartive triangles.
  • Fixed the signal interpolation code in static_edge.
  • Solved an interpolation issue related with the orbital isosurface onion effect: force fraction to the [0,1] range.
  • Fixed orbital solid code edge orientation: this is needed for exact interpolation.
  • Fixed numerical inaccuries: just a bug splitting the cubes (as in a 3D chess board). Is looking great now!
  • Debugged the solid orbital 3D code, apparently is working fine, still with some numerical inaccuries in the surface.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.16.5
24th May 2013
Orbital objects can now be exported, imported to GAMGI native XML files. Replaced the recursive static_outside routine by a loop and stack version, thus removing a critical bottleneck in the solid orbital code. Fixed mem leaks in GTK code, sintax bugs in object selection by color, warnings due to unnused variables, etc.

What is new:

  • Synced gamgi/src and gamgi_exp/src source trees.
  • Added a screenshot showing BCC, CFC octahedral interstices: spheres, octahedra.
  • Added two screenshots showing H-based orbitals, as clouds of points.
  • Fixed about 25 warnings (Ubuntu 12.10) resulting from variables initialised but not really used.
  • Found and removed a bug in most Object->Select dialogs, affecting object selection by color: search for "R", "G", "B", the new labels, not for "Red", Green", "Blue", the old ones.
  • Added proper default names to H-based orbitals.
  • The 3D code for solid orbitals 3D is looking really good, and very fast to get and manipulate!
  • Improved static_outside in gamgi_chem_orbital.c: the new version is faster, simpler, and works for any sampling accuracy.
  • Identified and removed a mem leak in all gtk_container_get_children calls. The problem occurred in gamgi_gtk_dialog.c and gamgi_gtk_statusbar.c.
  • Replaced the recursive code in static_outside in gamgi_chem_orbital.c by a loop-stack version, removing the bottle-neck posed by recursion in the maximum number of slices allowed to render solid orbitals.
  • Atomic H-based orbitals can now be imported from GAMGI native XML files.
  • Atomic H-based orbitals can now be exported to GAMGI native XML files.
  • Octants, Seed are now permanent orbital properties.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.16.4
27th April 2013
Wrote all the Marching-Cubes / Tetra-Cubes 3D and 2D code needed to render solid orbitals. The 2D code is already debugged and working fine. Added new GAMGI mirrors: http://atom.ist.utl.pt, http://gamgi.ist.utl.pt, ftp://atom.ist.utl.pt. Added structure and info files for beta-quartz, beta-cristobalite and beta-trydimite.

What is new:

  • Synced gamgi and gamgi_exp source branches.
  • Updated make_local, to include the paths: -I/usr/lib/i386-linux-gnu/glib-2.0/include, -I/usr/lib/i386-linux-gnu/gtk-2.0/include, used by Ubuntu.
  • Fixed a bug in the new solid orbital code: the r length test makes sense in the wired representation but not in the solid one.
  • The new recursive code works for bit arrays as large as 160x160x160, in the worst case.
  • The recursive code to find outer surfaces is crashing for bit arrays larger than 50x50x50. Looking for a loop alternative.
  • Orbital code: wavefunction interpolation to produce the triangle-based representation is working really well.
  • The triangle-based 2D solid rendering of planar surfaces in H-based orbitals is now well tested and working fine! This is crucial to build a octant-based representation of these orbitals, where users can choose which octants to show.
  • Added new mirrors, http://atom.ist.utl.pt and ftp://atom.ist.utl.pt, to futurely host gamgi.org.
  • Added nice structure and info files for high-temperature beta-quartz, beta-cristobalite and beta-trydimite.
  • Implemented a new mirror: http://gamgi.ist.utl.pt/ or http://www.gamgi.ist.utl.pt/.
  • Simplified the way H-Orbital octants are selected in Wired mode.
  • For each H orbital octant, wrote the topological code to build all the triangles needed to describe the outer 3D isosurface (tetra-cubes algorithm), plus the internal 2D octant boundaries.
  • For each H orbital octant, wrote and tested the bit array code needed to eliminate the inner isofurfaces and show only the outer one.
  • Simplified the octant binary code in gamgi_chem_orbital.c.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.16.3
14th January 2013
Implemented Orbital->Copy, Orbital->Link, Orbital->Remove dialogs. Improved interface for Orbital->Create and all Object->Copy dialogs. Added Help->Current and Help->Topic documentation for dialogs Orbital->Create, Orbital->Copy, Orbital->Link, Orbital->Remove.

What is new:

  • Improved readability in all Object->Copy dialogs.
  • Added documentation for Orbital->Create, Orbital->Copy, Orbital->Link and Orbital->Remove.
  • Upgraded Help->Current and Help->Topic to allocate Orbital->Create, Orbital->Copy, Orbital->Link, Orbital->Remove.
  • Synced gamgi and gamgi_exp trees.
  • Orbital->Link is now working fine (lists of orbitals not implemented yet).
  • Fixed a glitch in all link_object.html files, resulting in a GAMGI error message when the Help sub-system tried to open one of these files.
  • Orbital->Copy is now working fine (lists of orbitals not implemented yet).
  • Orbital->Remove is now working fine (lists of orbitals not implemented yet).
  • Started building the dialogs Orbital->Copy, Orbital->Link, and Orbital->Remove.
  • The Octants layout, in the Orbital->Create dialog, is much more intuitive now.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.16.2
2nd November 2012
All the Hydrogen based orbitals from 1s to 6h are now working fine in GAMGI, as clouds of dots above a given density. Default values for threshold density, number of points and sampling radius were extensively studied for all orbitals, to guarantee scientific correctness and optimal visual representations. Solid representations of these orbitals and complex charge descriptions of molecules and crystals, obtained from ab-initio calculations done with other computer packages, are planned to go next.

What is new:

  • Synced gamgi/ (with GtkGLExt) and gamgi_exp/ (with GLX) versions.
  • Filtering volume octants are now working fine for H orbitals.
  • Completed search for best default values for H based orbitals. Default density is 1E-6, which is needed to show all regions in 6s orbitals. Points is 50000 x n, which is a reasonable compromise. Default radius is calculated scanning from the last maximum in f2r2 radial density, plus a 2.0 minimum length, until the maximum density (searching on theta, phi) becomes lower than the default density.
  • Improved, redesigned the Orbital->Create dialog.
  • H orbitals are now working fine in Gamgi. Looking now for the best default values.
  • Added all the code needed to build and render H orbitals.
  • Optimized H orbital code for speed.
  • For all Hydrogen based orbitals from n = 1 to 6, calculated the distances for radial polinomia maxima.
  • For all Hydrogen based orbitals from n = 1 to 6, calculated the distances for radial polinomia zeros.
  • Orbital objects can now be created, scaled (around the current center), moved, rotated, as any other Gamgi object.
  • Completed the dialog Orbital->Create to build Hydrogen based orbitals.
  • Wrote the graphic engine code to render Hydrogen based orbitals in dotted mode.
  • Added and tested the s, p, d, f, g, h Hydrogen based orbitals for n = 6, in cartesian x,y,z coordinates.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.16.1
4th September 2012
Added all the Laguerre and Legendre functions needed to build Hidrogen based atomic orbitals up to 5g, in xyz coordinates. Successfully tested dotted models of s,p,d,f,g Hydrogen based orbitals up to 5g. Found good algorithms to build surface models of orbitals. Wrote a first version of dialog Orbital->Create. Fixed two bugs on importing, exporting clusters, groups to XML files.

What is new:

  • Added all the data needed to describe Hdrogen based orbitals lower than h to gamgi_chem_orbital.c.
  • Completed a first version for the Hydrogen-based orbitals interface.
  • I am planning to implement a tetra-cubes algorithm (a variation of marching cubes) to polygonize orbital representations in Gamgi. According to Wikipedia, a patent on marching cubes was issued in 1987 and expired in 2005.
  • Started creating dialog Orbital->Create.
  • Implemented the nine g orbitals. They seem to be working fine.
  • Completed the conversion from radius,tetha,phi to x,y,z coordinates for all g orbitals.
  • Verified (again) the conversion from radius,theta,phi to x,y,z coordinates for all p, d, f orbitals.
  • Eliminated uneeded cluster->dots and solved a bug which prevented cluster Voronoi seeds from being exported and imported from file.
  • Fixed a bug in expat import/export code: unlike Groups, Clusters were not properly labeled as containers (the default) or polytopes, so polytope data was missing parameters when exported / imported.
  • Hydrogen-based atomic orbitals are working fine, for s, p, d, f orbitals, currently represented only as dot clouds.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI old
 
gamgi-0.17.5/doc/changelogs/changelogs17.html000066400000000000000000000354641433127522700207410ustar00rootroot00000000000000 GAMGI Changelogs: GAMGI 0.15
GAMGI new
 
New developments in code, documentation and website are reported here.

GAMGI 0.17.5
25th February 2022
This is mostly a cleaning release. Fixed all the strncpy, sprintf, calloc issues raised by gcc 10.2.1 (included with Debian 11) warnings. Cleaned parts of the x3d exporting code, involving texts and orbitals. Reviewed, updated the entire Help->Current and Help->Topic subsystems.

What is new:

  • Replaced standard lib function strncpy by gamgi_io_token_cut in gamgi_gtk_file_chooser to avoid improperly terminated truncated strings.
  • Replaced calloc by malloc (plus initialization) in gamgi_chem_symmetry.c, in all calls involving multiple objects, to avoid (false positive) gcc 10.2.1 warnings.
  • Eliminated a gcc 10.2.1 sprintf -Wformat-overflow= warning in gamgi_io_error.c. Although the code was safe, gcc was right that it could be improved.
  • Eliminated a false positive gcc 10.2.1 sprintf -Wformat-overflow= warning in gamgi_expat_export_config.c.
  • Eliminated a gcc 10.2.1 warning in gamgi_io_x3d_render due to a potential sprintf overflow. All gcc 10.2.1 warnings related with strncpy, sprintf and calloc calls are now fixed.
  • In io/gamgi_io_x3d code, fixed a sintax issue in the NavigationInfo node, to avoid a warning with X3D viewer view3dscene.
  • Started yet another round of cleaning X3D code in io/gamgi_io_x3d.c and io/gamgi_io_x3d_render.c. Exported text and orbital objects (solid and wired), are rendering well in X3D viewer view3dscene.
  • Fixed the set of incompatibility tests in expat/gamgi_expat_import_object.c for cell objects, which stopped GAMGI from reading stereographic projection files.
  • Fixed HTML files and Help->Current code for Text->Link, Orbital->Select, Atom->Config, Molecule->Create, Light->Config and Cell->Config help pages.
  • Added a test in gamgi_gtk_help_dialog_import to control mistakes in the help page provided for example in gamgi_gtk_help_current, that could even crash GAMGI when using a external browser to serve help pages.
  • Updated, synced information in Help pages for Group, Molecule, Cluster, Cell objects about Geometry measurements.
  • Merged, updated Help->Current documentation for Cell->Measure.
  • Fixed Help->Topic->Interfaces for Orbital->Select, Atom->Config, Molecule->Create, Cell->Measure, Light->Config, Cell->Config. Fixed Help->Topic->Formats for Light->Config.
  • Added documentation for File, Gamgi keywords, available from Help->Topic->Interfaces and Help->Topic->Formats.
  • Added Help->Current support for second level dialog reports for Cell->Measure Geometry and Voronoi methods (similar to Cluster->Measure, Molecule->Measure, Group->Measure).
  • Improved the Atom->Config GTK dialog (Color and View page).

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write documentation about lists of objects.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.

GAMGI 0.17.4
2nd August 2021
This is a maintenance release. Gamgi is compiling and working fine with the latest Debian testing release: bullseye 11 release candidate 2.

What is new:

  • Gamgi is compiling and working fine with Debian 11 bullseye rc2, with gcc 10.2.1.
  • Added extern to arrays in phys/gamgi_io_font_sun.c, to fix a multiple definition error with gcc 10.
  • Added extern to arrays in io/gamgi_io_font_hershey.c, to fix a multiple definition error with gcc 10.
  • Added extern to arrays in phys/gamgi_phys_symmetry.c, to fix a multiple definition error with gcc 10.
  • Added extern to arrays in chem/gamgi_chem_property.c, to fix a multiple definition error with gcc 10.
  • Added extern to gamgi_gamgi *gamgi in gamgi_global.h (declaration) and gamgi_gamgi *gamgi in gamgi_global_main (definition), to fix a multiple definition error with gcc 10.
  • Fixed a initialization bug in chem/gamgi_chem_symmetry.c: initialized sum=0 in static_optimize.
  • Rearranged the number tests in chem/gamgi_chem_graphene_cone.c to avoid a gcc indentation warning.
  • Fixed a bug in engine/gamgi_engine_array.h: gamgi_engine_iarray_push was returning double * instead of int *.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write documentation about lists of objects.
  • Write documentation about Orbitals.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.

GAMGI 0.17.3
15th July 2017
Implemented the GTL Cell->Config dialog and the corresponding XML code, allowing users to set personnal default parameters for Cell objects, and more importantly, to set different thicknnesses for Cell axes, borders and nodes, which is very usefull particularly when using large screen resolutions.

What is new:

  • Updated Help->Config files for Light and Atom objects.
  • Synced gamgi-g and gamgi-x trees.
  • Updated gamgi_expat_import_object: importing Cell object data to XML files with the new config rules should be working fine.
  • Updated gamgi_expat_export_object: exporting Cell object data to XML files with the new config rules is now working fine.
  • In Cell->Create and Cell->Modify, Origin vectors and Axes vectors are now updated automatically for default (Conventional or Primitive) options when Model changes.
  • Replaced cell->borders = FALSE by cell->borders = GAMGI_PHYS_NONE, in engine, gtk, expat and mesa code.
  • Updated gamgi_expat_export_config: exporting Cell config data to XML files is now working fine
  • Updated gamgi_expat_import_config: importing Cell config data from XML files is now working fine
  • Improved the Cell->Config dialog, to handle also default values for Model, Borders, Faces and Nodes.
  • Redesigned Object->Config dialogs: Config data is now separated in default data (in the pages with the same names as in Object->Create dialogs) and global data (applying to all objects, old and new), in the Global (last) notebook page. Dialogs affected: Atom->Config, Cell->Config, Light->Config.
  • Implemented Cell->Config dialog and infra-structure. The size of Cell border lines, node points, and vector axes can now be set globally for all cells in GAMGI, a feature badly needed. Default values for cell color and axes usage have been set also.
  • Fixed a issue in gamgi_gtk_bond_create: the color set in static_init ignored previous config data.
  • Fixed an issue in gamgi_mesa_draw_pick and gamgi_mesa_draw_grab: Cell rendering point width was set to line width instead of point width.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write documentation about lists of objects.
  • Write documentation about Orbitals.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.

GAMGI 0.17.2
12th May 2017
Merged the new graphene code to build nanotubes, nanocones, nanocages. Removed a serious bug resulting in top windows being closed too son in some window managers. Cleaned code to prevent compilation warnings about non-initialized variables, added a new test to catch nans in GTK dialog input data.

What is new:

  • Cleaned code in gamgi_gtk_*link.c and a few other files, to avoid warnings, mostly innocuous, about non-used and non-initialized variables.
  • Updated make_local to compile out-of-the-box in Debian 8.7, the last stable version.
  • Changed the delete_event callback in gamgi_gtk_window_create.c to prevent a bug resulting in top windows being closed too son in some window managers. Changed all other delete_event callbacks to return FALSE, when windows should be destroyed.
  • Merged the new GTK code to build nanotubes, nanocones, nanocages, from Molecule->Create.
  • Merged the graphene code to build nanotubes, nanocones, nanocages, created dor the Master thesis of Joao Coelho.
  • Cleaned code in gamgi_io_x3d.c and gamgi_io_x3d_render.c.
  • Added a new test case to gamgi_io_token_float_get_check and gamgi_io_token_double_get_check to find NANs.
  • Updated gamgi_math_quaternion_from_axis and gamgi_math_quaternion_to_axis, to handle the special case where the rotation angle is zero, to avoid a division by zero.
  • Removed gamgi/dat/util/: old files, no longer needed.
  • Synced documentation on http://gamgi.org and http://gamgi.ist.utl.pt with local doc/.
  • Synced data files on http://gamgi.org and http://gamgi.ist.utl.pt with local dat/.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write documentation about lists of objects.
  • Write documentation about Orbitals.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI 0.17.1
7th March 2014
Reviewed all Formats documentation, particularly for Cluster, Group, Plane, Direction objects. Replaced attribute type by reference in XML group elements. Reviewed the code bridging GTK and OpenGL. Changed license for GAMGI source code and GAMGI documentation for GPL v3. Renewed gamgi.org domain name until 2020 and GAMGI EU trademark until 2024. Started using sha256sum to checksum distribution tarball files.

What is new:

  • Fixed a bug just introduced: we cannot unref the GDK visual after removing a GL context. Just removed this code. Apparently GTK does this when the widget is destroyed.
  • Improved gamgi_gtk_area.c, used in the X version of GAMGI, that replaces the GTKGLExt library by our own GLX-based code. Javier Cabezas ported this code to GTK 3 and is working fine! Back ported changes so the differences between the code for GTK 2 and GTK 3 are absolutely minimal.
  • We cannot use r,g,b colors because of a,b,c cell axes.
  • Improved Axes layout in Orbital->Create and Orbital->Modify dialogs.
  • Changed label Model to Scope in Orbital->Create and Orbital->Modify and changed Help interface accordingly.
  • Checked all Help Formats documentation pages.
  • Updated Help documentation for Cluster Formats.
  • cluster->paints arrays are no longer zero-terminated.
  • Synced gamgi and gamgi_exp branches.
  • In XML files, in group elements, replaced attribute type by reference.
  • Updated Help documentation for Plane and Direction Formats.
  • Updated Help documentation for Group Interfaces and Formats.
  • Renewed the EU trademark GAMGI until 2024.
  • Updated the source code and documentation license to GPL v3.
  • Started using sha256sum to checksum all distribution files.
  • Renewed the gamgi.org domain name registration until 2020.

What is next:

  • Rewrite the About dialog, in the notebook form, to include pages for Developers, Contributors, Supporters.
  • Add a task id to operactions involving multiple scans to guarantee that there is no flag corruption when bonds are created between different molecules.
  • Add a bond angle, which is useful to control double bonds in solid mode.
  • Write documentation about lists of objects.
  • Write documentation about Orbitals.
  • Write tutorials about crystalographic and atomic Plane,Direction usage.
  • Implement dynamic text objects, to measure distances, angles, etc. on real time.
GAMGI old
 
gamgi-0.17.5/doc/code/000077500000000000000000000000001433127522700143555ustar00rootroot00000000000000gamgi-0.17.5/doc/code/architecture.html000066400000000000000000000063561433127522700177370ustar00rootroot00000000000000 GAMGI Code: Architecture
Code Architecture
 
GAMGI source code is in the src directory, distributed over the sub-directories engine, gtk, mesa, math, chem, phys, io, expat and global. The code in the gtk directory (TODO) is in turn partially distributed over sub-directories text, atom, bond, light, layer, etc., one for each object class.

Each directory has a makefile, listing all the local source files. These makefiles are then included in the global makefiles, in the src directory.

Each directory has a common header .h file, containing all the relevant type definitions, enumerations, macros, plus library headers that are relevant for that section of the code. This information should be included in the common header files only (library headers which are needed only once, are included directly in that specific source file, to reduce compilation time). The common header files are then included in the .c source files everytime that information is needed.

Every .c file has a corresponding .h file, containing: 1) full declarations (including argument names) of all the functions in the source file, including local (commented) functions; 2) a rationale describing the mains aspects of the control flow. Local functions are classified as static and start with the prefix static_. Global functions start with the name of the file containing them.

All files start with the prefix gamgi_ and for each directory in the file path after the src directory a new prefix is added, with the name of the directory. Thus a file (and the external functions inside) in the directory src/engine must have a prefix gamgi_engine. With this naming conventions it is easy to: 1) distinguish static and external Gamgi functions; 2) distinguish Gamgi and library functions; 3) to identify where is the file that contains a given Gamgi external function.

To understand GAMGI control flow, the first file to check is /src/global/gamgi_global_main.c, where GAMGI starts and ends. To understand GAMGI data flow, the first file to check is /src/engine/gamgi_engine.h, which contains the primary data types and definitions.

GAMGI has one global variable, called gamgi, declared in gamgi_global.h. This header file is then included everytime gamgi is needed. This declaration is actually redundant, as the gamgi address (TODO) can be acessed as the parent object for all the windows objects, but it makes code slightly simpler.

gamgi-0.17.5/doc/code/libraries.html000066400000000000000000000120611433127522700172170ustar00rootroot00000000000000 GAMGI Code: Libraries
Code Libraries
 
A big application as GAMGI, involving a wide range of programming technologies, must necessarily rely on libraries. For the sake of simplicity and freedom, for both users and developers, we aim: 1) to ensure that dependencies are kept to a minimum; 2) to use preferentially libraries that are also written in C; 3) to use only free libraries that put no legal restrictions on the applications built with them.

Currently GAMGI requires the following libraries: Glib/Gtk, Mesa, Gtkglarea, Expat and Freetype.

Mesa

To render the graphics, we use Mesa, a 3D graphics library that implements the complete OpenGL specification. Although Mesa is free software, we are not going to use any Mesa-specific mechanism. Every single Mesa function used in GAMGI conforms to the OpenGL standard. Therefore, GAMGI can be compiled, linked, executed with any implementation of the OpenGL standard.

From the legal point of view, users can link Gamgi GPL code to non-free OpenGL library implementations, to run in-house, as long as the library code is not distributed. Even statically compiling GAMGI against non-free libraries is legal, as long as the resulting binary is used in-house only and is not distributed in any way.

GAMGI should run with any version of Mesa or OpenGL. In order to follow the developments in the OpenGL specification, Mesa has been changing fast, resulting in a couple of bugs in Mesa in the last few years.

Versions above Mesa 3.0 and below Mesa 4.0.3 have a bug affecting bond cylinders with diffuse lights. Versions between Mesa 4.0.3 and Mesa 5.0 have a bug resulting in segmentation faults on exit, for some specific window open/close sequences. Mesa 5.0.2 has a bug in normals, affecting wired objects with lights. Mesa 6.0.1 has a bug affecting atom spheres with diffuse lights. The latest release, Mesa 6.4.2, works fine.

Gtk

We use Glib 1.2 and Gtk 1.2 to build all the widgets shown in GAMGI. Although this is great free software, Gtk development has been forked and redesigned to build Gtk 2.0, which is more powerful than Gtk 1.2.

Unfortunately there are a couple of issues with Gtk 2.0: 1) Apparently Gtk 2.0 is noticeably slower than Gtk 1.2 and GtkTreeView cannot handle large numbers of nodes; 2) Gtk 2.0 requires a lot of libraries, including libraries to handle all kinds of international languages (pango and gconv), to handle disabilities (atk), to handle image maps (jpeg, png and tiff), plus a library just to handle all these dependencies (pkg). These issues are probably not important for a GNOME desktop application, but they are quite relevant for scientific/engineering packages. Upgrading to Gtk 2.0 is therefore not a high priority for the GAMGI project, at the moment.

According to our goal of reducing GAMGI dependencies to a minimum, we are not going to use any mechanism (such as lists and objects), provided by Gtk or any other library, that falls outside the strict purpose of that library. We aim to prevent locking GAMGI into a specific toolkit, designing the code in such a way as to make changing toolkits as simple as possible (including changing from Gtk 1.2 to Gtk 2.0).

GtkGLArea

GtkGLArea is essentially a wrapper around the GLX library. OpenGL does not depend on the operating system, so GLX is a specific library to handle the connection between the X Window System and OpenGL. GtkGLArea in turn makes the bridge between the Gtk toolkit and the OpenGL API. There are two different GtkGLArea libraries, one to link against Gtk 1.2 and another to link against Gtk 2.0. Only the first one works with Gamgi.

Expat

Expat is arguably the fastest non-validating XML parser currently available, used for example in the Mozilla Gecko engine. Its simplicity and speed are the perfect match to read XML Gamgi files.

Freetype

The Freetype 2.0 library is used in GAMGI to build 3D solid fonts from Truetype fonts, such as DejaVuSans.ttf. The outline for each needed character is obtained from a TrueType file using Freetype, before being extruded and rendered by OpenGL. As fonts are sometimes hard to find, GAMGI distributes the DejaVu free fonts, initially developed for the GNOME project, in the directory src/io/fonts.
gamgi-0.17.5/doc/code/style.html000066400000000000000000000116411433127522700164060ustar00rootroot00000000000000 GAMGI Code: Style
Code Style
 

Code

Write code as simple as possible. Writing clever code for a large application, particularly in a open environment, where people with very different backgrounds share their work, is usually a bad ideia. The real sign of cleverness is to write code that is as simple to understand and modify as possible.

Use white space to separate small blocks of code. This tends to increase code readability without increasing visual pollution.

Always write explicit comparisons, never use abreviated versions: use if (a != NULL) or if (strcmp (a, b) == 0), instead of if (a) or if (!strcmp (a, b)). Avoid the ternary ? operator unless it really improves readability.

Whenever possible, use the same algorithms and programming techniques, in different parts of the program, to improve code readability and maintenance.

Indentation

Use 2 spaces for indentation. Interactive packages tend to have functions with relatively long names, so short indentations are prefered, and among these, 2 spaces is the most common (1 space is not visible enough).

Brackets

This is greatly a matter of personnal preference. With visually complex code (as the gtk code), aligned {, } brackets are probably more helpful, but with more ordered, clean code (as the engine code), K&R brackets economize space and often look better.

Use brackets everytime the control flow is not clear, even if they are not required. This is not an excuse though to not simplify the control flow as much as possible, in first place.

Comments

Comments should be used to document or to separate parts of the code.

When documenting code, try to clarify what is essential, using as less words as possible. The best way to check the quality of our own comments is to read them some time later, when the code details are long forgotten. More often than not we find out that: 1) our comments are not as clear as we thought they were; 2) they explain the easy procedures, instead of clarifying the really subtle points.

Too many comments are as bad as too little. To decrease visual pollution, try to group different explanations in a single comment, separated by white space.

When just separating code, comments should be reduced to a few words maximum, to avoid visual pollution and to distinguish them from more detailed, explanatory comments.

Comments should look as different as possible from code, to avoid visual pollution. Therefore our comments are surrounded by *, forming a rectangle (or just an L, in the file headers, containing copyright notices, etc. where the problem is less stringent, as code and comments are not competing for attention).

Functions

Spending time trying to find good names for functions is always a good investement, that pays off in code readability and maintenance. Good names are as short and explanatory as possible, and must cope with name space pollution. For a in depth discussion of GAMGI function name space, see Code Architecture.

To improve readability, keep a space between the function name and the left bracket that follows.

When writing the function prototype, always write the full function signature, including all the variable names in the argument list (not just the types), to improve maintenance.

Whenever possible, use the same name for the functions, in different parts of the program, to improve code readability and maintenance.

Variables

Use short names in math code and longer names in GUI code. In math code, the aim is to clarify the equations as much as possible, not to bloat them with longer names (comment the variable meaning instead).

In GUI code, with an object-oriented approach, use slightly longer names, if needed with words separated by dashes (_), as this makes the code easier to read. Write the most important word in the beginning, often the object type, always keeping the total length as small as possible: atom_new is better than new_atom.

Whenever possible, use the same name for the variables, in different parts of the program, to improve code readability and maintenance.

Line length

Avoid long lines, with more than 80 columns, to avoid readability and printing issues.
gamgi-0.17.5/doc/contacts/000077500000000000000000000000001433127522700152615ustar00rootroot00000000000000gamgi-0.17.5/doc/contacts/em.html000066400000000000000000000022061433127522700165500ustar00rootroot00000000000000 GAMGI Project: Email
Email
 
If you have any questions regarding GAMGI, we will be delighted to hear from you! Just contact us using the email address below, prefereably with GAMGI in the subject: Contact Email

Please make a discrete use of this information, to reduce spam. For the same reason, this address is likely to change in the future, so keep checking this page to get the current email contact and filtering conditions.

gamgi-0.17.5/doc/contacts/lists.html000066400000000000000000000065001433127522700173060ustar00rootroot00000000000000 GAMGI Contacts: Lists
Mailing Lists
 
The users mailing list is intended for people wanting to use GAMGI in their work. Main discussion topics are: installation problems, how to use GAMGI, the best techniques to accomplish specific tasks, suggestions about new features and improved usability, and bug reporting.

The coders mailing list is intended for people wanting to contribute to GAMGI development. Main discussion topics are: GAMGI design and implementation, scientific and computer algorithms.

Tips
 
Mailing lists are great, everybody loves them. However, there are a couple of precautions that people should take into account when subscribing to a public mailing list:
  • If you are going to leave for some time, perhaps on holidays, you may consider suspending your list subscriptions, to avoid accumulating a large volume of old messages. If you set an automatic message reply, everyone in the list will receive it, every time a message is posted to the list. If you switch off your email server, all the traffic sent to you will be returned and the list will keep trying to resend all the messages for some time.
  • If you automatically forward email traffic to the lists, your messages will be broadcasted to everyone listed, including to you, so your message will be forwarded again to list and the two email servers will end up bombarding each other and the whole list with messages. If indeed this happens, the worse thing list subscribers can do is to send email to the lists complaining, because these emails will be also automatically forwarded back to the list, increasing even more the list traffic.
  • These lists are public, because everyone can post to them, but the list email addresses should be kept as private as possible, to avoid spam. For the same reason, the subscribers email addresses are only available to the administrator.
  • Messages posted to the GAMGI mailing lists should be formatted as text only, as these makes it easy for everybody to read them and keep mail size to a minimum.
  • As the messages posted to these lists are archived, attachments and big files should be avoided as much as possible. When necessary, please consider sending the files directly to the person who is going to use them.
Although our usage policy regarding these lists is rather liberal and easy going, try to keep focused on GAMGI subjects, otherwise you may be wasting the time of someone else. People not behaving responsibly will be suspended from posting to the lists.
gamgi-0.17.5/doc/css/000077500000000000000000000000001433127522700142335ustar00rootroot00000000000000gamgi-0.17.5/doc/css/base.css000066400000000000000000000046231433127522700156640ustar00rootroot00000000000000/***************** * default style * *****************/ * { margin: 0; padding: 0; } body { color: #000; background-color: #000; background-image: url(gradient.png); background-repeat: repeat-y; font: 11px verdana, arial, helvetica, sans-serif; text-align: center; padding: 1.5em 20px; } /*************** * links style * ***************/ a { font-weight: bold; } a:link, a:visited, a:active { text-decoration: none } a:hover { text-decoration: underline overline } a:link { color: #069; } a:visited { color: #69c; } a:hover, a:active { color: #f80; } /****************** * contents style * ******************/ div.contents { color: #000; background-color: #fff; text-align: left; text-indent: 0; padding: 0.5em 1em; margin-bottom: 1em; border-left: 2px groove #069; border-right: 2px groove #069; border-bottom: 2px groove #069; } /******************* * IE6: Holly Hack * *******************/ * html div.contents { height: 1%; } div.contents { display: block; } div.contents:first-letter { color: #f80; font-size: xx-large; } div.contents img { float: left; margin-right: 10px; margin-bottom: 5px; } /**************** * tables style * ****************/ table { width: 50em; margin-left: auto; margin-right: auto; margin-top: 0.5em; margin-bottom: 1em; font-size: 11px; } table tr.odd { background-color: #cef; } table tr.even { background-color: #9cf; } table td { text-align: left; text-indent: 0.5em; } table td.center { font-weight: bold; text-align: center; } /**************** * bottom style * ****************/ #bottom { clear: both; text-align: center; color: #fff; margin: 1.5em; } #bottom a { color: #fff; } /******************** * delimiters style * ********************/ .clear { clear: both; } .center { text-align: center; } b { color: #f80; } p { margin: .3em 0; padding: .3em 0; } ul, ol { margin-left: 2em; } ol.inline { margin-left: 0; } ol.inline li { display: inline; margin-right: 1em; } pre { font: 11px verdana, arial, helvetica, sans-serif; margin: 0.5em 0; padding: 0; } /**************** * titles style * ****************/ h1 { clear: both; color: #fff; text-align: center; text-transform: uppercase; font-size: 14px; padding-top: 1.5em; padding-bottom: 0.5em; } h3 { clear: both; color: #888; text-align: left; font-size: 11px; padding-top: 1em; } gamgi-0.17.5/doc/css/board.css000066400000000000000000000006271433127522700160410ustar00rootroot00000000000000/********************** * information boards * **********************/ div.board { clear: both; color: #fff; background-color: #069; font-weight: bold; border-top: 2px groove #069; border-right: 2px groove #069; border-left: 2px groove #069; margin-top: 1em; padding: 0.3em 0.6em; } div.board div:first-child { float: left; } div.board div { font-size: 11px; text-align: right; } gamgi-0.17.5/doc/css/frontpage.css000066400000000000000000000056201433127522700167350ustar00rootroot00000000000000/***************** * default style * *****************/ * { margin: 0; padding: 0; } body { color: #000; background-color: #69c; font: 11px "bitstream vera sans", "Lucida Grande", "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif; } div#header { height: 100px; min-width: 600px; background-color: #000; } div#left { position:absolute; left: 0px; top: 100px; width: 150px; background-color: #fff; } div#center { margin-left: 150px; margin-right: 121px; padding: 5px 10px; border-right: 1px solid #069; border-left: 1px solid #069; color: #000; background-color: #fff; text-align: justify; } /******************* * IE6: Holly Hack * *******************/ * html div#center { height: 1%; } div#center { display: block; } * html div#header { height: 1%; } div#header { display: block; } div#center div.img_left { width: 150px; height: 150px; float: left; padding: 3px; margin-left: 0; margin-right: 10px; border: 1px solid #069; } div#center div.img_right { width: 150px; height: 150px; float: right; padding: 3px; margin-left: 10px; margin-right: 0; border: 1px solid #069; } div#right { position:absolute; top: 100px; right: 0px; width: 120px; border-top: 1px solid #fff; } div#bottom { clear: both; padding: 10px 10px 50px 10px; border-top: 10px solid #069; color: #fff; background-color: #69c; } div#left li { border-bottom: 1px solid #069; margin: 0; padding: 0.3em 0; text-indent: 0.5em; } div#right li { border-bottom: 1px solid #fff; border-left: 1px solid #fff; margin-left: 0px; padding: 0.3em 0; text-indent: 0.9em; } div#left li:first-child { border-top: 1px solid #069; } div#left h3 { padding: 0.3em 0.6em; text-align: left; color: #fff; background-color: #069; border: 1px solid #fff; } div#center h2 { clear: both; padding-left: 0.3em; padding-right: 0.3em; border-color: #069; border-style: solid; border-width: 0 0 1px 1px; display: inline; color: #069; } div#center h2.right { display: block; float: right; border-width: 1px 1px 0 0; } div#center h3 { line-height: 1.2; padding-top: 0.9em; color: #888; text-align: left; display: block; } div#right h3 { padding: 0.3em 0.6em; text-align: left; color: #fff; background-color: #069; border-left: 2px #069; border-right: 2px #069; border-bottom: 1px solid #fff; border-left: 1px solid #fff; } /****************** * elements style * ******************/ h2 { font-size: 12px; } h3 { font-size: 11px; } ul { list-style-type: none; } img { border: none; } a { font-weight: bold; } a:link, a:visited, a:active { text-decoration: none; } a:hover { text-decoration: underline overline; } a:link { color: #069; } a:visited { color: #69c; } a:hover, a:active { color: #f80; } b { color: #f80; } p { margin: .2em 0; padding: .2em 0; } .left { float: left; } .right { float: right; } .clear { clear: both; } #bottom a, div#right a { color: #fff; } div#right a:hover { color: #f80; } gamgi-0.17.5/doc/css/gradient.png000066400000000000000000000115171433127522700165430ustar00rootroot00000000000000‰PNG  IHDR@’+· pHYs  šœtIMEÖ:.vÔ½ñtEXtCommentCreated with The GIMPïd%nÅIDAT×u\[¶Ü6 #²Øî©{Êž‹@izÚžäÞ[–øAÐøïÿ¿U¬BU±X,XDëûæ—çô7H–>X(ŠóÑ:¿*¿ÃÜâûzÕw»³ŠïOÅÎíÏçzM¬B—³øïó$vsöjg5È•i…ä¹tž$fQ€]š•Y÷-t}_|åÉX³ë×Çç ¾ÕÖ>ß}’ÎGÁïßãåÔ,¯/ëùv!רÛÉù/lÂ툱Gfçïוe’Çè(›Yw˜uÒ,4ŽkÏÝf}…ìƒCÆ1&øsÏ>õæÄ3Í>‹½$™gzÎ)Mç\Ž¿làl‰oô¾Û• ¶ëß$¬;®ãÌðma‚ß þ›ËGÐNO­í˜Ç°]ðÜ|ž»N¬±ˆÃóíÀbš9Šäv§å´âç08ÎÎØ¾a\q~L î3´@e¡vÇã Š{oW¢‡1·ºêmB­å"Îgxšû‹˜œGûvbVB¾¢¯àG> Hû6^¶[AægyqžcgmçÓƒ*–Ë^Ø5ËÞF=†xbÏ9Œx4R?B>tÄ“Ôv¥Õ\›ié €]ôå"ËRÖ˜AøâZÚsâV{u“D:–̸bÖ·-;tE.Ù`ù¿"…ö© `ìÃÇØ“_ü¹.w!bËXq=w¶ú•¸Yã7vbÛ­éAÃþ¤àxí9þXré`R–?.{*w€ÚÀcAt<1(3¼+w Tëõ¿bØçjýl³ÜxRö ÿª˜·ðô·,¹}™Ý¶ßÈ矙Wªë£™Mì[æw€íR'°3úuÉôa0ð¿ ×ã.ó°°Ð’8e'¾úýÏ3²»[†ÿ̧:6óa1‚«Ž†®\ZŽÁ^¹uä POh®ðÆÎvŠ÷]óTÜ~¤WÂ6̉ë„È€¤r»«8BYøgøSÛûË…V´vŒâz€L/ îZëÃçâý©ÀAõÊRw-h¸%LPŽâ@‡±§vEàS u­p•m ãaWõaG¢ž5­CL*“·«º{¡Î}j×á^‘{çtÎ+cRÏÖ>õ¹•‚Ç{=À7ÕJ°¥†—®T°ö(‚(V(I;ÎxUÔª¦ª‰^åcd÷ûCø@¥§Ù @±Ùw0}à÷w„¯ þ¢7{ðavÛZš X•¹5êø+‚¯Äm•Ãf6Òß0ÛA× k&öc$Þ+³ë3¶-¨úã…ªP•»c‡‚ÇX0°¡ê÷8½&v€Gé)ÎÚÅ7tñÛ¶X^Túñ§?'ûðÝœ6úž ÛÏ¿hRƒœ° å»Î9iY}­Hž¬9ŒÅÈEul!¿p %€š\¨3™Í1dqRÜ*‡W¡Þ/?2Š7ôf@ X…7X ÌD1äy€²àsÞýs ÃrÕ{kK¢\…ú Dáþ¥Z‹É}›¾Ó†‡M†ÊõŽI`,Ž“,¤µ©2Îq%ð2x8›­Ã ¨<%¨¢Ï1H3¤W¢¸}ÜBßð+›©5!¬ „¾›Èž¯Ò‡æWû@=o|nmÛßa$ «R!:¢–…Ãüzm虢avnV€©-m‡#ÃïÇò(1®HÀЇ‹dxE‹ÖÈÕpù="­Jô$s6y1xg£=Caþ¯¼P_ ,1½¿”ÿcƒPþ6$¥åR,ÜFmº¶9á³—I÷é Ñ©ÓÁØ¡a~Må*0+e@NXhRÊÊã¾MA‚c ð.‡r¸¹ÙÕü6¼FÄrd:œöª›œ3œõÎVu«»Ác9‹,ˆ˜v%{m9µ9À†-fË;Ç2O…Õ”e,vüÙš©u6“-Ï:wXÔý,šyÅùå©4ÎŽ",'ìK‚@·'ÆíYÅ»›XŒ]š4éÚ¡Wc' ¸ÏMÏöUü,<Ìw²žØ-D›°¼Z\qÁÙûWà£J6!a’r´Û¥íT@˜Y)H"ˆ>ÄÁàRJÂ{©X /øÞ,TÎü0Ñ Œ€D²wQTŒã1,ðÉTP;X/TÅ­fšÇƪ2Cl±C2"2<¢®ÄŒ ÿЇÀ2ÌÖ¹/''3ÀùNcŠtî#©x–ÐóTɾV^gËütJØSp9+‰ÀháöS_ Íwgƒ™È–¶w?­{Íä'èÅ€¢Î‡·Y_þ£}‹á­JÙŸr\žhøj–—Ë …p¥@„«^¥ =\>̉5˜ÃF-,e]:ò¼‹IDzêfÜtG“Þª~Ö&DdïO’²¨MLPýP‚fK¬= {XÿT#ê˜ÿ"H"15?LÔEN¸òi¦ Ôr p2R“5oqË1i^yápî¢kk·²"%˜•2›8<ûN>ã ÿ1z>v¨ýhLovN+ Öv;…¾!4üá°VÑe¦Ãùh˜3êí$ÏiQ(u£RØáeCBUnЉQº…øê°zí&ÁÑÁcÒœ³½*î…˜Xâ³êÆ@µÓÐýØZV5ÚÆ3+ô•7ˆ¡òNzµÑ3Á¬¢lÖ `ê»&u€ GM@ŒÈ:xzOH½!¤ýDº6‰ƒ¸±*5G6¸ƒaÉMÜU¢–’Îå‘ju´Æ±$!£xêö¼Œ4m€¢:ìr‹|iØvUç˜þF‡F÷Q³–@dí aíž«äþ‚6¡)ßåżDkŠæùÀ£½Ÿ-"»(s¼È—n€Õ Ýù,ÊRu‘TÞª§(– ;3°±œQøxq'®/ò¨'zÊG¾xòsUâp¬ôêÍxû±*o±ÜäMù^¨&²K%™§É²‚µgµ" Ôƒ&ælÔOªP.9¬ž3'Õm™…гWTFuš—©„îä¿p×¢ÌòAjá‡lä ý¶_ך¨3ºÜàØÓwò©ÑWægÝ}籤†ŽI[[ý¯ Jš¨ãDp1‘jRDsùá%üì/%ôqÚè„ï:œRb•¦Š»<5& á^3¢îP$´¼¶„ ^òÐ;-Ó0ÁÿO73„÷Îu›í™çZ˜ò› ¯IÂLÛ‡b†åiÈÛ‚Žc·¾0$°'šáD-R3Âà ìLaÁDjÞ4DmZ(Dx¢ò'TB »˜ë÷m`[%HàkÏbtx MŽ{Ú‘@ФNƒÛ£N“è±8SoDêê*ð”6Æ8E‰£žj·Lb^2Ææ‚³çÒ ’çŽUÚÍ ·MÒ?ç§ú Õ`CH× ŸiZ WS$Äj;,'àÀ‡Ö¬_µU£…#º ˆ Ë±E‹•-Â9 nvÍÊÂ5CGqÙõI°ŠÇçÑñÎtŒÁ£‰H"àª@ ~é”ôŒsX»ò”k,¬Nša”î ±6õ@‡Áaú’é­JâFáEAÙÒ4ÛYK¹Ö&IEÀ–4U£gE»ßSp²¹×{&…>Ê=QÄ„ \<:ðÊÓ8ô&,ÂBjx,I'༇¼Š×DÂÐà›Cì+g‹âÌIÃäOjå¯IWzòÁ ÊuÀÆköÀ=Ù2ìÌ¥i\Ó„ê™6ÕŸÝLŠ@iä…xio¢_Å,íÝ$b&‡¸gìLêµú¸úMžú˜£ ãï&høOÜÚºÐ'õNPozpéûú^v¶pIÅ­ÿÛì’ikf®#BYñDzZˆ6 v¥a±ϵÕïûU-]»\¸ÿƒ_wÂ÷jYÙ8Imbác2.© -Ÿë5yá–"”0šu!SîÌq—(âÛØI%T-I¼S9ýi)ÖÍ«6²â#1y£Þ=]SÞ3fi³¤=Ã×/šòꆚq„SÄ%Ü]v¿_k¦„Í ‘ ÍÝõyƒMÅlaÙܳÕÚ¨‹ãŽFɇ:±:³êmtDƒ÷vùR½}βÂ/k°Õ¦æ×ü\J¡ijÕ‹³°÷ù!𹇠½²ÏĘcŽa1,‘Šº(ú›5„¸¿d$oY-hˆ2稈T-•Æq„„ ë¾5RÍøü@mGn¨Ì+ã#"ïSñ7_)3F§°|TÆûž™£½ij¨¤xÌ $8N!/·ñ\äÁñê-«ã„-\^ÁbÕ‹CÌ©W@ß_)ê1}4F a`¤'˜[4»ÿ²Þ5ðè=5¡; ܯõXMTÀ½«à˜ ÆÔÁ˜×DäëW¬¶ƒrÚœ¦½å&Ûìg2RQݕќŽbP\Ä)ùVè¥‚Þæ*WL8ÆýŽÖY&3¯¶ˆª‰/i(+FºÄ°ul { position: relative; float: left; clear: both; background-color: #9cf; height: 2.2em; top: -2.2em; } div.menus>ul:first-child { top: 2.2em; } div.menus li { float: left; text-align: center; position: relative; list-style-type: none; width: 6em; background-color: #9cf; border: 1px solid #9cf; line-height: 2.0em; } div.menus li:hover { background-color: #069; border: 1px solid #fff; } div.menus a { display: block; text-decoration: none; color: #fff; } div.menus ul li ul { margin: 0; position: absolute; width: 7.5em; left: -1px; } div.menus ul li ul li { width: 100%; background-color: #fff; border-color: #fff; } /****************************** * colors for drop-down menus * ******************************/ div.menus ul li ul li a { color: #000; } div.menus ul li ul li:hover a { color: #fff; } /***************************** * show,hide drop-down menus * *****************************/ div.menus ul li ul { display: none; } div.menus ul li:hover ul, div.menus ul li ul:hover { display: block; } gamgi-0.17.5/doc/css/notebook.css000066400000000000000000000015651433127522700165740ustar00rootroot00000000000000#notebook { clear: both; position: relative; height: 3em; } #notebook ul { position: absolute; bottom: -1px; padding-left: 1.0em; width: 60em; } #notebook ul li { display: inline; list-style: none; font-weight: bold; } #notebook ul a, #notebook ul span { display: block; float: left; min-width: 7em; padding: 4px 4px; margin: 1px 0.4em 0 0; text-align: center; font-size: 11px; text-decoration: none; border: 1px solid #069; border-bottom: none; } #notebook ul span { color: #000; background-color: #fff; margin-top: 0; padding-bottom: 6px; } #notebook ul a { color: #fff; background-color: #9cf; } #notebook ul a:hover { background-color: #069; border-color: #fff; margin-top: 0; padding-bottom: 5px; } div.contents { clear: both; border-top: 1px solid #069; min-width: 60em; } gamgi-0.17.5/doc/dtd/000077500000000000000000000000001433127522700142165ustar00rootroot00000000000000gamgi-0.17.5/doc/dtd/gml.dtd000066400000000000000000000020061433127522700154700ustar00rootroot00000000000000 %gml_config; %gml_object; gamgi-0.17.5/doc/dtd/gml_config.dtd000066400000000000000000000104661433127522700170260ustar00rootroot00000000000000 beep (yes | no) "yes" tolerance (0 | 1 | 2 | 3 | 4 | 5) "3" button1 (1 | 2 | 3) "1" button2 (1 | 2 | 3) "2" button3 (1 | 2 | 3) "3" length CDATA "4" angle CDATA "2" mass CDATA "4" charge CDATA "4" background_r CDATA #IMPLIED "0.184" background_g CDATA #IMPLIED "0.309" background_b CDATA #IMPLIED "0.309" foreground_r CDATA #IMPLIED "0.957" foreground_g CDATA #IMPLIED "0.867" foreground_b CDATA #IMPLIED "0.699" title_r CDATA #IMPLIED "1.0" title_g CDATA #IMPLIED "1.0" title_b CDATA #IMPLIED "0.0" bold_r CDATA #IMPLIED "1.0" bold_g CDATA #IMPLIED "1.0" bold_b CDATA #IMPLIED "0.0" link_r CDATA #IMPLIED "0.8" link_g CDATA #IMPLIED "1.0" link_b CDATA #IMPLIED "1.0" > rotate_max CDATA #IMPLIED rotate_step CDATA #IMPLIED move_max CDATA #IMPLIED move_step CDATA #IMPLIED scale_max CDATA #IMPLIED scale_step CDATA #IMPLIED > undo CDATA "5" save CDATA "5" perspective (no | yes) "yes" top CDATA "0.5" near CDATA "1.0" far CDATA "100.0" eye_x CDATA "0.0" eye_y CDATA "0.0" eye_z CDATA "10.0" center_x CDATA "0.0" center_y CDATA "0.0" center_z CDATA "0.0" up_x CDATA "0.0" up_y CDATA "1.0" up_z CDATA "0.0" > shininess CDATA "0.1" ambient_r CDATA "0.0" ambient_g CDATA "0.0" ambient_b CDATA "0.0" diffuse_r CDATA "0.0" diffuse_g CDATA "0.0" diffuse_b CDATA "0.0" specular_r CDATA "0.0" specular_g CDATA "0.0" specular_b CDATA "0.0" > element CDATA #IMPLIED mass CDATA #IMPLIED radius CDATA #IMPLIED red CDATA #IMPLIED green CDATA #IMPLIED blue CDATA #IMPLIED style (wired | solid) "wired" slices CDATA "16" size CDATA "0.8" variancy CDATA "0.0" min CDATA "0.3700" width CDATA "2" > lower CDATA "0.80" upper CDATA "1.10" element1 CDATA #IMPLIED element2 CDATA #IMPLIED min CDATA #IMPLIED max CDATA #IMPLIED style (wired | solid) "wired" size CDATA "0.5" color CDATA #IMPLIED red CDATA #IMPLIED green CDATA #IMPLIED blue CDATA #IMPLIED > style (wired | solid) "wired" wired (roman | roman_mono | sans | sans_bold | serif | serif_bold | script | script_bold | gothic_english | gothic_german | gothic_italian | symbol_sans | symbol_serif | symbol_serif_bold) "roman" solid (sans | sans_bold | sans_italic | sans_bold_italic | serif | serif_bold | mono | mono_bold | mono_italic | mono_bold_italic) "sans" red CDATA #IMPLIED green CDATA #IMPLIED blue CDATA #IMPLIED > gamgi-0.17.5/doc/dtd/gml_object.dtd000066400000000000000000000142361433127522700170260ustar00rootroot00000000000000 gamgi-0.17.5/doc/fasttrack.html000066400000000000000000000047371433127522700163260ustar00rootroot00000000000000 GAMGI Fasttrack
Users
 
To compile GAMGI, check the library paths in $GAMGI/src/make_local and type make, as described in the file $GAMGI/INSTALL. If problems arise, see: http://www.gamgi.org/documentation/install.html.

To start GAMGI, type gamgi in a terminal. To see how GAMGI works, press Help on the window. To see how GAMGI Help works, select Help->Topic->Help on the window.

Unless stated otherwise, $GAMGI represents the actual GAMGI root directory, for example /opt/gamgi, /usr/local/gamgi or /home/carlos/gamgi/gamgi0.11.11.

Coders
 
GAMGI source code is in the directory $GAMGI/src, distributed over the sub-directories engine, gtk, mesa, math, chem, phys, io, expat and global.

To understand GAMGI control flow, the first file to check is $GAMGI/src/global/gamgi_global_main.c, where GAMGI starts and ends. To understand GAMGI data flow, the first file to check is $GAMGI/src/engine/gamgi_engine.h, which contains the primary data types and definitions.

Each .c file has a corresponding .h file and each directory has a general .h file. All local functions start with the name static and all global functions start with the name of the file containing them. All functions in a .c file are listed in the corresponding .h file, including local (commented) functions and argument names, plus a rationale describing the control flow. GAMGI has one (redundant) global variable, called gamgi.

Unless stated otherwise, $GAMGI represents the actual GAMGI root directory, for example /opt/gamgi, /usr/local/gamgi or /home/carlos/gamgi/gamgi0.11.11.

gamgi-0.17.5/doc/formats/000077500000000000000000000000001433127522700151165ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/arrow/000077500000000000000000000000001433127522700162505ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/arrow/create_view.html000066400000000000000000000021151433127522700214320ustar00rootroot00000000000000 GAMGI Formats: Arrow Create

Arrow Create

  • View

scale

Change the arrow size, including its child objects. Arrow objects are scaled around the arrow center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
Example: <arrow ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/assembly/000077500000000000000000000000001433127522700167355ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/assembly/create_view.html000066400000000000000000000021341433127522700221200ustar00rootroot00000000000000 GAMGI Formats: Assembly Create

Assembly Create

  • View

scale

Change the assembly size, including its child objects. Assembly objects are scaled around the layer center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
Example: <assembly ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/atom/000077500000000000000000000000001433127522700160565ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/atom/config.html000066400000000000000000000142141433127522700202130ustar00rootroot00000000000000 GAMGI Formats: Atom Config
Atom Config
 

element

Identifies the element to which other properties apply, thus it must be coupled with mass, radius or red, green, blue parameters. It must be a valid element name, or a Dummy atom, represented as Du. Accepted values are "Si", " Si", "Si " but not "SI", "si", "S i" or "14".

mass

Coupled with the element parameter, the mass parameter can be used to change the default mass for each element. The new value replaces the old one everywhere in GAMGI interfaces, including the periodic table.

It might be useful, sometimes, to change this parameter several times in the same file, to handle blocks of data with different atomic characteristics (in isotopic studies, for example).

Default: <atom mass="15.9994" element="O"/> (default O mass)
Allowed values: positive real, element name (optional)

radius

The covalent radius used by default in GAMGI were obtained from http://www.webelements.com/.

Coupled with the element parameter, the radius parameter can be used to change the default radius for each element. The new value replaces the old one everywhere in GAMGI interfaces, including the periodic table.

We note that the new radius becomes immediately active, and might be used together with the lower, upper bond configuration parameters, to calculate bond length ranges, when creating new bonds automatically.

Default: <atom radius="0.7300" element="O"/> (default O radius)
Allowed values: positive real, element name (optional)

red, green, blue

Coupled with the element parameter, red, green, blue can be used to change the default color for an element. The new values replaces the old ones everywhere, including the periodic table.
Default: <atom red="1.0" green="1.0" blue="0.0" element="Si"/> 
(default Si color)
Allowed values: 0.0 - 1.0, element name 
(optional, coupled)

style

Controls which style is applied by default when creating a new atom.
Default: <atom style="wired"/> (defined in 
GAMGI_MESA_ATOM_DRAW)
Allowed values: wired, solid (optional)

variancy

The intrinsic size of a solid (spherical) atom is calculated according to the equation:
intrinsic = size x (variancy x radius + (1 - variancy) x min) 
where radius is the element radius currently defined and min is the minimum radius, by default the H covalent radius.

In wired mode, variancy is always 0.0 so all atom crosses have a constant size, given by size x min. In solid mode, variancy controls how the size of the atom spheres is affected by the atom radius. When variancy is 0.0 the atom spheres have all the same size, when variancy is 1.0 the atom spheres are scaled directly by the atom radius.

Default: <atom variancy="0.0"/> (defined in 
GAMGI_CHEM_ATOM_VARIANCY)
Allowed values: 0.0 - 1.0 (optional)

size

In solid mode, controls the size of the atom spheres. Combining atom size and variancy with bond size, it is possible to obtain a wide range of styles to represent atomic structures.

The default is to represent atoms as constant spheres, slightly larger than the bonds:

<atom variancy="0.0" size="0.8"/><bond size="0.5"/>
An elegant style is to represent atoms with constant spheres and the same size as bonds:
<atom variancy="0.0" size="0.5"/><bond size="0.5"/>
To represent compact cristalline structures, atom size and variancy must be 1.0, to be consistent with cell dimensions:
<atom variancy="1.0" size="1.0"/>
This style can also be used to represent molecules, in order to emphasize the atomic radius and electronic distribution.
Default: <atom size="0.8"/> (defined in 
GAMGI_CHEM_ATOM_SIZE)
Allowed values: positive real (optional)

min

In solid mode, defines the radius used by default to represent atoms, when variancy is set to 0.0 and all atoms are represented with the same size, as described above. By default it is the smallest radius available, the Hydrogen radius.
Default: <atom min="0.3700"/> (defined in GAMGI_CHEM_ATOM_MIN)
Allowed values: positive real (optional)

slices

In solid mode, controls the number of fragments used to represent curved surfaces such as atom spheres and bond cylinders, thus controlling the visual quality of these objects. Increasing the number of fragments improves noticeably the visual quality but also decreases performance substantially.
Default: <atom slices="16"/> (defined in 
GAMGI_MESA_ATOM_SLICES)
Allowed values: 10...100 (defined in 
GAMGI_MESA_ATOM_SLICES_MIN 
and GAMGI_MESA_ATOM_SLICES_MAX) (optional)

width

In wired mode, controls the line width used to draw atoms and bonds.
Default: <atom width="2"/> (defined in 
GAMGI_MESA_ATOM_WIDTH)
Allowed values: 1...5 (defined in 
GAMGI_MESA_ATOM_WIDTH_MIN and 
GAMGI_MESA_ATOM_WIDTH_MAX) (optional)
gamgi-0.17.5/doc/formats/atom/create_analysis.html000066400000000000000000000027271433127522700221220ustar00rootroot00000000000000 GAMGI Formats: Atom Create

Atom Create

temperature

Set the atom temperature (X-Ray Debye-Waller factor), in Angstrom squared: 0 < T < 100. Generally, T < 30 signifies confidence in its position, while T > 60 signifies disorder.
Example: <atom ... temperature="0.0"/> (default)
(defined in GAMGI_CHEM_ATOM_TEMPERATURE)
Allowed values: 0.0 - 100.0 real (optional)

occupancy

The degree of atom occupancy of a given position, as measured by X-ray diffraction.
Example: <atom ... occupancy="1.0"/> (default)
Allowed values: 0.0 - 1.0 real (optional)
gamgi-0.17.5/doc/formats/atom/create_position.html000066400000000000000000000021731433127522700221360ustar00rootroot00000000000000 GAMGI Formats: Atom Create

Atom Create

x, y, z

Set the coordinates of the atom center.
Example: <atom ... x="0.0" y="0.0" z="0.0"/> (default)
(defined in GAMGI_CHEM_ATOM_X, GAMGI_CHEM_ATOM_Y and GAMGI_CHEM_ATOM_Z)
Allowed values: real (optional, coupled)
gamgi-0.17.5/doc/formats/atom/create_property.html000066400000000000000000000045101433127522700221530ustar00rootroot00000000000000 GAMGI Formats: Atom Create

Atom Create

mass

Set the atom mass. When not indicated, GAMGI uses the default for the atom element: the mass average of the various isotopes weighted by their natural abundance, indicated in http://www.webelements.com/. To see the default, just select the Periodic Table from Atom->Create, Atom->Modify or Atom->Config, and then select the element. To change the default select Atom->Config and read Help->Topics->Formats->Config->Atom.
Example: <atom mass="15.9994" element="O" ... /> (default O mass)
Allowed values: positive real, element name (optional)

radius

Set the atom radius. When not indicated, GAMGI uses the default for the atom element: the half-distance between atoms in the most abundant natural form, indicated in http://www.webelements.com/. To see the default, just select the Periodic Table from Atom->Create, Atom->Modify or Atom->Config, and choose the element. To change the default select Atom->Config and read Help->Topics->Formats->Config->Atom.
Example: <atom radius="0.6037" element="O"/> (default O radius)
Allowed values: positive real, element name (optional)

charge

Set the atom charge. When not indicated GAMGI uses 0.0 as default.
Example: <atom charge="0.0" element="O"/> (default 0.0)
Allowed values: real (optional)
gamgi-0.17.5/doc/formats/atom/create_type.html000066400000000000000000000034401433127522700212510ustar00rootroot00000000000000 GAMGI Formats: Atom Create

Atom Create

element

Identifies the atom element or a Dummy atom, represented as Du. It must be present, otherwise an error is shown. Accepted values are "Si", " Si", "Si " but not "SI", "si", "S i" or "14".
Example: <atom ... element="Si"/> (Si element)
Allowed values: element name (required)

label

Label is useful to describe groups of atoms which share some properties, for example methyl and methilene hydrogens migh have atom types "h3" and "h2", respectively. Although its purpose is different, label is an alphanumeric attribute exactly as name or id. The default is the element name, converted to lowercase.
Example: <atom label="si" element="Si" ... /> (default Si type)
Allowed values: 20 alphanumeric characters maximum
(defined in GAMGI_ENGINE_TOKEN) (optional)
gamgi-0.17.5/doc/formats/atom/create_view.html000066400000000000000000000121461433127522700212450ustar00rootroot00000000000000 GAMGI Formats: Atom Create

Atom Create

style

Set how the atom is shown: a solid sphere or a wired cross. When not indicated, GAMGI uses the default. To change the default select Atom->Config and read Help->Topics->Formats->Config->Atom.

The sphere provides the highest visual quality and is recommended to produce final images of structures, together with lights. A sphere uses considerable screen space though and is time consuming because it is simulated by numerous 2D polygons, so many vertices and normal vectors (to calculate light) must be allocated and calculated all the time. The cross is designed for atomistic modelling work. Both screen space and computing time are kept to a minimum. Moreover, when atoms are bonded, the crosses are not represented and atoms are identified just by the ends of the lines representing bonds, thus decreasing even further computation needs. However, because lines do not have a 3D representation, diffuse and specular lights are not reflected by these objects, and they become almost invisible when using lights with an ambient component lower than (0.4, 0.4, 0.4).

Example: <atom style="wired"/> (default)
Allowed values: wired, solid (optional)

variancy

The intrinsic size of a solid (spherical) atom in GAMGI is calculated according to the equation: intrinsic = size x [variancy x radius + (1 - variancy) x min], where radius is the element radius currently defined and min is by default the H covalent radius, as defined in GAMGI (0.37).

In wired mode, variancy is always 0.0 so all atom crosses have a constant size, given by size x min. In solid mode, when variancy is 0.0 the atom spheres have all the same size, when variancy is 1.0 the atom spheres are scaled directly by the atom radius. To change the default select Atom->Config and read Help->Topics->Formats->Config->Atom.

Example: <atom variancy="0.0"/> (default)
Allowed values: 0.0 - 1.0 (optional)

size

Sets the size of a spherical atom, in solid mode. Combining atom size and variancy with bond size, it is possible to obtain a wide range of styles to represent atomic structures.

The default is to represent atoms as constant spheres, slightly larger than the bonds:

Example: <atom variancy="0.0" size="0.8"/><bond size="0.5"/>
An elegant style is to represent atoms with constant spheres and the same size as bonds:
Example: <atom variancy="0.0" size="0.5"/><bond size="0.5"/>
To show atoms in real size, atom size and variancy must be set to 1.0. This is often required in compact cristalline structures, to be consistent with cell dimensions, and in molecules, to emphasize the atomic radius and electronic distribution:
Example: <atom variancy="1.0" size="1.0"/>
To change the default size, select Atom->Config and read Help->Topics->Formats->Config->Atom.
Example: <atom size="0.8"/> (default)
Allowed values: positive real (optional)

red, green, blue

Set the atom color. When not indicated, GAMGI uses the default for the atom element. The default colors are essentially a superset of the CPK color scheme introduced by Corey, Pauling and Koltun.

To see the default, just select the Periodic Table from Atom->Create, Atom->Modify or Atom->Config, and choose the element. To change the default select Atom->Config and read Help->Topics->Formats->Config->Atom.

Example: <atom red="1.0" green="1.0" blue="0.0" element="Si"/> (default Si color)
Allowed values: 0.0 - 1.0, element name
(optional, coupled)

scale

Change the atom size, including its child objects. Atom objects are scaled around the atom center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
Example: <atom ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/bond/000077500000000000000000000000001433127522700160405ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/bond/config_length.html000066400000000000000000000055321433127522700215410ustar00rootroot00000000000000 GAMGI Formats: Bond Config

Bond Config

min, max, element1, element2

One of the methods available to automatically create new bonds is to calculate the distance between the two atoms and to check whether it fits inside the bond length range previously defined for that atom pair. Users can set explicit values for the default minimum and maximum length limits, for each element pair, using the min, max parameters, coupled with the element1, element2 parameters, to define the elements.

Explicitly defined bond length ranges become immediately active and constitute the first priority when using the bond length criterium to create new bonds. These parameters can thus be changed several times in the same file, to handle blocks of data with different bonding characteristics.

As min, max parameters are specific for a given element pair, the attributes element1, element2 must be included. When element1, element2 are present, but min, max are not, an error is also shown, because the only purpose of element1, element2 parameters is to set min, max values.

Example: <bond min="1.4720" max="2.0240" element1="Si" element2="O"/> (default)
(calculated from default Si, O radius and lower, upper parameters)
Allowed values: positive reals, element names (optional)

lower, upper

When explicit bond length ranges are not defined for a given element pair, GAMGI attempts to create default minimum and maximum bond length limits by summing the two atom radius and multiplying the sum by lower and upper factors. These lower, upper parameters are common to all atom pairs and provide thus a method much less accurate (but much more easy) to determine bonds than min, max. When at least one of the atom radius is undefined, no bond is created using the length criterium.
Example: <bond lower="0.80" upper="1.10"/> (default)
(defined in GAMGI_CHEM_BOND_LOWER and GAMGI_CHEM_BOND_UPPER)

Allowed values: positive reals, lower upper (optional)
gamgi-0.17.5/doc/formats/bond/config_view.html000066400000000000000000000046241433127522700212330ustar00rootroot00000000000000 GAMGI Formats: Bond Config

Bond Config

style

Controls which style is applied by default when creating a new bond: cylinders in solid mode, simple lines in wired mode.
Example: <bond style="wired"/> (default)
(defined in GAMGI_MESA_BOND_DRAW)
Allowed values: wired, solid (optional)

size

In solid mode, controls the size of the bond cylinders applied by default. Combining bond size with atom variancy and size, it is possible to obtain a wide range of styles to represent atomic structures. The default is to represent atoms slightly larger than bonds:
<atom variancy="0.0" size="0.8"/><bond size="0.5"/>
An elegant style is to represent bonds with the same size as atoms:
<atom variancy="0.0" size="0.5"/><bond size="0.5"/>
To guarantee that bond cylinders are closed by atom spheres, bond size should not be larger than atom size.
Example: <bond size="0.5"/> (default)
(defined in GAMGI_CHEM_BOND_SIZE)
Allowed values: positive real (optional)

color

Controls whether bonds have their own independent color, by default, or inherit the colors of the parent atoms.
Example: <bond color="no"/> (default)
Allowed values: yes, no (optional)

red, green, blue

Set the bond color used by default, when bonds are rendered with their own independent color.
Example: <bond red="0.0" green="0.8" blue="0.0"/> (default)
(defined in GAMGI_MESA_BOND_R, GAMGI_MESA_BOND_G, GAMGI_MESA_BOND_B)
Allowed values: 0.0 - 1.0 (optional, coupled)
gamgi-0.17.5/doc/formats/bond/create_property.html000066400000000000000000000033731433127522700221430ustar00rootroot00000000000000 GAMGI Formats: Bond Create

Bond Create

covalency

Specifies the degree of covalent character of a bond. A fully ionic bond might have covalency equal to 0.0, while a fully covalent bond might have covalency equal to 1.0.
Example: <bond ... covalency="0.5"/> (no default)
Allowed values: positive real (optional)

order

Specifies the bond order, 1.0 for a single bond, 2.0 for a double bond, 3.0 for a triple bond and 1.5 for a benzene aromatic bond.

In wired mode, single, double and triple bonds are described by one, two and three paralel lines, respectively. In solid mode, a single bond is described by a cylinder, a double bond has two additional cylinders coming slightly outside of the central cylinder, opposite to each other, and a triple bond has two more additional cylinders, all four making angles of 90 degrees between them.

Example: <bond ... order="1.0"/> (default)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/bond/create_type.html000066400000000000000000000026111433127522700212320ustar00rootroot00000000000000 GAMGI Formats: Bond Create

Bond Create

Currently bonds cannot be created automatically from inside a file, using either the geometric Length or the topological Delaunay methods. Each bond object contains thus a complete description of one bond only.

To specify the atoms forming the bond, the bond parameters parent1, parent2 must point to the atom id attributes, which are different for each atom.

Example: <bond ... parent1="C1" parent2="C2"/> (no default)
Allowed values: alphanumeric expression representing a unique atom id
with less than 20 characters (defined in GAMGI_ENGINE_TOKEN) (required)
gamgi-0.17.5/doc/formats/bond/create_view.html000066400000000000000000000061321433127522700212250ustar00rootroot00000000000000 GAMGI Formats: Bond Create

Bond Create

style

Controls how the bond is shown: with cylinders in solid mode and with simple lines in wired mode. By default, the wired mode is used. To change the default read Help->Topics->Formats->Bond->Config.
Example: <bond ... style="wired"/> (default)
Allowed values: wired, solid (optional)

size

In solid mode, controls the size of the bond cylinders. Combining bond size with atom variancy and size, it is possible to obtain a wide range of styles to represent atomic structures. The default is to represent atoms slightly larger than bonds:
<atom ... variancy="0.0" size="0.8"/><bond ... size="0.5"/>
An elegant style is to represent bonds with the same size as atoms:
<atom ... variancy="0.0" size="0.5"/><bond ... size="0.5"/>
To guarantee that bond cylinders are closed by atom spheres, bond size should not be larger than atom size.
Example: <bond ... size="0.5"/> (default)
Allowed values: positive real (optional)

color

Controls whether bonds have their own, independent, color, or inherit the colors from the parent atoms. By default colors are inherited.
Example: <bond ... color="no"/> (default)
(defined in GAMGI_MESA_BOND_COLOR)
Allowed values: yes, no (optional)

red, green, blue

Set the bond color, when the bond is rendered with its own, independent, color.
Example: <bond ... red="0.0" green="0.8" blue="0.0"/> (default)
(defined in GAMGI_MESA_BOND_R, GAMGI_MESA_BOND_G
and GAMGI_MESA_BOND_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

scale

Change the bond size, including its child objects. Bond objects are scaled around the bond line. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

Line widths in GAMGI are not affected by scale attributes, so bonds represented in wired mode remain unchanged by scale (but not its child).

Example: <bond ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/cell/000077500000000000000000000000001433127522700160355ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/cell/config.html000066400000000000000000000013211433127522700201650ustar00rootroot00000000000000 GAMGI Formats: Cell Config
Cell Config
 
No configuration parameters are currently available for Cell objects.
gamgi-0.17.5/doc/formats/cell/create_origin.html000066400000000000000000000074751433127522700215520ustar00rootroot00000000000000 GAMGI Formats: Cell Create

Cell Create

o1, o2, o3

o1, o2, o3 describe the coordinates of the node in the lower-left corner of the cell where the new origin is, calculated with conventional or primitive cell vectors.

The cell position, given by the coordinates x,y,z of the origin node, is not affected by a change in the origin node, so the new origin node must occupy the position kept by the previous origin node, forcing a cell translation. The new cell origin can be outside the current cell volume.

Example: <cell ... o1="0" o2="0" o3="0"/> (default)
Allowed values: integer (optional, coupled)

o4

When the lattice is centered and vectors are conventional, a fourth coordinate o4 is needed to point the new origin node (000) to one of the centered nodes. By default, o4 is 000, so no change is introduced. When the cell lattice is primitive P or the vectors defining the origin are primitive, that is the only possible value for o4. For I, C, F, R centered lattices, o4 can also take the values:
I: 111
C: 110
F: 110, 101, 011
R: 211, 122
corresponding to the numerators of the inner node coordinates, (1/2 1/2 1/2) for I lattices, (1/2 1/2 0) for C lattices, (0 1/2 1/2) (1/2 0 1/2) (1/2 1/2 0) for F lattices and (1/3 2/3 2/3) (2/3 1/3 1/3) for R lattices.
Example: <cell ... o4="000"/> (default)
Allowed values: 000, 111, 110
101, 011, 211, 122 (optional)

origin_vectors

Defines the type of cell vectors, conventional or primitive, used to determine the node with o1, o2, o3 coordinates, as described above. When o4 is not 000, a centered cell is involved, so origin_vectors must be conventional.

When the lattice is primitive or vectors are primitive, this corner node becomes the new origin node (000) and no more coordinates are needed.

Example: <cell ... origin_vectors="conventional"/> (default)
(defined in GAMGI_PHYS_CELL_VECTORS_ORIGIN)
Allowed values: conventional, primitive (optional)

axes

Controls whether cell axes are visible. Axes are positioned at node (000), and can be represented either by conventional or by primitive vectors. The three axes use the rgb color scheme: red for the first axis, green for the second and blue for the third.
Example: <cell ... axes="no"/> (default)
Allowed values: yes, no (optional)

axes_vectors

Defines the type of cell vectors, conventional or primitive, that should be represented.
Example: <cell ... axes_vectors="conventional"/> (default)
(defined in GAMGI_PHYS_CELL_VECTORS_AXES)
Allowed values: conventional, primitive (optional)
gamgi-0.17.5/doc/formats/cell/create_position.html000066400000000000000000000045451433127522700221220ustar00rootroot00000000000000 GAMGI Formats: Cell Create

Cell Create

x, y, z

Set the cell origin, always defined as the position of the node (000). For conventional, primitive, wigner and rhombus volumes, the origin is initially at the lower-left corner. For sphere and projection volumes, the origin is initially at the center. When the volume is projection, the origin cannot be changed.
Example: <cell ... x="0.0" y="0.0" z="0.0"/> (default)
(defined in GAMGI_MESA_CELL_X, GAMGI_MESA_CELL_Y and GAMGI_MESA_CELL_Z)
Allowed values: real (optional, coupled)

e1, e2, e3

Set the three Euler angles controlling the cell orientation. The first rotation (e1), around the initial y axis, must be between 0 and 180 degrees. The second rotation (e2), around the initial z axis, must be between 0 and 360 degrees. The third rotation (e3), around the final z axis, must be between 0 and 360.

By default (e1, e2 and e3 equal to zero), the first crystallographic vector is aligned along the x-axis, the second vector lies above, on the x-y plane, and the third vector has a positive z coordinate, thus pointing to the user (right-handed orientation).

Example: <cell ... e1="0.0" e2="0.0" e3="0.0"/> (default)
(defined in GAMGI_MESA_CELL_E1, GAMGI_MESA_CELL_E2 and GAMGI_MESA_CELL_e3)
Allowed values: e1: 0.0 - 180.0, e2, e3: 0.0 - 360.0 (optional, coupled)
gamgi-0.17.5/doc/formats/cell/create_symmetry.html000066400000000000000000000123131433127522700221370ustar00rootroot00000000000000 GAMGI Formats: Cell Create

Cell Create

system

system identifies the crystallographic system of the cell: cubic, tetragonal, orthorhombic, hexagonal, monoclinic or triclinic. Hexagonal, trigonal and rhombohedric cases are grouped in a single hexagonal system.

Although system is an optional parameter, system, lattice and group parameters together must provide enough information to properly identify the Bravais lattice of the cell. Redundant information is fine, but conflicting information is always flagged as an error.

Example: <cell ... system="cubic"/> (no default)
Allowed values: cubic, tetragonal, orthorhombic, 
hexagonal, monoclinic, triclinic (optional)

lattice

lattice identifies the type of lattice centering of the cell: P, I, F, C or R. A, B and C centering is always described in GAMGI by C-based lattices. Thus monoclinic base-centered cells have always a unique axis b.

The R lattices describe the seven space groups belonging to the hexagonal system that are described as R groups, when using the standard Hermann-Mauguin symbols: R3 (146), R-3 (148), R32 (155), R3m (160), R3c (161), R-3m (166), R-3c (167).

Although lattice is an optional parameter, system, lattice and group parameters together must provide enough information to properly identify the Bravais lattice of the cell. Redundant information is fine, but conflicting information is always flagged as an error.

Example: <cell ... lattice="P"/> (no default)
Allowed values: P, I, F, C, R (optional)

group

group identifies the space group of the cell: from 1 to 230. The four orthorhombic space groups 38-41, which are described as A groups when using the standard Hermann-Mauguin symbols, were converted to C groups by using a different axes setting, which results from the axes permutation abc->bca, as described in the International Tables for Crystallography. These four groups, Amm2, Aem2, Ama2 and Aea2, are thus described in GAMGI as Cm2m, Cm2e, Cc2m and Cc2e, respectively.

Cells with an hexagonal system and a rombohedric R lattice (corresponding to the seven R space groups when using the standard Hermann-Mauguin symbols), are always represented using the hexagonal axes and the obverse setting, when the chosen volume is conventional, and the rombohedric axes, when the chosen volume is primitive. Cells with an hexagonal system and a primitive P lattice (corresponding to all the other space groups from 143 to 194 that are not R) are always represented using full hexagonal prismas, when the chosen volume is conventional, and one-third of the hexagonal prismas, when the chosen volume is primitive.

Although group is an optional parameter, system, lattice and group parameters together must provide enough information to properly identify the Bravais lattice of the cell. Redundant information is fine, but conflicting information is always flagged as an error.

Example: <cell ... group="1"/> (no default)
Allowed values: 1 - 230 (optional)

a, b, c, ab, ac, bc

These lattice parameters define the cell geometry. For the cubic system, only one length is required (a or b or c). For the tetragonal system, two lengths are required (a or b and c). For the orthorhombic system, three lengths are required (a and b and c).

For the hexagonal system, two lengths are required (a or b and c). For the monoclinic system, three lengths are required (a and b and c), plus the angle around the axis b (ac).

For the triclinic system, all six parameters are required. Each angle must be smaller than the sum of the other two and must be larger than the absolute difference of the other two, otherwise an error is produced. Redundant information is fine, but conflicting information is always flagged as an error.

Example: <cell ... a="1.0" b="2.0" c="3.0"
ab="50.0" bc="60.0" ac="70.0"/> (no default)
Allowed values: positive real (required)
gamgi-0.17.5/doc/formats/cell/create_view.html000066400000000000000000000107341433127522700212250ustar00rootroot00000000000000 GAMGI Formats: Cell Create

Cell Create

faces

Controls the visual representation of the lattice faces. In wired mode, the lattice faces are represented by wired lines connecting the vertices. In solid mode, the lattice faces are represented by solid polygons, that users can see from the outside or from the inside.

When the selected type is rhombus or sphere, the cell must be represented in wired mode, otherwise the actual lattice would be hidden by the filtering volume. When type is projection, faces cannot be represented. The cell object must always have a visual representation, so at least one of the lattice components, faces, nodes and borders must be visible.

Example: <cell ... faces="no"/> (default)
Allowed values: yes, no (optional)

nodes

Controls whether the lattice nodes are visible or not. When type is projection, nodes cannot be represented. The cell object must always have a visual representation, so at least one of the lattice components, faces, nodes and borders must be visible.
Example: <cell ... nodes="yes"/> (default)
Allowed values: yes, no (optional)

borders

Controls the visual representation of the cell borders. When borders is none, no borders are represented in any cell representation. When borders is edges, only the outer line contours are shown. The boundaries between cells are hidden, as long as they are in the same plane, independently of the lattice parameters. When borders is faces, all lines are shown, except those inside the volume representation, making it easier to see the cell contents. Selecting the option all, all border lines become visible, including those inside the cell.

The faces and all options are disabled when type is set to rhombus or sphere filtering modes. The all option is disabled when faces is set to yes, because in solid mode the inner borders cannot be seen from the outside and make it very difficult to analyze something from the inside. When type is projection, the borders option is always edges, meaning the projection circumpherence. The cell object must always have a visual representation, so at least one of the lattice components, faces, nodes and borders must be visible.

Example: <cell ... borders="all"/> (default)
Allowed values: all, faces, edges, none (optional)

red, green, blue

Set the cell color, between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0). When the cell is shown in wired mode, this color is used to render the cell lattice framework. When the cell is shown in solid mode, faces are rendered using this color, and wired boundaries are rendered using the current layer background color.
Example: <cell ... red="1.0" green="1.0" blue="1.0"/> (default)
(defined in GAMGI_MESA_CELL_R, GAMGI_MESA_CELL_G
and GAMGI_MESA_CELL_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

scale

Change the cell size, including its child objects. Cell objects are scaled around the cell center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
Example: <cell ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/cell/create_volume.html000066400000000000000000000057171433127522700215670ustar00rootroot00000000000000 GAMGI Formats: Cell Create

Cell Create

type

Controls the representation of the cell lattice, which can be: 1) conventional (the lattice is constructed using n1, n2, n3 conventional cells; 2) primitive (the lattice is constructed using n1, n2, n3 primitive cells); 3) wigner (the lattice is constructed using n1, n2, n3 Wigner-Seitz cells); 4) parallelepiped (the lattice is filtered by a generic parallelepiped volume, with length parameters v1, v2, v3 and angle parameters v12, v13, v23); 5) sphere (the lattice is filtered by a sphere with radius v1); 6) projection (the lattice is represented by its stereographic projection).
Example: <cell ... type="conventional"/> (default)
Allowed values: conventional, primitive
wigner, parallelepiped, sphere, 
projection (optional)

n1, n2, n3

Control the number of lattice cells created along the directions defined by the vectors a, b, c, when type is conventional, primitive or wigner. Indicating some or all of these parameters when the cell type does not require them is flagged as an error.
Example: <cell ... n1="1" n2="2" n3="3"/> (default)
Allowed values: positive integer (optional, coupled)

v1, v2, v3, v12, v13, v23

When type is parallelepiped, these six parameters are needed to indicate the edge lengths and angles of the filtering parallelepiped. Each angle must be smaller than the sum of the other two and must be larger than the absolute difference of the other two, otherwise an error is produced.

When type is sphere, the v1 parameter is needed to indicate the radius of the filtering sphere. Setting parameters that are not required for a given cell type is flagged as an error.

Example: <cell ... v1="5.0" v2="6.0" v3="7.0"
v12="60.0" v13="70.0" v23="80.0"/> (no default)
Allowed values: positive real (required)
gamgi-0.17.5/doc/formats/cluster/000077500000000000000000000000001433127522700165775ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/cluster/create_position.html000066400000000000000000000040761433127522700226630ustar00rootroot00000000000000 GAMGI Formats: Cluster Create

Cluster Create

x, y, z

Set the coordinates of the cluster origin.
Example: <cluster ... x="0.0" y="0.0" z="0.0"/> (default)
Allowed values: real (optional, coupled)

center_x, center_y, center_z

Set the current center position for a polytope cluster. This is needed because the cluster position is defined relatively to its reference atoms, so when x,y,z and e1,e2,e3 are 0 the cluster is in its initial position. Therefore there is no relation between origin and center (unlike cell or text objects for example) and the latter must be specified.
Example: <cluster ... center_x="0.0" center_y="0.0" center_z="0.0"/>
(no default) Allowed values: real (optional, coupled)

e1, e2, e3

Set the three Euler angles controlling the cluster orientation. The first rotation (e1), around the initial y axis, must be between 0 and 180 degrees. The second rotation (e2), around the initial z axis, must be between 0 and 360 degrees. The third rotation (e3), around the final z axis, must be between 0 and 360.
Example: <cluster ... e1="0.0" e2="0.0" e3="0.0"/> (default)
Allowed values: e1: 0.0 - 180.0, e2, e3: 0.0 - 360.0
(optional, coupled)
gamgi-0.17.5/doc/formats/cluster/create_scope.html000066400000000000000000000062651433127522700221320ustar00rootroot00000000000000 GAMGI Formats: Cluster Create

Cluster Create

data

The geometric data defining a polytope cluster must be entered in order to make the cluster completely independent from its reference objects. This is accomplished with four data child elements, containig: 1) real data (atoms and vertices xyz coordinates); 2) integer data (the number of loops, the number of vertices for the first loop, the offset of vertices for the first loop, the number of vertices for the second loop, etc.); 3) real data (rgb colors in sequence, a new one for each loop changing color); 4) integer data (loop offsets in sequence, when reached they trigger a color change).

The following data is for a OH Voronoi polytope cluster, with 2 x 3 = 6 atom coordinates, with 2 x 5 = 10 faces, with 10 x 4 = 40 vertices, with 40 x 3 = 120 vertex coordinates, with 2 colors and 2 color change triggers.

Example:
<data ... name="points" type="double" size="126">
0.0065 0.0000 0.0000 0.9935 0.0000 0.0000 -1.0000 1.5000 1.5000 -1.0000
-1.5000 1.5000 0.5000 -1.5000 1.5000 0.5000 1.5000 1.5000 0.5000 -1.5000
-1.5000 -1.0000 -1.5000 -1.5000 -1.0000 1.5000 -1.5000 0.5000 1.5000
-1.5000 0.5000 1.5000 -1.5000 -1.0000 1.5000 -1.5000 -1.0000 1.5000 1.5000
0.5000 1.5000 1.5000 -1.0000 -1.5000 1.5000 -1.0000 -1.5000 -1.5000 0.5000
-1.5000 -1.5000 0.5000 -1.5000 1.5000 -1.0000 1.5000 -1.5000 -1.0000
-1.5000 -1.5000 -1.0000 -1.5000 1.5000 -1.0000 1.5000 1.5000 0.5000
-1.5000 1.5000 2.0000 -1.5000 1.5000 2.0000 1.5000 1.5000 0.5000 1.5000
1.5000 2.0000 1.5000 -1.5000 2.0000 -1.5000 -1.5000 0.5000 -1.5000 -1.5000
0.5000 1.5000 -1.5000 2.0000 1.5000 1.5000 2.0000 1.5000 -1.5000 0.5000
1.5000 -1.5000 0.5000 1.5000 1.5000 0.5000 -1.5000 -1.5000 2.0000 -1.5000
-1.5000 2.0000 -1.5000 1.5000 0.5000 -1.5000 1.5000 2.0000 -1.5000 1.5000
2.0000 -1.5000 -1.5000 2.0000 1.5000 -1.5000 2.0000 1.5000 1.5000
</data> Allowed values: real (required)

Example:
<data ... name="points_driver" type="int" size="51">
10 4 2 3 4 5 4 6 7 8 9 4 10 11 12 13 4 14 15 16 17 4 18 19 20 21 4 22 23
24 25 4 26 27 28 29 4 30 31 32 33 4 34 35 36 37 4 38 39 40 41
</data> Allowed values: integer (required)

Example:
<data name="colors" type="float" size="3">
1.000 0.000 0.000 1.000 1.000 1.000
</data> Allowed values: real (required)

Example:
<data name="colors_driver" type="int" size="2">
1 26 </data> Allowed values: integer (required)
gamgi-0.17.5/doc/formats/cluster/create_type.html000066400000000000000000000026511433127522700217750ustar00rootroot00000000000000 GAMGI Formats: Cluster Create

Cluster Create

Reference

Set the type of cluster to create, container or polytope. A container cluster is a recursive object that can contain arbitrary sets of child objects such as clusters, molecules, groups, planes, directions, atoms, bonds, texts. A polytope cluster describes the set of Voronoi polyhedra resulting from a Voronoi analysis of some initial container cluster, and the Voronoi conditions selected containing an arbitrary set of atoms.
Example: <group ... reference="container"/> (default)
Allowed values: container, polytope (optional)
gamgi-0.17.5/doc/formats/cluster/create_view.html000066400000000000000000000046311433127522700217660ustar00rootroot00000000000000 GAMGI Formats: Cluster Create

Cluster Create

faces

Controls the visual representation of a polytope Voronoi cluster. When faces is yes (the default), the polyhedron is represented by solid polygons, that users can see from the outside or from the inside. When faces is no, the polyhedron is represented by wired lines connecting the vertices.
Example: <group ... faces="yes"/> (default)
Allowed values: yes, no (optional)

atoms

In polytope Voronoi clusters, set the number of atoms to represent. To disable this representation set atoms equal to 0.
Example: <cluster ... atoms="1"/> (no defaults)
Allowed values: 1 - INT_MAX (optional)

scale

Change the cluster size, including its child objects.The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

Polytope clusters are scaled around the cluster center, while Container clusters are scaled around the viewport center. This happens because Polytope clusters have a geometric center, defined by the polyhedra, while Container clusters may have only atoms, and using its geometric center as the scaling center has the weird effect that moving one atom changes the visual representation of the other atoms, because the scaling center and thus the scaling transformation has changed!

Example: <cluster ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/direction/000077500000000000000000000000001433127522700170765ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/direction/create_position.html000066400000000000000000000042321433127522700231540ustar00rootroot00000000000000 GAMGI Formats: Direction Create

Direction Create

x, y, z

Set the coordinates of the direction origin.
Example: <direction ... x="0.0" y="0.0" z="0.0"/> (default)
Allowed values: real (optional, coupled)

center_x, center_y, center_z

Set the current center position for a line direction. This is needed because the direction position is defined relatively to its reference objects, a cell or atoms, so when x,y,z and e1,e2,e3 are 0 the direction is in its initial position. Therefore there is no relation between origin and center (unlike cell or text objects for example) and the latter must be specified.
Example: <direction ... center_x="0.0" center_y="0.0" center_z="0.0"/>
(no default) Allowed values: real (optional, coupled)

e1, e2, e3

Set the three Euler angles controlling the direction orientation. The first rotation (e1), around the initial y axis, must be between 0 and 180 degrees. The second rotation (e2), around the initial z axis, must be between 0 and 360 degrees. The third rotation (e3), around the final z axis, must be between 0 and 360.
Example: <direction ... e1="0.0" e2="0.0" e3="0.0"/> (default)
Allowed values: e1: 0.0 - 180.0, e2, e3: 0.0 - 360.0
(optional, coupled)
gamgi-0.17.5/doc/formats/direction/create_projection.html000066400000000000000000000031631433127522700234660ustar00rootroot00000000000000 GAMGI Formats: Direction Create

Direction Create

net

Set the projection net used to represent a crystallographic direction.

In the wulff projection, the point to project (above) and the point of the sphere farther from the user (below) define a segment that intersects the circle at a point, giving the final representation.

In the schmidt projection, the point to project (above) is rotated around the point of the sphere closer to the user (above), keeping the same XY direction, until both points have the same Z coordinate, and then divided by square root of 2, to be inside the circle with radius R at coordinate Z, giving the final representation.

Example: <direction ... net="wulff"/> (default)
Allowed values: wulff, schmidt (optional)
gamgi-0.17.5/doc/formats/direction/create_scope.html000066400000000000000000000062761433127522700224330ustar00rootroot00000000000000 GAMGI Formats: Direction Create

Direction Create

o1, o2, o3

A direction can be defined indicating explicitly the coordinates of a node where the direction passes. For each direction family, there is a direction passing through the origin node and as nodes are equivalent, it follows that for any node, there is a direction of any family passing through there.

When the lattice is primitive or vectors are primitive, coordinates o1, o2, o3 are enough to identify any cell node. By default, a crystallographic direction passes through the origin, with node coordinates equal to 0, 0, 0, respectively.

Example: <direction ... o1="0" o2="0" o3="0"/> (default)
Allowed values: integer (optional, coupled)

o4

When the lattice is centered and vectors are conventional, the coordinates o1, o2, o3 indicate the node in the lower-left corner of the cell where the direction passes. A fourth coordinate o4 is needed to point the centered node where the direction passes. By default, o4 is 000, so no change is introduced. When the cell lattice is primitive P or the vectors defining the node are primitive, that is the only possible value for o4. For I, C, F, R centered lattices, o4 can also take the values:
I: 111
C: 110
F: 110, 101, 011
R: 211, 122
corresponding to the numerators of the inner node coordinates, (1/2 1/2 1/2) for I lattices, (1/2 1/2 0) for C lattices, (0 1/2 1/2) (1/2 0 1/2) (1/2 1/2 0) for F lattices and (1/3 2/3 2/3) (2/3 1/3 1/3) for R lattices.
Example: <direction ... o4="000"/> (default)
Allowed values: 000, 111, 110 101, 011, 211, 122 (optional)

data

The geometric data defining a line direction must be entered in order to make the direction completely independent from its reference objects. This is accomplished with attributes begin_x, begin_y, begin_z, and end_x, end_y, end_z, defining the coordinates of the two end points.
Example: <direction ... begin_x="0.0" begin_y="0.0" begin_z="0.0"
end_x="1.0" end_y="1.0" end_z="1.0"/>
Allowed values: real (optional, coupled)
gamgi-0.17.5/doc/formats/direction/create_type.html000066400000000000000000000050551433127522700222750ustar00rootroot00000000000000 GAMGI Formats: Direction Create

Direction Create

reference

When reference is cell, the direction is crystallographic so direction indices are required and its parent must be a cell. When reference is atoms, the direction is described by two xyz coordinates so the direction becomes independent of the atoms used to define it.
Example: <direction ... reference="cell"/> (default)
Allowed values: cell, atoms (optional)

u, v, w

Set the indices u, v, w defining a crystallographic direction. The three indices cannot be all zero. An error is shown when these indices are not indicated for a crystallographic direction or when they are indicated for an atomic direction.
Example: <direction ... u="1" v="0" w="0"/> (no default)
Allowed values: integer (required, coupled)

vectors

Set the type of cell vectors, conventional or primitive, used to determine the direction with u, v, w indices. When the lattice is primitive there is no difference between conventional or primitive cell vectors. An error is shown when vectors is set for an atomic direction.
Example: <direction ... vectors="conventional"/> (default)
(defined in GAMGI_PHYS_DIRECTION_VECTORS)
Allowed values: conventional, primitive (optional)

model

An atomic direction is always represented as a line. A crystallographic direction can also be represented as a pole or a trace (for projected directions).
Example: <direction ... model="line"/> (default)
Allowed values: line, pole, trace (optional)
gamgi-0.17.5/doc/formats/direction/create_view.html000066400000000000000000000035541433127522700222700ustar00rootroot00000000000000 GAMGI Formats: Direction Create

Direction Create

red, green, blue

Set the direction color, between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).
Example: <direction ... red="0.0" green="1.0" blue="1.0"/> (default)
(defined in GAMGI_MESA_DIRECTION_R, GAMGI_MESA_DIRECTION_G
and GAMGI_MESA_DIRECTION_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

scale

Change the direction size, including its child objects. Direction objects are scaled around the direction center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

An error is shown when direction type is pole or trace (stereographic projection) or when autonomy is no (direction cannot scale independently of its parent).

Example: <direction ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/file/000077500000000000000000000000001433127522700160355ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/file/config.html000066400000000000000000000013211433127522700201650ustar00rootroot00000000000000 GAMGI Formats: File Config
File Config
 
No configuration parameters are currently available for File objects.
gamgi-0.17.5/doc/formats/formats.html000066400000000000000000000050641433127522700174640ustar00rootroot00000000000000 GAMGI Formats
File Formats
 
Files can be imported in .xyz and .xml native format, selected automatically by the file extension. Files can be exported in .ps, .ppm, .jp[e]g, .png, .tif[f], .x3d and native .xml formats, selected automatically by the file extension. Formats .jp[e]g, .png and .tif[f] require pnmtojpeg, pnmtopng, pnmtotiff, widely available and usually installed by default in most systems.

Files can be exported using File->Export. Only the object and config data regarding the currently selected object is actually exported! To select an object, choose Object->Select and press over the object. Or choose the object class on the menu above, with the middle button, before pressing on the object. Or press twice Layer, Window or Gamgi on the menu above. When the object has no visual representation, press the mouse over the graphic area, to pop up a menu. The statusbar shows the selected object (left) and layer (right).

Files can be imported using File->Import or adding filenames to the command line, when starting Gamgi:


gamgi file_1.xml ... file_n.xml
where file_n.xml is a fullname such as:

../dat/molecule/flavors/garlic.xml
~/gamgi/dat/molecule/flavors/garlic.xml
http://www.gamgi.org/dat/molecule/flavors/garlic.xml
ftp://ftp.gamgi.org/gamgi/dat/molecule/flavors/garlic.xml

Object and config data can be mixed, so file_1.xml might be a preferences file, loaded before the other object files. To automate the procedure, just add a line as this to .bashrc:


alias gamgi='gamgi ~/gamgi/my_defaults.xml'

Detailed explanations of valid formats, are available at http://www.gamgi.org/formats/formats.html, doc/formats/formats.html or Help->Topic->Formats.

gamgi-0.17.5/doc/formats/gamgi/000077500000000000000000000000001433127522700162025ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/gamgi/config_color.html000066400000000000000000000054101433127522700215330ustar00rootroot00000000000000 GAMGI Formats: Gamgi Config

Gamgi Config

base_r, base_g, base_b

Set the background color used in GAMGI large text messages. The default is the olive green color that Red Hat used for Emacs.

Example: <gamgi base_r="0.184" base_g="0.309" base_b="0.309"/> (default)
(defined in GAMGI_GTK_BACKGROUND_R, GAMGI_GTK_BACKGROUND_G 
and GAMGI_GTK_BACKGROUND_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

text_r, text_g, text_b

Set the foreground color used in GAMGI large text messages. The default is the light yellow color that Red Hat used for Emacs.
Example: <gamgi text_r="0.957" text_g="0.867" text_b="0.699"/> (default)
(defined in GAMGI_GTK_FOREGROUND_R, GAMGI_GTK_FOREGROUND_G 
and GAMGI_GTK_FOREGROUND_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

title_r, title_g, title_b

Set the color used in titles, in GAMGI large text messages, usually with a different, larger, font.
Example: <gamgi title_r="1.0" title_g="1.0" title_b="0.0"/>  (default)
(defined in GAMGI_GTK_TITLE_R, GAMGI_GTK_TITLE_G and GAMGI_GTK_TITLE_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

bold_r, bold_g, bold_b

Set the color used to highlight contents, in GAMGI large text messages, usually inside bold blocks.
Example: <gamgi bold_r="1.0" bold_g="1.0" bold_b="0.0"/> (default) 
(defined in GAMGI_GTK_BOLD_R, GAMGI_GTK_BOLD_G and GAMGI_GTK_BOLD_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

link_r, link_g, link_b

Set the color used to show URL and E-mail addresses, in GAMGI large text messages. Sometimes it is chosen also to highlight sub-titles.
Example: <gamgi link_r="0.8" link_g="1.0" link_b="1.0"/> (default)
(defined in GAMGI_GTK_LINK_R, GAMGI_GTK_LINK_G and GAMGI_GTK_LINK_B)
Allowed values: 0.0 - 1.0 (optional, coupled)
gamgi-0.17.5/doc/formats/gamgi/config_precision.html000066400000000000000000000025121433127522700224100ustar00rootroot00000000000000 GAMGI Formats: Gamgi Config

Gamgi Config

length, angle, mass, charge

Set the number of decimal figures used to show the various data types. This is not related with the precision used internally to handle data, which is always the maximum possible (double precision).
Example: <gamgi length="4" angle="2" mass="4" charge="4"/> (default)
(defined in GAMGI_MATH_DECIMAL_LENGTH, GAMGI_MATH_DECIMAL_ANGLE,
GAMGI_MATH_DECIMAL_MASS and GAMGI_MATH_DECIMAL_CHARGE)
Allowed values: 0 - 5 (defined in GAMGI_MATH_DECIMAL_MAX) (optional)
gamgi-0.17.5/doc/formats/gamgi/config_usability.html000066400000000000000000000053451433127522700224310ustar00rootroot00000000000000 GAMGI Formats: Gamgi Config

Gamgi Config

sound

To disable/enable the internal computer sound, used in GAMGI, for example, to signal that an object has been recognized.
Example: <gamgi sound="yes"/> (defined in GAMGI_GTK_BEEP) (default)
Allowed values: yes, no (optional)

tolerance

When selecting objects with the mouse, the sampled area is defined by the pixel where the user clicked the mouse, plus a tolerance given by the number of neighbour shells that should be considered. Thus a tolerance of 0 means that only the chosen pixel should be considered, while a tolerance of 1 means that the 8 pixels around should also be taken into account.

Small tolerances demand precision when pointing to the object, but large tolerances make it too easy to select more than one object, in which case GAMGI considers the object selection as unsucessfull.

Example: <gamgi tolerance="3"/> (default)
(defined in GAMGI_MESA_PICK_TOLERANCE)
Allowed values: 0 - 5 (defined in GAMGI_MESA_PICK_TOLERANCE_MAX) (optional)

button1, button2, button3

GAMGI expects to work with a 3-button mouse, where button1 handles operations such as rotating and menu selection, button2 handles operations such as moving and object selection, and button3 handles operations such as scaling. By default, these logical buttons point to the physical buttons left (1), middle (2) and right (3), respectively, but this can be changed, by pointing button1, button2, button3 to different combinations of values 1, 2 and 3, prodiving 6 possible sequences.

This should be usefull for left-hand users and when handling a 2-button mouse, to link the most important tasks to the two buttons available.

Example: <gamgi button1="1" button2="2" button3="3"/>) (default)
Allowed values: 1, 2, 3 (optional, coupled)
gamgi-0.17.5/doc/formats/graph/000077500000000000000000000000001433127522700162175ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/graph/create_view.html000066400000000000000000000021151433127522700214010ustar00rootroot00000000000000 GAMGI Formats: Graph Create

Graph Create

  • View

scale

Change the graph size, including its child objects. Graph objects are scaled around the graph center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
Example: <graph ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/group/000077500000000000000000000000001433127522700162525ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/group/create_position.html000066400000000000000000000040521433127522700223300ustar00rootroot00000000000000 GAMGI Formats: Group Create

Group Create

x, y, z

Set the coordinates of the group origin.
Example: <group ... x="0.0" y="0.0" z="0.0"/> (default)
Allowed values: real (optional, coupled)

center_x, center_y, center_z

Set the current center position for a polytope group. This is needed because the group position is defined relatively to its reference atoms, so when x,y,z and e1,e2,e3 are 0 the group is in its initial position. Therefore there is no relation between origin and center (unlike cell or text objects for example) and the latter must be specified.
Example: <group ... center_x="0.0" center_y="0.0" center_z="0.0"/>
(no default) Allowed values: real (optional, coupled)

e1, e2, e3

Set the three Euler angles controlling the group orientation. The first rotation (e1), around the initial y axis, must be between 0 and 180 degrees. The second rotation (e2), around the initial z axis, must be between 0 and 360 degrees. The third rotation (e3), around the final z axis, must be between 0 and 360.
Example: <group ... e1="0.0" e2="0.0" e3="0.0"/> (default)
Allowed values: e1: 0.0 - 180.0, e2, e3: 0.0 - 360.0
(optional, coupled)
gamgi-0.17.5/doc/formats/group/create_scope.html000066400000000000000000000031411433127522700215730ustar00rootroot00000000000000 GAMGI Formats: Group Create

Group Create

data

The geometric data defining a polytope group must be entered in order to make the group completely independent from its reference objects. This is accomplished with two data child elements, one containig real data (the xyz coordinates), the other containing integer data (the number of loops, the number of vertices for the first loop, the offset of vertices for the first loop, the number of vertices for the second loop, etc.).
Example:
<data ... name="points" type="double" size="12">
2.0000 0.0000 2.0000 2.0000 2.0000 0.0000 0.0000 0.00000.0000 0.0000
2.0000 2.0000 </data> Allowed values: real (required)

Example:
<data ... name="points_driver" type="int" size="17">
4 3 1 2 3 3 2 0 3 3 0 1 3 3 1 0 2 </data>
Allowed values: integer (required)
gamgi-0.17.5/doc/formats/group/create_type.html000066400000000000000000000025501433127522700214460ustar00rootroot00000000000000 GAMGI Formats: Group Create

Group Create

Reference

Set the type of group to create, container or polytope. A container group is a recursive object that can contain arbitrary sets of child objects such as groups, planes, directions, atoms, bonds, texts. A polytope group builds a coordination polyhedron defined by the smallest convex polygonal representation that surrounds an arbitrary cloud of central and neighbour atoms.
Example: <group ... reference="container"/> (default)
Allowed values: container, polytope (optional)
gamgi-0.17.5/doc/formats/group/create_view.html000066400000000000000000000047251433127522700214450ustar00rootroot00000000000000 GAMGI Formats: Group Create

Group Create

faces

Controls the visual representation of a polytope group. When faces is yes (the default), the polyhedron is represented by solid polygons, that users can see from the outside or from the inside. When faces is no, the polyhedron is represented by wired lines connecting the vertices.
Example: <group ... faces="yes"/> (default)
Allowed values: yes, no (optional)

red, green, blue

Set the color of a polytope group, between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).
Example: <group ... red="0.0" green="1.0" blue="1.0"/> (default)
(defined in GAMGI_MESA_GROUP_R, GAMGI_MESA_GROUP_G
and GAMGI_MESA_GROUP_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

scale

Change the group size, including its child objects.The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

Polytope groups are scaled around the group center, while Container groups are scaled around the viewport center. This happens because Polytope groups have a geometric center, defined by the polyhedra, while Container groups may have only atoms, and using its geometric center as the scaling center has the weird effect that moving one atom changes the visual representation of the other atoms, because the scaling center and thus the scaling transformation has changed!

Example: <group ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/help/000077500000000000000000000000001433127522700160465ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/help/config_agent.html000066400000000000000000000026631433127522700213660ustar00rootroot00000000000000 GAMGI Formats: Help Config

Help Config

agent

Indicates whether the Help documentation should be presented with GAMGI or an external browser.
Example: <help agent="gamgi"/> (default)
Allowed values: gamgi, browser (optional)

browser

Shows the path to the prefered browser executable. It is needed only when agent is set to browser. This is equivalent to create the BROWSER environment variable, containing the same path.
Example: <help browser="/usr/bin/firefox"/> (default)
(after defining BROWSER in ~/.bashrc: BROWSER=/usr/bin/firefox; export BROWSER)
Allowed values: 100 ASCII characters maximum (defined in GAMGI_IO_PATHNAME) (optional)
gamgi-0.17.5/doc/formats/help/config_source.html000066400000000000000000000035741433127522700215720ustar00rootroot00000000000000 GAMGI Formats: Help Config

Help Config

source

Indicates whether the Help documentation should be fetched from the local computer or from a remote (HTTP or FTP) server.
Example: <help source="local"/> (default)
Allowed values: local, remote (optional)

local

Indicates the path to the local doc directory where the GAMGI documentation starts. It is needed only when source is set to local. This is equivalent to create the GAMGI environment variable, containing the same path.
Example: <help local="/home/carlos/gamgi/gamgi"/> (default)
(after defining GAMGI in ~/.bashrc: GAMGI=/home/carlos/gamgi/gamgi; export GAMGI)
Allowed values: 100 ASCII characters maximum (defined in GAMGI_IO_PATHNAME) (optional)

remote

Indicates the path to the remote doc directory where the GAMGI documentation starts. It is needed only when source is set to remote.
Example: <help remote="http://www.gamgi.org/"/> (default)
(defined in GAMGI_IO_WEBSITE) 
Allowed values: 100 ASCII characters maximum (defined in GAMGI_IO_PATHNAME) (optional)
gamgi-0.17.5/doc/formats/introduction.html000066400000000000000000000042751433127522700205350ustar00rootroot00000000000000 GAMGI Formats: Introduction
File Formats
 
This part of the manual is an introduction to the various file formats available in GAMGI, in particular to the XML native file formats used to describe objects, configuration and documentation. Ideally users should understand these principles, before consulting the Reference Manual, which aims to describe all the functionality available from GAMGI XML files.

Native Formats

  1. 1. Introduction
  2. 2. Language
  3. 3. Elements
  4. 4. Attributes
  5. 5. Headers
  6. 6. Entities
  7. 7. Comments
  8. 8. Identifiers
  9. 9. Defaults

Other Formats

  1. 1. JPEG,JPG
  2. 2. PNG
  3. 3. PPM
  4. 4. PS
  5. 5. TIFF,TIF
  6. 6. TEX
  7. 7. X3D
  8. 8. XHTML
  9. 9. XYZ

Users are invited to subscribe and consult the archives of the users mailling list.

gamgi-0.17.5/doc/formats/introduction/000077500000000000000000000000001433127522700176375ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/introduction/attributes.html000066400000000000000000000051741433127522700227220ustar00rootroot00000000000000 GAMGI Formats: Introduction Attributes
Introduction Attributes
 
Attributes describe the properties of the elements, therefore each attribute cannot appear more than once for each element. Attributes can be written in any order and separator characters (space, tab, newline) before or after the attributes or their values are ignored.

Some attributes are required (for example, the x, y, z atom coordinates), some are optional (for example the atom mass) and default values are used when they are not explicitely indicated. What are these default values and how to change them is the subject of the Gamgi part of this manual.

Some optional attributes are coupled (for example, the red, green, blue atom colors), which means that, if present, the whole set must be indicated.

Some attributes are incompatible because they describe properties that cannot be valid simultaneously for the same object (for example, a cell element cannot have simultaneously n1, n2, n3 number of cells and a volume set to sphere).

For each GAMGI object, a description of all the accepted attributes, with their possible values and restrictions, is presented in the corresponding chapter of this manual.

Good:


<atom element="H" x="0.0" y="0.0" z="0.0"/> all required attributes are present

<atom 
      z=  "0.0" 
      y="  0.0" 
      x="0.0  "
      element="H" /> equivalent to example above

<atom element="H" x="0.0" y="0.0" z="0.0" mass="2.0"/> optional attributes may be added

Bad:


<atom element="H" x="0.0" z="0.0"/> a required parameter is missing

<atom element="H" x="0.0" y="0.0" z="0.0" red="1.0" blue="1.0" /> a coupled parameter is missing

<atom element="H" x="0.0" y="0.0" z="0.0" element="H"/> the same attribute appears twice

<cell system="c" lattice="P" a="1.0" n1="1" n2="1" n3="1" volume="sphere" v1="1.0"/> 
incompatible attributes
gamgi-0.17.5/doc/formats/introduction/comments.html000066400000000000000000000024111433127522700223500ustar00rootroot00000000000000 GAMGI Formats: Introduction Comments
Introduction Comments
 
A comment block in XML starts with <!-- and ends with -->. Everything can go inside a comment block, except the -- sequence, for compatibility with older format specifications (SGML).

Good:


<!--comment--> no spaces needed between comment symbols and text

<!-- 
comment --> comments can be spawn over multiple lines

Bad:


< !-- comment --> left comment symbol has a space in the middle

<-- comment --> left comment symbol misses a ! character

<!-- -- comment --> comment has a -- sequence
gamgi-0.17.5/doc/formats/introduction/defaults.html000066400000000000000000000064021433127522700223360ustar00rootroot00000000000000 GAMGI Formats: Introduction Defaults
Introduction Defaults
 
The properties of the objects defined in GAMGI are governed by many different parameters, which must have default values, otherwise users would have to set all of them.

The default values applied when importing objects from GML files are the same as when creating them directly in GAMGI. In order to create files simple to handle, parameters which contain the default values are not exported To guarantee that a given configuration, after being exported and imported again, is still the same, the defaults must be identical when both operations take place.

The default values, the configuration data, can be modified by users, in two ways: directly in GAMGI, selecting the Config task for the required class of object, or importing a XML file with the new configuration data, also entered as XML elements: <atom/>, <bond/>, etc. GAMGI distinguishes object data and configuration data because configuration data is inside <gamgi></gamgi> blocks (the rationale is, configuration data is valid for the whole GAMGI).

When importing files containing <gamgi></gamgi> blocks, the new configuration parameters become immediately effective. Therefore, if a given parameter is changed several times during an import operation, different defaults will be applied on each section, which may be useful to avoid many parameter repetitions in files.

When exporting configuration data, GAMGI applies the same criterium used with object data, exporting only non-default data. To ensure that the objects defaults are identical when exporting and then importing object data, GAMGI always exports the non-default configuration data before exporting the requested object data. This way, the next time the file is imported, the non-default configuration data will be already in place when the object data is imported.

To reset configuration parameters to the values that were in place when the importing operation started (not necessarily the initial GAMGI defaults), these parameters should be entered with empty attributes, as in attribute="".

Good:


<gml>
  <gamgi>
    <atom element="H" mass="2.0"/> change default
  </gamgi>
  <atom element="H" /> atom mass is 2.0
  <gamgi>
    <atom element="H" mass="3.0"/> change default
  </gamgi>
  <atom element="H" /> atom mass is 3.0
  <gamgi>
    <atom element="H" mass=""/> reset default
  </gamgi>
  <atom element="H" /> atom mass is 1.00794, 
  if the GAMGI default was not changed
</gml>
gamgi-0.17.5/doc/formats/introduction/elements.html000066400000000000000000000061111433127522700223400ustar00rootroot00000000000000 GAMGI Formats: Introduction Elements
Introduction Elements
 
GML files can contain object data (the objects) and configuration data (their global properties). The <gml> root element can thus contain elements describing all the data objects defined in GAMGI, from <window>, <layer>, <light>, to <bond>, <orbital>, <text>, plus the global <gamgi> element.

As configuration data conceptually belongs to the gamgi object, it is represented inside <gamgi></gamgi> blocks. These blocks can occur in any order and as many times as needed, can contain elements describing the global properties of all the GAMGI objects, from <file>, <window>, <layer>, to <orbital>, <text>, <help>. These elements in turn can occur in any order and as many times as needed, but cannot contain other elements:

Everything outside <gamgi></gamgi> blocks is considered as object data. The elements describing data objects, from <window>, <layer>, <light>, to <bond>, <orbital>, <text>, can occur in any order and as many times as needed, can contain elements describing its child objects, in any order and as many times as needed, to any nested level of depth.

When importing GML files, objects that belong to layers and appear directly below <gml>, in the hierarchy, are attributed to the current layer. Layers that appear directly below <gml>, in the hierarchy, are attributed to the current window.

Good:


<gml>
  <group>
    <group/> a group can contain another group
  </group>
</gml>

<gml>
  <window/>
  <layer/> layer belongs to current window, not the new window
  <atom/> atom belongs to current layer, not the new layer
</gml>    

<gml>
  <gamgi>
    <atom/> update atom configuration data
  </gamgi>
</gml>

Bad:


<gml>
  <gamgi>
    <window>
    </gamgi> last element in, must be first element out
  </window>
</gml>

<gml>
  <molecule>
    <molecule/> a molecule cannot contain another molecule
  </molecule>
</gml>

<gml>
  <gamgi>
    <layer>
      <atom/> a layer configuration element cannot contain other objects
    </layer>
  </gamgi>    
</gml>
gamgi-0.17.5/doc/formats/introduction/entities.html000066400000000000000000000074041433127522700223560ustar00rootroot00000000000000 GAMGI Formats: Introduction Entities
Introduction Entities
 
XML Entities are a mechanism to reuse data defined elsewhere, in the same or in different files. Internal entities define blocks of data which can then be included in the same file. External entities declare local or remote files, which can then be included in the same or in other files. For example:

<?xml version="1.0"?>
<!DOCTYPE gml
[
<!ENTITY internal "<atom element='H' x='0.0' y='0.0' z='0.0'/>">
<!ENTITY local SYSTEM "/opt/gamgi/gamgi/dat/atom/hydrogen.xml">
<!ENTITY remote SYSTEM "http://www.gamgi.org/dat/atom/hydrogen.xml">
]>
<gml>
  &internal; 
  &local;
  &remote;  three atoms coming from different sources
</gml>
Internal and external entities must start and end at the same level of hierarchy, otherwise an error is flagged, even if the whole contents is correct. The same is true for the " and ' symbols, used to distinguish the two levels of strings in the entity declarations, which must be nested correctly.

Internal and external identities can be called recursively, without limit for the number of nested levels, so data block A can call data block B which in turn can call data block C, and file A can include file B which in turn can include file C.

Internal entities must be defined before they are used, so block C must be defined before block B and block B must be defined before block A. External entities must be declared in the main file, so files B and C must be declared in file A. File A must have a header, with a version attribute, while file B and file C may have a header but cannot have a version attribute.

Good:


<?xml version="1.0"?>
<!DOCTYPE gml 
[
<!ENTITY atom "<atom element='H' x='0.0' y='0.0' z='0.0'/>">
<!ENTITY layer "<layer> &atom; </layer>">
<!ENTITY window "<window> &layer; </window>">
]>
<gml>
  &window; a window containing a layer containing an atom
</gml>

main file:
<?xml version="1.0"?>
<!DOCTYPE gml 
[
<!ENTITY layer "/opt/gamgi/gamgi/dat/layer/layer.xml">
<!ENTITY atom "/opt/gamgi/gamgi/dat/atom/hydrogen.xml">
]>
<gml>
  &layer; a layer containing an atom
</gml>

/opt/gamgi/gamgi/dat/layer/layer.xml file:
<?xml encoding="UTF-8"?>
<layer>
  &atom;
</layer>

/opt/gamgi/gamgi/dat/atom/hydrogen.xml file:
<?xml encoding="UTF-8"?>
<atom element='H' x='0.0' y='0.0' z='0.0'/>

Bad:


<?xml version="1.0"?>
<!DOCTYPE gml
[
<!ENTITY layer "<layer name="base'/>'> the symbols " and ' are not correctly nested
]>
<gml>
  &layer;
</gml>

<?xml version="1.0"?>
<!DOCTYPE gml 
[
<!ENTITY atom "element='H' x='0.0' y='0.0' z='0.0'/>">
]>
<gml>
  <atom
    &atom; when this entity starts and ends the hierarchy is different
</gml>

<?xml version="1.0"?>
<!DOCTYPE gml
[
<!ENTITY window "<window> &layer; </window>"> layer is not defined yet
<!ENTITY layer "<layer> </layer>">
]>
<gml>
  &window;
</gml>
gamgi-0.17.5/doc/formats/introduction/headers.html000066400000000000000000000055071433127522700221470ustar00rootroot00000000000000 GAMGI Formats: Introduction Headers
Introduction Headers
 
Headers are optional in XML, but when included, they must be written correctly. Although usefull to identify files, headers are a potencial source of spelling errors, so it is often better to not include them. Currently GAMGI includes full headers when exporting files. The complete GML header is written as:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE gml SYSTEM "http://www.gamgi.org/dtd/gamgi.dtd">
The first line is the XML declaration, the second line is the Document Type declaration. Even when the XML declaration is present, the Document Type declaration is still optional, but when the Document Type declaration is present, then the XML declaration is required.

Absolutely nothing can appear in the file before the XML declaration, in the same line or above, not even white space. The encoding and standalone parameters in the XML declaration are optional, but when included, they must be written in the order above. Everything is case-sensitive, except the encoding value, which could have been written as "utf-8", for example. No white spaces can appear before xml.

The SYSTEM identifier "http://www.gamgi.org/dtd/gamgi.dtd" in the Document Type declaration is optional, but when included, it must be written as above. The DOCTYPE identifier gml, identifying the XML root element, must be present. No white spaces can appear before DOCTYPE.

Good:


<?xml version="1.0"?> the encoding and standalone attributes are optional
<!DOCTYPE gml> the SYSTEM identifier is optional

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
the Document Type declaration is optional

Bad:


<?xml?> the version attribute is absent

<?xml encoding="UTF-8" version="1.0" standalone="yes"?> 
the attribute order is wrong

<? xml version="1.0"?> white space before xml

<! DOCTYPE gml SYSTEM "http://www.gamgi.org/dtd/gamgi.dtd"> 
white space before DOCTYPE

<!DOCTYPE gml SYSTEM "http://www.gamgi.org/dtd/gamgi.dtd"> 
the XML declaration is missing
gamgi-0.17.5/doc/formats/introduction/identifiers.html000066400000000000000000000115561433127522700230420ustar00rootroot00000000000000 GAMGI Formats: Introduction Identifiers
Introduction Identifiers
 
In GML, every non-root element can have a name, an identifier and at least a parent.

name

Name attributes in GML files correspond to the object names used in GAMGI, which exist only to help users identify the objects. All objects in GAMGI have an alphanumeric name, given by users, to help object identification and selection. This name is shown everywhere an object needs to be identified, including dialogs, statubars and object trees. This name is not used by GAMGI itself for identification purposes or others (although GAMGI cross checks object names and numbers to ensure that they are consistent).
Example: <atom ... name="Si"/> (default Si name)
Allowed values: 20 alphanumeric characters maximum
(defined in GAMGI_ENGINE_TOKEN) (optional)

id

An id is used to uniquely identify an object when importing a file and is discarded as soon as the operation is completed. Apart from this condition of uniqueness, id is an alphanumeric attribute, exactly as name. There is no default for this parameter. Bonded atoms must have an id, so bonds can point to them.

Identifier attributes must be unique for each import or export operation, as they are used by GAMGI to relate elements that may not even be in the same file. Although GAMGI uses numbers as identifier attributes when exporting files, these are not related in any way with the object numbers used internally in GAMGI to identify the objects. Identifier attributes are required only when the respective elements must be referenced somewhere else, most notably in bonded atoms that must be referenced by the bonds.

Example: <atom ... id="si1"/> (no default)
Allowed values: 20 alphanumeric characters maximum
(defined in GAMGI_ENGINE_TOKEN)
(optional, required if bonded)

parent

Usually the parent of a given object is identified by file context, as the object that immediately encloses it in the XML hierarchy. However the parent object can be explicitely indicated using the parent parameter, which points to the id parameter of the parent object.

Example: <atom ... parent="layer1"/> (no default)
Allowed values: 20 alphanumeric characters maximum
(defined in GAMGI_ENGINE_TOKEN) (optional)
Objects can reference parents that are only defined later, perhaps in another file, or perhaps in another file included by another file, without any limit to the level of depth of nested files. For example, a bond in a file can reference atoms that are defined in a HTTP file, fetched from somewhere in the planet. Configuration data elements have fixed parents, so identifiers don't apply to them.

We note that an object can only reference other objects that are inside the block defined by its own parent. This important restriction was introduced to disable all kinds of weird referencing possibilities that are left open with global identifiers, where everything can point to everything, potentially destroying the strict hierarchy that XML files should have, and making it difficult for GAMGI and users alike to check and understand the objects true hierarchy.

Moreover, this mechanism can never be used to validate an object that has an impossible object enclosing it by pointing it to a correct parent. The XML hierarchical position of an object in a file must always be possible, independently of its parameters.

This automatically prevents, for example, atoms belonging to different layers from being bonded together, as bonds in one layer cannot see atoms that are in the other layer. To see both atoms, bonds would have to belong to the common window, which is forbiden, because windows cannot own bonds, only layers.

Good:


<gml>
  <bond parent1="1" parent2="2"/> bond can reference parents that are defined later
  <group>
    <atom id="1"/> atom is inside the bond scope (the current layer block)
  </group>
  <atom id="2"/>
</gml>

Bad:


<gml>
  <atom id="1"/>
  <atom id="2"/>
  <group>
  <bond parent1="1" parent2="2"/> atoms are outside the bond scope (the group block)
  </group>
</gml>
gamgi-0.17.5/doc/formats/introduction/introduction.html000066400000000000000000000031771433127522700232560ustar00rootroot00000000000000 GAMGI Formats: Introduction Introduction
Introduction
 
Using the XML native format defined in GAMGI (GML), a water molecule can be written as:

<gml>
  <molecule>
    <atom element="O" x= "0.000"  y="-0.0679" z="0.0000" id="O1"/>
    <atom element="H" x= "0.7754" y= "0.5392" z="0.0000" id="H1"/>
    <atom element="H" x="-0.7754" y= "0.5392" z="0.0000" id="H2"/>

    <bond parent1="O1" parent2="H1"/>
    <bond parent1="O1" parent2="H2"/>
  </molecule>
</gml>
The file $GAMGI/dat/gamgi/all.xml is a fully working example, containing all the parameters that GAMGI accepts, for both object and configuration data. Using the xyz standard format, the same water molecule can be written as (in this case the bonds must be added afterwards):

3
This is a comment line
  O          0.0000         -0.0679          0.0000
  H          0.7754          0.5392          0.0000
  H         -0.7754          0.5392          0.0000
In both formats, white lines and spaces are discarded.
gamgi-0.17.5/doc/formats/introduction/jpeg.html000066400000000000000000000023761433127522700214620ustar00rootroot00000000000000 GAMGI Formats: JPEG
Formats
JPEG
GAMGI uses the file extension to automatically determine the file format. To export a standard .jpeg file of the whole graphic area of a GAMGI window, just give the filename the extension .jpeg or .jpg.

The command line application pnmtojpeg, widely available and usually installed by default in most Linux distributions, must be installed, otherwise GAMGI will be unable to export a jpeg file.

This a loss infomation format, not particularly recommended, particularly when rendering wired objects such as cells and text. Currently the quality parameter is set to 75% (the pnmtojpeg default).

gamgi-0.17.5/doc/formats/introduction/language.html000066400000000000000000000035301433127522700223110ustar00rootroot00000000000000 GAMGI Formats: Introduction Language
Introduction Language
 
The native format to import and export both object and configuration data in GAMGI is XML. The actual rules, including valid parameter names, ranges of values and hierarchies, forms the so called GAMGI Markup Language, GML.

GML supports elements (the GAMGI objects), written as <element></element>, organised in hierarchical order, so elements can contain other elements, and attributes (their properties), written as atribute="value". Empty elements, that contain no other elements, can be written as <element/>.

Attributes can appear only once for each element, but elements can appear as many times as needed, except the root element, that contains all the other elements and has no attributes. Usually the root element takes the name of the language, so in GAMGI it is called <gml>.

Good:


<gml>
</gml> this is a perfectly fine GML file, though not very usefull

<gml/> this is the simplest file that GAMGI accepts

Bad:


<gamgi>
</gamgi> the root element must be called gml

<gml>
  <gml/> the root element must appear only once
</gml>
gamgi-0.17.5/doc/formats/introduction/png.html000066400000000000000000000024071433127522700213140ustar00rootroot00000000000000 GAMGI Formats: PNG
Formats
PNG
GAMGI uses the file extension to automatically determine the file format. To export a standard .png file of the whole graphic area of a GAMGI window, just give the filename the extension .png.

The command line application pnmtopng, widely available and usually installed by default in most Linux distributions, must be installed, otherwise GAMGI will be unable to export a .png file.

This is a modern, excellent format and is highly recommended, due to its low-size and lossless compression, together with color and transparency capabilities. Currently the compression level is set to 6 (the pnmtopng default).

gamgi-0.17.5/doc/formats/introduction/ppm.html000066400000000000000000000030411433127522700213170ustar00rootroot00000000000000 GAMGI Formats: PPM
Formats
PPM
GAMGI uses the file extension to automatically determine the file format. To export a standard .ppm file of the whole graphic area of a GAMGI window, just give the filename the extension .ppm. These files start with an header:


P3
#Made with GAMGI 0.12.8
750 402
255
where the first line indicates the type of file, the second line is a comment, the third line is the number of columns (750) and lines (402) and the fourth line is the maximum color value (255).

After the header, the number of lines and columns in the file is the same as in the graphic area (from top to bottom), each position describing a pixel as a triplet of rgb colors, ranging from 0 to 255 (the maximum allowed value).

This format produces notoriously large files, although very simple, without loss of information and well supported by most graphics applications, such as the GIMP and XV.

gamgi-0.17.5/doc/formats/introduction/ps.html000066400000000000000000000022471433127522700211540ustar00rootroot00000000000000 GAMGI Formats: XYZ
Formats
XYZ
GAMGI uses the file extension to automatically determine the file format. To export a postscript file, just give the filename the extension .ps.

This is a rasterized color encapsulated postscript file, basically a dump of the rgb pixel information of the whole graphic area, to a big text file, that can subsequently be handled by graphic manipulation programs such as the GIMP or XV.

When using the GIMP, set the resolution to 72 dpi when loading the file, otherwise the image is rescaled, with significant loss of quality.

gamgi-0.17.5/doc/formats/introduction/tiff.html000066400000000000000000000023151433127522700214560ustar00rootroot00000000000000 GAMGI Formats: TIFF
Formats
TIFF
GAMGI uses the file extension to automatically determine the file format. To export a standard .tiff file of the whole graphic area of a top window, just give the filename the extension .tiff or .tif.

The command line application pnmtotiff, widely available and usually installed by default in most Linux distributions, must be installed, otherwise GAMGI will be unable to export a .tiff file.

This a large-size, high-quality, widespread format, which is particularly suitable to distribute among systems that might not support .png files very well.

gamgi-0.17.5/doc/formats/introduction/xyz.html000066400000000000000000000027711433127522700213660ustar00rootroot00000000000000 GAMGI Formats: XYZ
Formats
XYZ
GAMGI uses the file extension to automatically determine the file format. To import or export a standard xyz file, just give the filename the extension .xyz.

The first non-empty line must be the number of atoms in the file. After reading the entire file, GAMGI confirms that this number is indeed correct, otherwise an error is shown and the file is not imported.

The second non-empty line is a comment containing any characters.

The next non-empty lines must contain each one a valid element (as Si but not SI or si) followed by valid x y z coordinates, all surrounded by an arbitrary number of spaces.

Currently each line cannot contain more than 199 characters. Empty lines anywhere are ignored.

If errors are not found, GAMGI links the entire list of atoms to a new molecule in the current layer, named Molecule.

gamgi-0.17.5/doc/formats/layer/000077500000000000000000000000001433127522700162325ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/layer/config_history.html000066400000000000000000000033471433127522700221550ustar00rootroot00000000000000 GAMGI Formats: Layer Config

Layer Config

undo, save

Set the maximum number of past configurations that can be saved in memory, using the undo and save mechanisms. Everytime this number is exceeded, the oldest configuration is discarded forever.

Although the number of undo and save levels does not affect performance, the memory required to handle multiple windows, with multiple layers, each layer with undo and save past configurations in memory, can be significant. Therefore, undo and save parameters should be kept to relatively low values, particularly undo, where new configurations are generated automatically, without any user intervention. save works exactly as undo, except that configurations are saved manually by users.

Example: <layer undo="5" save="5"/> (default)
(defined in GAMGI_ENGINE_UNDO and  GAMGI_ENGINE_SAVE)
Allowed values: non-negative integer (optional)
gamgi-0.17.5/doc/formats/layer/config_position.html000066400000000000000000000041061433127522700223120ustar00rootroot00000000000000 GAMGI Formats: Layer Config

Layer Config

eye_x, eye_y, eye_z

Set the observer position in the layer space, that is applied by default, when creating a new layer. The distance from eye to center must be in the near-far range.
Example: <layer eye_x="0.0" eye_y="0.0" eye_z="10.0"/> (default)
(defined in GAMGI_MESA_LAYER_EYE_X, GAMGI_MESA_LAYER_EYE_Y 
and GAMGI_MESA_LAYER_EYE_Z)
Allowed values: real (optional, coupled)

center_x, center_y, center_z

Set the position to where the observer is looking, that is applied by default, when creating a new layer. The distance from eye to center must be in the near-far range.
Example: <layer center_x="0.0" center_y="0.0" center_z="0.0"/> (default)
(defined in GAMGI_MESA_LAYER_CENTER_X, GAMGI_MESA_LAYER_CENTER_Y 
and GAMGI_MESA_LAYER_CENTER_Z)
Allowed values: real (optional, coupled)

up_x, up_y, up_z

Set the up direction, relative to the observer, that is applied by default, when creating a new layer.
Example: <layer up_x="0.0" up_y="1.0" up_z="0.0"/> (default)
(defined in GAMGI_MESA_LAYER_UP_X, GAMGI_MESA_LAYER_UP_Y
and GAMGI_MESA_LAYER_UP_Z)
Allowed values: non-zero real (optional, coupled)
gamgi-0.17.5/doc/formats/layer/config_projection.html000066400000000000000000000031541433127522700226240ustar00rootroot00000000000000 GAMGI Formats: Layer Config

Layer Config

perspective

Controls which projection is applied by default when creating a new layer. When perspective is set to no, an orthographic projection is applied.
Example: <layer perspective="yes"/> (default)
(defined in GAMGI_MESA_LAYER_PERSPECTIVE)
Allowed values: yes, no (optional)

near, far, top

Set the projection volume dimensions that are applied by default, when creating a new layer. near and near mark the minimum and maximum distance from the observer for objects to be visible. near must be smaller than far.
Example: <layer near="1.0" far="1000.0" top="0.5"/> (default)
(defined in GAMGI_MESA_LAYER_NEAR, GAMGI_MESA_LAYER_FAR 
and GAMGI_MESA_LAYER_TOP)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/layer/create_position.html000066400000000000000000000047341433127522700223170ustar00rootroot00000000000000 GAMGI Formats: Layer Create

Layer Create

eye_x, eye_y, eye_z

Define the observer position in the layer space. The distance from eye to center must be in the near-far range. When not indicated, GAMGI uses default values. To change the default, select Layer->Config and read Help->Topics->Formats->Config->Layer.
Example: <layer ... eye_x="0.0" eye_y="0.0" eye_z="10.0"/> (default)
(defined in GAMGI_MESA_LAYER_EYE_X, GAMGI_MESA_LAYER_EYE_Y 
and GAMGI_MESA_LAYER_EYE_Z)
Allowed values: real (optional, coupled)

center_x, center_y, center_z

Define the position to where the observer is looking in the layer space. The distance from eye to center must be in the near-far range. When not indicated, GAMGI uses default values. To change the default, select Layer->Config and read Help->Topics->Formats->Config->Layer.
Example: <layer ... center_x="0.0" center_y="0.0" center_z="0.0"/> (default)
(defined in GAMGI_MESA_LAYER_CENTER_X, GAMGI_MESA_LAYER_CENTER_Y 
and GAMGI_MESA_LAYER_CENTER_Z)
Allowed values: real (optional, coupled)

up_x, up_y, up_z

Define the up direction, relative to the observer, in the layer space. When not indicated, GAMGI uses default values. To change the default, select Layer->Config and read Help->Topics->Formats->Config->Layer.
Example: <layer ... up_x="0.0" up_y="1.0" up_z="0.0"/> (default)
(defined in GAMGI_MESA_LAYER_UP_X, GAMGI_MESA_LAYER_UP_Y
and GAMGI_MESA_LAYER_UP_Z)
Allowed values: non-zero real (optional, coupled)
gamgi-0.17.5/doc/formats/layer/create_projection.html000066400000000000000000000045561433127522700226310ustar00rootroot00000000000000 GAMGI Formats: Layer Create

Layer Create

perspective

Defines the type of projection (perspective or orthographic) used to project the layer 3D space into the screen 2D viewport. When not indicated, GAMGI uses the default. To change the default, select Layer->Config and read Help->Topics->Formats->Config->Layer.
Example: <layer ... perspective="yes"/> (default)
(defined in GAMGI_MESA_LAYER_PERSPECTIVE)
Allowed values: yes, no (optional)

top, near, far

Define the layer 3D viewing volume, before it is projected onto the 2D viewport. The top parameter measures the height from the eye-center viewing direction (at the center of the viewport) to the top and bottom limits of the 2D viewport, thus defining the lateral borders of the 3D volume (the width is automatically determined from the window dimensions, in order to preserve the ratio width/height, otherwise the objects would be distorted).

The near and far parameters define the minimum and maximum distances along the viewing direction at which objects must lie in order to be visible. near must be smaller than far.

When not indicated, GAMGI uses default values. To change the default, select Layer->Config and read Help->Topics->Formats->Config->Layer.

Example: <layer ... near="1.0" far="1000.0" top="0.5"/> (default)
(defined in GAMGI_MESA_LAYER_NEAR, GAMGI_MESA_LAYER_FAR 
and GAMGI_MESA_LAYER_TOP)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/layer/create_view.html000066400000000000000000000037331433127522700214230ustar00rootroot00000000000000 GAMGI Formats: Layer Create

Layer Create

red, green, blue

Set the background color of the layer. When several layers exist simultaneously in a window, the background color of the graphic region is always the color of the current layer.
Example: <layer ... red="0.0" green="0.0" blue="0.0"/> (default)
(defined in GAMGI_MESA_LAYER_R, GAMGI_MESA_LAYER_G
and GAMGI_MESA_LAYER_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

axes

Controls whether the absolute layer axes are shown. Positioned at (0,0,0), with vectors (1,0,0), (0,1,0), (0,0,1), the three axes use the rgb color scheme: red for the first axis, green for the second and blue for the third.
Example: <layer ... axes="no"/> (default)
Allowed values: yes, no (optional)

scale

Change the size of all objects directly belonging to the layer. Lights and the layer itself are not affected, as they have no visual representation. Objects are scaled around the layer center.
Example: <layer ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/layer/create_visibility.html000066400000000000000000000035301433127522700226330ustar00rootroot00000000000000 GAMGI Formats: Layer Create

Layer Create

visibility_in, visibility_out

visibility_out controls whether the layer, when current, attempts to see the other layers: all - try to see the other layers; partial - try to see the other layers in a blurred way, to distinguish them from the current layer; none - ignore the other layers.

visibility_in controls whether the layer autorizes other layers, when current, to look inside: all - the layer can be seen; partial: the layer can be seen in a blurred way, to distinguish it from the current layer; none - the layer cannot be seen from the outside.

visibility_in (a privacy condition) has always priority over visibility_out (a curiosity condition). By default layers are completely transparent, to the inside and to the outside.

Example: <layer ... visibility_in="all" visibility_out="all"/> (default)
(defined in GAMGI_MESA_TRANSPARENT)
Allowed values: all, partial, none (optional)
gamgi-0.17.5/doc/formats/light/000077500000000000000000000000001433127522700162255ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/light/config_color.html000066400000000000000000000042461433127522700215640ustar00rootroot00000000000000 GAMGI Formats: Light Config

Light Config

ambient_r, ambient_g, ambient_b

Define the red, green, blue contributions used by default for ambient light. These contributions can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).
Example: <light ... ambient_r="0.5" ambient_g="0.5" ambient_b="0.5"/> (default)
(defined in GAMGI_MESA_LIGHT_AMBIENT_R, GAMGI_MESA_LIGHT_AMBIENT_G 
and GAMGI_MESA_LIGHT_AMBIENT_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

diffuse_r, diffuse_g, diffuse_b

Define the red, green, blue contributions used by default for diffuse light. These contributions can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).
Example: <light ... diffuse_r="0.4" diffuse_g="0.4" diffuse_b="0.4"/> (default)
(defined in GAMGI_MESA_LIGHT_DIFFUSE_R, GAMGI_MESA_LIGHT_DIFFUSE_G 
and GAMGI_MESA_LIGHT_DIFFUSE_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

specular_r, specular_g, specular_b

Define the red, green, blue contributions used by default for specular light. These contributions can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).
Example: <light ... specular_r="0.3" specular_g="0.3" specular_b="0.3"/> (default)
(defined in GAMGI_MESA_LIGHT_SPECULAR_R, GAMGI_MESA_LIGHT_SPECULAR_G 
and GAMGI_MESA_LIGHT_SPECULAR_B)
Allowed values: 0.0 - 1.0 (optional, coupled)
gamgi-0.17.5/doc/formats/light/config_global.html000066400000000000000000000023721433127522700217040ustar00rootroot00000000000000 GAMGI Formats: Light Config

Light Config

shininess

Controls globally how solid objects shine with reflected (specular) light. Increasing values result in higher levels of object reflectance. Decreasing values help emphasizing the objects bright spots. When shininess is set to 0.0 no bright spots are visible. When specular light is set to (0.0, 0.0, 0.0), shininess has no effect.
Example: <light ... shininess="0.1"/> (default)
(defined in GAMGI_MESA_LIGHT_SHININESS)
Allowed values: 0.0 - 1.0 (optional)
gamgi-0.17.5/doc/formats/light/create_attenuation.html000066400000000000000000000034671433127522700230030ustar00rootroot00000000000000 GAMGI Formats: Light Create

Light Create

constant, linear, quadratic

Control the axial attenuation, defined only for positional and spot lights. The axial attenuation factor is defined as:
Axial Attenuation Factor = 1/(constant + linear*distance + quadratic*distance*distance)

Example: <light ... constant="1.0" linear="0.0" quadratic="0.0" radial="0.0"/> (default)
(defined in GAMGI_MESA_LIGHT_CONSTANT, GAMGI_MESA_LIGHT_LINEAR,
GAMGI_MESA_LIGHT_QUADRATIC and GAMGI_MESA_LIGHT_RADIAL)
Allowed values: positive real (optional)

radial

Controls the radial attenuation, defined only for spot lights. The radial attenuation factor is defined as:
Radial Attenuation Factor = [max (0, vertex . direction)]**radial

Example: <light ... constant="1.0" linear="0.0" quadratic="0.0" radial="0.0"/> (default)
(defined in GAMGI_MESA_LIGHT_CONSTANT, GAMGI_MESA_LIGHT_LINEAR,
GAMGI_MESA_LIGHT_QUADRATIC and GAMGI_MESA_LIGHT_RADIAL)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/light/create_color.html000066400000000000000000000055131433127522700215600ustar00rootroot00000000000000 GAMGI Formats: Light Create

Light Create

ambient_r, ambient_g, ambient_b

Set red, green, blue contributions for the ambient light, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0). When ambient parameters are not entered, the ambient component is set to (0.0, 0.0, 0.0). When ambient, diffuse and specular components are all missing, an error is shown. When no lights are present, ambient light is automatically set to (1.0, 1.0, 1.0).
Example: <light ... diffuse_r="0.5" diffuse_g="0.5" diffuse_b="0.5"/> (default) 
(defined in GAMGI_MESA_LIGHT_AMBIENT_R, GAMGI_MESA_LIGHT_AMBIENT_G 
and GAMGI_MESA_LIGHT_AMBIENT_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

diffuse_r, diffuse_g, diffuse_b

Set red, green, blue contributions for the diffuse light, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0). When diffuse parameters are not entered, the diffuse component is set to (0.0, 0.0, 0.0). When ambient, diffuse and specular components are all missing, an error is shown. When no lights are present, diffuse light is automatically set to (0.0, 0.0, 0.0).
Example: <light ... specular_r="0.4" specular_g="0.4" specular_b="0.4"/> (default)
(defined in GAMGI_MESA_LIGHT_DIFFUSE_R, GAMGI_MESA_LIGHT_DIFFUSE_G 
and GAMGI_MESA_LIGHT_DIFFUSE_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

specular_r, specular_g, specular_b

Set red, green, blue contributions for the specular light, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0). When specular parameters are not entered, the specular component is set to (0.0, 0.0, 0.0). When ambient, diffuse and specular components are all missing, an error is shown. When no lights are present, specular light is automatically set to (0.0, 0.0, 0.0).
Example: <light ... specular_r="0.3" specular_g="0.3" specular_b="0.3"/> (default) 
(defined in GAMGI_MESA_LIGHT_SPECULAR_R, GAMGI_MESA_LIGHT_SPECULAR_G 
and GAMGI_MESA_LIGHT_SPECULAR_B)
Allowed values: 0.0 - 1.0 (optional, coupled)
gamgi-0.17.5/doc/formats/light/create_type.html000066400000000000000000000043051433127522700214210ustar00rootroot00000000000000 GAMGI Formats: Light Create

Light Create

direction_x, direction_y, direction_z

Required for directional and spot lights, indicate the direction vector pointing from the light source to the light target. The length of the vector is unimportant, as it does not carry further information. If both direction and position parameters are missing when creating a light, an error is shown.
Example: <light ... direction_x="0.0" direction_y="0.0" direction_z="-1.0"/> (default)
(Defined in GAMGI_MESA_LIGHT_DIRECTION_X, GAMGI_MESA_LIGHT_DIRECTION_Y
and GAMGI_MESA_LIGHT_DIRECTION_Z)
Allowed values: real (required, coupled)

position_x, position_y, position_z

Required for positional and spot lights, indicate the position coordinates from where the light is emitting. If both direction and position parameters are missing when creating a light, an error is shown.
Example: <light ... position_x="0.0" position_y="0.0" position_z="10.0"/> (default)
(Defined in GAMGI_MESA_LIGHT_POSITION_X, GAMGI_MESA_LIGHT_POSITION_Y
and GAMGI_MESA_LIGHT_POSITION_Z)
Allowed values: real (required, coupled)

angle

Required for spot lights, indicates the angle from the spot direction to the outer surface of the conic beam.
Example: <light ... angle="90.0"/> (default)
(Defined in GAMGI_MESA_LIGHT_ANGLE)
Allowed values: 0.0 < real <= 90.0 (optional)
gamgi-0.17.5/doc/formats/molecule/000077500000000000000000000000001433127522700167235ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/molecule/create_view.html000066400000000000000000000021341433127522700221060ustar00rootroot00000000000000 GAMGI Formats: Molecule Create

Molecule Create

  • View

scale

Change the molecule size, including its child objects. Molecule objects are scaled around the layer center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
Example: <molecule ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/orbital/000077500000000000000000000000001433127522700165525ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/orbital/create_position.html000066400000000000000000000034351433127522700226340ustar00rootroot00000000000000 GAMGI Formats: Orbital Create

Orbital Create

x, y, z

Set the coordinates of the orbital center.
Example: <orbital ... x="0.0" y="0.0" z="0.0"/> (default)
(defined in GAMGI_CHEM_ORBITAL_X, GAMGI_CHEM_ORBITAL_Y and GAMGI_CHEM_ORBITAL_Z)
Allowed values: real (optional, coupled)

e1, e2, e3

Set the Euler angles controlling the orbital orientation. The first rotation (e1), around the initial y axis, must be between 0 and 180 degrees. The second rotation (e2), around the initial z axis, must be between 0 and 360 degrees. The third rotation (e3), around the final z axis, must be between 0 and 360.
Example: <orbital ... e1="0.0" e2="0.0" e3="0.0"/> (default)
(defined in GAMGI_CHEM_ORBITAL_E1, GAMGI_CHEM_ORBITAL_E2 and GAMGI_CHEM_ORBITAL_E3)
Allowed values: e1: 0.0 - 180.0, e2, e3: 0.0 - 360.0 (optional, coupled)
gamgi-0.17.5/doc/formats/orbital/create_scope.html000066400000000000000000000071321433127522700220770ustar00rootroot00000000000000 GAMGI Formats: Orbital Create

Orbital Create

style

There are two ways to describe orbitals in GAMGI: as a cloud of random points describing all the regions of space where the probability density is above a specified value, the Wired approach; 2) as the outer isosurface linking points with the specified probability density, the Solid approach. Please note that in s orbitals, there are several different isosurfaces with the same probability density, GAMGI shows only the most external one.
Example: <orbital style="wired"/> (default)
Allowed values: wired, solid (optional)

density

Defines the probability density (probability / volume) value used to accept points in Wired mode (when they are above this threeshold) or to build points in Solid mode (where they have exactly this threeshold).

The default value (1E-6)) was chosen to guarantee that all the inter-node regions are visible with default parameters. For example, the six inter-node regions of orbital 6s are all visible with the default parameters.

Example: <orbital ... density="1E-6"/> (default)
Allowed values: real between 0.0 and 1.0 (optional)

radius

Set the volume that is scanned when building an orbital. In wired mode, the sampling volume is the sphere with this radius. In solid mode, the sampling volume is the cube containing this sphere.

For each orbital, the default radius is obtained calculating first the distance for the last maximum of the radial probability density (the first Bohr radius, for orbital 1s), then adding an offset (to guarantee a proper sampling region, currently 2.0 Angstrom) and finally increasing the radius untill the probability density becomes lower in all directions than the default probability density.

Example: <orbital ... radius="3.8600"/> (default for 1s orbital)
Allowed values: positive real (optional)

sampling

In wired mode, random points are generated and tried untill the number of accepted points equals sampling. By default sampling is 50000 x n, where n is the main quantum number.

In solid mode, a sampling cubic grid is built for each octant, with sampling slices on each dimension.

Example: <orbital ... sampling="50000"/> (default for wired 1s orbital)
Allowed values: positive integer (optional)

seed

In wired mode, sampling points are randomly positioned using a sequence of (pseudo) random numbers, generated from a seed initiator. Using different seeds, different random sequences and final results will be produced. Using the same seed, the same results will be obtained.
Example: <orbital seed="1"/> (default)
Allowed values: integer (optional)
gamgi-0.17.5/doc/formats/orbital/create_type.html000066400000000000000000000025711433127522700217510ustar00rootroot00000000000000 GAMGI Formats: Orbital Create

Orbital Create

n, l, m

Set the n, l, m, quantum numbers of the hydrogen-based atomic orbital.
Example: <orbital ... n="1" l="0" m="0"/> (no default)
Allowed values: 1 <= n <= 6, 0 <= l <= n-1, -l <= m <= l (required)

charge

Set the nucleus charge for the atomic orbital (by default 1.0, the nucleus charge for Hydrogen).
Example: <orbital ... charge="1.0"/> (default)
(defined in GAMGI_CHEM_ORBITAL_CHARGE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/orbital/create_view.html000066400000000000000000000054441433127522700217440ustar00rootroot00000000000000 GAMGI Formats: Orbital Create

Orbital Create

base_r, base_g, base_b

Set here the r, g, b color components of the orbital, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0), when the wavefunction is positive. When phase is no these r, g, b components are used to color the whole orbital.
Example: <orbital ... base_r="1.0" base_g="0.5" base_b="0.0"/> (default)
(defined in GAMGI_MESA_ORBITAL_BASE_R, GAMGI_MESA_ORBITAL_BASE_G
and GAMGI_MESA_ORBITAL_BASE_B)
Allowed values: real (optional, coupled)

phase_r, phase_g, phase_b

Set here the r, g, b color components of the orbital, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0), when the wavefunction is negative. When phase is no the whole orbital is colored using only the base r, g, b components.
Example: <orbital ... base_r="0.5" base_g="0.5" base_b="1.0"/> (default)
(defined in GAMGI_MESA_ORBITAL_PHASE_R, GAMGI_MESA_ORBITAL_PHASE_G
and GAMGI_MESA_ORBITAL_PHASE_B)
Allowed values: real (optional, coupled)

frame_r, frame_g, frame_b

Set here the r, g, b color components of the orbital frame, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0). When frame is no the frame r, g, b components are ignored.
Example: <orbital ... base_r="1.0" base_g="1.0" base_b="1.0"/> (default)
(defined in GAMGI_MESA_ORBITAL_FRAME_R, GAMGI_MESA_ORBITAL_FRAME_G
and GAMGI_MESA_ORBITAL_FRAME_B)
Allowed values: real (optional, coupled)

scale

Change the orbital size, including its child objects. Orbital objects are scaled around the orbital center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
Example: <orbital ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/orbital/create_volume.html000066400000000000000000000060471433127522700223010ustar00rootroot00000000000000 GAMGI Formats: Orbital Create

Orbital Create

phase

When phase is yes (the default), the orbital is represented with two colors, to distinguish places where the wave function is positive and negative. When phase is no, the whole orbital is represented with just one color.
Example: <orbital ... phase="yes"/> (default)
Allowed values: yes, no (optional)

frame

When frame is yes (the default), a cubic frame is shown around the orbital, with a edge length equal to twice the sampling radius. When frame is no, no frame is shown.
Example: <orbital ... frame="yes"/> (default)
Allowed values: yes, no (optional)

octants

Each orbital is divided in 8 octants, that can be made visible or not, according to a sequence of 8 bits. The 8 octants are ordered from -x-y-z to +x+y+z, where x moves faster and z moves slower, so the first 4 bits (counting from the left) are for the 4 octants with -z coordinate (below) and among these the first 2 bits are for the 2 octants with -y coordinate (below). To set which octants should be shown or hidden, set the corresponding bits to 1 or 0. By default all octants are shown.
Example: <orbital ... octants="11111111"/> (default)
Allowed values: all 8 bit sequences (optional)

axes

When axes is set to radius, axes are shown with the radius length (when frame is disabled) or the diameter length (when frame is enabled). When axes is set to unit, axes are shown with a unit length. When axes is set to bohr, axes are shown with the length of Bohr first radius. When axes is set to none, no axes are shown (the default). The options bohr and unit are useful only for small orbitals, otherwise the axes are barely visible.

When frame is enabled (the default), axes are positioned along the frame edges, starting from the xyz lower corner. When frame is disabled, axes start from the orbital center.

Example: <orbital ... axes="none"/> (default)
Allowed values: radius, bohr, unit, none (optional)
gamgi-0.17.5/doc/formats/plane/000077500000000000000000000000001433127522700162155ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/plane/create_position.html000066400000000000000000000041541433127522700222760ustar00rootroot00000000000000 GAMGI Formats: Plane Create

Plane Create

x, y, z

Set the coordinates of the plane origin.
Example: <plane ... x="0.0" y="0.0" z="0.0"/> (default)
Allowed values: real (optional, coupled)

center_x, center_y, center_z

Set the current center position for a polygon plane. This is needed because the plane is defined relatively to its reference objects, a cell or atoms, so when x,y,z and e1,e2,e3 are 0 the plane is in its initial position. Therefore there is no relation between origin and center (unlike cell or text objects for example) and the latter must be specified.
Example: <plane ... center_x="0.0" center_y="0.0" center_z="0.0"/>
(no default) Allowed values: real (optional, coupled)

e1, e2, e3

Set the three Euler angles controlling the plane orientation. The first rotation (e1), around the initial y axis, must be between 0 and 180 degrees. The second rotation (e2), around the initial z axis, must be between 0 and 360 degrees. The third rotation (e3), around the final z axis, must be between 0 and 360.
Example: <plane ... e1="0.0" e2="0.0" e3="0.0"/> (default)
Allowed values: e1: 0.0 - 180.0, e2, e3: 0.0 - 360.0
(optional, coupled)
gamgi-0.17.5/doc/formats/plane/create_projection.html000066400000000000000000000031431433127522700226030ustar00rootroot00000000000000 GAMGI Formats: Plane Create

Plane Create

net

Set the projection net used to represent a crystallographic plane.

In the wulff projection, the point to project (above) and the point of the sphere farther from the user (below) define a segment that intersects the circle at a point, giving the final representation.

In the schmidt projection, the point to project (above) is rotated around the point of the sphere closer to the user (above), keeping the same XY direction, until both points have the same Z coordinate, and then divided by square root of 2, to be inside the circle with radius R at coordinate Z, giving the final representation.

Example: <plane ... net="wulff"/> (default)
Allowed values: wulff, schmidt (optional)
gamgi-0.17.5/doc/formats/plane/create_scope.html000066400000000000000000000070741433127522700215470ustar00rootroot00000000000000 GAMGI Formats: Plane Create

Plane Create

order

A crystallographic plane does not exist as a single plane, is always part of a family of infinite planes, passing through all the lattice nodes, with equal distances between them. Each plane of a family (h k l) intersects the lattice in n/h n/k n/l, where n = 0 means the plane passing through the origin and n = 1 is the usual representation of the plane closest to the origin. The order parameter indicates the value of n for a specific plane.

o1, o2, o3

A plane can also be defined indicating explicitly the coordinates of a node where the plane passes. For each plane family, there is a plane passing through the origin node and as nodes are equivalent, it follows that for any node, there is a plane of any family passing through there.

When the lattice is primitive or vectors are primitive, coordinates o1, o2, o3 are enough to identify any cell node. No default node exists as the default plane order (1) cannot be associated to a specific node for all lattices.

Example: <cell ... o1="1" o2="0" o3="0"/> (no default)
Allowed values: integer (optional, coupled)

o4

When the lattice is centered and vectors are conventional, the coordinates o1, o2, o3 indicate the node in the lower-left corner of the cell where the plane passes. a fourth coordinate o4 is needed to point the centered node where the plane passes. By default, o4 is 000, so no change is introduced. When the cell lattice is primitive P or the vectors defining the node are primitive, that is the only possible value for o4. For I, C, F, R centered lattices, o4 can also take the values:
I: 111
C: 110
F: 110, 101, 011
R: 211, 122

Example: <plane ... o4="000"/> (default)
Allowed values: 000, 111, 110 101, 011, 211, 122 (optional)

data

The geometric data defining a polygon plane must be entered in order to make the plane completely independent from its reference objects. This is accomplished with two data child elements, one containig real data (the xyz coordinates), the other containing integer data (the number of loops, 1, the number of vertices for the loop, n, the offset of the vertices for the loop, from 0 to n-1).
Example:
<data ... name="points" type="double" size="9">
-1.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 1.0000 0.0000
</data> Allowed values: real (required)

Example:
<data ... name="points_driver" type="int" size="5">
1 3 0 1 2 </data> Allowed values: integer (required)
gamgi-0.17.5/doc/formats/plane/create_type.html000066400000000000000000000051561433127522700214160ustar00rootroot00000000000000 GAMGI Formats: Plane Create

Plane Create

reference

When reference is cell, the plane is crystallographic so plane indices are required and its parent must be a cell. When reference is atoms, the plane is described by real and integer polygon data inside two <data></data> blocks, so the plane becomes independent of the atoms used to define it.
Example: <plane ... reference="cell"/> (default)
Allowed values: cell, atoms (optional)

h, k, l

Set the indices h, k, l defining a crystallographic plane. The three indices cannot be all zero. An error is shown when these indices are not indicated for a crystallographic plane or when they are indicated for an atomic plane.
Example: <plane ... h="1" k="0" l="0"/> (no default)
Allowed values: integer (required, coupled)

vectors

Set the type of cell vectors, conventional or primitive, used to determine the crystallographic plane with h, k, l indices. When the lattice is primitive there is no difference between conventional or primitive cell vectors. An error is shown when vectors is set for an atomic plane.
Example: <plane ... vectors="conventional"/> (default)
(defined in GAMGI_PHYS_PLANE_VECTORS)
Allowed values: conventional, primitive (optional)

model

An atomic plane is always represented as a polygon. A crystallographic plane can also be represented as a pole, a trace (for projected planes), or a vector (for reciprocal lattice planes).
Example: <plane ... model="polygon"/> (default)
Allowed values: polygon, pole, trace, vector (optional)
gamgi-0.17.5/doc/formats/plane/create_view.html000066400000000000000000000035411433127522700214030ustar00rootroot00000000000000 GAMGI Formats: Plane Create

Plane Create

red, green, blue

Set the plane color, between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).
Example: <plane ... red="1.0" green="1.0" blue="0.0"/> (default)
(defined in GAMGI_MESA_PLANE_R, GAMGI_MESA_PLANE_G
and GAMGI_MESA_PLANE_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

scale

Change the plane size, including its child objects. Plane objects are scaled around the plane center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

An error is shown when plane type is pole, trace (stereographic projection) or reciprocal (reciprocal lattice) or when autonomy is no (plane cannot scale independently of its parent).

Example: <plane ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/reference.html000066400000000000000000000064211433127522700177450ustar00rootroot00000000000000 GAMGI Formats: Reference

File Formats

gamgi-0.17.5/doc/formats/shape/000077500000000000000000000000001433127522700162165ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/shape/create_view.html000066400000000000000000000021151433127522700214000ustar00rootroot00000000000000 GAMGI Formats: Shape Create

Shape Create

  • View

scale

Change the shape size, including its child objects. Shape objects are scaled around the shape center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
Example: <shape ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/text/000077500000000000000000000000001433127522700161025ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/text/config_view.html000066400000000000000000000054151433127522700212740ustar00rootroot00000000000000 GAMGI Formats: Text Config

Text Config

  • View

style

Sets the style applied by default when creating a new text object. GAMGI supports both wired (stroked) and solid (extruded) 3D fonts. Stroked fonts are faster and more suited for analysis. Extruded fonts are made from TrueType faces and are designed for presentations.
Example: <text style="wired"/> (default)
(defined in  GAMGI_MESA_TEXT_DRAW)
Allowed values: wired, solid (optional)

wired

Controls which stroked font is applied by default when creating a new wired text object. Currently there are 14 stroked fonts available in GAMGI, including scripting and mathematical fonts. These fonts permit text objects to be rotated,moved,scaled on 3D space, exactly as a molecule, and are relatively light, allowing text changes to occur in real time.
Example: <text ... wired="roman"/> (default)
(defined in GAMGI_IO_TEXT_WIRED)
Allowed values: roman, roman_mono, sans, sans_bold,
serif, serif_bold, script, script_bold, gothic_english,
gothic_german, gothic_italian, sans_symbol, serif_symbol,
serif_symbol_bold (optional)

solid

Controls which extruded font is applied by default when creating a new solid text object. Currently there are 10 extruded fonts available in GAMGI, permitting text messages to be manipulated and illuminated, exactly as any other solid 3D object.
Example: <text ... solid="sans"/> (default)
(defined in GAMGI_IO_TEXT_SOLID)
Allowed values: sans, sans_bold, sans_italic, sans_bold_italic,
serif, serif_bold, mono, mono_bold, mono_italic,
mono_bold_italic (optional)

red, green, blue

Sets the color applied by default, when creating a new text object.
Example: <text red="0.0" green="1.0" blue="0.0"/> (default)
defined in GAMGI_MESA_TEXT_R, GAMGI_MESA_TEXT_G, GAMGI_MESA_TEXT_B)
Allowed values: 0.0 - 1.0 (optional, coupled)
gamgi-0.17.5/doc/formats/text/create_contents.html000066400000000000000000000031651433127522700221550ustar00rootroot00000000000000 GAMGI Formats: Text Create

Text Create

contents

Contains the text message to show. Currently GAMGI accepts only ASCII characters in the range 32-126:

\t \n ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ".

Newline and tab characters are automatically converted to spaces, according to standard XML attribute value handling. For the sake of consistency, this file format behaviour is also replicated in GAMGI graphic interfaces. Currently GAMGI does not recognize any kind of hypertext or markup sequences, so text objects can contain only one line messages.

Example: <text ... contents="Hello World"/> (no default)
Allowed values: 200 ASCII characters maximum 
(defined in GAMGI_ENGINE_LINE) (required)
gamgi-0.17.5/doc/formats/text/create_position.html000066400000000000000000000034011433127522700221550ustar00rootroot00000000000000 GAMGI Formats: Text Create

Text Create

x, y, z

Set the text position, given by the coordinates of the lower left corner of the first character rectangle, from left to right.
Example: <text ... x="0.0" y="0.0" z="0.0"/> (default)
(defined in GAMGI_MESA_TEXT_X, GAMGI_MESA_TEXT_Y and GAMGI_MESA_TEXT_Z)
Allowed values: real (optional, coupled)

e1, e2, e3

Set the three Euler angles controlling the text orientation. The first rotation (e1), around the initial y axis, must be between 0 and 180 degrees. The second rotation (e2), around the initial z axis, must be between 0 and 360 degrees. The third rotation (e3), around the final z axis, must be between 0 and 360.
Example: <text ... e1="0.0" e2="0.0" e3="0.0"/> (default)
(defined in GAMGI_MESA_TEXT_E1, GAMGI_MESA_TEXT_E2 and GAMGI_MESA_TEXT_E3)
Allowed values: e1: 0.0 - 180.0, e2, e3: 0.0 - 360.0 (optional, coupled)
gamgi-0.17.5/doc/formats/text/create_view.html000066400000000000000000000070021433127522700212640ustar00rootroot00000000000000 GAMGI Formats: Text Create

Text Create

style

Set the rendering style of the new text object. GAMGI supports both wired (stroked) and solid (extruded) 3D fonts. Stroked fonts are faster and more suited for analysis. Extruded fonts are made from TrueType faces and are designed for presentations, when combined with lights.
Example: <text style="wired"/> (default)
Allowed values: wired, solid (optional)

font

Set the font used to render the new text object. There are 14 stroked fonts currently available, including scripting and mathematical fonts. The first two were made for Sun, used by the X consortium and currently distributed with GLUT and freeglut packages. The 12 other fonts were digitized by Allen V. Hershey, used by several packages and currently distributed with GNU plotutils.
Example: <text ... font="roman"/> (wired default)
(defined in GAMGI_IO_TEXT_WIRED)
Allowed values: roman, roman_mono, sans, sans_bold,
serif, serif_bold, script, script_bold, gothic_english,
gothic_german, gothic_italian, sans_symbol, serif_symbol,
serif_symbol_bold (optional)
There are also 12 extruded fonts currently available, made from DejaVu TrueType fonts, derived from the Vera fonts made by BitStream for the Gnome project.
Example: <text ... font="sans"/> (solid default)
(defined in GAMGI_IO_TEXT_SOLID)
Allowed values: sans, sans_bold, sans_italic, sans_bold_italic,
serif, serif_bold, serif_italic, serif_bold_italic, mono,
mono_bold, mono_italic, mono_bold_italic (optional)
Text objects created with these fonts can be rotated,moved,scaled on space, exactly as a molecule. Wired text objects look better without lights, because they do not reflect light. Solid text objects should be combined with lights, to obtain a tridimensional look.

red, green, blue

Set the text color, between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).
Example: <text ... red="0.0" green="1.0" blue="0.0"/> (default)
(defined in GAMGI_MESA_TEXT_R, GAMGI_MESA_TEXT_G and GAMGI_MESA_TEXT_B)
Allowed values: 0.0 - 1.0 (optional, coupled)

scale

Change the text size, including its child objects. Text objects are scaled around the text center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
Example: <text ... scale="1.0"/> (default)
(defined in GAMGI_MESA_SCALE)
Allowed values: positive real (optional)
gamgi-0.17.5/doc/formats/window/000077500000000000000000000000001433127522700164255ustar00rootroot00000000000000gamgi-0.17.5/doc/formats/window/config_ruler.html000066400000000000000000000116271433127522700220000ustar00rootroot00000000000000 GAMGI Formats: Window Config

Window Config

  • Ruler

rotate_max

Defines the range of angle values [-rotate_max, +rotate_max] accepted by the ruler (in the tools menu) to rotate objects. Clicking on the ruler extreme left, the object is rotated by -rotate_max. Clicking on the ruler extreme right, the object is rotated by +rotate_max. rotate_max must be positive.
Example: <window rotate_max="30.0"/> (default)
(defined in GAMGI_GTK_ROTATE_MAX)
Allowed values: real > 0 (optional)

rotate_step

The rotation angle applied to the object when clicking on the ruler (in the tools menu) increases from the extreme left to the extreme right (from -rotate_max to +rotate_max) in a step by step way. The width of each step, starting from the center to the extremes, is controlled by rotate_step.

For example, when rotate_step is set to rotate_max, only two angles are recognized: -rotate_max on the left (negative) side and +rotate_max on the right (positive) side of the ruler. When rotate_step is 0, the angle changes continuously from one extreme to the other.

rotate_step cannot exceed rotate_max, otherwise the extreme values would never be reached (the central value is always 0).

Example: <window rotate_step="0.0"/> (default)
(defined in GAMGI_GTK_ROTATE_STEP)
Allowed values: [0, rotate_max] (optional)

move_max

Defines the range of length values [-move_max, +move_max] accepted by the ruler (in the tools menu) to move objects. Clicking on the ruler extreme left, the object is moved by -move_max. Clicking on the ruler extreme right, the object is moved by +move_max. move_max must be positive.
Example: <window move_max="10.0"/> (default)
(defined in GAMGI_GTK_MOVE_MAX)
Allowed values: real > 0 (optional)

move_step

The translation length applied to the object when clicking on the ruler (in the tools menu) increases from the extreme left to the extreme right (from -move_max to +move_max) in a step by step way. The width of each step, starting from the center to the extremes, is controlled by move_step.

For example, when move_step is set to move_max, only two lengths are recognized: -move_max on the left (negative) side and +move_max on the right (positive) side of the ruler. When move_step is 0, the length changes continuously from one extreme to the other.

move_step cannot exceed move_max, otherwise the extreme values would never be reached (the central value is always 0).

Example: <window move_step="0.0"/> (default)
(defined in GAMGI_GTK_MOVE_STEP)
Allowed values: [0, move_max] (optional)

scale_max

Defines the range of factor values [1 / scale_max, scale_max] accepted by the ruler (in the tools menu) to scale objects. Clicking on the ruler extreme left, the object is scaled by 1 / scale_max. Clicking on the ruler extreme right, the object is scaled by scale_max. scale_max must be larger than 1.
Example: <window rotate_max="2.0"/> (default)
(defined in GAMGI_GTK_SCALE_MAX)
Allowed values: real > 1 (optional)

scale_step

The scaling factor applied to the object when clicking on the ruler (in the tools menu) increases from the extreme left to the extreme right (from 1 / scale_max to scale_max) in a step by step way. The width of each step, starting from the center to the extremes, is controlled by scale_step.

For example, when scale_step is equal to scale_max - 1, only two lengths are recognized: 1 / scale_max on the left side and scale_max on the right side of the ruler. When scale_step is 0, the angle changes continuously from one extreme to the other.

scale_step cannot exceed scale_max - 1, otherwise the extreme values would never be reached (the central value is always 1).

Example: <window rotate_step="0.0"/> (default)
(defined in GAMGI_GTK_SCALE_STEP)
Allowed values: [0, scale_max - 1] (optional)
gamgi-0.17.5/doc/formats/window/create_position.html000066400000000000000000000033501433127522700225030ustar00rootroot00000000000000 GAMGI Formats: Window Create

Window Create

x, y

Set (in pixels) the window position (the top left corner). x, y can be negative (meaning that the window top left corner is outside the visible screen), but must be in the range [-screen, +screen], otherwise an error is shown.
Example: <window ... x="10" y="10"/> (default)
(defined in GAMGI_GTK_WINDOW_ORIGIN_X and GAMGI_GTK_WINDOW_ORIGIN_Y)
Allowed values: -screen_width < x < screen_width, 
-screen_height < y < screen_height (optional, coupled)

width, height

Set (in pixels) the window dimensions. width, height must be between the minimum window dimensions and two times the screen size, otherwise an error is shown.
Example: <window ... width="750" height="550"/> (default)
(defined in GAMGI_GTK_WINDOW_WIDTH and GAMGI_GTK_WINDOW_HEIGHT)
Allowed values: GAMGI_GTK_WINDOW_WIDTH_MIN < x < 2 * screen_width, 
GAMGI_GTK_WINDOW_HEIGHT_MIN < y < 2 * screen_height (optional, coupled)
gamgi-0.17.5/doc/formats/window/create_view.html000066400000000000000000000017631433127522700216170ustar00rootroot00000000000000 GAMGI Formats: Window Create

Window Create

top, medium, bottom

These flags permit to hide the top, medium and bottom menus in a window, thus increasing the graphic area.
Example: <window ... top="yes" medium="yes" bottom="yes"/> (default)
Allowed values: yes, no (optional)
gamgi-0.17.5/doc/icon/000077500000000000000000000000001433127522700143735ustar00rootroot00000000000000gamgi-0.17.5/doc/icon/README000066400000000000000000000010441433127522700152520ustar00rootroot00000000000000To launch GAMGI from panel: On GNOME: 1) Right click on panel and choose: Add to Panel, then choose on new dialog: Custom Application Launcher 2) Fill properties: Type: Application Name: GAMGI Command: gamgi Comment: Build, View and Analyse Atomic Structures 3) Press on icon and choose gamgi32.png On KDE: 1) Right click on panel and choose: Add Application to Panel, Add Non-KDE application 2) Fill properties: Button title: GAMGI Description: Build, View and Analyse Atomic Structures Executable: gamgi 3) Press on icon and choose gamgi32.png gamgi-0.17.5/doc/icon/gamgi16.png000066400000000000000000000016551433127522700163430ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<*IDAT8}“_HTyÇ¿¿;¿ffwûg©ÉMçÞA+e3tÙ»ìBa˦C‘éÐ.š2jD”»¾ìC¯Ë>M°ìÃbÎDEKm¬AC Vd…꤉J3w2Gû3ÍPŽÙÜ«wîÙQj“=pžçs8|ø2"ÂÿÕ_Œ)œóvÓ4]cA#“ñþ@Ô·4gK€Zwb³ÛÚ Ãpq êºîÝÿwìë×ß.s»?É)-eñºz5­ÍÌì^‚0"B­»FE±§µå¨Ý4M\ÃèØ(r“ÉWûóò³¿.¯`”H€,LÓà¥K]u™Ì!à`³ÙÚ[š[ícÌþ,4¡­íg¨j$Çw¶éßP¶z ª&d:+˜IäZzAÃ0\‡Äºot£±¡ NÙ “ Ȳ OS ŠØdÿ-~ÿ²ý±»$0üÀ9ªj„††‡ IææÁÀ éiH’Œ'# lΗ ”UáúÚ¦ašÞº®{;}g4§,CUUXšžÆ*n…ªF°©ôS¼^˜DXŒÉ­dé®?Ü^ë®Q>² ±u|žm¯ð4{àtȈD#8wÁâº46ËyˆMObæå<ªÅ_¨ÓשÅãñÊe s,ç×i*ª¬,ßa6ŒçcxKëP¼[îj /GÑ× â)”ïl@TUÉ{ÚÛeQDQìr•¢;J°¥d æÙgL ©’1 ½¸‚ S³¨”±êþ3d¹ö '[dÀµBaQa‹}àqrˆp8ŒWÃ4¹÷âÌŸ8ÕvyO÷¡ªw*r¿Â‹7aµÚ¡F#Ä9Z¶•l=×ÐpÄ:þ4‰T:-Ö‹æz7œN'2¦6¢ÀQˆžÐ òcS€,!½ý òû}Z*•:*p΃ѨJõ®í¸Û;‚äÔØŠ*CïæððNOæòܬæ=ííŠÇã•W.ÿÓ‡Cu•ã'޽{82ï †éÇÖŸ(4¢ÔìŠ'žÓ›™× ÐÉ=ßM]"Âû½lÁf[ ’ }YYYßx<ÍVÙ!³H4B~¿O[¾øŸb+Åù} ç‹É\iþ@›˜„Ê;5àIEND®B`‚gamgi-0.17.5/doc/icon/gamgi22.png000066400000000000000000000030471433127522700163350ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<¤IDAT8•Yl”×€¿™g<<3Æ¡¤¦X.f±+šÈ”xÈ%/-!’IP¤²2®ôõå·nýâ@¡ðÓ° P]]ÙÓÔÔ\ÿüñn¯e›ä´,o¾ùµ6¸^xáEÂá0©T2xzhˆŸ_½Ì‰ðZdÛFÄãɰi×®âÔíÛ]Àç`@Qå®Îh§×° @âÜè(k×–säðQ‚k‚hzžÒÒRŽ怜¡Ž¥?2T2†­ç±¾êjlÇ©Y}Ç2€n5¡P]×ÉiË\;K´c/†¡àv¹±l‹¼–%Ú¾w¾Ž©­9~Öü!NÀOîÖ-TYŽ=öxܱd2‰$ÁÈÌIô%‡P(‚a™8Žƒã8!Ð òH9÷Ó:­OFõ‘w\QUñÒÝŠüõ~U^gþ'vlfo´Hd-ÉTœ÷ÎŽð—Ù?ñÔ‰"üîù¬É¥ ïóêÁ¿‘^\`xdX›œœœ1Msç*ðOÔ»âñµá--»¶ºªB~®4Júö4¶~ŸPE vÅkšÓ4nnfZù?¿Cåé Ó•4ž¥Øàõßöi¯ÈûìSseÆùëÂÛ»žùº+ð˘¬oÜÞoýˆÅòop;h`oü„]›¢hY‹óc¿G‰eéÞpo>ÏÍ_þŠœ–¥½­Ý«(J—ô̳ßT=ÏøŒ¾u{gÇnÉ_â#§Y,Ü#s÷c´å4Þ’2îd$±¡eHZ”—ˆPÊ×iý¸ ÕW²®síòe¶_"XÑ£‡mÕårõ4íhª¿ò%UF|6Ÿ#9ñ uµ|ÿ;?X±ŽÁSCÒât'‹|(€ÈfÖÎü<¾ÆFòƒƒx\â‰8n·;&+ŠÒvz+Ã%Ìý#C~î2 _ª¥ûر/X÷½înÊ7Õñ¾žÇI&™ "—C ÉÍÍQ\]…ÏççôȰV(úeÓ4k"ámO>ÎÄÔ,ùø_ÙmÿÖµvD¹j›H~?BÓC!”ÚZf§¦F£¼öÚ«Úõ©©˲ze·ÛK¥S騆*Lî/¦ÿ§uñl–eMƒ-[X>³é”è_HÎMMO¿bšæÎ?¼3h«…B¡høÝ?ö¼÷w/·r¢ç ©T’@iÃÐ Û~ H"™À+‘¹40)Q£HRÌþ:Çé=þÖÛ_XôªeY½“mQßÞõ>½û)NŸáèác  CÇí~`ÝÀÀ€¦ËÊÉgWíÝÿ’‚ýö©Š¢¼¤ªês–eU»TÕÙºm›툪+ÖŒŒ×®^ûìÝSÃÏY–e6`&`¬J]aKB$Iò^ ðº\.ÿž§wwË‚m»‘y!OŽ}xñÒÇq²€öo™_Õç€åÏ•–$IâÁâz˜Àý°®ôÒÃ)­‡Ó™«ª˜Bà_£iÖP³ÍsÃIEND®B`‚gamgi-0.17.5/doc/icon/gamgi316.png000066400000000000000000001666031433127522700164330ustar00rootroot00000000000000‰PNG  IHDR<<] gAMA± üa pHYs  ÒÝ~ütIMEØ 2L˜HtEXtSoftwarePaint.NET v3.30@„GìîIDATx^í½˜eWqµíï³ørοIc“Q 28âlc“lŒ (g!@D¡,@9"¡œsÎDAäœsF€Éç¯Uµ×Þµëìsî¹===Ý3WϳŸžééxÕ÷íUµVÕþµ_[ü·xÀâX<‹G`ñ,Å#°xÀâX<‹G`ñ,Å#°±<oÿµ_ëN™qN–ÇÁÛž$çD9o“s‚œãå-gcy<ßÇâX<É#°&çt9gÈ9³qðúxðö8xßSÓÁÇò$“×#çˆ7’ŸšÅ·±xÖÈ#8lgÉŸÏ8ç ¼ïÃ8âcyø€~^ý~G-à·F~b_æâXc 0p€ιs¾_–~` |,}Qö|ÇÊø üÞ²àû©Z|¹‹G`=PrP`RÜyò:œó'¾=_”K_Kñ¡çð¶ß*ú)Z|)‹G`•?PVWppÈ¿Ïs<=ü¦€/öúZ=>˜¾ÔøÞºß*ÿI[|y‹G`>Õ@䜇ۅòo<ÉŸ[Ç¿ þìß¿¿!ð±Ç7Tæzw—ÐC™ µwdR{(u\Àoþd->õâXET t„ÔÜ.–÷‹g©ðk•ºìïÍ‚c-ÞÑõÐ;\¾ÎCå"ç€øVÑOÞâKY<+ø 4ô¥+@!Áv‰¼?-øñu„àê£â[è¡·ç (=š€ÔÞ›Ð[ÁŸ²Å§Z<«à€ªƒ‚ò¥ëä"Üæý{ÈÏEÙ‚^44|„å÷”ø •¡CÐ{³œýà[?‰‹/añ¬ÇG€Î+ €†Š òJ̓íRù·©§Dÿq£âkAÏ÷ô˜óCÙ¡çËqbÃTz,o ½Eoo=þ°->ôâØ@Tu-ÐEXM…œ»©ÀRz¾´Š­pBc(«çGÔ ò0¥A#ÃCïàdhì»P{òGsñ¹Àò=¾Wût^ÕÍRt— ÆN„ãXŸo¹U^IC/ÐóÎ- çK[ÄV ô½ƒä, ·|?s‹´x6È#àKØ)°‹Ðš¹Ö¿OßôÆTguÇ&2<."`F*e@ïÔÓCy»€Þù1]|ÒÅ#°î€ÏÕv0 öÕ¨Ä<¨Z »\Þ7ž! ŽAoV?ϱ—ךÁARyÈèÅÒî-b+€Þk%îºÿ.>ÂâX©GÀgëæÝTÐ|ëxè-zQåµÌ‹¨òÆÖMù^^,m©òPÚ½ÝGÎëÐ[©×ÅçY<KZ°2(ÆT]KÑ-‡Ê›GázPyC•©‹Z½<¯òPÚ¢—•‡Òv?9{/ ·ôÂÅ{.•x¦À.–°Q¥MÝÐÛù×ro‡€(SÝE…Gèùé‹VDeȼðad:¶CK[@ï‹òv%~lŸcñÌÿø¡ÿYA´Ü°çÞ”rÞP&o xqÖ–Àó½¼Vi»—|O¯^”·óÿ@.Þcñ¬¯G€°óÓ³ÊX¦¨Ö®'x<³”ß,Ç–Ê2*¼)À[#å·&O#*,k1AÇ–¥- –¶¯—?¿j½õõã»ø¸‹G`ú#À Ä€ÀàÕwd‡JÙ)°ü¦”°CêŠr)À›¸˜·¤e-€Çˆ gm<Œž¡—G*&Æ+Лþƒ¹xËÅ#°Ü 7GØ1‚2?œZk©;¾nè ES¦(¼¡EónP9Q¾GN]0“'/¼QðàØz•÷ùûkäì±€Þrÿ/>Þâ˜ý ‚rJg¨”“­ÞÝTè•´³ÊÙyÞTàáû_jIëCÈž"{Ç1ª<ôóv[@oöèâ-Àr=P.èÛAÝÅ­'¾wGà9³C +c—@Ž%mkÒbÖÖ”¨ð»¡ð1„ú¹ZÞƒágk©ð| ÀCY‹02b*Py%/JÛåúI^|œÅ#0á@)ë#(èuùÍ'SÊYª²YfDóßÿÕ¿ê.oœËäuþ\*çðf­Šš²ð7 µÚ1àá—ƒ1k¡ð<Î×x¾¬*ïå •7á'uñ&‹G`”²Þ•êݵL-i! wÅ¿þ×3Á—'ï{‰@o]–ÌZå§-ü-g1|ì—ƒNryplÑ˃ÊÛu½uüi^¼ûây VàÊRÝÅÞ]«œ`|I;ïø˜Â¯:ÀNϯÿº½Lçr@0Ëä%Î¥r;ž<|Í] xê ÝÛÞ~Ü„#ÿë±Ñ—êŽÎ¬/gãöâ!Ãàú40P€ Àñ\-`»ößþ[=×ðü»×]#ç*ùû•ÿæßtWÈÛ\.ï£Ð“èx¦HϺ×bl¤,öï¦Ïçð¼K …7<ºµ(kF†ÊÛyQÚ®NhÍóUT€ÚyÝñ9z.¸øÜî‚Kì\xÉyùèëðoéèÛ_„svwÞ…gwç Ï(ÀóÎÐsÖ¹§×ðK*ðí§¾MUà 'Û}Ü Êÿ48TwÌݵÜÙ)í˜Òë “s¥ƒ w€ì:Úõÿþßw7þÇÿØÝøŸþ“žä\/ç:yݵÿá?t×È¿_%oðz <9;è] ß—²\àÇÉZîlŒ£Œ•³-Ó¢<öKA‡€‡>ÜZ”µ¯XôòæÁÊêz[(7îB@íÒóº‹.=_ÏÅ—]PŸËåïé\t™¼M:xÂÑ(ðSÖðøÎ”]pfYÎr²bð†rxCЫöâ¥,V…€ê:¨ºÿüŸ»[ºÿù?lïûÿþ¿îƒ÷¸G÷á{ß»ûè}î£/o¿ç=»ÈëÞ÷»wï¾C€x£¼ÏµÊ«˜—ËǺD”ÞE=žUxxqáç”kãÍev³BÇœ¥¥Â‹9<˜Txž7.0n†ˆÊ à­>à¡§¦ skîò«/é&Ÿ«.É`Ìð»Âà—U_ŸB¥®–¹5øz07./ÕÞ±'ÕuìáÝaG¼e£²c,g9Yá ¯ìXð8ÎÓ¶ÊÛÜÛsÀìPÆ^+ Bîf”¯¢ê æ>t¯{uÈ}ü·~«ûäïüN÷™>°ûÌ þ˜¼îÃòoïè½K w‹òzyß«¥Ä½Bzz—ÊǼX>6€w¾ÀŽÀk-ûô°óêλ³vø%16a :¦a1x0.<¸µ;ÉY¨¼UÀ<¸£PT×%IÍQÅy°]qÍ¥?W^{Y—üÛ•á߯0âèÇð]Ux¥…_Ÿ–º©Ïge.Í s}½ÚSW—½½mô ö=¨½#Ž>´{ëáo4àCŸ‰fžØcÀ‹ûïüÝ>€ì3yT{•ês“ˆ•v× ¨n’ÒʪîC¢ä>ñÛ¿­ûüCÒ}ióÍ»/?âÝ—þðîsò÷OËë?qÿûw¾ï}»ÛDíÝ*лIÞ÷:ùW‰R¼,©¼ ås(ðäœ+Ÿ{l TÜnLØÍÊÞ Žã¦”hX´€‡ñ2fñ¨ð<ðàÖn·Py–x¦è¬l…âRÈɘ)V‚X7ºÖŸü@…àÕ8-ðè´¹¿ç çMQ襾ó|¾ÄEoOÕÞ‘oé~ËAk|(ÁXÎ2Ž‚'}Tx^åÁ¥¥S;½ø8Ñ0”³ÈÒ]ÈIRwïe÷Þ¤ì>q¿ûuŸ{ðƒ»¯ä¾öèGwߨb‹î[{\÷Ç?¾ûúcÓ}I^ÿÙ‡>´û¤€ïC¢ön“2÷Rß ã)‹/—y‰¨¼‹<)m=ðæ)e=ìÆÊYŒ“”ù žïßaE7¦ œÀc4NíîrvIeíV è­<ôz‚à óat„ÜU×]ÞM:¿«ÂÉÐKàÌŠ‘=@Uzò5À‰ÐK1—1èUÙ½_iA½½·öæõ =”ÜÈŽ¡ì¡ºÐ©/ #&þt †þËÙ!àAoôz«£ ð0%é äíö„£µœ…jŠi ?[}¼¨ô"øâUT|Py#3‡ÀðÕÒo»AÙ;¥½Í•²(c¿ú¨G©¢û‘@î'¿÷{ÝOÿົþðõÏß~U”Þçö°îcRÚ¾ÿ7³»UÔáòqxÑK¦6€ça7˨`Èx^uÇr6ÎÐFÂK@±ù˜ Ïçð†€·­¼ýKÐ[ÿÐ3UçÕút€ JWë³YéÙ]p-èáuàó}>–Èô|OO#/ÉÁÕœŸ9¸¥Ÿ×wo«)ddx÷–F†9¸zèë½YJÜ}Ø{2ø8ºŽakfù2g¿ñ•]ò‡Ó3ˆp¥ñ=~x€Bûx~ÌÌ—·\¥NØEèaÎã_Þež”œÈÏ!HÌrövéÝ}RFu÷ý'?¹»ó÷¿ûù3žÑÝõGÔÝ)Ðû±ï{òú¯?ö±Ý祧÷qQƒã]¿ñÝMâØ^+æ…ÞyIá-Ÿû,ùA2*ð `J);¤îhXv­‘2®†B9‹ ‡þb)èᡤE4%-úx/[oýÏ÷ê:¯êZ ¸"讹áÊnè´ X•ÀÁܨ GÐC ž…™-ØŒ>£Mj8ÎmšÎh”Ó|®¬ D4#Ð;Lzzo3ãîà·¾©;àMûB±˜^èZUh \» µð´²‡0fzLQNŸ”¶Mø "œé¾f Þ:A/ ÷+ô0›ÊY(¼›%O÷^(<×§¤/‡zv?|êS»ÿîïv?e‡óßäïß—²öëòï_·ûăÔ}PÊ`ïFÞ5 x'…w¦|S]Y*»Y¹;SYTw­Àqž¤ŒÑ8µÛËYôñÖïàb≊'˜©:˜bHd ì2ì’2#¸®µ–ÏèZŒðËà#ô¼›› º·x„GèY09EU<ðü,î@\…9=31àÞôPÞBéíP £¡kíuÚTI]§ÀµÏŽý¹—?Œákùøeχ¯ÛP _è€9{x ìrZ³©“Õ^Úb‚9WœË±3±Rz^Ÿ€÷n)Io—Ò”Àû¦í»O|b÷ ÷Qw?uwÇÓŸÞ}_^÷5QxŸ•>ßGQÒ (ß)À¼^zxWKI{©|Ü‹xÈç9WÞ9ò9Ñ¿SØÉ93äÊ¢Œm­€Š1”˜»ƒ²'‹4,â”úw-‹ Ïñ”—.TÞòRÊpÀ“•°S÷ÕÁN ¨¹¤è†@w­@OÏW•Ã×µ€JÞAè1¶¢_ gÀ³^ž©¼\&•× %sþ¶5×–*ÏgôèÜz‡JVïCß,=½u–×b:ÓB×>¶3Æn°—¾NsÆÃ×|³ Ë\-mÓöl2Áè×¥Øt"%-‚Â×x*äéÞ/nëÇÄ„€ñeéá}C ÷mݽ ì¾#ý»¯o¹e÷Eù÷OJ¯ïvqiß —V€y­(Å+åã]"÷BùøçËçQØ¥r–°‹«Û‡"(^ÙÍÊݵ²wCå¬)C9ËM)>’ÂYZlLA¦ÅxËË·ê£é“6)“¬ìR¿Ž®)`§ “ãA—áÖ‚œþì ‡?gÅ7<ù\½~žfô ð zx„Þ`Y‹IŒ´p –~X=Eàq *¯”¶G¨Â8Êcþ‚ð1?U2–IŒÅÃIÄbÐÔD»S|UÏ2õø²Áá¦Næ _K‡¡çKÜYjs­÷ÂØ×%Øn•à‰"»I€‡,2u·#l,ª Ðû’8±(]¿%Ðû–¸µß”óQv_xä#»OË¿DÞî}¢ ß)åì RÎ^rV2}‰z¼@€—Õ|^…œå‚]Œ¡°”õ·”ùuPŒ£ õïIi9´CÀƒS»PxË@}âúÈ ÊXæêœ1aªÎŽï†+j€E¸¥¿_7 ò?…Þ¼À(H6ã›¶eB¹áØúlž70 ò0ÅÁ²µÊ#¦Ø !7¸Ž9Ä ¢PÃ×ò½2|Íž¥›:ñ=>”¹ÕÄI_·"9ü^½šeøúÐ#™ |ÙÑuÀÃÄ¥Xë$e'‚˜’¸Y€õ.QiÈÔÝ.=9˜ŸpÃù|:Ÿ‘2ö’Ñû0`'p¼U¢,7 ,¯h^!êåì…òqÏ“ŽÀµRw x\ ЊŸÌš¨h•²€ÝPï®5?ëÝÙVÿ¡c:´³€·pk×z˜D ì ´gçawåäFa7:ÀΟž¤ÊK=@öó¼áÌ€HŒ¨dà1——Œ‹Ú­-æEoú"ìÔãrQ_Ö²——]œ.q¾Fÿ5æc 'Eqª¢ _+à³;–1¸¢ß*ÓÊ!ràX±ÉAÏRÊw1i¢âó½½fŸO€ƒq/̹bÞWˆÊ»kŸ$‹èÝ*½8…ž”ªÁ¦*psâ£òç••`2`÷ny»[’×IåjyÿËDÝ],ï|¨;êì¼ÛŠŸøñ±Ö‚€)FE„Ÿ® ;ËYöï<ðàÐ2‡GÓ Níxë<8‰5ìÄÍ;±žO•©:–¡½]€[„ÿÞ,kðð¹ŠiÀK‹R<¥ÊäUûôåÀV ú&GÓ/¥£É]z€€©:›Î&©¬žšG bO _÷T­‡üzË!Ò¨ysÞ@âËÜXê~Ø\‚è©Ê0]&åç¢Ê®Âž;@O¶ zï–ò½¹Û$ªSâ¢ú¹Û¤„}¼ÊîfÝõÉ«PÊÊûvDϘž-P=‹¥¬€ahÊìZ}»¡R–1‡`×Rw±œåj(†Ž<ÌÒ"–²Þ:ο+~Û«‹F{R+ ;5(\Æn vÁ”Ü,•7«7x9G㢔´u–/gxÌø¥'< ”-*e¯JpfÕjà¹i .­âÃÀ›'x=+‹86iÿmrøzB1ÆrЧµŸ R[ýKFr†rˆû´O^ÅÄ•L|‰5MzÒÚ&LBz #?‡ÐðÅ¢øÐ“C¦îÌÆ&Àáu(_/Dôn, Š ìN—}š|¸°­Œ@·.°›’¹‹¥ìPïŽÙ»¨îüH™ïßyà!–u·Pxà‡ßÜwò{ìL½˜ºÓõNìGµ&)XÒ6\Ù^ŸnÀ¹%{0ðe^*««EAáøyuð8)WÒúÈ­Uð­àuœ2 ^”ûcÊ6æ«hŽŸ1v*WKÛ‘¢År’­b9i ~ܘîÿð¡u~ºüˆÛcê"–)`_ ØtðÝ~@O@„Í%<ŸÂkœp°ÒI†]>˜šs>År´|E¿Î—°òq ì"ì8=1ÕSvóÀŽõ´¦*XÊúÞ]Twœ¡ÀÃòNZ,€7vx“Ü·Káb¨;]±”V¯gØI e¨œsg•Üø¡ç€Ç^Vδ…'{^ ãÖ%WÀ·—‚úðq3x_ü%ë¬@™EP¯Kð:CoĥΥ-·Ç4ËZ·.kâ´‰©@Ùf•fŠcT{9b÷V±óÐãþ¹ü+šÂQøa…ÆÀ0ì/kž9ôé"è´_GØÉ˱ØIk‚bh]{ìÙMÉÛÍ2*<ìü(¢(4+Zå,ûw-à-TÞøPÊzuç·ŸL^*iÇÊÚ¥@¯R||ÒÏ6!§»1ce-uÓwhëI‹ÏA™ïæ‡[°›3xÝêo®Ë´I{sŒÝRVeq‰Béã ¹ÔìãyàÍ3m‚»·ÈˆæŠ|óþºE†+™z/LºÁÄ0‚!VÒ:0$²)Ac"ŽÊ.^ší—Ì;8±ÞƒÝX …K>£Q1¤îZå, ôïèÐú’v¼àᇥšeÞSÇǨîRÅf½aÑš—meðfﺛ®îâÉïÈ¡iß §MË)kmKñS¶UÄgðl«H?‹˜68§^YÉ"º)“”ElÎ »é’¹rˆ§MÆWe•…¨%‡ØÚSîômíÓÃÏL,kã´‰©¼Cóö“1W|À›öëàÞbCÉèqð#‘£Ó,;gr(]]ùÚ*aÙ§‹Ob 8†Š}În¹`× û12”²-uówìß-€7±ŒÅ›Á•µ™Olñ(ÎlžMûí"ðšMùæE„žÜõ7_Ó ¼¾¯ŸîÊKý«ðò­f\µ”K9ÆQÂN¼|w ‡,bvc쬼o¯U톒}’c扫ïÙõ2[Ó&-à 7þf7¿&kxgÜxCãu¼÷ÃfŠßª‹ÏÃ*|ôó°Afï}÷Ê[J¸­¤ù2ͼ¢DGW¯æ`L$s¢µÇ.­é‰)ýº!e74+‹¼]te½º#ì`TøÜ‚Æ(eÑ»Š£°œõ‘”Eo€èÉ`šÀKwüíbÖ/}ªžaÑX@·vJi ˆ]# »ç–k»åÜôÎë»ßq]ïàm|tpÓ´ çŸä¶A$Ý]›váu×߇Ã¥LŒ˜Eä‚Ó²+m‡¡[½ž²ˆ½hŽ›4øb/ÓGsZÆMÜþ<¶WYÍØ¶Æë¼âØBå½E ¨¼7'•‡Òv¯}^_­fâ ÿàK7¨8ž¹±Ö‰™¯›;¡91vó¸²KQwèßùrv¼*% ¦ðäF¦LËYìhK×)Úž»zn6ϯ€š =§Z rtr1@€»Y@wË»nìÞùw¾çæîòǹùÖ „ò¶ >ùŒ©¨Êã mêßù;k‡.ê.Cô²ñXÕ튫²ˆéÖµª—©¡âbÞ FsÒ÷”]„ÝX …¹;.ûä²€hV´ÊÙððNu‡rÙ2¸³øí^/ Á»ýmÕÆÐkÝ]ÕãÕ`U€tïûà»núèû»~âöîãŸþH÷‰Ï|´ûا>¬ÿðÇ> ÿð½GÞ%/ ‡þ ø°W~Zü¢r$9Yµî6Ó/ÓÑÇ"ouî+]ÕdeܸQ±YŽô”Ÿ™CôNõX/«]ÞëÑÇÅ  °ó+²F'7º™[ë€—Ì ¯ò^¿×k»W¾zœ—‹¹9¿j½å¸z5Ð ¹¯4%æ)a‡–0zrˆ|¾VÏ.–±C°‹Fc(4*XʶÔ,€7Ò¿{»üVÖ«¥ ÀÃ\¥Ý±àî• +ygE*Ÿâ}±•Úsnb60Rï}8(;@ %ëm;Àìã·O ä>ýùOtŸûÒ§»/~õsÝç¿ü™î³_üT÷©Ï}\ÿývy»÷ ôð~PzPy€ «ÀKãd6JæòfyQ€”o¼ê0©;ŒÓ ·:íþ«'M\s¤œµÕX¶¡y,Ž2tñmzÛb³ÄCÁk®¸÷£uEÝ…¨ù@Ã¥uÁcïÒúYÜü\)¼¼Ãåž, Åý½ZÖ&ó{ï·W÷†½_'*oO½?¢5 1¹¸Ù¤¥ê¹親ºÖc>g7vþêE*»8/ ØÑ™e ¥lKÝq~¶UÎ.ž@ã?§H† å,úwx‚×À³`-/Ò.9¼TÎù8Æô|TÂ7ó©ð;˜èÇ¡/GØ}BÀÈ}ùë_è¾ö­/wßøÎWõ%þþ€ï ŸTè}ð#ïÓÒ÷VQ‡èéÁ¹Åç‚ò‚;IÃ"NUäEziO)g¡Z vÕ•ukì[ÑoVôf‰çŒä´àǘN«§Wm~æh™‹åd§z xÝ­C,§¿ñ}ÝÖh]/ó«îýˆÙTàUe­8¶¯{ÃkºW½æ:×ÁÖÜRJWö阭‹å«WuñòìV¨˜Ë<[ñ“Yc.÷ô°›ªî»ðÞI2ÿˆrÖúwRÎJÿ®Ïî—õ·hUw/äûfmžV÷1iÒ¸°»Õ¿C9Ë~UÔ8ðÔ© }<¸µ¯Ûë5Ý«_ûÊnWí®Y¹!ÀùXÉP.ª:®56º8=ûuv~ll̤ð›P†JYÆPÆÔ\üóWß›žxÊ #ÀÃÖi`»àqVyܘâæjg]-X¹˜ìk!’’€Hyà}á+Ÿí¾þ­¯tßu÷ã;ïè~ñ‹Ÿw îWÿò‹î—ÿò3ßOUå}ç{ßè¾"ÀûŒôò>ú‰‰³û…çM︾”´¾ö*ÿoòÀÍñIu[Õ]¹¤Ûîó@9{ª>N³úw~c '-˜ÃƒKË’¶(¼xˆ§¼qŸ7tpka^À±…Êc”$FJ†ÔÜPé бt·ŠµAûuXñÄv]`7Ô·*e©î`TÀ™*c OØ&²öïœaQõðRÀË*ÏݼÅ,³]z\‘T©=·7&Ê6x£ÿ†þÝ'?û±î‹¼oŠA~ÝwýXÝ]»_v¿üÔÝ]¢öîì~üÓtßýþ7»¯~ã‹b^Hï“’Âåx‡!–"ãeªð0Sû–¢ð¼qaÀ{u·g*kwÙm'ùò¹9öæÆŒߟRtaç{u­ÈÉìЯ›Ò³£IáûvÌܵŒŠ¡ÜÝ¢¤MD¹¡†Erh#ðð„gø8ª¼RÚbŸZÚ«–ÊÛ¬öÒu„ù‚éô¤´eI‹'+ÔÊû%h ¥ö9q^¡ÜУûþ¾#åë÷»;þ£îg¿Øýò'ÝDÝ}_[¨@ÄS4'°ÄǸù7HOëQ\—›º“'y¼oÖÀC/ÓOšÌ<ïNûbœ8ñákŸCd9«nu§ì:|O0cð˜àÁg¤W ¸ãÏøžÀ™CD´'ÆrTáõ.÷÷„_i†¸Rwia@«œõ÷ZÄþ]œ²°Ñ2 ·€wà›÷Ó‰ :µÈãaÔ }¼Wìùòn·—ïÒm·Ã6겎•«\Õ\+fÈEÐ åë¢Û ÏêÙqåÙ¨ì|À˜}»hTvSÔÝ&kZà·-~(‡€Õ“‡LVš©EiWJÛt©³SzÙÁeæ‹Ðsð£±A„'>ÊÚ <)I1A'ôçŸôAAåÎDõ}çßT÷Kâä~úsŸ÷ù`6, îðq³ºuƲMÕ ã Çà¯&M\IoÁkÉ"ºmÏå.^wIÏák߇BŸJW€…ªñ¿Ð×ü²8Ò_‘Ç6Œü#9è2‡ˆÇÔÇr<ðLíº1²œ»++ݹ4AKÙt[™º³éò)å,žïß©Â;º‚ÇEáí¯¦GÌèÔ*ð$žòÊ=÷èvÅ®ÝN»ì ¥ê¬rÕ÷è"èâ=±(]y¹Yªù:Ÿ±2'x O GØqNÖ/ð&E,eg…Œ[æÅÆçDLøŽðOrüVö ?Ø€Ó˜>H#f¼¡^—f/õÖ«Ô' |lEÜPòÆ;0 zÐs‚*A/ })Œ“zæÖ~Qã'óàu˜¸PwVTÎûo¯€BÔ] £iÁ~Uwò5ûþ”ÃúääT[ÿξÎë¼Î¥Ì!Θ8‰ákÎç²>¯éVWYD2‡øÞÿïHß°×ðµ@†  "=>‡èÇë¨t«9â˜EtÁë^ïn@Ý 9´±œÍ‘NY¤xؘ‚íÇ\uÐÁ<¸´jZ ‡…'N-òx0.ÐÇÛu÷ºmEåµzr­ w]#èZ¥+út­^Wu1P°ÉDa'€‚Ôwªñ÷DLеŒ‰¨êb Ûº€ÇßK·û9YÂŽ³²KéÛ-€ç€‡[ãñ}<-kðØËÓÿÒƒ{Ëœžº~î$õg&‡?©çG×3ª=é½!?wÍõX©$“7bå;îµû,äàϹÒRŒQÉÛrA@ v0_ГԞT‚ÀŽ'2”ôø»n‹ =<ïP{ó›4ø¼K _øÀ÷¡{Ó¦åHi W¥*JÖßùÃý¤ûÅ/Eáý‹À.¯‘EüDvÍAnζ*<1oTáÉcÇdž“&ˆçøR–ÿóc$e½‡]knvÊ(YSÝ¥À±æïx©œMÀÃXÙÉ¡E$¥oZ˜Â{…”´Þ;mÛm½íV9JÒrZ=äÆztc}:º¸é$º°QÕ MP eí|üÊÎÏÊRÙÍSÊn²ÀCîé˜ãJ ïx ø8õÌÔǃÊKO|”¶z:HŽl{zpoÓ‚…ž;ø|¿¯¿²MÙJ]»$È™èñ Ôx ôýt%“nóž;Yÿä <¡sô$ÎÇ+öc1iâFë*àaBÈ!¶Fìæ_»m2ˆåà{É9DlyNóÄèO„€`µ†¯¥_÷SÜÏEÙ!€>Þ?»C³ˆ#Œ}òÃZöë"T­ËýL1VLõÚ®»0vÁkšy|,ýR ²ËnË/Hfîú« ŽÓŸ­8]QÍÏŠ;[åïdKÊÁoµþçh÷?Ð2xˆ¤àRÜqñÚKyÕ« ð@†q±Ív[kœ„Q)ñnë˜A5Ç]KÑyÐyU]X,˜Ò¯‹»í†”,`7§Ÿ‚°gxb\TñQ:ÙÀÀh‘($FU z>ÏŽíP‹àËQ-{ã)j°Š¹¤žŸ‡€Æ£jJžý>·\ºËwÜÈ’á{b‰&ÀÓ’“&^áòjØx3rˆÚœ¾öN./êNs·šCLµù»4m‚20ô ä¶Føú§¿À¶˜ï«k u÷¥¯~^ÔÝÇ4€Œ~§.A% •Ì_PÚšEdß® ;{œ¨€‡JÙ“O?Qû¿u){|7EqÓ¼¢‘å,·¤ÃÂ")ûî/À“k<¬ˆš<‚-nJÉê!7t^Õùv*ì|ônìú„Ý&G1ࡇwŒ–sø¥q¡e-ÜÚ¤òª˜ ʼ¬ ²Œ^ŸÁ‹# ?0žZ 6U¡Ëùùþ_ïÏìG±Dsâ*4ë@Çò sôš<ðr9Ÿ€Ç,Þ`1]lDS†ùÃ*‡ÈíÐ>€€Ç™bÍ!¦HÆÆ0Bö)qj=dðAàxr$EȘ¾ˆ‹ÁC9‹_øsðškÛ1IáJýìȺ¼]Õ·“*í»Ø»ƒº;îmõìl6+Ò}´ªîtË1ËY‰£¤‘²–a±—dð^/<<¸´Cáí¸óöb\lÝmµÍËÔtˆ€C¬$Ž€ÍRsÌÓQÑÅi *º!еÅ­ ÎÇv>X¼\eì&[ÎB x0-ðC‰' v~³q^5¨îÐé . `þNûw²ü†æh1V…‡YZoçÝvÔ’Ö€·•–µO{ÝÝt¾5fçbonHÍEе2u±O‡µNÝUçKØõYÆnÒå,~¨<ñ„G¯¥òªÒ–ý¼äÜôx øtî2©,B/¾ä9¦ëÓ{ŸT6³|fO.Ïwri°Ý ‰š°ÿäTÒ]¤RAþëØ p‹KÍXŽW´cÐcÇÆìÒè™ï=úYã&øêÕZ _{¥ÇÍ)èëarÙ:¨8®alàï(aýÕ”¼¥-¯]3*a¿î©•µ›RÆeîf©»’½3uÇq2nHaÀÃòO.À”¶¥`–“ÈáÁ¥E À{ÚkïÖ=õ5v âxüʦ؟›tÞõ°c¶nª²ó¡âåîÙmòå,æ‘òÀó*F¯Ÿ—B§TKŸ•Z¦E‘ŸéÁUÊá äòÇâÇL (£ãêWöž´ÑÞP)š“¦;Ê++é±¥Ÿ6¡;ÝÊ!Ò)îsrà뇯Ó-past¾– "+%#b‚\6óàÒ#@k°Ð¯ã¼=“Âo‡qYÄ^‹VJþXÆŠ²ë9²'W­oËÜY)ëæf±¥êÝ™ºã8Y«œÅòO¬†²HŠ›GGè½únÝSpö¼[ç!ç–­PsCS„ûtSTÝëgc—3g·(g]9 ' J ”,k©òPÚ*ô¤O3½ìà:Å—ƒÊ |¿ þ¸Z0‹¯#Ø2àRê?Î+‚NËñÔ«C¾ ;Ù±”ðÍ´±r>¯œ6q9D*×*’“Mï@›ûÜËŽduá‚ëû±¿‡ÞúoZæ†6à†ƒù[„®}&‘WQÆ)“*V=U¡âTòó1ÊÚÅYÙ¡ÌÝp)ËÉŠauçów¸¦QËÙ×H9+ý;„Ž_.í®»ïÜí$£eEá•’ö©€]žÂ.ï)¯º[%ÇãAǕLJ#èPº¶Ê×yT•UݺŒ‹µ ·É«;p qü ²‡V¨<:¶Qåùò–‘f³Šâ³|[]îÚ…@K=Znq´)•ªÌ†µ ‡¯-«yâê“6ÃN”ôéT¥È9êXô0k—:Ÿ0kÒý¼Ì!Î_gûÙCfM Ú 7Τ27…¯ußž `[ÐÚ@ˆ—p`1#‹KÆ©êòf˜ ê†6ŸäØÉìðóà£'K…~î`TèÞ»¤î,Š’Ô8³š½Kac®„b9kÀ{Eêßí¦­Ovâm¿ã¶©¤5àáv(i#ðž,Ð{ò+ïÖ=IÎP¼d¨G7 t-Ö÷ëZ%ìvs†‰§¾9z%ˆ ¤Ã“}<¨<ßËË*OÀ@åC0§7 >”º<‚„¡ÉÑ%}ƒ›\rY}¹êðè¤ËêDÔœ"ìðämÏ;ÔT±üÚX®g#™(Ì!Æðu3€Í¼4Ò+ƒÓH^3€íLŽœõKagÞ>æob£¢óYÄâ\§ûd[›ORÎn9•]2®sw¥w·¯,ûܧÛÏ’étEÚËÙ=^ à™C[Ï`ç÷”ðt ¼W¤³Çݺ©Š=ºVŸ.‚®•¯[iØm²ac¿Mñ[?„GÊF”µ4/¨òèÚz¥7>?äÜʱ'–?|hlþ}7ÿ2BŽÍuöèXº2 ›ûO;( ƒ½¹Ôü`1Á¸‚^Žâ`Ih?z³†ýðuc"¥5–çf‘¹˜¡z™®VäbÓj“s¸x§ôëÒ€Øãô¡â8EÑ‹ŸFÇA9RWü\ájŒ¡”qZŒ íÝQÝɲO”²YÝÑÍý;”³èßíª»ð˜ÁƒÂÛf»­²iQÏ—³Òãº{²ÀÐ{¢ï‰/¿[óY:1ñÃþœõ ó;ì¨êZ‹;‘¯ÃYŸÊn“vg <üpá >Þ2i€²–½<_ÚFèB |ì—©I å •„ñDøeÅ7•§÷~öñ¸žšÓÞœ~}|‰¯™ cI¸øxRô4l<Üý´ ¾®*|¢8Åiæ…ÕiÎxÞv˜PQ`„²ýëmÖ¢>ÙåN÷PTÁë,büE‘'(\¨¸ÊÚInñxù%ÑïÙØÅ¾ÝP)k¹;3*ö—R–ênoÙn\©;ÆQr9kc”³0,IY2ðvOJÀ{âîwëž°›œ]ï–{t^Ñr~ØŸ†„2&:¿õd)‹½»µ-~¸Ð?Á¡•µ‡+ô|iÛRzQíyð¡„TW= 5 Ì0ˆ§Á\š&XÖïÃU²sþ !çÕ\ t¸ GIOàq¼nHå;Î!å´`Ä–œ;€M€ò¦µäJ$ˆYÄÊöëÜ/‹u…¿‰,Œcߎ¥lQw{ËÜì»}¢ºKacsg©î¬œÅzw”³fXX±”žÂe‡VÕ]êß©ÂK°{’¨;(<¼Çïr·nËïÖшhe+K׺Y°óKÖì6ùr,DŸcÜZ¥ª6ÔÙcäÒÑQ§4îÄ'«²(iQÎûXN«o9Oø:Ï»ðµÍÛ†ªœGtÁë*tÝ\Ï ]»E¾UÀ,bÉÖõ[fæ$'V¿O±_•;w[Ã.»²’°Æ©”…Q!?“PwÚ»KF…9³6J¦êNËÙ—ËtEqgYÎZÿ®„޳i1xjXxàI9ÞãwÞ¬ð¶Üq³îq;l¦jn èâ<ìJôêby;ÕÈܨß¿I±‚ë´QÖz•Ç~^«¼õ9=Àä¤Sœš’'‹WZ±—V•¿®ç¡¨9¹Ô'ô/3XÙ“#äÄ€ÈÓ'j:òdÅ×˵ÊEgÀÃ…2^sˆúù“r­zzÕÔ‰…¯G3ˆI…q# ³†ýàu)Ig®ýœ°_ãÔ UÇ6CÏÔIXúvþ±Ãc6Þ³3“¢.îGP»ƒd^ >³Qq€•²ªîÄ•Õ12¨;¹tW2ê(™ËÞaº‚î,ÊYŒ”¡GÐù—Ou†E¥ðœ;ëËÙ'¢—zx(i#ð»ýf΢‹ [)cb»lã·(´Q^PåÍ‚Öýø×~ûÛถ’_‚R|ÙÙÉÐ\Êå<˜Wq„œ¼|@ç`ç!gOX[YäêV$‡*”¥wÌ r-GX8vçæ{«)uO}0»L¨pñÁ\¡ëÔŸ«–t¦~ª‚.µf™9ªè8=!¿0¸×.®ž‘ìì~Ù™}»;Üh ØAÝÙVÎͦÍ(i”ŒêŽîìPþÎ/‡ý;*<íÝ…þÝ»!àm·Y·Å¶r¶ÙL¯L$äü´D të³|]„Œ€‡\¶QPåáÉÏÒ–ý¼¨ô Bï„“¨œJÙÓ_T¯n@Ñ÷ÞâŸóÇO€e¹eOÐr,[ã“ÕÆžpŽÒ~牽CÝ›6q9Ä>ôŠÝçœ?´«.5´¬gzø:çãTI#¶SÅtܘ<FÐ9å쳈¸©­UúëcçJØzdìHUÆ0},~2vˆ 8eGW6—²^ÝI)«êîµq²‚fEqg[q”ðbÿΗ³vΡUà‰aA…÷¸TÒªÂsÀÛbëͺÇlµY^¿îA·.÷NÌr_Çþ}£.Q—òÍ!ÍŽ5Ú¦òJi‹²¤=€Â Gðá·)  &ÿ÷y€6¸º''Ûu“‰e+U Ÿ¬÷³¡ŸÄñ:dǦäc/Ò›/Eñ1ƒ8=|Ý Yd5ºãb;þkˆ=ÒlðÄUìnCq6%’*Æc© “sœ*bûQïµ#ìäÖ±y`‡iŠTÆb9"(Þ•å w]ò)°{ÍëÊÞ;, h©;_Îzw¶Þ€;Û^*eI1u'.íN8Ò¿ÞcðýÒÍr¦n}GM°›“z(#PÖ¼À“Ÿ*ª'B@ÀªƒÁ‡V鋱ßã•Wüó ÇÞ'uOÎJ®~Ùʯ³~²BɱƒK]b9ÓrˆƒÄ´!ÚÂ×é¤L¡°ûáëé¯ëg}Ù‡ü£‹C×ê\SÕ¹ ±ßvQøÇ¡bŸ³›UÆb”‘};T »F)‹Ê°³P0*’ºÃ¨äÌ2ŠâÍ ÛÒîß|½(J˜®Ðþ”Sw ;¼;˜Qá)ð^¶Yà=ú%›uúçͺ¥\¸.Šn0ž@ôñðƒg*Ží› z²2 7Á{èᇜÐ+à³~›Ù„Ž7 ZØÐûAEz¨¸pùùÇÔ!ÇUEˆO a±(Úi9ÄÅé¹Ï9h;K» ­±Lbù·¥…®}tVLÇÿ°_hý_eÍ“•°~‚‚«Ú[3²v¼…¬êÛ%W6©”Uu'KòV”äÌúÞ]Qw}wÖ+¼œ»ãì¬7+aãÇ;u—— ‹\Ò&u÷ÈoÖ-ÀæýsêžMçÍQ>à·,Tzy„.DVè9¥ zYíUŠÏæp#üZ ê¿® ´1°óÁJ®ã’òdÙEEÒöœÓƒïÙ À}Z‘àð'ýðµäiävÀ*IûùÄ%„®ST§ºŽåkQu¼¢]ÂÆvq\lhŠ"ÂŽlv®oçKY¨;ÀŽK>¹÷AãZÝõÃÆÑ©õAc, h•²½( ûw(gv[вƒº{\êß=6ìßxPwú§Í:ï‘ÿ¸Y÷ˆ­ø6z-á;ÅíO蟠ĀʃâAi«ý<=( ê¬ö´ÌµÞՃ˂í?S¥ÕJ­VmÅYõßÌ9 ^Û¬ë‡'©Wt º¤Lð„Å÷l±ÀÝú–c‘fôf…¯ca»•=Œ}7_–ÆLâ¬ÐuÎ#¦•ë>xí[1xíM‰–:..¬ï×Á…í;±o•_õ…\ÆãÊØÜ·óelš¦ð};”²¶  ”²ÜyÇ1²~Å.í;~+Š_Ðtf{êÎòw <Ýð|9[ï…›uÁfÝæÏ_¿à[6­wAz1UyêØö¡‡ßÜP@½¾£²â³Þ‡_Rîû•¾û€i­8ªÅYõŸëÃIà-€;B§F˜ú§¢Ó¯?=YQ²3–ƒ²ÖTÞÒÂוûœöN `ûí3q\Ž»ûZ¹Äª\m…®'ä}D‡ÎuYÉn3±e KØCõ±ò%¬ÂN~q"æªô„¡žcÖ®©ìrÀØúv »´ïŽ¥,V¸vÌݵÔÝLà¥P•º‹1šUï®W°ƒÂ(g3ðDÝ=b€·i‘k‰ß-~ Ð7Á môòzôðC«JO~ˆÑ“ô ‚<ø ”¬ÌµCØxøÙ“ÇN Bþ kÍT[z|Œt?‚)‹EøS WÊV¿­ƒX”ë8P¶œ61•WFìæ _§ü¡Ï ºQ·YÙC¼zÛ©™DºnM—´c:|œËãZu¿•/a3ìt„Ô3/â)Ábs[P¸•aÇ»*Ú¥¬ÅP87‹ ±_ç>=Ý€QáKÙâÌ èÜt',f•³4,xRÎ>Òï6ëö÷›u}îò+½%"`Ó{7$Ù±‚Ž-~03ôàÜ"®èÉop¨ ƒ^êíå2×úa„‡ŸÁÈžD5ù÷´ö¿§÷ÅûÀùÏ×WrEbtM•Øyú^r¿(Û’C„ʳ»¡¢ã˜Á2’Atªk(„û€coçûq~>˜%«ÎåCðºmì˜1X{<½1áKX3sÂvÚ©²ì êäxØõÜX_ÆVÓ{æ‹yl|Ì/°(,e±…‹>‡&+"üz°‹FEOÝ%e—ÆÉr9+Ù;ôî†úwnôïTáI9»9€÷w¼‡<ç×—ÍÐØô¨µß1œ0¨<8¶˜eô U¥— ‡jüpSíÑÅUS#—º ;Eù˜j%•ÙÐßYRéûkyU>nù\ö9›JNˆ±ü2UrH÷ô7ÜM‡þ%c9Srˆ>Žc†J?ƒèL `{×4Âl(«ØêǵB×ÈÑÅàuÝû,¿hø i¨×©¿0PÂfUgwÈöwÚ- v¼TÊ.ÏÊrJvem„Œ¥,ÙYQB/ÂŽ;ï ì*£Âçîf¨»ÇÊtÊÙ-$l ³â1)ŽÒúw-à=øYë½uxêošïŠß¦ø¡S•‡ÒVTVGaA({z&ôR‰ µ—L *>SR¥Ïg&G9Q‘QEôáè¡fJÃNùX„[„\_ÉA•šáÁ÷ À“È—iË!r®xzøz|iè~,„=ϿŜb5#ŒÐu^GEW÷>iî°OW?ƾש¿0;¨:üÒ«úu\àiªN'(Ò}²S”]†]êÛ©²ì4`,};]î‰õOu);·ºs” »¸ªeTxu7Á­ÊYqh‡Öõï6—r6+¼goÖxzæÒ¡·ik¿k4ƒ±‰Oô ôàÞJ™‚ÞŒÏ\ÜRæ–R×Ô”•~„ ­Õš)6üǰò*–ª-%ç!‡¯åùÓ^o°ÃÁµ¼9Ô³Ã×VúYøº?uRæŒëH³zÈCz{ïg==@OÍŒ ö>–ºÖã³>{}ÌòJt÷†îT¯Oqÿº ·t©5¬â8ƒœ_õ@‰`Àk@ßëP‘ЋĬö\øš¹½8y2;|ÃØ~éÏ)ÖYÆ*tb;3óˆè³æð0AW»¯å—‡ §Ç¿øêMÅnŸ.ðL°“édEûØ•-(Å‘ìbej ѝ·ö©0~|Ú†’óv©Šž3;AÝé„EÊß)ì$’òP‰¤ÍŠÜ08dH¹WÐ#ÃJܽU yð™â3 ,~€Öó«N*9YzŽ¿,ïk@u'©æ¿9~M̃ñNÞ@Ÿ•ž”·Pµ>‡˜#9ìUÒ™N}½~øºd}¼f¾v;˜íƒÛ1§˜?Wˆì”©š>åšÄÜMÁkíÑÅL]jxE×Wu¶¥XwÙa-;6»@±*;Â.­hÇã\—±EÙyØyG–°ã&ãyKY@¯7:W? ©»0B¦°KföÞµ¢(•º“Àq³œuÀ{ÞýÿÜ`· Ôz|PR €Ì&ôœÚCßË—º,wipø%³ °uœB+=·R’ò}XšòeQpi„)—Ë))űÞ{zPµêPk±5>‡XÌëKª¡Q´ÃiÇoÚÙÃ>¸†ƒÙ%#'o“À{rñkEv8ïÚ2zØcµù×fÏ3üñq¿ÇÎ/îÔµìΜà֓ʉ՜ÍÇrŠe¬ÂÎÅO|¸Øï¹3Ø ¯êãQÝ5óvq9@kA@êÝv9w7¢îzål ?La‡þ(<ô_Óâ/tx„Þz|ª/>4¨<4ŽñC ƒÐÃ0z]ˆ­¨ÚKàSŇßô©ÇÇ>_ŸõûüшKãTËå¨+MÃÇ¡Š³òªä¿ð5ðàëÂjïð|‰‹Kb ò´´ 9DnÎ!ÖáëÁ±9Ü2k<ÀfÆK lVµÌö¡k[æÑ)ˆÙ™Döæ¢›Í m$3ÂìÔàcïru º´ÃÎƒŽ‹;ýZvüò@› fìð‹%ÂN{vv-Gv)ÊŽŒáâ<:–7;WÖmCñ#d¹”™›Íê.mGñqŒ“1GàeÃbx "­À#°ã.Ûë \[ü€zøáõÐÃosÀ?ð,u›ðS£ÃŽÆ[üI懹}3Nxß ¹7—¡W|MXü¨÷à¤Û«¢Úƒ¢9Du¦søº•A4'·Á)¹ÁVư„©K°º=E’þ!ît|èÚçûJ®ôæb±r±“êÎmþ¿àv‰&•òÕ.É®@çî  èð DKX.H·åùX€ËÚyØÕ&Åø&”1—V7PÆÚž»rã'=Ø…RV·¢¸EŸÑ™­ÂƱ'î¬öïœCÛRx+ðt_| <»È®1üæÍГR?¼€~ [àSøá‰ú|ürékñ–ÞI@ôJôjMÿÌå^*ä´—T¿¬Rà9è©Ú %.ÊxŸCT“Frˆ>Žc%ºŸ›1f‡ágÆn$-}Ý•`?„]¬-2’Þ—[^†B×ÎéÎ%k6€×)yDÍÒ%[û¯t¥|µ¾-A×Ru±„åjö^ ë£' Ø-‡#[™Ü^Ürdýµ‹>\ìÙÞ¼lêÝ ÁŽ¥¬^Vw.Ž’ ¨;dð%í‚F+ô o²«\nœ¡'0€‘µ=(qÖ…ó†¦4Ê\”‚P|T}ü€æðúÓ—ªˆ±>F†>G‚­>Ýy²lÇxЇ^‚_„Êø˜C$ôšákŸAtákf[löýÐû+S"–GŒJ-þ»/OãD‰~.g>øØN1ƒ"謭`FS§ë.™tâÜW%¬–¯vw¬m0•³Ç^ëéÎE³ùr&¹ê¯Ãì5¦tVß§ÁoZôó z/W#ƒÝêâ?܈  D¨àkÂ/•¾HïÈ“ @ôêÌþÌ×ã}L]ø£¥t8è-òNS<áÌáÚ=BO·e@åñàæ*ÜBïJÝ*‡¨Ð³1»ÇI¥u _3€Íð5 ¾Î³Ç1„íÿžÆãâˆ\žv¡k*8}éb<1tíóˆ4~¬WZZ0yTIW ³_Tùñv½:ýEWްÛ#‰9Ø¥Õìy뉔°œ ¨a7}ûÉ•Çëç‚]ãRÙ(삺ÓQ2ß»‹å,ûw u…wÉæsñåtþ„üDRåWÀw–”½|¸¾“ý?€£‘H ¬#:Öî»zè¯zX%( 0jà{…‚¥.ËݬüÐȦúó寖Áè^Ölžôv|{‚”ãJøø<€.šÔE ð’Òë©=BϽD_ÉçéLfÓ¸Ýd¾.Ó'i½–Ï6ØÀ²ƒJ'Õ –{p3s‰­¸Ž9Ù4y\ÎÅL|Ÿ®¨ºbJUWƒaâ—‹ªÃý±z…ï×Iôi‡·Ó_¦Ûí°­¬hŸoÕÓ’`‡@q:=án;¯ì&À.oCa)›2w±”Ík èÌBÝ ðEÑr–î쀺ð.»êb=—^yQ>-*ü¨ür le/À§å®(>ßïãÆ0?p÷Š/u7y𡯲ÃN=ü–Fi‚füPøöHà3cÃŽ¨>ɶáhÙ“ÕŸ•¿U{riÇðµŽÞÙée1Á ‡Aì^ÈÚM‘ †®]6Q!Gã!½Ì·›u­Ô\º" Ë[ˆè²!¦%ðÿY³uˆ›$Ug%,a·£T9I%,#'ËéĶÔNNÄmÅQÕ-vtdÕ¤˜QÊVê.ÅP;_ÎÆì¦\)°ã!ø~|€ÁçÕžïïU¦FR{(qg©úz.×G¥Gèa†jÑ©µG°%|ÅX©~ ~p‹ÚC™KðIÏFŸÁψ'„©?”=(}­üÕCˆàēߗC?ž|l-«ö0àÉyBRzYå¥ËZ2ô<øBd1Co$|Í "V"©ê“]pNž¸Ø„¡½ôÁëJ¯Öøþ½\"ǽº¦ùÀìœ/Y#äÒž:îªS3Âtö8W «zutÈ×–W*.Wìdv^]‹ k¸±ºßÎ_Èãâ'SaW–ؽÚ»“ÍÆvPwìÞU×^Öá´ÀÇr—jOû|09Dé]ƒ#)=…žssU饷êéy·=ôõ°Ü–%. ‡ùë%`dí¼ ~Àðà ð©Ú%dje®O{|Ò¤Æoú?lÄü<‹ $ ç}I˜ÚËÝ­)-¿ÙMå•Ò6§í =§øªR×*„FB° _3€ÍüaÀNËbPº‚V Z—ñ< ^û¾›þÙe½z‹¡k ÇèNp´½Ñù×RºR=ã—S¼Ÿ–Ƚº$¦ª“Ÿ‘ív”»cw|<¦VÂ.KøµŒ »-X¾¶V=ñæ1Â.MRÌRvU掽;éÛ=ÔÍÌΫî>/‚¥î ô|zUO/ÅWØÓƒoÒãÝÆ„6ø˜Ò{«Æ§P}¬ŠÍù•â‹?°€‚©½í3ø íñ~ò$0øÁ­3åÇC¨ep:5ÀLÆãßÞþL5¹›¦æñÿx…žä®ZÐóeîP©›z}øÞð½è»1q’3ˆŒàÀQöDNŸøñ»¤¾¬ ö§‹«þ ªÑ½§s‰)ºC—U‡úyqKÖÔ/eO-¶ w:íѹÿf®.•¯¹„%ìr˜?;ËkNx•ïŸÐµì-–ªÎMP4£'#ÊnÈ•­c(IÝ¥wó¨;Þu——¥ÇÃÞž¼lCOÌ ¯ôTåy#y½÷6:¥‘Ü[ÆVV¶òöhÙòÍòÐ;X ·9Q²vÞœ?døáô-`™ ŇRàÃØÁ¥ŽÁG`„ŠcæûÚKS”ˆà²dƒžO ‡ÒVóXiÄ(«=ÌWzÅçUÍ y‰ÒÐÓ8z“!|]eÕQNùà ?Ë–¼¡›BñAìÂ6uèNVk[¸ \{g5emk‰„y,#iù¹<Áu\Ý”®IÌW%¶ ç9X߫˪Nâ&PuRlµAÇŸG7QÐ DNp—¬Ÿ ˜ ;^·˜&)¦Â.x²$[QZ‹âXYx¿ ¼TæVJÏ™¹§#ã² $²’b+=LlXV!åäÜÊ„§3òhZ01Ræ%QX_†å¦ôÖi#Tk‡ds|¥z,qij~Ó~˜•¤òÃÄC0‚ÐCqÊŸ SŒéoô<Ü:EèåÄ=¡àWõùx£Uz  kÙ.ðÖ1;ô'«ðµ¸Ñˆá0|#8Ì~eüΠ;˜KÍÇMŽTS$¡k*·ô2G~Ò ?‡ù=äÌ„Hj.™=:‘ú òçì+Ôœ–® t 稉ËÕµŒ‰)¹¹u}›ìܘXž‹õW+rëIk‚‚Ê®‘µ‡Ý¯ëêö‡ú€ñº{ð]}ýNSé%C£vqéÞ&CU^ž©<@ϯŒ¤)ðhb¸¸ çq½‰Á~¡‡yo*=ô£ç@ÉÚyÓ=ôõ¶RµÇ—øÁGO¦r€Iýe˜J`‚ÐÃ0¿ñ4ùïøø¡®¡gK3ô’{«®/u‘ÙK¹=(¾žê“×ät¦5Žc¦ _[OÁ—f-˜2‚IYeµå ¥3È“§TÜ¿™b+ÊÍç¹޹ÄÝIYÈâpÓ *#`èO²uÀ–Aq]ÓEØê¼Úý°ªÞå´M é×¹yØuÙÔ÷gùª7‹ñv1üL¸È‰*;€Î¯x æ„fìè9¢ìò蘿˜ç¹¼jA€ «ºklEi©;¼ŽÀëÏ•¶04àÜš{{±žËÔÀ(&FQyç'à‰ÊC(ÙåóÐËÃî˜Êë—¶GéVØíˆf€æÇQÞÂh[;$›ã+õÐó i+u·ÉQ`rw³TÚ˜ŸLþ%bï¸÷Œ°~?ÜøÇ?K[ÙÌH††ö÷xå.·äBýY1Äqák(¤:‚cJJØ©ŒdÛ‚Øuúu{Õ¡lËÁõO•ULK6™IŒ¹Ä*¶“mÜ%ц\t€\ÈÓEÐÕªŽÆÄúëÕEÆ\BΛ¡„}4U‹ªËb‚ÎEOšs²S`‡;gÝλy€wMRxƒÀciÛžA¯(øMà͂ޖ[±þ{|QñU}¾´KÍrˆ%Žƒ·_Ûr…~;)ª<}ÂÌaŠ~¤KNÿ2¬9¹Â—­œ"ã=j:¤p0‡ùé‚{5Ç>){¢l#PÍù]ut~•¢JBÕág¯"¦ûÊò5¨:¿Ï._œ`——øí'2EQ‹+ØÙ-d¾”Íã% ÀóÐó¥mÏÀHáäj-¹µÙ±•^^Ó¼p¹<®šŠS¾¬e/Ï®µ¨ æo¡òpï4ûyÌo’ÐCÏâ,åPÚ“Å” ͪÁÖËí°/')Hü£\ÉÐsý¼ÜÛI‘ ¥úR7ÁæF(w9µ—øú ½¾V·L0€ÍNÉZ i(Vþò´BÕc¯ëgÜ\.Q3s. S¢ýݪñØ¿ñÀýÓ#ï‹EUž@—­Tý¼MPðår×ßKn®ÅXlJÃNrwÝKË!Ú×0¾f #VèóùÈ §OJÛ…°]¹I(öCÖ)°ÞVM† 7Ë5fõ–ÜUFIðµÄrur¾?7 t˹Îi^æÒ5”¯±W—¯S ùºGµÊش׎ðt½‘17'‹ yTÙa1{òêE?/;Gïn)À«â)\8ÇÎ,“§aä0g[»µ¶N }¼¡uRèãù²6NaàJôò°”ÁdÌ}#PÕÚ Ù_å8ôêžN ¾²¥°AÐ/ƒ¤:¬_¸RñúC ç•—:ÒÁ-ÑžÏí¥À²•¼uÙëK`æMíÙ|1Í„¯iº@õÁÕôùÃ:sXBØqÅTa™Nñì~6‘næl„ÜÕtðµør5–¬„ËÖ6èê_PK¹2q^¨ ½½öèè3PÂæËvدãZvŸ±óæDºK—gOƒ]¹Ø„Ô]Ú†24/;dX\sÕž>^TxƒÀËy<‰§L^1.ØÇ‹™<o¨¬ðSA/KiUai‹¸Õ8Y;o:õ‡Ú 7ÜÜn¥ò=(ù„ÃoêAè%÷6;¸NñµŒ<‡éJ_”À<5S©Z²ŒÚù ¢–…nòİ ‚1ˆ]ØýpuÿßúEû˜!¸%À¡Ï¨Ç™Ñicn5•®ñgÊ—¯š©›Õ«s «œX7ûð%ÁÎÝ@æ•KY.˜£”Õþ] x.ˆ{xcÀÓùÚ”ÇË£fiih_áõ×Ú¦Âé ßÇ£y%Œ©ÀÀ€ÊCi‹Œ"Yk‡ds|¥S¡·®o‡3bÚ€n(=}b¤xBV{ìñ1·ÇìžÛ™fê*0]ãÇôôÒ»ÓuøÚÜÜœ?ÕØý¶åÜ–rê¬"ÂÝ7ÝT’>¿DIÒò;’ã}v§D1"j•½®ÿ¿–ãýÙ§« su®|Õv<­È AçxJ)»¹ÛZ¬~™gZù4¨ìRE•Ýœ°ð®Mê®Rx^Œ¥ L\èî¼”Ã^Ù¢ÂE¡ÃÀó›T"ðØÇƒya*OÊÚÔËÃGª<Ì›#ž5JÖΛ.Ç÷¬¸òRø­ìô’™‘¡Ç¼^€^67¸2½dÙÛzÙÏ!ZŸ¥®æ%”›Øœ@qÙCþe \g•æÔZ|?ŸcDi³rÜ.Œ¯#e!énÓ¢s^CnÃcÿÏÕœJ‡y:mg„¨IåÀ¦^ßcçײçÈ ËØº¼æiì¢#Ë¼ÝØê§¡R6÷ï<ðtW§“çjÝR¼>JœZ¿L`x¼'ƒT0W[VÂ/xtk{À“²1ôò```êi„µC²9¾ÒYÀZ×G¯«zpë»B/(=ß×ÓÞMøXîú—€ŒþkgùM'šÆ†ÏúüaÉ8µBØÙ1¥Jsj-f}žq'¸´]Að>䨗³éúì_×ÿ× :ôi‡œ×SÂçë´"pîTù:€ÝÊ..Xؽå×~­ß¿^oÒ¢gXøñ²<ærаHÀîÀ˜ <@öy<‹¬¬•>ž˜ZÖBåIY‹˜ l/GJa”¬­7]×ö¡÷ǧª  'èÁÄÐ&5 çKÜ]Qð1ÂÂÀr,wit‚þï 0ŽCÏ—‹­ð5¡XØ bˆ-ÙôŠõ «ŒbyûÀwq¾m'ÝjVuxL+7º¤èÐÚ@O—§ÚLLS‚SU]œžÙ؇ðòdìBή‚7)Â…Ú³úuñßà&ç­rñJ¦…[…—ï½H3´~¤¬ÈßÅ)‹¸1ešºãú÷¸#¦…/i#ðpm)—ËZql¡ò»Z›$›ó«^ð=Tî P•¡—zzY‰j/5¹{à£ÁáÇ“RÏ/Ç øo€ò÷±ïÇ÷Æb*Ѓˆ›¥K(›ÙC¼vÓ+xßµú"ëÕ´±Ç,oöJñ’1šË C.êrlçÀæ q tÙ‰íÃîAi‚âAnsqVv¼}l ެÞѸ#å@åÍ‚žž™év3º³.ŽRÇ~ŽÖ¯ˆ*¡c^à=¤î˜ÃÃ~¼¡‡© , ð´—ÆÍXÖb^½<Ä©æÄÇÚ}óußCä‡qôòfBjñ•>¯úBϯY @ô0œç{) «ù´A¬ÀËzƒöv±m™'«¹DòåÀpRé9V"&³@×s`£ªÃÔ„Ÿœ_ ­~Ý$Ø­£²ø¼£ôXÚ,¯CT…ãeèãEàñ:Gsgí[ ‹ºs­r–—vãîÚy€ÇÞÂk}<-kefáòЧ^»[ÂW>å‰Ðzü€â‡–ÐÃXÐCþö€î!Ï:PK›‡>ûM9‡¥jÏ+>¿äþÑ ¬Ê^nõш֟Ñ`Ÿú½Ì“ËkmêçYKo§—]§ÓËÐq}“ËÓµ‚nDÕùÈIµ¥˜W*ú~Ý e·”œÝP™{Œ€Ð‹¥í›Sy‹~JÛðxom†Ï`'[RòÕ¶ñø<£”}x6VàÙõSž‚ÇÈáÁ¥SxŒ§ “·Û0N‰0ý°±ößeÞ'烟%«´Ÿ¹¯@nÿ º‡<ë ÝCŸýf;Ï9¸:{î!OenPõ¹~_@÷Ãè³þ,ï?ï÷±x{ô Îåç*=:–­t^ý6â¡^î‹eŸ.©:½l‡×)2L͉0Aá Šå„Ýq4<–¶^å½IÞ¦Ry4,R9Õ¿¹¬¿íØ`§wÕŽÄQâz(ß¿‹“Mà‰iáKÚ <‰§ìµ÷ëuÌ ,Ü@@~íl‰ßÁ<è¯Þ(7¹ï7 troØôzî ‡áÀŸu×C° èM†>‡ùµ'ÇX‰Wr tÙˆ`žŽkœFL‰‡Eй© ,x.Ü!èÄœð%¬î³KkžÖìðýxÇ&èù²Ö÷ò òôÒÊwUyyé§”²¼˜»ºµÌÔ]¹ªÑ.æöêk¡¸ü3îÂóîlìßµ€‡µïÈáÁ¥Õ’v xO[‹-Ü(kº_".6®wkÁOUÝß@Õ(åk_Ñ=LTÝÞC%7rmö•`5îÃ?O÷¦ü6,ïÔ]÷ÝÖ–škAnŠûJÐ%U§7‹ñv1ïÂ6T]»eè×ù²ö˜Í _Ö"›‡^TÞr°emqgãf–²x,ecöNÊÙyÇþ–´²ý“ Ae-JZÏçòS¡ÊËÀó ×3JßÎ;³vq¬uÇme u‡»,¢YÁ¥QáцÅÑr©öïðtMÔà‰qQ3ôñ°8sà눈çÝ­Wg†DTuË:ÅfÙ+àSàñXo°é"FG1)˜ø^Öõ`çT\5þåÆÀÔ„pe«†=äb̄ºtß„»s"ƒ—dvˆ›0r²‚°{›@¬<”µ^,k©òàÖ"’‡VËYÙŠRí½ËF…Á._Ï{wéòž–º iE÷â©Â“yÚ7r€ÆRÐÃcpjxÚÇ{¹–µÚo<ÔZâwR`GU—”ÝsÞìTSf=5w¨(¼ÖR~ò±ž—N„JåtŠ!bI¯.†’ÙT¡7¤xrf.ôåªXÉD5—c&¹|-™:ß§{0AÇ›Å|¾ŽW*º}vëCÝ(P^+“çËÚýåý>Vàõn(K™»43KØU½;wS—~Nqg‘¿kÒ¿3‡ÖVDé"Ð xûå%˜©ÍÀƒS àÉHl ÚY–^,kÿÝôW{Éo_èÕ¥~€Î`út“AGø•ºz€__ž_Gr„Õ¶“ÿÎY¤Ãˆ!öM |ƒ°KëÔuZ†*.\Æ™‡ûÇÔœÞ"æoK}:ÀîA¿FÑ«ºeœœ+k[ÀƒqóxPxÑ­…yq€^•»ëÝAÛŠ¡¸Ei¥»‡ÜÙx—ÅЄEޤ¨aace–Á³ÍÇXнx¾yxpj±Áñ,ÍÀtÑڧלßÁƒþºvaJs"Á®r^©Æð65×;'¯‹§õvò16¯ÀÕ^‚lVz¼gãèÉ׋Ò[Kp)Å+%ãžè+ø¦ô°ò?‡ùÝP«dE´ds†ÙŸ‚ïˆÞ;AЭÃýS¾Ïø6' ¬<ð`Z ESÆ€·Ÿ¼n(SॲA±ë-sg¿$ çÌžur7Ô»kÅQ¼a‘ûw¢ḭ̂(ÛR°£e¼}tMTTxxèãí ³âsâbm¿ymNØÂŽÊ+jè<øšÐƒôêÏC¯˜Eá5 WÏ ‡¼ néh<Á7ðM€ßV’WªÏêË1C§{ê¤7‡þ\ìÑ5@§†„+_}ÜäPtsÞ;õ{l½ÝÛRx0-KSxÞ¸€[‹²v_9èÝå±\Åèïž;ïxwEeT8ØQݵ.î,giX°œM‹°ŠÀƒC;xâÔbß#¶m-sák›b¿ú;UI([Ê.—™¦Ê*صÝd•øùžž‡ž 6{•'²~í‹CàôÔ#FL5ß)åÚZß¼è)8¿|Ù¹F~.OFhhXJVù”®snga§|ÿ„Ýzž+eyÑ6`—×?i ¥dîZcdvCÙ»*Ž’&,|9›ûwiÞAbX0’2ªðð°Óó䑱v߬»<5ÁØIž”H}5§ÄxSAÇ·(k‡>ïÀSèxEå=X2„<ƒÞƒÿz9{Û“Ü=ÙW;ü¦<É[o£‹6}/..•­­b%¸¶œÜŸs¡a5#’!ÑìѱteŸŽ7Š­ìN%¶\À£S‹>ÊÚ½åØ®»¤îRÅ`ÇRÖ`743ëaç/ß¶K{Ž£¢˜Ír6çïliÀ!‡¦þ]Zà3x{Ë,­7-rI àÉvoÌÖnôÀ³É މ…èIëML“bIÀøzÐ(g³y1x¢J­‡W+<ƒ]­ò<ô-ñ8ä{ÜŠñÕ¿¥BŽï§}¸8êEÀñûõ!áÞX O1#è¼:Ðå;'Vv§<ðZ†EìáùX M ”´Ñ©ðö‘3»³}ÀØeî†BÆvƒÙ;??ëã(9à±—")XèËö’Qؘ‚KçáÒbÚácDS<¸™píÊ·‘¯üêÆrzY;7=‘ga‡Ù%•²£}x̦-Æ€÷Fù÷œµKÊ®;›¦èÁº“O?±#ìx­Wwǽí˜î¸·Ýõ¶£pº"]ޣ;ÎÐrçh÷ÙÏ€‡[̆€‡+ °Ø 46:à줤ss±åÅ`ü26Û¤8LÊ\¦»µö9b¯áÒzvpkºÓ téáï¯úÀ{à_¼^ž¨¯ÓyO ̺…”1b±®*p¹áÖƒÀ €Ó# Ïü­~\ºäšßwþÞcÙêGÁœëZí«ówÄ®è;¯î† ‹¡Ñ2¿ÀôKZ˜Tx^5IÑRv!‚ÒseO{[ça7UÝñzFsgYΘDZ÷F ¿ABÇ-ࡤ%ð° ?Ó ô(*†°{°n<é—²:EûvÏ¥Iá€×ìÝEØáï}¾\Ö–ý0ù<ý9ÛV¯KÉ嬾G=4-¤„‡²}Þððç¯íð篑ój›qõÉÊ·•,áZàÔÍ$Él ³ÊžœB­8@{}o.~ߺ}x•ßÿ© ¥ÀŽËüh6 sžvxèãí%‡P¸%ÇOÆ`'êî탰;V”Ý1¢ìŽ–ÍÆGuÕ*(§îxq†eég¯œM3´X …þOBÇX°çkJI»ÑO`4êÑ·3ØY)«Ž¬®u²pñÞKàõ')²º›»†F޵xà5æjݤçw[9¼xpg¥œUØ…þKÚ¿,%-ÞEáeàýÙ«»üÙžÝýÿôURKÜ"<Ùã&Þ :ÂOõµ4¯§œ›†Ès®nlÊ÷®+œVPÑá{=M ØEàÁ™m¹³QÝyà1ƒÇ•ïèßÍ@׃”±§Ÿ]öÜUÊ.Áî¤SOè¼+[¶Øa•ûð¨î4Š’ÆÉ¸0 —³¹g›R¼W ð^%³´-CðXM ™¶@I»Q)<5)B)[÷îÒØØˆ+«%í¼®ì Âóª‘~‹”ÌvLéyuÇeÐq.iC9;¤î=<¨_ôð»¼û ô¼ûÿé+»ûÿÉ+ºßùãWÈÛŠÒaŸjôªÆÊaUjû"¢‚\ð­òu¥A7»±Þ—Ä ^4,"ð0iÁKZ*¼×É¿QÕ1z’{v1\ÜPv³BÆyï]Pw¼´‡êŽó³ýrVúw²ü—rcŽm<ÉáÁ´0àm½q”´ZÊ&u×_óT2w¦ðœY¡ý´zl¹€÷pa}úÐÛÜe;K¬ #pѰxpVx%ƒWÊYšæÒ´Žïþ¼‡@oî·ŸñrQ‚RÎne3<”¤UYêKT¯â¨ÞÒ\+܃`<ðê,×}ɾztþ{>]@Cu‡R¶åÌ“Å]x³Z<áÒ¢‡÷9@—svTvIŠÊ‘=åøîm'×µûvc¥lÚŒREQlÇɸŠ–rqÆÊö% ˜¥ÝE&-<ð¸|Íöñ Vtll†º+ƒùxíÙ×Ѿ܈|øßÖ=bàø½U@øAéñk)êîa½9ZÂ.•%ÃBÊYíÝõÔÝå ‡þõðTÝiI÷òîwx¿ýG»w÷û£]{[IÖ·!Ñúøì5¶zŽºdrpÉeí)¸¸.[#è<ì|)»uWC±Ç) ³€÷yª:‘»¨ìz+ B ¥6*d÷]º°½;¯îÆÊYëß½B#)¸§V'³´Ø‹G…·æ§‘ ¨»*†ÇÇÜjvUU~z#b­l^Ý?Þ=²užo¯7ª‡Ð3Å™z‹†™¡UÂý;IIcƒ]­îv“€‡’VNVxx¿-À»ßîÒÝïvÞ`àëÍ)·<Ú ‡–’sq’Õ¤\½3,„ݺ›åÌÎ)BÇ-C9ë€—ï¦ØzæÛ»±`ñR`§KŽ8ÄöÞ%ugQ”auÇ8J)g¥÷jéßɦ<žŒ–ùÞšujøoPu‡'º9•tfxÕ&”¡m(ßDèu§ È¹çÑ=JΣ_pd9/<²{Ì ê-/õ‚#ºG*ü |€ÞÃÿŽJ*oli€ÅQJ9›L Þƒ²Y‘€§¥¬Ww¾‡G‡Ö+¼Òó’ÀÛ]žÞý~§î·~o‡_h¾ï6V¢Fwy•ÂîL(¨t†JÙyÕßtÌ8 ÇÑ¡¥º›¼=QbŸ9»ÖèØeg°+K¼3kên?%Û·Û_œYŒ’å°qÚÇrVûwRΚa±«O")r·€‡à1M‹5 ¼ü¹”²NÝ)ðt Þûx•Cë&ò’€‰Ðs°è»G àp%ضøÇcºÇ½øØ|ûâc:ž-^t´¼ `0Bñ5”žºÉ–½ÓSMWxtgËH™OÕ]Þ+à‰a‘L ïЖ’Ö›³÷[¿»}wßßÝv½ƒåèÜQ3Å÷ÝZPK}Gí?¶ Çžä,]YÆv^KÝt³ÆÈè̶ÔÝXÿŽaXp¬ =<ìáAáxPv§H¨Ç‹ºÙ°CßîH¹¬l3Î+Ü“º³1b(6UQ«»}dÙçÞݾâÌ¢w—Õ–~æ8 ËÙÝ ð$tŒ% kxˆWhCs£(éTÝàY%FR<ðRi›ËÛ•`—UA' {,@÷OÇuÿçã»'¾ômÝ“^vb÷Ä—½Mÿü„—ž çqÿt¬Âo‹¥à3èÕ*Ïâ3žLˆä•P1lL³‚êÎ/åﬔ­ûwø‹Ò¿{#))–rÿ?ye÷;êÒzàíÖTxÞ}Ÿ¾MwŸ§mµ^À—aåÝâ‘?oˆØÈR{™gý«¥ ƒ]4*Z1”!g6^ÞãÕŸ°sh#ð2èÜEvn©§MRع²¾”-½»¢îö êŽÓtg­gåìî{ì¢+ÞaXxÛn_+¼5¥ò PôW(gÑ» ÀK+Ûkà¥rÑé³—çÖA ÝSA#*;¨:(º-rOxÉ ¹'ouR÷ÔmNî~wûS»§o{J÷´|Nîž¼õIòvÇøþÑÔžB¥-L ©Duç´GÉLÝx˜®Ø[úvRÎ*ìð˜¿Sà!p,ÇeðàÐþŽžVÒÖÀû­?’ö÷w²ÖwŸ§¾¬»ÏS^²là£;ìs`›Wj«HµAðìý¯;…]^«o72rfy…_ÕŠ£´Ç,gc$åõÉ¥¥Â{%Ô¦‹žô¦(Þ.Kz°CÖΔݼ°+ά¨;]VwË(™®t‡ºc%—³¥G‡Ë0Z槇֌Skꮘ¥Wî¨ÈÀcà8_ÊÓš´à¦”vyÛÞ£¥|}¬”®PtÝSr€Ûïípz÷‡;ŸÕýñnçêyÆ.gw¸Ó™z~_þ |òV'ø=ôôÐËàmž –³~TžöíÒi•³žô:9Rf °“бº³®œ¥ÂóÀûÃbZüzx#ÀûÍ'ÿÓ²@/Çaâ­^klzçþú¯wçì<Àî œdR ¹²0(¼I1+†âaGwÖ‡ýül,giX0’‚) ïµr^-çUr^¯‡!X|ÂLØÕóäÕí2>V2wýR¶ôîÞØí#¥¬ßŒ‚Q2aã¢î,Ž¢ý;)gÙ¿[³ÀƒºC¦LƒÆZÎÊdæfYÒV—ò°¤µs6V6¼÷Öå,L *»'&ØtÏØõìîOv?¯ûóW\ØýÕž—tóÚ˺¿~õ%Ý_¾ê"yÝÝŸÿ`Ç3º§ogÐ{ü?+å­ôô`d ´•˜Ê8ðú“½Þ[àÕægõp¤LÕ]x)ƒ‡HÊï¨a! ¯ÞŽ3wï'ýcw¯'¼pYÀ·Ô’q5½ßù›m–aGu7Ë‘&…‡¿¨'öíâ(ÙðbêŽý;:´-à½\ÞNûu’³Ënì$عkóbϾ+«¥lÚh¬°“­ÆYÝÉ’›…º“É ª;lG)fE)gqŸEéßAá½lm)<”\:)€Q©ª7xj\”ÅšÕþ¹ªÌm+½Í‘›“>Þ#D‰Y{t·¥ôëП{ÊÖoï~_ ÐýÕž+äžý†+»ç¾ñêîï÷½®{ÞÞWwÏ~ýÝß¼æÒî¯|²Û9=(½·‹2<¡ÛòÅ(mïõòñ¡òe]^c T­îüv6vê.ÏÏúr6)”Æè­dRÊàÔ]*eÍ™­ÕÝ+$llî¬ÅQJÿnëÊ¡eY»êKÚüÙkÌiLå¬^á%‡6¯ƒ*÷Ìr––à†^ÓÓÍÇ<ƒÝÝcÄp€ ‹R–°ûÓ—Ÿ§Jî9{]¥{Á7v/:èæîÅo¾¥ûÇ7ÝÒ=¿ë»ç ¾¿Þó¢îOwôNëž¶ÍIÝ“^zœ”¶[yþ¡¢òÞ"*À{“œdXpѧç%}g6¯ƒª²w²!E\í¢î x%pŒü^èßðv–ƒrV€'±”ÒÃ+ÀûMéáx¿ù¤w÷~¢ïñÏïîù¸¿ß¤ wíÿøÝÿù?w—ü‡ÿÐ]øoÿmwÞÝîÖ#åìÙ9¨;…œ8#ÛZûäMŠ»±™Ù¡ÞÝPؘêå,Zß¿CI‹þÝrv—ƒé NPDØõ·véRí¼]te;CA)[Ô•²¸t;«»lVìªkÝYÎ2ûw«Þ´€òx +gmß›m±ž‹¤xz¢S[+½z™@ppÓÌ+&"—C„;Þ1Ú·ûÝíO“2öœî/^yQ÷,`÷â7¿£{É[ní^úÖww[öÞn›#Þ'~—€ïfßuÝsÞp…(½ »?ÞåÌîwEå=ùeÇ›Ê{Áax›?G€§_¿3,òVcnDáV”Æî»´ÿŽ;ðÊì¬ôïä—†Áó³uÿ®äïd‚†…”³KÞ‹2ðîñØçnôлéÿþß°»ò¿ü—îRQw&uwÔ¯UÊÒœhmA‚]teiVL-e¹,€7•q%T«œÅX™7,¼]åõÏÙ-ìR掮,c(Xòi[Q’º{­- À(Ùºc%–³«xxrZ9ký;Í›v <ô¶l!_¬]ó´Üš2±Äôà  ì†£ŠH Ù§m{²˜gv¶ÇùÝ3¥\}ÞÞ×t/<ð&ݶG¾¿Ûþèv;{{·óñîv8æƒÝËz/<ðÆî¹{]©*ïOv=«û½íĹ•²öñxPx ìj»[ážGÈ"ìÒ²O8ØyY@ÜŽ’ÂÆ »ºœíŽ­—§†ÞöÝoýîvÉ¥¥Â{iW+<ïÝ=·üûî}^w÷ÇüíF ½›ÿßÿënøßÿ»»æ¿ÿ÷î *;ÝyRÊfØÑ¨H&Ŭ)ŠìZ}»u]ÌÞyu‡rÖ÷ïÁƒÂC9 …àt~‰g½ýÄ”]ÌÚÅIЍìJ)‹±•²ºÑ8­€²© ¯îÊd…EQvžTήzàiƒ=Ï")x)xÌuJ9À«÷xð¹Ër²™á 1œº#ð+À{¢dê`<üÑ.g©u÷R¶þÓÁïTEÈívâÇôìrÂG|[úîîºIJÛ«ºg¾úâîOw;»ûýíOéž²ÕÛ2ð…’ö¹²ÕEËY OàyPwø¾Ë—|ÃNQ8³¢Vw©œ• )Ú¿Ãül¥îÄ¡Mý»ûUålÞÓxOEoðžÕýÆ#ÿz£€Þÿçÿ(ä®ûŸÿ³»ªî¿þ×î2Qu„öí¤”…²;S`§Ž¬ëÛEe7«ga7dT`¢¢5UÁÜ_å'+üº³TwÞ¡ðv“³‹‚®¨º~Ïnì–µO¸… &…ïÛU¥,€'°ƒºìlç¶¢$u‡¹Ùл«ËÙ~eÕ÷ðÐLG”Bã(Yá1ƒGà¹àqZüiûðìð•ÝxÞÈ(½½ÚÉ%ô<äæPÎ"Rò´mÞÞý‘(¼¿xå…jR¼`ÿ´”Ýî¨(ä»]ååÎÇ}¨ÛQÞÖ‡½§{±”µ¿Ï5b`\ÒýÙËűÝáÔ'üÓ1Ýcž/ R‡žž|_îV²ìÒ½Óq«Ü¹÷®ÀΕ³Twb°³°±žsgûêŽý;ÞÓ%‡§À“ Þ,àmñìî7õ7:Ú„ÈÄjrQ§~-Wÿ·ÿÖ]%pãA¯îÒÿø»Kä\,Êî¢ÿïÕ¤@ßNËX9gðг›226KÙžݔÌ]„] v~~–êŽå,#)Pw@W—°ˆ.§¨:,š‘ »t_E,euÉ'sw9h u·c6+P΢w×êß­j…‡œ˜ÆQxthxyÊÂOZ¸i Že)ôdM:'/ò¸™/qK™ë·"x,g·”Ð0ÞS%D àÁy}®˜/£âe(g¸MKØ]Dåáì$ên‡£?Ðmsø{x'®íß¼FÞîgw¿·ýÉÝSXÒ´ø»C’ÂÃò»‚Qã6¼LKxWÆ6ag®,÷Þ™²cö.õï\)«ac;6n—³<+û­:&ð~ó)Txÿ”L‹RÒÞóq×Ýc‹çt¿ñè¿Ñ[ï<”cxO…͆z;8­—È. n¡¼»?úoµ¬õÀCOð ´øyÏU†ƒìÜù¢Ô.ˆÁmåØüQE‡~T¼TËX(»Sqäûó;íX¶®YŒ°kŽMQv1d<”»óAcß»ƒºk•³èßx;È©·#vR;±­í'ƒÊ”4:–M ×·C)k#de…;·#hLg–Q3+úÙ»U?iqQè9aB@#)NáÕ±””Å£y‘ »×ÂŽ¯¨=º¸.¾’2{„§.­@O{x/1àýþ§I®îl5!à¾Â…ý'‰¢nPtÛù>-eÿùàwt/Øýôïþ6©»?ØñÔîi[£œ•9\äð¤œ}ÄóÞÜm®å¬»`»ºkvuGeçaç‚Æ,g+ugûï6¾Ÿ WqUw©œ}z?’rožåðƇ'-zQ‚µ(éV|ˆ‹ðœ#Æ4b$˜Œ@~Žeª?èÑÁ” 1È)èRÏN£' xc°Ã÷ÍP±žt³”"(MTxØùÞ ‡ÔËYß¿Û)¯”°}ØÁœÀÚuÎn g§y;»r±‚ëÛv¼¯BW@ÉF¨;›ª°Ü‚Æ\Õš¬ˆ—R­ÊzL0,8¼MI% ï´p®m^‚_|\Íd/½ uÃÀÛ^Nqa•^]ݯSØÉæ“Cdó‰­iÇn»¶AØaíSvébž ;¨ð¥¬ÍÌ©»Y·î­~à¡7U)'+<Ï—µxÂz^å|zàçÓ.ÑlÏÿÛ¬?+,ÓFFJâKu^“šä"èÆÂÄC° Ç`ñR`çЕ¥º#ì|ïŽê®UÎn'Ñ6(¥ÝòNËØ•v¹_'ʰ;PFÆp Ö´SÕÅ2¶‚]Þ„âÆ­RÖ–ø¹ÙYênuOšè^1-ªõN­Sy¹´MÐSðz>˜<½Ôçsjïa0Dém. ¬@ïPÞáz¢ô`@ W#%ë3DõAÍáåítZ÷‡;œ¢eìSd²°{Ü‹WeG£bs»‡¨²ÄûEYùä×>±Œõ°³å%sCÆ%†R6׋»û¥í(%l¼MŠ£Ø ­9´˜¡Mý»'ÖÀCð.-KZúTx²· Çò–àã•…ž?Cà›7¿i8TÿžÀÖ\ìÑùñ°˜­‹‘“–gciN,ìZ#d^Ývtf±ŇéÎRÝm-ÿ~¨n;‘Ã6/ðL%¬ƒCŽœ]CÙiÞ&EºvQ#(:>&}»4/KYŒ‘¡wç7oÕ•´Âj$¦…*<›´0• Ç¹ÚèÙrPo|ec2€gÇ w°Ž€aöÐÛR”&%ž(jcbOõöômdìLà>]æeŸ&@|ªÄOžô’cäm­g÷èç7õí»‡þ-Œ—TÆ6`g·Åwvþr*;?BÖ_òÙÛ{§¥,Ô³³}àÕù»\Î ðîõ„Èò€È“;”°C…‡]YÕnÁâY°cÀ¸Ànxf¶¼ » v—ì.=¿»äò ð—Q³d:9P€{y ná&íéí›ÀÂp²/sÛ鳣à“WðCœàóGÁ–ü»*ÃR¾RÕ=$‹=ø™vT¯¼€§»v°Ø”]]ž•%ìôúE· `Ì•ÅÞ» ît²"©»²…ãdŒ£”r¶dðú Of¨<ɇ  ÀÅ÷öÆè•XKŽÁÍßÖRqü:"ìZjnèf•°1T¼\°ó PÊÆ KÙVïå,`‡ƒ|FNvéÒ§êxµâÞûb@Ú|ÂEžiM»ÝKч^ÈÓ0)ê¾ÝV“ŠU1Vvî…gU°»ôÊ‹tÓ®*<,¦Äh™®$7è™Â±Ò6çòRLÅT’mÑM* xšiã>Ë\ô÷xrØ×_Èx‹½l)DLEøê£å*þ-ŸýµtÍ „“‹ŒÝƒS «ËMõ¤òU§KŠª«vÛá@Rve¡g võMd¥oç&*XÊú1²XÊzuW- (󳌣¨a¡ålqhï.³´¾¤Å*o zѽõ}=¥y 8TžŽAŽ*®5%áûs-еzuSJX¿µ¸•³›WÙ•²Œ¡ø ±Wwpg©î^"fäD{u\ËîîE 8ÃnoYÑþF»€‡wRôagûí;n0ökŸZ°›§”Ý ‘”s‚²ì.»êbÝæåWžWy6Ÿ@Ð00Êý¬42BoÏÏîðS€îŽÿVÀW ˆò´}øñ¡2Ó©@Wúu妱»¿Ä÷kÇTîH¨êN·sƒñ0ìò]te«ÆPwÜy'};½Ž±µÝØ©;º³!pœ#)x0. ò|iÛRzz> ìƒÊ~-Øâ,å?¦ÝÖ©ŠnJùJc"fì<ì0Aá§(:î·ó“4)â&Ÿ¹£²c)ËñTuàèl%»•°i-»³O vr….ñt9»RÆØyeg£cuÞŽ”¡m(«.’ØÁ @{ñåt„ÝåW_R€‡YZ-k“ÊËæ…/m¥ô£¥‡‰„Ôcž-;¸¾ÔÍ °ÜñêͯM!ò8–í—Pq%S—¿Utý©‰úÙU§bn> ¡âêºÅ>ììž —·KëÛíúEÜW‘V¸’» êîÞOôîìó;^߇5àX‰­fXÔ Àk©¼1è±ÄõÀ‰Š+‚jÞ¿Ç7-™ªèâ5ŠCªnì9ñ[‹º!ØÍÊÆ€1úv€Ww(e£3KuÐñt »t¢Þ0æ–wú@1Í îµ«a—î•Eëâ'Ë » ¢ðÎ>ÿŒî¼‹Îî.¼ä<…Ý%W\¨Êîò«.Ѻªð°½£vr‰³ÐtŒ™” Å•)¡ß#ïõ×*t\Ñî•Ú.zî§ð7ݯRv;t÷•V`µ_B—È/#üBÊÐàzzcJ/AïÔ3ßÞ+oyÛ•Ý[ èª7ÏÃé£ÒS{ a3 €‚`SþÜœ/W½’óe«ïÑ1@ÌLݘªƒKv*ì*ž:Iø‰7)Z®,KÙVîΗ³øóÞûµTÖ¯+÷PT%¬Ÿ ˜»26†R¶¾P{V »Aöà&?ü¥ow®Á.¨» x2Ë©ác-kO‘¹Úl^$è¡ìKfW¡Óien¥®zpb?mè%W3ù—©\n€®ð÷Yº~žÎîœàq¬7&z“ʼnÕÅùír‰¶©:[÷d=»úºÅì °ÑGÅ/ K¯pГÿWôxz­ÒÀ;[úygÜzÞÈè+=@ïÛ5¸ÌÒC/ööØß›?ÂjL¥EÕ6¸1Ènþpþµ5)AEUËŠŽªÎGN¼ª‹±“–ËùX¿Ì³•µ›;–²XE£Q”;ü½º1UWgìàÄÚ" ØíŠvwqbq'…,òôe,a‡¥kvh¢±}î(eáÊuçY”³¦ð¶×áu½õž*OžÔ¦òÐË ¥mŠj”²'¡Ç…œÁõœ»¡¯!ZÖúseÇMí¾–;'R¦Î®¾,Ûo;±È‰.ðô°Ó~·Áι±òXã1Çc_8 =i/˜Ê»HCàªô´´=_M¦ ½Ê»Púyòÿµ×Ï#ôÄÄÐ~ÞéÖÏ;é”ôg^óg==*=žŒ)!¼êûz,q >ö÷¨¨ZàR€þõ³þÌÛ*Wã&“äZ1ß§keëââΡØÉ¬–Ñ“¸ß.Ânwóv v,eiTøÜ]„ž·Š•á.íìnHÕ9Øí¸‹­zÂÅr*»+gáàyuàQÝEà]yÍeZVA¨qáTžÜœ"Àö^Û¢’Ê>«¤*¹Æ€²ÁFo<ËÇ ƒ2“Uà”¿Áͽ>—Û.KW™IÕiÌÄÅM¢ªÓ鉒¯+ۊøXVuCÊ®ÀîÊk/ë®ìx;OUž@OUžAïâ˽ 2ôЃÕ~J[QyçŠÑ@ÌBcùÙç˜sëU^41Š{Kè½Õ”žƒÞ,ðyøE@yýÛÐë SÿrHÉlþÄÒu¨O7¦ê¼9ûu³JX»¸ÅÇO;oRø¾KÙ2n)¼tV¾ÚÒÎWʘØ+ò–â¬êdã‰fì; ÊŽ{í"ìæ-[7Ø8JY<̨8Çb(,gÑ»sfžxxÞWnÄÂ¥1ÖÇCn,™^åÁ¥T(˜k™{ziüLÿÚü§¢*AeßO›ýg¿’)–§©D­V÷ùZ°óÁáÜ£kåê¨è†‚Ä t.v‚…©VÂú ´iPÈÊ'ù%rÕu—ÛìðzèŸ*ð`YYËÒÖTžA¯¨<11=ÙjsTž/mðUÊC\…*/:·G‹È Ü[ë|&¬ÞÐ`™ëßêkkêë"Øb?ΗªÝä|é:¦èbädJ Ë@qk@×ÚoǬ] v¾oÇRÖµ`‡×iˆXútEÕt„Ýy€Ý0&°K÷Pø­'(a×'ìVDÝá‡[ dîäIáÙEioÊZôž´¬µ^žª<–¶ z6vV«½Òü/Ê*÷øztå&G¹r.®¥âÂÛû—þ¬î±B×ͼrB¢]úÚñõÇÍÄYÑùÉ :…9.P\úuvW_EÇÓ‚^­òx¹—'‘! x„^Þ@L¥Ry x^å±´åý¦01ŽãÐ#ÞÒ„^45–“L-hM}/Oã>:_¦¶ ç{tŒ˜,t­|ßx‚~ßi‡E~‚‚ÊÎgí"ì¼# Øù¾Ý”R–ô¦DQum;á˜Øî¢êò=©_§%ìÎÛå2vÛíyãØVÝr(»›ŸÅowUw˜¨%€Þrw k9 à%w6+<‰C¨S‹¹Nª<¨ÐÀðÐsSÌé±4t°É÷´Fƒ#¨µ ×PkˆîîWŽ}ivn äŠój¿¨3.ë¤Ë©‰bLh˜8oÊZÆT*•'¡d¨ÝPˆ8f뢪óeìR•`çM ôíÆ\Ù@¬`åž¶™¸2&¤Wg%¬‡ôêR »ýNæÂú%kvPw§Ã™•2üÖG9Kàùüwh =4бI7ÛkY+vôòªÒ6C=½F‰ËÑ«¬øØ+sjË+0™{=·Øƒs3­9B’>f t¦âüaG·Á´¶›hàº"ö%,~ ¤Æ®»ñªgý/ÆSD©cúÂÅSj·ö ý¯3¶LÞ¬²6«<?ƒÊÃV]”¶01pËî=€‚ò=²”†@8ôzÿ1†zqqôË+¹¡À°\Œ™´@ç{uјˆªn9”ݺÀðã ölJ$6‚ùºhL¬oØ­ˆYßägÊ:" x9—ÇCÀÃÊp¬#BÏTzy40PÚz¥'¡d &;µ§ÛU¬·§‡t‹—W\µÙAeæKШÚêþ[†Z¬ Èù²5A.û{EØêzÌ”¨zu~i§ô8 »©À»šNíP /åñ`0©Këóx€×Œ§œa‹¢[ˈ '0´¬•^b*Py%«Ê“Ø­G€ah×Ã/*À!…_ßú±Lœ_Û4ä¸úÍ&] Sѵzu­v]ËØ!ØM)e©ôâlîÕÅlªêvU·ƒÜ.&7ŒaµTÝúPv+;ü Ÿ&=ëß©q*¼™ÀKѨ< ¬•Gèù~¡g*HïXMÐ0ÅDèø%æ_TéjÃ!8†·÷†ƒ–ÒYÉÅÏ_ÆÀò®ºÜ££óZˆ™hÔäi¥“:±}U§ ã™PÒfà1šM‹<íßÉÉÀóY¼4[«¦Eš­-y¶ª¨y²69¶èåᮨaàEÐõL‰¬ê$nU'#bët+¢îNuwª˜:Y!ålƒ€ÂÑ«Ò#sý2B©z!VþnÊ­¥ÚJ?®ùyÒ˜.8®ºÍ„¥«•¯yþµ è<ì²¢k/»³Ñ¥M°«€‡°·»XJ=^V‚ÇÖ¿sÛS>†K›¦-†ÞqA…G㢞ET`^À±ÅÂI¨<Ü€áto àÏ€ñÏcj-–¥ñãz°yÀr<r±lõ®k,]ÇÜWöé|ùÚÚTÜŠ¬oØx˜õ«œrŸN@lj‰uÙN¼T8®÷½wo—Þ ÜY”³ <ùm‡Vž/ÆRJø8¹µÉ±… bî+ní}ŸóÐðL塟§&ã*zÞÔPå`Ce£`Ä@K`ë¿Ó!ü7ôåêéˆÊqíåéÊÀÿoKÔd pñßfoÖ¤……ŽëyZëßÙ¤E1,âxYž/gýrÐy€w¤L^XY+}_2!Ššk©?—ztªèAÀÏ;ÿ¶ø˜Ås%m{–ÖOY ôï|$eÂ<­/x–ÉSà‰y\Û½$ŒÑ&Ä"h xÅåÿÜÙ¸ñãÆ—œqõJnVÙJ3b tCåëUç`6v}ôì|,…‹îkéÕcb^h-õí×;ìð Ð|Ƭ$~¸³Â^§ÕîlŽ3ìŠ÷~â?ê%Ϧòd͸BOJ[\Hç–q•¨ö’âëÁ/+¬?Ÿ{Ën©/AØôßø¾­µÕ+n«–«ê¸JÎQ° 8§èvóƒîº›®n±êã O',XÎæ9Zsgý-ËÙñHJ½@ ÎÓF—ÖoOñ%-ž†µg>3ˆ¬e­lØÅ XiBÜ‚Ô cYU·¸äZþ~ÌçéZŠŽå«ïÕM SÕµ`‡q1„ŠçÍÙ=è|ùº!JØ!;æ¸#uíÏ,àùð1òxTy,m9jFðQåá¶,ƒžïçIy›3zˆ¬¤7*>ÃMŽ®ï—1ã–Á±?ÓI%ªª7#q󭌔ø‰º/A™Žr]³t-3bàuÎõ7_£‡çKýX¾Ÿ–䑲G1wÖfhGé—³e¬ÌoL™mX,ðèÖjY+adÌsBå><R³`8ÔóÓà =9öå¸9¨¹±xÉPéJÈQÑEеfbg™ëv! ×ÝÊ«ºƒÔΈ£ \‰ ±¬Gt!} ¼RÚ¦¥“i¾л÷“^¬*ï>O{™^¨ýì¶™È÷5–ÃÃ#ÐS§s »á–k»ÖQºP²N]z~†¶rgv~i@sž_eý»âО–WD­…à¡—ËZ ##¦‚m_F`Mù{üþï„›\Ë„ð 9-䦂=:öéâZ§8&6Ö¯[_°CÙÊÒÕA·2.ìŠÏ˲VFÿ.·Y1‡—‡as7bVJ[SÜ¿Æ÷ÞrÏ©©¼—ê%2ÚÏèe¥—Ê[\B£áä>”ƒt5˶_ŸeKF¾¡^÷2}ÿßÞV2¥1¯¬ÞBnN•œ¹¬å$Hë×l_?@ľ[œ˜ð¼ºf€ÜrnzçõÝ-·ÞÐÝ,öoãÁ‡Ïó‚‹XÒr~Va'¿ðÿ ¦ÝÙ¶ºëïÃ#ìümføYiyÉc)Ìâù’öà·$}¼r<Àƒ[‹lØÃ†1'¸†JüóĆ€678ß—‹èZ9º–ó %G5×Ý KØqq'óuÝú‚Ô WOJlЭ¨ºC2=”)ø¡¦Âð°ô“tj½ÊËŽ-²]èå¡W”žd^þfRy¸ Õ ‡k“ÒSµg==íëeð9Õ§ËŠâ»_TZMH„3ô¶½¬ûqºr’ÃLE ÐÉ× µ¥°ãIåg„ów€@§{ÇuÝÍ·w¼ëÆîᄅ{×{oÑsë{nîÞ)çòº[äßÁåmñ~x¯òXÒæ•P9llÿo2ìBظŒ“yu7ÿŽSæŒ öñàÖ¢¬ÅÂI¨<@PЧÂXŽò}X’Æ—ìÅù—èÉÅ °ÏÐÅ¥œqB"‚e+KWº©.¬Ýröì|?oC+:¯ðVĨÀ'A“†€Ç’ó“¢)±¬í•¶ z¾§Ç¾ž©<¹Ý¥­¸¶¹Ÿ‡Ñ3®¯WÀçáG%åÁã•VSVƒ=( ¸z%©¿òñ<àÊ…9ü¨D è;ž z~_Vv x ¸rïyß;»÷¾ÿÖî¶¼KÏ{qäïï‘s«ü;•@‰r¸Ry¾çÔ®ƒJêN/ðaØX7³wWÇQ°4‚»ð¦”³~E~úà1b)Üœ¢#fNáxìãÁ­…yQ'„_=†à5Ô¼z#àZ‹aá¨æb.ª9ߣcéA7O ;Ï"€Y›Qü¿/ÕE]î÷[1Øáá·òLà5TÞ(ô’{ èÝë /T•‡Òö7%Œlý<–·æÞ–—.nrr©úhnä ³|VúÖ*,–žýgyªïÇœf}™ZJU–¬š#L‡“x=¥—J\Ï«; ¥+`÷îÛÞ¡P{ßßݽÿö÷t·ä}ÝG>þÁîÃû€þùƒ¾MþýÝD(>€%. ‡ýx¹¬uK?ó*(^Ó˜‚Æ\íŽ6…n:fØX§+ju7”¿óålÜ–B࡜Å<-sxºD@\Ú!àaÔÌ€÷*Ýņô¿‡þÜRfcj­5–¨­žTÜ’äZŽ«ÏÒµ@‡˜ £&-c¢UÆF'£bóŽ‹ÍßrCk©oEa×î0€ÂæŒÜÇ“'…Wy¹´Ež ;ò’‰¡==gf°Ô5•— ‡ÒV•ž@/»·„^rqQæêa©›®%Lý² ¡\^X`­—Í÷©Õ›–× nµòÜ!u A›‰ÙÓóÀì,ÂJîzo÷!ÜG?q{÷‰O¤ûôç>Þ}úóŸè>õÙéß?öÉ)ñvP{(uQÞ¢§‡ž!zyZÖ¦ýwŬ°q?h\ÖºgàviCJKÝùü/ç&ìü”—xX €àqžÄRØÃó Oóxb\ ‡”/—ȈAmyHáÏ„C`£Á_lþ¥Wq1RâÝÖ±ÒjΛ>Sç]+[×êխЄKÔr¾ßŠÃ?”ǽíUxø!F,ÀÃ,-~赬M#fÚËKw™ò2gUy z>[jà³d?νžðÍåÝûIRÚ>ù%¦ôzÐ+jï¾r™tÎìeø•^Ÿõûx¬¼¬NŠfþßâû9Èåï?¿üc\8„ÝLè%× ý7èס„…²ƒzû¨íS¹Ï~á“Ýç¿ü™îK_û|÷•o|Q_âïŸø}â3í>ôÑ÷w磊¾T"+^6,ò¥=nª"¯‚2ØyuW]Þ“VBÍ£îâ⌕)ðdÝ{< ckÊð°6J'}<¬*ÂÂI¥!€M æïð÷G EJZŽë,EÈΛ˯SxË ­¥~¬‡>!.^鯅Oûx²@€Àó½<º¶Eé|²þÐÓñ%;Þ=·ü‡îÞRÚÞûIÿ(å-úy(oSOï©[¥¾³z¦ö´ÌÕ#ðó”™\Ìåòø2“J¬¢#m’cN;€Ž—äxú2 ðgø¹µMZê¦>žÂNT@…ž”Ú¥d…zƒšûâW?§ûú·¿Ò}ó»_ë¾ýýotßüÎ×ôuø·Ï}éÓ ½Ûz·IyËžž/k ðêÊJȘ1”r5ãìÖ¥g¡ã<¬ˆJ{ñÞü–ðöÓi ˜èáAá!€ŒµQîQÀ>6Ü•A…¿·TZ,Iù~C`c™:9ÄIxZFÄ¢Cp؇‡}é:ºå.][à[*¤–ëý6솀‡‹—ñƒŽßðªòZЃBHÙ<…žÞffг{OS™ëÀw¯Ç?_TÞ‹äHi«J/õô ô¨ö4¶’À§ñ•Têfø±ä¥L=¿'+‡©k@Ú9Ⱥ÷ó6u™ŽÀVoK«¯xwDŸ[ѤLÐóFTÊOï]Ò·{¿”§‘Êî _ùl÷µo}¹ûξÙ}ï‡ßî~ð£ïv?üñ÷º;~òýî»?øV÷oµûò׿¡P²Ÿ•Ç>¾F8ã9ŠÂJ¾’‘ê.­sÏ‹\ï.-üŒ°‹7–ŵP¼ÈG ¹§¶ž²pÀ“Ñ2LZàîÚ!àaå8¶¨àv¬eé$ÁÁ5åïjl±L‹”D·µeDøþÜЭϸÉjVw vpÌŽ– ‹ãOÝR—uÎr_°À*~­‡w´¿¹<”.Tyžwls?ÐÓ¸Š=€V<üîù¸¿•'¥í㥟—¡÷¶€O§2èä&ð©›Ë“KÞÁ¤ «É/õýâÇÚF•€góÁ¶þ*BÏ_^”KÝT⢴eL=<-ixè½Áxø°DOPΘÌ~pÇw»ŸÞõÜ/»‘óKÝ/~uW÷³_ÞÙÝ!å-à—åm?ý¹OˆcûAÉé½[œÞ›k…—€§¹;ÄP<ìÒݳ„]\ò9Å™¥îò„ûwò3¦ùh$Åöáq[ÊoÚ7–Õ=< 'à!€ àí(}<,ôý´yÿÌþ›‰@0V8fçZn+Õ×Õ º íÌnPeÇOŽRÀ;ö„£õÖ):µ„žWyz¾Ÿ§Ð³CèÑýË“ |ÙÕõ§ÐÛòù¾ŠÚKJOrzæàBíµú|¢ø²òóê0ìC«²Á×iDÆŽÅiä$àÅ¥y3IÚPÕž74=8´ÌÞx(i‘µƒYÞÜ·¿÷uÚ÷x?…÷SÞ/v?ë~ö‹;Eáý¸ûÑß×·ùм-ÞÀS…÷.)io¾Ö\ZöïrîÎÚ øÅugÊ.ÎË¢”m‡Œ½²«/í9^^PÊŽ–³ +ðLÝ)ð´gë¡8K‹)X  ±1-ÐÃCÀÃ=¨F §¸Æ^ç¡Ö‚[Tp17×êÍEÈñÖ0¨¹1E·¾ÄSTßró~œU;+i¼ÃxGeàµTš×tm½‰Q«=ÂÏžT|)Æ’ã,©ì½ç–„Ê[Q{èë¡ÄÕ€r_*u±9¹(¾dp¨ÑÁ²y>;ÚûãpÝ'J!zµXýy«jÁiµ FÖ¤Gè5Õž»ÓƒÑ=<ôÚ4'=<ÄQЇCÎeê·Ä•ýÁ¾£`»óg?RU÷ó_ýTËÙŸþüGj`|=<‰¨ —‡÷}÷mïÔwýM×HLæ²Ü¿«Ô7;Øa\P·‡Ì]+†µßÚŒâGÉ*³‚q”tów6aàѰ0࡜ÕYÚࡤ5àm¯Àó*lÞ?C­ÅC¸Å~œ“ )9BŽŽ«zsìÏr¢|ÝЫtüB¼#ÅMÃ,~S³¬e/Ï—¶Þµ%ôèÞøl¼.@/õøTU¤c*Ðò_÷xìsE鉉¡JÏ w/53 z¦öjðiŒðãÉe¯‡` Bë¦ÓSˆáõQí{¹ËÆœŽKXÞ–ýv§Gu¯óz)ž¢*OL  0> ù;DR>§¦Åzß»ãÛâÌ~¯ûÉÏîèîúåOºßõÃîûÂo©ºû¢äñ>©ÊPŠ7Þrlf¹JÔÝ¥ÙÅ×Ïñ1ÍÚv¢Ä vÉ‘uÊ®;¹¨Çî^pœ]èý¢Bàåì]š®8 W4ær–<3,J$åIÁý^᱇à!€Œ­PR^73ÿ>C ®•™Rrr­¹W¹•ˆš¬¦ÞݪƒM 4—‘ŒðXÖBåUГ˜J41jè!«gy=¯úàæòh雞xbžÒ׃™14¯öTñ±Ô…âÓ#‡†—uQã.^šËÜØ#n'h¶#ho›žð¼£›U^2/ òÃC¤ÐÂô ‡Òù»ïþð[ >ÄTàÎâßàæ~üSÑ 2ÞêN3x×]! ½DËo¨» »PÆ6a'»ž+{Z½eh²ÂoGáõŒfVX9k‹?™¿s†Åþ’Á“+‘ÁSàÁ°xÝ«´¤Å…И¶ðÀÃU€ÊÌya_2+ç3sóB.:®«AÑm(u·*AWÞ!š†ðð›ÀÃtìå"¿í‘Í«zz)£g೬žW|úäRÕ—á—T Õà=û¼¤ôôDíz¦ö’âë©>§ü²Ã øÙ1Ç×&;ø:¯ù:5Yܾ¿jLcŒïíeSÃíd¹‹ÞÊM¸¶plQÚ¢—§*/AÓ€€°}õ›_Ò°1¢(èÛ!ÂrûGÞ¯½;-u j_7¯\ô=;»? y» v¸†qv¦îÐû=æø£ò¢?; ug÷X˜YùÙXβ§À“9Z 'àYðØ\Ú¼mõT)‚jêßñ¾ñÀlàA™:TªF§5–­ÛÐjn»vq‰ ~ ñÛ¿YÖª¼”Í#ôXâ2¶ðyÕg#ié$øñIWTàÝ=¶xvgÐCO9½¨ö’âô2øPòBù±ß˜• ôÒ¿>ý9÷Ý‚S.Eð3ÂzN:TzYñ¡¿Ç“îõý>€”ÊOôÜ4 ÷ñO}¸û¤LR`Žö32b¦³´ògLW  Œ°1ÜÝ[ßs‹˜¯Wuâã3wGuÇ6B¹,dí<ìbÞ®;ü,K vC½;ÞEKu—Í ÙWòw©·ŸíÂÛK Œ•aÊ ïU¯.ÀÃn<–´ÊZ©ÖŸ=Ôâ¿jn(S‡JÕ–Š[€Û°[ÕªŽ_®ÉÃý¡qU^¯´^|Nù¥9KÞøгòVÀ'fÆÐ´ÄUµ‡þ^CõÁàHTð±ôEù›úÈøYÎ/œô6¦@­çèg„¹BÉ÷ó†–"Är7–½¸9 G¡•'Ѓ*¬ØÏCyŠM(X €rR³Cl/aP`*ƒKmáü,ƒÆá‹¥,Ú Me‡¨‘¤°«LŠSOèN<åxUüSKY]•ÔÝaQÔçgcþÀÃ.<‘,Åh&-ZÀ#œð²°ø:¯Ú"Øh6øe›­pð†6¦8±+?Y ã¹ÿûjoƒÝ0.PÖz•ÇÒ¶=fô¼Ú«FÒÒÑr·”¼,}ãË{<&AOÁèý}ߨßKàcŸÏ—½tx>Lq¨ñ1|° Æ/Ehm‚©•ž_ŠP/FÈÐK—ååW6@+ô¤Ï†BO{zisJÙ‡‡]xïÖ}xïyß­êÆÂ à²¼/>ŽÂN>§Â.ÄO;(í8E±î°c){¤þ²l•²€]éÝÙ²¨;Ž“Uå¬ëß½&õï<,Pàio{5-¶I@NŒÌó’ïëKT¯àZëv/Ëo¯)Ðñ‹Ýï€}´‘ŒßÆGHHe-{y40† G÷Öƒ¯.u1‡kËxXò޽¼ûcž%%îsLí¥2×ÆÑ ø¨úŠòSƒƒ'ý¿ðòI)ö’Jã8#œd?œ–eê|p^ŠPf„ý6ý³+{sŽO×Þ[x™–ÃQõ==¨=dé øn~ç š­ÜxP¾âßQC!¶"(šµãn»¤ì;À݇Š[ÊÑ“*~ÒPv1sŠº”Vw1Ž¢ý;YïÃÀCÿ¼=^¹›îÄÛYFË"ð%*±¥¼M‡è²®ÏUMó¨· åÆ®IÐñ‹ÞWÜ14’ÑÇcYË^JÛ1è1˜ìÁ—á‡ÕR<=ä÷4×ʨY/ z¢ö¶pÐËŠÏT_)y=üRžÏAÐÌþ‰›`´´¥‹Ì ‹ü|p^ŠPVaqL~™VbåÒ×íÔsZ^Ÿ–¹¢ÎTí]{¹*>54h×݈K}°Â—öÈ•iU<Þ ,sKGÖÃË¢'š§l”±vqšbJæ.–²Tw\öÙTw²!%–³)cÿ¡ãAàI"œ˜y‹‹Y83?ÇºšŒ†¥ÂoÞ@ðÔ·_Ó ã¿4‹‘zGéaeíaZž°´ƒž¬zøÄÍUG½!wødãK–UñõwôßtwôßvZâVjÏŒ ;K^¯ü@)SÐâ.vZ3ÂÚS$ôšNé2l±¿ †{ËJ¬´p`ET Ë_59’««¥.TÜÜpðzLP êPª›°Œ-ÓéžTƪªs±“¼ýÿ¤Ë~WvK‡gféÌZîί‚Â(ÙþrK™s%6cžNX¤þ#)Xõ¾ÃNÛiIKÓOV‚Áƒ¯¥ÊZå¨7Ö‚r›Á©ðšúväü7(f°²ÖÌ –¶èç AÏ÷õ¨>DXcøx²Ú¯ÇÛüÆ£ž©Ð+jÏÊÜ\ê²Ü­”_Q÷”ò×–ÃqFXËë´Õ™†*=7)2m)‚­Ãâ>À¼!FWdõ×d±ö†‡¿ôHÁ¦wÊÚ©·»~_Ïž2U¿®;‘ÿ'üt²¸±ÓaçûvGä¾W¸÷c(%w§ê.sïê.MW œEÅúw(gKÿ‘“-àyðµàµÚÝÔY0›õïS!6ëí6:Èùo?lH¼ÃEC@%IKåµ ׎Ðãu}žD ¿>…Ÿ¨‰xü&–Ãþm zP{Ï à ª¿úŒm‚ÉÐK› =Ÿ_Œ` ZKÊ.@ªÀÆŠ¬´'°(CÛ =ztŸ MN¨ ÛK«Ù™¯Ëý:´P¦_*øåÓ‚]ï~ ÉböËXäí`RÈ®» FÅTuÇùY£¸rý»Ý÷ØE7#’‚m)³€7 ã¿Ï‚ØÐ¿oÔpk}sˆ`€)¯ò2ôä‡ûX •¶”ž73¾ ~VUøA=¤“Õ_*ãß ºøz…Þ£¬Ä¥â»ûìñ øPò¦²×àóìH¼…G£.¡á¸¡?\ Ç±8Baå² °¿ËoŠiþ9Œ@‹/uéBZ½UV;É€cbh0r’ÅòË'ÿ‘ÿGñnÙ·É/²vǧÅelì(mu´L A±q]Ê–ÞÝ>Ý~27»¯ÌÍr3 `ǰ1ÔÏâ((g±í»ð`X,€÷k¹„'¸ù¼Þ`—Y¯5jÂ-CY •‡(K[@ïhùMÞ*o1CyÂIÇi. KC¡ö¨ø~’ÝÒ'Rúédõ—œ@ÿw¹ÖÛzEí üƒ“Ê]éóÝ]{}©ß× •Á­aU=éî…žÛììgƒ¹ ÆÏ·#´Vcy r[ÌàKn•I/™ ̳Èi+M: ÿ§ÀwìÕùmÅÚ¯s°ãE¥ìaÐv¥”5“¢ôíJæ.mDq1”Ò»{c·O*esïa㙿5ÅgOÆX¨ül+®!x ½Þ¿oùx¦(QRA/®¾"ˆ[óÁ¾¼m-FÈãp\ˆwN[ŒÃÀZzéss-%§Q|p;FyòxXŠ›œ”`ǶA§ù:§êüÆââÆb!€õìÆ”FP¤ÿÛ‚]UÊêÙëÓ (ÎÌ"wǹY ç(Š©»2]1\Înl.íÚ#ÈüŠQb`Ô½¼!è!˜lÐ33#«½ |¶| ÂÏ h€²¾_ÿŒ½¾¼¯Á”‡Ÿ§=<mõU)kgm‚‰óÁ­©› .K|É;e9BëmZ³Å~Ü.‡†Cx›q*º<1AÐÁ˜HkZå똪óE«gW9² eØ¡U2«”-cdâÌæ ±©;_΢wÍ ª<<åÖºS»±±v¿dÜ!•è¡ï‚’$+= %›‘aÐ jŠO’÷Œ°ÀµSàgpbß/‚«ýz+¯ÜÁÇsS?G*¯ñ¹=øPZ•ÕWÓ6ÁÄù`?õ‘á·KÚK  qžxLÉeйL£3jÒƒ»a¬ ;Su~ÕÓºÀŽcíÛ¥õO(em#JRw²ä“cd4.ê®.g_6 <ÿì[Kð[»ÔXÃ_9¶ËBåá·1J[…žÌ>B%¡\9Г`2Rôˆ!|¸`ù-s-¾Âøðø‚µ ´ÊŽW‡–êw‡}ÆΟ#=Aù¹ =@›#s~Fxžù`ˆVøq)BXŒaåÝÞÖ¿•ו­2-ÀõJV7¹B57 tvb¹p§l*ŽÓ­½vzë˜ÛmWMR„ž¯]ìÁ.m3ìl„Ìî¬ììÞ Œ‘• q4+†ÔTÞØSoµÁo cbãùÒ±™¿yñ›?¨(GÐtöÐC01èAíùÞž/uKŸÏ TàçAhó˜õ‰p¬þÇÎÊër Hpðõãk 9#]£WWŒ‰8*†@ñ¡)Tl÷Qô`'iÎÚyعŨ²#Ë€qºœ°ãF®€â’Ï¢îv˜dVø’vʳqCÁoÊ×¶x›~pñ1"*øAE@T¡'Ñ@å!‚ɽTâ&C¦F)u-°l§@È«¿òg–OõK¥Wo‡²Ù®|.~N[-އ_ó<›`¢™ÑZŠ ‹ÜR„Öb„ØsêÁälµÖÐxÏÓBúv=×£c^1^ÝŸ‡õcb4& vèÓúÙXWì×Aé«A‘nónlVvîŽY”±Œ xWVŠª”åTE¿w·Ív[÷rwË97ºÜ\á§íâÓ-õ@y^~H‘†GÃ*Uzèé ôÓ«À‡ùÛTæZ©k‡}>šjt€‚µ23'°uLqð°±·DÀÁIæçÇK›3—kMøM0þƶO¶i„åZŠàóq³f‡ãØBŽ€s ó÷LôÄþ¾XëƒÖó°m¶;ù¬ Ó ´“‹Y=iÁŽŽ,òv ;ß·KëŸb)ËÜÝ”(ЇÞRæï· ?È@AåaÜ?¬zèéÁ½ENÏ Wz{ZæºRån D££¡© ;mµVþ=ƒ-)8>1r€mq²^ÓÁZšãIé7ÁøõW±¼õóÁ3—"¸ÅcK¼ëëƒÀ­÷ñ‹ãv¦æä¨9ž4ÆçsŒŒö0²ãÝl¶ LAËѸI,aí—Cü-ªwRØÚ8øyàEÚ66V²vvjRø¾Œ±¾ÝD£¢g«»Y=¼Mø)½øÖÇüÐa¼¿‰±6ª‚Œ DVœÚƒ¡Að±ÔµŸõùØëc¿Ï«/@pèx°ÕoS$Ÿ”W9P™¹ôÂ…ÏoÖ~$ž6#\Æå¦Ì-Et2Œ¸f—"DÓÁ;¬¹'ç ‡ÀpTst¾|-¦í¯óíËÖÉÁ/þÿÀ/ôÿÎnóª.ÁÎ+;DOäøèÉ ìÜÅ<0Æú§áR6î½Ûù¶xf/%=ø­ ÇÓèçzèéY‰»¯BD{{©Ì5𡯃_éóá S˜Jß&8ŸuL)r8`3 º“&”K/v> º„/¾”Y(½ü&…^ŠÓøžçƒ’®'CÊ(\½¡Þ8eB|›þÇ+Ãüe"Âb%QÉù FzJéʭĵ)áA§Ê.©:Uv¡„­¦'¢²‹¡â䯲g׃o!ì4`lNTv,eçQw‹’vãåÑŠ|g(5pEz.jb$¥‡`²‚/AσPa¯?[Hw‡j¬õ²‚˜šªÇr¶ÒH%‚Ä¿ë3áëåŒp—Ãú+¬³wÐËóÁ9 è·ÁL[ŒÐ×¬× ÍWcvÇÓ±<ŽÓõ§M|®Uº–Ñ0:°:ÂΫ:މõFÅB줚 ˜;]û”`çûvÌÜq£qkçÝbMùŠ<ý7½O‚DôXP‚¨‰¡JÏŒŒ ½¤öп!ø+w#ü`tØÑò—‡epa° Ö5ÿþ„›œ:‡î Wf„Ý&˜4¬Ðócr)¨j/m„‰³Áý™ß¥-E°Ò”§?cœgˆ1Ч#y:Îö¹Åç‰Ñ3yhJ°WgêºéŠ”Ì.NQh°˜elRvviš‚Ëú°ëo4^ôï6=­Øw¼ÃÎÛu»Ë%ðjbzòÝS{| ?íñYŸ¯†Ê^;o‰GXZ fþ}ø±*À¥ÏÉϯ%¹ËÕ›`P2[~Û`|X:nƒ[Š`û××b…vêx]YÆ9¤èr¬‡=:]Á@—&&Ê,,³uÞ…Å/ùå•6žh¿Î9±ÍP1£'„Äœ˜µìôBžìØ·Ãõ‹èÛ ­€Z(¼CÀ¦÷‰ðÛ¥-úy¸TÐCO¿Á=ÜË“ñƒÏþÀ‚'ÁàšÃëöþZ‡Íñ ÖT¹…¡OH>)Óçc& _‡Î#S¨ãrir$­¿‚²Ñm0.78¼ féKZ‹JyZ*ø¥YÉQi¦û$xNŽ–¤q¾^;‡‡¢KqöD­u`f“o˜Bö»ìJä¤UÆæ­ÅŒž$76ÂŽs²Ñ¤ð»îæ)e†Å¦Ç¥õöã·. BOË[ùAFdEK\§öP6|xB컿ÜJ…›©<UýY´¥:ªkUH…Ö{ß7mÒ…ú Ñ;ÜA¢Ÿ3¶ f¿45";ÿÒ|0ƒÓÕ6QH:Ù‘.&ïÏO[ŠÀåf¥<õËÊÇÌ¥ª[ŒÐïÍ•°63ŒUÛ9Ü2ל=Òº¬–ó/[ÜÉ|þãcü¢Ã/ð¦õì´ë5ô¤DA_¦¨½×ê½*>éï)øä ¡O (?Ÿà ‡Ê/†"U¡½äëL5æÓøx¼N²~Þ¤<ñuäaNŽzè'BéUóÁ®ÄuK¸ÿo~í¥~ùA\Š0¸!m™ZŒP”\=yBЕÙ×’§« ‰V®.ÄM¸’Ý~yØãɶdììòÝX<¨ìì\üį}ªMŠþêöì6-ælÐïv»·év– TP¥'==¸·(qUíɶZüÀã·?Ê.¤úu\›`Üú+›¶ž^YŠ`«íih”þÞ¼KlNµâ*++MóäCÞ4S¶¾h¹#tßcH;²óFÛjÂ<]thh»ÀÊ×JÕ¥ÿWµª+÷P(èDíGØiÎÎÃn÷»Ú‘µÈÆöÜ-€·jѰñ~aH½gèIF#A€î%øðƒŸÁ—á'›m±Ý6+?Q.“£Ûk”Ä¥,Î0Ã먡Ülpås¢Ü¶² ·b¥M0zù` G£ÌuKOË\0çyûKéÓ“ 5¶—XûÒ´ž!vsÃÅ4 üôIVs„œª: ú›N‡›¦Q:íÕ™ãÎk tv»˜åëì¨ê°€ãbvNÙµâ' Øm¼ÜX³ß~Ë"#Eè¡DÁopU{|(u|©Ç‡Þ`£§R¥ü5Ø?ÄœZƒb+§†>§ùpÐdˆZûyºÎ>•·y>˜#ru™ëK].FàF¿Ë ƒõµ¡¸¬ý±:›`i©9s^KžÎ4z*ÐÉa=ü_®Rä cÍ–e¬‡~.%~²œ;ðÖì“qñ…¯Ì#€ßÄÛí°­B½˜]¤LAÙ*Ä>äö|z?ëñ(x üxœ´n¤ M¥Õǃ¡‡”¦–\`/¢Æ& P«‰aÛ[óÁ¹ÌÍûÿ–s)B\šP6¾L[Œ`Ù9+á$‹®nJÙÆœQLwòGW9ÚΔðlÝ«+÷O°|í›i6ý:”°bvÁåßq—íóB,n]¦=«|]oežë‹Ï’BFšÏèë©ÚsàC©‹+,wñÄÀ“DO¥þÁ¤Â2 ³JsJŠMA‚-ÁÍ÷”ô‰)ÐՃͺiÿ¾Oh•èAá¨[ì&E¸k–"Ð)Í leVZú3ÝÔ¡Åaô®9R'ek©Ó0¶å}[ïär³t-å«åê4[—â&Å…Å/~¯N7ž´úuvøYAô„°[מÝ"l¼ÀÑŠ>01 ôðƒLµ·+ÔžŸöø’ê3øía‘°(@mz+M‘á‰U_W¿Ì%HØø98½FzKzäëà&[E¥gFÆÐ6í{¥m0¿bpÔ+±¬¬[Š·½ÔKæ_Œ@ÀÅ€63Œ0"öùÄl%÷µ˜V¾ú^¹°€þߥÇ4-îä¥;˜½ö[O¸æ©»yUÜbœlEŸÞ‹OüzèÃà7wQ{;ʽO”(w ~˜£4åGõGj œ@8ïKBÍ>–©J~(ª(|­x‰Ïƒ'r†žÛû·Ï~6)âËÜu]Š`ýµÇ/Uð3Åi»07 ûÅ~f˜m†³-¿Èx‡cx؃.š1nb°Ãck3±v‹üÝ‚K+úô¶ÒƒR…jÏÊ\éï¡Ô•Y\”»PU€Ÿ°ÀÏX X`XÃË V”ß®~i`ÑŸKŸ”]F$ðµÆx[(]E¥W`ù ‘TêrùiµAÕßÒ–"äÒ4,Rh-Fh«¸FÉšÆêlÊ…S/ó©"<ÉyÍÛMÒ´„UÇ_"„þâ±”ÿÇŒœ¤~WufNÌ·ùdŠ\ÑöÅ'[<xÐÏÃô¶Ý~›¬öPæ|06иF[á'°¡úó p¢œú’ïg/©(Ó“OÈzxõÈ×€&ºßC¥çƒYær4®µ!+?·Ð`l!ï‚ Ð¼Z[Êbn/á¬+GÀ*5ç@§q ßIÆ‘>fôÄ\]­êºÙ%ìr9±-.ž‹G`Åÿƒhгޞ•¹ææ|pê2üDùeõçè!H58õ%!j/U;ÚSØÒ1|õë€Ã,_ ©;ÿ ôšóÁi6¸1„i|ÉÏÅ'&•ȶòõ@ùyèAáØ|°åó6˜9–"pcK~Ù\ŠÆ¸øoâ û÷³½s¶¡ZŽàf[9ŽÇ¾ƒÂÞ„ð¡lfõæ°ã1—;€n W×Tu¢â·ÝAŒ ù¼¾JXÿ³µi?ËßýªzZ¿•‹±anž@;€ÈN„EzA-Ú)ïãæáJàZ©]—]x¨CBOçƒô8%RÀÇ06ÚV6¤]€³–"HÀ!缯ÖX ,Eðê-)8ŽâÙˆéqZ…ámÌÎF„a· ˹:"NåkKÕM)G×åmVÕûâ‹Y<xÆ~ Ù×i•½‘‡“AªÐÿ¹(E¨4=¤¼¥uüÜT#[Ké hzpo9)‚ܧDLñÙâSª> è&å—ç¹pòR”£i–.EXÚb›WæÜp pçi“4i’ƒØ '5ç7›DеBÄë+n²¸¨gÁ‘5÷ŒýÐúùI¥çDzˆ}@+…ùä2ˆÙ!à4€Ë÷óëSY=ÖSÂÛB=z6lyAf ølñéÔ¥S#ø5V~1·Ì˜«j[…‡#0$Ì¡~ËϹɈÆfÜ'ç%©StµÓföDÙûŒí€õiJ,b(kî)¿ø‚ç)]#*¿Ø¤Z#,½#<ôÄ+0}Y7åk@ûóÁe)ÇãÊX\XŠ ý¾t˜¬Ì,åæëö²²8Ÿu\ŒPWæ\9ÔÏX‰:®Ém¥á]W?A× /`·x~/G` lð6³½¡†8Á6õóŒ½õm)BV{ºû¯LˆÄ¥y1çUý¹¥iEU\Š å§?iyÂÔÅy)‚ëÉÅi”JÍ¥Iféñ[ˆ}éêAWâ&+cL,rw œ¬éG`9`´Ãe3Q™a>Û2g«°ü(Ü´¥~9B{)BTl¶$¡l|©#03Çr5忦¨¹yA·ÒªŽÿ¿×ôþâ‹ßt•Ör|(IFht>X²zœÌàhœN€dÕg½¾ÖRšq!7ÅÌZ” ‘‘´$.EÈÁà´ž |_Ž%«ßbBÈùÌbÌ'Ò$*}Së.Çc;ïÇØtŸ-‹ï|£xæýßPo_&FlL™ Nûÿª¥EùÕ[aú‹òv˜j³‹-E_ŽÀÅipßÃ--FPÀ¥Å¾\‚œ7#JÄÄDë~×ĺþÿÛ(~èßÄâX×'ÂJ½?CÓe ú{¦øÊR[Œ°ÜK|Yê#èæ—´¡ZŒ–3p2…Ó*qâ„YFæ­?×ÝJ=Æ‹‰Š6™G`C?©¦|~=BbGÌûÅiÖr/Eðe©_Œ`[ŠÐZŒ0rÞˆàú¦ Uº.LŠMæ)¿øF§@gC¿­À*™@N‡pàR–"Tn©_ŠàÖXù壋ÄUÎãvi<Ï+¹Ò—«3­І~¬ψÅ#°I<ú‰6ëó—ìŸÝ¶åÇâÆ—"¤ÕXnÉA /Û3¶aÖbl+щ³óæCÜ`2+4ë±X_ÿ¾Iü /¾ÉÅ#àõõdZŽ[Òeñi}Ã<° Ò·f§.EÐ\Z£#x7µš)NKz‹Ò5ˆe¤®,sXÀ[< À&ý, Ö÷Ç(Ûžëq·á¥íE­-/­ÅCËZÆC†xÚÄÉú~ÌZ“þA_|ó‹G`­(>Ö’WQ¥YqM·Äøí.¹\ŒPö z°õ$U·!@6ås.~ÚÀâx¦<6äÛÔ‹ü2ëû•-1~ùAYˆP/E°÷áû°ùµºËÔYÿ/?è‹G`ñL|f=™Vÿ×=¿zZÁT`¹ÑË/P0¸•Í1þ{ñfVÃ÷¸Ô¯aâÿæÅ›-Å#0ô,õÉ7õý–Zj™cÑ•Ø <õ{_η[ü/Å#°ž¥>Q§|9KýØ›òûMy\o³xÀ*}6exÍû½¯Òÿ…‹/kñ,yyŸü›ÒÛÏûX.Þ~ñ,5ðlJ›ú½®ÿm‹/qñ,uy¦Â`c~»uyüï»xÀ{6f˜ÍúÞÖØÿªÅ—»xÀr=³à°1ýûr=f‹³xÀ6&°Åïeÿ¯Y|ù‹G`ñ¬¯G`cßúzŒwñ,ìXËàÛÈþW,¾Å#°xVòX ð[ÉÇcñ¹ÀâØDÕ¿Mä!_|›‹G`ñ¬–G`%¸Z¾çÅ×±xÀâ¨uáâ¡\<‹G`ñ,Å#°xÀâX<‹G`ñ,Å#°xÀâX½À-·ÜÒ­Þ¯nñ•-Å#°x–çëþçl䆶IEND®B`‚gamgi-0.17.5/doc/icon/gamgi32.png000066400000000000000000000047451433127522700163440ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< bIDATX…­—kp”ÕÇç½ìæ²Ân.QQ (Є$€€·Š$È F©Øq (c§ÓvÚ™¶ßj;éôC§TˆLfÐTnB¨Ú¡/¨1!xA (6 溻ïåœÓ»‰޵ïÌ3Ï;ïî¼ÿß>çœçÿ¬ÐZóC¯]B!D­eY”R%ha¾”õZëºõW?`—S-ËÚ™9söÌåËC9EE %ƒ==|~øðp¬«ëc_Ê5ëµ>óØ%„°,«ivuuÙM÷ßoêÓ§ÑèD, £¨ˆ®7ß”Ÿ>Üê+µàr•°¾C$„¨yô¡Ú` ¸Áó½˲;]שoxqw÷!Dm¤¸xöM÷ÜcÊcÇYY`ÛèD}þ<òÔ)n\°À<×Õ5;úŵÀ¶«Và‘Gª§Zœ}eeesªVUeåEòÐh¢Ñ(¼oko=gYvÌ÷½Y“‡FôÒü‚ Ë'æB2‰…@)Ôà`ªˆPˆþ@€¦—^zwïßqÅ !Ä7¬ßWûdíüŠŠJÃq“8^_J4’þþ¬ŠŠÊé+W¬šž——‡ÖÐ×åð‡Žv6YAr•­!™×ßGG£„ÊÊPJ•\nÇj}¨¶´´tNEE¥‘HÆ1 Ó4‘R²}ÇN–Ýwå•$qN­&æð䯧hnnbëŽí<븭ÁuSËL‚”WÞDã‚à†êªê¬d2LÓBkÍ{Mï1¥°Šù• bš&¶i!…Äó\bßôQ^QI{g+›úë¹.»Ÿ…Ý–|š ñ8F8Ìpo/†at^À½ñ|¯$‰àz¾”éìs´­…¬ žÁ0 lËÆ0MÃ0‡ú©Zñ E,æÖêµ¼ý#Íߎc•”p¼©iØWªþªZ>éûxž‹ëº¸žÃÉ“_‰äãyèÔw´Ö !õ×!//Ÿ¾¯ɘ$X~× î^Ä–õqºÚÛäùžžµÖuW°,»3=‡0 \ÏÅqÞêÞ•A£”—>žŸ‚ó¥T ¥Z}{’ê=N3sŠ+q 3õ~ûÈ)_©5Wê†c®ëÔ76Œgg‡ð¥‡ë:´ô¾Âäk2‰F£†‰ç{c•q=ß÷ð¥eÛDûÎ1yZ‰Öš¨{œ’9 EçÃÖ™+uA· ^Ü]gYÖÍÍÍóËçWýƒç9=xœŠÒù4¾¶ŸOl&v>Š~z¹4RJ”VLšKÃî)œg¢ñÐ(Fä¦äÌEûFåúÇj5`[v§ã8õJ©º—öè‹* µÖ¾;²fçÎíGë^ØOÄ“!¸©"—®s4·4žœ‡mÙ(©PR)Ì›JËÑf>è>BQ…Æ×.R{(횀4ÿ¶e[Îó[¶æüæ×¿]TQ^þç`0Ø´®fíT¸Œ!ÄÃ<¼1* Ÿ½aÜàÆó…-\fM衼äfV=PE~^>jD¯7Ò}æÉ9GXxW¾Jâê8™F.bh­{ðË•ÿÂÎ`&¡ìš[ÞW;vì8ê8΂ï\[ýÇ©Aľé×Ì^ZqKhJþD”‚¯Ï] ã½×É”_Pà wšÅÌÒk8!^%;lRtm!¾vPZrcæbÞ8r€9¯k Ú3¸ýÐ+xÒGú>áÉùl«Ûoiiù¹qñ¯Gûî]2·ìñµKCÁPˆSzÎ'13C¬Zû9Åk8™s3ÕÏMaõÏJIgȉ1eZJûd¹Ü˜¹˜ON´a|~–‡&¯$˜HÒ»«Ó0ÁÀP?+W®Ì ƒ.rÃé+~¿qú´ÂÛ–›ŸÄ6 ,Ó@*IÿˆG´ß¡´d_>ËÛ¯ÇaRîëïwÜ~?EÆtÎå_Áø"Æ3oÎ@ÚŸ0cî\>ݽ‡‚õ5 Àu’äçày^ÉÀºšµÓ&çþiQÅìÀ©X¥Á4¦)ð|ùª 7ö9ï¼{–š3oX²(&ÕºeËì÷ßlâHÆ!®K†¹ó«"–¿âh/F¨¸˜ƒQJ¡µNEª“¥ŽáºšµFFFF£ëge„'ÒK`ã äÐgÛ÷rëŒëYóøÓ„Ã@‹ÅÌ»_6š`³w“…†‘2¢xí ¡=|¬ÂRúÈôééë‹bÛv§`ZæOKKK‹MÃD*çkOwCÃh4–iaš&¾ï¥œ°¼’ÂyóxÃ÷ÐýýAàyX%%œøðrWW°GûF‹êèèøH)Ug¤Ú°{k8aù‚ëéèìbZ8ÏW¨ó'X]µŠx"~U'\QU͇yˆœœ±²á0eËèîèÀÍÊbÖS›‰ÇÔ½°-¾s玣Žã¬y¹aþöh¨^:“Æwºiû°›ysnàhë9Âá#ña,ËJ F_â„‘p݃º?#C„ÊËîíåÓýû“ß\p›–Ü!êŸÙ¬mû»­ØõÅúæLÌá¹ÍKøÕ_ß⟇c„Ó"£N˜î(%/qBÂijhh“éÑËLÿ/¨…ºÚ}®8z[Žã¼¸ÿÞÛ6mÚœ9)”`Ë/îåàÛ'hú÷Dúb}d‡²p=%Ði _úì }±>¬`°ãrCç» ß÷·´ÐñIKËû*wÂd,ËdÅ¢é,¿»œC¯";+„ôý” »)+ö<¥R;º±ñ`"é$ÿþ}ÅÇ^nØ£¤Sµ}Çö£Ûêž 3)'—å÷¯àdOmí­„ÃãP9a[[«jooûüæâÙù_.2£u5k°1#3cƒôål!øBCaYiYnUUuF$ /ÖÇÁƃNëÑ–/;ÚÚŸþì³®^Rã“d:üqáf­µ€Â鎻۶3–ܹø‘ü¼È½n@ë“gz{ß}÷HÓkRJ™òw\¾4œÑ< `¤Å2.{\¶Im`#ê{8@p´ÖÞe’q/6ÓB£yTØ÷œKJ.ÓÂã—`ôs¥µVãõþç6/ò,1ÇGIEND®B`‚gamgi-0.17.5/doc/icon/gamgi48.png000066400000000000000000000106141433127522700163430ustar00rootroot00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDAThÅ™ipTוÇ÷½×‹Z Rw !Ø $6‹5Ø –Øq’˜°„Øq%å'Uþ0•L¥/qL&“¤òa¶x’šTÆ›±1f3¶AˆÅ6v’²1`[€$$Z-¤V/o»w>¼îFbO<•¹]§Þk½§WçwÏ9÷ÿm¡”âo9„¨×4í>Ã0æ»®;@×´#Žã4J¥Þ\­Ôþ¿äyâoÐ D™ak ¢Ñ…ãæÎ 9R+ª¬)éomåÒÙ³òÓ·ßΤãñ]Žë>¶Z©ž[yîß AˆÙºal¸paá„Å‹Ä㨾>To/ʶ@8Ì©·Þ2O65%]×]ºZ©ƒÿï B”é†ñIýw¿îºî¸›E¸ÑÅ+ª× ã¾@08ß¶Ì)>¿ïˆ™±¥ã¼¹qãË7ÍWÃ0ÖN¸ÿþÂð°a8Ç#‚AD(ä]4M””ÇAé:*•Â~÷]ʦMcÂ=÷ž:xp-°ìFÏ¿fV¯^]¦ùX;¼røÂ%.-¨ªª‘pÄb]´¶µªíÛ·¥;ÚÛwIW<ÖÐÐpÍYj¢¾¸¢b×½O>R B@(ä(…J¥ •B]aB´º:öþö·©Dw÷ÂöUË—/Ÿí/0¶>òð7ŠëçÌõÙŽ…ã8ض…T.šÐ1tƒ@ HSÓ>{ݺu Û²žÒ}Æ0À¿À¶¬©J!|~ÿ‘È'ŸÊÏ—»{þ¤Išlkƒ‚DA—ó€2MT:="û]?ž³ò£={~ºJʧ¯á+gÞ_`lýÙOŽF£¤ÓI¤’© ¶c‘ΤH$û˜>}†ïè±cᮋµtéRUUU­E"b±ØÝ­­-ìÞ±ƒ“ím¬v m4 %½gbÛ`Û^-¸.H R¢¤Dvu1¤²R34mþõœ¿ @ó±öá¯?R‰DI¦’躆!|xQrQJ!•†&5šÏœ¡ážüå¯0¯~ž°lSØŽC2•@)EaQˆÉ“'3}ú ìkä™ ëy·³|®¶Žá#nã?Å üòã$û’œ|ç¤+åc7r~PÌŒÕØÚÚªtÝÀÍϾ„‚‹å¦½Ô’—ÓÊu]ï\/RRºÈìzîÕW? • ºð¡ “s™÷)+-eÒçfñ¯e;å_Œg›¹›v¤yé8onß±= „Èål>²ç§º£•%‰Åbº‘O7÷Šts²éæ‘Jâ÷ù‰Åb„«ƒhÂ@ {&çÍ™:ñn:Æ!w>É#·Ò‰ظñåýíí»šší²!\g@×q8‡Èh–¶sø R^žù|¤²QðÌõîÉF*Òv¾•ÒÑ‚ËoX2M¯{žI§j^YýðʾG¿õðÁU«W¬Y±â¡ú›HW<¶~ýúD<ghy%1hVÏôý‘êÚ0»vï ‚×uæ¹(d!tM§0TÌŽÝÛz»ÊrC‘”qÊK‡1vFØÿ_Ïÿ¦ø™§Ÿ½çñÇ¿ýä¨1cv=üÈ×6¯^½ºì† =–é,}æ™§ão:dWVŒ \¡0Tˆ¡tôŸfܤjÜòóìmz‹²’È s\;î:n> ®ë24:Œý÷Ñn~@ø6 ©\…÷®QHR²‡pñ0Îõ¥¯¿—P¨€ÚÚñ£§Ÿ ­\µj‰ÐÔ'Ë—/Ÿ}]€M›6TRŒÛ°aýkk~ò\êĉ“ʱ$åók:Œ[bòêöMÄb]”G*G*›n9MÓ1¬šžžK¼²å%ìIâ( WY¸ÊF*‰g ¯ÉË­\–m’èï£+~Ù÷Ìö=·fMØ0¶ŒÄ Y^Ðøýó»3þ;ãC/èwŠö6ƒ I&†Î²bÙC,˜·€d*‰i¥1MPøý‚ …¡bš6òÊ–MÜñÕb>JîbvÝl\eá( G™8*ƒ­LJŒ Œþ(‡6ðÓ_ hÆt/E³5U©àСCö† ë_{áÖ-»)ÀøE?.Q¾Ð¯ËJBKë¦/>,,*"CP(ÎwtqöÏ»( dxpñ"ª«ªˆFˈÅb´oåõ7w`•œ§nÅpÚ.žåBòn¿}·nRñ¼»k—RÉŒCs,ƒ”Š`°”šù_‡þóü÷«o“îi£@ëCE¸ÚOñh‡òû]¢ãtÂþJÞx÷%ÆM…£2¸ÊÁU6.޲ñk…”êÕì;±›ÇÍYh“K8ý½ï3á7¿Ê·$ŽëLõ³hÑ¢‚µ¿]{/p}€‰KQlú¶o®œ:4Â'IlW¢åz#¥èMÙÄ&šfƽˉw÷²eמøéi! W¹¸Ê¦Â_ËOîÁWÅál•Ff¯¹Ø€`d`:GŽdÌ)ɸýíèõõìkh ÷ð{ΘžïPL+CÕˆjaøÀÓWqn¸hÏÏž1±´¼<ÌÉó}¸Rá7´¼º†¡ tM`Ù’#g{RVÂÔÉ“xõØ2ƒ†NUàº{ºøà“·¹­¦ [¥±e[epñf~\Áz{||ü}mêF×ÔÐÓ´PäÖ[ÓÌF±-{ \gW¢vɳ JK"«êï©ÕO·çÄÀ—uÚqRI\!4áéõm êî¨áÅÍ-\jVL™æý{8Úü>³¦×S4HÉK  X+%¤…)Õ«9òñ!>>öO4ÞN¡e °ÝÝ ©¨ íÃù6D)•õ á!]°lÕ²ºh z[ͳôî„MÆv ø²Ðh ?GW3*ÑN¦·|tzãK‹9¼;®Žú°¤(±“`ø¢Œ.ž @<ÑIû¥Nöz“±g ~~ø.B}J¦<]ÜÓCñÔ©ô½ºÅ륲}•?"ëÂðù?¼ `éÒ¥Å%¥…Û*GN UDËèK;H¥p¥gŽë5q¶™áÂG;(ÓÓ<ôÀ"ªG,a€˜§µ­•×¶õ`¾t»üá¬/èç;pôT;'¢q® À¨t˜‰±ó:Ç3¡³ÒéÁâ>7^Ó¨$J*‚ 'šOJÛ²ö^PRZüüÊ•+‡<ýB3sê‹9uÁ[mrÎ+%ÉÄ[‰}ø2+¾ºŒùsçbÙ&¶}…˜¯­eú´é¢©q¯ö£—6ñm}8uo"\S›ƒõ0 ÊÊèë줨f"Òu‘®D×½vdûÎ׶߀oâe«–ÕUVV|eÁü~”BJòŽÛ®Är$™tŠ®^fÍžan}=‰þ>2™ ®t¼·´ضE*A¼'Æìúzñƒ?ǯ“d&“×Â7ÓÕ”.š9#ßÙc_S£}¡³cëÆ/àÓôÏ?°øÁ€m[LåB¬—_Çq%¶£°Iω×Y¹|‘H„D¢w˜×ußUb¾k€˜_WT0h÷-‘Éx™L^ç$å™cÇͪC^;Ò³qãÆ^åjçü¾,êùÕÕ#uÇu˜vûPN]ìeĨ".öz+ŽJ´QîÏ0î\ý×óîb^äÄ|ý<55qª«›ñ™L6·•·ÿã8Þ¬[–÷·¬¤_<1ú·}ÔLƒ¦ ”ò–hDˆìN„RÙ¸,ò¯ó¹`H]O'»»8òÖ[÷º>?·ï©kÚÇu7¿öþFvycKº{¶ïØöäÌ™w…Ré$Žë0aTþù~ÙðG.‰"bÝ1B¡ –mð*VJí2€’Y ÁÁ”šÛhmm¹1ï^[Ì·µ*Ó²n¸Mø™ú.%¾³qãúÞ®XŒpi ¯së¦×ðÆî×  …˜ßµsGZ:Î · ?3ÀÖ­[iËzð™gžŠ8ÐdGÊÊ).BÀ`̘±Òt`¥Y1ïÞª˜?°ÏnoïØu+¿©}&ðR ©Ý¶aã†ÍÏ­y6uüØ1™ÉXDÊÊyôßdË–-tÇ»)VÀ-Šùõë7$¤+nºMø×Œ›‰ú{4øßï÷/°{ ¡iZ б+W­ôÍ­Ÿ§'Sý˜VæÚb~ÿ>gÃú ý­-翵ÿþ÷²ULf-wî^ãè*¥ä•¾]@¡á­L9Ó¯u¬®®.û»»ïúçÑ£FÕ/Z¼8PUU-¢¯fbÝ1ÚÚZÕÎÛÍææ3ïØÿöÏ.^¼˜¸ŽãW9›5çGprP"»Žç4߯õ®M›6uzùСuee¥w"ÄX%å¹XwühÇùöŽ?qrÀd t6çÈ §®0û®Ù9m€s· phxµ¥3¸Æþ¯¬<@ndwÞriäàðµR)gÍ™`¹ñYRÈÊ9ŒWy§oº±•…Ê9“sp €0ðž+ë•Wäï¹™ÿ ݵ)ÓæÓÞIEND®B`‚gamgi-0.17.5/doc/icon/icon.html000066400000000000000000000024161433127522700162140ustar00rootroot00000000000000 GAMGI Icon
Icon
 
The smallest of the 20 aminoacids commonly found in proteins, starting with a G letter, Glycine, is now the GAMGI graphic symbol:

The corresponding Tango icons, beautifully created by Jakub Szypulka, can be seen here:

48x48
32x32
22x22
16x16

gamgi-0.17.5/doc/icon/icon.xml000066400000000000000000000042041433127522700160450ustar00rootroot00000000000000 gamgi-0.17.5/doc/icon/icon_screen.xml000066400000000000000000000111601433127522700174030ustar00rootroot00000000000000 gamgi-0.17.5/doc/images/000077500000000000000000000000001433127522700147105ustar00rootroot00000000000000gamgi-0.17.5/doc/images/front02.png000066400000000000000000000263641433127522700167230ustar00rootroot00000000000000‰PNG  IHDR––³cæµ pHYsë3øtIMEÖ  1ž24 IDATxÚíÙW~ß?§êîko약‘lnÍM%j¡F£ÑØãÄvæ!0`À69€‘‰Ÿƒ`ò™IùÅ?ˆŒLìI¢±g$ÍhFµpÉæÒ »Ù {½û­[U'·Š½ÝÛ·.Õ”ÈQÿÐ @tÝÛUç[çw~¿ïoü¹Áž<Í¢í-Á„{²ážìA¸ážìA¸'{îÉ„_k |žµUr0W=Ÿ69'qµ…Ì;&¥½]øʨĄ[›÷Ö¤‘",BÝV暉 8)¹K¿ {Qü6p¤/ÈPoÈ|ßÄ#‚ "&DP(G)[Q‚,ƒ€°¢ ~]gF$=àÀ»ÆÞ.|œ2( `¾o" H %0:8zéò%e)•W¬ÁÌmÆ`$=„{ú®^”íCíºÐ…&BZU¦n“Hš%³|Vò‰±áã‘%­p†a±­KÅKàcÈÖ_÷9è¥<_ÖÒŠ¥Õ%µù›ìJ–Üž"}LÒ%9(Á,hЬB¦ \ÿ¹ú$ƒ A0³àx?ëG)X0!X„kÆÞ.Ü=9/i+pz X€»zDÒ À\1vò“§ˆJº¡In{»ð‹ÉIIhÞæ{† ”afŒÀ‡à´Á*|îûÁJöp –Ÿ¸åzªØ™ ¯¿ð:!X…Á†Üðf È­9"9+ù†ä¤¤žÃ=ôÀƒfðn¬€pNîíÂG•3’$T` @­)Æ! :tCÂ;Þ‚Dèz@@ s)C/¬‚‚™Fûµ¦œ–ôME‹sE>‡Å'eÝž’³ð9I q\ª¬Xƒ ˆÁ<ìƒö½?ûñ[?N´&,Ó²MÛ*X¶i›elxHCÉt“8#Ð@GEwÊo¨²"û¨/Ä×hvKBD„r%X†ÏÁôî|¿¤t(@ !kuœŠ£’4(˜‡I£‰-˜AìZDÓú£¥”SqTI± i0áWÆ„žæœ€¢¢š¦å×òäaiC}س5²ð9´ÂƒFOTE±º#kÚ¥õtø ¬@Îp½š}‡8zD×"ZeµráÙ ïÝ|Ͼk™4ú á7$°4HÂ"|dÔ°QÓàÀZ“~Ûd„Tw*3ŸÁ„2”aÆ7|IJ2k0¸W_avJ:! )¨Àä6¶öëxž“,A?(X…Œç¥m8 Y°a±ù%‹CÇvPttÅãñx"ÇóÙÿšËä²kÙl&[^AKkNÉás°·±teÁ`%ÝÐûàÖ×Üœ9/)C+ذ=ðŽ·|í’PD¤„šV ³ãâÖó/Óàû,G„ùÅyB†è] âÜȹn~¤ÚTce L8’$$¿ÎæÌ°d?8pÁ<ŒÀ5HC".DH(¡Ô ÅÌAÌ&UèIÂÛ»óÙöÙ¨tUb»ÊX„O&Þ¿6ÈÔ€ü–CøŠd$ DHˆPŽRŽ¢ EÈ€ K°Â`Ã2a¢þ³„$#˜ç\Ž7zð”¤öƒ‚˾ƒ‹=’QÐáŸÁ1¾NŠô„t5g`’êMUÌJ±PT¥ÖyXƒ1`ú%½ã A‡Üú@Âû7‚ל¼ÃEHÃ=‹›1È@Z’†ãð+2kÐ/iƒ—àݯÏYxPÒ aø öƒ i2w3$`fêŸvyƒ[0*cm±T<5Wšû‹?þ‹u_\9ŽãTÿýÛŸþ퟼ü'?~ûÇô7©x'à(Dà”䲿ŽCâ°¿yá©T¤/IZªo=Ü….H€«€{°ºãž’$=Ý» ‘mT£€T «p©ÉG•tƒ oûþàdÈûs¿½vKN@Êð  êýw`B[}åIlXÓ¯seŸ$ Ý ÁŒ5ùÔç%I˜…¢xÐ#µsÚïŸýýŸ¼û&y¬Qª¯ÂW$1Ð=Ve’° íP€Y¸opNÒEêrÊç$Qßa‡'n;Xp£Éܧ~I?´€“pÓhðjVÅqÈ@ Š0 wËRÁ¦>I‰|÷X0 ÓÐ ° Spîíp½~Ç%/Kž•Ä 3¾ñ®ä!#MÞ³ %FG‚ñ )xE2"ë25‚܃<” #ðª¬{úva¯dp%íÀ8wA€ „ â”PËŠ÷ €VI/Ä!!âûâù•<Ӱؼ_ß"9 aXªnG¯¾1&Ä` 1*”­0!·aÁû’VÏuɱž1•Œ@›wN¡Ú®‘_.„)é)„$"(TE±S€p‚wc~ €ÐuÝ þe²©îTæf†¥GUM$ÝÐ6ÌÒØÎ¬âW†i—Á¡’ˆ@ÇMrÌ@”·ÿ¶g¼Å$#Ð „.¢Éhaº°+é_¢SÑ.¹ôÃI„.TE©%Å< zû1ô”þʱWÞþøíTwJ9Ê6m«bÙeÛ4MÊP‹ÌT†hK60z(9(²tÿâÊb)Sß{C™Š%ìL53ÆOÞü q˜Û ¬NxÑó‡îùÜ„oAÞ‡yF@ƒP‘ÜÛ‘#­îÝa/ûí>ë¼ÉuÀÚ/i‡h(å©;?Ó ÃåÓ>Öd«d‰¨PO:„„¡s^ÂYU~Gr Úa‚U  Ã^<ñâ{ßküýyƒIÉYŒ˜š›²J–8ò†20Á„ dáÁI  â¹h³FÝ-2 ÀQi “D3+4‰êQ",ÔÙàý›À:jiqÍÞe~lga• é ò0'ásoíKŠpÂÕ a( K9˜oto£9—‚’G“‰D"žˆ'‰p(œËær™\>›_¼¿i”2%fà~µn5a<ã¾Ùœ¤Ö¥9‹NãHÓË2Ô2ïš_¼Zãñì³âžnƒ×` f º$û!KhQÍ™q(CÂ0Ì„ÁAIr².aœ”¤@A,˜#[ÉfCYBž7RßêàDÿ‰‹7.¢ûƘ7”´Aw5BâC–PmŠ„+óèºîKë~^¡Îùk“,ôAž…Ihƒß‘"$D@(G© åäLCÌB;Üó¨™Uhƒ.è|XkÑFn7z3Û(z¹xå"‚M>Ë ¤ ê;ÿ–¡ú¥ˆ u\6È6^Â*îÎq¸«Û3’QIóC“0œƒCp‘Úˆ&Úa”¥œ5GÍ)‚pfYGñ–‡°dÚa@Öð ª)«"GYƒ ƒK0$¡§ŠkÆ ôøþH¡ ·lcçã°diá]Xÿ]…0 ƒ°Œ›¾ã‡ÿú‡DQB9G-)&á3xÛà#ƒ1ƒIƒc0&8 ߌzK¼†=:ê!;úªäU‰ x×ýiżÁuƒ`¨É‡š bpÐös8W²pbÇëuC­)»`óº¤]>Šô¸¤B`zÄØ ùáÿú!e˜yÏúß’G4‡a Nï[«ì”÷ýñ¬b¨ ûÿÌOëŽUà7`5i,ÀÄ`T6õ2è‘´m®[ÛAÊpP{È,˜¨ú¨KRdàôÀÂòBi ÄÒW» /H† 9¸ X†5¸ ÷an…QXÞöÙ!D‡ Ë´Ë ¥Bõ'WÌå ë?(*f¥0W ôH7~Ç Ú›üà¡fU窢˜6H˲SX!?™ß`€ ØÐJÅ© y±›kÍßóm8a8#ùÌ÷F BŽïûûÿøé?ZeY7Ö“ C”…+ Dàœ¾muÞU?UÁX0:„}'vìŽ_xFjýZ(*åK®Û7 ‡!AXÛLÿ[„OkÑÿJ’‡· % €í]ó¢ t¬w,VŒ­¾DX0¾Áüñ/'$:´@Æü(=,¨ˆÃ4 @îÁÔæÏê’Ó¸œø%ˆÀ\r å¨úûÕ8IµqCÕÝ<$ÙA(ÖÊX\»PC!„ ×=g«SºŽðæ ¶ •W5ð”Ö‹Ù…±‰` aÙÛð®ú! '¥¯<ë‡"ÙɬK < EIîRãuyˆß†¼Ó²/tÓÔú¤këÎCîmfîLHF¡RÁJ±ÂÝmÓÉ0Äé9Ð3kÎ2ùXÍ™vÉ Dà—`n8Ÿ-¸Wle)®Öúž„WnRÓêêu!œ2X` K¾mI—Y…yPˆ¤=‚à›’3’˜è•ëø-nŽ-ß5xß` –qI¨}D£ Õa_mƒËwÀ¡µµU iDkrßF5ûköþlSý© ÂÓ°>†VO<' BfÛö? EP­•×ü¬$€Ê«Ú­)ž—Ñt” ×çªÁ,‚a8i(VsªøÃo î|ŽšU*¯\,÷ ^…%£Ð“°T§æfÒàƒÏaM×Á‚²F§ 2,Œ/8ËN]³åLÃ$|l÷]bÐß’¼°Ø"G½V 9øÌ`ÍXßÐ Þ2¸†šSª ªêá™ zZ§³Á=c°„³âdïek¸LÛœ-©¥ûë£ ‚ƒñcñÇiÎTuKîBÅpúÐaiƒ, G°=X‰T¶~Ïs’(oþôM"‡ö fz·ä€wà)èN˜‘5T™J¾ò³Ë?Ã$t2¤PNÚQÝJ ¾¡L¯iWµ]W–Aƒlý<à{†«Ò‡%C|pë»l×Õäå®ARFFK¡RÂse©D*±¶Ã–ÒšÞTÍ| ÛKjžÛëÐÍé3§«uè[ƒ-P¤ò ÂØ·as¼( à |f0z½ †$½¤Þ;w ~8 iÙ¼Ã>3˜Çž³¹9fVf*vƦL ¦ƒÎ€>¬kg5ºÐz4úaÌ_÷¸Á,•\E>Ièe¬¢%¢Áe9›TkŠ]…Ð÷.<.ÝTè}NJL.}tÉM©~(ç%AÈÂUHB;„À–GAÀŠ÷%÷ lI'tƒ. ‚ <È{YÉØG`v³K¾ '%n‡Ä¡²*Ø<èü»Ÿ½Kü=ì ƒ´q¡ÚüaxÏ°Ž½¡Å5ŽÊ³•¥ÂÑðqM<&_”îi—ƒ½r¡g¤›0?ïEn’Ï»_MÒ ­¸É†Ñͼ-é}П±~PUeÕ`JÒCêp*³ši(0Ȭ;—•XåÝKï¢`¶9BUµ)¢Ð*k8Û±)(=¥Ûmâðù\~W„M*ÒgGÎêQ"Ãe×’P€I˜0xn!ÒMXÝÌÎ,¬Fà›Újx‹^MÓZ­õZ4¹“q³"üËçã^§Š£Í|pÜP%%‚ƒþ®Ï£ëºˆ5Ò¥e ùá/Â%>¹ò‰½j³ŽäEÏ‹¿îi¼eí l‡ÞZ1¼4 `­X,Ö=Nþàµ?¨û[`áç‡imþïä@Ðô»ŸEá·êz»d7ƦL>Ÿÿ* ¼lðÏðX†DՀόMI‚ý0 Ç ¦ª»e$:îáW[ †vº»F6“­Q{æGª1¿P£Þv]j*¢ÐïãS÷ «di!­n­EUŠäóyÔùm/ùÕ|>“¯ë}!‹T3x4B¬V{ò""¸R‡Üë–BëTÎvqC쨇2k™G|§ ò 5fš2TQ‰€ Ï×åNѱ'lâ è½J®Â¼ kîûH[d`x )eÓŒýsNÃYX«Ã=Zõ“S’Ø–My{ 1„VÙzÄ],€ a8,›Ò¥(XÆeÝv– ô úçåG&9FGj¼‹=’nJ³¥©‰)V„ˆ¨à£:mÃ(SÕÍšM`Û tÇ­8¬o‘'Ò‰G„ð¶—xÑISo­ZU Ás›]ÛíÒ")OÇãéxÝ÷ø€¬ª[c·XÙ¬Õ^ÚC®AÿelÍ@GYŠPßêìDΆ°m{= ¦–"µ»ÁíTøÅ 2l¸W+Ÿªžt@Œ?}íOEBлã•ý$?‘ÏÍåX„· ö{ û\„Ä7 x¢‡KeÜ6þÇå®B8*E@¯ÓSõ¤tc‡õ!tl‡ìN»°!„ÊR÷§îóì£æ(\7X„C0Ïøû’äù»ÿýwª¬(Ö¯ =!I‹p„n8å]Ü%éäàªÁšÁXЇ<»Ên/z®­€—äîA¸ê2¹mU¼„;ÔFwò÷?û{vØcBbrøàabpú‘PLKR${’ñ®8)[}§½TÕ9˜ÆíÉÑç妌˜#Ò½í5¸e°hpÑpãP-ðœä¨$ᥫ?¤–¦7 x*nÁÛCŸ"ç?³ß7„QTEÕm-BUT]úãŒÔã:Ά·r«–X öj]Ó&yc—Ƙƒ}ðMÉÉ&\3¨PÈŠÙ"ì‡×$gemS¥Z6åÀŒÜ0ƒ5P„cpVÒ'–´¶­6ñªÁ<˜…68+pÑØJ¬/€Å…“ˆm<€}|ðñuݦ ¶sR„ZUntb‹\XÀÊYto~•6¼'öª-’B E—ÜZ)Ñ.90þÖ8:|£Zl¶!ÊÚ#®>³×òG—tB´JæA÷ݨyÛ²]²í„¡Ú #™ÝÐOè„·±V7›æ æà dĨ‡†dkuļm°"&u,eU¬B¾PscâÝOßݪÀz¡æñ““àÂÓ’ÊRµß!±èïî¯mO>'‰À*§ø^„”\çØªó€9/;È–ìƒ>HK>†4 ƒ‚© á‘7à„¤ƃ•Vé«çÙc½´JIºÝº~Ú! ý’"„pœkµÞŒê7“´¡·ëß>ùí7?|³®rZ28 3ójMmb±ÂJak­h¡ u[ù<¯çOŸÿàój¸2Uã¿' q‘Œy6(@NÂK0µë¢Á8¡îP´-J¼~9 p‹ÂjáÑóaË— ~i0kèý;'¿CÆvħ0=³£³[ÝíJídå9ÎVgl‚ìä€5 ᯠgÂáž×顚¥rBÒ Ìo(l¸nƒôÂó°PgœÀƒERÇSD€d}xîæ¬Yœ.6 *¦ •WC å¦ÁìŒýOïÿy… Jßù¾†`;޳“»lÙ[£åi„þCcþ,Ò«c%ïØh“.Ÿ´½£Ñmw¤C(¢¥þB¬‘™ÌXKÖör²M2M¸7ìîh¤ˆ ¨kîú—1ƒe"éˆHú{!Êóņ´mcç7îYIì&ú7ÃÎLyc-Ð ŸÖi ) sÙÜ)èÎðÙáœýêqeûÝ2TY5])QSæ°J– _uLe …B"•xdE*‚¶íMýàâ„…#­Z?ÃhÇ5¬ 3¶È¤Aˆ`*Ø Þ¼L"• »Á´Š–ˆ4Þ*¯ˆí„ †]²5]ó+(`–Ìx*þˆ+-õ^­Z'Qûèš1Κ„pÊà6΄Õu‡4žœk=ï,vÎa±5ñi»Ì£µ]Ð¥ òJ×u_‘ÞE”­â‰8ôwÛ7£U†£ƒ£MU#7l£ÕéoTl§Ð5½Á­’Ído5@Џi8«]_¨ÊË•<šÐDÈÇq˜3°ˆ§â<÷Þ.éÇV6šW|š”tCK?¿ä‡”ùuœúM}~¯¦áÈ7t&ã#„{ÙÐu½±EÓ%1Iu§H{yõ,°J– ?%ÝÊV ’3ÂLÜš ûå%Lh2ª…4wÏ€ä`æš;Üš„0 7np¤‚è윇™Íf놮Ö$Y\ò"/Ÿ×¯˜=™Ì0gBõJJ° ·`Æ äÏÆ»oX¥7ô„ît;-{‹Ë?¹\7!)i!Ö³m»\)oÊÝ:Q2×3Õ B“$  ×qIWßã›ÏjøèxãB¸£T¦*ä=¥îA‘hK”¼$Úvq‡—ý= ¿4˜3ø†º¬È@±_ð,áÃažoæ8,(MÓ‡úªyCµž" e ÷ fÉÜ´h'¤Û¼ú.,BPð1œ€Q8ÜD#aíQv¡ã{î £2Ø í¹vM9$é›âLÑíY~¾%×Í–ÉˆÍ *0að®Áÿ3ÔG ¦iÍͲŸÀœ21á¨ÜYå’ãÅÑ#-‘½fÒ’A5«0½3ï \œ&è0·áè„O7ŒVÙ}û¥c; * %3³3ŒîxYŒÊRÅ,šØðj­ÈÑ!I7Xp ~m°bð Xì‡ß•\œéjqgž5ø”âd‘T3íJú `O®/;qÞûõ{¥•kÛðòúŒb¸³‚«=ó«–`ƨŒH@rMOFlÂnr3¹þx ÄÛâ„ëÛ‡Ï»á Æ@ݸ³>·ãWô©bðÁÏ &Á$ÜŽ÷ÄéjT»jðÂÕ·¾T ¡XèPï!ÔuŽy½§á.$!½AžðÂÅ÷ÜóÕ Ä·ÂQ¸ëÒVcȽ°‡À‚_>ÖBívÉ>:»:Æ6Õ"my°v°ÉOçy½–Ìm&²««›ƒa§¼VY­ ÛðÛ(×  üMYŽ•ýjÈh‡† Á ›××®“…£0$·;<$iáEê]’†œ’î&KÃÂXTkкÝa»%潈¡QÀÄ£XÐÍìÂ%“¥¥%,ÈÁà¶×³À³`~epÛ ‚s’6I¯ä…Zø— Þ6˜ï¼üZá^üÊÛ–O 7R cƒ D`?ëbЫÇËnÂÜ2ÜfßÕ ÞCpe3|º  ;c»Õ ’4ÊVn#†l“†Q‘~Œ=nsNCœëåµ§$­^¡èÃWï3ƒËP‚ƒ`m?m‘+YÞ¼ø&E½~3¢†™Z›<ƒ›pÌßÅ÷ ¦ >7˜„"èÐ ÏK$m‚¶ºªqƒûPá¯þí_fë9Ú)óÚ{È ` w¾å£Î}Ô¦%-’^»§Uhq87êŒ_= ÅqqpÿÁÛ×n7¾×—¥hêšjÐ"¶ÊëÿäñÛ§ü5H¬ À„,¬xSG;%íõ;‚—¤qkçªó0/5½Øjß ÛNµS’AÈÃ/ €¨äeâÕS¯¾óþ;MY¡_ȵ_·>Ã’4ìƒvPðɆ®1[䮡ºäíüm_yÊ÷û„êTÏaPÄ!*h] OR&ä´\ëÁÖd*™J§’Édfõ¿dV2÷ƤV«ä7µ¾çsƒnÉ~†Ÿ^X[Ègóõú¨nß¶kÑR!Ôªz‘a¡² Å;—ÞñàÝ=«2fpN†÷‡ËÅ2Ôǯ*ï‘óïK~Ì)C¾Ï¼íûpNÁ;ÛÒn’NîŸs<0V~ÍJ‡7Œ·ÚîHڳء]öœÁÇ©ŸnÙ†Ôí»F´/ ·I—¤ÕKê„Û;¦%ìºk¿U.å‰2slŠ[Öc£üT3{á¢õ˜m”;‹‡sõ/ŽJ†AÀø†aÍ‹× .üÒàçwab;V?­qøÐaõ;h&êôZñÒa– %G ˆZUô‡ÆÁÝi£—àÔ÷N÷ á>À, 4¿d…?ÿF|ï ^—<¿y®N\r4˜Ùñe¯&‹æ!Aƒ³^Âx[Üæ¼$Y†?øîª#¾¸ìF3ËŽ/½—AoÑ.§q0冡¼á«¨ó”$Éßü¿!€hd€œ>Gü UVjU‘€X£±qTõmÎJÚ _ÖÈIxÈŒ¯Qÿ ‡IDATÚKr½Ö Bè º$GàØw M¨Åa8QþúÇMÄÇ$Ó/ Â\6×8æL¡ë•”¯˜´ZSÄá¼Üi¶Ñ Iòî̧Çì–ô@-®©¤úËïýåþñGM4ãùÄàd†$ÎúÐ!t¸ííÂé:{1èpuÁ5H œ•(ÔÅL¸#W¸)vEvC‘N“Ïå}A8o(Ûw†D™?úƇߑ\5¸ºQI+¶ Hš3øÔà—†óÿËüèþ‹æ:ïVHö&íÔP*Ú FƒB‰MF£Émþèaé¦3• ¯:="ÐBûP»Ö®q·‡e œ{¤6Ž»én¡¬ÿè? üÜÇW=#‰ÂR£€Õ™<«nE  ÊVnxb0§}tì’…"µÛ´×´]¸LéVöˆymäÖÔ-þÁ $ :Õùê¤a¡L¥Çuûs{=uo@Ò:Ľ©UÊ{|×fKìNcçR±ŒëÇ6IÉŽd6E¯­ⷶN© äH#‚$ÊThÀŠY¾P™7葤áˆlðÞ1ɸU{‚£¼HÛ¤A\ržT_*3“!€šQ´agìu…Ô%邬´@f÷Qî„δãèr§$v òB*0½’ [Ið‡øml{R1øÐ³'ÎHº F‚VÉò{Ÿ¼$ÝF`¹ïð¸;È©^“ÒM…­P¢”/aÁûð,±}1= gÍ,@@Ò(À}ˆB?ül÷»ì„G¥èzP·Ëõ×è´;dË^´¹np^’‚vh…!ÉŠ×Ày;~Ûñ8&‹]Åæ˜LCA®NBà ‰€˜WVSŠ^^oT…>˜?3ÉôÊj€^¤HI¼nKp†P:d®š<Ù³ðˆ#"Tæ*„a îo{‹=ü¶R‹Õ¸| 4w¢!“þ&{ŽJw|¬ÿñØ/ËpO¸¼ZvgEnt&a¡ 5£êöìŽKNCÚk `C fá¶ABrâwÛ«“ŽÂ8ƒ HïΨ»Çc‘Þ4Ô”ªLU¸ê¦rsÎÉõœ­*~…ZÔðmƒ_¼i°D,Ïâˆk&3Û6Û™š®!@º÷Bê¾Ú©Ö<aº{ºí ·ŒkÕËp9Q¯ÒºÚÀ1'` q÷ë§kNäc»5*ݾy kðÑ&õyIÜÇoïúã’^Xôw}uüö2êèÉÒ­ÌÊÕ¯g8/Ý]8yÏ0õÚÝÀ·ÃpnÀQ°`Æ÷T”'‡²Â>rxìó1> q$ø]‰ oû¾¥W%ÂÇõÏHwèzÃ)G$1ÈnN k—ôAÜs LÜ}5í¥,À„àS¯}E‚^·î«Oï\û×¥ˆlŒíã¸"7|÷‡¯ÎÕaº¾ rJ’†¬ïÍ}T€ÈB¢ˆºPJ)[qîA Їý`ÄmB]Qôz^Ä»wÔîcž"úsƒïúUíÆcЃÿþðz‡MFsV®÷õÿœYÍäÖrë#(˸“' 41Xä†Ákrøððøø8a¨  J­*¦XOZ‚!évÈOÀÄá=ƒaÉTEÑ)0;~| ƒ`UA‰„PÃÒ1ipH’G¢ù¸>†½bçÌYîOÞ!""ÒI%SÉTòö§·Ï9wñÚE.6sÇý’2ã—Ç ïèÆ¥¡‹P"d®š$pÕL7" Ô²=BYªAõäÓ!Kˆ¡:UífÛeºá \öÁÕUÍÂ* vÕõŠP„ù#’V.¾s‘ ÄiÜûü!ŸRpÝm4ÃÔY̨¹Þ*c¿$‰²Wˆÿ~¼”/YAëK€P{ìáj3Ôv5P°­4h+Smôž©o¡Ü4xßà&8Ð4·’ôƒá7$I!† u²½ˆ  §ÉÝÍY¬G›ÁôäíBPeE”º©§[dXŠ6Ñ×Û7}cZ|ç UVnc—û^bUPr RÞ¸‚%o°,ݾޗnkˆÁr£"é.I7DAà­Ó$qÜÌàiè¡Áhû§BV=B (_SúZPY5=5M-­éIÝis”RΈƒù†*+·_ß§4`;ʃ¨$Çdmç,(9NµŸ?™FÀq‰ óÐŽ27 º$èB„„**úv'ÿÄ8å¤$÷)¨3’d7sG$-ˆ¤Ð£º•±^{ñµ·.½ÅßS®nCž†Ð†@nµ»Ý}(A~Ç’†g$`Âèƒ<ÌBäíBêÖ‚EŽ/G~¹»ðd?zP·Ã6m’‰:n~õxËmã¢nU:ÓNÉ·~þ1hvŒqáž°Ð…º®+[YË6m«b9‡"˜ñ¦8l‘I·§º«Ó“!ÔšbÀ}-T@E#9‘û’ñû² MÃA[Ø€(J2°°!r}ÊãQwžó^] W$Ôm›UC$Êóe¢0 ‹Ô8•{$ªJŒIf l•Œ@+ÄA¡*Š8× ì{i˜†°ÉMå˜âË—/K‘ž‘a F! ÊV”qÛžUG´^ôw3£’XòM\ù'ت±ø^p Ju`Œ*)7„DŽK€I´%Z|¿Hh0ázF.¿ Ö\Öˆ€Å¹ç.^¹ÈeLƒÜ(/Jt¸á£ï”—"õ‰¿/ß/ßHX¦UÊ•XÝf[‘ôz ¶n n‚HµÝïøW°˜¾*yxà½"?¹ý ¦ïiqË¥ñɘÁe§šzä#‘"èM”[ñß IÜ«ôð¨;ÓÐB²/vÊõÞƒ°™#4lêM§$ 1ÈøèªTí¾bo®V¬ìgÁ¢\,[¦EåI\ÀÓჄ$ûäÖ ÜBÒIhƒ4˜p…#Ímé`R›“WŸ‘tàιŠ9dRy‚‰§Bà’Á3’“`‚’7¸èhºædœÑÑÑkÿx­öÌÚ;õ WÂiyñç„ä¤AÀªw(.?¹‹ñtB´páÙ ï^}7Ù–DaWlÇrl˶+¶St(rí§×Üöwµ²Šƒ’À-°¡äå‚ J† 6L=b_»=ýI‘w¯¾‹IöçÙÚ„Û$-…65Å>ä5} Á]°@‡(ŒHb€74»{âå©r*AJV½DЏ;qP…²X€Š7ßs˜P*dL²øš£·· ¿<Û缤 lDXà L¥ÔÖbÇCƒ=¯ß¼þtá÷5€’êHsÅÊl¥.;sÛ !¯¯?ÉfË×Â2Z»Q’ügOëò5€pÜð[TõtŠÆžìA¸'{îÉ„{îÉ„{²ážìA¸ážìA¸'{îÉ„__ùÿPDcLA}ô×IEND®B`‚gamgi-0.17.5/doc/images/front12.png000066400000000000000000000041331433127522700167120ustar00rootroot00000000000000‰PNG  IHDR––³cæµ pHYsë3øtIMEÖ  eåW…úIDATxÚí»µä6 †IWàh pèØá´qoRÓ†T€o:Þp ¸‘+p"šáP|‰) Ù=g53+~úA€)Φ…‘µl !$#„d„’ÂËØ¶LÛ2B2BHÖBœÎrB˜‡=cŒÏ+!¬<¬ûÅ= ‘THôlqBä_œqBˆÅzr§ #L”ŸWþÅÙmöºz¿ì±¶:¶ °Ì˜z&„¶yNÑüÏ<v›Ùm~> -ë+œùØ Õfä÷X¿b»¬î„ÒdïÌmV&eÜ/*Ê OðþrÁӤئ  ˜k=›SÇcAèry«lPáLÜ÷`’ãµWg¢Ÿñrä ÷‘& DÇ2ÂJФ5R€Y¹®"¯Špe@Ä84F* âÙϰ²³}²í“1ƶuÞÖ¢rI01ÅßûŸ3+^æÍo‹q«PG•oqµR¦1^BsŠ×Í4Äew¡|"Fp²QÑ5šY"/Š !„v¤ ~"œ)ò2Ž4-¥(Æ+tfŒ=rh«FºÍË:¶Ë,°!pjß²6•­ÞIª9dz4ÈN&°yÅäm™RÖä†2bwÜ ‹èçìeb;€Œ]\´8øù *wA, 7pþÜì­c»ø:-ù´Äe#£> »ŒJîÂz52yt3ÔÈóJnKãÓêNG³,n3»1ƦBw+ZrDÏ‚ Ô›˜Æq3[…ˆiýסüü?(ñC¸-ô€Éº:ÞØ“êp|ãýkFzõ.äŽêîé *wXŠ1ò¿m~²P]š~îþcºÿÁª ùj¯(¾ „£—O“CÁÑ Ï÷›<êýÇdþŸ{Þ‘t1rçy¦BÛnÙ8&ÁðïÌîß« ïþ½ú>pŽ;ªj *t„…õ¢|#HOu¤ž>•°öfªGTDº-cgI¡±ÿµFWµÐŸ€/&eâo$dú2wüoWz–ßÊ“µø¸ÐiÕC"¿ícKÚª ºZvÿ^Ÿaëâᇔeˆ7u“J'ðÂ}Ûa.Lrß¡ë&@”çÂ>MlBþdÆ0uðâÎàQ7Áž>8½HÍÎ$ꥨ±ŽüÛ<[¢‚甼ÚÞ$¾óÛÖYÈáih^ 1¾~ò0š©Ð"Ÿ– *ÜÞ¿C¾Ç‰0¦È£<Ö–½à‚œp§c!‡û\AÆÑ(íHYxÍà…ŒŒp¤™ÃŸÿˆÿûonîsw±Ë“rj1–sà¹üï2Æîÿþ,–DÐXÕÜsÿµ1ÆîlE¡˜|Yî™@+¯c£ÌÇGß…Në6oÛû 1….Ð@îl ¿ù”¬À‘ÕÚ4ä#¯Ñƒ{ÐáF=¼Jµ¶¿Gl÷—÷ðÅywWX¶ˆ:'ÊÌ‚î2ºÖ@˜ûpƒ # ¿i^ôPp7å ŠàUæÀs´ØÀ H…á2ˆòhqîÌ@Üi𬇬˜B¶dF Åì·¿ŸÒ~"2€RkAæË }wÆØ2÷’Äm~¦ƒ¡ñ‹$5E|ºfAãXßVøc…G“)Ï©³5quçyt¤?Ýû«ï[“ ³;u„ÚÆZÓJùÉ~#:‰ÏAsxÑ”Èñhƒ#>¼LEÞz\¾@ù`%~'¡oË6œ§M§ðl‘/®}î*R‘2ŽÁsžN 2U˜zäAÍ¥/ª!ô¥q½ƒVªØüS…Ó5*4öÜ1óÞ습3:|4®¡‡-ðvd^ÝÜñI(à“û\vIFØ]ç£×— ÑZ~Q}'l»o­ržP5ZîèŒTˆÂNO*Ò™!ž>@X‹¶Úø"ìÇ…ÆåyˆãØ‹E¤)y:Öã1°#ìo²e;!?ù5-ÊJ&E¥2|ÙÅž» ÝžÞ“ˆemºï×1?kÐ{ϲ¾›÷´ð»·eüÚtrÊAÕ$ˆR‹# <!¥•ƶiáøPÃÏ|àÕLêO>zÕ{ÈŽT¯#j- ¿÷áNˆÛ&êž(ŸêHxì'Gž?Ë)2ÊWð앜/.þ^2«.ûΦ”05ŽDî‚ím–ù]¡2ŸžÊœ5Š ®©±F —{~UüXc• 9<-5Ø#Þάµb“ód– ÓAIEÃçÙí˜aI%õ Ö«#D24¸¡a zàícëò•nÃ%øIÉY:ET$GJ*l-L"6 6…N¡Eš“( „m`#"…9Ru’ :„î󔊽¢¦ò³¡ÒN'œhž2Sþ•¶zûLÏåê…÷hC…xom?* Ë“l$|)YÖ¼ð¼ÿ'†^‚ –¹éÉûÃ+½&–T »wû¡^L'M8RU‚Êd–Èë–¢N“ ã™_dUx²ä¯¿;Ь Gš1+ _š¡Uˆ¿4¤BþůÏPøÁJ‡„˜Å‘*êéO§!ŒLÀÁß²ÑkZU„%ßÍK ãt–ºÀæñÈ–!åŶ//ÝíÉbyS{ã–Ïýuo™Ô¸s_zJN*Œ™üÞ[&ç5#?‹Ð aHXáô'… h~4.°ütY$‚DØ}ÛvDê9 é¿?x»GâWE……ù‘A&UÔ@ÌŸÚ“5çHÉ!!$#„„Œ’B2BHÉ!!$#„„Œ’Ùÿ„.ý¡h6›IEND®B`‚gamgi-0.17.5/doc/images/front20.png000066400000000000000000000110211433127522700167030ustar00rootroot00000000000000‰PNG  IHDR––³cæµsRGB®Îé pHYsœÄuö„tIMEÚ+ÍwtEXtCommentCreated with GIMPW~IDATxÚíYp\Õ™Çwí]{Û²-ÛlØÄƒ`XÌË`• ¦H˜šE“ÅS5ÅÌTxâ ¼ÌÔŒI¥4IMf¨ÔTŠ<0°YŒ1`ÌØŒ%K¶¤–Z½ßuZ²è–zQwßn߯ü k¹çÜïwþßùÎwÏ=-ðÀ/p­‘Mt]à"tÍEèš‹ÐEèš‹Ð5¡k.B¡k.B×\„®•o²ë‚Út¸âÏ® ÄÚü„¼xA‘Û¶4tm~W…`ß|¯Œ,¢Š+º»Ïï¾PPd YÂ#³îO® dûru¾o_Ý›ù-Àƒ å)5fÍ‚h Â~ÿ_õÚX¶3ïEhî§öPÑûäÞüpïgü‹‡'È¢$ŠfZ#­1Úßò½%þÐEX Nåx|r¸¿/ Þ<ƒ ºARc*Å‘S|Ø7×–£@ÊÍ,©á9~£12:‰,'¦süæÚšë‰X.ªÂMCx$‘™4ohT‹Šo ßçÅ:{ïj}AFxÓû´ù‘E€ŒN,Íp”ÃÛU)üf)/‚pÁÔ…e„·|@w+^IÄÍ ‘%šàà(#·Öm¢ª¼3‚gë(Ê|sá_ ^KÐ3EM E0LÖu0âlI-“øÊ³ºÌ”ù†[ðÊx¼²ßM9>µ ¯ŒOi0TçïB‘8tc%ü¶n’v8\¤绢6¢Ì‡Ð+#Iˆ‚,+ë;ÏM§Sñä4’ˆ("‹ÎUÕ»n]!Äl›sM°÷Úâƒç|óutÀ¸cE™a<ƒiaÙ†aŒÅF3zÛÆ²÷‡îé=¾³1ømÛGwŸ‚(ÌÎå^…ëßæùÕË<ë.ÊéÌ=Gè âUL{v…;‘Ø¿êNŸá€Ë^gãjZ}xs-²Ih‚ãSýúUå]µø¤¦Æék¥ý‰id‘€IĶÉÌd˜Nõ>[Ó(_¦u…ð«øUTYQUCÓlAÀ´ð{ð«ÄêÜ»eå¢Kû;"K©,“IÞÚìÀ…mþn¯n#èõ…‚kÃ댴þùèa;™e:ÅX¬ì’²/¼\B,J”›†XÝŠ$aÛ¤4F§ù¿›JQaΞݘk£$V›Ò:†…Múǧ’OuN&&l°A·œ2ò‹ò›o³j~QIJÉêøUBoðÞõ%"td½´ŠÓÝÊÃ)žðœ<Ži¡è&´æØ|¾z£‡ióã‘L‹¬<Ëò¼—9ú­Réi0%Q©¿(ç-·McÙh3&âý£+¼v5béB»ùÖuÐâE‘EY²uÃÖtÓIŽE¿¾K®Qd¨WÍìËÉÙÑTäÜûþûµ_T”l~Œ,©ßÊö•fJ?n+ŠŒO©J uPµéë5—™LÿáógÕó‘‡nx¼"Šý}áÁ¡áåbÁÍÖ³€` ЬNéQ„Ùé¼–k*Ê5—þ“ óÏÊ).ªÞØþ>çt¡›ÙLú‹G1-Û01-tͨÂZˆ²ˆ‚çÖMÒÀãˆ*,-º^þ«Z ®D0,2:]o±çš2ž6ïCä¡Ûvx<…8Õ,©)hon.FBŽØþT0ºžÛE»EšE˜Ö‘%6¿Å‹kKå—SÕc_“ÖÎl¶öÙÍòš³v°Q¡øò—´·ô È`ZÈ"¶MGkA¸Ôè—7–Ö+GmZ„gˆò.¯‚GQü^ŸêK'º ^ŸLÐûØæ-¥F? ?¼-ƒbbiƒ"<Ý5QD‚ÐêК1{d2sIB’P¤%i³ºh-:øµÝIJ°í™øÌpâøtzËÆ²1-2zÙWõutúQä¡Û‡ÆKb.±r°‰)¬if²±S“f:‹fÕIfûÍ««Ôf©].j»¯`2I,E"C2K¿‘ÏN16ÃxœñNÆ84Ê®s*¼ê"±´TŠNˆ¥Î~-fr8rAØáñìÌfi‡5p=•ç…’šFÌnDGó+àâÊcÝ’B,¾•º ±Q_Ԯ͌Õó¢Øp\.ÿ.žÔ4ÅÆ>.¡ÿK‹l¥¾±TlP . Å"…èp-Š Í¯Bÿ/Ä%[©£›äÜ™³9»]‚ú·øXêXŠMuúSþ-)–.ÞJ½b©Ø¬„b©BtšÅfâWžËb¡Vê"ÄæÈ†UœÓɆUŽå——b_¸÷ÑgJâ—¡yò’j÷¼j¯ÛËú.V„è Òî'F~=°jh üê@êé&Ñâ™Á³P¹ ªUïª!\ÓN«—€‡ ‡€‡ŸB«×óꡈÿ.çkqé¤&_ð¬½U ¡/wØìi ‚­‚WÆ#ã‘ñ*œ˜nˆì櫤æ‚]%Ï ±:Õ™¾wQV ‰Hâš®µ[=4rÉ@’PD<Ê\-óã¬ýs®võŸroê Â.8ÀL*w–OyUϪƒpè ÎýËÆ¶'bã&†hcZ`Û˜v¿o }ƒCãE–"w°÷Ÿ¹âü*^YVUË4-QDz xhñ•‡°Uƒ¾á´ØÀçÎäÝ’ºà£^ ¡ê}ô™ÚÄÅ÷Ж½QXnD .锂Ÿ²îÔŸ]éÌ’jë&©÷ÑgzŸÜ[_]â²GÔ¥nüßÞ¡r¦ 9e‰¤ÆwQˆbyIMa„7¼ËŸ°avsëÇòËëG•L«­ÅûÐÓA8H8HWp½4н{ ååÉß4ªSœ4óv¸ !æCøÍ·é Òâ#è%ä%ä%èáï Žœb,™ùV¤ó{ÚËù(ßñݰŇ_ů>U ¯‚WÁ'ãS9x¢Qœ’'–:r.¨œb¾E…WA‘Ä@0ØÓ±6•H?yÔ–D<ð³æ7ï(wü{Û®û§·çwn9Æ¥!äiL›´ÆïV:v._°Ò(u˜aVÇ´°I¤’ÓþéhrÀfë÷{ýëW—žž³È¾VÕ÷OoP_ôôtr÷)Â+ð«–Efö¥ÀîÝX6#Så»M³^xà ¿wÍ.î¦ÕWF0-4ƒ„ÆDbÿꔿd.=EœC¾CUwjÅž9°ÿ߸°›6ªŒ¦EÖ ‘e"ΆUŽœw¿3å8ŸâÜ‘Kžl›O…om&ü1¢ˆ¡ ŠXšA1~œD†©#S<·Ú™ù-sç’„n’ÑxûÚRT˜³]—-ÙXέN)HΩÜú °K²£™)lÚû5§MäÀÀ‡;Å6¨?ïüñ8$t€€i‘Ñ îãx”Ã7•‚°h›#W3Q.a) Í@73éÔ—Ã_`X¶a¢d ³ìÀ^ä‘M;˜`à÷Oð“õ´…P%0,¼ ’ˆiq˜ª tœ(/åîO‘%LËOâ”N<Ã;×-ƒÊ«<—‹TYÛ0‘E,‹v?ߨÍG[«ˆÐA¢üíE|÷Z}³uÆ`2Áÿ\VÓ>”üG Š„*ùZ­Þ¶t"³¢¨ªD@­® %ÊßoàÒ×h÷cÚœšáÓmÌ\Î|"}ÚQÿ™û\¯ìo ´¦RIDAD8ýa 5CXQ~°Å‘¨ò8ç ûމaaZS3“i=id5L Ó°ò\T»ÎJ_kÈ©ä›}n#}Y²3¹JYÆ k0“Î;(k½wÆqékµ%UžÅf^ ‹ŒF4ÉX¬Ä¥} ݱÄͯ¤=@*Ë‘í'©Jì–Pe ‹D†×®,½:Sq½Ð;ç½Ì…+ñ«ˆ"šAZãÄ4ßÐ`’ª²9bbÁèzùzZ¼¨6i UFâþ³•£æMyzG~E[ˆ€E0¬Ù£•W¶ý##·:4úåÏp÷=|*>YöxA0ÒÛ¶1L| AO^ZMÌ©ÁΚGF‘Ä®Îpسâó“GÆ’ˆ*ôœ´ ¡nbÙØ$âIƒ‘ŒžÎýÃ"‘uÉ5ÂT–ŒEJØÓ‰&ºIF'£;³ZV/sð†üg7OÏÒHj$5YâNÆ\l ¢Bà7ðíg‹šI*˱h+ a]íùK.zÅ ž Hç›Ë¯áºæ"tºæ"tÍEèš‹ÐEèšSíÿžê¯r%:<IEND®B`‚gamgi-0.17.5/doc/images/front22.png000066400000000000000000000461621433127522700167230ustar00rootroot00000000000000‰PNG  IHDR––³cæµ pHYsë3øtIMEÖ  ,î§ IDATxÚì½y¼eYU¾ÖÚû ÷Þwïjx5vUwu7“Á!?¢‰3Æh4¿¤APDM¢‰#Q±5Ά@´ÅDÔĦA¦i¿hq@5ˆ (=TO5¿WïÕ«7Üᜳ÷Z¿?ÖÞûž[UÍP]ø —úTݷλ÷¬³÷^뻾ßïBøŽWÀg^—_ô™[ð™~æõ)~ÙÿÿÿÏ<øæ¹"ˉ2"/Ò0OœßªšŸ|ò7ý]ù øìYø+§îîfÖDýÅ ,âY4–›Uó¢#ÏùÌ*üt|ýâ£o],ónYÖhðDXÄ‹8Ï…1¿rêßqèYŸ á§ÝâtËÒÚÒšÌÆ AX„EXÀ["KøÆsïü4_Žÿg¥3¿zúKe1—g½Ì–Ö”Öt2£(Œ)Œ)­éXÛ±¦ÌL'3½,›ÏóÝâU¾õ3«ðSÿzõ‰· :e'³k2¢Ì%4HˆH(  "^„âi`±È?³ ?ů—Þ÷¦ù³ ?©¯¹"3ˆÑY"Ch(uDÖ"BDÐøyÌ !f†fC˜µܧI8ÿî…?}ß/½ÿMŸÐ_É©]…áü»± _õè[ crÂÌP¶4¿qî5Kã¹fþw—m—ÜÐ?zñ=†0fž€€€†HWa¶¸hçzâ|sq†#6Æ3£„3Sì WJM5–Ço¿íSr(~ºlwËîn9—YCº€È ³x/ìEF_Wÿâ—/]éuçʽóEÞËl7³¹1¹!«ù§1y–åNqð`¾gësg«ÕóµsMÓ4ÌŽ¥f®½¯œ5~»nÖÆ“ï<ôìôÙzy–åE a®™wªæ‡oùÆÏ¬Â°’Þõ¢oô»kKk,!èj€Œâ™3¢Âл_ô/¿ëð³ŸÈà ¨ÿ¸Ò¿ž}½îÔÝs™µósa[&LÈÜîNyçʽÛuó݇¿îÿÿ«ð£œoþ¶çôæ2[Z[XÊÉX3àEÇÒx®¼Ÿ8?lš3Ûã¹õÒEðú3÷,uй,ëd¦0&7&#´„™1Y–eÆäKKF7Òf4jÂ*'R{_{ž8?jÜvÝœÜî*‹nfËY|µõT‰c™x·S»Õáø“°"í§*H½œúÕ~wPd]ksC™19‘Õ[…@€ , "ŽDo¥E4ˆ~î Wk˜=‡U+"€à™É{B¬/\ ÍMaöÌÞ{ï}x§ˆ„Ÿ%,raRíïuJkJcsCº·+¾C,â˜-¡E*yíÉ·_ïåh¯.$éî_u>&VSZ““4H–01ÔàZÃK¬í@úléÄۿ熙»V3û¸D8T~‚à½&Bï@˜2¾%´/Nm—ÊBÑTÅt,‘&«6i˜ zCZÃàåŸçÓb^?`â¥÷½i~¡ÉJexFA!d!Pe¾È^þÀ›ÛÛé°vÜ'â˜ëu„< 0³ˆu¡Ä°iü<‹gi<èüÆr·,­éZ«ŸÊ Çs ¡>U@È‘ØD™/²—?p×ÜúüO¯^¿ìy¿Û 'eD†0#4D„` AaDÈD¼1…ˆcYžë´¯ùC7?￞~‡%²ŠzB !@@ï[Lã'â˜æ…"/âSUX£×±//@ˆ¢»k!Ʊ,Ïu?]JûOB1Û±1~†,‘E"„­äÖäZ†[3m¸+ÚB”åD…1]k.¹ì¹áxìÜÄûÆsªœÇñ—HÃâBØBäsíùÁ­^f˸þ,b¦WøT˜Å_É¢–+dˆr29QiM?³¿tòíŸ^èÌÍwÜ£¼¶Ÿæg¿ÅF$ÅÌ a`µ·¶ýËcAo¥!$ý[ˆ?ÿðoµ¯ü£·>³j&ÎמkÏUŒeÃÿÂV{ß°¾ÍWÞ7Ìý<+¬É)îŸ< ¿´¾ÌŒ‰èyøÌ6&½¹¡Òš¹Ì^§‡þj6Ò—?ðæA™eDøâ{Ž¿ê ¿ó‚oÞœT?ö¤kÀšË³ƒ)ŒBHˆÆ˜ÌZcŒétÀÇ轈0³`Dü£“+žùs–wa™]º_pÃ×ýÚéwXB=5™„X!Å_¤’pí¹ñüᵋ‡úݸÚÈ¢v‘-‘!2ÆBäÌÄì¼A$&É‘!ʈîüÖçýÛ®ù1ô Ô…/à®å¹nN”éóŽd½ðgÿì¯À{¿ÿ[+ÇßþĘ&¿rêîݲŸgÌjoOíŒ(˲ÜÚ|iÉ.-"R³±Q¯­ýÊû?¼Ø)òØç3ˆ“4Ì/ˆ©àO}äÎÅN‘C óvÕ|îò®|†xzfµ´&#"D][U½Ð)övÊ~‘u­2iDuW0DDÌì˜s÷ŽÅ 7žkÏcçÇÛªê3Ãñ‹>÷šCqï*ü¥oŸŸŸëX{ ß„ŽÿØ÷x‘ôó¯ÿ«Û¿ý 2M²i±5…Eâ*AD¤n7ßµ Œáºú­?xðÈü\iLÌPÐI;™yÃÙw®'{ºe¶kÞ !záÝe±6ž4ž‡Î‰À Ï2¢s]=Yõ=^dW§p,ë“j¾ÌCIPSÐÁåóóf0·y¶w„È3 J,dõÍ„…¡t ]Ã(~ì¾ì»öÍuûiI”⇈ëÙÇ~ò…Ÿsǯ~ø‡¿37tÕįP€+"äxñ"""Mí‡ÃW¾á7÷õ:»;EiMi µKl¹´Ä. mVÍáAifÁ9 s3âA‘•ÆÚ÷Fz³”ÖœÙ]˜T_rÃ> ;|ľ­µóóù¾eñ Ân8Jµkx„FˆQ;™Ð£ñ‰òc„ð§>rç‘ÅA7mk†r2D É}à›Hà›œú©}Öϼî¾ù.‹ôßÎÜómnû¸ŽÕ"Ó•]3o6~¡È5""L U<37ýÝ|Ã`®›™ÒÚÜPNdÓ­oµmY a6DÚ#·3;ÿyûvIXzàYÈ{D”Édgý‘5ƃˆ¯ÿÀßz‘õô[@˜  °Äxê÷²„íç€> xËßïX€•÷›“úëž|”­%±Ä±ŸgNDP.…¹=³Óø1«Úm§q×ðÝT¯Âÿxÿ]ÙbŸR'Â]ˆhŒ±ÆØ,Ë(/üxÔ\Ü Û †‚6ž0#zùoþ³¸÷ó_ùßý‰dÆØ´²gÕiÿˆˆP€A x‘RŒc[yžbo-H…ûø‰@Ä&::?'¿÷èé†EÁÏgÝóUüËsë7/öSŸ-½é·>òÈb™gD¹¡Cs]}gYî–8·ÖxÞ®Ýÿµw`³ržýšMâYË»9=_æÃº92?wf{tuõÆÇÓºrçËœ"äø^.ÑÛgý|Ï^37ç66¤nx{;hˆÐŽ"f„{{eÇÚ‡~ü{޽ô—`ë?ý€¦µéXMõI¬ÆÂÞÅ$ù”Lmï¿°ùöïi7ÿý¡S E¾·[*-JwTð,^XïæŸ>¿:Åa¾ÌÓ²k}/$„ßyèÔ¡~·´F/¥§´ñÄ"½ÌýíÚÆM B̉jfÐ\L[¾tb¥›ÙŒ(3xËÒÀ r·t"úÝ׺»ñüÂ…[]~åbÜÜ"ʹA1 E$´†ŠŒô//å œØ.÷:J€?ÿ_œ-üÈÏ×?w»¹ìXÕÔÀ3;f# VH2EŠE> 9â{Nž[î–¥µ*L H›å˜-QiÌûÏ®}öÞ¥Œˆ0ẻà;<±§[ìŠð“¥´ÊCc’ãÚÒoqfg¸>®ötËqãÚÄ‹ߨ?×ÉC¥Rܤ9ÕÖã¯~Ç—ý⯜Ø3œWáNÕìê\‘iþ)ng‡ÖÖýÎŽŽüh$©  â ‘Èžn™2zã âäŽ,oÿ9xå¢ÌES¢ý‰dj/açT&. ˆÀ»9½ÜëÄÂ@I…±á4>œ|–ð¾õÍiÂ*|×#§uñ)&›Í“!~h1ÐŒiªˆ€#&…™([\Ì÷î¢æ|ÆgÏú„OéÓRGs- Z3cLQ˜N‡›ÆFÚ“ïI»r oFƒ”š/òŸúÈ?õ”o¾^<ÒyÎñ­I½Ó4£Æ 7jܨqãÆ7 ¿»qã†M³S7ëãjmTu¬m‚2>{ïâvÝLœÓx„ó’Ù‰’äʼn4Úšù¹Û`ô³/i<{fç9=k£*k‰u¶‚Ó„Öš^7ß»'[Z2Ý.¶Zðú=)ÞwíRL¼­ØD®Uf©Ó1Ý.Z-X´ÃÝå P›L«K»BYËËÅÁÅò^Ûë)z>U§†w‚ž«£ñÁAïú2Øôyõ‰·Íçyf¦jBÔr‹xæ‰çIµÜí,–¹A<µ=Љ <}ïÒýë›–ˆÑ£X@à6‡C@@2€Æ³vÛUž9q~³jÊÜøâ± ‰ÞsU¹ÍMqžëZbîÛæPq<Œ][(ÂÓ7Ä&íΰY[D?²÷Ó$Y¦Å¾rjæpd@t#"…™ëû÷×kk´µÃaHqÃÞ©ÏSÇÚAžý—ÇÞvuÌ¿O€ üž?÷Ðoö"’kš@\—­ª>¶Ð_Zè†=jkíâr¯ôÄ(›U"@­ss"kÀK‹I%"]€Dí½Ÿx?l'¼˜—›UïûŒÆL‘9ò¾^[çÉDDüÖ¶gæÄ„›Í¤¤a™^j¶ÔÑK5/òdˆ~2Ñî#§«I‹ÃÒ0s8DÃCÐ4~4®WWýxž§ˆ]…ØB_'ÞkÂüIbs?ëuo¾µ{͉·/™¶ÂsC!ÍüŠ£þvýbL–ðûw`e qÂ%oL.BqóA€ß{ôì È¾ào×.æDˆ½£Ú•}s~<£1Ó¥À‚^3šL|Ui£°Ÿ¸Ÿ.µ¤7Û©›]bZê°C+OŽ9‘ˆ¤Rç’÷+x]{–Äš”÷¸ñVWÝÖ–8ç¶·üËÜô<éž¾gi§nÚÅO†²)½~ùäÝK"iq3CYÂ&ÏnJctÿ4Œßîßììr¯t™-YSÊîŽolß´0§x÷RYhã5uy|§XW3່&&¦pß\6î½÷±u¥tдI:ægìß­¥Nh¯##@Ï|É¥˜ÙGìBE3º.5Í~ÆþÝ1$Sd8ÄÑ(•¿ñ!ˆhs¬ÄjÏ >ü„ðŽão™ô‚«YÔâê*Ôíñ¶'yÏÉsyäMÀ—ݰϽÿìÚ ëÏ쌊l©Ì"‰Ê H„O½q*¨OZe‚( €@â•Æ’NÁöMW>YâLB5¾4>¥HˆŒLH ÀÞOÑÕ`ø¼:äYnÜ8faÏB( à€ŒšE]—Îû´„؇‚µÐ¢èˆò£Ÿ¸ ñ …po¯S-Y‹H±YÏ¥XR¢ªYëvg|t¡OŒˆ€ŒH ¤#3¶²$}¦¸ç:>މ¶Ó¿*³¾«áëNÝÝ+‹)ÜÕêÔÌÈqÎn@ù»lŒ±$ÿøÆ:q±Ì;Ö¶½ H?Àt=9ÃhnZèŸÞ XpÝBíH؇9µ÷ï6«ú™G÷Oœ'ÄͪIØz!M’¹­E…”ÄŠ—ð(èÓ°Y5OÞ5ßxŽÏ#“„8J "@„>œ.Á°ðÄùÚ}Þ¾]ãÆëV¿9©>©!ìg™®¿tZÚмóCǿ鳎=ÿiǼȻ=3_dÎJ)Æ põ¡A¯0¶´¶0SkIÇPkcD!Ò,ܘë®'VÉWšÙŠLÍ’'¥v7S~«·ìÜ[{Ö{ºÜ-7«Æ&—‘LÄ ùÙf“Ä fn¢ÆNÝ(/-­cHNŸ§„×'NTíý`8~êîíð4Ì?~U¿« á«}«éu—ÐÁDÅÄß}ø´JÅ2Âc‹ý÷žZ©™/png¼Pæs™5D{ºÉrkÔ"Â*y.5z …‘€„E6«F{‡)³åØP¦ÙþF ³ucçÏ&—dƒgvF„A¤Ïl¼‘Œ$)4Ú籆°r^ IÎîŒo^쯌&…¡”|åF¬O5P¨KP@˜ÓC âS·YÕ_yãÁÊ{M¸j–Oj:S´%j¼Êþ×£gE¶Ü-µm¦û»´¤bžy»q]ÜÞÕ)—:yâ㪸ÙІ¯S Ðv€dBÞÈ­‹ƒ¿^½°§WÎeYÉÂbšwFf…&ÞOœß®›³;£Ûn=Ú°çPJJÃüô½‹çׯUÚ!âà©ÍT,`œ^ªñ›uý¤¥ùCý^åýA¢ “ =K)†E2#6ié"N«¥pã¹f_9Ö‡à ìMn*ú_?©!l³LõÃþñÉ•Ý11iÁ±zS& [¢Â”³›p¯ dÆ´I½ªp&b\Àyڞŭª^WóE¦6…&&+6}nÆÎmVÍWÝ›e¢Å¢~ž^–)æþõÍýs¹ùƸ ˆ‹ ëÚû‰çÒš¿\YßÓ-o]”Ö>paSy4QNšzÔÌ“Æß²4˜Ë³¿9q}\}é û ¡ñø¤¥ùÇ6wº™Ý˜Ô}¶µá©dC¥èã³Ó¸ó£ÉWÝtH{®éÞª›?¾â⺄§¸/ÌÙ z&§æ5MˆÓ“É0ÄÅN1%j†õ I¦«!¤Ø, GÂTk_óggÎÏå6'r,€°:œŒ«œWw°,–ÂÌnDîZö, {ߊßйï8tõîqWÂ&6â?¼º±Xæ‰<m~c+.!OžEÿen’{Ù !JCv0È––ÈmmÖkëL䉨ûÐZŠºYƒdÕì•u×¥gÝo´à¦ætý5ñ®;»3~ÆZ,ónf»Y¦t~éJNa†DŸ¼¬&¨µŠ[e ªiž\9?qn³n¾ïƯÿT„Ù³¨Ò³h©„¢êhÆ©IXQ0ŠÍK²èÔbæªFÏ཰Äÿ¢0@_$ q·ëƱ”ÖhagãZFÍÀ ³ù‰óﶪækŽzÇPh>„ãŠEö÷:EK¨§‰\"™Hè™}Äw›V¯®Å†Äw/‚0 ùvާl¶B”n\§¶Çûæºýi6ÈS7Ž–æOã7rn³j¾î)7±È®²Hž\I¥vEGR2F[FRãXÊ,·4•†'¡AüðÚÅ›æûº-Å´–ušÐfÝ|ç8ÿ®AâÉßôË'ïVéŒ Ð µÔkdZd$Vð>zê ëÆwŠËØþàÉ{¨ÇãvÏÈ{ï™Û‘KÃüŇ÷÷ðÅíù"« 'qŒAd ²oUloWͳžv3£ÍMh­ä ÕR+ý>&¥‡cÖʆ™¥1gʉ~÷ø©ÿûÖDÀ‹¢Dìu¹.ùÅ* |<–‰ó/¾ñ¹p^W°eÔz`¡ÅL! äc¨Óï]Uiö*ÞÂ×Þ|ø/WÖÛŸY¼º´€¨®S ‰©Ø3ÂüúK7Ffð"þÓR™?|q{¾,ÂÄC–ˆcØ0OËç=5ßµ‹ºí¼çP¿KñHn‘á¦jE¥Ä(ÿ œaQÏ|™ (‰pPæ™â쌄ŒúM¼XÏraRçËüâ¤úñ']—zO „æŠL hk•/ïµý7 ®­Áö¶z~jšÐúŒU ²Š ê  nšÄiãÐèImn¼DªÁÁ½ãÆ}øüÆ\ž-”Åȹ›v-vsÓ±ö;;jÜóŸvÌfJíõ²]»²¥Åfc£“MÝjâ‡fP–¥íÏ ßÙi&“ô´]j„ÁŸJ-QHwŠÌgqÖ òlØøÉ¨xÙw ŠÜ©"õšžx•!ü÷½É. ÂÀ#‚©¡Nàu:v®_ìßçvvx4r;;¡;‚[U£­` êÈÊ•†À± ´=¾å`‘xŽÛµ»oíbnèèüœnÙ^d£ªVG\3çÆ|í͇e6[fñX2¢™-$1 ô¡4&[\Ì÷ì¤zmÏó8åØÓLaƒjÜà™¹5 DT˜ï,Ïåö£t{¥x¡Ÿ¸HËÝòçÞÙxžx¸í:ž…¿qîÞpŒ… 1œUáf9Çuå¶¶¸ªÄ¹–I2À—ݰÿOϬ†ÁC¢.`s' ÒFvB¯Îk9Å™ˆ `Üôªª^[÷ã x×\ÜLž:Q®'Ÿ»¼ëo×.Ú¨ËÍ‰Ä @íyÖ@aJø½¿2˜ë¶d…1õP ‹>ï;}þbUÿ‹[n %ל_Ót¦ñ-·nýHÑ9*°_F£z}ýpteO³âÌÚÀü6 ©S¡œÕì2^ÓëNÝ=ˆß™Á–}ê:Å,51Ü´Øÿè¨'Â6#ˆ“ås0PU=Ê-Q”Ñ€ˆ¬+u–+Å2‰Ôc§CË7öüBa^ÿýý»§–M³`˜vT¡¢æu¿óЩ¯¹ùp`Äx/-Û¬€RKo&æzcÃO&êš©g°h†Õ6ð,5³ítd4òDÄìƒT}ª©SsÔï¿)Ôo8ûÎެǷÁKÝ´ÂWÐVyFô+§î~<î‰­ÂøMô˯ޫ– ™¢Mˆ‰Ñ$ò9ËK8·¾§[jm^ˆqÌ0q^¹·©vtÚ¤ãÆ]¬ê§î^HÖ]ÔrshaS9§îNw}ø¡ç=õFVvêf÷laW0øÄ`ÛÙ™2©jªºJí—qãM¯ç&“6 Æ-:—et)VªÃ\–C;s‰ëTü JLèfÖ È/>úÖ+š]}7'õ®²ÐZG…¯Ž‰¼>ÑÞ{ˆÂ¹÷Á“epC¨€Nf´<_dβ/Fk[èïÚó;½=ú’Ãû «æxAÒŽqO`q”s"ˆgey®ãXP‚çY·ùßgÏ'³G¤–áz¤ ̸ØxD~Q “N¬ùžo|Vµr.@K²‚ÄM@¼ê‘·zåÔuÊLÉH%•m® жÞJc@À±,<³æêCø£·>ÿu§î¾;„ÄH ˆ" A‚ôIDàÝž™/²ƒýnª»±EßÝ‘‰s§·G‹"'€­º6H„(á:wCîèü\Sâ÷oeS0¬­ õFJ1}¶ï~ôÌ—ÙŸ÷±ó¥õ-ú¨Ž‚òº;‡IÛmsÃ\y?r¾>ÞomG¶*´Õw)—Þ©X(ó²%®ËZâÖ`›¿ ¢¡hñ–œ[®¸>!Ûwzö¯Ÿ}§vÕÁx„bí„rïý'öö:»;…z[ÓŒÈý* ÆlVÍNíàÜp¨Àž·ëæûwŸØèu ›Ü±eÙt9'µˆÊÀ„E¼5ÚNœg¶GÅLaò'„w‚3c¶ÃÌOãüع•q½¶–˜¢S¡ÀTÝ.žù‡oùFÝBƒgă,‘‰NµùÆh0€!l9·d¯xè7_rì®%øÂ¤ C78’G„ßwzõ†A¯ ­8ʉ®˜zyK}³Ó4P Æ‹ˆûç:ÛuÉ8”Û(2ɲ Q}Ÿ0uù™½€0Kàjdl,ùw=rúËŽì׬ò«ŽúßgÏOѵpÍô«¡5Ý7ù*&ÔŪùןó¤Ú9ŽÓIZ‡ý”o¡µÁTUjflヽIÛ¹Eu X$!ÈIœ!KÔÍì5fsß_ÿºSwkÛ¬0<â…þìÌù}ݲ“ÙÒLçå¶»KI˜˜|”ZÏ~Ú-Ùââ«~÷狼°f}4I–MšãÙ&@²= ž~êÆá½"y€‘ë©7¿à󟮫ê­s|jÙ¥©!**æËs;è’q<Ž;˜g™ ÆéÝШq<µð™í!2KiÅ‹ñ,—Ì÷J]û´*yie8qÑÜ0òƒà­yøŸßzd–.ìV‡“—=pW¶Ðo{:$î¢ÌZÛïcžóhÔŒFàœ±ø¨•ƒô^ÎÛ¿6c·z™}xcëà ×Ï¥`³2'ÃÏBg‚Ž!¤ÔC$Ôab7EäÙ]¼ÿ¹O»YDþë>²·×¹Ü²)^:Cra!ß»­mÖ/ȹsº—Na—©2s¢¦i;2us;l\åý|.ŽÙ[c™ÚbËÉp›UóE‡—¡aùíOÌå™2-r¢[—æ?´z¡ñ\³TÞïïu6«æÇžôüÿòØÛÒ² È课Âü ß»—:·¹)çVx<¾eJTl~=Bøòî*úÏ8°§›Ù¿Y»ØxÞ×+/3üÄKÜgg†Å ´v¡È›¦yã¼qa®ò<¼'à±ynzsT~g­Å¦ÁXÏD6¨ªÖnLêQã’çÐá~O=¥Ol wwË9¶qjeÄÊ`[U_zd_ãþüÌù#ƒž!jgÚÓÙ˜,ïu¥¶Í©¢9ÚÔŸÑfÔéä»vqU¡µ©Òw¯ø¡hö.áÏ<øæöL½kÂ~‘§Gìûwÿõê…šYÃO´­†\Û°™ÀE\QљҚšÍ½žØ×ïv3»ÓL|R†F´²>?5. 1~8ºLÌÅJ¡cW£KBHÄž²;ó,níL'ΡŠãˆÄ§ìZ8:߯=¿÷ìêB´fÏ'Mc‘Üy0òÞs2Œ€ØÞÆôQy2v››\U~g‡«ª=w¯%Ž-±.™‰x B˜Ç±qnm±ÌóøTÚYÃO52½Ä4ÏšC0!L›8ƒ<+8ÏKŽh—É9ë ‘üh¤HÊ´Ñb¹¿ž÷tËKG5L=¥á©»”\³Ó4\Ø$ħî^ì#®ŒÆËÝrØ4^ì6—{DEÏZþü8Ëx cJG§wF½<›uþõyßì Åy´–«Ê×u#% J[âÖËÃ× „šý?|q{_¯SZ3v>™æÅCRê¼_­å¦ñÞƒ~Vžö}bQ!ŒÜÒÖ¤Þ×ë$ >ÈAΩù'€ß¶[ÄS7ªÙ™…5K/ËâЬpàA‹&î;¢%,—æ/Vu?ÏqPd\ÝX,ó³;ãÝ¢›ÍHyR’‚­ Ör`¼)à.’¦pì>ˆ[•ÜåFÁÂEñ<ŃôÍQìù 6û×&„«JÍ ï¿°y¸ß»Ä4Oý!ÔZ$ët²]K”~g§^[SèÙG/Zu… "%V}õ±C÷_ØôÁLHXe`S9§µÀ°ØC˜Ácƒ¸·jô¶qr µäK"Ðb’VJ8·þ%7,â?<´çÝœ¹q¾¯•n"=¯eê veñ0Æ1Döìpt,ë;fƒèZÎ-àT,Û6Dã)·Q >§Oáuá°q»:Å\fscºÖ^Ñ4/ŠVÈÌõ²Ý»m¿_¯¬úÑÈmoG `|ª©&f„ï?»¦Ôбó]ë3C&v3 ©Ë‰`ç/Ã8ã‰{8vþ‹/·‘ÉÔ lƒ«„ úSñVööJË!âþ¹niMaBm#é2T ØòeA!uì‚43Ï>²¾ù´Ý ñ 2‚¨sK«Sá§ßñ _y_{¿9©¯qî¡ßœïwKk2c k’qÌôËãoa·r\UÂ^dæ’öÀEìZþ‹³k¦eÏ“äœWà ajè—¸£ëãê©»é²ô@0 “z[ Dªédw§PAEÃò]‡Ÿ}ýCè#ŽÌâIÆ©•‹xÄvË‘7}èÁ½½ŽúÉ®NÙkÏïæ=R)³åL£ÿJ4Ñ4õQY-{{Êù$å6nW§,­Ù˜Ôµçš8Ñ$u\y •«{Ë–ÃOÓ㤈÷µ÷[U}q":rT/2mF"Ô,[IÜmNP¬”$yãnÕÍ×ÞrÃo?pbÿ\gW§ä«´¶ R¸a~ý™{®£,F_•÷5ûÚ“ ß ˆ „AH¼‚&Ï}òâÞvß#ƒ"×Ï­&d›“ú–¥Á¹Íñ±…¾¶ß´VIË@l ’i„)MTÑðD¥5sl?¼¶q¸ßÓømÕÍÞ^§0ôY{Žol¥ '8uÛÄ4Œ"• ´lÛ¤ö\E¦ÚóžzüÎçÛã,@çA° ÉPÛvoj/>lÜ^þƒÇÎ]˜‹Ô.TÚjÏéÏ_òo^[Õ}öá ዎ<çWO½£-qvÀh‰²E|÷£gz™Ío^hTB ··[6,ûÝN: Á%ïJKŽS?´ÆÜ ”VæsùËsëûæºs¹=:?—éº6ª_”‚Ÿ$q±@´¿fÐjg§f¯d§íºyæ‘ýŽ¿òè÷œ<—Œ9u^G„Œf@¾Y)OÀÙ'ï;µº§SÖ$b_Û82 *<‹A¶DÖQFøÑ'Ì?ÑNÅ·zÖϽ3•€jº­23|û}ôvwŠÒšP½Rk>],.Nê,L‡%Ð ÙÁŠÐ¶Ì fL$&¥‰BÎdUpk¨l“Ɉ¾ê¦ƒrj5I¨¼!W}¬ßÛ3hÕë08z?rne8qJÌAij;£ÂQ®“did@ùtÿLÊÓ”Ööó¬—e¡]¥‡ýŒGO¿GQ_"åûÀ/xû÷<ޏéô ÕRL5ÝfFðOO¯[t3£f5š§Ø(¾æbó¨qmϬ)MA¾t:žÒD XÈ“±uaL¯Å\M}Á/?²ÿO­ˆ@i¥ÃĉxÑfD&›^=·ÆÎmUÍWÞt ö>Ž:ÅŽµ^ÜÞßïös)Ű1N$/)M‹Y˜ˆ¾Y7ë£ñM aB¹rÛMË£'l3ц“)b‡P²,ü³ÇßòC—M˜¿6!|Ñ‘ç¼îÔÝÐ6ÝþÐù íCµG]îç""rzýP„Á"¡+"Š [k­š¯@…éY’™0ç.¥­¾Ä™íá|YäD¡2·&õ^ÖÚʨAÁÕaíÎ&ÿàÀžÚó_ž[/B›zš:žWóyæ2É|ùˆ 'ºÿJåývÝœÝ=û)Gßwjµ›™Â˜§;Ù·¶(, £p‘À³ãØîé–×k*ø•ÿÖ®Nyß©õ›û¥5ÝÌFW—dÉÓíÂ"k(Í›‹SÓ¦^¢lq!ß³³¬ÙØP$¯€dÆÔ4;4Hwß÷èþ~·0¥S4U[áËÝòÔöpâøð —˜ƒºt6«z±ÈoY¼çĹýîžn™RGгA{yö³kûúÝ(ˆraŽ=¿±ó_vÃ>øýGÏîé–:å2zdQ7žK¡rà‰°xkæØ¾öäÛ/Om®Mànúú7œ}§ZP)…19µ©ÀÓ«•Ç‹º„qD$Á4f¹™ë™n×F¨{ uJÜ4ò`gýßsòÜ‹ý޵9Q"ÒM-·tÛ´þüh¼Y5óE¦àêvÕôŽol/tòúé ¸{i jÏmÿ¹dÙ燱[{É€'ô>@ç†È‡¾c.tCØË¬2€û¹¼BÁFjB{Ó€©¡Œ×F“Æ,äŸÞ7››Ü4A¾2Mt*{×Þ‘…¹¹,+¢¢* ƽ³‰Ÿ¶£µóNh uZ6¬Œ&{ºeøF4]:WHI”£Fˆ þjõ“wÍ«[[¢€ÆQf]鮯Ø^Ê’ëÚmo‡Ü[çåwž®Iü^öÀ]ºO&‹Öâ %£E´Æ¨Lnm¦âm·Þàâx¸´ Êå¼oœ«wvê­­¦i§¾B­æC[öîÙ‹Üa«km7³k:Á¢1Lm¾ìwSZSf¦›Ù®µ½,ûÛµ‹,So¹È÷Õ!¯Áê+‹ëÌ„§°¦µ» Eöþ³k#çã+÷¾Ó«v¦]œšÆ #òL·›ïÝS:˜/ïµý>MG|át”1çÏ=ô–ë² ç‹<àîEÞB•â0%(L…dŠ“©ªÝû`^ÀâÔƒ9!™:À•¢Tœúi¢Â¾%æ;ÿÐÅíå¨è(ÂlPLæxÉ_SD€¢ç²@)2_dYß<2èM3ãÍö8©£@&Áhfw§ØªêP†Šôò샥¤‰ mË,£N'ß½»fn *bödJõèX{]B˜Ù4q€¤á¡hŒeŒÉ{=3€ßÚª‡C-õ&ÎמkÃÆ%JB2 ;—pëäó‘c¯0Jå}/³ÝÌ”Æ&sÆ´“Ç9w-ª' " ‚@.Âbœåt¦ÒŒ äJ©c0»4äE 6sy¶6žè^²S5µç½Ýr†¦Ó ²OÆc·½ "~4âè45=)Ú2U‘º¹>!¤0¹~:Â~vÄ`ðHvq!ß»jC~<öD„øîÿãS+  €AfQ'g}"ÇR¢9eB |åÝfÕX®µå¬9cš°L-EŽÒmIÚ(Ù¸LÛ>}Ï¢jyUSGºRêh™ÐæDÞPå1#:ÔïíÔͰfØøS›]&fªªzeÕonq]»É$Œø’K51|%MÌ'|¿ý¶ô{ú7Ço¿Ó³™ I@6ýGØÞ ³ ³ t€`|­«‰óJøifi¢mŽ¥ÒDëi!z[Wî)»æã@dõUž5g$JǰžÄ*«ˆ„DT—~Ý3ß°­éɬ͌ɳø²63Æ´(qÉ­Ú å†”<÷퇞Z:a&µ´B÷Í«¿Í,[“zw'oó½XÂã†Ìa¤˜zËN-y¦!ÿ¬=‹°]7—ÐDÛS¸‚ìüÄûíº9½5üº§Ü(ïzätkméi#Ûs0È÷ì6ƒ»xQœó››ÓÁž ­5‡–èOœûÊ›¦Ì> EÖš²Ìwïª×Ö1˦E‚Ÿ*FŸD Ę6tõË'ï(ch 52 ÄÌ0mŠCÛ‹Süô°Ønܧ6?¡UxüöÛRÕ ôûw¯ŒÆ‰ÆB¹îqæNyÀÂJ~ls¸o®s‰fg§~hüÝqH“%‚Ù·-éA0–ŠiµÓ7cÂg ‘´fƒNoÃau欟L4ul 9“½\øFÃÆµ?Ìw~öÎÞ“*°‚, §‡Í¤9:’a:aäÜ·|Öµ‡¹o¾ãžÅ­ª)Œ1„ÃÆM-y0p XBZhE€ Xăn÷|·. .Lª•Ñ$qDu¬¥ 3´¤a¾0ž|ãSoŠûŠÈæ¤ÚÛ DFSÊ¡ › ~<ö£Qò÷‹AJc~UR$ÿèàÞK'~2SUU++T–âœBEÜ’S‡+ÄÉ™?8kðÚ|ÖÑbž%3”ð•íAJåÚ¸L“vÍŠ "Ü|üÚéwÂ#ƒ¹sñ‚¢ÌUX(ÐêTÀ½<Ö/rPã¹ò|`ظýs]Ktrkg¡ÈûyöggÎ熾ò¦ƒY”–ë–´øMO;ö'§V|+ëK%¼ê¹±ªae5 ŒTwÖÊçé Y@ŽWžL°ªRó9Í*•h™èR—ß«—û†×ž¼¼paŒÃÁsZÕÎtÂ|Íðht1@CrÈ Á(h7CBK$Q7«æÀ\wâ¼>fê¨rêpty?j¼¾ý˜¯dh¨)á+þ­¸éj&Ç\‡×ÍwÜóÌÿüëçGÕ È âÆ¤ÞªÝ<µTZóÿµw-¿QUaü;ç¾f ¥ Ô6`"ò¸1® ;ƒ­‰ º2Œ1HD !11µ,!nŒI¤F‚ѵ[W®1*õ‚ >æÎ̽çœï|.ÎcÎ-­´ÐÇ@î—YÌb¦3Ó_Îë;¿GæZÉîêÇ>1F6$r/އÒ䇿ÿ }>ɉ‰°Ó-¯ßÐIaöûväBMŒPh%Ý=õvoÀù‡@,m£Gµ„ÎÛíSºkä5¨¥FáZz•öž(ÅBa©°P8/ć{_¹‡5èÞð[ûQXùZgÏ™'“—Ïk í¬ljuec> «BÅk¢jø[ )jÄ4ÜHƒ&3½•ç@ijL—¥jwÐõ†ovŠFqÉÈ.Ô×=Êa˜šÞKŠ-v$Þhwàý=ÌÖѸ²a¥Ä#úŃ ­j.”ò­±—îocÿM¿@îT¿;ôÕ¶41W&6Ôé%X\s²7 Y5Ó€ŽüçÖ³#Zþ§·ÛÉs–ç=»Dzᩱïÿ¸†™™ââŒ9…©(áNÄë¹ Ü‹¡ŽOÍL?ÒÌÈÈzœgfÍ 'Ÿ/å]#EVÕ-Ù|ý7ûÌÙüÓ¿. e$ƒlPîMaL[x¡”w¾ýþ»%ý¡U¦=˜F•ëSÛmªzú £º&»ÂIr1¶½™óÀÈÅ…b"¿Å~÷ÎBá¥ÛsCišFkù]Œ&*ç ùö®eGϡщ©™é­IìÍ ÑˉK¥×0Cë&Õu‡ðã_¿L†üáWçqÇU»ánzmÞ#Ub_Qk{ÏGŒ˜ÛZeßk5*µÇ·6g q£Ýõ‚·„3ߥk y|)~ô’ÃÑ×éߦÛBžÜûê¬A+™Z×ÂÁ,é\y9œ!ß%Íf<<Ì8Wy­pι³`‹b_Qk Üü(¤0È;ØK|}äŵýEGŸ|yýþ]áuz¿L¤Á5lMãÃÊz†¸YÊnÞÒEVŒoc_y5öµP˜F¤‰kG*ät1‘3}ÐOuW„·B8× —¬šQÖ{gqÌÒ”T Kp780c[F9 yOÀm§^L´’.É UíSúe-üÿØWM„y.oÝ„(ÆVK ž¶xóŠÈ¥lPŒš8Óœ[^^•­ T]‰s¥X[üV5€6²ÖÂeb_íG”y®‹¢H aÂCQkêö!ôŠ˜-Ä`J= 0ãœWÌL¤Ö&èä*[$}‹ÐæCè1( cY ¢·*ðT ¢š=¤¦#cãg®|m6÷ÞÈfž»UpÉþȃ‹P_œ Í\ª,É’õ€BÔd/̵Øaç®,£ µn•B„&/ŸH“}g¾¨ õp!Ôv%1zµ»7Ä%‘1ĵ»‚w'€ÄOŽð„ÆÑSgÌßyàŽñµÿᆧ_ <<6ñÙÕ‹ÞC×^åsyW0–$¸·4O5ÝóKï½Ñò÷¹üƒ§@]›!\ku¼i C¦b`š@{±&òÞþèðÇd®Ôh-sl;xzc>éì• ;š™ñ[1Ô´8r¢ËE¶Úy† .Εâµûk¨–+¾aŸtdlb¶m)ÛRv•ê*,”*K…Bj¶½5í*UHlKÕr¶W[í§ÍŸHM½9:>53½cKfø[‰¾ÓèО(LÀã|)MÔ õËD–áoùtGáõ¼sbO½þõÙ( ‡ã©ŸÎmk¤~]䌙ë7‰z¡”'–·¢®«/Fa]äv¦®ºjkëª!¬«†°®¥ê?ú\êÅ™IEND®B`‚gamgi-0.17.5/doc/images/gamgi.png000066400000000000000000000720331433127522700165070ustar00rootroot00000000000000‰PNG  IHDRd¨ËfwbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ%d wtEXtCommentCreated with The GIMPïd%n IDATHÇì½yœe•>þœÛ[zIoé-I§ÓK’NÒéì;$,AwQqPp™¿þœQ¿:Ž :3‚Š .#Šl²È"Ë’@ö½³t¶îlÝIï{÷­óûãÞª:ç}ßÛ ó…ÐÅHîR·ê­ª³<ç<Ï¡ëo_ÇÙÞZ Ìþ_bÿÆþêÅÿÏÁ{Ì|–Á€'þ|W|¯Ì ø¿'~“!~‹ÃÏÇ|ãûŸaÅ~!öž:ˆÿ{ñïxÁo3ä¿æßÿ óuqnñÕ¹ÊÙïÅþ'ŽAžZgûuymü}…Ç»Áï üö¯e°$>N0à‰cUÇÈê:±c Ô~ƒã ¯/Ëõó×WœŸÿúZ˜kõžy¿Êï0¼ØrAß7ÖyÉ}Åß#öרqÆÏK]@­‰¼æ=+ï©p]YßëÆ1²€ìùß÷ÂõO\ y‚õz{o‘kýVÝäßaDêï¤Mì=ÿEb€(vsûŸcò?N ÿ£ñÿ0b†>¼™9øÁÃ<æÁOÉ}ȃÝG@–sô_óÿÄ uâLYŸ;×É_£`wbÝôïÊï¿w¨¤Ô_aÜ!Έծ‚3;¾&þ¹ƒÃu"‹C±‹¾{‚ëªÎ×ß Ÿï_5qÁOp¸Ü.P¸O W—ä1WŠŒoøô©Efq®þ=¤.(~ŸŠ Eþ‡÷‹ë®<‡÷»Ú/«çÁ™¼Šö÷ÃråÓßGèð,2ÉçY\GãûgHØ>â@Þª)ˆ¼Ã‚è•£ì;PQ¹ŒæI…¬áÁmX¯¯dËÏ‹h”$Ü䈭Á°¢}²¢a™é¨Ü[üîc‰u’ÆAȆOâ + = GÆ1G:3S$•GNŽ‹JvváûEê¸36“OéÐü'JÜïÎkë l^AV¤öKÂ Š”‡ŒÂ¬%̘hÄŒloxE2…°F`| x‚lÃ¥^bñ‘ý :áfû&'i”8VP4Æ% ;"`Jݹpb²;’æŸÅÃÃʃõ†VÓÒ×±r?ñý0)ȆٵÀ¶1br`I²vE¦7` ßhƳ-¶‚ ÃY˜0aà!ckCA9€ XÓðƬá"2b6`äxÜd4º!k( ¸‰ñ£QN¸ûS'›g¨ˆS£"'efØ7¬a Ú»R°‚l„µ¼p‹H”+Gò:ˆ:Yˆ»¡™ +HJ%k¤ü‘3 0} %øŽ*éĘÕBÆ…ÝXþäzÅï@™JÈÓ„…a'–P;2A¶’O¢xá=¢¤¤.žŸ 39Ëä‡a»Žu°2Æ2²½iÛ(H€ ëè›Ôg\K#Óý 1éç‹öA泎f;²>C ‘øRÇÃê°ÕIªzFx^:z5²ŽEÎÊE œ946TÍ!2AÐx¼pn1GlG´ìpPÄzÑI5$VŸ98v"„ÇÒéš¶×wO&èB"lRAffAÀ]?sDDâšXú°¥2ãö¢Ð°Œ"iˆ”ÉrL:•`íhÄëd½ajÏ|æ†,ÉHùYe0ñ{’ɨ»Ájtq #Û›‚v .ß,íÅ:®È0º¬ëìŽ~‰u×IøL°‰häŸ(„ ¶#ˆ@ÉîÏbèà*žg«¯@/SW±„e¬â0[¶Ã¥ÂAöЀ„êo“ás€J™nŒŒ2«È4ˆTÙ®³øÐS jêºS¥2 f †TŽŠe¦Ÿ²z“LÈÒ8ºàKâz1³”U¨êª#*t.º ‚õù°±®G­AÞK¡³ò¯MXŽ2šX_e}ÍbY[$HL¬ÏŸ ÿ5â@F¶¿{ ÄDÈȱÉÀÚ]©1‹î( ¯B]87›m¿$ £ò1'!ÑEi0¬öL² 9R]7V)žô:XÆíB>“‰v°«O3k CÂFÖȆ,‚Ï™ŽÌ‚H8^ÂFUÖKH…¶„™ì¶$)i¯k–å^à` tÝFczš"£ÿ˾/CÊ6ÚÙºLòZØØŽ>-c-8´ëj6+’£óÍ_2+c&+ uŸ:‹!¥?'jl¬üð™ã5FÈ[<ÿ  «ÓÌ–]‘Î"l)x•³‰XÃ^Ä;Åa“=‹Tߪ1rhpÅ3Ilvw)3"ÎU¶sZyG|_ÃcØÇ`w. '!1xapÉU ¶™h˜âµqΡc¾1äKXvŸL „ô“Êq*tlD†ù £Ü&$ ¢ ?¤óY½oó¬Éú¬.–è@DE4lx[’}̲eDW U¤gÑv®Ûá‘j œµc ˆFp0:N’sac¿ŸG>Wd4#ðˆÙÞd"½é>vW# É‚&)ŠÙŸ.1/‰ÇËŽõƒ¨‰o,2£µUǪ̈Ü7pF1˜‰¬È/(þ[ ´ÕjÕv8€_TBD¤Ú2ÃÀ‰ {rdQÚÒBÙÈÚ )ú¶Ð8­¢ñ+Jl9Un嬦*‰„2+'f‡üæK¤¡9ã³zýu&¬¶¬É³YC!ÄÊQ”‚„³ áØXßÎV•l*Í}!“y«|’éDeºOŽ{‰EIžCo˜ ÑbÄŒlWˬ}ÄZ'ÉæÍjÏ´uVÕÁ€(9Y$És‚¿`DœRšA¶+ã,º_BØ=„—¤#£e•ŒÆŽŽXÓÀÀ‰ÛK :›vô®¾ï¯79ñB+¨¶²- ݘp+NGH›d]2² ‹OA¡Ùj?fGÎGlt0Q¥˜µ¶ÚÄÙ* +-‘ªGzÌ CQèíN.U ½.CôJ‘á]WJ|PöZ±VuðŸ 6š9DM&pø¬IŽd6ޏ Ä‘"úÈö&¦ ìèöÈ~wŽÉ `;éj¤3 ?&cv×aä+õ– k*jTTR ·n=fe€$‹Mn 좿t–dÒ¶] ²d·.˺ŽtIUiHëÈ$J[ »§Ûº‚œ†CG¿DºC*pÖFq–¶Š_††,áhPN—}>9ê  „:UdsaØ”J¡°»Š ¶ãsyaM>‘T6ЭÜbŸ#C.Gœ‹I=YÒѲx&Õ> ÷Äf#!aCȈÙþž9,"A–c²Œ§*Òœ'6 ™ÐLh(Chš5+Ø*“Óp’³|(ÙÎ 4ü Ÿ5Š×WÌJ¤MZ¤àág;ë`sf&ä£8Ü%JûŠÖ Í}c ç™Ý[²$JµÈº«0GL²C‹lé ¶`M£%Û¿X²·IÉ(N¸ô\ [§É¯K‘ƒo”T^A·„AÝ%'R ‘²‰52Yj Yÿ#Ñ@BÖñ)]IÒO˜á…!Ø÷׎åM`ta“*²±½æ#dd{süÛåÅj•ƒà(Àd”éˆÏä·m¡Fj¦ñlEhÊC°]+0Ð,'¼ÄL†‹£Î` "º[{TsA¶»†á—ÂlCµ[jüžEã€ÕE’Ý/–ÏAkËF«.Ëök3ÃH Ç£avÓæA6nO"Û#Qhf]f»#Bû^’)¥Ÿá‘™ÀZ…Rª†Ì6\rÁ :3’>ðw Uñ;!oƒ ²h*©ŠD¢±¾þ²öHæ12D›ºžŽZCȱ³áåLjÆq oI * #C€„MI@Á2pˆÂ¸«§ßYq´”Hµñ£l²±mÿÈ;³]ügÙ?oõn’æ~‘)ü‡4•ÙRbÕá1ÒzTœÅã`]!‡y‘”!u†††¬ -µØ˜yS”H¨³-y±Œîg¶×$jriÛ ÊÎáÝ »H×kć}X•5êhø×YŸ’á»uç[ÐMºÁ‚ (R°A™Ãܪâ´\Zd¦Œ¥»kL?¿a:BhYRݳ2â@F¶7À%=Ò†–(žKCDld°oÉ-`-1½›²#Á\… |ÂlÔ;Èlé¤N‘…Z©ˆ«a% “ ‚èf|«Y‹ ÑI «™B‘a—«Îe3SbŒuh¡A9¿Ã%2îŠBÕ§¤ÃWiŒ[—L^RRì 6ðz›O0®Y¯½‹® ¤h¤2²½y“„ÅO=ÔÄ zØÁ&º-ÙÞÒ¼jÃÁ¢&‘caf›‹ (°1OÖ@â,cölNƒ3!VsŒÖ$²…¸üÎyópº[lÌ9¬Z¹ˆ}9BÒ)ì›Bl±é-èIÕ;H´ Ûý²°kÒ0e$Ì ß׆Y—PœÖ"™þ½KFmƒ8ì ÓP˜˜'b(E²5Ŭ͑C8ÒÔÝd§n8Tù‹gD:È®:WÖm%쮥P “‘"úÈö¦{ ’'Yo _âœì€ä~Ä#j_²DŸ5ØÇ¤‹šìn²ÉÕ]6&ÚÊÆpt.ËÉžÂ|‘¨c°2lÌÎ%wã•I[Ñ*™ÙŽÄÙÆšZMR÷(08r\05ÒT62t’$´#üŠúm¶4«tÁÄŸ i–Z˜Ù%¤,œ†” GÕL»å.ÉinÈ”ù³kT7˜ì0Ò›©©:¿ØŒØb†¢ŒÈ{ kklY¹¬9Ÿ…Cm8k™– 'j²SâgÄœÉöœ€Œ´$äe¦ '#Éúßq"$dÉ‘²[Û´!WÜ3'd'›-»°D«¬{ý AFç$A1À „ìkõ`ƒä¦'ƼR„€¬ô4æf!t&R’“¼E†Ù¤ü!S¡î•£㘀§&Bó*dMF6Á)Þ5¸N0®­¹©1KŠKJÄæçÇÎ$ÙÖÊ<4=ŽèYÊá³¥FKF7±=¡ÏÈàÇT‡rœ iéP‘5D&‘®y/ †ª]˜c‡É*]è6^iëƒ"ch!ÎSÉ#îÁÞR’3'梦4•Å™(Ê…¤ˆìì`œèÀÞc]X¿¯ÛÚƒ+9‰pÍÒ X>­ðÙ;Ö¿¾ºG|ãòÒñíkjƒ÷nyl'¶l1Œºìõ·ýäà%6Lyì‰òä˜pU¼d5ÃCÉl{çH6äø\دÕFÝž¿Þ^N¤¦D°¨¦ s§–aZÅXŒ+ÌArR’º.ÇN´c[}#^XW‡µÛöÅ;®É)|þšwáÒsæV|ê;²=DÉ¥˜ Ϙp'á>×J¨Ë‹zãŽB(d—Q½[$Ç$=k¿¤!*‚ô˜<­ ¬„´B“•x)å…cɺ·GÏ’èØR¼‡^³rØ2û õµ[P·¯!¶æžÌXžéœÜ͇ùz.dâ‡,=QhÌf8©Ø`?Ç‹¼ðBIsÅ­N`×ñ ˆÐÒ3#B,“Ù˜±$ëMò8 (Ñ×cã=Õ,eðcH50Hö;ëì<*f°'AWOp®ìi!ê÷âΊ ì6¨Åîˆ3fq ñmNE.>tv²ÓSÔëÝýCxa{36lÃÑÖ>D=Fvz2Ê‹2± *s*rQ†ŸS',½qxË7>£R#XR] Þ›Už‡¼ŒT´v÷‹!Jqƒá±ŠŒ$û5m9™i˜6±Û÷7ëaOš¶¡j|Þkv\!;’D±vé¬*|þªåÈ¡¾ÕÙÓ‡ÇWnÆê-ûpðh3†=äåd`ÊÄbœ;o*Ξ3c rñÏóº°=Õâ ]0käžò,xÒhÃJsâÉÅëÆŠK#,‡RÁ "_öè4DÉ*Ê×óÅäŒ{vÙÇ0Sb›d8Mb=ÁbºyÑÙÀžö˜NSõˆ«Î6+µ/”ù‰Cvl¥‡P¤D•±1;rl¡M{žcp9™W‡GÈRßpÅ¢ñx÷¬ë½øÍßö£«oH½ÞÚ=ˆÖýmظ¿ ¥ùéøäyå(“ñwq!†îaIõ¤¥èL(!,›^„G×652g°²®öÐ?ſܹ)`tF*Κ^‚%ÓÆò(–Nmû›dÐë(aý ,™>þ´Îê…ûðÂÆ½hïêÅPÔÃÀ`¬”OC9ŠH„ðñKãÊóçXûÙPw?¼ó)´uv+˜¢¹µM-xiÃnT–àÿ|âT–%¼.þñ;ÙŽO~ýçHINBîè \¸t.X23áyüõåMxêÅ hëèÂÀà 6Cã†ê°Ì6<)¨^6<Å ²Msè,tA8welþÈ„³»J8Á¶ôB)@[M ±{YÊãßví rÑòÀª"Õ~¬ Ë VÄlOŒ‰g5w²Š ᜼ð÷™XóO(„{Uòå…œf׺ ÍCq owçñ‘åqöÔë½úã]¸í©½ò†¿Ú-½¸ù‘]øÜ…U˜Všýw9.fF„È‚¯ümyM1[× ÈËäiÂ×`Ñx¢ ̈»Z2õœäî¥X8u~óäfD=ÏžÄ!˜EÓ'Nvô`LvFÂóúùëÐß?(zšBRlŽñù«–ãÝK¦[ûعÿ(¾uûc ÛÍýPߨŒ/ÞüG|ûsW`î´rǵcíÁÁ!8Ü´HoÝupXòƒ_=€þþÁÀÅ2΃)ÔŒböTŽ¥„-M}KåHâû ,‰ˆ]²åYqKÔš;ý[°™4§žþ»Ù2ÎþošZñ€˜• «ØQ5ÓÄ­‰£êšböŒº‡Ù‘ §‡Piâ&›/yšZ ö„„;kÇ£ͯåéuæ`=†sêo¿íÝ…õÞãœÎÃóxáà)‡¿ yøÅ_ëq¤µ÷ïãØ˜VšâÜtçûyYi˜Už¯ b¤£»É#4®ýƒÑàÕæö9Ùåü¬ôT̪,Ô&ÎÐô›P”±cFÖlo~†B£`tVÜG.^ètQÏÃ-÷<‹¡èŒÐÛyl}øÖÏÆÁ#'œñ·ª3‹Úwr‰¶þ!kj¤É¿à#Ål7Â¥8Ž ¶æ©„Rµ”s=„š-[‘YøE\ƒlíÝ‚vakü»ºÈ&œp¨ÅF¤/u¸¬Q°TŒ²Ü÷°š—1ë\pœØNf’ ýueCÓ ¬øLlDáK3k‘zÝÎ$%Þw´©-ËÁ{æŒu¾·n_+޶õ½¦ýõzøíßöÃû;ä§ÌÀ¹5…Ã~æÜ%ñîJ‚l‹Õ`u(£aÍ–¿µzç‘„¿³¤f‚¦aŒÃ]4½4øìêm‡†?/× Y90ŠùÓËpÍsß_¹ak !k®•wcëÒ30€ïÿæ1x®`€ÏB´ÿò)ÂC’D3 yšX$+ F]JæjŽ„9šØàÐ #¨Åìòªº¶ä ¬¾El“…w—™¨“dJ®Ùöä¨8™¢“2°`Å‹%S¾]£f*h"¥YC¹A %û^jaÛ×AilŠA>÷Gh±‘æÆ˜×àŒÂ¯Þ©$59‚,+KøþÊͯk¿ '{±j×É7||c²S1sbî°Ÿ™Q–‹‚Ñ££ªÙJª„{ZnkvMø; ªÇ"%9bæ1ÁßÇHkg/v5œ8µg dßC"¡oG¥&áÆ«—'üú“«¶) )N$L'ôÕ @}Ãq<õòæ ¦øãkg«“\—äE mCM- ìà5~Áå=ÙŸªZN‹qí{lŒ,1ã;áÎú ϬXõZ{CèÒ&;™ ¢ët]~­šk–„t2«Å°qß0‘%ifr‰T—HmrØ"9®Õ™”„¼#Èù3Š›éníèÄÞc]¯{ßOo:ö†ïÜéE§,ȖׇD-²Í)¦œß›nï÷hK5u8gTj2æT•ˆ(.ŒÇÉBYqÌѽ²£ñ´`] †1‘”]º¬crÜÝ\­=ؾAdDïw&¹ ²±î}jë`„Á"§sHäÊÐ`"ŒèX( ý³P®D@>¦È¥ò$¥½d«Û°ãòéaUœwÜ˦¾)›"/@LAC*!Í !{‰XóEà™¦GtÆÙÒwœ‰ÐððЮ#o¨¾ÕÔÑ]G:_÷÷S’gÇ[w{¢X½;qT¿¬¦I‘ˆÃê ZMuÓp„Õ;ÃXKkJþ¢i¾:Eý#|ãEHÃVE"\zVMÂïnÙÓö N‚9kH´6KµY‘æVlÚuP\ÖbM$!ºÓÚ›>àÞŠñqVÄKQcþÏÆ%¨°—ý‚ƒÉ‰°#+0:ŠØâ¥åGt†*íÊcrsEÈ^—w9nÑ`Œ›Ê?ѬHc´.Ûúh<¹dáÕ¤2„"œd8@µKμÿŒc H©H4=Ôs>S\É;ÎL*ÉB^fb2Úþæî7üö·¾îï.˜”ÌQ±æ¸5»Oào[Ž'ülvz æVå[òD~P‚ÂåMhiM]bkîä’ X>‚¾iïîCÝÁ¦SÆîaÁœ,¹ŽiÅ ³Ø}踉4‰q¿*¹äm3^\_çÆà…Éx nCáõDšÐj[¹æÕsˆ¿³4è02F £}ÙÒKD$j°u¦,Éܸ1s O2Y<Öïj†»!}¤:õ1œ˜…“ü‚,‘-ÅW`$¥]:)Ì©¦>Ê.Bí¡Õ$K6¦7†íÔ$j[ŽA&„ã Žy‡#äí¶M?E«í±Ö¾7ü;;^÷weëî ;›pàD7Oö$þüŒ±ÖäÁ`Ú„| •}7µõ þH›ó7RS’0¿z,  r2P5>?€¯¢ìÞ¯m|ÉûÞÜê Ã~ïÐñV1gD>ÅTF³ Ká ¬Û±ß€SŒŽ‡ßIìBT¨$CCWRàÒÀqX*³¨~Ód†®¥if=çÄÎMäqȲ°Ás0%Î]€±šºgUûÙ<~Õˆý2r&ƽ`íWŠ®±ª$Ç, ÿr´r\ö°Ž”ÕŒ1µAVb+;¦r…¹  ß¶Û©dFNv ¼áß8ÞÞï<¸ã5¯²8e1Eý±.iéñÒÎ&|ðìrçw¦–æ¢8/ÇZ»¥5Õ­ôº·4áï¯ÞyUãrÀXðÒ¶†à' òàšºH9l ,ö°O_0ì÷š[:… 02Š©Ê0Å1ßÐ>ßôÚ IDATÞ‚ë¿ýkÝ’ÒŠ²­Ë0ç`Õ”¨R¨ÆŒªuŒÄ59Ò9“ã4³¹Î]aðB2¦Hä‹^²Ã„ Þ„øLŒc!5tòÏÅôÉé,ø‹’Òá±%z"µ°ÈÒŒ2æ9Ç­rF%èkOHH˜p"Õ6ˆ–\vò/ý¡PÌf¶JFæÆá|u9јt àŒð"ï¸ ¤0;mØ÷;{ÿ.¿Óx²'_/Df+w6Å;:kvŸÄPÔ& ) æ¢ÃÄR{E+þằfU#sTJðY¾êìéÇöýÇOë ¶ÛxýEɘá3ÃÖÎ^=tW"§Ý=<©o8޽ M6>΀{²GB,Îë0 1†C>E¢KB`P´ûÚËè(¾Šƒg˜5cJŸLM]³bÙ(“X“&é~ ÿO°4pøV²§a2i9[ú?̘ Zcݤf%’”˜õM¤5\E#³!ã¬CÞ=Ü–h†N Fz†8w¤>|ÒÕ?èý?9®ìôdÌ«Ìôôa]}kpv÷aã0u•³§— %뚃1rÔ6H±Ï´tö¢®Á݆œœÁ‚êq3r³F¡zÂÀںÈPð),¯-sËŒÜÑéÃ~³o`@€G6Îí„æXð2à½+Y²ÃAŒ©~‘ †9È ÅZ3³!GÛhøwÖÝN¤¡¹ÓB$;‰è9ÈhÌãÎó7 )oŽZ‚œ#ž˜x¢²e2DæÖ\:OY!²{uã^„©P6%ŠvŒš[p”ta„p44ØŒ“äøÂ4äç@R“‡?å¨÷ÿ&4X6­0Œ_³û$C\À‹;›~7#- ¦*î%ÂcØ.“h/®묚  §Ž ¢ëÕÛ¡ñ¨Óð!ŽoZÊðŽ=õ´,„;%*^2d@PšùMN?”0“rx2¥ôÎ «Ñ¾æˆ‚A‚ à9³k'Ì’È0ÚJ÷\zYÙ5ÒEoW „LACƒ˜G¡ü¹Ô}"§±»Â‚ÙìfRD®Ùô!{œÅ5#2ô¿|iÀžBiÅfQ ï %í/'MW€ÔØüµ¨ɰ±ög†yÇÕ@øT¬§ˆ@‰€üaº¸†Ûz£èéZ¯'EçL/ð•MdÜÙØŽ–Î~ävCpçÕŽÅË; †´Au&{|Cx†"q¯ÔÁÇ/œˆ#2›QY„Ñ©X4-VÿèéÀöýM¡€Ý)úÜjåñÍcFät/ŒœC?©…ùÙí— GføF<‚Z²žÞ>´wõ6® u\ÎZÔ LIYb»ט®g)]“ð!—¸0 ÌjØ"ø2ç¢þÀZ>†…P ¾6B+ÊÈmún£xAÄa 6‰Æ=«0»ªÃ$¸dQd!QWñq/œ7Âdg ƒ9-ÁÚ±>"S„æžÄ6„TbÂ#Eô·ëÖ7EfZâÓNMŠ (1Œ•™–Œï}¨öuýö³[ãþÕÖë³Ës‘““‘ß{¬ G[ûE·c8¯á¥º&¼w»[©jl6&d¢¡¹+LÁ3ˆ(a¢@`tt`ǘQase"Dx×üJÔ”ðÕ ©ü©$@H é‘Ò×?ˆ¬ŒÄõ©´”dôöµ-qŒÎ…ß÷3¯ëº<ð?¯àg÷<%üí©¥LĨÑEd*ÚÕ'b²Ò³eÔ™Å/˜û46 ½…»-ÞL êì#”`á`6½i9pb~²eÎ9‰‰“™fª -,äëRºœHû«Ë4X.´n±ÍÎ'9­žYq Ø†4‡‘¨öw uÌÔuñg/þŒyâø)Ô‹ m²©£à„õöÛZOÑe•ž–ô¿~Lç bãÊÍq|Üi°ªnx‰•ójÇ \žÄ8pAp‚±¶§NëÊåÓñ¡¶V-cøÈÝŽ¾ýÇ´¹mxöfFjЦʆã7ÞWOAÆ=†Í¤ y(dÄ–aÑ•M²¹°nÉ\C¥«Î†Yf˜ÅnŠ‘ò»¾ÈA±PÙ’IXt•¶%§P†B’ìØ7S ÍUS#–¥¡‚­B#«“šPë6ØäB2[a@’†°c@ü4&Cr8FÇ ‡ ¸Oë_)‚’%ŸI|ôw\r´­¥cKŽç¤§ ­;q'VWß>{Çz$EY£’qAm.tÌñ·ûV5`íÞô Dõ•ÒütL;:øûuçWàºó+^×¹-™ZŒû^¬GßàPÀööç˜á¨øªxòÖî:‚ë.ª Yîò†‰K¿÷öbKýq£ž†¡‹Ë¾›ÚP1nLÂïæegâD[w¯úSõâO|gwÞý¹ÿD„€œ¬t\¹b>®¾paÂýýôî§ñÜ«ÛПMâM™Oÿ7§É†`Ч‚d²NQâ8Tefá,[%_C‚æÂʱ¢•‰â£ˆ4é5 Ôl‰!J) djm…Ä8RY¢«”L¶SchQI“ˆG‚iÁ´Ëº”‡¤hõgs«TŸ$‘,²ˆÄÆyë¬Cµ_:[Å$üHÙxhue+3 [vC¡CcÏDù3ƒ©pìÄÑú`KØ7’¼m·-‡Úñ¥‰YÏãòFaýkØ_wÿÐ)M¢-#5 ‹&Ç¢îÞ(¾÷ÐÎØçY¨‰úó˜9Äho¸h *вœû<¿vžßzD?gÚKLF“©z¨X½ã0æL*Nxìkv4„)få­Oat,=ÀÔcd¶µÛáÓï]šð›ÇæãÅMâEøÍŽh³«{xEÁ¨§k áнӀÄ|®‡c‚ëÁO>â<ò´ ~Ý]FJn½djp^ðç0òE@¦ÁçØ™£hOá|\æ– œ kž‹ÿ‹ñ]b¸x0ú<˜$(\ kª^¼Âp zƒE‡•õ)Áа¥OH+ ˜R(±{ßÓ1Ê6MR"ŸAåówhÒÜÑ}ÇãíåE¯m¶÷‘÷_6­ h+^½û$š:úq²k'»ÐÒ5ˆ“]8Ñ9ˆ“hé@KW?Z:ûñò0-½eE£QY’ K8QTó"±°e³ë}ÝîcŠ:£o`›ê’ Áä¼SÖÈêâõß9r²ug!S&ÃÒ9W8:) ?z:ª1Ûd8ò™ë¢ëš±Ñ^ªt Ig¡&‹áXáü0^2+ ä°R6Äw¶šÂêÚ#€„äé13\…šÐ¸‡CN„ï»ÆÏ’p´d?C-eBF-&<ư¥W÷ô²•1 ìh)rЉë ("ò5Id4’”¯a©”¬ÛÇ¥3q oãí™­‰ ðä’,$'~Ž™žúúŠî©É¬¨ #|ÕºK°²â X»çÄðÌôÚqöÃLañ05%|'%)¢ÉXñ»½·÷º ú†=G10è¹u¤NY50°{aÿü–„ßœQ9)þ|x!Ámx|Ë•vê‚ z2+&Dk°Ò?Ts0,Ûæ›[õ“DUo¨â8‘]hñ[\™b*cNf@^ šŒ †bi”L£I*Ëul׈Ö5 €ÞªØýÆP- ݪb‘ëi¸2fÃÃJL4k‡Ìüž æaJY}u±û¾!à Òâ}‡: ûZ±¿É] IKIÂŒ 9§½¯qy£^×1œ?£(hÝmëÀQ!â(;U$‡—ºú†°ù@bfú¢ê"d¤%Ã9o@¶h—žjX¬ð«wN_VúéÆSä|!|ÚVmÙ݇ÜÎ}TZ æO›(!5n8IÊO¡­Z2a+>ÑB@¬ç€˜Ã¤|¾ÙÎ@jȶtT’€¨1I991xfÙùDÖÚ“KÖK®†)³.‹èƬrRs;ììD{/Cµ—0-ZèJ¤‚“AfgdñS`×€8t’¬îcØÉ Dè^)Ën„‚…¼ d oëÜù°ì0î§»Í˼–­$w.™ŽÓõuÖš#@™‚šÝË;“Ý$áìš²ÍLyq¨;•š’„±ù™ .ñMÀ†=ÇÐ?¨k<CQlÚsT×â_ŒœÖÀr_»õÞç10è®+]~Î,aõÌm¿pì/åò¹Õ§ïÌÈ7y>_"rêS 1œ‹¡ØÙœA}‘š°4p†'Ѿ1¶É"3J³­íF(Gæ‘€± ‡¬ ¡¡ã¯,‡ãÐÙ!ëɄĬ†Cj‘ §iÅòƹ+V½]‘£oõcf;¹`B½Ñj'µÖˆÈÞWÙ™úc,îÏ‘ äm¿míÃ?ÀÉ‹¨7 ªNíвӰ|Úk뢓•ŠÏ¿»JIªäg¥*¼V(O"âc`Û¡¶aa¬‹æ•!-5Y¤à±›7%% —.ÒmÂWœ5É™G E±~·ž°¸qϱX›°„#â_ ¦DŽ-5Y™?˽qL¶ýÇw?ç¼.3'—âܹÕ+;(4帢\\²lÖiä!ñOB+i))§€-S9ug–`4®{"8 Ý*3‘p˶RË v’Ý_ $¬5éïËy Lö5±¥íÉ87cVI•Y³·•vdI¦”½™íéñWúnb¶|˜ÈŽXÖt£‹Ì–lÇ¢T¡]÷iaSŽòÕ…•4ï²ë¿õNv"':û1kb®¥œZ;1G[ûp¬ÍÝÍS”“†›.ž„ì8 5õðë¿íGEQ¦ª‹<¾>­—dàœé…øÄ¹åÎqºó+ó–’„”$Bj¡£wЩi5¡ Ùi¨)ËÅìŠü„£oÓS“1³| zû‡›•‚¼¬4Ô–àSNÇÄb­|[V”Éãó0õ‰ ­§? ó¢žšHøàÊhhêÆqcF#?;eŹxÿ²i(›Øñæd¢`éi)ž†Îž~ÃðŶCÇZp¬¥ kÊ­¬fQM9kEñ ƒÅ»bJ‹òðï7^‰¼ìXV58Åwõ(¦UŽCfzÝýþÑ•Á⦤DPVR€1yY˜T6¹üTMHÜVR˜‡¾þdŒJEvVº{ûõ<¸ÚpÙÖÏPY)D?ƒ s+ðxèeWkXƒI =ƒD¡JH°Q!?›u/SS °ÎÌfu³#³`«~S EÁ² NéE“G«oØ„G2‹VVç‰!^®!d~}Ž­Œ’YfÎgÆF×ß¾Žñß&•dá“ç•£À¡3µõP;Öì>‰Ã­½ˆFÙi˜51gU %žEtôâŽgöaÏÑ.,šœëÎ #üÏÞk þÂÅ“Psšµ•cm}øæ}Ûb7¬¯7·\7Y£RÞÔõøô>‰î¾03R’"¸ý/FFZ ‡¢øÌGÏÀ`@×½íË— 07óuýÎ5_¿½ýqÒ&{A ÁŸ¥QSYŒüÐ ;¤Þ_ݾϼ²œÀàP%ÙX\[‰‹–Ö"5.ÌØÚÑïÜñ¶î>ˆ‹gàÿ»î²àû+>õï`Ž5L(ÎÇï¿ãë^¯ë¾v êêâF ¬…$åù3LB.‚‰u]>EÆ¿v¡Ò‚$Zeù3H k$±1½azi6jJ³Q^”‰‚Ñ©ÈHKFR„Ð;EK×èAÝál>ØŽÞ›+1uÜh|ùÒ)*yÍ<Á˜NìùñD¯>[‘(3¥9aTÄaÔ¬¢MÿÁóBãçq |ËÌVÄYÅkF${KDè0¢r†ņ¯¥Ds¦NÀÜ©e˜RVŒ’1ÙÈÊHCrRº{ûÑÔÒ½ MØXw«6íAO_¿3Ë̘=u"þãŸ>Ï@¾#"z#BµÎÁŒ|õkvÄ®?篷^7#¢…q=£Äð ÿ÷<y·Îàa×>t^ ÈИ}nêï’èê…‘xpoyžV¯õá¶@y×ÈxŒè]ŸƒÜ~†ž˜µÈlÃ??ó1×>ÌLXfBâsêø M®¯ºÿ뫟—øýÀ<â@F¶73þçàAa‡Q  ±IœòÔM/Žeðã»þŸC#ã!|áé!Fl8*2,©¼êyall8§!4œ‹Þ¿o” X@i„Q6÷¯ ’6ܶ³0µΉTÏW¹ÎÉ<_ `(é8mhŠ §¯®¹t¦!óXÁ:,Ør|ʨN0æÈ<Ša׺÷¡xxâ”0á°­±.°±‚¤xÒQÊßcí¼Àȳåäue_ÃàòŒ×˜•ã‡UÆõ™aEFÌõ[ЫCŠÃ‘Åïp;ƒ`R°Üb™¥y¥I®TÀƒß¤ØwMNµÊ&¤^ k £µUW4‘‡_ƒ9 ¹>¼ UºåˆV£å’( ?ÙZ‚¢ÝTŒ-u´(°™**Kдß× FŒ²f“†ÔclŽ¥%Íú–‡Ãfå—C¢™g¡ß¡î XýÅlRË-±+)£Ýêì”H±Ÿ߉ƒHÏb UЫæãÖdEx¬k"/"”üVÅ7 g§œIj¼#ä-™Î&Ö]*Š!u1Œ¾ËB¶Üfàɧ1”Ã ÖÆ”2œ‹õ ‹†Í 4v]R®¥‘“òçŠk!\©èèQâ€l´Š’9õ—D‹3YÚxJ`Ïbm;Ä™…Ø8䥄&Ï•Â6^“ÌÐÆ¬0k¦¢:Ü®î…ecæc^­q¦73=Z˜-5%ObH¥èéÂ@j’ˉòu%Àï-sÑã Î’(&'ÊŒLù‡â®ÏzWb1åÄT%‡Î,[5â@ÞŠS0×B¾Z³ƒ !PrGerPO`ˆHÎe–ÓÜt„DάȔ…##rf~1“,Ñ#²ˆoát;‘ÙE =" 8…ê¾D¢$/©¹!ñc¥pî[C%XØTÁ$s1¡MÝ ÒWÖ*ÂÖS!ð.YϬtp_ïŠFF(B\q³0ŒGÞgd²eáW¶û’cß.Z©”Xøvs”‹$ÈJ”’HÏÄRN*A%š•á';c ó7í» ‡'%J¬Ò>³p\Út¥¢ñ@žQrŠ#ä­šƒør ¤#sûypHFˆ, zBýQ˜´™í5¸ÚÔ öMfØ¿es<Èe)èBRÇa̸V³Ë> Þ’ÈÒ|™zÓ€SPË ½ …™ìÌŠ…>™Óø,(TvG®ð™É–.aN‘,k+ȇLÉv·)OYíÂCº“¸£(\_ÝFf‚,#z#Úf§±FpÍéD.H zܬΛ½œo"1®F.b§¼ïÌ)ôŠeh°õ5q3˜ÛÎZÓ†,zÄŒlo„ņ°œ„SH’©Œb* R±žÇ i´"œ]a\8ÈPL®.E‹$ŤB[1®Bà@â#n<Â`—mšÂ¹äÄÏDt+A6ÒPý]ò°ç‰COò#{]m'ÏáxU+­#}Rë/³6|(C\o‘YšælIÂ|·1¬ 3Qhyi¡Òл3aHu,+‚p_F2›tpbˆ5ˆp……ñ†¥Ï¥ž*)ÑB¦s oV˜žx‚L¨‹dCÆ_‹‘2ù_ÙTåáÛ¨Á/>=·_?ÏùԷՂWÛ¯Ÿ‡ÒüôÄ–È:¾zùtüð£sTZ-ýä3‹qöôbÑ»Na‘•D ðxfS4;­S4»ª÷}ãJ|îòù¶‘!‡iü¥ßýë5X1¯ 0§z<þüƒOফ—ÁÀ•Œ tn§:sÒx<ù“›°tVUh¬Yâs±/VO,ÁÓ¿ø .X2#rHF´ ç;´Âü\¼x×÷p΂l…@HП¿1wú$¬yàL*y3&㕇~ŠÉåã±dît¼úðmøÆM•ã Œœ5Ë›É=¿[)Âê F&—\p6þr×O°õoÂΕcç‹cç‹FÝË îåG°ëåGQZ\åáµë…k4@Xkf‡æZ¨#%sÏ% ç¢q竘Z=)Tâ%= ÌX±|)ŽÕoÆ-7ÿ›†}ÄÌZ&[DÑ¿Ÿ—-]Œ–£ûQ3}š’ÐO VÅþpïN|ôÃׯ,lHWMj|)F\üž‹°zÕKøë_ŸvßË#¥ÞümrI>u~öïÆÊÃΤo(Ê8yŠçoµ­²(}Qné&‰‹%Õ˜w›–AÿPTE4csÓ‘•ž‚=G:ÂAF$™¹þ„"18'ž•°Ê¹}#î…Ÿ&Vž†ˆðôÚz¼¸õP5yІÎÿýø.Çæ ;# ;Ƥê#DxbÕN¬ÜT¯ ]£ x°!ó8ÜDÀ´ò˜åø¢\˜²‚þ±F¸éÚwˆ°£þˆ u¹`s ÇãúmªÖü;Fí”2À¶Ý‡ˆ,g %hĘ̀­.GwoêŽàcï[îÞ>ì=p…ù9øÓ/à©•k…› HB‰AFšhHJ¾dðs$TCÀÜÚiøá׿ˆMÛwaÍú-j$«àýýh<Þ$‚g·²gì¾Òci™]´8Ó<¡LÌæÍ®E{G'êv×u±IÂoÿpzô £Þþ^80K‹ÿ‚ùsÑÙÕ…;ëEÁ2à Æ_šZ=còó±jÍ+aæÁ Š€ª¦‡Š-^´~è!lÞ¼¿ûÝá³&]ìTyË:óf¡ñd/~ôè®3ªèTU’…ýÍÝÞHOK•‹'`{C;j&ä $/šºÔ3y\:zp¼­7hp Ù¾Òyxz ¨€«bd°“˜tÀƽǰiÏQñ°(>³`]‡±õ´ò"´uõâÈÉÀúºF¬«k0º¿Œàbs‹HpZeŒE^ZœÊt3¼ï9{&¦L,A{W7µƉE§SŒ7牙$²ƒ†CƒÿNÍä2knÅÉöNÍÛP†;”ö®­.ÇŽ=‡À ÔN­ÄŽ=Á`¬Z¿/¯ß&d2d †,~@ØkæY®OÁhž€#ýÖdøðû/FÝÞøÈ_{ ˆ¦›ªú[]Ö<+õbxVt.' J>м9µX¿i«í¤EfA`<óüJ<óüJ‡Ž;…™Â…Ê1€°hþ†Iexô©çpÇþ„'ï½Ý:¾îž^<ðèSøÖ €pÎY ðÿ}ñ³˜RUޤ¤P‰údK+n¾õvÜóࣨœX†¼Ü|õK7à«_ºAíïDK+nþ¯Ÿá®û¨[ÿ"~õ»»ð?ù%ÀŠó–ã_¿òETO®Rûß¼u;V¼çŠ`RUòóó°ný̨™†Ÿy¹Æ'NœÄ·¿ûÜùû?â¿ý \yÅå±skmÂ’eçã“û0®¼ò ŒÉÏŸ‹ÁAüé‡pݧ¯¸øâ‹ðoßþ&¦O›†»ï¹ßûÞ÷QXXˆïüÛ·pí¯Á¯½[6o²~»«« ¿ûÝïpÓM7.½ôR|ï{ßÃôéÓÕùmذguþó?ÿ×\s ÆŒ£Žå¾ûîÃG?úÑbÕ Š3ÁÌ*R?·¦%¹zúß¡æ¬Ú}×,€%SÆ`þVômª’œQXþ²r*J ñ›>ˆú†cxì¹uA:ÙÖ‰ÊÒ$''aûÞ|ñc—á¢esñü+[ÑÙÝÄ¢ec qѲy¸í®Ç1cJ˜ÛvÀòµ`flݵåã‹‘•m»€ÔVW"õðàS+Ì“’”„gÏÃMŸ¸=õ&W”⿾ùìÞ×€žx.(IINÆ»–/Ä—¯¿<ý¼Î ˜]3ÌŒMÛvã‡ß*&ŽWUöíu{ñà_žÁÔªrüü_GÝÞ}¸÷á'ñ?Ï¿ŒÔädüáOj–5–.œƒð ü÷Ý"99 ¿ºå»ØµgþøÀ£ñãR’“ðž ÏÃ×¾|îyàÌ›=Ñh¸÷!•q¦$'ã’w¯À×þé&Üuߨtí5xøÏ¢­½=¸Î“'MƇ®½ÿúõob̘|üé¾»±eËVüê׿ÁŸy‹—,F4ÅíwÜ 7"%5·ýü-o‘aÅŠ¸ñÆqë­·"##?ü06oÞŒÛo¿]ÍyõÕWqë­·âãÿ8xà´µµïUWWã#ù¾úÕ¯âÈ‘##DÕ Š³p´­OðKæŒ foøÛ#k#-%‚¥Sb†ýÙmM–s¸íSsÐ7EEQ&·ôâÞ—¬ßëô°xrþiïë’¹cÑÚ5€›Ù…¨'èÚ÷¼Ê<\A%˜•Å™8fœ—¹U=¥cÒqÇ_ëƒ×Ž·÷alÞ¨),^ÈØ}¤Îß>»ƒQ|ôÜIhéìǿ߷Ѩ´2€¾!œ5},À„ª±9hhîÄÏì„/öö£ŠåØTߌ;ÿgÀø‚ÑøÑgÎ ¢ÔIãóÀÌØÓs -œ„õ»Žàæ{^²ô¸|S¸ó@Þ{Ö4üôÁ—10ÅùóªÀÌØ}è„‹—Lʼnön|å§ e0„Ÿ(fSnšVQ‚CÇZ°ûбx!=í]GHïÆ®À ëë08E4êa×Á£ø‡«ÎCSknúÁ±5ÚH½}x×’Z0€ËÏ_€æ–v|î;¿ÆÐP4Öcf|èÒeèÄáã'qñò¹øÅ=Oâþ'^Âx@Rá…?ÞŒÞÞ~ÔN)ÇÁÃMèìîEí”r8|=}X¾hfàX„Úê ì=x?ºã^CÐèîëÇ¥çDzī/9Ç›[ð±/~ƒÑA‘•1º{{qù…ËžÅqÐ~öŒ)¨?ØˆŽ®î Óø‡_‚ü\u¿ÝrÇ]×^ùmjÆ>õOŠzTßþÑmq¹/8¾‹/XŽŸÝüMxž‡_uŽoÆ»CƒCJˆ°«§W^v(^@¯Û]¯÷?,Äîî\õ¾K0æÎŽ­Ó†M[Á |üÃÀá£Çpñû?Œ¡ÁA(ÁBÏ®o/˜?»÷Ö£½­óçÎÁöuøÊ×¾©'á¡««×~à*ÀªUkpÓç>‹nú’"„Cõ»ðõÿûo¸íç¿T:_ÉIÉèhmBgw¾öµÿƒ†ÆF,;ç| ÅÆüì'·`ë¶møâ—¾ÔÖ¾ðÅ/ZÚpW]y%î¿ÿ~xž‡n¸ X²d Õµ=z4~õ«_á«_ý*n¹åõ^JJ úûûÑÙÙ9’ØÄ®|å®-a6; ßþ@ ö5u£ª8 ÉIl9Ônüs¦â@sú=Tg¢î°{±‹²ÓÐp²÷´÷U=n4¶7v(ç1×Ó?„¨*ζþ‘‘–„÷/*Å“¡¥{ ˆZŽ·õ¡¶,‘#¯‹W•d£ñD7†bKSKs±õ` †<¶ {%y8p¼LŒÉãs±ýÀÉxÎLKÆØü,<ôÒž›“¢?p¬ `Ji>ŸèDoÿ Œ²â¬Ûu‘Å¿hcÿnuY!kÅà`¬€_]VˆÆævt÷Ç2§Uc±aW#<ƒê>ËZJ-ÇŽiZùXì

ýéOaÝú èêêÄòeËð׿>ƒ¡hhô/YŒÕ«×$,lúŠÊ“&MB[[öïßsÏ=O=õ”å<`éÒ¥HMMÅc=f9n¸k×®q æ––Á¸üt<³µiØB43ã`sVÌ(Bgï ’“·_?O}.ê1~òÄd¤%¡8gžØpÔ½¿âL¬ÜьʢÌSï+5 Å9ixrãQUô~ÿÂñ8«º™¢nò³§ö¢²(û›º1*%‚±y£ðìÖij̯X0½QüϦc µ>ÞÖ‡ä¤ G±öÞx7×hì=Ö0žš„’¼t<¶ö Uœ€Icsð×M È•Œ’¼L<²º>0“KcéÞíÁw'ÏCKG/ZºbÆ~òø|ì=ÜèK5µvãìÚ‰8»vbˆëöà‘—vâ¡¶Çš &`ס°€^]VˆÝ‡š2G%c|aîv“hã øK‚¤H`ŒJMFYI>~~#Ú»zÐÕÓ´òfJÃ'/_†»žX–Ž.L¯‡u;ö#+= Šóq÷«4ß"~’5U¥xøÙµÈHOÄ’1øÃ£+U€oBgL.Ã_^X‡šIÐÚÑ…´Ôd¼tÏÍj}‡†¢øÇïÿ 驨(-Æ}yi¨(-Á½?0cJE¬„ÑY(W„ßÜ÷Dp¢¾Ì ƒ1sjxâyde¦£¼´¿¾÷±°ˆ+:Àj§VáéçׄÝdñ£ÎHOÃäŠ øýŸW-°²ÉmVMl4ð¶º=ÈÎÊDåÄRÜ~çýÃŽD_ùü§pÕe"7'èõé/}sfNǦ­;1*}ª'Uàww?Ρ0Ë›;³¸ÿadef`JU~ù›»¬î3€1ov-î¼ûXÆ>§6mÈÎÊÆ¤Êrüøg·‡OƒÑFB•ztf¦N™Œ_þê¿‘—“‹ªÊ üÇ*:¼ „½pÞ<üæw¿X8.^Y».æLÌCó‰5* =í'tmppï½âJäæä¡zÊdüðGÿ´ŸgfeaFM ~üã[ck‰àßýw|ò“Ÿ@¾¨£\vÙ{±xñb¼òÊ+ÈÉÉAuu5¾ûÝï:íÁâÅ‹ÑÜÜŒQ£FYãsqñÅÑ]Î!B4l¡¹¢(õDQÏVT ‚ž(ÖïkÅá–^̘{ö5ÙÑÁèTd§§`_S7VÌ(:å¾jJ³ADj_ïžU‚E“Ç`ÃþÖXßêwáãçLÄóÛ›QYœ…Q dbAΞV€Ûÿº߸ºÆª÷@I~:޵÷‚˜QQ4/m?"¤±±cÚ{´ÃhiŠsÓ1:#{´¡*>nvï‘öàIœ4.íÝýhjë Ús¦ŒÏÇîx½#-5¥EÙxjm}0_áw¿„sg—#;#FâŒDóªÇáÚ3ñÄê:ôaRé<»~/`TZ2&åâñU±ü”²Bvl-8.m©x~ÅXD"„ºý1øêpS+J‹c…ôO\~Ú»zððß6btfÆåá÷¿Œ©ãb\}GÂ.žøµ™PœœÑØQ߈éU¥ "lßÛpüÃWœÜìLlßs—_°Û÷BrR2|zUktõôâÙU›Pßp k'#‰`ë\ûó®ÈHOCå„Üÿ—çcÙGu¬¹`Û®ýaSûÑñ%ÈÏÍÆ–ºz̬®aËŽ=Á$?¨ÈËÍÆØ¢l«Û§$\@í´IˆD"A=l> Éo³¦OÁ¾ƒèìêÁ²Es@DØ´}WÐpô™\…Ë/:Oýí%oؼ7ÿ߯îû3j§W#)) ›¶íTMMÌ@yY)Æäçaæ˜7{"‘ÖoÞ¦!'"”‚1ùذy 233P=¹ ¿ùýÝ æÎ "º ›CŒgÞ! æÎF$ÁÚõ1ÞÀÚõ•$ ƒQ>± ……X»n=@„ysçâ÷wÝX´`^}uRSSñË;~\ç¶¶6<øÐÃØ¾}ÞuÁ ^]»68™E‹"‰à•W_üó?ý#>üáᡇBÿÀ@%®Zõ2~ûÛßà¶ÛnÃâÅ‹ADX½zµÓ&,Y²«W¯Fjj*n»í6u,÷ß?¶nÝ:â@\õ®¾!4µ÷ß 7àE™xzóq4œt×7bEùÄû ÛMݧ¹¯Lk_˧à'OîAãÉ^g7Ù¾¦nTe¢§G3Ö À‡Î.Ãö†œèèÇÎÆìlìàŠέ)ÆØ¼tlÞŒ/ÈÀ¨Ô$ì=Ö £ª$=hnï…I››<.3êvà=ó'¢³wÇZ{‚ÏMŸ‡½GÚ!BÅØÜÿüQ€Iãò!  p¢£¼°CÍ÷8rb >qñ\„²¢\¤§¥Ä3ÆäÒD"+Ž0ubŒr¬¥S˵ÈôI´±N+/AgOŽ· 46·bRi&M(ÂÅgÕâ_~ú ¢^Ó+bDÃõ‡ñî%3ÐÚÑ#Mmam%~ÒÓ«JáyŒûãê ¡µ£G›[-^xíäpûÞ|í³WáîÇWbÏÁ#øñ‚Ù3=bë=cJ9:»{q ñ8V,ž…Îîh<Žùµ“g‚x½­£ ‡Ž×}Ï̘Y«—mÙµ¹ü]hië@ã±f¥áÈ Ìœ: °µn¯!ËÌ™QÖ¶l< ‰kĘ9} 6mØg×NEk{4²˜kß ®ûÒ×±sw½šÃQ6¾còr±që̪©FwO/öî; [[‰1oV-`ã–­øä‡¯Fk[;öl0¤Û=Ì›k4X¿i+æÌŠ9šu·ÄÚqçÌBó‰“8ØÐ`rÔ#ÓçÏŸƒööìÚ½W¾ï2´´´bï¾ý0:m±p^¼Ð¾n#¦O›†¬¬L¼²n] B›??¾å§Ø´e 6}%vá0µØê,Z¸'OžÄž={ƒÙ.‹-Š¿¶ðÙë?ƒK.½ ›6mrŒÊÊ bÍš5Xºt)šššP__ï@¼‹-ÂøClܸ7Þx#ÞŠÛ[Ž2± ÇFÖßr3SPšŸŽ=G»‚iMí}ÃwuÅa¤DïoïGFjÒéí«8Kí+3- cF§áh«ý½Ú² E=ÔïBUI–3€³§`ü˜tÜ·ªñBÿ=/Ä=/ÄÝ/ÄW@wßP¼•—PUs':úÊ ³p¼­®¹ ³*Ç ¡©½ýC¨—ƒú£íaàªÆæ`ï‘Ö7šX4i)ɱŽ+Š9˜ÞþAnê@ Dˆ†^Õø|>ѾÁAL)+@{WŽ·tT— · M1GU1n Žžè;‡|U`gŸ>0­¢uŽçÕx¼ c rðùœ—6íÁ¦Ý ¦UŒÅÉö.;Ùª²bnj "îàg,ž9õ ÇÑÝÛIKÐxüdð¾¤9,37aTZ*Fg¦£ñØ E`ǧ"žYT`ûßIT`Ûîƒ3&ǘéûã}Fu¶ï>ž `6ÏœZ‰ƒ‡£««ÕUe8tø8Ý=~F3ª+q²µGšN2쌚)•8ÿ-Ö0|¬æW0S'•cݦísfLÅæí»àË×äŽñc‹±·þ ‘Áç-[ŒÁA¬ß¼³gLÇÖ».ª¹àܳ°kO=Ú::1ov-6lÞnðbÚ¼9µ¨ß˜7«]]ÝØµg˜µ5S±ÿÀ!K¸RþEÎÝX8.ÖnØssgc݆M7™ï~,˜‡=õûþÿö®5èÊòº®Í÷!"rñ“‹Üor±X“jÒÖ4Ó1S;™±éØuÆÞÒÉL¦­uìÔÄ´¶R b šzFÍDÓ¢¢DÀ ‚Öª(7‘«g÷ÇyßçY{ïç™NH?™s~8Š|ßyßç}Þgï½ÖÚ{a÷Þ=˜{Á,ìܹ ¯¿þß5j$ôï-[·VÐT†=¹{|îÜ ðÌšg³$Z€yóæ6+ ÂÈ‘#±qã¦<¿®ºÆÏ^þY9r«W¯ÆÌ™3SÀ IòèÑ0`@Ëÿß]>Ý®éèŒÒ8µj¥iÚÍî?t k·îFÿ>MUÖï̆‰Cû†öœÕ/½‹7v}€QCúà±õÛ[òÛvH½ ¿ìwv¿«³ÒåÿéeãñÖî\ô>¥³FÄê—ßÅᣠŒÒ?ù>½:pÅœax|ý;عïpÂ:“os«lßs]zCŒéê‹W·ïOרÑC0¦«®¹t9–Ô-ƒûŠccÑÊMc»úãág¶¥lìœÁ}qê)xåÍÝéí7lŽ}ØÀkï4%Ä㇖·v§ïš5álL{–Ié÷? ³' Ãí®TÿQgŸxμòƮڔ=Fœ‰ë®¼>š2»F£ï<°:÷ÅW/íÄ‘gá¾'~‘α7wìÁ)=;1zè`üý¢¥­Éc†bóÖ· tôèÉ£‡â/¿r9>8˜×µkð|ì¼qøÇ%U×ÒçŽޝ]sÌI@×à˜7c"¾¹ø‡èèlîk¾x)fNclQàGO<ƒ—¶þ¦Œ?ËzP`Êø‘Xþà)`lzåu4ÍjrÊø‘XvÿãvÚp¥(š6i,6¼ØÌú;zôÀÔIcðwv Þÿ ï­ïÞõ ¦Nƒ /¾Jcg²IÏž˜:i,nüÚŸà@õsõžèìèÀ'æÌÀ»»÷bå« =Ó§LÄ¢e÷¦(ѳg³añ­7b˶×Ósî{züÖÅâÞWâÀ1cÚd<´â'¸â²K0sÚÔ#YF ;¿yá<üÅ7n‚˜yÞ,\ò}ëƒ^™GÍš> k×7¡˜Ù3§ãÏ¿ª»ÎŽœ?cnýæØÿþD}x _ÿ›IÛÌž9ÿ²p =pþÌé¸õ¶…yB%sfŸ5Ï>×ü÷Y³ðôšg¡ tv6ïû_ÿk\øÉO’¥só[¾÷½eX÷üó¸`Îl|ëÛÿ”Þ0÷‚ ð­[šJ©^½šÐî£>ŒM›6§ëîß¿?¾ð…ßÃÒ¥K±ÿ~tvvbîܹ¸ãŽ;°oß>âÔŽaÁ‚€n¸]tQà@/^Œµk×¶ˆÿ¬X·½ê¹DC«…ý°m;àÎUoàð±vì=Œ'7îÀ¼ g`þ”!áwýtÓNœ=ðTô>¥£˜ý÷ìŒ8ã4¬zq×ÿùwíýà(V½¸ ›p&í›þüÀ¡cXýò»¸ûço¤Ÿ+ñ:ŸŸ;‡5ðèºí©tÍÖ›»Þ¾ç fŽTè§cÕæ);zäÙ7Ð5°7æM’ÖLU±ûýøó§¯à?_x Ã÷Aï^Øòöž Æ €FC±•¸“ñÃâµí{qôXsˆÆ¸añãç¶%˜dþŒ‘˜;y8ÁŠÝûaÙcëðØš-QLq&žXûjš;aÄ`¬|úå„ßûä ;³?æŸ?Î<ã­oî2*,pN× ôéÝ ›·å ýæŽ&œ¶|ÅÓØ¹·¹¦=D0qd–=¼Pà+žÂˆ³á’¹SÌšìÚ½ÿö?ÆŠŸ­‡B±ü‘UÑ5Ÿþøyæïíܽ îZ‰þd T÷?þ>ó©óñùKcæý¯Æèá]8ý´Þxá¥×0zDNïÓ^në©Fá¾Ç~ÖLXF4ÿÞ†—¶U*¤œåöêÙãGÇ+ÿ °ôîG0jx.¿øãéÚ>ü°o/º S'ŽÅ÷X_y8¿y´ÚËð{È)ô5è™Ö~÷T©×k]žÑõÑü´ý@ºãG¬u-sÉÉZ¯ƒ’™Qéko(±ãž´ž‹­b°iƒ}ó´êÚèÊMMrTe¼½àEêpkãQhòš‘ìRÃ5Ý—ÊDŠÆ~«ñ†rÜ Ê3ëDÞßéůV¼Ztû½vÂ:9ÔÁ“Þ<Ä?aþG^/îEŸ˜…#GŽbÝÆ—Ã9$ÁÓya°¿…1Þrb-ç×ÄO˜1m2vîzomß~—Å–|Jv"†éÿi°f®‡UF/ëõ®Î RÜãŒ/48½dRx ÙFEè•[IDAT)ÔH£kƒ¨ ³Ï<9VÈåOgû´î¦Uˆ9T´pÎhrV«#‚V†@T ÔÇCòoÈÃÜ4C„åò?Ó{¯V’U®,òDÜF°®P Öî#YÑj¥ÑO½)Û¯<ù½j ×è0uâX\~ñ¼ÌCô9 —^xî[ñ$:l#‡ë„Íæˆ+ÌÄ·“)Ym-¬™¬™1u2Öo|1í»|st°ªø‰j]­OWÞ£*1IHAyº2̳æ$'¯ƒ»ß†iܬ' k-ÞPMI€÷Ь÷pÚâ>±%\«Fƪ™ð$Â|Ú¤G’ۂͦv©0>Ⱦ¶îÚUÎÍü©ã ²Å©®ài [ÝšI®lÂAbÕë«1 q0‡«jÁ«[@~ÙO$Ç]ò€Pš²ªä•B‡o³Í øþxPÊÊZ¾W+¯¶›…WõÞè¨G¸Ã< ¿–ŸþÔl|és§?Û·ÿî{ôIܼðûÍëI°p@ '—R ᢕŸwƒÆåû.~¨âª?þsÊT\ùÌ’a¿×DòúKöõPcаŽê¢%J|“f¶1P 5.àiyt}Ño]M3"ÛC*àÆJk0 ã ßÂÎý£ –´9nI‚$ü^ ž\ý9[q6Ï,¶œpÞFä=«µxnúýI…Ò0T.£lªQ™A±ËTñ÷jÊdk¬?p0‰[ > æ¶n9Œãó2l l”* ۴—øºÏ¦žž!q$»—ôûª5iï¶álænžE#ù•'œßqñùW×@åe†û¨^[^šçÅœïçæ­û{lE+-{˜¤¾Œ´¾(rtá»Ýóâ«ì¾j„¹li­IV­æ}à÷Šö-ïS7·9öç„R!b“qJzÎ.¥À¡¨õRgsi.±9»60“xlÞÊWU3L Iïžœ¯é€!|>¡^ëÇ8Œø´ÜÈ[½"Ht¿Nk`¼ÖÅzƒ ùr?5¤³îÈOLJù¸B#Uu!‘‡ŠC•$Ð(†ãJðO0tϼ”Söå;Q³¼gøŸÁËB4ÙÒò¨ã6”Ø>ŠÌ^Ft‡Ù'êx¡Íf|ѪàÁû ûž×£tœ“šøZß»Ôh Az‡ÔL'ÏÕ Ý™ÿ›Z‰œSLJJ(•µ~Á DE™J%.„íTÙ#]-k¯’ÿnÓHHK°IA<‚DÔ26,òs±rÄÈð•3…e®§à>á ¦ù¶‰E GâʼÇv-,°½þ{ì¹O¤¬Ã:¬@¢€­ UH¼¾"`ð¦)š tÿžùÑx©©xv,3ÖjWXŒÁ,­µqp¬$A9 “š”×§àŸJ4¸g=]·ÐúPRÅŽ”Y áDJì˜x¾E‹ð£Šå!Kq°@ÚŸ_yô÷bûÍh²tWŽˆÚÔX‰{q@, BN}IQEîlR½T()ü/¬êÉg¥–òKˆ¨éªÎª*¢µ V ~Û,U«"3ÎŒîf¸QMÊU(MâJ0N8”%fÈ)«Cu‰´Z±òDÅ™qyäç/6 …€À$0®Ü©¾RárÅ\«?vi÷ ïêa©ÆÊ+žÌR­‚¤í,P; …aÞZ&YWW¥ÖRj¸@[ï;_yª«é•}ƒO¢Ò Ý-~Õ«†WKÄ©N<(ù¸Ε‰À–PJç“„_†7«­š×,æÈÌI²‚UóÙ"^ÚÅw*4tBÒD-)ÁjfHˆ(57_~¶Nåà™Ïxu£=ä,]›qùV¼«€– ±<±^MvùÓN:eõ±Uc`÷¿“zà÷’»KS°±—nJp´°â}±œ oI¶ŠM ŸSÿi†²¶L^Rý⃽Ò>?Nuö´x¨Rr¾@2eu Dt®÷d2´mnÈ{ÀHžR‘®\TòŽ,k…§Ô@É"Ýžp .ÂåìÔhþ)¥êÁÈŒˆ¸5dŒOÓÅañvv–;!M5 æÄ é¿yZøKZÀ;ÞW£­…ü8¢uíæ“K΀ÅÖp•C€Ûé„}2ïTö·Á­ÎÛ=?e¢aÔwJ,ÔU6U¶/v«Ù¬I¨âuµ‰ HŒ„ ×*æ R$"¯AŠ:-ÔG¾U$­B0·ÛTüFjöçE|#tTëÉyÊ#3kÈY$À˜’Nq™³o ÔM„\Y‡’€r¡†>Xõ­¤FB‰¥”XhO§ãeè­hL¸AEb]b©å‰Ws€Ð}—xñÍk¦i’8:Ýó¡- 7y5³ØZA|3$W£°Ý€‚šw² ÄèxCPeRK_K>‰ö§rOLä¸55ÈfÐ[÷Ìmÿ…º~.E%Ä-ZWˆ}gÊå}i<ÚôI¹„§‘#>cU—•#ãà E(âË+0ÝÕ¶ë×ö¥¨¼T¢¼vœ…æµ)N«¦±|©„lÞg¹RR+ÅDR>ưž ®VU¼† ùiðÜ€ØgÍÒZž£e8 qç§'ÝYl&—¨©.UHð Œa•+Á@bÔ+PuôspÓRu)B‰}‡h¡tÑ…¼Ø€[U-"R(1Ä$+T˜·Hûók*G”±í:ÛÓ ”ª g…Ó$•¡£R“È&+µ PÜ„§î%Šgœ‰j+¦Ô"±jñÿáäŠP>{Äàè<¼ŽÏ)Ê)…zeÄpâǾ0W@ëWØZšƒŠ=õ‹‚j••g|_Ygä*-ÇoIz@FD¡š›=c³Ý¥¶:à}¹3H“- VyèJ|“caѴܰ©®“Ô7eÄêùA"Er;*ä´î½ ˜ª2´`tÛ¤ý9Ñ刈¸CK ò ç”',‹'tÊB _ñ%K)¥®qvˆÄÑl*¼XJP›ŸÔž},ýÌã‘r3¤Ã~j:Ÿý$[q/}ešþP=ùªÄ&.k;옫8ÄàVÄðª`.¦¢pý(¨Í\¹Ê°ŸSÏ×§u3$C=T”Äa²¾GGãµ9Õ¥y@fŽî¦²Rþc‰0$i7²6¡t¢Nà&"…Á”¦“_Šð­aOXPuÐ Ú*¬öçDTú׆C¥]m¦ÔìÓ•ÍØ1êÙ"ÅIæe15ŒûmBô 95ª×z.“Ë»­Ëœ=¤`¤¨µ,«ÐƒQ$/5qq¥ëØfÎÈ•N*Zð?j?I¬¨ ipYy!.·œtB#"l4æÉv3‘ 0PeªZ¶¦Ô>#¶".A§IlnfhÙfL¥,^G¦\Q¾CgÕ0`¥ôk*ªQ„$@Ä–WKÍÜ6-I µ´Û¤ý910ŸµÏ‡ëñ³’ÄŠàl]—À‰Îزºq‘8ÉVÒØjÇŠÿŽœÛ¾þv±d5½ÍêÓ¸È%NâÌÿ"ö•÷wk¾0•ƒºÚó_–ü"Þi‘êè ÕAF1׿¹O̓/©ª“QµD}¨Ÿ;+Gdb^¡+‰/J;÷ƒhIÑ&¶º4€.°©ý¦$$ÐLÔ×ÕX=ÔWåBï'T~ |e™ÆÝkd±4›ÎPP+ìs—”™ÆÍ…*-'EëIU´H÷®BxN–ú -pI™Už(ZþÝDR9f1ë> «ê‚“µêTÖ&›ÌQ ÍX-î›ñ3¨› U79jÄjTlÈ“| T95ÚÃAàF²¬å«ÕÒ!.Rb=ÈB…€D·ë«)Óe~­$í‹øwëQ()Ð'o1~Èþ@4ÕRè­!D |I.† XšorT‡× ̳Uî‹RNv ®¹ 3T­­sæÑjs6›W•,  U9‰, Û¤Û ùœ¡gÿ8›Åjh~•PU˜Æ0ÄSDÁŒ8hV\Ý\'±³/.­ÄyXã(]§¶€²­,Ì!­Æ <¯aúsCG‘&÷XˆØÂ„ïäÂô[dZ%­“#¯v­$>ˆA4tL‡ÿÒ²V_‚ÍžDF;R ¥%JW#ÿ âFv8²A3tb-É“$Lb-°í€l¼$®s\KcßI6¬dUÚ$R÷ìˆùç ·(3Sߌ埙S #2sdóžRŸ¹3 —ÆHä"õ²,áµsä¿*—¨¥=¦~œ{ìþänz¥}¦îy‰{/,gÕ®@ÚŸ=„`„ºÏCLyoÞÔŽsw/‹†´h,„ŠÈLˆÈ¢¶Ô#!¡ÒtŒ‡(•ð;×K¬ ¸”/CÅzCp P¿àMNÄ Ì±8æ£Ô8+fÞ¸IJ•ˆJÀÎy¤†_, ”ÆÏBÝÂ*ZR\¸n^ŸÌŒÔ›á#%«ã•œ„ÛfenÌÍýb ¬ð®i•@qã¬0À÷G‹*ÈS{­N;ïÃ̃pÕfÜ¥L3ú¾viN$ B !‰Þá´‘$÷7KµÈ-ˆµ({óÊñ@r0 ‹7Rס[¨—òaé&ÛÖÊ2ÇZÛó' Id±ðü¨ÃËxl< .8'X paô+Ï0‰é×aRÙL—ÍýiüL=L³°b­ä÷ q|‰Øª©…*ŠG(ŽñTNã€ò”áÒpé"·«\C)‰7ý*¥rè„›…%f—ªƒÍòôñ)ŠãAl›¼Wã{ŸôviNHìP?‘×¼pšÔ.¢’?õ£ØÍ`¿œñª(̸>õy»:HÞMãm%3‚q³ &7`ÄŠ_̹¡E#=áh`ÆXház««öó© åI&ê|ÍÕg·¦HsžÄU)…ÀdFr¸_ÌÕJaÀ¤K,$ZUő䒰tòká;I,Œ)>i Òfq2iIøh¼DÔÊ‚ oµÌC~¾˜dßue+]µð-—„œ^qÕ—ÛŒÜ µÒl´¬L÷G™ÈIu\ý/Ь«Ó׫ÂIEND®B`‚gamgi-0.17.5/doc/images/header0.png000066400000000000000000000103631433127522700167310ustar00rootroot00000000000000‰PNG  IHDRÈdLäè\ pHYsë3øtIMEÖ-6³·Z‚’IDATxÚí][’ë( E]w-ÙSØŒÉfÈž²Í6NœŒ©®©¾=ŽÃC=J]íjW»ÚÕ®6ÐP)ü­ý]‹z„”\í¬C¤ê’­¿/Z0œýäq Þò‘K°þïj«]Cs!ÖéÛ·î{㯅ø†? Zo˜ë@üv£”Êûé; S)^?£ÿ}ÑÀO""*^÷új~K!ž]°0ÝÍ‘Ž„_TI_L‚0’-¨‰ˆêRa.Žur0{‚ƒ„’·YóC×>ø/Z0‘«”]ûi[ë"»ŸC/SÑaÁt Rh9ÎuBƒ÷õo€ùßzí¤æU'þœ»á·Ë=öêàÌ,¨ô!©ì-58ÊÇ>ÂC¶}÷¿¯Þˆè• ö+‡š˜W7ZŽ€+þ],‰N4cË`<»ý1Äb·5Ô¥ŠHµäèÌ\ Õ¯vÿÌÀIW^ºv)êMò~x¯1{b}SH'³þ¬RuM¤“ål0h\[MÄ󝦯î(èšÍOp]‚r ­*’#Ð¥ýÎmFëy‹Ý©~!­BĸãÉÆ Ë–¬“VxGDTˆþ—Í}°}‰qzu®t*ˆz—â8(ìígÒl”­¿ƒØ²¹ÓÚ“·žà削…^{°E[Y1¶Y‘Óä }¹ÙmûaÄÂA “¯"ꦰÚ{¬—‘bPCft«K"­N¤'EÛÈ=õñ‚óH”dÙrv»M=CJá=g¸UÖi{„¬¤í¶â;È:“Q±´?”Ø9‘JœXÁÈæçžŒÀJ•9|!«^žÓº AªÈQä,ÛV쵔አPw¤-GÑj‹ÇyrØ+¤ªü.¼Ù*]9‹2[,ÙíÍl_ÜO[|´ë :…UîlÅî{[Ñ€¥¡nUՊ̼a]WÃëóÕ]Hú¶ XчÂAc6v$°Gû¥ž:§Šß›·H•H\ËuÆ“•+#T‰hî…Üy½™z˜¼kÊ-ç+Ù¸`=V•‚ÒB‘'ÐqUµª­kÿlÆ ”‚[¼’|Ê•u:wƒ_*[õ!eÂw°®(#Û|AÍyÈœãÀ®&Ûñu•ƒya0A${¬´ÙK¢í|Œ7eÃ<`›mRÎró‹w,¹K4!5óÂ0_5] „ Ç훺¦¬hp}űؑ­¨úë¨AD T8d}*̺R7ÄpËaRk21µþ ›!ŸGV¼œV9¸RJýI°Mk£¦ÄõL©Ê!Ъ!ñ=¥ç]Opzõ½PÚ«6 r¦WðäÉøŸ_mnЪ DQ¶x0Ÿ2yª?$¸uÒNÔnV)Û:e` ²‰~ú¢Sy5J™¸NÀΩÉû`^pHj¹lK‰—u¡,ØáL~ò!‚g,lnM`ô ¨º—š^R½Â>Ô4/47p¸ÕG í?¢VO½u&®ˆ1èw‰e ƒp²k†…2/”ËÍHÑ>@ɧFóÙ5Hðxì2È…âXëIfv”æ‹|þ|ª%üè±]zÄ ) nsµÛ!Ò_F)÷ƒp†¶È価‡vEBƒl"ÐÒ ¤Ù‘ù+ и *ÏÝÖò 9 ä$ ÜüBTX2YH!Jp×ΘÆTª¯2½ Sat»¤O,XyœDЖešl¹©tÊ+߆_ï‡AhntG˜’įžlIù¾õï÷_Áê=@·Ã0Â$䦌N~wýŒ¤ÐªQööUØÏN‘71äR¥£+ ŒŸÐÀTµ,‰ ËgVGëutÒ»šuN°Ô¿’„Òqýn ‡Bî|¶Lgä2Í }òÓÚR"±>† þÄ(³Ñ]äÝk¢<ýNuéÙÌŒh‰Ð›å–3 EüjÍ$[74r9ÃnwùqA‘R£"ãÉŒ@,sƒ&é-,Dn<š,K¥”\3*h™ÑIï"VéXáüÂN·Û+7ü`£)|„šÛ„§&ﬡaÓŸq5'¿èI:­+Ãm¸Üà oëuCØgóÂjî¼føkÜ O’ÐÁN;@pÚå>B›lTÜêz=ÜUrvïÊÂ[6×P`¥dËÜ@ÙqË¥r„!ÙôOÞšcã•}ÜÒLÂüm6ñ¦ú©(zž$×OÃßgàXÆtFÄrYùfÕ)CLéóX´DŠÃO(çŽqؘnPc¯Þ9>ö—·¨³zªÀ‘B5“§ï W‘«<ÊVêRy7bñšÞà¢ù Ä'9±¢­ ÓÅט®ÃeÓ€¿¹0×o3à« ¦¶o™á†dÆû0›ü˜çl5À J= ªâ$‘•k´ý“;”Ú˜‡Ú,Kq>á̯K}uJ©GÙ>‚XtÀ‘hàÀiYæ8s̼Ð(ÈÝSºF{ýü…Ëd÷ºU÷±°þã¹i=w%’k“‡j¤;R±®Ýê²±_Evø©«ËŠÞ“phnpshù•È:˜Û_óÍÕ½:û^¬oÞ™ÔÝ9BÝ(Ígׯq —Â7¥´@ϵ|ßHÞG¸öA\Øûf{ž$·›„½d]ô÷v·£G@°ûU[Q ‡w!KpHQ†žÙCþèlož·%˜¼±äÆ…Û¬ÓUábÖ³ŠóÀ2ä1Ó£]2fN"3iáL‘å#0h’±Â³‰Ðgè~"ÄBÒj½ö)é9z¬»YeQεY[UÎdã“B}±'…¦áq.@z²ÒýxT3Œ,–ž/U«ô;—‡Ü©ûI«>^dÌúhFƒâVP^íÑ-Ë@ÊÆaMÂPÀŸ{(ŒÅèt¾ÕK“ÐuuÛœ.Xa®Í Ýø?%£ñDךÑà6q&aþô‰‘³›\ Þô`®|&HI+u]w¼ { àïPdÚ`M¼Ç’zÁËVb»õ¹R?Åù ¹fÙT„`¯~ŽÏˆõ½½¼{Òúß–Å´†g<˜_1ÊÒ `ËœGˆ^,RHAÆ0À*õs£ð¥4nÙZx°Ê/Ëçåô÷i3SÍ"¹³¸›½‰¤{NÇ9ÒZºØòÆò¤?éqÍ$ùT‡vãRã @ŠêϪ‡Á‡DϾ¶”4“`ÒÚÞÙ-6›N4™Òãðj=û€…Ý 5Ñ×{yý›öê ʹMÒ ÂÞ–xªa¨ yòž™©]}A¦í§äBÖ ùÉ±Êæ1¨jkñ_ú†çY¸=+‘ü]rGÆ ÛåÃ+[uÑþ{ŠR­[ÇúÈw æ…U†Õ× ªîÃNÅ »#–Cò˜¼Ú~Y¹LVÊ8 GcÆÖîݪ0CóØ?»œžÓJ¦RWàS‹æHéJvy:I‚iîFžö¤Ôb`âí„nR.ÈÖkÅ»w–Ƥ·t+¯nðŽ…XìI/>š[b¸=ãŒkÀ;‚ÕzxQÓ,’¦–q»u«¢oKXè§w­‘Pd‹Ë)¦ª¬&àZR&Hضµ8LjÆ•p”7HhTJÀ-cÆAª¨[$¹DÃÆê&QѤß.4eŒù×ÈüšÅâ\÷bYAü¬ðÎ?A‚ÚÛ9Öªª†ûrí f?Z¡>ê:xä,Öª”Ø9ç½vžeÉe¸ž£áùtú0xv?Öüܽ¥ê,@.>wÌìëy㢀*r—'·†°3ä_eî½Òlgòú)jšÖn°‰­+dWæýr˜Ò;M‰Þì¤3è±/•Ä70ÎXo2$®ÑLÏ´hIi-ÞZiµ°Ï«Â£ss¼¶ëšr^c$:šW;=ÎEocÌîþœyöúˆµs<õ³r´2Œ/̬l{„T‘ ’;¸Þ}Mv ™%ib•šàYk=,ïü{ÓÙtÊÌÆÛ…¦K[þ[8Øšáö•¶J>E°$^Ù‰×çÜŽ¤4þ½aN§;±Ø[n™ÇL>§Ç¥ÛKîRÌnþ vþIˆTt…U˜ë®z6oòÇM[ôØXaVejÎRR ™8#p˜M:lü C <‰ÂpÒmÛü ˟ճ܀÷)êw3cãÍoYæS Ý2|9Ô8DçtFT æ)x=ƒ °žI"Š­³|z)i³gÀîÿT “åÑ^忉s×ÿ>l³ïPR nêÌ­vT-\­”’h½ìÊ4Z½H~ù@RßÛ¤pE²µ¥ª¬0Åeœ)›sPIí-Æ©µöÈÓNü¤ÃtçA°vãköÏ{çDrŸã*[áÈ –ï·*V2¯³·¿Ónîü*ù¢÷ùqõ`Öi“ÕÙgwéDјÙe¾>ÑêŽÛ½-:¯·V@(¶ËUü›»/§LtYn/©vºA«Pl.TÕ¬à¢z¼®OJºY€Ó„B¦@GM¤¹òò ˆÕ¿2Þn?‘T9ãnÁl¹ª¾‰!°2*» ¢Ûj8IÂÆâÆ(lêB!=D)ÉÞn¼üoÃJ'·h˜$C—zÆÛ€_ò3æVš^¢;Úd®¹p¨»«ƒ[6×ïYM"UdÐï¯DÏg÷Ó[õcåucLÊP9¸÷¥Ê»R®Úœ-7O­hâWˆ”Ë¿C8¯m^¬Zšèˆ4(ÌÞÄVÃ-q,6‹6ZáÉ ïÜl˜¼&%‰¼¡òS<Å[ôçü‚UîÃdÒR”¢–š¯C©ó—$Ž•…InOбch;´ ûzùa¬ó³² 1r‚u~©¢H£L]°HDêP†s×é9‚UL;ÚgÉÙT°G¨ZTŽ«Šcê)¡‘‡/@§’¬d´j夅œÁyå?­šX \(XÂïÚ-XYоn‰5aâH󸲋¾R°šT!,(V4‰^¿÷’$r7q ÂïØžë?ªž`U”ZÂeç+ ÖIU&(ÕÆ)T`¥šM ãÏ)XÛ¤ªNåÑÇô8‘}©{Rõ>žb5l Ò<…ƒ P±3k 0òü.Û!çÝE4𸳑áŽÝk—Ãt>u÷À¡w›ÏÄI‚U'ì r?Ë]ì œ¡þ{‚¥²,(U÷J|` Ç sÈ ª­HòÔAUB.ÙõCœGg(ûoj&#3×Úú6篊¬ÝN£ÜÍfáZš,ó‘›ÒJ©ð«¥²•ÊD¬\™× øl°ì¬_àX{­ÃÿSèLÿe=Èy(¾·ý½Gr«’ŠÿÕ¾¡ þW<ã›Û;j7$ŽÃz}áÃ^ñÉ)dâj y©ÂkƒNøK×_[ój§D¬«]‚uië]FÐÕ®vµ«]íjW»ÚGÛÏ "óKnô.IEND®B`‚gamgi-0.17.5/doc/images/patents.png000066400000000000000000000220161433127522700170750ustar00rootroot00000000000000‰PNG  IHDRxzûÎŽ IDATxœí}y|ešÿSWß÷•î¤sŸ „’È¡   à1êÈ(:ã1êκ¿ÝÙsüÌìŽ3Ž×ê8£3Î¬Ž *ŠŠá ¤Ó¹;g'étú¾ª»«jÿ(ˆ!éNÒÝ9pûýätuÕ[o}û­÷}ÞçDRÄÿÿ‡Ù:ßøÿß2¢ù‚Pœï^ăoÑ\^xçîú;ô|÷%f|›ˆ^º¬ÿŽ».V®îÌʶÎw_bÆ·†h0¸¼¼§dEß²å}+Wuq8Ô|÷(6|;ˆ&jyyÏM[Œ Öx*×vffÌw§b>߈ ‡Ê+°¤¦;@,&7lj..ég¿Z^Ö³{o]mM*xÜÜ«ÀÔ¡ôû‰ùìîT@®[9Z“äùÉ/Ý|‹qòÓÌ’÷ßYòÆ+å–!ñäg&iÝY¶s§Óg®1àú:B!¬§Ka· &?mxHT{>ÕåâM~šPÜrKÓ“ÏKM·Ï\c&áÞ0Ç·”Ê(Â„ÃØä§ü„¡AË决s­|A(â9uµ)¿ùåšSdzSÍÙ9Ö>s<#Óîrñ.œK‹³ë `®‰NÏtÜv‡‘ à"I £d`²EÂïã´“‚Ήĵ©CùÒó«ŽÉ›rvŠ‚›¶4ï½ç¢PdäÒ…T‡Ÿè“Ĉ9%:=Ãq÷ý—﾿>-ÃYYÕë´óûz%5Ùôåõr( ݶÃ0‘è çÓ>|ñ€YíZc2³l ÷ßÿà9µÆ "Éå†Ã!T&óIΑ80§RÇêuÝ·í1j’¼7ÞÜ}½ÒKµÚaË}àò •/Ö{ýëO?CQ&9Å¡Iò„Á‚…ö¸Jíݹ»¾dy¯ÇÍ5÷K=îÇ kϧÆñ81aN‰NNqk’¼£ ‡þÃåâu´*) ÍɳÊä~µÚ#“ÑNFPæ»ø•JíU©¯tãôÉÌÞ_4ý>Ĺ#š£u{e>W•p®h*\ÉÎ0/ò*7 …Ò·¼¬ÛãáÖžOýâp¾¡^Ë0HåêÎÛï¬Ëɳª5žh¾ü›JšF¾÷ð™I?}*ãÅçW5’âxœX1ws´h™™ZÖ@e„¦ÕÎùÄÌïîûû¤L(ªÂ„JßÙ“™ïü©øÌÉŒn“r _ÚÞª¾X“j·ó›êuý}Òˆz=ÜV£ša dE_ÄÎV§ÿî¹ÕçN§s±Ó™£ÍѺ–a„>Ô!>kˆ9´;ˆö» DîG z]œËÉ;r¸ ¼ÎèÁ«ðÌ)ak³zŽÌ’·ÞX‘™3²qSë¸oÛ[UýSɹÓIÅžÄÝ„Paœ$æ$§ Ç"F£‰b#Váä×2 b˜ûd¿r:yƒfñœ± ×óÎpF ·î0L<¾`¡¥h™y.{2GD“½Rï¥ä°süF™ÓÁx¬À0Z©òÀЀøÙÞxïw<žaP$Š*±ÌæèÝaB˜×¨áçYEËúGÅþV=Ëï¯ÃÎù·•ïÿ÷R—“ auRŠKû÷?vjVo:s¨½CÕƒü¦oÖ¥WË=—u@#³wOe¤Ò€ÏwÍÇi>?¦P¿oî4«33u<2 ¾fM K>z€&±Yeh±ÛùãöÙá0êvs'g¹¸¤¯leŠ23Õ“ ºb•é©<öä3Ǧ<“¡PfŒfƒ—æ@£¨åæ(Êì¬úGÿt”à ÏX› ^ãÔÃWõðãÕ<þ¬ù[U“˜+£X\ÖC¨<0»c:¬¨è.¯ì.[Ù½vCûLµ™(Ñ•«M+Ê{P”!ê±§NLy~hHv\‘=8:7?ߊNµ Ÿcp8Ô½û΋%øþ'¹Ü™Ô1¯ø"1ÉZ ¥2?ŽÓû9Ëd§ïÝWsàoKñùˆ@€…0·‹;îòEvðq¹ŸýÈÏñ\H¡çÕÜGp( „a´D 8T~¥¬¢‡}Æ¥%ý[wêë’i±Û4øýÄä:ôhˆYêØ}g]qI†Ñ›·ÊÚK2€×]Li1jëuy³dÜ·¸Ü§¾½^TüÍfÁüÛJ_³†™åUqdåXo¾¥)5ͱnc›.Åñ¯‡sð½Å;ÿ£tqÜ%æ©Ãè¢âþÝ{/Gd¸¼piY蝹A‡¶ ‚1üfPH×tb‘´|~¨¸t@¥¹¢Ï”ÊiéNoÆV§Q„>ÕyË­ÑX¡(¸kïåÜ|«ÏljvÎäˆY{×X¯ë6)är²ÞIDrÍ¢(¤Û¤xí¥Š?½±£&<"]$YèSÝ¿}õ0O;­'jæÎ;îi4uÈ­ÃS¨8b…ÛÅk2he²@fö7Š~<ÄŽ™û“ßhêTÆw—xÔ¤½ÝòºZ}n¾UŸæÀ°k$MšFzº¯½Xñ§?DfÂ>Gëá¦8üÊï„ àkV3!L®ð/.²˜û$€bLv®­¸tðÐÁüåý»÷6©Ôþ“ÇÓ‡-3L4¸]<£A+Âu(„=’ûìoŠ›eˆ[ítò…¢àŠòžq¦¼€Ÿ8ðÞ’~µzòË)ÁËpŒ.‰(—ò6j)·¨xèÙ_~årò(ñ¢´¦xÀ+"M.bÍí†ü2s[£ºþ\Jz¦³¨xP$ 9¼pxÆt5n¯©Q»f]g’Ö=ñ«ý÷ÞÑeR$Òþ ëxÓ×Èn¹¿MÉѺP~•WTÚoÿTdQúÜKŸýñý¼W«uGé01‚a[š‡áB2ƒXÿ`m‘Ö' ˜Có:ÛåÿLößïãPT„5A`Ê-”ˆDZF—¦ºÚö?T±ªk:—»kRƒÑèGÉŠBí5uÊžûéÊ!+)”V™Å7ëí°¯ @{’ã²íõ¢O>ÌsMÄÂÅbi€ýß2$0K‚^µ¦3ÁÆã¥Ë{Â`]mÊéS™'eU®6UT™J–÷¥IrOé EöÊü­jŽÆ‹òC@(}â²ÛG É”?WÖ»f¼M„E‡ƒÓØ&ãÐ…ÃÐѦ°OáÊ4}$éÜ<^Ø2$ª=—Z}"‹$ñ²•]+«L²«ëv"ˆŸèº‹ÉÇ¿Ê9}2ãLuf8„VŸÈªXeª¨êÊζjuS ®3é‚®ÞÉ~¯èÝœåNP$J_ôEíWïܸؖåá7^Ö ˜Å0÷ŒÇð蓚:TgN¥›:”…~},«²ª»¸´×ÜÙ29}į&-X8ÔÕ©gµãpÂ…Cæ>Ù4…0Õm ÒU]èÕ°JïÝæ/®èÛy`2¯­Ì9Z›ÚÖ¢0÷‰gЉT¡ôq¹aë°04ÆXŒ ŒVç¦(Ô2$šäÚ)¿Ü:,šè?GQèРdúR=.ðs­èÕ¹¾ÇÅi¯×HƒD@êðFe°ãhvçyvJ¾˜à÷7—¦Ç­[ˆÇÍõzãܧŒâº³öiœ˜,P¥êšDy8”'ÑÇž{\wD#âà wÉÆÊ$cAq:;úu‚yöøÇU„¸f'F3pi˜×Mat .&9).LDRžïfó9¢ µG7‚MÐÑV”æLØ¡±@J¸ÐÂMsÌ~gñ™=2#Q•\½—ù!¢]aÐèŠ:ŽÎ¥ØÔ"^уÍUp'P“H ñHßy fYi_{›Ú¯Î…r›‘—iCbÿ­”ÁeAž•!ñРx×½™‚&Éóê›ï:ì¼ÖfM|-Äü”Y9Ö5ë;ùaµVùÕž>B~Ü!‰IÅZƒ8¿Ågw\óø¡»ï¿°pÑà½û.ÄÝHÌDoÝaÈ͉È;î¾(WÄì>Á>i‚F,4P]ä©f7æP =ôh5Š2Y#Ûw5Ä×HlDgçZ«nèdù½÷e#Ë4á>—ILS‘ÄAð8©çGu”NA=øýjV}¦Õ¹îüNm|íL±G¨¨2U­é€Œl[Ū.•Ê;ö„º‹)gNe„Ch(„=ÿ‹µt$5ã$à¦8µûj8º¨6¤©Ñâƒ.ÿ‰-¾‘äoºÑ‚ÂAùæ®Öcý°Ðy<+¦&9\jßþÓb åUÝËWôŒý¶Û$ÿèƒE`Ÿ<žÕÞªžN›SÈÑš$÷¦-Æ»î«fu_º¬é²~¶ˆŽÉ­«ÕO箣 û¥öÏó”; ¸4^ ™•¤6‡ü’OB+nlRlo€ø¦¦þÉg·í¹,Ž·‘žiô©“4$þúKÿùë§ÓæR‡×Ã5’‚PþKD ! ë°èþ½{ce™Ù'Åe®Þ‰`qù_ùi°†¸¼‘! Ú … uÝjíI¤€LóµhÈ1~hÓÁÑ#yÉ)®œ\k´šFº»ø¯²wß.ž2–”ÅÔâÇÃ5’„¢`nž5bNs¿ôáûv×ÖÄ%IvÉ%=¬µ%fˆ0 "OÀ®R6A!¹ˆ—h8úEž6Ù•“kÖúüê •¯¿T1M–ašr´ÇÍ3’²rFró#$ÊØwÏžóg2&~Ç Ie—pÑwº“¼Æ ðd‘ÎD nDM€ž  Gä-)îŸøÈ.'ÿ·‹_}¡2¦Ö¦+uø½œh±ÆF-˜û . DÞNR¸b;OjE¤WºÊP5Áû}úh¬à+ƒãt´éI0]¢—–ôgå\W=ÎXósZºAro›ÑD\Ü`‘išÄ=—’#~hq_%Db25vMKÌÚ»¶uõ‰L‰„Ì+°ä-°p8Ô–í†Æm8Þ=¡ô:xÄ >:žhÑÌlÊsò¬ Öa‘ÑÔX¯+XhÉ+°èSNX("½±¨§Kt’Öðã_~ž÷×·JNÏòy9+W›¶noZZÒ7y0÷”à/JÔ¡TI€/ì{ÅAA73–åå=Ç¿Ê9õuÖç‡t™RY`ëæ-FÖòâ…›§K´×ËùðýÅŸZ0x5Èýô‰ÌÓ'2W­éäñCóè¢x*ØÃ@ÒJ™éÏk/Uû"wÔAÉéà½ýÇ’DzWßÐNc› æ?¤Ê¤ÚnÀD‰)†44ya08‹„ ã …xëu¯–ÏPOÂüçTÂ%8·*cÁC!‹b8h9lC¡þvUâ=œÌ?Ѽ ;2#¹Õd8Èæÿq¢aþ³!«™9_Åëóÿ„¤Y„濳ÿýOx`fˆ~é÷ïåæ'd»¼Þ°qSË“ÏÇÜIÁ ½u‡aÓ¶¦û<ŸxS3 &„ŽÿÞÿxõýž»¾ˆ~ô©Aß|‹±`áP—‡†D³eƦ‘ðTù #bó-Mù¹Â·k陵êK¢DïÜ]Ÿ‘eCF¡ðÝÿ½x5Ù¥˜L …¸ÎÆ©"ÿÞþ³¬ëÉ¿ÿz¦ú§à¹y[ë±ï‘³~0ŒÞ´ÍhlÒÀˆUøñé¦Þ¢ƒÙ'Õ}RN² A o,Y©2³G–•öŠ%dþË‚EƒlìžFë~î¥õ—’ƒAìâ…ÔæÒ\żèÕ»ö^Ö%»Ù®Eäh †Aý¸N@óÿ•õº‰ñ#÷O(m¬Yzõw¨˜ofÍÆ¤‰é Â"cBüDs8ÔDõºXLî¹;Ù3С€Ä,5‰C bx„WŠ ¨Ò²ÞÿÙŠ–õóA°Ûøí­êþ>Ù”Ù²'Ù+ OÛGb–°i«Q«s@ €w¶+ÛZÔl#NP‹– $ØxüDç {=\C½ö×?_»aå#ûïÛýáû‹ºM §£e˜˜Ž£ÙÓ”&. Ä>Èï#zºäŸ,¼eã÷n(ûÁÏþ}cg»ÒëŽøÃß–.3úÑ‚úÑ–ógÒi4K¾ú"ÏhHÊȲX…±›6˜0*­ìNÜÚB‘x U5}©cê$oÀO¼ñjù›¯¯`-Üõº‹5zšFÚZÕmñº ³˜k›!_ârÃ>/'I0ÈüÙa\–h<°í‹<Û‡ '¾|AH,&ŒËŒs½þ,Z2°÷žÚ¬œÈ5˜|­³eâà ª¨¸ÿö». ç6Sæ(æ”h¡0¸v}û£Oܰ©et9ž ñø£N*•wû®†[n5”¬HT~ˆsJtáâòÊ.‰4°u‡!/?B´¼·^—¸ìÁÓ;Æ-†A-(ÚxSkz†íÆÍ-’H¿ñlcÉU7t.X4‹– –¯ê’H#<°¿%ÑÙC°Ð2ÎeR®ðoÚjÔ&»„¢`iYoDÆlcíó<^85Í®Os¤¦;dr¿DX½¶ct4íÜ]¯Tùv¾eHÔÛ#ëë–õöÈiñ·©Å ¬XÙMË©BéÛ¸ùJÌì‘öŸ]Rl€Þ™¹OjêPÎÁ 9»Žú4Ǿ‡Ï-3Ëäãe‰‚…¶d‡eHÔ×#{ñùUýýRšÆ&Y+÷ÂhË4ì&w~çBfŽmYéøßL( Þ°±í†mÐ×#34h_¹|ˆžÅ©#Àm}]Êä^š$Ow—ÜÔ®bU6TtÓ%ÝùëõNÑ4nŽÉŸ2k±PDövËû{#䦟qÌnÕ ‡ÛÙ®B&'Ï*ˆâ¼ýþ;E/þºª£Mu%Q¼ ;¡¯BT•ÞuS¦M@ÐÝ.ÞÀ¤ 4ܵ)Í5©¦%M¡‹—FÞ=_¬Ñÿþ•Šï.ééŽ' VÌzy›ÛÑ®R*}EÅrê¿÷ßE/ÿ¦²½U=:ê„á$»ùêBfÉ;rFÒ$¤˜CÙI¼Ý.FQBb¿I98 1u(³s­éã+¾uu*þð_e¼SdµÎÑþe.¤ŽA³¤³=rj¾úKÉ}½²kæ ^óð ^è†4Ǻ4GÒ<œ.Iòlβ-V{…Dä9“€¦‘¡!qDeÀȈ »KwþË80Ï^é™v/<Öuž¡‡ 4‚àÓ+ú€‹ÑJ~H€Óü«ÖÛ,Y@%v‘˜;ˆ‡h^¾”lŠ«BTÄ]hnžuáâ¡ê±z&‚¹ :;׺´äÊê?`7Ô%ç/NÏ´€HLNtR¡½øÃX‡ƒ¿'Rò.F«ù´úªéëÃv•+ŠI…Ë /+í¯—ÓP§³Û‹—šõ©N‰4 —'_+æ‚h¡0(•,CâÏ:XØeR„Áon¾wßùì+?Š©Ð´ª˜=Q3® x8_õÈ>3)ìQJ ¡(#‘##‚7^);ø·¢P]\4ðàªË*z"ž?{˜ ¢­Vá_þXb· ZŒ—ëJBѳÄب]º¬/%ªŽa`ØOhU!€Üi\z‰7´gÍ_¥£èV=nîó¿XóÞ_—Ú¬6ørdXX_—¼¢¼Ç= Ùl`.Ô¤Fã8MQ踜­Aq¹a¿Ÿ'hc"2ë—Ÿ\é™ÒÀKV&Ì?? ~­^שÀ“ípÁȇ E¾ 81|ŠÃ #ÌYÕH˜›MQhÄ=K(„…¦òºcPðBË#åW ÓH´< šF"©Åí57¾þÑ(Ä%ÑŒUF™[\AȘœõ†0 ai¶ >éT(¸áMv(X‘ì:Ú©l“Õy2“òrÈNÅìâÆuG4‚Ѳõ£U‚Ð ­»Á,ù³Qs®WƄѰÿþ€xS¶móºŽÞ×Wt|¸p{;}\wDÀ„P&„1!Ì<"øiÎ{9‚ýßU ©àWóÚÉXqPN¾ëlZ K0ɃѫQ»pÝÍPˆã«ìùîÅÌa¤²€HDRêròFSø EAvŸêtòÜLyBQP*õ£(ãvs]N>¯40ÚÎè†AœNëjÍ‚ (‰4Àî!].žËÉ?$•ˆ(z%†Aúû¤Në¢dÆbÛáñBi€Ã¡|>ÂåäJúºdëÞ×+CQ&9Å­ÿ$‰»œ™i¼êa¯Õ¹wÞ~9'Ï _Íùä`a €çäZ·î0$ë#S$ñ§Ý.•~ôã¯"žðù§Ÿ,ÌÌٺÚîèï•ýå­e½WuÓû«–+| ?t›@ŒÖt´©,ìhS¥¥ÛË+»Š–õ³aÇŽäž9•i±YcpÀpzÉRó­·×À¢¢ógÓÙЙY#ìÁ¶õ(Ñ"1yó¶¦ÝwÖ—ö­óó³_ÿöJíö˜ƒs2²l[·7ó"Û±»áluú³ÿ|#ëÆ™‘e»ç»tÉ.àñB—/&··ªuÉ®õ7µ.(Œ¡äóqž~t»@da"úzdŸ,LÒ¹×mlc½=²ï.a]d7o5&ë ƒ<þÐm\n8Z#pîtú™S.'ï‡ÏîÞ[7jq¾õöúyfó_Þ,a?G§¦9vßY÷üÏ×Dk·le÷#OœbWG›’$ñüÃF?ýÇ^øåX&ÇÁ÷ Uk;”*oÙÊî>sü©ïïðy9)z‡îê<5Ý¡Os´·ªÍfÉ—Ÿå75j`ͺv¶x}[‹ÊР£(4xíöÚçå46h{ÇS&–¼ºýκš³im-ãóØ‘$þþ;EÀ㇠ddÚ §K^s. :ÚTÖaÑú›Zoº¹Y" 45h;ÚUÁ –™=’¬wâ ~€‰D˾6´øÛâîHõ]RÓí;v5¤èpîtúÛ,q9y»ö\Þ|‹'¨ýV9œŸHDÍß=º=Â~ð䉧ÿß1‡Z°phq‘¹µYÃÖù}D˜BSÓ©©0Ôë WÝ–?8üKôñ¯rþë':nÛl‚?¿QúÁ»E“ܽ´¬§´¬·¯W6ÎØèqsèVHÒºÿþÇ_²DלKc²¸÷óú4¼ýfÉ»Yê÷qÊ*ºÅ’Àè4a ž™=²swä œ«Öt./ëá B#ÃÂ]õñE_~žÿì¿lìí–oÒWŒ… ,@‡²+"kGÃat´È—Ö¥¸drA¡$¦v¥Lî/\<¨IJ4mDÜuï…‰•…bBjšƒ]oÎIÿòóüÑÒãˆV(}Uk;²s#&ò †ÙêÏõ—“[[Ô¬J¨·G^}2‚ZÝa[ ›°æuh«ñnà ÷à’„áôh%ï`¶ˆä ë˜àvsm6ddèӢЉ`iIŪ®h*òIpùR ›¨f×ÞËßy f\bQ7uƒ˜Ý&HÒºó †·î0L,ñ¡TyÙLd–!ÑXÙ¥¿G (Æè¢ˆAblÆŒ{ðKŸQGÂ{°KkñöF7D]S®å©8Æì¸­B!¬½MÕÓ%ß´Õ¨R{,C¢S_gñù¡µëÛ32íÉ)΋518êI¥þm; yWmý}ÒDzÇNÃÃ"±ˆäñC÷í;wâXÌ‚üW_ä.-íÓÜåV©=÷|·A˜7^)·q¸†h›{áljiyo’Ö½²ÊÔbLÈ#x,ʰžýÄéF|ŽN×£Ž$Ämf¤>f¼mtÿcÕì?á0zùbò+¿©$xþ ŒX…çϤefÙ@Ÿæˆ5{µXBnÜܲqs û±¶FßÙ®Kt³A#“…C…K׬kçÆX8Ñéàÿííâ¤$Ï ÚTjï=ß½€¢Ì«¿[9*ò^Ct(„5´ÿ®ûj fdÙbºY4èÇM˜Qƒ¸ÿ^jc÷âç ÑÁÂU&f¼iüèy…PÚÚ¬>y,ûLuÆ¢¢ÖÛÈíâZ-"…Âg(”¾ü–”TÇô}_~¢½M5ÐeCßѦ²]›QÙnœ8–­PùÒÒíû>Ñ/pr4\Ö½ð«ÕÂܰ¡M©òÞuÿ…3§2ΜÊd7Aã¥ë°ÐP¯e‹‚Nôãx<\QŒ.ÆEhÿ:¬­—‘S€ÜŸ+úÿ.ý8¼ÈÍŒWÉ?÷ŸkÉNÓÈðÐf€Pdo‚CåXÒ2íW¡ôéRœ ¥oúD;¼C ¿ú"ýè÷– åGª¿Î\R4”ä΋n¥œõÚç¾VŸæX²Ô¬Túví­«¯Kf+?>gÉIDATõøÅ0ÂjÎ¥E+ûØÖ¬± `ÕêNé×ü-Û› Hâ_~–7î  С$Ä͇`:bsï•Påká 3¡úTK“ÆhHj1jX–eråê+e×rr­žh5âÉFF –N}+¼â¯á’Ï©‚fZ•´¸Ü°>õjÉ2 ™“gÕ§9ØÕX¥öJc»§„±Qûñˆц“cÇ®†ï?q*-ÝN³RY½’Y{×Ö¬9tpÑòòñ²ZK³æbmJnþ°HLnÞfÌÉ&IFÄ­AÜ8Ð'œ ßÎL­!8ûÒ´6«ß|}«´‰É%ÅæEKdr4ÇɉHý[w6lú¦Lâë/—G$Ú2$úàÝ%þàt¬µfdrÿ¸Uíµ—+FµžQõцí矌#,ƒâŸþëFS»rÍúöeËûx¼pãeÝÅ úß=·ÚÜAIoaDç©ôh˼©í63’STæ'Ô" 3…w¡Læß¶£‘ýŸ$ ×U/¯—Ó•U¦¬«qz;~ c$ÒÀXYb’%ýõ—+öÞs1&¢_xnuG»jßÃg؜ć?^ðÚK—jõ£µU‘ñ¿!#‘’BIQ¨ÛÅó]õ,ƒìOäºV; aˆÏq¸aa‚Aœ à“Ìk<碖r´ÎÒ&Záu5ÎD J¤V=Ð/Mø¢ŒDƒð£Ò‡KI$7 v›€ÕK¨Ô^öˆ×Ãu9¹£`-aÛÅu»x\^˜-pï÷n×7Õ‚“tW’˜Ç¬ƈ%Wºä÷ök]¹y¼°øª~Üçå¸]¼±lç(΀Òqǵ~›1G¦, |ûjãÍ ¾4ÿ;ðDÏþ‡Xiúå5çIEND®B`‚gamgi-0.17.5/doc/index.shtml000066400000000000000000000153671433127522700156370ustar00rootroot00000000000000 GAMGI - General Atomistic Modelling Graphic Interface

News

25th February 2022

GAMGI 0.17.5 is out, changes can be seen here.

15th January 2014

Renewed the EU trademark GAMGI until 2024.

1st January 2014

Updated source code and documentation license to GPL v3.

26th December 2013

Started using sha256sum to checksum all distribution files.

23rd December 2013

Renewed the domain name registration for gamgi.org until 2020.

19th November 2013

Signed an agreement with OIN regarding patent protection.

2nd September 2013

Moved www.gamgi.org and ftp.gamgi.org to the IT center at the IST campus.

8th April 2013

Added new mirrors: http://gamgi.ist.utl.pt/, http://atom.ist.utl.pt and ftp://atom.ist.utl.pt.

Mission

C nanotube image
Our goal is to provide a free package to construct, view and analyse atomic structures, as powerful and simple to use as possible.

GAMGI aims to be useful for: 1) the scientific community working in atomistic modelling, who needs a graphic interface to build and analyse atomic structures; 2) the scientific community at large, who needs a graphic interface to study atomic structures and to prepare images for presentations; 3) teaching the atomic structure of matter in schools and universities, even inviting students to run GAMGI at home; 4) science promotion, in exhibitions and science museums.

Achievements

Cu RCP glass image
GAMGI can determine any point group of symmetry, can build crystals for any space group of symmetry, can build Random Close Packing structures, Voronoi and coordination polyhedra for arbitrary structures. GAMGI comes with comprehensive atomic data, including ionic radius and isotopic data. GAMGI can handle an arbitrary number of independent windows, layers (with different referentials, projections, viewports and visibilities), lights (directional, positional and spot), 3D text fonts (extruded and stroked). Actions can be performed in a single object or in a list of objects previously selected. GAMGI comes with detailed but concise documentation, just one click away for each task.

Shortcomings

ZnS blenda image
Currently GAMGI cannot handle alpha helix or beta sheet protein secondary structures, cannot calculate struture factors or diffraction patterns, cannot calculate orbitals, cannot show data graphics, cannot handle .pdb, .jmol and .cif files, cannot export or import coordination or Voronoi polyhedra. Support to build molecular structures is sketchy.

Requirements

Chlorophyll A image
GAMGI can be installed on any computer running Linux/Unix with the standard X Window System. GAMGI requires the following libraries: Gtk, Mesa, Gtkglext, Expat and Freetype. GAMGI 0.14.8 or above requires GTK 2.18 to compile. To run properly, GAMGI requires a graphics environment with at least 16 bits per pixel, plus a 3-button mouse.

Optimized for standards.

Hosted by IST.

Copyright © 2006 - Gamgi Project.

GAMGI is a EU Trademark of Carlos Pereira.

gamgi-0.17.5/doc/installation/000077500000000000000000000000001433127522700161445ustar00rootroot00000000000000gamgi-0.17.5/doc/installation/compilation.html000066400000000000000000000062411433127522700213530ustar00rootroot00000000000000 GAMGI Installation: Compilation
Installation Compilation
 
Building GAMGI is trivial, _as_long_as_ all libraries can be seen at compile time, link time and run time. If problems arise, see the tips section.

Most Linux distributions split libraries in two packages, one containing the (shared object) *.so files, with a name such as library-version.rpm, and another containing the (header) .h files, usually with a name such as library-version-devel.rpm. To run GAMGI only the former are necessary, but to compile GAMGI all are required.

Popular Linux distributions tend to install library-version.rpm but not library-version-devel.rpm packages, to save space, assuming that users want to run but not to build the applications. Smaller libraries as Expat, GtkGLext and Freetype tend to include *.so and *.h files in a single package. All these libraries are available from every Linux distribution, so finding and installing library-version.rpm and library-version-devel.rpm is easy.

Go to the source code directory

cd $GAMGI/gamgi_version/src

Edit the file make_local

When installing GAMGI for the first time, edit the file $GAMGI/gamgi_version/src/make_local and update the following lines, which tell gcc and make where are the required header (.h) and library (.so) files (when updating the GAMGI version, just copy this file from a previous installation):

PATH_EXPAT_H = -I/usr/include
PATH_FREETYPE_H = -I/usr/include/freetype2
PATH_X_H = -I/usr/X11R6/include
PATH_GLIB_H = -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include
PATH_CAIRO_H = -I/usr/include/cairo
PATH_PANGO_H = -I/usr/include/pango-1.0
PATH_ATK_H = -I/usr/include/atk-1.0
PATH_GTK_H =  -I/usr/include/gtk-2.0 -I/usr/lib64/gtk-2.0/include
PATH_MESA_H = -I/usr/include
PATH_GTKGL_H = -I/usr/include/gtkglext-1.0 -I/usr/lib64/gtkglext-1.0/include

PATH_EXPAT_L = -L/usr/lib64
PATH_FREETYPE_L = -L/usr/lib64
PATH_X_L = -L/usr/X11R6/lib64
PATH_GLIB_L = -L/usr/lib64
PATH_CAIRO_L = -L/usr/lib64
PATH_PANGO_L = -L/usr/lib64
PATH_ATK_L = -L/usr/lib64
PATH_GTK_L =  -L/usr/lib64
PATH_MESA_L = -L/usr/lib64
PATH_GTKGL_L =-L/usr/lib64
This is a typical configuration for most Linux distributions on amd64 (for i386 and PPC hardware replace lib64 by lib). Slightly different configurations, for several different distributions and architectures are available from the same file.

Build the executable

To build the gamgi executable, type make. To remove object and executable files, type make clean.
gamgi-0.17.5/doc/installation/configuration.html000066400000000000000000000112561433127522700217060ustar00rootroot00000000000000 GAMGI Installation: Configuration
Installation Configuration
 

Run GAMGI from any directory

If GAMGI was compiled from source and the GAMGI root directory is, for example, /home/carlos/gamgi, then the full path for the executable is /home/carlos/gamgi/gamgi_version/src/gamgi.

To make GAMGI run from any directory, we suggest making first a soft link from gamgi to gamgi_version, in the GAMGI root directory:


cd /home/carlos/gamgi
ln -s gamgi_version gamgi
and then a second soft link from /usr/local/bin to the executable, typing as root:

cd /usr/local/bin
ln -s /home/carlos/gamgi/gamgi/src/gamgi gamgi
Because /usr/local/bin is one of the standard directories where Unix systems search for executables, GAMGI will be found when called from any directory on the system.

Changing to a new version of GAMGI requires only to change the local link (in /home/carlos/gamgi), while the global link (in /usr/local/bin), that needs root permission, must be done only the first time GAMGI is installed.

Set the GAMGI_HELP environment variable

To inform GAMGI where the help documentation files are, set the GAMGI_HELP environment variable, pointing to the doc/ directory, where the documentation starts. This can be done by adding a line as this, to the user .bashrc file:
GAMGI_HELP=/home/carlos/gamgi/gamgi/doc; export GAMGI_HELP
Alternatively, this information can abe given directly in GAMGI, selecting Help->Config, or in a config block in a GAMGI XML file.

Set the GAMGI_TEXT environment variable

To inform GAMGI where are the Truetype font files, set the GAMGI_TEXT environment variable, pointing to the directory with the files. This can be done by adding a line as this, to the user .bashrc file:
GAMGI_TEXT=/usr/X11R6/lib/X11/fonts/truetype/; export GAMGI_TEXT
GAMGI comes with all the needed font files, in the directory $GAMGI/gamgi_version/src/io/fonts/, in case they are not available in the system.

Set the BROWSER environment variable

GAMGI can be configured to automatically launch a browser pointing to the adequate help web page. To inform GAMGI which browser should be launched, set the BROWSER environment variable, pointing to the browser executable. This can be done by adding a line as this, to the user .bashrc file:
BROWSER=/usr/X11/bin/mozilla; export BROWSER
Alternatively, this data can also be given directly in GAMGI, selecting Help->Config, or in a config block in a GAMGI XML file.

Install pnmtopng, pnmtojpeg and pnmtotiff

These tools come with every Linux distribution and are usually installed by default. GAMGI uses them to export .png, .jpeg and .tiff files.

Define automatic default settings

More experienced users, can define their own default settings in a XML file and load it automatically everytime GAMGI is called. This can be done, just adding a line as this, to the user .bashrc file:
alias gamgi='gamgi my_defaults.xml'
This works even if other files are called. For example, calling:
gamgi my_objects.xml
would be understood as:
gamgi my_defaults.xml my_objects.xml
and defaults in my_defaults.xml would be already applied to objects in my_objects.xml.

Install the man page

Go to directory doc/man/ in GAMGI documentation, compress the man page and copy it to the system man1 directory, with the name gamgi.1.gz:
cd /home/carlos/gamgi/gamgi/doc/man
gzip page
cp page.gz /usr/share/man/man1/gamgi.1.gz

Get quick access to the files

For developers, who need to have quick access to the code, we suggest creating a few alias in .bashrc to permit easy navigation through the GAMGI directories, for example:
alias sgi='cd /home/carlos/gamgi/gamgi/src'
These alias remain the same when a new GAMGI version is installed, if the second symlink described above was made.
gamgi-0.17.5/doc/installation/download.html000066400000000000000000000030461433127522700206440ustar00rootroot00000000000000 GAMGI Installation: Download
Installation Download
 
The first time, create a directory $GAMGI to store everything related with GAMGI, typically ~/gamgi (in user space), or /usr/local/gamgi or /opt/gamgi (in root space). Because GAMGI is in heavy development and new versions are coming up all the time, we strongly suggest to create this directory in user space, making it easier to install new versions and reducing concerns with security. In any case, GAMGI should be downloaded, compiled and installed by a user, not by root. From now on, everytime we mention $GAMGI, this should be replaced by the apropriate directory.

Create the $GAMGI directory

mkdir $GAMGI

Download to $GAMGI the file

gamgi-all-version.tar.gz (source code, documentation, data)

Unpack the file

cd $GAMGI
gunzip gamgi-all-version.tar.gz
tar -xvf gamgi-all-version.tar
gamgi-0.17.5/doc/installation/environment.html000066400000000000000000000034061433127522700214010ustar00rootroot00000000000000 GAMGI Installation: Environment
Installation Environment
 
The environment always plays a role in the way a computer application behaves, particularly on Linux/Unix systems.

GAMGI works fully well with Enlightenment (tested on Yellow Dog Linux 2.2 for Mac and Suse 10.0 Linux for PC) and Blackbox (tested on Mac OS X with Fink).

Window Maker (tested on Yellow Dog Linux 2.2 for Mac and Suse 10.0 Linux for PC) and Twm (tested on Yellow Dog Linux 2.2 for Mac and Suse 10.0 Linux for PC) keep showing the windows decorations, in fullscreen mode.

KDE (tested on Yellow Dog Linux 2.2 for Mac) and GNOME (tested on Yellow Dog Linux 2.2 for Mac) also keep showing the windows decorations, in fullscreen mode. Moreover, KDE does not define the WINDOWID environment variable, so the Console button (in the window tools section) cannot work and GAMGI hides it.

gamgi-0.17.5/doc/installation/installation.html000066400000000000000000000021671433127522700215410ustar00rootroot00000000000000 GAMGI Installation
Installation
 
  1. Requirements
  2. Options
  3. Download
  4. Compilation
  5. Configuration
  6. Environment
  7. Tips

Developers are invited to subscribe and consult the archives of the coders mailling list.

gamgi-0.17.5/doc/installation/options.html000066400000000000000000000034451433127522700205330ustar00rootroot00000000000000 GAMGI Installation: Options
Installation Options
 
To install and run GAMGI, users can choose one of the following options:

Download and install a statically compiled executable

Executables compiled in this way include all the required library code, so they are easy to run, but waste a lot of unshared memory, thus they are seldom used today. Statically compiled executables are currently not available for GAMGI.

Download and install a dynamically compiled executable

Usually they are provided as rpm or deb packages. Although currently not available for GAMGI, it would be excellent to offer packages for the most popular Linux distributions, if someone volunteered their expertise and time.

Download and compile GAMGI from source code

Download a gamgi-all-version.tar.gz file, with the whole GAMGI distribution. Compile and install it, after ensuring that the building libraries are all installed.

This is the real thing. Users will never feel the joy and raw power of free software until they make simple modifications on the source code and see the results working on the executable they built. It is the whole difference between controlling or being controlled by the software!

gamgi-0.17.5/doc/installation/requirements.html000066400000000000000000000037521433127522700215640ustar00rootroot00000000000000 GAMGI Installation: Requirements
Installation Requirements
 

Hardware

To run properly, GAMGI requires a graphics environment with non-indexed rgb colors, with at least 16 bits per pixel. A 3-button mouse or equivalent is important to rotate, move and scale objects interactively.

Software

GAMGI can be installed on any computer running Linux/Unix with the standard X Window System. GAMGI requires the following libraries: Gtk, Mesa, GtkGLext, Expat and Freetype.

Gtk, GtkGLext and GLU Mesa are distributed under the LGPL license. GL Mesa and Expat are distributed under the MIT (BSD-like) license. Freetype is distributed under the FTL (BSD-like) and GPL licenses.

Since release 0.13.2, GAMGI should run fine with any version of Gtk 2. Previous releases required Gtk 1. GAMGI should run fine with any version of Mesa or OpenGL but versions older that Mesa 6.4.2 are not recommended, due to light bugs. GAMGI should run fine with any version of Expat, Freetype 2 and GtkGlext.

gamgi-0.17.5/doc/installation/tips.html000066400000000000000000000076531433127522700200240ustar00rootroot00000000000000 GAMGI Installation: Tips
Installation Tips
 
Sometimes things do not run as expected. Usually problems fall in one of the following categories:

Compilation problems

1) Check carefully PATH_GTKGL_H, PATH_MESA_H, PATH_GTK_H, PATH_ATK_H, PATH_PANGO_H, PATH_CAIRO_H, PATH_GLIB_H, PATH_X_H, PATH_FREETYPE_H, PATH_EXPAT_H, in the file:

$GAMGI/gamgi_version/src/make_local
to see if the paths to the header files are correct. These paths tell the compiler where to search for files included with statements such as #include <expat.h>. In statements as for example #include <gtk/gtk.h>, the path should point to the directory containing gtk, not to gtk.h itself. The external headers in GAMGI that need to be found are:

#include <glib.h>
#include <glibconfig.h>
#include <gtk/gtk.h>
#include <gdkconfig.h>
#include <gtk/gtkgl.h>
#include <gdkglext-config.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <expat.h>
#include <ft2build.h>

2) Check whether GAMGI compiles as root. Perhaps the missing library or its containing directory is giving reading permition only to root.

Linking problems

1) Check carefully PATH_GTKGL_L, PATH_MESA_L, PATH_GTK_L, PATH_ATK_L, PATH_PANGO_L, PATH_CAIRO_L, PATH_GLIB_L, PATH_X_L, PATH_FREETYPE_L, PATH_EXPAT_L, in the file:

$GAMGI/gamgi_version/src/make_local
to see if the paths to your library files are correct. These paths should point to the directory where are the .so (dynamic) or .a (static) library files.

2) Add a soft link to the missing library in /usr/local/lib, one of the paths that are usually scanned when the system is looking for a library. For example:


ln -s /usr/local/lib/libGL.so /opt/gtk/lib/libGL.so

3) Add this line to .bash_profile or equivalent:


export LD_LIBRARY_PATH=/usr/lib64/gtk-2.0

4) Check the order of the libraries in the linking command. The linking command, in the file $GAMGI/src/make_rules, should be:


LIBS = -lgtkglext-x11-1.0 -lgdkglext-x11-1.0 -lGLU -lGL -lgtk-x11-2.0 \
	-lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lpango-1.0 \
	-lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lXext -lX11 \
	-lXi -lXmu -lfreetype -lexpat -lm -ldl
The linker reads from end to start and lower-level libraries should be red first, so -lGLU should come before -lGL, etc. Usually this is only a problem in compilations with static libraries, because dynamic linkers can detect missing libraries, if they are upstream.

Running problems

1) Check the paths of the libraries used to run the executable, typing:

cd $GAMGI/gamgi_version/src
ldd gamgi
Perhaps GAMGI was compiled and linked against a different version of some missing library than the one used at run time.

2) Add the library path to the file /etc/ld.so.conf and run the command /sbin/ldconfig. For example, as root:

edit file: /etc/ld.so.conf
insert line: /home/carlos/gamgi/mesa/mesa/lib
run command: /sbin/ldconfig 

3) Check whether GAMGI runs as root. Perhaps GAMGI or some missing library (or its parent directory) are giving execution permition only to root.

gamgi-0.17.5/doc/interfaces/000077500000000000000000000000001433127522700155665ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/arrow/000077500000000000000000000000001433127522700167205ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/arrow/select.html000066400000000000000000000012171433127522700210660ustar00rootroot00000000000000 GAMGI Interfaces: Arrow Select
Arrow Select
 
gamgi-0.17.5/doc/interfaces/assembly/000077500000000000000000000000001433127522700174055ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/assembly/copy_object.html000066400000000000000000000036031433127522700225750ustar00rootroot00000000000000 GAMGI Interfaces: Assembly Copy

Assembly Copy

Indicate here the number of assembly copies to create and its destination.

Gamgi expects users to identify first the assembly or list of assemblys to copy. When the Assembly entry is active and empty, clicking the mouse over an assembly, on the current layer (local selection), its identification is transported to the Assembly entry. Pressing the List button, the current list of assemblys is selected instead.

Name

This is the name given to the new assembly copies. The default is to copy the name of each original assembly.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the assembly or list of assemblys to copy, GAMGI expects users to identify a layer to where the assemblys should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of assemblys, the copies can also be created at the layer of each original assembly, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/assembly/copy_shift.html000066400000000000000000000024531433127522700224460ustar00rootroot00000000000000 GAMGI Interfaces: Assembly Copy

Assembly Copy

Set here the translation vector applied to each new assembly.

By default, each copied assembly has the same coordinates as the original assembly. This is expected when copying an assembly or a list of assemblys to a different layer. However, when each new assembly is in the same layer as the original assembly (for a list of assemblys, the Local option in the Layer menu), a small shift helps to separate the new assemblys from the original ones.

All other properties are the same for copied and original assemblys (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/assembly/create.html000066400000000000000000000032041433127522700215350ustar00rootroot00000000000000 GAMGI Interfaces: Assembly Create
Assembly Create
 
Assembly->Create creates a new assembly.

Assembly

The Assembly entry provides a name for the assembly object. This is optional: when empty (or filled with separator characters, as space, tab, newline), the assembly will be named Assembly. Object identification is explained in Introduction Identification.

An assembly is a container whose primary purpose is to contain other objects. When an assembly is created, it has no child objects and consequently no visual representation. The only way to select an empty assembly is therefore to write its identification or to use the mechanisms provided by Assembly Select.

To avoid this problem, when Ok is pressed and the new assembly is created, the Assembly Create dialog is automatically replaced by the Assembly Link dialog, with the new assembly identification already inscribed on it. How to link objects to a assembly (TODO) is described in the section Assembly Link.

gamgi-0.17.5/doc/interfaces/assembly/link_object.html000066400000000000000000000063351433127522700225650ustar00rootroot00000000000000 GAMGI Interfaces: Assembly Link

Assembly Link

Link an assembly or a list of assemblies to other objects.

Hierarchy

Assemblies can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by assemblies. Pressing the button Above, the same menu shows the classes of objects that can own assemblies.

Gamgi expects users to identify first the assembly or list of assemblies and then the object to link. When the Assembly entry is active and empty, clicking the mouse over an assembly, on the current layer (local selection), its identification is transported to the Assembly entry. Pressing the List button, the current list of assemblies is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

Method

Gamgi suppports only one method to link assemblies: Object.

The Object method links an assembly or a list of assemblies to a single object, Above or Below.

When linking an assembly and the Hierarchy is Above, the assembly is unlinked from its current parent and linked to the new object. When the assembly is moved to a different layer, its bonds are automatically removed. When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the assembly. An error is issued when the parent already owned the child object.

When the new child previously owned the new parent (a situation made possible because assemblies can own other assemblies), the new parent is first linked to the new child parent. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of assemblies Above, all assemblies in the list are unlinked and linked to the parent object. When linking a list of assemblies Below, the child object is replicated as many times as necessary to link each assembly in the list to a different replica.

gamgi-0.17.5/doc/interfaces/assembly/link_shift.html000066400000000000000000000033601433127522700224270ustar00rootroot00000000000000 GAMGI Interfaces: Assembly Link

Assembly Link

Set here the translation applied to the child object or list of objects.

When linking an assembly to another object, the translation is always applied to the child object: the assembly itself when linking above, the other object (graph, shape, arrow, cell, cluster, molecule, group, plane, direction, atom, orbital, text) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of assemblies is linked above, Reference is set by default to Child, so assemblies preserve their positions and are not superposed.

When a list of assemblies is linked below, each assembly will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent assemblies and are not superposed.

gamgi-0.17.5/doc/interfaces/assembly/remove_object.html000066400000000000000000000040041433127522700231140ustar00rootroot00000000000000 GAMGI Interfaces: Assembly Remove

Assembly Remove

  • Object
Indicate how to remove an assembly (or list of assemblies, previously selected with Assembly->Select, when Global is pressed).

Scope

When the Scope is All, the assembly and all its contents is removed. This is the default.

When the Scope is Container, the assembly is removed but its contents (child assemblies, graphs, shapes, arrows, cells, clusters, molecules, groups, planes, directions, atoms, bonds, orbitals, texts) is saved, linked to the assembly parent.

When the Scope is Contents, the assembly is preserved but all its contents (child assemblies, graphs, shapes, arrows, cells, clusters, molecules, groups, planes, directions, atoms, bonds, orbitals, texts) is removed.

When the Scope is assembly, graph, shape, arrow, cell, cluster, molecule, group, plane, direction, atom, bond, orbital or text, these objects are removed from the assembly.

When the removed assembly was part of the current object, the current layer becomes the new current object.

Clicking the mouse over an assembly in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/assembly/select_list.html000066400000000000000000000042361433127522700226120ustar00rootroot00000000000000 GAMGI Interfaces: Assembly Select

Assembly Select

  • List
Assembly->Select selects an assembly or a list of assemblies.

To select an assembly click the mouse over its visual representation: if GAMGI recognizes the assembly it becomes the new selected object, otherwise the mouse action is ignored.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

An assembly is a recursive object, so it can contain for example another assembly, which in turn can contain an atom. Clicking over the atom is ambiguous: which assembly is the user trying to select? everytime this ambiguity occurs, a menu pops up showing the name and number of all the candidate assemblies, and if one is selected, it becomes the new selected object.

Only assemblies in the working layer can be selected, even if assemblies are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Assembly->Select shows a flat list of all assemblies currently existent in GAMGI, not necessarily in the same layer or window. For each assembly, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/atom/000077500000000000000000000000001433127522700165265ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/atom/config_analysis.html000066400000000000000000000022501433127522700225630ustar00rootroot00000000000000 GAMGI Interfaces: Atom Config

Atom Config

Set here default atom features related with structural analysis, using methods such as diffraction.

Temperature

Set here the default temperature for all atoms. Temperature information is needed to calculate Debye-Waller temperature factors, which, together with structure factors, are needed to calculate accurate X-ray and electron diffraction patterns.
gamgi-0.17.5/doc/interfaces/atom/config_global.html000066400000000000000000000030211433127522700221750ustar00rootroot00000000000000 GAMGI Interfaces: Atom Config

Atom Config

Set here global atom parameters, applied automatically to all current and future atoms to change their visual properties. These parameters are also automatically applied to current and future bonds. Slices applies to Solid atoms and bonds while Width applies to Wired atoms and bonds.

Slices

In Solid mode, sets the number of fragments used to represent curved surfaces such as atom spheres and bond cylinders, thus controlling the visual quality of these objects. Increasing the number of fragments improves noticeably the visual quality but also decreases performance substantially.

Width

In Wired mode, controls the line width used to draw atoms and bonds.
gamgi-0.17.5/doc/interfaces/atom/config_type.html000066400000000000000000000150201433127522700217200ustar00rootroot00000000000000 GAMGI Interfaces: Atom Config

Atom Config

Set here default values for atomic element data.

Element

Set here the element name, which can be Si but not si, S i or SI. When a valid name is entered, the element number is automatically set and default values are suggested for mass, radius and color.

Number

Set here the element number, which can vary between 0 (Du, a dummy atom) and 111 (Rg, currently the last element with a two-letter symbol). When a valid number is entered, the element name is automatically set and default values are suggested for mass, radius and color.

Table

Pressing Table pops up a second window, showing a Periodic Table of the Elements, with a button for each element. When an element button is clicked, default data is transported to the first window, exactly as if the user had written the element name in Name or the element number in Number.

Mass

The Mass entry sets the default atomic mass for this element. The default is the atomic weight, the average of all naturally occurring isotopes, weighted by their natural abundances, or, when these do not exist, the isotope with a longer half-life time (not necessarily the easiest to synthetize and more common). Mass must always be positive (for dummy atoms, Du, the default is the H value). All elements have a known mass.

Pressing List, a new dialog shows a list with the more important isotope mass information, taken from http://www.wikipedia.com/, after comparison with other sources. This list contains all naturally occurring isotopes, with their relative abundances, plus all the isotopes with a half-life longer than one year (all elements until Cf except At, Rn, Fr), or, when these do not exist, one day (Rn, plus Es, Fm, Md), one hour (At, Lr, Rf, Db), one minute (Fr, No, Sg) or one second (Bh, Hs, Mt, Ds, Rg). Some isotopes have both a natural abundance and a half life decay, necessarily very long. Some isotopes correspond to excited states (Rh, Ag, Sn, Ta, Re, Ir, Bi, Am).

Abundances are given in percentages, half-lifes are given in years y, days d, hours h, minutes m and seconds s. Isotopes that exist in the excited state are signaled with an asterisk.

Radius

The Radius entry sets the default atomic radius for this element. The default values are the effective covalent radius. Radius must always be positive (for dummy atoms, Du, the default is the H value). Some elements do not have a known radius: Pm, At, Rn, Fr, Es, Fm, Md, No, Lr, Rf, Db, Sg, Bh, Hs, Mt, Ds, Rg. In this case, the default comes from the nearest element, with a smaller atomic number, with a known radius. Atomic radius are also used to define default minimum and maximum distance limits for bond creation, as discussed in Bond->Create.

Pressing List, a new dialog shows a list with the more important radius data, taken from http://www.webelements.com/ (where the original publications are referenced), except the ionic radius, taken directly from Shannon's paper, Acta Cryst. A32, 751 (1976). The radius listed are:

1) Half distance between atoms in its element natural state, (most from L.E. Sutton (Ed.), Table of interatomic distances and configuration in molecules and ions, Supplement 1956-1959, Special publication No. 18, Chemical Society, London, UK, 1965.). Available up to Cf (98), except Pm, At, Rn, Fr.

2) Effective atomic (from J.C. Slater, J. Chem. Phys. 1964, 39, 3199), empirically derived by comparison of bond lengths in over 1200 bond types in ionic, metallic, and covalent crystals and molecules. Available up to Am (95) except He, Ne, Kr, Xe, At, Rn, Fr.

3) Calculated atomic (from E. Clementi, D.L.Raimondi, and W.P. Reinhardt, J. Chem. Phys. 1963, 38, 2686), obtained from SCF ab-initio calculations. Available up to Rn (86) except La, Ce.

4) Effective covalent (including from R.T. Sanderson in Chemical Periodicity, Reinhold, New York, USA, 1962.), empirically obtained by comparing distances between single-bonded equal atoms. Available for all elements up to La (57), plus Lu (71) to Bi (83) plus Rn.

5) Calculated covalent, (from Beatriz Cordero et al, in "Covalent radii revisited", Dalton Trans., 2008), arguably more consistent than the effective covalent radius. Available up to Cm (96). For C, there are radius available for sp3, sp2 and sp hybridization. For Mn, Fe, Co there are radius available for low (LS) and high (HS) spin configurations.

6) Van der Waals (mainly from A. Bondi, J. Phys. Chem., 1964, 68, 441.), established from contact distances between non-bonding atoms in touching molecules or atoms.

7) Ionic effective (from R.D. Shannon, Acta Cryst. A32, 751, 1976.), empirically derived from about 1000 distances, taken mainly from oxide and fluoride structures, plus a range of correlations. These radius are a function of valence, coordination, mass (for H) and low (LS) and high (HS) electronic spin (for Cr, Mn, Fe, Co, Ni). Available for all elements up to Cf (98) expect He, Ne, Ar, Kr, Rn.

To get the so-called ionic crystalline radius, suggested by Fumi and Tosi and published also by Shannon, just sum 0.14 to the cation and subtract 0.14 to the anion, so the cation-anion distance remain unchanged. According to Shannon, it is felt that these crystal radii correspond more closely to the physical size of ions in a solid. However, they might less efective in predicting the cation coordination by using Pauling's first rule.

R, G, B

Set here the default color for this element, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).
gamgi-0.17.5/doc/interfaces/atom/config_view.html000066400000000000000000000065431433127522700217230ustar00rootroot00000000000000 GAMGI Interfaces: Atom Config

Atom Config

Set here default visual data that does not depend of the atomic element.

Style

The Style menu is to select the default atom visual representation. Currently supported styles are: 1) a sphere, for Solid; 2) a cross, for Wired. The sphere gives a hight visual quality, when coupled with lights and perhaps a perspective projection. A sphere uses considerable screen space though and is time consuming.

The cross uses much less screen space and computing time. Moreover, when atoms are bonded, crosses are not represented at all, and atoms are identified just by the ends of the bond lines, decreasing even further computation needs. However, wired objects do not have a 3D representation, so diffuse and specular lights are not reflected, becoming poorly visible when using lights, unless the ambient component is important, about (0.5, 0.5, 0.5).

Size

The Size menu is to select the default atom size. The intrinsic size of an atom is given by:
Size x (Variancy x Radius + (1 - Variancy) x Min)
where Radius is the atom radius and Min is the minimum radius.

In Wired mode, all atom crosses have a constant size, given by Size x Min, as Variancy is 0.0.

In Solid mode, Size selects the default size of the atom spheres. Combining default atom Size and Variancy with default bond Size, it is possible to obtain a wide range of styles to represent atomic structures. In Solid mode, the default is to represent atoms as constant spheres (Variancy = 0.0 and Size = 0.8), slightly larger than the bonds (Size = 0.5). An elegant style is to represent atoms as constant spheres with the same Size as bonds (0.5). To represent compact cristalline structures, atom Size and Variancy must be 1.0, to be consistent with cell dimensions. This style can also be used to represent molecules, in order to emphasize the atomic radius and electronic distribution.

Variancy

Choose here the default value for Variancy. In Wired mode, Variancy is always 0.0.

In Solid mode, by default Variancy is 0.0 so the atom spheres have all the same size. When Variancy is 1.0 the atom spheres are scaled directly by the atom radius.

Min

Min fixes the minimum size for crosses and spheres, as defined by the equation above for Size. By default this is the H covalent radius.
gamgi-0.17.5/doc/interfaces/atom/copy_object.html000066400000000000000000000035031433127522700217150ustar00rootroot00000000000000 GAMGI Interfaces: Atom Copy

Atom Copy

Indicate here the number of atom copies to create and its destination.

Gamgi expects users to identify first the atom or list of atoms to copy. When the Atom entry is active and empty, clicking the mouse over an atom, on the current layer (local selection), its identification is transported to the Atom entry. Pressing the List button, the current list of atoms is selected instead.

Name

This is the name given to the new atom copies. The default is to copy the name of each original atom.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the atom or list of atoms to copy, GAMGI expects users to identify a layer to where the atoms should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of atoms, the copies can also be created at the layer of each original atom, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/atom/copy_shift.html000066400000000000000000000023721433127522700215670ustar00rootroot00000000000000 GAMGI Interfaces: Atom Copy

Atom Copy

Set here the translation vector applied to each new atom.

By default, each copied atom has the same coordinates as the original atom. This is expected when copying an atom or a list of atoms to a different layer. However, when each new atom is in the same layer as the original atom (for a list of atoms, the Local option in the Layer menu), a small shift helps to separate the new atoms from the original ones.

All other properties are the same for copied and original atoms (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/atom/create_analysis.html000066400000000000000000000034101433127522700225600ustar00rootroot00000000000000 GAMGI Interfaces: Atom Create

Atom Create

Set here atom features obtained from structural analysis, such as diffraction.

Temperature

Set here the atom temperature (X-Ray Debye-Waller factor), in Angstrom squared: 0 < T < 100. Generally, T < 30 signifies confidence in its position, while T > 60 signifies disorder. Together with structure factors, temperature information is needed to calculate accurate X-ray and electron diffraction patterns.

Occupancy

Although by default all atoms have occupancy 1.0, many experimental results can only be explained assuming that some positions are not always occupied by the same type of atom. Therefore these atoms have an average occupancy between 0.0 and 1.0. Apart from the structural information in itself, carried in these occupancy factors, they are needed to accurately calculate the diffraction structure factors and the corresponding diffraction patterns in solids and liquids.
gamgi-0.17.5/doc/interfaces/atom/create_position.html000066400000000000000000000024551433127522700226110ustar00rootroot00000000000000 GAMGI Interfaces: Atom Create

Atom Create

Define here the atom position.

Translation

The coordinates of an atom can be set using the X, Y, Z entries. Any decimal numbers will be accepted as good, even if they are outside the current range of visibility.

A simpler way to specify the atom position is to click on the screen, at the wished position, after defining all the other atom properties: a new atom object is created at that position.

gamgi-0.17.5/doc/interfaces/atom/create_property.html000066400000000000000000000144751433127522700226360ustar00rootroot00000000000000 GAMGI Interfaces: Atom Create

Atom Create

Set here the atom properties.

Mass

The Mass entry sets the atomic mass. The default value is the so called atomic weight, the average of all naturally occurring isotopes, weighted by their natural abundances, or, when these do not exist, the isotope with a longer half-life time (not necessarily the easiest to synthetize and more common). Mass must always be positive (for dummy atoms, Du, the default is the H value). All elements have a known mass.

To define new default values, select Atom->Config (check Help->Interfaces->Atom->Config) or import XML configuration files (check Help->Formats->Atom->Config).

Pressing List, a new dialog shows a list with the more important isotope mass information, taken from http://www.wikipedia.com/, after comparison with other sources. This list contains all naturally occurring isotopes, with their relative abundances, plus all the isotopes with a half-life longer than one year (all elements until Cf except At, Rn, Fr), or, when these do not exist, one day (Rn, plus Es, Fm, Md), one hour (At, Lr, Rf, Db), one minute (Fr, No, Sg) or one second (Bh, Hs, Mt, Ds, Rg). Some isotopes have both a natural abundance and a half life decay, necessarily very long. Some isotopes correspond to excited states (Rh, Ag, Sn, Ta, Re, Ir, Bi, Am).

Abundances are given in percentages, half-lifes are given in years y, days d, hours h, minutes m and seconds s. Isotopes that exist in the excited state are signaled with an asterisk.

Radius

The Radius entry sets the atomic radius. The default values are the effective covalent radius. Radius must always be positive (for dummy atoms, Du, the default is the H value). Some elements do not have a known radius: Pm, At, Rn, Fr, Es, Fm, Md, No, Lr, Rf, Db, Sg, Bh, Hs, Mt, Ds, Rg. In this case, the default comes from the nearest element, with a smaller atomic number, with a known radius. Atomic radius are also used to define default minimum and maximum distance limits for bond creation, as discussed in Bond->Create.

To define new default values, select Atom->Config (check Help->Interfaces->Atom->Config) or import XML configuration files (check Help->Formats->Atom->Config).

Pressing List, a new dialog shows a list with the more important radius data, taken from http://www.webelements.com/ (where the original publications are referenced), except the ionic radius, taken directly from Shannon's paper, Acta Cryst. A32, 751 (1976). The radius listed are:

1) Half distance between atoms in its element natural state, (most from L.E. Sutton (Ed.), Table of interatomic distances and configuration in molecules and ions, Supplement 1956-1959, Special publication No. 18, Chemical Society, London, UK, 1965.). Available up to Cf (98), except Pm, At, Rn, Fr.

2) Effective atomic (from J.C. Slater, J. Chem. Phys. 1964, 39, 3199), empirically derived by comparison of bond lengths in over 1200 bond types in ionic, metallic, and covalent crystals and molecules. Available up to Am (95) except He, Ne, Kr, Xe, At, Rn, Fr.

3) Calculated atomic (from E. Clementi, D.L.Raimondi, and W.P. Reinhardt, J. Chem. Phys. 1963, 38, 2686), obtained from SCF ab-initio calculations. Available up to Rn (86) except La, Ce.

4) Effective covalent (including from R.T. Sanderson in Chemical Periodicity, Reinhold, New York, USA, 1962.), empirically obtained by comparing distances between single-bonded equal atoms. Available for all elements up to La (57), plus Lu (71) to Bi (83) plus Rn.

5) Calculated covalent, (from Beatriz Cordero et al, in "Covalent radii revisited", Dalton Trans., 2008), arguably more consistent than the effective covalent radius. Available up to Cm (96). For C, there are radius available for sp3, sp2 and sp hybridization. For Mn, Fe, Co there are radius available for low (LS) and high (HS) spin configurations.

6) Van der Waals (mainly from A. Bondi, J. Phys. Chem., 1964, 68, 441.), established from contact distances between non-bonding atoms in touching molecules or atoms.

7) Ionic effective (from R.D. Shannon, Acta Cryst. A32, 751, 1976.), empirically derived from about 1000 distances, taken mainly from oxide and fluoride structures, plus a range of correlations. These radius are a function of valence, coordination, mass (for H) and low (LS) and high (HS) electronic spin (for Cr, Mn, Fe, Co, Ni). Available for all elements up to Cf (98) expect He, Ne, Ar, Kr, Rn.

To get the so-called ionic crystalline radius, suggested by Fumi and Tosi and published also by Shannon, just sum 0.14 to the cation and subtract 0.14 to the anion, so the cation-anion distance remain unchanged. According to Shannon, it is felt that these crystal radii correspond more closely to the physical size of ions in a solid. However, they might less efective in predicting the cation coordination by using Pauling's first rule.

Charge

The Charge entry sets the atomic charge. The default is 0.0. but all real values are valid. The most common way to use charges is to attribute previously calculated values to different atoms, construct atomic structures with these atoms, and then export these structures to files, to feed Molecular Mechanics programs requiring charge potentials.
gamgi-0.17.5/doc/interfaces/atom/create_type.html000066400000000000000000000050161433127522700217220ustar00rootroot00000000000000 GAMGI Interfaces: Atom Create

Atom Create

Set here the element and label of atom.

Element

Set here the element name, which can be Si but not si, S i or SI. When a valid name is entered, the element number is automatically set and default values are suggested for the atom name, label, mass, radius and color. Choosing a new element automatically changes these values to the new element. Selecting non-default values for these parameters should therefore be done only after setting the element.

Number

Set here the element number, which can vary between 0 (Du, a dummy atom) and 111 (Rg, currently the last element with a two-letter symbol). When a valid number is entered, the element name is automatically set and default values are suggested for the atom name, label, mass, radius and color, as described above.

Label

set here the atom label, commonly used in Molecular Mechanics to distinguish atoms described by different inter-atomic potentials. For example, methyl and hydroxyl hydrogen atoms in methanol molecules might be described by "h3" and "ho" atom labels. Atom labels can have a maximum of 10 characters, accepted characters are the same as for atom names.

Table

Pressing Table pops up a second window, showing a Periodic Table of the Elements, with a button for each element. When an element button is clicked, default data is transported to the first window, exactly as if the user had written the element name in the Name entry or the element number in the Number entry.

Pressing Table again (or clicking Cancel in the second window, or using the Window Manager tools) closes the second window.

gamgi-0.17.5/doc/interfaces/atom/create_view.html000066400000000000000000000071271433127522700217200ustar00rootroot00000000000000 GAMGI Interfaces: Atom Create

Atom Create

Define here the atom visual aspect.

Style

The Style option menu is to select the atom visual representation. Currently supported styles are: 1) a sphere, for Solid; 2) a cross, for Wired. The sphere gives a hight visual quality, when coupled with lights and perhaps a perspective projection. A sphere uses considerable screen space though and is time consuming.

The cross uses much less screen space and computing time. Moreover, when atoms are bonded, crosses are not represented at all, and atoms are identified just by the ends of the bond lines, decreasing even further computation needs. However, wired objects do not have a 3D representation, so diffuse and specular lights are not reflected, becoming poorly visible when using lights, unless the ambient component is important, about (0.5, 0.5, 0.5).

Size

In Solid mode, this parameter controls the size of the atom spheres. Combining atom Size and Variancy with bond Size, it is possible to obtain a wide range of styles to represent atomic structures.

In Solid mode, the default is to represent atoms as constant spheres (Variancy = 0.0 and Size = 0.8), slightly larger than the bonds (Size = 0.5). An elegant style is to represent atoms as constant spheres with the same Size as bonds (0.5).

To represent compact cristalline structures, atom Size and Variancy must be 1.0, to be consistent with cell dimensions. This style can also be used to represent molecules, in order to emphasize the atomic radius and electronic distribution. To change the default Size select Atom->Config.

Variancy

The intrinsic size of an atom is given by:
Size x (Variancy x Radius + (1 - Variancy) x Min)
where Radius is the atom radius and Min is the minimum radius, by default the H covalent radius (currently 0.37). To change this default select Atom->Config.

In Wired mode, Variancy is always 0.0 so all atom crosses have a constant size, given by Size x Min.

In Solid mode, when Variancy is 0.0 the atom spheres have all the same size, when Variancy is 1.0 the atom spheres are scaled directly by the atom radius.

R, G, B

The R, G, B entries define the atom color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).

Scale

Set the atom size, including its child objects. Atom objects are scaled around the atom center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
gamgi-0.17.5/doc/interfaces/atom/link_object.html000066400000000000000000000055641433127522700217110ustar00rootroot00000000000000 GAMGI Interfaces: Atom Link

Atom Link

Link an atom or a list of atoms to other objects.

Hierarchy

Atoms can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by atoms. Pressing the button Above, the same menu shows the classes of objects that can own atoms.

Gamgi expects users to identify first the atom or list of atoms and then the object to link. When the Atom entry is active and empty, clicking the mouse over an atom, on the current layer (local selection), its identification is transported to the Atom entry. Pressing the List button, the current list of atoms is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

Method

Gamgi suppports only one method to link atoms: Object.

The Object method links an atom or a list of atoms to a single object, Above or Below.

When linking an atom and the Hierarchy is Above, the atom is unlinked from its current parent and linked to the new object. When the atom is moved to a different layer, its bonds are automatically removed. When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the atom. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of atoms Above, all atoms in the list are unlinked and linked to the parent object. When linking a list of atoms Below, the child object is replicated as many times as necessary to link each atom in the list to a different replica.

gamgi-0.17.5/doc/interfaces/atom/link_shift.html000066400000000000000000000031731433127522700215520ustar00rootroot00000000000000 GAMGI Interfaces: Atom Link

Atom Link

Set here the translation applied to the child object or list of objects.

When linking an atom to another object, the translation is always applied to the child object: the atom itself when linking above, the other object (orbital, text) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of atoms is linked above, Reference is set by default to Child, so atoms preserve their positions and are not superposed.

When a list of atoms is linked below, each atom will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent atoms and are not superposed.

gamgi-0.17.5/doc/interfaces/atom/measure_angle.html000066400000000000000000000065011433127522700222250ustar00rootroot00000000000000 GAMGI Interfaces: Atom Measure

Atom Measure

Measure properties involving the Angle between atoms and other objects.

Property

The supported Angle properties, the same as for Atom->Modify, are listed below. Atoms and other objects may belong to different parents and may be bonded or not. Only objects in the current layer can be chosen.

An easy technique to select the objects is to click the mouse sucessively over their visual representations, in the sequence shown in the dialog. After the last needed object is selected, GAMGI automatically starts the calculation.

3-Atom Angle

The valence angle between directions Atom2-Atom1 and Atom2-Atom3.

The signal convention is: when vector Atom2-Atom1 is rotated from vector Atom2-Atom3 through a direct, counter-clockwise rotation, the angle is positive, otherwise is negative. In 3D space, the direction of this planar rotation depends of the side of the plane where the user is, so the angle signal depends of the user position relatively to the atoms.

4-Atom Angle

The torsion angle between two planes, defined by Atom1-Atom2-Atom3 and Atom2-Atom3-Atom4. An error is shown when Atom1, Atom2, Atom3 or Atom2, Atom3, Atom4 are initially aligned along a common direction, because the plane Atom1-Atom2-Atom3 or Atom2-Atom3-Atom4 is undefined.

The signal convention is: looking along vector Atom2-Atom3 (with Atom1 near the user and Atom4 away from the user), when vector common direction-Atom1 is rotated from vector common direction-Atom4 by a direct, counter-clockwise rotation, the angle is positive, otherwise is negative.

While the signal of the 3-atom angle depends of the user position, the signal of the 4-atom angle is unique, because the four atoms define a 3D construction while the three atoms define only a 2D construction. If the user is looking from the other side, along the common direction Atom3-Atom2 (with Atom4 near the user and Atom1 away from the user), the user now sees the rotation in the opposite direction, which compensates the Atom1, Atom4 swap, so the signal of the torsion angle remains the same.

Value

After selecting a property, enter the name of the objects and press Ok. If all objects are recognized, GAMGI does the calculation and shows the result in the Value entry.

When a calculation ends, GAMGI keeps the objects identification. To start a new calculation, just click the mouse over a new object: GAMGI automatically cleans the previous data and inserts the new object identification. When a new property or page is chosen, previous data is automatically removed.

gamgi-0.17.5/doc/interfaces/atom/measure_length.html000066400000000000000000000043201433127522700224150ustar00rootroot00000000000000 GAMGI Interfaces: Atom Measure

Atom Measure

Measure properties involving the Length between atoms and other objects.

Property

The supported Length properties, the same as for Atom->Modify, are listed below. Atoms and other objects may belong to different parents and may be bonded or not. Only objects in the current layer can be chosen.

An easy technique to select the objects is to click the mouse sucessively over their visual representations, in the sequence shown in the dialog. After the last needed object is selected, GAMGI automatically starts the calculation.

2-Atom Distance

The distance between two Atoms.

Atom 2-Atom Distance

The distance between Atom1 and the direction defined by Atom2-Atom3.

Atom 3-Atom Distance

The distance between Atom1 and the plane defined by Atom2-Atom3-Atom4.

Atom Direction Distance

The distance from an Atom to a Direction.

Atom Plane Distance

The distance from an Atom to a Plane.

Value

After selecting a property, enter the name of the objects and press Ok. If all objects are recognized, GAMGI does the calculation and shows the result in the Value entry.

When a calculation ends, GAMGI keeps the objects identification. To start a new calculation, just click the mouse over a new object: GAMGI automatically cleans the previous data and inserts the new object identification. When a new property or page is chosen, previous data is automatically removed.

gamgi-0.17.5/doc/interfaces/atom/modify_analysis.html000066400000000000000000000044541433127522700226150ustar00rootroot00000000000000 GAMGI Interfaces: Atom Modify

Atom Modify

Change here analysis data for a single atom or a list of atoms.

To modify an atom, click over its graphic image, or write its identification (name and number) on the Atom entry. To modify a list of atoms, press the button List (after creating the list of atoms with Atom->Select). Parameters for empty entries or Local choices remain unchanged.

To change an atom name write the new name in the Atom entry, followed by the atom number (GAMGI needs the number to identify the atom). To change the name for a list of atoms, press List first and then write the new common name in the Name entry.

Temperature

Temperature information is needed to calculate Debye-Waller temperature factors, which, together with structure factors, are needed to calculate accurate X-ray and electron diffraction patterns.

Occupancy

Although by default all atoms have occupancy 1.0, many experimental results can only be explained assuming that some positions are not always occupied by the same type of atom. Therefore these atoms have an average occupancy between 1.0 and 0.0. Apart from the structural information in itself, carried in these occupancy factors, they are needed to accurately calculate the diffraction structure factors and the corresponding diffraction patterns in solids and liquids.
gamgi-0.17.5/doc/interfaces/atom/modify_angle.html000066400000000000000000000074731433127522700220640ustar00rootroot00000000000000 GAMGI Interfaces: Atom Modify

Atom Modify

Change here Angle properties between a single atom and other objects.

Property

The supported Angle properties, the same as for Atom->Measure, are listed below. Atoms and other objects may belong to different parents and may be bonded or not. Only objects in the current layer can be chosen.

An easy technique to select the objects is to click the mouse sucessively over their visual representations, in the sequence shown in the dialog.

3-Atom Angle

The valence angle between directions Atom2-Atom1 and Atom2-Atom3.

The signal convention is: when vector Atom2-Atom1 is rotated from vector Atom2-Atom3 through a direct, counter-clockwise rotation, the angle is positive, otherwise is negative. In 3D space, the direction of this planar rotation depends of the side of the plane where the user is, so the angle signal depends of the user position relatively to the atoms.

4-Atom Angle

The torsion angle between two planes, defined by Atom1-Atom2-Atom3 and Atom2-Atom3-Atom4. An error is shown when Atom1, Atom2, Atom3 or Atom2, Atom3, Atom4 are initially aligned along a common direction, because the plane Atom1-Atom2-Atom3 or Atom2-Atom3-Atom4 is undefined.

The signal convention is: looking along vector Atom2-Atom3 (with Atom1 near the user and Atom4 away from the user), when vector common direction-Atom1 is rotated from vector common direction-Atom4 by a direct, counter-clockwise rotation, the angle is positive, otherwise is negative.

While the signal of the 3-atom angle depends of the user position, the signal of the 4-atom angle is unique, because the four atoms define a 3D construction while the three atoms define only a 2D construction. If the user is looking from the other side, along the common direction Atom3-Atom2 (with Atom4 near the user and Atom1 away from the user), the user now sees the rotation in the opposite direction, which compensates the Atom1, Atom4 swap, so the signal of the torsion angle remains the same.

Value

After selecting the property and the objects, set Value to the desired angle and press Ok to activate the change. An error is shown when some of the objects are not recognized, or when the angle or axis rotation cannot be determined.

For all properties, of all the objects selected by users only the first atom is actually modified. Atoms bonded to the first atom are also modified, as long as they are not bonded by cyclic structures to any of the other selected objects (without this restriction, all atoms in a ring would be rotated!).

In torsion angles, atoms bonded to the second atom are also modified, as long as they are not bonded to any of the other selected objects.

Value can take negative values, with the meaning described above for 3-Atom and 4-Atom rotations.

gamgi-0.17.5/doc/interfaces/atom/modify_length.html000066400000000000000000000060121433127522700222430ustar00rootroot00000000000000 GAMGI Interfaces: Atom Modify

Atom Modify

Change here Length properties between a single atom and other objects.

Property

The supported Length properties, the same as for Atom->Measure, are listed below. Atoms and other objects may belong to different parents and may be bonded or not. Only objects in the current layer can be chosen.

An easy technique to select the objects is to click the mouse sucessively over their visual representations, in the sequence shown in the dialog.

2-Atom Distance

The distance between Atom1 and Atom2.

Atom 2-Atom Distance

The distance between Atom1 and the direction defined by Atom2-Atom3.

Atom 3-Atom Distance

The distance between Atom1 and the plane defined by Atom2-Atom3-Atom4.

Atom Direction Distance

The distance between an Atom and a Direction.

Atom Plane Distance

The distance between an Atom and a Plane.

Value

After selecting the property and the objects, set Value to the desired length and press Ok to activate the change. An error is shown when some of the objects are not recognized, or when the changing direction cannot be determined.

For all properties, of all the objects selected by users only the first atom is actually translated. Atoms bonded to the first atom are also translated, as long as they are not bonded by cyclic structures to any of the other selected objects (without this restriction, all atoms in a ring would be translated!).

For all properties, the direction between the first atom and the other objects is always preserved. Value can take negative values, in which case the first atom and the other modified atoms are reflected to the other side of the reference objects.

When a calculation ends, GAMGI keeps the objects identification. To start a new calculation, just click the mouse over a new object: GAMGI automatically cleans the previous data and inserts the new object identification. When a new property or page is chosen, previous data is automatically removed.

gamgi-0.17.5/doc/interfaces/atom/modify_position.html000066400000000000000000000036051433127522700226330ustar00rootroot00000000000000 GAMGI Interfaces: Atom Modify

Atom Modify

Change here the position and orientation for a single atom or a list of atoms.

To modify an atom, click over its graphic image, or write its identification (name and number) on the Atom entry. To modify a list of atoms, press the button List (after creating the list of atoms with Atom->Select). Parameters for empty entries or Local choices remain unchanged.

To change an atom name write the new name in the Atom entry, followed by the atom number (GAMGI needs the number to identify the atom). To change the name for a list of atoms, press List first and then write the new common name in the Name entry.

Translation

The coordinates of an atom can be changed using the X, Y, Z entries. Any values are accepted as good, even if they are outside the range of visibility. The change can be Absolute or Relative (to the former position).
gamgi-0.17.5/doc/interfaces/atom/modify_property.html000066400000000000000000000154631433127522700226600ustar00rootroot00000000000000 GAMGI Interfaces: Atom Modify

Atom Modify

Change here the mass, radius and charge for a single atom or a list of atoms.

To modify an atom, click over its graphic image, or write its identification (name and number) on the Atom entry. To modify a list of atoms, press the button List (after creating the list of atoms with Atom->Select). Parameters for empty entries or Local choices remain unchanged.

To change an atom name write the new name in the Atom entry, followed by the atom number (GAMGI needs the number to identify the atom). To change the name for a list of atoms, press List first and then write the new common name in the Name entry.

Mass

The Mass entry sets the atomic mass. The default value is the so called atomic weight, the average of all naturally occurring isotopes, weighted by their natural abundances, or, when these do not exist, the isotope with a longer half-life time (not necessarily the easiest to synthetize and more common). Mass must always be positive or undefined (for dummy atoms, Du, this is the default). All elements have a known mass.

To define new default values, select Atom->Config (check Help->Interfaces->Atom->Config) or import XML configuration files (check Help->Formats->Atom->Config).

Pressing List, a new dialog shows a list with the more important isotope mass information, taken from http://www.wikipedia.com/, after comparison with other sources. This list contains all naturally occurring isotopes, with their relative abundances, plus all the isotopes with a half-life longer than one year (all elements until Cf except At, Rn, Fr), or, when these do not exist, one day (Rn, plus Es, Fm, Md), one hour (At, Lr, Rf, Db), one minute (Fr, No, Sg) or one second (Bh, Hs, Mt, Ds, Rg). Some isotopes have both a natural abundance and a half life decay, necessarily very long. Some isotopes correspond to excited states (Rh, Ag, Sn, Ta, Re, Ir, Bi, Am).

Radius

The Radius entry sets the atomic radius. The default values are the effective covalent radius. Radius must always be positive or undefined (for dummy atoms, Du, this is the default). Some elements do not have a known radius: Pm, At, Rn, Fr, Es, Fm, Md, No, Lr, Rf, Db, Sg, Bh, Hs, Mt, Ds, Rg. In this case, the default comes from the nearest element, with a smaller atomic number, with a known radius. Atomic radius are also used to define default minimum and maximum distance limits for bond creation, as discussed in Bond->Create.

To define new default values, select Atom->Config (check Help->Interfaces->Atom->Config) or import XML configuration files (check Help->Formats->Atom->Config).

Pressing List, a new dialog shows a list with the more important radius data, taken from http://www.webelements.com/ (where the original publications are referenced), except the ionic radius, taken directly from Shannon's paper, Acta Cryst. A32, 751 (1976). The radius listed are:

1) Half distance between atoms in its element natural state, (most from L.E. Sutton (Ed.), Table of interatomic distances and configuration in molecules and ions, Supplement 1956-1959, Special publication No. 18, Chemical Society, London, UK, 1965.). Available up to Cf (98), except Pm, At, Rn, Fr.

2) Effective atomic (from J.C. Slater, J. Chem. Phys. 1964, 39, 3199), empirically derived by comparison of bond lengths in over 1200 bond types in ionic, metallic, and covalent crystals and molecules. Available up to Am (95) except He, Ne, Kr, Xe, At, Rn, Fr.

3) Calculated atomic (from E. Clementi, D.L.Raimondi, and W.P. Reinhardt, J. Chem. Phys. 1963, 38, 2686), obtained from SCF ab-initio calculations. Available up to Rn (86) except La, Ce.

4) Effective covalent (including from R.T. Sanderson in Chemical Periodicity, Reinhold, New York, USA, 1962.), empirically obtained by comparing distances between single-bonded equal atoms. Available for all elements up to La (57), plus Lu (71) to Bi (83) plus Rn.

5) Calculated covalent, (from Beatriz Cordero et al, in "Covalent radii revisited", Dalton Trans., 2008), arguably more consistent than the effective covalent radius. Available up to Cm (96). For C, there are radius available for sp3, sp2 and sp hybridization. For Mn, Fe, Co there are radius available for low (LS) and high (HS) spin configurations.

6) Van der Waals (mainly from A. Bondi, J. Phys. Chem., 1964, 68, 441.), established from contact distances between non-bonding atoms in touching molecules or atoms.

7) Ionic effective (from R.D. Shannon, Acta Cryst. A32, 751, 1976.), empirically derived from about 1000 distances, taken mainly from oxide and fluoride structures, plus a range of correlations. These radius are a function of valence, coordination, mass (for H) and low (LS) and high (HS) electronic spin (for Cr, Mn, Fe, Co, Ni). Available for all elements up to Cf (98) expect He, Ne, Ar, Kr, Rn.

To get the so-called ionic crystalline radius, suggested by Fumi and Tosi and published also by Shannon, just sum 0.14 to the cation and subtract 0.14 to the anion, so the cation-anion distance remain unchanged. According to Shannon, it is felt that these crystal radii correspond more closely to the physical size of ions in a solid. However, they might less efective in predicting the cation coordination by using Pauling's first rule.

Charge

The Charge entry sets the atomic charge. The default is 0.0. but all real values are valid. The most common way to use charges is to attribute previously calculated values to different atoms, construct atomic structures with these atoms, and then export these structures to files, to feed Molecular Mechanics programs requiring charge potentials.
gamgi-0.17.5/doc/interfaces/atom/modify_type.html000066400000000000000000000063471433127522700217560ustar00rootroot00000000000000 GAMGI Interfaces: Atom Modify

Atom Modify

Change here the element and label for a single atom or a list of atoms.

To modify an atom, click over its graphic image, or write its identification (name and number) on the Atom entry. To modify a list of atoms, press the button List (after creating the list of atoms with Atom->Select). Parameters for empty entries or Local choices remain unchanged.

To change an atom name write the new name in the Atom entry, followed by the atom number (GAMGI needs the number to identify the atom). To change the name for a list of atoms, press List first and then write the new common name in the Name entry.

Element

Change here the element name, which can be Si but not si, S i or SI. When a valid name is entered, the element number is automatically set and default values are suggested for the atom name, label, mass, radius and color. Choosing a new element automatically changes these values to the new element. Selecting non-default values for these parameters should therefore be done only after setting the element.

Number

Change here the element number, which can vary between 0 (Du, a dummy atom) and 111 (Rg, currently the last element with a two-letter symbol). When a valid number is entered, the element name is automatically set and default values are suggested for the atom name, label, mass, radius and color, as described above.

Label

Change here the atom label, commonly used in Molecular Mechanics to distinguish atoms described by different inter-atomic potentials. For example, methyl and hydroxyl hydrogen atoms in methanol molecules might be described by "h3" and "ho" atom labels. Atom labels can have a maximum of 10 characters, accepted characters are the same as for atom names.

Table

Pressing Table pops up a second window, showing a Periodic Table of the Elements, with a button for each element. When an element button is clicked, default data is transported to the first window, exactly as if the user had written the element name in the Name entry or the element number in the Number entry.

Pressing Table again (or clicking Cancel in the second window, or using the Window Manager tools) closes the second window.

gamgi-0.17.5/doc/interfaces/atom/modify_view.html000066400000000000000000000104171433127522700217400ustar00rootroot00000000000000 GAMGI Interfaces: Atom Modify

Atom Modify

Change here the visual representation for a single atom or a list of atoms.

To modify a atom, click over its graphic image, or write its id on the Atom entry. To modify a list of atoms, press the button List (after creating the list of atoms with Atom->Select). Parameters for empty entries or Local choices remain unchanged.

To change an atom name write the new name in the Atom entry, followed by the atom number (GAMGI needs the number to identify the atom). To change the name for a list of atoms, press List first and then write the new common name in the Name entry.

Style

The Style option menu is to select the atom visual representation. Currently supported styles are: 1) a sphere, for Solid; 2) a cross, for Wired. The sphere gives a hight visual quality, when coupled with lights and perhaps a perspective projection. A sphere uses considerable screen space though and is time consuming.

The cross uses much less screen space and computing time. Moreover, when atoms are bonded, crosses are not represented at all, and atoms are identified just by the ends of the bond lines, decreasing even further computation needs. However, wired objects do not have a 3D representation, so diffuse and specular lights are not reflected, becoming poorly visible when using lights, unless the ambient component is important, about (0.5, 0.5, 0.5).

Size

In Solid mode, this parameter controls the size of the atom spheres. Combining atom Size and Variancy with bond Size, it is possible to obtain a wide range of styles to represent atomic structures.

In Solid mode, the default is to represent atoms as constant spheres (Variancy = 0.0 and Size = 0.8), slightly larger than the bonds (Size = 0.5). An elegant style is to represent atoms as constant spheres with the same Size as bonds (0.5).

To represent compact cristalline structures, atom Size and Variancy must be 1.0, to be consistent with cell dimensions. This style can also be used to represent molecules, in order to emphasize the atomic radius and electronic distribution. To change the default Size select Atom->Config.

Variancy

The intrinsic size of an atom is given by:
Size x (Variancy x Radius + (1 - Variancy) x Min)
where Radius is the atom radius and Min is the minimum radius, by default the H covalent radius (currently 0.37). To change this default select Atom->Config.

In Wired mode, Variancy is always 0.0 so all atom crosses have a constant size, given by Size x Min.

In Solid mode, when Variancy is 0.0 the atom spheres have all the same size, when Variancy is 1.0 the atom spheres are scaled directly by the atom radius.

R, G, B

The R, G, B entries define the atom color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).

Scale

Set the atom size, including its child objects. Atom objects are scaled around the atom center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
gamgi-0.17.5/doc/interfaces/atom/remove_object.html000066400000000000000000000034141433127522700222410ustar00rootroot00000000000000 GAMGI Interfaces: Atom Remove

Atom Remove

  • Object
Indicate how to remove an atom (or list of atoms, previously selected with Atom->Select, when Global is pressed).

Scope

When the Scope is All, the atom and all its contents is removed. This is the default. When an atom used to define an atomic plane or direction is removed, the plane or direction is automatically removed.

When the Scope is Container, the atom is removed but its contents (orbitals, texts) is saved, linked to the atom parent. Atom bonds are removed because they cannot live without the atom.

When the Scope is Contents, the atom is preserved but all its contents (bonds, orbitals, texts) is removed.

When the Scope is Bond, Orbital or Text, these objects are removed from the atom.

When the removed atom was part of the current object, the current layer becomes the new current object.

Clicking the mouse over an atom in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/atom/select_list.html000066400000000000000000000134221433127522700217300ustar00rootroot00000000000000 GAMGI Interfaces: Atom Select

Atom Select

  • List
Atom->Select is used for two different things: 1) to set an atom as the current object (the object that is moved, rotated, scaled with the mouse); 2) to select a whole list of atoms that can be subsequently modified or removed using Atom->Modify or Atom->Remove.

To set an atom as the current object, click the mouse over its visual representation. When an atom is recognized, a beep is emitted and the atom identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

Only atoms in the working layer can be chosen as current object, even if atoms are visible in other (transparent or translucid) layers. For each top window, only one current object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. The identification of the current object is always visible in the window statusbar.

A faster method to set an atom as current object, without using the Atom->Select dialog, is to click over Atom on the main menu with the second mouse button, and then click over the atom visual representation.

List

List always shows a flat list of all the atoms available in the current Scope. For each atom, a hierarchical tree shows all its child objects.

Scope

This sets the initial List of candidate atoms, presented on the left, from where the atoms will be selected. Five options are available: Gamgi (atoms in all windows), Window (atoms in the current window), Layer (atoms ins the current layer), Before (the previous list of selected atoms) and Current (the current list of selected atoms).

The list Before allows users to undo possible mistakes and is removed everytime Atom->Select closes. The list Current is the real thing, the list of atoms that is saved for further action when Atom->Select is closed. When list Current is not empty, the Atom label on the main menu shows a different color, to signal that a list of atoms has been selected.

By default GAMGI always shows the list Current, except when this list is empty (for example the first time Atom->Select is called). In this case GAMGI starts with the list Layer.

Thus the new list Current is usually prepared selecting objects from the existing list Current. This gives users a simple and effective way to prepare complex lists of objects, by entering successive filtering conditions and pressing Ok each time. The list Current thus obtained will be shorter and shorter and will comply with all the conditions entered before.

When Scope is not Current, the selected objects that are not yet members of the list Current are added to the beginning of that list. Thus the list Current can be reduced by successive filtering conditions of the Current list or increased by successive additions from objects in other Scope lists.

Action

When Action is set to Include (the default), the next Current list is formed by the atoms that have been selected in the visible List on the left, using any available Method. When Action is set to Exclude, the next Current list is formed by the atoms that have not been selected in the visible List.

Method

There are many different techniques to indicate which atoms should be included or excluded to the list Current. The combo box Method sets which technique should be used: 1) Pick, select one atom each time, either pressing Ctrl and clicking on the atom visual representation on a graphic area or pressing Ctrl and clicking directly on the atom tree row on the List; 2) Region, select all atoms in a rectangle in a graphic area (TODO); 3) one of the 17 remaining methods, representing all the available atom properties.

In this case, for each property, a range of values should be entered in entries Min and Max. When the value in Min is larger than the value in Max, GAMGI swaps the two limits, issues a warning, and completes the task. When Min is empty, only the Max condition is applied. When Max is empty, only the Min condition is applied. When both Min and Max are empty all values are accepted.

These properties can be combined to get the desired selection. For example, to select a set of atoms between (x0, y0, z0) and (x1, y1, z1) just apply the property X between x0 and X1, then Y between y0 and y1 and Z betweeb z0 and z1.

When no conditions are specified, by defaults all atoms are included or excluded, according to the Action chosen. For example, to disable entirely a list of atoms previously selected, just open Atom->Select, change Action to Exclude and press Ok: the color of the Atom label on the main menu changes to the default color, signaling that no list of atoms exists.

gamgi-0.17.5/doc/interfaces/bond/000077500000000000000000000000001433127522700165105ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/bond/config_length.html000066400000000000000000000037561433127522700222170ustar00rootroot00000000000000 GAMGI Interfaces: Bond Config

Bond Config

Define here the length limits used when creating new bonds with the Length criterium.

Lower, Upper

When explicit bond length ranges are not defined for a given element pair, GAMGI attempts to create default minimum and maximum bond length limits by summing the two atom radius and multiplying the sum by Lower and Upper factors. Both atom radius must be defined, otherwise the bond is not created.

Usually Lower is smaller and Upper is larger than 1.0. To increase the valid bond length range, decrease Lower, increase Upper and press Ok.

The Lower, Upper parameters are common to all element pairs and thus provide a method much less accurate (but much easier) to determine bonds than with Minimum, Maximum parameters.

Element, Element, Min, Max

Setting both Element entries to valid atomic elements, the current Min and Max distances to create bonds for this element pair are automatically shown. To explicitly define a new range for this element pair, set new values for Min, Max and press Ok.

Calling Bond->Config again and entering the same element pair, the new Min, Max values appear automatically.

gamgi-0.17.5/doc/interfaces/bond/config_view.html000066400000000000000000000041661433127522700217040ustar00rootroot00000000000000 GAMGI Interfaces: Bond Config

Bond Config

Define here the visual style applied by default to new bonds.

Style

This menu controls which style is applied by default when creating a new bond: a cylinder in solid mode or a line in wired mode.

Cylinders provide a better visual quality, when coupled with lights, but demand more screen space and processing time. Lines become poorly visible when using lights, unless the ambient component is significant, as diffuse and specular lights are not reflected.

Size

This parameter controls the size applied by default when creating bonds in Solid mode. Combining bond Size with atom Variancy and Size, it is possible to obtain a wide range of styles to represent atomic structures.

The default is to represent atoms (Size = 0.8) slightly larger than bonds (Size = 0.5). An elegant style is to represent bonds with the same Size as atoms (0.5).

To guarantee that bond cylinders are closed by atom spheres, bond Size should not be larger than atom Size.

Color

This button controls whether by default the bond is represented with its own, independent color, or inherits the colors of the parent atoms.

R, G, B

These entries set the color used by default, between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0), when bonds are rendered with their own independent color.
gamgi-0.17.5/doc/interfaces/bond/create_length.html000066400000000000000000000060071433127522700222050ustar00rootroot00000000000000 GAMGI Interfaces: Bond Create

Bond Create

Set here the length and element criteria used in Length and Delaunay models to create new bonds.

Element, Element

When the Element entries are empty (the default), GAMGI attempts to create bonds for all pairs of atoms. When the Element entries are occupied with valid element names, only bonds between atoms of these elements are considered.

When both elements are recognized, minimum and maximum bond length limits for this element pair - calculated according to the rules described below - are automatically writen in the Minimum, Maximum entries, otherwise these entries are left empty.

When pressing Ok, the Element entries must be both empty or valid, otherwise an error dialog is shown.

Minimum, Maximum

When the Minimum, Maximum entries are empty (the default), GAMGI attempts to use its own data to set a valid range of bond lengths, for each element pair.

For each atom pair, GAMGI checks whether specific minimum and maximum bond length limits have been configured. If the atoms distance is in the configured interval, a new bond is created. To configure bond length limits for specific element pairs, select Bond->Config.

If no bond length interval has been configured for this element pair, GAMGI attempts to calculate automatic minimum and maximum limits, summing the two atom radius and multiplying by lower and upper factors (currently 0.80 and 1.10 by default). If the atoms distance is in the calculated interval, a new bond is created. To configure these lower and upper factors, valid for all element pairs, select Bond->Config.

If no radius is defined for at least one of the elements, then no bond is created. To configure the atom radius, for specific elements, select Atom->Config.

When the Minimum, Maximum entries are occupied with valid length values, only bonds between these limits will be considered, for all element pairs.

When pressing Ok, the Minimum, Maximum entries must be both empty or valid, otherwise an error is shown. The Minimum cannot excede the Maximum length, otherwise an error is shown.

gamgi-0.17.5/doc/interfaces/bond/create_property.html000066400000000000000000000034271433127522700226130ustar00rootroot00000000000000 GAMGI Interfaces: Bond Create

Bond Create

Set here the bond properties related with its charge distribution.

Covalency

Covalency is a measure of the percentage ionic/covalent character of a bond. Currently no default value is provided.

Order

Order represents the chemical bond order. Although any positive number is allowed, the usual values are 1.0 (single bond, the default), 2.0 (double bond), 3.0 (triple bond) and 1.5 (aromatic or delocalised bond).

Single, double and triple bonds are rendered in Wired mode, as single, double and triple rasterized lines. In Solid mode, single bonds are represented by a cylinder (the sigma bond), double bonds have two additional curved volumes on each side (the pi bond), and triple bonds have two more curved volumes on each side (the second pi bond).

Currently, the orientation of the curved volumes in solid double bonds is arbitrary and aromatic bonds are visually handled as normal bonds.

gamgi-0.17.5/doc/interfaces/bond/create_type.html000066400000000000000000000125601433127522700217060ustar00rootroot00000000000000 GAMGI Interfaces: Bond Create

Bond Create

Set here the method used to create new bonds.

Atoms

Selecting this method, the Atom entries become active, to enter the name and number of two atoms. If GAMGI identifies the atoms, a bond is created between them, after pressing Ok.

An easy technique to select an atom is to click the mouse over its visual representation: if GAMGI recognises the atom (it must be in the current layer), its identification is transported to the first empty Atom entry. If both entries were occupied before, the mouse action is ignored. If both entries are occupied after, GAMGI tries to create the bond.

The writing and clicking techniques can be combined. For example, the user can write an atom identification in the second Atom entry and then click on the visual representation of the other atom: GAMGI writes its identification in the first Atom entry, previously empty, and attempts to create the bond.

The only information that matters is the information writen in the dialog when the Ok button is pressed. For example, if a user clicks on an atom to get its identification (in the first Atom entry), then writes another atom in the second Atom entry and finally deletes the first atom identification before pressing Ok, an error is shown, as the first atom is not found.

Length

This method is based only on the distance between atoms and the elements of the atoms, thus Element and Length entries become active and Atom entries become inactive. If both Element and Length entries are left empty, GAMGI attempts to create bonds for all atoms, using the following procedures.

For each atom pair, GAMGI checks whether specific minimum and maximum bond length limits have been configured. If the atoms distance is in the configured interval, a new bond is created. To configure bond length limits for specific element pairs, select Bond->Config.

If no bond length interval has been configured for this element pair, GAMGI attempts to calculate automatic minimum and maximum limits, summing the two atom radius and multiplying by lower and upper factors (currently 0.80 and 1.10 by default). If the atoms distance is in the calculated interval, a new bond is created. To configure these lower and upper factors, valid for all element pairs, select Bond->Config.

If no radius is defined for at least one of the elements, then no bond is created. To configure the atom radius, for specific elements, select Atom->Config.

When both Element entries are occupied, GAMGI tries to identify its contents as valid element names, which can be, for example, "Si", " Si", "Si " but not "si", "S i" or "14". When both elements are recognized, minimum and maximum bond length limits for this element pair - calculated according to the rules described above - are automatically writen in the Length entries, otherwise these entries are set empty.

After pressing Ok, if both elements are recognized, GAMGI attempts to create bonds only between atoms of these elements, using the bond length limits writen in the Length entries (if the elements are invalid, an error is shown). If the Length entries are empty, GAMGI uses the default minimum and maximum limits for this element pair, calculated as described above.

If the Element entries are empty when the user presses the Ok button, but the Length entries are not, GAMGI attempts to create bonds between all atoms, independently of its elements, using the bond length limits writen in the Length entries. The values writen in the Length entries must be valid lengths, and the minimum value cannot excede the maximum, otherwise an error is shown.

In all cases, when pressing Ok, the Element entries must be both empty or valid and the Length entries must be both empty or valid, otherwise an error dialog is shown.

Delaunay

In this method, a Voronoi polyhedron is determined for each atom, and bonds are created between atoms whose polyhedrons share a common face, forming a Delaunay connection.

The Delaunay method is based on topological considerations only, so Element, Length and Atom entries are disabled.

Bonds that already exist are never created again: in Length and Delaunay methods, these cases are silently ignored, while in the Direct method an error is shown.

gamgi-0.17.5/doc/interfaces/bond/create_view.html000066400000000000000000000056271433127522700217050ustar00rootroot00000000000000 GAMGI Interfaces: Bond Create

Bond Create

Set here the bond visual representation.

Style

The Style option menu controls the bond visual representation: with cylinders in Solid mode, with simple lines in Wired mode. By default, the Wired mode is used. To change the default select Bond->Config.

The cylinder gives a high visual quality, when coupled with lights and perhaps a perspective projection. A cylinder uses considerable screen space though and is time consuming.

Wired objects do not have a 3D representation, so diffuse and specular lights are not reflected, becoming poorly invisible when using lights, unless the ambient component is important.

Size

In Solid mode, this parameter controls the size of the bond cylinders. Combining bond Size with atom Variancy and Size, it is possible to obtain a wide range of styles to represent atomic structures.

The default is to represent atoms with a Size (0.8) slightly larger than bonds (0.5). To change the default select Bond->Config. An elegant style is to represent bonds with the same Size as atoms (0.5). To guarantee that bond cylinders are closed by atom spheres, bond Size should not be larger than atom Size.

Color

The Color button controls whether the bond is represented with its own, independent color, or inherits the colors of the parent atoms. By default colors are inherited. To change the default select Bond->Config.

R, G, B

Set the bond color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0), when the bond is rendered with its own, independent, color.

Scale

Set the bond size, including its child objects. Bond objects are scaled around the bond line. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

Line widths in GAMGI are not affected by Scale attributes, so bonds represented in Wired mode remain unchanged by Scale (but not its child!).

gamgi-0.17.5/doc/interfaces/bond/link_object.html000066400000000000000000000043571433127522700216720ustar00rootroot00000000000000 GAMGI Interfaces: Bond Link

Bond Link

Link a bond or a list of bonds to other objects.

Bonds can be linked only to objects below.

Gamgi expects users to identify first the bond or list of bonds and then the object to link. When the Bond entry is active and empty, clicking the mouse over a bond, on the current layer (local selection), its identification is transported to the Bond entry. Pressing the List button, the current list of bonds is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

Method

Gamgi suppports only one method to link bonds: Object.

The Object method links a bond or a list of bonds to an object hierarchically below.

When linking a bond, the child object is unlinked from its current parent and linked to the bond. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of bonds, the child object is replicated as many times as necessary to link each bond in the list to a different replica.

gamgi-0.17.5/doc/interfaces/bond/link_shift.html000066400000000000000000000026341433127522700215350ustar00rootroot00000000000000 GAMGI Interfaces: Bond Link

Bond Link

Set here the translation applied to the child object or list of objects.

When linking a bond to another object below, the translation is always applied to the child object (orbital, text).

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of bonds is linked below, each bond will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent bonds and are not superposed.

gamgi-0.17.5/doc/interfaces/bond/modify_property.html000066400000000000000000000045071433127522700226370ustar00rootroot00000000000000 GAMGI Interfaces: Bond Modify

Bond Modify

Change here the order and covalency for a single bond or a list of bonds.

To modify a bond, click over its graphic image, or write its id on the Bond entry. To modify a list of bonds, press the button List (after creating the list of bonds with Bond->Select). Parameters for empty entries or Local choices remain unchanged.

To change a bond name write the new name in the Bond entry, followed by the bond number (GAMGI needs the number to identify the bond). To change the name for a list of bonds, press List first and then write the new common name in the Name entry.

Covalency

Change the bond Covalency, which is a measure of its percentage ionic/covalent character.

Order

Change the bond Order, which represents its chemical order. Although any positive number is allowed, the usual values are 1.0 (single bond, the default), 2.0 (double bond), 3.0 (triple bond) and 1.5 (aromatic or delocalised bond).

Single, double and triple bonds are rendered in Wired mode, as single, double and triple rasterized lines. In Solid mode, single bonds are represented by a cylinder (the sigma bond), double bonds have two additional curved volumes on each side (the pi bond), and triple bonds have two more curved volumes on each side (the second pi bond).

Currently, the orientation of the curved volumes in solid secondary bonds is arbitrary. Currently, aromatic bonds are handled as normal bonds, according to its bond order, so bonds with order equal to 1.5 are handled as double bonds.

gamgi-0.17.5/doc/interfaces/bond/modify_view.html000066400000000000000000000061261433127522700217240ustar00rootroot00000000000000 GAMGI Interfaces: Bond Modify

Bond Modify

Change here the visual representation for a single bond or a list of bonds.

To modify a bond, click over its graphic image, or write its id on the Bond entry. To modify a list of bonds, press the button List (after creating the list of bonds with Bond->Select). Parameters for empty entries or Local choices remain unchanged.

To change a bond name write the new name in the Bond entry, followed by the bond number (GAMGI needs the number to identify the bond). To change the name for a list of bonds, press List first and then write the new common name in the Name entry.

Style

The Style option menu controls the bond visual representation: cylinders in Solid mode, simple lines in Wired mode.

The cylinder gives a high visual quality, when coupled with lights and perhaps a perspective projection. A cylinder uses considerable screen space though and is time consuming.

Wired objects do not have a 3D representation, so diffuse and specular lights are not reflected, becoming poorly invisible when using lights, unless the ambient component is important.

Size

In Solid mode, this parameter controls the size of the bond cylinders. Combining bond Size with atom Variancy and Size, it is possible to obtain a wide range of styles to represent atomic structures.

An elegant style is to represent bonds with the same Size as atoms (0.5). To guarantee that bond cylinders are closed by atom spheres, bond Size should not be larger than atom Size.

Color

The Color button controls whether the bond is represented with its own, independent color, or inherits the colors of the parent atoms. By default colors are inherited.

R, G, B

Change the bond color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0), when the bond is rendered with its own, independent, color.

Scale

Change the bond size, including its child objects. Bond objects are scaled around the bond line. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

Line widths in GAMGI are not affected by Scale attributes, so bonds represented in Wired mode remain unchanged by Scale (but not its child).

gamgi-0.17.5/doc/interfaces/bond/remove_object.html000066400000000000000000000031131433127522700222170ustar00rootroot00000000000000 GAMGI Interfaces: Bond Remove

Bond Remove

  • Object
Indicate how to remove a bond (or list of bonds, previously selected with Bond->Select, when Global is pressed).

Scope

When the Scope is All, the bond and all its contents is removed. This is the default.

When the Scope is Container, the bond is removed but its contents (orbitals, texts) is saved, linked to the first atom parent.

When the Scope is Contents, the bond is preserved but all its contents (orbitals, texts) is removed.

When the Scope is Orbital or Text, these objects are removed from the bond.

When the removed bond was part of the current object, the current layer becomes the new current object.

Clicking the mouse over a bond in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/bond/select_list.html000066400000000000000000000033561433127522700217170ustar00rootroot00000000000000 GAMGI Interfaces: Bond Select

Bond Select

  • List
Bond->Select selects a bond or a list of bonds.

To select an bond click the mouse over its visual representation: if GAMGI recognizes the bond it becomes the new selected object, otherwise the mouse action is ignored.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

Only bonds in the working layer can be selected, even if bonds are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Bond->Select shows a flat list of all bonds currently existent in GAMGI, not necessarily in the same layer or window. For each bond, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/cell/000077500000000000000000000000001433127522700165055ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/cell/config_global.html000066400000000000000000000032611433127522700221620ustar00rootroot00000000000000 GAMGI Interfaces: Cell Config

Cell Config

Set here global cell parameters, applied automatically to all current and future cells to change their visual properties.

Axes

Axes size sets the thicknness of the cell axes, when users choose to set them visible. Accepted values are between 0.01 and 0.10. This parameter is global: all cells in GAMGI have the same Axes size.

Borders

Axes width sets the thicknness of the cell borders lines, when users choose to set them visible (the default). Accepted values are between 1 and 10. This parameter is global: all cells in GAMGI have the same Borders width.

Nodes

Nodes sets the thicknness of the cell nodes, when users choose to set them visible (the default). Accepted values are between 1 and 10. This parameter is global: all cells in GAMGI have the same Nodes width.
gamgi-0.17.5/doc/interfaces/cell/config_origin.html000066400000000000000000000023121433127522700222050ustar00rootroot00000000000000 GAMGI Interfaces: Cell Config

Cell Config

Set here the default behaviour for data related with the cell origin.

Axes

Set if cell axes should be shown by default when creating a new cell. The initial option is No.

By default GAMGI selects conventional axes for Conventional, Parallelepiped, Sphere and Projection volumes, and primitive axes for Primitive and Wigner cell volumes.

gamgi-0.17.5/doc/interfaces/cell/config_view.html000066400000000000000000000026211433127522700216730ustar00rootroot00000000000000 GAMGI Interfaces: Cell Config

Cell Config

Set here the default visual representation for cell objects.

Borders

Set here which borders should be shown by default. The initial option is All.

Faces

Set here if faces should be shown by default. The initial option is No.

Nodes

Set here if nodes should be shown by default. The initial option is Yes.

R, G, B

These entries set the color used by default, between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0), to show borders (in Wired mode) or faces (in Solid mode) in new cells. The default is 1.0, 1.0, 1.0.
gamgi-0.17.5/doc/interfaces/cell/config_volume.html000066400000000000000000000017451433127522700222360ustar00rootroot00000000000000 GAMGI Interfaces: Cell Config

Cell Config

Set here the default volume representation for cell objects.

Model

Set the default volume representation for a new cell. The initial option is Conventional.
gamgi-0.17.5/doc/interfaces/cell/copy_object.html000066400000000000000000000035031433127522700216740ustar00rootroot00000000000000 GAMGI Interfaces: Cell Copy

Cell Copy

Indicate here the number of cell copies to create and its destination.

Gamgi expects users to identify first the cell or list of cells to copy. When the Cell entry is active and empty, clicking the mouse over an cell, on the current layer (local selection), its identification is transported to the Cell entry. Pressing the List button, the current list of cells is selected instead.

Name

This is the name given to the new cell copies. The default is to copy the name of each original cell.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the cell or list of cells to copy, GAMGI expects users to identify a layer to where the cells should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of cells, the copies can also be created at the layer of each original cell, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/cell/copy_shift.html000066400000000000000000000023721433127522700215460ustar00rootroot00000000000000 GAMGI Interfaces: Cell Copy

Cell Copy

Set here the translation vector applied to each new cell.

By default, each copied cell has the same coordinates as the original cell. This is expected when copying a cell or a list of cells to a different layer. However, when each new cell is in the same layer as the original cell (for a list of cells, the Local option in the Layer menu), a small shift helps to separate the new cells from the original ones.

All other properties are the same for copied and original cells (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/cell/create_origin.html000066400000000000000000000061271433127522700222130ustar00rootroot00000000000000 GAMGI Interfaces: Cell Create

Cell Create

Define here the location of the node (0 0 0).

O1, O2, O3

These entries provide the coordinates of the node in the lower-left corner of the cell where the new origin is, calculated with conventional or primitive cell vectors. When the lattice is primitive or vectors are primitive, this corner node becomes the new origin node (0 0 0) and no more coordinates are needed.

The cell position, given by the coordinates x,y,z of the origin node, is not affected by a change in the origin node, so the new origin node must occupy the position kept by the previous origin node, forcing a cell translation. The new cell origin can be outside the current cell volume.

O4

When the lattice is centered and vectors are conventional, a fourth coordinate o4 is needed to point the new origin node (000) to one of the centered nodes. By default, o4 is 000, so no change is introduced. When the cell lattice is primitive P or the vectors defining the origin are primitive, that is the only possible value for o4. For I, C, F, R centered lattices, o4 can also take the values:
I: 111
C: 110
F: 110, 101, 011
R: 211, 122
corresponding to the numerators of the inner node coordinates, (1/2 1/2 1/2) for I lattices, (1/2 1/2 0) for C lattices, (0 1/2 1/2) (1/2 0 1/2) (1/2 1/2 0) for F lattices and (1/3 2/3 2/3) (2/3 1/3 1/3) for R lattices.

Vectors

Indicate the type of cell vectors, Conventional or Primitive, used to determine the node with o1, o2, o3 coordinates, as described above. When o4 is not 000, a centered cell is involved and Vectors must be Conventional.

Axes

Controls whether cell axes are visible. Axes are positioned at node (0 0 0), and can be represented either by conventional or by primitive vectors. The three axes use the rgb color scheme: red for the first axis, green for the second and blue for the third.

Vectors

Indicate the type of cell vectors to show, Conventional or Primitive. These are totally independent of the vectors used to indicate the node (0 0 0).
gamgi-0.17.5/doc/interfaces/cell/create_position.html000066400000000000000000000056341433127522700225720ustar00rootroot00000000000000 GAMGI Interfaces: Cell Create

Cell Create

Define here the cell position.

Translation

The origin of a cell object, defined by its (0 0 0) node, can be set using the x, y, z entries.

By default, in Conventional, Primitive and Parallelepiped volumes, this node is at a corner of the cell volume, in a Sphere volume it is at the center, and in a Wigner volume it is at the center of the first Wigner-Seitz cell.

A simpler way to set directly the cell position is to click on the screen, at the wished position, after defining all the other cell properties: a new cell object is created at that position.

To define exactly the cell translation, relatively to other cell or relatively to the current layer, press Align.

Rotation

The orientation of a cell object, defined by the Euler angles theta, phi, psi, can be set using the E1, E2, E3 entries.

Euler angles in GAMGI are defined as follows: first, the (x, y, z) referential is rotated theta degrees (between 0 and 180) around the y axis, then the referential is rotated phi degrees (between 0 and 360) around the initial z axis, and finally it is rotated psi degrees (between 0 and 360) around the new z axis, always in the direct, counter-clockwise, direction. If the first Euler angle (theta) is zero, the old and new z axis coincide, thus (0, 0, 10) and (0, 5, 5) represent the same rotation.

By default, the first conventional vector is aligned with the x axis (even if conventional vectors are not actually represented), the second vector is in the xy plane and the third vector has a positive z coordinate (pointing to the user), corresponding to Euler angles (0, 0, 0).

The cell orientation is independent of the volume representation. This way, conventional, primitive and Wigner-Seitz cells can be easily compared, as they have the same orientation.

To define exactly the cell rotation, relatively to other cell or relatively to the current layer, press Align.

gamgi-0.17.5/doc/interfaces/cell/create_symmetry.html000066400000000000000000000126571433127522700226220ustar00rootroot00000000000000 GAMGI Interfaces: Cell Create

Cell Create

Define here the symmetry and lattice parameters of the cell.

Symmetry

System, Lattice and Group are optional parameters, but together they must provide enough information to identify the Bravais lattice of the cell. Redundant information is fine, but conflicting information is flagged as an error.

When the entries System, Lattice or Group are changed, the other two are updated automatically. Predictable information is automatically written and conflicting information is automatically removed.

System

System identifies the crystallographic system of the cell. The allowed values are: c (cubic), t (tetragonal), o (orthorhombic), h (hexagonal), m (monoclinic) and a (anorthic / triclinic). Hexagonal, trigonal and rhombohedric cases are grouped in GAMGI in a single hexagonal system, corresponding to the family designation used in the International Tables for Crystallography.

Pressing List, a second dialog shows all the systems that are compatible with the information currently inserted in the System, Lattice and Group entries.

Lattice

Lattice identifies the lattice centering of the cell. The allowed values are: P (primitive), I (body-centered), C (face-centered), F (face-centered) and R (rhombohedral). A, B and C centering is always described in GAMGI by C-based lattices. Thus monoclinic centered cells are always C, with unique axis b and cell choice 1. To use data reported with a different cell choice or unique axis please use the transformation matrices published in International Tables for Crystallography.

The R lattices describe the seven space groups belonging to the hexagonal system that are described as R groups, when using the standard Hermann-Mauguin symbols: R3 (146), R-3 (148), R32 (155), R3m (160), R3c (161), R-3m (166), R-3c (167).

Pressing List, a second dialog shows all the lattices that are compatible with the information currently inserted in the System, Lattice and Group entries.

Group

Group identifies the space group of the cell, using the numerical notation: 1 to 230.

The four orthorhombic space groups 38-41, which are described with A lattices when using the standard Hermann-Mauguin symbols, were converted to C lattices (so all base-centered lattices are described as C lattices) by using a different axes setting, which results from the axes permutation abc->bca, as described in the International Tables for Crystallography. These four groups, Amm2, Aem2, Ama2 and Aea2, are thus described in GAMGI as Cm2m, Cm2e, Cc2m and Cc2e, respectively.

For space groups 48, 50, 59, 68, 70 (orthorhombic), 85, 86, 88, 125, 126, 129, 130, 133, 134, 137, 138, 141, 142 (tetragonal), 201, 203, 222, 224, 227, 228 (cubic), there are two standard origins, denoted O1 or O2. In GAMGI the chosen origin is O2, at the inversion centre.

Unique axis b was used for all monoclinic space groups. For space groups 5, 7, 8, 9, 12, 13, 14, 15 (monoclinic), positions were constructed using Cell Choice 1.

Pressing List, a second dialog shows all the groups that are compatible with the information currently inserted in the System, Lattice and Group entries.

a, b, c, ab, ac, bc

Entries a, b, c, ab, ac, bc permit to set the lengths and angles defining the conventional cell vectors (redundant entries are automatically disabled). Cell lengths must be positive, while cell angles must be larger than zero and smaller than 180 degrees.

For the cubic system, only one length is required (a or b or c). For the tetragonal system, two lengths are required (a or b and c). For the orthorhombic system, three lengths are required (a and b and c).

For the hexagonal system, two lengths are required (a or b and c). For the monoclinic system, three lengths are required (a and b and c), plus the angle around the axis b (ac).

For the triclinic system, all six parameters are required. Each angle must be smaller than the sum of the other two and must be larger than the absolute difference of the other two, otherwise an error is produced. Redundant information is fine, but conflicting information is always flagged as an error.

gamgi-0.17.5/doc/interfaces/cell/create_view.html000066400000000000000000000066221433127522700216760ustar00rootroot00000000000000 GAMGI Interfaces: Cell Create

Cell Create

Define here the cell visual aspect.

Faces

When the button Faces is down, the cell is represented as a solid object, that users can see from the outside or from the inside. This option is disabled in Projection, Rhombus and Sphere volumes (otherwise the filtering volume would hide the lattice inside).

When the button Faces is up, the cell is represented as a wired object, formed by lines connecting the vertices (or by circumpherences, in the Sphere representation).

Nodes

When the button Nodes is up, the nodes are visible, otherwise they are hidden. This option is disabled for Projection volumes.

Borders

Selecting None, no borders are shown in any volume representation. Selecting Edges, the outer line contours are shown but cell boundaries are hidden (as long as they are in the same plane, independently of the lattice parameters). Selecting Faces, all lines are shown, except those inside the volume representation (for Parallelepiped and Sphere volumes, Edges and Faces options behave in the same way).

Selecting All shows all the border lines, including those inside. This option is disabled when the button Faces is down, because in solid mode, internal borders cannot be seen from the outside and make it very difficult to analyze something from the inside. Options Faces and All are disabled in Parallelepiped and Sphere volumes, as there are no additional lines to represent in these representations, only the outer lines already shown with the option Edges. All options except Edges are disabled for Projection volumes.

At least one visual element, Nodes, Faces or Borders, must be visible when the cell is created, otherwise an error is flagged.

R, G, B

The R, G, B entries define the cell color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0). It is used to draw the lines and nodes, in wired mode, and the solid faces, in solid mode. In the last case, lines and nodes are drawn using the current layer background color, to get a good contrast and eliminate the need to define yet another color.

Scale

Set the cell size, including its child objects. Cell objects are scaled around the cell center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
gamgi-0.17.5/doc/interfaces/cell/create_volume.html000066400000000000000000000062011433127522700222240ustar00rootroot00000000000000 GAMGI Interfaces: Cell Create

Cell Create

Define here the type representation of the cell.

Type

Lattices can be represented using Conventional, Primitive or Wigner-Seitz cells, plus filtering volumes such as a Parallelepiped or a Sphere. Lattices can also be represented by the stereographic Projection of its crystallographic planes and directions (added by users, after the projection is created).

Cells with a Hexagonal system and a rhombohedral R lattice (corresponding to the seven R space groups when using the standard Hermann-Mauguin symbols), are always represented using the hexagonal axes and the obverse setting, when the chosen type is Conventional, and the rombohedral axes, when the chosen type is Primitive. Cells with a Hexagonal system and a primitive P lattice (corresponding to all the other space groups from 143 to 194 that are not R) are always represented using full hexagonal prismas, when the chosen type is Conventional, and one-third of the hexagonal prismas, when the chosen type is Primitive.

N1, N2, N3

Set the number of cells to replicate, in the three directions of space, when the chosen type is Conventional, Primitive or Wigner-Seitz. When not needed, these parameters are disabled.

V1, V2, V3, V23, V13, V23

A Parallelepiped filtering volume is defined by three edge lengths, V1, V2, V3, plus the three angles between them, V23, V13, V12. Each angle must be smaller than the sum of the other two and must be larger than the absolute difference of the other two, otherwise an error is produced.

A Sphere filtering volume is defined by the radius v1. When not needed, these parameters are disabled.

All nodes inside the volume representation are allocated (even if the user choosed to hide them). In Parallelepiped and Sphere volumes, a small tolerance (by default 1.0E-4) is added around the volume space to make sure that nodes in the borders are included. For example, a sphere with v1 = 1.0, filtering a cubic primitive lattice with a = 1.0, allocates 1 + 2 + 2 + 2 = 7 nodes (without the tolerance, the result could be undefined).

gamgi-0.17.5/doc/interfaces/cell/geometry.html000066400000000000000000000033301433127522700212250ustar00rootroot00000000000000 GAMGI Interfaces: Cell Measure Geometry
Cell Measure Geometry
 
This report describes, for the selected structure, all the possible sequences for bond lengths, angles and torsions, presenting the results in increasing order of the atom elements. Geometric relations between non bonded atoms are ignored.

For each sequence it is reported the number of occurrences, the minimum and maximum values, the average value and the standard deviation (unless no valid occurrences were found).

Bond Length

The distance between Atom1 and Atom2.

Bond Angle

The valence angle between directions Atom2-Atom1 and Atom2-Atom3. The results are always presented with positive values.

When present, undefined bond angles (when at least two atoms are coincident) are reported for each angle sequence.

Bond Torsion

The torsion angle between two planes, defined by Atom1-Atom2-Atom3 and Atom2-Atom3-Atom4. The results are always presented with positive values.

When present, undefined bond torsions (when at least two atoms are coincident or three atoms are colinear) are reported for each torsion sequence.

gamgi-0.17.5/doc/interfaces/cell/groups.html000066400000000000000000000023221433127522700207110ustar00rootroot00000000000000 GAMGI Interfaces: Cell Groups
Groups
 
This dialog lists all the space groups that are compatible with the current settings in the entries System, Lattice and Group. When the settings are impossible, no groups are shown. When the entries are empty, all 230 groups are shown.

For each possible group, GAMGI lists its number, the International and Schoenflies notations and the system. The lattice is given by the first letter of the International notation.

Clicking on a listed option in the groups dialog, has exactly the same effect as writing it directly on the Group entry.

gamgi-0.17.5/doc/interfaces/cell/lattices.html000066400000000000000000000023151433127522700212040ustar00rootroot00000000000000 GAMGI Interfaces: Cell Lattice
Cell Lattice
 
This dialog lists all the lattices that are compatible with the current settings in the entries System, Lattice and Group. When the settings are impossible, no lattices are shown. When the entries are empty, all 5 lattices are shown.

For each possible lattice, GAMGI lists its usual upper-case symbol, the description, the systems where it occurs and the number of groups with this centering.

Clicking on a listed option in the lattice dialog, has exactly the same effect as writing it directly on the Lattice entry.

gamgi-0.17.5/doc/interfaces/cell/link_change.html000066400000000000000000000016301433127522700216350ustar00rootroot00000000000000 GAMGI Interfaces: Cell Link

Cell Link

gamgi-0.17.5/doc/interfaces/cell/link_object.html000066400000000000000000000106271433127522700216640ustar00rootroot00000000000000 GAMGI Interfaces: Cell Link

Cell Link

Link a cell or a list of cells to other objects, for example to build crystals and glasses.

Hierarchy

Atoms can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by cells. Pressing the button Above, the same menu shows the classes of objects that can own cells.

Gamgi expects users to identify first the cell or list of cells and then the object to link. When the Atom entry is active and empty, clicking the mouse over a cell, on the current layer (local selection), its identification is transported to the Atom entry. Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

When the chosen Hierarchy is Above, methods designed to add multiple objects to cells are disabled: Crystal and Random.

Method

Gamgi suppports three methods to link cells: Object, Crystal and Random. The last two are designed to add multiple objects to cells, so they are disabled when Hierarchy is set to Above.

The Object method links a cell or a list of cells to a single object, Above or Below.

When the Hierarchy is Above, the cell is unlinked from its current parent and linked to the new object. When the cell is moved to a different layer, its bonds are automatically removed. When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the cell. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of cells Above, all cells in the list are unlinked and linked to the parent object. When linking a list of cells Below, the child object is replicated as many times as necessary to link each cell in the list to a different replica.

The Crystallographic method is used to link the selected Object to the various cell nodes, in order to build crystals, liquids and other nanostructures. The linked objects can be handled independently of the cell: they can be rotated, scaled, moved, removed, copied, as if the cell did not exist, for example to create defect crystals. Users can specificy patterns of occupation for the cell nodes, for example to create mixtures of different liquids, or to build multi-layer arbitrary nanostructures.

The Random method is an implementation of the Jodrey algorithm to build a Random Close Packing (RCP) structure: the cell volume is randomly packed with atoms copied from the template atom selected as Object. The RCP structure has the highest volume density among amorphous structures (0.62 - 0.64), which compares with the highest volume density among crystalline structures (0.74). The RCP structure is particularly suitable to describe metallic glasses, due to the nondirectional nature of metallic bonding combined with the absence of local charge-neutrality requirements.

gamgi-0.17.5/doc/interfaces/cell/link_occupancy.html000066400000000000000000000224301433127522700223750ustar00rootroot00000000000000 GAMGI Interfaces: Cell Link

Cell Link

Define here which nodes will be considered in the link operation.

Cutoff

GAMGI supports two methods to define the boundary between inside (linked) and outside (unlinked) cell regions: Object and Node.

With the Object method, the link is considered as long as the object is inside the cell volume (even if the node is outside). This is the usual method to build crystals.

With the Node method, the link is considered as long as the node is inside the cell volume (even if the object is outside). This method is useful for example to build liquids and nanostructures.

For all cell representations, a small tolerance (by default 1.0E-4) is added around the cell volume, to make sure that objects or nodes exactly in the borders are included.

Nodes

When the cell volume is Primitive, Wigner, Rhombus or Sphere, the occupation rules are applied along the primitive vectors.

When the volume is Conventional, users can choose to apply the occupation rules to P nodes (the vertices of the cells) or, when they exist, to I nodes (in the center of the cells), to A, B, C nodes (in the center of the faces normal to vectors a, b, c, respectively), or to R nodes (the nodes inside rombohedral cells, with an obverse orientation), by pressing the buttons labeled P, I, A, B, C, R.

When Cell->Link starts, all nodes are available, though not selected. When a Cell is selected, the available nodes are selected by default and nonexistent nodes are automatically disabled.

Rules

GAMGI uses a small language based in patterns of occupation to define which nodes should be linked (occupied). These pattern rules are formed by combining the characters * (meaning ocuppied nodes) and _ (meaning empty nodes), plus the digits 0-9 (meaning node positions). These rules are applied separately to each of the selected node subsets. By default all nodes are accupied, so the initial pattern is (*, *, *).

The most common examples of occupation rules are simple to understand: (*, *, *) means apply to all nodes, (1, 2, 3) means apply to node (1, 2, 3) only, (*_, *_, *_) means apply to alternated nodes only, with the starting node (0, 0, 0) occupied, (*, 2, *) means apply only to the nodes where the second coordinate is 2, (*5, *, *) means apply to all nodes where the first coordinate is 5 or smaller, (*, *, _3*) means apply to all nodes where the third coordinate is 4 or larger.

When digits are not included, the sequences of * and _ characters are handled as patterns of occupation that are repeated until all nodes are scanned. Therefore, the pattern (*_, *, *) is equivalent to (*_*_, *, *) but different from (*_*, *, *).

Nodes are scanned and marked three times, first along the a direction, with the first pattern, then along the b direction, with the second pattern and finally along the c direction, with the third pattern.

When the first pattern is applied, the nodes in the first plane (along direction a) are marked with the pattern first character, but when the second and third patterns are applied, the nodes in the first planes (along directions b, c) are preserved (to keep the information introduced with the previous patterns) and the patterns are scanned not from the first character but from the character that is equal to the character of the nodes in the first planes. Therefore, the pattern (*_, *_, *_) is equivalent to (*_, _*, _*) (node (0, 0, 0) is occupied) but different from (_*, *_, *_) (node (0, 0, 0) is empty).

When digits are included, they are handled as node coordinates and fix limits to the range of application of the various patterns. They can appear in the beginning, meaning that nodes with a smaller coordinate are empty, in the middle, meaning that the previous pattern should be repeated only until that node inclusive, or in the end, meaning that all nodes with a larger coordinate are empty.

For example: (*, *_5**_10, *) means repeat sequence one occupied-one empty along the second direction until the second coordinate becomes 5 inclusive, then repeat sequence two occupied-one empty until the second coordinate becomes 10 inclusive, all the remaing nodes are empty; (*, *, _5*_10*) means all nodes are empty along the third direction until the third coordinate is 5 inclusive, then apply the sequence one occupied- one empty until the third coordinate becomes 10 inclusive, all the remaining nodes are occupied.

When only digits appear, nodes with that coordinate are occupied, all the others, before and after, are empty. We note that (*, *, 8) is equivalent to (*, *, 8_) (nodes are empty except when the third coordinate is 8) but (8, *, *) (nodes are empty except when the first coordinate is 8) is different from (_8, *, *) (all nodes are empty).

When marking the nodes, the sequence * (or ** or ***, etc.), meaning these nodes seem to be occupied, can be overrun by patterns applied in the other directions, which in turn can be overrun by the sequence _ (or __ or ___, etc.), meaning these nodes must be empty, or by starting/ending digits, meaning nodes before/after must be empty, this way establishing a hierarchy for the priority of the various patterns.

For example, the sequence (*, *_, *10_) means, first, all nodes seem to be occupied in the first direction, second, alternated nodes in the second direction are empty, (overriding the first sequence), third, nodes until 10 stay as they are (because * has lower priority than the pattern applied in the second direction) and nodes after 10 are definitely empty (overriding the second sequence).

The rules explained so far are valid for nodes with positive coordinates along Cell directions a, b, c. To obtain the occupancy patterns for nodes with negative coordinates, just reflect around zero (by a mirror operation) the results obtained for positive nodes. Therefore the rule (1, 1, 1) actually links the eight nodes (-1,-1,-1), (-1,-1,+1), (-1,+1,-1), (-1,+1,+1), (+1,-1,-1), (+1,-1,+1), (+1,+1,-1) and (+1,+1,+1).

When the cell volume is a Sphere, by default the origin is at the center, so nodes are marked in one octant and symmetrically replicated to the other octants. For example, for a cubic lattice inside a sphere of radius 5, to occupy only a central cube around the center, a pattern as (*2_, *2_, *2_) can be used, and to occupy all the other nodes (leaving the cube in the center completely empty), the pattern (___***, ___***, ___***) will work. In this second case, a pattern as (_2*, _2*, _2*) will not work, because the low priority * sequence is overrun by the high priority _ sequence, when applied in the other directions.

When the selected Cutoff mode is Objects, nodes outside the cell volume can contribute to the contents of the cell volume. This happens for all centered lattices with Conventional volumes, plus Rhombus and Sphere cell volumes. Therefore, the occupancy patterns must be applied to the larger cell volumes that contain all the contributing nodes (not just those that are visible inside the cell). Some of these additional nodes have negative coordinates, so they are replicated from the corresponding positive nodes. This occurs for Conventional centered cells, for I, A, B, C nodes, plus Rhombus volumes.

Changing the Cell origin, to take profit of the replication rule, extends enormously the power of occupancy patterns. For example, a cubic primitive lattice with 8 x 6 x 4 conventional cells has positive nodes only. Moving the Cell origin to the volume center, to node (4, 3, 2), seven out of the eight octants have now nodes with negative coordinates. Applying successively the rules (____*), (___****) and (__***), the cell volume remains empty everywhere except at the six lateral faces, where all nodes are occupied.

These techniques can be used to build arbitrarily complex, multi-layered, nanostructures.

gamgi-0.17.5/doc/interfaces/cell/link_packing.html000066400000000000000000000051141433127522700220250ustar00rootroot00000000000000 GAMGI Interfaces: Cell Link

Cell Link

Set here the parameters to build a Random Close Packing (RCP) structure.

Radius, Number

To build a RCP structure, a fixed number of atoms is randomly allocated in the Cell volume and then the closest atoms are sucessively moved apart until the minimum atom-atom distance converges to a suitable value, the final hard-sphere diameter, used to determine the volume density and the radius for all atoms (Jodrey algorithm).

By default, GAMGI calculates the number of atoms to allocate such that the final atoms and the template atom will have approximately the same radius. The radius are not exactly the same because the number of atoms must be an integer and the final radius depends of the random sequence and of the relaxation time, but the approximation is close, particularly for larger cell volumes (with more atoms).

Clicking on Number, users can set in the enabled entry the number of atoms to create. These atoms and the template atom will have different radius.

When the Cell volume (in Radius mode) or the number of atoms (in Number mode) is too small, an error is shown.

Relaxation

The relaxation time controls the dynamics of the convergence process. Typically, increasing 10 times the relaxation time, increases 10 times the processing time and increases slightly the density, in the range 0.62-0.64 (the atoms have more time to find better positions).

Seed

Initially atoms are randomly allocated using a sequence of (pseudo) random numbers, generated from a Seed initiator. Using different seeds, different random sequences and final results will be produced. Using the same seed, the same results will be obtained.
gamgi-0.17.5/doc/interfaces/cell/link_position.html000066400000000000000000000057441433127522700222660ustar00rootroot00000000000000 GAMGI Interfaces: Cell Link

Cell Link

Define here the position of the linked objects.

Vectors

Object coordinates can be given in terms of the vectors defining: 1) the Conventional cell; 2) the Primitive cell, 3) the absolute Local referential of the current Layer. Users can enter coordinates using any of the three referentials, independently of the actual Cell volume.

In order to apply space group information, coordinates are first converted internally to conventional vectors. After generating all the Wyckoff positions, these coordinates are converted to primitive vectors. These are applied when the cell volume is Primitive, Wigner, Rhombus or Sphere.

Wyckoff

When the crystallographic space group is known, GAMGI lists all its Wyckoff sites, showing for each one: 1) the number of replicas that will be generated for each node (i.e. the order of the point group of symmetry of that site); 2) the label of the Wyckoff site, starting from "a" to "z", as in the International Tables for Crystallography (and then "A", for space group 47); 3) the oriented point symmetry of the site, as in the International Tables for Crystallography.

When space group information is unknown, the linked object is handled just as part of a base or motif, so only one position is generated for each node (the space group and site point symmetry are assumed to be 1) and the menu has just one menu item: "1 Basis 1".

x, y, z

For the general Wyckoff site, with point symmetry 1, all x,y,z coordinates are needed and the corresponding entries are all active. For sites with higher symmetry, unnecessary coordinates are automatically disabled.

Before generating the required Wyckoff positions, GAMGI always tries to find equivalent positions. When redundant positions are found, they are discarded, and GAMGI tries to find a Wyckoff site with higher symmetry that generates exactly the same set of non-redundant positions. A warning dialog is then produced with the obtained information, and the link operation proceds using just the non-redundant positions.

gamgi-0.17.5/doc/interfaces/cell/link_shift.html000066400000000000000000000035651433127522700215360ustar00rootroot00000000000000 GAMGI Interfaces: Cell Link

Cell Link

Set here the translation applied to the child object or list of objects.

When linking a cell to another object, the translation is always applied to the child object: the cell itself when linking above, the other object (cluster, molecule, group, plane, direction, atom, orbital, text) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of cells is linked above, Reference is set by default to Child, so cells preserve their positions and are not superposed.

When a list of cells is linked below, each cell will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent cells and are not superposed.

gamgi-0.17.5/doc/interfaces/cell/measure_reciprocal.html000066400000000000000000000112111433127522700232330ustar00rootroot00000000000000 GAMGI Interfaces: Cell Measure

Cell Measure

Select here the parameters to build the reciprocal lattice of the Cell lattice.

The reciprocal lattice for the selected cell is calculated and attributed to a new cell object, in a new layer. The primitive vectors for the old and new lattices, a1,a2,a3 and b1,b2,b3 respectively, are related by the equations:


b1 = K (a2 x a3) / (a1 . a2 x a3)
b2 = K (a3 x a1) / (a1 . a2 x a3)
b3 = K (a1 x a2) / (a1 . a2 x a3)

The new layer has the default layer properties (except no visibility to outside) and the new cell has the initial cell properties (except those related with the reciprocal lattice transformation). Space group information is discarded for the new cell.

For all Bravais lattices, the reciprocal lattice transformation follows these rules: 1) the crystalographic system remains the same; 2) P, C, R lattices are transformed into P, C, R lattices, while I, F lattices are transformed into F, I lattices, respectively; 3) the reciprocal lattice of the reciprocal lattice is the initial lattice.

When Cubic, Tetragonal, Orthorhombic or Hexagonal R lattices are transformed, the orientation of the conventional cell vectors is preserved.

The reciprocal lattice of a Tetragonal I lattice is a Tetragonal F lattice, which is usually not represented, because it is equivalent to a Tetragonal I lattice, rotated 45 degrees and scaled by (1/sqrt(2), 1/sqrt(2), 0). GAMGI represents the reciprocal lattice of a Tetragonal I lattice as a new Tetragonal I lattice, rotated and scaled by those values, so orientation and lengths are fully preserved. In particular, the reciprocal of the reciprocal of a Tetragonal I lattice is represented as the initial cell rotated by 90 degrees around the origin, which still represents the same lattice, due to the rotation symmetry of the Tetragonal system.

Hexagonal P lattices are rotated 30 degrees, so the reciprocal of the reciprocal of a Hexagonal P lattice is represented as the initial lattice rotated by 60 degrees around the origin, which still represents the same lattice, due to the rotation symmetry of the Hexagonal system.

For Monoclinic P, C lattices, the first conventional vector (aligned along the x axis) becomes a vector on the plane xz, the second vector (aligned along the y axis) continues aligned along the y axis, and the third vector (a vector on the xz plane) becomes aligned along the z axis. For the reciprocal of the reciprocal lattice, the conventional vectors become exactly the same as for the initial lattice.

For Triclinic P lattices, the first conventional vector (aligned along the x axis) becomes a generic vector pointing down, the second vector (aligned on the xy plane) becomes aligned on the yz plane, and the third vector (a generic vector pointing up) becomes aligned along the z axis. For the reciprocal of the reciprocal lattice, the conventional vectors become exactly the same as for the initial lattice.

Lattice

Select here if the reciprocal lattice of the primitive lattice related with the Cell lattice should also be constucted.

Planes

Select here if Plane objects (described by cross patterns, as in stereographic projections) should be added to the reciprocal lattice nodes.

Constant

The reciprocal lattice constant K is often set to 1.0 in crystallography, while in solid state physics the value commonly used is 2 PI, the default used here (it is easier to change it to 1 than the other way).

Bravais

Users can also choose the so-called Bravais polar lattice, where the constant K is made equal to V**2/3, where V is the primitive cell volume, so direct and reciprocal lattices have exactly the same volume per node.
gamgi-0.17.5/doc/interfaces/cell/measure_tolerance.html000066400000000000000000000026231433127522700230730ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Measure

Cluster Measure

Select here the numerical tolerances used in the Voronoi tesselation. Changing significantly the default values may produce bad results.

Tolerance

When building the polyhedrons, if a plane cuts a vertex more than the Apex tolerance, this vertex is removed.

Faces that have an area smaller than the Area tolerance are ignored and its topological surroundings are merged.

Vertices that are closer than the Vertex tolerance are considered the same and its topological surroundings are merged.

gamgi-0.17.5/doc/interfaces/cell/measure_type.html000066400000000000000000000045311433127522700221000ustar00rootroot00000000000000 GAMGI Interfaces: Cell Measure

Cell Measure

Chose the method of analysis: Geometry, Reciprocal or Voronoi.

Geometry

This method measures all the bond lengths, angles and torsions in the structure, reporting for each quantity, the number of occurrences, the minimum and maximum values, the average value and the standard deviation. Geometric relations between non bonded atoms are ignored.

Undefined bond angles (when at least two atoms are coincident) are reported for each angle sequence. Undefined bond torsions (when at least two atoms are coincident or three atoms are colinear) are reported for each torsion sequence.

Reciprocal

This method builds in a new Layer the reciprocal lattice of the Cell lattice. Optionally, Plane objects (described by cross patterns, as in stereographic projections) can be added to the reciprocal lattice nodes. Optionally, the reciprocal lattice of the primitive lattice related with the Cell lattice can also be constucted.

Voronoi

This method determines the Voronoi tesselation of the structure, shows the resulting polyhedra in a new layer, and reports a large list of its most important geometrical and topological properties.

This analysis can be made with planar bondaries (to close the outside polyhedra) or with full periodic boundary conditions, with equal weights for all atoms (the usual Voronoi tesselation) or with a different weight for each atom (given by its atomic radius, the so-called radical tesselation).

gamgi-0.17.5/doc/interfaces/cell/measure_view.html000066400000000000000000000043621433127522700220730ustar00rootroot00000000000000 GAMGI Interfaces: Cell Measure

Cell Measure

Select here how the calculated Voronoi polyhedra are shown.

Borders

Selecting Faces, only the borders defining the external faces are shown, thus producing a relatively uncluttered volume representation.

Selecting All shows all the borders, including those inside the volume. This option is disabled when the button Faces is down, because in solid mode, internal borders cannot be seen from the outside and make it very difficult to analyze something from the inside.

Faces

When the button Faces is down, the tesselation is represented as a solid volume, that users can see from the outside or from the inside.

When the button Faces is up, the tesselation is represented as a wired volume.

Nodes

When the button Seeds is up, the atom seeds are visible, otherwise they are hidden.

Color

The Color button controls whether the tesselation is represented with its own, independent color, or inherits the colors of the atom seeds, for each polyhedron. When the button Faces is up, an independent color is necessary, because polyhedrons are then represented only by wired shared edges, which cannot inherit the color from both faces.

R, G, B

The R, G, B entries define the tesselation color: (0.0, 0.0, 0.0) is black and (1.0, 1.0, 1.0) is white.
gamgi-0.17.5/doc/interfaces/cell/measure_voronoi.html000066400000000000000000000072111433127522700226100ustar00rootroot00000000000000 GAMGI Interfaces: Cell Measure

Cell Measure

Select here the main parameters controlling the Voronoi tesselation.

Boundaries

GAMGI supports two methods to handle the tesselation in the boundaries, Planar and Periodic.

The Planar method defines six outer planes, forming a closed space that includes all the seeds. Conceptually, this is equivalent to create six virtual seeds around each real seed, positioned in such a way that they define six planes at half-distance, common for all seeds, forming a closed background.

The Periodic method applies periodic boundary conditions, using the extended image convention, which means to create 26 virtual systems around the central system (as 26 boxes around the central one, in a 3x3x3 arrangement). The minimum image convention, often used in Molecular Mechanics simulations, is not suitable in Voronoi tesselation, because it considers only the nearest neighbours, while Voronoi tesselation requires all the 26 nearest neighbours.

The Offset parameter defines the border width between: 1) the seeds and the outer planes, in the Planar method; 2) the central system and the other 26 around, in the Periodic method.

Offset cannot be 0 in the Planar method, because virtual seeds would coincide with real seeds, producing an error. Offset can be 0 in the Periodic method, if real and virtual seeds do not coincide, otherwise an error is flagged. An error is also produced when two real seeds coincide (current tolerance: 1.0E-4).

Weights

By default, GAMGI calculates the normal Voronoi partition, so all atoms are given the same weight, corresponding to Variancy equal to zero. However GAMGI can partition the space giving different weights to different atoms (Radical Tesselation), according to their radius. In general, if d is the distance between seed 0 and neighbour 1, the plane between them passes at a distance d * fraction from the seed, where fraction is given by:

r0 = radius0 * variancy
r1 = radius1 * variancy
fraction = 1/2 [1 + (r0**2 - r1**2)/d**2]
When Variancy is 0, fraction is 1/2 (normal Voronoi), whereas when Variancy is 1, unscaled atomic radius are used to determine fraction. Variancy can vary continuously from 0 to a given limit, GAMGI_PHYS_VORONOI_VARIANCY, currently 10.0.

When Variancy is 0, the tesselation can always be obtained (as long as there are no atoms with essentially the same coordinates). When Variancy increases, the tesselation becomes progressively more restrictive. The atoms must be far enough from each other, particularly when the radius are quite different, otherwise the tesselation cannot be determined and and error is shown.

gamgi-0.17.5/doc/interfaces/cell/modify_origin.html000066400000000000000000000073001433127522700222310ustar00rootroot00000000000000 GAMGI Interfaces: Cell Modify

Cell Modify

Change here axes and node (0 0 0) for a single cell or a list of cells.

To modify an cell, click over its graphic image, or write its identification (name and number) on the Cell entry. To modify a list of cells, press the button List (after creating the list of cells with Cell->Select). Parameters for empty entries or Local choices remain unchanged.

To change an cell name write the new name in the Cell entry, followed by the cell number (GAMGI needs the number to identify the cell). To change the name for a list of cells, press List first and then write the new common name in the Name entry.

O1, O2, O3

These entries provide the coordinates of the node in the lower-left corner of the cell where the new origin is, calculated with conventional or primitive cell vectors. When the lattice is primitive or vectors are primitive, this corner node becomes the new origin node (0 0 0) and no more coordinates are needed.

The cell position, given by the coordinates x,y,z of the origin node, is not affected by a change in the origin node, so the new origin node must occupy the position kept by the previous origin node, forcing a cell translation. The new cell origin can be outside the current cell volume.

O4

When the lattice is centered and vectors are conventional, a fourth coordinate o4 is needed to point the new origin node (000) to one of the centered nodes. By default, o4 is 000, so no change is introduced. When the cell lattice is primitive P or the vectors defining the origin are primitive, that is the only possible value for o4. For I, C, F, R centered lattices, o4 can also take the values:
I: 111
C: 110
F: 110, 101, 011
R: 211, 122
corresponding to the numerators of the inner node coordinates, (1/2 1/2 1/2) for I lattices, (1/2 1/2 0) for C lattices, (0 1/2 1/2) (1/2 0 1/2) (1/2 1/2 0) for F lattices and (1/3 2/3 2/3) (2/3 1/3 1/3) for R lattices.

Vectors

Indicate the type of cell vectors, Conventional or Primitive, used to determine the node with o1, o2, o3 coordinates, as described above. When o4 is not 000, a centered cell is involved and Vectors must be Conventional.

Axes

Controls whether cell axes are visible. Axes are positioned at node (0 0 0), and can be represented either by conventional or by primitive vectors. The three axes use the rgb color scheme: red for the first axis, green for the second and blue for the third.

Vectors

Indicate the type of cell vectors to show, Conventional or Primitive. These are totally independent of the vectors used to indicate the node (0 0 0).
gamgi-0.17.5/doc/interfaces/cell/modify_position.html000066400000000000000000000065301433127522700226120ustar00rootroot00000000000000 GAMGI Interfaces: Cell Modify

Cell Modify

Change here position and orientation for a single cell or a list of cells.

To modify an cell, click over its graphic image, or write its identification (name and number) on the Cell entry. To modify a list of cells, press the button List (after creating the list of cells with Cell->Select). Parameters for empty entries or Local choices remain unchanged.

To change an cell name write the new name in the Cell entry, followed by the cell number (GAMGI needs the number to identify the cell). To change the name for a list of cells, press List first and then write the new common name in the Name entry.

Translation

The origin of a cell object, defined by its (0 0 0) node, can be changed using the X, Y, Z entries.

By default, in Conventional, Primitive and Parallelepiped volumes, this node is at a corner of the cell volume, in a Sphere volume it is at the center, and in a Wigner volume it is at the center of the first Wigner-Seitz cell.

To define exactly the cell translation, relatively to other cell or relatively to the current layer, press Align.

Rotation

The orientation of a cell object, defined by the Euler angles theta, phi, psi, can be changed using the E1, E2, E3 entries.

Euler angles in GAMGI are defined as follows: first, the (x, y, z) referential is rotated theta degrees (between 0 and 180) around the y axis, then the referential is rotated phi degrees (between 0 and 360) around the initial z axis, and finally it is rotated psi degrees (between 0 and 360) around the new z axis, always in the direct, counter-clockwise, direction. If the first Euler angle (theta) is zero, the old and new z axis coincide, thus (0, 0, 10) and (0, 5, 5) represent the same rotation.

By default, the first conventional vector is aligned with the x axis (even if conventional vectors are not actually represented), the second vector is in the xy plane and the third vector has a positive z coordinate (pointing to the user), corresponding to Euler angles (0, 0, 0).

The cell orientation is independent of the volume representation. This way, conventional, primitive and Wigner-Seitz cells can be easily compared, as they have the same orientation.

To define exactly the cell rotation, relatively to other cell or relatively to the current layer, press Align.

gamgi-0.17.5/doc/interfaces/cell/modify_symmetry.html000066400000000000000000000142371433127522700226420ustar00rootroot00000000000000 GAMGI Interfaces: Cell Modify

Cell Modify

Change here the symmetry and lattice parameters for a single cell or a list of cells.

To change the cell name write the new name in the Cell entry, followed by the cell number (GAMGI only needs the number to identify the cell).

To modify an cell, click over its graphic image, or write its identification (name and number) on the Cell entry. To modify a list of cells, press the button List (after creating the list of cells with Cell->Select). Parameters for empty entries or Local choices remain unchanged.

To change an cell name write the new name in the Cell entry, followed by the cell number (GAMGI needs the number to identify the cell). To change the name for a list of cells, press List first and then write the new common name in the Name entry.

Symmetry

System, Lattice and Group are optional parameters, but together they must provide enough information to identify the Bravais lattice of the cell. Redundant information is fine, but conflicting information is flagged as an error.

When the entries System, Lattice or Group are changed, the other two are updated automatically. Predictable information is automatically written and conflicting information is automatically removed.

System

System identifies the crystallographic system of the cell. The allowed values are: c (cubic), t (tetragonal), o (orthorhombic), h (hexagonal), m (monoclinic) and a (anorthic / triclinic). Hexagonal, trigonal and rhombohedric cases are grouped in GAMGI in a single hexagonal system, corresponding to the family designation used in the International Tables for Crystallography.

Pressing List, a second dialog shows all the systems that are compatible with the information currently inserted in the System, Lattice and Group entries.

Lattice

Lattice identifies the lattice centering of the cell. The allowed values are: P (primitive), I (body-centered), C (face-centered), F (face-centered) and R (rhombohedral). A, B and C centering is always described in GAMGI by C-based lattices. Thus monoclinic centered cells are always C, with unique axis b and cell choice 1. To use data reported with a different cell choice or unique axis please use the transformation matrices published in International Tables for Crystallography.

The R lattices describe the seven space groups belonging to the hexagonal system that are described as R groups, when using the standard Hermann-Mauguin symbols: R3 (146), R-3 (148), R32 (155), R3m (160), R3c (161), R-3m (166), R-3c (167).

Pressing List, a second dialog shows all the lattices that are compatible with the information currently inserted in the System, Lattice and Group entries.

Group

Group identifies the space group of the cell, using the numerical notation: 1 to 230.

The four orthorhombic space groups 38-41, which are described with A lattices when using the standard Hermann-Mauguin symbols, were converted to C lattices (so all base-centered lattices are described as C lattices) by using a different axes setting, which results from the axes permutation abc->bca, as described in the International Tables for Crystallography. These four groups, Amm2, Aem2, Ama2 and Aea2, are thus described in GAMGI as Cm2m, Cm2e, Cc2m and Cc2e, respectively.

For space groups 48, 50, 59, 68, 70 (orthorhombic), 85, 86, 88, 125, 126, 129, 130, 133, 134, 137, 138, 141, 142 (tetragonal), 201, 203, 222, 224, 227, 228 (cubic), there are two standard origins, denoted O1 or O2. In GAMGI the chosen origin is O2, at the inversion centre.

Unique axis b was used for all monoclinic space groups. For space groups 5, 7, 8, 9, 12, 13, 14, 15 (monoclinic), positions were constructed using Cell Choice 1.

Pressing List, a second dialog shows all the groups that are compatible with the information currently inserted in the System, Lattice and Group entries.

a, b, c, ab, ac, bc

Entries a, b, c, ab, ac, bc permit to change the lengths and angles defining the conventional cell vectors (redundant entries are automatically disabled). Cell lengths must be positive, while cell angles must be larger than zero and smaller than 180 degrees.

For the cubic system, only one length is required (a or b or c). For the tetragonal system, two lengths are required (a or b and c). For the orthorhombic system, three lengths are required (a and b and c).

For the hexagonal system, two lengths are required (a or b and c). For the monoclinic system, three lengths are required (a and b and c), plus the angle around the axis b (ac).

For the triclinic system, all six parameters are required. Each angle must be smaller than the sum of the other two and must be larger than the absolute difference of the other two, otherwise an error is produced. Redundant information is fine, but conflicting information is always flagged as an error.

gamgi-0.17.5/doc/interfaces/cell/modify_view.html000066400000000000000000000100311433127522700217070ustar00rootroot00000000000000 GAMGI Interfaces: Cell Modify

Cell Modify

Change here the visual representation for a single cell or a list of cells.

To modify an cell, click over its graphic image, or write its identification (name and number) on the Cell entry. To modify a list of cells, press the button List (after creating the list of cells with Cell->Select). Parameters for empty entries or Local choices remain unchanged.

To change an cell name write the new name in the Cell entry, followed by the cell number (GAMGI needs the number to identify the cell). To change the name for a list of cells, press List first and then write the new common name in the Name entry.

Faces

When the button Faces is down, the cell is represented as a solid object, that users can see from the outside or from the inside. This option is disabled in Projection, Rhombus and Sphere volumes (otherwise the filtering volume would hide the lattice inside).

When the button Faces is up, the cell is represented as a wired object, formed by lines connecting the vertices (or by circumpherences, in the Sphere representation).

Nodes

When the button Nodes is up, the nodes are visible, otherwise they are hidden. This option is disabled for Projection volumes.

Borders

Selecting None, no borders are shown in any volume representation. Selecting Edges, the outer line contours are shown but cell boundaries are hidden (as long as they are in the same plane, independently of the lattice parameters). Selecting Faces, all lines are shown, except those inside the volume representation (for Parallelepiped and Sphere volumes, Edges and Faces options behave in the same way).

Selecting All shows all the border lines, including those inside. This option is disabled when the button Faces is down, because in solid mode, internal borders cannot be seen from the outside and make it very difficult to analyze something from the inside. Options Faces and All are disabled in Parallelepiped and Sphere volumes, as there are no additional lines to represent in these representations, only the outer lines already shown with the option Edges. All options except Edges are disabled for Projection volumes.

At least one visual element, Nodes, Faces or Borders, must be visible when the cell is created, otherwise an error is flagged.

r, g, b

The r, g, b entries define the cell color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0). It is used to draw the lines and nodes, in wired mode, and the solid faces, in solid mode. In the last case, lines and nodes are drawn using the current layer background color, this way assuring a good contrast and eliminating the need to define yet another color.

Scale

Change the cell size, including its child objects. Cell objects are scaled around the cell center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
gamgi-0.17.5/doc/interfaces/cell/modify_volume.html000066400000000000000000000073561433127522700222640ustar00rootroot00000000000000 GAMGI Interfaces: Cell Modify

Cell Modify

Change here the volume representation for a single cell or a list of cells.

To modify an cell, click over its graphic image, or write its identification (name and number) on the Cell entry. To modify a list of cells, press the button List (after creating the list of cells with Cell->Select). Parameters for empty entries or Local choices remain unchanged.

To change an cell name write the new name in the Cell entry, followed by the cell number (GAMGI needs the number to identify the cell). To change the name for a list of cells, press List first and then write the new common name in the Name entry.

Type

Lattices can be represented using Conventional, Primitive or Wigner-Seitz cells, plus filtering volumes such as a Parallelepiped or a Sphere. Lattices can also be represented by the stereographic Projection of its crystallographic planes and directions (added by users, after the projection is created).

Cells with a Hexagonal system and a rhombohedral R lattice (corresponding to the seven R space groups when using the standard Hermann-Mauguin symbols), are always represented using the hexagonal axes and the obverse setting, when the chosen type is Conventional, and the rombohedral axes, when the chosen type is Primitive. Cells with a Hexagonal system and a primitive P lattice (corresponding to all the other space groups from 143 to 194 that are not R) are always represented using full hexagonal prismas, when the chosen type is Conventional, and one-third of the hexagonal prismas, when the chosen type is Primitive.

N1, N2, N3

Change the number of cells to replicate, in the three directions of space, when the chosen type is Conventional, Primitive or Wigner-Seitz. When not needed, these parameters are disabled.

V1, V2, V3, V23, V13, V12

A Parallelepiped filtering volume is defined by three edge lengths, V1, V2, V3, plus the three angles between them, V23, V13, V12. Each angle must be smaller than the sum of the other two and must be larger than the absolute difference of the other two, otherwise an error is produced.

A Sphere filtering volume is defined by the radius v1. When not needed, these parameters are disabled.

All nodes inside the volume representation are allocated (even if the user choosed to hide them). In Parallelepiped and Sphere volumes, a small tolerance (by default 1.0E-4) is added around the volume space to make sure that nodes in the borders are included. For example, a sphere with v1 = 1.0, filtering a cubic primitive lattice with a = 1.0, allocates 1 + 2 + 2 + 2 = 7 nodes (without the tolerance, the result could be undefined).

gamgi-0.17.5/doc/interfaces/cell/rcp.html000066400000000000000000000040431433127522700201600ustar00rootroot00000000000000 GAMGI Interfaces: Cell Link RCP
Cell Link RCP
 

Structure

The total number of atoms in the structure is indicated. The calculated radius is half the distance between the closer atoms, so the corresponding spheres touch each other and the other spheres have a small space between them.

The maximum radius is the radius that the spheres should have to achieve the maximum possible density, 0.74. This density is obtainable only in the most compact crystalline structures, so in random close packing structures the spheres would be superimposed.

The density is obtained dividing the occupied and total volumes, considering that all the spheres have the calculated radius. This density is usually between 0.62 and 0.64 in RCP structures.

Geometrical Neighbours

After scanning all the potential neighbours of each atom, the minimum and maximum number of neighbours, plus the average value and the standard deviation are reported.

The geometrical neighbours are all the atoms that are closer to the central atom than the maximum radius.

Topological Neighbours

After scanning all the potential neighbours of each atom, the minimum and maximum number of neighbours, plus the average value and the standard deviation are reported.

The topological neighbours are all the atoms that can touch the central atom, after moving both spheres until they touch at half-distance, without interfering with the other spheres.

gamgi-0.17.5/doc/interfaces/cell/remove_object.html000066400000000000000000000036531433127522700222250ustar00rootroot00000000000000 GAMGI Interfaces: Cell Remove

Cell Remove

  • Object
Indicate how to remove a cell (or list of cells, previously selected with Cell->Select, when Global is pressed).

Scope

When the Scope is All, the cell and all its contents is removed. This is the default.

When the Scope is Container, the cell is removed but its contents (clusters, molecules, groups, planes, directions, atoms, bonds, orbitals, texts) is saved, linked to the cell parent. Crystallographic planes and directions directly referencing the cell are removed because they cannot live without the cell.

When the Scope is Contents, the cell is preserved but all its contents (clusters, molecules, groups, planes, directions, atoms, bonds, orbitals, texts) is removed.

When the Scope is cluster, molecule, group, plane, direction, atom, bond, orbital or text, these objects are removed from the cell.

When the removed cell was part of the current object, the current layer becomes the new current object.

Clicking the mouse over a cell in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/cell/rotation.html000066400000000000000000000070651433127522700212420ustar00rootroot00000000000000 GAMGI Interfaces: Cell Create
Align Rotation
 
The cell orientation is given by two vectors, normal to each other, defining an axes set. The reference orientation is given by two vectors, normal to each other, defining an axes set.

This alignment consists in rotating the cell, so the first cell vector is aligned with the first reference vector, and the second cell vector is aligned with the second reference vector.

Cell

The first line defines a vector normal to the plane indicated by entries h, k, l. The second line defines a vector parallel to the direction indicated by entries u, v, w. The two vectors must be normal to each other, otherwise an error is shown. The two vectors are perpendicular when the Weiss law is obeyed: hu + kv + lw = 0. The h, k, l and u, v, w cell coordinates can be given in terms of Conventional or Primitive vectors, using the Vectors menu.

Reference

The reference can be the current layer (the default) or another cell. To select a cell as reference, press Cell and click on its visual representation (or write its identification directly on the enabled entry). When the reference is a cell, the orientation is defined by a plane and a direction, or vice-versa. When the reference is the layer, two directions must be entered, based on the layer orthonormed axes.

The first line defines a vector normal to the plane indicated by entries h, k, l, or parallel to the direction indicated by entries u, v, w. The second line defines a vector normal to the plane indicated by entries h, k, l, or parallel to the direction indicated by entries u, v, w. The h, k, l and u, v, w reference coordinates can be given in terms of Conventional or Primitive vectors, using the Vectors menu. When the reference is the layer, only the option Conventional is available.

The two vectors must be normal to each other, otherwise an error is shown. When the reference is a cell, the Weiss law must be obeyed: hu + kv + lw = 0. When the reference is the layer, the layer axes are equivalent to the axes of a cubic primitive lattice, where planes are perpendicular to directions with the same indices, so one of the two directions can be seen as representing a plane with the same indices, thus the Weiss law must again be valid: u1u2 + v1v2 + w1w2 = 0.

Pressing Ok on the second level dialog, the Align information is saved but the actual rotation is calculated only after pressing Ok on the first level dialog, to ensure that changing later some cell parameters will not produce wrong results.

To disable the Align information, open again the second level dialog, which now shows the previously entered data, and press Cancel.

gamgi-0.17.5/doc/interfaces/cell/select_list.html000066400000000000000000000033541433127522700217120ustar00rootroot00000000000000 GAMGI Interfaces: Cell Select

Cell Select

  • List
Cell->Select selects a cell or a list of cells.

To select an cell click the mouse over its visual representation: if GAMGI recognizes the cell it becomes the new selected object, otherwise the mouse action is ignored.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

Only cells in the working layer can be selected, even if cells are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Cell->Select shows a flat list of all cells currently existent in GAMGI, not necessarily in the same layer or window. For each cell, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/cell/systems.html000066400000000000000000000030671433127522700211100ustar00rootroot00000000000000 GAMGI Interfaces: Cell Systems
Systems
 
This dialog lists all the systems that are compatible with the current settings in the entries System, Lattice and Group. When the settings are impossible, no systems are shown. When the entries are empty, all 6 systems are shown.

For each possible system, GAMGI lists its usual lower-case symbol, the common designation, the lattices available and the range of space groups where it occurs.

GAMGI uses the less common anorthic name to designate the triclinic system (as the International Tables for Crystallography do), to use a different letter (a) from the tetragonal system (t). GAMGI groups Hexagonal, Trigonal, Rombohedral in a single Hexagonal system (thus corresponding to the 6 crystallographic families of the International Tables for Crystallography).

Clicking on a listed option in the lattice dialog, has exactly the same effect as writing it directly on the System entry.

gamgi-0.17.5/doc/interfaces/cell/translation.html000066400000000000000000000050101433127522700217250ustar00rootroot00000000000000 GAMGI Interfaces: Cell Create
Align Translation
 
A position in cell space is given by the coordinates of the three cell vectors. To convert to absolute space, the cell rotation, translation and zero node translation must be applied. A position in reference space is given by the coordinates of the three reference vectors. To convert to absolute space, the reference rotation, translation and zero node translation must be applied.

The alignement consists in translating the cell so the cell and the reference entered positions become the same.

Cell

The entries x, y, z indicate the coordinates of the three cell vectors for a given position. These coordinates can be given in terms of Conventional or Primitive vectors, using the Vectors menu.

Reference

The reference can be the current layer (the default) or another cell. To select a cell as reference, press Cell and click on its visual representation (or write its identification directly on the enabled entry). The entries x, y, z indicate the coordinates of the three reference vectors for a given position. When the reference is a cell, these are the cell vectors. When the reference is the layer, these vectors are the layer orthonormed axes. The reference coordinates can be given in terms of Conventional or Primitive vectors, using the Vectors menu. When the reference is the layer, only the option Conventional is available.

Pressing Ok on the second level dialog, the Align information is saved but the actual translation is calculated only after pressing Ok on the first level dialog, to ensure that changing later some cell parameters will not produce wrong results.

To disable the Align information, open again the second level dialog, which now shows the previously entered data, and press Cancel.

gamgi-0.17.5/doc/interfaces/cell/voronoi.html000066400000000000000000000136351433127522700210760ustar00rootroot00000000000000 GAMGI Interfaces: Cell Measure Voronoi
Cell Measure Voronoi
 
The Voronoi tesselation produces a polygonal representation, plus a report of topological and geometrical properties. For each atom there is a Voronoi polyhedron.

Throughout the report, Minimum is the minimum value, Maximum is the maximum value, Average is the mean value and Deviation is the standard deviation, in the universe formed by all the polyhedrons available.

Polyhedrons

Total number of polyhedrons. Polyhedrons with outer faces are considered External, all the others are Internal.

Faces

Total number of faces. Outer faces are considered External, all the others are Internal.

Edges

Total number of edges. Edges in outer faces are considered External, all the others are Internal.

Vertices

Total number of vertices. Vertices in outer faces are considered External, all the others are Internal.

Polyhedron Faces

Number of faces per polyhedron. The minimum value is 4 (tetrahedron).

Polyhedron Edges

Number of edges per polyhedron. The minimum value is 6 (tetrahedron).

Polyhedron Vertices

Number of vertices per polyhedron. The minimum value is 4 (tetrahedron).

Face Vertices

Number of vertices per face. The minimum value is 3 (triangle).

Edge polyhedrons

Number of polyhedrons sharing an edge. The minimum value is 1. (system edge).

Edge faces

Number of faces sharing an edge. The minimum value is 2. (system edge).

Vertex Polyhedrons

Number of polyhedrons sharing a vertex. The minimum value is 1 (system corner).

Vertex Faces

Number of faces sharing a vertex. The minimum value is 3 (system corner).

Vertex Edges

Number of edges sharing a vertex. The minimum value is 3 (system corner).

System Volume

Volume of the global system (including polyhedrons non-selected for analysis), obtained by: 1) limiting the volume with six outer planes (the Real value); 2) summing the volumes of all the polyhedrons (the Calculated value).

Comparing the two values provides a quantitative assertion of the global geometrical accuracy achieved with the Voronoi tesselation.

Polyhedron Volumes

The volume for each polyhedron, obtained by summing the volumes of all its triangular piramids.

Polyhedron Areas

The area for each polyhedron, obtained by summing the areas of all its faces.

Polyhedron Lengths

The length for each polyhedron, obtained by summing the lengths of all its edges.

System Anisotropy

For each polyhedron face, determine the following matrix, where n is the unit vector normal to the face:

q11 = n(1) * n(1) - 1/3
q12 = n(1) * n(2)
q13 = n(1) * n(3)
q21 = n(2) * n(1)
q22 = n(2) * n(2) - 1/3
q23 = n(2) * n(3)
q31 = n(3) * n(1)
q32 = n(3) * n(2)
q33 = n(3) * n(3) - 1/3
Then scale the matrix q by A/V**2/3, where A is the face area and V is the polyhedron volume. Finally sum for all polyhedron faces. The q matrix thus obtained describes the polyhedron matrix anisotropy.

To obtain the System Anisotropy, sum these matrices for all polyhedrons, multiplied by the corresponding polyhedron volume fractions. The trace of the resulting matrix must be zero.

The System Anisotropy is independent of the orientation of the system.

Polyhedron Anisotropy

To obtain a scalar Polyhedron Anisotropy, the following equation is applied:

q = sqrt { [q11**2 + q12**2 + q13**2 + q21**2 +
q22**2 + q23**2 + q31**2 + q32**2 + q33**2] / 9 }
For symmetrical solids such as the tetrahedron, the octahedron, the cube, the dodecahedron, or even the Kelvin 8+6 polyhedron, the scalar Polyhedron Anisotropy is always zero.

The scalar Polyhedron Anisotropy is independent of the orientation of the polyhedron.

Polyhedron Aberration

The ratio between the area of a polyhedron and the area of a sphere with the same volume. As a sphere is the 3D object with a smaller area/volume ratio, Spherical Aberration is always above 1.0.

Face Areas

The area for each face, obtained by summing the areas of all its triangles. Faces with an area smaller than a given tolerance (the Area tolerance in the Cell->Measure dialog) are removed.

Face Lengths

The perimeter for each face, obtained by summing the lengths of all its edges.

Face Angles

The angle between adjacent faces (between 0 and 180 degrees).

Face Aberration

The ratio between the perimeter of a face and the perimeter of a circumpherence with the same area. As a circumpherence is the 2D object with a smaller perimeter/area ratio, Circular Aberration is always above 1.0.

Edge Lengths

The length for each edge. Edges with a length smaller than a given tolerance (the Vertex tolerance in the Cell->Measure dialog) are removed.

Edge Angles

The angle between adjacent edges (between 0 and 180 degrees).

Seed Lengths

The distance between atom seeds. The minimum distance must be larger than a given tolerance (GAMGI_MATH_TOLERANCE_LENGTH, currently 1.0E-4), otherwise an error is flagged and the tesselation is canceled.
gamgi-0.17.5/doc/interfaces/cluster/000077500000000000000000000000001433127522700172475ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/cluster/copy_object.html000066400000000000000000000035631433127522700224440ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Copy

Cluster Copy

Indicate here the number of cluster copies to create and its destination.

Gamgi expects users to identify first the cluster or list of clusters to copy. When the Cluster entry is active and empty, clicking the mouse over an cluster, on the current layer (local selection), its identification is transported to the Cluster entry. Pressing the List button, the current list of clusters is selected instead.

Name

This is the name given to the new cluster copies. The default is to copy the name of each original cluster.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the cluster or list of clusters to copy, GAMGI expects users to identify a layer to where the clusters should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of clusters, the copies can also be created at the layer of each original cluster, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/cluster/copy_shift.html000066400000000000000000000024361433127522700223110ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Copy

Cluster Copy

Set here the translation vector applied to each new cluster.

By default, each copied cluster has the same coordinates as the original cluster. This is expected when copying a cluster or a list of clusters to a different layer. However, when each new cluster is in the same layer as the original cluster (for a list of clusters, the Local option in the Layer menu), a small shift helps to separate the new clusters from the original ones.

All other properties are the same for copied and original clusters (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/cluster/create.html000066400000000000000000000031571433127522700214060ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Create
Cluster Create
 
Cluster->Create creates a new cluster.

Cluster

The Cluster entry provides a name for the cluster object. This is optional: when empty (or filled with separator characters, as space, tab, newline), the cluster will be named Cluster. Object identification is explained in Introduction Identification.

A cluster is a container whose primary purpose is to contain other objects. When a cluster is created, it has no child objects and consequently no visual representation. The only way to select an empty cluster is therefore to write its identification or to use the mechanisms provided by Cluster Select.

To avoid this problem, when Ok is pressed and the new cluster is created, the Cluster Create dialog is automatically replaced by the Cluster Link dialog, with the new cluster identification already inscribed on it. How to link objects to a cluster (TODO) is described in the section Cluster Link.

gamgi-0.17.5/doc/interfaces/cluster/geometry.html000066400000000000000000000033361433127522700217750ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Measure Geometry
Cluster Measure Geometry
 
This report describes, for the selected structure, all the possible sequences for bond lengths, angles and torsions, presenting the results in increasing order of the atom elements. Geometric relations between non bonded atoms are ignored.

For each sequence it is reported the number of occurrences, the minimum and maximum values, the average value and the standard deviation (unless no valid occurrences were found).

Bond Length

The distance between Atom1 and Atom2.

Bond Angle

The valence angle between directions Atom2-Atom1 and Atom2-Atom3. The results are always presented with positive values.

When present, undefined bond angles (when at least two atoms are coincident) are reported for each angle sequence.

Bond Torsion

The torsion angle between two planes, defined by Atom1-Atom2-Atom3 and Atom2-Atom3-Atom4. The results are always presented with positive values.

When present, undefined bond torsions (when at least two atoms are coincident or three atoms are colinear) are reported for each torsion sequence.

gamgi-0.17.5/doc/interfaces/cluster/link_object.html000066400000000000000000000062621433127522700224260ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Link

Cluster Link

Link a cluster or a list of clusters to other objects.

Hierarchy

Clusters can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by clusters. Pressing the button Above, the same menu shows the classes of objects that can own clusters.

Gamgi expects users to identify first the cluster or list of clusters and then the object to link. When the Cluster entry is active and empty, clicking the mouse over a cluster, on the current layer (local selection), its identification is transported to the Cluster entry. Pressing the List button, the current list of clusters is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

Method

Gamgi suppports only one method to link clusters: Object.

The Object method links a cluster or a list of clusters to a single object, Above or Below.

When linking a cluster and the Hierarchy is Above, the cluster is unlinked from its current parent and linked to the new object. When the cluster is moved to a different layer, its bonds are automatically removed. When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the cluster. An error is issued when the parent already owned the child object.

When the new child previously owned the new parent (a situation made possible because clusters can own other clusters), the new parent is first linked to the new child parent. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of clusters Above, all clusters in the list are unlinked and linked to the parent object. When linking a list of clusters Below, the child object is replicated as many times as necessary to link each cluster in the list to a different replica.

gamgi-0.17.5/doc/interfaces/cluster/link_shift.html000066400000000000000000000033071433127522700222720ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Link

Cluster Link

Set here the translation applied to the child object or list of objects.

When linking a cluster to another object, the translation is always applied to the child object: the cluster itself when linking above, the other object (cluster, molecule, group, plane, direction, atom, orbital, text) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of clusters is linked above, Reference is set by default to Child, so clusters preserve their positions and are not superposed.

When a list of clusters is linked below, each cluster will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent clusters and are not superposed.

gamgi-0.17.5/doc/interfaces/cluster/measure_symmetry.html000066400000000000000000000073521433127522700235560ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Measure

Cluster Measure

Select here the parameters to measure the point symmetry.

Periodicity

When the No option is chosen (the default), all elements of symmetry are taken into account, and the chemical point group is determined. When the Yes option is chosen, all elements of symmetry related with rotations of order different from 6, 4, 3, 2 are ignored. The reported crystallographic point group is thus the maximum point symmetry that could be achieved in the center of this aggregate, if it was in a periodic crystal.

For example, a C5v chemical group becomes a Cs crystallographic point group because after discarding the C5 axis, only one of the five mirror planes can be considered as a true element of symmetry in a periodic system. A chemical Ih becomes a Th crystallographic group, because after discarding the C5 axes, the remaining planes and axes form five different sets of cubic Th symmetry, although only one can be considered at a time.

Everytime the chemical group is found, the crystallographic group can also be determined. Usually this crystallographic group is not unique. For example, a D12h chemical group can be either a D4h or a D6h crystallographic group. GAMGI shows the various crystallographic groups that cover all the possible operations of symmetry, in sequence, with their symmetry operations and symmetry elements. In particular, chemical C0v becomes C4v or C6v, chemical D0h becomes D4h or D6h and chemical Kh becomes D4h or D6h or Oh crystallographic groups respectively.

Tolerance

The elements of symmetry of a cluster depend entirely of the tolerance applied to the operations of symmetry. GAMGI uses the same tolerance for all operations: the maximum distance that is tolerated between initial and transformed coordinates.

GAMGI tries to find all the symmetry elements independently, and in general each of these elements requires a different tolerance. Thus, for a given tolerance, some elements may be recognized and others may go missing, resulting in an inconsistent set of symmetry elements. When this happens, the group is reported Undefined. The solution is to increase the tolerance (so valid elements might be found) or to decrease it (so fake elements might be discarded).

When the transformed coordinates for a given symmetry element are closer than the Initial tolerance, GAMGI attempts to optimize the symmetry element, to get transformed coordinates closer than the Final tolerance. When the transformed coordinates do not pass the Initial tolerance or when the optimization fails, the attempted element is discarded. When the transformed coordinates pass the Final tolerance, the element is accepted.

During optimization, GAMGI will never attempt to change the atoms, only the symmetry elements. To disable optimization, just set Initial equal to Final tolerance.

gamgi-0.17.5/doc/interfaces/cluster/measure_tolerance.html000066400000000000000000000026231433127522700236350ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Measure

Cluster Measure

Select here the numerical tolerances used in the Voronoi tesselation. Changing significantly the default values may produce bad results.

Tolerance

When building the polyhedrons, if a plane cuts a vertex more than the Apex tolerance, this vertex is removed.

Faces that have an area smaller than the Area tolerance are ignored and its topological surroundings are merged.

Vertices that are closer than the Vertex tolerance are considered the same and its topological surroundings are merged.

gamgi-0.17.5/doc/interfaces/cluster/measure_type.html000066400000000000000000000044751433127522700226510ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Measure

Cluster Measure

Chose the method of analysis: Geometry, Symmetry or Voronoi.

Geometry

This method measures all the bond lengths, angles and torsions in the structure, reporting for each quantity, the number of occurrences, the minimum and maximum values, the average value and the standard deviation. Geometric relations between non bonded atoms are ignored.

Undefined bond angles (when at least two atoms are coincident) are reported for each angle sequence. Undefined bond torsions (when at least two atoms are coincident or three atoms are colinear) are reported for each torsion sequence.

Symmetry

This method determines the point group of symmetry of the structure, either in the chemical context (infinite groups, all symmetry operations are allowed) or in the crystallographic context (32 groups, only 1, 2, 3, 4, 6 rotations and other operations compatible with lattice symmetry are allowed).

Voronoi

This method determines the Voronoi tesselation of the structure, shows the resulting polyhedra in a new layer, and reports a large list of its most important geometrical and topological properties.

This analysis can be made with planar bondaries (to close the outside polyhedra) or with full periodic boundary conditions, with equal weights for all atoms (the usual Voronoi tesselation) or with a different weight for each atom (given by its atomic radius, the so-called radical tesselation).

gamgi-0.17.5/doc/interfaces/cluster/measure_view.html000066400000000000000000000043641433127522700226370ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Measure

Cluster Measure

Select here how the calculated Voronoi polyhedra are shown.

Borders

Selecting Faces, only the borders defining the external faces are shown, thus producing a relatively uncluttered volume representation.

Selecting All shows all the borders, including those inside the volume. This option is disabled when the button Faces is down, because in solid mode, internal borders cannot be seen from the outside and make it very difficult to analyze something from the inside.

Faces

When the button Faces is down, the tesselation is represented as a solid volume, that users can see from the outside or from the inside.

When the button Faces is up, the tesselation is represented as a wired volume.

Nodes

When the button Seeds is up, the atom seeds are visible, otherwise they are hidden.

Color

The Color button controls whether the tesselation is represented with its own, independent color, or inherits the colors of the atom seeds, for each polyhedron. When the button Faces is up, an independent color is necessary, because polyhedrons are then represented only by wired shared edges, which cannot inherit the color from both faces.

R, G, B

The R, G, B entries define the tesselation color: (0.0, 0.0, 0.0) is black and (1.0, 1.0, 1.0) is white.
gamgi-0.17.5/doc/interfaces/cluster/measure_voronoi.html000066400000000000000000000072131433127522700233540ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Measure

Cluster Measure

Select here the main parameters controlling the Voronoi tesselation.

Boundaries

GAMGI supports two methods to handle the tesselation in the boundaries, Planar and Periodic.

The Planar method defines six outer planes, forming a closed space that includes all the seeds. Conceptually, this is equivalent to create six virtual seeds around each real seed, positioned in such a way that they define six planes at half-distance, common for all seeds, forming a closed background.

The Periodic method applies periodic boundary conditions, using the extended image convention, which means to create 26 virtual systems around the central system (as 26 boxes around the central one, in a 3x3x3 arrangement). The minimum image convention, often used in Molecular Mechanics simulations, is not suitable in Voronoi tesselation, because it considers only the nearest neighbours, while Voronoi tesselation requires all the 26 nearest neighbours.

The Offset parameter defines the border width between: 1) the seeds and the outer planes, in the Planar method; 2) the central system and the other 26 around, in the Periodic method.

Offset cannot be 0 in the Planar method, because virtual seeds would coincide with real seeds, producing an error. Offset can be 0 in the Periodic method, if real and virtual seeds do not coincide, otherwise an error is flagged. An error is also produced when two real seeds coincide (current tolerance: 1.0E-4).

Weights

By default, GAMGI calculates the normal Voronoi partition, so all atoms are given the same weight, corresponding to Variancy equal to zero. However GAMGI can partition the space giving different weights to different atoms (Radical Tesselation), according to their radius. In general, if d is the distance between seed 0 and neighbour 1, the plane between them passes at a distance d * fraction from the seed, where fraction is given by:

r0 = radius0 * variancy
r1 = radius1 * variancy
fraction = 1/2 [1 + (r0**2 - r1**2)/d**2]
When Variancy is 0, fraction is 1/2 (normal Voronoi), whereas when Variancy is 1, unscaled atomic radius are used to determine fraction. Variancy can vary continuously from 0 to a given limit, GAMGI_PHYS_VORONOI_VARIANCY, currently 10.0.

When Variancy is 0, the tesselation can always be obtained (as long as there are no atoms with essentially the same coordinates). When Variancy increases, the tesselation becomes progressively more restrictive. The atoms must be far enough from each other, particularly when the radius are quite different, otherwise the tesselation cannot be determined and and error is shown.

gamgi-0.17.5/doc/interfaces/cluster/remove_object.html000066400000000000000000000035361433127522700227670ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Remove

Cluster Remove

  • Object
Indicate how to remove a cluster (or list of clusters, previously selected with Cluster->Select, when Global is pressed).

Scope

When the Scope is All, the cluster and all its contents is removed. This is the default.

When the Scope is Container, the cluster is removed but its contents (child clusters, molecules, groups, planes, directions, atoms, bonds, orbitals, texts) is saved, linked to the cluster parent.

When the Scope is Contents, the cluster is preserved but all its contents (child clusters, molecules, groups, planes, directions, atoms, bonds, orbitals, texts) is removed.

When the Scope is cluster, molecule, group, plane, direction, atom, bond, orbital or text, these objects are removed from the cluster.

When the removed cluster was part of the current object, the current layer becomes the new current object.

Clicking the mouse over a cluster in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/cluster/select_list.html000066400000000000000000000042021433127522700224450ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Select

Cluster Select

  • List
Cluster->Select selects a cluster or a list of clusters.

To select an cluster click the mouse over its visual representation: if GAMGI recognizes the cluster it becomes the new selected object, otherwise the mouse action is ignored.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

A cluster is a recursive object, so it can contain for example another cluster, which in turn can contain an atom. Clicking over the atom is ambiguous: which cluster is the user trying to select? everytime this ambiguity occurs, a menu pops up showing the name and number of all the candidate clusters, and if one is selected, it becomes the new selected object.

Only clusters in the working layer can be selected, even if clusters are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Cluster->Select shows a flat list of all clusters currently existent in GAMGI, not necessarily in the same layer or window. For each cluster, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/cluster/symmetry.html000066400000000000000000000110571433127522700220320ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Measure Symmetry
Cluster Measure Symmetry
 
This report describes, for the selected structure, the point group of symmetry, the symmetry operations and the symmetry elements. When Periodicity is set to Yes and various crystallographic point groups are possible, they are listed in sequence of increasing symmetry.

Point Group

The chemical or crystallographic point group of symmetry is reported here. When Periodicity is set to No (the default), the chemical group is shown, using the Schoenflies notation (or Undefined, if no point group can be determined).

Chemical groups for linear systems, with a rotation axis of infinite order, are named C0v and D0h. The spherical group, corresponding to a single atom, is named Kh.

When Periodicity is set to Yes, the group is named using first the International and then the Schoenflies notation (or Undefined, if no point group can be determined. In this case, rotation axes of order different from 6, 4, 3, 2 are discarded, all the other elements are shown).

Gamgi can find axes with any rotation order, so any chemical (infinite) or crystallographic (32) group of symmetry can be determined.

When users require the crystallographic point group, Gamgi determines first the chemical group and then applies the periodic restrictions to obtain the point group in a crystal with the highest possible symmetry. When more than one option is available, Gamgi shows the various solutions. For example, a C24 rotation axis in a molecule can be restricted to 6 or 4 axes in a periodic crystal.

Gamgi tries to find all the symmetry elements independently, and in general each of these elements requires a different tolerance. Thus, for a given tolerance, some elements may be recognized and others may go missing, resulting in an inconsistent set of symmetry elements. When this happens, the group is reported Undefined. The solution is to increase the tolerance (so valid elements might be found) or to decrease it (so fake elements might be discarded).

Symmetry Operations

The complete set of symmetry operations, generated from the symmetry elements found (forming a group, in the mathematical sense), is reported in abreviated format. For example, a C4 axis generates operations C41, C42 (equal to C21), C43 and C44 (equal to E), so only two C4 operations are new, described as 2C4.

In groups with infinite rotation orders, C0v and D0h, rotation operations are presented, as 2C0 and 2S0, symbolizing the two directions of rotation. In these cases, a single mirror plane m is considered (although they are infinite). For the Kh spherical group, a single rotation axis and plane are considered (although they are infinite).

Symmetry Elements

All symmetry elements that were found are individually reported here. The inversion center is described by its coordinates. Mirror planes are described indicating the corresponding normal vectors. For rotation axes, normal and improper, the rotation order is reported, plus the normal vector describing the axis, starting from the center.

For all symmetry elements, the error produced when applying the operations of symmetry, is reported (this error is smaller than the tolerance, otherwise the element would have been rejected).

Rotation axes are sorted according to increasing rotation order, so more symmetric axes come first. When present, infinite order axes are always the first in the list. Mirror planes and axes with the same rotation order are sorted according to decreasing element error, so better defined elements come first.

When present, a horizontal mirror plane is always listed before the other planes. When present, a C2 axis along the main direction is always listed before the other C2 axes.

gamgi-0.17.5/doc/interfaces/cluster/voronoi.html000066400000000000000000000136511433127522700216360ustar00rootroot00000000000000 GAMGI Interfaces: Cluster Measure Voronoi
Cluster Measure Voronoi
 
The Voronoi tesselation produces a polygonal representation, plus a report of topological and geometrical properties. For each atom there is a Voronoi polyhedron.

Throughout the report, Minimum is the minimum value, Maximum is the maximum value, Average is the mean value and Deviation is the standard deviation, in the universe formed by all the polyhedrons available.

Polyhedrons

Total number of polyhedrons. Polyhedrons with outer faces are considered External, all the others are Internal.

Faces

Total number of faces. Outer faces are considered External, all the others are Internal.

Edges

Total number of edges. Edges in outer faces are considered External, all the others are Internal.

Vertices

Total number of vertices. Vertices in outer faces are considered External, all the others are Internal.

Polyhedron Faces

Number of faces per polyhedron. The minimum value is 4 (tetrahedron).

Polyhedron Edges

Number of edges per polyhedron. The minimum value is 6 (tetrahedron).

Polyhedron Vertices

Number of vertices per polyhedron. The minimum value is 4 (tetrahedron).

Face Vertices

Number of vertices per face. The minimum value is 3 (triangle).

Edge polyhedrons

Number of polyhedrons sharing an edge. The minimum value is 1. (system edge).

Edge faces

Number of faces sharing an edge. The minimum value is 2. (system edge).

Vertex Polyhedrons

Number of polyhedrons sharing a vertex. The minimum value is 1 (system corner).

Vertex Faces

Number of faces sharing a vertex. The minimum value is 3 (system corner).

Vertex Edges

Number of edges sharing a vertex. The minimum value is 3 (system corner).

System Volume

Volume of the global system (including polyhedrons non-selected for analysis), obtained by: 1) limiting the volume with six outer planes (the Real value); 2) summing the volumes of all the polyhedrons (the Calculated value).

Comparing the two values provides a quantitative assertion of the global geometrical accuracy achieved with the Voronoi tesselation.

Polyhedron Volumes

The volume for each polyhedron, obtained by summing the volumes of all its triangular piramids.

Polyhedron Areas

The area for each polyhedron, obtained by summing the areas of all its faces.

Polyhedron Lengths

The length for each polyhedron, obtained by summing the lengths of all its edges.

System Anisotropy

For each polyhedron face, determine the following matrix, where n is the unit vector normal to the face:

q11 = n(1) * n(1) - 1/3
q12 = n(1) * n(2)
q13 = n(1) * n(3)
q21 = n(2) * n(1)
q22 = n(2) * n(2) - 1/3
q23 = n(2) * n(3)
q31 = n(3) * n(1)
q32 = n(3) * n(2)
q33 = n(3) * n(3) - 1/3
Then scale the matrix q by A/V**2/3, where A is the face area and V is the polyhedron volume. Finally sum for all polyhedron faces. The q matrix thus obtained describes the polyhedron matrix anisotropy.

To obtain the System Anisotropy, sum these matrices for all polyhedrons, multiplied by the corresponding polyhedron volume fractions. The trace of the resulting matrix must be zero.

The System Anisotropy is independent of the orientation of the system.

Polyhedron Anisotropy

To obtain a scalar Polyhedron Anisotropy, the following equation is applied:

q = sqrt { [q11**2 + q12**2 + q13**2 + q21**2 +
q22**2 + q23**2 + q31**2 + q32**2 + q33**2] / 9 }
For symmetrical solids such as the tetrahedron, the octahedron, the cube, the dodecahedron, or even the Kelvin 8+6 polyhedron, the scalar Polyhedron Anisotropy is always zero.

The scalar Polyhedron Anisotropy is independent of the orientation of the polyhedron.

Polyhedron Aberration

The ratio between the area of a polyhedron and the area of a sphere with the same volume. As a sphere is the 3D object with a smaller area/volume ratio, Spherical Aberration is always above 1.0.

Face Areas

The area for each face, obtained by summing the areas of all its triangles. Faces with an area smaller than a given tolerance (the Area tolerance in the Cluster->Measure dialog) are removed.

Face Lengths

The perimeter for each face, obtained by summing the lengths of all its edges.

Face Angles

The angle between adjacent faces (between 0 and 180 degrees).

Face Aberration

The ratio between the perimeter of a face and the perimeter of a circumpherence with the same area. As a circumpherence is the 2D object with a smaller perimeter/area ratio, Circular Aberration is always above 1.0.

Edge Lengths

The length for each edge. Edges with a length smaller than a given tolerance (the Vertex tolerance in the Cluster->Measure dialog) are removed.

Edge Angles

The angle between adjacent edges (between 0 and 180 degrees).

Seed Lengths

The distance between atom seeds. The minimum distance must be larger than a given tolerance (GAMGI_MATH_TOLERANCE_LENGTH, currently 1.0E-4), otherwise an error is flagged and the tesselation is canceled.
gamgi-0.17.5/doc/interfaces/direction/000077500000000000000000000000001433127522700175465ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/direction/copy_object.html000066400000000000000000000036231433127522700227400ustar00rootroot00000000000000 GAMGI Interfaces: Direction Copy

Direction Copy

Indicate here the number of direction copies to create and its destination.

Gamgi expects users to identify first the direction or list of directions to copy. When the Direction entry is active and empty, clicking the mouse over an direction, on the current layer (local selection), its identification is transported to the Direction entry. Pressing the List button, the current list of directions is selected instead.

Name

This is the name given to the new direction copies. The default is to copy the name of each original direction.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the direction or list of directions to copy, GAMGI expects users to identify a layer to where the directions should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of directions, the copies can also be created at the layer of each original direction, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/direction/copy_shift.html000066400000000000000000000024661433127522700226130ustar00rootroot00000000000000 GAMGI Interfaces: Direction Copy

Direction Copy

Set here the translation vector applied to each new direction.

By default, each copied direction has the same coordinates as the original direction. This is expected when copying a direction or a list of directions to a different layer. However, when each new direction is in the same layer as the original direction (for a list of directions, the Local option in the Layer menu), a small shift helps to separate the new directions from the original ones.

All other properties are the same for copied and original directions (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/direction/create_projection.html000066400000000000000000000062511433127522700241370ustar00rootroot00000000000000 GAMGI Interfaces: Direction Create

Direction Create

Set here how a crystallographic direction is projected.

Net

The projection net can be Wulff (Stereographic) or Schmidt (Equivalent). In the Wulff projection, the point to project (above) and the point of the sphere farther from the user (below) define a segment that intersects the circle at a point, giving the final representation.

In the Schmidt projection, the point to project (above) is rotated around the point of the sphere closer to the user (above), keeping the same XY direction, until both points have the same Z coordinate, and then divided by square root of 2, to be inside the circle with radius R at coordinate Z, giving the final representation.

Every family of crystallographic planes or directions can be described by the intersection of the plane or direction passing through the origin O with a sphere of radius R centered at O, defining a circumpherence or a point, respectively. These in turn can be projected on the circle parallel to the screen (constant Z coordinate) that divides the sphere in half, with radius R and origin O. In GAMGI, points in the half-sphere farther from the user are hidden, so only half-circumpherences and points above are visible.

Model

In both projections, a direction can always be represented by a Pole or a Trace. The intersection of the direction with the projection sphere is a point that projected gives the Pole representation. The intersection of the plane normal to the direction with the projection sphere is an arch that projected gives the Trace representation: a circumpherence arch in the Wulff projection and a 4th order conic arch in the Schmidt projection.

A plane can always be described by its normal vector, and a direction by its plane perpendicular, so both representations are valid for crystallographic planes and directions.

In a Wulff projection, angles between planes are given by the angles between the traces, so angles are preserved. This is not true for the Schmidt projection. The Wulff projection is mostly used in materials science.

In a Schmidt projection, minor circles on the sphere are distorted when projected but the areas are preserved. This is not true for the Wulff projection. The Schmidt projection is mostly used in structural geology.

gamgi-0.17.5/doc/interfaces/direction/create_scope.html000066400000000000000000000166071433127522700231020ustar00rootroot00000000000000 GAMGI Interfaces: Direction Create

Direction Create

Set here the atomic structure to include, and the range of directions to create, for a given crystallographic family.

Structure

It is often useful to recreate in a direction the atomic structure existing in the parent object. A list is first created, with all the atoms closer to the direction than the distance defined by Thickness.

When Structure is set to Copy, listed atoms are copied to the atomic or crystallographic directions just created. When Structure is set to Link, listed atoms are linked to the atomic or crystallographic directions just created. When Structure is set to None, only a line representation of the direction is created, without atoms.

Filter

After collecting a list of atoms close enough to the direction, a filtering condition may be applied. This can be very useful to avoid atom superposition, resulting for example from atoms copied before to different directions.

When Filter is set to Class, atoms belonging to another directions are ignored. When Filter is set to Child, atoms not belonging directly to the direction parent are ignored. When Filter is set to Identical, atoms closer than a given distance (currently 1.0E-2, as defined in GAMGI_MATH_TOLERANCE_STRUCTURE) to a previous atom are ignored. When Filter is set to None, no filtering condition is applied.

Thickness

The line representation of the direction is expanded as much as possible, limited by the cell volume, in crystallographic directions, and by the atoms within a Thickness range of the direction defined by the two atoms, in atomic directions.

Node

A direction can be defined indicating explicitly the coordinates of a node where the direction passes. For each direction family, there is a direction passing through the origin node and as nodes are equivalent, it follows that for any node, there is a direction of any family passing through there.

By default, only the direction passing through the origin is represented, with node coordinates o1, o2, o3, o4, equal to 0, 0, 0 and 000, respectively.

o1, o2, o3

These entries provide the coordinates of the node in the lower-left corner of the cell where the direction passes, calculated with conventional or primitive cell vectors. When the lattice is primitive or vectors are primitive, this corner node becomes the place where the direction passes.

The vectors used for the node coordinates, Conventional or Primitive, are those used to define the plane indices, in the Type page, of the first dialog.

o4

When the lattice is centered and vectors are conventional, a fourth coordinate o4 is needed to point the centered node where the direction passes. By default, o4 is 000, so no change is introduced. When the cell lattice is primitive P or the vectors defining the node are primitive, that is the only possible value for o4. For I, C, F, R centered lattices, o4 can also take the values:
I: 111
C: 110
F: 110, 101, 011
R: 211, 122
corresponding to the numerators of the inner node coordinates, (1/2 1/2 1/2) for I lattices, (1/2 1/2 0) for C lattices, (0 1/2 1/2) (1/2 0 1/2) (1/2 1/2 0) for F lattices and (1/3 2/3 2/3) (2/3 1/3 1/3) for R lattices.

Range

A set of directions to create can also be defined automatically, with two plane families belonging to the direction zone axis. Defining a range for each plane family, the intersection of the two ranges of planes defines an infinite volume, aligned along the direction orientation. All directions of the family that fall inside this volume should be created. For directions [001], for example, the planes paralel, belonging to the direction axis, can be for example (100) and (010), as determined by the Weiss equation: hu + kv + lw = 0. For a cubic primitive lattice cP, a range (0 to 1) for planes (100) and a range (0 to 2) for planes (010) results in a volume containing 2x3 = 6 crystallographic directions [001]. To select a range of directions, press Range, to open a second level dialog.

Family

For each plane family, enter the indices h, k, l. Each set of indices must obbey the Weiss zone equation, when combined with the direction indices, otherwise an error is shown.

Each plane of a family (h k l) intersects the lattice in n/h n/k n/l, where n = 0 means the plane passing through the origin and n = 1 is the usual representation of the plane closest to the origin. The range of planes to consider is defined by the values entered near to the buttons Start and End, describing the initial and final values of n. For example, setting Start to -1 and End to 1 defines a range with 3 planes, intersecting the axes in: 1) -1/h -1/k -1/l; 2) 0; 3) 1/h 1/k 1/l.

Pressing the Start button, the entry is disabled and GAMGI considers automatically all the planes from the beginning of the cell volume to the final plane specified. Pressing the End button, the entry is disabled and GAMGI considers automatically all the planes from the end of the cell volume to the first plane specified. When both buttons are pressed, GAMGI considers automatically all the planes from the beginning to the end of the cell volume, so all directions inside the cell volume will be created.

After entering the plane ranges, pressing Ok saves the data, closes the second level dialog, and disables the node information in the first level dialog. Pressing Cancel, the current data in both dialogs is maintained and the second level dialog is closed.

Pressing Node in the first level dialog, removes the second level data, closes the second level dialog, enables and initializes (if empty) the node data.

The vectors used for the node coordinates, Conventional or Primitive, are those used to define the plane indices, in the Type page, of the first dialog.

When adding information in the second level dialog, the direction indices and the cell must have been entered before, so GAMGI can check if the information is correct. For the same reason, when Cell, u, v, w, or Vectors changed in the Type page, all the information in the second level dialog is automatically discarded, as it might be wrong.

gamgi-0.17.5/doc/interfaces/direction/create_type.html000066400000000000000000000043461433127522700227470ustar00rootroot00000000000000 GAMGI Interfaces: Direction Create

Direction Create

Set here a crystallographic or atomic direction.

Reference

GAMGI can handle crystallographic directions, related with a cell containing the relevant crystallographic information, and atomic directions, defined by two non-coincident atoms.

To create crystallographic directions, set Reference to Cell. GAMGI automatically shows a Cell entry, plus U, V, W entries to indicate the direction indices, plus a Vectors menu, to select the cell vectors to use, Conventional or Primitive. For the sake of simplicity, GAMGI does not accept 4-indice notation for planes or directions in hexagonal cells.

Pressing the mouse over a cell in the current layer, the cell identification is automatically written in the Cell entry. When a valid cell is found and its Type is Projection, the default Line page is automatically replaced by a Projection page.

By default, only one family of crystallographic directions is created. To create a set of families simultaneously, press the button List.

When Reference is set to Atoms, GAMGI automatically shows two Atom entries. Pressing the mouse sucessively over two non-colinear atoms in the current layer, the two entries become occupied and the direction defined. After pressing Ok, an error is shown when the two atoms are coincident.

gamgi-0.17.5/doc/interfaces/direction/create_view.html000066400000000000000000000025231433127522700227330ustar00rootroot00000000000000 GAMGI Interfaces: Direction Create

Direction Create

Set here the visual aspect of a direction object.

R, G, B

The R, G, B entries define the direction color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).

Scale

The Scale factor can be used to change a direction size, including its child objects. Direction objects are scaled around the direction center.

The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

gamgi-0.17.5/doc/interfaces/direction/link_object.html000066400000000000000000000057211433127522700227240ustar00rootroot00000000000000 GAMGI Interfaces: Direction Link

Direction Link

Link a direction or a list of directions to other objects.

Hierarchy

Directions can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by directions. Pressing the button Above, the same menu shows the classes of objects that can own directions.

Gamgi expects users to identify first the direction or list of directions and then the object to link. When the Direction entry is active and empty, clicking the mouse over a direction, on the current layer (local selection), its identification is transported to the Direction entry. Pressing the List button, the current list of directions is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

Method

Gamgi suppports only one method to link directions: Object.

The Object method links a direction or a list of directions to a single object, Above or Below.

When the Hierarchy is Above, the direction is unlinked from its current parent and linked to the new object. When the direction is moved to a different layer, its bonds are automatically removed. When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the direction. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of directions Above, all directions in the list are unlinked and linked to the parent object. When linking a list of directions Below, the child object is replicated as many times as necessary to link each direction in the list to a different replica.

gamgi-0.17.5/doc/interfaces/direction/link_shift.html000066400000000000000000000032551433127522700225730ustar00rootroot00000000000000 GAMGI Interfaces: Direction Link

Direction Link

Set here the translation applied to the child object or list of objects.

When linking a direction to another object, the translation is always applied to the child object: the direction itself when linking above, the other object (atom, orbital, text) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of directions is linked above, Reference is set by default to Child, so directions preserve their positions and are not superposed.

When a list of directions is linked below, each direction will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent directions and are not superposed.

gamgi-0.17.5/doc/interfaces/direction/measure_angle.html000066400000000000000000000036401433127522700232460ustar00rootroot00000000000000 GAMGI Interfaces: Direction Measure

Direction Measure

Measure Angle properties involving directions.

Quantity

The supported Angle properties are listed below. Directions and other objects selected may belong to different structural systems (cells, molecules, etc.), bonded or not. Only objects in the current layer can be chosen.

An easy technique to select the objects is to click the mouse sucessively over their visual representations, in the sequence shown in the dialog. After the last needed object is selected, GAMGI automatically starts the calculation.

2-Direction Angle

The angle between two directions.

Direction Plane Angle

The angle between a direction and a plane.

Value

After selecting a quantity, enter the name of the objects and press Ok. If all objects are recognized, GAMGI does the calculation and shows the result in the Value entry.

When a calculation ends, GAMGI keeps the objects identification. To start a new calculation, just click the mouse over a new object: GAMGI automatically cleans the previous data and inserts the new object identification. When a new quantity or page is chosen, previous data is automatically removed.

gamgi-0.17.5/doc/interfaces/direction/measure_length.html000066400000000000000000000042571433127522700234460ustar00rootroot00000000000000 GAMGI Interfaces: Direction Measure

Direction Measure

Measure Length properties involving directions.

Quantity

The supported Length properties are listed below. Directions and other objects selected may belong to different structural systems (cells, molecules, etc.), bonded or not. Only objects in the current layer can be chosen.

An easy technique to select the objects is to click the mouse sucessively over their visual representations, in the sequence shown in the dialog. After the last needed object is selected, GAMGI automatically starts the calculation.

Direction Node Length

The length per node along a crystallographic direction. The Direction parent must be a cell object.

Direction Node Density

The number of nodes per unit length along a crystallographic direction (the inverse of the previous quantity). The direction parent must be a cell object.

Direction Atom Distance

The distance from a direction to an atom.

Value

After selecting a quantity, enter the name of the objects and press Ok. If all objects are recognized, GAMGI does the calculation and shows the result in the Value entry.

When a calculation ends, GAMGI keeps the objects identification. To start a new calculation, just click the mouse over a new object: GAMGI automatically cleans the previous data and inserts the new object identification. When a new quantity or page is chosen, previous data is automatically removed.

gamgi-0.17.5/doc/interfaces/direction/modify_position.html000066400000000000000000000046411433127522700236540ustar00rootroot00000000000000 GAMGI Interfaces: Direction Modify

Direction Modify

Change here the position and orientation for a single direction or a list of directions.

To modify a direction, click over its graphic image, or write its identification (name and number) on the Direction entry. To modify a list of directions, press the button List (after creating the list of directions with Direction->Select). Parameters for empty entries or Local choices remain unchanged.

To change a direction name write the new name in the Direction entry, followed by the direction number (GAMGI needs the number to identify the direction). To change the name for a list of directions, press List first and then write the new common name in the Name entry.

Translation

The position of a direction object can be changed using the X, Y, Z entries. The change can be Absolute or Relative (to the current position).

To go back to the initial position, set X, Y, Z, to 0, 0, 0, in Absolute mode.

Rotation

The orientation of a direction object, defined by the Euler angles theta, phi, psi, can be changed using the E1, E2, E3 entries. The change can be Absolute or Relative (to the current orientation). Euler angles are not addictive, so the direction is rotated back with the old angles and forward with the new ones.

To go back to the initial orientation, set E1, E2, E3, to 0, 0, 0, in Absolute mode.

gamgi-0.17.5/doc/interfaces/direction/modify_projection.html000066400000000000000000000074741433127522700241730ustar00rootroot00000000000000 GAMGI Interfaces: Direction Modify

Direction Modify

Change here the stereographic projection for a direction or a list of directions.

To modify a direction, click over its graphic image, or write its identification (name and number) on the Direction entry. To modify a list of directions, press the button List (after creating the list of directions with Direction->Select). Parameters for empty entries or Local choices remain unchanged.

To change a direction name write the new name in the Direction entry, followed by the direction number (GAMGI needs the number to identify the direction). To change the name for a list of directions, press List first and then write the new common name in the Name entry.

Net

The projection net can be Wulff (Stereographic) or Schmidt (Equivalent). In the Wulff projection, the point to project (above) and the point of the sphere farther from the user (below) define a segment that intersects the circle at a point, giving the final representation.

In the Schmidt projection, the point to project (above) is rotated around the point of the sphere closer to the user (above), keeping the same XY direction, until both points have the same Z coordinate, and then divided by square root of 2, to be inside the circle with radius R at coordinate Z, giving the final representation.

Every family of crystallographic planes or directions can be described by the intersection of the plane or direction passing through the origin O with a sphere of radius R centered at O, defining a circumpherence or a point, respectively. These in turn can be projected on the circle parallel to the screen (constant Z coordinate) that divides the sphere in half, with radius R and origin O. In GAMGI, points in the half-sphere farther from the user are hidden, so only half-circumpherences and points above are visible.

Model

In both projections, a direction can always be represented by a Pole or a Trace. The intersection of the direction with the projection sphere is a point that projected gives the Pole representation. The intersection of the plane normal to the direction with the projection sphere is an arch that projected gives the Trace representation: a circumpherence arch in the Wulff projection and a 4th order conic arch in the Schmidt projection.

A plane can always be described by its normal vector, and a direction by its plane perpendicular, so both representations are valid for crystallographic planes and directions.

In a Wulff projection, angles between planes are given by the angles between the traces, so angles are preserved. This is not true for the Schmidt projection. The Wulff projection is mostly used in materials science.

In a Schmidt projection, minor circles on the sphere are distorted when projected but the areas are preserved. This is not true for the Wulff projection. The Schmidt projection is mostly used in structural geology.

gamgi-0.17.5/doc/interfaces/direction/modify_scope.html000066400000000000000000000177351433127522700231310ustar00rootroot00000000000000 GAMGI Interfaces: Direction Modify

Direction Modify

Set here the line representation and atomic structure for a single direction.

To modify a direction, click over its graphic image, or write its identification (name and number) on the Direction entry. To modify a list of directions, press the button List (after creating the list of directions with Direction->Select). Parameters for empty entries or Local choices remain unchanged.

To change a direction name write the new name in the Direction entry, followed by the direction number (GAMGI needs the number to identify the direction). To change the name for a list of directions, press List first and then write the new common name in the Name entry.

Structure

It is often useful to recreate in a direction the atomic structure existing in the parent object. A list is first created, with all the atoms closer to the direction than the distance defined by Thickness.

When Structure is set to Copy, listed atoms are copied to the atomic or crystallographic directions just created. When Structure is set to Link, listed atoms are linked to the atomic or crystallographic directions just created. When Structure is set to None, only a line representation of the direction is created, without atoms.

Filter

After collecting a list of atoms close enough to the direction, a filtering condition may be applied. This can be very useful to avoid atom superposition, resulting for example from atoms copied before to different directions.

When Filter is set to Class, atoms belonging to another directions are ignored. When Filter is set to Child, atoms not belonging directly to the direction parent are ignored. When Filter is set to Identical, atoms closer than a given distance (currently 1.0E-2, as defined in GAMGI_MATH_TOLERANCE_STRUCTURE) to a previous atom are ignored. When Filter is set to None, no filtering condition is applied.

Thickness

The line representation of the direction is expanded as much as possible, limited by the cell volume, in crystallographic directions, and by the atoms within a Thickness range of the direction defined by the two atoms, in atomic directions.

Node

A direction can be defined indicating explicitly the coordinates of a node where the direction passes. For each direction family, there is a direction passing through the origin node and as nodes are equivalent, it follows that for any node, there is a direction of any family passing through there.

By default, only the direction passing through the origin is represented, with node coordinates O1, O2, O3, O4, equal to 0, 0, 0 and 000, respectively.

O1, O2, O3

These entries provide the coordinates of the node in the lower-left corner of the cell where the direction passes, calculated with conventional or primitive cell vectors. When the lattice is primitive or vectors are primitive, this corner node becomes the place where the direction passes.

The vectors used for the node coordinates, Conventional or Primitive, are those used to define the plane indices, in the Type page, of the first dialog.

O4

When the lattice is centered and vectors are conventional, a fourth coordinate O4 is needed to point the centered node where the direction passes. By default, O4 is 000, so no change is introduced. When the cell lattice is primitive P or the vectors defining the node are primitive, that is the only possible value for O4. For I, C, F, R centered lattices, O4 can also take the values:
I: 111
C: 110
F: 110, 101, 011
R: 211, 122
corresponding to the numerators of the inner node coordinates, (1/2 1/2 1/2) for I lattices, (1/2 1/2 0) for C lattices, (0 1/2 1/2) (1/2 0 1/2) (1/2 1/2 0) for F lattices and (1/3 2/3 2/3) (2/3 1/3 1/3) for R lattices.

Range

A set of directions to create can also be defined automatically, with two plane families belonging to the direction zone axis. Defining a range for each plane family, the intersection of the two ranges of planes defines an infinite volume, aligned along the direction orientation. All directions of the family that fall inside this volume should be created. For directions [001], for example, the planes paralel, belonging to the direction axis, can be for example (100) and (010), as determined by the Weiss equation: hu + kv + lw = 0. For a cubic primitive lattice cP, a range (0 to 1) for planes (100) and a range (0 to 2) for planes (010) results in a volume containing 2x3 = 6 crystallographic directions [001]. To select a range of directions, press Range, to open a second level dialog.

Family

For each plane family, enter the indices h, k, l. Each set of indices must obbey the Weiss zone equation, when combined with the direction indices, otherwise an error is shown.

Each plane of a family (h k l) intersects the lattice in n/h n/k n/l, where n = 0 means the plane passing through the origin and n = 1 is the usual representation of the plane closest to the origin. The range of planes to consider is defined by the values entered near to the buttons Start and End, describing the initial and final values of n. For example, setting Start to -1 and End to 1 defines a range with 3 planes, intersecting the axes in: 1) -1/h -1/k -1/l; 2) 0; 3) 1/h 1/k 1/l.

Pressing the Start button, the entry is disabled and GAMGI considers automatically all the planes from the beginning of the cell volume to the final plane specified. Pressing the End button, the entry is disabled and GAMGI considers automatically all the planes from the end of the cell volume to the first plane specified. When both buttons are pressed, GAMGI considers automatically all the planes from the beginning to the end of the cell volume, so all directions inside the cell volume will be created.

After entering the plane ranges, pressing Ok saves the data, closes the second level dialog, and disables the node information in the first level dialog. Pressing Cancel, the current data in both dialogs is maintained and the second level dialog is closed.

Pressing Node in the first level dialog, removes the second level data, closes the second level dialog, enables and initializes (if empty) the node data.

The vectors used for the node coordinates, Conventional or Primitive, are those used to define the plane indices, in the Type page, of the first dialog.

When adding information in the second level dialog, the direction indices and the cell must have been entered before, so GAMGI can check if the information is correct. For the same reason, when Cell, u, v, w, or Vectors changed in the Type page, all the information in the second level dialog is automatically discarded, as it might be wrong.

gamgi-0.17.5/doc/interfaces/direction/modify_type.html000066400000000000000000000067531433127522700227770ustar00rootroot00000000000000 GAMGI Interfaces: Direction Modify

Direction Modify

Change here object and crystallographic data for a single direction or a list of directions.

To modify a direction, click over its graphic image, or write its identification (name and number) on the Direction entry. To modify a list of directions, press the button List (after creating the list of directions with Direction->Select). Parameters for empty entries or Local choices remain unchanged.

To change a direction name write the new name in the Direction entry, followed by the direction number (GAMGI needs the number to identify the direction). To change the name for a list of directions, press List first and then write the new common name in the Name entry.

Reference

GAMGI can handle crystallographic directions (selecting Cell), related with a cell containing the relevant crystallographic information, and atomic directions (selecting Atoms), defined by two non-coincident atoms.

For a single direction, Reference can be Cell, Atoms or Local. For a list of directions, Reference must be Local.

When Cell or Atoms is selected, the direction is recreated from scratch (as if using Direction->Create) and its old content is removed. As this requires local information for each direction, it cannot be done for a lists of directions. When Local is selected, previous features and contents are preserved, unless when specifically changed. Cell To create crystallographic directions, set Reference to Cell. GAMGI automatically shows a Cell entry, plus u, v, w entries to indicate the direction indices, plus a Vectors menu, to select the cell vectors to use, Conventional or Primitive. For the sake of simplicity, GAMGI does not accept 4-indice notation for planes or directions in hexagonal cells.

Pressing the mouse over a cell in the current layer, the cell identification is automatically written in the Cell entry. When a valid cell is found and its Type is Projection, the default Line page is automatically replaced by a Projection page.

By default, only one family of crystallographic directions is created. To create a set of families simultaneously, press the button Set (TODO). Atoms When Reference is set to Atoms, GAMGI automatically shows two Atom entries. Pressing the mouse sucessively over two non-colinear atoms in the current layer, the two entries become occupied and the direction defined. After pressing Ok, an error is shown if the atoms are coincident.

gamgi-0.17.5/doc/interfaces/direction/modify_view.html000066400000000000000000000037661433127522700227710ustar00rootroot00000000000000 GAMGI Interfaces: Direction Modify

Direction Modify

Change here the visual representation for a single direction or a list of directions.

To modify a direction, click over its graphic image, or write its identification (name and number) on the Direction entry. To modify a list of directions, press the button List (after creating the list of directions with Direction->Select). Parameters for empty entries or Local choices remain unchanged.

To change a direction name write the new name in the Direction entry, followed by the direction number (GAMGI needs the number to identify the direction). To change the name for a list of directions, press List first and then write the new common name in the Name entry.

R, G, B

The R, G, B entries define the direction color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).

Scale

The Scale factor can be used to change a direction size, including its child objects. Direction objects are scaled around the direction center.

The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

gamgi-0.17.5/doc/interfaces/direction/remove_object.html000066400000000000000000000035611433127522700232640ustar00rootroot00000000000000 GAMGI Interfaces: Direction Remove

Direction Remove

  • Object
Indicate how to remove a direction (or list of directions, previously selected with Direction->Select, when Global is pressed).

Scope

When the Scope is All, the direction and all its contents is removed. This is the default.

When the Scope is Container, the direction is removed but its contents (atoms, bonds, orbitals, texts) is saved, linked to the direction parent.

When the Scope is Contents, the direction is preserved but all its contents (atoms, bonds, orbitals, texts) is removed. Atomic directions are removed because they cannot live without the defining atoms.

When the Scope is atom, bond, orbital or text, these objects are removed from the direction. When an atom used to define an atomic direction is removed, the direction is automatically removed.

When the removed direction was part of the current object, the current layer becomes the new current object.

Clicking the mouse over a direction in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/direction/select_list.html000066400000000000000000000034411433127522700227500ustar00rootroot00000000000000 GAMGI Interfaces: Direction Select

Direction Select

  • List
Direction->Select selects an direction or a list of directions.

To select an direction click the mouse over its visual representation: if GAMGI recognizes the direction it becomes the new selected object, otherwise the mouse action is ignored.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

Only directions in the working layer can be selected, even if directions are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Direction->Select shows a flat list of all directions currently existent in GAMGI, not necessarily in the same layer or window. For each direction, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/file/000077500000000000000000000000001433127522700165055ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/file/export_filters.html000066400000000000000000000032761433127522700224540ustar00rootroot00000000000000 GAMGI Interfaces: File Export

File Export

Set here which folders and files should be hidden and shown.

Each entry can contain multiple patterns, separated by white spaces or commas, each one describing a set of files or folders that should be hidden or shown. The character * is a wild card representing any number of any characters, and can be used anywhere in a pattern.

For example, the sequence *abc def*ghi* contains two patterns, indicating all occurrences with either: 1) "abc" in the end; or 2) "def" in the beginning, followed by "ghi" anywhere.

First, all occurrences indicated in Hide are removed. From the remaining occurrences, only those indicated in Show are shown. By default, all occurrences are shown, so an empty Hide means remove nothing, and an empty Show means show everything.

Folders

By default Hide is set to .*, to hide all dot folders.

Files

By default Hide is set to .*, to hide all dot files.
gamgi-0.17.5/doc/interfaces/file/export_location.html000066400000000000000000000061151433127522700226070ustar00rootroot00000000000000 GAMGI Interfaces: File Export

File Export

Set here the complete address of the file to export.

Places

Choose here the directory (folder) to start searching. Initially the default is the Current working directory. When the dialog is reopen, Places always show the Last folder.

Folder

Single click on a folder name, to select that folder. Click on .. to go to the previous folder. The current folder is indicated by the Path label below.

File

Single click on a file name to transport its name to the File entry below. The complete filename is formed by the contents of the Path label plus the File entry. Currently the full file name must have less than 200 characters and the actual file name must have less than 50 characters.

After pressing Ok, a confirmation dialog is shown if the selected file already exists, to make it more difficult to overwrite a file by accident.

Currently GAMGI can export in the following formats: 1) native XML (extension .xml); 2) xyz (extension .xyz); 3) rasterized color postscript (extension .ps); 4) png (extension .png); 5) jpeg (extension .jpg or .jpeg); 6) tiff (extension (.tif or .tiff). GAMGI always uses the file extension to decide the file format, so for example a proper xyz file with an extension .xml will be parsed as a XML file and flagged down as an invalid file. When the filename has no extension, GAMGI assumes it is written in its native XML format.

To export to png, jpeg and tiff formats, the following programs must be installed: pnmtopng, pnmtojpeg and pnmtotiff.

GAMGI accepted formats are described in the documentation in Manuals->Formats and online on Help->Topic->Formats.

In XML format, the exported data is always the selected object. For example, to export the current layer, the current window or the current program (everything), just press twice the label Layer, Window or Gamgi respectively, in the top menu, with the mouse middle button.

GAMGI XML format is a vectorial format, so all information is preserved in the file, including non-default configuration data. Configuration data is always written in the beginning of the file, so it is already loaded when the object data is imported (a necessary step to guarantee that after importing the file the initial state is fully restored again).

gamgi-0.17.5/doc/interfaces/file/import_filters.html000066400000000000000000000032761433127522700224450ustar00rootroot00000000000000 GAMGI Interfaces: File Import

File Import

Set here which folders and files should be hidden and shown.

Each entry can contain multiple patterns, separated by white spaces or commas, each one describing a set of files or folders that should be hidden or shown. The character * is a wild card representing any number of any characters, and can be used anywhere in a pattern.

For example, the sequence *abc def*ghi* contains two patterns, indicating all occurrences with either: 1) "abc" in the end; or 2) "def" in the beginning, followed by "ghi" anywhere.

First, all occurrences indicated in Hide are removed. From the remaining occurrences, only those indicated in Show are shown. By default, all occurrences are shown, so an empty Hide means remove nothing, and an empty Show means show everything.

Folders

By default Hide is set to .*, to hide all dot folders.

Files

By default Hide is set to .*, to hide all dot files.
gamgi-0.17.5/doc/interfaces/file/import_location.html000066400000000000000000000055731433127522700226070ustar00rootroot00000000000000 GAMGI Interfaces: File Import

File Import

Set here the complete address of the file to import.

Places

Choose here the directory (folder) to start searching or the transfer protocol to import the file. Initially the default is the Current working directory. When the dialog is reopen, Places always show the Last folder, even if the last selected option was HTTP or FTP.

When the selected option is HTTP or FTP, the protocol is copied to the Path label below, and the full file name should be entered in the File entry. For example, selecting HTTP and writing www.gamgi.org/dat/molecule/silicates/q10.xml or seleting FTP and writing ftp.gamgi.org/gamgi/dat/molecule/silicates/q10.xml in both cases will import the silica monomer Si(OH)4.

Folder

Single click on a folder name, to select that folder. Click on .. to go to the previous folder. The current folder is indicated by the Path label below.

File

Single click on a file name to transport its name to the File entry below. The complete filename is formed by the contents of the Path label plus the File entry. Currently the full file name must have less than 200 characters and the actual file name must have less than 50 characters.

Currently GAMGI can import in the following formats: 1) native XML (extension .xml); 2) xyz (extension .xyz). GAMGI always uses the file extension to decide the file format, so for example a proper xyz file with an extension .xml will be parsed as a XML file and flagged down as an invalid file. When the filename has no extension, GAMGI assumes it is written in its native XML format.

GAMGI accepted formats are described in the documentation in Manuals->Formats and online on Help->Topic->Formats.

GAMGI XML format is a vectorial format, so all information is preserved in the file, including non-default configuration data. Configuration data is always written in the beginning of the file, so it is already loaded when the object data is imported (a necessary step to guarantee that after importing the file the initial state is fully restored again).

gamgi-0.17.5/doc/interfaces/gamgi/000077500000000000000000000000001433127522700166525ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/gamgi/about.html000066400000000000000000000022431433127522700206530ustar00rootroot00000000000000 GAMGI Interfaces: Gamgi About
Gamgi About
 
Gamgi->About provides generic information about the program.

This includes: 1) the GAMGI full name; 2) the GAMGI home site (this is the place to look for new releases, documentation, data files, and in general, all kinds of information regarding this project; 3) the GAMGI distribution license (this license is valid for all the C source code (documentation and script filters have different licenses). 4) the GAMGI version. 5) the code release date; 6) the main authors, including code, documentation and website.

gamgi-0.17.5/doc/interfaces/gamgi/config_color.html000066400000000000000000000032061433127522700222040ustar00rootroot00000000000000 GAMGI Interfaces: Gamgi Config

Gamgi Config

Define here the colors used to show large text messages, such as Help documentation and Object Measure reports.

Base

These r, g, b components set the background color. The default is the olive green color that Red Hat used for Emacs.

Text

These r, g, b components set the foreground color. The default is the light yellow color that Red Hat used for Emacs.

Title

These r, g, b components set the color used in titles, usually with a different, larger, font.

Bold

These r, g, b components set the color used to highlight contents, usually inside bold blocks.

Link

These r, g, b components set the color used to show contacts such as URL and E-mail addresses. Sometimes it is chosen also to highlight sub-titles.
gamgi-0.17.5/doc/interfaces/gamgi/config_precision.html000066400000000000000000000026271433127522700230670ustar00rootroot00000000000000 GAMGI Interfaces: Gamgi Config

Gamgi Config

Define here the number of decimal figures used to show the most important types of real data. This is not related with the precision used internally, which is always the maximum possible (double precision).

Digits

The number of decimal figures used to show Length, Angle, Mass and Charge real values is defined here. This includes everything related with these types of data, from atom radius to light position, from cell angles to rotation step.

Less important types of real data, such as light attenuation or color components, have default values, defined at compile time.

gamgi-0.17.5/doc/interfaces/gamgi/config_usability.html000066400000000000000000000045231433127522700230760ustar00rootroot00000000000000 GAMGI Interfaces: Gamgi Config

Gamgi Config

Define here the way users interact with the graphic interface.

Buttons

GAMGI expects to work with a 3-button mouse, where button 1 handles operations such as rotating and menu selection, button 2 handles operations such as moving and object selection, and button 3 handles operations such as scaling.

By default, these logical buttons point to the physical buttons left (1), middle (2) and right (3), respectively, but this can be changed, pointing logical buttons to different physical buttons. Two logical buttons cannot point to the same physical button.

This is particularly usefull for left-hand users and when handling a 2-button mouse, to link the most important tasks to the two buttons available.

Tolerance

When selecting objects with the mouse, the sampled area is defined by the pixel where the user clicked the mouse, plus a tolerance given by the number of neighbour shells that should be considered. Thus a tolerance of 0 means that only the chosen pixel should be considered, while a tolerance of 1 means that the 8 pixels around should also be taken into account.

Small tolerances demand precision when pointing to the object, but large tolerances make it too easy to select more than one object, in which case GAMGI considers the object selection unsucessfull.

Sound

To disable/enable the internal computer sound. This sound is used for example to signal that an object has been recognized. However, it might be irritating for other users in the same room.
gamgi-0.17.5/doc/interfaces/gamgi/exit.html000066400000000000000000000024611433127522700205140ustar00rootroot00000000000000 GAMGI Interfaces: Gamgi Exit
Gamgi Exit
 
Gamgi->Exit asks confirmation to close GAMGI.

Because this is a very sensitive operation, users are not allowed to perform any other task until answering the question (not even consulting the Help).

Pressing Ok, GAMGI closes all windows and exits, without further notice and without saving any data.

Pressing Ctrl C over any GAMGI window or over the launching xterm window works exactly as selecting Gamgi->Exit. Pressing the End key over any GAMGI window has the same effect.

When only one top window is open, selecting Window->Close has exactly the same effect as selecting Gamgi->Exit.

gamgi-0.17.5/doc/interfaces/gamgi/reset.html000066400000000000000000000024051433127522700206630ustar00rootroot00000000000000 GAMGI Interfaces: Gamgi Reset
Gamgi Reset
 
Gamgi->Reset asks confirmation to restart GAMGI.

Because this is a very sensitive operation, users are not allowed to perform any other task until answering the question (not even consulting the Help).

Pressing Ok, GAMGI removes all the objects, cleans the history archives, exits all the actions that were taking place and keeps only a single empty window, as in the beginning.

However GAMGI does not reset the configuration information, so for example, changes in atom default properties and bond length limits, introduced by the user, are still valid after Gamgi->Reset.

gamgi-0.17.5/doc/interfaces/graph/000077500000000000000000000000001433127522700166675ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/graph/select.html000066400000000000000000000012171433127522700210350ustar00rootroot00000000000000 GAMGI Interfaces: Graph Select
Graph Select
 
gamgi-0.17.5/doc/interfaces/group/000077500000000000000000000000001433127522700167225ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/group/coordination.html000066400000000000000000000014401433127522700222770ustar00rootroot00000000000000 GAMGI Interfaces: Group Create Polytope
Group Create Polytope
 
Building coordination polyhedra produces a polygonal representation, plus a report of topological and geometrical properties.
gamgi-0.17.5/doc/interfaces/group/copy_object.html000066400000000000000000000035231433127522700221130ustar00rootroot00000000000000 GAMGI Interfaces: Group Copy

Group Copy

Indicate here the number of group copies to create and its destination.

Gamgi expects users to identify first the group or list of groups to copy. When the Group entry is active and empty, clicking the mouse over an group, on the current layer (local selection), its identification is transported to the Group entry. Pressing the List button, the current list of groups is selected instead.

Name

This is the name given to the new group copies. The default is to copy the name of each original group.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the group or list of groups to copy, GAMGI expects users to identify a layer to where the groups should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of groups, the copies can also be created at the layer of each original group, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/group/copy_shift.html000066400000000000000000000024061433127522700217610ustar00rootroot00000000000000 GAMGI Interfaces: Group Copy

Group Copy

Set here the translation vector applied to each new group.

By default, each copied group has the same coordinates as the original group. This is expected when copying a group or a list of groups to a different layer. However, when each new group is in the same layer as the original group (for a list of groups, the Local option in the Layer menu), a small shift helps to separate the new groups from the original ones.

All other properties are the same for copied and original groups (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/group/create_polytope.html000066400000000000000000000062561433127522700230170ustar00rootroot00000000000000 GAMGI Interfaces: Group Create Polytope
Group Create Polytope
 
Selecting Polytope creates a coordination polyhedron around each central atom, plus a report of topological and geometrical properties.

Throughout the report, Minimum is the minimum value, Maximum is the maximum value, Average is the mean value and Deviation is the standard deviation, in the universe formed by the selected polyhedrons only.

Polyhedrons

Total number of polyhedrons. Polyhedrons are always External.

Faces

Total number of faces. Faces are always External.

Edges

Total number of edges. Edges are always External.

Vertices

Total number of vertices. Vertices are always External.

Polyhedron Faces

Number of faces per polyhedron. The minimum value is 4 (tetrahedron).

Polyhedron Edges

Number of edges per polyhedron. The minimum value is 6 (tetrahedron).

Polyhedron Vertices

Number of vertices per polyhedron. The minimum value is 4 (tetrahedron).

Face Vertices

Number of vertices per face. The minimum value is 3 (triangle).

Vertex Faces

Number of faces sharing a vertex. The minimum value is 3 (system corner).

Polyhedron Volumes

The volume for each polyhedron, obtained by summing the volumes of all its triangular piramids.

Polyhedron Areas

The area for each polyhedron, obtained by summing the areas of all its faces.

Polyhedron Lengths

The length for each polyhedron, obtained by summing the lengths of all its edges.

Polyhedron Aberrations

This is the Spherical Aberration, the ratio between the area of a polyhedron and the area of a sphere with the same volume. As a sphere is the 3D object with a smaller area/volume ratio, Spherical Aberration is always above 1.0.

Face Areas

The area for each face, obtained by summing the areas of all its triangles. Faces with an area smaller than a given tolerance (the Area tolerance in the Group->Measure dialog) are removed.

Face Lengths

The perimeter for each face, obtained by summing the lengths of all its edges.

Face Aberrations

This is the Circular Aberration, the ratio between the perimeter of a face and the perimeter of a circumpherence with the same area. As a circumpherence is the 2D object with a smaller perimeter/area ratio, Circular Aberration is always above 1.0.

Edge Lengths

The length for each edge.

Face Angles

The angle between adjacent faces (between 0 and 180 degrees).
gamgi-0.17.5/doc/interfaces/group/create_scope.html000066400000000000000000000073471433127522700222570ustar00rootroot00000000000000 GAMGI Interfaces: Group Create

Group Create

Set here the atomic structure to include, and the coordination neighbour atoms, for each coordination polytope.

Structure

It is often useful to recreate in a group the atomic structure existing in the parent object. For each coordination polyhedron, this includes all the atoms defining the polyhedron vertices, plus the central atom.

When Structure is set to Copy, atoms are copied to the groups just created. When Structure is set to Link, atoms are linked to the groups just created. When Structure is set to None, atoms are ignored.

Filter

After collecting a list of atoms close enough to the group, a filtering condition may be applied. This can be very useful to avoid atom superposition, resulting for example from atoms copied before to different groups.

When Filter is set to Class, atoms belonging to another groups are ignored. When Filter is set to Child, atoms not belonging directly to the group parent are ignored. When Filter is set to Identical, atoms closer than a given distance (currently 1.0E-2, as defined in GAMGI_MATH_TOLERANCE_STRUCTURE) to a previous atom are ignored. When Filter is set to None, no filtering condition is applied.

Visible

When the mix product of four vertices (defining a face and a new vertex), is larger than Visible the face is visible from the vertex and must be replaced. Increasing Visible may reduce face reconstruction, but may result in numerical inaccuracies. The whole calculation is very sensitive to this parameter, so it should be handled carefully. Currently the maximum allowed value is 1.0E-5.

For complex systems, where different faces have almost the same orientation, forming curved surfaces, setting Visible to 0 might eliminate numerical errors.

Coplanar

The initial triangle faces are merged when the mix product of four vertices (belonging to both faces) is smaller than Coplanar. Increasing Coplanar promotes face merging, but may result in numerical inaccuracies. Currently the maximum allowed value is 1.0E-1.

Setting Coplanar to 0 disables face merging, so all faces will be triangles.

Neighbours

Set here the neighbour atoms that should be considered around each central atom. The sampling universe is always the object currently selected. When the central atom does not belong to the current object, an error is shown.

Element defines the atomic element of the neighbours that should be considered. When Element is empty (the default), all atomic elements will be considered.

Users can set the number of closest neighbours that should be considered using Number, or the radius of the sphere around the central atom that should be sampled, using Radius. When these are empty (the default), all atoms in the sampling universe will be considered.

gamgi-0.17.5/doc/interfaces/group/create_type.html000066400000000000000000000053361433127522700221230ustar00rootroot00000000000000 GAMGI Interfaces: Group Create

Group Create

Chose here the group type: Container or Polytope.

Container

The primary purpose of a group container is to contain other objects. When a group container is created, it has no child objects and consequently no visual representation. The only way to select an empty group is thus to write its identification or to use the mechanisms provided by Group->Select.

To avoid this problem, when Ok is pressed and the new group is created, the dialog Group->Create is automatically replaced by Group->Link, with the new group identification already inscribed on it. How to link objects to a group is described in the section Group Link.

Polytope

For an arbitrary cloud of atoms, defined by Central and Neighbours settings, build a coordination polyhedron defined by the smallest convex polygonal representation that surrounds all the atoms. This is often used in Crystallography to build tetrahedra, octahedra, and other small regular solids, but the method can be used to build polyhedra for an arbitrary set of atoms, independently of their position or number.

When Gamgi cannot build a 3D polyhedron, automatically tries to build a 2D atomic plane, as in Plane->Create. When a 2D plane cannot be defined, automatically tries to build a 1D atomic direction, as in Direction->Create. When a 1D direction cannot be defined, an error is shown.

Central

Enter here the name and number of the central atom, around which the coordination polyhedron will be built. Pressing the mouse over an atom in the current layer, the atom identification is automatically written in the Central entry.

When Local is selected (the default), only one polyhedron is constructed, around the Central atom. When Global is set, Gamgi builds coordination polyhedra around all the atoms in the sampling universe with the same element as the Central atom.

gamgi-0.17.5/doc/interfaces/group/create_view.html000066400000000000000000000045531433127522700221140ustar00rootroot00000000000000 GAMGI Interfaces: Group Create

Group Create

Set here how the coordination polyhedra are shown.

Style

When the option Solid is choosen, each polyhedron is represented as a solid volume, that users can see from the outside or from the inside.

When the option Wired is choosen, only the face contours are shown, thus producing a more light representation.

Color

The Color button controls whether the polyhedra are represented with their own, independent color, or inherit it from the default color for the neighbour element, or, when this is undefined, from the current color of each central atom (not necessarily the default color for its element).

R, G, B

The R, G, B entries define the Polyhedron color: (0.0, 0.0, 0.0) is black and (1.0, 1.0, 1.0) is white. It is used to draw the lines in wired mode, and the solid faces in solid mode. In the last case, lines are drawn using the current layer background color, to get a good contrast and eliminate the need to define yet another color.

Scale

When polyhedrons are linked in Independent mode, the Scale factor can be used to change its size, including its child objects. Polytope group objects are scaled around its center.

When polyhedrons are linked in Automatic mode, only its parent objects can be scaled (thus changing the size of all its child objects, including the polyhedron), and the Scale entry is disabled.

The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

gamgi-0.17.5/doc/interfaces/group/geometry.html000066400000000000000000000033321433127522700214440ustar00rootroot00000000000000 GAMGI Interfaces: Group Measure Geometry
Group Measure Geometry
 
This report describes, for the selected structure, all the possible sequences for bond lengths, angles and torsions, presenting the results in increasing order of the atom elements. Geometric relations between non bonded atoms are ignored.

For each sequence it is reported the number of occurrences, the minimum and maximum values, the average value and the standard deviation (unless no valid occurrences were found).

Bond Length

The distance between Atom1 and Atom2.

Bond Angle

The valence angle between directions Atom2-Atom1 and Atom2-Atom3. The results are always presented with positive values.

When present, undefined bond angles (when at least two atoms are coincident) are reported for each angle sequence.

Bond Torsion

The torsion angle between two planes, defined by Atom1-Atom2-Atom3 and Atom2-Atom3-Atom4. The results are always presented with positive values.

When present, undefined bond torsions (when at least two atoms are coincident or three atoms are colinear) are reported for each torsion sequence.

gamgi-0.17.5/doc/interfaces/group/link_object.html000066400000000000000000000062511433127522700220770ustar00rootroot00000000000000 GAMGI Interfaces: Group Link

Group Link

Link a group or a list of groups to other objects.

Hierarchy

Groups can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by groups. Pressing the button Above, the same menu shows the classes of objects that can own groups: Layer (the default) and Group.

Object

Gamgi expects users to identify first the group or list of groups and then the object to link. When the Group entry is active and empty, clicking the mouse over a group, on the current layer (local selection), its identification is transported to the Group entry. Pressing the List button, the current list of groups is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

Method

Gamgi suppports only one method to link groups: Object.

The Object method links a group or a list of groups to a single object, Above or Below.

When linking an group and the Hierarchy is Above, the group is unlinked from its current parent and linked to the new object. When the group is moved to a different layer, its bonds are automatically removed. When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the group. An error is issued when the parent already owned the child object.

When the new child previously owned the new parent (a situation made possible because groups can own other groups), the new parent is first linked to the new child parent. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of groups Above, all groups in the list are unlinked and linked to the parent object. When linking a list of groups Below, the child object is replicated as many times as necessary to link each group in the list to a different replica.

gamgi-0.17.5/doc/interfaces/group/link_shift.html000066400000000000000000000032421433127522700217430ustar00rootroot00000000000000 GAMGI Interfaces: Group Link

Group Link

Set here the translation applied to the child object or list of objects.

When linking a group to another object, the translation is always applied to the child object: the group itself when linking above, the other object (group, plane, direction, atom, orbital, text) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of groups is linked above, Reference is set by default to Child, so groups preserve their positions and are not superposed.

When a list of groups is linked below, each group will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent groups and are not superposed.

gamgi-0.17.5/doc/interfaces/group/measure_symmetry.html000066400000000000000000000073441433127522700232320ustar00rootroot00000000000000 GAMGI Interfaces: Group Measure

Group Measure

Select here the parameters to measure the point symmetry.

Periodicity

When the No option is chosen (the default), all elements of symmetry are taken into account, and the chemical point group is determined. When the Yes option is chosen, all elements of symmetry related with rotations of order different from 6, 4, 3, 2 are ignored. The reported crystallographic point group is thus the maximum point symmetry that could be achieved in the center of this aggregate, if it was in a periodic crystal.

For example, a C5v chemical group becomes a Cs crystallographic point group because after discarding the C5 axis, only one of the five mirror planes can be considered as a true element of symmetry in a periodic system. A chemical Ih becomes a Th crystallographic group, because after discarding the C5 axes, the remaining planes and axes form five different sets of cubic Th symmetry, although only one can be considered at a time.

Everytime the chemical group is found, the crystallographic group can also be determined. Usually this crystallographic group is not unique. For example, a D12h chemical group can be either a D4h or a D6h crystallographic group. GAMGI shows the various crystallographic groups that cover all the possible operations of symmetry, in sequence, with their symmetry operations and symmetry elements. In particular, chemical C0v becomes C4v or C6v, chemical D0h becomes D4h or D6h and chemical Kh becomes D4h or D6h or Oh crystallographic groups respectively.

Tolerance

The elements of symmetry of a group depend entirely of the tolerance applied to the operations of symmetry. GAMGI uses the same tolerance for all operations: the maximum distance that is tolerated between initial and transformed coordinates.

GAMGI tries to find all the symmetry elements independently, and in general each of these elements requires a different tolerance. Thus, for a given tolerance, some elements may be recognized and others may go missing, resulting in an inconsistent set of symmetry elements. When this happens, the group is reported Undefined. The solution is to increase the tolerance (so valid elements might be found) or to decrease it (so fake elements might be discarded).

When the transformed coordinates for a given symmetry element are closer than the Initial tolerance, GAMGI attempts to optimize the symmetry element, to get transformed coordinates closer than the Final tolerance. When the transformed coordinates do not pass the Initial tolerance or when the optimization fails, the attempted element is discarded. When the transformed coordinates pass the Final tolerance, the element is accepted.

During optimization, GAMGI will never attempt to change the atoms, only the symmetry elements. To disable optimization, just set Initial equal to Final tolerance.

gamgi-0.17.5/doc/interfaces/group/measure_tolerance.html000066400000000000000000000026171433127522700233130ustar00rootroot00000000000000 GAMGI Interfaces: Group Measure

Group Measure

Select here the numerical tolerances used in the Voronoi tesselation. Changing significantly the default values may produce bad results.

Tolerance

When building the polyhedrons, if a plane cuts a vertex more than the Apex tolerance, this vertex is removed.

Faces that have an area smaller than the Area tolerance are ignored and its topological surroundings are merged.

Vertices that are closer than the Vertex tolerance are considered the same and its topological surroundings are merged.

gamgi-0.17.5/doc/interfaces/group/measure_type.html000066400000000000000000000044711433127522700223200ustar00rootroot00000000000000 GAMGI Interfaces: Group Measure

Group Measure

Chose the method of analysis: Geometry, Symmetry or Voronoi.

Geometry

This method measures all the bond lengths, angles and torsions in the structure, reporting for each quantity, the number of occurrences, the minimum and maximum values, the average value and the standard deviation. Geometric relations between non bonded atoms are ignored.

Undefined bond angles (when at least two atoms are coincident) are reported for each angle sequence. Undefined bond torsions (when at least two atoms are coincident or three atoms are colinear) are reported for each torsion sequence.

Symmetry

This method determines the point group of symmetry of the structure, either in the chemical context (infinite groups, all symmetry operations are allowed) or in the crystallographic context (32 groups, only 1, 2, 3, 4, 6 rotations and other operations compatible with lattice symmetry are allowed).

Voronoi

This method determines the Voronoi tesselation of the structure, shows the resulting polyhedra in a new layer, and reports a large list of its most important geometrical and topological properties.

This analysis can be made with planar bondaries (to close the outside polyhedra) or with full periodic boundary conditions, with equal weights for all atoms (the usual Voronoi tesselation) or with a different weight for each atom (given by its atomic radius, the so-called radical tesselation).

gamgi-0.17.5/doc/interfaces/group/measure_view.html000066400000000000000000000043601433127522700223060ustar00rootroot00000000000000 GAMGI Interfaces: Group Measure

Group Measure

Select here how the calculated Voronoi polyhedra are shown.

Borders

Selecting Faces, only the borders defining the external faces are shown, thus producing a relatively uncluttered volume representation.

Selecting All shows all the borders, including those inside the volume. This option is disabled when the button Faces is down, because in solid mode, internal borders cannot be seen from the outside and make it very difficult to analyze something from the inside.

Faces

When the button Faces is down, the tesselation is represented as a solid volume, that users can see from the outside or from the inside.

When the button Faces is up, the tesselation is represented as a wired volume.

Nodes

When the button Seeds is up, the atom seeds are visible, otherwise they are hidden.

Color

The Color button controls whether the tesselation is represented with its own, independent color, or inherits the colors of the atom seeds, for each polyhedron. When the button Faces is up, an independent color is necessary, because polyhedrons are then represented only by wired shared edges, which cannot inherit the color from both faces.

R, G, B

The R, G, B entries define the tesselation color: (0.0, 0.0, 0.0) is black and (1.0, 1.0, 1.0) is white.
gamgi-0.17.5/doc/interfaces/group/measure_voronoi.html000066400000000000000000000072071433127522700230320ustar00rootroot00000000000000 GAMGI Interfaces: Group Measure

Group Measure

Select here the main parameters controlling the Voronoi tesselation.

Boundaries

GAMGI supports two methods to handle the tesselation in the boundaries, Planar and Periodic.

The Planar method defines six outer planes, forming a closed space that includes all the seeds. Conceptually, this is equivalent to create six virtual seeds around each real seed, positioned in such a way that they define six planes at half-distance, common for all seeds, forming a closed background.

The Periodic method applies periodic boundary conditions, using the extended image convention, which means to create 26 virtual systems around the central system (as 26 boxes around the central one, in a 3x3x3 arrangement). The minimum image convention, often used in Molecular Mechanics simulations, is not suitable in Voronoi tesselation, because it considers only the nearest neighbours, while Voronoi tesselation requires all the 26 nearest neighbours.

The Offset parameter defines the border width between: 1) the seeds and the outer planes, in the Planar method; 2) the central system and the other 26 around, in the Periodic method.

Offset cannot be 0 in the Planar method, because virtual seeds would coincide with real seeds, producing an error. Offset can be 0 in the Periodic method, if real and virtual seeds do not coincide, otherwise an error is flagged. An error is also produced when two real seeds coincide (current tolerance: 1.0E-4).

Weights

By default, GAMGI calculates the normal Voronoi partition, so all atoms are given the same weight, corresponding to Variancy equal to zero. However GAMGI can partition the space giving different weights to different atoms (Radical Tesselation), according to their radius. In general, if d is the distance between seed 0 and neighbour 1, the plane between them passes at a distance d * fraction from the seed, where fraction is given by:

r0 = radius0 * variancy
r1 = radius1 * variancy
fraction = 1/2 [1 + (r0**2 - r1**2)/d**2]
When Variancy is 0, fraction is 1/2 (normal Voronoi), whereas when Variancy is 1, unscaled atomic radius are used to determine fraction. Variancy can vary continuously from 0 to a given limit, GAMGI_PHYS_VORONOI_VARIANCY, currently 10.0.

When Variancy is 0, the tesselation can always be obtained (as long as there are no atoms with essentially the same coordinates). When Variancy increases, the tesselation becomes progressively more restrictive. The atoms must be far enough from each other, particularly when the radius are quite different, otherwise the tesselation cannot be determined and and error is shown.

gamgi-0.17.5/doc/interfaces/group/modify_polytope.html000066400000000000000000000062561433127522700230430ustar00rootroot00000000000000 GAMGI Interfaces: Group Modify Polytope
Group Modify Polytope
 
Selecting Polytope creates a coordination polyhedron around each central atom, plus a report of topological and geometrical properties.

Throughout the report, Minimum is the minimum value, Maximum is the maximum value, Average is the mean value and Deviation is the standard deviation, in the universe formed by the selected polyhedrons only.

Polyhedrons

Total number of polyhedrons. Polyhedrons are always External.

Faces

Total number of faces. Faces are always External.

Edges

Total number of edges. Edges are always External.

Vertices

Total number of vertices. Vertices are always External.

Polyhedron Faces

Number of faces per polyhedron. The minimum value is 4 (tetrahedron).

Polyhedron Edges

Number of edges per polyhedron. The minimum value is 6 (tetrahedron).

Polyhedron Vertices

Number of vertices per polyhedron. The minimum value is 4 (tetrahedron).

Face Vertices

Number of vertices per face. The minimum value is 3 (triangle).

Vertex Faces

Number of faces sharing a vertex. The minimum value is 3 (system corner).

Polyhedron Volumes

The volume for each polyhedron, obtained by summing the volumes of all its triangular piramids.

Polyhedron Areas

The area for each polyhedron, obtained by summing the areas of all its faces.

Polyhedron Lengths

The length for each polyhedron, obtained by summing the lengths of all its edges.

Polyhedron Aberrations

This is the Spherical Aberration, the ratio between the area of a polyhedron and the area of a sphere with the same volume. As a sphere is the 3D object with a smaller area/volume ratio, Spherical Aberration is always above 1.0.

Face Areas

The area for each face, obtained by summing the areas of all its triangles. Faces with an area smaller than a given tolerance (the Area tolerance in the Group->Measure dialog) are removed.

Face Lengths

The perimeter for each face, obtained by summing the lengths of all its edges.

Face Aberrations

This is the Circular Aberration, the ratio between the perimeter of a face and the perimeter of a circumpherence with the same area. As a circumpherence is the 2D object with a smaller perimeter/area ratio, Circular Aberration is always above 1.0.

Edge Lengths

The length for each edge.

Face Angles

The angle between adjacent faces (between 0 and 180 degrees).
gamgi-0.17.5/doc/interfaces/group/modify_position.html000066400000000000000000000045301433127522700230250ustar00rootroot00000000000000 GAMGI Interfaces: Group Modify

Group Modify

Change here the position and orientation for a single group or a list of groups.

To modify a group, click over its graphic image, or write its identification (name and number) on the Group entry. To modify a list of groups, press the button List (after creating the list of groups with Group->Select). Parameters for empty entries or Local choices remain unchanged.

To change a group name write the new name in the Group entry, followed by the group number (GAMGI needs the number to identify the group). To change the name for a list of groups, press List first and then write the new common name in the Name entry.

Translation

The position of a group object can be changed using the X, Y, Z entries. The change can be Absolute or Relative (to the current position).

To go back to the initial position, set X, Y, Z, to 0, 0, 0, in Absolute mode.

Rotation

The orientation of a group object, defined by the Euler angles theta, phi, psi, can be changed using the E1, E2, E3 entries. The change can be Absolute or Relative (to the current orientation). Euler angles are not addictive, so the group is rotated back with the old angles and forward with the new ones.

To go back to the initial orientation, set E1, E2, E3, to 0, 0, 0, in Absolute mode.

gamgi-0.17.5/doc/interfaces/group/modify_scope.html000066400000000000000000000105531433127522700222740ustar00rootroot00000000000000 GAMGI Interfaces: Group Modify

Group Modify

Change here the polytope representation and atomic structure for a single group or a list of groups.

To modify a group, click over its graphic image, or write its identification (name and number) on the Group entry. To modify a list of groups, press the button List (after creating the list of groups with Group->Select). Parameters for empty entries or Local choices remain unchanged.

To change a group name write the new name in the Group entry, followed by the group number (GAMGI needs the number to identify the group). To change the name for a list of groups, press List first and then write the new common name in the Name entry.

Structure

It is often useful to recreate in a group the atomic structure existing in the parent object. For each coordination polyhedron, this includes all the atoms defining the polyhedron vertices, plus the central atom.

When Structure is set to Copy, atoms are copied to the groups just created. When Structure is set to Link, atoms are linked to the groups just created. When Structure is set to None, atoms are ignored.

Filter

After collecting a list of atoms close enough to the group, a filtering condition may be applied. This can be very useful to avoid atom superposition, resulting for example from atoms copied before to different groups.

When Filter is set to Class, atoms belonging to another groups are ignored. When Filter is set to Child, atoms not belonging directly to the group parent are ignored. When Filter is set to Identical, atoms closer than a given distance (currently 1.0E-2, as defined in GAMGI_MATH_TOLERANCE_STRUCTURE) to a previous atom are ignored. When Filter is set to None, no filtering condition is applied.

Visible

When the mix product of four vertices (defining a face and a new vertex), is larger than Visible the face is visible from the vertex and must be replaced. Increasing Visible may reduce face reconstruction, but may result in numerical inaccuracies. The whole calculation is very sensitive to this parameter, so it should be handled carefully. Currently the maximum allowed value is 1.0E-5.

For complex systems, where different faces have almost the same orientation, forming curved surfaces, setting Visible to 0 might eliminate numerical errors.

Coplanar

The initial triangle faces are merged when the mix product of four vertices (belonging to both faces) is smaller than Coplanar. Increasing Coplanar promotes face merging, but may result in numerical inaccuracies. Currently the maximum allowed value is 1.0E-1.

Setting Coplanar to 0 disables face merging, so all faces will be triangles.

Neighbours

Set here the neighbour atoms that should be considered around each central atom. The sampling universe is always the object currently selected. When the central atom does not belong to the current object, an error is shown.

Element defines the atomic element of the neighbours that should be considered. When Element is empty (the default), all atomic elements will be considered.

Users can set the number of closest neighbours that should be considered using Number, or the radius of the sphere around the central atom that should be sampled, using Radius. When these are empty (the default), all atoms in the sampling universe will be considered.

gamgi-0.17.5/doc/interfaces/group/modify_type.html000066400000000000000000000100741433127522700221420ustar00rootroot00000000000000 GAMGI Interfaces: Group Modify

Group Modify

Change here the reference object data for a single group only.

To modify a group, click over its graphic image, or write its identification (name and number) on the Group entry. To modify a list of groups, press the button List (after creating the list of groups with Group->Select). Parameters for empty entries or Local choices remain unchanged.

To change a group name write the new name in the Group entry, followed by the group number (GAMGI needs the number to identify the group). To change the name for a list of groups, press List first and then write the new common name in the Name entry.

Reference

GAMGI can handle groups that are just object containers (selecting Container), and coordination polyhedra, requiring a central atom (selecting Polytope).

For a single group, Reference can be Container, Polytope or Local. For a list of groups , Reference must be Local.

When Container or Polytope is selected, the group is recreated from scratch (as if using Group->Create) and its old content is removed. As this requires local information for each group, it cannot be done for a lists of groups. When Local is selected, previous features and contents are preserved, unless when specifically changed.

Container

The primary purpose of a group container is to contain other objects. When a group container is created, it has no child objects and consequently no visual representation. The only way to select an empty group is thus to write its identification or to use the mechanisms provided by Group->Select.

To avoid this problem, when Ok is pressed and the new group is created, the dialog Group->Create is automatically replaced by Group->Link, with the new group identification already inscribed on it. How to link objects to a group is described in the section Group Link.

Polytope

For an arbitrary cloud of atoms, defined by Central and Neighbours settings, build a coordination polyhedron defined by the smallest convex polygonal representation that surrounds all the atoms. This is often used in Crystallography to build tetrahedra, octahedra, and other small regular solids, but the method can be used to build polyhedra for an arbitrary set of atoms, independently of their position or number.

When Gamgi cannot build a 3D polyhedron, automatically tries to build a 2D atomic plane, as in Plane->Create. When a 2D plane cannot be defined, automatically tries to build a 1D atomic direction, as in Direction->Create. When a 1D direction cannot be defined, an error is shown.

Central

Enter here the name and number of the central atom, around which the coordination polyhedron will be built. Pressing the mouse over an atom in the current layer, the atom identification is automatically written in the Central entry.

When Local is selected (the default), only one polyhedron is constructed, around the Central atom. When Global is set, Gamgi builds coordination polyhedra around all the atoms in the sampling universe with the same element as the Central atom.

gamgi-0.17.5/doc/interfaces/group/modify_view.html000066400000000000000000000060251433127522700221340ustar00rootroot00000000000000 GAMGI Interfaces: Group Modify

Group Modify

Change here the visual representation for a single group or a list of groups.

To modify a group, click over its graphic image, or write its identification (name and number) on the Group entry. To modify a list of groups, press the button List (after creating the list of groups with Group->Select). Parameters for empty entries or Local choices remain unchanged.

To change a group name write the new name in the Group entry, followed by the group number (GAMGI needs the number to identify the group). To change the name for a list of groups, press List first and then write the new common name in the Name entry.

Style

When the option Solid is choosen, each polyhedron is represented as a solid volume, that users can see from the outside or from the inside.

When the option Wired is choosen, only the face contours are shown, thus producing a more light representation.

Color

The Color button controls whether the polyhedra are represented with their own, independent color, or inherit it from the default color for the neighbour element, or, when this is undefined, from the current color of each central atom (not necessarily the default color for its element).

R, G, B

The R, G, B entries define the Polyhedron color: (0.0, 0.0, 0.0) is black and (1.0, 1.0, 1.0) is white. It is used to draw the lines in wired mode, and the solid faces in solid mode. In the last case, lines are drawn using the current layer background color, to get a good contrast and eliminate the need to define yet another color.

Scale

When polyhedrons are linked in Independent mode, the Scale factor can be used to change its size, including its child objects. Polytope group objects are scaled around its center.

When polyhedrons are linked in Automatic mode, only its parent objects can be scaled (thus changing the size of all its child objects, including the polyhedron), and the Scale entry is disabled.

The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

gamgi-0.17.5/doc/interfaces/group/remove_object.html000066400000000000000000000033671433127522700224440ustar00rootroot00000000000000 GAMGI Interfaces: Group Remove

Group Remove

  • Object
Indicate how to remove a group (or list of groups, previously selected with Group->Select, when Global is pressed).

Scope

When the Scope is All, the group and all its contents is removed. This is the default.

When the Scope is Container, the group is removed but its contents (child groups, planes, directions, atoms, bonds, orbitals, texts) is saved, linked to the group parent.

When the Scope is Contents, the group is preserved but all its contents (groups, planes, directions, atoms, bonds, orbitals, texts) is removed.

When the Scope is group, plane, direction, atom, bond, orbital or text, these objects are removed from the group.

When the removed group was part of the current object, the current layer becomes the new current object.

Clicking the mouse over a group in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/group/select_list.html000066400000000000000000000041431433127522700221240ustar00rootroot00000000000000 GAMGI Interfaces: Group Select

Group Select

  • List
Group->Select selects a group or a list of groups.

To select an group click the mouse over its visual representation: if GAMGI recognizes the group it becomes the new selected object, otherwise the mouse action is ignored.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

An group is a recursive object, so it can contain for example another group, which in turn can contain an atom. Clicking over the atom is ambiguous: which group is the user trying to select? everytime this ambiguity occurs, a menu pops up showing the name and number of all the candidate groups, and if one is selected, it becomes the new selected object.

Only groups in the working layer can be selected, even if groups are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Group->Select shows a flat list of all groups currently existent in GAMGI, not necessarily in the same layer or window. For each group, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/group/symmetry.html000066400000000000000000000110531433127522700215010ustar00rootroot00000000000000 GAMGI Interfaces: Group Measure Symmetry
Group Measure Symmetry
 
This report describes, for the selected structure, the point group of symmetry, the symmetry operations and the symmetry elements. When Periodicity is set to Yes and various crystallographic point groups are possible, they are listed in sequence of increasing symmetry.

Point Group

The chemical or crystallographic point group of symmetry is reported here. When Periodicity is set to No (the default), the chemical group is shown, using the Schoenflies notation (or Undefined, if no point group can be determined).

Chemical groups for linear systems, with a rotation axis of infinite order, are named C0v and D0h. The spherical group, corresponding to a single atom, is named Kh.

When Periodicity is set to Yes, the group is named using first the International and then the Schoenflies notation (or Undefined, if no point group can be determined. In this case, rotation axes of order different from 6, 4, 3, 2 are discarded, all the other elements are shown).

Gamgi can find axes with any rotation order, so any chemical (infinite) or crystallographic (32) group of symmetry can be determined.

When users require the crystallographic point group, Gamgi determines first the chemical group and then applies the periodic restrictions to obtain the point group in a crystal with the highest possible symmetry. When more than one option is available, Gamgi shows the various solutions. For example, a C24 rotation axis in a molecule can be restricted to 6 or 4 axes in a periodic crystal.

Gamgi tries to find all the symmetry elements independently, and in general each of these elements requires a different tolerance. Thus, for a given tolerance, some elements may be recognized and others may go missing, resulting in an inconsistent set of symmetry elements. When this happens, the group is reported Undefined. The solution is to increase the tolerance (so valid elements might be found) or to decrease it (so fake elements might be discarded).

Symmetry Operations

The complete set of symmetry operations, generated from the symmetry elements found (forming a group, in the mathematical sense), is reported in abreviated format. For example, a C4 axis generates operations C41, C42 (equal to C21), C43 and C44 (equal to E), so only two C4 operations are new, described as 2C4.

In groups with infinite rotation orders, C0v and D0h, rotation operations are presented, as 2C0 and 2S0, symbolizing the two directions of rotation. In these cases, a single mirror plane m is considered (although they are infinite). For the Kh spherical group, a single rotation axis and plane are considered (although they are infinite).

Symmetry Elements

All symmetry elements that were found are individually reported here. The inversion center is described by its coordinates. Mirror planes are described indicating the corresponding normal vectors. For rotation axes, normal and improper, the rotation order is reported, plus the normal vector describing the axis, starting from the center.

For all symmetry elements, the error produced when applying the operations of symmetry, is reported (this error is smaller than the tolerance, otherwise the element would have been rejected).

Rotation axes are sorted according to increasing rotation order, so more symmetric axes come first. When present, infinite order axes are always the first in the list. Mirror planes and axes with the same rotation order are sorted according to decreasing element error, so better defined elements come first.

When present, a horizontal mirror plane is always listed before the other planes. When present, a C2 axis along the main direction is always listed before the other C2 axes.

gamgi-0.17.5/doc/interfaces/group/voronoi.html000066400000000000000000000136411433127522700213100ustar00rootroot00000000000000 GAMGI Interfaces: Group Measure Voronoi
Group Measure Voronoi
 
The Voronoi tesselation produces a polygonal representation, plus a report of topological and geometrical properties. For each atom there is a Voronoi polyhedron.

Throughout the report, Minimum is the minimum value, Maximum is the maximum value, Average is the mean value and Deviation is the standard deviation, in the universe formed by all the polyhedrons available.

Polyhedrons

Total number of polyhedrons. Polyhedrons with outer faces are considered External, all the others are Internal.

Faces

Total number of faces. Outer faces are considered External, all the others are Internal.

Edges

Total number of edges. Edges in outer faces are considered External, all the others are Internal.

Vertices

Total number of vertices. Vertices in outer faces are considered External, all the others are Internal.

Polyhedron Faces

Number of faces per polyhedron. The minimum value is 4 (tetrahedron).

Polyhedron Edges

Number of edges per polyhedron. The minimum value is 6 (tetrahedron).

Polyhedron Vertices

Number of vertices per polyhedron. The minimum value is 4 (tetrahedron).

Face Vertices

Number of vertices per face. The minimum value is 3 (triangle).

Edge polyhedrons

Number of polyhedrons sharing an edge. The minimum value is 1. (system edge).

Edge faces

Number of faces sharing an edge. The minimum value is 2. (system edge).

Vertex Polyhedrons

Number of polyhedrons sharing a vertex. The minimum value is 1 (system corner).

Vertex Faces

Number of faces sharing a vertex. The minimum value is 3 (system corner).

Vertex Edges

Number of edges sharing a vertex. The minimum value is 3 (system corner).

System Volume

Volume of the global system (including polyhedrons non-selected for analysis), obtained by: 1) limiting the volume with six outer planes (the Real value); 2) summing the volumes of all the polyhedrons (the Calculated value).

Comparing the two values provides a quantitative assertion of the global geometrical accuracy achieved with the Voronoi tesselation.

Polyhedron Volumes

The volume for each polyhedron, obtained by summing the volumes of all its triangular piramids.

Polyhedron Areas

The area for each polyhedron, obtained by summing the areas of all its faces.

Polyhedron Lengths

The length for each polyhedron, obtained by summing the lengths of all its edges.

System Anisotropy

For each polyhedron face, determine the following matrix, where n is the unit vector normal to the face:

q11 = n(1) * n(1) - 1/3
q12 = n(1) * n(2)
q13 = n(1) * n(3)
q21 = n(2) * n(1)
q22 = n(2) * n(2) - 1/3
q23 = n(2) * n(3)
q31 = n(3) * n(1)
q32 = n(3) * n(2)
q33 = n(3) * n(3) - 1/3
Then scale the matrix q by A/V**2/3, where A is the face area and V is the polyhedron volume. Finally sum for all polyhedron faces. The q matrix thus obtained describes the polyhedron matrix anisotropy.

To obtain the System Anisotropy, sum these matrices for all polyhedrons, multiplied by the corresponding polyhedron volume fractions. The trace of the resulting matrix must be zero.

The System Anisotropy is independent of the orientation of the system.

Polyhedron Anisotropy

To obtain a scalar Polyhedron Anisotropy, the following equation is applied:

q = sqrt { [q11**2 + q12**2 + q13**2 + q21**2 +
q22**2 + q23**2 + q31**2 + q32**2 + q33**2] / 9 }
For symmetrical solids such as the tetrahedron, the octahedron, the cube, the dodecahedron, or even the Kelvin 8+6 polyhedron, the scalar Polyhedron Anisotropy is always zero.

The scalar Polyhedron Anisotropy is independent of the orientation of the polyhedron.

Polyhedron Aberration

The ratio between the area of a polyhedron and the area of a sphere with the same volume. As a sphere is the 3D object with a smaller area/volume ratio, Spherical Aberration is always above 1.0.

Face Areas

The area for each face, obtained by summing the areas of all its triangles. Faces with an area smaller than a given tolerance (the Area tolerance in the Group->Measure dialog) are removed.

Face Lengths

The perimeter for each face, obtained by summing the lengths of all its edges.

Face Angles

The angle between adjacent faces (between 0 and 180 degrees).

Face Aberration

The ratio between the perimeter of a face and the perimeter of a circumpherence with the same area. As a circumpherence is the 2D object with a smaller perimeter/area ratio, Circular Aberration is always above 1.0.

Edge Lengths

The length for each edge. Edges with a length smaller than a given tolerance (the Vertex tolerance in the Group->Measure dialog) are removed.

Edge Angles

The angle between adjacent edges (between 0 and 180 degrees).

Seed Lengths

The distance between atom seeds. The minimum distance must be larger than a given tolerance (GAMGI_MATH_TOLERANCE_LENGTH, currently 1.0E-4), otherwise an error is flagged and the tesselation is canceled.
gamgi-0.17.5/doc/interfaces/help/000077500000000000000000000000001433127522700165165ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/help/config_agent.html000066400000000000000000000024051433127522700220300ustar00rootroot00000000000000 GAMGI Interfaces: Help Config

Help Config

Define here the prefered application to show the Help documentation files.

Agent

Indicates whether the Help documentation should be presented using GAMGI or an external browser. GAMGI is faster and needs less memory, but the browser provides a fancier presentation.

Browser

Sets the path to the prefered browser executable. This is needed only when Agent is set to Browser. It is equivalent to define the BROWSER environment variable, in ~/.bashrc:
BROWSER=/usr/bin/firefox; export BROWSER
gamgi-0.17.5/doc/interfaces/help/config_source.html000066400000000000000000000031311433127522700222270ustar00rootroot00000000000000 GAMGI Interfaces: Help Config

Help Config

Define here the prefered localization of the Help documentation files.

Source

Indicates whether the Help documentation should be fetched from the local computer or from a remote (HTTP or FTP) server. Importing the local documentation is faster, but the remote documentation might be more recent.

Local

Indicates the path to the local doc directory where the GAMGI documentation starts. It is needed only when Source is set to Local. It is equivalent to create the GAMGI environment variable, in ~/.bashrc:
GAMGI=/home/carlos/gamgi/gamgi/; export BROWSER

Remote

Indicates the path to the remote doc directory where the GAMGI documentation starts. It is needed only when Source is set to Remote. By default, it is http://www.gamgi.org/. Other option is ftp://ftp.gamgi.org/gamgi/.
gamgi-0.17.5/doc/interfaces/help/current.html000066400000000000000000000022141433127522700210650ustar00rootroot00000000000000 GAMGI Interfaces: Help Current
Help Current
 
Help->Current describes the task currently active.

Pressing Atom->Create and then Help->Current on the top menu, a window Help Atom Create pops up showing how to use the Atom Create dialog. Pressing then Cell->Modify and Help->Current, a window Help Cell Modify replaces the previous help window, showing how to handle the Cell Modify dialog.

Help->Current is conveniently set up as the first option in the Help menu.

gamgi-0.17.5/doc/interfaces/help/search.html000066400000000000000000000023651433127522700206570ustar00rootroot00000000000000 GAMGI Interfaces: Help Search
Help Search
 
Help->Search describes the meaning of a given keyword in GAMGI.

When Help->Search is selected, a small window appears where users are prompted to write a keyword. Pressing Ok, GAMGI tries to recognize the keyword, and when the search is sucessfull, a new help window pops up, providing information for the keyword, in the various contexts it is used in GAMGI.

GAMGI changes all characters to lowercase before searching, so case differences are ignored. Words in GAMGI interfaces should produce a valid search, although other keywords are archived and may be searched as well.

gamgi-0.17.5/doc/interfaces/help/start.html000066400000000000000000000034561433127522700205510ustar00rootroot00000000000000 GAMGI Interfaces: Help Start
Help Start
 
Help->Start provides the basic information to get started.

Help->Start may well be the first place where newbies look for help. For this reason, Help->Start is hard coded directly in GAMGI, so even if GAMGI cannot find the help files (because the GAMGI_HELP environment variable was not set or the Help files were not installed), at least this bit of information is guaranteed to be available.

First, it explains how to use the various Help tools available, Help->Current, Help->Topic, Help->Search and Help->Tutorial.

Then it explains how to set: 1) the GAMGI_HELP environment variable (pointing to the help documentation files); 2) the GAMGI_TEXT environment variable (pointing to the TrueType DejaVu fonts); 3) the BROWSER environment variable (pointing to the prefered browser).

General assistance on how and where to get further information about GAMGI is then provided. Links to local resources, usually installed together with the GAMGI code, and global resources, usually at http://www.gamgi.org/, are listed.

gamgi-0.17.5/doc/interfaces/help/tips.html000066400000000000000000000016601433127522700203660ustar00rootroot00000000000000 GAMGI Interfaces: Help Topic
Help Tips
 
Help->Tips describes valuable advices to avoid common problems using GAMGI. This list of tips is the result of many years of experience using GAMGI and might avoid irritating experiences and improve enoormously the quality of work, applying simple tricks and procedures, easy to learn.
gamgi-0.17.5/doc/interfaces/help/topic.html000066400000000000000000000034361433127522700205300ustar00rootroot00000000000000 GAMGI Interfaces: Help Topic
Help Topic
 
Help->Topic describes all topics in GAMGI, organized in a hierarchal tree.

The interfaces sub-tree describes GAMGI dialogs. The formats sub-tree describes GAMGI files. Clicking on the + symbol to the left of each node, a new list appears, showing the topics available for that item. Clicking on the - symbol to the left of a node reverses the process, closing up the list of options available.

Clicking on a node label selects that item (for example, Molecule, Measure or Symmetry). Pressing Ok launches a new window, describing that item. For example, clicking on Symmetry opens a window describing the report produced for the point group of symmetry.

Both the interfaces and formats sub-trees include an introduction to the subject. The objects and tasks in the interfaces sub-tree are ordered as they appear in the GAMGI main menu. The formats sub-tree describes Create and Config XML files, with the objects ordered as in the GAMGI main menu. Documentation formats and other accepted non-XML file formats are also listed.

gamgi-0.17.5/doc/interfaces/help/tutorial.html000066400000000000000000000030061433127522700212460ustar00rootroot00000000000000 GAMGI Interfaces: Help Tutorial
Help Tutorial
 
Help->Tutorial provides a guide, step by step, to selected tasks.

These tutorials show how to accomplish a wide range of actions covering most aspects of GAMGI, from simple tasks designed to get newbies started as quickly as possible, to more complex ones, showing less obvious yet powerfull aspects of GAMGI. The emphasis is not on the recipe itself, but on the rationale behind it.

For each tutorial, the number of pages and a descriptive title are shown, so users can predict the complexity and time needed to complete the task.

Clicking the mouse over a given tutorial row selects the tutorial. Pressing Ok after that opens a new window, describing in detail the procedure to follow. When this is too long, the whole procedure is divided in various pages and Back, Next buttons are provided to navigate back and forward.

gamgi-0.17.5/doc/interfaces/interfaces.html000066400000000000000000000050501433127522700205770ustar00rootroot00000000000000 GAMGI Interfaces
Graphic Interfaces
 
Throughout all interfaces and formats, lengths are in angstrom, angles in degrees and decimal numbers are represented with dots. Every parameter that can be defined in an interface can be defined also in a file and vice-versa.

To rotate, move, scale the selected object, dragg the mouse, pressing the left, middle, right mouse button. Export the selected object choosing File->Export. The statusbar shows the selected object (left) and layer (right).

To select an object, choose Object->Select and press over the object. Or choose the object class on the menu above, with the middle button, before pressing on the object. Or press twice Layer, Window or Gamgi on the menu above. When the object has no visual representation, press the mouse over the graphic area, to pop up a menu.

To select a layer, choose Layer->Select and press the mouse over the graphic area, to pop up a menu. Or choose the layer class on the menu above, with the middle button, before pressing the mouse over the graphic area, to pop up a menu.

Solid objects usually require lights with diffuse and specular components to be properly represented in 3D space, otherwise they look flat. Wired objects do not have a 3D representation, so diffuse and specular lights are not reflected, becoming poorly visible when using lights, unless a significant ambient component is used. Often it is worth to draw solid and wired objects in different layers, with and without lights.

When a task dialog is open, to learn how it works, just select Help->Current and another dialog will pop up, explaining the meaning of all the parameters in the task dialog.

Detailed explanations of Gamgi interfaces, are available at http://www.gamgi.org/interfaces/reference.html, doc/interfaces/reference.html or Help->Topic->Interfaces.

gamgi-0.17.5/doc/interfaces/introduction.html000066400000000000000000000037271433127522700212060ustar00rootroot00000000000000 GAMGI Interfaces: Introduction
Graphic Interfaces
 
This part of the manual explains the general principles governing the users interaction with GAMGI graphic interfaces. Ideally users should understand these principles, before consulting the Reference Manual, which aims to describe all the functionality available from GAMGI dialogs.

  1. 1. Introduction
  2. 2. Objects
  3. 3. Tasks
  4. 4. Windows
  5. 5. Starting
  6. 6. Identification
  7. 7. Selection
  8. 8. Mouse
  9. 9. Keyboard
  10. 10. Menus
  11. 11. Drawing
  12. 12. Tools
  13. 13. Commands
  14. 14. Status

Users are invited to subscribe and consult the archives of the users mailling list.

gamgi-0.17.5/doc/interfaces/introduction/000077500000000000000000000000001433127522700203075ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/introduction/commands.html000066400000000000000000000057631433127522700230110ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Commands
Introduction Commands
 
Using a mouse to perform all tasks is slow, inaccurate and restrictive, in a word, inefficient. Typing commands on a keyboard is a much faster and flexible way to pass information to a program. Unfortunately it requires users to learn a new, specific, command line language. Specifying a command line language has another important advantage, however, for a large program as GAMGI: it permits recording in a log file all operations specified by a user during a session. This file can be used later on to repeat all the operations performed by the user in the previous session, even when the user ignores the language used to describe those actions.

This scripting language was not designed yet (TODO), let alone implemented. We feel that after facing and handling the specific problems and challenges posed by the widely different objects supported by GAMGI we will be in a much better position to design an elegant and powerful language, simple to learn and simple to parse (or to use some already existing language that fills our needs).

These procedure-based files are an alternative to object-based files to save a session, in cases where the information needed to describe the procedures is much shorter than the information needed to describe the objects themselves. For example, storing a one line command describing this action: "create a sphere of radius 10.0, containing all nodes of a cubic simple lattice of parameter 1.0" is much shorter than allocating the x,y,z coordinates of the tens of thousands of nodes that fall inside that sphere.

As with other GAMGI native files, these log files should be XML-based (the format used to store the commands is independent of the language itself). Users can suppress or add new actions to this file, entirely off-line, just using a text editor. Users can even create new log files entirely from scratch and then use them to ask GAMGI to perform automatically a set of complex operations. Common, repetitive tasks, can be done automatically using log files.

Even a novice who did not grasp yet the language can take advantage of this mechanism, just by saving log files of previous sessions and reading them directly with a text editor: if the language is user-friendly, the user should be able to understand enough to modify some of the instructions and actually grasp their logic, learning by example.

gamgi-0.17.5/doc/interfaces/introduction/drawing.html000066400000000000000000000040341433127522700226310ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Drawing
Introduction Drawing
 
A window drawing area is the only graphic zone in GAMGI, where all the rendering takes place.

Although this drawing area is unique, it is logically formed as the superposition of unlimited layers, which are totally independent: they have independent lights, types of projection, viewing referentials, transparency properties, etc.

Each window has always a currently working layer, where objects are handled and action occurs. The objects in the current layer are always on top, and the viewport background color is always the color of the current layer.

Multiple side-by-side viewports, or superimposed lateraly filtered viewports, in a single drawing area, are currently not supported.

Dragging the mouse over the drawing area is an effective way to change the currently selected object: 1) pressing the left button rotates the object around its geometric center along the three x,y,z axes: dragging horizontally rotates the object along the vertical axis, dragging vertically rotates the object along the horizontal axis, and dragging along a circular arc far from the center rotates the object along the axis perpendicular to the screen; 2) pressing the center button moves the object in the dragging direction; 3) pressing the right button and dragging up and down scales the object up and down respectively. To change these defaults select Gamgi->Config.

gamgi-0.17.5/doc/interfaces/introduction/identification.html000066400000000000000000000046211433127522700241710ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Identification
Introduction Identification
 
Every object in GAMGI is identified by a name and a number.

Name

Names are used to allow users to identify the objects. Although GAMGI always checks them for correctness and consistency, names are not used internally, for identification purposes or others. Names are totally controlled by users: if they wish, GAMGI can generate default names for new objects, but only users can change names after that.

Names can have a maximum of 20 characters and each character can be a letter (a-z and A-Z), a number (0-9) or any of the following characters: ( ) [ ] { } < > _ . + -. Some of these characters are particularly usefull to name coordination compounds and charged species, for example,

Although names can start with any of these characters, it might be good practise to start names with a letter, for compatibility with other programs.

Number

Numbers are used to allow GAMGI to identify the objects. Objects of different classes may have the same number, but objects of the same class must have different numbers.

Numbers are totally controlled by GAMGI: they are generated, modified and removed by GAMGI, without any user intervention. Although numbers can be quite useful for users, its meaning is often unclear, due to the recycling mechanisms that GAMGI applies: i) numbers are recycled when objects are removed and may reappear later attached to new objects; ii) when recovering with undo/save techniques, new numbers will be attached to the recovered objects.

Any positive integer is a valid identification number. When recycled numbers are available, GAMGI reapplies them in the order they are listed. Otherwise, GAMGI applys new numbers in increasing order.

gamgi-0.17.5/doc/interfaces/introduction/introduction.html000066400000000000000000000031331433127522700237160ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Introduction
Introduction
 
The GAMGI philosophy is borrowed from Unix (each module should do one thing only and do it well; these modules should interact easily, so their combination can provide a enormous range of functionality) and Perl (a program should be designed to make the easy jobs easy, without making the hard jobs impossible). Implementing these concepts is, of course, much harder than to enunciate them, but a lot of thinking has been invested trying to find the best solutions, and we believe that with time we will be converging to them.

We aim to make the GAMGI interface as powerful and simple as possible. The expert should not be slowed down by mechanisms and tools which are useful only for the newbie. The novice should not be forced to learn complex concepts and techniques to accomplish even the simpler tasks.

The GAMGI window interface is divided in 5 distinct sections, from top to bottom: Menus, Drawing, Tools, Commands and Status.

gamgi-0.17.5/doc/interfaces/introduction/keyboard.html000066400000000000000000000041431433127522700227770ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Keyboard
Introduction Keyboard
 
GAMGI windows can be navigated using the keyboard: 1) pressing Tab or Down moves forward, to the next active widget (entry, menu, button, etc., but not label), while pressing Up moves backward to the previous widget. Pressing Enter when a button has focus, has the same effect as clicking the mouse over the button.

Users can enlarge the drawing area to full screen size by pressing Escape. Pressing the same key again restores the initial state.

When several GAMGI windows are open simultaneously, users can navigate through them by pressing Page Up and Page Down. This is particularly useful to navigate through multiple windows in full screen mode, when window manager decorations are no longer available.

To hide the menus section, for example to increase the space available for drawing, just press the F1 key. Pressing the same key again restores the initial state. To hide the tools section, just press the F2 key. Pressing the same key again restores the initial state. To hide the status and scripting sections, just press the F3 key. Pressing the same key again restores the initial state.

Pressing Ctrl C over any GAMGI window or over the launching xterm window works exactly as if Gamgi->Exit had been selected, showing the Gamgi Exit confirmation dialog. Pressing the End key over any GAMGI window has exactly the same effect.

gamgi-0.17.5/doc/interfaces/introduction/menus.html000066400000000000000000000045671433127522700223400ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Menus
Introduction Menus
 
The GAMGI main interface is divided in 5 distinct sections, from top to bottom: Menus, Drawing, Tools, Commands and Status.

Most GAMGI functionality is available through the object-oriented Menus. Each menu entry has the name of an object and is the entering point for all tasks related with that object. For the sake of consistency, even Help, File and Gamgi are regarded as objects. Objects are presented in hierarchical order, when performing a direct (counter-clockwise) rotation, from bottom left to top left.

Help objects are at the bottom of the hierarchy, because they have the responsibility of explaining all the other GAMGI objects. Help facilities in GAMGI are accessed through the Help menu only.

The 17 objects that provide all the real functionality in GAMGI come next, represented by menus with their names: Text, Orbital, Bond, Atom, Direction, Plane, Group, Molecule, Cluster, Cell, Arrow, Shape, Graph, Assembly, Light, Layer and Window.

Files comes next in the hierarchy, because they can include and describe all the previous objects. Input/output operations in GAMGI are accessed through the File menu only.

Finally, global aspects of GAMGI functionality are controlled through the Gamgi menu, which is therefore the highest object in the hierarchy.

To request a task related with any of these objects, press the mouse (left button) over the corresponding menu label in the window. This pops up a second menu allowing to choose which kind of task to accomplish: Current, Topic, Search, General, Tutorial, Remote, for Help; Create, Copy, Select, Link, Modify, Measure, Animate, Remove, for the 17 functional objects; Import, Export, for File; About, Reset, Exit, for Gamgi.

gamgi-0.17.5/doc/interfaces/introduction/mouse.html000066400000000000000000000110301433127522700223200ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Mouse
Introduction Mouse
 
A mouse is essential to select objects and to use GAMGI efficiently.

Object selection

Pressing, with the left button, one of the object labels on the top menu area, pops up a menu with all the available tasks for that object, which can subsequentially be selected with the mouse or with the keyboard.

Pressing a label in the main menu (above the window drawing area), with the middle button, means that the user is about to select an object of that class. If this class has a visual representation (atom, bond, molecule, cell, etc.), subsequently pressing the mouse over the visual representation of an object of this class results in the selection of the object.

If the selected class has no visual representation (light, layer, window, gamgi), or the visual representation is ambiguous, when it belongs to more than one object of the selected class (possible in recursive objects such as text, group, cluster, assembly), then a menu pops up, listing the possible objects, and allowing the selection of one, with the mouse or the keyboard.

A convenient short-cut to select the current layer, the current window and the current gamgi (everything), is to press twice over Layer, Window and Gamgi respectively, on the main menu.

Dragging and pressing

Dragging the mouse over the window drawing area changes the selected object when Axes is off and the layer referential when Axes is on: 1) pressing the left button rotates the object (referential) around its geometric center along the three X,Y,Z axes: dragging horizontally rotates along the vertical axis, dragging vertically rotates along the horizontal axis, and dragging along a circular arc far from the center rotates along the axis perpendicular to the screen; 2) pressing the center button moves the object (referential) in the dragging direction; 3) pressing the right button up and down scales the object (layer) up and down respectively.

This functionality is available even for objects without visual representation, as lights. Dragging and pressing the left button when a directional or spot light is selected, changes the light direction. Dragging and pressing the middle button for a positional light, changes the light position. Dragging and pressing the right button for a spot light, changes the light angle.

When a task window for a given object class is open (as Atom Create, Layer Modify or Bond Remove), GAMGI attempts to use any mouse pressing over the drawing area to recognize an object of the same class, using the criteria described above to select an object (with or without visual representation).

When an object is found, its information is usually transported to the task window (and in some cases automatically executed), but this object does not replace the current object, which always needs to be explicitly selected: the two picking modes are independent.

To select an atom, for example, when Molecule Measure is open, just press the middle button over the Atom label on the main menu and click the mouse over the atom visual representation. Clicking again over the same atom, this time GAMGI is not expecting an object selection, so the default picking mode is executed and the molecule owning the atom is measured.

Ruler handling

Pressing on Rotate, Move, or Scale (below the window drawing area) activates the positional ruler. This ruler is algebraic, centered around 0: for positive (counter-colockwise) changes, click on the right side of the ruler and for larger changes, click farther away from the ruler center.

Pressing again on rotate, move, or scale disables the ruler and its position returns to zero. Everytime an action is active, its label in the tool bar is highlighted, showing the default color again when disabled.

gamgi-0.17.5/doc/interfaces/introduction/objects.html000066400000000000000000000327031433127522700226330ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Objects
Introduction Objects
 
GAMGI supports the following objects: Text, Orbital, Bond, Atom, Direction, Plane, Group, Molecule, Cluster, Cell, Arrow, Shape, Graph, Assembly, Light, Layer and Window.

Layer, Assembly, Cluster, Molecule and Group objects are containers: their purpose is to contain other objects. Light objects are modifiers: their purpose is to modify how other objects look. Assembly, Cluster, Group and Text are recursive objects: they can own other objects of the same class.

Text

GAMGI supports both wired (stroked) and solid (extruded) 3D fonts. Stroked fonts are needed to show information (as measurements and object identification) on the screen, which needs to be three-dimensional because it will be linked to molecules and other three-dimensional objects. Stroked fonts are relatively simple, so characters can be drawn fast. Measurements and object identification must work in both manual and automatic modes. In the automatic mode, measurements of distances and angles must be recalculated and the results updated in the text objects in real time, while the user manipulates the objects.

Extruded fonts are designed to provide the highest possible visual quality to text objects. These fonts work well with lights and can be very complex, so they are much slower than the stroked fonts. Links for free libraries providing this kind of font support include Freetype, GLTT, OGLFT and GLE.

Text objects can own other text objects only, so they are recursive objects. This gives the user maximum flexibility to manipulate different text fragments separately and compose them to obtain the final result. Text objects can be owned by any other GAMGI object except lights and windows.

Orbital

Only the low-level engine infra-structure of orbital objects is implemented so far. The goal is to describe: 1) simple hydrogen-like orbitals, s, p, d, f, etc., and its hybridisations, sp, sp2, sp3, etc.; 2) complex representations of the electronic clouds surrounding the nucleus, commonly provided by combinations of Gaussian, Slater and plane wave analytic functions; 3) combinations of numerical functions usually described by spline line coefficients; 4) pseudo-potentials electronic descriptions.

The main difficulty with orbitals is to collect the data from files with completely different formats, provided by Gaussian, ADF, DSolid, Plana, etc. and build a common way to handle all this information. This problem must be correlated with the way GAMGI handles input/output data.

Orbitals can own text objects, so for example the name of the orbital can be attached to it.

Bond

GAMGI handles bonds between atoms as objects owned by these atoms. Each atom can have an unlimited number of bonds. Each bond must have two parent atoms. Bonds can own orbitals and texts.

Atom

Atoms are the most important objects in GAMGI. They can own orbitals, texts and are the only objects that can own bonds.

Direction

Direction objects were designed primarily to handle crystallographic directions but they should provide useful functionality even in the absence of 3D or 2D cells. The low-level engine infra-structure required to handle direction objects is fully implemented but everything else is not done yet.

Direction objects must handle 3- and 4- (for hexagonal lattices) crystallographic indices notations, and all the related crystallographic relations provided by direct- and reciprocal-lattice representations.

Users should be able to choose directions of atoms in cells, clusters or molecules, automatically producing direction objects reproducing those directions, including the atoms and its child, bonds, orbitals and texts, and then handle these new direction objects as totally independent viewing and building tools.

Direction objects can own atoms, orbitals and texts.

Plane

Plane objects were designed primarily to handle crystallographic planes but they should provide useful functionality even in the absence of 3D periodic objects (cells). Plane objects can own directions, atoms, orbitals and texts. The low-level engine infra-structure required to handle plane objects is fully implemented but everything else is not done yet.

Plane objects must handle Miller and Miller-Bravais indices and all the related crystallographic relations provided by direct- and reciprocal-lattice representations.

Users should be able to choose planes of atoms in cells, clusters or molecules, automatically producing plane objects reproducing those planes, including the atoms and its child, bonds, orbitals and texts, and then handle these new plane objects as totally independent viewing and building tools.

Group

Group is an object container designed to handle a fragment of a molecule, a residue of a protein, a mero of a polymer chain, or other chemical species. Group objects can own an unlimited number of other chemical species as groups, atoms, and related objects as texts, orbitals, directions and planes. A group is therefore a recursive object, with unlimited nested levels, and its properties should reflect the child chemical features. For example, an amino-acid has amino NH2 and carboxylic acid COOH groups, the later in turn contains an hydroxyl group OH.

Currently Group objects can be created only from XML files. Mechanisms to measure length, angle and torsion measurements in groups of atoms are already in place and tested. Algorithms and tools to modify length, angle and torsion values, in both open and cyclic structures have been implemented and fully tested. Everything else is not done yet.

Molecule

Molecule objects are essentially containers, objects whose primary purpose is to own other objects, as atoms and bonds. Molecules can own groups, planes, directions, atoms, orbitals and texts. Currently Group objects can be created only from XML files. Mechanisms to measure the point symmetry in molecules are already in place and tested. Everything else is not done yet.

Cluster

Cluster is an object container, designed to contain an unlimited number of chemical species as child objects, including other clusters, molecules, groups, atoms and related objects as texts, orbitals, directions and planes. A cluster is therefore a recursive object, with unlimited nested levels, and its properties should reflect the child chemical features.

Currently Cluster objects can be created only from XML files. Mechanisms to determine the Voronoi tesselation of a cluster are already in place and tested. Everything else is not done yet.

Cell

All the GAMGI functionality related with atomic structures with periodic boundary conditions is handled by cell objects. Crystalline structures can be created indicating either a crystalline lattice and a motif or a space group and an (TODO) asymmetric unit.

The 14 Bravais lattices can be represented by Conventional, Primitive and Wigner-Seitz cells, plus Rhombus and Sphere volumes. Users can choose the number of cells, the volume size, the cell positioning, the type of cell borders, solid or wired cell representations, and the cell color.

Any Cluster, Molecule, Group, Atom or even Orbital, Text object can be used as a valid motif to construct a periodic structure. GAMGI provides powerful yet simple pattern rules to indicate which lattice nodes should be filled, this way allowing users to create complex mixed structures that can be used to study liquids and other non-periodic systems. In particular, these pattern rules can be used to build 2D and 1D periodic and non-periodic structures.

Arrow

Arrow objects include different types of 2D and 3D arrows, which are not text objects but are very useful to prepare images containing atomic structures, graphs, text, etc., for presentations at seminars or school teaching, or for producing printed images for articles or books.

Arrow objects can own text objects (only). This is useful for example to add an equilibrium constant over a double arrow symbolising a chemical equilibrium.

The low-level engine infra-structure required to handle arrow objects is fully implemented but everything else is not done yet.

Shape

Shape objects describe backgrounds, boxes, circles, ellipses, diamonds, etc. designed to make an image for a presentation more clear and pretty. The aim is therefore to fill the gap between text and arrow objects. Shape objects can own text objects only. This is useful, for example to include a message in a box.

Nice functionality to have in GAMGI shape objects includes: 1) several styles should be provided for shape objects, including solid, contour, partially transparent, etc.; 2) mechanisms should be provided to allow users to choose and apply OpenGL textures, in 2D and 3D shape objects; 3) mechanisms should be provided to allow users to make textures, namely profile gradients, as in the GIMP.

The low-level engine infra-structure required to handle shape objects is fully implemented but everything else is not done yet.

Graph

Graph objects will be used to describe all sort of graphic information usually related with atomic structures, including for example radial distribution functions and electron density maps. In particular, graphs will be used to represent the copious amount of data often provided by ab-initio and molecular mechanics calculations. Graphs can own text objects only, which will be used for captions, titles, labels, etc.

The low-level engine infra-structure required to handle Graph objects is fully implemented but everything else is not done yet.

Assembly

Assembly is an object container, designed to be fully flexible. An assembly can own any GAMGI objects, including other assembly objects, except lights, layers and windows. An assembly object is therefore a recursive object, with unlimited nested levels. For example, an assembly can be used to associate a graph with a molecule and a cell, to manipulate all of them at once.

Currently Assembly objects can be created only from XML files. The graphic interfaces to properly link Assembly objects are not done yet.

Light

Everything related with lightning in GAMGI is handled by light objects. GAMGI lights implement all the functionality provided by the OpenGL specification. This includes directional, positional and spot lights, ambient, diffuse and specular light components, plus axial and radial light attenuations.

The maximum number of lights that each layer can own is fixed by the graphics library used with GAMGI. In Mesa this number is currently 8, the minimum required by the OpenGL specification. However, as the number of layers that each window can own is unlimited, the same is true for the total number of lights per image. Lights are the only objects in GAMGI that cannot own other objects.

Layer

GAMGI supports multiple, unlimited, layers for each window, allowing users to move and copy objects between different layers and see multiple layers simultaneously, if they wish. A layer can own all kinds of GAMGI objects, except bonds, windows and layers. In particular, layers are the only GAMGI objects that can own lights.

Most of the layer functionality is already in place, including perspective and orthographic projections, full control over projection and model view (like a photographic camera) parameters, inside and outside visibility, background color, plus undo and save history mechanisms to keep and recover the whole contents of each layer, for as many levels as previously defined.

Perspective projection is better to simulate realistic views but the orthographic projection (mostly used in architecture) is usually preferred for most work related with building and viewing structures, because these are not distorted by perspective. The projection parameters, that control the matrix transformations related with the projection of the 3D space on the screen, are fully controlled by the users.

Window

GAMGI supports multiple, unlimited, windows, and (TODO) users can easily move and copy objects between them. Each window in turn supports multiple, unlimited, layers, and (TODO) users can easily move and copy objects between them. Windows can own layer objects only, each one describing a completely independent graphic environment.

Window objects are truely independent: if GAMGI starts with window A and then window B is created, these windows have exactly the same priority, so removing window A will leave GAMGI running normally with window B.

The low-level engine infra-structure required to move and copy objects between windows is fully implemented but the high-level interfaces are not done yet.

gamgi-0.17.5/doc/interfaces/introduction/selection.html000066400000000000000000000106111433127522700231610ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Selection
Introduction Selection
 
Objects and (TODO) lists of objects can be selected using just the mouse and simple graphic techniques, described here. For more complex selections, involving combinations of graphic and algorithmic techniques (TODO), for each object class, please consult the corresponding Object Select section.

When rotating,moving,scaling (and Axes is off), only the currently selected object changes. When exporting to a file, only the currently selected object is exported. Learning how to select objects in GAMGI is thus crucial for users.

Single

To select an object, press the mouse middle button over the window main menu, on the corresponding object class. This tells GAMGI which class of object the user is about to select. Then press the mouse (any button) over the visual representation of the object. If the selection succeeds, a beep is emitted and the object identification is shown in the window status bar. If GAMGI finds no object, or more than one, in the sampled area, the mouse action is ignored. If two objects are one over the other, GAMGI chooses the object that is closer to the user. How to change the size of the sampled area, around the clicked spot, is described in Gamgi Config.

The visual representation of an object is defined in GAMGI by the object itself and by the objects that it contains. If an atom owns a text, the text is part of the atom visual representation, even if the text is very far from the atom. When selecting the atom with the mouse, it has exactly the same effect to click over the atom or over the text. Bonds are a special case, because they have two parents (the atoms), instead of a single one. In this case, each half bond contributes to the visual representation of the nearest atom. A bonded atom can be selected clicking over the atom or over its nearest half bonds. A bond can be selected clicking anywhere over the whole bond, including the objects it contains.

Objects that have no visual representation in the drawing area, lights, layers and windows, are selected as follows: after selecting the object class with the middle button, press the mouse anywhere over the drawing area: a menu pops up showing the identification of the various objects available for that class. If one is selected, a beep is emitted and the object identification is shown in the status area below.

Text, Group, Cluster and Assembly are recursive objects, in the sense that they can own or be owned by other objects of the same class. Therefore a combination of the two selection techniques described above is often required to distinguish these objects. If a group contains a group, which in turn contains an atom, clicking on the Group menu and then over the atom is ambigous: which group is the user trying to select? everytime this ambiguity occurs, a menu pops up showing the identification for the various candidate objects. If an option is selected, a beep is emitted and the object identification is shown in the status area below.

Clicking twice over the Layer, Window, or Gamgi menu, a beep is emitted and the selected object becomes the current layer, the current window or the current gamgi (everything), respectively. This short-cut is convenient to easily select the current layer and to export to a XML file everything in the current layer, in the current window or in the whole gamgi process.

If users position the mouse pointer over the File or Help menus and then press the middle button, nothing happens.

Multiple

To select a list of objects directly (TODO), without calling any Object Select dialog, first tell GAMGI the class of the objects that are going to be selected.

gamgi-0.17.5/doc/interfaces/introduction/starting.html000066400000000000000000000043451433127522700230360ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Starting
Introduction Starting
 
To launch GAMGI, just type gamgi on a shell window and press Return.

GAMGI can also be launched with an unlimited number of command line parameters, each one naming a GAMGI XML file, for example, gamgi file1.xml file2.xml. These files are automatically imported, in the order they were typed (file1.xml first, then file2.xml, etc.), exactly as if the files had been imported in the same sequence, one by one, after launching GAMGI, using File Import.

This is particularly useful to configure GAMGI automatically, immediately after it starts, by reading configuration information from a file. For example, adding the line alias gamgi='gamgi $HOME/gamgi/defaults.xml' to the file $HOME/.bashrc, prompts GAMGI to read $HOME/gamgi/defaults.xml everytime it starts, providing a simple, flexible way to initialize GAMGI with the user preferences indicated in defaults.xml. Launching GAMGI by typing gamgi data.xml will result in: 1) GAMGI starts; 2) GAMGI imports $HOME/gamgi/defaults.xml; 3) GAMGI imports data.xml.

GAMGI supports HTTP 1.0/1.1 and anonymous FTP (PASV) protocols (the most recent), so file.xml can be a local file, as /home/user/local_file.xml or ../directory/local_file.xml, or a remote file, such as http://website/remote_file.xml or ftp://ftp_server/pub/remote_file.xml.

When an error is found in a file, GAMGI shows a message describing the problem and ignores the file. The downstream files (not red yet), are also ignored.

gamgi-0.17.5/doc/interfaces/introduction/status.html000066400000000000000000000054411433127522700225240ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Status
Introduction Status
 
Each top window has a status bar at the bottom, providing information about the current working environment.

All the text information related with the GAMGI status that needs to be reported is shown in the status bar, except errors and warnings, which are reported directly on their own dialog windows, and (TODO) GAMGI actions, which will be appended to the current log file. In the normal configuration, the statusbar includes a status area on the left, a field showing the current object, a field showing the current layer, and finally a watch on the right.

When the tools ruler is active, the current translation length, rotation angle or scaling factor (depending on the selected action) is shown in the status area, in real time, so users know exactly which value will be applied before clicking the mouse.

When an object is selected, a beep is emitted and the status bar identifies the object, using the format object_name object_id, thus confirming the selection of that object. The object identification is initially shown in red (to highlight that the current object has changed), and after a few seconds in black (the permanent color).

When a layer is selected, a beep is emitted and the status bar identifies the layer, using the format object_name object_id, thus confirming the selection of that layer. The layer identification is initially shown in red (to highlight that the current layer has changed), and after a few seconds in black (the permanent color).

When a slow task is taking place, that requires the user to wait, a progress bar appears after the watch, moving forward and backward, until the task is completed, this way giving the user an hint that GAMGI did not stop and is working to finish the task. When the time needed for doing a task can be predicted exactly, the progress bar becomes a continuous bar that moves forward only, reaching the right end position when the task is completed. This method of showing progress is useful for example in multi-frame animations of Molecular Dynamics simulations and normal mode vibrations, where the number of frames is previously known.

gamgi-0.17.5/doc/interfaces/introduction/tasks.html000066400000000000000000000066721433127522700223350ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Tasks
Introduction Tasks
 
Every object in GAMGI can be created, selected, copied, linked, modified and removed. Several objects can be measured: Graph, Cell, Cluster, Molecule, Group, Plane and Direction. A few objects can be animated: Cell, Cluster and Molecule.

Create

These tasks are used to create new objects in GAMGI, usually one each time, though multiple bonds can be created simultaneously. These tasks allow users to specify all the properties available for each type of object. These properties can be later modified by calling the respective Modify task. In some circunstances, Copy and Link tasks can also create objects, but these are just clones of objects that exist already.

Select

These tasks are used to select a single object or a list of objects, choosen according to its properties, tree hierarchy, or scope. A list of selected objects is very useful because it can be used in other tasks as Copy, Modify and Remove, to copy, modify or remove a whole list of objects at once. The list currently selected can be used as the sampling scope for the next selection, so multiple selections can be sucessively applied, this way filtering down the list until reaching the desired object set.

Copy

Link

Modify

These tasks are used to modify a single object or a list of objects, previously selected with the Select task. Single objects can be selected just clicking over its visual representation. For objects that have no visual representation, as light, layer and window, a pop up menu will appear when clicking on the screen, allowing users to select just one object. For recursive objects, as text, group, cluster and assembly, where multiple choices are possible for the same visual representation, a pop up menu will appear when clicking on the screen, allowing users to select just one object. After selecting a single object with the mouse, its properties will appear in the Modify task window. When executing a task, empty entries and Local menus will remain unchanged, the others are modified.

Measure

Animate

Remove

These tasks are used to remove a single object or a list of objects, previously selected with the Select task. Single objects can be removed just clicking over its visual representation. For objects that have no visual representation, as light, layer and window, a pop up menu will appear when clicking on the screen, allowing users to select just one object, that is immediately removed. For recursive objects, as text, group, cluster and assembly, a pop up menu will appear when clicking on the screen, if multiple choices are possible for the same visual representation, allowing users to select just one object. Users can choose to remove the object itself (the container), its child (the contents) or both.
gamgi-0.17.5/doc/interfaces/introduction/tools.html000066400000000000000000000174101433127522700223400ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Tools
Introduction Tools
 
The Tools section - a menu and a ruler below the window drawing area - offers extra mechanisms to improve GAMGI functionality. Everytime an action is active, its label in the tool bar is highlighted, showing the default color again when disabled.

Axes

When rotating/moving, changes can be applied to the objects or to the referential. In GAMGI, by default, rotation/translation is applied to the objects (even when the selected object is a layer, in which case all layer objects are rotated/translated).

To rotate/translate the referential instead, just press the Axes button. To restore the initial mode, press Axes again. Changing the referential is equivalent to select Layer->Modify and change the layer parameters that define the observer position and orientation: Eye, Center and Up

Changing the referential has usually the opposite effect of changing the object, a confusing effect, even for experienced users: moving an object to the right has the same visual effect of moving the referential to the left. Moreover, changing the referential is usually a much more sensitive task than to change the objects: instead of changing an object some distance away, the eye position is directly changing. Using this mode with the ruler is thus probably more effective than dragging with the mouse, particularly when dragging along arcs far from the center, to rotate along the Z axis.

The (X,Y,Z) referential mentioned here is a set of 3 vectors pointing from the middle of the screen to: the right (X), the top (Y), the user (z). By default, the referential is positioned at (10, 0, 0) and the axes are orientated along (1,0,0) for X, (0,1,0) for Y and (0,0,1) for Z, but this is no longer the case when the layer referential is moved or rotated.

GAMGI supports 3 methods to rotate, move and scale:

1) Dragg the mouse over the drawing area. This is very intuitive and works very well with small- or medium-sized objects. However, it is not very precise, and is too slow for very large objects. Moreover, it is not possible to move along the Z axis and rotations around the Z-axis are less precise (though still intuitive).

2) Specify directly the rotation angles and translation vectors, using the Object Create and Object Modify dialogs. Although this is the most precise method, rotation and translation values must be introduced directly, which is usually very inconvenient unless the good values are known in advance.

3) After selecting the action in the tool bar: Rotate, Move or Scale, press the mouse over the positional ruler below, centered at 0, with larger negative changes at the far left and larger positive changes at the far right. Rotations/translations around/along the x,y,z axes are selected pressing the left,middle,right mouse buttons, respectively (scaling works with any button).

This method is more precise than the mouse dragging movements, without the need to introduce specific values for rotation, translation, scaling.

Rotate

To rotate, press Rotate and then click on the positive (counter-colockwise) or negative side of the ruler, with the left button (X rotation), the middle button (Y rotation) or the right button (Z rotation). The rotation angle for the current mouse position, over the ruler, is shown in real time in the window status bar. Currently rotations angles vary in the range [-30.0, +30.0].

Rotating is always applied to the currently selected object when Axes is off and to the current layer referential when it is on.

Move

To move, press Move and then click on the positive or negative side of the ruler, with the left button (X translation), the middle button (Y translation) or the right button (Z translation). The translation length for the current mouse position, over the ruler, is shown in real time in the window status bar. Currently translation lengths vary in the range [-10.0, +10.0].

Translating is always applied to the currently selected object when Axes is off and to the current layer referential when it is on.

Scale

To scale, press Scale and then click on the positive or negative side of the ruler, with any button mouse. The scaling factor for the current mouse position, over the ruler, is shown in real time in the window status bar. Currently scaling factors vary in the range [0.5, 2.0].

Scaling is always applied to the currently selected object when Axes is off and to the current layer when it is on.

Undo

For each layer, GAMGI maintains a list of old configurations, saved automatically, permiting users to undo any discontinuous action inside a layer. To change the number of saved configurations select Layer->Config.

Pressing Undo shows a dialog allowing users to navigate back and forward through a list of previously saved layers, plus the current one. Pressing Cancel restores the original layer and closes the dialog, pressing Ok turns the visible layer into the new current layer. In this case, the old current layer becomes the last saved layer, thus becoming the last to be removed and the first to appear when the user presses Undo again and inspects the saved layers.

Undo keeps automatically any discontinuous action occurring in a layer but ignores completely continuous actions. A discontinuous action occurs when a user presses Ok, clicks over the ruler to rotate, move, scale an object, or in general when a clear boundary can be defined between what existed before and after.

Continuous actions occur when objects are moved, rotated, scaled, directly with the mouse, as parameters are changing almost continuously. If continuous actions were saved with Undo, in a few seconds all Undo levels would be filled up with almost equal layers and old Undo layers would be removed forever, turning the Undo mechanism much less useful. Moreover, continuous actions would be slow, because GAMGI would be saving things all the time.

Save

The Save mechanism works exactly as the Undo mechanism, except that it is fully controlled by the user, who decides when a layer must be saved, while the Undo mechanism works without any user intervention. With the Save mechanism, users can save any layer exactly when they wish (in particular after any discontinuous action), and control when old layers are discarded, after exceeding the number of saved configurations.

To save a layer, just press Save and then Ok, this way adding the current layer to the list of saved configurations (this mechanism works also with Undo, but it is not as useful as here, because Undo layers are removed automatically, without user control, when the number of Undo levels is exceeded).

Although Save and Undo work exactly in the same way and complement each other, they use totally independent resources, even the number of Undo levels is independent of the number of Save levels.

gamgi-0.17.5/doc/interfaces/introduction/windows.html000066400000000000000000000125341433127522700226740ustar00rootroot00000000000000 GAMGI Interfaces: Introduction Windows
Introduction Windows
 
There are four different types of windows in GAMGI: 1) top windows; task windows; exclusive windows and help windows.

Top

Top windows are GAMGI main windows, when GAMGI starts a top window is created. Memory permiting, an unlimited number of these windows can be open simultaneously, and objects can be freely moved from a window to another. These windows are independent: if GAMGI starts with window A and then window B is created, these windows have exactly the same priority, so removing window A will leave GAMGI running normally with window B.

Task

Task windows are all the dialogs related with tasks selected from the main menu in top windows. Throughout GAMGI documentation task windows are named first by the object, then by the task, and if necessary by the specific topic, as in Molecule Measure Symmetry.

Task windows include input dialogs, such as Atom Create, where users enter information and output dialogs, as Cluster Measure Voronoi where analysis data is reported. Task windows also include the Help input windows, such as Help Topic, where users select the documentation they need.

Task windows do not require exclusive attention, and after opening a task window users can still use all the menus and facilities provided by the other windows.

For the sake of simplicity, only one task can be active at a given time in GAMGI, thus selecting Light->Modify after Atom->Create will close automatically the Atom Create window before opening the Light Modify window.

However, some tasks can open more than one window simultaneously, for example, selecting Atom->Create opens a first window and then selecting Table opens a second window. Selecting another task will automatically remove both windows. Removing the first window automatically removes the second. Removing the second window leaves the first unchanged.

When multiple top windows are open simultaneously, the task is executed in the window where the task was selected. Task windows are automatically removed when the corresponding top window is removed.

Exclusive

Exclusive windows are windows that require exclusive attention, because some sensitive operation is occurring, so users are not allowed to perform any other operation until handling properly this issue, not even consulting the Help.

There are three types of exclusive windows in GAMGI: message, confirmation and history. Message windows usually show an error or warning message and only expect users to click on a Cancel button to remove the window.

Confirmation windows usually prompts a question, asking users to confirm some sensitive task, as in Gamgi Reset and Gamgi Exit. Users can confirm the task, pressing the Ok button, or cancel it, pressing the Cancel button (always the default option).

History windows are used to handle Undo and Save tools, and must be exclusive because GAMGI is in a fragile state when navigating through old configurations.

Help

Windows showing GAMGI documentation are help windows, including Help Start. However, windows to select the documentation, such as Help Search, are task windows.

Help windows are independent from task windows: they can be open simultaneously, without interference. For example, a user may be reading Help Bond Create while Atom Create is open. However, GAMGI knows which task is active, so selecting Help Current the current help window is replaced by Help Atom Create.

Help windows do not require exclusive attention, and after opening a help window users can still use all the menus and facilities provided by the other windows.

For the sake of simplicity, only one help window can be active at a given time in GAMGI, thus selecting Help->Current when Atom Create is open, will close automatically any previous help window before opening Help Atom Create.

However, more than one window related with the Help system can be open simultaneously. For example, selecting Help->Topic opens a task window and then selecting a topic opens a help window. Selecting another help topic automatically removes the help window before showing the one. Removing the task window does not remove the help window.

Help windows do not produce active actions (even tutorial help windows only tell users what to do), so they are not attached to a particular top window. When several top windows are open simultaneously and one is removed, help windows are not affected, even if this was the top window used to call the help window.

gamgi-0.17.5/doc/interfaces/layer/000077500000000000000000000000001433127522700167025ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/layer/config_history.html000066400000000000000000000055231433127522700226230ustar00rootroot00000000000000 GAMGI Interfaces: Layer Config

Layer Config

Define here the maximum number of old states that can be saved for each layer.

Undo, Save

Set the maximum number of old states that can be saved in memory, using the Undo and Save mechanisms. Everytime this number is exceeded, the oldest state is discarded forever.

For each layer, GAMGI maintains a list of old states saved automatically when a discontinuous action takes place, that can be recovered with the Undo mechanism.

A discontinuous action occurs when a user presses Ok, clicks over the ruler to rotate, move, scale an object, or in general when a clear boundary can be defined between what existed before and after.

Continuous actions occur when objects are moved, rotated, scaled, directly with the mouse, as parameters are changing almost continuously. If continuous actions were saved with Undo, in a few seconds all Undo levels would be filled up with almost equal states and old Undo states would be removed forever, turning the Undo mechanism much less useful. Moreover, continuous actions would be slow, because GAMGI would be saving things all the time.

The Save mechanism works exactly as the Undo mechanism, except that it is fully controlled by the user, who decides when a layer should be saved, while the Undo mechanism works without any user intervention. With the Save mechanism, users can save any layer exactly when they wish (in particular after any discontinuous action), and control when old states are discarded, after exceeding the number of Save levels.

The maximum number of Undo and Save levels does not affect performance but the memory required to keep old states, for each layer, for each window, can be significant, particularly for Undo, where old states are saved automatically. Therefore the maximum number of levels should be kept to relatively low values.

Although Save and Undo work exactly in the same way and complement each other, they use totally independent resources.

gamgi-0.17.5/doc/interfaces/layer/config_position.html000066400000000000000000000046761433127522700227760ustar00rootroot00000000000000 GAMGI Interfaces: Layer Config

Layer Config

Define here the region of space to where the user is looking by default when creating a new layer.

Initially, the user is at (0, 0, +z), looking down to (0, 0, 0), and the up direction is (0, 1, 0), so the x axis points to the right, the y axis points to the top, and the z axis points to the user.

Eye

Set the user position, that is applied by default, when creating a new layer. Any position in 3D space is valid.

Center

Set the position to where the user is looking, that is applied by default, when creating a new layer. The distance from Eye to Center must be within the limits of visibility (from Near to Far).

Up

Set the direction pointing up, to the top of the screen, that is applied by default, when creating a new layer. This direction is converted internally to a unit vector normal to the direction Eye -> Center, so any non-zero vector that is not parallel to that direction is valid.

The user position and orientation can be defined by a (X,Y,Z) layer referential, pointing from the middle of the screen to: the right (X), the top (Y), the user (Z). Eye is the origin, Eye <- Center defines the Z axis, and Up the Y axis, permiting to get the X axis by the cross product of the other two axes. Initially, the axes are orientated along (1,0,0) for X, (0,1,0) for Y and (0,0,1) for Z, but this is no longer the case when the layer referential is rotated.

Each layer has its own position parameters, so in a window with multiple visible layers, the image rendered in the graphic area is the superposition of the various, totally independent, layer views.

gamgi-0.17.5/doc/interfaces/layer/config_projection.html000066400000000000000000000051461433127522700232770ustar00rootroot00000000000000 GAMGI Interfaces: Layer Config

Layer Config

Define here the projection parameters applied by default when creating a new layer.

Perspective, Orthographic

Set the projection that is applied by default when creating a new layer. GAMGI projects the 3D layer space on the 2D screen using Perspective or Orthographic projections. The Perspective projection is better to simulate realistic views, but the Orthographic projection preserves object dimensions, as these are not distorted by perspective.

Near, Far, Top

Set the dimensions of the space volume that by default is visible to the observer, after being projected into the window graphic area.

This projection volume has six faces, and the front and back faces are always perpendicular to the viewing direction. Near and Far set the default distances from the observer to these front and back faces, corresponding to the minimum and maximum distances that the observer can see. Near must be smaller than Far.

In a Orthographic projection, the projection volume is a rectangular parallelepiped, so the 4 lateral faces are paralell and perpendicular to each other. In a Perspective projection, the projection volume is a truncated quandrangular pyramid, with the apex at the view point.

Top defines the half-height of the front face of the projection volume. The width is automatically determined from the ratio height / width of the window graphic area, so everytime users resize this window, the projection volume changes accordingly. Increasing Top increases the visible volume and decreases the size of the objects.

Each layer has its own projection parameters, so in a window with multiple visible layers, the image rendered in the graphic area is the superposition of the various, totally independent, layer views.

gamgi-0.17.5/doc/interfaces/layer/copy_object.html000066400000000000000000000036221433127522700220730ustar00rootroot00000000000000 GAMGI Interfaces: Layer Copy

Layer Copy

Indicate here the number of layer copies to create and its destination.

Gamgi expects users to identify first the layer or list of layers to copy. When the Layer entry is active and empty, clicking the mouse over the window graphic area creates a menu with all the window layers (local selection), which can then be selected. The current layer is initially proposed in the Layer entry. Pressing the List button, the current list of layers is selected instead.

Name

This is the name given to the new layer copies. The default is to copy the name of each original layer.

Number

This is the requested number of copies, a positive integer. The default is 1.

Window

After identifying the layer or list of layers to copy, GAMGI expects users to identify a window to where the layers should be copied. Pressing the mouse over a graphic area in any window (global selection), creates a menu with all the top windows, which can then be selected. The current window is initially proposed in the Window entry.

When copying a list of layers, the copies can also be created at the window of each original layer, by setting Window to Local.

gamgi-0.17.5/doc/interfaces/layer/copy_shift.html000066400000000000000000000024671433127522700217500ustar00rootroot00000000000000 GAMGI Interfaces: Layer Copy

Layer Copy

Set here the translation vector applied to the objects in each new layer.

By default, the objects in each copied layer have the same coordinates as in the original layer. This is expected when copying a layer or list of layers to a different window. However, when each new layer is in the same window as the original layer (for a list of layers, the Local option in the Window menu), a small shift helps to separate the objects in the new layers from the original ones.

All other properties are the same for copied and original layers (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/layer/create_position.html000066400000000000000000000052021433127522700227560ustar00rootroot00000000000000 GAMGI Interfaces: Layer Create

Layer Create

Define here the region of layer space to where the user is looking.

Eye

Set the user position, in the layer space. Any position in 3D space is valid. Initially, the user is at (0, 0, +z), looking down to (0, 0, 0), and the up direction is (0, 1, 0), so the x axis points to the right, the y axis points to the top, and the z axis points to the user.

Center

Set the position to where the user is looking. The distance from Eye to Center must be within the limits of visibility (from Near to Far).

Up

Set the direction in layer space that points up, to the top of the screen. This direction is converted internally to a unit vector normal to the direction Eye -> Center, so any non-zero vector that is not parallel to that direction is valid.

The user position and orientation can be defined by a (X,Y,Z) layer referential, pointing from the middle of the screen to: the right (X), the top (Y), the user (Z). Eye is the origin, Eye <- Center defines the Z axis, and Up the Y axis, permiting to get the X axis by the cross product of the other two axes. Initially, the axes are orientated along (1,0,0) for X, (0,1,0) for Y and (0,0,1) for Z, but this is no longer the case when the layer referential is rotated.

To move the user around the objects, Eye, Center and Up must change. A simple, interactive way to do this is to press Axes in the window toolbar and then either drag the mouse or use the ruler, as described in Introduction Mouse and Introduction Tools.

Each layer has its own position parameters, so in a window with multiple visible layers, the image rendered in the graphic area is the superposition of the various, totally independent, layer views.

gamgi-0.17.5/doc/interfaces/layer/create_projection.html000066400000000000000000000051561433127522700232760ustar00rootroot00000000000000 GAMGI Interfaces: Layer Create

Layer Create

Define here the projection parameters of the layer.

Perspective, Orthographic

Set the type of projection of the new layer. GAMGI projects the 3D space on the 2D screen using Perspective or Orthographic projections. The Perspective projection is better to simulate realistic views and gives users a depth feedback, but the Orthographic projection preserves object dimensions, as these are not distorted by perspective.

Near, Far, Top

Set the dimensions of the space volume that is visible to the observer, after being projected into the window graphic area. This volume has six faces, and the front and back faces are always perpendicular to the viewing direction. Near and Far parameters set the distance from the view point to these front and back faces, respectively, corresponding to the minimum and maximum distances that the observer can see. Near must be smaller than Far.

In a Orthographic projection, the projection volume is a rectangular parallelepiped, so the 4 lateral faces are paralell and perpendicular to each other. In a Perspective projection, the projection volume is a truncated quandrangular pyramid, with the apex at the view point.

Top defines the half-height of the front face of the projection volume. The width is automatically determined from the ratio height / width of the window graphic area, so everytime users resize this window, the projection volume changes accordingly. Increasing Top increases the visible volume and decreases the size of the objects.

Each layer has its own projection parameters, so in a window with multiple visible layers, the image rendered in the graphic area is the superposition of the various, totally independent, layer views.

gamgi-0.17.5/doc/interfaces/layer/create_view.html000066400000000000000000000032271433127522700220710ustar00rootroot00000000000000 GAMGI Interfaces: Layer Create

Layer Create

Define here the layer visual aspect.

R, G, B

The R, G, B entries define the color of the layer background, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0). When multiple layers are visible, GAMGI always shows the background color of the current layer.

Axes

To show the layer referential axes, set the Axes option to Yes. The three axes use the rgb color scheme: red for the first axis, green for the second and blue for the third.

Scale

Change the size of everything contained in the layer, except lights. Layer objects are scaled around the layer center, defined by the Center parameter.

The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

gamgi-0.17.5/doc/interfaces/layer/create_visibility.html000066400000000000000000000033471433127522700233110ustar00rootroot00000000000000 GAMGI Interfaces: Layer Create

Layer Create

Define here the layer visibility to the outside and to the inside.

Visibility

The Out and In parameters control the visibility to the outside and to the inside of the various layers in a window.

The visibility Out parameters are used only by the current layer, to control how to attempt to see the other layers: 1) All (try to see completely the other layers); 2) Partial (try to see the other layers in a blurred way, to distinguish them from the current layer); 3) None (do not see the other layers).

The visibility In parameters are used only by non current layers, to control how the current layer is allowed to look inside them: 1) All (the layer can be seen clearly); 2) Partial (the layer can be seen in a blurred way, to distinguish it from the current layer); 3) None (the layer cannot be seen from the outside).

gamgi-0.17.5/doc/interfaces/layer/link_object.html000066400000000000000000000057001433127522700220550ustar00rootroot00000000000000 GAMGI Interfaces: Layer Link

Layer Link

Link a layer or a list of layers to other objects.

Hierarchy

Layers can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by layers. Pressing the button Above, the same menu shows Window, the only class of objects that can own layers.

Gamgi expects users to identify first the layer or list of layers to link. When the Layer entry is active and empty, clicking the mouse over the window graphic area creates a menu with all the window layers (local selection), which can then be selected. The current layer is initially proposed in the Layer entry. Pressing the List button, the current list of layers is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection). To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as windows and lights, press the mouse over a window graphic area, to create a menu with all the objects of that class, which can then be selected.

Method

Gamgi suppports only one method to link layers: Object.

The Object method links a layer or a list of layers to a single object, Above or Below.

When linking a layer and the Hierarchy is Above, the layer is unlinked from its current window and linked to the new one. The layer history kept by the Undo and Save mechanisms is preserved in this operation.

When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the layer. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of layers Above, all layers in the list are unlinked and linked to the parent window. When linking a list of layers Below, the child object is replicated as many times as necessary to link each layer in the list to a different replica.

gamgi-0.17.5/doc/interfaces/layer/link_shift.html000066400000000000000000000033171433127522700217260ustar00rootroot00000000000000 GAMGI Interfaces: Layer Link

Layer Link

Set here the translation applied to the child object or list of objects.

When linking a layer to another object, the translation is always applied to the child object: the layer itself when linking above, the other object (light, assembly, graph, sjape, arrow, cell, cluster, molecule, group, plane, direction, atom, orbital, text) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of layers is linked above, Reference is set by default to Child, so layers preserve their object positions.

When a list of layers is linked below, each layer will be linked to a new, automatically created, child object, and Reference is set by default to Child, so the new objects have the same positions of the original ones.

gamgi-0.17.5/doc/interfaces/layer/modify_position.html000066400000000000000000000064111433127522700230050ustar00rootroot00000000000000 GAMGI Interfaces: Layer Modify

Layer Modify

Change here the volume parameters for a single layer or a list of layers.

To modify a layer, click over the graphic area to open a menu and choose a layer, or write its identification (name and number) on the Layer entry. To modify a list of layers, press the button List (after creating the list of layers with Layer->Select). Parameters for empty entries or Local choices remain unchanged.

To change a layer name write the new name in the Layer entry, followed by the layer number (GAMGI needs the number to identify the layer). To change the name for a list of layers, press List first and then write the new common name in the Name entry.

Eye

Change the user position, in the layer space. Any position in 3D space is valid. Initially, the user is at (0, 0, +z), looking down to (0, 0, 0), and the up direction is (0, 1, 0), so the x axis points to the right, the y axis points to the top, and the z axis points to the user.

Center

Change the position to where the user is looking. The distance from Eye to Center must be within the limits of visibility (from Near to Far).

Up

Change the direction in layer space that points up, to the top of the screen. This direction is converted internally to a unit vector normal to the direction Eye -> Center, so any non-zero vector that is not parallel to that direction is valid.

The user position and orientation can be defined by a (X,Y,Z) layer referential, pointing from the middle of the screen to: the right (X), the top (Y), the user (Z). Eye is the origin, Eye <- Center defines the Z axis, and Up the Y axis, permiting to get the X axis by the cross product of the other two axes. Initially, the axes are orientated along (1,0,0) for X, (0,1,0) for Y and (0,0,1) for Z, but this is no longer the case when the layer referential is rotated.

To move the user around the objects, Eye, Center and Up must change. A simple, interactive way to do this is to press Axes in the window toolbar and then either drag the mouse or use the ruler, as described in Introduction Mouse and Introduction Tools.

Each layer has its own position parameters, so in a window with multiple visible layers, the image rendered in the graphic area is the superposition of the various, totally independent, layer views.

gamgi-0.17.5/doc/interfaces/layer/modify_projection.html000066400000000000000000000064021433127522700233150ustar00rootroot00000000000000 GAMGI Interfaces: Layer Modify

Layer Modify

Change here the projection parameters for a single layer or a list of layers.

To modify a layer, click over the graphic area to open a menu and choose a layer, or write its identification (name and number) on the Layer entry. To modify a list of layers, press the button List (after creating the list of layers with Layer->Select). Parameters for empty entries or Local choices remain unchanged.

To change a layer name write the new name in the Layer entry, followed by the layer number (GAMGI needs the number to identify the layer). To change the name for a list of layers, press List first and then write the new common name in the Name entry.

Perspective, Orthographic

Change the type of projection of the layer. GAMGI projects the 3D space on the 2D screen using Perspective or Orthographic projections. The Perspective projection is better to simulate realistic views and gives users a depth feedback, but the Orthographic projection preserves object dimensions, as these are not distorted by perspective.

Near, Far, Top

Change the dimensions of the space volume that is visible to the observer, after being projected into the window graphic area. This volume has six faces, and the front and back faces are always perpendicular to the viewing direction. Near and Far parameters set the distance from the view point to these front and back faces, respectively, corresponding to the minimum and maximum distances that the observer can see. Near must be smaller than Far.

In a Orthographic projection, the projection volume is a rectangular parallelepiped, so the 4 lateral faces are paralell and perpendicular to each other. In a Perspective projection, the projection volume is a truncated quandrangular pyramid, with the apex at the view point.

Top defines the half-height of the front face of the projection volume. The width is automatically determined from the ratio height / width of the window graphic area, so everytime users resize this window, the projection volume changes accordingly. Increasing Top increases the visible volume and decreases the size of the objects.

Each layer has its own projection parameters, so in a window with multiple visible layers, the image rendered in the graphic area is the superposition of the various, totally independent, layer views.

gamgi-0.17.5/doc/interfaces/layer/modify_view.html000066400000000000000000000044701433127522700221160ustar00rootroot00000000000000 GAMGI Interfaces: Layer Modify

Layer Modify

Change here the visual representation for a single layer or a list of layers.

To modify a layer, click over the graphic area to open a menu and choose a layer, or write its identification (name and number) on the Layer entry. To modify a list of layers, press the button List (after creating the list of layers with Layer->Select). Parameters for empty entries or Local choices remain unchanged.

To change a layer name write the new name in the Layer entry, followed by the layer number (GAMGI needs the number to identify the layer). To change the name for a list of layers, press List first and then write the new common name in the Name entry.

R, G, B

The R, G, B entries define the color of the layer background, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0). When multiple layers are visible, GAMGI always shows the background color of the current layer.

Axes

To show the layer referential axes, set the Axes option to Yes. The three axes use the rgb color scheme: red for the first axis, green for the second and blue for the third.

Scale

Change the size of everything contained in the layer, except lights. Layer objects are scaled around the layer center, defined by the Center parameter.

The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

gamgi-0.17.5/doc/interfaces/layer/modify_visibility.html000066400000000000000000000045621433127522700233350ustar00rootroot00000000000000 GAMGI Interfaces: Layer Modify

Layer Modify

Change here the inside and outside visibility for a single layer or a list of layers.

To modify a layer, click over the graphic area to open a menu and choose a layer, or write its identification (name and number) on the Layer entry. To modify a list of layers, press the button List (after creating the list of layers with Layer->Select). Parameters for empty entries or Local choices remain unchanged.

To change a layer name write the new name in the Layer entry, followed by the layer number (GAMGI needs the number to identify the layer). To change the name for a list of layers, press List first and then write the new common name in the Name entry.

Visibility

The Out and In parameters control the visibility to the outside and to the inside of the various layers in a window.

The visibility Out parameters are used only by the current layer, to control how to attempt to see the other layers: 1) All (try to see completely the other layers); 2) Partial (try to see the other layers in a blurred way, to distinguish them from the current layer); 3) None (do not see the other layers).

The visibility In parameters are used only by non current layers, to control how the current layer is allowed to look inside them: 1) All (the layer can be seen clearly); 2) Partial (the layer can be seen in a blurred way, to distinguish it from the current layer); 3) None (the layer cannot be seen from the outside).

gamgi-0.17.5/doc/interfaces/layer/remove_object.html000066400000000000000000000040751433127522700224210ustar00rootroot00000000000000 GAMGI Interfaces: Layer Remove

Layer Remove

  • Object
Indicate how to remove a layer (or list of layers, previously selected with Layer->Select, when Global is pressed).

Scope

When the Scope is All, the layer and all its contents is removed. This is the default. When the removed layer was the current layer, the layer before or the layer after becomes the new current layer. When the removed layer is the last one, a new layer is automatically created and made the current layer.

When the Scope is Contents, the layer is preserved but all its contents (lights, assemblies, graphs, shapes, arrows, cells, clusters, molecules, groups, planes, directions, atoms, bonds, orbitals, texts) is removed.

When the Scope is light, assembly, graph, shape, arrow, cell, cluster, molecule, group, plane, direction, atom, bond, orbital or text, these objects are removed from the layer.

When the target layer is the current layer, the final current layer becomes the new current object.

Clicking the mouse over the graphic area in the current window creates a menu with all the layers in the window, which can then be selected. Initially, the identification of the current layer is inserted in the Layer entry. This task cannot be reversed, so pressing Ok is required.

gamgi-0.17.5/doc/interfaces/layer/select_list.html000066400000000000000000000035411433127522700221050ustar00rootroot00000000000000 GAMGI Interfaces: Layer Select

Layer Select

  • List
Layer->Select selects a layer or a list of layers.

To select a layer click the mouse anywhere over the screen: a menu pops up listing the identification of all the layers. If a layer is selected, it becomes the new selected object.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

Only layers in the current window can be selected. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

When the selected object is a layer, this becomes also the selected layer. To see which layer is currently selected see its identification in the window statusbar.

Layer->Select shows a flat list of all layers currently existent in GAMGI, not necessarily in the same window. For each layer, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/light/000077500000000000000000000000001433127522700166755ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/light/config_color.html000066400000000000000000000030571433127522700222330ustar00rootroot00000000000000 GAMGI Interfaces: Light Config

Light Config

Define here the colors applied by default to new lights.

Ambient

These r, g, b components set the ambient color used by default when creating new lights. They can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0). Wired objects need some ambient light to be visible.

Diffuse

These r, g, b components set the diffuse color used by default when creating new lights. They can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0). Diffuse light is important to give solid objects a tridimensional aspect.

Specular

These r, g, b components set the specular color used by default when creating new lights. They can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0). Specular light is needed to give solid objects a brightness effect.
gamgi-0.17.5/doc/interfaces/light/config_global.html000066400000000000000000000025631433127522700223560ustar00rootroot00000000000000 GAMGI Interfaces: Light Config

Light Config

Set here global light Shininess parameter, applied automatically to all current and future layers with lights switched on, to change the brightness of its solid objects.

Shininess

This parameter controls the level of metallic brightness shown by solid objects, when submited to lights with some specular component. When Shininess is 0.0 (the minimum value), no brightness is visible. When Shininess is 1.0 (the maximum value), the brightness is usually so strong that most color effects are lost and objects look mostly white.

This parameter is global: all solid objects in GAMGI have the same Shininess.

gamgi-0.17.5/doc/interfaces/light/copy_object.html000066400000000000000000000036211433127522700220650ustar00rootroot00000000000000 GAMGI Interfaces: Light Copy

Light Copy

Indicate here the number of light copies to create and its destination.

Gamgi expects users to identify first the light or list of lights to copy. When the Light entry is active and empty, clicking the mouse over the window graphic area creates a menu with all the layer lights (local selection), which can then be selected and the identification transported to the Light entry. Pressing the List button, the current list of lights is selected instead.

Name

This is the name given to the new light copies. The default is to copy the name of each original light.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the light or list of lights to copy, GAMGI expects users to identify a layer to where the lights should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of lights, the copies can also be created at the layer of each original light, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/light/copy_shift.html000066400000000000000000000026371433127522700217420ustar00rootroot00000000000000 GAMGI Interfaces: Light Copy

Light Copy

Set here the translation vector applied to each new light copied from a light or list of lights. Directional lights have no position, so Shift does not affect them.

By default, each copied positional or spot light has the same position as the original light. This is expected when copying a light or a list of lights to a different layer. However, when each new light is in the same layer as the original light (for a list of lights, the Local option in the Layer menu), a small shift helps to separate the lightning effects produced by the new and original lights.

All other properties are the same for copied and original lights (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/light/create_attenuation.html000066400000000000000000000025621433127522700234460ustar00rootroot00000000000000 GAMGI Interfaces: Light Create

Light Create

Define here the attenuation parameters of the new light.

Axial

Set the Constant, Linear, Quadratic parameters that control the axial attenuation. This is defined only for positional and spot lights. The axial attenuation factor is given by:
Axial Attenuation Factor = 1/(constant + linear*distance + quadratic*distance*distance)

Radial

Controls the radial attenuation, defined only for spot lights. The radial attenuation factor is given by:
Radial Attenuation Factor = [max (0, vertex . direction)]**radial
gamgi-0.17.5/doc/interfaces/light/create_color.html000066400000000000000000000037111433127522700222260ustar00rootroot00000000000000 GAMGI Interfaces: Light Create

Light Create

Define here the color components of the new light.

Ambient

These r, g, b entries set the ambient color of the new light. This can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).

This component emulates light scattered so many times, that it does not depend of the radiation direction, or the materials surface. Wired objects cannot reflect diffuse or specular light, so they need some ambient light to be visible.

Diffuse

These r, g, b entries set the diffuse color of the new light. This can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).

This component emulates light equally reflected in all directions (as the light reflected by a hammered glass). Solid objects need some diffuse light to show its tridimensional shape.

Specular

These r, g, b entries set the specular color of the new light. This can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).

This component emulates light reflected mainly along specific directions (as the light reflected by a metal). Solid objects need some specular light to show brightness effects.

gamgi-0.17.5/doc/interfaces/light/create_geometry.html000066400000000000000000000045511433127522700227460ustar00rootroot00000000000000 GAMGI Interfaces: Light Create

Light Create

Define here the geometry of the new light.

Directional

Directional lights emulate lights very far from the objects they illuminate (as the Sun illuminating the Earth), so: 1) the light beams can be considered as paralel; 2) the attenuation produced by the distances between the objects is negligible, compared to the attenuation produced by the distance from the source (the intensity of the Sun light iluminating the top of a building or a street nearby is approximately the same).

Directional lights are thus determined by the x, y, z coordinates of the Direction vector.

Positional

Positional lights emit from a single point into all directions, with equal intensity. The attenuation in the beam intensity, from the source to the objects might be already significant (the visibility produced by street lights decreases rapidly with distance).

Positional lights are thus determined by the x, y, z coordinates of the light Position.

Spot

Spot lights differ from positional lights because they emit in a given Direction, as in a lamp. The Angle (beam aperture) between this Direction (the spot) and the light outer limit (the cutoff), can vary between almost 0 degrees (as in a laser) and 90 degrees (as in a ceilling light).

A spot light is thus determined by its position, direction and angle.

Direction, Position, Angle and Attenuation entries are automatically enabled or disabled, according to the type of light selected.

gamgi-0.17.5/doc/interfaces/light/link_object.html000066400000000000000000000037521433127522700220550ustar00rootroot00000000000000 GAMGI Interfaces: Light Link

Light Link

Link a light or a list of lights to other layers.

Lights can be linked only to layers.

Gamgi expects users to identify first the light or list of lights and then the layer to link. Clicking the mouse over the graphic area in the window creates a menu with all the lights in the current layer (local selection). When one is selected, its identification is transported to the Light entry. Pressing the List button, the current list of lights is selected instead.

Gamgi is now expecting users to select a layer, clicking the mouse over the graphic area of any window to create a menu with all the layers in that window (global selection). When one is selected, its identification is transported to the Layer entry.

Method

Gamgi suppports only one method to link lights: Object.

The Object method links a light or a list of lights to a single layer.

When linking a light, the light is unlinked from its current layer and linked to the new layer. An error is issued when the layer already owned the light.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of lights, all lights in the list are unlinked and linked to the selected layer.

gamgi-0.17.5/doc/interfaces/light/link_shift.html000066400000000000000000000027321433127522700217210ustar00rootroot00000000000000 GAMGI Interfaces: Light Link

Light Link

Set here the translation vector applied to each light or list of lights linked to a layer. Directional lights have no position, so Shift does not affect them.

When linking a light to another layer, the translation is always applied to the light itself. Directional lights have no position, so Shift does not affect them.

The final light position is given by this translation vector added to the current light position, as defined by the Reference option. By default this is the light position and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of lights is linked, Reference is set by default to Child, so lights preserve their positions and are not superposed.

gamgi-0.17.5/doc/interfaces/light/modify_attenuation.html000066400000000000000000000040011433127522700234600ustar00rootroot00000000000000 GAMGI Interfaces: Light Modify

Light Modify

Change here the attenuation parameters for a single light or a list of lights.

To modify a light, click over the graphic area to open a menu and choose a light, or write its identification (name and number) on the Light entry. To modify a list of lights, press the button List (after creating the list of lights with Light->Select). Parameters for empty entries or Local choices remain unchanged.

To change a light name write the new name in the Light entry, followed by the light number (GAMGI needs the number to identify the light). To change the name for a list of lights, press List first and then write the new common name in the Name entry.

Axial

Change the Constant, Linear, Quadratic parameters that control the axial attenuation. This is defined only for positional and spot lights. The axial attenuation factor is given by:
Axial Attenuation Factor = 1/(constant + linear*distance + quadratic*distance*distance)

Radial

Change the radial attenuation, defined only for spot lights. The radial attenuation factor is given by:
Radial Attenuation Factor = [max (0, vertex . direction)]**radial
gamgi-0.17.5/doc/interfaces/light/modify_color.html000066400000000000000000000051411433127522700222510ustar00rootroot00000000000000 GAMGI Interfaces: Light Modify

Light Modify

Change here the color components for a single light or a list of lights.

To modify a light, click over the graphic area to open a menu and choose a light, or write its identification (name and number) on the Light entry. To modify a list of lights, press the button List (after creating the list of lights with Light->Select). Parameters for empty entries or Local choices remain unchanged.

To change a light name write the new name in the Light entry, followed by the light number (GAMGI needs the number to identify the light). To change the name for a list of lights, press List first and then write the new common name in the Name entry.

Ambient

These R, G, B entries change the ambient color of the new light. This can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).

This component emulates light scattered so many times, that it does not depend of the radiation direction, or the materials surface. Wired objects cannot reflect diffuse or specular light, so they need some ambient light to be visible.

Diffuse

These R, G, B entries change the diffuse color of the new light. This can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).

This component emulates light equally reflected in all directions (as the light reflected by a hammered glass). Solid objects need some diffuse light to show its tridimensional shape.

Specular

These R, G, B entries change the specular color of the new light. This can vary between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0).

This component emulates light reflected mainly along specific directions (as the light reflected by a metal). Solid objects need some specular light to show brightness effects.

gamgi-0.17.5/doc/interfaces/light/modify_geometry.html000066400000000000000000000057661433127522700230030ustar00rootroot00000000000000 GAMGI Interfaces: Light Modify

Light Modify

Change here the geometry for a single light or a list of lights.

To modify a light, click over the graphic area to open a menu and choose a light, or write its identification (name and number) on the Light entry. To modify a list of lights, press the button List (after creating the list of lights with Light->Select). Parameters for empty entries or Local choices remain unchanged.

To change a light name write the new name in the Light entry, followed by the light number (GAMGI needs the number to identify the light). To change the name for a list of lights, press List first and then write the new common name in the Name entry.

Directional

Directional lights emulate lights very far from the objects they illuminate (as the Sun illuminating the Earth), so: 1) the light beams can be considered as paralel; 2) the attenuation produced by the distances between the objects is negligible, compared to the attenuation produced by the distance from the source (the intensity of the Sun light iluminating the top of a building or a street nearby is approximately the same).

Directional lights are thus determined by the X, Y, Z coordinates of the Direction vector.

Positional

Positional lights emit from a single point into all directions, with equal intensity. The attenuation in the beam intensity, from the source to the objects might be already significant (the visibility produced by street lights decreases rapidly with distance).

Positional lights are thus determined by the X, Y, Z coordinates of the light Position.

Spot

Spot lights differ from positional lights because they emit in a given Direction, as in a lamp. The Angle (beam aperture) between this Direction (the spot) and the light outer limit (the cutoff), can vary between almost 0 degrees (as in a laser) and 90 degrees (as in a ceilling light).

A spot light is thus determined by its position, direction and angle.

Direction, Position, Angle and Attenuation entries are automatically enabled or disabled, according to the type of light selected.

gamgi-0.17.5/doc/interfaces/light/remove_object.html000066400000000000000000000024261433127522700224120ustar00rootroot00000000000000 GAMGI Interfaces: Light Remove

Light Remove

  • Object
Indicate how to remove a light (or list of lights, previously selected with Light->Select, when Global is pressed).

Scope

Lights cannot contain other objects, so the only option for Scope is All.

When the removed light was the current object, the current layer becomes the new current object.

Clicking the mouse over the graphic area in the current window creates a menu with all the lights in the layer. When one is selected, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/light/select_list.html000066400000000000000000000034041433127522700220760ustar00rootroot00000000000000 GAMGI Interfaces: Light Select

Light Select

  • List
Light->Select selects a light or a list of lights.

To select a light click the mouse anywhere over the screen: a menu pops up listing the identification of all the lights. If a light is selected, it becomes the new selected object.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

Only lights in the working layer can be selected, even if lights are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Light->Select shows a flat list of all lights currently existent in GAMGI, not necessarily in the same layer or window. Lights do not own other objects, so no hierarchical tree is shown.

gamgi-0.17.5/doc/interfaces/molecule/000077500000000000000000000000001433127522700173735ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/molecule/copy_object.html000066400000000000000000000036031433127522700225630ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Copy

Molecule Copy

Indicate here the number of molecule copies to create and its destination.

Gamgi expects users to identify first the molecule or list of molecules to copy. When the Molecule entry is active and empty, clicking the mouse over an molecule, on the current layer (local selection), its identification is transported to the Molecule entry. Pressing the List button, the current list of molecules is selected instead.

Name

This is the name given to the new molecule copies. The default is to copy the name of each original molecule.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the molecule or list of molecules to copy, GAMGI expects users to identify a layer to where the molecules should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of molecules, the copies can also be created at the layer of each original molecule, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/molecule/copy_shift.html000066400000000000000000000024521433127522700224330ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Copy

Molecule Copy

Set here the translation vector applied to each new molecule.

By default, each copied molecule has the same coordinates as the original molecule. This is expected when copying a molecule or a list of molecules to a different layer. However, when each new molecule is in the same layer as the original molecule (for a list of molecules, the Local option in the Layer menu), a small shift helps to separate the new molecules from the original ones.

All other properties are the same for copied and original molecules (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/molecule/create_type.html000066400000000000000000000026641433127522700225750ustar00rootroot00000000000000 GAMGI Interfaces: Group Create

Molecule Create

  • Type
Chose here the type of molecule to create: Container or Graphene.

Container

The primary purpose of a molecule container is to contain other objects. When a molecule container is created, it has no child objects and consequently no visual representation. The only way to select an empty molecule is thus to write its identification or to use the mechanisms provided by Molecule->Select.

To avoid this problem, when Ok is pressed and the new molecule is created, the dialog Molecule->Create is automatically replaced by Molecule->Link, with the new molecule identification already inscribed on it. How to link objects to a molecule is described in the section Molecule Link.

Graphene

gamgi-0.17.5/doc/interfaces/molecule/geometry.html000066400000000000000000000033401433127522700221140ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Measure Geometry
Molecule Measure Geometry
 
This report describes, for the selected structure, all the possible sequences for bond lengths, angles and torsions, presenting the results in increasing order of the atom elements. Geometric relations between non bonded atoms are ignored.

For each sequence it is reported the number of occurrences, the minimum and maximum values, the average value and the standard deviation (unless no valid occurrences were found).

Bond Length

The distance between Atom1 and Atom2.

Bond Angle

The valence angle between directions Atom2-Atom1 and Atom2-Atom3. The results are always presented with positive values.

When present, undefined bond angles (when at least two atoms are coincident) are reported for each angle sequence.

Bond Torsion

The torsion angle between two planes, defined by Atom1-Atom2-Atom3 and Atom2-Atom3-Atom4. The results are always presented with positive values.

When present, undefined bond torsions (when at least two atoms are coincident or three atoms are colinear) are reported for each torsion sequence.

gamgi-0.17.5/doc/interfaces/molecule/link_object.html000066400000000000000000000056711433127522700225550ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Link

Molecule Link

Link a molecule or a list of molecules to other objects.

Hierarchy

Molecules can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by molecules. Pressing the button Above, the same menu shows the classes of objects that can own molecules.

Gamgi expects users to identify first the molecule or list of molecules and then the object to link. When the Molecule entry is active and empty, clicking the mouse over a molecule, on the current layer (local selection), its identification is transported to the Molecule entry. Pressing the List button, the current list of molecules is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

Method

Gamgi suppports only one method to link molecules: Object.

The Object method links a molecule or a list of molecules to a single object, Above or Below.

When the Hierarchy is Above, the molecule is unlinked from its current parent and linked to the new object. When the molecule is moved to a different layer, its bonds are automatically removed. When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the molecule. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of molecules Above, all molecules in the list are unlinked and linked to the parent object. When linking a list of molecules Below, the child object is replicated as many times as necessary to link each molecule in the list to a different replica.

gamgi-0.17.5/doc/interfaces/molecule/link_shift.html000066400000000000000000000032751433127522700224220ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Link

Molecule Link

Set here the translation applied to the child object or list of objects.

When linking a molecule to another object, the translation is always applied to the child object: the molecule itself when linking above, the other object (group, plane, direction, atom, orbital, text) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of molecules is linked above, Reference is set by default to Child, so molecules preserve their positions and are not superposed.

When a list of molecules is linked below, each molecule will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent molecules and are not superposed.

gamgi-0.17.5/doc/interfaces/molecule/measure_symmetry.html000066400000000000000000000073551433127522700237050ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Measure

Molecule Measure

Select here the parameters to measure the point symmetry.

Periodicity

When the No option is chosen (the default), all elements of symmetry are taken into account, and the chemical point group is determined. When the Yes option is chosen, all elements of symmetry related with rotations of order different from 6, 4, 3, 2 are ignored. The reported crystallographic point group is thus the maximum point symmetry that could be achieved in the center of this aggregate, if it was in a periodic crystal.

For example, a C5v chemical group becomes a Cs crystallographic point group because after discarding the C5 axis, only one of the five mirror planes can be considered as a true element of symmetry in a periodic system. A chemical Ih becomes a Th crystallographic group, because after discarding the C5 axes, the remaining planes and axes form five different sets of cubic Th symmetry, although only one can be considered at a time.

Everytime the chemical group is found, the crystallographic group can also be determined. Usually this crystallographic group is not unique. For example, a D12h chemical group can be either a D4h or a D6h crystallographic group. GAMGI shows the various crystallographic groups that cover all the possible operations of symmetry, in sequence, with their symmetry operations and symmetry elements. In particular, chemical C0v becomes C4v or C6v, chemical D0h becomes D4h or D6h and chemical Kh becomes D4h or D6h or Oh crystallographic groups respectively.

Tolerance

The elements of symmetry of a molecule depend entirely of the tolerance applied to the operations of symmetry. GAMGI uses the same tolerance for all operations: the maximum distance that is tolerated between initial and transformed coordinates.

GAMGI tries to find all the symmetry elements independently, and in general each of these elements requires a different tolerance. Thus, for a given tolerance, some elements may be recognized and others may go missing, resulting in an inconsistent set of symmetry elements. When this happens, the group is reported Undefined. The solution is to increase the tolerance (so valid elements might be found) or to decrease it (so fake elements might be discarded).

When the transformed coordinates for a given symmetry element are closer than the Initial tolerance, GAMGI attempts to optimize the symmetry element, to get transformed coordinates closer than the Final tolerance. When the transformed coordinates do not pass the Initial tolerance or when the optimization fails, the attempted element is discarded. When the transformed coordinates pass the Final tolerance, the element is accepted.

During optimization, GAMGI will never attempt to change the atoms, only the symmetry elements. To disable optimization, just set Initial equal to Final tolerance.

gamgi-0.17.5/doc/interfaces/molecule/measure_tolerance.html000066400000000000000000000026251433127522700237630ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Measure

Molecule Measure

Select here the numerical tolerances used in the Voronoi tesselation. Changing significantly the default values may produce bad results.

Tolerance

When building the polyhedrons, if a plane cuts a vertex more than the Apex tolerance, this vertex is removed.

Faces that have an area smaller than the Area tolerance are ignored and its topological surroundings are merged.

Vertices that are closer than the Vertex tolerance are considered the same and its topological surroundings are merged.

gamgi-0.17.5/doc/interfaces/molecule/measure_type.html000066400000000000000000000045001433127522700227620ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Measure

Molecule Measure

Chose the method of analysis: Geometry, Symmetry or Voronoi.

Geometry

This method measures all the bond lengths, angles and torsions in the structure, reporting for each quantity, the number of occurrences, the minimum and maximum values, the average value and the standard deviation. Geometric relations between non bonded atoms are ignored.

Undefined bond angles (when at least two atoms are coincident) are reported for each angle sequence. Undefined bond torsions (when at least two atoms are coincident or three atoms are colinear) are reported for each torsion sequence.

Symmetry

This method determines the point group of symmetry of the structure, either in the chemical context (infinite groups, all symmetry operations are allowed) or in the crystallographic context (32 groups, only 1, 2, 3, 4, 6 rotations and other operations compatible with lattice symmetry are allowed).

Voronoi

This method determines the Voronoi tesselation of the structure, shows the resulting polyhedra in a new layer, and reports a large list of its most important geometrical and topological properties.

This analysis can be made with planar bondaries (to close the outside polyhedra) or with full periodic boundary conditions, with equal weights for all atoms (the usual Voronoi tesselation) or with a different weight for each atom (given by its atomic radius, the so-called radical tesselation).

gamgi-0.17.5/doc/interfaces/molecule/measure_view.html000066400000000000000000000043661433127522700227650ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Measure

Molecule Measure

Select here how the calculated Voronoi polyhedra are shown.

Borders

Selecting Faces, only the borders defining the external faces are shown, thus producing a relatively uncluttered volume representation.

Selecting All shows all the borders, including those inside the volume. This option is disabled when the button Faces is down, because in solid mode, internal borders cannot be seen from the outside and make it very difficult to analyze something from the inside.

Faces

When the button Faces is down, the tesselation is represented as a solid volume, that users can see from the outside or from the inside.

When the button Faces is up, the tesselation is represented as a wired volume.

Nodes

When the button Seeds is up, the atom seeds are visible, otherwise they are hidden.

Color

The Color button controls whether the tesselation is represented with its own, independent color, or inherits the colors of the atom seeds, for each polyhedron. When the button Faces is up, an independent color is necessary, because polyhedrons are then represented only by wired shared edges, which cannot inherit the color from both faces.

R, G, B

The R, G, B entries define the tesselation color: (0.0, 0.0, 0.0) is black and (1.0, 1.0, 1.0) is white.
gamgi-0.17.5/doc/interfaces/molecule/measure_voronoi.html000066400000000000000000000072151433127522700235020ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Measure

Molecule Measure

Select here the main parameters controlling the Voronoi tesselation.

Boundaries

GAMGI supports two methods to handle the tesselation in the boundaries, Planar and Periodic.

The Planar method defines six outer planes, forming a closed space that includes all the seeds. Conceptually, this is equivalent to create six virtual seeds around each real seed, positioned in such a way that they define six planes at half-distance, common for all seeds, forming a closed background.

The Periodic method applies periodic boundary conditions, using the extended image convention, which means to create 26 virtual systems around the central system (as 26 boxes around the central one, in a 3x3x3 arrangement). The minimum image convention, often used in Molecular Mechanics simulations, is not suitable in Voronoi tesselation, because it considers only the nearest neighbours, while Voronoi tesselation requires all the 26 nearest neighbours.

The Offset parameter defines the border width between: 1) the seeds and the outer planes, in the Planar method; 2) the central system and the other 26 around, in the Periodic method.

Offset cannot be 0 in the Planar method, because virtual seeds would coincide with real seeds, producing an error. Offset can be 0 in the Periodic method, if real and virtual seeds do not coincide, otherwise an error is flagged. An error is also produced when two real seeds coincide (current tolerance: 1.0E-4).

Weights

By default, GAMGI calculates the normal Voronoi partition, so all atoms are given the same weight, corresponding to Variancy equal to zero. However GAMGI can partition the space giving different weights to different atoms (Radical Tesselation), according to their radius. In general, if d is the distance between seed 0 and neighbour 1, the plane between them passes at a distance d * fraction from the seed, where fraction is given by:

r0 = radius0 * variancy
r1 = radius1 * variancy
fraction = 1/2 [1 + (r0**2 - r1**2)/d**2]
When Variancy is 0, fraction is 1/2 (normal Voronoi), whereas when Variancy is 1, unscaled atomic radius are used to determine fraction. Variancy can vary continuously from 0 to a given limit, GAMGI_PHYS_VORONOI_VARIANCY, currently 10.0.

When Variancy is 0, the tesselation can always be obtained (as long as there are no atoms with essentially the same coordinates). When Variancy increases, the tesselation becomes progressively more restrictive. The atoms must be far enough from each other, particularly when the radius are quite different, otherwise the tesselation cannot be determined and and error is shown.

gamgi-0.17.5/doc/interfaces/molecule/remove_object.html000066400000000000000000000034171433127522700231110ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Remove

Molecule Remove

  • Object
Indicate how to remove a molecule (or list of molecules, previously selected with Molecule->Select, when Global is pressed).

Scope

When the Scope is All, the molecule and all its contents is removed. This is the default.

When the Scope is Container, the molecule is removed but its contents (groups, planes, directions, atoms, bonds, orbitals, texts) is saved, linked to the cell parent.

When the Scope is Contents, the cluster is preserved but all its contents (groups, planes, directions, atoms, bonds, orbitals, texts) is removed.

When the Scope is group, plane, direction, atom, bond, orbital or text, these objects are removed from the cluster.

When the removed molecule was part of the current object, the current layer becomes the new current object.

Clicking the mouse over a molecule in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/molecule/select_list.html000066400000000000000000000034331433127522700225760ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Select

Molecule Select

  • List
Molecule->Select selects a molecule or a list of molecules.

To select an molecule click the mouse over its visual representation: if GAMGI recognizes the molecule it becomes the new selected object, otherwise the mouse action is ignored.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

Only molecules in the working layer can be selected, even if molecules are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Molecule->Select shows a flat list of all molecules currently existent in GAMGI, not necessarily in the same layer or window. For each molecule, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/molecule/symmetry.html000066400000000000000000000110611433127522700221510ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Measure Symmetry
Molecule Measure Symmetry
 
This report describes, for the selected structure, the point group of symmetry, the symmetry operations and the symmetry elements. When Periodicity is set to Yes and various crystallographic point groups are possible, they are listed in sequence of increasing symmetry.

Point Group

The chemical or crystallographic point group of symmetry is reported here. When Periodicity is set to No (the default), the chemical group is shown, using the Schoenflies notation (or Undefined, if no point group can be determined).

Chemical groups for linear systems, with a rotation axis of infinite order, are named C0v and D0h. The spherical group, corresponding to a single atom, is named Kh.

When Periodicity is set to Yes, the group is named using first the International and then the Schoenflies notation (or Undefined, if no point group can be determined. In this case, rotation axes of order different from 6, 4, 3, 2 are discarded, all the other elements are shown).

Gamgi can find axes with any rotation order, so any chemical (infinite) or crystallographic (32) group of symmetry can be determined.

When users require the crystallographic point group, Gamgi determines first the chemical group and then applies the periodic restrictions to obtain the point group in a crystal with the highest possible symmetry. When more than one option is available, Gamgi shows the various solutions. For example, a C24 rotation axis in a molecule can be restricted to 6 or 4 axes in a periodic crystal.

Gamgi tries to find all the symmetry elements independently, and in general each of these elements requires a different tolerance. Thus, for a given tolerance, some elements may be recognized and others may go missing, resulting in an inconsistent set of symmetry elements. When this happens, the group is reported Undefined. The solution is to increase the tolerance (so valid elements might be found) or to decrease it (so fake elements might be discarded).

Symmetry Operations

The complete set of symmetry operations, generated from the symmetry elements found (forming a group, in the mathematical sense), is reported in abreviated format. For example, a C4 axis generates operations C41, C42 (equal to C21), C43 and C44 (equal to E), so only two C4 operations are new, described as 2C4.

In groups with infinite rotation orders, C0v and D0h, rotation operations are presented, as 2C0 and 2S0, symbolizing the two directions of rotation. In these cases, a single mirror plane m is considered (although they are infinite). For the Kh spherical group, a single rotation axis and plane are considered (although they are infinite).

Symmetry Elements

All symmetry elements that were found are individually reported here. The inversion center is described by its coordinates. Mirror planes are described indicating the corresponding normal vectors. For rotation axes, normal and improper, the rotation order is reported, plus the normal vector describing the axis, starting from the center.

For all symmetry elements, the error produced when applying the operations of symmetry, is reported (this error is smaller than the tolerance, otherwise the element would have been rejected).

Rotation axes are sorted according to increasing rotation order, so more symmetric axes come first. When present, infinite order axes are always the first in the list. Mirror planes and axes with the same rotation order are sorted according to decreasing element error, so better defined elements come first.

When present, a horizontal mirror plane is always listed before the other planes. When present, a C2 axis along the main direction is always listed before the other C2 axes.

gamgi-0.17.5/doc/interfaces/molecule/voronoi.html000066400000000000000000000136551433127522700217660ustar00rootroot00000000000000 GAMGI Interfaces: Molecule Measure Voronoi
Molecule Measure Voronoi
 
The Voronoi tesselation produces a polygonal representation, plus a report of topological and geometrical properties. For each atom there is a Voronoi polyhedron.

Throughout the report, Minimum is the minimum value, Maximum is the maximum value, Average is the mean value and Deviation is the standard deviation, in the universe formed by all the polyhedrons available.

Polyhedrons

Total number of polyhedrons. Polyhedrons with outer faces are considered External, all the others are Internal.

Faces

Total number of faces. Outer faces are considered External, all the others are Internal.

Edges

Total number of edges. Edges in outer faces are considered External, all the others are Internal.

Vertices

Total number of vertices. Vertices in outer faces are considered External, all the others are Internal.

Polyhedron Faces

Number of faces per polyhedron. The minimum value is 4 (tetrahedron).

Polyhedron Edges

Number of edges per polyhedron. The minimum value is 6 (tetrahedron).

Polyhedron Vertices

Number of vertices per polyhedron. The minimum value is 4 (tetrahedron).

Face Vertices

Number of vertices per face. The minimum value is 3 (triangle).

Edge polyhedrons

Number of polyhedrons sharing an edge. The minimum value is 1. (system edge).

Edge faces

Number of faces sharing an edge. The minimum value is 2. (system edge).

Vertex Polyhedrons

Number of polyhedrons sharing a vertex. The minimum value is 1 (system corner).

Vertex Faces

Number of faces sharing a vertex. The minimum value is 3 (system corner).

Vertex Edges

Number of edges sharing a vertex. The minimum value is 3 (system corner).

System Volume

Volume of the global system (including polyhedrons non-selected for analysis), obtained by: 1) limiting the volume with six outer planes (the Real value); 2) summing the volumes of all the polyhedrons (the Calculated value).

Comparing the two values provides a quantitative assertion of the global geometrical accuracy achieved with the Voronoi tesselation.

Polyhedron Volumes

The volume for each polyhedron, obtained by summing the volumes of all its triangular piramids.

Polyhedron Areas

The area for each polyhedron, obtained by summing the areas of all its faces.

Polyhedron Lengths

The length for each polyhedron, obtained by summing the lengths of all its edges.

System Anisotropy

For each polyhedron face, determine the following matrix, where n is the unit vector normal to the face:

q11 = n(1) * n(1) - 1/3
q12 = n(1) * n(2)
q13 = n(1) * n(3)
q21 = n(2) * n(1)
q22 = n(2) * n(2) - 1/3
q23 = n(2) * n(3)
q31 = n(3) * n(1)
q32 = n(3) * n(2)
q33 = n(3) * n(3) - 1/3
Then scale the matrix q by A/V**2/3, where A is the face area and V is the polyhedron volume. Finally sum for all polyhedron faces. The q matrix thus obtained describes the polyhedron matrix anisotropy.

To obtain the System Anisotropy, sum these matrices for all polyhedrons, multiplied by the corresponding polyhedron volume fractions. The trace of the resulting matrix must be zero.

The System Anisotropy is independent of the orientation of the system.

Polyhedron Anisotropy

To obtain a scalar Polyhedron Anisotropy, the following equation is applied:

q = sqrt { [q11**2 + q12**2 + q13**2 + q21**2 +
q22**2 + q23**2 + q31**2 + q32**2 + q33**2] / 9 }
For symmetrical solids such as the tetrahedron, the octahedron, the cube, the dodecahedron, or even the Kelvin 8+6 polyhedron, the scalar Polyhedron Anisotropy is always zero.

The scalar Polyhedron Anisotropy is independent of the orientation of the polyhedron.

Polyhedron Aberration

The ratio between the area of a polyhedron and the area of a sphere with the same volume. As a sphere is the 3D object with a smaller area/volume ratio, Spherical Aberration is always above 1.0.

Face Areas

The area for each face, obtained by summing the areas of all its triangles. Faces with an area smaller than a given tolerance (the Area tolerance in the Molecule->Measure dialog) are removed.

Face Lengths

The perimeter for each face, obtained by summing the lengths of all its edges.

Face Angles

The angle between adjacent faces (between 0 and 180 degrees).

Face Aberration

The ratio between the perimeter of a face and the perimeter of a circumpherence with the same area. As a circumpherence is the 2D object with a smaller perimeter/area ratio, Circular Aberration is always above 1.0.

Edge Lengths

The length for each edge. Edges with a length smaller than a given tolerance (the Vertex tolerance in the Molecule->Measure dialog) are removed.

Edge Angles

The angle between adjacent edges (between 0 and 180 degrees).

Seed Lengths

The distance between atom seeds. The minimum distance must be larger than a given tolerance (GAMGI_MATH_TOLERANCE_LENGTH, currently 1.0E-4), otherwise an error is flagged and the tesselation is canceled.
gamgi-0.17.5/doc/interfaces/orbital/000077500000000000000000000000001433127522700172225ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/orbital/copy_object.html000066400000000000000000000035631433127522700224170ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Copy

Orbital Copy

Indicate here the number of orbital copies to create and its destination.

Gamgi expects users to identify first the orbital or list of orbitals to copy. When the Orbital entry is active and empty, clicking the mouse over an orbital, on the current layer (local selection), its identification is transported to the Orbital entry. Pressing the List button, the current list of orbitals is selected instead.

Name

This is the name given to the new orbital copies. The default is to copy the name of each original orbital.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the orbital or list of orbitals to copy, GAMGI expects users to identify a layer to where the orbitals should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of orbitals, the copies can also be created at the layer of each original orbital, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/orbital/copy_shift.html000066400000000000000000000024371433127522700222650ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Copy

Orbital Copy

Set here the translation vector applied to each new orbital.

By default, each copied orbital has the same coordinates as the original orbital. This is expected when copying an orbital or a list of orbitals to a different layer. However, when each new orbital is in the same layer as the original orbital (for a list of orbitals, the Local option in the Layer menu), a small shift helps to separate the new orbitals from the original ones.

All other properties are the same for copied and original orbitals (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/orbital/create_position.html000066400000000000000000000042201433127522700232750ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Create

Orbital Create

Set here the position and orientation of an orbital.

Translation

The origin of an orbital object, defined as its center, can be set using the X, Y, Z entries. A simpler way to set directly the orbital position is to click on the screen, at the wished position, after defining all the other orbital properties: a new orbital object is created at that position.

Rotation

The orientation of an orbital object, defined by the Euler angles theta, phi, psi, can be set using the E1, E2, E3 entries.

Euler angles in GAMGI are defined as follows: first, the (x, y, z) referential is rotated theta degrees (between 0 and 180) around the y axis, then the referential is rotated phi degrees (between 0 and 360) around the initial z axis, and finally it is rotated psi degrees (between 0 and 360) around the new z axis, always in the direct, counter-clockwise, direction. If the first Euler angle (theta) is zero, the old and new z axis coincide, thus (0, 0, 10) and (0, 5, 5) represent the same rotation.

By default, the orbital frame first vector is aligned with the x axis (to the right), the second vector is on the xy (screen) plane and the third vector has a positive z coordinate (pointing to the user), corresponding to Euler angles (0, 0, 0).

gamgi-0.17.5/doc/interfaces/orbital/create_scope.html000066400000000000000000000062341433127522700225510ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Create

Orbital Create

Set here the numerical representation of an orbital.

Style

There are two ways to describe orbitals in GAMGI: as a cloud of random points describing all the regions of space where the probability density is above a specified value, the Wired approach; 2) as the outer isosurface linking points with the specified probability density, the Solid approach. Please note that in s orbitals, there are several different isosurfaces with the same probability density, GAMGI shows only the most external one.

Density

Defines the probability density (probability / volume) value used to accept points in Wired mode (when they are above this threeshold) or to build points in Solid mode (where they have exactly this threeshold).

The low default value (1E-6)) was chosen to guarantee that all the inter-node regions are visible with default parameters. For example, the six inter-node regions of orbital 6s are all visible with the default parameters.

Radius

Defines the sampling volume that is scanned when building an orbital. In Wired mode, the sampling volume is the sphere with this radius. In Solid mode, the sampling volume is the cube containing this sphere.

For each orbital, the default radius is obtained calculating first the distance for the last maximum of the radial probability density (the first Bohr radius, for orbital 1s), then adding an offset (to guarantee a proper sampling region, currently 2.0 Angstrom) and finally increasing the radius untill the probability density becomes lower in all directions than the default probability density.

Sampling

In Wired mode, random points are generated and tried untill the number of accepted points equals Sampling. By default Sampling is 50000 x N, where N is the main quantum number.

In Solid mode, a sampling cubic grid is built for each octant, with Sampling slices on each dimension. By default Sampling is 50.

Seed

In Wired mode, sampling points are randomly positioned using a sequence of (pseudo) random numbers, generated from a Seed initiator. Using different seeds, different random sequences and final results will be produced. Using the same seed, the same results will be obtained.
gamgi-0.17.5/doc/interfaces/orbital/create_type.html000066400000000000000000000023701433127522700224160ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Create

Orbital Create

Set here the quantum parameters describing an orbital.

Numbers

Set here the n, l, m, quantum numbers of the hydrogen-based atomic orbital to build. The allowed values are: 1 <= n <= 6, 0 <= l <= n-1, -l <= m <= l. By default n = 1, l = 0, m = 0.

Charge

Set here the nucleus charge for the atomic orbital (by default 1.0, the nucleus charge for Hydrogen).
gamgi-0.17.5/doc/interfaces/orbital/create_view.html000066400000000000000000000041371433127522700224120ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Create

Orbital Create

Set here the visual aspect of an orbital.

Color

Set here the R, G, B color components of the orbital, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0), in the positions where the wavefunction is positive.

When Phase is switched off (in the Volume page), the Color components are used to color the whole orbital.

Phase

Set here the R, G, B color components of the orbital, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0), in the places where the wavefunction is negative.

When Phase is switched off (in the Volume page), the Phase entries are disabled and the whole orbital is colored using only the Color components.

Frame

Set here the R, G, B color components of the orbital frame, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).

When Frame is switched off (in the Volume page), the Frame entries are disabled as the orbital frame is not shown.

Scale

Set the orbital size, including its child objects. Orbital objects are scaled around the orbital center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
gamgi-0.17.5/doc/interfaces/orbital/create_volume.html000066400000000000000000000051361433127522700227470ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Create

Orbital Create

Set here how the volume representation of an orbital.

Phase

When Phase is switched on (the default), the orbital is represented with two colors, to distinguish places where the wave function is positive and negative. When Phase is switched off, the whole orbital is represented with just one color.

Frame

When Frame is switched on (the default), a cubic frame is shown around the orbital, with a edge length equal to twice the sampling Radius defined in the Scope page. When Frame is switched off, no frame is shown.

Octants

Often it is useful to show only parts of the orbital. In GAMGI each orbital is divided in 8 octants, four above the xy plane, marked as positive, and four below, marked as negative. The four octants, above and below, are numbered increasing in a counter-clockwise pattern, as usual in trigonometry. To set which orbital octants should be represented, switch on / off each of the eight octant buttons. By default all octants are shown.

Axes

When Axes is set to Radius, axes are shown with the radius length (when Frame is disabled) or the diameter length (when Frame is enabled). When Axes is set to Bohr, axes are shown with the length of Bohr first radius. When Axes is set to Unit, axes are shown with a unit length. When Axes is set to None, no axes are shown (the default).

When Frame is enabled (the default), axes are positioned along the frame edges, starting from the xyz lower corner. When Frame is disabled, axes start from the orbital center.

The options Bohr and Unit are useful only for small orbitals, otherwise the axes are barely visible.

gamgi-0.17.5/doc/interfaces/orbital/link_object.html000066400000000000000000000055501433127522700224000ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Link

Orbital Link

Link an orbital or a list of orbitals to other objects.

Hierarchy

Orbitals can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by orbitals. Pressing the button Above, the same menu shows the classes of objects that can own orbitals.

Gamgi expects users to identify first the orbital or list of orbitals and then the object to link. When the Orbital entry is active and empty, clicking the mouse over an orbital, on the current layer (local selection), its identification is transported to the Orbital entry. Pressing the List button, the current list of orbitals is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

Method

Gamgi suppports only one method to link orbitals: Object.

The Object method links an orbital or a list of orbitals to a single object, Above or Below.

When linking an orbital and the Hierarchy is Above, the orbital is unlinked from its current parent and linked to the new object. When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the orbital. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of orbitals Above, all orbitals in the list are unlinked and linked to the parent object. When linking a list of orbitals Below, the child object is replicated as many times as necessary to link each orbital in the list to a different replica.

gamgi-0.17.5/doc/interfaces/orbital/link_shift.html000066400000000000000000000032171433127522700222450ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Link

Orbital Link

Set here the translation applied to the child object or list of objects.

When linking a orbital to another object, the translation is always applied to the child object: the orbital itself when linking above, the other object (orbital) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of orbitals is linked above, Reference is set by default to Child, so orbitals preserve their positions and are not superposed.

When a list of orbitals is linked below, each orbital will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent orbitals and are not superposed.

gamgi-0.17.5/doc/interfaces/orbital/modify_position.html000066400000000000000000000053771433127522700233370ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Modify

Orbital Modify

Change here the position and orientation for a single orbital or a list of orbitals.

To modify an orbital, click over its graphic image, or write its id on the Orbital entry. To modify a list of orbitals, press the button List (after creating the list of orbitals with Orbital->Select). Parameters for empty entries or Local choices remain unchanged.

To change an orbital name write the new name in the Orbital entry, followed by the orbital number (GAMGI needs the number to identify the orbital). To change the name for a list of orbitals, press List first and then write the new common name in the Name entry.

Translation

The origin of an orbital object, defined as its center, can be set using the X, Y, Z entries. A simpler way to set directly the orbital position is to click on the screen, at the wished position, after defining all the other orbital properties: a new orbital object is created at that position.

Rotation

The orientation of an orbital object, defined by the Euler angles theta, phi, psi, can be set using the E1, E2, E3 entries.

Euler angles in GAMGI are defined as follows: first, the (x, y, z) referential is rotated theta degrees (between 0 and 180) around the y axis, then the referential is rotated phi degrees (between 0 and 360) around the initial z axis, and finally it is rotated psi degrees (between 0 and 360) around the new z axis, always in the direct, counter-clockwise, direction. If the first Euler angle (theta) is zero, the old and new z axis coincide, thus (0, 0, 10) and (0, 5, 5) represent the same rotation.

By default, the orbital frame first vector is aligned with the x axis (to the right), the second vector is on the xy (screen) plane and the third vector has a positive z coordinate (pointing to the user), corresponding to Euler angles (0, 0, 0).

gamgi-0.17.5/doc/interfaces/orbital/modify_scope.html000066400000000000000000000074121433127522700225740ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Modify

Orbital Modify

Change here the numerical representation of a single orbital or a list of orbitals.

To modify an orbital, click over its graphic image, or write its id on the Orbital entry. To modify a list of orbitals, press the button List (after creating the list of orbitals with Orbital->Select). Parameters for empty entries or Local choices remain unchanged.

To change an orbital name write the new name in the Orbital entry, followed by the orbital number (GAMGI needs the number to identify the orbital). To change the name for a list of orbitals, press List first and then write the new common name in the Name entry.

Style

There are two ways to describe orbitals in GAMGI: as a cloud of random points describing all the regions of space where the probability density is above a specified value, the Wired approach; 2) as the outer isosurface linking points with the specified probability density, the Solid approach. Please note that in s orbitals, there are several different isosurfaces with the same probability density, GAMGI shows only the most external one.

Density

Defines the probability density (probability / volume) value used to accept points in Wired mode (when they are above this threeshold) or to build points in Solid mode (where they have exactly this threeshold).

The low default value (1E-6)) was chosen to guarantee that all the inter-node regions are visible with default parameters. For example, the six inter-node regions of orbital 6s are all visible with the default parameters.

Radius

Defines the sampling volume that is scanned when building an orbital. In Wired mode, the sampling volume is the sphere with this radius. In Solid mode, the sampling volume is the cube containing this sphere.

For each orbital, the default radius is obtained calculating first the distance for the last maximum of the radial probability density (the first Bohr radius, for orbital 1s), then adding an offset (to guarantee a proper sampling region, currently 2.0 Angstrom) and finally increasing the radius untill the probability density becomes lower in all directions than the default probability density.

Sampling

In Wired mode, random points are generated and tried untill the number of accepted points equals Sampling. By default Sampling is 50000 x N, where N is the main quantum number.

In Solid mode, a sampling cubic grid is built for each octant, with Sampling slices on each dimension. By default Sampling is 50.

Seed

In Wired mode, sampling points are randomly positioned using a sequence of (pseudo) random numbers, generated from a Seed initiator. Using different seeds, different random sequences and final results will be produced. Using the same seed, the same results will be obtained.
gamgi-0.17.5/doc/interfaces/orbital/modify_type.html000066400000000000000000000035461433127522700224500ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Modify

Orbital Modify

Change here the quantum parameters describing a single orbital or a list of orbitals.

To modify an orbital, click over its graphic image, or write its id on the Orbital entry. To modify a list of orbitals, press the button List (after creating the list of orbitals with Orbital->Select). Parameters for empty entries or Local choices remain unchanged.

To change an orbital name write the new name in the Orbital entry, followed by the orbital number (GAMGI needs the number to identify the orbital). To change the name for a list of orbitals, press List first and then write the new common name in the Name entry.

Numbers

Set here the n, l, m, quantum numbers of the hydrogen-based atomic orbital to build. The allowed values are: 1 <= n <= 6, 0 <= l <= n-1, -l <= m <= l. By default n = 1, l = 0, m = 0.

Charge

Set here the nucleus charge for the atomic orbital (by default 1.0, the nucleus charge for Hydrogen).
gamgi-0.17.5/doc/interfaces/orbital/modify_view.html000066400000000000000000000053161433127522700224360ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Modify

Orbital Modify

Change here the visual aspect for a single orbital or a list of orbitals.

To modify an orbital, click over its graphic image, or write its id on the Orbital entry. To modify a list of orbitals, press the button List (after creating the list of orbitals with Orbital->Select). Parameters for empty entries or Local choices remain unchanged.

To change an orbital name write the new name in the Orbital entry, followed by the orbital number (GAMGI needs the number to identify the orbital). To change the name for a list of orbitals, press List first and then write the new common name in the Name entry.

Color

Set here the R, G, B color components of the orbital, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0), in the positions where the wavefunction is positive.

When Phase is switched off (in the Volume page), the Color components are used to color the whole orbital.

Phase

Set here the R, G, B color components of the orbital, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0), in the places where the wavefunction is negative.

When Phase is switched off (in the Volume page), the Phase entries are disabled and the whole orbital is colored using only the Color components.

Frame

Set here the R, G, B color components of the orbital frame, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).

When Frame is switched off (in the Volume page), the Frame entries are disabled as the orbital frame is not shown.

Scale

Set the orbital size, including its child objects. Orbital objects are scaled around the orbital center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
gamgi-0.17.5/doc/interfaces/orbital/modify_volume.html000066400000000000000000000063101433127522700227660ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Modify

Orbital Modify

Change here the volume representation for a single orbital or a list of orbitals.

To modify an orbital, click over its graphic image, or write its id on the Orbital entry. To modify a list of orbitals, press the button List (after creating the list of orbitals with Orbital->Select). Parameters for empty entries or Local choices remain unchanged.

To change an orbital name write the new name in the Orbital entry, followed by the orbital number (GAMGI needs the number to identify the orbital). To change the name for a list of orbitals, press List first and then write the new common name in the Name entry.

Phase

When Phase is switched on (the default), the orbital is represented with two colors, to distinguish places where the wave function is positive and negative. When Phase is switched off, the whole orbital is represented with just one color.

Frame

When Frame is switched on (the default), a cubic frame is shown around the orbital, with a edge length equal to twice the sampling Radius defined in the Model page. When Frame is switched off, no frame is shown.

Octants

Often it is useful to show only parts of the orbital. In GAMGI each orbital is divided in 8 octants, four above the xy plane, marked as positive, and four below, marked as negative. The four octants, above and below, are numbered increasing in a counter-clockwise pattern, as usual in trigonometry. To set which orbital octants should be represented, switch on / off each of the eight octant buttons. By default all octants are shown.

Axes

When Axes is set to Radius, axes are shown with the radius length (when Frame is disabled) or the diameter length (when Frame is enabled). When Axes is set to Bohr, axes are shown with the length of Bohr first radius. When Axes is set to Unit, axes are shown with a unit length. When Axes is set to None, no axes are shown (the default).

When Frame is enabled (the default), axes are positioned along the frame edges, starting from the xyz lower corner. When Frame is disabled, axes start from the orbital center.

The options Bohr and Unit are useful only for small orbitals, otherwise the axes are barely visible.

gamgi-0.17.5/doc/interfaces/orbital/remove_object.html000066400000000000000000000027701433127522700227410ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Remove

Orbital Remove

  • Object
Indicate how to remove an orbital (or list of orbitals, previously selected with Orbital->Select, when Global is pressed).

Scope

When the Scope is All, the orbital and all its contents is removed. This is the default.

When the Scope is Container, the orbital is removed but its contents (child texts) is saved, linked to the orbital parent.

When the Scope is Contents, the orbital is preserved but all its contents (child texts) is removed.

When the removed orbital was part of the current object, the current layer becomes the new current object.

Clicking the mouse over an orbital in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/orbital/select_list.html000066400000000000000000000040221433127522700224200ustar00rootroot00000000000000 GAMGI Interfaces: Orbital Select

Orbital Select

  • List
Orbital->Select selects an orbital or a list of orbitals.

To select an orbital click the mouse over its visual representation: if GAMGI recognizes the orbital it becomes the new selected object, otherwise the mouse action is ignored.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

Only orbitals in the working layer can be selected, even if orbitals are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Orbital->Select shows a flat list of all orbitals currently existent in GAMGI, not necessarily in the same layer or window. For each orbital, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/plane/000077500000000000000000000000001433127522700166655ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/plane/copy_object.html000066400000000000000000000035231433127522700220560ustar00rootroot00000000000000 GAMGI Interfaces: Plane Copy

Plane Copy

Indicate here the number of plane copies to create and its destination.

Gamgi expects users to identify first the plane or list of planes to copy. When the Plane entry is active and empty, clicking the mouse over an plane, on the current layer (local selection), its identification is transported to the Plane entry. Pressing the List button, the current list of planes is selected instead.

Name

This is the name given to the new plane copies. The default is to copy the name of each original plane.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the plane or list of planes to copy, GAMGI expects users to identify a layer to where the planes should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of planes, the copies can also be created at the layer of each original plane, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/plane/copy_shift.html000066400000000000000000000024061433127522700217240ustar00rootroot00000000000000 GAMGI Interfaces: Plane Copy

Plane Copy

Set here the translation vector applied to each new plane.

By default, each copied plane has the same coordinates as the original plane. This is expected when copying a plane or a list of planes to a different layer. However, when each new plane is in the same layer as the original plane (for a list of planes, the Local option in the Layer menu), a small shift helps to separate the new planes from the original ones.

All other properties are the same for copied and original planes (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/plane/create_projection.html000066400000000000000000000062151433127522700232560ustar00rootroot00000000000000 GAMGI Interfaces: Plane Create

Plane Create

Set here how a crystallographic plane is projected.

Net

The projection net can be Wulff (Stereographic) or Schmidt (Equivalent). In the Wulff projection, the point to project (above) and the point of the sphere farther from the user (below) define a segment that intersects the circle at a point, giving the final representation.

In the Schmidt projection, the point to project (above) is rotated around the point of the sphere closer to the user (above), keeping the same XY direction, until both points have the same Z coordinate, and then divided by square root of 2, to be inside the circle with radius R at coordinate Z, giving the final representation.

Every family of crystallographic planes or directions can be described by the intersection of the plane or direction passing through the origin O with a sphere of radius R centered at O, defining a circumpherence or a point, respectively. These in turn can be projected on the circle parallel to the screen (constant Z coordinate) that divides the sphere in half, with radius R and origin O. In GAMGI, points in the half-sphere farther from the user are hidden, so only half-circumpherences and points above are visible.

Model

In both projections, a plane can always be represented by a Pole or a Trace. The intersection of a vector normal to the plane with the projection sphere is a point that projected gives the Pole representation. The intersection of the plane with the projection sphere is an arch that projected gives the Trace representation: a circumpherence arch in the Wulff projection and a 4th order conic arch in the Schmidt projection.

A plane can always be described by its normal vector, and a direction by its plane perpendicular, so both representations are valid for crystallographic planes and directions.

In a Wulff projection, angles between planes are given by the angles between the traces, so angles are preserved. This is not true for the Schmidt projection. The Wulff projection is mostly used in materials science.

In a Schmidt projection, minor circles on the sphere are distorted when projected but the areas are preserved. This is not true for the Wulff projection. The Schmidt projection is mostly used in structural geology.

gamgi-0.17.5/doc/interfaces/plane/create_scope.html000066400000000000000000000142761433127522700222210ustar00rootroot00000000000000 GAMGI Interfaces: Plane Create

Plane Create

Set here the atomic structure to include, and the range of planes to create, for a given crystallographic family.

Structure

It is often useful to recreate in a plane the atomic structure existing in the parent object. A list is first created, with all the atoms closer to the plane than the distance defined by Thickness.

When Structure is set to Copy, listed atoms are copied to the atomic or crystallographic planes just created. When Structure is set to Link, listed atoms are linked to the atomic or crystallographic planes just created. When Structure is set to None, only a polygonal representation of the plane is created, without atoms.

Filter

After collecting a list of atoms close enough to the plane, a filtering condition may be applied. This can be very useful to avoid atom superposition, resulting for example from atoms copied before to different planes.

When Filter is set to Class, atoms belonging to another planes are ignored. When Filter is set to Child, atoms not belonging directly to the plane parent are ignored. When Filter is set to Identical, atoms closer than a given distance (currently 1.0E-2, as defined in GAMGI_MATH_TOLERANCE_STRUCTURE) to a previous atom are ignored. When Filter is set to None, no filtering condition is applied.

Thickness

The polygonal representation of a plane is expanded as much as possible, limited by the cell volume, in crystallographic planes, and by the atoms within a Thickness range of the plane defined by the three atoms, in atomic planes.

Range

A crystallographic plane does not exist as a single plane, is always part of a family of infinite planes, passing through all the lattice nodes, with equal distances between them. Each plane of a family (h k l) intersects the lattice in n/h n/k n/l, where n = 0 means the plane passing through the origin and n = 1 is the usual representation of the plane closest to the origin.

The range of planes to create is defined by the values entered near to the buttons Start and End, describing the initial and final values of n. For example, setting Start to -1 and End to 1 creates 3 planes, intersecting the axes in: 1) -1/h -1/k -1/l; 2) 0; 3) 1/h 1/k 1/l. By default, only the nearest plane to the origin is considered: Start = 1 and End = 1.

Pressing the Start button, the entry is disabled and GAMGI creates automatically all the planes from the beginning of the cell volume to the final plane specified. Pressing the End button, the entry is disabled and GAMGI creates automatically all the planes from the end of the cell volume to the first plane specified. When both buttons are pressed, GAMGI creates automatically all the planes from the beginning to the end of the cell volume.

Node

A plane can also be defined indicating explicitly the coordinates of a node where the plane passes. For each plane family, there is a plane passing through the origin node and as nodes are equivalent, it follows that for any node, there is a plane of any family passing through there. To select the node, press Node, to open a second level dialog.

o1, o2, o3

These entries provide the coordinates of the node in the lower-left corner of the cell where the plane passes, calculated with conventional or primitive cell vectors. When the lattice is primitive or vectors are primitive, this corner node becomes the place where the plane passes.

o4

When the lattice is centered and vectors are conventional, a fourth coordinate o4 is needed to point the centered node where the plane passes. By default, o4 is 000, so no change is introduced. When the cell lattice is primitive P or the vectors defining the node are primitive, that is the only possible value for o4. For I, C, F, R centered lattices, o4 can also take the values:
I: 111
C: 110
F: 110, 101, 011
R: 211, 122
corresponding to the numerators of the inner node coordinates, (1/2 1/2 1/2) for I lattices, (1/2 1/2 0) for C lattices, (0 1/2 1/2) (1/2 0 1/2) (1/2 1/2 0) for F lattices and (1/3 2/3 2/3) (2/3 1/3 1/3) for R lattices.

After entering the node coordinates, pressing Ok saves the data, closes the second level dialog, and disables the range information in the first level dialog. Pressing Cancel, the current data in both dialogs is maintained and the second level dialog is closed.

Pressing Range in the first level dialog, removes the second level data, closes the second level dialog, enables and initializes (if empty) the range data.

The vectors used for the node coordinates, Conventional or Primitive, are those used to define the plane indices, in the Type page, of the first dialog.

When adding information in the second level dialog, the cell must have been entered before, so GAMGI can check if the node information is correct or not. For the same reason, when the Cell or Vectors information in the Type page is changed, all the information in the second level dialog is automatically discarded, as it might be wrong.

gamgi-0.17.5/doc/interfaces/plane/create_type.html000066400000000000000000000043141433127522700220610ustar00rootroot00000000000000 GAMGI Interfaces: Plane Create

Plane Create

Set here a crystallographic or atomic plane.

Reference

GAMGI can handle crystallographic planes, related with a cell containing the relevant crystallographic information, and atomic planes, defined by three non-colinear atoms.

To create crystallographic planes, set Reference to Cell. GAMGI automatically shows a Cell entry, H, K, L entries to indicate the plane indices, plus a Vectors menu, to select the cell vectors to use, Conventional or Primitive. For the sake of simplicity, GAMGI does not accept 4-indice notation for planes or directions in hexagonal cells.

Pressing the mouse over a cell in the current layer, the cell identification is automatically written in the Cell entry. When a valid cell is found and its Type is Projection, the default Polygon page is automatically replaced by a Projection page.

By default, only one family of crystallographic planes is created. To create a set of families simultaneously, press the button List.

When Reference is set to Atoms, GAMGI automatically shows three Atom entries. Pressing the mouse sucessively over three non-colinear atoms in the current layer, the three entries become occupied and the plane defined. After pressing Ok, an error is shown when the three atoms are collinear.

gamgi-0.17.5/doc/interfaces/plane/create_view.html000066400000000000000000000024601433127522700220520ustar00rootroot00000000000000 GAMGI Interfaces: Plane Create

Plane Create

Set here the visual aspect of a plane.

R, G, B

The R, G, B entries define the plane color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).

Scale

The Scale factor can be used to change a plane size, including its child objects. Plane objects are scaled around the plane center.

The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

gamgi-0.17.5/doc/interfaces/plane/link_object.html000066400000000000000000000060021433127522700220340ustar00rootroot00000000000000 GAMGI Interfaces: Plane Link

Plane Link

Link an plane or a list of planes to other objects.

Hierarchy

Planes can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by planes: Orbital and Text (the default). Pressing the button Above, the same menu shows the classes of objects that can own planes: Layer (the default), Assembly, Cell, Cluster, Molecule, Group, Plane and Direction.

Gamgi expects users to identify first the plane or list of planes and then the object to link. When the Plane entry is active and empty, clicking the mouse over an plane, on the current layer (local selection), its identification is transported to the Plane entry. Pressing the List button, the current list of planes is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or even in a different window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

Method

Gamgi suppports only one method to link planes: Object.

The Object method links a plane or a list of planes to a single object, Above or Below.

When the Hierarchy is Above, the plane is unlinked from its current parent and linked to the new object. When the plane is moved to a different layer, its bonds are automatically removed. When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the plane. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of planes Above, all planes in the list are unlinked and linked to the parent object. When linking a list of planes Below, the child object is replicated as many times as necessary to link each plane in the list to a different replica.

gamgi-0.17.5/doc/interfaces/plane/link_shift.html000066400000000000000000000032241433127522700217060ustar00rootroot00000000000000 GAMGI Interfaces: Plane Link

Plane Link

Set here the translation applied to the child object or list of objects.

When linking a plane to another object, the translation is always applied to the child object: the plane itself when linking above, the other object (direction, atom, orbital, text) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of planes is linked above, Reference is set by default to Child, so planes preserve their positions and are not superposed.

When a list of planes is linked below, each plane will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent planes and are not superposed.

gamgi-0.17.5/doc/interfaces/plane/measure_angle.html000066400000000000000000000036671433127522700223760ustar00rootroot00000000000000 GAMGI Interfaces: Plane Measure

Plane Measure

Measure Angles properties involving planes.

Quantity

The supported Angle properties are listed below. Planes and other objects selected may belong to different structural systems (cells, molecules, etc.), bonded or not. Only objects in the current layer can be chosen.

An easy technique to select the objects is to click the mouse sucessively over their visual representations, in the sequence shown in the dialog. After the last needed object is selected, GAMGI automatically starts the calculation.

2-Plane Angle

The angle between two planes.

Plane Direction Angle

The angle between a plane and a direction.

Value

After selecting a quantity, enter the name of the objects and press Ok. If all objects are recognized, GAMGI does the calculation and shows the result in the Value entry.

When a calculation ends, GAMGI keeps the objects identification. To start a new calculation, just click the mouse over a new object: GAMGI automatically cleans the previous data and inserts the new object identification. When a new quantity or page is chosen, previous data is automatically removed.

gamgi-0.17.5/doc/interfaces/plane/measure_area.html000066400000000000000000000103021433127522700222000ustar00rootroot00000000000000 GAMGI Interfaces: Plane Measure

Plane Measure

Measure Area properties involving planes.

Quantity

The supported Area properties are listed below. Planes and other objects selected may belong to different structural systems (cells, molecules, etc.), bonded or not. Only objects in the current layer can be chosen.

An easy technique to select the objects is to click the mouse sucessively over their visual representations, in the sequence shown in the dialog. After the last needed object is selected, GAMGI automatically starts the calculation.

Plane Node Area

The area per node in a crystallographic plane. The plane parent must be a cell object.

The area per node is calculated for the selected plane object, dividing the volume per node by the distance between planes: A = V / d. To ensure correct results, the real distance between adjacent planes must be used. GAMGI uses the following algorithm: 1) determine the smaller possible indices from the plane indices. For primitive lattices or primitive vectors these are always the true Miller indices.

2) for C, I, F, R centered lattices, with conventional vectors, the structure factor might be zero for these indices. In this case, there are equivalent planes at 1/2 (base-centered, body-centered and face-centered lattices) or 1/3 (rombohedral) of the distance to the origin. In this case, use the following rules to obtain the true Miller indices:

C: unless h+k == 2n, (h k l) becomes (2h 2k 2l)
I: unless h+k+l = 2n, (h k l) becomes (2h 2k 2l)
F: unless h,k,l have same parity, (h k l) becomes (2h 2k 2l)
R: unless -h+k+l = 3n, (h k l) becomes (3h 3k 3l)

For example, conventional planes (100) in cI and hR lattices are in fact (200) and (300) planes respectively, so the true distance between adjacent planes is actually d/2 and d/3, where d is the uncorrected distance. This correction is not taken into account when determining the Plane Separation, only when calculating the Plane Node Area and the Plane Node Density.

3) if the plane indices are smaller or equal to the Miller indices, the correct distance between planes is the distance for planes with Miller indices, as planes with smaller indices must be multiples of Miller planes, with the same area/node. If the plane indices are higher than the Miller indices, then the planes are either Laue planes or multiples of Laue planes, and in both cases an error message is issued, because the area/node is not uniquely defined for these planes.

For example, conventional planes (100) and (200) in cI have an area/node equal to a**2, but planes (300) and (400) have no unique area/node, varying between 0 and a**2. The Miller indices are (200).

Plane Node Density

The number of nodes per unit area in a crystallographic plane (the inverse of the previous quantity). The plane parent must be a cell object.

Value

After selecting a quantity, enter the name of the objects and press Ok. If all objects are recognized, GAMGI does the calculation and shows the result in the Value entry.

When a calculation ends, GAMGI keeps the objects identification. To start a new calculation, just click the mouse over a new object: GAMGI automatically cleans the previous data and inserts the new object identification. When a new quantity or page is chosen, previous data is automatically removed.

gamgi-0.17.5/doc/interfaces/plane/measure_length.html000066400000000000000000000045221433127522700225600ustar00rootroot00000000000000 GAMGI Interfaces: Plane Measure

Plane Measure

Measure Length properties involving planes.

Quantity

The supported Length properties are listed below. Planes and other objects selected may belong to different structural systems (cells, molecules, etc.), bonded or not. Only objects in the current layer can be chosen.

An easy technique to select the objects is to click the mouse sucessively over their visual representations, in the sequence shown in the dialog. After the last needed object is selected, GAMGI automatically starts the calculation.

Plane Separation

The distance between adjacent crystallographic planes. The plane parent must be a cell object.

The reported length is always the distance calculated from the equation d(hkl) = K/G(hkl), where G is the reciprocal lattice vector for planes (hkl) and K is the reciprocal lattice constant (the vector G is also proportional to K, so the result is independent of the reciprocal lattice constant).

Plane Atom Distance

The distance from a plane to an atom.

Value

After selecting a quantity, enter the name of the objects and press Ok. If all objects are recognized, GAMGI does the calculation and shows the result in the Value entry.

When a calculation ends, GAMGI keeps the objects identification. To start a new calculation, just click the mouse over a new object: GAMGI automatically cleans the previous data and inserts the new object identification. When a new quantity or page is chosen, previous data is automatically removed.

gamgi-0.17.5/doc/interfaces/plane/modify_position.html000066400000000000000000000045271433127522700227760ustar00rootroot00000000000000 GAMGI Interfaces: Plane Modify

Plane Modify

Change here the position and orientation for a single plane or a list of planes.

To modify a plane, click over its graphic image, or write its identification (name and number) on the Plane entry. To modify a list of planes, press the button List (after creating the list of planes with Plane->Select). Parameters for empty entries or Local choices remain unchanged.

To change a plane name write the new name in the Plane entry, followed by the plane number (GAMGI needs the number to identify the plane). To change the name for a list of planes, press List first and then write the new common name in the Name entry.

Translation

The position of a plane object can be changed using the X, Y, Z entries. The change can be Absolute or Relative (to the current position).

To go back to the initial position, set X, Y, Z, to 0, 0, 0, in Absolute mode.

Rotation

The orientation of a plane object, defined by the Euler angles theta, phi, psi, can be changed using the E1, E2, E3 entries. The change can be Absolute or Relative (to the current orientation). Euler angles are not addictive, so the plane is rotated back with the old angles and forward with the new ones.

To go back to the initial orientation, set E1, E2, E3, to 0, 0, 0, in Absolute mode.

gamgi-0.17.5/doc/interfaces/plane/modify_projection.html000066400000000000000000000074451433127522700233100ustar00rootroot00000000000000 GAMGI Interfaces: Plane Modify

Plane Modify

Change here the projection for a single plane or a list of planes.

To modify a plane, click over its graphic image, or write its identification (name and number) on the Plane entry. To modify a list of planes, press the button List (after creating the list of planes with Plane->Select). Parameters for empty entries or Local choices remain unchanged.

To change a plane name write the new name in the Plane entry, followed by the plane number (GAMGI needs the number to identify the plane). To change the name for a list of planes, press List first and then write the new common name in the Name entry.

Net

The projection net can be Wulff (Stereographic) or Schmidt (Equivalent). In the Wulff projection, the point to project (above) and the point of the sphere farther from the user (below) define a segment that intersects the circle at a point, giving the final representation.

In the Schmidt projection, the point to project (above) is rotated around the point of the sphere closer to the user (above), keeping the same XY direction, until both points have the same Z coordinate, and then divided by square root of 2, to be inside the circle with radius R at coordinate Z, giving the final representation.

Every family of crystallographic planes or directions can be described by the intersection of the plane or direction passing through the origin O with a sphere of radius R centered at O, defining a circumpherence or a point, respectively. These in turn can be projected on the circle parallel to the screen (constant Z coordinate) that divides the sphere in half, with radius R and origin O. In GAMGI, points in the half-sphere farther from the user are hidden, so only half-circumpherences and points above are visible.

Model

In both projections, a plane can always be represented by a Pole or a Trace. The intersection of a vector normal to the plane with the projection sphere is a point that projected gives the Pole representation. The intersection of the plane with the projection sphere is an arch that projected gives the Trace representation: a circumpherence arch in the Wulff projection and a 4th order conic arch in the Schmidt projection.

A plane can always be described by its normal vector, and a direction by its plane perpendicular, so both representations are valid for crystallographic planes and directions.

In a Wulff projection, angles between planes are given by the angles between the traces, so angles are preserved. This is not true for the Schmidt projection. The Wulff projection is mostly used in materials science.

In a Schmidt projection, minor circles on the sphere are distorted when projected but the areas are preserved. This is not true for the Wulff projection. The Schmidt projection is mostly used in structural geology.

gamgi-0.17.5/doc/interfaces/plane/modify_scope.html000066400000000000000000000154451433127522700222440ustar00rootroot00000000000000 GAMGI Interfaces: Plane Modify

Plane Modify

Set here the polygon representation and atomic structure for a single plane.

To modify a plane, click over its graphic image, or write its identification (name and number) on the Plane entry. To modify a list of planes, press the button List (after creating the list of planes with Plane->Select). Parameters for empty entries or Local choices remain unchanged.

To change a plane name write the new name in the Plane entry, followed by the plane number (GAMGI needs the number to identify the plane). To change the name for a list of planes, press List first and then write the new common name in the Name entry.

Structure

It is often useful to recreate in a plane the atomic structure existing in the parent object. A list is first created, with all the atoms closer to the plane than the distance defined by Thickness.

When Structure is set to Copy, listed atoms are copied to the atomic or crystallographic plane just created. When Structure is set to Link, listed atoms are linked to the atomic or crystallographic plane just created. When Structure is set to None, only a polygonal representation of the plane is created, without atoms.

Filter

After collecting a list of atoms close enough to the plane, a filtering condition may be applied. This can be very useful to avoid atom superposition, resulting for example from atoms copied before to different planes.

When Filter is set to Class, atoms belonging to another planes are ignored. When Filter is set to Child, atoms not belonging directly to the plane parent are ignored. When Filter is set to Identical, atoms closer than a given distance (currently 1.0E-2, as defined in GAMGI_MATH_TOLERANCE_STRUCTURE) to a previous atom are ignored. When Filter is set to None, no filtering condition is applied.

Thickness

The polygonal representation of the plane is expanded as much as possible, limited by the cell volume, in crystallographic planes, and by the atoms within a Thickness range of the plane defined by the three atoms, in atomic planes.

Range

A crystallographic plane does not exist as a single plane, is always part of a family of infinite planes, passing through all the lattice nodes, with equal distances between them. Each plane of a family (h k l) intersects the lattice in n/h n/k n/l, where n = 0 means the plane passing through the origin and n = 1 is the usual representation of the plane closest to the origin.

The range of planes to create is defined by the values entered near to the buttons Start and End, describing the initial and final values of n. For example, setting Start to -1 and End to 1 creates 3 planes, intersecting the axes in: 1) -1/h -1/k -1/l; 2) 0; 3) 1/h 1/k 1/l. By default, only the nearest plane to the origin is considered: Start = 1 and End = 1.

Pressing the Start button, the entry is disabled and GAMGI creates automatically all the planes from the beginning of the cell volume to the final plane specified. Pressing the End button, the entry is disabled and GAMGI creates automatically all the planes from the end of the cell volume to the first plane specified. When both buttons are pressed, GAMGI creates automatically all the planes from the beginning to the end of the cell volume.

Node

A plane can also be defined indicating explicitly the coordinates of a node where the plane passes. For each plane family, there is a plane passing through the origin node and as nodes are equivalent, it follows that for any node, there is a plane of any family passing through there. To select the node, press Node, to open a second level dialog.

O1, O2, O3

These entries provide the coordinates of the node in the lower-left corner of the cell where the plane passes, calculated with conventional or primitive cell vectors. When the lattice is primitive or vectors are primitive, this corner node becomes the place where the plane passes.

O4

When the lattice is centered and vectors are conventional, a fourth coordinate O4 is needed to point the centered node where the plane passes. By default, o4 is 000, so no change is introduced. When the cell lattice is primitive P or the vectors defining the node are primitive, that is the only possible value for o4. For I, C, F, R centered lattices, o4 can also take the values:
I: 111
C: 110
F: 110, 101, 011
R: 211, 122
corresponding to the numerators of the inner node coordinates, (1/2 1/2 1/2) for I lattices, (1/2 1/2 0) for C lattices, (0 1/2 1/2) (1/2 0 1/2) (1/2 1/2 0) for F lattices and (1/3 2/3 2/3) (2/3 1/3 1/3) for R lattices.

After entering the node coordinates, pressing Ok saves the data, closes the second level dialog, and disables the range information in the first level dialog. Pressing Cancel, the current data in both dialogs is maintained and the second level dialog is closed.

Pressing Range in the first level dialog, removes the second level data, closes the second level dialog, enables and initializes (if empty) the range data.

The vectors used for the node coordinates, Conventional or Primitive, are those used to define the plane indices, in the Type page, of the first dialog.

When adding information in the second level dialog, the cell must have been entered before, so GAMGI can check if the node information is correct or not. For the same reason, when the Cell or Vectors information in the Type page is changed, all the information in the second level dialog is automatically discarded, as it might be wrong.

gamgi-0.17.5/doc/interfaces/plane/modify_type.html000066400000000000000000000064771433127522700221210ustar00rootroot00000000000000 GAMGI Interfaces: Plane Modify

Plane Modify

Change here object and crystallographic data for a single plane or a list of planes.

To modify a plane, click over its graphic image, or write its identification (name and number) on the Plane entry. To modify a list of planes, press the button List (after creating the list of planes with Plane->Select). Parameters for empty entries or Local choices remain unchanged.

To change a plane name write the new name in the Plane entry, followed by the plane number (GAMGI needs the number to identify the plane). To change the name for a list of planes, press List first and then write the new common name in the Name entry.

Reference

GAMGI can handle crystallographic planes (selecting Cell), related with a cell containing the relevant crystallographic information, and atomic planes (selecting Atoms), defined by three non-colinear atoms.

For a single plane, Reference can be Cell, Atoms or Local. For a list of planes, Reference must be Local.

When Cell or Atoms is selected, the plane is recreated from scratch (as if using Plane->Create) and its old content is removed. As this requires local information for each plane, it cannot be done for a lists of planes. When Local is selected, previous features and contents are preserved, unless when specifically changed. Cell To create crystallographic planes, set Reference to Cell. GAMGI automatically shows a Cell entry, h, k, l entries to indicate the plane indices, plus a Vectors menu, to select the cell vectors to use, Conventional or Primitive. For the sake of simplicity, GAMGI does not accept 4-indice notation for planes or directions in hexagonal cells.

Pressing the mouse over a cell in the current layer, the cell identification is automatically written in the Cell entry. When a valid cell is found and its Type is Projection, the default Polygon page is automatically replaced by a Projection page. Atoms When Reference is set to Atoms, GAMGI automatically shows three Atom entries. Pressing the mouse sucessively over three non-colinear atoms in the current layer, the three entries become occupied and the plane defined. After pressing Ok, an error is shown if the atoms are disposed linearly.

gamgi-0.17.5/doc/interfaces/plane/modify_view.html000066400000000000000000000037431433127522700221030ustar00rootroot00000000000000 GAMGI Interfaces: Plane Modify

Plane Modify

Change here the visual representation for a single plane or a list of planes.

To modify a plane, click over its graphic image, or write its identification (name and number) on the Plane entry. To modify a list of planes, press the button List (after creating the list of planes with Plane->Select). Parameters for empty entries or Local choices remain unchanged.

To change a plane name write the new name in the Plane entry, followed by the plane number (GAMGI needs the number to identify the plane). To change the name for a list of planes, press List first and then write the new common name in the Name entry.

R, G, B

The R, G, B entries define the plane color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).

Scale

The Scale factor can be used to change a plane size, including its child objects. Plane objects are scaled around the plane center.

The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.

gamgi-0.17.5/doc/interfaces/plane/remove_object.html000066400000000000000000000035401433127522700224000ustar00rootroot00000000000000 GAMGI Interfaces: Plane Remove

Plane Remove

  • Object
Indicate how to remove a plane (or list of planes, previously selected with Plane->Select, when Global is pressed).

Scope

When the Scope is All, the plane and all its contents is removed. This is the default.

When the Scope is Container, the plane is removed but its contents (directions, atoms, bonds, orbitals, texts) is saved, linked to the plane parent.

When the Scope is Contents, the plane is preserved but all its contents (directions, atoms, bonds, orbitals, texts) is removed. Atomic planes are removed because they cannot live without the defining atoms.

When the Scope is direction, atom, bond, orbital or text, these objects are removed from the plane. When an atom used to define an atomic plane is removed, the plane is automatically removed.

When the removed plane was part of the current object, the current layer becomes the new current object.

Clicking the mouse over a plane in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/plane/select_list.html000066400000000000000000000033751433127522700220750ustar00rootroot00000000000000 GAMGI Interfaces: Plane Select

Plane Select

  • List
Plane->Select selects an plane or a list of planes.

To select an plane click the mouse over its visual representation: if GAMGI recognizes the plane it becomes the new selected object, otherwise the mouse action is ignored.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

Only planes in the working layer can be selected, even if planes are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Plane->Select shows a flat list of all planes currently existent in GAMGI, not necessarily in the same layer or window. For each plane, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/reference.html000066400000000000000000000161051433127522700204150ustar00rootroot00000000000000 GAMGI Interfaces: Reference

Graphic Interfaces

gamgi-0.17.5/doc/interfaces/shape/000077500000000000000000000000001433127522700166665ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/shape/create_view.html000066400000000000000000000012461433127522700220540ustar00rootroot00000000000000 GAMGI Interfaces: Shape Create

Shape Create

  • View
gamgi-0.17.5/doc/interfaces/shape/select.html000066400000000000000000000012171433127522700210340ustar00rootroot00000000000000 GAMGI Interfaces: Shape Select
Shape Select
 
gamgi-0.17.5/doc/interfaces/text/000077500000000000000000000000001433127522700165525ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/text/config_view.html000066400000000000000000000032251433127522700217410ustar00rootroot00000000000000 GAMGI Interfaces: Text Config

Text Config

  • View
Define here the visual style applied by default to new text messages. These can be rotated, moved and scaled, exactly as a molecule.

Style

This menu controls which style is applied by default when creating a new text object. GAMGI supports both Wired (stroked) and Solid (extruded) 3D fonts. Stroked fonts are faster and more suited for analysis. Extruded fonts are made from TrueType faces and are designed for presentations.

Wired

This menu sets which stroked font is applied by default when creating a new wired text object. Currently there are 14 stroked fonts available in GAMGI, including scripting and mathematical fonts. These fonts are relatively light, allowing text objects to change in real time.

Solid

This menu sets which extruded font is applied by default when creating a new solid text object. Currently there are 10 extruded fonts available in GAMGI. These fonts allow text objects to be illuminated, exactly as any other solid object.
gamgi-0.17.5/doc/interfaces/text/copy_object.html000066400000000000000000000035031433127522700217410ustar00rootroot00000000000000 GAMGI Interfaces: Text Copy

Text Copy

Indicate here the number of text copies to create and its destination.

Gamgi expects users to identify first the text or list of texts to copy. When the Text entry is active and empty, clicking the mouse over an text, on the current layer (local selection), its identification is transported to the Text entry. Pressing the List button, the current list of texts is selected instead.

Name

This is the name given to the new text copies. The default is to copy the name of each original text.

Number

This is the requested number of copies, a positive integer. The default is 1.

Layer

After identifying the text or list of texts to copy, GAMGI expects users to identify a layer to where the texts should be copied. Pressing the mouse over the graphic area in any window (global selection), creates a menu with all the layers in that window, which can then be selected. The current layer is initially proposed in the Layer entry.

When copying a list of texts, the copies can also be created at the layer of each original text, by setting Layer to Local.

gamgi-0.17.5/doc/interfaces/text/copy_shift.html000066400000000000000000000023721433127522700216130ustar00rootroot00000000000000 GAMGI Interfaces: Text Copy

Text Copy

Set here the translation vector applied to each new text.

By default, each copied text has the same coordinates as the original text. This is expected when copying a text or a list of texts to a different layer. However, when each new text is in the same layer as the original text (for a list of texts, the Local option in the Layer menu), a small shift helps to separate the new texts from the original ones.

All other properties are the same for copied and original texts (only the identification numbers are different).

gamgi-0.17.5/doc/interfaces/text/create_contents.html000066400000000000000000000025201433127522700226170ustar00rootroot00000000000000 GAMGI Interfaces: Text Modify

Text Modify

Enter here the text message.

Contents

This entry contains the text string. Currently GAMGI accepts only ASCII characters in the range 32-126:

\t \n ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ".

Currently GAMGI replaces tabs and newlines by spaces, so dialog interfaces and file formats behave in the same way. Currently text objects cannot be longer than GAMGI_ENGINE_LINE (200) characters.

gamgi-0.17.5/doc/interfaces/text/create_position.html000066400000000000000000000041401433127522700226260ustar00rootroot00000000000000 GAMGI Interfaces: Text Create

Text Create

Define here the text position and orientation.

Translation

The origin of a text object, defined as its top left corner, can be set using the X, Y, Z entries. A simpler way to set directly the text position is to click on the screen, at the wished position, after defining all the other text properties: a new text object is created at that position.

Rotation

The orientation of a text object, defined by the Euler angles theta, phi, psi, can be set using the E1, E2, E3 entries.

Euler angles in GAMGI are defined as follows: first, the (x, y, z) referential is rotated theta degrees (between 0 and 180) around the y axis, then the referential is rotated phi degrees (between 0 and 360) around the initial z axis, and finally it is rotated psi degrees (between 0 and 360) around the new z axis, always in the direct, counter-clockwise, direction. If the first Euler angle (theta) is zero, the old and new z axis coincide, thus (0, 0, 10) and (0, 5, 5) represent the same rotation.

By default text objects are on a plane parallel to the screen, corresponding to Euler angles (0, 0, 0). For this orientation, Wired (stroked) text objects, and Solid (extruded) text objects in a layer with an orthographic projection, will look exactly as normal 2D text messages.

gamgi-0.17.5/doc/interfaces/text/create_view.html000066400000000000000000000050641433127522700217420ustar00rootroot00000000000000 GAMGI Interfaces: Text Create

Text Create

Define here the text visual aspect.

Style

Gamgi supports Wired stroked fonts and Solid extruded fonts. Stroked fonts are faster and are more suited for analysis. Extruded fonts are made from TrueType faces and are designed for final presentations.

When a new Style is selected, the Face menu is automatically updated, showing only the fonts available for the new Style. The default font for the new Style is automatically selected.

Face

Currently GAMGI supports 14 stroked fonts:

1) Roman and Roman Monospace;
2) Sans and Sans Bold;
3) Serif and Serif Bold;
4) Script and Script Bold;
5) Gothic English, Gothic German and Gothic Italian;
6) Symbol Sans, Symbol Serif and Symbol Serif Bold.

The first two were made for Sun, used by the X consortium and currently distributed with GLUT and freeglut packages. The 12 other fonts were digitized by Allen V. Hershey, used by several packages and currently distributed with GNU plotutils.

Currently GAMGI supports 12 extruded fonts:


1) Sans, Sans Bold, Sans Italic and Sans Bold Italic;
2) Serif, Serif Bold, Serif_Italic and Serif Bold Italic;
3) Mono, Mono Bold, Mono Italic and Mono Bold Italic;

The typefaces for these 12 fonts were made from DejaVu TrueType fonts, derived from the Vera fonts made by BitStream for the Gnome project.

R, G, B

The R, G, B entries define the text color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).

Scale

Set the text size, including its child objects. Text objects are scaled around the text center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
gamgi-0.17.5/doc/interfaces/text/link_object.html000066400000000000000000000060231433127522700217240ustar00rootroot00000000000000 GAMGI Interfaces: Text Link

Text Link

Link a text or a list of texts to other objects.

Hierarchy

Texts can be linked to objects above or below, in the Gamgi hierarchy. Pressing the button Below (the default), the class menu shows the classes of objects that can be owned by texts. Pressing the button Above, the same menu shows the classes of objects that can own texts.

Gamgi expects users to identify first the text or list of texts and then the object to link. When the Text entry is active and empty, clicking the mouse over a text, on the current layer (local selection), its identification is transported to the Text entry. Pressing the List button, the current list of texts is selected instead.

Gamgi is now expecting users to click on a object of the class currently selected in the class menu. This object can be in a different layer or window (global selection).

To select a visible object, just press the mouse over the object, in its window. To select objects without visual representation, such as layers and lights, press the mouse over the graphic area in the window, to create a menu with all the objects of that class in the window, which can then be selected.

Method

Gamgi suppports only one method to link texts: Object.

The Object method links a text or a list of texts to a single object, Above or Below.

When linking a text and the Hierarchy is Above, the text is unlinked from its current parent and linked to the new object. When the Hierarchy is Below, the child object is unlinked from its current parent and linked to the text. An error is issued when the parent already owned the child object.

When the new child previously owned the new parent (a situation made possible because texts can own other texts), the new parent is first linked to the new child parent. An error is issued when the parent already owned the child object.

After the linking operation, Gamgi always puts on top the window and layer containing the linked objects.

When linking a list of texts Above, all texts in the list are unlinked and linked to the parent object. When linking a list of texts Below, the child object is replicated as many times as necessary to link each text in the list to a different replica.

gamgi-0.17.5/doc/interfaces/text/link_shift.html000066400000000000000000000031611433127522700215730ustar00rootroot00000000000000 GAMGI Interfaces: Text Link

Text Link

Set here the translation applied to the child object or list of objects.

When linking a text to another object, the translation is always applied to the child object: the text itself when linking above, the other object (text) when linking below.

The final child position is given by this translation vector added to the child or parent origin, as defined by the Reference option. By default this is the child origin and the translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of texts is linked above, Reference is set by default to Child, so texts preserve their positions and are not superposed.

When a list of texts is linked below, each text will be linked to a new, automatically created, child object, and Reference is set by default to Parent, so childs remain near their parent texts and are not superposed.

gamgi-0.17.5/doc/interfaces/text/modify_contents.html000066400000000000000000000036631433127522700226540ustar00rootroot00000000000000 GAMGI Interfaces: Text Modify

Text Modify

Change here the message contents for a single text or a list of texts.

To change a text name write the new name in the Text entry, followed by the text number (GAMGI needs the number to identify the text). To change the name for a list of texts, press List first and then write the new common name in the Name entry.

To modify a text, click over its graphic image, or write its id on the Text entry. To modify a list of texts, press the button List (after creating the list of texts with Text->Select). Parameters for empty entries or Local choices remain unchanged.

Contents

The new text string should be introduced here. Currently GAMGI accepts only ASCII characters in the range 32-126:

\t \n ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ".

Currently GAMGI replaces tabs and newlines by spaces, so dialog interfaces and file formats behave in the same way. Currently text objects cannot be longer than GAMGI_ENGINE_LINE (200) characters.

gamgi-0.17.5/doc/interfaces/text/modify_position.html000066400000000000000000000054141433127522700226570ustar00rootroot00000000000000 GAMGI Interfaces: Text Modify

Text Modify

Change here the position and orientation for a single text or a list of texts.

To modify a text, click over its graphic image, or write its id on the Plane entry. To modify a list of texts, press the button List (after creating the list of texts with Text->Select). Parameters for empty entries or Local choices remain unchanged.

To change a text name write the new name in the Text entry, followed by the text number (GAMGI needs the number to identify the text). To change the name for a list of texts, press List first and then write the new common name in the Name entry.

Translation

The origin of a text object, defined as its top left corner, can be changed using the X, Y, Z entries. The change can be Absolute or Relative (to the former origin).

Rotation

The orientation of a text object, defined by the Euler angles theta, phi, psi, can be changed using the E1, E2, E3 entries. The change can be Absolute or Relative (to the former Euler angles). Euler angles are not addictive, so the text must be rotated back with the old angles and forward with the new ones.

Euler angles in GAMGI are defined as follows: first, the (x, y, z) referential is rotated theta degrees (between 0 and 180) around the y axis, then the referential is rotated phi degrees (between 0 and 360) around the initial z axis, and finally it is rotated psi degrees (between 0 and 360) around the new z axis, always in the direct, counter-clockwise, direction. If the first Euler angle (theta) is zero, the old and new z axis coincide, thus (0, 0, 10) and (0, 5, 5) represent the same rotation.

By default text objects are on a plane parallel to the screen, corresponding to Euler angles (0, 0, 0). For this orientation, Wired (stroked) text objects, and Solid (extruded) text objects in a layer with an orthographic projection, will look exactly as normal 2D text messages.

gamgi-0.17.5/doc/interfaces/text/modify_view.html000066400000000000000000000062131433127522700217630ustar00rootroot00000000000000 GAMGI Interfaces: Text Modify

Text Modify

Change here the visual representation for a single text or a list of texts.

To modify a text, click over its graphic image, or write its id on the Text entry. To modify a list of texts, press the button List (after creating the list of texts with Text->Select). Parameters for empty entries or Local choices remain unchanged.

To change a text name write the new name in the Text entry, followed by the text number (GAMGI needs the number to identify the text). To change the name for a list of texts, press List first and then write the new common name in the Name entry.

Style

Gamgi supports Wired stroked fonts and Solid extruded fonts. Stroked fonts are faster and are more suited for analysis. Extruded fonts are made from TrueType faces and are designed for final presentations.

When a new Style is selected, the Face menu is automatically updated, showing only the fonts available for the new Style. The default font for the new Style is automatically selected.

Face

Currently GAMGI supports 14 stroked fonts:

1) Roman and Roman Monospace;
2) Sans and Sans Bold;
3) Serif and Serif Bold;
4) Script and Script Bold;
5) Gothic English, Gothic German and Gothic Italian;
6) Symbol Sans, Symbol Serif and Symbol Serif Bold.

The first two were made for Sun, used by the X consortium and currently distributed with GLUT and freeglut packages. The 12 other fonts were digitized by Allen V. Hershey, used by several packages and currently distributed with GNU plotutils.

Currently GAMGI supports 12 extruded fonts:


1) Sans, Sans Bold, Sans Italic and Sans Bold Italic;
2) Serif, Serif Bold, Serif_Italic and Serif Bold Italic;
3) Mono, Mono Bold, Mono Italic and Mono Bold Italic;

The typefaces for these 12 fonts were made from DejaVu TrueType fonts, derived from the Vera fonts made by BitStream for the Gnome project.

R, G, B

The R, G, B entries define the text color, from black (0.0, 0.0, 0.0) to white (1.0, 1.0, 1.0).

Scale

Set the text size, including its child objects. Text objects are scaled around the text center. The visual representation of an object is always scaled by its own scale factor multiplied by the scale factor of all its parent objects until layer, inclusive.
gamgi-0.17.5/doc/interfaces/text/remove_object.html000066400000000000000000000027251433127522700222710ustar00rootroot00000000000000 GAMGI Interfaces: Text Remove

Text Remove

  • Object
Indicate how to remove a text (or list of texts, previously selected with Text->Select, when Global is pressed).

Scope

When the Scope is All, the text and all its contents is removed. This is the default.

When the Scope is Container, the text is removed but its contents (child texts) is saved, linked to the text parent.

When the Scope is Contents, the text is preserved but all its contents (child texts) is removed.

When the removed text was part of the current object, the current layer becomes the new current object.

Clicking the mouse over a text in the current layer, its identification is transported to the dialog and Ok is automatically pressed. To recover the previous state press Undo.

gamgi-0.17.5/doc/interfaces/text/select_list.html000066400000000000000000000037551433127522700217640ustar00rootroot00000000000000 GAMGI Interfaces: Text Select

Text Select

  • List
Text->Select selects a text or a list of texts.

To select an text click the mouse over its visual representation: if GAMGI recognizes the text it becomes the new selected object, otherwise the mouse action is ignored.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

Only texts in the working layer can be selected, even if texts are visible in other (transparent or translucid) layers. For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Text->Select shows a flat list of all texts currently existent in GAMGI, not necessarily in the same layer or window. For each text, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/interfaces/window/000077500000000000000000000000001433127522700170755ustar00rootroot00000000000000gamgi-0.17.5/doc/interfaces/window/config_ruler.html000066400000000000000000000064761433127522700224560ustar00rootroot00000000000000 GAMGI Interfaces: Window Config

Window Config

  • Ruler
Define here the maximum and step parameters controlling the ruler (in the tools menu).

Rotate

Max sets the range of angle values accepted by the ruler, to rotate objects. Clicking on the ruler extreme left, the object is rotated by -Max. Clicking on the ruler extreme right, the object is rotated by Max. Max must be positive.

The rotation angle applied to the object, when clicking on the ruler, increases from the extreme left to the extreme right (from -Max to +Max), in a step by step way. The width of each step, starting from the center to the extremes, is defined by Step.

For example, when Step is set to Max, only two angles are recognized: -Max on the left (negative) side and +Max on the right (positive) side of the ruler. When Step is 0, the angle changes continuously from one extreme to the other.

Step cannot exceed Max, otherwise the extreme values would never be reached (the central value is always 0).

Move

Max sets the range of length values accepted by the ruler, to move objects. Clicking on the ruler extreme left, the object is moved by -Max. Clicking on the ruler extreme right, the object is moved by Max. Max must be positive.

The translation length applied to the object, when clicking on the ruler, increases from the extreme left to the extreme right (from -Max to +Max), in a step by step way. The width of each step, starting from the center to the extremes, is defined by Step.

For example, when Step is set to Max, only two lengths are recognized: -Max on the left (negative) side and +Max on the right (positive) side of the ruler. When Step is 0, the length changes continuously from one extreme to the other.

Step cannot exceed Max, otherwise the extreme values would never be reached (the central value is always 0).

Scale

Max sets the range of factor values accepted by the ruler, to scale objects. Clicking on the ruler extreme left, the object is scaled by 1 / Max. Clicking on the ruler extreme right, the object is scaled by Max. Max must be larger than 1.

For example, when Step is set to Max - 1, only two factors are recognized: 1 / Max on the left side and Max on the right side of the ruler. When Step is 0, the factor changes continuously from one extreme to the other.

Step cannot exceed Max - 1, otherwise the extreme values would never be reached (the central value is always 1).

gamgi-0.17.5/doc/interfaces/window/copy_object.html000066400000000000000000000025201433127522700222620ustar00rootroot00000000000000 GAMGI Interfaces: Window Copy

Window Copy

  • Object
Indicate here the number of window copies to create.

Gamgi expects users to identify first the window or list of windows to copy. When the Window entry is active and empty, pressing the mouse over window graphic area (local selection), creates a menu with all the top windows, which can then be selected and the identification transported to the Window entry. Pressing the List button, the current list of windows is selected instead.

Name

This is the name given to the new window copies. The default is to copy the name of each original window.

Number

This is the requested number of copies, a positive integer. The default is 1.
gamgi-0.17.5/doc/interfaces/window/link_object.html000066400000000000000000000055051433127522700222530ustar00rootroot00000000000000 GAMGI Interfaces: Window Link

Window Link

Link a window or a list of windows to layers.

Object

Windows can be linked only to Layer objects.

Gamgi expects users to identify first a window or list of windows and then a layer to link. When the Window entry is active and empty, pressing the mouse over the graphic area in the current window (local selection) creates a menu with all the windows in Gamgi, which can then be selected. The current window is initially proposed in the Window entry. Pressing the List button, the current list of windows is selected instead.

Gamgi is now expecting users to click over the graphic area in a window (global selection), to create a menu with all the layers in that window, which can then be selected, to enter the Layer entry.

In the link mode Object, the selected layer must be in a different window. In the link mode All, the layer can be any layer in the selected window or any non-empty layer in another window.

Method

Gamgi suppports two methods to link windows: Object and All.

The Object method links a window to a single Layer. The layer is unlinked from its previous window and linked to the new window. The layer history kept by the Undo and Save mechanisms is preserved in this operation. An error is issued when the selected layer was already in the window.

After the linking operation, Gamgi always puts on top the selected window and layer.

When linking a list of windows, the layer is replicated as many times as necessary to link each window in the list to a different replica. The layer history kept by the Undo and Save mechanisms is not copied to the replicas.

The All method moves all the non-empty layers in all the other windows to the selected window, remove all the other windows which now have only empty layers, and finally put the selected layer as current layer. An error is issued when the selected layer cannot be found among the layers reunited in the window.

When a list of windows is selected, the All method is disabled.

gamgi-0.17.5/doc/interfaces/window/link_shift.html000066400000000000000000000024611433127522700221200ustar00rootroot00000000000000 GAMGI Interfaces: Window Link

Window Link

Set here the translation applied to each layer linked to a window or list of windows.

When linking a window to a layer, the translation is always applied to the layer. The final position is obtained adding this translation vector to all the layer objects. By default this translation vector is 0.0, 0.0, 0.0, so no translation is applied.

When a list of windows is linked, each window will be linked to a new, automatically created layer, with the same parameters of the proposed layer, so new layer objects get the same positions as the objects in the proposed layer.

gamgi-0.17.5/doc/interfaces/window/remove_object.html000066400000000000000000000026231433127522700226110ustar00rootroot00000000000000 GAMGI Interfaces: Window Remove

Window Remove

  • Object
Indicate how to remove a window (or list of windows, previously selected with Window->Select, when Global is pressed).

Scope

When the Scope is All, the window and all its layers are removed. This is the default.

When the Scope is Contents, the window is preserved but all its layers are removed and replaced by a new one. The new layer becomes the current object and the current layer.

Clicking the mouse over the graphic area in the current window creates a menu with all the windows, which can then be selected. Initially, the identification of the current window is inserted in the Window entry. This task cannot be reversed, so pressing Ok is required.

gamgi-0.17.5/doc/interfaces/window/select_list.html000066400000000000000000000031521433127522700222760ustar00rootroot00000000000000 GAMGI Interfaces: Window Select

Window Select

  • List
Window->Select selects a window or a list of windows.

To select a window click the mouse anywhere over the screen: a menu pops up listing the identification of all the top windows. If a window is selected, it becomes the new selected object.

When an object is selected, a beep is emitted and the object identification is shown in the window status bar, first in a highlighted color (to emphasize that the current object has changed) and then in the default color (after a few seconds).

For each top window, only one selected object is maintained. This can be Gamgi (everything), Window (the current window), Layer (the current layer), or a child object of the current layer. To see which object is currently selected see its identification in the window statusbar.

Window->Select shows a flat list of all windows currently existent in GAMGI. For each window, a hierarchical tree shows all its child objects.

gamgi-0.17.5/doc/keywords/000077500000000000000000000000001433127522700153125ustar00rootroot00000000000000gamgi-0.17.5/doc/keywords/arrow.html000066400000000000000000000022611433127522700173330ustar00rootroot00000000000000 GAMGI Keywords: Arrow
Arrow
 
Arrow objects include different types of 2D and 3D arrows, which are not text objects but are very useful to prepare images containing atomic structures, graphs, text, etc., for presentations at seminars or school teaching, or for producing printed images for articles or books. Arrow objects can own text objects (only). This is useful for example to add an equilibrium constant over a double arrow symbolising a chemical equilibrium. The low-level engine infra-structure required to implement arrow objects is fully implemented but everything else is not done yet.
gamgi-0.17.5/doc/keywords/assembly.html000066400000000000000000000022311433127522700200150ustar00rootroot00000000000000 GAMGI Keywords: Assembly
Assembly
 
Assembly is an object container, designed to be fully flexible. An assembly can contain any GAMGI objects, including other assembly objects, except lights, layers and windows. An assembly object is therefore a recursive object, with unlimited nested levels. For example, an assembly can be used to associate a graph with a molecule and a cell, to manipulate all of them at once. The low-level engine infra-structure required to implement assembly objects is fully implemented but everything else is still under construction.
gamgi-0.17.5/doc/keywords/atom.html000066400000000000000000000013541433127522700171430ustar00rootroot00000000000000 GAMGI Keywords: Atom
Atom
 
Atoms are the most important objects in GAMGI. They can own orbitals, texts and are the only objects that can own bonds.
gamgi-0.17.5/doc/keywords/bond.html000066400000000000000000000014621433127522700171250ustar00rootroot00000000000000 GAMGI Keywords: Bond
Bond
 
GAMGI handles bonds between atoms as objects owned by these atoms. Each atom can have an unlimited number of bonds. Each bond must have two parent atoms. Bonds can own orbitals and texts.
gamgi-0.17.5/doc/keywords/cell.html000066400000000000000000000031301433127522700171140ustar00rootroot00000000000000 GAMGI Keywords: Cell
Cell
 
All the GAMGI functionality related with atomic structures with periodic boundary conditions is handled by cell objects. Crystalline structures can be created indicating either a crystalline lattice and a motif or a space group and an asymmetric unit. The 14 Bravais lattices can be represented by Conventional, Primitive and Wigner-Seitz cells, plus Rhombus and Sphere volumes. Users can choose the number of cells, the volume size, the cell positioning, the type of cell borders, solid or wired cell representations, and the cell color. Any Cluster, Molecule, Group, Atom or even Orbital, Text object can be used as a valid motif to construct a periodic structure. GAMGI provides powerful yet simple pattern rules to indicate which lattice nodes should be filled, this way allowing users to create complex mixed structures that can be used to study liquids and other non-periodic systems. In particular, these pattern rules can be used to build 2D and 1D periodic and non-periodic structures.
gamgi-0.17.5/doc/keywords/cluster.html000066400000000000000000000021471433127522700176650ustar00rootroot00000000000000 GAMGI Keywords: Cluster
Cluster
 
Cluster is an object container, designed to contain an unlimited number of chemical species as child objects, including other clusters, molecules, groups, atoms and related objects as texts, orbitals, directions and planes. A cluster is therefore a recursive object, with unlimited nested levels, and its properties should reflect the child chemical features. The low-level engine infra-structure required to implement cluster objects is fully implemented but everything else is not done yet.
gamgi-0.17.5/doc/keywords/direction.html000066400000000000000000000027451433127522700201700ustar00rootroot00000000000000 GAMGI Keywords: Direction
Direction
 
Direction objects were designed primarily to handle crystallographic directions but they should provide useful functionality even in the absence of 3D or 2D cells. The low-level engine infra-structure required to implement direction objects is fully implemented but everything else is not done yet. Direction objects must handle 3- and 4- (for hexagonal lattices) crystallographic indices notations, and all the related crystallographic relations provided by direct- and reciprocal-lattice representations. Users should be able to choose directions of atoms in cells, clusters or molecules, automatically producing direction objects reproducing those directions, including the atoms and its child, bonds, orbitals and texts, and then handle these new direction objects as totally independent viewing and building tools. Direction objects can own atoms, orbitals and texts.
gamgi-0.17.5/doc/keywords/file.html000066400000000000000000000047161433127522700171270ustar00rootroot00000000000000 GAMGI Keywords: File
File
 
GAMGI exports files to the following formats: xml, xyz, x3d, png, jpeg, tiff, by simply writing the filename with this extension name in the File->Export dialog.

GAMGI imports files from the following formats: xml, xyz, by simply writing the filename with this extension name in the File->Import dialog.

xml

This is the GAMGI native file format to import and export everything in GAMGI, including object and config data. It uses all the advantages of the XML text file specifications. The specific format used in GAMGI is described in detail in the documentation, in Help->Topic->Formats. GAMGI exports only the contents of the current object.

xyz

This is a simple file format to describe sets of atoms. It is very convenient to import and export atomic data to and from other sources. Essentially, the first line indicates the number of atoms, the second line is a comment, and then each line contains the chemical element and the x,y,z coordinates of a single atom. GAMGI exports only the atoms belonging to the current object.

x3d

This is the modern XML version of the VRML text file format specification, to describe 3D graphic scenes, with all sorts of objects and lights. GAMGI exports only the current layer of the current window, with everything inside, to X3D format.

png, jpeg, tiff

GAMGI exports the entire pixel representation of the current window, as a single image, to one of these formats. GAMGI also accepts the three letter names commonly used in some operating systems: jpg and tif.

Initially Gamgi creates a ppm file of the entire screen of the current window, and then uses the standalone facilities pnmtopng, pnmtojpeg and pnmtotiff (commonly available in Unix/Linux/BSD systems) to convert to png, jpeg and tiff file formats.

gamgi-0.17.5/doc/keywords/gamgi.html000066400000000000000000000025411433127522700172660ustar00rootroot00000000000000 GAMGI Keywords: Gamgi
Gamgi
 
The keyword Gamgi is used to designate global operations.

In Object->Select dialogs, setting the Scope to Gamgi means that the scope includes all layers and windows currently available.

When the mouse middle button is pressed over some object label, in a window top menu, and then over the Gamgi label in the same menu, the previously selected list of objects of the type chosen with the first mouse click becomes the new current object, indicated by a Object List label shown in the bottom status area.

In xml files, a block <gamgi> ... </gamgi> indicates that everything inside is not object data but configuration data, to be applied everywhere, to current and future objects.

gamgi-0.17.5/doc/keywords/graph.html000066400000000000000000000022331433127522700173010ustar00rootroot00000000000000 GAMGI Keywords: Graph
Graph
 
Graph objects will be used to describe all sort of graphic information usually related with atomic structures, including for example radial distribution functions and electron density maps. In particular, graphs will be used to represent the copious amount of data often provided by ab-initio and molecular mechanics calculations. Graphs can own text objects only, which will be used for captions, titles, labels, etc. The low-level engine infra-structure required to implement graph objects is fully implemented but everything else is not done yet.
gamgi-0.17.5/doc/keywords/group.html000066400000000000000000000030431433127522700173340ustar00rootroot00000000000000 GAMGI Keywords: Group
Group
 
Group is an object container designed to handle a fragment of a molecule, a residue of a protein, a mero of a polymer chain, or other chemical species. Group objects can contain an unlimited number of other chemical species as groups, atoms, and related objects as texts, orbitals, directions and planes. A group is therefore a recursive object, with unlimited nested levels, and its properties should reflect the child chemical features. For example, an amino-acid has amino NH2 and carboxylic acid COOH groups, the later in turn contains an hydroxyl group OH. The low-level engine infra-structure required to implement group objects is fully implemented. Mechanisms to measure length, angle and torsion measurements in groups of atoms are already in place and tested. Algorithms and tools to modify length, angle and torsion values, in both open and cyclic structures have been implemented and fully tested. Everything else is not done yet.
gamgi-0.17.5/doc/keywords/help.html000066400000000000000000000042471433127522700171370ustar00rootroot00000000000000 GAMGI Keywords: Help
Help
 
In GAMGI, Help is regarded as an object (as atoms or lights), which can occur only once. Because Help explains how the other objects work, it is conceptually a child of them, thus appearing in last place in the top menu bar, in the main windows interface. Everything related with Help in GAMGI is available only from this Help button in the menu bar.

To change the Help configuration data (source, agent, colors), please read Gamgi->Control->Help.

For all the five Help options available, the actual Agent showing the information can be Gamgi or an external Browser, and the actual Data shown can be Local, fetched from the user computer system, or Remote, downloaded from the GAMGI web site: http://www.gamgi.org/.

When using Remote data, the information at http://www.gamgi.org/ might be more recent and accurate than the Local data shipped with the GAMGI version being used. However, it requires web access and is limited by transmission speed.

The formatting presented by the Browser agent might be easier to read than the formatting used by the Gamgi agent. However, this requires launching a browser, often a slow and memory hungry application.

By default, GAMGI uses Local data and the Gamgi agent. Other options can be set either importing XML files with new configuration values or changing them on Gamgi->Control->Help.

gamgi-0.17.5/doc/keywords/layer.html000066400000000000000000000033261433127522700173200ustar00rootroot00000000000000 GAMGI Keywords: Layer
Layer
 
GAMGI supports multiple, unlimited, layers for each window, allowing users to move and copy objects between different layers and see multiple layers simultaneously, if they wish. A layer can own all kinds of GAMGI objects, except bonds, windows and layers. In particular, layers are the only GAMGI objects that can own lights.

Most of the layer functionality is already in place, including perspective and orthographic projections, full control over projection and model view (like a photographic camera) parameters, inside and outside visibility, background color, plus undo and save history mechanisms to keep and recover the whole contents of each layer, for as many levels as previously defined. Perspective projection is better to simulate realistic views but the orthographic projection (mostly used in architecture) is usually preferred for most work related with building and viewing structures, because these are not distorted by perspective. The projection parameters, that control the matrix transformations related with the projection of the 3D space on the screen, are fully controlled by the users.

gamgi-0.17.5/doc/keywords/light.html000066400000000000000000000024451433127522700173140ustar00rootroot00000000000000 GAMGI Keywords: Light
Light
 
Everything related with lightning in GAMGI is handled by light objects. GAMGI lights implement all the functionality provided by the OpenGL specification. This includes directional, positional and spot lights, ambient, diffuse and specular light components, and axial and radial light attenuations. The maximum number of lights that each layer can own is fixed by the graphics library used with GAMGI. In Mesa this number is currently 8, the minimum required by the OpenGL specification. However, as the number of layers that each window can own is unlimited, the same is true for the total number of lights per image. Lights are the only objects in GAMGI that cannot own other objects.
gamgi-0.17.5/doc/keywords/molecule.html000066400000000000000000000015011433127522700200020ustar00rootroot00000000000000 GAMGI Keywords: Molecule
Molecule
 
Molecule objects are essentially containers, objects whose primary purpose is to contain other objects, as atoms and bonds. Molecules can own groups, planes, directions, atoms, orbitals and texts.
gamgi-0.17.5/doc/keywords/orbital.html000066400000000000000000000027611433127522700176420ustar00rootroot00000000000000 GAMGI Keywords: Orbital
Orbital
 
Only the low-level engine infra-structure of orbital objects is implemented so far. The goal is to describe: 1) simple hydrogen-like orbitals, s, p, d, f, etc., and its hybridisations, sp, sp2, sp3, etc.; 2) complex representations of the electronic clouds surrounding the nucleus, commonly provided by combinations of Gaussian, Slater and plane wave analytic functions; 3) combinations of numerical functions usually described by spline line coefficients; 4) pseudo-potentials electronic descriptions. The main difficulty with orbitals is to collect the data from files with completely different formats, provided by Gaussian, ADF, DSolid, Plana, etc. and build a common way to handle all this information. This problem must be correlated with the way GAMGI handles input/output data. Orbitals can own text objects, so for example the name of the orbital can be attached to it.
gamgi-0.17.5/doc/keywords/plane.html000066400000000000000000000026701433127522700173040ustar00rootroot00000000000000 GAMGI Keywords: Plane
Plane
 
Plane objects were designed primarily to handle crystallographic planes but they should provide useful functionality even in the absence of 3D periodic objects (cells). Plane objects can own directions, atoms, orbitals and texts. The low-level engine infra-structure required to implement plane objects is fully implemented but everything else is not done yet. Plane objects must handle Miller and Miller-Bravais indices and all the related crystallographic relations provided by direct- and reciprocal-lattice representations. Users should be able to choose planes of atoms in cells, clusters or molecules, automatically producing plane objects reproducing those planes, including the atoms and its child, bonds, orbitals and texts, and then handle these new plane objects as totally independent viewing and building tools.
gamgi-0.17.5/doc/keywords/shape.html000066400000000000000000000027031433127522700173020ustar00rootroot00000000000000 GAMGI Keywords: Shape
Shape
 
Shape objects describe backgrounds, boxes, circles, ellipses, diamonds, etc. designed to make an image for a presentation more clear and pretty. The aim is therefore to fill the gap between text and arrow objects. Shape objects can own text objects only. This is useful, for example to include a message in a box. Nice functionality to have in GAMGI shape objects includes: 1) several styles should be provided for shape objects, including solid, contour, partially transparent, etc.; 2) mechanisms should be provided to allow users to choose and apply OpenGL textures, in 2D and 3D shape objects; 3) mechanisms should be provided to allow users to make textures, namely profile gradients, as in the GIMP. The low-level engine infra-structure required to implement shape objects is fully implemented but everything else is not done yet.
gamgi-0.17.5/doc/keywords/text.html000066400000000000000000000033311433127522700171640ustar00rootroot00000000000000 GAMGI Keywords: Text
Text
 
AMGI supports both wired (stroked) and solid (extruded) 3D fonts.

Stroked fonts are needed to show information (as measurements and object identification) on the screen, which needs to be three-dimensional because it will be linked to molecules and other three-dimensional objects. Stroked fonts are relatively simple, so characters can be drawn fast. Measurements and object identification must work in both manual and automatic modes. In the automatic mode, measurements of distances and angles must be recalculated and the results updated in the text objects in real time, while the user manipulates the objects.

Extruded fonts are designed to provide the highest possible visual quality to text objects. These fonts work well with lights and can be very complex, so they are much slower than the stroked fonts.

Text objects can own other text objects only, so they are recursive objects. This gives the user maximum flexibility to manipulate different text fragments separately and compose them to obtain the final result. Text objects can be owned by any other GAMGI object except lights and windows.

gamgi-0.17.5/doc/keywords/window.html000066400000000000000000000015351433127522700175130ustar00rootroot00000000000000 GAMGI Keywords: Window
Window
 
GAMGI supports unlimited, independent, top windows, which allow users to easily move and copy objects between them. Windows can own layer objects only, describing the various graphic layers created by the user for each window.
gamgi-0.17.5/doc/main.html000066400000000000000000000100251433127522700152530ustar00rootroot00000000000000 GAMGI Interfaces: Main
Main
 

Interfaces

Throughout all interfaces and formats, lengths are in angstrom, angles in degrees and decimal numbers are represented with dots. Every parameter that can be defined in an interface can be defined also in a file and vice-versa.

To rotate, move, scale the selected object, dragg the mouse, pressing the left, middle, right mouse button. Export the selected object choosing File->Export. The statusbar shows the selected object (left) and layer (right).

To select an object, choose Object->Select and press over the object. Or choose the object class on the menu above, with the middle button, before pressing on the object. Or press twice Layer, Window or Gamgi on the menu above. When the object has no visual representation, press the mouse over the graphic area, to pop up a menu.

To select a layer, choose Layer->Select and press the mouse over the graphic area, to pop up a menu. Or choose the layer class on the menu above, with the middle button, before pressing the mouse over the graphic area, to pop up a menu.

Solid objects usually require lights with diffuse and specular components to be properly represented in 3D space, otherwise they look flat. Wired objects do not have a 3D representation, so diffuse and specular lights are not reflected, becoming poorly visible when using lights, unless a significant ambient component is used. Often it is worth to draw solid and wired objects in different layers, with and without lights.

When a task dialog is open, to learn how it works, just select Help->Current and another dialog will pop up, explaining the meaning of all the parameters in the task dialog.

Detailed explanations of Gamgi interfaces, are available at http://www.gamgi.org/interfaces/reference.html, doc/interfaces/reference.html or Help->Topic->Interfaces.

Formats

Files can be imported in .xyz and .xml native format, selected automatically by the file extension. Files can be exported in .ps, .ppm, .jp[e]g, .png, .tif[f], .x3d and native .xml formats, selected automatically by the file extension. Formats .jp[e]g, .png and .tif[f] require pnmtojpeg, pnmtopng, pnmtotiff, widely available and usually installed by default in most systems.

Files can be exported using File->Export. Only the currently selected object is actually exported!

Files can be imported using File->Import or adding filenames to the command line, when starting Gamgi:


gamgi file_1.xml ... file_n.xml
where file_n.xml is a fullname such as:

../dat/molecule/flavors/garlic.xml
~/gamgi/dat/molecule/flavors/garlic.xml
http://www.gamgi.org/dat/molecule/flavors/garlic.xml
ftp://ftp.gamgi.org/gamgi/dat/molecule/flavors/garlic.xml

Object and config data can be mixed, so file_1.xml might be a preferences file, loaded before the other object files. To automate the procedure, just add a line as this to .bashrc:


alias gamgi='gamgi ~/gamgi/my_defaults.xml'

Detailed explanations of valid formats, are available at http://www.gamgi.org/formats/formats.html, doc/formats/formats.html or Help->Topic->Formats.

gamgi-0.17.5/doc/man/000077500000000000000000000000001433127522700142165ustar00rootroot00000000000000gamgi-0.17.5/doc/man/README000066400000000000000000000003001433127522700150670ustar00rootroot00000000000000To check the result: groff -man -Tascii page | less To install: gzip page cp page.gz /usr/share/man/man1/gamgi.1.gz man gamgi To produce a postcript version: groff -man page > page.ps gamgi-0.17.5/doc/man/page000066400000000000000000000114471433127522700150640ustar00rootroot00000000000000.TH GAMGI 1 "November 30 2009" "0.14.3" "GAMGI Manual Page" .SH NAME gamgi \- general atomistic modelling graphic interface .SH SYNOPSIS .B gamgi .BI [ file_1.xml ] .I ... .BI [ file_n.xml ] .SH DESCRIPTION .B gamgi is a computer package to construct, view and analyse atomic structures. .SH OPTIONS \fIfile_n.xml\fP is a fullname such as: .PP .nf \%../dat/molecule/flavors/garlic.xml \%~/gamgi/dat/molecule/flavors/garlic.xml \%http://www.gamgi.org/dat/molecule/flavors/garlic.xml \%ftp://ftp.gamgi.org/gamgi/dat/molecule/flavors/garlic.xml .fi .PP Object and config data can be mixed, so \fIfile_1.xml\fP might be a preferences file, loaded before the other object files. To automate the procedure, just add a line as this to \fI~/.bashrc\fP: .IP .B alias gamgi='gamgi ~/gamgi/my_defaults.xml' .SH ENVIRONMENT .TP .B GAMGI_HELP Set this variable to let GAMGI know where the Help documentation files are. For example, add a line as this to \fI~/.bashrc \fP: .IP .B GAMGI_HELP=~/gamgi/gamgi/doc; export GAMGI_HELP .TP .B GAMGI_TEXT Set this variable to let GAMGI know where are the .ttf DejaVu files, to render solid fonts. For example, add a line as this to \fI~/.bashrc\fP: .IP .B GAMGI_TEXT=~/gamgi/gamgi/src/io/fonts; export GAMGI_TEXT .TP .B BROWSER Set this variable to let GAMGI know which browser to launch, in case this is chosen to read Help. For example, add a line as this to \fI~/.bashrc\fP: .IP .B BROWSER=firefox; export BROWSER .SH HELP Read introductory information with \%Help->Start. Browse the documentation at \fI\%http://www.gamgi.org/\fP or its local copy at \fIgamgi/doc/\fP. Use the help mechanisms reunited under the Help button. Subscribe the mailling list <\&gamgi-users@gamgi.org\&>. .PP Contact the author at <\&jcgp07@gmail.com\&>. .PP Throughout all interfaces and formats, lengths are in angstrom, angles in degrees and decimal numbers are represented with dots. Every parameter that can be defined in an interface can be also defined in a file and vice-versa. .SH INTERFACES Rotate, move, scale the selected object pressing the left, middle, right mouse button. Export the selected object choosing \%File->Export. The statusbar shows the selected object (left) and layer (right). .PP To select an object, choose \%Object->Select and press over the object. Or choose the object class on the menu above, with the middle button, before pressing on the object. Or press twice Layer, Window or GAMGI on the menu above. When the object has no visual representation, press the mouse over the graphic area, to pop up a menu. .PP To select a layer, choose \%Layer->Select and press the mouse over the graphic area, to pop up a menu. Or choose the layer class on the menu above, with the middle button, before pressing the mouse over the graphic area, to pop up a menu. .PP Solid objects usually require lights with diffuse and specular components to be properly represented in 3D space, otherwise they look flat. Wired objects do not have a 3D representation, so diffuse and specular lights are not reflected, becoming poorly visible when using lights, unless a significant ambient component is used. Often it is worth to draw solid and wired objects in different layers, with and without lights. .PP When a task dialog is open, to learn how it works, just select \%Help->Current and another dialog will pop up, explaining the meaning of all the parameters in the task dialog. .PP To see detailed explanations of GAMGI interfaces, consult the reference manual at \fI\%http://www.gamgi.org/interfaces/reference.html\fP, \fI\%doc/interfaces/reference.html\fP or \%Help->Topic->Interfaces. .SH FORMATS GAMGI can import files in \fI.xyz\fP and \fI.xml\fP native format, selected automatically by the file extension. GAMGI can export files in .IR .ps , .IR .ppm , .IR .jp[e]g , .IR .png , .IR .tif[f] , .I .x3d and native .I .xml formats, selected automatically by the file extension. .PP In GAMGI native XML format, a water molecule can be described as: .PP .nf .fi .PP To see detailed explanations of GAMGI formats, consult the reference manual at \fI\%http://www.gamgi.org/formats/reference.html\fP, \fI\%doc/formats/reference.html\fP or \%Help->Topic->Formats. .SH EXAMPLES Choose \%Help->Tutorials to get a list of fully described procedures, exemplifying most aspects of the work with GAMGI. .SH "SEE ALSO" .I \%http://www.gamgi.org/ .SH AUTHOR Written by \fBCarlos Pereira\fP <\&jcgp07@gmail.com\&>, helped by \fBSteffen Moeller\fP <\&moeller@debian.org\&> and \fBDaniel Leidert\fP <\&daniel.leidert@wgdd.de\&>, from the Debian project. gamgi-0.17.5/doc/manuals.html000066400000000000000000000037771433127522700160070ustar00rootroot00000000000000 GAMGI Manuals
Manuals Users
 
HTML, Tex (TODO) and Postscript versions of this manual are included in the documentation tarball available to download.

Graphic Interfaces

  1. 1. Getting Started
  2. 2. Reference Manual

File Formats

  1. 1. Getting Started
  2. 2. Reference Manual

Users are invited to subscribe and consult the archives of the users mailling list.

Manuals Coders
 
HTML, (TODO) Tex and Postscript versions of this manual are included in the documentation tarball available to download.

Source Code

  1. 1. Libraries
  2. 2. Architecture
  3. 3. Style

Bibliography

  1. 1. Scientific
  2. 2. Technical

Developers are invited to subscribe and consult the archives of the coders mailling list.

gamgi-0.17.5/doc/project/000077500000000000000000000000001433127522700151115ustar00rootroot00000000000000gamgi-0.17.5/doc/project/history.html000066400000000000000000000103701433127522700175010ustar00rootroot00000000000000 GAMGI Project: History
History
 

    25th February 2022

    The last version, GAMGI 0.17.5, is released.
  • 15th January 2014

    Renewed the EU trademark GAMGI until 2024.
  • 1st January 2014

    Updated the source code and documentation license to GPL v3.
  • 26th December 2013

    Started using sha256sum to checksum all distribution files.
  • 23rd December 2013

    Renewed the domain name registration for gamgi.org until 2020.
  • 19th November 2013

    Signed an agreement with OIN regarding patent protection.
  • 2nd September 2013

    Moved www.gamgi.org and ftp.gamgi.org to the IT center at the IST campus.
  • 8th April 2013

    Added new mirrors: http://gamgi.ist.utl.pt/, http://atom.ist.utl.pt and ftp://atom.ist.utl.pt.
  • 16th January 2013

    GAMGI is now packaged for Fedora, thanks to Josef Radinger, the maintainer.
  • 8th April 2009

    GAMGI is now packaged by Debian, in testing mode, thanks to the Debichem Team.
  • 31st March 2009

    GAMGI is now packaged by OpenBSD Ports, thanks to Jasper Lievisse Adriaanse, the maintainer.
  • 16th January 2009

    GAMGI is now packaged to Mac OS X, thanks to the Fink project.
  • 30th October 2008

    GAMGI is now packaged by Ubuntu, thanks to Morten Kjeldgaard, the maintainer.
  • 13th April 2008

    GAMGI has now its own Tango! icons, beatifully created by Jakub Szypulka.
  • 5th March 2008

    GAMGI is now running fine with GTK 2.0/GTKGLext 1.0.
  • 4th July

    GAMGI has now more than 200,000 lines of C code.
  • 8th June 2006

    Redesigned the www.gamgi.org website.
  • 22th November 2005

    The word GAMGI is now a EU registered trademark.
  • 9th October 2005

    Added a Wiki to gamgi.org: PMWiki is free and simple.
  • 25th June 2004

    Registered copyright for GAMGI 0.09.28.
  • 19th September 2003

    Moved gamgi.org to the IST campus.
  • 24th March 2003

    GAMGI is running on SGI Irix, with four R12000 processors.
  • 28th October 2002

    GAMGI is running on Mac OS X, thanks to the Fink project.
  • 6th June 2002

    GAMGI is running on Linux PPC.
  • 12th September 2001

    Registered domain name gamgi.org.
  • 6th April 2001

    Registered copyright for GAMGI 0.07.17.
  • May 1999

    GAMGI project starts.
gamgi-0.17.5/doc/project/jcgp.html000066400000000000000000000034731433127522700167310ustar00rootroot00000000000000 GAMGI project: Carlos Pereira
Carlos Pereira
 
Carlos Pereira Degree in Chemical Engineering (5 year course): Instituto Superior Técnico, Lisboa

Master in Atomic and Molecular Physics(1.5 year course plus 2 year thesis): Instituto Superior Técnico, Faculdade de Ciências, Faculdade de Ciências e Tecnologia, Lisboa

PhD in Atomistic Modelling (3.5 year thesis): The Royal Institution of Great Britain, University College London, London

Position: Lecturer, Department of Materials Engineering, Instituto Superior Técnico, Lisboa

gamgi-0.17.5/doc/project/legal_copyright.html000066400000000000000000000037501433127522700211600ustar00rootroot00000000000000 GAMGI project: Legal

Legal

GAMGI is not in the Public Domain, so normal copyright laws apply. According to current EU and US laws of intellectual rights, GAMGI code and documentation will be automatically Public Domain property only 70 years after the death of the authors.

As granted by the current laws of copyright and intellectual rights, all contributors (or their employees, in some cases) to the GAMGI project remain the sole owners of their intellectual property and keep full rights to the code and documentation given to the GAMGI project, so in particular they are free to use them in closed-source software projects, books of their own, etc.

What they cannot do is to take away what they have already given, to the GAMGI project and the free software community at large. A time clause explicitly forbidding this is present in every software or documentation free license.

Copyright ownership was registered in 2001 for GAMGI 0.07.17 and in 2004 for GAMGI 0.09.28, by GAMGI first author, Carlos Pereira. Other contributors to GAMGI source code remain the sole owners of their copyrights and are responsible for registering and defending them.

gamgi-0.17.5/doc/project/legal_license.html000066400000000000000000000037151433127522700205730ustar00rootroot00000000000000 GAMGI project: Legal

Legal

The code, documentation and data files provided by the GAMGI project are all distributed under the terms of the GPL v3 license, promoted by the Free Software Foundation. A copy of the license is included with all tarball files available from www.gamgi.org that include source code or documentation.

The GAMGI source code can thus be reused in any software project, as long as the other code is also distributed under the terms of the same GPL license. The same terms apply for the documentation written by the GAMGI project, including web pages, images, FAQs, Helps, Manuals, etc., in all electronic formats.

Contributors are automatically abiding by this legal license when they contribute to the GAMGI project. Changes in the legal framework supporting GAMGI can be made in the future, provided that contributors agree that there is an advantage in doing so, but these modifications can never be retroactive, a condition explicitly imposed by all free licenses.

gamgi-0.17.5/doc/project/legal_patents.html000066400000000000000000000035531433127522700206270ustar00rootroot00000000000000 GAMGI project: Legal

Legal

The GAMGI project believes that pure software (not related with any hardware device) should be governed only by the general laws of copyright, as any piece of written text, and therefore should not be subjected to the industrial restrictions and commercial rules of patent law.

It seems dificult to argue that a totally original written text, that is not an illegal (or unethical) copy of some other work, should be forbidden on the grounds that its general purpose, the goal that it aims to achieve, is not original. The same rule applied to book writting would turn most works written recently in easy preys to legal ransom.

The GAMGI project signed recently a license agreement with OIN, a company created by industry heavy weights to raise a pool of patents large enough to discourage legal threats against Linux related software.

gamgi-0.17.5/doc/project/legal_trademark.html000066400000000000000000000023051433127522700211150ustar00rootroot00000000000000 GAMGI project: Legal

Legal

Since November 2005, the word GAMGI is a European Union trademark of Carlos Pereira, GAMGI first author. We believe this promotes long-term credibility and lends some legal protection to the project. In some countries, most notably Korea, GAMGI is a common personal name, so a trademark would not be enforceable.
gamgi-0.17.5/doc/project/legal_warranty.html000066400000000000000000000023451433127522700210160ustar00rootroot00000000000000 GAMGI project: Legal

Legal

There is absolutely no guarantee that GAMGI will work at all, much less that it will work correctly or as expected, and this includes everything related with GAMGI, namely the binary and script executables, the documentation, the data and the website functionality. In short, no liabilities.

See GAMGI GPL license, for more details.

gamgi-0.17.5/doc/project/links_legal.html000066400000000000000000000025241433127522700202660ustar00rootroot00000000000000 GAMGI project: Links

Links

gamgi-0.17.5/doc/project/links_scientific.html000066400000000000000000000120351433127522700213200ustar00rootroot00000000000000 GAMGI project: Links

Links

gamgi-0.17.5/doc/project/links_technical.html000066400000000000000000000071541433127522700211400ustar00rootroot00000000000000 GAMGI project: Links

Links

gamgi-0.17.5/doc/project/people_contributors.html000066400000000000000000000052021433127522700220770ustar00rootroot00000000000000 GAMGI project: People

People

We would like to thank the following people, for their contributions to GAMGI. Without them, GAMGI would be just a dream.
  • Brian Paul, for creating Mesa, and all the people in the mesa3d-users mailing list, for their expert assistance.
  • The hundreds of developers that created GTK, Havoc Pennington and all the people in the gtk-app-devel-list mailing list, for their expert assistance and spirit of community.
  • Janne Löf, for writing GTKGLArea.
  • James Clark, for creating Expat, and all the people in the expat-discuss mailing list, who continued the project, for their assistance.
  • SGI, for freely providing the code for the trackball routines, implemented by Gavin Bell (with help from Thant Tessman, David M. Ciemiewicz, Mark Grossman, Henry Moreton, and Paul Haeberli).
  • José Luis Martins, for the Voronoi bond algorithm.
  • Sun Microsystems and the X Consortium, for the Roman stroked fonts.
  • Allen V. Hershey and the U.S. Naval Weapons Laboratory, Norman Wolcott and the U.S. National Bureau of Standards, Bob Beach and Thomas Wolff, for the Hershey stroked fonts.
  • James Marshall and all the people who published excellent documentation and code on the web, explaining the HTTP protocol.
  • Jarle Aase and all the people who published excellent documentation and code on the web, explaining the FTP protocol.
  • Serguei Patchkovskii, for the point symmetry code.
  • Alberto Ferro, for bibliographic research and development support, in the following topics: Voronoi and Radical tesselation, Anisotropy tensor and Random Close Packing structure.
  • Allen Barnett, for the OGLFT library, which code was used for the extruded fonts.
  • Linas Vepstas, for the GLE library, which code was used for the extruded fonts.
  • The FreeType Team, for the library to handle TrueType fonts.
gamgi-0.17.5/doc/project/people_developers.html000066400000000000000000000023421433127522700215140ustar00rootroot00000000000000 GAMGI project: People

People

These are the authors of the GAMGI project.
gamgi-0.17.5/doc/project/people_supporters.html000066400000000000000000000030561433127522700215750ustar00rootroot00000000000000 GAMGI project: People

People

Our acknowledgements to the following people and institutions, who helped GAMGI with their support.
gamgi-0.17.5/doc/project/projects_legal.html000066400000000000000000000014141433127522700207740ustar00rootroot00000000000000 GAMGI project: Projects

Projects

 
gamgi-0.17.5/doc/project/projects_scientific.html000066400000000000000000000034141433127522700220320ustar00rootroot00000000000000 GAMGI project: Projects

Projects

These are medium and long-term projects, regarding scientific topics, that we aim to implement futurely.

Space group symmetry from the crystal structure

The purpose is to determine the space group symmetry for any crystal structure, including the relevant elements of symmetry. There exists already a free Fortran program that does essentially this, needs to be adapted.

Glass construction using geometry and coordination constraints

Given geometry constraints as dihedral angle and bond length distributions, and coordination constraints as coordination number distributions, construct glass systems using random number techniques to calculate the coordinates, the rings, etc., this way building atomic structures with order at short distance and disorder at long distance. These algorithms should consider periodic glass systems, where the cell end in a given direction should fit with the cell start in the same direction, including atoms and bonds, which can connect atoms in both ends of the cell.
gamgi-0.17.5/doc/project/projects_technical.html000066400000000000000000000117421433127522700216470ustar00rootroot00000000000000 GAMGI project: Projects

Projects

These are medium and long-term projects, regarding technical topics, that we aim to implement futurely.

Implementation of gamgi_engine_malloc and gamgi_engine_free

For the sake of code control, independence and maintenance, GAMGI uses only pure AINSI C code for everything, except the graphics code, which uses only standard OpenGL calls (no Mesa specific calls) and the user interface code that uses Glib/GDK/GTK calls. In particular, GAMGI uses only AINSI C in its inner engine, which means malloc and free.

To improve memory management efficiency, avoiding to allocate many times small amounts of memory, which may waste time doing these slow memory operations and produce unused chunks of memory, it would be important to allocate memory for several objects of each kind at once, keep them in a stack, when the stack is empty create more objects, usually the double, when the objects are freed, put them back in the stack, etc...

Definition and implementation of a GAMGI scripting language

Every single command handled by dialog windows and mouse actions should be emulated using only a command line scripting language.

This is important, because it will allow us to describe entire working sessions in log files, so loading those files we will be able to recreate all the work done before, and changing the log files will allow us to automatically create different working sessions.

Implementation of GAMGI multi-tasking infrastructure

In the future GAMGI must allow users to do more than one operation at a time. This is important when an operation takes too long to complete, and in animation, for example.

The solution is probably to use threads instead of multi-processes or other multitasking techniques, but that must be carefully analysed first.

Documentation available in Latex format

Producing good documentation explaining not just how things work but also why they work that way should always rank high in the list of priorities of any self-respecting computer package. For a project run by volunteers, as GAMGI, this is even more critical, because commercial books are generally not available and programmers tend to prefer writing code than documentation. We believe that lack of documentation is a serious bug in a program and major efforts should be done to avoid it.

GAMGI documentation is currently available only in XHTML format. We should have at least Latex and PS versions, created from a single master, using some of the free format converters currently available, in various stages of development. Moreover, the documentation development and format translation could be controlled by makefiles, exactly as code.

GAMGI internationalization

GAMGI is currently an english-only program. Although GAMGI is primarily a scientific tool, it can also be used to great advantage to teach and attract interest for such matters as chemistry, physics, materials science, geology, etc. However, many of the potential students have only a marginal knowledge of the english language and it would be a shame it they couldn't use GAMGI due to their poor english proficiency.

There are two ways to handle this problem:

  1. To prepare and maintain different GAMGI versions, one for each language.
  2. To prepare and maintain a single GAMGI version, with menu-driven options to allow the user to choose on-the-fly which language to apply.

The first option is much easier, because different languages require different space and even orientation (for example in arabic) to give the same information, and it is therefore tremendously difficult to prepare dialog windows that fit all languages at once. For western-languages we could probably go with the second, more elegant solution, but for Chinese, Japanese, Arabic, etc. we feel that the first solution might be the most sensible.

To support non-western languages, such as Chinese, Japanese and Arabic, GAMGI must understand Unicode, the international standard to represent characters for any kind of live or dead language. Unicode functionality has been implemented by PANGO, a free GPL library, which will be used in GAMGI to represent all characters that are not described by the good old 7-bit ASCII standard.

gamgi-0.17.5/doc/project/scientific_mission.html000066400000000000000000000062021433127522700216600ustar00rootroot00000000000000 GAMGI project: Scientific

Scientific

Our goal is to provide a free computer package to construct, view and analyse atomic structures, as powerful and simple to use as possible.

We believe that open societies, where knowledge is shared and discussed, promote innovation and justice, freedom and intelligence, and ultimately better individuals and stronger economies. From Galileu, Descartes and Newton, to Darwin, Faraday and Einstein, the development of Science has been always based in the open discussion, in the unrestricted exchange of information. Unfortunately, recent changes in the trends governing intellectual and industrial knowledge have modified considerably this panorama, and knowledge is becoming more and more something that can be owned and restricted from the general public.

We are thus developing GAMGI - General Atomistic Modelling Graphic Interface, a computer package that can be inspected, modified, distributed and even included in other programs, according to the terms of the GPL license. Physical Science students can investigate the code to study the mathematical, physical and chemical algorithms implemented in GAMGI. Computer Science students can study the code to learn how to design the architecture, the data infrastructure, and the flux of information of a big application, involving very different technologies. As the code is free, GAMGI can be installed in any computer, can be recompiled when the operating system changes, can be copied as many times as wished, can be immediately investigated and hopefully corrected when bugs are found. Users should see GAMGI as a common project, something that belongs to the whole community, to which they are invited to contribute, if they wish so.

GAMGI aims to be useful for: 1) the scientific community working in Atomistic Modelling, that needs a graphic interface to build input data and to view and analyse output data, calculated with Ab-Initio and Molecular Mechanics programs; 2) the scientific community at large, studying Chemistry, Physics, Materials Science, Geology, etc., that needs a graphic interface to view and analyse atomic structural information and to prepare images for presentations in classes and seminars; 3) teaching chemistry and physics in secondary schools and universities, even inviting students to install and run GAMGI at home; 4) science promotion, in schools, exhibitions and science museums.

gamgi-0.17.5/doc/project/scientific_objects.html000066400000000000000000000312111433127522700216260ustar00rootroot00000000000000 GAMGI project: Scientific

Scientific

GAMGI supports the following objects: Text, Orbital, Bond, Atom, Direction, Plane, Group, Molecule, Cluster, Cell, Arrow, Shape, Graph, Assembly, Light, Layer and Window.

Text

GAMGI supports both wired (stroked) and solid (extruded) 3D fonts.

Stroked fonts are needed to show information (as measurements and object identification) on the screen, which needs to be three-dimensional because it will be linked to molecules and other three-dimensional objects. Stroked fonts are relatively simple, so characters can be drawn fast. Measurements and object identification must work in both manual and automatic modes. In the automatic mode, measurements of distances and angles must be recalculated and the results updated in the text objects in real time, while the user manipulates the objects.

Extruded fonts are designed to provide the highest possible visual quality to text objects. These fonts work well with lights and can be relatively complex, so they are much slower than the stroked fonts.

Text objects can own other text objects only, so they are recursive objects. This gives the user maximum flexibility to manipulate different text fragments separately and compose them to obtain the final result. Text objects can be owned by any other GAMGI object except lights and windows.

Orbital

Only the low-level engine infra-structure of orbital objects is implemented so far. The goal is to describe: 1) simple hydrogen-like orbitals, s, p, d, f, etc., and its hybridisations, sp, sp2, sp3, etc.; 2) complex representations of the electronic clouds surrounding the nucleus, commonly provided by combinations of Gaussian, Slater and plane wave analytic functions; 3) combinations of numerical functions usually described by spline line coefficients; 4) pseudo-potentials electronic descriptions.

The main difficulty with orbitals is to collect the data from files with completely different formats, provided by Gaussian, ADF, DSolid, Plana, etc. and build a common way to handle all this information. This problem must be correlated with the way GAMGI handles input/output data.

Orbitals can own text objects, so for example the name of the orbital can be attached to it.

Bond

GAMGI handles bonds between atoms as objects owned by these atoms. Each atom can have an unlimited number of bonds. Each bond must have two parent atoms. Bonds can own orbitals and texts.

Atom

Atoms are the most important objects in GAMGI. They can own orbitals, texts and are the only objects that can own bonds.

Direction

Direction objects were designed primarily to handle crystallographic directions but they should provide useful functionality even in the absence of periodic cells. Currently, crystallographic directions can be viewed directly in space or represented as poles or traces in stereographic projections. Important properties such as the distance between nodes or the angles between directions and planes can be determined just clicking on the objects.

Futurely users should be able to choose directions of atoms in cells, clusters or molecules, automatically producing direction objects reproducing those directions, including the atoms and its child, bonds, orbitals and texts, and then handle these new direction objects as totally independent viewing and building tools.

Direction objects can own atoms, orbitals and texts.

Plane

Plane objects were designed primarily to handle crystallographic planes but they should provide useful functionality even in the absence of periodic cells. Currently, crystallographic planes can be viewed directly in space, in the reciprocal lattice, or represented as poles or traces in stereographic projections. Important properties such as the distance between planes, the area per node or the angles between planes and directions can be determined just clicking on the objects.

Futurely users should be able to choose planes of atoms in cells, clusters or molecules, automatically producing plane objects reproducing those planes, including the atoms and its child, bonds, orbitals and texts, and then handle these new plane objects as totally independent viewing and building tools.

Implementing x-ray and electronic diffraction patterns, showing crystallographic planes as circular spots, represents a high priority project for the future.

Plane objects can own directions, atoms, orbitals and texts.

Group

Group is an object container designed to handle a fragment of a molecule, a residue of a protein, a mero of a polymer chain, or other chemical species. Group objects can own an unlimited number of other chemical species as groups, atoms, and related objects as texts, orbitals, directions and planes. A group is therefore a recursive object, with unlimited nested levels, and its properties should reflect the child chemical features. For example, an amino-acid has amino NH2 and carboxylic acid COOH groups, the later in turn contains an hydroxyl group OH. Currently Group objects can be created only from XML files. Mechanisms to measure length, angle and torsion measurements in groups of atoms are already in place and tested. Algorithms and tools to modify length, angle and torsion values, in both open and cyclic structures have been implemented and fully tested. Everything else is not done yet.

Molecule

Molecule objects are essentially containers, objects whose primary purpose is to own other objects, as atoms and bonds. Molecules can own groups, planes, directions, atoms, orbitals and texts. Currently Group objects can be created only from XML files. Mechanisms to measure the point symmetry in molecules are already in place and tested. Everything else is not done yet.

Cluster

Cluster is an object container, designed to contain an unlimited number of chemical species as child objects, including other clusters, molecules, groups, atoms and related objects such as texts, orbitals, directions and planes. A cluster is therefore a recursive object, with unlimited nested levels, and its properties should reflect the child chemical features.

Clusters are currently used in the Voronoi tesselation of an arbitrary set of atoms.

Cell

All the GAMGI functionality related with atomic structures with periodic boundary conditions is handled by cell objects. Crystalline structures can be created indicating either a crystalline lattice and a motif or a space group and the asymmetric unit atoms. The 14 Bravais lattices can be represented by Conventional, Primitive and Wigner-Seitz cells, plus Rhombus and Sphere volumes. Users can choose the number of cells, the volume size, the cell positioning, the type of cell borders, solid or wired cell representations, and the cell color. Any Cluster, Molecule, Group, Atom or even Orbital, Text object can be used as a valid motif to construct a periodic structure. GAMGI provides powerful yet simple pattern rules to indicate which lattice nodes should be filled, this way allowing users to create complex mixed structures that can be used to study liquids and other non-periodic systems. In particular, these pattern rules can be used to build 2D and 1D periodic and non-periodic structures.

Arrow

Arrow objects include different types of 2D and 3D arrows, which are not text objects but are very useful to prepare images containing atomic structures, graphs, text, etc., for presentations at seminars or school teaching, or for producing printed images for articles or books. Arrow objects can own text objects (only). This is useful for example to add an equilibrium constant over a double arrow symbolising a chemical equilibrium. The low-level engine infra-structure required to handle arrow objects is fully implemented but everything else is not done yet.

Shape

Shape objects describe backgrounds, boxes, circles, ellipses, diamonds, etc. designed to make an image for a presentation more clear and pretty. The aim is therefore to fill the gap between text and arrow objects. Shape objects can own text objects only. This is useful, for example to include a message in a box. Nice functionality to have in GAMGI shape objects includes: 1) several styles should be provided for shape objects, including solid, contour, partially transparent, etc.; 2) mechanisms should be provided to allow users to choose and apply OpenGL textures, in 2D and 3D shape objects; 3) mechanisms should be provided to allow users to make textures, namely profile gradients, as in the GIMP. The low-level engine infra-structure required to handle shape objects is fully implemented but everything else is not done yet.

Graph

Graph objects will be used to describe all sort of graphic information usually related with atomic structures, including for example radial distribution functions and electron density maps. In particular, graphs will be used to represent the copious amount of data often provided by ab-initio and molecular mechanics calculations. Graphs can own text objects only, which will be used for captions, titles, labels, etc. The low-level engine infra-structure required to handle Graph objects is fully implemented but everything else is not done yet.

Assembly

Assembly is an object container, designed to be fully flexible. An assembly can own any GAMGI objects, including other assembly objects, except lights, layers and windows. An assembly object is therefore a recursive object, with unlimited nested levels. For example, an assembly can be used to associate a graph with a molecule and a cell, to manipulate all of them at once. Currently Assembly objects can be created only from XML files. The graphic interfaces to properly link Assembly objects are not done yet.

Light

Everything related with lightning in GAMGI is handled by light objects. GAMGI lights implement all the functionality provided by the OpenGL specification. This includes directional, positional and spot lights, ambient, diffuse and specular light components, and axial and radial light attenuations. The maximum number of lights that each layer can own is fixed by the graphics library used with GAMGI. In Mesa this number is currently 8, the minimum required by the OpenGL specification. However, as the number of layers that each window can own is unlimited, the same is true for the total number of lights per image. Lights are the only objects in GAMGI that cannot own other objects.

Layer

GAMGI supports multiple, unlimited, layers for each window, allowing users to move and copy objects between different layers and see multiple layers simultaneously. A layer can own all kinds of GAMGI objects, except bonds, windows and layers. In particular, layers are the only GAMGI objects that can own lights.

Functionality currently implemented includes perspective and orthographic projections, full control over projection and model view (like a photographic camera) parameters, inside and outside visibility, background color, plus undo and save history mechanisms to keep and recover the whole contents of each layer, for as many levels as previously defined.

Perspective projection is better to simulate realistic views but the orthographic projection (mostly used in architecture) is usually preferred for most work related with building and viewing structures, because these are not distorted by perspective. The projection parameters, that control the matrix transformations related with the projection of the 3D space on the screen, are fully controlled by the users.

Window

GAMGI supports multiple, unlimited, windows, which allow users to easily move and copy objects between them. Window objects are truely independent, so they can be opened and closed in any order. Windows can own layer objects only, which can be moved or copied between different windows.
gamgi-0.17.5/doc/project/technical_mission.html000066400000000000000000000104231433127522700214720ustar00rootroot00000000000000 GAMGI project: Technical

Technical

A really useful package must be easy to obtain, to compile, to use and to change, giving users and developers as much control as possible. This means:

1) Designing an elegant and flexible architecture for the whole package, including hidden resources as the memory and graphic engines, and visible mechanisms as the graphical user interface. This is particularly important in a package that aims to be used in scientific research, where the required functionality is quickly changing and the capacity to adapt to new demands is critical.

2) Writing simple, well documented code. We put great emphasis in the quality of the code that we write, because: i) it is open source, so everyone can judge our work (thanks for the fish!); ii) writing beatiful code is an important incentive to continue the project; iii) simple, clean, code is easier to understand and maintain, thus atracting more developers to the project and increasing its probabilities of long term sucess.

3) Using standards and reducing code dependencies as much as possible. We use only ANSI C code in GAMGI, so gcc could be replaced by any other C compiler. We don't use Mesa-specific functions, so Mesa could be replaced by any other OpenGL implementation. We use Gtk only to write GUI-specific code, so Gtk could be replaced, without much pain, by any other X toolkit library. We plan to use only the most common Python/Perl functions in filters to convert file formats, this way making it easier for non-Python/Perl mongers to understand and change the scripts.

4) Reducing as much as possible the number of libraries the package depends on, particularly those more difficult to install, less maintained and more susceptible to changes. This helps to reduce the wall between users and programs, encouraging them to compile and modify the source code, instead of just using black-box executables. Writing a few hundred lines of code to avoid depending of a library is not reinventing the wheel, but to increase freedom for users and developers.

5) Building the package in a way as simple and transparent as possible. Using config, make, make install is simple, when it works, but makes it completely impossible to understand what is actually occurring. The GAMGI makefiles are designed to be powerfull (permiting for example to compile several executables at the same time, in different directories, with different functionality) yet small and transparent to the user, making it simple to understand the logic and mechanisms used by gcc and make to build GAMGI.

6) writing insightfull documentation for both users and developers, not just explaining how things work, but also why they work that way. The first and most important line of defense to have a user-friendly package is to design it well, but in complex, comprehensive pachages, that is usually not enough, we need good manuals, where information is clear and can be found quickly. Before being software developers, we are software users, so we really understand the frustration that most users feel when they use software today, as usually manuals either don't exist, are useless or are considered as non-essential products, that users are invited to get and pay separately. We are commited to provide good documentation not just for users that want only to know how to do their job, but also to developers, who need to understand how GAMGI works, before they can change or improve its functionality.

Above all, we believe that for users and developers alike, the ultimate goal is technological control, and the key to achieve it is simplicity.

gamgi-0.17.5/doc/project/technical_requirements.html000066400000000000000000000043771433127522700225470ustar00rootroot00000000000000 GAMGI project: Technical

Technical

To run properly, GAMGI requires a graphics environment with with at least 16 bits per pixel, otherwise object selection with the mouse does not work, and using GAMGI becomes much more difficult.

GAMGI requires a 3-button mouse to work properly, as the mouse buttons are one of the ways to rotate, move and scale objects. With a 2-button mouse, users can configure the button order for example to discard scale and use move and rotate modes only.

GAMGI can be installed on any computer running Linux/Unix with the standard X Window System. GAMGI requires the following libraries: Gtk, Mesa, GtkGLext, Expat and Freetype.

Gtk, GtkGLext and GLU Mesa are distributed under the LGPL license. GL Mesa and Expat are distributed under the MIT (BSD-like) license. Freetype is distributed under the FTL (BSD-like) and GPL licenses.

Since release 0.13.2, GAMGI should run fine with any version of Gtk 2. Previous releases required Gtk 1. GAMGI should run fine with any version of Mesa or OpenGL but versions older that Mesa 6.4.2 are not recommended, due to light bugs. GAMGI should run fine with any version of Expat, Freetype 2 and GtkGlext.

gamgi-0.17.5/doc/questions/000077500000000000000000000000001433127522700154755ustar00rootroot00000000000000gamgi-0.17.5/doc/questions/introduction_legal.html000066400000000000000000000060021433127522700222460ustar00rootroot00000000000000 GAMGI Questions: Introduction

Introduction

1. Who are GAMGI copyright owners?

Copyright ownership was registered in 2001 for GAMGI 0.07.17 and in 2004 for GAMGI 0.09.28, by GAMGI first author, Carlos Pereira. Other contributors to GAMGI source code remain the sole owners of their copyright and are responsible for registering and defending them.

2. Under which license is GAMGI provided?

The C source code developed by the GAMGI project, that forms the core GAMGI program, is distributed under the terms of the GPL license. Perl and Python scripts developed by the GAMGI project are distributed under the terms of the BSD license. The documentation written by the GAMGI project and made available through its official site, is distributed under the terms of the GFDL license. Contributors are automatically abiding by these legal licenses when they contribute to the GAMGI project.

3. Is GAMGI code and documentation in the Public Domain?

No. Copyright owners retain full ownership of GAMGI code. According to current EU and US laws of intellectual rights, GAMGI code will be automatically Public Domain property only 70 years after the death of the authors.

4. Is GAMGI a trademarked word?

Since November 2005, the word GAMGI is a European Union trademark of Carlos Pereira, GAMGI first author. We believe this promotes long-term credibility and lends some legal protection to the project. In some countries, most notably Korea, GAMGI is a common personal name, so a trademark would not be enforceable.

5. Is there any guarantee that GAMGI woks?

No. There is absolutely no guarantee that GAMGI will work at all, much less that it will work correctly or as expected, and this includes everything related with GAMGI, namely the binary and script executables, the documentation, the data and the website functionality. In short, no liabilities. See GAMGI GPL license, for more details.
gamgi-0.17.5/doc/questions/introduction_scientific.html000066400000000000000000000014361433127522700233100ustar00rootroot00000000000000 GAMGI Questions: Introduction

Introduction

 
gamgi-0.17.5/doc/questions/introduction_technical.html000066400000000000000000000042461433127522700231240ustar00rootroot00000000000000 GAMGI Questions: Introduction

Introduction

1. What are GAMGI hardware requirements?

To run properly, GAMGI requires a graphics environment with with at least 16 bits per pixel, otherwise object selection with the mouse does not work, and using GAMGI becomes much more difficult.

GAMGI requires a 3-button mouse to work properly, as the mouse buttons are one of the ways to rotate, move and scale objects. With a 2-button mouse, users can configure the button order for example to discard scale and use move and rotate modes only.

2. What are GAMGI software requirements?

GAMGI can be installed on any computer running Linux/Unix with the standard X Window System. GAMGI requires the following libraries: Glib/Gtk, Mesa, Gtkglarea, Expat and Freetype.

GAMGI should run with any version of Glib/Gtk 1, but does not even compile with Glib/Gtk 2. GAMGI should run with any version of Mesa or OpenGL, though a recent release is recomended, due to some bugs. GAMGI should run with any version of Gtkglarea 1. GAMGI should run with any version of Expat. GAMGI should run with any version of Freetype 2, but does not even compile with Freetype 1.

gamgi-0.17.5/doc/questions/questions.html000066400000000000000000000050611433127522700204170ustar00rootroot00000000000000 GAMGI Questions: Questions
Introduction
 
Troubleshooting
 
Shortcomings
 
Bugs and other GAMGI shortcomings, are collected and discussed in this FAQ.
gamgi-0.17.5/doc/questions/troubleshooting_formats.html000066400000000000000000000013541433127522700233500ustar00rootroot00000000000000 GAMGI Questions: Troubleshooting

Troubleshooting

 
gamgi-0.17.5/doc/questions/troubleshooting_interfaces.html000066400000000000000000000110571433127522700240210ustar00rootroot00000000000000 GAMGI Questions: Troubleshooting

Troubleshooting

1. After importing a file with objects, these are not visible.

If the region of space that currently can be seen does not contain the coordinates of the objects in the file, these will not be visible, though everything is fine and working well. Possible solutions are: 1) scale the layer down, so objects become smaller and a larger region of space can be seen at once; 2) if in doubt, use Layer->Select to check which objects indeed belong to the current layer; 3) edit the file and check whether the object coordinates are compatible with the current layer field of visibility. In a default layer, objects have coordinates around (0.0, 0.0, 0.0) and the viewing direction is from positive to negative z axis, so objects with negative z coordinates will be more easily visible; 4) use Layer->Modify to change the layer (projection and position) parameters untill the objects become visible.

2. After modifying a layer, the objects become invisible.

GAMGI gives users the flexibility to change all aspects related with visibility and projection of each layer, which can be bad if users do not use this power in a sensible way. Possible solutions are: 1) scale the layer down, so objects become smaller and a larger region of space can be seen at once; 2) if in doubt, use Layer->Select to check which objects indeed belong to the current Layer; 3) use Layer->Modify to change the layer (projection and position) parameters untill the objects become visible; 4) use File->Export to export the current layer to a file, edit the file and remove the layer, and then use File->Import to import the objects to a new, default, layer; 5) Use Undo to recover the previous layer conditions;

3. After selecting a visible object, the object is not found.

By construction, each layer is completely independent of the other layers in the same window, even if these are still visible. Therefore, only objects that are in the current layer can be selected directly, otherwise they are not found. This is valid for all objects that a layer can contain, including lights.

4. After creating a light, the objects become invisible.

A wired object does not reflect light, so diffuse and specular components cannot iluminate it. When lights are not present, diffuse and specular light components are (0.0, 0.0, 0.0) but ambient light is (1.0, 1.0, 1.0), so objects can be seen. When a light is created, all components are set initially to (0.0, 0.0, 0.0) and wired objects may become invisible, if the ambient light is too small. The solution is to increase the ambient light, using Light->Modify.

5. After creating a light, the lights become invisible.

Ambient light is additive, so two lights with ambient components (0.3, 0.3, 0.3) will be equivalent to a light with ambient component (0.6, 0.6, 0.6). When the ambient light is too strong, exceeding the limit (1.0, 1.0, 1.0), diffuse and specular components cannot be seen. Therefore, ambient light becomes (1.0, 1.0, 1.0) and diffuse and specular components become (0.0, 0.0, 0.0), which is exactly the situation when no lights are present. The solution is to decrease the ambient light, using Light->Modify.

6. After importing a file with bonded atoms, these are not visible.

In wired mode, unbonded atoms are represented by crosses. When bonds are formed between them, the crosses are replaced by simple lines joining the atoms, changing color at half-distance. If the atoms are in the same position or very close, the line cannot be seen and the atoms and bond become invisible. Clearly this problem only occurs for overlaping atoms, and the solution is to move them to correct positions.
gamgi-0.17.5/doc/tips.html000066400000000000000000000071541433127522700153170ustar00rootroot00000000000000 GAMGI Tips
Tips
 
These tips result from years of experience and may prove useful even for advanced users.

1. Select the current object

Users can select the current object, the object that is moved, rotated, scaled, and exported to a file. The current object can be a single object or a list of objects. First click the mouse middle button over an object name, on the top menu. Then click over an object of that class, to select it, or over the Gamgi button, to select the current list of those objects.

2. Select the current layer

Users can select the current layer, the layer where are the objects that can be directly manipulated. Press the mouse middle button over Layer, on the top menu, then click over the graphic area, to select the layer from a pop menu. The new current layer becomes automatically the current object. Layers can be transparent or opaque. Objects in different layers can be manipulated simultaneously using lists of objects.

3. Use lists of objects

Handling lists of objects are a powerful technique to manipulate simultaneosuly arbitrary sets of objects previously selected. Using Object->Select dialogs, objects can be added or removed, picked one by one, selected by region or by a wide range of properties.

4. Use lights

Solid objects require lights to look good. Just press Light->Create and then Ok to create a light. If lights are interfering with wired objects, use two transparent layers, one with solid objects and lights, the other with wired objects and no lights.

5. Move objects away

Large objects in Ortographic projection tend to be too close to the viewer, resulting in broken lines and surfaces. The easiest solution is to move the objects away, along the z direction. Just press Move to activate the ruler, and press the left (negative) half of the ruler with the third (z axis) button, until the image looks correct.

6. Customize the ruler

In Window->Config, the ruler can be configured to arbitrarily high levels of accuracy. For example, setting Rotate Max and Step to 0.5 and 0.1 respectively, will configure the ruler in Rotate mode, from -0.5 to +0.5 degrees, in steps of 0.1 each.

7. Import multiple files

GAMGI can load an arbitrary number of files, local or remote, with a single shell command. Try for example:

gamgi http://www.gamgi.org/dat/molecule/silicates/q10.xml ftp://ftp.gamgi.org/gamgi/dat/molecule/silicates/q10.xml

8. Set user preferences

Importing automatically a file with default data everytime GAMGI is launched is a flexible and powerful way to set preferences. For example, adding this line to ~/.bashrc:

alias gamgi='gamgi ~/gamgi/defaults.xml'
will import the file defaults.xml everytime gamgi starts. To turn C atoms grey by default, add this data to defaults.xml:

<gml>
<gamgi>
<atom element="C" red="0.5" green="0.5" blue="0.5"/>
</gamgi>
</gml>
gamgi-0.17.5/doc/tutorials/000077500000000000000000000000001433127522700154715ustar00rootroot00000000000000gamgi-0.17.5/doc/tutorials/calcite_page1.html000066400000000000000000000120621433127522700210410ustar00rootroot00000000000000 GAMGI Tutorials: Calcite crystalline structure

Calcite crystalline structure

  • Page 1
Calcite (CaCO3) is the stable form of calcium carbonate and is one of the most widely available minerals, present in sedimentary (limestone) and metamorphic (marble) rocks. Stalactites and stalagmites in caves are usually formed by calcite.

First we create a cell with the calcite lattice parameters and space group, then one atom of Ca, C and O, to model the atoms of the structure, and finally link the cell with the atoms to build the crystal, using the Wyckoff positions reported in the literature for calcite.

A lateral view of the calcite structure, for a single conventional cell, can be seen in the figure at http://www.gamgi.org/images/screenshot10_4b.png.

Calcite

  1. Press Cell->Create and set Group to 167, the R-3c space group for calcite. As the lattice is rombohedral, System and Lattice are automatically set to h and R, respectively.
  2. Set lattice parameters a and c to 4.9896 and 17.0610, respectively, the reported values for calcite. Entries b, ab, ac and bc are automatically disabled, as these parameters are known for the hexagonal system.
  3. Press Atom->Create and set Style to Solid. Write Ca in the Element entry and press the mouse over the screen (outside the cell), to create a Ca atom. Repeat the task to create C and O atoms. These three atoms will act as models to create the structure.
  4. Press Cell->Link and select the Crystal link method. Initially, the Wyckoff menu (in Position page) only has the option, 1 Basis 1, which is the usual crystallographic base or motif. The first "1" indicates the number of objects that will be linked to each crystallographic node, and the last "1" the point symmetry.
  5. Press the mouse over the cell to identify it. The cell belongs to space group 167, so the Wyckoff menu is automatically updated to include options for all the Wyckoff positions available for this space group: 12 f 1, 6 e .2, 6 d -1, 4 c 3., 2 b -3. and 2 a 32.
  6. Press the mouse over the Ca atom, to identify the atom used as a model to create the Ca atoms of the crystal.
  7. According to literature, Ca atoms occupy Wyckoff positions b, so select these positions in the Wyckoff menu: 2 b -3.. For these positions, all coordinates are known in advance, so x, y and z entries are all automatically disabled.
  8. Press Ok. 2 atoms of Ca are added to each node of the cell (and removed if they fall outside the cell volume).
  9. Repeat the link procedure, to add the C atoms. Press the mouse first over the cell, and then over the C atom. Carbon atoms occupy positions a, so select these positions in the Wyckoff menu: 2 a 32. For these positions, all coordinates are known in advance, so x, y and z entries are all automatically disabled.
  10. Press Ok. 2 atoms of C are added to each node of the cell (and removed if they fall outside the cell volume).
  11. Repeat the link procedure, to add the O atoms. Press the mouse first over the cell, and then over the O atom. Select positions e, in the Wyckoff menu: 6 e .2. For these positions, only the y,z coordinates are fixed by symmetry. Enter 0.257 for x and press Ok. 6 atoms of O are added to each node of the cell (and removed if they fall outside the cell volume).
  12. Select Light->Create and press Ok, to add a light and give atoms a three dimensional look.
  13. The atomic structure is now created. To remove the Ca,C,O atoms used as models during the building process, press Atom->Remove and click the mouse over them.
  14. The conventional rombohedral cell thus created has 30 atoms inside. For Ca: 4 x 1/6 + 4 x 1/12 (corners) + 2 x 1/3 + 2 x 1/6 (edges) + 4 (inside) = 6 atoms. For C: 4 x 1/3 + 4 x 1/6 (edges) + 4 (inside) = 6 atoms. For O: 8 x 1/2 (faces) + 14 (inside) = 18. As expected, the CaCO3 stoichiometry is obeyed.
  15. Rotate,move,scale the calcite cell with the mouse. Press Atom->Measure to determine lengths and angles between atoms.
gamgi-0.17.5/doc/tutorials/cscl_page1.html000066400000000000000000000056441433127522700203710ustar00rootroot00000000000000 GAMGI Tutorials: CsCl crystalline structure

CsCl crystalline structure

  • Page 1
The CsCl structure is observed in metallic compounds such as CuZn (beta-brass), AlNi, AgMg and CuPd, but also in ionic crystals with equal number of cations and anions, when the cation is slightly smaller than the anion: CsCl, Nh4Cl, TlBr, etc.

To build this structure, first we create the cell with the observed lattice parameters, then the Cs, Cl atoms used as models, with the observed ionic radius, and then link the cell with the atoms.

  1. Press Cell->Create and set System to c, Lattice to P (Primitive Cubic) and a to 4.018 (so ions will be in contact along <111> directions). Press Ok to create the cell.
  2. Select Atom->Create and set Style to Solid, Size to 1.0 and Variancy to 1.0. Set Element to Cs, Radius to 1.670 (ionic radius for Cs+) and press the mouse over the graphic area. A Cs atom is created where the mouse was pressed.
  3. Set Element to Cl, Radius to 1.810 (ionic radius for Cl-) and press the mouse over the graphic area. A Cl atom is created where the mouse was pressed.
  4. Press Cell->Link and select the Crystal link method. Press the mouse over the cell, and then over the Cs atom, to identify the objects to link. Set the x, y, z coordinates (Position page) to 0.5, 0.5, 0.5 and press Ok. 1 atom of Cs is now visible, in the center, inside the cell.
  5. Repeat the link procedure above, but this time pressing the mouse over the Cl atom, and setting the x, y, z coordinates to 0.0, 0.0, 0.0. 8 atoms of Cl are now visible, in the vertices, corresponding to a total of 1 atom inside the cell.
  6. Select Light->Create and press Ok, to add a light and give atoms a three dimensional look.
  7. Remove the Cs,Cl atoms used as models during the building process, pressing Atom->Remove and clicking the mouse over the two atoms.
  8. Rotate,move,scale the CsCl cell with the mouse. Press Atom->Measure to determine lengths and angles between atoms.
gamgi-0.17.5/doc/tutorials/interstices_bcc_page1.html000066400000000000000000000075701433127522700226100ustar00rootroot00000000000000 GAMGI Tutorials: Interstices in the BCC structure

Interstices in the BCC structure

To show the size and position of the BCC interstices, we need to create a cell with lattice parameters valid for a compact structure, and then link it with atoms representing the structure and atoms representing the interstices. The Radius of the structural atoms is set to 1.0, so the Radius of the interstitial atoms shows its comparative size.

The final result, showing two cells with octahedral (left) and tetrahedral (right) interstices, with some structural atoms removed to increase visibility, can be seen in the figure at http://www.gamgi.org/images/int_bcc.gif.

Octahedral interstices

  1. Press Cell->Create and set System to c, Lattice to I (Body-Centered Cubic) and a to 2.309 (so the structural atoms will be in contact along <111> directions). Press Ok to create the cell.
  2. Select Atom->Create and set Style to Solid, Size to 1.0 and Variancy to 1.0. Set Element to Fe, for example (a BCC metal), Radius to 1.0 and press the mouse over the graphic area. A Fe atom is created where the mouse was pressed.
  3. Create a second atom, this time setting Element to C (for example) and Radius to 0.155 (the size of the BCC octahedral interstices). A new atom representing the octahedral interstitial atom is now visible, where the mouse was pressed.
  4. Press Cell->Link and select the Crystal link method. Press the mouse over the cell, and then over the interstitial atom, to identify the objects to link. Set x, y, z coordinates (Position page) to 0.0, 0.5, 0.5 and press Ok. 6 interstitial atoms are now visible, corresponding to 2 interstices inside the cell or 1/3 of the octahedral interstices available.
  5. Repeat the procedure above with x, y, z coordinates set to 1) 0.5, 0.0, 0.5 and 2) 0.5, 0.5, 0.0 to allocate the remaining interstices. 18 interstitial atoms are now visible, 6 centered in the faces and 12 centered in the edges, corresponding to a total of 6 octahedral interstices inside the cell.
  6. To represent the structural atoms, repeat the link procedure above, but this time pressing the mouse over the Fe structural atom, to identify the linked atom, and setting x, y, z coordinates to 0.0, 0.0, 0.0. 9 structural atoms are now visble, 8 in the vertices and 1 in the center, corresponding to a total of 2 atoms inside the cell.
  7. Select Light->Create and press Ok, to add a light and give atoms a three dimensional look.
  8. Press Cell->Select and click the mouse over the cell, to select it. Rotate,move,scale the cell with the mouse. To have a better view inside the cell, remove some of the structural atoms outside. Select Atom->Remove and press the mouse over the atoms to remove.
gamgi-0.17.5/doc/tutorials/interstices_bcc_page2.html000066400000000000000000000062201433127522700226000ustar00rootroot00000000000000 GAMGI Tutorials: Interstices in the BCC structure

Interstices in the BCC structure

Tetrahedral interstices

  1. Press Cell->Remove and click the mouse over the cell, to remove it. Otherwise, just scale it down and move it away from the center, to economize space. This way, the two cells containing octahedral and tetrahedral interstices can be compared later.
  2. Press Cell->Create and set System to c, Lattice to I (Body-Centered Cubic) and a to 2.309 (so the structural atoms will be in contact along <111> directions). Press Ok to create the cell.
  3. Press Atom->Modify and click the mouse over the interstitial atom, to select it. Change its Radius to 0.291, the size of the BCC tetrahedral interstices and press Ok.
  4. Press Cell->Link and select the Crystal link method. Press the mouse over the cell, and then over the interstitial atom, to identify the objects to link. Set x, y, z coordinates (Position page) to 0.0, 0.25, 0.5 and press Ok. 4 interstitial atoms are now visible, corresponding to 2 interstices inside the cell or 1/6 of the tetrahedral interstices available.
  5. Repeat the procedure above with x, y, z coordinates set to 1) 0.0, 0.5, 0.25; 2) 0.25, 0.0, 0.5; 3) 0.5, 0.0, 0.25; 4) 0.25, 0.5, 0.0 and 5) 0.5, 0.25, 0.0 to allocate the remaining interstices. 24 interstitial atoms are now visible, 4 per face, corresponding to a total of 12 tetrahedral interstices inside the cell.
  6. To represent the structural atoms, repeat the link procedure above, but this time pressing the mouse over the Fe structural atom, to identify the linked atom, and setting x, y, z coordinates to 0.0, 0.0, 0.0. 9 structural atoms are now visble, 8 in the vertices and 1 in the center, corresponding to a total of 2 atoms inside the cell.
  7. To remove the Fe,C atoms used as models during the building process, press Atom->Remove and click the mouse over them.
  8. Rotate,move,scale the cell with the mouse. To have a better view inside the cell, remove some of the structural atoms outside. Select Atom->Remove and press the mouse over the atoms to remove.
gamgi-0.17.5/doc/tutorials/interstices_cfc_page1.html000066400000000000000000000070321433127522700226050ustar00rootroot00000000000000 GAMGI Tutorials: Interstices in the CFC structure

Interstices in the CFC structure

To show the size and position of the CFC interstices, we need to create a cell with lattice parameters valid for a compact structure, and then link it with atoms representing the structure and atoms representing the interstices. The Radius of the structural atoms is set to 1.0, so the Radius of the interstitial atoms shows its comparative size.

The final result, showing two cells with octahedral (left) and tetrahedral (right) interstices, with some structural atoms removed to increase visibility, can be seen in the figure at http://www.gamgi.org/images/int_cfc.gif.

Octahedral interstices

  1. Press Cell->Create and set System to c, Lattice to F (Face-Centered Cubic) and a to 2.828 (so the structural atoms will be in contact along <110> directions). Press Ok to create the cell.
  2. Select Atom->Create and set Style to Solid, Size to 1.0 and Variancy to 1.0. Set Element to Cu, for example (a CFC metal), Radius to 1.0 and press the mouse over the graphic area. A Cu atom is created where the mouse was pressed.
  3. Create a second atom, this time setting Element to C (for example) and Radius to 0.414 (the size of the CFC octahedral interstices). A new atom representing the octahedral interstitial atom is now visible, where the mouse was pressed.
  4. Press Cell->Link and select the Crystal link method. Press the mouse over the cell, and then over the interstitial atom, to identify the objects to link. Set x, y, z coordinates (Position page) to 0.0, 0.0, 0.5 and press Ok. 13 interstitial atoms are now visible, 1 centered in the cell and 12 centered in the edges, corresponding to a total of 4 octahedral interstices inside the cell.
  5. To represent the structural atoms, repeat the linking procedure above, but this time pressing the mouse over the Cu structural atom, to identify the linked atom, and setting x, y, z coordinates to 0.0, 0.0, 0.0. 14 structural atoms are now visible, 8 in the vertices and 6 centered in the faces, corresponding to a total of 4 atoms inside the cell.
  6. Select Light->Create and press Ok, to add a light and give atoms a three dimensional look.
  7. Press Cell->Select and click the mouse over the cell, to select it. Rotate,move,scale the cell with the mouse. To have a better view inside the cell, remove some of the structural atoms outside. Select Atom->Remove and press the mouse over the atoms to remove.
gamgi-0.17.5/doc/tutorials/interstices_cfc_page2.html000066400000000000000000000060071433127522700226070ustar00rootroot00000000000000 GAMGI Tutorials: Interstices in the CFC structure

Interstices in the CFC structure

Tetrahedral interstices

  1. Press Cell->Remove and click the mouse over the cell, to remove it. Otherwise, just scale it down and move it away from the center, to economize space. This way, the two cells containing octahedral and tetrahedral interstices can be compared later.
  2. Press Cell->Create and set System to c, Lattice to F (Face-Centered Cubic) and a to 2.828 (so the structural atoms will be in contact along <110> directions). Press Ok to create the cell.
  3. Press Atom->Modify and click the mouse over the interstitial atom, to select it. Change its Radius to 0.225, the size of the CFC tetrahedral interstices and press Ok.
  4. Press Cell->Link and select the Crystal link method. Press the mouse over the cell, and then over the interstitial atom, to identify the objects to link. Set x, y, z coordinates (Position page) to 0.25, 0.25, 0.25 and press Ok. 4 interstitial atoms are now visible, corresponding to 4 interstices inside the cell or 1/2 of the tetrahedral interstices available.
  5. Repeat the procedure above with x, y, z coordinates set to 0.75, 0.75, 0.75 to allocate the remaining interstices. 8 interstitial atoms are now visible, centered in the octant cubes, corresponding to a total of 8 tetrahedral interstices inside the cell.
  6. To represent the structural atoms, repeat the linking procedure above, but this time pressing the mouse over the Cu structural atom, to identify the linked atom, and setting x, y, z coordinates to 0.0, 0.0, 0.0. 14 structural atoms are now visible, 8 in the vertices and 6 centered in the faces, corresponding to a total of 4 atoms inside the cell.
  7. To remove the Cu,C atoms used as models during the building process, press Atom->Remove and click the mouse over them.
  8. Rotate,move,scale the cell with the mouse. To have a better view inside the cell, remove some of the structural atoms outside. Select Atom->Remove and press the mouse over the atoms to remove.
gamgi-0.17.5/doc/tutorials/interstices_hcp_page1.html000066400000000000000000000104361433127522700226260ustar00rootroot00000000000000 GAMGI Tutorials: Interstices in the HCP structure

Interstices in the HCP structure

To show the size and position of the HCP interstices, we need to create a cell with lattice parameters valid for a compact structure, and then link it with atoms representing the structure and atoms representing the interstices. The Radius of the structural atoms is set to 1.0, so the Radius of the interstitial atoms shows its comparative size.

The final result, showing two cells with octahedral (left) and tetrahedral (right) interstices, with some structural atoms removed to increase visibility, can be seen in the figure at http://www.gamgi.org/images/int_hcp.gif.

Octahedral interstices

  1. Press Cell->Create and set System to h, Lattice to P (Hexagonal), a to 2.0 (so the structural atoms will be in contact along <100> directions) and c to 3.266 (perfect HCP structure). Press Ok to create the cell.
  2. Select Atom->Create and set Style to Solid, Size to 1.0 and Variancy to 1.0. Set Element to Ti, for example (a HCP metal), Radius to 1.0 and press the mouse over the graphic area. A Ti atom is created where the mouse was pressed.
  3. Create a second atom, this time setting Element to C (for example) and Radius to 0.414 (the size of the HCP octahedral interstices). A new atom representing the octahedral interstitial atom is now visible, where the mouse was pressed.
  4. Press Cell->Link and select the Crystal link method. Press the mouse over the cell, and then over the interstitial atom, to identify the objects to link. Set x, y, z coordinates (Position page) to 0.666, 0.333, 0.25 and press Ok. 3 interstitial atoms are now visible, centered in alternated triangles (positions C) at height c/4, all inside the cell, corresponding to 1/2 of the octahedral interstices available.
  5. Repeat the procedure above with x, y, z coordinates set to 0.666, 0.333, 0.75 to allocate the remaining interstices. 6 interstitial atoms are now visible, centered in alternated triangles (positions C) at heights c/4 and 3c/4, all inside the cell.
  6. To represent the structural atoms, repeat the linking procedure above, but this time pressing the mouse over the Ti structural atom, to identify the linked atom, and setting x, y, z coordinates to 0.0, 0.0, 0.0. 14 structural atoms are now visible, at the corners and centered on the basal faces of the cell (positions A), corresponding to 3 structural atoms inside the cell or 1/2 of the atoms available.
  7. Repeat the procedure above with x, y, z coordinates set to 0.333, 0.666, 0.5 to allocate the remaining Ti structural atoms. 3 additional structural atoms are now visible, centered in alternated triangles (positions B) at height c/2, corresponding to a total of 6 atoms inside the cell.
  8. Select Light->Create and press Ok, to add a light and give atoms a three dimensional look.
  9. Press Cell->Select and click the mouse over the cell, to select it. Rotate,move,scale the cell with the mouse. To have a better view inside the cell, remove some of the structural atoms outside. Select Atom->Remove and press the mouse over the atoms to remove.
gamgi-0.17.5/doc/tutorials/interstices_hcp_page2.html000066400000000000000000000072421433127522700226300ustar00rootroot00000000000000 GAMGI Tutorials: Interstices in the HCP structure

Interstices in the HCP structure

Tetrahedral interstices

  1. Press Cell->Remove and click the mouse over the cell, to remove it. Otherwise, just scale it down and move it away from the center, to economize space. This way, the two cells containing octahedral and tetrahedral interstices can be compared later.
  2. Press Cell->Create and set System to h, Lattice to P (Hexagonal), a to 2.0 (so the structural atoms will be in contact along <100> directions) and c to 3.266 (perfect HCP structure). Press Ok to create the cell.
  3. Press Atom->Modify and click the mouse over the interstitial atom, to select it. Change its Radius to 0.225, the size of the HCP tetrahedral interstices and press Ok.
  4. Press Cell->Link and select the Crystal link method. Press the mouse over the cell, and then over the interstitial atom, to identify the objects to link. Set x, y, z coordinates (Position page) to 0.0, 0.0, 0.375 and press Ok. 7 interstitial atoms are now visible, centered in the vertical edges (immediately above positions A) corresponding to 3 interstices inside the cell or 1/4 of the tetrahedral interstices available.
  5. Repeat the procedure above with x, y, z coordinates set to 1) 0.0, 0.0, 0.625; 2) 0.333, 0.666, 0.875; and 3) 0.333, 0.666, 0.125 to allocate the remaining interstices. 20 interstitial atoms are now visible, 14 centered in the vertical edges and 6 centered in alternated triangles (immediately above and below positions B), corresponding to a total of 12 tetrahedral interstices inside the cell.
  6. To represent the structural atoms, repeat the linking procedure above, but this time pressing the mouse over the Ti structural atom, to identify the linked atom, and setting x, y, z coordinates to 0.0, 0.0, 0.0. 14 structural atoms are now visible, at the corners and centered on the basal faces of the cell (positions A), corresponding to 3 structural atoms inside the cell or 1/2 of the atoms available.
  7. Repeat the procedure above with x, y, z coordinates set to 0.333, 0.666, 0.5 to allocate the remaining Ti structural atoms. 3 additional structural atoms are now visible, centered in alternated triangles (positions B) at height c/2, corresponding to a total of 6 atoms inside the cell.
  8. To remove the Cu,C atoms used as models during the building process, press Atom->Remove and click the mouse over them.
  9. Rotate,move,scale the cell with the mouse. To have a better view inside the cell, remove some of the structural atoms outside. Select Atom->Remove and press the mouse over the atoms to remove.
gamgi-0.17.5/doc/tutorials/lights_page1.html000066400000000000000000000100151433127522700207230ustar00rootroot00000000000000 GAMGI Tutorials: Directional and positional lights

Directional and positional lights

We demonstrate here the three types of lights that GAMGI (and OpenGL) supports, plus other illumination issues. First we create an atom with a large curved surface, that we will use as a target, then we create the various lights and point them to the surface.

Directional light

  1. Press Atom->Create and set Element to O, Position to (0.0, 0.0, 0.0), Style to Solid and Scale to 15.0. After pressing Ok, a large sphere representing the new atom becomes visible, seen as a circle because tridimensional effects cannot be seen in the absence of diffuse and specular light components.
  2. Press Light->Create and set color Ambient (Color page) to (0.0, 0.0, 0.0), and Diffuse to (0.8, 0.8, 0.8). After pressing Ok, a default Directional light is created, illuminating the atom sphere, whose shape is now clearly visible.
  3. To select the light, either: 1) press the mouse middle button over the top menu where it says Light, and then press the mouse over the drawing area; or 2) press Light->Select, to open the dialog to select lights, and then press the mouse over the drawing area. In both cases, a menu pops up, showing one menu item, for the only light available. After choosing this light, it becomes the selected object.
  4. Press the left button and dragg the mouse to rotate the light direction, exactly as if rotating a molecule.

Positional light

  1. Press Light->Modify and press the mouse over the drawing area. A menu pops up, showing one menu item, for the only light available. After choosing this light, confirm its properties and then set Light to Positional. After pressing Ok, the light becomes positional, with the new parameters.
  2. Press the middle button and dragg the mouse to move the light position, exactly as if moving a molecule.

Spot light

  1. Press Light->Modify and press the mouse over the graphic area. A menu pops up, showing one menu item, for the only light available. After choosing this light, confirm its properties, in particular the new light position, that was changed with the mouse.
  2. Set Light to Spot and Angle to 10.0. After pressing Ok, the light becomes a spot, with the new parameters. Because the beam angle cutoff is only 10 degrees and the light is only 10 length units away, only the central part of the atom sphere is illuminated (setting angle to 1.0 emulates a laser).
  3. Press Light->Create and set color Ambient to (0.4, 0.4, 0.4) and Diffuse to (0.0, 0.0, 0.0). After pressing Ok, a second light is created, and its weak ambient light illuminates the whole atom as a halo. The selected object is still the first light.
  4. Press the left button and dragg the mouse to rotate the light direction, exactly as if rotating a molecule. Press the middle button and dragg the mouse to move the light position, exactly as if moving a molecule. Press the right button and dragg the mouse to increase or decrease the angle cutoff, exactly as if scaling a molecule.
gamgi-0.17.5/doc/tutorials/lights_page2.html000066400000000000000000000067621433127522700207420ustar00rootroot00000000000000 GAMGI Tutorials: Directional and positional lights

Directional and positional lights

Shininess

  1. Select Light->Modify, and press the mouse on the drawing area. A menu pops up, showing two menu items, for the two lights available. After choosing the first light, confirm its properties, in particular the new light direction, position, and angle, that were changed with the mouse.
  2. Set Specular to (0.6, 0.6, 0.6) and press Ok. A bright spot is now visible at the center of the atom, due to the reflected light.
  3. Select Light->Config and set Shininess (Materials page) to 0.0. After pressing Ok the bright spot disappears. Repeat the operation, this time set Shininess to 0.5. After pressing Ok the bright spot reappears, much brighter now, as the material light reflectance was increased.

Maximum illumination

  1. Select Light->Modify, and press the mouse on the drawing area. A menu pops up, showing two menu items, for the two lights available. After choosing the first light, set angle back to 90.0, color Ambient to (0.6, 0.6, 0.6), Specular to (0.0, 0.0, 0.0) and press Ok. The initial full color atom circle returns.

    This happens because the absence of lights correspond in fact to the existence of a light with Ambient component set to (1.0, 1.0, 1.0), and Diffuse, Specular components set to (0.0, 0.0, 0.0), the maximum luminosity that can be achieved. As the light components of the two lights are added, the total ambient light is now (1.0, 1.0, 1.0), so the maximum luminosity has been already reached and additional diffuse light cannot increase further the luminosity.

Wired objects illumination

  1. Select Atom->Modify and press the mouse over the atom. After confirming the atom properties, set Style to Wired and press Ok. The atom is now shown as a cross.
  2. Press Light->Modify and press the mouse over the graphic area. A menu pops up, showing two menu items, for the two lights available. After choosing the first light, confirm its properties, set Ambient to (0.0, 0.0, 0.0) and press Ok. Repeat for the second light, so the total ambient light is now (0.0, 0.0, 0.0). Because wired objects cannot reflect diffuse or specular light, they require ambient light to be visible. As the ambient light has been switched off, the wired cross becomes barely visible.
  3. Select Light->Remove and press the mouse over the graphic area. A menu pops up, showing two menu items, for the two lights available. Choose the first light, then the second, to remove them. The wired cross is visible again.
gamgi-0.17.5/doc/tutorials/nacl_page1.html000066400000000000000000000062061433127522700203550ustar00rootroot00000000000000 GAMGI Tutorials: NaCl crystalline structure

NaCl crystalline structure

  • Page 1
The NaCl rocksalt structure is widely observed in ionic crystals, with equal number of cations and anions, when the cation is significantly smaller than the anion: NaCl, KCl, LiF, MgO, CaO, SrO, NiO, CoO, MnO and PbO.

To build this structure, first we create the cell with the observed lattice parameters, then the Na, Cl atoms used as models, with the observed ionic radius, and then link the cell with the atoms.

  1. Press Cell->Create and set System to c, Lattice to F (Face-Centered Cubic) and a to 5.660 (so the ions will be in contact along <100> directions). Press Ok to create the cell.
  2. Select Atom->Create and set Style to Solid, Size to 1.0 and Variancy to 1.0. Set Element to Na, Radius to 1.020 (ionic radius for Na+) and press the mouse over the graphic area. A Na atom is created where the mouse was pressed.
  3. Set Element to Cl, Radius to 1.810 (ionic radius for Cl-) and press the mouse over the graphic area. A Cl atom is created where the mouse was pressed.
  4. Press Cell->Link and select the Crystal link method. Press the mouse over the cell, and then over the Na atom, to identify the objects to link. Set the x, y, z coordinates (Position page) to 0.5, 0.0, 0.0 and press Ok. 13 Na atoms are now visible, 12 in the edges and 1 in the center, corresponding to a total of 4 Na atoms inside the cell.
  5. Repeat the link procedure above, but this time pressing the mouse over the Cl atom, and setting the x, y, z coordinates to 0.0, 0.0, 0.0. 14 Cl atoms are now visible, 8 in the vertices and 6 in the face, corresponding to a total of 4 Cl atoms inside the cell.
  6. Select Light->Create and press Ok, to add a light and give atoms a three dimensional look.
  7. Remove the Na,Cl atoms used as models during the building process, pressing Atom->Remove and clicking the mouse over the two atoms.
  8. Rotate,move,scale the NaCl cell with the mouse. Press Atom->Measure to determine lengths and angles between atoms.
  9. Repeat the whole procedure, this time setting the cell type in Cell->Create (Type page) to: 1) Primitive; and 2) Wigner-Seitz.
gamgi-0.17.5/doc/tutorials/nanostructure_page1.html000066400000000000000000000130251433127522700223510ustar00rootroot00000000000000 GAMGI Tutorials: Multilayer nanostructure

Multilayer nanostructure

  • Page 1
The occupancy rules implemented in GAMGI, determining which nodes in crystallographic cells should be occupied, is a powerful tool to build an unlimited range of non crystalline structures, to simulate liquid mixtures, for example. Coupled with changes in the cell origin node, they can be used to build arbitrary multi-layer 3D nanostructures.

This tutorial shows how to create a G letter, with a contour three-atom thick, over a substrate formed also by three atomic layers of a different element.

First we create a cell with the proper dimensions, a Si atom to describe the substrate and a Cu atom to describe the adatoms, then link sucessively the substrate atom and the adatom with the cell to create the proper structure.

The final structure, with an orthographic layer and a directional light, can be seen in the figure at http://www.gamgi.org/images/screenshot12_4b.png.

Nanostructure

  1. Press Cell->Create and set System to c, Lattice to P and the lattice parameter a to 1. In the Type page, set the number of cells along a, b, c directions to 38, 26 and 5, respectively. This provides the grid of nodes that is needed to link the atoms. In the View page, set Borders to Edges and disable Nodes, to reduce visual cluttering to a minimum. Press Ok to create the cell.
  2. Press Atom->Create and set Style to Solid, Size to 1.0 and Variancy to 1.0, to guarantee that the atom spheres are built with the atom radius. Write Si in the Element entry, set Radius to 0.5 and press the mouse over the screen (outside the cell), to create a Si template atom. Repeat the task to create a Cu template atom with the same radius.
  3. Select Light->Create and press Ok, to give a tridimensional aspect to the atoms. If computer rendering becomes too slow, select Atom->Config, change Slices to 4 and in the end change back to 16.
  4. Press Cell->Modify and then press over the cell, to get its data. Go to the Origin page, set the Node coordinates to 0, 0, 1 and press Ok, to change the cell origin. Press Cell->Link, then press over the cell, then press over the Si atom, and select the method Crystal. Go to the Occupancy page, set the rules over the a, b, c directions to *, *, *1, respectively, and press Ok. The Si three-layer substrate is in place.
  5. Repeat the Cell->Modify task, to change the cell origin to the coordinates 7, 19, 4, and press Ok. Repeat the Cell->Link task, to link the cell with the Cu atom, using as pattern rule *1, *13, *1, and press Ok. The left segment of the G letter is in place.
  6. Repeat the Cell->Modify task, to change the cell origin to the coordinates 19, 11, 4, and press Ok. Repeat the Cell->Link task, to link the cell with the Cu atom, using as pattern rule *1, *5, *1, and press Ok. The bottom right segment of the G letter is in place.
  7. Repeat the Cell->Modify task, to change the cell origin to the coordinates 19, 27, 4, and press Ok. Repeat the Cell->Link task, to link the cell with the Cu atom, using as pattern rule *1, *5, *1, and press Ok. The top right segment of the G letter is in place.
  8. Repeat the Cell->Modify task, to change the cell origin to the coordinates 13, 7, 4, and press Ok. Repeat the Cell->Link task, to link the cell with the Cu atom, using as pattern rule *4, *1, *1, and press Ok. The bottom segment of the G letter is in place.
  9. Repeat the Cell->Modify task, to change the cell origin to the coordinates 13, 31, 4, and press Ok. Repeat the Cell->Link task, to link the cell with the Cu atom, using as pattern rule *4, *1, *1, and press Ok. The top segment of the G letter is in place.
  10. Repeat the Cell->Modify task, to change the cell origin to the coordinates 16, 15, 4, and press Ok. Repeat the Cell->Link task, to link the cell with the Cu atom, using as pattern rule *1, *1, *1, and press Ok. The inner segment of the G letter is in place. The whole structure, containing 3159 Si atoms and 630 Cu atoms, is terminated.
gamgi-0.17.5/doc/tutorials/occupancy_page1.html000066400000000000000000000054201433127522700214210ustar00rootroot00000000000000 GAMGI Tutorials: Occupancy rules

Occupancy rules

The occupancy rules implemented in GAMGI, determining which nodes in crystallographic cells should be occupied, is a powerful tool to build non crystalline structures, for example to generate starting configurations to simulate liquid mixtures.

This tutorial shows how to use occupancy rules to create usefull structures in a spherical cell volume and in a conventional cell volume. We create first a spherical volume and second a conventional volume, for a cubic cell, plus Si, C template atoms, and link them together using several different occupancy rules, to exemplify the method.

Structures as those created in this tutorial can be seen in the figure at http://www.gamgi.org/images/screenshot08_4b.png.

Spherical volume

  1. Press Cell->Create and set System to c, Lattice to P and the lattice parameter a to 1. In the Type page, choose Sphere, with radius Length equal to 5. Press Ok to create the cell.
  2. To improve visibility, press Layer->Modify, change Projection to Orthographic and press Ok.
  3. Press Atom->Create, write Si in the Element entry and press the mouse over the screen (outside the cell), to create a Si template atom. Repeat the task to create a C template atom.
  4. Press Cell->Link, then press over the cell, then press over the Si atom, and select the method Crystal. Go to the Occupancy page, set the Rules to (*2, *2, *2) and press Ok. A cube with 3x3x3 nodes in the center of the sphere is now occupied with Si atoms.
  5. Repeat the Cell->Link task, this time linking the cell with the C atom, using as pattern rule (___*****, ___*****, ___*****), and press Ok. All nodes around the 3x3x3 central nodes are now occupied with C atoms.
gamgi-0.17.5/doc/tutorials/occupancy_page2.html000066400000000000000000000073051433127522700214260ustar00rootroot00000000000000 GAMGI Tutorials: Occupancy rules

Occupancy rules

Conventional volume

  1. Press Cell->Remove and press over the cell to remove it. Press Cell->Create and set System to c, Lattice to P and the lattice parameter a to 1. In the Type page, set the number of conventional cells to 5, 5, 5, and press Ok to create the cell. Press Save and then Ok, to save the empty cell.
  2. Repeat the Cell->Link task, linking the cell volume with the Si atom, with the pattern (*2_, *, *). The left side of the cell is occupied with Si atoms. Repeat the Cell->Link task, this time linking with a C atom, with the pattern (_2*, *, *). The right side of the cell is occupied with C atoms.
  3. Press Save and move Backward once, to recover the empty cell, then press Ok. To create 8 alternating octant cubes, four with Si and four with C atoms, repeat the Cell->Link task 4 times with a Si atom, with the rules (*2_, *2_, *2_), (_2*, _2*, *2_), (_2*, *2_, _2*), (*2_, _2*, _2*) and another 4 times with a C atom, with the rules (*2_, *2_, _2*), (_2*, _2*, _2*), (_2*, *2_, *2_), (*2_, _2*, *2_).
  4. Press Save and move Backward once, to recover the empty cell, then press Ok. Repeat the Cell->Link task, linking the cell volume with the Si atom, with the pattern (*_, *_, *_). Alternating nodes, half of the total, are now occupied with Si atoms. Repeat the Cell->Link task, this time linking with a C atom, with the pattern (_*, _*, _*). The other half of the alternating nodes is now occupied with C atoms.
  5. Press Save and move Backward once, to recover the empty cell, then press Ok. Press Cell->Modify and change, in the Type page, the number of cells to 6, 6, 6, in the Origin page, the Axes to Yes, and press Ok. The first (red), second (green) third (blue) axes are now visible at the corner of the increased cell volume. Press Cell->Modify again and change, in the Origin page, the origin node coordinates to 3, 3, 3, then press Ok. The node origin is now at the center of the cell volume, although the physical origin remains the same.
  6. Repeat the Cell->Link task, linking the cell volume with the Si atom, with the pattern (*1, *1, *1). A cube with 3x3x3 nodes in the center of the cell is now occupied with Si atoms. Repeat the Cell->Link task, this time linking with a C atom, with the pattern (__****, __****, __****). All nodes around the 3x3x3 central nodes are now occupied with C atoms.
gamgi-0.17.5/doc/tutorials/polyethylene_page1.html000066400000000000000000000130331433127522700221550ustar00rootroot00000000000000 GAMGI Tutorials: Orthorhombic Polyethylene

Orthorhombic Polyethylene

  • Page 1
High-density polyethylene can crystallize in both orthorhombic and monoclinic systems. Here we demonstrate how to build a crystal of orthorhombic polyethylene using the crystallographic information available in the literature for this polymer.

First we create a cell with the polyethylene lattice parameters and space group, then one atom of C and H, to model the atoms of the structure, and finally link the cell with the atoms to build the crystal, using the Wyckoff positions known for C and H.

Lateral and top views of the polymeric chains, for 2x10x2 conventional cells, can be seen in the figure at http://www.gamgi.org/images/screenshot11_6b.png.

Polyethylene

  1. Press Cell->Create and set Group to 62, the Pnma space group for orthorhombic polyethylene. As this is an orthorhombic system with a primitive lattice, System and Lattice are automatically set to o and P, respectively.
  2. Set the lattice parameters a, b, c to 7.48, 2.55, 4.97, respectively, the reported values for orthorhombic polyethylene. The entries for angles ab, ac, bc are automatically disabled, as they must be 90 degrees.
  3. With this standard crystallographic orientation, the polymer chains will be aligned along direction b, so set the number of cells n1, n2, n3 to 2, 10, 2, respectively. Press Ok to create the cell.
  4. Press Atom->Create, write C in the Element entry and press the mouse over the screen (outside the cell), to create a C atom. Repeat the task to create a H atom. These two atoms will act as models to create the structure.
  5. Press Cell->Link and select the Crystal link method. Initially, the Wyckoff menu (in Position page) only has the option, 1 Basis 1, which is the usual crystallographic base or motif. The first "1" indicates the number of objects that will be linked to each crystallographic node, and the last "1" the point symmetry.
  6. Press the mouse over the cell to identify it. As the cell belongs to space group 62, the Wyckoff menu is automatically updated to include options for all the Wyckoff positions available for this space group: 8 d 1, 4 c .m., 4 b -1 and 4 a -1.
  7. Press the mouse over the C atom, to identify the atom used as a model to create the C atoms of the crystal.
  8. According to literature, C atoms occupy Wyckoff positions c, so select these positions in the Wyckoff menu: 4 c .m.. For these positions, the y coordinate is known in advance, so the y entry is automatically disabled.
  9. Make the x, z coordinates equal to 0.0330, 0.0660, respectively, and press Ok. 4 atoms of C are added to each node of the cell (and removed if they fall outside the cell volume).
  10. Repeat the link procedure, this time to add H atoms. Press the mouse first over the cell, and then over the H atom. Select again Wyckoff positions c, make the x, z coordinates equal to 0.1898, 0.0520, respectively, and press Ok. 4 atoms of H are added to each node of the cell (and removed if they fall outside the cell volume).
  11. Repeat the link procedure, to add the remaining H atoms. Press the mouse first over the cell, and then over the H atom. Select again Wyckoff positions c, make the x, z coordinates equal to 0.0339, 0.2607, respectively, and press Ok. 4 atoms of H are added to each node of the cell (and removed if they fall outside the cell volume).
  12. The atomic structure is now created. To remove the two C,H atoms used as models during the building process, press Atom->Remove and click the mouse over them.
  13. To create the C-C and C-H polyethylene bonds, press Bond->Create, select the method Length and press Ok.
  14. To simplify the visual analysis, press Layer->Modify, change Projection to Orthographic, and press Ok.
  15. To reduce visual clutter, press Cell->Modify and change Borders to Faces or even Edges (in View page). Set the Euler angles E1,E2,E3 to 0,0,0 and 90,90,90, (in Position page) to get lateral and top views, respectively, of the polymer chains. Press Ok to activate the changes.
  16. Rotate,move,scale the polyethylene cell with the mouse, to see the ziz-zag chains (and the partly-formed chains in the outside). Press Atom->Measure to determine lengths and angles between atoms.
gamgi-0.17.5/doc/tutorials/rcp_page1.html000066400000000000000000000110111433127522700202120ustar00rootroot00000000000000 GAMGI Tutorials: Random Close Packing structure

Random Close Packing structure

  • Page 1
The Random Close Packing (RCP) structure has the highest volume density among amorphous structures (0.62 - 0.64), which compares with the highest volume density among crystalline structures (0.74). The RCP structure is particularly suitable to describe metallic glasses, due to the nondirectional nature of metallic bonding combined with the absence of local charge-neutrality requirements.

To build a RCP structure, first we create an orthorhombic cell with the required dimensions, then a Cu atom used as model, and then link the cell with the atom, to create the random structure.

The result, for 50,000 atoms, can be seen in the figure at http://www.gamgi.org/images/screenshot12_3b.png.

  1. Press Cell->Create and set System to o, Lattice to P (Primitive Orthorhombic), a to 10, b to 9 and c to 8. Press Ok to create the cell.
  2. Select Atom->Create and set Style to Solid, Size to 1.0 and Variancy to 1.0. Set Element to Cu and press the mouse over the graphic area. A Cu atom is created where the mouse was pressed.
  3. Select Light->Create and press Ok, to iluminate the atoms. Select Layer->Modify, go to the View page, set Scale to 0.5, to decrease the size of the objects, and press Ok.
  4. Select Cell->Link, press the mouse over the cell and then over the Cu atom, to identify the objects to link. Select the Random link method and press Ok. A RCP structure with 40 atoms is created, with density slightly above 0.62.
  5. Press Atom->Modify and press the mouse sucessively over the initial model atom and one of the atoms just created, to compare the radius. By default, the RCP structure will contain atoms with a radius as close as possible to the model atom (the number of spheres is determined by GAMGI).
  6. Press Undo (in the tools bar, below the graphic area), press the backward arrow, and then Ok, to recover the previous configuration, before the RCP structure was created.
  7. Repeat the Cell->Link procedure, but this time go to the Packing page that appear in the dialog when the Random method is selected. Increase the Relaxation time to 10,000 and press Ok. A new RCP structure is created, with a density slightly higher than before. In rare occasions, when the number of spheres is very small, the density can achieve values as high as 0.68: the structure crystallized!
  8. Increasing the Relaxation time gives more time for the atoms to reorganize, improving slightly the density but raising considerably the computation time. Repeat the whole procedure with a larger Relaxation time to confirm that the density does not keep increasing above 0.65, for a large number of spheres.
  9. Press Undo again, and recover the previous configuration, before the RCP structure was created. Repeat the Cell->Link procedure, go to the Packing page, and press Number, to fix the number of atoms to create (the radius is determined by GAMGI). Set the number of atoms to 200, for example, and press Ok. A new RCP structure with 200 atoms is created. As the number of spheres increased, the radius of the spheres decreased.
  10. When the number of solid spheres is large, the computing time needed to show the structure might be too demanding. In this case, a good tip is to select Atom->Config and decrease Slices (the number of parallels and meridians used to divide the sphere into plane regions), for example to 4 (the minimum accepted).
gamgi-0.17.5/doc/tutorials/symmetry_page1.html000066400000000000000000000065501433127522700213330ustar00rootroot00000000000000 GAMGI Tutorials: Point Symmetry analysis

Point Symmetry analysis

Point symmetry characterization is extremely important in describing atomic structures, particularly in molecular spectroscopy and crystallography. GAMGI supports both the (infinite) unrestricted chemical groups of symmetry, and the 32 crystallographic groups with 2,3,4,6 rotations only.

To exemplify the method, we create first a water molecule and measure its symmetry (C2v), then we import a C30 fullerene molecule and measure its chemical, unrestricted (Ih) and crystallographic, restricted (Th) point symmetry.

Water

  1. Press Atom->Create, set Element to O, set X, Y, Z to 0, 0, 0, and press Ok, to create the O atom.
  2. Set Element to H, set X, Y, Z to 0.6, 0.7749, 0, and press Ok, to create the first H atom. To create the second, set Element to H, and X, Y, Z to 0.6, -0.7749, 0, before pressing Ok.
  3. Select Molecule->Create, write a name for the molecule, for example water, and press Ok. The new molecule has no contents yet, so the dialog Molecule->Link replaces automatically the previous one. Press the mouse over one of the atoms and press Ok, to link it to the molecule. Repeat for the other two atoms.
  4. Select Bond->Create and click over the O and a H atom to create a bond. Repeat with the other H atom. To see the object hierarchy, select for example Molecule->Select.
  5. To confirm that the water molecule has the proper geometry, select Molecule->Measure, and click on the molecule. The report produced shows that there are two OH bond lengths with the value 0.98 and one HOH bond angle with the value 104.5 degrees.
  6. Select again Molecule->Measure, but this time change the Method to Symmetry, before clicking on the molecule. The report produced shows that the molecule belongs to the group C2v and its symmetry elements are two mirror planes and one C2 rotation axis. The error associated with each symmetry element is reported, plus unit vectors normal to the planes, 0.0000, -1.0000, 0.0000 and 0.0000, 0.0000, 1.0000, and paralell to the axis 1.0000, 0.0000, 0.0000. Try to understand the orientation of the planes and axis, considering that the x direction points to the right, the y direction to the top and the z direction to the user. To get a detailed explanation of the information shown on the report, press Help->Current.
gamgi-0.17.5/doc/tutorials/symmetry_page2.html000066400000000000000000000070411433127522700213300ustar00rootroot00000000000000 GAMGI Tutorials: Point symmetry analysis

Point symmetry analysis

C30

  1. Press Reset and then select File->Import, to import the file dat/molecule/symmetry/Ih_C30.xml.
  2. Select Bond->Create, click on Length to create bonds using the length criterium, and press Ok. The C20 fullerene molecule is now clearly visible.
  3. Select Molecule->Measure, change the Method to Symmetry and click on the molecule. The report produced shows that indeed the molecule has icosahedric symmetry Ih. The symmetry elements found include an inversion center, around 0.0000, 0.0000, 0.0000, 15 mirror planes, 31 normal axes (with orders 5, 3, 2) and 16 improper axes (with orders 10, 6). For each class of elements, they are ordered according to increasing errors, so more accurate elements are presented first.

    There are 24 C5 symmetry operations for 6 C5 axes only, because there are 4 operations for each axis: C15, C25, C35, C45. There are 20 C3 operations for 10 C3 axes only, because there are 2 operations for each axis: C13 and C23. There are only 15 C2 symmetry operations, as each C2 axis there is only one symmetry operation, C12.

  4. Select again Molecule->Measure, set Method to Symmetry, but this time change Periodicity to Yes (Symmetry page), before clicking on the molecule. The report produced indicates that the molecule has cubic symmetry Th, because now only rotations 2,3,4,6 can be considered.

    The number of normal axes decreased to four C3, and three C2, the number of mirror planes decreased to 3, and the number of improper rotation axes decreased to four S6. It is important to understand why the restrictions on rotation operations afect also mirror and lower order normal and improper axes: for example, 5 mirror planes around a C5 axis cannot be considered simultaneously without violating the condition that symmetry of order 5 is absent, only one of the 5 planes can be considered.

    As a result, different groups of symmetry can be obtained in some cases. For example a C24v chemical group can be downgraded to totally different C4v or a C6v crystallographic groups, as the C4 symmetry operations are not a subset of the C6. When this happens, the GAMGI report shows the various options.

  5. For this structure, most of the errors associated with the symmetry elements are between 1E-5 and 1E-4. Select again Molecule->Measure, set Method to Symmetry, but this time change Tolerance Initial and Final to 1E-4 (Symmetry page), so the less accurate elements are discarded. The symmetry group is now Undefined, as there is no group of symmetry that is compatible with the symmetry information found, after discarding all the elements with error above 1E-4.
gamgi-0.17.5/doc/tutorials/tutorials.html000066400000000000000000000031361433127522700204100ustar00rootroot00000000000000 GAMGI: Tutorials
Tutorials
 
gamgi-0.17.5/doc/tutorials/voronoi_page1.html000066400000000000000000000127531433127522700211370ustar00rootroot00000000000000 GAMGI Tutorials: Voronoi tesselation

Voronoi tesselation

Voronoi tesselation is used in a wide range of scientific areas, from medicine to economics, as a technique to split some intensive quantity among a given set of objects. When these are atoms, the Voronoi tesselation provides a way to relate the electronic distribution of the atomic structure with its topologigal and geometric properties.

First we create a water molecule and calculate its Voronoi tesselation, changing the boundary offset, the boundary conditions, and the atomic weights. The four polyhedra obtained can be seen in the figure at http://www.gamgi.org/images/voronoi1.png.

Water

  1. Press Atom->Create, set Element to O, set X, Y, Z to 0, 0, 0, and press Ok, to create the O atom.
  2. Set Element to H, set X, Y, Z to 0.6, 0.7749, 0, and press Ok, to create the first H atom. To create the second, set Element to H, and X, Y, Z to 0.6, -0.7749, 0, before pressing Ok.
  3. Select Molecule->Create, write a name for the molecule, for example water, and press Ok. The new molecule has no contents yet, so the dialog Molecule->Link replaces automatically the previous one. Press the mouse over one of the atoms and press Ok, to link it to the molecule. Repeat for the other two atoms.
  4. Select Bond->Create and click over the O and a H atom to create a bond. Repeat with the other H atom. To see the object hierarchy, select for example Molecule->Select. To save the molecule, press File->Export and write the file name, for example water.xml, before pressing Ok.
  5. Select Molecule->Measure, set Method to Voronoi, and click on the molecule. A polyhedra cluster object is shown, in a new layer (with Visibility to the Outside set to None), describing the tesselation of the water molecule. A long report is also produced, with geometrical and topological properties. To see what these properties mean press Help->Current. Close the report window, rotate the cluster and move it to the top right corner of the graphic area.
  6. Select Layer->Select (or press Layer on the top menu with the mouse middle button) and click the mouse on the screen, to list the available layers and select the first one, that contains the water molecule. The water and the cluster are now both visible (because this layer has Visibility to the Outside set to All).
  7. Select again Molecule->Measure, set Method to Voronoi, but this time change Offset to 0.1 (Voronoi page), before clicking on the molecule. The 6 outside planes are now much closer to the atoms, so the cluster produced is much smaller and its shape is also different. Rotate the cluster and move it to the bottom right corner of the graphic area.
  8. Select again the layer containing the water molecule. Select again Molecule->Measure, set Method to Voronoi but this time change Boundaries to Periodic (Voronoi page), before clicking on the molecule. Instead of defining 6 outer planes, the water molecule was now surrounded by 26 virtual copies of its own, and the cluster obtained reflects these changes.
  9. Select Cluster->Copy, change Number to 2, click on the cluster and press Ok, to produce two new copies of the original cluster. Select Cluster->Select and confirm that there are now three clusters exactly equal. Then click on the visible cluster to select it and move it to the right until it just touches the central one. Click again on the visible cluster to select it and move it to the left until it just touches the central one. The three clusters together define a continuous pattern, showing that periodic boundary conditions were applied. Select Cluster->Remove and click on the left and right clusters to remove them. Move the remaining cluster to the top left corner of the graphic area.
  10. Select again the layer containing the water molecule. Select again Molecule->Measure, set Method to Voronoi, Boundaries to Periodic but this time change Variancy to 1.0 (Voronoi page), before clicking on the molecule. This time larger atoms have larger polyhedra so these are much smaller for H than for O. Move the cluster to the bottom left corner of the graphic area and select again the layer containing the water molecule, to see the four polyhedra obtained so far.
gamgi-0.17.5/doc/tutorials/voronoi_page2.html000066400000000000000000000105261433127522700211340ustar00rootroot00000000000000 GAMGI Tutorials: Voronoi tesselation

Voronoi tesselation

Then we import a simple cubic structure and analyse the data produced by the tesselation, to ilustrate the various properties reported, first with Variancy set to 0.0 and then with Variancy set to 1.0, in both cases with periodic boundary conditions. The two polyhedra obtained can be seen in the figure at http://www.gamgi.org/images/voronoi2.png.

Cubic structure

  1. Select Gamgi->Reset and press Ok, to remove the various layers and restart Gamgi. Press File->Import and import the file dat/cluster/cs111.xml, containing a cluster with eight atoms of different elements, in a cubic arrangement.
  2. Select Cluster->Measure, set Method to Voronoi, Boundaries to Periodic, Offset to 1.5 and click on the cluster. A cubic polyhedra is shown, in a new layer, formed by eight octant cubes, one for each atom.
  3. Try to understand the topological data reported. For example, Polyhedron Faces, Polyhedron Edges and Polyhedron Vertices are 6, 12 and 8, respectively, and Face Vertices is 4.

    Edge Polyhedrons can be 1 (edges on the edges of the total polyhedron), 2 (edges on the faces of the total polyhedron) or 4 (edges inside the total polyhedron). Edge Faces can be 2 (edges on the outside of the total polyhedron) or 4 (edges on the inside of the total polyhedron).

    Vertex Polyhedrons can be 1 (vertices on the corners of the total polyhedron), 2 (vertices on the edges of the total polyhedron), 4 (vertices on the faces of the total polyhedron) or 8 (the vertex inside the total polyhedron). Vertex Faces can be 3 (vertices on the corners of the total polyhedron), 5 (vertices on the edges of the total polyhedron), 8 (vertices on the faces of the total polyhedron) or 12 (the vertex inside the total polyhedron). Vertex Edges can be 3 (vertices on the corners of the total polyhedron), 4 (vertices on the edges of the total polyhedron), 5 (vertices on the faces of the total polyhedron) or 6 (the vertex inside the total polyhedron).

  4. Try to understand the geometrical data reported. The atoms are separated by 2.0 and the Offset is 1.5 so their cubes have a length of 2.0 / 2 + 1.5 / 2 = 1.75. Therefore Edge Lengths is always 1.75 and Edge Lengths is always 90.0.

    Face Areas is 1.75 x 1.75 = 3.0625, Face Lengths (the perimeter) is 1.75 x 4 = 7.0 and Face Angles is 90.0. Polyhedron Volumes is 1.75 x 1.75 x 1.75 = 5.359375, Polyhedron Areas is 1.75 x 1.75 x 6 = 18.375 and Polyhedron Lengths is 1.75 x 12 = 21.0. The Total Volume is 1.75 x 1.75 x 1.75 x 8 = 42.875.

  5. Move the cluster to the left side of the graphic area, and select again the first layer, containing the cubic atomic arrangement. Select Cluster->Measure, set Method to Voronoi, Boundaries to Periodic but this time change Variancy to 1.0 (Voronoi page), before clicking on the cluster. An error is produced because this weighted tesselation is more restrictive than the normal Voronoi tesselation and the small H atom is too close to the virtual large Na atom.
  6. Repeat the same task but this time increase Offset to 1.5 before clicking on the cluster. Eight complex polyhedra are produced, with larger ones for larger atoms, as Na, and smaller ones for smaller atoms, as H. Move the total cluster to the right side and select again the first layer, to see the two polyhedra together.
gamgi-0.17.5/src/000077500000000000000000000000001433127522700134655ustar00rootroot00000000000000gamgi-0.17.5/src/BUGS000066400000000000000000000012541433127522700141520ustar00rootroot00000000000000- Menus in the top menu bar cannot be open using only the keyboard. Importance: low. - Scaling a Group,Molecule,Cluster,Cell containing Atoms bonded to a different Group,Molecule,Cluster,Cell produces visually awkward images for those Bonds. Importance: medium. - Exporting a molecule after rotating it produces wrong bonds, when the molecule was bonded to another non-rotated molecule, because the rendering flags were corrupted. Importance: high (solution: use a task id). - Help Current should know when a second level dialog is active, to supply better help docs. Importance: low. - Add frame, axes to orbital X3D objects. Importance: medium. gamgi-0.17.5/src/LICENSE000066400000000000000000001045131433127522700144760ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gamgi-0.17.5/src/chem/000077500000000000000000000000001433127522700144015ustar00rootroot00000000000000gamgi-0.17.5/src/chem/gamgi_chem.h000066400000000000000000000350021433127522700166320ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/chem/gamgi_chem.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #ifndef GAMGI_CHEM #define GAMGI_CHEM /********** types ********* **************************/ /********************************************************************* * These types define pointers to radial and angular H wavefunctions * *********************************************************************/ typedef double (*gamgi_radial) (double r); typedef double (*gamgi_angular) (double x, double y, double z, double r); /********** enumerations ********** **********************************/ /************************************************************** * All external enumerations start at 1 and share FALSE for 0 * **************************************************************/ enum { GAMGI_CHEM_RADIUS = 1, GAMGI_CHEM_UNIT, GAMGI_CHEM_BOHR, GAMGI_CHEM_NONE }; /************************* * graphene enumerations * *************************/ enum { GAMGI_CHEM_CONE_0, GAMGI_CHEM_CONE_60_D, GAMGI_CHEM_CONE_60_O, GAMGI_CHEM_CONE_120_E, GAMGI_CHEM_CONE_120_H, GAMGI_CHEM_CONE_120_S, GAMGI_CHEM_CONE_120_O, GAMGI_CHEM_CONE_180_D, GAMGI_CHEM_CONE_180_S, GAMGI_CHEM_CONE_180_O, GAMGI_CHEM_CONE_240_E, GAMGI_CHEM_CONE_240_H, GAMGI_CHEM_CONE_240_P, GAMGI_CHEM_CONE_240_A, GAMGI_CHEM_CONE_240_O, GAMGI_CHEM_CONE_300_E, GAMGI_CHEM_CONE_300_O }; enum { GAMGI_CHEM_GRAPHENE_CAGE_5_0, GAMGI_CHEM_GRAPHENE_CAGE_5_5, GAMGI_CHEM_GRAPHENE_CAGE_6_6_S, GAMGI_CHEM_GRAPHENE_CAGE_6_6_C }; enum { GAMGI_CHEM_GRAPHENE_CAP_5_0, GAMGI_CHEM_GRAPHENE_CAP_5_5, GAMGI_CHEM_GRAPHENE_CAP_6_6_S, GAMGI_CHEM_GRAPHENE_CAP_6_6_C }; /************* macros ************ *********************************/ /*************************************** * Dummy atom (Z=0) default properties * **************************************/ #define GAMGI_CHEM_DU 0 #define GAMGI_CHEM_DU_MASS 1.0 #define GAMGI_CHEM_DU_RADIUS 1.0 #define GAMGI_CHEM_DU_R 0.864 #define GAMGI_CHEM_DU_G 0.864 #define GAMGI_CHEM_DU_B 0.864 enum { GAMGI_CHEM_H = 1, GAMGI_CHEM_HE, GAMGI_CHEM_LI, GAMGI_CHEM_BE, GAMGI_CHEM_B, GAMGI_CHEM_C, GAMGI_CHEM_N, GAMGI_CHEM_O, GAMGI_CHEM_F, GAMGI_CHEM_NE, GAMGI_CHEM_NA, GAMGI_CHEM_MG, GAMGI_CHEM_AL, GAMGI_CHEM_SI, GAMGI_CHEM_P, GAMGI_CHEM_S, GAMGI_CHEM_CL, GAMGI_CHEM_AR, GAMGI_CHEM_K, GAMGI_CHEM_CA, GAMGI_CHEM_SC, GAMGI_CHEM_TI, GAMGI_CHEM_V, GAMGI_CHEM_CR, GAMGI_CHEM_MN, GAMGI_CHEM_FE, GAMGI_CHEM_CO, GAMGI_CHEM_NI, GAMGI_CHEM_CU, GAMGI_CHEM_ZN, GAMGI_CHEM_GA, GAMGI_CHEM_GE, GAMGI_CHEM_AS, GAMGI_CHEM_SE, GAMGI_CHEM_BR, GAMGI_CHEM_KR, GAMGI_CHEM_RB, GAMGI_CHEM_SR, GAMGI_CHEM_Y, GAMGI_CHEM_ZR, GAMGI_CHEM_NB, GAMGI_CHEM_MO, GAMGI_CHEM_TC, GAMGI_CHEM_RU, GAMGI_CHEM_RH, GAMGI_CHEM_PD, GAMGI_CHEM_AG, GAMGI_CHEM_CD, GAMGI_CHEM_IN, GAMGI_CHEM_SN, GAMGI_CHEM_SB, GAMGI_CHEM_TE, GAMGI_CHEM_I, GAMGI_CHEM_XE, GAMGI_CHEM_CS, GAMGI_CHEM_BA, GAMGI_CHEM_LA, GAMGI_CHEM_CE, GAMGI_CHEM_PR, GAMGI_CHEM_ND, GAMGI_CHEM_PM, GAMGI_CHEM_SM, GAMGI_CHEM_EU, GAMGI_CHEM_GD, GAMGI_CHEM_TB, GAMGI_CHEM_DY, GAMGI_CHEM_HO, GAMGI_CHEM_ER, GAMGI_CHEM_TM, GAMGI_CHEM_YB, GAMGI_CHEM_LU, GAMGI_CHEM_HF, GAMGI_CHEM_TA, GAMGI_CHEM_W, GAMGI_CHEM_RE, GAMGI_CHEM_OS, GAMGI_CHEM_IR, GAMGI_CHEM_PT, GAMGI_CHEM_AU, GAMGI_CHEM_HG, GAMGI_CHEM_TL, GAMGI_CHEM_PB, GAMGI_CHEM_BI, GAMGI_CHEM_PO, GAMGI_CHEM_AT, GAMGI_CHEM_RN, GAMGI_CHEM_FR, GAMGI_CHEM_RA, GAMGI_CHEM_AC, GAMGI_CHEM_TH, GAMGI_CHEM_PA, GAMGI_CHEM_U, GAMGI_CHEM_NP, GAMGI_CHEM_PU, GAMGI_CHEM_AM, GAMGI_CHEM_CM, GAMGI_CHEM_BK, GAMGI_CHEM_CF, GAMGI_CHEM_ES, GAMGI_CHEM_FM, GAMGI_CHEM_MD, GAMGI_CHEM_NO, GAMGI_CHEM_LR, GAMGI_CHEM_RF, GAMGI_CHEM_DB, GAMGI_CHEM_SG, GAMGI_CHEM_BH, GAMGI_CHEM_HS, GAMGI_CHEM_MT, GAMGI_CHEM_DS, GAMGI_CHEM_RG }; enum { GAMGI_CHEM_CONTAINER = 1, GAMGI_CHEM_POLYTOPE }; enum { GAMGI_CHEM_STRUCTURE_COPY = 1, GAMGI_CHEM_STRUCTURE_LINK, GAMGI_CHEM_STRUCTURE_NONE }; enum { GAMGI_CHEM_FILTER_CLASS = 1, GAMGI_CHEM_FILTER_PARENT, GAMGI_CHEM_FILTER_IDENTICAL, GAMGI_CHEM_FILTER_NONE }; /****************************************** * default policies for structure, filter * ******************************************/ #define GAMGI_CHEM_STRUCTURE GAMGI_CHEM_STRUCTURE_COPY #define GAMGI_CHEM_FILTER GAMGI_CHEM_FILTER_CLASS /******************************************* * number of atomic elements * * * * Although GAMGI is currently recognizing * * only elements until Rg[111], therefore * * with 2 char names, the source code is * * ready to accept elements with 3 char * * names such as UUo[118] (the periodic * * table will look much larger though). * *******************************************/ #define GAMGI_CHEM_ATOM_MAX 111 /********************************************************************** * maximum number of char in atom label, without the final '\0': it * * should be smaller than GAMGI_ENGINE_TOKEN, where labels are stored * **********************************************************************/ #define GAMGI_CHEM_ATOM_LABEL 10 /*********************** * Default atom charge * ***********************/ #define GAMGI_CHEM_ATOM_CHARGE 0.0 /******************************************************* * sum both radius and multiply by lower, upper factor * * to get automatic minimum and maximum bond distance * *******************************************************/ #define GAMGI_CHEM_BOND_LOWER 0.80 #define GAMGI_CHEM_BOND_UPPER 1.10 /**************************************************** * Hash multipliers: 31 (used by Kernighan), 37 * * (used in the Java library); Hash numbers: prime * * numbers. Source: The Practice of Programming, * * Brian Kernighan, Rob Pike, Addison-Wesley, 1999 * * * * Minimum size and multiplier needed to produce * * lists with a maximum of 3, 2, 1 nodes, for the * * names of all chemical elements until Mt. * * (tested only for multiplier < 10,000) * * * * nodes=3 => size=100 multiplier=15 * * * * nodes=2 => size=127 multiplier=37 * * * * nodes=1 => size=430 multiplier=21 * ****************************************************/ #define GAMGI_CHEM_HASH_MULTIPLIER 37 #define GAMGI_CHEM_HASH_SIZE 127 /************************************************* * -ATOM_MIN should be equal to the smallest * * atomic radius defined, usually the hydrogen * * atom radius. * * * * -BOND_SIZE should be <= ATOM_SIZE: * * 1: bond cylinders have exactly the ATOM_MIN * * radius. BOND_SIZE should be smaller than * * ATOM_SIZE, to guarantee that bond cylinders * * are never large than atom spheres. * * * * cylinder radius = BOND_SIZE x ATOM_MIN * * * * -ATOM_SIZE should be >= BOND_SIZE: * * 1: atom spheres have exactly the atomic * radius, if ATOM_VARIANCY is equal to 1, or * ATOM_MIN if ATOM_VARIANCY is equal to 0. * Increasing ATOM_SIZE, atom spheres become * larger. * * * * -ATOM_VARIANCY should be in the range [0, 1]: * * 0: all atom spheres have the same radius, * * ATOM_MIN multiplied by ATOM_SIZE; * * 1: atom spheres have the atomic radius * * multiplied by ATOM_SIZE. Any ATOM_VARIANCY * * value between 0 and 1 can be safely used, but * * the atom spheres radius will no longer become * * equal to atomic radius or ATOM_MIN, for * * ATOM_SIZE = 1. * * * * sphere radius = ATOM_SIZE x [ATOM_VARIANCY * * x radius + (1 - ATOM_VARIANCY) x ATOM_MIN] * * * * The sphere radius are equal to the atom * * radius only when ATOM_SIZE and ATOM_VARIANCY * * are both equal to 1.0. * *************************************************/ #define GAMGI_CHEM_ATOM_VARIANCY 0.0 #define GAMGI_CHEM_ATOM_SIZE 0.8 #define GAMGI_CHEM_BOND_SIZE 0.5 /**************************************************** * Atom temperature (X-Ray Debye-Waller factor), * * measured in Angstrom squared (A**2): 0 < T < 100 * * Generally, T < 30 signifies confidence in its * * position, while T > 60 signifies disorder. * ****************************************************/ #define GAMGI_CHEM_ATOM_TEMPERATURE_MIN 0.0 #define GAMGI_CHEM_ATOM_TEMPERATURE_MAX 100.0 #define GAMGI_CHEM_ATOM_TEMPERATURE GAMGI_CHEM_ATOM_TEMPERATURE_MIN /*********************** * default atom origin * ***********************/ #define GAMGI_CHEM_ATOM_X 0.0 #define GAMGI_CHEM_ATOM_Y 0.0 #define GAMGI_CHEM_ATOM_Z 0.0 /********************************************************************** * Symmetry operations where differences between initial and * * transformed structures are higher than GAMGI_CHEM_SYMMETRY_INITIAL * * are immediately rejected. The others are optimized until the * * fitting is lower than GAMGI_CHEM_SYMMETRY_FINAL or rejected * * if that proves impossible. Making GAMGI_CHEM_SYMMETRY_INITIAL * * equal to GAMGI_CHEM_SYMMETRY_FINAL disables optimization. * **********************************************************************/ #define GAMGI_CHEM_SYMMETRY_TOLERANCE_INITIAL 1.0E-2 #define GAMGI_CHEM_SYMMETRY_TOLERANCE_FINAL 1.0E-3 /****************************************************************** * Default thickness used to build polygon planes from 3 atoms * * and line directions from 2 atoms. The thickness to link atoms * * to atomic planes and lines cannot be smaller than these values * ******************************************************************/ #define GAMGI_CHEM_PLANE_THICKNESS 1.0E-2 #define GAMGI_CHEM_DIRECTION_THICKNESS 1.0E-2 /************************************************************************ * get default radius from: * * 0 - half bond distance; 1 - atomic effective; 2 - atomic calculated; * * 3 - covalent effective; 4 - covalent calculated; 5 - van der Waals. * ************************************************************************/ #define GAMGI_CHEM_RADIUS_DEFAULT 0 /************************************************* * Size of mass, atomic radius, ionic radius, * * color arrays defined in gamgi_chem_property.c * *************************************************/ #define GAMGI_CHEM_MASS_ARRAY 1255 #define GAMGI_CHEM_RADIUS_ARRAY 671 #define GAMGI_CHEM_IONIC_ARRAY 493 #define GAMGI_CHEM_IONIC_DRIVER_ARRAY 937 #define GAMGI_CHEM_COLOR_ARRAY 489 /************************************************ * labels used in mass and ionic radius drivers * ************************************************/ #define GAMGI_CHEM_MASS_YEAR 1000 #define GAMGI_CHEM_MASS_DAY 2000 #define GAMGI_CHEM_MASS_HOUR 3000 #define GAMGI_CHEM_MASS_MINUTE 4000 #define GAMGI_CHEM_MASS_SECOND 5000 #define GAMGI_CHEM_IONIC_D -10 #define GAMGI_CHEM_IONIC_LS -20 #define GAMGI_CHEM_IONIC_HS -30 #define GAMGI_CHEM_IONIC_COORDINATION 1000 /*********************************************** * tolerances used in polytope code: * * width: minimum width for cells box * * * * length: minimum length to build directions * * area: minimum area to build planes * * volume: minimum volume to build polyhedrons * * * * visible: minimum value for visible faces * * coplanar: maximum range for coplanar faces * ***********************************************/ #define GAMGI_CHEM_POLYTOPE_WIDTH 1.0E-1 #define GAMGI_CHEM_POLYTOPE_LENGTH 1.0E-2 #define GAMGI_CHEM_POLYTOPE_AREA 1.0E-2 #define GAMGI_CHEM_POLYTOPE_VOLUME 1.0E-2 #define GAMGI_CHEM_POLYTOPE_VISIBLE 1.0E-10 #define GAMGI_CHEM_POLYTOPE_COPLANAR 1.0E-02 #define GAMGI_CHEM_POLYTOPE_VISIBLE_MAX 1.0E-05 #define GAMGI_CHEM_POLYTOPE_COPLANAR_MAX 1.0E-01 /************************* * Bohr first radius * * default atomic charge * *************************/ #define GAMGI_CHEM_A0 0.52917720858 #define GAMGI_CHEM_ORBITAL_CHARGE 1.0 /************************************************** * used to calculate optimum radius in H orbitals * **************************************************/ #define GAMGI_CHEM_ORBITAL_R_SHIFT 2.0 #define GAMGI_CHEM_ORBITAL_R_MAX 50.0 #define GAMGI_CHEM_ORBITAL_R_STEP 0.01 /************************************* * tested against H orbital (6,5,-5) * *************************************/ #define GAMGI_CHEM_ORBITAL_T_STEP 0.04 #define GAMGI_CHEM_ORBITAL_P_STEP 0.04 /************************************************************* * used to build wired H orbitals: default density, * * default number of points per n (main quantum number), * * number of acceptable bad points (below density threshold) * *************************************************************/ #define GAMGI_CHEM_ORBITAL_DENSITY 1.0E-6 #define GAMGI_CHEM_ORBITAL_POINTS 50000 #define GAMGI_CHEM_ORBITAL_BAD 1000 /************************************************************** * used to build solid H orbitals: default number of slices * * per octant, maximum number of slices per octant, initial * * size and increment for points arrays (should be a multiple * of 3 (points per triangle) x 8 (bits per byte) = 24 * **************************************************************/ #define GAMGI_CHEM_ORBITAL_SLICES 50 #define GAMGI_CHEM_ORBITAL_SLICES_MAX 255 #define GAMGI_CHEM_ORBITAL_SEGMENT 120 /*************************************** * default orbital origin, orientation * ***************************************/ #define GAMGI_CHEM_ORBITAL_X 0.0 #define GAMGI_CHEM_ORBITAL_Y 0.0 #define GAMGI_CHEM_ORBITAL_Z 0.0 #define GAMGI_CHEM_ORBITAL_E1 0.0 #define GAMGI_CHEM_ORBITAL_E2 0.0 #define GAMGI_CHEM_ORBITAL_E3 0.0 /********************************************** * default parameters for graphene structures * **********************************************/ #define GAMGI_CHEM_GRAPHENE_RINGS 10 #define GAMGI_CHEM_GRAPHENE_RINGS_IN 0 #define GAMGI_CHEM_GRAPHENE_RINGS_OUT 10 #define GAMGI_CHEM_GRAPHENE_ANGLE 60 #define GAMGI_CHEM_GRAPHENE_ELEMENT_A GAMGI_CHEM_C #define GAMGI_CHEM_GRAPHENE_ELEMENT_B GAMGI_CHEM_C #endif gamgi-0.17.5/src/chem/gamgi_chem_atom.c000066400000000000000000000474341433127522700176610ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/chem/gamgi_chem_atom.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_math.h" #include "gamgi_chem.h" #include "gamgi_global.h" #include "gamgi_engine_create.h" #include "gamgi_engine_start.h" #include "gamgi_engine_remove.h" #include "gamgi_engine_reparent.h" #include "gamgi_math_hash.h" #include "gamgi_chem_property.h" #include "gamgi_phys_plane.h" #include "gamgi_phys_direction.h" #include "gamgi_mesa_start.h" #include "gamgi_io_token.h" #include "gamgi_expat_export.h" static void static_row (GtkListStore *store, char *label0, char *label1, char *label2, char *label3) { GtkTreeIter iter; gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, label0, 1, label1, 2, label2, 3, label3, -1); } /************** external function ************** * * * GAMGI_CHEM_ATOM_NAME * * * * Get the element name from the atomic number * ***********************************************/ void gamgi_chem_atom_name (int number, char *name) { static char *element[] = {"Du", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg"}; /************************************** * For speed reasons, this function * * does NOT check if number is valid: * * 0 <= number <= GAMGI_CHEM_ATOM_MAX * * In the few cases where this is * * unsafe, number MUST be checked * * BEFORE calling this function! * **************************************/ strcpy (name, element[number]); } /************* external function *************** * * * GAMGI_CHEM_CREATE_ATOM_NUMBER * * * * Get the atomic number from the element name * ***********************************************/ gamgi_bool gamgi_chem_atom_number (const char *name, int *number) { char element[GAMGI_ENGINE_TOKEN]; gamgi_slist *slist; unsigned int hash; hash = gamgi_math_hash_value (name, GAMGI_CHEM_HASH_MULTIPLIER, GAMGI_CHEM_HASH_SIZE); for (slist = gamgi->element[hash]; slist != NULL; slist = slist->next) { *number = GAMGI_POINTER_TO_INT (slist->data); gamgi_chem_atom_name (*number, element); if (strcmp (element, name) == 0) return TRUE; } return FALSE; } gamgi_atom *gamgi_chem_atom_create (int element) { gamgi_atom *atom; atom = gamgi_engine_create_atom (); gamgi_engine_start_atom (atom); gamgi_mesa_start_atom (atom, gamgi->atom); atom->element = element; gamgi_chem_atom_name (atom->element, atom->object.name); gamgi_io_token_lower (atom->object.name, atom->object.label); atom->mass = gamgi->atom->mass[atom->element]; atom->radius = gamgi->atom->radius[atom->element]; atom->red = gamgi->atom->red[atom->element]; atom->green = gamgi->atom->green[atom->element]; atom->blue = gamgi->atom->blue[atom->element]; return atom; } gamgi_slist **gamgi_chem_atom_element (void) { gamgi_slist **table; unsigned int hash; char name[GAMGI_ENGINE_TOKEN]; int element; /********************************* * create hash table to speed up * * atom element name recognition * *********************************/ table = gamgi_math_hash_create (GAMGI_CHEM_HASH_SIZE); for (element = 0; element <= GAMGI_CHEM_ATOM_MAX; element++) { gamgi_chem_atom_name (element, name); hash = gamgi_math_hash_value (name, GAMGI_CHEM_HASH_MULTIPLIER, GAMGI_CHEM_HASH_SIZE); table[hash] = gamgi_math_hash_add (table[hash], GAMGI_INT_TO_POINTER (element)); } return table; } /********* external function ********* * * * GAMGI_CHEM_ATOM_MASS * * * * Set default mass for each element * *************************************/ void gamgi_chem_atom_mass (gamgi_atom_class *atom_class) { double *mass = atom_class->mass; int offset, element; /****************************************** * set default mass for Dummy atoms (Z=0) * * * * set default mass for all elements * ******************************************/ mass[GAMGI_CHEM_DU] = GAMGI_CHEM_DU_MASS; for (element = 1; element <= GAMGI_CHEM_ATOM_MAX; element++) { offset = gamgi_chem_property_mass_driver[element]; mass[element] = gamgi_chem_property_mass[offset]; } } /********** external function ********** * * * GAMGI_CHEM_ATOM_RADIUS * * * * Set default radius for each element * ***************************************/ void gamgi_chem_atom_radius (gamgi_atom_class *atom_class) { double *radius = atom_class->radius; double value; int offset, element; /******************************************** * set default radius for Dummy atoms (Z=0) * * * * set default radius for all elements * ********************************************/ radius[GAMGI_CHEM_DU] = GAMGI_CHEM_DU_RADIUS; for (element = 1; element <= GAMGI_CHEM_ATOM_MAX; element++) { /********************************************** * when no default radius is defined, use the * * default radius of the closer element below * **********************************************/ offset = element - 1; do { /*************************************************************** * use the type of radius defined by GAMGI_CHEM_RADIUS_DEFAULT * * as default (initially these are the natural half-bond * * distances, available up to Cf (98), except Pm, At, Rn, Fr) * ***************************************************************/ value = gamgi_chem_property_radius[6*offset-- + GAMGI_CHEM_RADIUS_DEFAULT]; } while (value == 0); radius[element] = value; } } void gamgi_chem_atom_color (gamgi_atom_class *atom_class) { float *red = atom_class->red; float *green = atom_class->green; float *blue = atom_class->blue; int element, offset; /******************************************* * set default color for Dummy atoms (Z=0) * * * * set default color for all elements * *******************************************/ red[GAMGI_CHEM_DU] = GAMGI_CHEM_DU_R; green[GAMGI_CHEM_DU] = GAMGI_CHEM_DU_G; blue[GAMGI_CHEM_DU] = GAMGI_CHEM_DU_B; /************************************** * set all the default element colors * **************************************/ for (element = 1; element <= GAMGI_CHEM_ATOM_MAX; element++) { offset = element - 1; red[element] = gamgi_chem_property_color[3*offset + 0]; green[element] = gamgi_chem_property_color[3*offset + 1]; blue[element] = gamgi_chem_property_color[3*offset + 2]; } } void gamgi_chem_atom_export (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { double mass, radius; float red, green, blue; int element, offset; gamgi_expat_export_atom (window, fp, depth_parent, depth_last, error, GAMGI_CHEM_DU, GAMGI_CHEM_DU_MASS, GAMGI_CHEM_DU_RADIUS, GAMGI_CHEM_DU_R, GAMGI_CHEM_DU_G, GAMGI_CHEM_DU_B); for (element = 1; element <= GAMGI_CHEM_ATOM_MAX; element++) { offset = gamgi_chem_property_mass_driver[element]; mass = gamgi_chem_property_mass[offset]; offset = element - 1; red = gamgi_chem_property_color [3*offset + 0]; green = gamgi_chem_property_color [3*offset + 1]; blue = gamgi_chem_property_color [3*offset + 2]; do { radius = gamgi_chem_property_radius[6*offset-- + GAMGI_CHEM_RADIUS_DEFAULT]; } while (radius == 0); gamgi_expat_export_atom (window, fp, depth_parent, depth_last, error, element, mass, radius, red, green, blue); } } void gamgi_chem_atom_mass_list (GtkListStore *store, int element) { char label0[GAMGI_ENGINE_TOKEN]; char label1[GAMGI_ENGINE_TOKEN]; char label2[GAMGI_ENGINE_TOKEN]; char label3[GAMGI_ENGINE_TOKEN]; double value0, value1, value2, value3; gamgi_bool excited; int start, end; int i; if (element == FALSE) return; /*************************************************** * get first, last valid positions in double array * ***************************************************/ start = gamgi_chem_property_mass_driver[element]; if (element == GAMGI_CHEM_ATOM_MAX) end = GAMGI_CHEM_MASS_ARRAY - 1; else end = gamgi_chem_property_mass_driver[element + 1] - 1; /********************* * show default mass * *********************/ sprintf (label0, "%.*f", gamgi->gamgi->mass, gamgi_chem_property_mass[start]); strcpy (label1, ""); strcpy (label2, ""); strcpy (label3, ""); static_row (store, label0, label1, label2, label3); i = start + 1; do { /***************************************************************** * show mass (label0), isotope number and excited state (label1) * *****************************************************************/ excited = FALSE; value0 = gamgi_chem_property_mass[i]; if (value0 < 0) { value0 = -value0; excited = TRUE; } sprintf (label0, "%.*f", gamgi->gamgi->mass, value0); sprintf (label1, "%d", (int) floor (value0 + 0.5)); if (excited == TRUE) strcat (label1, "*"); /************************************************** * show abundance (label2) and half-time (label3) * **************************************************/ strcpy (label2, ""); strcpy (label3, ""); value1 = gamgi_chem_property_mass[i + 1]; if (i + 2 > end) { sprintf (label2, "%.*f", GAMGI_MATH_DECIMAL_ABUNDANCE, value1); static_row (store, label0, label1, label2, label3); break; } value2 = gamgi_chem_property_mass[i + 2]; if (value2 == GAMGI_CHEM_MASS_YEAR) { sprintf (label3, "%.*E y", GAMGI_MATH_DECIMAL_DECAY, value1); static_row (store, label0, label1, label2, label3); i += 3; continue; } if (value2 == GAMGI_CHEM_MASS_DAY) { sprintf (label3, "%.*E d", GAMGI_MATH_DECIMAL_DECAY, value1); static_row (store, label0, label1, label2, label3); i += 3; continue; } if (value2 == GAMGI_CHEM_MASS_HOUR) { sprintf (label3, "%.*E h", GAMGI_MATH_DECIMAL_DECAY, value1); static_row (store, label0, label1, label2, label3); i += 3; continue; } if (value2 == GAMGI_CHEM_MASS_MINUTE) { sprintf (label3, "%.*E m", GAMGI_MATH_DECIMAL_DECAY, value1); static_row (store, label0, label1, label2, label3); i += 3; continue; } if (value2 == GAMGI_CHEM_MASS_SECOND) { sprintf (label3, "%.*E s", GAMGI_MATH_DECIMAL_DECAY, value1); static_row (store, label0, label1, label2, label3); i += 3; continue; } /********************************************** * i + 3 is guaranteed to exist at this stage * **********************************************/ value3 = gamgi_chem_property_mass[i + 3]; if (value3 == GAMGI_CHEM_MASS_YEAR) { sprintf (label2, "%.*f", GAMGI_MATH_DECIMAL_ABUNDANCE, value1); sprintf (label3, "%.*E y", GAMGI_MATH_DECIMAL_DECAY, value2); static_row (store, label0, label1, label2, label3); i += 4; continue; } if (value3 == GAMGI_CHEM_MASS_DAY) { sprintf (label2, "%.*f", GAMGI_MATH_DECIMAL_ABUNDANCE, value1); sprintf (label3, "%.*E d", GAMGI_MATH_DECIMAL_DECAY, value2); static_row (store, label0, label1, label2, label3); i += 4; continue; } if (value3 == GAMGI_CHEM_MASS_HOUR) { sprintf (label2, "%.*f", GAMGI_MATH_DECIMAL_ABUNDANCE, value1); sprintf (label3, "%.*E h", GAMGI_MATH_DECIMAL_DECAY, value2); static_row (store, label0, label1, label2, label3); i += 4; continue; } if (value3 == GAMGI_CHEM_MASS_MINUTE) { sprintf (label2, "%.*f", GAMGI_MATH_DECIMAL_ABUNDANCE, value1); sprintf (label3, "%.*E m", GAMGI_MATH_DECIMAL_DECAY, value2); static_row (store, label0, label1, label2, label3); i += 4; continue; } if (value3 == GAMGI_CHEM_MASS_SECOND) { sprintf (label2, "%.*f", GAMGI_MATH_DECIMAL_ABUNDANCE, value1); sprintf (label3, "%.*E s", GAMGI_MATH_DECIMAL_DECAY, value2); static_row (store, label0, label1, label2, label3); i += 4; continue; } sprintf (label2, "%.*f", GAMGI_MATH_DECIMAL_ABUNDANCE, value1); static_row (store, label0, label1, label2, label3); i += 2; } while (i < end); } void gamgi_chem_atom_radius_list (GtkListStore *store, int element) { char label0[GAMGI_ENGINE_TOKEN]; char label1[GAMGI_ENGINE_TOKEN]; char label2[GAMGI_ENGINE_TOKEN]; char label3[GAMGI_ENGINE_TOKEN]; double value; if (element == FALSE) return; strcpy (label2, ""); strcpy (label3, ""); /*********************************** * array starts at 0 for element 1 * ***********************************/ element--; value = gamgi_chem_property_radius[6*element + 0]; if (value != 0) { sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Half-Distance"); static_row (store, label0, label1, label2, label3); } value = gamgi_chem_property_radius[6*element + 1]; if (value != 0) { sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Atomic Eff"); static_row (store, label0, label1, label2, label3); } value = gamgi_chem_property_radius[6*element + 2]; if (value != 0) { sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Atomic Cal"); static_row (store, label0, label1, label2, label3); } value = gamgi_chem_property_radius[6*element + 3]; if (value != 0) { sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Eff"); static_row (store, label0, label1, label2, label3); } /************************************************************************** * special cases (the first value is 6 C 0.76 sp3 0.73 sp2 0.69 sp * * stored in the normal covalent calculated 25 Mn 1.39 LS 1.61 HS * * positions, the remaining are stored here 26 Fe 1.32 LS 1.52 HS * * and handled as special cases: 27 Co 1.26 LS 1.50 HS * **************************************************************************/ value = gamgi_chem_property_radius[6*element + 4]; if (element == GAMGI_CHEM_C - 1) { sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Cal sp3"); static_row (store, label0, label1, label2, label3); value = gamgi_chem_property_radius[GAMGI_CHEM_RADIUS_ARRAY - 5]; sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Cal sp2"); static_row (store, label0, label1, label2, label3); value = gamgi_chem_property_radius[GAMGI_CHEM_RADIUS_ARRAY - 4]; sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Cal sp"); static_row (store, label0, label1, label2, label3); } else if (element == GAMGI_CHEM_MN - 1) { sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Cal LS"); static_row (store, label0, label1, label2, label3); value = gamgi_chem_property_radius[GAMGI_CHEM_RADIUS_ARRAY - 3]; sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Cal HS"); static_row (store, label0, label1, label2, label3); } else if (element == GAMGI_CHEM_FE - 1) { sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Cal LS"); static_row (store, label0, label1, label2, label3); value = gamgi_chem_property_radius[GAMGI_CHEM_RADIUS_ARRAY - 2]; sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Cal HS"); static_row (store, label0, label1, label2, label3); } else if (element == GAMGI_CHEM_CO - 1) { sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Cal LS"); static_row (store, label0, label1, label2, label3); value = gamgi_chem_property_radius[GAMGI_CHEM_RADIUS_ARRAY - 1]; sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Cal HS"); static_row (store, label0, label1, label2, label3); } else if (value != 0) { sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Covalent Cal"); static_row (store, label0, label1, label2, label3); } value = gamgi_chem_property_radius[6*element + 5]; if (value != 0) { sprintf (label0, "%.*f ", gamgi->gamgi->length, value); strcpy (label1, "Van der Waals"); static_row (store, label0, label1, label2, label3); } } void gamgi_chem_atom_ionic_list (GtkListStore *store, int element) { char label0[GAMGI_ENGINE_TOKEN]; char label1[GAMGI_ENGINE_TOKEN]; char label2[GAMGI_ENGINE_TOKEN]; char label3[GAMGI_ENGINE_TOKEN]; int i, offset; int end; int value; double radius; if (element == FALSE) return; /********************************************** * get start,end limits for int,double arrays * **********************************************/ i = gamgi_chem_property_ionic_driver[element]; offset = gamgi_chem_property_ionic_driver[i++]; if (offset == -1) return; if (element == GAMGI_CHEM_ATOM_MAX) end = GAMGI_CHEM_IONIC_DRIVER_ARRAY - 1; else end = gamgi_chem_property_ionic_driver[element + 1] - 1; /*************** * get valence * ***************/ value = gamgi_chem_property_ionic_driver[i++]; while (i <= end) { /********************************** * show valence, get coordination * **********************************/ sprintf (label2, "%d", value); value = gamgi_chem_property_ionic_driver[i++]; do { /********************* * show coordination * *********************/ sprintf (label3, "%d", value/GAMGI_CHEM_IONIC_COORDINATION); if (value%GAMGI_CHEM_IONIC_COORDINATION == 1) strcat (label3, " Py"); if (value%GAMGI_CHEM_IONIC_COORDINATION == 2) strcat (label3, " Sq"); /******************************************************* * if next value contains HS for high spin, LS for low * * spin, or D for hydrogen, update and get next value * *******************************************************/ strcpy (label1, "Ionic Eff"); value = gamgi_chem_property_ionic_driver[i++]; if (value == GAMGI_CHEM_IONIC_HS) { strcat (label1, " HS"); value = gamgi_chem_property_ionic_driver[i++]; } else if (value == GAMGI_CHEM_IONIC_LS) { strcat (label1, " LS"); value = gamgi_chem_property_ionic_driver[i++]; } else if (value == GAMGI_CHEM_IONIC_D) { strcat (label1, " D"); value = gamgi_chem_property_ionic_driver[i++]; } /*************************** * get radius and show row * ***************************/ radius = gamgi_chem_property_ionic[offset++]; sprintf (label0, "%.*f", gamgi->gamgi->length, radius); static_row (store, label0, label1, label2, label3); /*********************************** * LS HS sequence: get next value, * * get radius and show row * * * * HS LS sequence: does not exist * ***********************************/ if (value == GAMGI_CHEM_IONIC_HS) { strcpy (label1, "Ionic Eff HS"); value = gamgi_chem_property_ionic_driver[i++]; radius = gamgi_chem_property_ionic[offset++]; sprintf (label0, "%.*f", gamgi->gamgi->length, radius); static_row (store, label0, label1, label2, label3); } } while (value >= GAMGI_CHEM_IONIC_COORDINATION); } } void gamgi_chem_atom_clean (gamgi_atom *atom) { gamgi_bond *bond; gamgi_dlist *dlist; for (dlist = atom->bond_start; dlist != NULL; dlist = dlist->next) { bond = GAMGI_CAST_BOND dlist->data; bond->copy = NULL; } } gamgi-0.17.5/src/chem/gamgi_chem_atom.h000066400000000000000000000022331433127522700176520ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/chem/gamgi_chem_atom.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ void gamgi_chem_atom_name (int element, char *name); gamgi_bool gamgi_chem_atom_number (const char *name, int *number); gamgi_atom *gamgi_chem_atom_create (int element); gamgi_slist **gamgi_chem_atom_element (void); void gamgi_chem_atom_mass (gamgi_atom_class *atom_class); void gamgi_chem_atom_radius (gamgi_atom_class *atom_class); void gamgi_chem_atom_color (gamgi_atom_class *atom_class); void gamgi_chem_atom_export (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); void gamgi_chem_atom_mass_list (GtkListStore *store, int element); void gamgi_chem_atom_radius_list (GtkListStore *store, int element); void gamgi_chem_atom_ionic_list (GtkListStore *store, int element); void gamgi_chem_atom_clean (gamgi_atom *atom); /************* * Rationale * ************* Implemented. ************* * Rationale * *************/ gamgi-0.17.5/src/chem/gamgi_chem_bond.c000066400000000000000000000221241433127522700176300ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/chem/gamgi_chem_bond.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_chem.h" #include "gamgi_math.h" #include "gamgi_global.h" #include "gamgi_engine_create.h" #include "gamgi_engine_start.h" #include "gamgi_engine_list.h" #include "gamgi_engine_dlist.h" #include "gamgi_engine_link.h" #include "gamgi_engine_unlink.h" #include "gamgi_engine_remove.h" #include "gamgi_chem_atom.h" #include "gamgi_math_sort.h" #include "gamgi_expat_export.h" void gamgi_chem_bond_length (gamgi_bond_class *bond_class) { double *min = bond_class->min; double *max = bond_class->max; int i; /*********************************************** * bond limits between elements will be * * ordered according to the sequence * * 1-1, 2-2, 2-1, 3-3, 3-2, 3-1, etc... * * * * For a given pair of elements higher-lower, * * the right index will be given by: * * * * index = higher * (higher + 1)/2 - lower; * * * * For example, min and max limits for 3-2 * * elements can be found in array position 4. * ***********************************************/ i = GAMGI_CHEM_ATOM_MAX * (GAMGI_CHEM_ATOM_MAX + 1)/2; while (i-- > 0) { min[i] = -1.0; max[i] = -1.0; } } /***************** external function ************* * * * GAMGI_CHEM_GET_BOND_RANGE * * * * Get the default minimum and maximum distance * * between two atoms required to form new bonds. * *************************************************/ void gamgi_chem_bond_range (gamgi_bond_class *bond_class, int element1, int element2, double radius1, double radius2, double *min, double *max) { int higher, lower, index; /*********************************************** * bond limits between elements are * * ordered according to the sequence * * 1-1, 2-2, 2-1, 3-3, 3-2, 3-1, etc... * * * * For a given pair of elements higher-lower, * * the right index will be given by: * * * * index = higher * (higher + 1)/2 - lower; * * * * For example, min and max limits for 3-2 * * elements can be found in array position 4. * ***********************************************/ /****************** * stored min,max * ******************/ gamgi_math_sort_int2 (element1, element2, &lower, &higher); index = higher * (higher + 1)/2 - lower; *min = bond_class->min[index]; *max = bond_class->max[index]; if (*min > -GAMGI_MATH_TOLERANCE && *max > -GAMGI_MATH_TOLERANCE) return; /********************** * calculated min,max * **********************/ *min = (radius1 + radius2) * bond_class->lower; *max = (radius1 + radius2) * bond_class->upper; if (radius1 > GAMGI_MATH_TOLERANCE && radius2 > GAMGI_MATH_TOLERANCE) return; /******************* * default min,max * *******************/ *min = -1.0; *max = -1.0; } void gamgi_chem_bond_name (gamgi_bond *bond, char *name) { int element1, element2; char name1[4], name2[4]; /****************************************************** * elements should be sorted to guarantee that the * * bond name contains the highest element name first. * ******************************************************/ gamgi_math_sort_int2 (bond->atom1->element, bond->atom2->element, &element1, &element2); /************************************** * get atom names from atomic numbers * **************************************/ gamgi_chem_atom_name (element1, name1); gamgi_chem_atom_name (element2, name2); /********************************************** * the name of the higher element comes first * **********************************************/ sprintf (name, "%s%s", name2, name1); } gamgi_bond *gamgi_chem_bond_get (gamgi_atom *atom1, gamgi_atom *atom2) { gamgi_dlist *dlist; gamgi_bond *bond; /************************************ * Get bond between atom1 and atom2 * ************************************/ dlist = atom1->bond_start; while (dlist != NULL) { bond = GAMGI_CAST_BOND dlist->data; if (atom2 == bond->atom1 || atom2 == bond->atom2) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_chem_bond_create (gamgi_atom *atom1, gamgi_atom *atom2) { gamgi_bond *bond; bond = gamgi_engine_create_bond (); gamgi_engine_start_bond (bond); gamgi_engine_link_bond_atom (bond, atom1); gamgi_engine_link_bond_atom (bond, atom2); return bond; } void gamgi_chem_bond_copy (gamgi_bond *bond, gamgi_bond *bond_new) { if (strcmp (bond->object.name, "") == 0) gamgi_chem_bond_name (bond_new, bond_new->object.name); else strcpy (bond->object.name, bond_new->object.name); bond_new->order = bond->order; bond_new->covalency = bond->covalency; bond_new->draw = bond->draw; bond_new->object.scale = bond->object.scale; bond_new->size = bond->size; bond_new->color = bond->color; bond_new->red = bond->red; bond_new->green = bond->green; bond_new->blue = bond->blue; } void gamgi_chem_bond_half_clean (gamgi_dlist *atom_start) { gamgi_atom *atom; gamgi_bond *bond; gamgi_dlist *dlist_a, *dlist_b; for (dlist_a = atom_start; dlist_a != NULL; dlist_a = dlist_a->next) { atom = GAMGI_CAST_ATOM dlist_a->data; for (dlist_b = atom->bond_start; dlist_b != NULL; dlist_b = dlist_b->next) { bond = GAMGI_CAST_BOND dlist_b->data; bond->copy = NULL; } } } void gamgi_chem_bond_half_remove (gamgi_object *scope) { gamgi_atom *atom; gamgi_bond *bond; gamgi_dlist *atom_start, *dlist_a, *dlist_b; /*************************************************** * get a list of all atoms in the scope object: * * as only atoms can own bonds, this list gives * * access to all bonds formed by the scope object. * ***************************************************/ atom_start = gamgi_engine_dlist_atom_object (scope, NULL); /***************************************************** * scan the bonds from the atoms: bonds that belong * * entirely to the scope object will be visited * * twice, while half-bonds will be visited only once * * * * initially bond->first must be TRUE for all bonds: * * this is safe as this flag is used to draw bonds * *****************************************************/ for (dlist_a = atom_start; dlist_a != NULL; dlist_a = dlist_a->next) { atom = GAMGI_CAST_ATOM dlist_a->data; dlist_b = atom->bond_start; while (dlist_b != NULL) { bond = GAMGI_CAST_BOND dlist_b->data; dlist_b = dlist_b->next; if (bond->first == TRUE) bond->first = FALSE; else bond->first = TRUE; } } /********************************************** * discard half-bonds, that are not * * entirely inside the scope object * * * * unlinking a bond removes the atom dlist_b * * node, so get the next dlist_b node before! * **********************************************/ for (dlist_a = atom_start; dlist_a != NULL; dlist_a = dlist_a->next) { atom = GAMGI_CAST_ATOM dlist_a->data; dlist_b = atom->bond_start; while (dlist_b != NULL) { bond = GAMGI_CAST_BOND dlist_b->data; dlist_b = dlist_b->next; if (bond->first == FALSE) { gamgi_engine_unlink_bond (bond); gamgi_engine_remove_bond (bond); } } } /************************ * remove list of atoms * ************************/ gamgi_engine_dlist_remove_all (atom_start); } void gamgi_chem_bond_export (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bond_class *bond_class = gamgi->bond; gamgi_atom_class *atom_class = gamgi->atom; double tabulated_min, tabulated_max; double automatic_min, automatic_max; double radius1, radius2; int index, element1, element2; for (element1 = 1; element1 <= GAMGI_CHEM_ATOM_MAX; element1++) { for (element2 = element1; element2 > 0; element2--) { /******************************** * element1 must be >= element2 * ********************************/ index = element1 * (element1 + 1)/2 - element2; tabulated_min = bond_class->min[index]; tabulated_max = bond_class->max[index]; if (tabulated_min < -GAMGI_MATH_TOLERANCE || tabulated_max < -GAMGI_MATH_TOLERANCE) continue; radius1 = atom_class->radius[element1]; radius2 = atom_class->radius[element2]; if (radius1 != 0.0 && radius2 != 0.0) { automatic_min = (radius1 + radius2) * bond_class->lower; automatic_max = (radius1 + radius2) * bond_class->upper; if (fabs (tabulated_min - automatic_min) < GAMGI_MATH_TOLERANCE && fabs (tabulated_max - automatic_max) < GAMGI_MATH_TOLERANCE) continue; } gamgi_expat_export_bond (window, fp, depth_parent, depth_last, error, element1, element2, tabulated_min, tabulated_max); } } } gamgi-0.17.5/src/chem/gamgi_chem_bond.h000066400000000000000000000021441433127522700176350ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/chem/gamgi_chem_bond.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ void gamgi_chem_bond_length (gamgi_bond_class *bond_class); void gamgi_chem_bond_range (gamgi_bond_class *bond_class, int element1, int element2, double radius1, double radius2, double *min, double *max); void gamgi_chem_bond_name (gamgi_bond *bond, char *name); gamgi_bond *gamgi_chem_bond_get (gamgi_atom *atom1, gamgi_atom *atom2); gamgi_bond *gamgi_chem_bond_create (gamgi_atom *atom1, gamgi_atom *atom2); void gamgi_chem_bond_copy (gamgi_bond *bond, gamgi_bond *bond_new); void gamgi_chem_bond_half_clean (gamgi_dlist *atom_start); void gamgi_chem_bond_half_remove (gamgi_object *scope); void gamgi_chem_bond_export (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); /************* * Rationale * ************* Implemented. ************* * Rationale * *************/ gamgi-0.17.5/src/chem/gamgi_chem_bond_create.c000066400000000000000000000210031433127522700211460ustar00rootroot00000000000000/******************************************** * * $GAMGI/src/chem/gamgi_chem_bond_create.c * * Copyright (C) 2000 José Luis Martins * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_mesa.h" #include "gamgi_chem.h" #include "gamgi_math.h" #include "gamgi_global.h" #include "gamgi_engine_remove.h" #include "gamgi_engine_list.h" #include "gamgi_engine_unlink.h" #include "gamgi_gtk_bond_create.h" #include "gamgi_chem_bond.h" #include "gamgi_math_vector.h" #include "gamgi_math_measure.h" gamgi_dlist *gamgi_chem_bond_create_length (gamgi_window *window, gamgi_dlist *dlist_atom, double d1, double d2) { gamgi_dlist *dlist_bond = NULL; gamgi_dlist *dlisti, *dlistj; gamgi_atom *atomi, *atomj; gamgi_bond *bond; double d, min, max; if (d1 < 0 && d2 < 0) { for (dlisti = dlist_atom; dlisti != NULL; dlisti = dlisti->next) { atomi = GAMGI_CAST_ATOM dlisti->data; for (dlistj = dlisti->next; dlistj != NULL; dlistj = dlistj->next) { atomj = GAMGI_CAST_ATOM dlistj->data; if (gamgi_chem_bond_get (atomi, atomj) != NULL) continue; gamgi_math_measure_length_2atom (atomi, atomj, &d); gamgi_chem_bond_range (gamgi->bond, atomi->element, atomj->element, atomi->radius, atomj->radius, &min, &max); if (d < min || d > max) continue; /*************** * create bond * ***************/ bond = gamgi_chem_bond_create (atomi, atomj); /******************** * update bond list * ********************/ dlist_bond = gamgi_engine_dlist_add_start (dlist_bond); dlist_bond->data = GAMGI_CAST_OBJECT bond; } } } else { for (dlisti = dlist_atom; dlisti != NULL; dlisti = dlisti->next) { atomi = GAMGI_CAST_ATOM dlisti->data; for (dlistj = dlisti->next; dlistj != NULL; dlistj = dlistj->next) { atomj = GAMGI_CAST_ATOM dlistj->data; if (gamgi_chem_bond_get (atomi, atomj) != NULL) continue; gamgi_math_measure_length_2atom (atomi, atomj, &d); if (d < d1 || d > d2) continue; /*************** * create bond * ***************/ bond = gamgi_chem_bond_create (atomi, atomj); /******************** * update bond list * ********************/ dlist_bond = gamgi_engine_dlist_add_start (dlist_bond); dlist_bond->data = GAMGI_CAST_OBJECT bond; } } } return dlist_bond; } /***************************************** * Code taken from the subroutine BONDWS * * Carlos Pereira * *****************************************/ gamgi_dlist *gamgi_chem_bond_create_voronoi (gamgi_window *window, gamgi_dlist *dlist_atom) { gamgi_dlist *dlist_bond = NULL; gamgi_dlist *i, *j, *k; gamgi_bond *bond; gamgi_atom *atomi, *atomj, *atomk; double ijij, ikik, jkjk, ikij, ikjk, ijkj; /***************************************** * Zero or one atoms: no bonds to create * *****************************************/ if (dlist_atom == NULL || dlist_atom->next == NULL) return NULL; /********************************* * Two atoms: one bond to create * *********************************/ if (dlist_atom->next->next == NULL) { atomi = GAMGI_CAST_ATOM dlist_atom->data; atomj = GAMGI_CAST_ATOM dlist_atom->next->data; bond = gamgi_chem_bond_create (atomi, atomj); dlist_bond = gamgi_engine_dlist_add_start (dlist_bond); dlist_bond->data = bond; return dlist_bond; } /************************************ * Generate all different triangles * * formed by atoms i, j, k * ************************************/ for (i = dlist_atom; i->next->next != NULL; i = i->next) { atomi = GAMGI_CAST_ATOM i->data; for (j = i->next; j->next != NULL; j = j->next) { atomj = GAMGI_CAST_ATOM j->data; for (k = j->next; k != NULL; k = k->next) { atomk = GAMGI_CAST_ATOM k->data; ijij = (atomi->position[0] - atomj->position[0]) * (atomi->position[0] - atomj->position[0]) + (atomi->position[1] - atomj->position[1]) * (atomi->position[1] - atomj->position[1]) + (atomi->position[2] - atomj->position[2]) * (atomi->position[2] - atomj->position[2]); ikik = (atomi->position[0] - atomk->position[0]) * (atomi->position[0] - atomk->position[0]) + (atomi->position[1] - atomk->position[1]) * (atomi->position[1] - atomk->position[1]) + (atomi->position[2] - atomk->position[2]) * (atomi->position[2] - atomk->position[2]); jkjk = (atomj->position[0] - atomk->position[0]) * (atomj->position[0] - atomk->position[0]) + (atomj->position[1] - atomk->position[1]) * (atomj->position[1] - atomk->position[1]) + (atomj->position[2] - atomk->position[2]) * (atomj->position[2] - atomk->position[2]); ikij = (atomi->position[0] - atomk->position[0]) * (atomi->position[0] - atomj->position[0]) + (atomi->position[1] - atomk->position[1]) * (atomi->position[1] - atomj->position[1]) + (atomi->position[2] - atomk->position[2]) * (atomi->position[2] - atomj->position[2]); ikjk = (atomi->position[0] - atomk->position[0]) * (atomj->position[0] - atomk->position[0]) + (atomi->position[1] - atomk->position[1]) * (atomj->position[1] - atomk->position[1]) + (atomi->position[2] - atomk->position[2]) * (atomj->position[2] - atomk->position[2]); ijkj = (atomi->position[0] - atomj->position[0]) * (atomk->position[0] - atomj->position[0]) + (atomi->position[1] - atomj->position[1]) * (atomk->position[1] - atomj->position[1]) + (atomi->position[2] - atomj->position[2]) * (atomk->position[2] - atomj->position[2]); /******************* * handle j k bond * *******************/ bond = gamgi_chem_bond_get (atomj, atomk); if (bond == NULL && i == dlist_atom) { bond = gamgi_chem_bond_create (atomj, atomk); /* protect previous bonds */ bond->first = FALSE; } if (bond != NULL && bond->first == FALSE && (ikjk > ikik - GAMGI_MATH_TOLERANCE_LENGTH || ijkj > ijij - GAMGI_MATH_TOLERANCE_LENGTH)) { gamgi_engine_unlink_bond (bond); gamgi_engine_remove_bond (bond); } /******************* * handle i k bond * *******************/ bond = gamgi_chem_bond_get (atomi, atomk); if (bond == NULL && i == dlist_atom && j == dlist_atom->next) { /* create bond */ bond = gamgi_chem_bond_create (atomi, atomk); /* protect previous bonds */ bond->first = FALSE; } if (bond != NULL && bond->first == FALSE && (ikij > ijij - GAMGI_MATH_TOLERANCE_LENGTH || ikjk > jkjk - GAMGI_MATH_TOLERANCE_LENGTH)) { gamgi_engine_unlink_bond (bond); gamgi_engine_remove_bond (bond); } /******************* * handle i j bond * *******************/ bond = gamgi_chem_bond_get (atomi, atomj); if (bond == NULL && i == dlist_atom && j == dlist_atom->next && k == dlist_atom->next->next) { bond = gamgi_chem_bond_create (atomi, atomj); /*************************************************** * New bonds are marked FALSE, to distinguish them * * from previous bonds, which are marked TRUE. * ***************************************************/ bond->first = FALSE; } if (bond != NULL && bond->first == FALSE && (ikij > ikik - GAMGI_MATH_TOLERANCE_LENGTH || ijkj > jkjk - GAMGI_MATH_TOLERANCE_LENGTH)) { gamgi_engine_unlink_bond (bond); gamgi_engine_remove_bond (bond); } } } } /****************************************************** * Make a list with the new bonds and mark them TRUE * ******************************************************/ for (i = dlist_atom; i->next != NULL; i = i->next) { atomi = GAMGI_CAST_ATOM i->data; for (j = i->next; j != NULL; j = j->next) { atomj = GAMGI_CAST_ATOM j->data; bond = gamgi_chem_bond_get (atomi, atomj); if (bond != NULL && bond->first == FALSE) { bond->first = TRUE; dlist_bond = gamgi_engine_dlist_add_start (dlist_bond); dlist_bond->data = GAMGI_CAST_OBJECT bond; } } } return dlist_bond; } gamgi-0.17.5/src/chem/gamgi_chem_bond_create.h000066400000000000000000000011751433127522700211630ustar00rootroot00000000000000/******************************************** * * $GAMGI/src/chem/gamgi_chem_bond_create.h * * Copyright (C) 2000 Jose Luis Martins * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ gamgi_dlist *gamgi_chem_bond_create_length (gamgi_window *window, gamgi_dlist *dlist_atom, double d1, double d2); gamgi_dlist *gamgi_chem_bond_create_voronoi (gamgi_window *window, gamgi_dlist *dlist_atom); /************* * Rationale * ************* Implemented, needs cleaning. ************* * Rationale * *************/ gamgi-0.17.5/src/chem/gamgi_chem_geometry.c000066400000000000000000000627721433127522700205560ustar00rootroot00000000000000/****************************************** * * $GAMGI/src/chem/gamgi_chem_geometry.c * * Copyright (C) 2007 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_gtk.h" #include "gamgi_chem.h" #include "gamgi_io.h" #include "gamgi_global.h" #include "gamgi_engine_dlist.h" #include "gamgi_engine_array.h" #include "gamgi_gtk_dialog.h" #include "gamgi_math_hash.h" #include "gamgi_math_measure.h" #include "gamgi_chem_atom.h" #define GAMGI_CHEM_GEOMETRY_SIZE 10 #define GAMGI_CHEM_GEOMETRY_STEP 2 #define GAMGI_CHEM_GEOMETRY_MULTIPLIER 37 typedef struct _gamgi_geometry { gamgi_dlist *dlist; gamgi_layer *layer; gamgi_darray *data; gamgi_iarray *length_array, *angle_array, *torsion_array; gamgi_slist **length_table, **angle_table, **torsion_table; int size, step, multiplier; int n_atoms; } gamgi_geometry; static int static_compare_length (const void *a, const void *b) { int *sequence_a = (int *) a; int *sequence_b = (int *) b; /******************************************************* * elements are swaped if the return value is positive * *******************************************************/ if (sequence_a[0] > sequence_b[0]) return 1; if (sequence_a[0] == sequence_b[0]) { if (sequence_a[1] > sequence_b[1]) return 1; } return -1; } static int static_compare_angle (const void *a, const void *b) { int *sequence_a = (int *) a; int *sequence_b = (int *) b; /******************************************************* * elements are swaped if the return value is positive * *******************************************************/ if (sequence_a[0] > sequence_b[0]) return 1; if (sequence_a[0] == sequence_b[0]) { if (sequence_a[1] > sequence_b[1]) return 1; if (sequence_a[1] == sequence_b[1]) { if (sequence_a[2] > sequence_b[2]) return 1; } } return -1; } static int static_compare_torsion (const void *a, const void *b) { int *sequence_a = (int *) a; int *sequence_b = (int *) b; /******************************************************* * elements are swaped if the return value is positive * *******************************************************/ if (sequence_a[0] > sequence_b[0]) return 1; if (sequence_a[0] == sequence_b[0]) { if (sequence_a[1] > sequence_b[1]) return 1; if (sequence_a[1] == sequence_b[1]) { if (sequence_a[2] > sequence_b[2]) return 1; if (sequence_a[2] == sequence_b[2]) { if (sequence_a[3] > sequence_b[3]) return 1; } } } return -1; } static void static_report_length (gamgi_geometry *geometry, int n, char *token, int *occurrences, int *offset) { char element1[5], element2[5]; int *driver; driver = geometry->length_array->array + 4*n; gamgi_chem_atom_name (driver[0], element1); gamgi_chem_atom_name (driver[1], element2); sprintf (token, "%s-%s", element1, element2); *occurrences = driver[2]; *offset = driver[3]; } static void static_report_angle (gamgi_geometry *geometry, int n, char *token, int *occurrences, int *undefined, int *offset) { char element1[5], element2[5], element3[5]; int *driver; driver = geometry->angle_array->array + 6*n; gamgi_chem_atom_name (driver[0], element1); gamgi_chem_atom_name (driver[1], element2); gamgi_chem_atom_name (driver[2], element3); sprintf (token, "%s-%s-%s", element1, element2, element3); *occurrences = driver[3]; *undefined = driver[4]; *offset = driver[5]; } static void static_report_torsion (gamgi_geometry *geometry, int n, char *token, int *occurrences, int *undefined, int *offset) { char element1[5], element2[5], element3[5], element4[5]; int *driver; driver = geometry->torsion_array->array + 7*n; gamgi_chem_atom_name (driver[0], element1); gamgi_chem_atom_name (driver[1], element2); gamgi_chem_atom_name (driver[2], element3); gamgi_chem_atom_name (driver[3], element4); sprintf (token, "%s-%s-%s-%s", element1, element2, element3, element4); *occurrences = driver[4]; *undefined = driver[5]; *offset = driver[6]; } static void static_data (gamgi_geometry *geometry, int offset, int occurrences, double *min, double *max, double *average, double *deviation) { double *data = geometry->data->array + 4 * offset; /************************************************************************* * taking the absolute value is needed to avoid sqrt negative arguments, * * which can occur when deviation is 0, due to computer lack of precison * *************************************************************************/ *min = data[0]; *max = data[1]; *average = data[2] / occurrences; *deviation = sqrt (fabs (data[3] / occurrences - (*average) * (*average))); } static void static_report (gamgi_geometry *geometry, GtkWidget *text) { GtkTextBuffer *buffer; GtkTextIter iter; char token[GAMGI_ENGINE_TOKEN]; double min, max, average, deviation; int total, occurrences, undefined, valid; int n, offset; /********************* * initialize buffer * *********************/ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)); gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nBond Lengths\n"); qsort (geometry->length_array->array, geometry->length_array->offset, 4 * sizeof (int), static_compare_length); total = geometry->length_array->offset; for (n = 0; n < total; n++) { static_report_length (geometry, n, token, &occurrences, &offset); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_bold", "\n%s\n", token); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Occurrences: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%d\n", occurrences); static_data (geometry, offset, occurrences, &min, &max, &average, &deviation); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->length, min); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->length, max); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->length, average); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->length, deviation); } gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nBond Angles\n"); qsort (geometry->angle_array->array, geometry->angle_array->offset, 6 * sizeof (int), static_compare_angle); total = geometry->angle_array->offset; for (n = 0; n < total; n++) { static_report_angle (geometry, n, token, &occurrences, &undefined, &offset); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_bold", "\n%s\n", token); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Occurrences: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%d\n", occurrences); if (undefined > 0) { gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Undefined: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%d\n", undefined); } valid = occurrences - undefined; if (valid > 0) { static_data (geometry, offset, valid, &min, &max, &average, &deviation); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->angle, min); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->angle, max); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->angle, average); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->angle, deviation); } } gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nBond Torsions\n"); qsort (geometry->torsion_array->array, geometry->torsion_array->offset, 7 * sizeof (int), static_compare_torsion); total = geometry->torsion_array->offset; for (n = 0; n < total; n++) { static_report_torsion (geometry, n, token, &occurrences, &undefined, &offset); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_bold", "\n%s\n", token); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Occurrences: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%d\n", occurrences); if (undefined > 0) { gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Undefined: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%d\n", undefined); } valid = occurrences - undefined; if (valid > 0) { static_data (geometry, offset, valid, &min, &max, &average, &deviation); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->angle, min); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->angle, max); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->angle, average); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%.*f\n", gamgi->gamgi->angle, deviation); } } } static void static_measure_length (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_geometry *geometry) { gamgi_slist **table; gamgi_slist *slist; char label[GAMGI_ENGINE_TOKEN]; double *data; double value[4]; double length; int *driver; int sequence[4]; int offset; unsigned int hash; /****************************************************** * make sure each sequence is counted once, not twice * ******************************************************/ if (atom1->mark < atom2->mark) return; /********************************************************* * order each sequence with increasing atom elements, so * * sequences with the same elements are grouped together * *********************************************************/ if (atom1->element > atom2->element) { sequence[0] = atom2->element; sequence[1] = atom1->element; } else { sequence[0] = atom1->element; sequence[1] = atom2->element; } /******************************************************** * measure bond length and prepare to accumulate data * * to get minimum, maximum, average, standard deviation * ********************************************************/ gamgi_math_measure_length_2atom (atom1, atom2, &length); value[0] = length; value[1] = value[0]; value[2] = value[0]; value[3] = value[0] * value[0]; /******************************* * create label for hash table * *******************************/ sprintf (label, "%d%d", sequence[0], sequence[1]); /*********************************************** * if sequence already exists, accumulate data * ***********************************************/ table = geometry->length_table; hash = gamgi_math_hash_value (label, geometry->multiplier, geometry->size); for (slist = table[hash]; slist != NULL; slist = slist->next) { offset = GAMGI_POINTER_TO_INT (slist->data); driver = geometry->length_array->array + 4 * offset; if (driver[0] == sequence[0] && driver[1] == sequence[1]) { /*************************** * accumulate torsion data * ***************************/ driver[2] += 1; data = geometry->data->array + 4 * driver[3]; if (value[0] < data[0]) data[0] = value[0]; if (value[1] > data[1]) data[1] = value[1]; data[2] += value[2]; data[3] += value[3]; return; } } /*********************************************************** * if sequence does not exist, enter new sequence and data * ***********************************************************/ offset = geometry->length_array->offset; table[hash] = gamgi_math_hash_add (table[hash], GAMGI_INT_TO_POINTER (offset)); sequence[2] = 1; sequence[3] = geometry->data->offset; gamgi_engine_iarray_push (geometry->length_array, sequence); gamgi_engine_darray_push (geometry->data, value); } static void static_measure_angle (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_atom *atom3, gamgi_geometry *geometry) { gamgi_slist **table; gamgi_slist *slist; char label[GAMGI_ENGINE_TOKEN]; double *data; double value[4]; double angle; int *driver; int sequence[6]; int offset, undefined; unsigned int hash; /****************************************************** * make sure each sequence is counted once, not twice * ******************************************************/ if (atom1->mark < atom3->mark) return; /********************************************************* * order each sequence with increasing atom elements, so * * sequences with the same elements are grouped together * *********************************************************/ sequence[1] = atom2->element; if (atom1->element > atom3->element) { sequence[0] = atom3->element; sequence[2] = atom1->element; } else { sequence[0] = atom1->element; sequence[2] = atom3->element; } /******************************************************** * measure bond angle and prepare to accumulate data * * to get minimum, maximum, average, standard deviation * ********************************************************/ undefined = 0; if (gamgi_math_measure_angle_3atom (atom1, atom2, atom3, &angle, geometry->layer) == FALSE) undefined = 1; if (undefined == 0) { value[0] = fabs (angle); value[1] = value[0]; value[2] = value[0]; value[3] = value[0] * value[0]; } else { value[0] = DBL_MAX; value[1] = -DBL_MAX; value[2] = 0; value[3] = 0; } /******************************* * create label for hash table * *******************************/ sprintf (label, "%d%d%d", sequence[0], sequence[1], sequence[2]); /*********************************************** * if sequence already exists, accumulate data * ***********************************************/ table = geometry->angle_table; hash = gamgi_math_hash_value (label, geometry->multiplier, geometry->size); for (slist = table[hash]; slist != NULL; slist = slist->next) { offset = GAMGI_POINTER_TO_INT (slist->data); driver = geometry->angle_array->array + 6 * offset; if (driver[0] == sequence[0] && driver[1] == sequence[1] && driver[2] == sequence[2]) { /************************* * accumulate angle data * *************************/ driver[3] += 1; driver[4] += undefined; data = geometry->data->array + 4 * driver[5]; if (value[0] < data[0]) data[0] = value[0]; if (value[1] > data[1]) data[1] = value[1]; data[2] += value[2]; data[3] += value[3]; return; } } /*********************************************************** * if sequence does not exist, enter new sequence and data * ***********************************************************/ offset = geometry->angle_array->offset; table[hash] = gamgi_math_hash_add (table[hash], GAMGI_INT_TO_POINTER (offset)); sequence[3] = 1; sequence[4] = undefined; sequence[5] = geometry->data->offset; gamgi_engine_iarray_push (geometry->angle_array, sequence); gamgi_engine_darray_push (geometry->data, value); } static void static_measure_torsion (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_atom *atom3, gamgi_atom *atom4, gamgi_geometry *geometry) { gamgi_slist **table; gamgi_slist *slist; char label[GAMGI_ENGINE_TOKEN]; double *data; double value[4]; double angle; int *driver; int sequence[7]; int offset, undefined; unsigned int hash; /****************************************************** * make sure each sequence is counted once, not twice * ******************************************************/ if (atom1->mark < atom4->mark) return; /********************************************************* * order each sequence with increasing atom elements, so * * sequences with the same elements are grouped together * *********************************************************/ if (atom1->element > atom4->element) { sequence[0] = atom4->element; sequence[1] = atom3->element; sequence[2] = atom2->element; sequence[3] = atom1->element; } else { sequence[0] = atom1->element; sequence[3] = atom4->element; if (atom1->element == atom4->element && atom2->element > atom3->element) { sequence[1] = atom3->element; sequence[2] = atom2->element; } else { sequence[1] = atom2->element; sequence[2] = atom3->element; } } /******************************************************** * measure torsion angle and prepare to accumulate data * * to get minimum, maximum, average, standard deviation * ********************************************************/ undefined = 0; if (gamgi_math_measure_angle_4atom (atom1, atom2, atom3, atom4, &angle, geometry->layer) == FALSE) undefined = 1; if (undefined == 0) { value[0] = fabs (angle); value[1] = value[0]; value[2] = value[0]; value[3] = value[0] * value[0]; } else { value[0] = DBL_MAX; value[1] = -DBL_MAX; value[2] = 0; value[3] = 0; } /******************************* * create label for hash table * *******************************/ sprintf (label, "%d%d%d%d", sequence[0], sequence[1], sequence[2], sequence[3]); /*********************************************** * if sequence already exists, accumulate data * ***********************************************/ table = geometry->torsion_table; hash = gamgi_math_hash_value (label, geometry->multiplier, geometry->size); for (slist = table[hash]; slist != NULL; slist = slist->next) { offset = GAMGI_POINTER_TO_INT (slist->data); driver = geometry->torsion_array->array + 7 * offset; if (driver[0] == sequence[0] && driver[1] == sequence[1] && driver[2] == sequence[2] && driver[3] == sequence[3]) { /*************************** * accumulate torsion data * ***************************/ driver[4] += 1; driver[5] += undefined; data = geometry->data->array + 4 * driver[6]; if (value[0] < data[0]) data[0] = value[0]; if (value[1] > data[1]) data[1] = value[1]; data[2] += value[2]; data[3] += value[3]; return; } } /*********************************************************** * if sequence does not exist, enter new sequence and data * ***********************************************************/ offset = geometry->torsion_array->offset; table[hash] = gamgi_math_hash_add (table[hash], GAMGI_INT_TO_POINTER (offset)); sequence[4] = 1; sequence[5] = undefined; sequence[6] = geometry->data->offset; gamgi_engine_iarray_push (geometry->torsion_array, sequence); gamgi_engine_darray_push (geometry->data, value); } static void static_level4 (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_atom *atom3, gamgi_atom *atom4, gamgi_geometry *geometry) { atom4->mark = -atom4->mark; static_measure_torsion (atom1, atom2, atom3, atom4, geometry); atom4->mark = -atom4->mark; } static void static_level3 (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_atom *atom3, gamgi_geometry *geometry) { gamgi_bond *bond; gamgi_dlist *dlist; atom3->mark = -atom3->mark; static_measure_angle (atom1, atom2, atom3, geometry); for (dlist = atom3->bond_start; dlist != NULL; dlist = dlist->next) { bond = GAMGI_CAST_BOND dlist->data; if (bond->atom1->mark > 0) static_level4 (atom1, atom2, atom3, bond->atom1, geometry); if (bond->atom2->mark > 0) static_level4 (atom1, atom2, atom3, bond->atom2, geometry); } atom3->mark = -atom3->mark; } static void static_level2 (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_geometry *geometry) { gamgi_bond *bond; gamgi_dlist *dlist; atom2->mark = -atom2->mark; static_measure_length (atom1, atom2, geometry); for (dlist = atom2->bond_start; dlist != NULL; dlist = dlist->next) { bond = GAMGI_CAST_BOND dlist->data; if (bond->atom1->mark > 0) static_level3 (atom1, atom2, bond->atom1, geometry); if (bond->atom2->mark > 0) static_level3 (atom1, atom2, bond->atom2, geometry); } atom2->mark = -atom2->mark; } static void static_level1 (gamgi_atom *atom1, gamgi_geometry *geometry) { gamgi_bond *bond; gamgi_dlist *dlist; atom1->mark = -atom1->mark; for (dlist = atom1->bond_start; dlist != NULL; dlist = dlist->next) { bond = GAMGI_CAST_BOND dlist->data; if (bond->atom1->mark > 0) static_level2 (atom1, bond->atom1, geometry); if (bond->atom2->mark > 0) static_level2 (atom1, bond->atom2, geometry); } atom1->mark = -atom1->mark; } static void static_geometry (gamgi_geometry *geometry) { gamgi_dlist *dlist; for (dlist = geometry->dlist; dlist != NULL; dlist = dlist->next) { static_level1 (GAMGI_CAST_ATOM dlist->data, geometry); } /******************************* * after collecting data, hash * * tables are no longer needed * *******************************/ gamgi_math_hash_remove (geometry->length_table, geometry->size); gamgi_math_hash_remove (geometry->angle_table, geometry->size); gamgi_math_hash_remove (geometry->torsion_table, geometry->size); /**************************************** * order length, angle, torsion values * * in increasing order of atom elements * ****************************************/ } static gamgi_geometry *static_start (gamgi_object *object, gamgi_layer *layer) { gamgi_geometry *geometry; gamgi_atom *atom; gamgi_dlist *dlist; int n; /***************************************** * allocate main structure and atom list * *****************************************/ dlist = gamgi_engine_dlist_atom_object (object, NULL); if (dlist == NULL) return NULL; geometry = (gamgi_geometry *) malloc (sizeof (gamgi_geometry)); geometry->dlist = dlist; geometry->layer = layer; /***************************************************** * number and count atoms: numbers must be positive, * * non-zero, because later on, atoms already in use * * will be signaled by reversing its number signal * *****************************************************/ n = 0; for (dlist = geometry->dlist; dlist != NULL; dlist = dlist->next) { atom = GAMGI_CAST_ATOM dlist->data; atom->mark = ++n; } geometry->n_atoms = n; /************************************************* * set dynamic arrays and hash tables parameters * *************************************************/ geometry->size = 10 + n / GAMGI_CHEM_GEOMETRY_SIZE; geometry->step = GAMGI_CHEM_GEOMETRY_STEP; geometry->multiplier = GAMGI_CHEM_GEOMETRY_MULTIPLIER; /**************************************** * store 4-coordinate points: minimum, * * maximum, average, standard deviation * ****************************************/ geometry->data = gamgi_engine_darray_create (3 * geometry->size, geometry->step, 4); /********************************************* * store 4-coordinate points: element1, * * element2, array offset, occurrences * * * * create hash table to speed up recognition * * of sequences of element names * *********************************************/ geometry->length_array = gamgi_engine_iarray_create (geometry->size, geometry->step, 4); geometry->length_table = gamgi_math_hash_create (geometry->size); /************************************************** * store 6-coordinate points: element1, element2, * * element3, array offset, occurrences, undefined * * (when at least two atoms are at same position) * * * * create hash table to speed up recognition * * of sequences of element names * **************************************************/ geometry->angle_array = gamgi_engine_iarray_create (geometry->size, geometry->step, 6); geometry->angle_table = gamgi_math_hash_create (geometry->size); /************************************************** * store 7-coordinate points: element1, element2, * element3, element4, array offset, occurrences, * undefined (when the four atoms are colinear) * * * * create hash table to speed up recognition * * of sequences of element names * **************************************************/ geometry->torsion_array = gamgi_engine_iarray_create (geometry->size, geometry->step, 7); geometry->torsion_table = gamgi_math_hash_create (geometry->size); return geometry; } static void static_end (gamgi_geometry *geometry) { /************************ * remove vector arrays * ************************/ gamgi_engine_iarray_remove (geometry->length_array); gamgi_engine_iarray_remove (geometry->angle_array); gamgi_engine_iarray_remove (geometry->torsion_array); gamgi_engine_darray_remove (geometry->data); free (geometry); } gamgi_bool gamgi_chem_geometry (gamgi_object *object, GtkWidget *text, gamgi_layer *layer) { gamgi_geometry *geometry; geometry = static_start (object, layer); if (geometry == NULL) return FALSE; static_geometry (geometry); static_report (geometry, text); static_end (geometry); return TRUE; } gamgi-0.17.5/src/chem/gamgi_chem_geometry.h000066400000000000000000000041761433127522700205550ustar00rootroot00000000000000/****************************************** * * $GAMGI/src/chem/gamgi_chem_geometry.h * * Copyright (C) 2007 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * internal functions * ********************** static int static_compare_length (const void *a, const void *b); static int static_compare_angle (const void *a, const void *b); static int static_compare_torsion (const void *a, const void *b); static void static_report_length (gamgi_geometry *geometry, int n, char *token, int *occurrences, int *offset); static void static_report_angle (gamgi_geometry *geometry, int n, char *token, int *occurrences, int *offset); static void static_report_torsion (gamgi_geometry *geometry, int n, char *token, int *occurrences, int *undefined, int *offset); static void static_data (gamgi_geometry *geometry, int offset, int occurrences, double *min, double *max, double *average, double *deviation); static void static_report (gamgi_geometry *geometry, GtkWidget *text); static void static_measure_length (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_geometry *geometry); static void static_measure_angle (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_atom *atom3, gamgi_geometry *geometry); static void static_measure_torsion (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_atom *atom3, gamgi_atom *atom4, gamgi_geometry *geometry); static void static_level4 (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_atom *atom3, gamgi_atom *atom4, gamgi_geometry *geometry); static void static_level3 (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_atom *atom3, gamgi_geometry *geometry); static void static_level2 (gamgi_atom *atom1, gamgi_atom *atom2, gamgi_geometry *geometry); static void static_level1 (gamgi_atom *atom1, gamgi_geometry *geometry); static void static_measure (gamgi_geometry *geometry); static gamgi_geometry *static_start (gamgi_object *object); static void static_end (gamgi_geometry *geometry); ********************** * external functions * **********************/ gamgi_bool gamgi_chem_geometry (gamgi_object *object, GtkWidget *text, gamgi_layer *layer); gamgi-0.17.5/src/chem/gamgi_chem_graphene.c000066400000000000000000000613601433127522700205040ustar00rootroot00000000000000/************************************************** * * $GAMGI/src/chem/gamgi_chem_graphene.c * * Copyright (C) 2016 Carlos Pereira, Joao Coelho * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_gtk.h" #include "gamgi_math.h" #include "gamgi_chem.h" #include "gamgi_global.h" #include "gamgi_engine_create.h" #include "gamgi_engine_start.h" #include "gamgi_engine_link.h" #include "gamgi_mesa_start.h" #include "gamgi_gtk_history.h" #include "gamgi_gtk_dialog.h" #include "gamgi_chem_atom.h" #include "gamgi_chem_bond.h" #include "gamgi_chem_graphene.h" #include "gamgi_chem_graphene_tube.h" #include "gamgi_io_token.h" #define TOLERANCE_X 0.1 #define TOLERANCE_Z 0.1 static void static_bond (gamgi_atom *atom1, gamgi_atom **driver, int n1, int n2, int i, int j, int type) { gamgi_atom *atom2; gamgi_bond *bond; int number; if (j < 0 || j >= n2) return; if (i < 0 || i >= n1) return; number = gamgi_chem_graphene_index (n1, 0, 0, i, j, type); atom2 = driver[number]; if (atom2 == NULL) return; /*************** * create bond * ***************/ bond = gamgi_chem_bond_create (atom1, atom2); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); } static gamgi_atom *static_atom (gamgi_molecule *molecule, int element, double x, double y, double z) { gamgi_atom *atom; atom = gamgi_chem_atom_create (element); gamgi_engine_link_atom_molecule (atom, molecule); atom->position[0] = x; atom->position[1] = y; atom->position[2] = z; return atom; } static void static_bond_2d (gamgi_atom **driver, int n1, int n2) { gamgi_atom *atom; int i, j, number; /************************************** * build bonds between atoms in the * * graphene sheet that are neighbours * **************************************/ for (j = 0; j < n2; j++) { for (i = 0; i < n1; i++) { /***************************************************** * type = FALSE for atoms A, type = TRUE for atoms B * *****************************************************/ number = gamgi_chem_graphene_index (n1, 0, 0, i, j, FALSE); atom = driver[number]; if (atom == NULL) continue; /*************** * local bonds * ***************/ static_bond (atom, driver, n1, n2, i, j, TRUE); static_bond (atom, driver, n1, n2, i + 1, j, TRUE); static_bond (atom, driver, n1, n2, i, j - 1, TRUE); } } } void static_atom_2d (gamgi_molecule *molecule, gamgi_atom **driver, int n1, int n2, int i, int j, int type, int element, double x, double y) { int number; /************************************** * save pointer to new atom in driver * **************************************/ number = gamgi_chem_graphene_index (n1, 0, 0, i, j, type); driver[number] = static_atom (molecule, element, x, y, 0.0); } static gamgi_atom **static_lattice (gamgi_molecule *molecule, int n1, int n2, int element1, int element2, double bond) { gamgi_atom **driver; double a[2], b[2]; double x, y; int i, j, number; gamgi_chem_graphene_vectors (bond, a, b); /******************************************* * driver array: each cell (i,j) stores * * the id numbers of the two A, B atoms * * in each (i,j) primitive graphene cell * * * * number: max x 2 max x (atom A + atom B) * *******************************************/ number = 2 * n1 * n2; driver = (gamgi_atom **) malloc (sizeof (gamgi_atom *) * number); for (i = 0; i < number; i++) driver[i] = NULL; for (j = 0; j < n2; j++) { for (i = 0; i < n1; i++) { /************************************* * A atoms (type = FALSE): (0, 0, 0) * *************************************/ x = i * a[0] + j * b[0]; y = i * a[1] + j * b[1]; static_atom_2d (molecule, driver, n1, n2, i, j, FALSE, element1, x, y); /***************************************** * B atoms (type = TRUE): (-1/3, 1/3, 0) * *****************************************/ x += -1 / 3.0 * a[0] + 1 / 3.0 * b[0]; y += -1 / 3.0 * a[1] + 1 / 3.0 * b[1]; static_atom_2d (molecule, driver, n1, n2, i, j, TRUE, element2, x, y); } } static_bond_2d (driver, n1, n2); return driver; } void static_1p5p (gamgi_molecule *molecule, gamgi_atom **driver, int max, int j_start, int a, int b, int type, int element1, int element2, double radius, double z_top, double angle_start) { gamgi_atom *atoms[5]; gamgi_atom *atom; gamgi_bond *bond; double x, y, angle; int i, j, k, element, number; /*************************************************** * build atoms and bonds for a (5,0) nanotube cap, * * formed by 1 pentagon linked to 5 pentagons * ***************************************************/ for (i = 0; i < 5; i++) { angle = angle_start + i * 2 * GAMGI_MATH_PI / 5; x = radius * cos (angle); y = radius * sin (angle); element = (i % 2 == 0) ? element1 : element2; atoms[i] = static_atom (molecule, element, x, y, z_top); } j = j_start; for (i = 0; i < 5; i++) { k = (j + 1) % 5; /******************** * create cap bonds * ********************/ bond = gamgi_chem_bond_create (atoms[j], atoms[k]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); /************************* * create tube-cap bonds * *************************/ number = gamgi_chem_graphene_index (2 * max, max, 0, a + i, b, type); atom = driver[number]; if (atom != NULL) { bond = gamgi_chem_bond_create (atoms[j], atom); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); } j = k; } } void static_caps_5_0 (gamgi_molecule *molecule, gamgi_atom **driver, int max, int rings, double perimeter, double height, int element1, int element2, double bond) { double radius, z_top, width; /***************************************************** * build bottom and top caps for (5,0) nanotubes, * * formed by a single pentagon linked to 5 pentagons * *****************************************************/ radius = 0.5 * bond / sin (GAMGI_MATH_PI/5); width = 0.5 * perimeter / GAMGI_MATH_PI - radius; z_top = height / 2 + sqrt (bond * bond - width * width); /************************************ * cap below (to build cap or cage) * ************************************/ static_1p5p (molecule, driver, max, 0, 0, 0, FALSE, element1, element2, radius, -z_top, 0.0); if (rings < 0) return; /***************************** * cap above (to build cage) * *****************************/ if (rings % 2 == 0) static_1p5p (molecule, driver, max, 3, rings / 2, rings, TRUE, element1, element2, radius, z_top, GAMGI_MATH_PI); else static_1p5p (molecule, driver, max, 0, rings / 2, rings, TRUE, element1, element2, radius, z_top, 0.0); } void static_1p5h5ph (gamgi_molecule *molecule, gamgi_atom **driver, int max, int j_start, int a, int b, int element1, int element2, double radius, double z_top, double z_step, double angle_start) { gamgi_atom *atoms[20]; gamgi_atom *atom; gamgi_bond *bond; double x, y, x_new, y_new, angle, angle_new; int i, j, k, element, number; /*************************************************** * build atoms and bonds for a (5,5) nanotube cap, * * formed by 1 pentagon surrounded by 5 hexagons, * * linked to 5 alternating pentagons and hexagons * ***************************************************/ /********* * atoms * *********/ for (i = 0; i < 5; i++) { angle = angle_start + i * 2 * GAMGI_MATH_PI / 5; x = radius * cos (angle); y = radius * sin (angle); element = (i % 2 == 0) ? element1 : element2; atoms[4 * i + 0] = static_atom (molecule, element, x, y, z_top); element = (i % 2 == 1) ? element1 : element2; atoms[4 * i + 1] = static_atom (molecule, element, 2 * x, 2 * y, z_top - z_step); angle_new = angle - 2 * GAMGI_MATH_PI / 5; x_new = 2 * x + radius * cos (angle_new); y_new = 2 * y + radius * sin (angle_new); atoms[4 * i + 2] = static_atom (molecule, element2, x_new, y_new, z_top - 2 * z_step); angle_new = angle + 2 * GAMGI_MATH_PI / 5; x_new = 2 * x + radius * cos (angle_new); y_new = 2 * y + radius * sin (angle_new); atoms[4 * i + 3] = static_atom (molecule, element1, x_new, y_new, z_top - 2 * z_step); } /********* * bonds * *********/ j = j_start; for (i = 0; i < 5; i++) { k = (j + 1) % 5; /******************** * create cap bonds * ********************/ bond = gamgi_chem_bond_create (atoms[4 * j + 0], atoms[4 * k + 0]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 0], atoms[4 * j + 1]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 1], atoms[4 * j + 2]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 1], atoms[4 * j + 3]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 3], atoms[4 * k + 2]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); /************************* * create tube-cap bonds * *************************/ number = gamgi_chem_graphene_index (2 * max, max, 0, a + 2 * i, b + i, FALSE); atom = driver[number]; if (atom != NULL) { bond = gamgi_chem_bond_create (atoms[4 * j + 2], atom); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); } number = gamgi_chem_graphene_index (2 * max, max, 0, a + 2 * i, b + i, TRUE); atom = driver[number]; if (atom != NULL) { bond = gamgi_chem_bond_create (atoms[4 * j + 3], atom); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); } j = k; } } void static_caps_5_5 (gamgi_molecule *molecule, gamgi_atom **driver, int max, int rings, double perimeter, double height, int element1, int element2, double bond) { double radius, z_top, z_step, angle_start; /************************************************** * build bottom and top caps for (5,5) nanotubes, * * formed by 1 pentagon surrounded by 5 hexagons, * * linked to 5 alternating pentagons and hexagons * **************************************************/ radius = 0.5 * bond / sin (GAMGI_MATH_PI/5); angle_start = GAMGI_MATH_PI * bond / perimeter; z_step = bond * sqrt (1 - pow (2 * sin (GAMGI_MATH_PI / 5), -2)); z_top = height / 2 + bond * sqrt(3) / 2 + 2 * z_step; /************************************ * cap below (to build cap or cage) * ************************************/ static_1p5h5ph (molecule, driver, max, 0, 0, 0, element1, element2, radius, -z_top, -z_step, angle_start); if (rings < 0) return; /***************************** * cap above (to build cage) * *****************************/ if (rings % 2 == 0) static_1p5h5ph (molecule, driver, max, 3, 1, rings / 2 + 1, element1, element2, radius, z_top, z_step, angle_start + GAMGI_MATH_PI); else static_1p5h5ph (molecule, driver, max, 0, 0, rings / 2 + 1, element1, element2, radius, z_top, z_step, angle_start); } void static_1h6h6ph_simple (gamgi_molecule *molecule, gamgi_atom **driver, int max, int j_start, int a, int b, int element1, int element2, double radius, double z_top, double z_step, double angle_start) { gamgi_atom *atoms[24]; gamgi_atom *atom; gamgi_bond *bond; double x, y, x_new, y_new, angle, angle_new; int i, j, k, element, number; /*************************************************** * build atoms and bonds for a (6.6) nanotube cap, * * formed by 1 hexagon surrounded by 6 hexagons, * * linked to 6 alternating pentagons and hexagons * ***************************************************/ /********* * atoms * *********/ for (i = 0; i < 6; i++) { angle = angle_start + i * 2 * GAMGI_MATH_PI / 6; x = radius * cos (angle); y = radius * sin (angle); element = (i % 2 == 0) ? element1 : element2; atoms[4 * i + 0] = static_atom (molecule, element, x, y, z_top); element = (i % 2 == 1) ? element1 : element2; atoms[4 * i + 1] = static_atom (molecule, element, 2 * x, 2 * y, z_top - z_step); angle_new = angle - 2 * GAMGI_MATH_PI / 5; x_new = 2 * x + radius * cos (angle_new); y_new = 2 * y + radius * sin (angle_new); atoms[4 * i + 2] = static_atom (molecule, element2, x_new, y_new, z_top - 2 * z_step); angle_new = angle + 2 * GAMGI_MATH_PI / 5; x_new = 2 * x + radius * cos (angle_new); y_new = 2 * y + radius * sin (angle_new); atoms[4 * i + 3] = static_atom (molecule, element1, x_new, y_new, z_top - 2 * z_step); } /********* * bonds * *********/ j = j_start; for (i = 0; i < 6; i++) { k = (j + 1) % 6; /******************** * create cap bonds * ********************/ bond = gamgi_chem_bond_create (atoms[4 * j + 0], atoms[4 * k + 0]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 0], atoms[4 * j + 1]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 1], atoms[4 * j + 2]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 1], atoms[4 * j + 3]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 3], atoms[4 * k + 2]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); /************************* * create tube-cap bonds * *************************/ number = gamgi_chem_graphene_index (2 * max, max, 0, a + 2 * i, b + i, FALSE); atom = driver[number]; if (atom != NULL) { bond = gamgi_chem_bond_create (atoms[4 * j + 2], atom); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); } number = gamgi_chem_graphene_index (2 * max, max, 0, a + 2 * i, b + i, TRUE); atom = driver[number]; if (atom != NULL) { bond = gamgi_chem_bond_create (atoms[4 * j + 3], atom); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); } j = k; } } void static_caps_6_6_simple (gamgi_molecule *molecule, gamgi_atom **driver, int max, int rings, double perimeter, double height, int element1, int element2, double bond) { double radius, z_top, z_step, angle_start; radius = bond; angle_start = GAMGI_MATH_PI * bond / perimeter; z_step = bond * sqrt (1 - pow (2 * sin (GAMGI_MATH_PI / 5), -2)); z_top = height / 2 + bond * sqrt(3) / 2 + 2 * z_step; /************************************ * cap below (to build cap or cage) * ************************************/ static_1h6h6ph_simple (molecule, driver, max, 0, 0, 0, element1, element2, radius, -z_top, -z_step, angle_start); if (rings < 0) return; /***************************** * cap above (to build cage) * *****************************/ if (rings % 2 == 0) static_1h6h6ph_simple (molecule, driver, max, 0, 1, rings / 2 + 1, element1, element2, radius, z_top, z_step, angle_start + GAMGI_MATH_PI / 6); else static_1h6h6ph_simple (molecule, driver, max, 0, 0, rings / 2 + 1, element1, element2, radius, z_top, z_step, angle_start); } void static_1h6h6ph_complex (gamgi_molecule *molecule, gamgi_atom **driver, int max, int j_start, int a, int b, int element1, int element2, double x0, double z0, double x1, double z1, double x2, double y2, double z2, double angle_start) { gamgi_atom *atoms[24]; gamgi_atom *atom; gamgi_bond *bond; double x, y, angle; int i, j, k, element, number; /*************************************************** * build atoms and bonds for a (6.6) nanotube cap, * * formed by 1 hexagon surrounded by 6 hexagons, * * linked to 6 alternating pentagons and hexagons * ***************************************************/ /********* * atoms * *********/ for (i = 0; i < 6; i++) { angle = angle_start + i * 2 * GAMGI_MATH_PI / 6; x = x0 * cos (angle); y = x0 * sin (angle); element = (i % 2 == 0) ? element1 : element2; atoms[4 * i + 0] = static_atom (molecule, element, x, y, z0); x = (x0 + x1) * cos (angle); y = (x0 + x1) * sin (angle); element = (i % 2 == 1) ? element1 : element2; atoms[4 * i + 1] = static_atom (molecule, element, x, y, z0 - z1); x = (x0 + x1 + x2) * cos (angle) + y2 * sin (angle); y = (x0 + x1 + x2) * sin (angle) - y2 * cos (angle); atoms[4 * i + 2] = static_atom (molecule, element2, x, y, z0 - z1 - z2); x = (x0 + x1 + x2) * cos (angle) - y2 * sin (angle); y = (x0 + x1 + x2) * sin (angle) + y2 * cos (angle); atoms[4 * i + 3] = static_atom (molecule, element1, x, y, z0 - z1 - z2); } /********* * bonds * *********/ j = j_start; for (i = 0; i < 6; i++) { k = (j + 1) % 6; /******************** * create cap bonds * ********************/ bond = gamgi_chem_bond_create (atoms[4 * j + 0], atoms[4 * k + 0]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 0], atoms[4 * j + 1]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 1], atoms[4 * j + 2]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 1], atoms[4 * j + 3]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); bond = gamgi_chem_bond_create (atoms[4 * j + 3], atoms[4 * k + 2]); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); /************************* * create tube-cap bonds * *************************/ number = gamgi_chem_graphene_index (2 * max, max, 0, a + 2 * i, b + i, FALSE); atom = driver[number]; if (atom != NULL) { bond = gamgi_chem_bond_create (atoms[4 * j + 2], atom); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); } number = gamgi_chem_graphene_index (2 * max, max, 0, a + 2 * i, b + i, TRUE); atom = driver[number]; if (atom != NULL) { bond = gamgi_chem_bond_create (atoms[4 * j + 3], atom); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); } j = k; } } void static_caps_6_6_complex (gamgi_molecule *molecule, gamgi_atom **driver, int max, int rings, double perimeter, double height, int element1, int element2, double bond) { double x0, z0, x1, z1, x2, y2, z2, z3; double angle_base, angle_shift, angle_start;; angle_start = GAMGI_MATH_PI * bond / perimeter; angle_base = asin (1 / (sqrt (3) * tan (GAMGI_MATH_PI / 5))); angle_shift = atan (sqrt (0.5 * (3 - sqrt (5)))); z3 = 2 * bond * pow (cos (GAMGI_MATH_PI / 5), 2) / sqrt (3); z2 = bond * cos (GAMGI_MATH_PI / 5) / sqrt (3); z1 = bond * sin (angle_base - angle_shift); z0 = height / 2 + z1 + z2 + z3; x2 = bond / (2 * sqrt (3) * cos (GAMGI_MATH_PI / 5)); x1 = bond * cos (angle_base - angle_shift); x0 = bond; y2 = bond * cos (GAMGI_MATH_PI / 5); /************************************ * cap below (to build cap or cage) * ************************************/ static_1h6h6ph_complex (molecule, driver, max, 0, 0, 0, element1, element2, x0, -z0, x1, -z1, x2, y2, -z2, angle_start); if (rings < 0) return; /***************************** * cap above (to build cage) * *****************************/ if (rings % 2 == 0) static_1h6h6ph_complex (molecule, driver, max, 0, 1, rings / 2 + 1, element1, element2, x0, z0, x1, z1, x2, y2, z2, angle_start + GAMGI_MATH_PI / 6); else static_1h6h6ph_complex (molecule, driver, max, 0, 0, rings / 2 + 1, element1, element2, x0, z0, x1, z1, x2, y2, z2, angle_start); } int gamgi_chem_graphene_index (int size_h, int center_h, int center_v, int h, int v, int offset) { /********************************************* * h, v = horizontal, vertical coordinates * * * * each cell has two atoms (offset = 0 or 1) * *********************************************/ return 2 * (size_h * (v + center_v) + h + center_h) + offset; } void gamgi_chem_graphene_vectors (double bond, double *a, double *b) { /**************************** * graphene lattice vectors * ****************************/ a[0] = bond * sqrt (3.0); a[1] = 0.0; b[0] = -0.5 * bond * sqrt (3.0); b[1] = 1.5 * bond; } void gamgi_chem_graphene_hydrogen (gamgi_molecule *molecule) { } void gamgi_chem_graphene_sheet (gamgi_molecule *molecule, int n1, int n2, int rings, int element1, int element2, double bond) { gamgi_atom **driver = NULL; double perimeter, angle, height; int max; /************************************************************************* * build a graphene sheet, as an hexagonal lattice or a rectangular tube * *************************************************************************/ if (rings < 0) { driver = static_lattice (molecule, n1, n2, element1, element2, bond); } else { driver = gamgi_chem_graphene_tube_driver (n1, n2, rings, bond, &max, &perimeter, &angle, &height); gamgi_chem_graphene_tube_2d (molecule, driver, max, n1, n2, perimeter, angle, height, element1, element2, bond); } /*********************** * bond isolated atoms * ***********************/ gamgi_chem_graphene_hydrogen (molecule); free (driver); } void gamgi_chem_graphene_cage (gamgi_molecule *molecule, int mode, int rings, int element1, int element2, double bond) { gamgi_atom **driver = NULL; double perimeter, angle, height; int max; /********************************************************* * build a fullerene cage formed by a tube with two caps * *********************************************************/ switch (mode) { case GAMGI_CHEM_GRAPHENE_CAGE_5_0: driver = gamgi_chem_graphene_tube_driver (5, 0, rings, bond, &max, &perimeter, &angle, &height); gamgi_chem_graphene_tube_3d (molecule, driver, max, 5, 0, perimeter, angle, height, element1, element2, bond); static_caps_5_0 (molecule, driver, max, rings, perimeter, height, element1, element2, bond); break; case GAMGI_CHEM_GRAPHENE_CAGE_5_5: driver = gamgi_chem_graphene_tube_driver (5, 5, rings, bond, &max, &perimeter, &angle, &height); gamgi_chem_graphene_tube_3d (molecule, driver, max, 5, 5, perimeter, angle, height, element1, element2, bond); static_caps_5_5 (molecule, driver, max, rings, perimeter, height, element1, element2, bond); break; case GAMGI_CHEM_GRAPHENE_CAGE_6_6_S: driver = gamgi_chem_graphene_tube_driver (6, 6, rings, bond, &max, &perimeter, &angle, &height); gamgi_chem_graphene_tube_3d (molecule, driver, max, 6, 6, perimeter, angle, height, element1, element2, bond); static_caps_6_6_simple (molecule, driver, max, rings, perimeter, height, element1, element2, bond); break; case GAMGI_CHEM_GRAPHENE_CAGE_6_6_C: driver = gamgi_chem_graphene_tube_driver (6, 6, rings, bond, &max, &perimeter, &angle, &height); gamgi_chem_graphene_tube_3d (molecule, driver, max, 6, 6, perimeter, angle, height, element1, element2, bond); static_caps_6_6_complex (molecule, driver, max, rings, perimeter, height, element1, element2, bond); break; } free (driver); } void gamgi_chem_graphene_cap (gamgi_molecule *molecule, int mode, int element1, int element2, double bond) { gamgi_atom **driver = NULL; double perimeter, angle, height; int max; /************************* * build a fullerene cap * *************************/ switch (mode) { case GAMGI_CHEM_GRAPHENE_CAP_5_0: driver = gamgi_chem_graphene_tube_driver (5, 0, 0, bond, &max, &perimeter, &angle, &height); gamgi_chem_graphene_tube_3d (molecule, driver, max, 5, 0, perimeter, angle, height, element1, element2, bond); static_caps_5_0 (molecule, driver, max, -1, perimeter, height, element1, element2, bond); break; case GAMGI_CHEM_GRAPHENE_CAP_5_5: driver = gamgi_chem_graphene_tube_driver (5, 5, 0, bond, &max, &perimeter, &angle, &height); gamgi_chem_graphene_tube_3d (molecule, driver, max, 5, 5, perimeter, angle, height, element1, element2, bond); static_caps_5_5 (molecule, driver, max, -1, perimeter, height, element1, element2, bond); break; case GAMGI_CHEM_GRAPHENE_CAP_6_6_S: driver = gamgi_chem_graphene_tube_driver (6, 6, 0, bond, &max, &perimeter, &angle, &height); gamgi_chem_graphene_tube_3d (molecule, driver, max, 6, 6, perimeter, angle, height, element1, element2, bond); static_caps_6_6_simple (molecule, driver, max, -1, perimeter, height, element1, element2, bond); break; case GAMGI_CHEM_GRAPHENE_CAP_6_6_C: driver = gamgi_chem_graphene_tube_driver (6, 6, 0, bond, &max, &perimeter, &angle, &height); gamgi_chem_graphene_tube_3d (molecule, driver, max, 6, 6, perimeter, angle, height, element1, element2, bond); static_caps_6_6_complex (molecule, driver, max, -1, perimeter, height, element1, element2, bond); break; } free (driver); } gamgi-0.17.5/src/chem/gamgi_chem_graphene.h000066400000000000000000000021201433127522700204760ustar00rootroot00000000000000/************************************************** * * $GAMGI/src/chem/gamgi_chem_graphene.h * * Copyright (C) 2016 Carlos Pereira, Joao Coelho * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * internal functions * ********************** ********************** * external functions * **********************/ int gamgi_chem_graphene_index (int size_h, int center_h, int center_v, int h, int v, int offset); void gamgi_chem_graphene_vectors (double bond, double *a, double *b); void gamgi_chem_graphene_hydrogen (gamgi_molecule *molecule); void gamgi_chem_graphene_sheet (gamgi_molecule *molecule, int n1, int n2, int rings, int element1, int element2, double bond); void gamgi_chem_graphene_cage (gamgi_molecule *molecule, int mode, int rings, int element1, int element2, double bond); void gamgi_chem_graphene_cap (gamgi_molecule *molecule, int mode, int element1, int element2, double bond); /************* * Rationale * ************* Implemented, needs cleaning. ************* * Rationale * *************/ gamgi-0.17.5/src/chem/gamgi_chem_graphene_cone.c000066400000000000000000000764521433127522700215200ustar00rootroot00000000000000/************************************************** * * $GAMGI/src/chem/gamgi_chem_graphene_cone.c * * Copyright (C) 2016 Carlos Pereira, Joao Coelho * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_gtk.h" #include "gamgi_math.h" #include "gamgi_chem.h" #include "gamgi_global.h" #include "gamgi_engine_create.h" #include "gamgi_engine_start.h" #include "gamgi_engine_link.h" #include "gamgi_mesa_start.h" #include "gamgi_gtk_history.h" #include "gamgi_gtk_dialog.h" #include "gamgi_math_vector.h" #include "gamgi_chem_atom.h" #include "gamgi_chem_bond.h" #include "gamgi_chem_graphene.h" #include "gamgi_io_token.h" #define TOLERANCE_R 0.1 #define TOLERANCE_T 0.2 typedef int (* atom_function) (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); typedef void (* bond_function) (gamgi_atom **driver, int max); static double static_circle (double bond, int rings) { double h, v; h = 0; if (rings > 0) h = (rings - 1) * bond * cos (GAMGI_MATH_PI / 6.0); v = 0; if (rings > 0) v = bond / 2.0 + bond * sin (GAMGI_MATH_PI / 6.0) + (rings - 1) * (bond + bond * sin (GAMGI_MATH_PI / 6.0)); return sqrt (h * h + v * v); } static double static_cone (double r_out, double disclination) { return (2 * GAMGI_MATH_PI - disclination) * r_out / (2 * GAMGI_MATH_PI); } static int static_index (int i, int j, int max) { return 2 * (2 * max * (j + max) + i + max); } static int static_arc_origin (double x, double y, double r_in, double r_out, double disclination, double *x_new, double *y_new, double *z_new) { double r_cone, f, height; double d, angle; /******************************************************* * convert angles from 0-360 degrees to 0-2 PI radians * *******************************************************/ disclination *= GAMGI_MATH_DEG_RAD; /******************************** * remove inner and outer atoms * ********************************/ d = sqrt (x * x + y * y); if (d < r_in || d > r_out) return FALSE; /************************************ * calculate cone radius and height * ************************************/ r_cone = static_cone (r_out, disclination); f = r_cone / r_out; if (f > 1.0) f = 1.0; height = r_out * sqrt (1 - f * f); /*************************** * 1 ring, single rotation * ***************************/ angle = acos (x / d); if (y < 0) angle = 2 * GAMGI_MATH_PI - angle; if (angle > disclination) { angle = 2 * GAMGI_MATH_PI * (1 - (2 * GAMGI_MATH_PI - angle) / (2 * GAMGI_MATH_PI - disclination)); *x_new = d * f * cos (angle); *y_new = d * f * sin (angle); *z_new = height * (1.0 - d * f / r_cone) - height / 2; return TRUE; } return FALSE; } static int static_arc (double x, double y, double o_x, double o_y, double c_x, double c_y, double r_in, double r_out, double disclination, double bisector, double min, double max, int negative, int positive, int side, double *x_new, double *y_new, double *z_new) { double x_c, y_c, d_c; double angle, a0, a1; double d, t0, t1; double r_cone, f, height; /******************************************************* * convert angles from 0-360 degrees to 0-2 PI radians * *******************************************************/ disclination *= GAMGI_MATH_DEG_RAD; bisector *= GAMGI_MATH_DEG_RAD; min *= GAMGI_MATH_DEG_RAD; max *= GAMGI_MATH_DEG_RAD; /************************ * change global origin * ************************/ x += o_x; y += o_y; /******************************** * remove inner and outer atoms * ********************************/ d = sqrt (x * x + y * y); if (d < r_in || d > r_out) return -1; /************************************ * calculate cone radius and height * ************************************/ r_cone = static_cone (r_out, disclination); f = r_cone / r_out; if (f > 1.0) f = 1.0; height = r_out * sqrt (1 - f * f); /********************* * set default atoms * *********************/ *x_new = f * x; *y_new = f * y; *z_new = height * (1.0 - d * f / r_cone) - height / 2; /****************************************** * get cartesian and cylindrical new atom * * coordinates, from the rotation center * ******************************************/ x_c = x - c_x; y_c = y - c_y; d_c = sqrt (x_c * x_c + y_c * y_c); angle = acos (x_c / d_c); if (y_c < 0) angle = 2 * GAMGI_MATH_PI - angle; /***************************************** * remove atoms in negative, positive or * * both arcs from bisector to min angles * *****************************************/ a0 = bisector - min; a1 = bisector + min; t0 = d_c * sin (angle - a0); t1 = d_c * sin (angle - a1); if (t0 > side * TOLERANCE_T && t1 < side * TOLERANCE_T) return -1; /******************************************************** * remove but do not rotate atoms: useful for debugging * ********************************************************/ if (positive == FALSE && negative == FALSE) return 0; if (min == max) return 0; if (positive == TRUE && negative == FALSE) { bisector -= min; min *= 2; } if (positive == FALSE && negative == TRUE) { bisector += min; min *= 2; } /*************************************************************** * convert angle to local values: [-max to +max], bisector = 0 * ***************************************************************/ angle = angle - bisector; if (positive == TRUE && negative == TRUE) { if (angle > GAMGI_MATH_PI) angle -= 2 * GAMGI_MATH_PI; if (angle < -GAMGI_MATH_PI) angle += 2 * GAMGI_MATH_PI; } /******************************************** * return atom if outside the rotation zone * ********************************************/ if (fabs (angle) < min / 2) return 0; if (fabs (angle) > max) return 0; if (negative == FALSE && angle < 0) return 0; if (positive == FALSE && angle > 0) return 0; /******************************************* * scale angle from [max, min] to [max, 0] * *******************************************/ if (angle < 0) {min = -min; max = -max; } angle -= min * (max - angle)/ (max - min); /*************************************************** * convert angle back to absolute values: [0, 360[ * ***************************************************/ angle += bisector; if (angle < 0) angle += 2 * GAMGI_MATH_PI; /*********************************************** * rotate atom with new angle to close arc gap * ***********************************************/ *x_new = f * d_c * cos (angle) + f * c_x; *y_new = f * d_c * sin (angle) + f * c_y; return 1; } static void static_bond (gamgi_atom *atom1, gamgi_atom **driver, int max, int i, int j, int type) { gamgi_atom *atom2; gamgi_bond *bond; int number; if (i < -max || i >= max) return; if (j < -max || j >= max) return; number = static_index (i, j, max) + type; atom2 = driver[number]; if (atom2 == NULL) return; /*************** * create bond * ***************/ bond = gamgi_chem_bond_create (atom1, atom2); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); } static int static_update (int index, int update, int type) { if (abs (update) == 1) index += update; if (abs (update) == 2 && type == FALSE) index += update / 2; if (abs (update) == 3 && type == TRUE) index += update / 3; return index; } static void static_link (gamgi_atom **driver, int max, int i0, int j0, int k0, int i1, int j1, int k1, int ii0, int jj0, int kk0, int ii1, int jj1, int kk1) { gamgi_atom *atom; int number; while (i0 < max - 1 && j0 < max - 1 && i0 > -max && j0 > -max) { /***************** * update atom 0 * *****************/ i0 = static_update (i0, ii0, k0); j0 = static_update (j0, jj0, k0); k0 = abs (kk0 - k0); /***************** * update atom 1 * *****************/ i1 = static_update (i1, ii1, k1); j1 = static_update (j1, jj1, k1); k1 = abs (kk1 - k1); /******************************************************* * create bond between atoms (i0,j0,k0) and (i1,j1,k1) * *******************************************************/ number = static_index (i0, j0, max) + k0; if (number >= 0 && number < 8 * max * max) { atom = driver[number]; if (atom != NULL) static_bond (atom, driver, max, i1, j1, k1); } } } static int static_atom_0 (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { double number; /************************************* * remove inner and outer atoms only * *************************************/ number = static_arc (x, y, 0, 0, 0, 0, r_in, r_out, 0, 0, 0, 0, FALSE, FALSE, +1, x_new, y_new, z_new); if (number < 0) return FALSE; return TRUE; } static int static_atom_60_d (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { int number; /*************************** * 1 ring, single rotation * ***************************/ number = static_arc (x, y, 0, 0, 0, 0, r_in, r_out, 60, 0, 30, 180, TRUE, TRUE, +1, x_new, y_new, z_new); if (number < 0) return FALSE; return TRUE; } static void static_bond_60_d (gamgi_atom **driver, int max) { /************************* * build bonds for arc 1 * *************************/ static_link (driver, max, -1, 0, 0, -1, 0, 0, 2, -2, 1, 1, 3, 1); } static int static_atom_60_o (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { return static_arc_origin (x, y, r_in, r_out, 60, x_new, y_new, z_new); } static void static_bond_60_o (gamgi_atom **driver, int max) { /************************* * build bonds for arc 1 * *************************/ static_link (driver, max, -1, -1, 1, -1, -1, 1, 1, 0, 0, 1, 1, 0); } static int static_atom_120_e (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { int number; /******************************* * 2 rings, connected by edges * *******************************/ number = static_arc (x, y, a[0]/2, 0, 0, b[1], r_in, r_out, 120, 90, 30, 90, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0, 0, -b[1], r_in, r_out, 120, 270, 30, 90, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; return TRUE; } static void static_bond_120_e (gamgi_atom **driver, int max) { /**************************** * build bonds for arcs 1,2 * ****************************/ static_link (driver, max, -1, 0, 0, -1, 0, 0, 1, 1, 0, 0, 1, 0); static_link (driver, max, -1, -1, 1, -1, -1, 1, -1, -1, 0, 0, -1, 0); } static int static_atom_120_h (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { int number; /********************************** * 2 rings, connected by hexagons * **********************************/ number = static_arc (x, y, 0, 0, a[0]+b[0], a[1]+b[1], r_in, r_out, 120, 60, 30, 90, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, 0, 0, -a[0]-b[0], -a[1]-b[1], r_in, r_out, 120, 240, 30, 90, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; return TRUE; } static void static_bond_120_h (gamgi_atom **driver, int max) { /**************************** * build bonds for arcs 1,2 * ****************************/ static_link (driver, max, 0, 0, 1, 0, 0, 1, 1, 3, 1, 2, 1, 1); static_link (driver, max, -1, -1, 0, -1, -1, 0, -1, -2, 1, -3, -1, 1); } static int static_atom_120_s (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { int number; /**************************** * 2 rings, single rotation * ****************************/ number = static_arc (x, y, 0, 0, a[0]+b[0], a[1]+b[1], r_in, r_out, 120, 30, 30, 180, FALSE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, 0, 0, -a[0]-b[0], -a[1]-b[1], r_in, r_out, 120, 210, 30, 180, FALSE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; return TRUE; } static void static_bond_120_s (gamgi_atom **driver, int max) { /**************************** * build bonds for arcs 1,2 * ****************************/ static_link (driver, max, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0); static_link (driver, max, -1, -1, 0, -1, -1, 0, -1, 0, 0, -1, -1, 0); } static int static_atom_120_o (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { return static_arc_origin (x, y, r_in, r_out, 120, x_new, y_new, z_new); } static void static_bond_120_o (gamgi_atom **driver, int max) { /************************* * build bonds for arc 1 * *************************/ static_link (driver, max, -1, -1, 1, -1, -1, 0, 1, 0, 0, 0, 1, 0); } static int static_atom_180_d (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { int number; /**************************** * 3 rings, double rotation * ****************************/ number = static_arc (x, y, 0, 0, a[0]+b[0], a[1]+b[1], r_in, r_out, 180, 60, 30, 60, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, 0, 0, -a[0], -a[1], r_in, r_out, 180, 180, 30, 60, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, 0, 0, -b[0], -b[1], r_in, r_out, 180, 300, 30, 60, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; return TRUE; } static void static_bond_180_d (gamgi_atom **driver, int max) { /****************************** * build bonds for arcs 1,2,3 * ******************************/ static_link (driver, max, 0, 0, 1, 0, 0, 1, 1, 3, 1, 2, 1, 1); static_link (driver, max, -1, -1, 1, -1, -1, 1, -3, 3, 1, -1, -2, 1); static_link (driver, max, 0, -1, 1, 0, -1, 1, -3, -1, 1, 2, -2, 1); } static int static_atom_180_s (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { int number; /*************************************** * 3 rings, single rotation (bonds=no) * ***************************************/ number = static_arc (x, y, 0, 0, a[0]+b[0], a[1]+b[1], r_in, r_out, 180, 30, 30, 120, FALSE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, 0, 0, -a[0], -a[1], r_in, r_out, 180, 150, 30, 120, FALSE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, 0, 0, -b[0], -b[1], r_in, r_out, 180, 270, 30, 120, FALSE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; return TRUE; } static void static_bond_180_s (gamgi_atom **driver, int max) { /****************************** * build bonds for arcs 1,2,3 * ******************************/ static_link (driver, max, -1, -1, 1, -1, -1, 1, 0, 1, 0, -1, 0, 0); static_link (driver, max, 0, -1, 1, 0, -1, 1, -1, -1, 0, 0, -1, 0); static_link (driver, max, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0); } static int static_atom_180_o (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { return static_arc_origin (x, y, r_in, r_out, 180, x_new, y_new, z_new); } static void static_bond_180_o (gamgi_atom **driver, int max) { /************************* * build bonds for arc 1 * *************************/ static_link (driver, max, -1, -1, 1, 0, -1, 1, 1, 0, 0, -1, 0, 0); } static int static_atom_240_e (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { int number; /**************************** * 4 rings, edges connected * ****************************/ number = static_arc (x, y, a[0]/2, 0, 3 * a[0]/2, 0, r_in, r_out, 240, 0, 30, 45, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0, 0, b[1], r_in, r_out, 240, 90, 30, 45, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0, -3 * a[0]/2, 0, r_in, r_out, 240, 180, 30, 45, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0, 0, -b[1], r_in, r_out, 240, 270, 30, 45, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; return TRUE; } static void static_bond_240_e (gamgi_atom **driver, int max) { /********************************* * build bonds for arcs 1,2,3,4 * *********************************/ static_link (driver, max, -1, 0, 0, -1, 0, 0, 1, 1, 0, 0, 1, 0); static_link (driver, max, -1, -1, 1, -1, -1, 1, -1, -1, 0, 0, -1, 0); static_link (driver, max, 0, 0, 0, 0, 0, 0, 2, -2, 1, 1, 3, 1); static_link (driver, max, -2, -1, 1, -2, -1, 1, -3, 3, 1, -1, -2, 1); } static int static_atom_240_h (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { int number; /******************************* * 4 rings, hexagons connected * *******************************/ number = static_arc (x, y, a[0]/2, 0.0, +a[0], +b[1], r_in, r_out, 240, 60, 30, 45, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0.0, -a[0], +b[1], r_in, r_out, 240, 150, 30, 45, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0.0, -a[0], -b[1], r_in, r_out, 240, 240, 30, 45, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0.0, +a[0], -b[1], r_in, r_out, 240, 330, 30, 45, TRUE, TRUE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; return TRUE; } static void static_bond_240_h (gamgi_atom **driver, int max) { /********************************* * build bonds for arcs 1,2,3,4 * *********************************/ static_link (driver, max, 0, 0, 1, 0, 0, 1, 1, 3, 1, 2, 1, 1); static_link (driver, max, -1, 0, 1, -1, 0, 1, 0, 1, 0, -1, 0, 0); static_link (driver, max, -2, -1, 0, -2, -1, 0, -1, -2, 1, -3, -1, 1); static_link (driver, max, -1, -1, 0, -1, -1, 0, 1, 0, 0, 0, -1, 0); } static int static_atom_240_p (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { int number; /*************************** * 4 rings, planes aligned * ***************************/ number = static_arc (x, y, a[0]/2, 0.0, +a[0], +b[1], r_in, r_out, 240, 60, 30, 90, TRUE, FALSE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0.0, -a[0], +b[1], r_in, r_out, 240, 120, 30, 90, FALSE, TRUE, -1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0.0, -a[0], -b[1], r_in, r_out, 240, 240, 30, 90, TRUE, FALSE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0.0, +a[0], -b[1], r_in, r_out, 240, 300, 30, 90, FALSE, TRUE, -1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; return TRUE; } static void static_bond_240_p (gamgi_atom **driver, int max) { /********************************* * build bonds for arcs 1,2,3,4 * *********************************/ static_link (driver, max, 0, 0, 1, 0, 0, 1, 1, 3, 1, 2, 1, 1); static_link (driver, max, -1, 0, 1, -1, 0, 1, 2, 1, 1, -3, 3, 1); static_link (driver, max, -2, -1, 0, -2, -1, 0, -1, -2, 1, -3, -1, 1); static_link (driver, max, -1, -1, 0, -1, -1, 0, -3, -1, 1, 2, -2, 1); } static int static_atom_240_a (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { int number; /************************* * 4 rings, axes aligned * *************************/ number = static_arc (x, y, a[0]/2, 0.0, +a[0], +b[1], r_in, r_out, 240, 60, 30, 90, TRUE, FALSE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0.0, -a[0], +b[1], r_in, r_out, 240, 150, 30, 90, TRUE, FALSE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0.0, -a[0], -b[1], r_in, r_out, 240, 240, 30, 90, TRUE, FALSE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; number = static_arc (x, y, a[0]/2, 0.0, +a[0], -b[1], r_in, r_out, 240, 330, 30, 90, TRUE, FALSE, +1, x_new, y_new, z_new); if (number > 0) return TRUE; if (number < 0) return FALSE; return TRUE; } static void static_bond_240_a (gamgi_atom **driver, int max) { /******************************** * build bonds for arcs 1,2,3,4 * ********************************/ static_link (driver, max, 0, 0, 1, 0, 0, 1, 1, 3, 1, 2, 1, 1); static_link (driver, max, -1, 0, 1, -1, 0, 1, 0, 1, 0, -1, 0, 0); static_link (driver, max, -2, -1, 0, -2, -1, 0, -1, -2, 1, -3, -1, 1); static_link (driver, max, -1, -1, 0, -1, -1, 0, 0, -1, 0, 1, 0, 0); } static int static_atom_240_o (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { return static_arc_origin (x, y, r_in, r_out, 240, x_new, y_new, z_new); } static void static_bond_240_o (gamgi_atom **driver, int max) { /************************* * build bonds for arc 1 * *************************/ static_link (driver, max, -1, -1, 1, 0, 0, 0, 1, 0, 0, -1, -1, 0); } static int static_atom_300_e (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { double d, angle, min, max; int number; /**************************** * 5 rings, edges connected * ****************************/ number = static_arc (x, y, 0, 0, 0, 0, r_in, r_out, 300, 0, 30, 45, FALSE, FALSE, +1, x_new, y_new, z_new); if (number == 0) number = static_arc (x, y, 0, 0, 0, 2 * b[1], r_in, r_out, 300, 60, 30, 75, FALSE, TRUE, -1, x_new, y_new, z_new); if (number == 0) number = static_arc (x, y, 0, 0, -a[0] + b[0], b[1], r_in, r_out, 300, 150, 30, 75, TRUE, FALSE, +1, x_new, y_new, z_new); if (number == 0) number = static_arc (x, y, 0, 0, -a[0] + b[0], -b[1], r_in, r_out, 300, 210, 30, 75, FALSE, TRUE, -1, x_new, y_new, z_new); if (number == 0) number = static_arc (x, y, 0, 0, 0, -2 * b[1], r_in, r_out, 300, 300, 30, 75, TRUE, FALSE, +1, x_new, y_new, z_new); if (number >= 0) { d = sqrt ((*x_new) * (*x_new) + (*y_new) * (*y_new)); angle = acos (*x_new / d); if (*y_new < 0) angle = 2 * GAMGI_MATH_PI - angle; min = 30 * GAMGI_MATH_DEG_RAD; max = 180 * GAMGI_MATH_DEG_RAD; if (angle < 0) {min = -min; max = -max; } angle -= min * (max - angle)/ (max - min); *x_new = d * cos (angle); *y_new = d * sin (angle); return TRUE; } return FALSE; } static void static_bond_300_e (gamgi_atom **driver, int max) { /********************************** * build bonds for arcs 1,2,3,4,5 * **********************************/ static_link (driver, max, 0, 1, 0, 0, 1, 0, 1, 3, 1, 2, 1, 1); static_link (driver, max, -1, 0, 1, -1, 0, 1, 0, 1, 0, -1, 0, 0); static_link (driver, max, -2, -1, 0, -2, -1, 0, -1, 0, 0, -1, -1, 0); static_link (driver, max, -1, -2, 1, -1, -2, 1, -3, -1, 1, 2, -2, 1); static_link (driver, max, -1, 0, 0, -1, 0, 0, 2, -2, 1, 1, 3, 1); } static int static_atom_300_o (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new) { return static_arc_origin (x, y, r_in, r_out, 300, x_new, y_new, z_new); } static void static_bond_300_o (gamgi_atom **driver, int max) { /************************* * build bonds for arc 1 * *************************/ static_link (driver, max, 0, -1, 1, 0, -1, 1, 1, 0, 0, 0, -1, 0); } static void static_atom (gamgi_molecule *molecule, gamgi_atom **driver, int max, int i, int j, double *a, double *b, double r_in, double r_out, int element, double x, double y, int type, atom_function function) { gamgi_atom *atom; double x_new, y_new, z_new; int number; /************************************* * remove atoms in arcs and replace * * with atoms rotated around centers * *************************************/ if (function != NULL && (*function) (a, b, r_in, r_out, x, y, &x_new, &y_new, &z_new) == TRUE) { /************ * add atom * ************/ atom = gamgi_chem_atom_create (element); gamgi_engine_link_atom_molecule (atom, molecule); atom->position[0] = x_new; atom->position[1] = y_new; atom->position[2] = z_new; number = static_index (i, j, max) + type; driver[number] = atom; } } static void static_cone_3d (gamgi_molecule *molecule, atom_function atom_model, bond_function bond_model, int element1, int element2, double bond, int rings_in, int rings_out) { gamgi_atom *atom; gamgi_atom **driver; double a[2], b[2]; double r_in, r_out, x, y; int i, j, max, number; /**************************** * graphene lattice vectors * ****************************/ gamgi_chem_graphene_vectors (bond, a, b); /******************************************************* inner radius, outer radius, cone radius, cone height * *******************************************************/ r_in = static_circle (bond, rings_in) + TOLERANCE_R; r_out = static_circle (bond, rings_out) + TOLERANCE_R; /********************************************* * scanning region: a hexagonal losango with * * [-max,max] x [-max, max] cells, covering * * completely a circle with radius r_out * *********************************************/ max = 1 + (r_out * 1.2) / a[0]; /************************************************** * bond driver: 2 max x 2 max x (atom A + atom B) * **************************************************/ number = 8 * max * max; driver = (gamgi_atom **) malloc (sizeof (gamgi_atom *) * number); for (i = 0; i < number; i++) driver[i] = NULL; /*************** * build atoms * ***************/ for (j = -max; j < max; j++) { for (i = -max; i < max; i++) { /***************************************** * A atoms (type = FALSE): (2/3, 1/3, 0) * *****************************************/ x = (i + 2/3.0) * a[0] + (j + 1/3.0) * b[0]; y = (i + 2/3.0) * a[1] + (j + 1/3.0) * b[1]; static_atom (molecule, driver, max, i, j, a, b, r_in, r_out, element1, x, y, FALSE, atom_model); /**************************************** * B atoms (type = TRUE): (1/3, 2/3, 0) * ****************************************/ x = (i + 1/3.0) * a[0] + (j + 2/3.0) * b[0]; y = (i + 1/3.0) * a[1] + (j + 2/3.0) * b[1]; static_atom (molecule, driver, max, i, j, a, b, r_in, r_out, element2, x, y, TRUE, atom_model); } } /**************************************************************************** * build graphene bonds (type = FALSE for atoms A, type = TRUE for atoms B) * ****************************************************************************/ for (j = -max; j < max; j++) { for (i = -max; i < max; i++) { number = static_index (i, j, max) + FALSE; atom = driver[number]; if (atom == 0) continue; static_bond (atom, driver, max, i, j, TRUE); static_bond (atom, driver, max, i + 1, j, TRUE); static_bond (atom, driver, max, i, j - 1, TRUE); } } /******************** * build cone bonds * ********************/ if (bond_model != NULL) (* bond_model) (driver, max); free (driver); } static void static_optimize (gamgi_molecule *molecule, double bond_length) { gamgi_atom *central, *neighbour; gamgi_bond *bond; gamgi_dlist *dlist_a, *dlist_b; double vector[3]; double length, weight = 0.1; int i, iterations = 10; return; for (i = 0; i < iterations; i++) { for (dlist_a = molecule->atom_start; dlist_a != NULL; dlist_a = dlist_a->next) { central = GAMGI_CAST_ATOM dlist_a->data; for (dlist_b = central->bond_start; dlist_b != NULL; dlist_b = dlist_b->next) { bond = GAMGI_CAST_BOND dlist_b->data; if (bond->atom1 == central) neighbour = bond->atom2; else neighbour = bond->atom1; gamgi_math_vector_sub (neighbour->position, central->position, vector); length = gamgi_math_vector_length (vector); gamgi_math_vector_scale (vector, vector, weight * (length - bond_length) / length); gamgi_math_vector_add (central->position, vector, central->position); } } } } static atom_function *static_atom_router (void) { atom_function *router; router = (atom_function *) malloc (sizeof (atom_function) * GAMGI_CHEM_CONE_300_O); router[GAMGI_CHEM_CONE_0] = static_atom_0; router[GAMGI_CHEM_CONE_60_D] = static_atom_60_d; router[GAMGI_CHEM_CONE_60_O] = static_atom_60_o; router[GAMGI_CHEM_CONE_120_E] = static_atom_120_e; router[GAMGI_CHEM_CONE_120_H] = static_atom_120_h; router[GAMGI_CHEM_CONE_120_S] = static_atom_120_s; router[GAMGI_CHEM_CONE_120_O] = static_atom_120_o; router[GAMGI_CHEM_CONE_180_D] = static_atom_180_d; router[GAMGI_CHEM_CONE_180_S] = static_atom_180_s; router[GAMGI_CHEM_CONE_180_O] = static_atom_180_o; router[GAMGI_CHEM_CONE_240_E] = static_atom_240_e; router[GAMGI_CHEM_CONE_240_H] = static_atom_240_h; router[GAMGI_CHEM_CONE_240_P] = static_atom_240_p; router[GAMGI_CHEM_CONE_240_A] = static_atom_240_a; router[GAMGI_CHEM_CONE_240_O] = static_atom_240_o; router[GAMGI_CHEM_CONE_300_E] = static_atom_300_e; router[GAMGI_CHEM_CONE_300_O] = static_atom_300_o; return router; } static bond_function *static_bond_router (void) { bond_function *router; router = (bond_function *) malloc (sizeof (bond_function) * GAMGI_CHEM_CONE_300_O); router[GAMGI_CHEM_CONE_0] = NULL; router[GAMGI_CHEM_CONE_60_D] = static_bond_60_d; router[GAMGI_CHEM_CONE_60_O] = static_bond_60_o; router[GAMGI_CHEM_CONE_120_E] = static_bond_120_e; router[GAMGI_CHEM_CONE_120_H] = static_bond_120_h; router[GAMGI_CHEM_CONE_120_S] = static_bond_120_s; router[GAMGI_CHEM_CONE_120_O] = static_bond_120_o; router[GAMGI_CHEM_CONE_180_D] = static_bond_180_d; router[GAMGI_CHEM_CONE_180_S] = static_bond_180_s; router[GAMGI_CHEM_CONE_180_O] = static_bond_180_o; router[GAMGI_CHEM_CONE_240_E] = static_bond_240_e; router[GAMGI_CHEM_CONE_240_H] = static_bond_240_h; router[GAMGI_CHEM_CONE_240_P] = static_bond_240_p; router[GAMGI_CHEM_CONE_240_A] = static_bond_240_a; router[GAMGI_CHEM_CONE_240_O] = static_bond_240_o; router[GAMGI_CHEM_CONE_300_E] = static_bond_300_e; router[GAMGI_CHEM_CONE_300_O] = static_bond_300_o; return router; } void gamgi_chem_graphene_cone (gamgi_molecule *molecule, int mode, int rings_in, int rings_out, int element1, int element2, double bond) { atom_function *atom_router; bond_function *bond_router; atom_function atom_model; bond_function bond_model; /****************************************** * build routers to point to the selected * * model to handle atoms and bonds * * * * get model to handle atoms and bonds * * * * apply selected model * * * * optimize structure * ******************************************/ atom_router = static_atom_router (); bond_router = static_bond_router (); atom_model = atom_router[mode]; bond_model = bond_router[mode]; static_cone_3d (molecule, atom_model, bond_model, element1, element2, bond, rings_in, rings_out); static_optimize (molecule, bond); /******************** * free router data * ********************/ free (atom_router); free (bond_router); } gamgi-0.17.5/src/chem/gamgi_chem_graphene_cone.h000066400000000000000000000127671433127522700215240ustar00rootroot00000000000000/************************************************** * * $GAMGI/src/chem/gamgi_chem_graphene_cone.h * * Copyright (C) 2016 Carlos Pereira, Joao Coelho * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * internal functions * ********************** static double static_circle (double bond, int rings); static double static_cone (double r_out, double disclination); static int static_index (int i, int j, int max); static int static_arc_origin (double x, double y, double r_in, double r_out, double disclination, double *x_new, double *y_new, double *z_new); static int static_arc (double x, double y, double o_x, double o_y, double c_x, double c_y, double r_in, double r_out, double disclination, double bisector, double min, double max, int negative, int positive, int side, double *x_new, double *y_new, double *z_new); static void static_bond (gamgi_atom *atom1, gamgi_atom **driver, int max, int i, int j, int type); static int static_update (int index, int update, int type); static void static_link (gamgi_atom **driver, int max, int i0, int j0, int k0, int i1, int j1, int k1, int ii0, int jj0, int kk0, int ii1, int jj1, int kk1); static int static_atom_0 (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static int static_atom_60_d (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_60_d (gamgi_atom **driver, int max); static int static_atom_60_o (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_60_o (gamgi_atom **driver, int max); static int static_atom_120_e (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_120_e (gamgi_atom **driver, int max); static int static_atom_120_h (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_120_h (gamgi_atom **driver, int max); static int static_atom_120_s (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_120_s (gamgi_atom **driver, int max); static int static_atom_120_o (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_120_o (gamgi_atom **driver, int max); static int static_atom_180_d (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_180_d (gamgi_atom **driver, int max); static int static_atom_180_s (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_180_s (gamgi_atom **driver, int max); static int static_atom_180_o (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_180_o (gamgi_atom **driver, int max); static int static_atom_240_e (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_240_e (gamgi_atom **driver, int max); static int static_atom_240_h (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_240_h (gamgi_atom **driver, int max); static int static_atom_240_p (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_240_p (gamgi_atom **driver, int max); static int static_atom_240_a (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_240_a (gamgi_atom **driver, int max); static int static_atom_240_o (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_240_o (gamgi_atom **driver, int max); static int static_atom_300_e (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_300_e (gamgi_atom **driver, int max); static int static_atom_300_o (double *a, double *b, double r_in, double r_out, double x, double y, double *x_new, double *y_new, double *z_new); static void static_bond_300_o (gamgi_atom **driver, int max); static void static_atom (gamgi_molecule *molecule, gamgi_atom **driver, int max, int i, int j, double *a, double *b, double r_in, double r_out, int element, double x, double y, int type, atom_function function); static void static_cone_3d (gamgi_molecule *molecule, atom_function atom_model, bond_function bond_model, int element1, int element2, double bond, int rings_in, int rings_out); static void static_optimize (gamgi_molecule *molecule, double bond_length); static atom_function *static_atom_router (void); static bond_function *static_bond_router (void); ********************** * external functions * **********************/ void gamgi_chem_graphene_cone (gamgi_molecule *molecule, int mode, int rings_in, int rings_out, int element1, int element2, double bond); /************* * Rationale * ************* Under development, last update: August 2016. ************* * Rationale * *************/ gamgi-0.17.5/src/chem/gamgi_chem_graphene_tube.c000066400000000000000000000326361433127522700215270ustar00rootroot00000000000000/************************************************** * * $GAMGI/src/chem/gamgi_chem_graphene_tube.c * * Copyright (C) 2016 Carlos Pereira, Joao Coelho * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_gtk.h" #include "gamgi_math.h" #include "gamgi_chem.h" #include "gamgi_global.h" #include "gamgi_engine_create.h" #include "gamgi_engine_start.h" #include "gamgi_engine_link.h" #include "gamgi_mesa_start.h" #include "gamgi_gtk_history.h" #include "gamgi_gtk_dialog.h" #include "gamgi_chem_atom.h" #include "gamgi_chem_bond.h" #include "gamgi_chem_graphene.h" #include "gamgi_io_token.h" #define TOLERANCE_X 0.1 #define TOLERANCE_Z 0.1 static void static_vectors (double *a, double *b, double angle, double *a_rotated, double *b_rotated) { /************************************ * rotated graphene lattice vectors * ************************************/ a_rotated[0] = cos (angle) * a[0] - sin (angle) * a[1]; a_rotated[1] = sin (angle) * a[0] + cos (angle) * a[1]; b_rotated[0] = cos (angle) * b[0] - sin (angle) * b[1]; b_rotated[1] = sin (angle) * b[0] + cos (angle) * b[1]; } static double static_height (double bond, int rings, int n1, int n2, double angle) { /*********************************************************** * armchair (angle = 30): * * h = 2 * rings * bond * sin (PI / 3.0) * * * * zigzag (angle = 0): * * h = (1 + rings) * bond * sin (PI / 6.0) + rings * bond * ***********************************************************/ return bond * sin (GAMGI_MATH_PI / 6.0 - angle) + rings * bond * sin (GAMGI_MATH_PI / 2.0 + angle) + rings * bond * sin (GAMGI_MATH_PI / 6.0 + angle); } static int static_inside (double perimeter, double height, double x, double z) { if (x < -TOLERANCE_X || x > perimeter + TOLERANCE_X) return FALSE; if (z < -TOLERANCE_Z || z > height + TOLERANCE_Z) return FALSE; return TRUE; } static void static_fold (gamgi_atom *atom, double perimeter, double x, double z) { double radius, angle; radius = perimeter / (2 * GAMGI_MATH_PI); angle = x / radius; atom->position[0] = radius * cos (angle); atom->position[1] = radius * sin (angle); atom->position[2] = z; } static void static_bond (gamgi_atom *atom1, gamgi_atom **driver, int max, int i, int j, int type) { gamgi_atom *atom2; gamgi_bond *bond; int number; if (j < 0 || j >= max) return; if (i < -max || i >= max) return; number = gamgi_chem_graphene_index (2 * max, max, 0, i, j, type); atom2 = driver[number]; if (atom2 == NULL) return; /*************** * create bond * ***************/ bond = gamgi_chem_bond_create (atom1, atom2); gamgi_chem_bond_name (bond, bond->object.name); gamgi_mesa_start_bond (bond, gamgi->bond); } static void static_atom_2d (gamgi_molecule *molecule, gamgi_atom **driver, int max, int i, int j, int type, int n1, int n2, double perimeter, double height, int element, double x, double y) { gamgi_atom *atom; int number; /***************************************************** * ignore atoms not inside the rectangle +T x height * *****************************************************/ if (static_inside (perimeter, height, x, y) == FALSE) return; /*************** * create atom * ***************/ atom = gamgi_chem_atom_create (element); gamgi_engine_link_atom_molecule (atom, molecule); atom->position[0] = x - perimeter / 2; atom->position[1] = y - height / 2; atom->position[2] = 0.0; number = gamgi_chem_graphene_index (2 * max, max, 0, i, j, type); driver[number] = atom; } static void static_atom_3d (gamgi_molecule *molecule, gamgi_atom **driver, int max, int i, int j, int type, int n1, int n2, double perimeter, double height, int element, double x, double z) { gamgi_atom *atom; int i_pbc, j_pbc, pbc, number; /***************************************************** * ignore atoms not inside the rectangle +T x height * *****************************************************/ if (static_inside (perimeter, height, x, z) == FALSE) return; /***************************************************** * ignore atoms related with periodic boundary atoms * * with -T vector, so boundary atoms (that would be * * superimposed after folding) are not created twice * * * * with +T vector is not needed because atoms are * * generated in increasing order, from -max to + max * *****************************************************/ i_pbc = i - n1 - n2; j_pbc = j - n2; pbc = TRUE; if (j_pbc < 0 || i_pbc >= max) pbc = FALSE; if (i_pbc < -max || i_pbc >= max) pbc = FALSE; if (pbc == TRUE) { number = gamgi_chem_graphene_index (2 * max, max, 0, i_pbc, j_pbc, type); if (driver[number] == NULL) pbc = FALSE; } /*************** * create atom * ***************/ if (pbc == FALSE) { atom = gamgi_chem_atom_create (element); gamgi_engine_link_atom_molecule (atom, molecule); static_fold (atom, perimeter, x, z - height / 2); number = gamgi_chem_graphene_index (2 * max, max, 0, i, j, type); driver[number] = atom; } } static void static_bond_2d (gamgi_atom **driver, int max, int n1, int n2) { gamgi_atom *atom; int i, j, number; /************************************** * build bonds between atoms in the * * graphene sheet that are neighbours * **************************************/ for (j = 0; j < max; j++) { for (i = -max; i < max; i++) { /***************************************************** * type = FALSE for atoms A, type = TRUE for atoms B * *****************************************************/ number = gamgi_chem_graphene_index (2 * max, max, 0, i, j, FALSE); atom = driver[number]; if (atom == NULL) continue; /*************** * local bonds * ***************/ static_bond (atom, driver, max, i, j, TRUE); static_bond (atom, driver, max, i - 1, j, TRUE); static_bond (atom, driver, max, i - 1, j - 1, TRUE); } } } static void static_bond_3d (gamgi_atom **driver, int max, int n1, int n2) { gamgi_atom *atom; int i, j, number; /*********************************************** * build bonds between atoms that become * * neighbours after folding the graphene sheet * ***********************************************/ for (j = 0; j < max; j++) { for (i = -max; i < max; i++) { /***************************************************** * type = FALSE for atoms A, type = TRUE for atoms B * *****************************************************/ number = gamgi_chem_graphene_index (2 * max, max, 0, i, j, FALSE); atom = driver[number]; if (atom == NULL) continue; /************************************** * periodic boundary bonds: -T vector * **************************************/ static_bond (atom, driver, max, i - n1 - n2, j - n2, TRUE); static_bond (atom, driver, max, i - 1 - n1 - n2, j - n2, TRUE); static_bond (atom, driver, max, i - 1 - n1 - n2, j - 1- n2, TRUE); /************************************** * periodic boundary bonds: +T vector * **************************************/ static_bond (atom, driver, max, i + n1 + n2, j + n2, TRUE); static_bond (atom, driver, max, i - 1 + n1 + n2, j + n2, TRUE); static_bond (atom, driver, max, i - 1 + n1 + n2, j - 1+ n2, TRUE); } } } gamgi_atom **gamgi_chem_graphene_tube_driver (int n1, int n2, int rings, double bond, int *max, double *perimeter, double *angle, double *height) { gamgi_atom **driver; double a[2], b[2], t[2]; double radius, p, h; int m, number, i; /********************* * make sure n1 > n2 * *********************/ if (n1 < n2) { i = n2; n2 = n1; n1 = i; } /**************************** * nanotube lattice vectors * ****************************/ a[0] = bond * sqrt (3.0); a[1] = 0.0; b[0] = 0.5 * bond * sqrt (3.0); b[1] = 1.5 * bond; /******************************************** * translation vector: T is always between * * 0 and PI/2, angle is set negative so T * * vector is rotated down, to be horizontal * * * * rectangle dimensions: perimeter x height * ********************************************/ t[0] = n1 * a[0] + n2 * b[0]; t[1] = n1 * a[1] + n2 * b[1]; *perimeter = p = sqrt (t[0] * t[0] + t[1] * t[1]); *angle = -acos (t[0] / p); *height = h = static_height (bond, rings, n1, n2, *angle); /*********************************************** * scanning region: a hexagonal losango with * * [-max,max] x [0, max] cells, covering * * completely a half-circle with radius radius * ***********************************************/ radius = sqrt (p * p + h * h); *max = m = 1.0 + (1.2 * radius) / (bond * sqrt (3.0)); /******************************************* * driver array: each cell (i,j) stores * * the id numbers of the two A, B atoms * * in each (i,j) primitive graphene cell * * * * number: max x 2 max x (atom A + atom B) * *******************************************/ number = 4 * m * m; driver = (gamgi_atom **) malloc (sizeof (gamgi_atom *) * number); for (i = 0; i < number; i++) driver[i] = NULL; return driver; } void gamgi_chem_graphene_tube_2d (gamgi_molecule *molecule, gamgi_atom **driver, int max, int n1, int n2, double perimeter, double angle, double height, int element1, int element2, double bond) { double a[2], b[2], a_rotated[2], b_rotated[2]; double x, y; int i, j; /*********************************************************** * build: 1) graphene vectors; 2) rotated graphene vectors * * so the rotated translation vector becomes horizontal * ***********************************************************/ gamgi_chem_graphene_vectors (bond, a, b); static_vectors (a, b, angle, a_rotated, b_rotated); /****************************************************** * each primitive cell (i,j), with length a and * * angle 120o, is formed by two equilateral triangles * * * * atoms A are in the vertices, * * atoms B are centered in the triangles below * * * * the distance between atoms is the distance from * * a vertex to the center of a triangle: a/sqrt(3) * ******************************************************/ for (j = 0; j < max; j++) { for (i = -max; i < max; i++) { /************************************* * A atoms (type = FALSE): (0, 0, 0) * *************************************/ x = i * a_rotated[0] + j * b_rotated[0]; y = i * a_rotated[1] + j * b_rotated[1]; static_atom_2d (molecule, driver, max, i, j, FALSE, n1, n2, perimeter, height, element1, x, y); /**************************************** * B atoms (type = TRUE): (2/3, 1/3, 0) * ****************************************/ x += 2 / 3.0 * a_rotated[0] + 1 / 3.0 * b_rotated[0]; y += 2 / 3.0 * a_rotated[1] + 1 / 3.0 * b_rotated[1]; static_atom_2d (molecule, driver, max, i, j, TRUE, n1, n2, perimeter, height, element2, x, y); } } static_bond_2d (driver, max, n1, n2); } void gamgi_chem_graphene_tube_3d (gamgi_molecule *molecule, gamgi_atom **driver, int max, int n1, int n2, double perimeter, double angle, double height, int element1, int element2, double bond) { double a[2], b[2], a_rotated[2], b_rotated[2]; double x, z; int i, j; /*********************************************************** * build: 1) graphene vectors; 2) rotated graphene vectors * * so the rotated translation vector becomes horizontal * ***********************************************************/ gamgi_chem_graphene_vectors (bond, a, b); static_vectors (a, b, angle, a_rotated, b_rotated); /****************************************************** * each primitive cell (i,j), with length a and * * angle 120o, is formed by two equilateral triangles * * * * atoms A are in the vertices, * * atoms B are centered in the triangles below * * * * the distance between atoms is the distance from * * a vertex to the center of a triangle: a/sqrt(3) * ******************************************************/ for (j = 0; j < max; j++) { for (i = -max; i < max; i++) { /************************************* * A atoms (type = FALSE): (0, 0, 0) * *************************************/ x = i * a_rotated[0] + j * b_rotated[0]; z = i * a_rotated[1] + j * b_rotated[1]; static_atom_3d (molecule, driver, max, i, j, FALSE, n1, n2, perimeter, height, element1, x, z); /**************************************** * B atoms (type = TRUE): (2/3, 0, 1/3) * ****************************************/ x += 2 / 3.0 * a_rotated[0] + 1 / 3.0 * b_rotated[0]; z += 2 / 3.0 * a_rotated[1] + 1 / 3.0 * b_rotated[1]; static_atom_3d (molecule, driver, max, i, j, TRUE, n1, n2, perimeter, height, element2, x, z); } } static_bond_2d (driver, max, n1, n2); static_bond_3d (driver, max, n1, n2); } void gamgi_chem_graphene_tube (gamgi_molecule *molecule, int n1, int n2, int rings, int element1, int element2, double bond) { gamgi_atom **driver = NULL; double perimeter, angle, height; int max; driver = gamgi_chem_graphene_tube_driver (n1, n2, rings, bond, &max, &perimeter, &angle, &height); gamgi_chem_graphene_tube_3d (molecule, driver, max, n1, n2, perimeter, angle, height, element1, element2, bond); free (driver); } gamgi-0.17.5/src/chem/gamgi_chem_graphene_tube.h000066400000000000000000000054511433127522700215270ustar00rootroot00000000000000/************************************************** * * $GAMGI/src/chem/gamgi_chem_graphene_tube.h * * Copyright (C) 2016 Carlos Pereira, Joao Coelho * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * internal functions * ********************** static void static_vectors (double *a, double *b, double angle, double *a_rotated, double *b_rotated); static double static_height (double bond, int rings, int n1, int n2, double angle); static int static_inside (double perimeter, double height, double x, double z); static void static_fold (gamgi_atom *atom, double perimeter, double x, double z); static void static_bond (gamgi_atom *atom1, gamgi_atom **driver, int max, int i, int j, int type); static void static_atom_2d (gamgi_molecule *molecule, gamgi_atom **driver, int max, int i, int j, int type, int n1, int n2, double perimeter, double height, int element, double x, double y); static void static_atom_3d (gamgi_molecule *molecule, gamgi_atom **driver, int max, int i, int j, int type, int n1, int n2, double perimeter, double height, int element, double x, double z); static void static_bond_2d (gamgi_atom **driver, int max, int n1, int n2); static void static_bond_3d (gamgi_atom **driver, int max, int n1, int n2); gamgi_atom **gamgi_chem_graphene_tube_driver (int n1, int n2, int rings, double bond, int *max, double *perimeter, double *angle, double *height); void gamgi_chem_graphene_tube_2d (gamgi_molecule *molecule, gamgi_atom **driver, int max, int n1, int n2, double perimeter, double angle, double height, int element1, int element2, double bond); void gamgi_chem_graphene_tube_3d (gamgi_molecule *molecule, gamgi_atom **driver, int max, int n1, int n2, double perimeter, double angle, double height, int element1, int element2, double bond); void gamgi_chem_graphene_tube (gamgi_molecule *molecule, int n1, int n2, int rings, int element1, int element2, double bond); ********************** * external functions * **********************/ gamgi_atom **gamgi_chem_graphene_tube_driver (int n1, int n2, int rings, double bond, int *max, double *perimeter, double *angle, double *height); void gamgi_chem_graphene_tube_2d (gamgi_molecule *molecule, gamgi_atom **driver, int max, int n1, int n2, double perimeter, double angle, double height, int element1, int element2, double bond); void gamgi_chem_graphene_tube_3d (gamgi_molecule *molecule, gamgi_atom **driver, int max, int n1, int n2, double perimeter, double angle, double height, int element1, int element2, double bond); void gamgi_chem_graphene_tube (gamgi_molecule *molecule, int n1, int n2, int rings, int element1, int element2, double bond); /************* * Rationale * ************* Under development, last update: August 2016. ************* * Rationale * *************/ gamgi-0.17.5/src/chem/gamgi_chem_orbital.c000066400000000000000000002153721433127522700203530ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/chem/gamgi_chem_orbital.c * * Copyright (C); 2012,2013 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_mesa.h" #include "gamgi_math.h" #include "gamgi_chem.h" #include "gamgi_math_vector.h" /*********************************************************************** * Bibliography * * * * On H-based orbitals: * * 1) Introduction To Quantum Mechanics, L. Pauling and B. Wilson, * * McGraw Hill Book Company Inc. (1935) * * 2) http://winter.group.shef.ac.uk/orbitron/ * * 3) http://www.orbitals.com/orb/ov.htm * * 4) https://undergrad-ed.chemistry.ohio-state.edu/H-AOs/4fxyz.html * * * * On tesselation algorithms: * * 1) B.P. Carneiro, C.T. Silva and A.E. Kaufman, "Tetra-Cubes: an * * algorithm to generate 3D isosurfaces based upon tetrahedra", * * Anais do IX SIBGRAPI'96 (1996) * * 2) W.E. Lorensen and H.E. Cline, "Marching Cubes, a high resolution * * 3D surface construction algorithm", Computer Graphics, 21-4 (1987) * * 3) http://en.wikipedia.org/wiki/Marching_cubes * * 4) http://www.ics.uci.edu/~eppstein/projects/tetra/ * * 5) http://paulbourke.net/geometry/polygonise/ * * 6) http://users.polytech.unice.fr/~lingrand/MarchingCubes/algo.html * ***********************************************************************/ typedef struct _static_surface { /*********************************************************** * scanning current state: * * 1) save x,y,z,f coordinates and wavefunction per vertex * * 2) save global [8] and vertices [0..7] state * * 3) save number of triangles built * ***********************************************************/ double cache_f[8 * 4]; int cache_v[8 * 1]; int cache_s; int triangles; /******************************************* * set which octant faces need to be built * *******************************************/ int face_a[3][2][2]; int face_b[2][3][2]; int face_c[2][2][3]; /*************************************************** * for current octant, save scanning data: * * 1) current cube int coordinates * * 2) octant origin double coordinates * * 3) bit array to flag points above the density * * 4) bit array to flag points outside the orbital * * 5) bit arrays needed bits * * 6) bit arrays needed chars * ***************************************************/ int a, b, c; double origin[3]; char *above, *outside, *signal; int n_char, n_bit, n_signal; /************************************** * stack arrays, used to avoid * * recursive calls in static_outside; * **************************************/ unsigned char *stack_a, *stack_b, *stack_c; /******************************************** * pointers to functions building triangles * * from tetrahedra, squares and triangles * ********************************************/ void (*triangle[8]) (struct _static_surface *surface, double *f0, double *f1, double *f2); void (*square[16]) (struct _static_surface *surface, int *v0, int *v1, int *v2, int *v3); void (*tetrahedron[16]) (struct _static_surface *surface, int *v0, int *v1, int *v2, int *v3); /************************************** * accuracy per octant per direction: * * 1) width of sampling cubes * * 2) number of sampling cubes * * 3) number of sampling points * **************************************/ double width; int slices, n_points; /********************** * wave function data * **********************/ gamgi_radial function_r; gamgi_angular function_a; double constant, ho; /**************** * orbital data * ****************/ gamgi_orbital *orbital; /**************************************** * save current triangle array position * ****************************************/ int offset; } static_surface; typedef void (*gamgi_tetra) (void *surface, int *v0, int *v1, int *v2, int *v3); /************************************************************* * radial Laguerre polynomials start here: the factor r**l * * (l = angular quantum number) is supressed as this cancels * * with the factor 1 / r**l from the Legendre functions * *************************************************************/ static double static_1s (double r) { /****************** * n = 1, l = 0 * ******************/ return 1; } static double static_2s (double r) { /**************** * n = 2, l = 0 * ****************/ return 2 - r; } static double static_2p (double r) { /**************** * n = 2, l = 1 * ****************/ return 1; } static double static_3s (double r) { double r2 = r * r; /**************** * n = 3, l = 0 * ****************/ return 6 - 6 * r + r2; } static double static_3p (double r) { /**************** * n = 3, l = 1 * ****************/ return 4 - r; } static double static_3d (double r) { /**************** * n = 3, l = 2 * ****************/ return 1; } static double static_4s (double r) { double r2 = r * r; double r3 = r2 * r; /**************** * n = 4, l = 0 * ****************/ return 24 - 36 * r + 12 * r2 - r3; } static double static_4p (double r) { double r2 = r * r; /**************** * n = 4, l = 1 * ****************/ return 20 - 10 * r + r2; } static double static_4d (double r) { /**************** * n = 4, l = 2 * ****************/ return 6 - r; } static double static_4f (double r) { /**************** * n = 4, l = 3 * ****************/ return 1; } static double static_5s (double r) { double r2 = r * r; double r3 = r2 * r; double r4 = r3 * r; /**************** * n = 5, l = 0 * ****************/ return 120 - 240 * r + 120 * r2 - 20 * r3 + r4; } static double static_5p (double r) { double r2 = r * r; double r3 = r2 * r; /**************** * n = 5, l = 1 * ****************/ return 120 - 90 * r + 18 * r2 - r3; } static double static_5d (double r) { double r2 = r * r; /**************** * n = 5, l = 2 * ****************/ return 42 - 14 * r + r2; } static double static_5f (double r) { /**************** * n = 5, l = 3 * ****************/ return 8 - r; } static double static_5g (double r) { /**************** * n = 5, l = 4 * ****************/ return 1; } static double static_6s (double r) { double r2 = r * r; double r3 = r2 * r; double r4 = r3 * r; double r5 = r4 * r; /**************** * n = 6, l = 0 * ****************/ return 720 - 1800 * r + 1200 * r2 - 300 * r3 + 30 * r4 - r5; } static double static_6p (double r) { double r2 = r * r; double r3 = r2 * r; double r4 = r3 * r; /**************** * n = 6, l = 1 * ****************/ return 840 - 840 * r + 252 * r2 - 28 * r3 + r4; } static double static_6d (double r) { double r2 = r * r; double r3 = r2 * r; /**************** * n = 6, l = 2 * ****************/ return 336 - 168 * r + 24 * r2 - r3; } static double static_6f (double r) { double r2 = r * r; /**************** * n = 6, l = 3 * ****************/ return 72 - 18 * r + r2; } static double static_6g (double r) { /**************** * n = 6, l = 4 * ****************/ return 10 - r; } static double static_6h (double r) { /**************** * n = 6, l = 5 * ****************/ return 1; } static void static_radial (int n, int l, double *c, gamgi_radial *f) { if (n == 1) { *c = 0.5; *f = static_1s; } if (n == 2) { if (l == 0) { *c = 2 * sqrt (2); *f = static_2s; } if (l == 1) { *c = 2 * sqrt (6); *f = static_2p; } } if (n == 3) { if (l == 0) { *c = 9 * sqrt (3); *f = static_3s; } if (l == 1) { *c = 9 * sqrt (6); *f = static_3p; } if (l == 2) { *c = 9 * sqrt (30); *f = static_3d; } } if (n == 4) { if (l == 0) { *c = 96; *f = static_4s; } if (l == 1) { *c = 32 * sqrt (15); *f = static_4p; } if (l == 2) { *c = 96 * sqrt (5); *f = static_4d; } if (l == 3) { *c = 96 * sqrt (35); *f = static_4f; } } if (n == 5) { if (l == 0) { *c = 300 * sqrt (5); *f = static_5s; } if (l == 1) { *c = 150 * sqrt (30); *f = static_5p; } if (l == 2) { *c = 150 * sqrt (70); *f = static_5d; } if (l == 3) { *c = 300 * sqrt (70); *f = static_5f; } if (l == 4) { *c = 900 * sqrt (70); *f = static_5g; } } if (n == 6) { if (l == 0) { *c = 2160 * sqrt (6); *f = static_6s; } if (l == 1) { *c = 432 * sqrt (210); *f = static_6p; } if (l == 2) { *c = 864 * sqrt (105); *f = static_6d; } if (l == 3) { *c = 2592 * sqrt (35); *f = static_6f; } if (l == 4) { *c = 12960 * sqrt (7); *f = static_6g; } if (l == 5) { *c = 12960 * sqrt (77); *f = static_6h; } } *c = 1 / *c; } /************************************************************** * angular Legendre functions start here: the factor 1 / r**l * * (l = angular quantum number) is supressed as this cancels * * with the factor r**l from the Laguerre polynomials * **************************************************************/ static double static_s (double x, double y, double z, double r) { /**************** * l = 0, m = 0 * ****************/ return 1; } static double static_py (double x, double y, double z, double r) { /***************** * l = 1, m = -1 * *****************/ return y; } static double static_pz (double x, double y, double z, double r) { /**************** * l = 1, m = 0 * ****************/ return z; } static double static_px (double x, double y, double z, double r) { /***************** * l = 1, m = +1 * *****************/ return x; } static double static_dxy (double x, double y, double z, double r) { /**************** * l = 2, m = -2 * ****************/ return x * y; } static double static_dyz (double x, double y, double z, double r) { /**************** * l = 2, m = -1 * ****************/ return y * z; } static double static_dz2 (double x, double y, double z, double r) { double z2 = z * z; double r2 = r * r; /**************** * l = 2, m = 0 * ****************/ return 3 * z2 - r2; } static double static_dxz (double x, double y, double z, double r) { /**************** * l = 2, m = 1 * ****************/ return x * z; } static double static_dx2_y2 (double x, double y, double z, double r) { double x2 = x * x; double y2 = y * y; /**************** * l = 2, m = 2 * ****************/ return x2 - y2; } static double static_fy_3x2_y2 (double x, double y, double z, double r) { double x2 = x * x; double y2 = y * y; /***************** * l = 3, m = -3 * *****************/ return y * (3 * x2 - y2); } static double static_fxyz (double x, double y, double z, double r) { /***************** * l = 3, m = -2 * *****************/ return x * y * z; } static double static_fyz2 (double x, double y, double z, double r) { double z2 = z * z; double r2 = r * r; /***************** * l = 3, m = -1 * *****************/ return y * (5 * z2 - r2); } static double static_fz3 (double x, double y, double z, double r) { double z2 = z * z; double r2 = r * r; /**************** * l = 3, m = 0 * ****************/ return z * (5 * z2 - 3 * r2); } static double static_fxz2 (double x, double y, double z, double r) { double z2 = z * z; double r2 = r * r; /**************** * l = 3, m = 1 * ****************/ return x * (5 * z2 - r2); } static double static_fz_x2_y2 (double x, double y, double z, double r) { double x2 = x * x; double y2 = y * y; /**************** * l = 3, m = 2 * ****************/ return z * (x2 - y2); } static double static_fx_x2_3y2 (double x, double y, double z, double r) { double x2 = x * x; double y2 = y * y; /**************** * l = 3, m = 3 * ****************/ return x * (x2 - 3 * y2); } static double static_gxy_x2_y2 (double x, double y, double z, double r) { double x2 = x * x; double y2 = y * y; /***************** * l = 4, m = -4 * *****************/ return x * y * (x2 - y2); } static double static_gzy3 (double x, double y, double z, double r) { double x2 = x * x; double y2 = y * y; /***************** * l = 4, m = -3 * *****************/ return y * z * (3 * x2 - y2); } static double static_gz2_xy (double x, double y, double z, double r) { double z2 = z * z; double r2 = r * r; /***************** * l = 4, m = -2 * *****************/ return x * y * (7 * z2 - r2); } static double static_gz3y (double x, double y, double z, double r) { double z2 = z * z; double r2 = r * r; /***************** * l = 4, m = -1 * *****************/ return y * z * (7 * z2 - 3 * r2); } static double static_gz4 (double x, double y, double z, double r) { double z2 = z * z; double z4 = z2 * z2; double r2 = r * r; double r4 = r2 * r2; /**************** * l = 4, m = 0 * ****************/ return (35 * z4 - 30 * z2 * r2 + 3 * r4); } static double static_gz3x (double x, double y, double z, double r) { double z2 = z * z; double r2 = r * r; /**************** * l = 4, m = 1 * ****************/ return x * z * (7 * z2 - 3 * r2); } static double static_gz2_x2_y2 (double x, double y, double z, double r) { double x2 = x * x; double y2 = y * y; double z2 = z * z; double r2 = r * r; /**************** * l = 4, m = 2 * ****************/ return (x2 - y2) * (7 * z2 - r2); } static double static_gzx3 (double x, double y, double z, double r) { double x2 = x * x; double y2 = y * y; /***************** * l = 4, m = 3 * *****************/ return x * z * (x2 - 3 * y2); } static double static_gx4_y4 (double x, double y, double z, double r) { double x2 = x * x; double x4 = x2 * x2; double y2 = y * y; double y4 = y2 * y2; /***************** * l = 4, m = 4 * *****************/ return (x4 + y4 - 6 * x2 * y2); } static double static_hy5 (double x, double y, double z, double r) { double x2 = x * x; double x4 = x2 * x2; double y2 = y * y; double y3 = y2 * y; double y5 = y3 * y2; /***************** * l = 5, m = -5 * *****************/ return (y5 - 10 * x2 * y3 + 5 * x4 * y); } static double static_hxyz_x2_y2 (double x, double y, double z, double r) { double x2 = x * x; double y2 = y * y; /***************** * l = 5, m = -4 * *****************/ return x * y * z * (x2 - y2); } static double static_hz2y3 (double x, double y, double z, double r) { double y3 = y * y * y; double x2 = x * x; double z2 = z * z; double r2 = r * r; /***************** * l = 5, m = -3 * *****************/ return (3 * x2 * y - y3) * (9 * z2 - r2); } static double static_hz3_xy (double x, double y, double z, double r) { double z3 = z * z * z; double r2 = r * r; /***************** * l = 5, m = -2 * *****************/ return x * y * (3 * z3 - z * r2); } static double static_hz4y (double x, double y, double z, double r) { double z2 = z * z; double z4 = z2 * z2; double r2 = r * r; double r4 = r2 * r2; /***************** * l = 5, m = -1 * *****************/ return y * (21 * z4 - 14 * z2 * r2 + r4); } static double static_hz5 (double x, double y, double z, double r) { double z2 = z * z; double z3 = z2 * z; double z5 = z3 * z2; double r2 = r * r; double r4 = r2 * r2; /**************** * l = 5, m = 0 * ****************/ return (63 * z5 - 70 * z3 * r2 + 15 * z * r4); } static double static_hz4x (double x, double y, double z, double r) { double z2 = z * z; double z4 = z2 * z2; double r2 = r * r; double r4 = r2 * r2; /**************** * l = 5, m = 1 * ****************/ return x * (21 * z4 - 14 * z2 * r2 + r4); } static double static_hz3_x2_y2 (double x, double y, double z, double r) { double x2 = x * x; double y2 = y * y; double z3 = z * z * z; double r2 = r * r; /**************** * l = 5, m = 2 * ****************/ return (x2 - y2) * (3 * z3 - z * r2); } static double static_hz2x3 (double x, double y, double z, double r) { double x3 = x * x * x; double y2 = y * y; double z2 = z * z; double r2 = r * r; /**************** * l = 5, m = 3 * ****************/ return (x3 - 3 * x * y2) * (9 * z2 - r2); } static double static_hz_x4_y4 (double x, double y, double z, double r) { double x2 = x * x; double x4 = x2 * x2; double y2 = y * y; double y4 = y2 * y2; /**************** * l = 5, m = 4 * ****************/ return z * (x4 + y4 - 6 * x2 * y2); } static double static_hx5 (double x, double y, double z, double r) { double x2 = x * x; double x3 = x2 * x; double x5 = x3 * x2; double y2 = y * y; double y4 = y2 * y2; /**************** * l = 5, m = 5 * ****************/ return (x5 - 10 * x3 * y2 + 5 * x * y4); } static void static_angular (int l, int m, double *c, gamgi_angular *f) { *f = NULL; if (l == 0) { *c = 1; *f = static_s; } if (l == 1) { if (m == -1) { *c = sqrt (3); *f = static_py; } if (m == 0) { *c = sqrt (3); *f = static_pz; } if (m == +1) { *c = sqrt (3); *f = static_px; } } if (l == 2) { if (m == -2) { *c = sqrt (15); *f = static_dxy; } if (m == -1) { *c = sqrt (15); *f = static_dyz; } if (m == 0) { *c = sqrt (5 / 4.0); *f = static_dz2; } if (m == +1) { *c = sqrt (15); *f = static_dxz; } if (m == +2) { *c = sqrt (15 / 4.0); *f = static_dx2_y2; } } if (l == 3) { if (m == -3) { *c = sqrt (35 / 8.0); *f = static_fy_3x2_y2; } if (m == -2) { *c = sqrt (105); *f = static_fxyz; } if (m == -1) { *c = sqrt (21 / 8.0); *f = static_fyz2; } if (m == 0) { *c = sqrt (7 / 4.0); *f = static_fz3; } if (m == +1) { *c = sqrt (21 / 8.0); *f = static_fxz2; } if (m == +2) { *c = sqrt (105 / 4.0); *f = static_fz_x2_y2; } if (m == +3) { *c = sqrt (35 / 8.0); *f = static_fx_x2_3y2; } } if (l == 4) { if (m == -4) { *c = sqrt (315 / 4.0); *f = static_gxy_x2_y2; } if (m == -3) { *c = sqrt (315 / 8.0); *f = static_gzy3; } if (m == -2) { *c = sqrt (45 / 4.0); *f = static_gz2_xy; } if (m == -1) { *c = sqrt (45 / 8.0); *f = static_gz3y; } if (m == 0) { *c = 3 / 8.0; *f = static_gz4; } if (m == +1) { *c = sqrt (45 / 8.0); *f = static_gz3x; } if (m == +2) { *c = sqrt (45 / 16.0); *f = static_gz2_x2_y2; } if (m == +3) { *c = sqrt (315 / 8.0); *f = static_gzx3; } if (m == +4) { *c = sqrt (315 / 64.0); *f = static_gx4_y4; } } if (l == 5) { if (m == -5) { *c = sqrt (693 / 128.0); *f = static_hy5; } if (m == -4) { *c = sqrt (3465 / 4.0); *f = static_hxyz_x2_y2; } if (m == -3) { *c = sqrt (385 / 128.0); *f = static_hz2y3; } if (m == -2) { *c = sqrt (1155 / 4.0); *f = static_hz3_xy; } if (m == -1) { *c = sqrt (165 / 64.0); *f = static_hz4y; } if (m == 0) { *c = sqrt (11 / 64.0); *f = static_hz5; } if (m == +1) { *c = sqrt (165 / 64.0); *f = static_hz4x; } if (m == +2) { *c = sqrt (1155 / 16.0); *f = static_hz3_x2_y2; } if (m == +3) { *c = sqrt (385 / 128.0); *f = static_hz2x3; } if (m == +4) { *c = sqrt (3465 / 64.0); *f = static_hz_x4_y4; } if (m == +5) { *c = sqrt (693 / 128.0); *f = static_hx5; } } *c /= sqrt (4.0 * GAMGI_MATH_PI); } static double static_density (double r, double f, gamgi_angular function_a) { double theta, phi, end; double x, y, z, s; double g; end = GAMGI_MATH_PI / 2.0; for (theta = 0.0; theta < end; theta += GAMGI_CHEM_ORBITAL_T_STEP) { z = r * cos (theta); s = r * sin (theta); for (phi = 0.0; phi < end; phi += GAMGI_CHEM_ORBITAL_P_STEP) { x = s * cos (phi); y = s * sin (phi); g = f * (*function_a) (x, y, z, r); if (g * g > GAMGI_CHEM_ORBITAL_DENSITY) return TRUE; } } return FALSE; } static void static_frame (gamgi_orbital *orbital) { double *points; double radius; int *lines; int x, y, z, offset; points = orbital->points; radius = orbital->radius; /********************** * add 8 frame points * **********************/ offset = 0; for (z = -1; z <= 1; z += 2) { for (y = -1; y <= 1; y += 2) { for (x = -1; x <= 1; x += 2) { points[offset++] = radius * x; points[offset++] = radius * y; points[offset++] = radius * z; } } } /********************************************************* * create array with 12 edges: edges x, edges y, edges z * *********************************************************/ orbital->lines = lines = (int *) malloc (25 * sizeof (int)); orbital->n_lines = 25; offset = 0; lines[offset++] = 12; lines[offset++] = 0; lines[offset++] = 1; lines[offset++] = 2; lines[offset++] = 3; lines[offset++] = 4; lines[offset++] = 5; lines[offset++] = 6; lines[offset++] = 7; lines[offset++] = 0; lines[offset++] = 2; lines[offset++] = 1; lines[offset++] = 3; lines[offset++] = 4; lines[offset++] = 6; lines[offset++] = 5; lines[offset++] = 7; lines[offset++] = 0; lines[offset++] = 4; lines[offset++] = 1; lines[offset++] = 5; lines[offset++] = 2; lines[offset++] = 6; lines[offset++] = 3; lines[offset++] = 7; } static gamgi_bool static_wired (gamgi_orbital *orbital) { gamgi_radial function_r; gamgi_angular function_a; double *points; double max = RAND_MAX; double za, r, ho, rho; double density, radius, f, x, y, z; double constant, constant_z, constant_r, constant_a; int *dots; int offset, offset_negative, offset_positive; int sampling, n_points, i, bad; int a, b, c; /******************************************************* * if required, add frame data to points, lines arrays * *******************************************************/ dots = orbital->dots; density = orbital->density; radius = orbital->radius; sampling = orbital->sampling; orbital->n_points = n_points = sampling + dots[0]; orbital->points = points = (double *) malloc (n_points * 3 * sizeof (double)); static_radial (orbital->n, orbital->l, &constant_r, &function_r); static_angular (orbital->l, orbital->m, &constant_a, &function_a); za = orbital->charge / GAMGI_CHEM_A0; ho = 2 * za / orbital->n; constant_z = pow (za, 1.5) * pow (ho, orbital->l); constant = constant_z * constant_r * constant_a; /*************************************************** * start negative phase points from the beginning * * of the array (after frame points if available) * * and positive phase points from the end (even if * * the same color will be used to show both sets * ***************************************************/ offset_positive = dots[0]; offset_negative = n_points - 1; /****************************** * set random number sequence * ******************************/ srand (orbital->seed); /******************************************* * i_bad is just to prevent infinite loops * *******************************************/ i = bad = 0; while (i < sampling && bad < GAMGI_CHEM_ORBITAL_BAD) { x = 2.0 * rand () / max - 1.0; y = 2.0 * rand () / max - 1.0; z = 2.0 * rand () / max - 1.0; r = x * x + y * y + z * z; if (r > 1.0) continue; a = b = c = 0; if (x > 0) a = 1; if (y > 0) b = 1; if (z > 0) c = 1; if (orbital->octants[4*c + 2*b + a] == FALSE) continue; r = radius * sqrt (r); rho = r * ho; x *= radius; y *= radius; z *= radius; f = constant * exp (-rho / 2) * (*function_r) (rho) * (*function_a) (x, y, z, r); if (f * f < density) { bad++; continue; } i++; bad = 0; if (f >= 0) offset = offset_positive++; if (f < 0) offset = offset_negative--; points[3*offset + 0] = x; points[3*offset + 1] = y; points[3*offset + 2] = z; } /*************************************** * set positive (dots[1]) and negative * * (dots[2]) number of density points * ***************************************/ dots[1] = offset_positive - dots[0]; if (orbital->phase == TRUE) dots[2] = n_points - 1 - offset_negative; else dots[1] += n_points - 1 - offset_negative; if (dots[0] + dots[1] + dots[2] == n_points) return TRUE; /************************************* * clean memory when things go wrong * *************************************/ free (orbital->points); orbital->points = NULL; orbital->n_points = 0; return FALSE; } static void static_clean (char *array, int n_char) { int n; for (n = 0; n < n_char; n++) array[n] = 0; } static int static_offset (int n_points, int a, int b, int c) { return c * n_points * n_points + b * n_points + a; } static void static_above (static_surface *surface, int a, int b, int c) { gamgi_orbital *orbital; char *above; gamgi_radial function_r; gamgi_angular function_a; double *origin; double r, ho, rho; double density, radius, width, f, x, y, z; double constant; int n_points, n; /******************** * get orbital data * ********************/ orbital = surface->orbital; function_r = surface->function_r; function_a = surface->function_a; constant = surface->constant; ho = surface->ho; /***************** * get user data * *****************/ density = orbital->density; width = surface->width; n_points = surface->n_points; radius = orbital->radius; origin = surface->origin; origin[0] = radius * (a - 1); origin[1] = radius * (b - 1); origin[2] = radius * (c - 1); /******************* * set above array * *******************/ above = surface->above; for (c = 0; c < n_points; c++) { z = origin[2] + c * width; for (b = 0; b < n_points; b++) { y = origin[1] + b * width; for (a = 0; a < n_points; a++) { x = origin[0] + a * width; r = x * x + y * y + z * z; r = sqrt (r); rho = r * ho; f = constant * exp (-rho / 2) * (*function_r) (rho) * (*function_a) (x, y, z, r); if (f * f < density) continue; n = c * n_points * n_points + b * n_points + a; GAMGI_ENGINE_BITSET(above, n); } } } } static void static_outside (static_surface *surface, int a, int b, int c) { unsigned char *stack_a, *stack_b, *stack_c; char *outside, *above; int a_shift, b_shift, c_shift; int offset, step, bit, bit_new; int n_points; /************************************************* * this function must be non-recursive, because * * the number of recursive calls is just too big * *************************************************/ n_points = surface->n_points; outside = surface->outside; above = surface->above; stack_a = surface->stack_a; stack_b = surface->stack_b; stack_c = surface->stack_c; a_shift = 1; b_shift = n_points; c_shift = n_points * n_points; offset = -1; step = 0; while (1 > 0) { /********************* * controlling block * *********************/ offset += step; if (step == +1) { GAMGI_ENGINE_BITSET(outside, bit_new); stack_a[offset] = a; stack_b[offset] = b; stack_c[offset] = c; } if (step == -1) { if (offset < 0) break; a = stack_a[offset]; b = stack_b[offset]; c = stack_c[offset]; } bit = a * a_shift + b * b_shift + c * c_shift; /****************** * scanning block * ******************/ step = +1; bit_new = bit - a_shift; if (a > 0 && GAMGI_ENGINE_BITTEST(outside, bit_new) == 0 && GAMGI_ENGINE_BITTEST(above, bit_new) == 0) { a--; continue; } bit_new = bit + a_shift; if (a < n_points - 1 && GAMGI_ENGINE_BITTEST(outside, bit_new) == 0 && GAMGI_ENGINE_BITTEST(above, bit_new) == 0) { a++; continue; } bit_new = bit - b_shift; if (b > 0 && GAMGI_ENGINE_BITTEST(outside, bit_new) == 0 && GAMGI_ENGINE_BITTEST(above, bit_new) == 0) { b--; continue; } bit_new = bit + b_shift; if (b < n_points - 1 && GAMGI_ENGINE_BITTEST(outside, bit_new) == 0 && GAMGI_ENGINE_BITTEST(above, bit_new) == 0) { b++; continue; } bit_new = bit - c_shift; if (c > 0 && GAMGI_ENGINE_BITTEST(outside, bit_new) == 0 && GAMGI_ENGINE_BITTEST(above, bit_new) == 0) { c--; continue; } bit_new = bit + c_shift; if (c < n_points - 1 && GAMGI_ENGINE_BITTEST(outside, bit_new) == 0 && GAMGI_ENGINE_BITTEST(above, bit_new) == 0) { c++; continue; } step = -1; } } static void static_points (static_surface *surface, double *f1, double *f2, double *f3) { gamgi_orbital *orbital; double *points; int *dots; int n_points, offset; orbital = surface->orbital; dots = orbital->dots; points = orbital->points; n_points = orbital->n_points; /******************************** * add triangle coordinate data * ********************************/ offset = dots[0] + dots[1]; if (offset + 3 > n_points) { n_points += GAMGI_CHEM_ORBITAL_SEGMENT; points = (double *) realloc (points, n_points * 3 * sizeof (double)); } offset *= 3; points[offset + 0] = f1[0]; points[offset + 1] = f1[1]; points[offset + 2] = f1[2]; points[offset + 3] = f2[0]; points[offset + 4] = f2[1]; points[offset + 5] = f2[2]; points[offset + 6] = f3[0]; points[offset + 7] = f3[1]; points[offset + 8] = f3[2]; dots[1] += 3; surface->triangles += 1; orbital->points = points; orbital->n_points = n_points; } static void static_signal (static_surface *surface, int positive) { int n_char, n_signal, n; char *signal; signal = surface->signal; n_signal = surface->n_signal; /*********************************************************************** * realloc triangle signal array: 24 = 3 points/triangle x 8 bits/byte * ***********************************************************************/ n = surface->orbital->dots[1] / 3; n_char = GAMGI_ENGINE_BITNSLOTS(n); if (n_char > n_signal) { n_signal += GAMGI_CHEM_ORBITAL_SEGMENT / 24; signal = (char *) realloc (signal, n_signal * sizeof (char)); } (positive == TRUE)? GAMGI_ENGINE_BITSET(signal, n - 1): GAMGI_ENGINE_BITCLEAR(signal, n - 1); surface->signal = signal; surface->n_signal = n_signal; } static void static_reset (static_surface *surface) { int *cache_v = surface->cache_v; cache_v[0] = FALSE; cache_v[1] = FALSE; cache_v[2] = FALSE; cache_v[3] = FALSE; cache_v[4] = FALSE; cache_v[5] = FALSE; cache_v[6] = FALSE; cache_v[7] = FALSE; surface->cache_s = TRUE; } static void static_3d_copy (static_surface *surface) { double *cache_f = surface->cache_f; int *cache_v = surface->cache_v; cache_f[4 * 0 + 0] = cache_f[4 * 4 + 0]; cache_f[4 * 0 + 1] = cache_f[4 * 4 + 1]; cache_f[4 * 0 + 2] = cache_f[4 * 4 + 2]; cache_f[4 * 0 + 3] = cache_f[4 * 4 + 3]; cache_f[4 * 1 + 0] = cache_f[4 * 5 + 0]; cache_f[4 * 1 + 1] = cache_f[4 * 5 + 1]; cache_f[4 * 1 + 2] = cache_f[4 * 5 + 2]; cache_f[4 * 1 + 3] = cache_f[4 * 5 + 3]; cache_f[4 * 2 + 0] = cache_f[4 * 6 + 0]; cache_f[4 * 2 + 1] = cache_f[4 * 6 + 1]; cache_f[4 * 2 + 2] = cache_f[4 * 6 + 2]; cache_f[4 * 2 + 3] = cache_f[4 * 6 + 3]; cache_f[4 * 3 + 0] = cache_f[4 * 7 + 0]; cache_f[4 * 3 + 1] = cache_f[4 * 7 + 1]; cache_f[4 * 3 + 2] = cache_f[4 * 7 + 2]; cache_f[4 * 3 + 3] = cache_f[4 * 7 + 3]; cache_v[0] = cache_v[4]; cache_v[1] = cache_v[5]; cache_v[2] = cache_v[6]; cache_v[3] = cache_v[7]; cache_v[4] = FALSE; cache_v[5] = FALSE; cache_v[6] = FALSE; cache_v[7] = FALSE; } static void static_2d_copy (static_surface *surface) { double *cache_f = surface->cache_f; int *cache_v = surface->cache_v; cache_f[4 * 0 + 0] = cache_f[4 * 1 + 0]; cache_f[4 * 0 + 1] = cache_f[4 * 1 + 1]; cache_f[4 * 0 + 2] = cache_f[4 * 1 + 2]; cache_f[4 * 0 + 3] = cache_f[4 * 1 + 3]; cache_f[4 * 3 + 0] = cache_f[4 * 2 + 0]; cache_f[4 * 3 + 1] = cache_f[4 * 2 + 1]; cache_f[4 * 3 + 2] = cache_f[4 * 2 + 2]; cache_f[4 * 3 + 3] = cache_f[4 * 2 + 3]; cache_v[0] = cache_v[1]; cache_v[1] = FALSE; cache_v[2] = FALSE; cache_v[3] = cache_v[2]; } static void static_vertex (static_surface *surface, int *v, double *f) { gamgi_radial function_r; gamgi_angular function_a; double *cache_f, *origin; double width, r, rho; int *cache_v; int cache_s, vertex; int a, b, c; /********************* * get scanning data * *********************/ cache_f = surface->cache_f; cache_v = surface->cache_v; cache_s = surface->cache_s; vertex = v[3]; if (cache_s == TRUE && cache_v[vertex] == TRUE) { f[0] = cache_f[4 * vertex + 0]; f[1] = cache_f[4 * vertex + 1]; f[2] = cache_f[4 * vertex + 2]; f[3] = cache_f[4 * vertex + 3]; } else { if (cache_s == FALSE) static_reset (surface); cache_v[vertex] = TRUE; function_r = surface->function_r; function_a = surface->function_a; origin = surface->origin; width = surface->width; a = surface->a; b = surface->b; c = surface->c; f[0] = origin[0] + width * (a + v[0]); f[1] = origin[1] + width * (b + v[1]); f[2] = origin[2] + width * (c + v[2]); r = f[0] * f[0] + f[1] * f[1] + f[2] * f[2]; r = sqrt (r); rho = r * surface->ho; f[3] = surface->constant * exp (-rho / 2) * (*function_r) (rho) * (*function_a) (f[0], f[1], f[2], r); cache_f[4 * vertex + 0] = f[0]; cache_f[4 * vertex + 1] = f[1]; cache_f[4 * vertex + 2] = f[2]; cache_f[4 * vertex + 3] = f[3]; } } static void static_edge (static_surface *surface, int *v0, int *v1, double *f) { double f0[4], f1[4]; double ff0, ff1, fraction; static_vertex (surface, v0, f0); static_vertex (surface, v1, f1); ff0 = f0[3] * f0[3]; ff1 = f1[3] * f1[3]; fraction = (surface->orbital->density - ff0) / (ff1 - ff0); if (fraction < 0) fraction = 0; if (fraction > 1) fraction = 1; f[0] = f0[0] + (f1[0] - f0[0]) * fraction; f[1] = f0[1] + (f1[1] - f0[1]) * fraction; f[2] = f0[2] + (f1[2] - f0[2]) * fraction; f[3] = f0[3] + (f1[3] - f0[3]) * fraction; } static void static_zero (double *f0, double *f1, double *g) { double fraction; fraction = (0.0 - f0[3]) / (f1[3] - f0[3]); g[0] = f0[0] + (f1[0] - f0[0]) * fraction; g[1] = f0[1] + (f1[1] - f0[1]) * fraction; g[2] = f0[2] + (f1[2] - f0[2]) * fraction; } static void static_triangle_000 (static_surface *surface, double *f0, double *f1, double *f2) { static_points (surface, f0, f1, f2); static_signal (surface, FALSE); } static void static_triangle_001 (static_surface *surface, double *f0, double *f1, double *f2) { double g0[3], g1[3]; static_zero (f1, f0, g0); static_zero (f2, f0, g1); static_points (surface, f0, g0, g1); static_signal (surface, TRUE); static_points (surface, g0, f1, f2); static_signal (surface, FALSE); static_points (surface, g0, f2, g1); static_signal (surface, FALSE); } static void static_triangle_010 (static_surface *surface, double *f0, double *f1, double *f2) { double g0[3], g1[3]; static_zero (f2, f1, g0); static_zero (f0, f1, g1); static_points (surface, f1, g0, g1); static_signal (surface, TRUE); static_points (surface, g0, f2, f0); static_signal (surface, FALSE); static_points (surface, g0, f0, g1); static_signal (surface, FALSE); } static void static_triangle_011 (static_surface *surface, double *f0, double *f1, double *f2) { double g0[3], g1[3]; static_zero (f2, f0, g0); static_zero (f2, f1, g1); static_points (surface, f2, g0, g1); static_signal (surface, FALSE); static_points (surface, g0, f0, f1); static_signal (surface, TRUE); static_points (surface, g0, f1, g1); static_signal (surface, TRUE); } static void static_triangle_100 (static_surface *surface, double *f0, double *f1, double *f2) { double g0[3], g1[3]; static_zero (f0, f2, g0); static_zero (f1, f2, g1); static_points (surface, f2, g0, g1); static_signal (surface, TRUE); static_points (surface, g0, f0, f1); static_signal (surface, FALSE); static_points (surface, g0, f1, g1); static_signal (surface, FALSE); } static void static_triangle_101 (static_surface *surface, double *f0, double *f1, double *f2) { double g0[3], g1[3]; static_zero (f1, f2, g0); static_zero (f1, f0, g1); static_points (surface, f1, g0, g1); static_signal (surface, FALSE); static_points (surface, g0, f2, f0); static_signal (surface, TRUE); static_points (surface, g0, f0, g1); static_signal (surface, TRUE); } static void static_triangle_110 (static_surface *surface, double *f0, double *f1, double *f2) { double g0[3], g1[3]; static_zero (f0, f1, g0); static_zero (f0, f2, g1); static_points (surface, f0, g0, g1); static_signal (surface, FALSE); static_points (surface, g0, f1, f2); static_signal (surface, TRUE); static_points (surface, g0, f2, g1); static_signal (surface, TRUE); } static void static_triangle_111 (static_surface *surface, double *f0, double *f1, double *f2) { static_points (surface, f0, f1, f2); static_signal (surface, TRUE); } static void static_triangle (static_surface *surface, double *f0, double *f1, double *f2) { int state; /*********************************** * at this stage triangles must * * be orientated counter-clockwise * * 2 * * / \ * * 0 - 1 * ***********************************/ if (surface->orbital->phase == TRUE) { state = 0; if (f0[3] > 0) state |= 1; if (f1[3] > 0) state |= 2; if (f2[3] > 0) state |= 4; (*surface->triangle[state]) (surface, f0, f1, f2); } else static_points (surface, f0, f1, f2); } /******************************** * 3D tetrahedron intersections * ********************************/ static void static_tetrahedron_0000 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { } static void static_tetrahedron_0001 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v1, v0, fe0); static_edge (surface, v3, v0, fe1); static_edge (surface, v2, v0, fe2); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_0010 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v0, v1, fe0); static_edge (surface, v2, v1, fe1); static_edge (surface, v3, v1, fe2); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_0011 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v2, v0, fe0); static_edge (surface, v3, v0, fe1); static_edge (surface, v3, v1, fe2); static_triangle (surface, fe2, fe1, fe0); static_edge (surface, v2, v1, fe1); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_0100 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v1, v2, fe0); static_edge (surface, v0, v2, fe1); static_edge (surface, v3, v2, fe2); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_0101 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v3, v2, fe0); static_edge (surface, v3, v0, fe1); static_edge (surface, v1, v0, fe2); static_triangle (surface, fe2, fe1, fe0); static_edge (surface, v1, v2, fe1); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_0110 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v3, v1, fe0); static_edge (surface, v0, v1, fe1); static_edge (surface, v0, v2, fe2); static_triangle (surface, fe0, fe1, fe2); static_edge (surface, v3, v2, fe1); static_triangle (surface, fe2, fe1, fe0); } static void static_tetrahedron_0111 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v3, v2, fe0); static_edge (surface, v3, v1, fe1); static_edge (surface, v3, v0, fe2); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_1000 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v0, v3, fe0); static_edge (surface, v1, v3, fe1); static_edge (surface, v2, v3, fe2); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_1001 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v2, v0, fe0); static_edge (surface, v1, v0, fe1); static_edge (surface, v1, v3, fe2); static_triangle (surface, fe0, fe1, fe2); static_edge (surface, v2, v3, fe1); static_triangle (surface, fe2, fe1, fe0); } static void static_tetrahedron_1010 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v0, v1, fe0); static_edge (surface, v0, v3, fe1); static_edge (surface, v2, v3, fe2); static_triangle (surface, fe2, fe1, fe0); static_edge (surface, v2, v1, fe1); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_1011 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v2, v3, fe0); static_edge (surface, v2, v0, fe1); static_edge (surface, v2, v1, fe2); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_1100 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v1, v3, fe0); static_edge (surface, v0, v3, fe1); static_edge (surface, v0, v2, fe2); static_triangle (surface, fe2, fe1, fe0); static_edge (surface, v1, v2, fe1); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_1101 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v1, v3, fe0); static_edge (surface, v1, v2, fe1); static_edge (surface, v1, v0, fe2); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_1110 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4]; static_edge (surface, v0, v2, fe0); static_edge (surface, v0, v3, fe1); static_edge (surface, v0, v1, fe2); static_triangle (surface, fe0, fe1, fe2); } static void static_tetrahedron_1111 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { } static void static_tetrahedron (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { char *outside; int n_points, bit; int a, b, c; int state; /*************************************** * generate triangles from tetrahedron * ***************************************/ n_points = surface->n_points; a = surface->a; b = surface->b; c = surface->c; outside = surface->outside; state = 0; bit = static_offset (n_points, a + v0[0], b + v0[1], c + v0[2]); if (GAMGI_ENGINE_BITTEST(outside, bit) == 0) state |= 1; bit = static_offset (n_points, a + v1[0], b + v1[1], c + v1[2]); if (GAMGI_ENGINE_BITTEST(outside, bit) == 0) state |= 2; bit = static_offset (n_points, a + v2[0], b + v2[1], c + v2[2]); if (GAMGI_ENGINE_BITTEST(outside, bit) == 0) state |= 4; bit = static_offset (n_points, a + v3[0], b + v3[1], c + v3[2]); if (GAMGI_ENGINE_BITTEST(outside, bit) == 0) state |= 8; (*surface->tetrahedron[state]) (surface, v0, v1, v2, v3); } static void static_cubes (static_surface *surface) { int n_points, a, b, c; int v0[4], v1[4], v2[4], v3[4], v4[4], v5[4], v6[4], v7[4]; /***************************************** * generate cubes, tetrahedra, triangles * *****************************************/ /**************************** * cube vertices convention * * * * Back Front * * 3 2 7 6 * * 0 1 4 5 * ****************************/ v0[0] = 0; v0[1] = 0; v0[2] = 0; v0[3] = 0; v1[0] = 0; v1[1] = 1; v1[2] = 0; v1[3] = 1; v2[0] = 0; v2[1] = 1; v2[2] = 1; v2[3] = 2; v3[0] = 0; v3[1] = 0; v3[2] = 1; v3[3] = 3; v4[0] = 1; v4[1] = 0; v4[2] = 0; v4[3] = 4; v5[0] = 1; v5[1] = 1; v5[2] = 0; v5[3] = 5; v6[0] = 1; v6[1] = 1; v6[2] = 1; v6[3] = 6; v7[0] = 1; v7[1] = 0; v7[2] = 1; v7[3] = 7; /************** * scan cubes * **************/ n_points = surface->n_points; for (c = 0; c < n_points - 1; c++) { surface->c = c; for (b = 0; b < n_points - 1; b++) { surface->b = b; for (a = 0; a < n_points - 1; a++) { surface->a = a; if (a == 0 || surface->triangles == 0) surface->cache_s = FALSE; else static_3d_copy (surface); surface->triangles = 0; /************************************************* * scan 5 (central plus four) tetrahedra: as in * * a 3D chess board, odd cubes MUST be rotatated * * 90 degrees to be consistent with even cubes * *************************************************/ /**************************************************** * vertex orientation in tetrahedra: the face * * vertex0-vertex1-vertex2, opposite to vertex3, * * MUST rotate counter-clockwise, seen from outside * * -0- * * | * * +3+-----+1+ * * | * * -2- * ****************************************************/ if ((a + b + c) % 2 == 0) { static_tetrahedron (surface, v0, v5, v7, v2); static_tetrahedron (surface, v5, v0, v7, v4); static_tetrahedron (surface, v5, v0, v1, v2); static_tetrahedron (surface, v7, v2, v5, v6); static_tetrahedron (surface, v2, v7, v0, v3); } else { static_tetrahedron (surface, v4, v1, v6, v3); static_tetrahedron (surface, v4, v1, v5, v6); static_tetrahedron (surface, v4, v0, v1, v3); static_tetrahedron (surface, v6, v4, v3, v7); static_tetrahedron (surface, v6, v3, v1, v2); } } } } } /*************************** * 2D square intersections * ***************************/ static void static_square_0000 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { /****** * 00 * * 00 * ******/ } static void static_square_0001 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4]; /****** * 00 * * 10 * ******/ static_edge (surface, v1, v0, fe0); static_edge (surface, v3, v0, fe1); static_vertex (surface, v0, fv0); static_triangle (surface, fv0, fe0, fe1); } static void static_square_0010 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4]; /****** * 00 * * 01 * ******/ static_edge (surface, v2, v1, fe0); static_edge (surface, v0, v1, fe1); static_vertex (surface, v1, fv0); static_triangle (surface, fv0, fe0, fe1); } static void static_square_0011 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4], fv1[4]; /****** * 00 * * 11 * ******/ static_edge (surface, v3, v0, fe0); static_edge (surface, v2, v1, fe1); static_vertex (surface, v0, fv0); static_vertex (surface, v1, fv1); static_triangle (surface, fe0, fv0, fe1); static_triangle (surface, fe1, fv0, fv1); } static void static_square_0100 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4]; /****** * 01 * * 00 * ******/ static_edge (surface, v3, v2, fe0); static_edge (surface, v1, v2, fe1); static_vertex (surface, v2, fv0); static_triangle (surface, fv0, fe0, fe1); } static void static_square_0101 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4], fe3[4]; double fv0[4], fv1[4]; /****** * 01 * * 10 * ******/ static_edge (surface, v1, v0, fe0); static_edge (surface, v1, v2, fe1); static_edge (surface, v3, v2, fe2); static_edge (surface, v3, v0, fe3); static_vertex (surface, v0, fv0); static_vertex (surface, v2, fv1); static_triangle (surface, fv0, fe0, fe3); static_triangle (surface, fv1, fe2, fe1); } static void static_square_0110 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4], fv1[4]; /****** * 01 * * 01 * ******/ static_edge (surface, v0, v1, fe0); static_edge (surface, v3, v2, fe1); static_vertex (surface, v1, fv0); static_vertex (surface, v2, fv1); static_triangle (surface, fe0, fv0, fe1); static_triangle (surface, fe1, fv0, fv1); } static void static_square_0111 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4], fv1[4], fv2[4]; /****** * 01 * * 11 * ******/ static_edge (surface, v3, v0, fe0); static_edge (surface, v3, v2, fe1); static_vertex (surface, v0, fv0); static_vertex (surface, v1, fv1); static_vertex (surface, v2, fv2); static_triangle (surface, fe0, fv0, fv1); static_triangle (surface, fe1, fv1, fv2); static_triangle (surface, fe1, fe0, fv1); } static void static_square_1000 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4]; /****** * 10 * * 00 * ******/ static_edge (surface, v0, v3, fe0); static_edge (surface, v2, v3, fe1); static_vertex (surface, v3, fv0); static_triangle (surface, fv0, fe0, fe1); } static void static_square_1001 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4], fv1[4]; /****** * 10 * * 10 * ******/ static_edge (surface, v1, v0, fe0); static_edge (surface, v2, v3, fe1); static_vertex (surface, v0, fv0); static_vertex (surface, v3, fv1); static_triangle (surface, fe0, fe1, fv1); static_triangle (surface, fv1, fv0, fe0); } static void static_square_1010 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4], fe2[4], fe3[4]; double fv0[4], fv1[4]; /****** * 10 * * 01 * ******/ static_edge (surface, v0, v1, fe0); static_edge (surface, v2, v1, fe1); static_edge (surface, v2, v3, fe2); static_edge (surface, v0, v3, fe3); static_vertex (surface, v1, fv0); static_vertex (surface, v3, fv1); static_triangle (surface, fv0, fe1, fe0); static_triangle (surface, fv1, fe3, fe2); } static void static_square_1011 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4], fv1[4], fv2[4]; /****** * 10 * * 11 * ******/ static_edge (surface, v2, v3, fe0); static_edge (surface, v2, v1, fe1); static_vertex (surface, v0, fv0); static_vertex (surface, v1, fv1); static_vertex (surface, v3, fv2); static_triangle (surface, fe0, fv2, fv0); static_triangle (surface, fv0, fv1, fe1); static_triangle (surface, fe1, fe0, fv0); } static void static_square_1100 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4], fv1[4]; /****** * 11 * * 00 * ******/ static_edge (surface, v1, v2, fe0); static_edge (surface, v0, v3, fe1); static_vertex (surface, v2, fv0); static_vertex (surface, v3, fv1); static_triangle (surface, fe0, fv0, fv1); static_triangle (surface, fv1, fe1, fe0); } static void static_square_1101 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4], fv1[4], fv2[4]; /****** * 11 * * 10 * ******/ static_edge (surface, v1, v2, fe0); static_edge (surface, v1, v0, fe1); static_vertex (surface, v0, fv0); static_vertex (surface, v2, fv1); static_vertex (surface, v3, fv2); static_triangle (surface, fe0, fv1, fv2); static_triangle (surface, fv2, fv0, fe1); static_triangle (surface, fe1, fe0, fv2); } static void static_square_1110 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fe0[4], fe1[4]; double fv0[4], fv1[4], fv2[4]; /****** * 11 * * 01 * ******/ static_edge (surface, v0, v1, fe0); static_edge (surface, v0, v3, fe1); static_vertex (surface, v1, fv0); static_vertex (surface, v2, fv1); static_vertex (surface, v3, fv2); static_triangle (surface, fe0, fv0, fv1); static_triangle (surface, fv1, fv2, fe1); static_triangle (surface, fe1, fe0, fv1); } static void static_square_1111 (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { double fv0[4], fv1[4], fv2[4], fv3[4]; static_vertex (surface, v0, fv0); static_vertex (surface, v1, fv1); static_vertex (surface, v2, fv2); static_vertex (surface, v3, fv3); static_triangle (surface, fv0, fv1, fv2); static_triangle (surface, fv2, fv3, fv0); } static void static_square (static_surface *surface, int *v0, int *v1, int *v2, int *v3) { char *outside; int n_points, bit; int a, b, c; int state; /********************************** * generate triangles from square * **********************************/ /********************************** * square vertices convention 3 2 * * when seen from outside: 0 1 * **********************************/ n_points = surface->n_points; a = surface->a; b = surface->b; c = surface->c; outside = surface->outside; state = 0; bit = static_offset (n_points, a + v0[0], b + v0[1], c + v0[2]); if (GAMGI_ENGINE_BITTEST(outside, bit) == 0) state |= 1; bit = static_offset (n_points, a + v1[0], b + v1[1], c + v1[2]); if (GAMGI_ENGINE_BITTEST(outside, bit) == 0) state |= 2; bit = static_offset (n_points, a + v2[0], b + v2[1], c + v2[2]); if (GAMGI_ENGINE_BITTEST(outside, bit) == 0) state |= 4; bit = static_offset (n_points, a + v3[0], b + v3[1], c + v3[2]); if (GAMGI_ENGINE_BITTEST(outside, bit) == 0) state |= 8; (*surface->square[state]) (surface, v0, v1, v2, v3); } static void static_squares_a0 (static_surface *surface) { int v0[4], v1[4], v2[4], v3[4]; int n_points; int b, c; n_points = surface->n_points; v0[0] = 0; v0[1] = 0; v0[2] = 0; v0[3] = 0; v1[0] = 0; v1[1] = -1; v1[2] = 0; v1[3] = 1; v2[0] = 0; v2[1] = -1; v2[2] = 1; v2[3] = 2; v3[0] = 0; v3[1] = 0; v3[2] = 1; v3[3] = 3; surface->a = 0; for (c = 0; c < n_points - 1; c++) { surface->c = c; for (b = n_points - 1; b > 0; b--) { surface->b = b; if (b == n_points - 1 || surface->triangles == 0) surface->cache_s = FALSE; else static_2d_copy (surface); surface->triangles = 0; static_square (surface, v0, v1, v2, v3); } } } static void static_squares_a1 (static_surface *surface) { int v0[4], v1[4], v2[4], v3[4]; int n_points; int b, c; n_points = surface->n_points; v0[0] = 0; v0[1] = 0; v0[2] = 0; v0[3] = 0; v1[0] = 0; v1[1] = 1; v1[2] = 0; v1[3] = 1; v2[0] = 0; v2[1] = 1; v2[2] = 1; v2[3] = 2; v3[0] = 0; v3[1] = 0; v3[2] = 1; v3[3] = 3; surface->a = n_points - 1; for (c = 0; c < n_points - 1; c++) { surface->c = c; for (b = 0; b < n_points - 1; b++) { surface->b = b; if (b == 0 || surface->triangles == 0) surface->cache_s = FALSE; else static_2d_copy (surface); surface->triangles = 0; static_square (surface, v0, v1, v2, v3); } } } static void static_squares_b0 (static_surface *surface) { int v0[4], v1[4], v2[4], v3[4]; int n_points; int a, c; n_points = surface->n_points; v0[0] = 0; v0[1] = 0; v0[2] = 0; v0[3] = 0; v1[0] = 1; v1[1] = 0; v1[2] = 0; v1[3] = 1; v2[0] = 1; v2[1] = 0; v2[2] = 1; v2[3] = 2; v3[0] = 0; v3[1] = 0; v3[2] = 1; v3[3] = 3; surface->b = 0; for (c = 0; c < n_points - 1; c++) { surface->c = c; for (a = 0; a < n_points - 1; a++) { surface->a = a; if (a == 0 || surface->triangles == 0) surface->cache_s = FALSE; else static_2d_copy (surface); surface->triangles = 0; static_square (surface, v0, v1, v2, v3); } } } static void static_squares_b1 (static_surface *surface) { int v0[4], v1[4], v2[4], v3[4]; int n_points; int a, c; n_points = surface->n_points; v0[0] = 0; v0[1] = 0; v0[2] = 0; v0[3] = 0; v1[0] = -1; v1[1] = 0; v1[2] = 0; v1[3] = 1; v2[0] = -1; v2[1] = 0; v2[2] = 1; v2[3] = 2; v3[0] = 0; v3[1] = 0; v3[2] = 1; v3[3] = 3; surface->b = n_points - 1; for (c = 0; c < n_points - 1; c++) { surface->c = c; for (a = n_points - 1; a > 0; a--) { surface->a = a; if (a == n_points - 1 || surface->triangles == 0) surface->cache_s = FALSE; else static_2d_copy (surface); surface->triangles = 0; static_square (surface, v0, v1, v2, v3); } } } static void static_squares_c0 (static_surface *surface) { int v0[4], v1[4], v2[4], v3[4]; int n_points; int a, b; n_points = surface->n_points; v0[0] = 0; v0[1] = 0; v0[2] = 0; v0[3] = 0; v1[0] = -1; v1[1] = 0; v1[2] = 0; v1[3] = 1; v2[0] = -1; v2[1] = 1; v2[2] = 0; v2[3] = 2; v3[0] = 0; v3[1] = 1; v3[2] = 0; v3[3] = 3; surface->c = 0; for (b = 0; b < n_points - 1; b++) { surface->b = b; for (a = n_points - 1; a > 0; a--) { surface->a = a; if (a == n_points - 1 || surface->triangles == 0) surface->cache_s = FALSE; else static_2d_copy (surface); surface->triangles = 0; static_square (surface, v0, v1, v2, v3); } } } static void static_squares_c1 (static_surface *surface) { int v0[4], v1[4], v2[4], v3[4]; int n_points; int a, b; n_points = surface->n_points; v0[0] = 0; v0[1] = 0; v0[2] = 0; v0[3] = 0; v1[0] = 1; v1[1] = 0; v1[2] = 0; v1[3] = 1; v2[0] = 1; v2[1] = 1; v2[2] = 0; v2[3] = 2; v3[0] = 0; v3[1] = 1; v3[2] = 0; v3[3] = 3; surface->c = n_points - 1; for (b = 0; b < n_points - 1; b++) { surface->b = b; for (a = 0; a < n_points - 1; a++) { surface->a = a; if (a == 0 || surface->triangles == 0) surface->cache_s = FALSE; else static_2d_copy (surface); surface->triangles = 0; static_square (surface, v0, v1, v2, v3); } } } static void static_realloc (static_surface *surface) { gamgi_orbital *orbital; int *dots; /************************************************** * realloc array to remove spare space in the end * **************************************************/ orbital = surface->orbital; dots = orbital->dots; orbital->n_points = dots[0] + dots[1]; orbital->points = (double *) realloc (orbital->points, orbital->n_points * 3 * sizeof (double)); } static void static_swap (static_surface *surface) { gamgi_orbital *orbital; double *points, *negative, *positive; int *dots; int start, end; char *signal; /********************************************************** * signal is a bit array where 0 means negative triangle, * * and 1 means positive triangle. The disordered array * * looks like 1010111000101 while the ordered array looks * * like 1111111000000, so positive triangles come first. * **********************************************************/ orbital = surface->orbital; dots = orbital->dots; points = orbital->points + 3 * dots[0]; signal = surface->signal; start = 0; end = dots[1] / 3 - 1; while (1 > 0) { /************************************************ * find negative and positive triangles to swap * ************************************************/ while (start < end && GAMGI_ENGINE_BITTEST(signal, start) != 0) start++; while (start < end && GAMGI_ENGINE_BITTEST(signal, end) == 0) end--; if (start >= end) break; /***************************************** * swap negative with positive triangles * *****************************************/ negative = points + 9 * start; positive = points + 9 * end; gamgi_math_vector_swap (negative + 0, positive + 0); gamgi_math_vector_swap (negative + 3, positive + 3); gamgi_math_vector_swap (negative + 6, positive + 6); start++; end--; } /***************************************************************** * start must equal the number of positive triangles, so it must * * point to the first position AFTER all the positive triangles! * *****************************************************************/ if (GAMGI_ENGINE_BITTEST(signal, start) != 0) start++; dots[2] = dots[1] - 3 * start; dots[1] = dots[1] - dots[2]; } static static_surface *static_start (gamgi_orbital *orbital) { static_surface *surface; double constant_r, constant_a, constant_z, za; int n_points, n_bit, n_char; int a, b, c; /*************************** * allocate main structure * ***************************/ surface = (static_surface *) malloc (sizeof (static_surface)); surface->orbital = orbital; /************************* * get orbital constants * **************************/ static_radial (orbital->n, orbital->l, &constant_r, &surface->function_r); static_angular (orbital->l, orbital->m, &constant_a, &surface->function_a); za = orbital->charge / GAMGI_CHEM_A0; surface->ho = 2 * za / orbital->n; constant_z = pow (za, 1.5) * pow (surface->ho, orbital->l); surface->constant = constant_z * constant_r * constant_a; /***************************** * set sampling slices width * *****************************/ surface->slices = orbital->sampling; surface->width = orbital->radius / surface->slices; /************************* * allocate points array * *************************/ orbital->n_points = orbital->dots[0] + GAMGI_CHEM_ORBITAL_SEGMENT; orbital->points = (double *) malloc (orbital->n_points * 3 * sizeof (double)); /********************************************************************** * malloc triangle signal array: 24 = 3 points/triangle x 8 bits/byte * **********************************************************************/ surface->n_signal = GAMGI_CHEM_ORBITAL_SEGMENT / 24; surface->signal = (char *) malloc (surface->n_signal * sizeof (char)); surface->n_signal = 0; surface->signal = NULL; /*********************** * allocate bit arrays * ***********************/ surface->n_points = n_points = 1 + surface->slices; surface->n_bit = n_bit = n_points * n_points * n_points; surface->n_char = n_char = GAMGI_ENGINE_BITNSLOTS(n_bit); surface->above = (char *) malloc (n_char * sizeof (char)); surface->outside = (char *) malloc (n_char * sizeof (char)); /************************* * allocate stack arrays * *************************/ surface->stack_a = (unsigned char *) malloc (n_bit * sizeof (unsigned char)); surface->stack_b = (unsigned char *) malloc (n_bit * sizeof (unsigned char)); surface->stack_c = (unsigned char *) malloc (n_bit * sizeof (unsigned char)); /************************************************************ * Initialize, accumulate, how many times each octant face * * will be rendered. When face = 0 the face does not exist, * * when face = 2 the face is internal and can be ignored, * * when face = 1 the face is external and must be rendered. * ************************************************************/ for (c = 0; c <= 1; c++) { for (b = 0; b <= 1; b++) { for (a = 0; a <= 1; a++) { surface->face_a[a + 0][b][c] = 0; surface->face_a[a + 1][b][c] = 0; surface->face_b[a][b + 0][c] = 0; surface->face_b[a][b + 1][c] = 0; surface->face_c[a][b][c + 0] = 0; surface->face_c[a][b][c + 1] = 0; } } } for (c = 0; c <= 1; c++) { for (b = 0; b <= 1; b++) { for (a = 0; a <= 1; a++) { if (orbital->octants[4 * c + 2 * b + a] == TRUE) { surface->face_a[a + 0][b][c]++; surface->face_a[a + 1][b][c]++; surface->face_b[a][b + 0][c]++; surface->face_b[a][b + 1][c]++; surface->face_c[a][b][c + 0]++; surface->face_c[a][b][c + 1]++; } } } } surface->tetrahedron[ 0] = static_tetrahedron_0000; surface->tetrahedron[ 1] = static_tetrahedron_0001; surface->tetrahedron[ 2] = static_tetrahedron_0010; surface->tetrahedron[ 3] = static_tetrahedron_0011; surface->tetrahedron[ 4] = static_tetrahedron_0100; surface->tetrahedron[ 5] = static_tetrahedron_0101; surface->tetrahedron[ 6] = static_tetrahedron_0110; surface->tetrahedron[ 7] = static_tetrahedron_0111; surface->tetrahedron[ 8] = static_tetrahedron_1000; surface->tetrahedron[ 9] = static_tetrahedron_1001; surface->tetrahedron[10] = static_tetrahedron_1010; surface->tetrahedron[11] = static_tetrahedron_1011; surface->tetrahedron[12] = static_tetrahedron_1100; surface->tetrahedron[13] = static_tetrahedron_1101; surface->tetrahedron[14] = static_tetrahedron_1110; surface->tetrahedron[15] = static_tetrahedron_1111; surface->square[ 0] = static_square_0000; surface->square[ 1] = static_square_0001; surface->square[ 2] = static_square_0010; surface->square[ 3] = static_square_0011; surface->square[ 4] = static_square_0100; surface->square[ 5] = static_square_0101; surface->square[ 6] = static_square_0110; surface->square[ 7] = static_square_0111; surface->square[ 8] = static_square_1000; surface->square[ 9] = static_square_1001; surface->square[10] = static_square_1010; surface->square[11] = static_square_1011; surface->square[12] = static_square_1100; surface->square[13] = static_square_1101; surface->square[14] = static_square_1110; surface->square[15] = static_square_1111; surface->triangle[0] = static_triangle_000; surface->triangle[1] = static_triangle_001; surface->triangle[2] = static_triangle_010; surface->triangle[3] = static_triangle_011; surface->triangle[4] = static_triangle_100; surface->triangle[5] = static_triangle_101; surface->triangle[6] = static_triangle_110; surface->triangle[7] = static_triangle_111; return surface; } static void static_end (static_surface *surface) { free (surface->stack_a); free (surface->stack_b); free (surface->stack_c); free (surface->above); free (surface->outside); free (surface->signal); free (surface); } static int static_solid (gamgi_orbital *orbital) { static_surface *surface; char *outside, *above; int slices, a, b, c; /***************** * allocate data * *****************/ surface = static_start (orbital); /***************** * build octants * *****************/ outside = surface->outside; above = surface->above; slices = surface->slices; for (c = 0; c <= 1; c++) { for (b = 0; b <= 1; b++) { for (a = 0; a <= 1; a++) { if (orbital->octants[4 * c + 2 * b + a] == TRUE) { static_clean (above, surface->n_char); static_above (surface, a, b, c); static_clean (outside, surface->n_char); static_outside (surface, a * slices, b * slices, c * slices); /****************************************** * scan cubes to build orbital 3d surface * ******************************************/ static_cubes (surface); /************************************************************* * scan squares to build octant faces a-, a+, b-, b+, c-, c+ * *************************************************************/ if (surface->face_a[a + 0][b][c] == TRUE) static_squares_a0 (surface); if (surface->face_a[a + 1][b][c] == TRUE) static_squares_a1 (surface); if (surface->face_b[a][b + 0][c] == TRUE) static_squares_b0 (surface); if (surface->face_b[a][b + 1][c] == TRUE) static_squares_b1 (surface); if (surface->face_c[a][b][c + 0] == TRUE) static_squares_c0 (surface); if (surface->face_c[a][b][c + 1] == TRUE) static_squares_c1 (surface); } } } } /***************************************************************** * 1) realloc points array to eliminate spare space at the end, * * 2) swap triangles, so positive triangles come before negative * *****************************************************************/ static_realloc (surface); if (orbital->phase == TRUE) static_swap (surface); /*************** * remove data * ***************/ static_end (surface); return TRUE; } gamgi_bool gamgi_chem_orbital_number (int n, int l, int m) { /************************************************ * accepted range for n [1,6], l [0,5], m[-5,5] * ************************************************/ if (l > n - 1) return FALSE; if (m < -l || m > l) return FALSE; return TRUE; } void gamgi_chem_orbital_m (int l, gamgi_bool *sensitive) { switch (l) { case 0: sensitive[0] = FALSE; sensitive[1] = FALSE; sensitive[2] = FALSE; sensitive[3] = FALSE; sensitive[4] = FALSE; sensitive[6] = FALSE; sensitive[7] = FALSE; sensitive[8] = FALSE; sensitive[9] = FALSE; sensitive[10] = FALSE; break; case 1: sensitive[0] = FALSE; sensitive[1] = FALSE; sensitive[2] = FALSE; sensitive[3] = FALSE; sensitive[4] = TRUE; sensitive[6] = TRUE; sensitive[7] = FALSE; sensitive[8] = FALSE; sensitive[9] = FALSE; sensitive[10] = FALSE; break; case 2: sensitive[0] = FALSE; sensitive[1] = FALSE; sensitive[2] = FALSE; sensitive[3] = TRUE; sensitive[4] = TRUE; sensitive[6] = TRUE; sensitive[7] = TRUE; sensitive[8] = FALSE; sensitive[9] = FALSE; sensitive[10] = FALSE; break; case 3: sensitive[0] = FALSE; sensitive[1] = FALSE; sensitive[2] = TRUE; sensitive[3] = TRUE; sensitive[4] = TRUE; sensitive[6] = TRUE; sensitive[7] = TRUE; sensitive[8] = TRUE; sensitive[9] = FALSE; sensitive[10] = FALSE; break; case 4: sensitive[0] = FALSE; sensitive[1] = TRUE; sensitive[2] = TRUE; sensitive[3] = TRUE; sensitive[4] = TRUE; sensitive[6] = TRUE; sensitive[7] = TRUE; sensitive[8] = TRUE; sensitive[9] = TRUE; sensitive[10] = FALSE; break; case 5: sensitive[0] = TRUE; sensitive[1] = TRUE; sensitive[2] = TRUE; sensitive[3] = TRUE; sensitive[4] = TRUE; sensitive[6] = TRUE; sensitive[7] = TRUE; sensitive[8] = TRUE; sensitive[9] = TRUE; sensitive[10] = TRUE; break; } } void gamgi_chem_orbital_l (int n, gamgi_bool *sensitive) { switch (n) { case 1: sensitive[1] = FALSE; sensitive[2] = FALSE; sensitive[3] = FALSE; sensitive[4] = FALSE; sensitive[5] = FALSE; break; case 2: sensitive[1] = TRUE; sensitive[2] = FALSE; sensitive[3] = FALSE; sensitive[4] = FALSE; sensitive[5] = FALSE; break; case 3: sensitive[1] = TRUE; sensitive[2] = TRUE; sensitive[3] = FALSE; sensitive[4] = FALSE; sensitive[5] = FALSE; break; case 4: sensitive[1] = TRUE; sensitive[2] = TRUE; sensitive[3] = TRUE; sensitive[4] = FALSE; sensitive[5] = FALSE; break; case 5: sensitive[1] = TRUE; sensitive[2] = TRUE; sensitive[3] = TRUE; sensitive[4] = TRUE; sensitive[5] = FALSE; break; case 6: sensitive[1] = TRUE; sensitive[2] = TRUE; sensitive[3] = TRUE; sensitive[4] = TRUE; sensitive[5] = TRUE; break; } } int gamgi_chem_orbital_sampling (int n, int style) { if (style == GAMGI_MESA_WIRED) return GAMGI_CHEM_ORBITAL_POINTS * n; if (style == GAMGI_MESA_SOLID) return GAMGI_CHEM_ORBITAL_SLICES; /***************************************** * control should never reach this point * *****************************************/ return FALSE; } double gamgi_chem_orbital_radius (int n, int l, int m, double charge) { gamgi_radial function_r; gamgi_angular function_a; double za, r, ho, rho, r_max; double constant, constant_a, constant_z, constant_r; double d, d_old, d_old_old; double f; if (n < 1 || n > 6) return 0.0; if (l < 0 || l > n - 1) return 0.0; if (m < -l || m > l) return 0.0; za = charge / GAMGI_CHEM_A0; ho = 2 * za / n; constant_z = pow (za, 1.5) * pow (ho, l); static_radial (n, l, &constant_r, &function_r); static_angular (l, m, &constant_a, &function_a); /*********************************************** * get the last maximum for the radial density * ***********************************************/ r_max = GAMGI_CHEM_ORBITAL_R_MAX; d_old = d_old_old = 0.0; constant = constant_r * constant_z; for (r = 0.0; r < GAMGI_CHEM_ORBITAL_R_MAX; r += GAMGI_CHEM_ORBITAL_R_STEP) { rho = r * ho; f = constant * exp (-rho / 2) * pow (r, l) * (*function_r) (rho); d = f * f * r * r; if (d < d_old && d_old > d_old_old) r_max = r - GAMGI_CHEM_ORBITAL_R_STEP; d_old_old = d_old; d_old = d; } /********************************************** * start checking the default maximum density * * some distance after the last maximum * **********************************************/ r_max += GAMGI_CHEM_ORBITAL_R_SHIFT; /********************************************* * find the radius where the density becomes * * lower than the default maximum density * *********************************************/ constant *= constant_a; for (r = r_max; r < GAMGI_CHEM_ORBITAL_R_MAX; r += GAMGI_CHEM_ORBITAL_R_STEP) { rho = r * ho; f = constant * exp (-rho / 2) * (*function_r) (rho); if (static_density (r, f, function_a) == FALSE) return r; } return GAMGI_CHEM_ORBITAL_R_MAX; } void gamgi_chem_orbital_name (int n0, int l0, int m0, char *token) { char *name[36] = { "s", "py", "pz", "px", "dxy", "dyz", "dz2", "dxz", "dx2_y2", "fy_3x2_y2", "fxyz", "fyz2", "fz3", "fxz2", "fz_x2_y2", "fx_x2_3y2", "gxy_x2_y2", "gzy3", "gz2_xy", "gz3y", "gz4", "gz3x", "gz2_x2_y2", "gzx3", "gx4_y4", "hy5", "hxyz_x2_y2", "hz2y3", "hz3_xy", "hz4y", "hz5", "hz4x", "hz3_x2_y2", "hz2x3", "hz_x4_y4", "hx5"}; int l, m, offset = 0; for (l = 0; l <= 5; l++) { for (m = -l; m <= l; m++) { if (l == l0 && m == m0) { sprintf (token, "%d%s", n0, name[offset]); return; } offset++; } } sprintf (token, "Orbital"); } gamgi_bool gamgi_chem_orbital_create (gamgi_orbital *orbital) { if (orbital->frame == TRUE) orbital->dots[0] = 8; if (orbital->style == GAMGI_MESA_WIRED && static_wired (orbital) == FALSE) return FALSE; if (orbital->style == GAMGI_MESA_SOLID && static_solid (orbital) == FALSE) return FALSE; if (orbital->frame == TRUE) static_frame (orbital); return TRUE; } gamgi-0.17.5/src/chem/gamgi_chem_orbital.h000066400000000000000000000236221433127522700203530ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/chem/gamgi_chem_orbital.h * * Copyright (C); 2012,2013 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * internal functions * ********************** static double static_1s (double r); static double static_2s (double r); static double static_2p (double r); static double static_3s (double r); static double static_3p (double r); static double static_3d (double r); static double static_4s (double r); static double static_4p (double r); static double static_4d (double r); static double static_4f (double r); static double static_5s (double r); static double static_5p (double r); static double static_5d (double r); static double static_5f (double r); static double static_5g (double r); static double static_6s (double r); static double static_6p (double r); static double static_6d (double r); static double static_6f (double r); static double static_6g (double r); static double static_6h (double r); static void static_radial (int n, int l, double *c, gamgi_radial *f); static double static_s (double x, double y, double z, double r); static double static_py (double x, double y, double z, double r); static double static_pz (double x, double y, double z, double r); static double static_px (double x, double y, double z, double r); static double static_dxy (double x, double y, double z, double r); static double static_dyz (double x, double y, double z, double r); static double static_dz2 (double x, double y, double z, double r); static double static_dxz (double x, double y, double z, double r); static double static_dx2_y2 (double x, double y, double z, double r); static double static_fy_3x2_y2 (double x, double y, double z, double r); static double static_fxyz (double x, double y, double z, double r); static double static_fyz2 (double x, double y, double z, double r); static double static_fz3 (double x, double y, double z, double r); static double static_fxz2 (double x, double y, double z, double r); static double static_fz_x2_y2 (double x, double y, double z, double r); static double static_fx_x2_3y2 (double x, double y, double z, double r); static double static_gxy_x2_y2 (double x, double y, double z, double r); static double static_gzy3 (double x, double y, double z, double r); static double static_gz2_xy (double x, double y, double z, double r); static double static_gz3y (double x, double y, double z, double r); static double static_gz4 (double x, double y, double z, double r); static double static_gz3x (double x, double y, double z, double r); static double static_gz2_x2_y2 (double x, double y, double z, double r); static double static_gzx3 (double x, double y, double z, double r); static double static_gx4_y4 (double x, double y, double z, double r); static double static_hy5 (double x, double y, double z, double r); static double static_hxyz_x2_y2 (double x, double y, double z, double r); static double static_hz2y3 (double x, double y, double z, double r); static double static_hz3_xy (double x, double y, double z, double r); static double static_hz4y (double x, double y, double z, double r); static double static_hz5 (double x, double y, double z, double r); static double static_hz4x (double x, double y, double z, double r); static double static_hz3_x2_y2 (double x, double y, double z, double r); static double static_hz2x3 (double x, double y, double z, double r); static double static_hz_x4_y4 (double x, double y, double z, double r); static double static_hx5 (double x, double y, double z, double r); static void static_angular (int l, int m, double *c, gamgi_angular *f); static double static_density (double r, double f, gamgi_angular function_a); static void static_frame (gamgi_orbital *orbital); static gamgi_bool static_wired (gamgi_orbital *orbital); static void static_clean (char *array, int n_char); static int static_offset (int n_points, int a, int b, int c); static void static_above (static_surface *surface, int a, int b, int c); static void static_outside (static_surface *surface, int a, int b, int c); static void static_points (static_surface *surface, double *f1, double *f2, double *f3); static void static_signal (static_surface *surface, int positive); static void static_reset (static_surface *surface); static void static_3d_copy (static_surface *surface); static void static_2d_copy (static_surface *surface); static void static_vertex (static_surface *surface, int *v, double *f); static void static_edge (static_surface *surface, int *v0, int *v1, double *f); static void static_zero (double *f0, double *f1, double *g); static void static_triangle_000 (static_surface *surface, double *f0, double *f1, double *f2); static void static_triangle_001 (static_surface *surface, double *f0, double *f1, double *f2); static void static_triangle_010 (static_surface *surface, double *f0, double *f1, double *f2); static void static_triangle_011 (static_surface *surface, double *f0, double *f1, double *f2); static void static_triangle_100 (static_surface *surface, double *f0, double *f1, double *f2); static void static_triangle_101 (static_surface *surface, double *f0, double *f1, double *f2); static void static_triangle_110 (static_surface *surface, double *f0, double *f1, double *f2); static void static_triangle_111 (static_surface *surface, double *f0, double *f1, double *f2); static void static_triangle (static_surface *surface, double *f1, double *f2, double *f3); static void static_tetrahedron_0000 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_0001 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_0010 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_0011 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_0100 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_0101 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_0110 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_0111 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_1000 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_1001 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_1010 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_1011 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_1100 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_1101 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_1110 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron_1111 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_tetrahedron (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_cubes (static_surface *surface); static void static_square_0000 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_0001 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_0010 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_0011 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_0100 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_0101 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_0110 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_0111 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_1000 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_1001 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_1010 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_1011 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_1100 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_1101 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_1110 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square_1111 (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_square (static_surface *surface, int *v0, int *v1, int *v2, int *v3); static void static_squares_a0 (static_surface *surface); static void static_squares_a1 (static_surface *surface); static void static_squares_b0 (static_surface *surface); static void static_squares_b1 (static_surface *surface); static void static_squares_c0 (static_surface *surface); static void static_squares_c1 (static_surface *surface); static void static_realloc (static_surface *surface); static void static_swap (static_surface *surface); static static_surface *static_start (gamgi_orbital *orbital); static void static_end (static_surface *surface); static int static_solid (gamgi_orbital *orbital); ********************** * external functions * **********************/ gamgi_bool gamgi_chem_orbital_number (int n, int l, int m); void gamgi_chem_orbital_m (int l, gamgi_bool *sensitive); void gamgi_chem_orbital_l (int n, gamgi_bool *sensitive); int gamgi_chem_orbital_sampling (int n, int style); double gamgi_chem_orbital_radius (int n, int l, int m, double charge); void gamgi_chem_orbital_name (int n0, int l0, int m0, char *token); gamgi_bool gamgi_chem_orbital_create (gamgi_orbital *orbital); /************* * Rationale * ************* Implemented wired and solid models. Jun 2013. ************* * Rationale * *************/ gamgi-0.17.5/src/chem/gamgi_chem_polytope.c000066400000000000000000003552251433127522700205740ustar00rootroot00000000000000/****************************************** * * $GAMGI/src/chem/gamgi_chem_polytope.c * * Copyright (C) 2009 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /***************************************************** * Bibliography * * * * Rourke J., Computational Geometry in C, * * Cambridge University Press (1998) * * * * Berg M., Kreveld M., Overmars M., Schwarzkopf O., * * Computational Geometry, Springer Verlag (2000) * *****************************************************/ #include #include "gamgi_engine.h" #include "gamgi_gtk.h" #include "gamgi_mesa.h" #include "gamgi_math.h" #include "gamgi_chem.h" #include "gamgi_global.h" #include "gamgi_engine_create.h" #include "gamgi_engine_start.h" #include "gamgi_engine_copy.h" #include "gamgi_engine_link.h" #include "gamgi_engine_unlink.h" #include "gamgi_engine_list.h" #include "gamgi_engine_remove.h" #include "gamgi_gtk_dialog.h" #include "gamgi_math_vector.h" #include "gamgi_math_matrix.h" #include "gamgi_math_position.h" #include "gamgi_chem_atom.h" #include "gamgi_phys_direction.h" #include "gamgi_phys_plane.h" /******************************************************* * To support the initial tetrahedron, the start size * * for arrays faces, edges and face should be at least * * 4, 6, and 10. All the other start sizes can be 0. * *******************************************************/ #define STATIC_FACES_START 20 #define STATIC_FACES_STEP 5 #define STATIC_EDGES_START 20 #define STATIC_EDGES_STEP 5 #define STATIC_VERTICES_START 20 #define STATIC_VERTICES_STEP 5 #define STATIC_FACE_START 20 #define STATIC_FACE_STEP 5 #define STATIC_VERTEX_START 20 #define STATIC_VERTEX_STEP 5 #define STATIC_LOOPS_START 20 #define STATIC_LOOPS_STEP 5 enum { STATIC_USE = 1, STATIC_KEEP, STATIC_MODIFY, STATIC_REMOVE }; typedef struct _static_face { gamgi_enum state; int id; int n_edges; int *edges; int n_conflicts; int *conflicts; double center[3]; double normal[3]; double area; double length; } static_face; typedef struct _static_edge { gamgi_enum state; int f_start; int f_end; int v_start; int v_end; double length; } static_edge; typedef struct _static_vertex { int id; int n_edges; int edge; int n_conflicts; int *conflicts; } static_vertex; typedef struct _static_polytope { gamgi_object *parent; gamgi_dlist *atoms; int n_atoms; gamgi_slist **cells; double width_x, width_y, width_z; int n_cells; double max; gamgi_group *group; gamgi_atom *atom; gamgi_bool global, color; gamgi_enum structure; double visible, coplanar; int element, number; /********************************************* * arrays format * * * * int **vertices: vertex 1 ... vertex n * * * * int **edges: edge 1 ... edge n * * * * int **faces: face 1 ... face n * * * * int *vertex->conflicts: array size, * * face 1, offset 1 ... face n, offset n * * * * int *face->conflicts: array size, * * vertex 1, offset 1 ... vertex n, offset n * * * * int *face->edges: array size, * * edge 1 ... edge n * *********************************************/ static_vertex **vertices; int n_vertices; static_edge **edges; int n_edges; static_face **faces; int n_faces; /******************************************* * unique identifier to retrieve conflicts * *******************************************/ int id; /******************************************** * n_vertices = total number of positions * * in arrays vertices, neighbours, distance * * * * n_neighbours = used number of positions * * in arrays vertices, neighbours, distance * * * * neighbours = array with neighbour atoms * * * * distance = array with distances from * * neighbours to central atom * *******************************************/ int n_neighbours; gamgi_atom **neighbours; double *distance; double center[3]; double volume; } static_polytope; static void static_atom (gamgi_atom *atom, static_polytope *polytope) { gamgi_object *parent; /************************ * set new central atom * ************************/ polytope->atom = atom; /******************************************************* * get new central atom parent: it must be at least a * * Group, so it must be above Plane, Direction objects * *******************************************************/ parent = polytope->atom->object.object; if (parent->class == GAMGI_ENGINE_DIRECTION) parent = parent->object; if (parent->class == GAMGI_ENGINE_PLANE) parent = parent->object; polytope->parent = parent; /*********************************************************** * When color is set by users or by the neighbour element, * * color is known in advance. When color is set by the * * central atom, use each central atom color: this is not * * necessarily the central atom default element color! * ***********************************************************/ if (polytope->color == FALSE) { polytope->group->red = atom->red; polytope->group->green = atom->green; polytope->group->blue = atom->blue; } } static int *static_export_points (gamgi_group *group, static_polytope *polytope) { gamgi_atom **neighbours; gamgi_atom *atom; static_vertex **vertices; static_vertex *vertex; double *points; int *index; int n_neighbours; int n, i; vertices = polytope->vertices; n_neighbours = polytope->n_neighbours; neighbours = polytope->neighbours; /****************************************** * build the index array to redirect the * * used vertices to their final positions * ******************************************/ n = 0; index = (int *) malloc (n_neighbours * sizeof (int)); for (i = 0; i < n_neighbours; i++) { vertex = vertices[i]; if (vertex->n_edges > 0) index[i] = n++; } /******************************************** * build the points array that will contain * * the positions of all the vertices of the * * polyhedron contained in the group object * ********************************************/ group->n_points = n; points = (double *) malloc (3 * n * sizeof (double)); group->points = points; for (i = 0; i < n_neighbours; i++) { vertex = vertices[i]; if (vertex->n_edges > 0) { /***************** * save vertices * *****************/ n = index[i]; atom = neighbours[i]; points[3 * n + 0] = atom->position[0]; points[3 * n + 1] = atom->position[1]; points[3 * n + 2] = atom->position[2]; /******************** * calculate center * ********************/ gamgi_math_vector_add (group->center, atom->position, group->center); } } /******************** * calculate center * ********************/ if (group->n_points > 0) gamgi_math_vector_scale (group->center, group->center, 1.0 / group->n_points); return index; } static void static_export_loops (int *index, gamgi_group *group, static_polytope *polytope) { static_face *face; static_edge *edge; int *loops, *edges; int v, e; int total, offset; int n_faces, n_loops; int i, j; n_faces = polytope->n_faces; n_loops = STATIC_LOOPS_START; loops = (int *) malloc (n_loops * sizeof (int)); loops[0] = 0; total = 1; offset = 1; for (i = 0; i < n_faces; i++) { /******************** * find valid faces * ********************/ face = polytope->faces[i]; if (face->state != STATIC_KEEP) continue; edges = face->edges; loops[0]++; /********************************** * if needed increase loops array * **********************************/ if (++total > n_loops) { n_loops += STATIC_LOOPS_STEP; loops = (int *) realloc (loops, n_loops * sizeof (int)); } loops[offset] = 0; for (j = 1; j <= face->n_edges; j++) { e = edges[j]; edge = polytope->edges[e]; /********************************************** * edge vertices are properly orientated for * * face f_start, for face f_end reverse order * **********************************************/ if (edge->f_start == i) v = edge->v_start; else v = edge->v_end; /**************************************************** * redirect valid vertices to final array positions * ****************************************************/ v = index[v]; /********************************** * if needed increase loops array * **********************************/ if (++total > n_loops) { n_loops += STATIC_LOOPS_STEP; loops = (int *) realloc (loops, n_loops * sizeof (int)); } loops[offset]++; loops[offset + loops[offset]] = v; } offset += loops[offset] + 1; } /********************************** * set final size for loops array * **********************************/ group->n_loops = total; group->loops = (int *) realloc (loops, total * sizeof (int)); } static void static_export (static_polytope *polytope) { gamgi_group *group; gamgi_atom *atom; double unit[9], rotation[9]; double zero[3], translation[3]; int *index; int i; /********************************************* * create container group and link to parent * *********************************************/ if (polytope->global == TRUE) group = gamgi_engine_copy_group (polytope->group); else group = polytope->group; if (group->object.object == NULL) gamgi_engine_link_object_object (GAMGI_CAST_OBJECT group, polytope->parent); /********************************** * start position and orientation * **********************************/ gamgi_math_vector_zero (zero); gamgi_math_position_group_rotation_set (group, zero); gamgi_math_position_group_translation_set (group, zero); gamgi_math_position_rotation (group->object.object, rotation); gamgi_math_position_translation (group->object.object, translation); gamgi_math_vector_zero (zero); gamgi_math_matrix_unit (unit); gamgi_math_position_object_rotation (group->object.object, unit); gamgi_math_position_object_translation (group->object.object, zero); /********************************************* * copy data and export points, loops arrays * *********************************************/ index = static_export_points (group, polytope); static_export_loops (index, group, polytope); free (index); /************************************************** * structure policy: * * COPY: copy neighbour atoms and bonds (default) * * LINK: unlink neighbour atoms and link to group * * NONE: group has no atoms and bonds * **************************************************/ if (polytope->structure == GAMGI_CHEM_STRUCTURE_COPY) { /********************************************** * copy central, neighbour atoms to group * * * * clean bonds in central and neighbour atoms * **********************************************/ atom = gamgi_engine_copy_atom (polytope->atom); gamgi_engine_link_atom_group (atom, group); for (i = 0; i < polytope->n_neighbours; i++) { atom = gamgi_engine_copy_atom (polytope->neighbours[i]); gamgi_engine_link_atom_group (atom, group); } gamgi_chem_atom_clean (polytope->atom); for (i = 0; i < polytope->n_neighbours; i++) gamgi_chem_atom_clean (polytope->neighbours[i]); } if (polytope->structure == GAMGI_CHEM_STRUCTURE_LINK) { /****************************************** * link central, neighbour atoms to group * ******************************************/ gamgi_engine_unlink_atom (polytope->atom); gamgi_engine_link_atom_group (polytope->atom, group); for (i = 0; i < polytope->n_neighbours; i++) { gamgi_engine_unlink_atom (polytope->neighbours[i]); gamgi_engine_link_atom_group (polytope->neighbours[i], group); } } /******************************************** * restore position, orientation for parent * * object, including group already linked * ********************************************/ gamgi_math_position_object_rotation (group->object.object, rotation); gamgi_math_position_object_translation (group->object.object, translation); } static int static_dot (int v1, int v2, double tolerance, static_polytope *polytope) { gamgi_atom **neighbours; gamgi_atom *atom1, *atom2; double u[3]; double dot; neighbours = polytope->neighbours; atom1 = neighbours[v1]; atom2 = neighbours[v2]; gamgi_math_vector_sub (atom2->position, atom1->position, u); dot = gamgi_math_vector_dot (u, u); if (dot > tolerance) return 1; return 0; } static int static_cross (int v1, int v2, int v3, double tolerance, static_polytope *polytope) { gamgi_atom **neighbours; gamgi_atom *atom1, *atom2, *atom3; double u[3], v[3], w[3]; double dot; neighbours = polytope->neighbours; atom1 = neighbours[v1]; atom2 = neighbours[v2]; atom3 = neighbours[v3]; gamgi_math_vector_sub (atom2->position, atom1->position, u); gamgi_math_vector_sub (atom3->position, atom1->position, v); gamgi_math_vector_cross (u, v, w); dot = gamgi_math_vector_dot (w, w); if (dot > tolerance) return 1; return 0; } static int static_mix (int v1, int v2, int v3, int v4, double tolerance, static_polytope *polytope) { gamgi_atom **neighbours; gamgi_atom *atom1, *atom2, *atom3, *atom4; double u[3], v[3], w[3]; double mix; neighbours = polytope->neighbours; atom1 = neighbours[v1]; atom2 = neighbours[v2]; atom3 = neighbours[v3]; atom4 = neighbours[v4]; gamgi_math_vector_sub (atom2->position, atom1->position, u); gamgi_math_vector_sub (atom3->position, atom1->position, v); gamgi_math_vector_sub (atom4->position, atom1->position, w); mix = gamgi_math_vector_mix (u, v, w); if (mix > tolerance) return 1; if (mix < -tolerance) return -1; return 0; } static int static_conflict_face_increase (int f, static_polytope *polytope) { static_face *face; int *conflicts; int start, i; face = polytope->faces[f]; conflicts = face->conflicts; /***************************************** * look for a old face conflict position * *****************************************/ start = 1 + 2 * face->n_conflicts; if (start < conflicts[0] - 1) return start; /******************************************* * if that is not available increase array * *******************************************/ conflicts[0] += STATIC_FACE_STEP; conflicts = (int *) realloc (conflicts, conflicts[0] * sizeof (int)); face->conflicts = conflicts; for (i = start; i < conflicts[0]; i++) conflicts[i] = -1; return start; } static int static_conflict_vertex_increase (int v, static_polytope *polytope) { static_vertex *vertex; int *conflicts; int i, j; /****************************************** * look for a old face conflict position * ******************************************/ vertex = polytope->vertices[v]; conflicts = vertex->conflicts; for (i = 1; i < conflicts[0] - 1; i+= 2) if (conflicts[i] < 0) return i; /********************************************************** * if that is not available increase and initialize array * **********************************************************/ conflicts[0] += STATIC_VERTEX_STEP; conflicts = (int *) realloc (conflicts, conflicts[0] * sizeof (int)); vertex->conflicts = conflicts; for (j = i; j < conflicts[0]; j++) conflicts[j] = -1; return i; } static int static_conflict_find (int v1, int v2, int v3, int v, int f, static_polytope *polytope) { static_face *face; static_vertex *vertex; int offset_f, offset_v; int mix; /*************************************************** * v1, v2, v3 must be orientated counter-clockwise * * when seen from the outside of the polytope! * ***************************************************/ mix = static_mix (v1, v2, v3, v, polytope->visible, polytope); if (mix > 0) { /************************************************* * vertex v is visible: add to list of conflicts * *************************************************/ offset_v = static_conflict_vertex_increase (v, polytope); offset_f = static_conflict_face_increase (f, polytope); face = polytope->faces[f]; face->conflicts[offset_f + 0] = v; face->conflicts[offset_f + 1] = offset_v; face->n_conflicts++; vertex = polytope->vertices[v]; vertex->conflicts[offset_v + 0] = f; vertex->conflicts[offset_v + 1] = offset_f; vertex->n_conflicts++; return 1; } return 0; } static int static_conflict_retrieve (int f, int f_old, int v_start, int v_end, int v_new, static_polytope *polytope) { static_face *face_old; static_vertex *vertex; int *conflicts; int n_conflicts; int i, v; n_conflicts = 0; face_old = polytope->faces[f_old]; conflicts = face_old->conflicts; for (i = 1; i < conflicts[0] - 1; i += 2) { v = conflicts[i]; if (v < 0) continue; vertex = polytope->vertices[v]; if (vertex->id == polytope->id) continue; /*************************************************************** * vertices v_end, v_start, v_new must be orientated * * counter-clockwise when seen from the outside. As v_start, * * v_end are orientated for the first face (face hidden), they * * must be reversed for the second face (face new). The third * * vertex (the new vertex) of this triangular face comes next. * ***************************************************************/ n_conflicts += static_conflict_find (v_end, v_start, v_new, v, f, polytope); vertex = polytope->vertices[v]; vertex->id = polytope->id; } return n_conflicts; } static int static_conflict_recreate (int f, int e, int v, static_polytope *polytope) { static_edge *edge; static_vertex *vertex; int f_start, f_end; int v_start, v_end; int n_conflicts; int i; edge = polytope->edges[e]; /************************************************ * vertex conflicts to new face must come from * * vertex conflicts with faces adjacent to edge * ************************************************/ f_start = edge->f_start; f_end = edge->f_end; v_start = edge->v_start; v_end = edge->v_end; /************************************************************************ * Vertices that conflict with the new face must see the visible edge * * so they neccessarily saw one of the faces previously separated by * * the visible edge. Therefore the conflicts for the new face must * * be found among the conflicts for the two faces previously bordering * * the edge. Sometimes, the same conflict for the new face can be found * * simultaneously from both bordering faces, so the same conflict is * * wrongly listed twice in the list of conflicts of the new face. To * * avoid wasting time, this duplication is handled only when the new * * face is removed by this vertex or any another vertex before. * ************************************************************************/ n_conflicts = 0; n_conflicts += static_conflict_retrieve (f, f_start, v_start, v_end, v, polytope); n_conflicts += static_conflict_retrieve (f, f_end, v_start, v_end, v, polytope); /************************************************************ * The same face can be reported twice in the conflict * * list, if new vertex v was in the conflict list of both * * faces previously bordering visible edge e! So, each * * new face f has a unique id to retrieve old conflicts * * * * reset the id counter when the maximum value is reached, * * and clean future vertices, to avoid possible conflicts * ************************************************************/ if (polytope->id == INT_MAX) { polytope->id = 0; for (i = v; i < polytope->n_neighbours; i++) { vertex = polytope->vertices[i]; vertex->id = -1; } } else polytope->id += 1; return n_conflicts; } static int static_conflict_create (int v1, int v2, int v3, int f, static_polytope *polytope) { int n_neighbours, n_conflicts; int i; n_conflicts = 0; n_neighbours = polytope->n_neighbours; for (i = 4; i < n_neighbours; i++) { /************************************************* * vertices v1, v2, v3 must be orientated * * counter-clockwise when seen from the outside. * *************************************************/ n_conflicts += static_conflict_find (v1, v2, v3, i, f, polytope); } return n_conflicts; } static void static_edge_start (int e, static_polytope *polytope) { static_edge *edge; /************************** * reset edge information * **************************/ edge = polytope->edges[e]; edge->state = STATIC_USE; } static static_edge *static_edge_create (int e, static_polytope *polytope) { static_edge *edge; /**************************************** * create edge structure and initialize * ****************************************/ edge = (static_edge *) malloc (sizeof (static_edge)); polytope->edges[e] = edge; static_edge_start (e, polytope); return edge; } static void static_edge_remove (int e, static_polytope *polytope) { static_edge *edge; static_vertex *vertex; int v; edge = polytope->edges[e]; /********************************************************* * for both vertices decrease counting (number of edges) * *********************************************************/ v = edge->v_start; vertex = polytope->vertices[v]; vertex->n_edges--; v = edge->v_end; vertex = polytope->vertices[v]; vertex->n_edges--; /***************************************************** * this edge is no longer in use and can be recycled * *****************************************************/ static_edge_start (e, polytope); } static void static_edges_mark (int v_new, static_polytope *polytope) { static_face *face_start, *face_end, *face_visible; static_edge *edge_visible; static_vertex *vertex_new; int *conflicts, *edges; int f_start, f_end, f_visible, e_visible; int i, j; /***************************************************************** * use the vertex conflict data to scan all the visible faces, * * to get all the edges that are susceptible of changes, without * * scanning the whole set of edges * * * * the edges in visible faces are either in the boundary of the * * visible region (only one face is visible), forming new faces * * with the new vertex, or are inside the visible region (both * * faces are visible), and must be removed. * *****************************************************************/ vertex_new = polytope->vertices[v_new]; conflicts = vertex_new->conflicts; for (i = 1; i < conflicts[0] - 1; i += 2) { f_visible = conflicts[i]; if (f_visible < 0) continue; face_visible = polytope->faces[f_visible]; edges = face_visible->edges; /******************** * triangular faces * ********************/ for (j = 1; j <= 3; j++) { e_visible = edges[j]; edge_visible = polytope->edges[e_visible]; f_start = edge_visible->f_start; face_start = polytope->faces[f_start]; f_end = edge_visible->f_end; face_end = polytope->faces[f_end]; edge_visible->state = STATIC_MODIFY; if (face_start->state == STATIC_REMOVE && face_end->state == STATIC_REMOVE) edge_visible->state = STATIC_REMOVE; } } } static int static_edges_increase (static_polytope *polytope) { static_edge **edges; static_edge *edge; int n_edges, i, j; edges = polytope->edges; n_edges = polytope->n_edges; for (i = 0; i < n_edges; i++) { /************************* * reuse old edges array * *************************/ edge = edges[i]; if (edge->state == STATIC_USE) { edge->state = STATIC_KEEP; return i; } } /************************ * increase edges array * ************************/ n_edges += STATIC_EDGES_STEP; polytope->n_edges = n_edges; edges = (static_edge **) realloc (edges, n_edges * sizeof (static_edge *)); polytope->edges = edges; for (j = i; j < n_edges; j++) edges[j] = static_edge_create (j, polytope); edge = edges[i]; edge->state = STATIC_KEEP; return i; } static void static_edges_clean (int v_new, static_polytope *polytope) { static_face *face_visible; static_edge *edge_visible; static_vertex *vertex_new; int *conflicts, *edges; int f_visible, e_visible; int i, j; /******************************************************************* * use the vertex conflict data to remove all doubly visible edges * *******************************************************************/ vertex_new = polytope->vertices[v_new]; conflicts = vertex_new->conflicts; for (i = 1; i < conflicts[0] - 1; i += 2) { f_visible = conflicts[i]; if (f_visible < 0) continue; face_visible = polytope->faces[f_visible]; edges = face_visible->edges; /******************** * triangular faces * ********************/ for (j = 1; j <= 3; j++) { e_visible = edges[j]; edge_visible = polytope->edges[e_visible]; if (edge_visible->state == STATIC_REMOVE) static_edge_remove (e_visible, polytope); if (edge_visible->state == STATIC_MODIFY) edge_visible->state = STATIC_KEEP; } } } static void static_face_start (int f, static_polytope *polytope) { static_face *face; int *conflicts, *edges; int i; face = polytope->faces[f]; /************************** * reset face information * **************************/ face->state = STATIC_USE; face->n_conflicts = 0; face->n_edges = 0; face->id = f; conflicts = face->conflicts; for (i = 1; i < conflicts[0]; i++) conflicts[i] = -1; edges = face->edges; for (i = 1; i < edges[0]; i++) edges[i] = -1; } static static_face *static_face_create (int f, static_polytope *polytope) { static_face *face; int *conflicts, *edges; int total; /**************************************** * create and initialize face structure * ****************************************/ face = (static_face *) malloc (sizeof (static_face)); polytope->faces[f] = face; total = STATIC_FACE_START; conflicts = (int *) malloc (total * sizeof (int)); conflicts[0] = total; face->conflicts = conflicts; total = STATIC_FACE_START; edges = (int *) malloc (total * sizeof (int)); edges[0] = total; face->edges = edges; static_face_start (f, polytope); return face; } static int static_face_increase (int f, static_polytope *polytope) { static_face *face; int *edges; int i, start; face = polytope->faces[f]; edges = face->edges; /*********************************** * use available edge if it exists * ***********************************/ start = face->n_edges + 1; if (start < edges[0]) return start; /********************************************************** * if that is not available increase and initialize array * **********************************************************/ start = edges[0]; edges[0] += STATIC_FACE_STEP; edges = (int *) realloc (edges, edges[0] * sizeof (int)); face->edges = edges; for (i = start; i < edges[0]; i++) edges[i] = -1; return start; } static void static_face_remove (int f, static_polytope *polytope) { static_face *face; static_vertex *vertex; int *conflicts_v, *conflicts_f; int n_conflicts; int v, i, offset; /****************************************** * remove all conflicts for this face * * from vertices before removing the face * ******************************************/ face = polytope->faces[f]; conflicts_f = face->conflicts; n_conflicts = face->n_conflicts; for (i = 0; i < n_conflicts; i++) { v = conflicts_f[1 + 2 * i + 0]; offset = conflicts_f[1 + 2 * i + 1]; vertex = polytope->vertices[v]; conflicts_v = vertex->conflicts; conflicts_v[offset] = -1; conflicts_v[offset + 1] = -1; vertex->n_conflicts--; } /***************************************************** * this face is no longer in use and can be recycled * *****************************************************/ static_face_start (f, polytope); } static void static_faces_mark (int v_new, static_polytope *polytope) { static_face *face_visible; static_vertex *vertex_new; int *conflicts; int f_visible; int i; /******************************************* * signal all faces that should be removed * *******************************************/ vertex_new = polytope->vertices[v_new]; conflicts = vertex_new->conflicts; for (i = 1; i < conflicts[0] - 1; i += 2) { f_visible = conflicts[i]; if (f_visible < 0) continue; face_visible = polytope->faces[f_visible]; face_visible->state = STATIC_REMOVE; } } static int static_faces_increase (static_polytope *polytope) { static_face **faces; static_face *face; int n_faces; int i, j; faces = polytope->faces; n_faces = polytope->n_faces; for (i = 0; i < n_faces; i++) { /************************* * reuse old faces array * *************************/ face = faces[i]; if (face->state == STATIC_USE) { face->state = STATIC_KEEP; return i; } } /************************ * increase faces array * ************************/ n_faces += STATIC_FACES_STEP; polytope->n_faces = n_faces; faces = (static_face **) realloc (faces, n_faces * sizeof (static_face *)); polytope->faces = faces; for (j = i; j < n_faces; j++) faces[j] = static_face_create (j, polytope); face = faces[i]; face->state = STATIC_KEEP; return i; } static void static_face_merge (int f, int v1, int v2, int v3, int e, static_polytope *polytope) { static_face *face, *face_start, *face_end, *face_new; static_edge *edge; int f_start, f_end, f_new; int id_start, id_end; int e1, e2, e3, e_right, e_left; int v4; int offset; edge = polytope->edges[e]; /**************************************************** * id identifies the new enlarged face that owns * * this triangle that initially was a triangle face * ****************************************************/ f_start = edge->f_start; face_start = polytope->faces[f_start]; id_start = face_start->id; f_end = edge->f_end; face_end = polytope->faces[f_end]; id_end = face_end->id; if (id_start != f) { f_new = f_start; edge->f_end = f; } else if (id_end != f) { f_new = f_end; edge->f_start = f; } else { /*************************************************** * if id_start = id_end = f then we reached again * * the merging face: stop the scan and remove edge * ***************************************************/ static_edge_remove (e, polytope); return; } /*************************************************** * when the new face has already been handled stop * * the scan and add edge to face f list of edges * ***************************************************/ face_new = polytope->faces[f_new]; if (face_new->id < f) { offset = static_face_increase (f, polytope); face = polytope->faces[f]; face->edges[offset] = e; face->n_edges++; return; } /********************************************************** * get e_right, e_left edges, making sure these edges are * * orientated to the right and to the left, respectively * **********************************************************/ e1 = face_new->edges[1]; e2 = face_new->edges[2]; e3 = face_new->edges[3]; e_right = e2; e_left = e3; if (e == e2) { e_right = e3; e_left = e1; } else if (e == e3) { e_right = e1; e_left = e2; } /************************************************** * make sure vertex v4 is different from vertices * * v1, v2, v3, defining the central face, as edge * * e can be a border of the central face * **************************************************/ edge = polytope->edges[e_right]; if (edge->f_start == f_new) v4 = edge->v_end; else v4 = edge->v_start; /********************************************** * when the new face is not coplanar stop the * * scan and add edge to face f list of edges * **********************************************/ if (static_mix (v1, v2, v3, v4, polytope->coplanar, polytope) != 0) { offset = static_face_increase (f, polytope); face = polytope->faces[f]; face->edges[offset] = e; face->n_edges++; return; } /************************************* * this is a coplanar face: remove * * edge and merge with previous face * *************************************/ static_edge_remove (e, polytope); face_new->state = STATIC_REMOVE; face_new->id = f; /*********************************************************************** * recursively scan adjacent faces, first right, then left, so in the * * end face f edges will be automatically orientated counter-clockwise * ***********************************************************************/ static_face_merge (f, v1, v2, v3, e_right, polytope); static_face_merge (f, v1, v2, v3, e_left, polytope); } static void static_faces_merge (static_polytope *polytope) { static_face *face; static_edge *edge; int e1, e2, e3; int v1, v2, v3; int i; for (i = 0; i < polytope->n_faces; i++) { /************************************************************* * skip faces with new ids as these have been already merged * *************************************************************/ face = polytope->faces[i]; if (face->state != STATIC_KEEP) continue; /***************************************************** * reset number of edges and save current edges * * as face->edges will be rewritten during the merge * *****************************************************/ face->n_edges = 0; e1 = face->edges[1]; e2 = face->edges[2]; e3 = face->edges[3]; /***************************************************** * get vertices v1, v2, v3: the vertices orientation * * is not relevant because the aim is only to check * * if the vertices of old and new face are coplanar * *****************************************************/ edge = polytope->edges[e1]; v1 = edge->v_start; v2 = edge->v_end; edge = polytope->edges[e2]; if (edge->f_start == i) v3 = edge->v_end; else v3 = edge->v_start; /*********************************************** * scan adjacent faces, first right, then left * ***********************************************/ static_face_merge (i, v1, v2, v3, e1, polytope); static_face_merge (i, v1, v2, v3, e2, polytope); static_face_merge (i, v1, v2, v3, e3, polytope); } } static void static_faces_clean (int v_new, static_polytope *polytope) { static_vertex *vertex_new; int *conflicts; int f_visible, i; /************************************************************ * use the vertex conflict data to remove all visible faces * ************************************************************/ vertex_new = polytope->vertices[v_new]; conflicts = vertex_new->conflicts; for (i = 1; i < conflicts[0] - 1; i += 2) { f_visible = conflicts[i]; if (f_visible < 0) continue; static_face_remove (f_visible, polytope); } } static void static_face_build (int v_new, int e_visible, static_polytope *polytope) { static_face *face_new; static_edge *edge_visible, *edge_start, *edge_end; static_vertex *vertex_start, *vertex_end, *vertex_new; int *edges; int f_new; int e_start, e_end; int v_start, v_end; edge_visible = polytope->edges[e_visible]; v_start = edge_visible->v_start; v_end = edge_visible->v_end; vertex_new = polytope->vertices[v_new]; vertex_start = polytope->vertices[v_start]; vertex_end = polytope->vertices[v_end]; /****************************************************** * Create new face, with 3 vertices and 3 edges, * * counter-clockwise: for each edge, the vertices are * * orientated counter-clockwise for the first face, * * for the second face the vertices must be reversed * ******************************************************/ f_new = static_faces_increase (polytope); static_conflict_recreate (f_new, e_visible, v_new, polytope); face_new = polytope->faces[f_new]; face_new->n_edges = 3; edges = face_new->edges; edges[1] = e_visible; edge_visible->f_end = f_new; if (vertex_start->edge < 0) { /****************************************************** * create new edge, pointing to edges before and next * ******************************************************/ e_start = static_edges_increase (polytope); edge_start = polytope->edges[e_start]; edges[2] = e_start; edge_start->f_start = f_new; edge_start->f_end = -1; edge_start->v_start = v_start; edge_start->v_end = v_new; /************************************************** * increase vertex counting (its number of edges) * **************************************************/ vertex_start->n_edges++; vertex_new->n_edges++; /**************************** * point vertex to new edge * ****************************/ vertex_start->edge = e_start; } else { /*************************** * the edge already exists * ***************************/ e_start = vertex_start->edge; edge_start = polytope->edges[e_start]; edges[2] = e_start; edge_start->f_end = f_new; /****************************** * reset vertex edge pointing * ******************************/ vertex_start->edge = -1; } if (vertex_end->edge < 0) { /****************************************************** * create new edge, pointing to edges before and next * ******************************************************/ e_end = static_edges_increase (polytope); edge_end = polytope->edges[e_end]; edges[3] = e_end; edge_end->f_start = f_new; edge_end->f_end = -1; edge_end->v_start = v_new; edge_end->v_end = v_end; /************************************************** * increase vertex counting (its number of edges) * **************************************************/ vertex_new->n_edges++; vertex_end->n_edges++; /**************************** * point vertex to new edge * ****************************/ vertex_end->edge = e_end; } else { /*************************** * the edge already exists * ***************************/ e_end = vertex_end->edge; edge_end = polytope->edges[e_end]; edges[3] = e_end; edge_end->f_end = f_new; /****************************** * reset vertex edge pointing * ******************************/ vertex_end->edge = -1; } } static void static_vertex_build (int v_new, static_polytope *polytope) { static_face *face_visible, *face_edge; static_edge *edge_visible; static_vertex *vertex_new; int *conflicts, *edges; int e_visible, f_visible, f_edge; int i, j, aux; /***************************************************** * mark visible faces first, then mark visible edges * * * * initially the state of faces and edges is KEEP, * * then visible faces change to MODIFY, and visible * * edges change to MODIFY (when one face is visible) * * or to REMOVE (when both faces are visible) * *****************************************************/ static_faces_mark (v_new, polytope); static_edges_mark (v_new, polytope); /***************************************************************** * use again the vertex conflict data to scan all the * * visible faces, to get all the edges that are susceptible * * of changes, without scanning the whole set of edges * * * * build a new face for each edge in the boundary of the visible * * region (only one face is visible), linking its two vertices * * with the new vertex, and creating the needed edges * *****************************************************************/ vertex_new = polytope->vertices[v_new]; conflicts = vertex_new->conflicts; for (i = 1; i < conflicts[0] - 1; i += 2) { f_visible = conflicts[i]; if (f_visible < 0) continue; face_visible = polytope->faces[f_visible]; edges = face_visible->edges; for (j = 1; j <= 3; j++) { e_visible = edges[j]; /************************************************ * either both faces are visible, and the edge * * will be removed in the end, or one face is * * visible, and the second face must be created * ************************************************/ edge_visible = polytope->edges[e_visible]; if (edge_visible->state == STATIC_REMOVE) continue; /******************************************* * this edge belongs to the border curve * * (the horizon) of the visible region * * * * edge format: vertices v_start v_end are * * orientated counter-clockwise for face * * f_start (and clockwise for f_end) * *******************************************/ f_edge = edge_visible->f_start; face_edge = polytope->faces[f_edge]; if (face_edge->state == STATIC_REMOVE) { /************************************************************ * The face that survives, face_hidden, should be first * * and vertices should be ordered according to face_hidden. * * When face_hidden is not first, swap faces and vertices. * ************************************************************/ aux = edge_visible->f_start; edge_visible->f_start = edge_visible->f_end; edge_visible->f_end = aux; aux = edge_visible->v_start; edge_visible->v_start = edge_visible->v_end; edge_visible->v_end = aux; } /************************************************************* * create new face, joining e_visible edge with v_new vertex * *************************************************************/ static_face_build (v_new, e_visible, polytope); } } static_edges_clean (v_new, polytope); static_faces_clean (v_new, polytope); } static void static_vertex_start (int v, static_polytope *polytope) { static_vertex *vertex; int *conflicts; int i; vertex = polytope->vertices[v]; vertex->id = -1; vertex->edge = -1; vertex->n_edges = 0; vertex->n_conflicts = 0; conflicts = vertex->conflicts; for (i = 1; i < conflicts[0]; i++) conflicts[i] = -1; } static static_vertex *static_vertex_create (int v, static_polytope *polytope) { static_vertex *vertex; int *conflicts; int total; /****************************************** * create and initialize vertex structure * ******************************************/ vertex = (static_vertex *) malloc (sizeof (static_vertex)); polytope->vertices[v] = vertex; total = STATIC_VERTEX_START; conflicts = (int *) malloc (total * sizeof (int)); conflicts[0] = total; vertex->conflicts = conflicts; static_vertex_start (v, polytope); return vertex; } static void static_vertices_increase (static_polytope *polytope) { gamgi_atom **neighbours; static_vertex **vertices; double *distance; int i, start, n_vertices; start = polytope->n_vertices; n_vertices = start + STATIC_VERTICES_STEP; polytope->n_vertices = n_vertices; distance = polytope->distance; distance = (double *) realloc (distance, n_vertices * sizeof (double)); polytope->distance = distance; neighbours = polytope->neighbours; neighbours = (gamgi_atom **) realloc (neighbours, n_vertices * sizeof (gamgi_atom *)); polytope->neighbours = neighbours; vertices = polytope->vertices; vertices = (static_vertex **) realloc (vertices, n_vertices * sizeof (static_vertex *)); polytope->vertices = vertices; for (i = start; i < n_vertices; i++) static_vertex_create (i, polytope); } static gamgi_bool static_inside_local (int x, int y, int z, static_polytope *polytope) { double min_x, min_y, min_z, min; /*********************************************************** * x,y,z = number of cells from central to neighbour cell: * * n_x - cell_x = x, n_y - cell_y = y, n_z - cell_z = z * ***********************************************************/ if (x < 0) x = -x; if (y < 0) y = -y; if (z < 0) z = -z; x = x - 1; if (x < 0) x = 0; y = y - 1; if (y < 0) y = 0; z = z - 1; if (z < 0) z = 0; min_x = x * polytope->width_x; min_y = y * polytope->width_y; min_z = z * polytope->width_z; min = min_x * min_x + min_y * min_y + min_z * min_z; /************************************************ * radius contains the radius distance OR the * * distance for the last neighbour found so far * ************************************************/ if (min > polytope->max) return FALSE; return TRUE; } static gamgi_bool static_inside_global (int shell, static_polytope *polytope) { double min_x, min_y, min_z; double max = polytope->max; min_x = (shell - 1) * polytope->width_x; min_y = (shell - 1) * polytope->width_y; min_z = (shell - 1) * polytope->width_z; /************************************************ * radius contains the radius distance OR the * * distance for the last neighbour found so far * ************************************************/ if (min_x > max && min_y > max && min_z > max) return FALSE; return TRUE; } void static_neighbour_get (int n_x, int n_y, int n_z, static_polytope *polytope) { gamgi_atom **neighbours; gamgi_atom *atom; gamgi_slist *slist; double *distance; double x, y, z, d; int n_neighbours, n; int index, i; n_neighbours = polytope->n_neighbours; neighbours = polytope->neighbours; distance = polytope->distance; n = polytope->n_cells; index = n_z * n * n + n_y * n + n_x; for (slist = polytope->cells[index]; slist != NULL; slist = slist->next) { atom = GAMGI_CAST_ATOM slist->data; if (atom == polytope->atom) continue; if (polytope->element != -1 && polytope->element != atom->element) continue; x = atom->position[0] - polytope->atom->position[0]; y = atom->position[1] - polytope->atom->position[1]; z = atom->position[2] - polytope->atom->position[2]; d = x * x + y * y + z * z; /****************************************************************** * when search is determined by distance, max is fixed * * when search is determined by number, max decreases with search * ******************************************************************/ if (d > polytope->max) continue; /************************************************************** * increase number of neighbours, when determined by distance * **************************************************************/ if (polytope->number == 0 && ++n_neighbours > polytope->n_vertices) { static_vertices_increase (polytope); neighbours = polytope->neighbours; distance = polytope->distance; } /********************************************** * add atom to last position in arrays: * * distances = array with neighbour distances * * neighbours = array with neighbour atoms * **********************************************/ distance[n_neighbours - 1] = d; neighbours[n_neighbours - 1] = atom; /*************************************************************** * set atom in the right order in arrays according to distance * ***************************************************************/ for (i = n_neighbours - 1; i > 0; i--) { if (distance[i] > distance[i - 1]) break; d = distance[i - 1]; distance[i - 1] = distance[i]; distance[i] = d; atom = neighbours[i - 1]; neighbours[i - 1] = neighbours[i]; neighbours[i] = atom; } /************************************************* * when the number of neighbours is fixed, save * * the distance for last neighbour found so far, * * the maximum distance that is worth to scan * *************************************************/ if (polytope->number > 0) polytope->max = distance[n_neighbours - 1]; } polytope->n_neighbours = n_neighbours; } static void static_raw_x0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int i, j; n = polytope->n_cells; /**************************************** * find neighbours in cells in -x faces * ****************************************/ n_x = -shell + cell_x; if (n_x < 0 || n_x > n - 1) return; for (i = -shell + 1; i <= shell - 1; i++) { n_z = i + cell_z; if (n_z < 0 || n_z > n - 1) continue; for (j = -shell + 1; j <= shell - 1; j++) { n_y = j + cell_y; if (n_y < 0 || n_y > n - 1) continue; if (static_inside_local (-shell, j, i, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } } static void static_raw_x1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int i, j; n = polytope->n_cells; /**************************************** * find neighbours in cells in +x faces * ****************************************/ n_x = shell + cell_x; if (n_x < 0 || n_x > n - 1) return; for (i = -shell + 1; i <= shell - 1; i++) { n_z = i + cell_z; if (n_z < 0 || n_z > n - 1) continue; for (j = -shell + 1; j <= shell - 1; j++) { n_y = j + cell_y; if (n_y < 0 || n_y > n - 1) continue; if (static_inside_local (shell, j, i, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } } static void static_raw_y0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int i, j; n = polytope->n_cells; /**************************************** * find neighbours in cells in -y faces * ****************************************/ n_y = -shell + cell_y; if (n_y < 0 || n_y > n - 1) return; for (i = -shell + 1; i <= shell - 1; i++) { n_z = i + cell_z; if (n_z < 0 || n_z > n - 1) continue; for (j = -shell + 1; j <= shell - 1; j++) { n_x = j + cell_x; if (n_x < 0 || n_x > n - 1) continue; if (static_inside_local (j, -shell, i, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } } static void static_raw_y1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int i, j; n = polytope->n_cells; /**************************************** * find neighbours in cells in +y faces * ****************************************/ n_y = shell + cell_y; if (n_y < 0 || n_y > n - 1) return; for (i = -shell + 1; i <= shell - 1; i++) { n_z = i + cell_z; if (n_z < 0 || n_z > n - 1) continue; for (j = -shell + 1; j <= shell - 1; j++) { n_x = j + cell_x; if (n_x < 0 || n_x > n - 1) continue; if (static_inside_local (j, shell, i, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } } static void static_raw_z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int i, j; n = polytope->n_cells; /**************************************** * find neighbours in cells in -z faces * ****************************************/ n_z = -shell + cell_z; if (n_z < 0 || n_z > n - 1) return; for (i = -shell + 1; i <= shell - 1; i++) { n_y = i + cell_y; if (n_y < 0 || n_y > n - 1) continue; for (j = -shell + 1; j <= shell - 1; j++) { n_x = j + cell_x; if (n_x < 0 || n_x > n - 1) continue; if (static_inside_local (j, i, -shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } } static void static_raw_z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int i, j; n = polytope->n_cells; /**************************************** * find neighbours in cells in +z faces * ****************************************/ n_z = shell + cell_z; if (n_z < 0 || n_z > n - 1) return; for (i = -shell + 1; i <= shell - 1; i++) { n_y = i + cell_y; if (n_y < 0 || n_y > n - 1) continue; for (j = -shell + 1; j <= shell - 1; j++) { n_x = j + cell_x; if (n_x < 0 || n_x > n - 1) continue; if (static_inside_local (j, i, shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } } static void static_raw_x0y0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int i; n = polytope->n_cells; /********************************************* * find neighbours in cells along x0y0 edges * *********************************************/ n_x = -shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = -shell + cell_y; if (n_y < 0 || n_y > n - 1) return; for (i = -shell + 1; i <= shell - 1; i++) { n_z = i + cell_z; if (n_z < 0 || n_z > n - 1) continue; if (static_inside_local (-shell, -shell, i, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_x1y0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int i; n = polytope->n_cells; /********************************************* * find neighbours in cells along x0y0 edges * *********************************************/ n_x = shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = -shell + cell_y; if (n_y < 0 || n_y > n - 1) return; for (i = -shell + 1; i <= shell - 1; i++) { n_z = i + cell_z; if (n_z < 0 || n_z > n - 1) continue; if (static_inside_local (shell, -shell, i, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_x0y1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int i; n = polytope->n_cells; /********************************************* * find neighbours in cells along x0y0 edges * *********************************************/ n_x = -shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = shell + cell_y; if (n_y < 0 || n_y > n - 1) return; for (i = -shell + 1; i <= shell - 1; i++) { n_z = i + cell_z; if (n_z < 0 || n_z > n - 1) continue; if (static_inside_local (-shell, shell, i, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_x1y1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int i; n = polytope->n_cells; /********************************************* * find neighbours in cells along x0y0 edges * *********************************************/ n_x = shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = shell + cell_y; if (n_y < 0 || n_y > n - 1) return; for (i = -shell + 1; i <= shell - 1; i++) { n_z = i + cell_z; if (n_z < 0 || n_z > n - 1) continue; if (static_inside_local (shell, shell, i, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_x0z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int j; n = polytope->n_cells; /********************************************* * find neighbours in cells along x0z0 edges * *********************************************/ n_x = -shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_z = -shell + cell_z; if (n_z < 0 || n_z > n - 1) return; for (j = -shell + 1; j <= shell - 1; j++) { n_y = j + cell_y; if (n_y < 0 || n_y > n - 1) continue; if (static_inside_local (-shell, j, -shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_x1z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int j; n = polytope->n_cells; /********************************************* * find neighbours in cells along x1z0 edges * *********************************************/ n_x = shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_z = -shell + cell_z; if (n_z < 0 || n_z > n - 1) return; for (j = -shell + 1; j <= shell - 1; j++) { n_y = j + cell_y; if (n_y < 0 || n_y > n - 1) continue; if (static_inside_local (shell, j, -shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_x0z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int j; n = polytope->n_cells; /********************************************* * find neighbours in cells along x0z1 edges * *********************************************/ n_x = -shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_z = shell + cell_z; if (n_z < 0 || n_z > n - 1) return; for (j = -shell + 1; j <= shell - 1; j++) { n_y = j + cell_y; if (n_y < 0 || n_y > n - 1) continue; if (static_inside_local (-shell, j, shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_x1z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int j; n = polytope->n_cells; /********************************************* * find neighbours in cells along x1z1 edges * *********************************************/ n_x = shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_z = shell + cell_z; if (n_z < 0 || n_z > n - 1) return; for (j = -shell + 1; j <= shell - 1; j++) { n_y = j + cell_y; if (n_y < 0 || n_y > n - 1) continue; if (static_inside_local (shell, j, shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_y0z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int k; n = polytope->n_cells; /********************************************* * find neighbours in cells along y0z0 edges * *********************************************/ n_y = -shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = -shell + cell_z; if (n_z < 0 || n_z > n - 1) return; for (k = -shell + 1; k <= shell - 1; k++) { n_x = k + cell_x; if (n_x < 0 || n_x > n - 1) continue; if (static_inside_local (k, -shell, -shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_y1z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int k; n = polytope->n_cells; /********************************************* * find neighbours in cells along y1z0 edges * *********************************************/ n_y = shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = -shell + cell_z; if (n_z < 0 || n_z > n - 1) return; for (k = -shell + 1; k <= shell - 1; k++) { n_x = k + cell_x; if (n_x < 0 || n_x > n - 1) continue; if (static_inside_local (k, shell, -shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_y0z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int k; n = polytope->n_cells; /********************************************* * find neighbours in cells along y0z1 edges * *********************************************/ n_y = -shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = shell + cell_z; if (n_z < 0 || n_z > n - 1) return; for (k = -shell + 1; k <= shell - 1; k++) { n_x = k + cell_x; if (n_x < 0 || n_x > n - 1) continue; if (static_inside_local (k, -shell, shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_y1z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; int k; n = polytope->n_cells; /********************************************* * find neighbours in cells along y1z1 edges * *********************************************/ n_y = shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = shell + cell_z; if (n_z < 0 || n_z > n - 1) return; for (k = -shell + 1; k <= shell - 1; k++) { n_x = k + cell_x; if (n_x < 0 || n_x > n - 1) continue; if (static_inside_local (k, shell, shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } } static void static_raw_x0y0z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; n = polytope->n_cells; /************************************************** * find neighbours in cells along x0y0z0 vertices * **************************************************/ n_x = -shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = -shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = -shell + cell_z; if (n_z < 0 || n_z > n - 1) return; if (static_inside_local (-shell, -shell, -shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } static void static_raw_x1y0z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; n = polytope->n_cells; /************************************************** * find neighbours in cells along x1y0z0 vertices * **************************************************/ n_x = shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = -shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = -shell + cell_z; if (n_z < 0 || n_z > n - 1) return; if (static_inside_local (shell, -shell, -shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } static void static_raw_x0y1z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; n = polytope->n_cells; /************************************************** * find neighbours in cells along x0y1z0 vertices * **************************************************/ n_x = -shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = -shell + cell_z; if (n_z < 0 || n_z > n - 1) return; if (static_inside_local (-shell, shell, -shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } static void static_raw_x1y1z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; n = polytope->n_cells; /************************************************** * find neighbours in cells along x1y1z0 vertices * **************************************************/ n_x = shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = -shell + cell_z; if (n_z < 0 || n_z > n - 1) return; if (static_inside_local (shell, shell, -shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } static void static_raw_x0y0z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; n = polytope->n_cells; /************************************************** * find neighbours in cells along x0y0z1 vertices * **************************************************/ n_x = -shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = -shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = shell + cell_z; if (n_z < 0 || n_z > n - 1) return; if (static_inside_local (-shell, -shell, shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } static void static_raw_x1y0z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; n = polytope->n_cells; /************************************************** * find neighbours in cells along x1y0z1 vertices * **************************************************/ n_x = shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = -shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = shell + cell_z; if (n_z < 0 || n_z > n - 1) return; if (static_inside_local (shell, -shell, shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } static void static_raw_x0y1z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; n = polytope->n_cells; /************************************************** * find neighbours in cells along x0y1z1 vertices * **************************************************/ n_x = -shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = shell + cell_z; if (n_z < 0 || n_z > n - 1) return; if (static_inside_local (-shell, shell, shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } static void static_raw_x1y1z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope) { int n, n_x, n_y, n_z; n = polytope->n_cells; /************************************************** * find neighbours in cells along x1y1z1 vertices * **************************************************/ n_x = shell + cell_x; if (n_x < 0 || n_x > n - 1) return; n_y = shell + cell_y; if (n_y < 0 || n_y > n - 1) return; n_z = shell + cell_z; if (n_z < 0 || n_z > n - 1) return; if (static_inside_local (shell, shell, shell, polytope) == TRUE) static_neighbour_get (n_x, n_y, n_z, polytope); } static gamgi_bool static_neighbours_find (int cell_x, int cell_y, int cell_z, gamgi_slist *start, gamgi_atom *atom, static_polytope *polytope) { int shell, shell_max; int n, min, max; /********************************************************* * find a fixed number of neighbours around central atom * * or find all neighbours within a given distance * *********************************************************/ /********************************************************* * go around cells (starting with central cell) and * * create vertices array, with closer vertices first, * * so the vertices more far away are handled first. * * * * neighbours are ordered by increasing distances to * * the central atom, so the last one will define a valid * * vertex in the final convex hull. Atoms more far away * * will likely contribute more to the final convex hull. * * * * when applying the incremental algorithm, the atoms * * more far away should be handled first, as the others * * may fall inside the convex polyhedron and be removed * * without requiring expensive polyhedra recalculations * *********************************************************/ static_neighbour_get (cell_x, cell_y, cell_z, polytope); n = polytope->n_cells; min = cell_x; if (cell_y < min) min = cell_y; if (cell_z < min) min = cell_z; max = cell_x; if (cell_y > max) max = cell_y; if (cell_z > max) max = cell_z; shell_max = max; if (shell_max < n - 1 - min) shell_max = n - 1 - min; for (shell = 1; shell <= shell_max; shell++) { if (static_inside_global (shell, polytope) == FALSE) break; /********* * faces * *********/ static_raw_x0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x1 (cell_x, cell_y, cell_z, shell, polytope); static_raw_y0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_y1 (cell_x, cell_y, cell_z, shell, polytope); static_raw_z0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_z1 (cell_x, cell_y, cell_z, shell, polytope); /********* * edges * *********/ static_raw_x0y0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x1y0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x0y1 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x1y1 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x0z0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x1z0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x0z1 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x1z1 (cell_x, cell_y, cell_z, shell, polytope); static_raw_y0z0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_y1z0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_y0z1 (cell_x, cell_y, cell_z, shell, polytope); static_raw_y1z1 (cell_x, cell_y, cell_z, shell, polytope); /************ * vertices * ************/ static_raw_x0y0z0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x1y0z0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x0y1z0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x1y1z0 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x0y0z1 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x1y0z1 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x0y1z1 (cell_x, cell_y, cell_z, shell, polytope); static_raw_x1y1z1 (cell_x, cell_y, cell_z, shell, polytope); } /************************************ * Not enough neighbours were found * ************************************/ if (polytope->n_neighbours < 2 || polytope->distance[polytope->n_neighbours - 1] == DBL_MAX) return FALSE; return TRUE; } static void static_neighbours_swap (static_polytope *polytope) { gamgi_atom **neighbours; gamgi_atom *atom; int i, n_neighbours, half; neighbours = polytope->neighbours; n_neighbours = polytope->n_neighbours; /************************************************ * swap atoms, so the last atom (the farthest * * atom) becomes the first one and the first * * atom (the closest atom) becomes the last one * * * * When n_neighbours is even, half of the atoms * * wap with the other half. When n_neighbours * * is odd, the central atom does not swap. * ************************************************/ half = n_neighbours / 2; for (i = 0; i < half; i++) { atom = neighbours[i]; neighbours[i] = neighbours[n_neighbours - 1 - i]; neighbours[n_neighbours - 1 - i] = atom; } } static int static_neighbours_independent (static_polytope *polytope) { gamgi_atom **neighbours; gamgi_atom *atom; int dot, cross, mix; int n_neighbours, i; /******************************************************* * At least two atoms are guaranteed to exist now, * * but they might be too close to define a polytope! * * * * neighbours are ordered by decreasing distances to * * the central atom, so atom 0 will define a valid * * vertex in the final convex hull. Atoms more far * * away will contribute more to the final convex hull. * *******************************************************/ neighbours = polytope->neighbours; n_neighbours = polytope->n_neighbours; /************************** * look for second vertex * **************************/ for (i = 1; i < n_neighbours; i++) { dot = static_dot (0, i, GAMGI_CHEM_POLYTOPE_LENGTH, polytope); if (dot > 0) { /********************************************* * valid length: swap valid atom with atom 1 * *********************************************/ atom = neighbours[1]; neighbours[1] = neighbours[i]; neighbours[i] = atom; break; } } if (i == n_neighbours) return 1; /************************* * look for third vertex * *************************/ for (i = 2; i < n_neighbours; i++) { cross = static_cross (0, 1, i, GAMGI_CHEM_POLYTOPE_AREA, polytope); if (cross > 0) { /******************************************* * valid area: swap valid atom with atom 2 * *******************************************/ atom = neighbours[2]; neighbours[2] = neighbours[i]; neighbours[i] = atom; break; } } if (i == n_neighbours) return 2; /************************** * look for fourth vertex * **************************/ for (i = 3; i < n_neighbours; i++) { mix = static_mix (0, 1, 2, i, GAMGI_CHEM_POLYTOPE_VOLUME, polytope); if (mix != 0) { /********************************************* * valid volume: swap valid atom with atom 3 * *********************************************/ atom = neighbours[3]; neighbours[3] = neighbours[i]; neighbours[i] = atom; if (mix < 0) { /******************************************************* * swap atoms 1 and 2, to build a tetrahedron with all * * faces orientated counter-clockwise to the outside * *******************************************************/ atom = neighbours[1]; neighbours[1] = neighbours[2]; neighbours[2] = atom; } break; } } if (i == n_neighbours) return 3; /***************************************************** * four valid vertices were found: build tetrahedron * *****************************************************/ return 4; } static void static_arrays_create (static_polytope *polytope) { int i; polytope->n_faces = STATIC_FACES_START; polytope->faces = (static_face **) malloc (polytope->n_faces * sizeof (static_face *)); for (i = 0; i < polytope->n_faces; i++) static_face_create (i, polytope); polytope->n_edges = STATIC_EDGES_START; polytope->edges = (static_edge **) malloc (polytope->n_edges * sizeof (static_edge *)); for (i = 0; i < polytope->n_edges; i++) static_edge_create (i, polytope); /********************************************************************* * n_vertices is the total size of arrays neighbours, distance and * * vertices, while n_neighbours is the actual number of vertices. * * When neighbours are fixed by number: n_vertices = n_neighbours * * When neighbours are fixed by distance: n_neighbours <= n_vertices * * * * n_vertices is initialized here and increased only when arrays * * are not big enough. n_neighbours is initialized everytime a new * * central atom is defined and either is constant when the number * * of neighbours is fixed or ir given by the number of valid atoms * * that can be found within the specified distance. * *********************************************************************/ if (polytope->number > 0) polytope->n_vertices = polytope->number; else polytope->n_vertices = STATIC_VERTICES_START; polytope->vertices = (static_vertex **) malloc (polytope->n_vertices * sizeof (static_vertex *)); for (i = 0; i < polytope->n_vertices; i++) static_vertex_create (i, polytope); polytope->neighbours = (gamgi_atom **) malloc (polytope->n_vertices * sizeof (gamgi_atom *)); polytope->distance = (double *) malloc (polytope->n_vertices * sizeof (double)); } static void static_arrays_start (static_polytope *polytope) { int n_faces, n_edges, n_vertices; int i; /**************************** * reset topological arrays * ****************************/ n_edges = polytope->n_edges; for (i = 0; i < n_edges; i++) static_edge_start (i, polytope); n_vertices = polytope->n_vertices; for (i = 0; i < n_vertices; i++) static_vertex_start (i, polytope); n_faces = polytope->n_faces; for (i = 0; i < n_faces; i++) static_face_start (i, polytope); /*************************************** * start shell data to find neighbours * ***************************************/ if (polytope->number > 0) { polytope->n_neighbours = polytope->n_vertices; polytope->max = DBL_MAX; for (i = 0; i < polytope->n_vertices; i++) polytope->distance[i] = DBL_MAX; } else polytope->n_neighbours = 0; } static void static_arrays_remove (static_polytope *polytope) { int n_faces, n_edges, n_vertices; int i; n_faces = polytope->n_faces; for (i = 0; i < n_faces; i++) free (polytope->faces[i]); free (polytope->faces); n_edges = polytope->n_edges; for (i = 0; i < n_edges; i++) free (polytope->edges[i]); free (polytope->edges); n_vertices = polytope->n_vertices; for (i = 0; i < n_vertices; i++) free (polytope->vertices[i]); free (polytope->vertices); free (polytope->neighbours); free (polytope->distance); } static void static_cells_create (static_polytope *polytope) { gamgi_atom *atom; gamgi_slist **cells; gamgi_dlist *dlist; double min_x, max_x; double min_y, max_y; double min_z, max_z; double width_x, width_y, width_z; double r_cells, min; int cell_x, cell_y, cell_z; int central, neighbour; int offset; int n; central = polytope->atom->element; neighbour = polytope->element; /************************************************** * determine: 1) system dimensions; 2) number of * * atoms; 3) maximum radius (radical tesselation) * **************************************************/ min_x = DBL_MAX; max_x = -DBL_MAX; min_y = DBL_MAX; max_y = -DBL_MAX; min_z = DBL_MAX; max_z = -DBL_MAX; n = 0; for (dlist = polytope->atoms; dlist != NULL; dlist = dlist->next) { /***************************************************** * give a different, sequential, number to each atom * * * * find minimum and maximum cell boundaries * * * * find maximum radius (radical tesselation) * *****************************************************/ atom = GAMGI_CAST_ATOM dlist->data; if (neighbour != -1 && atom->element != central && atom->element != neighbour) continue; n++; if (atom->position[0] < min_x) min_x = atom->position[0]; if (atom->position[0] > max_x) max_x = atom->position[0]; if (atom->position[1] < min_y) min_y = atom->position[1]; if (atom->position[1] > max_y) max_y = atom->position[1]; if (atom->position[2] < min_z) min_z = atom->position[2]; if (atom->position[2] > max_z) max_z = atom->position[2]; } polytope->n_atoms = n; /************************************************************ * determine number of cells on each direction: * * on average, each cell has approximately one atom. * * * * allocate array of cells: * * each cell points to a linked list of atoms in that cell. * ************************************************************/ if (modf (pow (n, 1/3.0), &r_cells) > 0.5) r_cells++; polytope->n_cells = n = r_cells; cells = (gamgi_slist **) calloc (pow (n, 3), sizeof (gamgi_slist *)); polytope->cells = cells; /*********************************************************** * determine cell dimensions: when the width is too small * * (for example when the atoms have the same z coordinate) * * we need to enlarge the cell dimensions symmetricaly, to * * guarantee that the distance from the seeds at old min, * * max coordinates to the new border planes is the same * ***********************************************************/ min = GAMGI_CHEM_POLYTOPE_WIDTH; if (max_x - min_x < min) { min_x = (min_x + max_x - min) / 2.0; max_x = (min_x + max_x + min) / 2.0; } width_x = (max_x - min_x) / n; if (max_y - min_y < min) { min_y = (min_y + max_y - min) / 2.0; max_y = (min_y + max_y + min) / 2.0; } width_y = (max_y - min_y) / n; if (max_z - min_z < min) { min_z = (min_z + max_z - min) / 2.0; max_z = (min_z + max_z + min) / 2.0; } width_z = (max_z - min_z) / n; polytope->width_x = width_x; polytope->width_y = width_y; polytope->width_z = width_z; /******************************************** * 1) find cell where each atom belongs * * 2) add atom to linked list for that cell * ********************************************/ for (dlist = polytope->atoms; dlist != NULL; dlist = dlist->next) { atom = GAMGI_CAST_ATOM dlist->data; if (neighbour != -1 && atom->element != central && atom->element != neighbour) continue; cell_x = floor ((atom->position[0] - min_x) / width_x); if (cell_x == n) cell_x--; cell_y = floor ((atom->position[1] - min_y) / width_y); if (cell_y == n) cell_y--; cell_z = floor ((atom->position[2] - min_z) / width_z); if (cell_z == n) cell_z--; offset = cell_z * n * n + cell_y * n + cell_x; cells[offset] = gamgi_engine_slist_add_start (cells[offset]); cells[offset]->data = atom; } } static void static_cells_remove (static_polytope *polytope) { gamgi_slist **cells; gamgi_slist *slist; int n_cells; int cell_x, cell_y, cell_z; int offset; /******************************************** * remove lists of nodes, one for each cell * ********************************************/ cells = polytope->cells; n_cells = polytope->n_cells; for (cell_z = 0; cell_z < n_cells; cell_z++) { for (cell_y = 0; cell_y < n_cells; cell_y++) { for (cell_x = 0; cell_x < n_cells; cell_x++) { offset = cell_z * n_cells * n_cells + cell_y * n_cells + cell_x; slist = cells[offset]; while (slist != NULL) slist = gamgi_engine_slist_remove_start (slist); } } } } static void static_build_tetrahedron (static_polytope *polytope) { static_face *face; static_edge *edge; static_vertex *vertex; int *edges; /***************************************************************************** * build a tetrahedron orientated counter-clockwise, with theses rules: * * * * set vertices v0, v1, v2, v3, so (v1 - v0) X (v2 - v0) . (v3 - v0) > 0 * * * * set faces f0, f1, f2, f3, so the face number is the excluded vertex * * * * set edges e0, e1, e2, e3, e4, e5, with the vertex increasing combination: * * e0: v0v1 e1: v0v2 e2: v0v3 e3: v1v2 e4: v1v3 e5: v2v3 * *****************************************************************************/ /*************************** * add vertices 0, 1, 2, 3 * ***************************/ vertex = polytope->vertices[0]; vertex->n_edges = 3; vertex = polytope->vertices[1]; vertex->n_edges = 3; vertex = polytope->vertices[2]; vertex->n_edges = 3; vertex = polytope->vertices[3]; vertex->n_edges = 3; /************************************************************ * add edges 0, 1, 2, 3, 4, 5 * * * * write first the face containing this vertex sequence * * and then the face containing the reverse vertex sequence * * * * e0: f2 f3 v0 v1 e2: f1 f2 v0 v3 e4: f2 f0 v1 v3 * * e1: f3 f1 v0 v2 e3: f0 f3 v1 v2 e5: f0 f1 v2 v3 * ************************************************************/ edge = polytope->edges[0]; edge->state = STATIC_KEEP; edge->f_start = 2; edge->f_end = 3; edge->v_start = 0; edge->v_end = 1; edge = polytope->edges[1]; edge->state = STATIC_KEEP; edge->f_start = 3; edge->f_end = 1; edge->v_start = 0; edge->v_end = 2; edge = polytope->edges[2]; edge->state = STATIC_KEEP; edge->f_start = 1; edge->f_end = 2; edge->v_start = 0; edge->v_end = 3; edge = polytope->edges[3]; edge->state = STATIC_KEEP; edge->f_start = 0; edge->f_end = 3; edge->v_start = 1; edge->v_end = 2; edge = polytope->edges[4]; edge->state = STATIC_KEEP; edge->f_start = 2; edge->f_end = 0; edge->v_start = 1; edge->v_end = 3; edge = polytope->edges[5]; edge->state = STATIC_KEEP; edge->f_start = 0; edge->f_end = 1; edge->v_start = 2; edge->v_end = 3; /********** * face 0 * **********/ face = polytope->faces[0]; face->state = STATIC_KEEP; face->n_edges = 3; static_conflict_create (1, 2, 3, 0, polytope); edges = face->edges; edges[1] = 3; edges[2] = 5; edges[3] = 4; /********** * face 1 * **********/ face = polytope->faces[1]; face->state = STATIC_KEEP; face->n_edges = 3; static_conflict_create (3, 2, 0, 1, polytope); edges = face->edges; edges[1] = 1; edges[2] = 2; edges[3] = 5; /********** * face 2 * **********/ face = polytope->faces[2]; face->state = STATIC_KEEP; face->n_edges = 3; static_conflict_create (0, 1, 3, 2, polytope); edges = face->edges; edges[1] = 0; edges[2] = 4; edges[3] = 2; /********** * face 3 * **********/ face = polytope->faces[3]; face->state = STATIC_KEEP; face->n_edges = 3; static_conflict_create (2, 1, 0, 3, polytope); edges = face->edges; edges[1] = 0; edges[2] = 1; edges[3] = 3; } static void static_build_polyhedron (static_polytope *polytope) { int i; static_build_tetrahedron (polytope); for (i = 4; i < polytope->n_neighbours; i++) static_vertex_build (i, polytope); if (polytope->coplanar > 0.0) static_faces_merge (polytope); static_export (polytope); } static int static_build_central (int cell_x, int cell_y, int cell_z, gamgi_slist *start, gamgi_atom *atom, static_polytope *polytope) { int independent; /************************************** * 1) set central atom and its parent * * 2) reset scanning, building arrays * * 3) reset conflict identifier * **************************************/ static_atom (atom, polytope); static_arrays_start (polytope); polytope->id = 0; if (static_neighbours_find (cell_x, cell_y, cell_z, start, atom, polytope) == FALSE) return FALSE; static_neighbours_swap (polytope); independent = static_neighbours_independent (polytope); if (independent == 4) { static_build_polyhedron (polytope); return 4; } if (independent == 3) { gamgi_phys_plane_polytope (polytope->n_neighbours, polytope->neighbours, polytope->structure, polytope->group->red, polytope->group->green, polytope->group->blue, polytope->parent, polytope->atom); return 3; } if (independent == 2) { gamgi_phys_direction_polytope (polytope->n_neighbours, polytope->neighbours, polytope->structure, polytope->group->red, polytope->group->green, polytope->group->blue, polytope->parent, polytope->atom); return 2; } return 1; } static void static_expectancy (double *data, int n) { /************************************************************************* * get average, deviation * * * * taking the absolute value is needed to avoid sqrt negative arguments, * * which can occur when deviation is 0, due to computer lack of precison * *************************************************************************/ data[2] /= n; data[3] = sqrt (fabs (data[3] / n - data[2] * data[2])); } static void static_measure (int n_vertices, static_polytope *polytope) { gamgi_atom *atom, *atom_start, *atom_end; static_face *face; static_edge *edge; static_vertex *vertex; double base[3], radial[3], cross[3]; double length, x, y, z; int i, j, e; /************************* * get polyhedron center * *************************/ gamgi_math_vector_zero (polytope->center); for (i = 0; i < polytope->n_neighbours; i++) { vertex = polytope->vertices[i]; if (vertex->n_edges > 0) { atom = polytope->neighbours[i]; gamgi_math_vector_add (polytope->center, atom->position, polytope->center); } } gamgi_math_vector_scale (polytope->center, polytope->center, 1.0 / n_vertices); /******************** * get faces center * ********************/ for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) { gamgi_math_vector_zero (face->center); for (j = 1; j <= face->n_edges; j++) { e = face->edges[j]; edge = polytope->edges[e]; if (edge->f_start == i) atom = polytope->neighbours[edge->v_start]; else atom = polytope->neighbours[edge->v_end]; gamgi_math_vector_add (face->center, atom->position, face->center); } gamgi_math_vector_scale (face->center, face->center, 1.0 / face->n_edges); } } /***************************** * get faces area and normal * *****************************/ for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) { face->area = 0.0; gamgi_math_vector_zero (face->normal); e = face->edges[face->n_edges]; edge = polytope->edges[e]; if (edge->f_start == i) atom = polytope->neighbours[edge->v_start]; else atom = polytope->neighbours[edge->v_end]; gamgi_math_vector_sub (atom->position, face->center, base); for (j = 1; j <= face->n_edges; j++) { e = face->edges[j]; edge = polytope->edges[e]; if (edge->f_start == i) atom = polytope->neighbours[edge->v_start]; else atom = polytope->neighbours[edge->v_end]; gamgi_math_vector_sub (atom->position, face->center, radial); gamgi_math_vector_cross (base, radial, cross); face->area += gamgi_math_vector_length (cross); gamgi_math_vector_add (face->normal, cross, face->normal); gamgi_math_vector_copy (radial, base); } /************************************************************ * Normalize normal vector (perpendicular to face) and * * get face area (the cross product is twice each triangle * * area). For very small faces set area and normal to zero. * ************************************************************/ length = gamgi_math_vector_length (face->normal); if (length < GAMGI_MATH_TOLERANCE_LENGTH) { gamgi_math_vector_zero (face->normal); face->area = 0.0; } else { gamgi_math_vector_scale (face->normal, face->normal, 1.0 / length); face->area /= 2.0; } } } /***************************** * measure polyhedron volume * *****************************/ polytope->volume = 0.0; for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) { gamgi_math_vector_sub (face->center, polytope->center, radial); length = gamgi_math_vector_dot (radial, face->normal); polytope->volume += face->area * length / 3.0; } } /*********************** * measure edge length * ***********************/ for (i = 0; i < polytope->n_edges; i++) { edge = polytope->edges[i]; if (edge->state == STATIC_KEEP) { atom_start = polytope->neighbours[edge->v_start]; atom_end = polytope->neighbours[edge->v_end]; x = atom_end->position[0] - atom_start->position[0]; y = atom_end->position[1] - atom_start->position[1]; z = atom_end->position[2] - atom_start->position[2]; edge->length = sqrt (x * x + y * y + z * z); } } /*********************** * measure face length * ***********************/ for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) { face->length = 0.0; for (j = 1; j <= face->n_edges; j++) { e = face->edges[j]; edge = polytope->edges[e]; face->length += edge->length; } } } } static void static_report_start (int *n_polyhedrons, int *n_faces, int *n_edges, int *n_vertices, double *polyhedron_faces, double *polyhedron_edges, double *polyhedron_vertices, double *face_vertices, double *vertex_faces, double *polyhedron_volumes, double *polyhedron_areas, double *polyhedron_lengths, double *polyhedron_aberrations, double *face_areas, double *face_lengths, double *face_aberrations, double *edge_lengths, double *edge_angles) { /************************************************************* * start topology data * * * * n_polyhedrons, n_faces, n_edges, n_vertices: number * * * * polyhedron_faces, polyhedron_edges, polyhedron_vertices, * * face_vertices, vertex_faces: min, max, average, deviation * *************************************************************/ *n_polyhedrons = 0; *n_faces = 0; *n_edges = 0; *n_vertices = 0; polyhedron_faces[0] = DBL_MAX; polyhedron_faces[1] = -DBL_MAX; polyhedron_faces[2] = 0.0; polyhedron_faces[3] = 0.0; polyhedron_edges[0] = DBL_MAX; polyhedron_edges[1] = -DBL_MAX; polyhedron_edges[2] = 0.0; polyhedron_edges[3] = 0.0; polyhedron_vertices[0] = DBL_MAX; polyhedron_vertices[1] = -DBL_MAX; polyhedron_vertices[2] = 0.0; polyhedron_vertices[3] = 0.0; face_vertices[0] = DBL_MAX; face_vertices[1] = -DBL_MAX; face_vertices[2] = 0.0; face_vertices[3] = 0.0; vertex_faces[0] = DBL_MAX; vertex_faces[1] = -DBL_MAX; vertex_faces[2] = 0.0; vertex_faces[3] = 0.0; /*********************************************************** * start geometry data * * * * polyhedron_volumes, polyhedron_areas, polyhedron_edges, * * spherical_aberration, face_areas, face_lengths, * * face_angles, circular_aberration, edge_lengths * ***********************************************************/ polyhedron_volumes[0] = DBL_MAX; polyhedron_volumes[1] = -DBL_MAX; polyhedron_volumes[2] = 0.0; polyhedron_volumes[3] = 0.0; polyhedron_areas[0] = DBL_MAX; polyhedron_areas[1] = -DBL_MAX; polyhedron_areas[2] = 0.0; polyhedron_areas[3] = 0.0; polyhedron_lengths[0] = DBL_MAX; polyhedron_lengths[1] = -DBL_MAX; polyhedron_lengths[2] = 0.0; polyhedron_lengths[3] = 0.0; polyhedron_aberrations[0] = DBL_MAX; polyhedron_aberrations[1] = -DBL_MAX; polyhedron_aberrations[2] = 0.0; polyhedron_aberrations[3] = 0.0; face_areas[0] = DBL_MAX; face_areas[1] = -DBL_MAX; face_areas[2] = 0.0; face_areas[3] = 0.0; face_lengths[0] = DBL_MAX; face_lengths[1] = -DBL_MAX; face_lengths[2] = 0.0; face_lengths[3] = 0.0; face_aberrations[0] = DBL_MAX; face_aberrations[1] = -DBL_MAX; face_aberrations[2] = 0.0; face_aberrations[3] = 0.0; edge_lengths[0] = DBL_MAX; edge_lengths[1] = -DBL_MAX; edge_lengths[2] = 0.0; edge_lengths[3] = 0.0; edge_angles[0] = DBL_MAX; edge_angles[1] = -DBL_MAX; edge_angles[2] = 0.0; edge_angles[3] = 0.0; } static void static_report_add (int *n_polyhedrons, int *n_faces, int *n_edges, int *n_vertices, double *polyhedron_faces, double *polyhedron_edges, double *polyhedron_vertices, double *face_vertices, double *vertex_faces, double *polyhedron_volumes, double *polyhedron_areas, double *polyhedron_lengths, double *polyhedron_aberrations, double *face_areas, double *face_lengths, double *face_aberrations, double *edge_lengths, double *edge_angles, static_polytope *polytope) { gamgi_atom *atom_start, *atom_end; static_face *face; static_edge *edge; static_vertex *vertex; double edge_start[3], edge_end[3]; double area, length; double aberration, k, angle; int p_faces, p_edges, p_vertices; int e, v_start, v_end; int i, j; /********************* * get topology data * *********************/ /************************* * number of polyhedrons * *************************/ *n_polyhedrons += 1; /******************* * number of faces * *******************/ p_faces = 0; for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) p_faces++; } *n_faces += p_faces; /******************* * number of edges * *******************/ p_edges = 0; for (i = 0; i < polytope->n_edges; i++) { edge = polytope->edges[i]; if (edge->state == STATIC_KEEP) p_edges++; } *n_edges += p_edges; /********************** * number of vertices * **********************/ p_vertices = 0; for (i = 0; i < polytope->n_neighbours; i++) { vertex = polytope->vertices[i]; if (vertex->n_edges > 0) p_vertices++; } *n_vertices += p_vertices; /************************ * faces per polyhedron * ************************/ if (p_faces < polyhedron_faces[0]) polyhedron_faces[0] = p_faces; if (p_faces > polyhedron_faces[1]) polyhedron_faces[1] = p_faces; polyhedron_faces[2] += p_faces; polyhedron_faces[3] += p_faces * p_faces; /************************ * edges per polyhedron * ************************/ if (p_edges < polyhedron_edges[0]) polyhedron_edges[0] = p_edges; if (p_edges > polyhedron_edges[1]) polyhedron_edges[1] = p_edges; polyhedron_edges[2] += p_edges; polyhedron_edges[3] += p_edges * p_edges; /*************************** * vertices per polyhedron * ***************************/ if (p_vertices < polyhedron_vertices[0]) polyhedron_vertices[0] = p_vertices; if (p_vertices > polyhedron_vertices[1]) polyhedron_vertices[1] = p_vertices; polyhedron_vertices[2] += p_vertices; polyhedron_vertices[3] += (p_vertices) * (p_vertices); /*************************** * vertices|edges per face * ***************************/ for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) { if (face->n_edges < face_vertices[0]) face_vertices[0] = face->n_edges; if (face->n_edges > face_vertices[1]) face_vertices[1] = face->n_edges; face_vertices[2] += face->n_edges; face_vertices[3] += face->n_edges * face->n_edges; } } /************************** * faces|edges per vertex * **************************/ for (i = 0; i < polytope->n_neighbours; i++) { vertex = polytope->vertices[i]; if (vertex->n_edges > 0) { if (vertex->n_edges < vertex_faces[0]) vertex_faces[0] = vertex->n_edges; if (vertex->n_edges > vertex_faces[1]) vertex_faces[1] = vertex->n_edges; vertex_faces[2] += vertex->n_edges; vertex_faces[3] += vertex->n_edges * vertex->n_edges; } } /********************* * get geometry data * *********************/ static_measure (p_vertices, polytope); /********************** * polyhedron volumes * **********************/ if (polytope->volume < polyhedron_volumes[0]) polyhedron_volumes[0] = polytope->volume; if (polytope->volume > polyhedron_volumes[1]) polyhedron_volumes[1] = polytope->volume; polyhedron_volumes[2] += polytope->volume; polyhedron_volumes[3] += polytope->volume * polytope->volume; /******************** * polyhedron areas * ********************/ area = 0.0; for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) area += face->area; } if (area < polyhedron_areas[0]) polyhedron_areas[0] = area; if (area > polyhedron_areas[1]) polyhedron_areas[1] = area; polyhedron_areas[2] += area; polyhedron_areas[3] += area * area; /********************** * polyhedron lengths * **********************/ length = 0.0; for (i = 0; i < polytope->n_edges; i++) { edge = polytope->edges[i]; if (edge->state == STATIC_KEEP) length += edge->length; } if (length < polyhedron_lengths[0]) polyhedron_lengths[0] = length; if (length > polyhedron_lengths[1]) polyhedron_lengths[1] = length; polyhedron_lengths[2] += length; polyhedron_lengths[3] += length * length; /************************** * polyhedron aberrations * **************************/ k = pow (36 * GAMGI_MATH_PI, 1/3.0); aberration = area / k / pow (polytope->volume, 2/3.0); if (aberration < polyhedron_aberrations[0]) polyhedron_aberrations[0] = aberration; if (aberration > polyhedron_aberrations[1]) polyhedron_aberrations[1] = aberration; polyhedron_aberrations[2] += aberration; polyhedron_aberrations[3] += aberration * aberration; /************** * face areas * **************/ for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) { if (face->area < face_areas[0]) face_areas[0] = face->area; if (face->area > face_areas[1]) face_areas[1] = face->area; face_areas[2] += face->area; face_areas[3] += face->area * face->area; } } /**************** * face lengths * ****************/ for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) { if (face->length < face_lengths[0]) face_lengths[0] = face->length; if (face->length > face_lengths[1]) face_lengths[1] = face->length; face_lengths[2] += face->length; face_lengths[3] += face->length * face->length; } } /******************** * face aberrations * ********************/ k = 2 * sqrt (GAMGI_MATH_PI); for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) { aberration = face->length / k / sqrt (face->area); if (aberration < face_aberrations[0]) face_aberrations[0] = aberration; if (aberration > face_aberrations[1]) face_aberrations[1] = aberration; face_aberrations[2] += aberration; face_aberrations[3] += aberration * aberration; } } /**************** * edge lengths * ****************/ for (i = 0; i < polytope->n_edges; i++) { edge = polytope->edges[i]; if (edge->state == STATIC_KEEP) { if (edge->length < edge_lengths[0]) edge_lengths[0] = edge->length; if (edge->length > edge_lengths[1]) edge_lengths[1] = edge->length; edge_lengths[2] += edge->length; edge_lengths[3] += edge->length * edge->length; } } /*************** * edge angles * ***************/ for (i = 0; i < polytope->n_faces; i++) { face = polytope->faces[i]; if (face->state == STATIC_KEEP) { e = face->edges[face->n_edges]; edge = polytope->edges[e]; if (edge->f_start == i) { v_start = edge->v_start; v_end = edge->v_end; } else { v_start = edge->v_end; v_end = edge->v_start; } atom_start = polytope->neighbours[v_start]; atom_end = polytope->neighbours[v_end]; gamgi_math_vector_sub (atom_end->position, atom_start->position, edge_start); for (j = 1; j <= face->n_edges; j++) { e = face->edges[j]; edge = polytope->edges[e]; if (edge->f_start == i) { v_start = edge->v_start; v_end = edge->v_end; } else { v_start = edge->v_end; v_end = edge->v_start; } atom_start = polytope->neighbours[v_start]; atom_end = polytope->neighbours[v_end]; gamgi_math_vector_sub (atom_end->position, atom_start->position, edge_end); angle = 180 - gamgi_math_vector_angle (edge_start, edge_end); if (angle < edge_angles[0]) edge_angles[0] = angle; if (angle > edge_angles[1]) edge_angles[1] = angle; edge_angles[2] += angle; edge_angles[3] += angle * angle; gamgi_math_vector_copy (edge_end, edge_start); } } } } static void static_report_end (GtkWidget *text, int n_polyhedrons, int n_faces, int n_edges, int n_vertices, double *polyhedron_faces, double *polyhedron_edges, double *polyhedron_vertices, double *face_vertices, double *vertex_faces, double *polyhedron_volumes, double *polyhedron_areas, double *polyhedron_lengths, double *polyhedron_aberrations, double *face_areas, double *face_lengths, double *face_aberrations, double *edge_lengths, double *edge_angles) { GtkTextBuffer *buffer; GtkTextIter iter; /********************* * initialize buffer * *********************/ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)); gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0); /********************** * show topology data * **********************/ gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nPolyhedrons: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%d\n", n_polyhedrons); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nFaces: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%d\n", n_faces); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nEdges: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%d\n", n_edges); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nVertices: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%d\n", n_vertices); static_expectancy (polyhedron_faces, n_polyhedrons); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nPolyhedron Faces\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_faces[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_faces[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_faces[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_faces[3]); static_expectancy (polyhedron_edges, n_polyhedrons); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nPolyhedron Edges\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_edges[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_edges[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_edges[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_edges[3]); static_expectancy (polyhedron_vertices, n_polyhedrons); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nPolyhedron Vertices\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_vertices[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_vertices[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_vertices[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_vertices[3]); static_expectancy (face_vertices, n_faces); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nFace Vertices\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_vertices[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_vertices[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_vertices[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_vertices[3]); static_expectancy (vertex_faces, n_vertices); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nVertex Faces\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", vertex_faces[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", vertex_faces[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", vertex_faces[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", vertex_faces[3]); /********************** * show geometry data * **********************/ static_expectancy (polyhedron_volumes, n_polyhedrons); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nPolyhedron Volumes\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_volumes[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_volumes[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_volumes[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_volumes[3]); static_expectancy (polyhedron_areas, n_polyhedrons); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nPolyhedron Areas\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_areas[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_areas[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_areas[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_areas[3]); static_expectancy (polyhedron_lengths, n_polyhedrons); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nPolyhedron Lengths\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_lengths[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_lengths[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_lengths[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_lengths[3]); static_expectancy (polyhedron_aberrations, n_polyhedrons); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nPolyhedron Aberrations\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_aberrations[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_aberrations[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_aberrations[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", polyhedron_aberrations[3]); static_expectancy (face_areas, n_faces); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nFace Areas\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_areas[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_areas[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_areas[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_areas[3]); static_expectancy (face_lengths, n_faces); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nFace Lengths\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_lengths[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_lengths[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_lengths[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_lengths[3]); static_expectancy (face_aberrations, n_faces); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nFace Aberrations\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_aberrations[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_aberrations[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_aberrations[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", face_aberrations[3]); static_expectancy (edge_lengths, n_edges); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nEdge Lengths\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", edge_lengths[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", edge_lengths[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", edge_lengths[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", edge_lengths[3]); static_expectancy (edge_angles, 2 * n_edges); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nEdge Angles\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Minimum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", edge_angles[0]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Maximum: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", edge_angles[1]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Average: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", edge_angles[2]); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "Deviation: "); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_link", "%f\n", edge_angles[3]); } static void static_build (int *out, GtkWidget *text, static_polytope *polytope) { gamgi_atom *atom; gamgi_slist **cells; gamgi_slist *slist, *start; int n_polyhedrons, n_faces, n_edges, n_vertices; double polyhedron_faces[4]; double polyhedron_edges[4]; double polyhedron_vertices[4]; double face_vertices[4]; double vertex_faces[4]; double polyhedron_volumes[4]; double polyhedron_areas[4]; double polyhedron_lengths[4]; double spherical_aberration[4]; double face_areas[4]; double face_lengths[4]; double face_angles[4]; double circular_aberration[4]; double edge_lengths[4]; int cell_x, cell_y, cell_z; int n_cells, offset; int independent; out[GAMGI_MATH_POLYTOPE_1] = 0; out[GAMGI_MATH_POLYTOPE_2] = 0; out[GAMGI_MATH_POLYTOPE_3] = 0; out[GAMGI_MATH_POLYTOPE_4] = 0; if (text != NULL) static_report_start (&n_polyhedrons, &n_faces, &n_edges, &n_vertices, polyhedron_faces, polyhedron_edges, polyhedron_vertices, face_vertices, vertex_faces, polyhedron_volumes, polyhedron_areas, polyhedron_lengths, spherical_aberration, face_areas, face_lengths, face_angles, circular_aberration, edge_lengths); cells = polytope->cells; n_cells = polytope->n_cells; for (cell_z = 0; cell_z < n_cells; cell_z++) { for (cell_y = 0; cell_y < n_cells; cell_y++) { for (cell_x = 0; cell_x < n_cells; cell_x++) { offset = cell_z * n_cells * n_cells + cell_y * n_cells + cell_x; start = cells[offset]; for (slist = start; slist != NULL; slist = slist->next) { /***************************************************** * build polyhedron from distance-ordered neighbours * *****************************************************/ atom = GAMGI_CAST_ATOM slist->data; if (atom->element == polytope->atom->element && (polytope->global == TRUE || atom == polytope->atom)) { independent = static_build_central (cell_x, cell_y, cell_z, start, atom, polytope); if (independent < 2) out[GAMGI_MATH_POLYTOPE_1] += 1; if (independent == 2) out[GAMGI_MATH_POLYTOPE_2] += 1; if (independent == 3) out[GAMGI_MATH_POLYTOPE_3] += 1; if (independent > 3) out[GAMGI_MATH_POLYTOPE_4] += 1; if (text != NULL && independent > 3) static_report_add (&n_polyhedrons, &n_faces, &n_edges, &n_vertices, polyhedron_faces, polyhedron_edges, polyhedron_vertices, face_vertices, vertex_faces, polyhedron_volumes, polyhedron_areas, polyhedron_lengths, spherical_aberration, face_areas, face_lengths, face_angles, circular_aberration, edge_lengths, polytope); } } } } } if (text != NULL && out[GAMGI_MATH_POLYTOPE_4] > 0) { static_report_end (text, n_polyhedrons, n_faces, n_edges, n_vertices, polyhedron_faces, polyhedron_edges, polyhedron_vertices, face_vertices, vertex_faces, polyhedron_volumes, polyhedron_areas, polyhedron_lengths, spherical_aberration, face_areas, face_lengths, face_angles, circular_aberration, edge_lengths); } } static static_polytope *static_start (gamgi_dlist *atoms, gamgi_group *group, gamgi_atom *atom, gamgi_bool global, gamgi_enum structure, double visible, double coplanar, int element, int number, double radius) { static_polytope *polytope; /*************************** * allocate main structure * ***************************/ polytope = (static_polytope *) malloc (sizeof (static_polytope)); /******************************************************************** * save input data: radius is a squared distance, to increase speed * ********************************************************************/ polytope->atoms = atoms; polytope->group = group; polytope->atom = atom; polytope->global = global; polytope->structure = structure; polytope->visible = visible; polytope->coplanar = coplanar; polytope->element = element; polytope->number = number; polytope->max = radius; polytope->color = TRUE; if (polytope->group->red == -1.0) polytope->color = FALSE; /********************************************************** * allocate atoms in cells with lists, for atom searching * * * * allocate arrays faces,edges,vertices to build polytope * * * * allocate arrays to find neighbours * * * * start unique id counter, to retrieve old conflicts * **********************************************************/ static_cells_create (polytope); static_arrays_create (polytope); return polytope; } static void static_end (static_polytope *polytope) { gamgi_dlist *dlist; /************************** * free arrays and shells * **************************/ static_arrays_remove (polytope); static_cells_remove (polytope); /********************** * free list of atoms * **********************/ dlist = polytope->atoms; while (dlist != NULL) dlist = gamgi_engine_dlist_remove_start (dlist); /***************** * free template * *****************/ if (polytope->global == TRUE) gamgi_engine_remove_group (polytope->group); free (polytope); } gamgi_bool gamgi_chem_polytope (gamgi_dlist *atoms, gamgi_group *group, gamgi_atom *atom, gamgi_bool global, gamgi_bool structure, double visible, double coplanar, int element, int number, double radius, int *out, GtkWidget *text) { static_polytope *polytope; polytope = static_start (atoms, group, atom, global, structure, visible, coplanar, element, number, radius); if (polytope == NULL) return FALSE; static_build (out, text, polytope); static_end (polytope); return TRUE; } gamgi-0.17.5/src/chem/gamgi_chem_polytope.h000066400000000000000000000214311433127522700205660ustar00rootroot00000000000000/****************************************** * * $GAMGI/src/chem/gamgi_chem_polytope.h * * Copyright (C) 2009 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * internal functions * ********************** static void static_atom (gamgi_atom *atom, static_polytope *polytope); static int *static_export_points (gamgi_group *group, static_polytope *polytope); static void static_export_loops (int *index, gamgi_group *group, static_polytope *polytope); static void static_export (static_polytope *polytope); static int static_dot (int v1, int v2, double tolerance, static_polytope *polytope); static int static_cross (int v1, int v2, int v3, double tolerance, static_polytope *polytope); static int static_mix (int v1, int v2, int v3, int v4, double tolerance, static_polytope *polytope); static int static_conflict_face_increase (int f, static_polytope *polytope); static int static_conflict_vertex_increase (int v, static_polytope *polytope); static int static_conflict_find (int v1, int v2, int v3, int v, int f, static_polytope *polytope); static int static_conflict_retrieve (int f, int f_old, int v_start, int v_end, int v_new, static_polytope *polytope); static int static_conflict_recreate (int f, int e, int v, static_polytope *polytope); static int static_conflict_create (int v1, int v2, int v3, int f, static_polytope *polytope); static void static_edge_start (int e, static_polytope *polytope); static static_edge *static_edge_create (int e, static_polytope *polytope); static void static_edge_remove (int e, static_polytope *polytope); static void static_edges_mark (int v_new, static_polytope *polytope); static int static_edges_increase (static_polytope *polytope); static void static_edges_clean (int v_new, static_polytope *polytope); static void static_face_start (int f, static_polytope *polytope); static static_face *static_face_create (int f, static_polytope *polytope); static int static_face_increase (int f, static_polytope *polytope); static void static_face_remove (int f, static_polytope *polytope); static void static_faces_mark (int v_new, static_polytope *polytope); static int static_faces_increase (static_polytope *polytope); static void static_face_merge (int f, int v1, int v2, int v3, int e, static_polytope *polytope); static void static_faces_merge (static_polytope *polytope); static void static_faces_clean (int v_new, static_polytope *polytope); static void static_face_build (int v_new, int e_visible, static_polytope *polytope); static void static_vertex_build (int v_new, static_polytope *polytope); static void static_vertex_start (int v, static_polytope *polytope); static static_vertex *static_vertex_create (int v, static_polytope *polytope); static void static_vertices_increase (static_polytope *polytope); static gamgi_bool static_inside_local (int x, int y, int z, static_polytope *polytope); static gamgi_bool static_inside_global (int shell, static_polytope *polytope); void static_neighbour_get (int n_x, int n_y, int n_z, static_polytope *polytope); static void static_raw_x0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_y0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_y1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x0y0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x1y0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x0y1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x1y1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x0z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x1z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x0z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x1z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_y0z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_y1z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_y0z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_y1z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x0y0z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x1y0z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x0y1z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x1y1z0 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x0y0z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x1y0z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x0y1z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static void static_raw_x1y1z1 (int cell_x, int cell_y, int cell_z, int shell, static_polytope *polytope); static gamgi_bool static_neighbours_find (int cell_x, int cell_y, int cell_z, gamgi_slist *start, gamgi_atom *atom, static_polytope *polytope); static void static_neighbours_swap (static_polytope *polytope); static int static_neighbours_independent (static_polytope *polytope); static void static_arrays_create (static_polytope *polytope); static void static_arrays_start (static_polytope *polytope); static void static_arrays_remove (static_polytope *polytope); static void static_cells_create (static_polytope *polytope); static void static_cells_remove (static_polytope *polytope); static void static_build_tetrahedron (static_polytope *polytope); static void static_build_polyhedron (static_polytope *polytope); static int static_build_central (int cell_x, int cell_y, int cell_z, gamgi_slist *start, gamgi_atom *atom, static_polytope *polytope); static void static_measure (int n_vertices, static_polytope *polytope); static void static_report_start (int *n_polyhedrons, int *n_faces, int *n_edges, int *n_vertices, double *polyhedron_faces, double *polyhedron_edges, double *polyhedron_vertices, double *face_vertices, double *vertex_faces, double *polyhedron_volumes, double *polyhedron_areas, double *polyhedron_lengths, double *polyhedron_aberrations, double *face_areas, double *face_lengths, double *face_aberrations, double *edge_lengths, double *edge_angles); static void static_report_add (int *n_polyhedrons, int *n_faces, int *n_edges, int *n_vertices, double *polyhedron_faces, double *polyhedron_edges, double *polyhedron_vertices, double *face_vertices, double *vertex_faces, double *polyhedron_volumes, double *polyhedron_areas, double *polyhedron_lengths, double *polyhedron_aberrations, double *face_areas, double *face_lengths, double *face_aberrations, double *edge_lengths, double *edge_angles, static_polytope *polytope); static void static_report_end (GtkWidget *text, int n_polyhedrons, int n_faces, int n_edges, int n_vertices, double *polyhedron_faces, double *polyhedron_edges, double *polyhedron_vertices, double *face_vertices, double *vertex_faces, double *polyhedron_volumes, double *polyhedron_areas, double *polyhedron_lengths, double *polyhedron_aberrations, double *face_areas, double *face_lengths, double *face_aberrations, double *edge_lengths, double *edge_angles); static void static_build (int *out, GtkWidget *text, static_polytope *polytope); static static_polytope *static_start (gamgi_dlist *atoms, gamgi_group *group, gamgi_atom *atom, gamgi_bool global, gamgi_enum structure, double visible, double coplanar, int element, int number, double radius); static void static_end (static_polytope *polytope); ********************** * external functions * **********************/ gamgi_bool gamgi_chem_polytope (gamgi_dlist *atoms, gamgi_group *group, gamgi_atom *atom, gamgi_bool global, gamgi_bool structure, double visible, double coplanar, int element, int number, double radius, int *out, GtkWidget *text); /************* * Rationale * ************* Implemented. Last update: August 2009. ************* * Rationale * *************/ gamgi-0.17.5/src/chem/gamgi_chem_property.c000066400000000000000000001611231433127522700205750ustar00rootroot00000000000000/****************************************** * * $GAMGI/src/chem/gamgi_chem_property.c * * Copyright (C) 2008 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_chem.h" /********************************************************************** * This list contains all naturally occurring isotopes, with their * * relative abundances, plus all the isotopes with a half-life longer * * than one year (all elements until Cf except At, Rn, Fr), or, when * * these do not exist, one day (Rn, plus Es, Fm, Md), one hour (At, * * Lr, Rf, Db), one minute (Fr, No, Sg) or one second (Bh, Hs, Mt, * * Ds, Rg). Some isotopes have both a natural abundance and a half * * life decay, necessarily very long. Some of these isotopes * * correspond to excited states (Rh, Ag, Sn, Ta, Re, Ir, Bi, Am). * * * * From: http://www.wikipedia.org/, by Carlos Pereira * **********************************************************************/ const int gamgi_chem_property_mass_driver[GAMGI_CHEM_ATOM_MAX + 1] = { /*************************************** * number of positions in double array * ***************************************/ GAMGI_CHEM_MASS_ARRAY, /**************************************************** * starting offset for each element in double array * ****************************************************/ 0, 8, 13, 18, 24, 29, 37, 42, 49, 52, 59, 65, 72, 78, 88, 91, 100, 108, 121, 130, 152, 155, 169, 176, 187, 193, 210, 216, 235, 240, 251, 256, 269, 272, 290, 295, 316, 323, 335, 338, 356, 368, 390, 400, 417, 426, 444, 452, 479, 486, 513, 521, 546, 552, 573, 585, 604, 614, 629, 632, 647, 657, 678, 689, 708, 717, 737, 743, 760, 766, 785, 798, 819, 829, 850, 860, 884, 892, 912, 915, 935, 943, 962, 976, 983, 1000, 1005, 1033, 1040, 1045, 1059, 1064, 1086, 1093, 1115, 1125, 1147, 1154, 1167, 1180, 1187, 1194, 1204, 1208, 1212, 1216, 1220, 1233, 1240, 1244, 1251, }; const double gamgi_chem_property_mass[GAMGI_CHEM_MASS_ARRAY]= { /******* * H 1 * *******/ 1.00795, 1.007825, 99.9885, 2.014102, 0.0115, 3.016049, 12.32, GAMGI_CHEM_MASS_YEAR, /******** * He 2 * ********/ 4.002602, 3.016029, 0.000137, 4.002603, 99.999863, /******** * 3 Li * ********/ 6.941, 6.015123, 7.59, 7.016005, 92.41, /******** * 4 Be * ********/ 9.012182, 9.012182, 100, 10.013534, 1.51E6, GAMGI_CHEM_MASS_YEAR, /******* * 5 B * *******/ 10.812, 10.012937, 19.9, 11.009305, 80.1, /******* * 6 C * *******/ 12.0107, 12.000000, 98.93, 13.003355, 1.07, 14.003242, 5.73E3, GAMGI_CHEM_MASS_YEAR, /******* * 7 N * *******/ 14.0067, 14.003074, 99.632, 15.000109, 0.368, /******* * 8 O * *******/ 15.9994, 15.994915, 99.757, 16.999132, 0.038, 17.999161, 0.205, /******* * 9 F * *******/ 18.998403, 18.998403, 100, /********* * 10 Ne * *********/ 20.1798, 19.992440, 90.48, 20.993847, 0.27, 21.991385, 9.25, /********* * 11 Na * *********/ 22.989769, 21.994436, 2.6027, GAMGI_CHEM_MASS_YEAR, 22.989769, 100, /********* * 12 Mg * *********/ 24.3051, 23.985042, 78.99, 24.985837, 10.00, 25.982593, 11.01, /********* * 13 Al * *********/ 26.981539, 25.986892, 7.17E5, GAMGI_CHEM_MASS_YEAR, 26.981539, 100, /********* * 14 Si * *********/ 28.0855, 27.976927, 92.2296, 28.976495, 4.6832, 29.973770, 3.0872, 31.974148, 170, GAMGI_CHEM_MASS_YEAR, /******** * 15 P * ********/ 30.973762, 30.973762, 100, /******** * 16 S * ********/ 32.065, 31.972071, 94.93, 32.971459, 0.76, 33.967867, 4.29, 35.967081, 0.02, /********* * 17 Cl * *********/ 35.453, 34.968853, 75.78, 35.968307, 3.01E5, GAMGI_CHEM_MASS_YEAR, 36.965903, 24.22, /********* * 18 Ar * *********/ 39.948, 35.967545, 0.3365, 37.962732, 0.0632, 38.964314, 269, GAMGI_CHEM_MASS_YEAR, 39.962383, 99.6003, 41.963047, 32.9, GAMGI_CHEM_MASS_YEAR, /******** * 19 K * ********/ 39.0983, 38.963707, 93.2581, 39.963998, 0.0117, 1.277E9, GAMGI_CHEM_MASS_YEAR, 40.961826, 6.7302, /********* * 20 Ca * *********/ 40.078, 39.962591, 96.941, 5.9E21, GAMGI_CHEM_MASS_YEAR, 40.962278, 1.03E5, GAMGI_CHEM_MASS_YEAR, 41.958618, 0.647, 42.958767, 0.135, 43.955482, 2.086, 45.953693, 0.004, 2.5E15, GAMGI_CHEM_MASS_YEAR, 47.952534, 0.187, 4.3E19, GAMGI_CHEM_MASS_YEAR, /********* * 21 Sc * *********/ 44.955912, 44.955912, 100, /********* * 22 Ti * *********/ 47.867, 43.959690, 60.0, GAMGI_CHEM_MASS_YEAR, 45.952632, 8.25, 46.951763, 7.44, 47.947946, 73.72, 48.947870, 5.41, 49.944791, 5.18, /******** * 23 V * ********/ 50.9415, 49.947159, 0.250, 1.5E17, GAMGI_CHEM_MASS_YEAR, 50.943960, 99.750, /********* * 24 Cr * *********/ 51.9961, 49.946044, 4.345, 1.8E17, GAMGI_CHEM_MASS_YEAR, 51.940508, 83.789, 52.940649, 9.501, 53.938880, 2.365, /********* * 25 Mn * *********/ 54.938046, 52.941290, 3.74E6, GAMGI_CHEM_MASS_YEAR, 54.938045, 100, /********* * 26 Fe * *********/ 55.845, 53.939611, 5.845, 3.1E22, GAMGI_CHEM_MASS_YEAR, 54.938293, 2.737, GAMGI_CHEM_MASS_YEAR, 55.934938, 91.754, 56.935394, 2.119, 57.933276, 0.282, 59.934072, 1.5E6, GAMGI_CHEM_MASS_YEAR, /********* * 27 Co * *********/ 58.933195, 58.933195, 100, 59.933817, 5.2714, GAMGI_CHEM_MASS_YEAR, /********* * 28 Ni * *********/ 58.6934, 57.935343, 68.0769, 7.00E20, GAMGI_CHEM_MASS_YEAR, 58.934347, 7.6E4, GAMGI_CHEM_MASS_YEAR, 59.930786, 26.2231, 60.931056, 1.1399, 61.928345, 3.6345, 62.929669, 100.1, GAMGI_CHEM_MASS_YEAR, 63.927966, 0.9256, /********* * 29 Cu * *********/ 63.546, 62.929598, 69.17, 64.927790, 30.83, /********* * 30 Zn * *********/ 65.409, 63.929142, 48.63, 65.926033, 27.90, 66.927127, 4.10, 67.924844, 18.75, 69.925319, 0.62, /********* * 31 Ga * *********/ 69.723, 68.925574, 60.108, 70.924701, 39.892, /********* * 32 Ge * *********/ 72.64, 69.924247, 20.84, 71.922076, 27.54, 72.923459, 7.73, 73.921178, 36.28, 75.921403, 7.61, 1.78E21, GAMGI_CHEM_MASS_YEAR, /********* * 33 As * *********/ 74.921597, 74.921597, 100, /********* * 34 Se * *********/ 78.96, 73.922476, 0.89, 75.919214, 9.37, 76.919914, 7.63, 77.917309, 23.77, 78.918499, 2.95E5, GAMGI_CHEM_MASS_YEAR, 79.916521, 49.61, 81.916699, 8.73, 1.08E20, GAMGI_CHEM_MASS_YEAR, /********* * 35 Br * *********/ 79.904, 78.918337, 50.69, 80.916291, 49.31, /********* * 36 Kr * *********/ 83.798, 77.920365, 0.35, 2.3E20, GAMGI_CHEM_MASS_YEAR, 79.916379, 2.28, 80.916592, 2.29E5, GAMGI_CHEM_MASS_YEAR, 81.913484, 11.58, 82.914136, 11.49, 83.911507, 57.00, 84.912527, 10.776, GAMGI_CHEM_MASS_YEAR, 85.910611, 17.30, /********* * 37 Rb * *********/ 85.4678, 84.911790, 72.17, 86.909181, 27.83, 4.88E10, GAMGI_CHEM_MASS_YEAR, /********* * 38 Sr * *********/ 87.62, 83.913425, 0.56, 85.909260, 9.86, 86.908877, 7.00, 87.905612, 82.58, 89.907738, 28.90, GAMGI_CHEM_MASS_YEAR, /******** * 39 Y * ********/ 88.905848, 88.905848, 100, /********* * 40 Zr * *********/ 91.224, 89.904704, 51.45, 90.905646, 11.22, 91.905041, 17.15, 92.906476, 1.53E6, GAMGI_CHEM_MASS_YEAR, 93.906315, 17.38, 1.1E17, GAMGI_CHEM_MASS_YEAR, 95.908273, 2.80, 20E18, GAMGI_CHEM_MASS_YEAR, /********* * 41 Nb * *********/ 92.90638, 90.906996, 680, GAMGI_CHEM_MASS_YEAR, 91.907194, 3.47E7, GAMGI_CHEM_MASS_YEAR, 92.906378, 100, 93.907284, 2.03E4, GAMGI_CHEM_MASS_YEAR, /********* * 42 Mo * *********/ 95.94, 91.906811, 14.84, 1.90E20, GAMGI_CHEM_MASS_YEAR, 92.906813, 4.0E3, GAMGI_CHEM_MASS_YEAR, 93.905088, 9.25, 94.905842, 15.92, 95.904680, 16.68, 96.906022, 9.55, 97.905408, 24.13, 99.907478, 9.63, 7.8E18, GAMGI_CHEM_MASS_YEAR, /********* * 43 Tc * *********/ 97.907216, 96.906366, 4.21E6, GAMGI_CHEM_MASS_YEAR, 97.907216, 4.2E6, GAMGI_CHEM_MASS_YEAR, 98.906255, 2.111E5, GAMGI_CHEM_MASS_YEAR, /********* * 44 Ru * *********/ 101.07, 95.907599, 5.54, 6.7E15, GAMGI_CHEM_MASS_YEAR, 97.905288, 1.87, 98.905939, 12.76, 99.904220, 12.60, 100.905582, 17.06, 101.904349, 31.55, 103.905433, 18.62, /********* * 45 Rh * *********/ 102.905504, 100.906164, 3.3, GAMGI_CHEM_MASS_YEAR, -101.906844, 3.742, GAMGI_CHEM_MASS_YEAR, 102.905504, 100, /********* * 46 Pd * *********/ 106.42, 101.905609, 1.02, 103.904036, 11.14, 104.905085, 22.33, 105.903486, 27.33, 106.905133, 6.5E6, GAMGI_CHEM_MASS_YEAR, 107.903892, 26.46, 109.905153, 11.72, 6.00E17, GAMGI_CHEM_MASS_YEAR, /********* * 47 Ag * *********/ 107.8682, 106.905098, 51.839, -107.905957, 418, GAMGI_CHEM_MASS_YEAR, 108.904752, 48.161, /********* * 48 Cd * *********/ 112.412, 105.906460, 1.25, 4.10E20, GAMGI_CHEM_MASS_YEAR, 107.904185, 0.89, 4.10E17, GAMGI_CHEM_MASS_YEAR, 109.903002, 12.49, 110.904178, 12.80, 111.902758, 24.13, 112.904402, 12.22, 7.7E15, GAMGI_CHEM_MASS_YEAR, 113.903359, 28.73, 6.4E18, GAMGI_CHEM_MASS_YEAR, 115.904756, 7.49, 3.1E19, GAMGI_CHEM_MASS_YEAR, /********* * 49 In * *********/ 114.818, 112.904058, 4.29, 114.903879, 95.71, 4.41E14, GAMGI_CHEM_MASS_YEAR, /********* * 50 Sn * *********/ 118.710, 111.904819, 0.97, 113.902779, 0.66, 114.903342, 0.34, 115.901741, 14.54, 116.902952, 7.68, 117.901603, 24.22, 118.903308, 8.59, 119.902195, 32.58, -120.904236, 44, GAMGI_CHEM_MASS_YEAR, 121.903439, 4.63, 123.905274, 5.79, 125.907653, 2.30E5, GAMGI_CHEM_MASS_YEAR, /********* * 51 Sb * *********/ 121.760, 120.903816, 57.21, 122.904214, 42.79, 124.905254, 2.75856, GAMGI_CHEM_MASS_YEAR, /********* * 52 Te * *********/ 127.60, 119.90402, 0.09, 2.2E16, GAMGI_CHEM_MASS_YEAR, 121.903044, 2.55, 122.904270, 0.89, 6.00E14, GAMGI_CHEM_MASS_YEAR, 123.902818, 4.74, 124.904431, 7.07, 125.903312, 18.84, 127.904463, 31.74, 2.2E24, GAMGI_CHEM_MASS_YEAR, 129.906224, 34.08, 7.90E20, GAMGI_CHEM_MASS_YEAR, /******** * 53 I * ********/ 126.90447, 126.904473, 100, 128.904988, 1.57E7, GAMGI_CHEM_MASS_YEAR, /********* * 54 Xe * *********/ 131.294, 123.905893, 0.09, 4.8E16, GAMGI_CHEM_MASS_YEAR, 125.904274, 0.09, 127.903531, 1.92, 128.904780, 26.44, 129.903508, 4.08, 130.905082, 21.18, 131.904154, 26.89, 133.905395, 10.44, 135.907220, 8.87, /********* * 55 Cs * *********/ 132.905452, 132.905452, 100, 133.906718, 2.0652, GAMGI_CHEM_MASS_YEAR, 134.905977, 2.3E6, GAMGI_CHEM_MASS_YEAR, 136.907090, 30.1671, GAMGI_CHEM_MASS_YEAR, /********* * 56 Ba * *********/ 137.328, 129.906321, 0.106, 4.0E21, GAMGI_CHEM_MASS_YEAR, 131.905061, 0.101, 3.00E18, GAMGI_CHEM_MASS_YEAR, 133.904508, 2.417, 134.905689, 6.592, 135.904576, 7.854, 136.905827, 11.232, 137.905247, 71.698, /********* * 57 La * *********/ 138.90548, 136.906494, 6E4, GAMGI_CHEM_MASS_YEAR, 137.907112, 0.090, 1.02E11, GAMGI_CHEM_MASS_YEAR, 138.906353, 99.910, /********* * 58 Ce * *********/ 140.116, 135.907172, 0.185, 3.8E16, GAMGI_CHEM_MASS_YEAR, 137.905991, 0.251, 1.50E14, GAMGI_CHEM_MASS_YEAR, 139.905439, 88.450, 141.909244, 11.114, 5.0E16, GAMGI_CHEM_MASS_YEAR, /********* * 59 Pr * *********/ 140.907653, 140.907653, 100, /********* * 60 Nd * *********/ 144.242, 141.907723, 27.2, 142.909814, 12.2, 143.910087, 23.8, 144.912574, 8.3, 145.913117, 17.2, 147.916893, 5.7, 149.920891, 5.6, /********* * 61 Pm * *********/ 144.912749, 144.912749, 17.7, GAMGI_CHEM_MASS_YEAR, 145.914697, 5.53, GAMGI_CHEM_MASS_YEAR, 146.915139, 2.6234, GAMGI_CHEM_MASS_YEAR, /********* * 62 Sm * *********/ 150.36, 143.911999, 3.07, 145.913041, 1.03E8, GAMGI_CHEM_MASS_YEAR, 146.914898, 14.99, 147.914823, 11.24, 148.917185, 13.82, 149.917276, 7.38, 150.919932, 91, GAMGI_CHEM_MASS_YEAR, 151.919732, 26.75, 153.922209, 22.75, /********* * 63 Eu * *********/ 151.964, 149.919702, 36.9, GAMGI_CHEM_MASS_YEAR, 150.919850, 47.81, 151.921745, 13.537, GAMGI_CHEM_MASS_YEAR, 152.921230, 52.19, /********* * 64 Gd * *********/ 157.25, 151.919791, 0.20, 1.08E14, GAMGI_CHEM_MASS_YEAR, 153.920866, 2.18, 154.922622, 14.80, 155.922123, 20.47, 156.923960, 15.65, 157.924104, 24.84, 159.927054, 21.86, 3.1E+19, GAMGI_CHEM_MASS_YEAR, /********* * 65 Tb * *********/ 158.925347, 156.924025, 71, GAMGI_CHEM_MASS_YEAR, 157.925413, 180, GAMGI_CHEM_MASS_YEAR, 158.925347, 100, /********* * 66 Dy * *********/ 162.500, 153.924425, 3.0E6, GAMGI_CHEM_MASS_YEAR, 155.924284, 0.06, 1E18, GAMGI_CHEM_MASS_YEAR, 157.924409, 0.10, 159.925198, 2.34, 160.926933, 18.91, 161.926798, 25.51, 162.928731, 24.90, 163.929175, 28.18, /********* * 67 Ho * *********/ 164.930322, 162.928734, 4.570E3, GAMGI_CHEM_MASS_YEAR, 164.930322, 100, /********* * 68 Er * *********/ 167.259, 161.928778, 0.14, 1.40E14, GAMGI_CHEM_MASS_YEAR, 163.929200, 1.61, 165.930293, 33.61, 166.932048, 22.93, 167.932370, 26.78, 169.935464, 14.93, 3.20E17, GAMGI_CHEM_MASS_YEAR, /********* * 69 Tm * *********/ 168.934213, 168.934213, 100, 170.936429, 1.92, GAMGI_CHEM_MASS_YEAR, /********* * 70 Yb * *********/ 173.04, 167.933898, 0.13, 1.30E14, GAMGI_CHEM_MASS_YEAR, 169.934762, 3.04, 170.936326, 14.28, 171.936382, 21.83, 172.938211, 16.13, 173.938862, 31.83, 175.942572, 12.76, 1.60E17, GAMGI_CHEM_MASS_YEAR, /********* * 71 Lu * *********/ 174.967, 172.938931, 1.37, GAMGI_CHEM_MASS_YEAR, 173.940338, 3.31, GAMGI_CHEM_MASS_YEAR, 174.940772, 97.41, 175.942686, 2.59, 3.85E10, GAMGI_CHEM_MASS_YEAR, /********* * 72 Hf * *********/ 178.49, 171.939448, 1.87, GAMGI_CHEM_MASS_YEAR, 173.940046, 0.16, 2.0E15, GAMGI_CHEM_MASS_YEAR, 175.941409, 5.26, 176.943221, 18.60, 177.943699, 27.28, 178.945816, 13.62, 179.946550, 35.08, 181.950554, 8.90E6, GAMGI_CHEM_MASS_YEAR, /********* * 73 Ta * *********/ 180.94788, 178.945930, 1.82, GAMGI_CHEM_MASS_YEAR, -179.947465, 0.012, 1.2E15, GAMGI_CHEM_MASS_YEAR, 180.947996, 99.988, /******** * 74 W * ********/ 183.84, 179.946704, 0.12, 7.00E17, GAMGI_CHEM_MASS_YEAR, 181.948204, 26.50, 7.0E19, GAMGI_CHEM_MASS_YEAR, 182.950223, 14.31, 8.0E19, GAMGI_CHEM_MASS_YEAR, 183.950931, 30.64, 1.80E20, GAMGI_CHEM_MASS_YEAR, 185.954364, 28.43, 4.1E18, GAMGI_CHEM_MASS_YEAR, /********* * 75 Re * *********/ 186.207, 184.952955, 37.40, -185.954986, 2.0E5, GAMGI_CHEM_MASS_YEAR, 186.955753, 62.60, 4.12E10, GAMGI_CHEM_MASS_YEAR, /********* * 76 Os * *********/ 190.23, 183.952489, 0.02, 5.6E13, GAMGI_CHEM_MASS_YEAR, 185.953838, 1.59, 2.0E15, GAMGI_CHEM_MASS_YEAR, 186.955751, 1.96, 187.955838, 13.24, 188.958148, 16.15, 189.958447, 26.26, 191.961481, 40.78, 9.8E12, GAMGI_CHEM_MASS_YEAR, 193.965182, 6.0, GAMGI_CHEM_MASS_YEAR, /********* * 77 Ir * *********/ 192.217, 190.960594, 37.3, -191.962605, 241, GAMGI_CHEM_MASS_YEAR, 192.962926, 62.7, /********* * 78 Pt * *********/ 195.084, 189.959933, 0.014, 6.5E11, GAMGI_CHEM_MASS_YEAR, 191.961038, 0.782, 192.962987, 50, GAMGI_CHEM_MASS_YEAR, 193.962680, 32.967, 194.964791, 33.832, 195.964952, 25.242, 197.967893, 7.163, 3.20E14, GAMGI_CHEM_MASS_YEAR, /********* * 79 Au * *********/ 196.966569, 196.966569, 100, /********* * 80 Hg * *********/ 200.59, 193.965439, 444, GAMGI_CHEM_MASS_YEAR, 195.965833, 0.15, 2.5E18, GAMGI_CHEM_MASS_YEAR, 197.966769, 9.97, 198.968280, 16.87, 199.968326, 23.10, 200.970302, 13.18, 201.970643, 29.86, 203.973494, 6.87, /********* * 81 Tl * *********/ 204.3833, 202.972344, 29.524, 203.973864, 3.78, GAMGI_CHEM_MASS_YEAR, 204.974428, 70.476, /********* * 82 Pb * *********/ 207.2, 203.973044, 1.4, 1.40E17, GAMGI_CHEM_MASS_YEAR, 204.974482, 1.53E7, GAMGI_CHEM_MASS_YEAR, 205.974465, 24.1, 206.975897, 22.1, 207.976652, 52.4, 2E19, GAMGI_CHEM_MASS_YEAR, 209.984189, 22.20, GAMGI_CHEM_MASS_YEAR, /********* * 83 Bi * *********/ 208.980399, 206.978471, 32.9, GAMGI_CHEM_MASS_YEAR, 207.979742, 3.68E5, GAMGI_CHEM_MASS_YEAR, 208.980399, 100, 1.9E19, GAMGI_CHEM_MASS_YEAR, -209.984120, 3.04E6, GAMGI_CHEM_MASS_YEAR, /********* * 84 Po * *********/ 208.982430, 207.981246, 2.898, GAMGI_CHEM_MASS_YEAR, 208.982430, 102, GAMGI_CHEM_MASS_YEAR, /********* * 85 At * *********/ 209.987149, 206.985784, 1.80, GAMGI_CHEM_MASS_HOUR, 207.986590, 1.63, GAMGI_CHEM_MASS_HOUR, 208.986174, 5.42, GAMGI_CHEM_MASS_HOUR, 209.987149, 100, 8.1, GAMGI_CHEM_MASS_HOUR, 210.987496, 7.215, GAMGI_CHEM_MASS_HOUR, /********* * 86 Rn * *********/ 222.017578, 222.017578, 100, 3.8235, GAMGI_CHEM_MASS_DAY, /********* * 87 Fr * *********/ 223.019736, 209.996408, 3.19, GAMGI_CHEM_MASS_MINUTE, 210.995537, 3.10, GAMGI_CHEM_MASS_MINUTE, 211.996202, 20.1, GAMGI_CHEM_MASS_MINUTE, 221.014256, 4.9, GAMGI_CHEM_MASS_MINUTE, 222.017552, 14.2, GAMGI_CHEM_MASS_MINUTE, 223.019736, 22.01, GAMGI_CHEM_MASS_MINUTE, 224.02326, 3.33, GAMGI_CHEM_MASS_MINUTE, 225.02557, 4.0, GAMGI_CHEM_MASS_MINUTE, 227.03184, 2.47, GAMGI_CHEM_MASS_MINUTE, /********* * 88 Ra * *********/ 226.025410, 226.025410, 1.601E3, GAMGI_CHEM_MASS_YEAR, 228.031070, 5.75, GAMGI_CHEM_MASS_YEAR, /********* * 89 Ac * *********/ 227.027752, 227.027752, 100, 21.772, GAMGI_CHEM_MASS_YEAR, /********* * 90 Th * *********/ 232.038055, 228.028741, 1.9116, GAMGI_CHEM_MASS_YEAR, 229.031762, 7.34E3, GAMGI_CHEM_MASS_YEAR, 230.033139, 7.538E4, GAMGI_CHEM_MASS_YEAR, 232.038055, 100, 1.406E10, GAMGI_CHEM_MASS_YEAR, /********* * 91 Pa * *********/ 231.035884, 231.035884, 100, 3.276E4, GAMGI_CHEM_MASS_YEAR, /******** * 92 U * ********/ 238.02891, 232.037156, 68.9, GAMGI_CHEM_MASS_YEAR, 233.039635, 1.592E5, GAMGI_CHEM_MASS_YEAR, 234.040952, 0.0055, 2.456E5, GAMGI_CHEM_MASS_YEAR, 235.043930, 0.7200, 7.04E8, GAMGI_CHEM_MASS_YEAR, 236.045568, 2.342E7, GAMGI_CHEM_MASS_YEAR, 238.050788, 99.2745, 4.468E9, GAMGI_CHEM_MASS_YEAR, /********* * 93 Np * *********/ 237.048173, 236.04658, 1.55E5, GAMGI_CHEM_MASS_YEAR, 237.048173, 2.145E6, GAMGI_CHEM_MASS_YEAR, /********* * 94 Pu * *********/ 244.064204, 236.046058, 2.859, GAMGI_CHEM_MASS_YEAR, 238.049560, 87.7, GAMGI_CHEM_MASS_YEAR, 239.052163, 2.411E4, GAMGI_CHEM_MASS_YEAR, 240.053814, 6.562E3, GAMGI_CHEM_MASS_YEAR, 241.056852, 14.291, GAMGI_CHEM_MASS_YEAR, 242.058743, 3.75E+5, GAMGI_CHEM_MASS_YEAR, 244.064205, 8.01E+7, GAMGI_CHEM_MASS_YEAR, /********* * 95 Am * *********/ 243.061381, 241.056829, 432.3, GAMGI_CHEM_MASS_YEAR, -242.059549, 141, GAMGI_CHEM_MASS_YEAR, 243.061381, 7.37E3, GAMGI_CHEM_MASS_YEAR, /********* * 96 Cm * *********/ 247.070355, 243.061389, 29.1, GAMGI_CHEM_MASS_YEAR, 244.062753, 18.10, GAMGI_CHEM_MASS_YEAR, 245.065491, 8.5E3, GAMGI_CHEM_MASS_YEAR, 246.067224, 4.76E3, GAMGI_CHEM_MASS_YEAR, 247.070355, 1.57E7, GAMGI_CHEM_MASS_YEAR, 248.072350, 3.49E5, GAMGI_CHEM_MASS_YEAR, 250.078357, 9.0E3, GAMGI_CHEM_MASS_YEAR, /********* * 97 Bk * *********/ 247.070308, 247.070308, 1380, GAMGI_CHEM_MASS_YEAR, 248.07310, 9, GAMGI_CHEM_MASS_YEAR, /********* * 98 Cf * *********/ 251.079588, 249.074854, 351, GAMGI_CHEM_MASS_YEAR, 250.076406, 13.09, GAMGI_CHEM_MASS_YEAR, 251.079588, 900, GAMGI_CHEM_MASS_YEAR, 252.081627, 2.646, GAMGI_CHEM_MASS_YEAR, /********* * 99 Es * *********/ 252.08299, 252.08299, 471.7, GAMGI_CHEM_MASS_DAY, 253.084825, 20.47, GAMGI_CHEM_MASS_DAY, 254.088023, 275.8, GAMGI_CHEM_MASS_DAY, 255.090273, 39.8, GAMGI_CHEM_MASS_DAY, /********** * 100 Fm * **********/ 257.095106, 253.085185, 3.00, GAMGI_CHEM_MASS_DAY, 257.095106, 100.5, GAMGI_CHEM_MASS_DAY, /********** * 101 Md * **********/ 258.098432, 258.098432, 51.5, GAMGI_CHEM_MASS_DAY, 260.10365, 31.9, GAMGI_CHEM_MASS_DAY, /********** * 102 No * **********/ 259.10103, 253.09068, 1.62, GAMGI_CHEM_MASS_MINUTE, 255.093241, 3.1, GAMGI_CHEM_MASS_MINUTE, 259.10103, 59, GAMGI_CHEM_MASS_MINUTE, /********** * 103 Lr * **********/ 262.10963, 262.10963, 4, GAMGI_CHEM_MASS_HOUR, /********** * 104 Rf * **********/ 265.11670, 265.11670, 13, GAMGI_CHEM_MASS_HOUR, /********** * 105 Db * **********/ 268.12546, 268.12546, 32, GAMGI_CHEM_MASS_HOUR, /********** * 106 Sg * **********/ 271.13348, 271.13348, 2.4, GAMGI_CHEM_MASS_MINUTE, /********** * 107 Bh * **********/ 267.12765, 264.1246, 1.4, GAMGI_CHEM_MASS_SECOND, 266.12694, 5, GAMGI_CHEM_MASS_SECOND, 267.12765, 22, GAMGI_CHEM_MASS_SECOND, 272.13804, 10, GAMGI_CHEM_MASS_SECOND, /********** * 108 Hs * **********/ 269.13406, 269.13406, 27, GAMGI_CHEM_MASS_SECOND, 270.13465, 3.6, GAMGI_CHEM_MASS_SECOND, /********** * 109 Mt * **********/ 276.15117, 276.15117, 0.72, GAMGI_CHEM_MASS_SECOND, /********** * 110 Ds * **********/ 280.15981, 280.15981, 12, GAMGI_CHEM_MASS_SECOND, 281.16207, 9.6, GAMGI_CHEM_MASS_SECOND, /********** * 111 Rg * **********/ 280.16448, 280.16448, 3.6, GAMGI_CHEM_MASS_SECOND, }; /************************************************************************ * 1) Half distance between atoms in its element natural state, * * (most from L.E. Sutton (Ed.), Table of interatomic distances * * and configuration in molecules and ions, Supplement 1956-1959, * * Special publication No. 18, Chemical Society, London, UK, * * 1965.). Available up to Cf (98), except Pm, At, Rn, Fr. * * * * 2) Effective atomic (from J.C. Slater, J. Chem. Phys. 1964, 39, * * 3199), empirically derived by comparison of bond lengths in over * * 1200 bond types in ionic, metallic, and covalent crystals and * * molecules. Available up to Am (95) except He, Ne, Kr, Xe, At, * * Rn, Fr. * * * * 3) Calculated atomic (from E. Clementi, D.L.Raimondi, and W.P. * * Reinhardt, J. Chem. Phys. 1963, 38, 2686), obtained from SCF * * ab-initio calculations. Available up to Rn (86) except La, Ce. * * * * 4) Effective covalent (including from R.T. Sanderson in Chemical * * Periodicity, Reinhold, New York, USA, 1962.), empirically obtained * * by comparing distances between single-bonded equal atoms. Available * * for all elements up to La (57), plus Lu (71) to Bi (83) plus Rn. * * * * 5) Calculated covalent, (from Beatriz Cordero et al, in "Covalent * * radii revisited", Dalton Trans., 2008), arguably more consistent * * than the effective covalent radius. Available up to Cm (96). For C, * * there are radius available for sp3, sp2 and sp hybridization. For * * Mn, Fe, Co there are radius available for low (LS) and high (HS) * * spin configurations. * * * * 6) Van der Waals (mainly from A. Bondi, J. Phys. Chem., 1964, 68, * * 441.), established from contact distances between non-bonding atoms * * in touching molecules or atoms. * * * * From: http://www.webelements.com/, by Carlos Pereira, Luis Veiros * ************************************************************************/ const double gamgi_chem_property_radius[GAMGI_CHEM_RADIUS_ARRAY]= { /******* * 1 H * *******/ 0.3706, 0.2500, 0.5300, 0.3700, 0.3100, 1.2000, /******** * 2 He * ********/ 1.5000, 0.0000, 0.3100, 0.3200, 0.2800, 1.4000, /******** * 3 Li * ********/ 1.5195, 1.4500, 1.6700, 1.3400, 1.2800, 1.8200, /******** * 4 Be * ********/ 1.1130, 1.0500, 1.1200, 0.9000, 0.9600, 0.0000, /******* * 5 B * *******/ 0.7945, 0.8500, 0.8700, 0.8200, 0.8400, 0.0000, /******* * 6 C * *******/ 0.7130, 0.7000, 0.6700, 0.7700, 0.7600, 1.7000, /******* * 7 N * *******/ 0.5488, 0.6500, 0.5600, 0.7500, 0.7100, 0.5500, /******* * 8 O * *******/ 0.6037, 0.6000, 0.4800, 0.7300, 0.6600, 1.5200, /******* * 9 F * *******/ 0.7090, 0.5000, 0.4200, 0.7100, 0.5700, 0.4700, /********* * 10 Ne * *********/ 1.5650, 0.0000, 0.3800, 0.6900, 0.5800, 1.5400, /********* * 11 Na * *********/ 1.8580, 1.8000, 1.9000, 1.5400, 1.6600, 2.2700, /********* * 12 Mg * *********/ 1.5985, 1.5000, 1.4500, 1.3000, 1.4100, 1.7300, /********* * 13 Al * *********/ 1.4315, 1.2500, 1.1800, 1.1800, 1.2100, 0.0000, /********* * 14 Si * *********/ 1.1760, 1.1000, 1.1100, 1.1100, 1.1100, 2.1000, /******** * 15 P * ********/ 1.1050, 1.0000, 0.9800, 1.0600, 1.0700, 1.8000, /******** * 16 S * ********/ 1.0250, 1.0000, 0.8800, 1.0200, 1.0500, 1.8000, /********* * 17 Cl * *********/ 0.9455, 1.0000, 0.7900, 0.9900, 1.0200, 1.7500, /********* * 18 Ar * *********/ 1.8600, 0.0000, 0.7100, 0.9700, 1.0600, 1.8800, /******** * 19 K * ********/ 2.2720, 2.2000, 2.4300, 1.9600, 2.0300, 2.7500, /********* * 20 Ca * *********/ 1.9735, 1.8000, 1.9400, 1.7400, 1.7600, 0.0000, /********* * 21 Sc * *********/ 1.6060, 1.6000, 1.8400, 1.4400, 1.7000, 0.0000, /********* * 22 Ti * *********/ 1.4480, 1.4000, 1.7600, 1.3600, 1.6000, 0.0000, /******** * 23 V * ********/ 1.3110, 1.3500, 1.7100, 1.2500, 1.5300, 0.0000, /********* * 24 Cr * *********/ 1.2490, 1.4000, 1.6600, 1.2700, 1.3900, 0.0000, /********* * 25 Mn * *********/ 1.3655, 1.4000, 1.6100, 1.3900, 1.3900, 0.0000, /********* * 26 Fe * *********/ 1.2410, 1.4000, 1.5600, 1.2500, 1.3200, 0.0000, /********* * 27 Co * *********/ 1.2530, 1.3500, 1.5200, 1.2600, 1.2600, 0.0000, /********* * 28 Ni * *********/ 1.2460, 1.3500, 1.4900, 1.2100, 1.2400, 1.6300, /********* * 29 Cu * *********/ 1.2780, 1.3500, 1.4500, 1.3800, 1.3200, 1.4000, /********* * 30 Zn * *********/ 1.3325, 1.3500, 1.4200, 1.3100, 1.2200, 1.3900, /********* * 31 Ga * *********/ 1.2210, 1.3000, 1.3600, 1.2600, 1.2200, 1.8700, /********* * 32 Ge * *********/ 1.2250, 1.2500, 1.2500, 1.2200, 1.2000, 0.0000, /********* * 33 As * *********/ 1.2450, 1.1500, 1.1400, 1.1900, 1.1900, 1.8500, /********* * 34 Se * *********/ 1.1605, 1.1500, 1.0300, 1.1600, 1.2000, 1.9000, /********* * 35 Br * *********/ 1.1420, 1.1500, 0.9400, 1.1400, 1.2000, 1.8500, /********* * 36 Kr * *********/ 2.0200, 0.0000, 0.8800, 1.1000, 1.1600, 2.0200, /********* * 37 Rb * *********/ 2.4750, 2.3500, 2.6500, 2.1100, 2.2000, 0.0000, /********* * 38 Sr * *********/ 2.1515, 2.0000, 2.1900, 1.9200, 1.9500, 0.0000, /******** * 39 Y * ********/ 1.7755, 1.8000, 2.1200, 1.6200, 1.9000, 0.0000, /********* * 40 Zr * *********/ 1.5895, 1.5500, 2.0600, 1.4800, 1.7500, 0.0000, /********* * 41 Nb * *********/ 1.4290, 1.4500, 1.9800, 1.3700, 1.6400, 0.0000, /********* * 42 Mo * *********/ 1.3625, 1.4500, 1.9000, 1.4500, 1.5400, 0.0000, /********* * 43 Tc * *********/ 1.3515, 1.3500, 1.8300, 1.5600, 1.4700, 0.0000, /********* * 44 Ru * *********/ 1.3250, 1.3000, 1.7800, 1.2600, 1.4600, 0.0000, /********* * 45 Rh * *********/ 1.3450, 1.3500, 1.7300, 1.3500, 1.4200, 0.0000, /********* * 46 Pd * *********/ 1.3755, 1.4000, 1.6900, 1.3100, 1.3900, 1.6300, /********* * 47 Ag * *********/ 1.4445, 1.6000, 1.6500, 1.5300, 1.4500, 1.7200, /********* * 48 Cd * *********/ 1.4895, 1.5500, 1.6100, 1.4800, 1.4400, 1.5800, /********* * 49 In * *********/ 1.6255, 1.5500, 1.5600, 1.4400, 1.4200, 1.9300, /********* * 50 Sn * *********/ 1.4050, 1.4500, 1.4500, 1.4100, 1.3900, 2.1700, /********* * 51 Sb * *********/ 1.4500, 1.4500, 1.3300, 1.3800, 1.3900, 0.0000, /********* * 52 Te * *********/ 1.4320, 1.4000, 1.2300, 1.3500, 1.3800, 2.0600, /******** * 53 I * ********/ 1.3330, 1.4000, 1.1500, 1.3300, 1.3900, 1.9800, /********* * 54 Xe * *********/ 2.1950, 0.0000, 1.0800, 1.3000, 1.4000, 2.1600, /********* * 55 Cs * *********/ 2.6545, 2.6000, 2.9800, 2.2500, 2.4400, 0.0000, /********* * 56 Ba * *********/ 2.1735, 2.1500, 2.5300, 1.9800, 2.1500, 0.0000, /********* * 57 La * *********/ 1.8695, 1.9500, 0.0000, 1.6900, 2.0700, 0.0000, /********* * 58 Ce * *********/ 1.8250, 1.8500, 0.0000, 0.0000, 2.0400, 0.0000, /********* * 59 Pr * *********/ 1.8200, 1.8500, 2.4700, 0.0000, 2.0300, 0.0000, /********* * 60 Nd * *********/ 1.8140, 1.8500, 2.0600, 0.0000, 2.0100, 0.0000, /********* * 61 Pm * *********/ 0.0000, 1.8500, 2.0500, 0.0000, 1.9900, 0.0000, /********* * 62 Sm * *********/ 1.7895, 1.8500, 2.3800, 0.0000, 1.9800, 0.0000, /********* * 63 Eu * *********/ 1.9945, 1.8500, 2.3100, 0.0000, 1.9800, 0.0000, /********* * 64 Gd * *********/ 1.7865, 1.8000, 2.3300, 0.0000, 1.9600, 0.0000, /********* * 65 Tb * *********/ 1.7625, 1.7500, 2.2500, 0.0000, 1.9400, 0.0000, /********* * 66 Dy * *********/ 1.7515, 1.7500, 2.2800, 0.0000, 1.9200, 0.0000, /********* * 67 Ho * *********/ 1.7430, 1.7500, 2.2600, 0.0000, 1.9200, 0.0000, /********* * 68 Er * *********/ 1.7340, 1.7500, 2.2600, 0.0000, 1.8900, 0.0000, /********* * 69 Tm * *********/ 1.7235, 1.7500, 2.2200, 0.0000, 1.9000, 0.0000, /********* * 70 Yb * *********/ 1.9400, 1.7500, 2.2200, 0.0000, 1.8700, 0.0000, /********* * 71 Lu * *********/ 1.7175, 1.7500, 2.1700, 1.6000, 1.8700, 0.0000, /********* * 72 Hf * *********/ 1.5635, 1.5500, 2.0800, 1.5000, 1.7500, 0.0000, /********* * 73 Ta * *********/ 1.4300, 1.4500, 2.0000, 1.3800, 1.7000, 0.0000, /******** * 74 W * ********/ 1.3705, 1.3500, 1.9300, 1.4600, 1.6200, 0.0000, /********* * 75 Re * *********/ 1.3705, 1.3500, 1.8800, 1.5900, 1.5100, 0.0000, /********* * 76 Os * *********/ 1.3375, 1.3000, 1.8500, 1.2800, 1.4400, 0.0000, /********* * 77 Ir * *********/ 1.3570, 1.3500, 1.8000, 1.3700, 1.4100, 0.0000, /********* * 78 Pt * *********/ 1.3875, 1.3500, 1.7700, 1.2800, 1.3600, 1.7500, /********* * 79 Au * *********/ 1.4420, 1.3500, 1.7400, 1.4400, 1.3600, 1.6600, /********* * 80 Hg * *********/ 1.5025, 1.5000, 1.7100, 1.4900, 1.3200, 1.5500, /********* * 81 Tl * *********/ 1.7040, 1.9000, 1.5600, 1.4800, 1.4500, 1.9600, /********* * 82 Pb * *********/ 1.7500, 1.8000, 1.5400, 1.4700, 1.4600, 2.0200, /********* * 83 Bi * *********/ 1.5450, 1.6000, 1.4300, 1.4600, 1.4800, 0.0000, /********* * 84 Po * *********/ 1.6725, 1.9000, 1.3500, 0.0000, 1.4000, 0.0000, /********* * 85 At * *********/ 0.0000, 0.0000, 1.2700, 0.0000, 1.5000, 0.0000, /********* * 86 Rn * *********/ 0.0000, 0.0000, 1.2000, 1.4500, 1.5000, 0.0000, /********* * 87 Fr * *********/ 0.0000, 0.0000, 0.0000, 0.0000, 2.6000, 0.0000, /********* * 88 Ra * *********/ 2.2290, 2.1500, 0.0000, 0.0000, 2.2100, 0.0000, /********* * 89 Ac * *********/ 1.8780, 1.9500, 0.0000, 0.0000, 2.1500, 0.0000, /********* * 90 Th * *********/ 1.7975, 1.8000, 0.0000, 0.0000, 2.0600, 0.0000, /********* * 91 Pa * *********/ 1.6060, 1.8000, 0.0000, 0.0000, 2.0000, 0.0000, /******** * 92 U * ********/ 1.3850, 1.7500, 0.0000, 0.0000, 1.9600, 1.8600, /********* * 93 Np * *********/ 1.3100, 1.7500, 0.0000, 0.0000, 1.9000, 0.0000, /********* * 94 Pu * *********/ 1.5130, 1.7500, 0.0000, 0.0000, 1.8700, 0.0000, /********* * 95 Am * *********/ 1.7250, 1.7500, 0.0000, 0.0000, 1.8000, 0.0000, /********* * 96 Cm * *********/ 1.7385, 0.0000, 0.0000, 0.0000, 1.6900, 0.0000, /********* * 97 Bk * *********/ 1.6990, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********* * 98 Cf * *********/ 1.6885, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********* * 99 Es * *********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 100 Fm * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 101 Md * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 102 No * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 103 Lr * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 104 Rf * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 105 Db * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 106 Sg * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 107 Bh * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 108 Hs * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 109 Mt * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 110 Ds * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /********** * 111 Rg * **********/ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, /************************************************************************ * special cases (the first value is 6 C 76 sp3 73 sp2 69 sp * * stored in the normal covalent calculated 25 Mn 139 LS 161 HS * * positions, the remaining are stored here 26 Fe 132 LS 152 HS * * and handled as special cases: 27 Co 126 LS 150 HS * ************************************************************************/ 0.7300, 0.6900, 1.6100, 1.5200, 1.5000, }; /************************************************************************** * Ionic effective radius from R.D. Shannon, Acta Cryst. A32, 751, * * (1976), empirically derived from about 1000 distances, taken mainly * * from oxide and fluoride structures, plus a range of correlations. * * These radius are a function of valence, coordination, mass (for H) * * and low (LS) and high (HS) electronic spin (for Cr, Mn, Fe, Co, Ni). * * Available for all elements up to Cf (98) expect He, Ne, Ar, Kr, Rn. * * * * To get the so-called ionic crystalline radius, suggested by Fumi * * and Tosi and published also by Shannon in the same paper, just sum * * 0.14 to the cation and subtract 0.14 to the anion, so the cation-anion * * distance remain unchanged. According to Shannon, it is felt that these * * crystal radii correspond more closely to the physical size of ions in * * a solid. However, they might less efective in predicting the cation * * coordination by using Pauling's first rule. * **************************************************************************/ const int gamgi_chem_property_ionic_driver[GAMGI_CHEM_IONIC_DRIVER_ARRAY]= { /************************************ * number of positions in int array * ************************************/ GAMGI_CHEM_IONIC_DRIVER_ARRAY, /************************************************* * starting offset for each element in int array * *************************************************/ 112, 118, 119, 124, 129, 134, 139, 147, 154, 162, 163, 172, 178, 183, 187, 194, 202, 210, 211, 220, 228, 232, 242, 255, 272, 299, 321, 337, 350, 362, 368, 373, 379, 385, 393, 403, 404, 414, 422, 428, 436, 447, 460, 468, 479, 486, 496, 511, 519, 524, 531, 538, 548, 557, 561, 569, 578, 586, 599, 607, 616, 621, 632, 644, 650, 659, 669, 675, 681, 689, 699, 704, 710, 719, 728, 738, 750, 757, 765, 773, 782, 791, 806, 813, 819, 822, 823, 826, 830, 833, 841, 851, 869, 883, 893, 904, 910, 916, 922, 923, 924, 925, 928, 929, 930, 931, 932, 933, 934, 935, 936, /******* * H 1 * *******/ 0, +1, 1000, 2000, 2000, GAMGI_CHEM_IONIC_D, /******** * He 2 * ********/ -1, /******** * 3 Li * ********/ 3, +1, 4000, 6000, 8000, /******** * 4 Be * ********/ 6, +2, 3000, 4000, 6000, /******* * 5 B * *******/ 9, +3, 3000, 4000, 6000, /******* * 6 C * *******/ 12, +4, 3000, 4000, 6000, /******* * 7 N * *******/ 15, -3, 4000, +3, 6000, +5, 3000, 6000, /******* * 8 O * *******/ 19, -2, 2000, 3000, 4000, 6000, 8000, /******* * 9 F * *******/ 24, -1, 2000, 3000, 4000, 6000, +7, 6000, /********* * 10 Ne * *********/ -1, /********* * 11 Na * *********/ 29, +1, 4000, 5000, 6000, 7000, 8000, 9000, 12000, /********* * 12 Mg * *********/ 36, +2, 4000, 5000, 6000, 8000, /********* * 13 Al * *********/ 40, +3, 4000, 5000, 6000, /********* * 14 Si * *********/ 43, +4, 4000, 6000, /******** * 15 P * ********/ 45, +3, 6000, +5, 4000, 5000, 6000, /******** * 16 S * ********/ 49, -2, 6000, +4, 6000, +6, 4000, 6000, /********* * 17 Cl * *********/ 53, -1, 6000, +5, 3001, +7, 4000, 6000, /********* * 18 Ar * *********/ -1, /******** * 19 K * ********/ 57, +1, 4000, 6000, 7000, 8000, 9000, 10000, 12000, /********* * 20 Ca * *********/ 64, +2, 6000, 7000, 8000, 9000, 10000, 12000, /********* * 21 Sc * *********/ 70, +3, 6000, 8000, /********* * 22 Ti * *********/ 72, +2, 6000, +3, 6000, +4, 4000, 5000, 6000, 8000, /******** * 23 V * ********/ 78, +2, 6000, +3, 6000, +4, 5000, 6000, 8000, +5, 4000, 5000, 6000, /********* * 24 Cr * *********/ 86, +2, 6000, GAMGI_CHEM_IONIC_LS, GAMGI_CHEM_IONIC_HS, +3, 6000, +4, 4000, 6000, +5, 4000, 6000, 8000, +6, 4000, 6000, /********* * 25 Mn * *********/ 96, +2, 4000, GAMGI_CHEM_IONIC_HS, 5000, GAMGI_CHEM_IONIC_HS, 6000, GAMGI_CHEM_IONIC_LS, GAMGI_CHEM_IONIC_HS, 7000, GAMGI_CHEM_IONIC_HS, 8000, +3, 5000, 6000, GAMGI_CHEM_IONIC_LS, GAMGI_CHEM_IONIC_HS, +4, 4000, 6000, +5, 4000, +6, 4000, +7, 4000, 6000, /********* * 26 Fe * *********/ 111, +2, 4000, 4002, 6000, GAMGI_CHEM_IONIC_LS, GAMGI_CHEM_IONIC_HS, 8000, GAMGI_CHEM_IONIC_HS, +3, 4000, GAMGI_CHEM_IONIC_HS, 5000, 6000, GAMGI_CHEM_IONIC_LS, GAMGI_CHEM_IONIC_HS, 8000, GAMGI_CHEM_IONIC_HS, +4, 6000, +6, 4000, /********* * 27 Co * *********/ 123, +2, 4000, GAMGI_CHEM_IONIC_HS, 5000, 6000, GAMGI_CHEM_IONIC_LS, GAMGI_CHEM_IONIC_HS, 8000, +3, 6000, GAMGI_CHEM_IONIC_LS, GAMGI_CHEM_IONIC_HS, +4, 4000, 6000, /********* * 28 Ni * *********/ 132, +2, 4000, 4002, 5000, 6000, +3, 6000, GAMGI_CHEM_IONIC_LS, GAMGI_CHEM_IONIC_HS, +4, 6000, GAMGI_CHEM_IONIC_LS, /********* * 29 Cu * *********/ 139, +1, 2000, 4000, 6000, +2, 4000, 4002, 5000, 6000, +3, 6000, /********* * 30 Zn * *********/ 147, +2, 4000, 5000, 6000, 8000, /********* * 31 Ga * *********/ 151, +3, 4000, 5000, 6000, /********* * 32 Ge * *********/ 154, +2, 6000, +4, 4000, 6000, /********* * 33 As * *********/ 157, +3, 6000, +5, 4000, 6000, /********* * 34 Se * *********/ 160, -2, 6000, +4, 6000, +6, 4000, 6000, /********* * 35 Br * *********/ 164, -1, 6000, +3, 4002, +5, 3001, +7, 4000, 6000, /********* * 36 Kr * *********/ -1, /********* * 37 Rb * *********/ 169, +1, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 14000, /********* * 38 Sr * *********/ 177, +2, 6000, 7000, 8000, 9000, 10000, 12000, /******** * 39 Y * ********/ 183, +3, 6000, 7000, 8000, 9000, /********* * 40 Zr * *********/ 187, +4, 4000, 5000, 6000, 7000, 8000, 9000, /********* * 41 Nb * *********/ 193, +3, 6000, +4, 6000, 8000, +5, 4000, 6000, 7000, 8000, /********* * 42 Mo * *********/ 200, +3, 6000, +4, 6000, +5, 4000, 6000, +6, 4000, 5000, 6000, 7000, /********* * 43 Tc * *********/ 208, +4, 6000, +5, 6000, +7, 4000, 6000, /********* * 44 Ru * *********/ 212, +3, 6000, +4, 6000, +5, 6000, +7, 4000, +8, 4000, /********* * 45 Rh * *********/ 217, +3, 6000, +4, 6000, +5, 6000, /********* * 46 Pd * *********/ 220, +1, 2000, +2, 4002, 6000, +3, 6000, +4, 6000, /********* * 47 Ag * *********/ 225, +1, 2000, 4000, 4002, 5000, 6000, 7000, 8000, +2, 4002, 6000, +3, 4002, 6000, /********* * 48 Cd * *********/ 236, +2, 4000, 5000, 6000, 7000, 8000, 12000, /********* * 49 In * *********/ 242, +3, 4000, 6000, 8000, /********* * 50 Sn * *********/ 245, +4, 4000, 5000, 6000, 7000, 8000, /********* * 51 Sb * *********/ 250, +3, 4001, 5000, 6000, +5, 6000, /********* * 52 Te * *********/ 254, -2, 6000, +4, 3000, 4000, 6000, +6, 4000, 6000, /******** * 53 I * ********/ 260, -1, 6000, +5, 3001, 6000, +7, 4000, 6000, /********* * 54 Xe * *********/ 265, +8, 4000, 6000, /********* * 55 Cs * *********/ 267, +1, 6000, 8000, 9000, 10000, 11000, 12000, /********* * 56 Ba * *********/ 273, +2, 6000, 7000, 8000, 9000, 10000, 11000, 12000, /********* * 57 La * *********/ 280, +3, 6000, 7000, 8000, 9000, 10000, 12000, /********* * 58 Ce * *********/ 286, +1, 6000, 7000, 8000, 9000, 10000, 12000, +4, 6000, 8000, 10000, 12000, /********* * 59 Pr * *********/ 296, +3, 6000, 8000, 9000, +4, 6000, 8000, /********* * 60 Nd * *********/ 301, +2, 8000, 9000, +3, 6000, 8000, 9000, 12000, /********* * 61 Pm * *********/ 307, +3, 6000, 8000, 9000, /********* * 62 Sm * *********/ 310, +2, 7000, 8000, 9000, +3, 6000, 7000, 8000, 9000, 12000, /********* * 63 Eu * *********/ 318, +2, 6000, 7000, 8000, 9000, 10000, +3, 6000, 7000, 8000, 9000, /********* * 64 Gd * *********/ 327, +3, 6000, 7000, 8000, 9000, /********* * 65 Tb * *********/ 331, +3, 6000, 7000, 8000, 9000, +4, 6000, 8000, /********* * 66 Dy * *********/ 337, +2, 6000, 7000, 8000, +3, 6000, 7000, 8000, 9000, /********* * 67 Ho * *********/ 344, +3, 6000, 8000, 9000, 10000, /********* * 68 Er * *********/ 348, +3, 6000, 7000, 8000, 9000, /********* * 69 Tm * *********/ 352, +2, 6000, 7000, +3, 6000, 8000, 9000, /********* * 70 Yb * *********/ 357, +2, 6000, 7000, 8000, +3, 6000, 7000, 8000, 9000, /********* * 71 Lu * *********/ 364, +3, 6000, 8000, 9000, /********* * 72 Hf * *********/ 367, +4, 4000, 6000, 7000, 8000, /********* * 73 Ta * *********/ 371, +3, 6000, +4, 6000, +5, 6000, 7000, 8000, /******** * 74 W * ********/ 376, +4, 6000, +5, 6000, +6, 4000, 5000, 6000, /********* * 75 Re * *********/ 381, +4, 6000, +5, 6000, +6, 6000, +7, 4000, 6000, /********* * 76 Os * *********/ 386, +4, 6000, +5, 6000, +6, 5000, 6000, +7, 6000, +8, 4000, /********* * 77 Ir * *********/ 392, +3, 6000, +4, 6000, +5, 6000, /********* * 78 Pt * *********/ 395, +2, 4002, 6000, +4, 6000, +5, 6000, /********* * 79 Au * *********/ 399, +1, 6000, +3, 4002, 6000, +5, 6000, /********* * 80 Hg * *********/ 403, +1, 3000, 6000, +2, 2000, 4000, 6000, 8000, /********* * 81 Tl * *********/ 409, +1, 6000, 8000, 12000, +3, 4000, 6000, 8000, /********* * 82 Pb * *********/ 415, +2, 4001, 6000, 7000, 8000, 9000, 10000, 11000, 12000, +4, 4000, 5000, 6000, 8000, /********* * 83 Bi * *********/ 427, +3, 5000, 6000, 8000, +5, 6000, /********* * 84 Po * *********/ 431, +4, 6000, 8000, +6, 6000, /********* * 85 At * *********/ 434, +7, 6000, /********* * 86 Rn * *********/ -1, /********* * 87 Fr * *********/ 435, +1, 6000, /********* * 88 Ra * *********/ 436, +2, 8000, 12000, /********* * 89 Ac * *********/ 438, +3, 6000, /********* * 90 Th * *********/ 439, +4, 6000, 8000, 9000, 10000, 11000, 12000, /********* * 91 Pa * *********/ 445, +3, 6000, +4, 6000, 8000, +5, 6000, 8000, 9000, /******** * 92 U * ********/ 451, +3, 6000, +4, 6000, 7000, 8000, 9000, 12000, +5, 6000, 7000, +6, 2000, 4000, 6000, 7000, 8000, /********* * 93 Np * *********/ 464, +2, 6000, +3, 6000, +4, 6000, 8000, +5, 6000, +6, 6000, +7, 6000, /********* * 94 Pu * *********/ 471, +3, 6000, +4, 6000, 8000, +5, 6000, +6, 6000, /********* * 95 Am * *********/ 476, +2, 7000, 8000, 9000, +3, 6000, 8000, +4, 6000, 8000, /********* * 96 Cm * *********/ 483, +3, 6000, +4, 6000, 8000, /********* * 97 Bk * *********/ 486, +3, 6000, +4, 6000, 8000, /********* * 98 Cf * *********/ 489, +3, 6000, +4, 6000, 8000, /********* * 99 Es * *********/ -1, /********** * 100 Fm * **********/ -1, /********** * 101 Md * **********/ -1, /********** * 102 No * **********/ 492, +2, 6000, /********** * 103 Lr * **********/ -1, /********** * 104 Rf * **********/ -1, /********** * 105 Db * **********/ -1, /********** * 106 Sg * **********/ -1, /********** * 107 Bh * **********/ -1, /********** * 108 Hs * **********/ -1, /********** * 109 Mt * **********/ -1, /********** * 110 Ds * **********/ -1, /********** * 111 Rg * **********/ -1, }; const double gamgi_chem_property_ionic[GAMGI_CHEM_IONIC_ARRAY]= { /******* * H 1 * *******/ -0.38, -0.18, -0.10, /******** * He 2 * ********/ /******** * 3 Li * ********/ 0.590, 0.76, 0.92, /******** * 4 Be * ********/ 0.16, 0.27, 0.45, /******* * 5 B * *******/ 0.01, 0.11, 0.27, /******* * 6 C * *******/ -0.08, 0.15, 0.16, /******* * 7 N * *******/ 1.46, 0.16, -0.104, 0.13, /******* * 8 O * *******/ 1.35, 1.36, 1.38, 1.40, 1.42, /******* * 9 F * *******/ 1.285, 1.30, 1.31, 1.33, 0.08, /********* * 10 Ne * *********/ /********* * 11 Na * *********/ 0.99, 1.00, 1.02, 1.12, 1.18, 1.24, 1.39, /********* * 12 Mg * *********/ 0.57, 0.66, 0.720, 0.89, /********* * 13 Al * *********/ 0.39, 0.48, 0.535, /********* * 14 Si * *********/ 0.26, 0.400, /******** * 15 P * ********/ 0.44, 0.17, 0.29, 0.38, /******** * 16 S * ********/ 1.84, 0.37, 0.12, 0.29, /********* * 17 Cl * *********/ 1.81, 0.12, 0.08, 0.27, /********* * 18 Ar * *********/ /******** * 19 K * ********/ 1.37, 1.38, 1.46, 1.51, 1.55, 1.59, 1.64, /********* * 20 Ca * *********/ 1.00, 1.06, 1.12, 1.18, 1.23, 1.34, /********* * 21 Sc * *********/ 0.745, 0.870, /********* * 22 Ti * *********/ 0.86, 0.670, 0.42, 0.51, 0.605, 0.74, /******** * 23 V * ********/ 0.79, 0.640, 0.53, 0.58, 0.72, 0.355, 0.46, 0.54, /********* * 24 Cr * *********/ 0.73, 0.80, 0.615, 0.41, 0.55, 0.345, 0.49, 0.57, 0.26, 0.44, /********* * 25 Mn * *********/ 0.66, 0.75, 0.67, 0.830, 0.90, 0.96, 0.58, 0.58, 0.645, 0.39, 0.530, 0.33, 0.255, 0.25, 0.46, /********* * 26 Fe * *********/ 0.63, 0.64, 0.61, 0.780, 0.92, 0.49, 0.58, 0.55, 0.645, 0.78, 0.585, 0.25, /********* * 27 Co * *********/ 0.58, 0.67, 0.65, 0.745, 0.90, 0.545, 0.61, 0.40, 0.53, /********* * 28 Ni * *********/ 0.55, 0.49, 0.63, 0.690, 0.56, 0.60, 0.48, /********* * 29 Cu * *********/ 0.46, 0.60, 0.77, 0.57, 0.57, 0.65, 0.73, 0.54, /********* * 30 Zn * *********/ 0.60, 0.68, 0.740, 0.90, /********* * 31 Ga * *********/ 0.47, 0.55, 0.620, /********* * 32 Ge * *********/ 0.73, 0.390, 0.530, /********* * 33 As * *********/ 0.58, 0.335, 0.46, /********* * 34 Se * *********/ 1.98, 0.50, 0.28, 0.42, /********* * 35 Br * *********/ 1.96, 0.59, 0.31, 0.25, 0.39, /********* * 36 Kr * *********/ /********* * 37 Rb * *********/ 1.52, 1.56, 1.61, 1.63, 1.66, 1.69, 1.72, 1.83, /********* * 38 Sr * *********/ 1.18, 1.21, 1.26, 1.31, 1.36, 1.44, /******** * 39 Y * ********/ 0.900, 0.96, 1.019, 1.075, /********* * 40 Zr * *********/ 0.59, 0.66, 0.72, 0.78, 0.84, 0.89, /********* * 41 Nb * *********/ 0.72, 0.68, 0.79, 0.48, 0.64, 0.69, 0.74, /********* * 42 Mo * *********/ 0.69, 0.650, 0.46, 0.61, 0.41, 0.50, 0.59, 0.73, /********* * 43 Tc * *********/ 0.645, 0.60, 0.37, 0.56, /********* * 44 Ru * *********/ 0.68, 0.620, 0.565, 0.38, 0.36, /********* * 45 Rh * *********/ 0.665, 0.60, 0.55, /********* * 46 Pd * *********/ 0.59, 0.64, 0.86, 0.76, 0.615, /********* * 47 Ag * *********/ 0.67, 1.00, 1.02, 1.09, 1.15, 1.22, 1.28, 0.79, 0.94, 0.67, 0.75, /********* * 48 Cd * *********/ 0.78, 0.87, 0.95, 1.03, 1.10, 1.31, /********* * 49 In * *********/ 0.62, 0.800, 0.92, /********* * 50 Sn * *********/ 0.55, 0.62, 0.690, 0.75, 0.81, /********* * 51 Sb * *********/ 0.76, 0.80, 0.76, 0.60, /********* * 52 Te * *********/ 2.21, 0.52, 0.66, 0.97, 0.43, 0.56, /******** * 53 I * ********/ 2.20, 0.44, 0.95, 0.42, 0.53, /********* * 54 Xe * *********/ 0.40, 0.48, /********* * 55 Cs * *********/ 1.67, 1.74, 1.78, 1.81, 1.85, 1.88, /********* * 56 Ba * *********/ 1.35, 1.38, 1.42, 1.47, 1.52, 1.57, 1.61, /********* * 57 La * *********/ 1.032, 1.10, 1.160, 1.216, 1.27, 1.36, /********* * 58 Ce * *********/ 1.01, 1.07, 1.143, 1.196, 1.25, 1.34, 0.87, 0.97, 1.07, 1.14, /********* * 59 Pr * *********/ 0.99, 1.126, 1.179, 0.85, 0.96, /********* * 60 Nd * *********/ 1.29, 1.35, 0.983, 1.109, 1.163, 1.27, /********* * 61 Pm * *********/ 0.97, 1.093, 1.144, /********* * 62 Sm * *********/ 1.22, 1.27, 1.32, 0.958, 1.02, 1.079, 1.132, 1.24, /********* * 63 Eu * *********/ 1.17, 1.20, 1.25, 1.30, 1.35, 0.947, 1.01, 1.066, 1.120, /********* * 64 Gd * *********/ 0.938, 1.00, 1.053, 1.107, /********* * 65 Tb * *********/ 0.923, 0.98, 1.040, 1.095, 0.76, 0.88, /********* * 66 Dy * *********/ 1.07, 1.13, 1.19, 0.912, 0.97, 1.027, 1.083, /********* * 67 Ho * *********/ 0.901, 1.015, 1.072, 1.12, /********* * 68 Er * *********/ 0.890, 0.945, 1.004, 1.062, /********* * 69 Tm * *********/ 1.03, 1.09, 0.880, 0.994, 1.052, /********* * 70 Yb * *********/ 1.02, 1.08, 1.14, 0.868, 0.925, 0.985, 1.042, /********* * 71 Lu * *********/ 0.861, 0.977, 1.032, /********* * 72 Hf * *********/ 0.58, 0.71, 0.76, 0.83, /********* * 73 Ta * *********/ 0.72, 0.68, 0.64, 0.69, 0.74, /******** * 74 W * ********/ 0.66, 0.62, 0.42, 0.51, 0.60, /********* * 75 Re * *********/ 0.63, 0.58, 0.55, 0.38, 0.53, /********* * 76 Os * *********/ 0.630, 0.575, 0.49, 0.545, 0.525, 0.39, /********* * 77 Ir * *********/ 0.68, 0.625, 0.57, /********* * 78 Pt * *********/ 0.60, 0.80, 0.625, 0.57, /********* * 79 Au * *********/ 1.37, 0.68, 0.85, 0.57, /********* * 80 Hg * *********/ 0.97, 1.19, 0.69, 0.96, 1.02, 1.14, /********* * 81 Tl * *********/ 1.50, 1.59, 1.70, 0.75, 0.885, 0.98, /********* * 82 Pb * *********/ 0.98, 1.19, 1.23, 1.29, 1.35, 1.40, 1.45, 1.49, 0.65, 0.73, 0.775, 0.94, /********* * 83 Bi * *********/ 0.96, 1.03, 1.17, 0.76, /********* * 84 Po * *********/ 0.94, 1.08, 0.67, /********* * 85 At * *********/ 0.62, /********* * 86 Rn * *********/ /********* * 87 Fr * *********/ 1.80, /********* * 88 Ra * *********/ 1.48, 1.70, /********* * 89 Ac * *********/ 1.12, /********* * 90 Th * *********/ 0.94, 1.05, 1.09, 1.13, 1.18, 1.21, /********* * 91 Pa * *********/ 1.04, 0.90, 1.01, 0.78, 0.91, 0.95, /******** * 92 U * ********/ 1.025, 0.89, 0.95, 1.00, 1.05, 1.17, 0.76, 0.84, 0.45, 0.52, 0.73, 0.81, 0.86, /********* * 93 Np * *********/ 1.10, 1.01, 0.87, 0.98, 0.75, 0.72, 0.71, /********* * 94 Pu * *********/ 1.00, 0.86, 0.96, 0.74, 0.71, /********* * 95 Am * *********/ 1.21, 1.26, 1.31, 0.975, 1.09, 0.85, 0.95, /********* * 96 Cm * *********/ 0.97, 0.85, 0.95, /********* * 97 Bk * *********/ 0.96, 0.83, 0.93, /********* * 98 Cf * *********/ 0.95, 0.821, 0.92, /********* * 99 Es * *********/ /********** * 100 Fm * **********/ /********** * 101 Md * **********/ /********** * 102 No * **********/ 1.1, /********** * 103 Lr * **********/ /********** * 104 Rf * **********/ /********** * 105 Db * **********/ /********** * 106 Sg * **********/ /********** * 107 Bh * **********/ /********** * 108 Hs * **********/ /********** * 109 Mt * **********/ /********** * 110 Ds * **********/ /********** * 111 Rg * **********/ }; /******************************************* * Format: [0, 1] for each R, G, B channel * * From: http://gabedit.sourceforge.net/, * * with InsightII modifications (C, Si) * * By: Carlos Pereira * *******************************************/ const float gamgi_chem_property_color[GAMGI_CHEM_COLOR_ARRAY]= { /******* * 1 H * *******/ 1.000, 1.000, 1.000, /******** * 2 He * ********/ 0.850, 1.000, 1.000, /******** * 3 Li * ********/ 0.800, 0.500, 1.000, /******** * 4 Be * ********/ 0.760, 1.000, 0.000, /******* * 5 B * *******/ 1.000, 0.710, 0.710, /******* * 6 C * *******/ 0.000, 0.650, 0.000, /******* * 7 N * *******/ 0.500, 0.500, 1.000, /******* * 8 O * *******/ 1.000, 0.000, 0.000, /******* * 9 F * *******/ 0.700, 1.000, 1.000, /********* * 10 Ne * *********/ 0.700, 0.890, 0.960, /********* * 11 Na * *********/ 0.000, 0.000, 1.000, /********* * 12 Mg * *********/ 0.540, 1.000, 0.000, /********* * 13 Al * *********/ 0.750, 0.650, 0.650, /********* * 14 Si * *********/ 1.000, 1.000, 0.000, /******** * 15 P * ********/ 1.000, 0.500, 0.000, /******** * 16 S * ********/ 1.000, 1.000, 0.650, /********* * 17 Cl * *********/ 0.120, 0.940, 0.120, /********* * 18 Ar * *********/ 0.500, 0.820, 0.890, /******** * 19 K * ********/ 0.560, 0.250, 0.830, /********* * 20 Ca * *********/ 0.240, 1.000, 0.000, /********* * 21 Sc * *********/ 0.900, 0.900, 0.900, /********* * 22 Ti * *********/ 0.750, 0.760, 0.780, /******** * 23 V * ********/ 0.650, 0.650, 0.670, /********* * 24 Cr * *********/ 0.540, 0.600, 0.780, /********* * 25 Mn * *********/ 0.610, 0.480, 0.780, /********* * 26 Fe * *********/ 0.500, 0.480, 0.780, /********* * 27 Co * *********/ 0.440, 0.480, 0.780, /********* * 28 Ni * *********/ 0.360, 0.480, 0.760, /********* * 29 Cu * *********/ 1.000, 0.480, 0.380, /********* * 30 Zn * *********/ 0.490, 0.500, 0.690, /********* * 31 Ga * *********/ 0.760, 0.560, 0.560, /********* * 32 Ge * *********/ 0.400, 0.560, 0.560, /********* * 33 As * *********/ 0.740, 0.500, 0.890, /********* * 34 Se * *********/ 1.000, 0.630, 0.000, /********* * 35 Br * *********/ 0.650, 0.160, 0.160, /********* * 36 Kr * *********/ 0.360, 0.720, 0.820, /********* * 37 Rb * *********/ 0.440, 0.180, 0.690, /********* * 38 Sr * *********/ 0.000, 1.000, 0.000, /******** * 39 Y * ********/ 0.580, 1.000, 1.000, /********* * 40 Zr * *********/ 0.580, 0.880, 0.880, /********* * 41 Nb * *********/ 0.450, 0.760, 0.790, /********* * 42 Mo * *********/ 0.330, 0.710, 0.710, /********* * 43 Tc * *********/ 0.230, 0.620, 0.620, /********* * 44 Ru * *********/ 0.140, 0.560, 0.560, /********* * 45 Rh * *********/ 0.040, 0.490, 0.550, /********* * 46 Pd * *********/ 0.000, 0.410, 0.520, /********* * 47 Ag * *********/ 0.880, 0.880, 1.000, /********* * 48 Cd * *********/ 1.000, 0.850, 0.560, /********* * 49 In * *********/ 0.650, 0.460, 0.450, /********* * 50 Sn * *********/ 0.400, 0.500, 0.500, /********* * 51 Sb * *********/ 0.620, 0.390, 0.710, /********* * 52 Te * *********/ 0.830, 0.480, 0.000, /******** * 53 I * ********/ 0.580, 0.000, 0.580, /********* * 54 Xe * *********/ 0.260, 0.620, 0.690, /********* * 55 Cs * *********/ 0.340, 0.090, 0.560, /********* * 56 Ba * *********/ 0.000, 0.790, 0.000, /********* * 57 La * *********/ 0.440, 0.830, 1.000, /********* * 58 Ce * *********/ 1.000, 1.000, 0.780, /********* * 59 Pr * *********/ 0.850, 1.000, 0.780, /********* * 60 Nd * *********/ 0.780, 1.000, 0.780, /********* * 61 Pm * *********/ 0.640, 1.000, 0.780, /********* * 62 Sm * *********/ 0.560, 1.000, 0.780, /********* * 63 Eu * *********/ 0.380, 1.000, 0.780, /********* * 64 Gd * *********/ 0.270, 1.000, 0.780, /********* * 65 Tb * *********/ 0.190, 1.000, 0.780, /********* * 66 Dy * *********/ 0.120, 1.000, 0.780, /********* * 67 Ho * *********/ 0.000, 1.000, 0.610, /********* * 68 Er * *********/ 0.000, 0.900, 0.460, /********* * 69 Tm * *********/ 0.000, 0.830, 0.320, /********* * 70 Yb * *********/ 0.000, 0.750, 0.220, /********* * 71 Lu * *********/ 0.000, 0.670, 0.140, /********* * 72 Hf * *********/ 0.300, 0.760, 1.000, /********* * 73 Ta * *********/ 0.300, 0.650, 1.000, /******** * 74 W * ********/ 0.130, 0.580, 0.840, /********* * 75 Re * *********/ 0.150, 0.490, 0.670, /********* * 76 Os * *********/ 0.150, 0.400, 0.590, /********* * 77 Ir * *********/ 0.090, 0.330, 0.530, /********* * 78 Pt * *********/ 0.960, 0.930, 0.820, /********* * 79 Au * *********/ 0.800, 0.820, 0.120, /********* * 80 Hg * *********/ 0.710, 0.710, 0.760, /********* * 81 Tl * *********/ 0.650, 0.330, 0.300, /********* * 82 Pb * *********/ 0.340, 0.350, 0.380, /********* * 83 Bi * *********/ 0.620, 0.310, 0.710, /********* * 84 Po * *********/ 0.670, 0.360, 0.000, /********* * 85 At * *********/ 0.460, 0.310, 0.270, /********* * 86 Rn * *********/ 0.260, 0.510, 0.590, /********* * 87 Fr * *********/ 0.260, 0.000, 0.400, /********* * 88 Ra * *********/ 0.000, 0.490, 0.000, /********* * 89 Ac * *********/ 0.440, 0.670, 0.980, /********* * 90 Th * *********/ 0.000, 0.730, 1.000, /********* * 91 Pa * *********/ 0.000, 0.630, 1.000, /******** * 92 U * ********/ 0.000, 0.560, 1.000, /********* * 93 Np * *********/ 0.000, 0.500, 1.000, /********* * 94 Pu * *********/ 0.000, 0.420, 1.000, /********* * 95 Am * *********/ 0.330, 0.360, 0.950, /********* * 96 Cm * *********/ 0.470, 0.360, 0.890, /********* * 97 Bk * *********/ 0.540, 0.310, 0.890, /********* * 98 Cf * *********/ 0.630, 0.210, 0.830, /********* * 99 Es * *********/ 0.700, 0.120, 0.830, /********** * 100 Fm * **********/ 0.700, 0.120, 0.730, /********** * 101 Md * **********/ 0.700, 0.050, 0.650, /********** * 102 No * **********/ 0.740, 0.050, 0.530, /********** * 103 Lr * **********/ 0.780, 0.000, 0.400, /********** * 104 Rf * **********/ 0.800, 0.000, 0.350, /********** * 105 Db * **********/ 0.820, 0.000, 0.310, /********** * 106 Sg * **********/ 0.850, 0.000, 0.270, /********** * 107 Bh * **********/ 0.880, 0.000, 0.220, /********** * 108 Hs * **********/ 0.900, 0.000, 0.180, /********** * 109 Mt * **********/ 0.920, 0.000, 0.150, /********** * 110 Ds * **********/ 0.940, 0.000, 0.120, /********** * 111 Rg * **********/ 0.960, 0.000, 0.090, }; gamgi-0.17.5/src/chem/gamgi_chem_property.h000066400000000000000000000015711433127522700206020ustar00rootroot00000000000000/****************************************** * * $GAMGI/src/chem/gamgi_chem_property.h * * Copyright (C) 2008 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ extern const int gamgi_chem_property_mass_driver[GAMGI_CHEM_ATOM_MAX + 1]; extern const double gamgi_chem_property_mass[GAMGI_CHEM_MASS_ARRAY]; extern const double gamgi_chem_property_radius[GAMGI_CHEM_RADIUS_ARRAY]; extern const int gamgi_chem_property_ionic_driver[GAMGI_CHEM_IONIC_DRIVER_ARRAY]; extern const double gamgi_chem_property_ionic[GAMGI_CHEM_IONIC_ARRAY]; extern const float gamgi_chem_property_color[GAMGI_CHEM_COLOR_ARRAY]; /************* * Rationale * ************* Data taken from Wikipedia (mass), WebElements (atomic radius), Shannon articles (ionic radius), Gabedit (color). - 28 Jul 08 - ************* * Rationale * *************/ gamgi-0.17.5/src/chem/gamgi_chem_symmetry.c000066400000000000000000005003411433127522700206010ustar00rootroot00000000000000/************************************************************************* * * $GAMGI/src/chem/gamgi_chem_symmetry.c * * Point group symmetry analyzer. * * Copyright (C) 1996, 2003 Serguei Patchkovskii * Serguei.Patchkovskii@nrc.ca * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /********************************************* * Code taken from the program Symmetry 1.16 * * by Carlos Pereira * *********************************************/ #include "gamgi_engine.h" #include "gamgi_chem.h" #include "gamgi_math.h" #include "gamgi_gtk.h" #include "gamgi_io.h" #include "gamgi_global.h" #include "gamgi_engine_list.h" #include "gamgi_engine_dlist.h" #include "gamgi_gtk_dialog.h" #include "gamgi_math_vector.h" #include "gamgi_math_matrix.h" #define GAMGI_CHEM_STEP_MIN 1e-7 #define GAMGI_CHEM_STEP_MAX 5e-1 #define GAMGI_CHEM_STEP_GRADIENT 1e-7 #define GAMGI_CHEM_STEP_THRESHOLD 1e-10 #define GAMGI_CHEM_STEP_CYCLES 200 #define GAMGI_CHEM_STEP_HITS 5 #define GAMGI_CHEM_FORCE_MIN 1e-3 #define GAMGI_CHEM_FORCE_MAX 1e3 /************************************************************************** * Planes are characterized by the surface normal direction (taken in * * the direction from the coordinate origin) and distance from the * * coordinate origin to the plane in the direction of the surface normal. * * Inversion is characterized by location of the inversion center. * * * * Rotation is characterized by a vector (distance+direction) from * * the origin to the rotation axis, axis direction and rotation order. * * Rotations are in the clockwise direction looking opposite to the * * direction of the axis. Note that this definition of the rotation * * axis is not unique, since an arbitrary multiple of the axis direction * * can be added to the position vector without changing actual operation. * * * * Mirror rotation is defined by the same parameters as normal rotation, * * but the origin is now unambiguous since it defines the position of * * the plane associated with the axis. * * * * function: symmetry transformation function * * table: symmetry transformation table * * order: number transformations to get identity * * parameters: 4 for inversion and planes, 7 for axes * * error: largest error associated with the element * * * * The order of distance, normal, direction in the element structure * * cannot be changed because of static_set, static_get memory functions. * **************************************************************************/ typedef struct _gamgi_symmetry { /******************** * atomic structure * ********************/ int n_atoms; gamgi_atom **atoms; gamgi_dlist *dlist; double center[3]; double *distance; /************** * input data * **************/ gamgi_bool periodic; float initial; float final; GtkWidget *text; /***************** * symmetry data * *****************/ int n_i; struct _gamgi_element **i; int n_m; struct _gamgi_element **m; int n_C; struct _gamgi_element **C; int n_S; struct _gamgi_element **S; struct _gamgi_element *plane; int *sum_C; int *sum_S; } gamgi_symmetry; typedef struct _gamgi_element { void (*function) (gamgi_symmetry *symmetry, struct _gamgi_element *element, gamgi_atom *from, gamgi_atom *to); int *table; int order; int parameters; double error; double distance; double normal[3]; double direction[3]; } gamgi_element; static void static_group (char *group, gamgi_symmetry *symmetry); /************************************************************ * this table shows how to convert the most common chemical * * points groups (n <= 8) to the 32 crystallographic groups * * * * Crystal <- Chemical Elements * * C1 * * Cs m * * Ci i * * C2 C2 * * C3 C3 * * C4 C4 C2 * * C1 - C5 C5 * * C6 C6 C3 C2 * * C1 - C7 C7 * * C4 - C8 C8 C4 C2 * * D2 3C2 * * D3 C3 3C2 * * D4 C4 5C2 * * C2 - D5 C5 5C2 * * D6 C6 C3 7C2 * * C2 - D7 C7 7C2 * * D4 - D8 C8 C4 9C2 * * C2v C2 2m * * C3v C3 3m * * C4v C4 C2 4m * * Cs - C5v C5 5m * * C6v C6 C3 C2 6m * * Cs - C7v C7 7m * * C4v - C8v C8 C4 C2 8m * * C2h i C2 m * * C3h C3 S3 m * * C4h i C4 C2 S4 m * * Cs - C5h C5 S5 m * * C6h i C6 C3 C2 S6 S3 m * * Cs - C7h C7 S7 m * * C4h - C8h i C8 C4 C2 S8 S4 m * * D2h i 3C2 3m * * D3h C3 3C2 S3 4m * * D4h i C4 5C2 S4 5m * * C2v - D5h C5 5C2 S5 6m * * D6h i C6 C3 7C2 S6 S3 7m * * C2v - D7h C7 7C2 S7 8m * * D4h - D8h i C8 C4 9C2 S8 S4 9m * * D2d 3C2 S4 2m * * D3d i C3 3C2 S6 3m * * D4-C4v - D4d C4 5C2 S8 4m * * C2h D5d i C5 5C2 S10 5m * * D6-C6v-S4 - D6d C6 C3 7C2 S12 S4 6m * * C2h - D7d i C7 7C2 S14 7m * * D4-C4v - D8d C8 C4 9C2 S16 8m * * S4 C2 S4 * * S6 i C3 S6 * * C4 - S8 C4 C2 S8 * * T 4C3 3C2 * * Th i 4C3 3C2 4S6 3m * * Td 4C3 3C2 3S4 6m * * O 3C4 4C3 9C2 * * Oh i 3C4 4C3 9C2 4S6 3S4 9m * * C6v-C4v + C0v C0 m * * D6h-D4h + D0h i C0 C2 2m S0 * * T - I 6C5 10C3 15C2 * * Th - Ih i 6C5 10C3 15C2 6S10 10S6 15m * * D6h-D4h-Oh + Kh i C0 m S0 * ************************************************************/ static double pow2 (double x) { return x * x; } static int static_divisors (int number) { int n, sum = 1; n = number; while (--n > 1) if (number % n == 0) sum++; return sum; } static int static_redundant (int n, int p) { int k; for (k = 1; k < p; k++) if (p % k == 0 && n * k % p == 0) return TRUE; return FALSE; } static int static_multiplicity (int n) { int p, sum; if (n == 2) return 1; sum = 2; for (p = 2; 2*p < n; p++) if (static_redundant (n, p) == FALSE) sum += 2; return sum; } /**************************** * transformation functions * ****************************/ static void static_invert (gamgi_symmetry *symmetry, gamgi_element *center, gamgi_atom *from, gamgi_atom *to) { int i; to->element = from->element; /************************************************** * center->distance * center->normal[i] gives the * * inversion point, minus from->position[i] gives * * the vector pointing from the symmetry point to * * the center, summing again center->distance x * * center->normal[i] gives the transformed point. * **************************************************/ for (i = 0; i < 3; i++) to->position[i] = 2 * center->distance * center->normal[i] - from->position[i]; } static void static_reflect (gamgi_symmetry *symmetry, gamgi_element *plane, gamgi_atom *from, gamgi_atom *to) { int i; double r; to->element = from->element; /****************************************************** * The initial >r< gives the distance from the origin * * to the plane, normal to the plane. The dot product * * from->position[i] * plane->normal[i] gives the * * distance from the origin to the point, normal to * * the plane. The difference, the final >r<, gives * * the distance from the plane to the point, normal * * to the plane, which can be positive (point closer * * to the origin than the plane) or negative (point * * farther from the origin than the plane). * ******************************************************/ r = plane->distance; for (i = 0; i < 3; i++) r -= from->position[i] * plane->normal[i]; /***************************************************** * add >2*r< to the point, normal to the plane, so * * the final point is on the other side of the plane * *****************************************************/ for (i = 0; i < 3; i++) to->position[i] = from->position[i] + 2 * r * plane->normal[i]; } static void static_rotate (gamgi_symmetry *symmetry, gamgi_element *axis, gamgi_atom *from, gamgi_atom *to) { double x[3], y[3], a[3], b[3], c[3]; double angle, sin_angle, cos_angle, length; to->element = from->element; /****************************************************** * >x< is the relative position vector going from the * * axis point (geometric center) to the atom position * ******************************************************/ x[0] = from->position[0] - axis->distance * axis->normal[0]; x[1] = from->position[1] - axis->distance * axis->normal[1]; x[2] = from->position[2] - axis->distance * axis->normal[2]; /********************************************************** * dot is the length of the x vector (relative position), * * projected along the >direction< (rotation axis) vector * **********************************************************/ length = x[0] * axis->direction[0] + x[1] * axis->direction[1] + x[2] * axis->direction[2]; /****************************************** * >a< is the >x< vector projected along * * the >direction< (rotation axis) vector * ******************************************/ a[0] = length * axis->direction[0]; a[1] = length * axis->direction[1]; a[2] = length * axis->direction[2]; /************************************** * >b< is the vector perpendicular to * * >direction< (rotation axis) going * * from the axis to the atom position * **************************************/ b[0] = x[0] - a[0]; b[1] = x[1] - a[1]; b[2] = x[2] - a[2]; /****************************************************************** * >c< is the third vector, perpendicular to >b< and >direction<, * * obtained from the cross product: >b< cross >axis->direction< * ******************************************************************/ c[0] = b[1]*axis->direction[2] - b[2]*axis->direction[1]; c[1] = b[2]*axis->direction[0] - b[0]*axis->direction[2]; c[2] = b[0]*axis->direction[1] - b[1]*axis->direction[0]; /******************************************************** * rotation parameters: for a rotation of infinite * * order, any angle should work fine, so we arbitrarily * * choose 1 radian, which is a large rotation, enough * * to check whether the atoms are indeed aligned or not * ********************************************************/ if (axis->order == 0) angle = 1.0; else angle = 2 * GAMGI_MATH_PI / axis->order; sin_angle = sin (angle); cos_angle = cos (angle); /********************************** * after rotation >x< becomes >y< * **********************************/ y[0] = a[0] + b[0]*cos_angle + c[0]*sin_angle; y[1] = a[1] + b[1]*cos_angle + c[1]*sin_angle; y[2] = a[2] + b[2]*cos_angle + c[2]*sin_angle; /****************************************************************** * Initially we went from absolute (>from->position<) to relative * * coordinates (>x<). Now we reverse that transformation, going * * from relative (>y<) to absolute coordinates (>to->position<). * ******************************************************************/ to->position[0] = y[0] + axis->distance * axis->normal[0]; to->position[1] = y[1] + axis->distance * axis->normal[1]; to->position[2] = y[2] + axis->distance * axis->normal[2]; } static void static_rotate_reflect (gamgi_symmetry *symmetry, gamgi_element *axis, gamgi_atom *from, gamgi_atom *to) { double x[3], y[3], a[3], b[3], c[3]; double angle, sin_angle, cos_angle, length; to->element = from->element; /****************************************************** * >x< is the relative position vector going from the * * axis point (geometric center) to the atom position * ******************************************************/ x[0] = from->position[0] - axis->distance * axis->normal[0]; x[1] = from->position[1] - axis->distance * axis->normal[1]; x[2] = from->position[2] - axis->distance * axis->normal[2]; /********************************************************** * dot is the length of the x vector (relative position), * * projected along the >direction< (rotation axis) vector * **********************************************************/ length = x[0] * axis->direction[0] + x[1] * axis->direction[1] + x[2] * axis->direction[2]; /****************************************** * >a< is the >x< vector projected along * * the >direction< (rotation axis) vector * ******************************************/ a[0] = length * axis->direction[0]; a[1] = length * axis->direction[1]; a[2] = length * axis->direction[2]; /************************************** * >b< is the vector perpendicular to * * >direction< (rotation axis) going * * from the axis to the atom position * **************************************/ b[0] = x[0] - a[0]; b[1] = x[1] - a[1]; b[2] = x[2] - a[2]; /****************************************************************** * >c< is the third vector, perpendicular to >b< and >direction<, * * obtained from the cross product: >b< cross >axis->direction< * ******************************************************************/ c[0] = b[1]*axis->direction[2] - b[2]*axis->direction[1]; c[1] = b[2]*axis->direction[0] - b[0]*axis->direction[2]; c[2] = b[0]*axis->direction[1] - b[1]*axis->direction[0]; /******************************************************** * rotation parameters: for a rotation of infinite * * order, any angle should work fine, so we arbitrarily * * choose 1 radian, which is a large rotation, enough * * to check whether the atoms are indeed aligned or not * ********************************************************/ if (axis->order == 0) angle = 1.0; else angle = 2 * GAMGI_MATH_PI / axis->order; sin_angle = sin (angle); cos_angle = cos (angle); /******************************************************************** * after rotation AND reflection >x< becomes >y< * * * * The only difference between this function and static_rotate * * and is the minus signal in the vector >a<. As >a< is a vector * * from the global center to the projection of the initial point * * along the rotation axis, substracting >a< instead of adding it * * as before effectively reflects the rotated point along the plane * * normal to the rotation axis that passes in the global center * ********************************************************************/ y[0] = -a[0] + b[0]*cos_angle + c[0]*sin_angle; y[1] = -a[1] + b[1]*cos_angle + c[1]*sin_angle; y[2] = -a[2] + b[2]*cos_angle + c[2]*sin_angle; /****************************************************************** * Initially we went from absolute (>from->position<) to relative * * coordinates (>x<). Now we reverse that transformation, going * * from relative (>y<) to absolute coordinates (>to->position<). * ******************************************************************/ to->position[0] = y[0] + axis->distance * axis->normal[0]; to->position[1] = y[1] + axis->distance * axis->normal[1]; to->position[2] = y[2] + axis->distance * axis->normal[2]; } static int static_apply (gamgi_symmetry *symmetry, gamgi_element *element) { int i, j, j_best; double distance, distance_best; int n_atoms = symmetry->n_atoms; gamgi_atom **atoms = symmetry->atoms; gamgi_atom new; char *used; /*********************************************** * used is only allocated inside this function * ***********************************************/ used = (char *) malloc (sizeof (char) * n_atoms); for (i = 0; i < n_atoms; i++) used[i] = 0; for (i = 0; i < n_atoms; i++) { if (element->table[i] < 0) { /********************************************* * No symmetric atom yet: apply operation of * * symmetry; new coordinates: new->position * *********************************************/ element->function (symmetry, element, atoms[i], &new); j_best = i; /****************************************************** * initialize distance_best with a distance too large * ******************************************************/ distance_best = 2.0 * symmetry->initial; for (j = 0; j < n_atoms; j++) { if (atoms[j]->element != new.element || used[j] == 1) continue; distance = sqrt (pow2 (new.position[0] - atoms[j]->position[0]) + pow2 (new.position[1] - atoms[j]->position[1]) + pow2 (new.position[2] - atoms[j]->position[2])); if (distance < distance_best) { j_best = j; distance_best = distance; } } /************************************************************* * best pair for atom i is j_best with error = distance_best * *************************************************************/ if (distance_best > symmetry->initial) { /***************************************** * There is no symmetric atom for atom i * *****************************************/ free (used); return -1; } /******************************************************************* * save symmetric pair for atom i and flag it down as already used * *******************************************************************/ element->table[i] = j_best; used[j_best] = 1; } } /**************************************************** * used is always free before leaving this function * ****************************************************/ free (used); return 1; } static int static_order (gamgi_symmetry *symmetry, gamgi_element *element) { int n_atoms = symmetry->n_atoms; int i, j, k ; for (i = 0; i < n_atoms; i++) { /****************************************************************** * for any operation of symmetry, some atoms may remain unchanged * ******************************************************************/ if (element->table[i] == i) continue; /*************************************************** * for improper axis, second-order transform is ok * ***************************************************/ if (element->function == static_rotate_reflect) { j = element->table[i]; if (element->table[j] == i) continue; } /****************************************************** * if an atom is changed by an operation of symmetry, * * then it should return to its initial position * * only after exactly element->order operations. * ******************************************************/ for (j = element->order - 1, k = element->table[i]; j > 0; j--, k = element->table[k]) if (k == i) return -1; /************************************** * For improper axes, the complete * * loop may also take twice the order * **************************************/ if (k != i && element->function == static_rotate_reflect) { /************************************** * improper rotation transform looped * * j steps too early from atom i * **************************************/ for (j = element->order; j > 0; j--, k = element->table[k]) if (k == i) return -1; } /************************************************ * atom does not return to its initial position * * after element->order operations of symmetry. * ************************************************/ if (k != i) return -1; } return 1; } static int static_same (gamgi_symmetry *symmetry, gamgi_element *a, gamgi_element *b) { int n_atoms = symmetry->n_atoms; int i, j; int same; /*********************************************** * check if elements a,b are in the same class * ***********************************************/ if ((a->order != b->order) || (a->parameters != b->parameters) || (a->function != b->function)) return 0; /****************************************************** * check if all atoms are transformed in the same way * ******************************************************/ same = 1; for (i = 0; i < n_atoms; i++) { if (a->table[i] != b->table[i]) { same = 0; break; } } if (same == 0 && a->order > 2) { /*************************************************** * b can also be a reverse transformation for a: * * C6 and C-6 rotations are different for the test * * above, but are the same for the test below. * ***************************************************/ for (i = 0; i < n_atoms; i++) { j = a->table[i]; if (b->table[j] != i) return 0; } return 1; } return same; } static gamgi_element *static_element (void) { return calloc (1, sizeof (gamgi_element)); } static gamgi_element *static_create (gamgi_symmetry *symmetry) { gamgi_element *element; int n_atoms = symmetry->n_atoms; int n; element = static_element (); /*************************************************************** * initialize each symmetry atom pair with an impossible value * ***************************************************************/ element->table = (int *) malloc (sizeof (int) * n_atoms); for (n = 0; n < n_atoms; n++) element->table[n] = -1; return element; } static gamgi_element *static_copy (gamgi_element *old) { gamgi_element *new; /********************************** * the element is well known, so * * table and function are ignored * **********************************/ new = static_element (); new->function = NULL; new->table = NULL; new->order = old->order; new->parameters = old->parameters; new->error = old->error; new->distance = old->distance; gamgi_math_vector_copy (old->normal, new->normal); gamgi_math_vector_copy (old->direction, new->direction); return new; } static void static_insert (gamgi_element ***elements, int *n_elements, int new) { int k; *n_elements += 1; *elements = (gamgi_element **) realloc (*elements, sizeof (gamgi_element *) * (*n_elements)); for (k = *n_elements - 1; k > new; k--) (*elements)[k] = (*elements)[k - 1]; (*elements)[new] = static_element (); } static void static_insert_copy (gamgi_element ***elements, int *n_elements, int old, int new) { static_insert (elements, n_elements, new); if (old >= new) old++; (*elements)[new] = static_copy ((*elements)[old]); } static void static_resize (gamgi_element ***elements, int *n_elements) { int k, empty = 0; for (k = 0; k < *n_elements; k++) { if ((*elements)[k] == NULL) empty++; else (*elements)[k - empty] = (*elements)[k]; } *n_elements -= empty; *elements = (gamgi_element **) realloc (*elements, sizeof (gamgi_element *) * (*n_elements)); } static void static_remove (gamgi_element *element) { /***************************************************************** * element is always non NULL here, unless there is a gross * * mistake somewhere and in that case it is better to crash * * the program (so the mistake is immediately found and removed) * *****************************************************************/ free (element->table); free (element); } static void static_restrict (gamgi_element ***elements, int *n_elements) { int k, order; for (k = 0; k < *n_elements; k++) { order = (*elements)[k]->order; if (order > 6 || order == 5) { static_remove ((*elements)[k]); (*elements)[k] = NULL; } } static_resize (elements, n_elements); } static void static_delete (gamgi_element ***elements, int *n_elements, int offset) { int k; for (k = offset; k < *n_elements; k++) { static_remove ((*elements)[k]); (*elements)[k] = NULL; } static_resize (elements, n_elements); } static int static_quality (gamgi_symmetry *symmetry, gamgi_element *element) { int i, j; int n_atoms = symmetry->n_atoms; gamgi_atom **atoms = symmetry->atoms; gamgi_atom new; double r, error = 0.0; for (i = 0; i < n_atoms; i++) { element->function (symmetry, element, atoms[i], &new); j = element->table[i]; r = sqrt (pow2 (new.position[0] - atoms[j]->position[0]) + pow2 (new.position[1] - atoms[j]->position[1]) + pow2 (new.position[2] - atoms[j]->position[2])); /**************************************** * distance between >new< (transformed) * * and >j< (symmetric) atoms is too big * ****************************************/ if (r > symmetry->final) return -1; if (r > error) error = r; } element->error = error; return 1; } static int static_evaluate (gamgi_symmetry *symmetry, gamgi_element *element, double *sum, double *max) { gamgi_atom **atoms = symmetry->atoms; gamgi_atom new; int i, j; double r; if (element->parameters >= 4) { /***************** * update normal * *****************/ r = sqrt (pow2 (element->normal[0]) + pow2 (element->normal[1]) + pow2 (element->normal[2])); /********************* * Normal collapsed! * *********************/ if (r < GAMGI_MATH_TOLERANCE_LENGTH) return -1; element->normal[0] /= r; element->normal[1] /= r; element->normal[2] /= r; /******************* * update distance * *******************/ if (element->distance < 0) { element->distance = -element->distance; element->normal[0] = -element->normal[0] ; element->normal[1] = -element->normal[1] ; element->normal[2] = -element->normal[2] ; } } if (element->parameters >= 7) { /******************** * update direction * ********************/ r = sqrt (pow2 (element->direction[0]) + pow2 (element->direction[1]) + pow2 (element->direction[2])); /************************ * Direction collapsed! * ************************/ if (r < GAMGI_MATH_TOLERANCE_LENGTH) return -1; element->direction[0] /= r; element->direction[1] /= r; element->direction[2] /= r; } /*************************************************** * evaluate quality of optimized symmetry element: * * max (maximum error) and sum (accumulated error) * ***************************************************/ *sum = *max = 0; for (i = 0; i < symmetry->n_atoms; i++) { element->function (symmetry, element, atoms[i], &new); j = element->table[i]; r = pow2 (atoms[j]->position[0] - new.position[0]) + pow2 (atoms[j]->position[1] - new.position[1]) + pow2 (atoms[j]->position[2] - new.position[2]); if (r > *max) *max = r; *sum += r; } return 1; } static void static_get (gamgi_element *element, double *parameters) { memcpy (parameters, &element->distance, element->parameters * sizeof (double)); } static void static_set (gamgi_element *element, double *parameters) { memcpy (&element->distance, parameters, element->parameters * sizeof (double)); } static int static_optimize (gamgi_symmetry *symmetry, gamgi_element *element) { double parameters[7]; double gradient[7]; double force[7]; double step[7]; double sum, sum_old, sum_new1, sum_new2, sum_down, sum_up, max; double a, b, x, norm; int n, n_parameters = element->parameters; int cycle = 0; int hits = 0; sum = 0; do { sum_old = sum; /******************************************************* * evaluate and check if maximum error is small enough * *******************************************************/ if (static_evaluate (symmetry, element, &sum, &max) < 0) return -1; if (sqrt (max) < symmetry->final) return 1; /****************************************** * check if accumulated error is changing * ******************************************/ if (cycle > 0) { if (fabs (sum - sum_old) > GAMGI_CHEM_STEP_THRESHOLD) hits = 0; else hits++; /********************************************************** * optimization failed: accumulated error is not changing * **********************************************************/ if (hits >= GAMGI_CHEM_STEP_HITS) return -1; } /************************************************************ * evaluate function, gradient and diagonal force constants * ************************************************************/ static_get (element, parameters); for (n = 0; n < n_parameters; n++) { /*************************** * shift down and evaluate * ***************************/ parameters[n] -= GAMGI_CHEM_STEP_GRADIENT; static_set (element, parameters); if (static_evaluate (symmetry, element, &sum_down, &max) < 0) return -1; /************************* * shift up and evaluate * *************************/ parameters[n] += 2*GAMGI_CHEM_STEP_GRADIENT; static_set (element, parameters); if (static_evaluate (symmetry, element, &sum_up, &max) < 0) return -1; /**************************** * reset and grab step data * ****************************/ parameters[n] -= GAMGI_CHEM_STEP_GRADIENT; gradient[n] = (sum_up - sum_down) / (2*GAMGI_CHEM_STEP_GRADIENT); force[n] = (sum_up + sum_down - 2*sum) / (GAMGI_CHEM_STEP_GRADIENT * GAMGI_CHEM_STEP_GRADIENT); } /*************************** * set a quasy-Newton step * ***************************/ norm = 0.0; for (n = 0; n < n_parameters; n++) { if (force[n] < 0) force[n] = -force[n]; if (force[n] < GAMGI_CHEM_FORCE_MIN) force[n] = GAMGI_CHEM_FORCE_MIN; if (force[n] > GAMGI_CHEM_FORCE_MAX) force[n] = GAMGI_CHEM_FORCE_MAX; step[n] = - gradient[n] / force[n]; norm += step[n] * step[n]; } /*************************************** * make sure the step is not too large * ***************************************/ norm = sqrt (norm); if (norm > GAMGI_CHEM_STEP_MAX) { /******************** * renormalize step * ********************/ for (n = 0; n < n_parameters; n++) step[n] *= GAMGI_CHEM_STEP_MAX/norm; norm = GAMGI_CHEM_STEP_MAX; } /********************************************************* * get a configuration with lower accumulated error or * * keep decreasing step until a minimum limit is reached * *********************************************************/ do { /********************************** * change parameters and evaluate * **********************************/ for (n = 0; n < n_parameters; n++) parameters[n] += step[n]; static_set (element, parameters); if (static_evaluate (symmetry, element, &sum_new1, &max) < 0) return -1; if (sum_new1 < sum) break; /***************************************** * reset parameters and set smaller step * *****************************************/ for (n = 0; n < n_parameters; n++) { parameters[n] -= step[n]; step[n] /= 2; } static_set (element, parameters); norm /= 2; } while (norm > GAMGI_CHEM_STEP_MIN); /************************************************************ * optimization failed: accumulated error is not decreasing * ************************************************************/ if (norm <= GAMGI_CHEM_STEP_MIN) return -1; /**************************************************************** * if linear optimization succeded, but only with a small step, * * try quadratic optimization to further improve parameters * ****************************************************************/ if (norm < GAMGI_CHEM_STEP_MAX / 2) { /********************************************************* * do another linear step, evaluate and reset parameters * *********************************************************/ for (n = 0; n < n_parameters; n++) parameters[n] += step[n]; static_set (element, parameters); if (static_evaluate (symmetry, element, &sum_new2, &max) < 0) return -1; for (n = 0; n < n_parameters; n++) parameters[n] -= 2*step[n]; /****************************************************** * interpolation base points: sum, sum_new1, sum_new2 * * * * linear interpolation coefficients: a, b * ******************************************************/ a = (4*sum - sum_new2 - 3*sum_new1) / 2; b = (sum + sum_new2 - 2*sum_new1) / 2; /******************************************** * try to apply interpolation to parameters * ********************************************/ if (b > 0) { x = -a/(2*b); if (x > 0.2 && x < 1.8) for (n = 0; n < n_parameters; n++) parameters[n] += x*step[n]; else b = 0; } /********************************************************* * interpolation failed: restore parameters for the case * * with smaller accumulated error: sum_new1 or sum_new2 * *********************************************************/ if (b <= 0) { if (sum_new2 < sum_new1) for (n = 0; n < n_parameters; n++) parameters[n] += 2*step[n]; else for (n = 0; n < n_parameters; n++) parameters[n] += step[n]; } static_set (element, parameters); } } while (++cycle < GAMGI_CHEM_STEP_CYCLES); /********************************************************* * optimization failed: maximum number of cycles reached * *********************************************************/ return -1; } static int static_refine (gamgi_symmetry *symmetry, gamgi_element *element, int apply) { int n; /******************************************************* * no symmetry correspondence table can be constructed * *******************************************************/ if (apply == 1 && static_apply (symmetry, element) < 0) return -1; /***************************************************** * transformation is identical to inversion center n * *****************************************************/ for (n = 0; n < symmetry->n_i; n++) if (static_same (symmetry, symmetry->i[n], element) == 1) return -1; /****************************************** * transformation is identical to plane n * ******************************************/ for (n = 0; n < symmetry->n_m; n++) if (static_same (symmetry, symmetry->m[n], element) == 1) return -1; /************************************************ * transformation is identical to normal axis n * ************************************************/ for (n = 0; n < symmetry->n_C; n++) if (static_same (symmetry, symmetry->C[n], element) == 1) return -1; /************************************************** * transformation is identical to improper axis n * **************************************************/ for (n = 0; n < symmetry->n_S; n++) if (static_same (symmetry, symmetry->S[n], element) == 1) return -1; /********************************** * incorrect transformation order * **********************************/ if (static_order (symmetry, element) < 0) return -1; /************************* * refine transformation * *************************/ if (static_optimize (symmetry, element) < 0) return -1; /******************************************* * refined transformation not close enough * *******************************************/ if (static_quality (symmetry, element) < 0) return -1; return 1; } /******************************** * inversion-specific functions * ********************************/ static gamgi_element *static_try_i (gamgi_symmetry *symmetry) { gamgi_element *center; double r; /******************************* * initialize symmetry element * *******************************/ center = static_create (symmetry); center->function = static_invert; center->order = 2; center->parameters = 4; /************************************************ * get distance from origin to geometric center * ************************************************/ r = sqrt (pow2 (symmetry->center[0]) + pow2 (symmetry->center[1]) + pow2 (symmetry->center[2])); /****************************************************** * normal pointing from origin to geometric center or * * (1, 0, 0) when geometric center is at the origin * ******************************************************/ if (r > 0) { center->normal[0] = symmetry->center[0] / r; center->normal[1] = symmetry->center[1] / r; center->normal[2] = symmetry->center[2] / r; } else { center->normal[0] = 1; center->normal[1] = 0; center->normal[2] = 0; } /**************************************************** * distance from the origin to the geometric center * ****************************************************/ center->distance = r; if (static_refine (symmetry, center, 1) < 0) { /************************************************ * after refinement: inversion center not found * ************************************************/ static_remove (center); return NULL; } return center; } /**************************** * plane-specific functions * ****************************/ static gamgi_element *static_try_m (gamgi_symmetry *symmetry, int i, int j) { gamgi_atom **atoms = symmetry->atoms; gamgi_element *plane; double dif[3], mid[3]; double r; /**************************************** * Try the plane half-way between atoms * * i and j, normal to the vector rij * ****************************************/ plane = static_create (symmetry); plane->function = static_reflect; plane->order = 2; plane->parameters = 4; /************** * difference * **************/ dif[0] = atoms[i]->position[0] - atoms[j]->position[0]; dif[1] = atoms[i]->position[1] - atoms[j]->position[1]; dif[2] = atoms[i]->position[2] - atoms[j]->position[2]; /********************************** * distance between atoms i and j * **********************************/ r = sqrt (dif[0]*dif[0] + dif[1]*dif[1] + dif[2]*dif[2]); if (r < GAMGI_MATH_TOLERANCE_LENGTH) return NULL; /************ * midpoint * ************/ mid[0] = (atoms[i]->position[0] + atoms[j]->position[0]) / 2.0; mid[1] = (atoms[i]->position[1] + atoms[j]->position[1]) / 2.0; mid[2] = (atoms[i]->position[2] + atoms[j]->position[2]) / 2.0; /********************************************* * unitary vector perpendicular to the plane * *********************************************/ plane->normal[0] = dif[0] / r; plane->normal[1] = dif[1] / r; plane->normal[2] = dif[2] / r; /*************************************************** * project vector >mid< along direction >normal<, * * to get the distance >r< from the origin to the * * plane, along the direction normal to the plane. * ***************************************************/ r = mid[0] * plane->normal[0] + mid[1] * plane->normal[1] + mid[2] * plane->normal[2]; /*********************************************************** * >r< negative: the dot product is negative, so >normal< * * and >mid< vectors point in opposite directions: reverse * * normal direction, so distance becomes positive and the * * >normal< vector points from the origin to the plane. * ***********************************************************/ if (r < 0) { r = -r; plane->normal[0] = -plane->normal[0]; plane->normal[1] = -plane->normal[1]; plane->normal[2] = -plane->normal[2]; } /**************************************************** * before refinement: plane is at r from the origin * ****************************************************/ plane->distance = r; if (static_refine (symmetry, plane, 1) < 0) { /************************************************* * after refinement: plane of symmetry not found * *************************************************/ static_remove (plane); return NULL; } return plane; } static gamgi_element *static_try_m0 (gamgi_symmetry *symmetry) { gamgi_atom **atoms = symmetry->atoms; gamgi_element *plane; int n_atoms = symmetry->n_atoms; int i, j, k; double d0[3], d1[3], d2[3], p[3]; double r, s0, s1, s2; double *d = NULL; /************************************** * Try the plane containing all atoms * **************************************/ plane = static_create (symmetry); plane->function = static_reflect; plane->order = 1; plane->parameters = 4; /*************************************************** * calculate average vector perpendicular to plane * ***************************************************/ /********************************************************* * we need to start with vectors along the 3 independent * * space directions xyz to guarantee that at least one * * of them has a non-zero component perpendicular to the * * plane, otherwise the normal will colapse to zero. * *********************************************************/ d0[0] = 1.0; d0[1] = 0.0; d0[2] = 0.0; d1[0] = 0.0; d1[1] = 1.0; d1[2] = 0.0; d2[0] = 0.0; d2[1] = 0.0; d2[2] = 1.0; /**************************************************** * This loop tries to eliminate contributions * * of the normal, which appear within the molecular * * plane. Once all in-plane contributions are * * eliminated, what remains must be the normal. * ****************************************************/ for (i = 1; i < n_atoms; i++) { for (j = 0; j < i; j++) { /*********************************** * normal vector between i,j atoms * ***********************************/ p[0] = atoms[i]->position[0] - atoms[j]->position[0]; p[1] = atoms[i]->position[1] - atoms[j]->position[1]; p[2] = atoms[i]->position[2] - atoms[j]->position[2]; r = sqrt (p[0]*p[0] + p[1]*p[1] + p[2]*p[2]); if (r < GAMGI_MATH_TOLERANCE_LENGTH) continue; p[0] /= r; p[1] /= r; p[2] /= r; /************************************************** * sn is the length of vector dn projected along * * vector p (p is a unitary vector but dn is not) * * * * (sn * p) is a vector along p of length sn * * * * dn - (sn * p) is a vector perpendicular to p * **************************************************/ s0 = p[0] * d0[0] + p[1] * d0[1] + p[2] * d0[2]; s1 = p[0] * d1[0] + p[1] * d1[1] + p[2] * d1[2]; s2 = p[0] * d2[0] + p[1] * d2[1] + p[2] * d2[2]; for (k = 0; k < 3; k++) { d0[k] -= s0 * p[k]; d1[k] -= s1 * p[k]; d2[k] -= s2 * p[k]; } } } s0 = fabs (d0[0]) + fabs (d0[1]) + fabs (d0[2]); s1 = fabs (d1[0]) + fabs (d1[1]) + fabs (d1[2]); s2 = fabs (d2[0]) + fabs (d2[1]) + fabs (d2[2]); if (s0 >= s1 && s0 >= s2) d = d0; if (s1 >= s0 && s1 >= s2) d = d1; if (s2 >= s0 && s2 >= s1) d = d2; r = sqrt (d[0]*d[0] + d[1]*d[1] + d[2]*d[2]); /********************************************* * unitary vector perpendicular to the plane * *********************************************/ if (r > 0) { plane->normal[0] = d[0] / r; plane->normal[1] = d[1] / r; plane->normal[2] = d[2] / r; } else { plane->normal[0] = 1; plane->normal[1] = 0; plane->normal[2] = 0; } /******************************************************** * project vector >the global center< along direction * * >normal<, to get the distance >r< from the origin to * * the plane, along the direction normal to the plane. * ********************************************************/ r = symmetry->center[0] * plane->normal[0] + symmetry->center[1] * plane->normal[1] + symmetry->center[2] * plane->normal[2]; plane->distance = r; /****************************************************** * all atoms are supposed to be in the plane of * * symmetry, thus plane->order = 1 and each atom * * must transfom into itself. As the transform * * array is already known, the second argument of * * static_refine is 0, so static_apply is not called. * ******************************************************/ for (k = 0; k < n_atoms; k++) plane->table[k] = k; if (static_refine (symmetry, plane, 0) < 0) { /********************************************************** * after refinement: plane containing all atoms not found * **********************************************************/ static_remove (plane); return NULL; } return plane; } /********************************** * normal axes-specific functions * **********************************/ static gamgi_element *static_try_C0 (gamgi_symmetry *symmetry) { gamgi_atom **atoms = symmetry->atoms; gamgi_element *axis; int n_atoms = symmetry->n_atoms; double *center = symmetry->center; double sum[3], rel[3]; double r; int i, k; /************************************* * Try the axis containing all atoms * *************************************/ axis = static_create (symmetry); axis->function = static_rotate; axis->order = 0; axis->parameters = 7; /******************************************** * calculate average vector paralel to axis * ********************************************/ sum[0] = 0; sum[1] = 0; sum[2] = 0; for (i = 0; i < n_atoms; i++) { rel[0] = atoms[i]->position[0] - center[0]; rel[1] = atoms[i]->position[1] - center[1]; rel[2] = atoms[i]->position[2] - center[2]; /********************************************************** * add vectors from origin to all atoms. We need to check * * the dot product to guarantee that the new >rel< vector * * and the sum >sum< of all previous vectors are pointing * * to the same side, thus summing up and not subtracting * **********************************************************/ r = rel[0]*sum[0] + rel[1]*sum[1] + rel[2]*sum[2]; if (r >= 0) for (k = 0; k < 3; k++) sum[k] += rel[k]; else for (k = 0; k < 3; k++) sum[k] -= rel[k]; } /************************* * normalize axis vector * *************************/ r = sqrt (sum[0]*sum[0] + sum[1]*sum[1] + sum[2]*sum[2]); if (r > 0) { sum[0] /= r; sum[1] /= r; sum[2] /= r; } else sum[0] = 1; axis->direction[0] = sum[0]; axis->direction[1] = sum[1]; axis->direction[2] = sum[2]; /**************************************************** * distance from the origin to the geometric center * ****************************************************/ r = sqrt (pow2 (center[0]) + pow2 (center[1]) + pow2 (center[2])); axis->distance = r; /************************************ * unitary vector pointing from the * * origin to the geometric center * ************************************/ if (r > 0) { axis->normal[0] = center[0] / r; axis->normal[1] = center[1] / r; axis->normal[2] = center[2] / r; } else { axis->normal[0] = 1; axis->normal[1] = 0; axis->normal[2] = 0; } /****************************************************** * all atoms are supposed to be in the axis of * * symmetry, thus axis->order = 0 and each atom * * must transfom into itself. As the transform * * array is already known, the second argument of * * static_refine is 0, so static_apply is not called. * ******************************************************/ for (k = 0; k < n_atoms; k++) axis->table[k] = k; if (static_refine (symmetry, axis, 0) < 0) { /********************************************************* * after refinement: axis containing all atoms not found * *********************************************************/ static_remove (axis); return NULL ; } return axis; } static gamgi_element *static_try_Cm (gamgi_symmetry *symmetry) { gamgi_element *axis; double *center = symmetry->center; double r; axis = static_create (symmetry); axis->function = static_rotate; axis->order = 2; axis->parameters = 7; r = sqrt (pow2 (center[0]) + pow2 (center[1]) + pow2 (center[2])); if (r > 0) { axis->normal[0] = center[0] / r; axis->normal[1] = center[1] / r; axis->normal[2] = center[2] / r; } else { axis->normal[0] = 1.0; axis->normal[1] = 0.0; axis->normal[2] = 0.0; } axis->distance = r; /******************************************* * Try C2 perpendicular to molecular plane * *******************************************/ axis->direction[0] = symmetry->plane->normal[0]; axis->direction[1] = symmetry->plane->normal[1]; axis->direction[2] = symmetry->plane->normal[2]; if (static_refine (symmetry, axis, 1) < 0) { /*************************************** * after refinement: C2 axis not found * ***************************************/ static_remove (axis); return NULL ; } return axis; } static gamgi_element *static_try_C2 (gamgi_symmetry *symmetry, int i, int j, double *support) { gamgi_atom **atoms = symmetry->atoms; double *center = symmetry->center; gamgi_element *axis; double ris, rjs, r; double normal[3]; /************************************************************** * make sure atoms i,j are at the same distance from support, * * otherwise support can't actually define a rotation axis * **************************************************************/ ris = sqrt (pow2 (atoms[i]->position[0] - support[0]) + pow2 (atoms[i]->position[1] - support[1]) + pow2 (atoms[i]->position[2] - support[2])); rjs = sqrt (pow2 (atoms[j]->position[0] - support[0]) + pow2 (atoms[j]->position[1] - support[1]) + pow2 (atoms[j]->position[2] - support[2])); if (fabs (ris - rjs) > symmetry->initial) return NULL; /*************************************** * Trying c2 axis for the pair (i, j) * * with the help of the vector support * ***************************************/ axis = static_create (symmetry); axis->function = static_rotate; axis->order = 2; axis->parameters = 7; r = sqrt (pow2 (center[0]) + pow2 (center[1]) + pow2 (center[2])); if (r > 0) { axis->normal[0] = center[0] / r; axis->normal[1] = center[1] / r; axis->normal[2] = center[2] / r; } else { axis->normal[0] = 1; axis->normal[1] = 0; axis->normal[2] = 0; } axis->distance = r; /********************************************************** * i,j,support form a "T", so the center vector is normal * * to the i-j direction, defining a C2 axis for atoms i,j * **********************************************************/ normal[0] = (atoms[i]->position[0] + atoms[j]->position[0])/2 - support[0]; normal[1] = (atoms[i]->position[1] + atoms[j]->position[1])/2 - support[1]; normal[2] = (atoms[i]->position[2] + atoms[j]->position[2])/2 - support[2]; r = sqrt (normal[0]*normal[0] + normal[1]*normal[1] + normal[2]*normal[2]); if (r < symmetry->initial) { /******************************* * c2 is undefined, try random * * direction perpendicular to * * line defined by i,j atoms * *******************************/ normal[0] = atoms[i]->position[0] - atoms[j]->position[0]; normal[1] = atoms[i]->position[1] - atoms[j]->position[1]; normal[2] = atoms[i]->position[2] - atoms[j]->position[2]; if (fabs (normal[2]) + fabs (normal[1]) > GAMGI_MATH_TOLERANCE_LENGTH) { axis->direction[0] = 0.0; axis->direction[1] = normal[2]; axis->direction[2] = -normal[1]; } else { axis->direction[0] = -normal[2]; axis->direction[1] = 0.0; axis->direction[2] = normal[0]; } r = sqrt (pow2 (axis->direction[0]) + pow2 (axis->direction[1]) + pow2 (axis->direction[2])); if (r < GAMGI_MATH_TOLERANCE_LENGTH) { static_remove (axis); return NULL ; } axis->direction[0] /= r; axis->direction[1] /= r; axis->direction[2] /= r; } else { /*********************************** * direction is ok, renormalize it * ***********************************/ axis->direction[0] = normal[0] / r; axis->direction[1] = normal[1] / r; axis->direction[2] = normal[2] / r; } if (static_refine (symmetry, axis, 1) < 0) { /*************************************** * after refinement: c2 axis not found * ***************************************/ static_remove (axis); return NULL ; } return axis; } static gamgi_element *static_try_axis (gamgi_symmetry *symmetry, double a[3], double b[3], double c[3]) { gamgi_element *axis; double *center = symmetry->center; int order, sign; double ra, rb, rc, rab, rbc, rac, r; double direction[3]; double angle; /******************************** * distance to geometric center * ********************************/ ra = sqrt (a[0]*a[0] + a[1]*a[1] + a[2]*a[2]); rb = sqrt (b[0]*b[0] + b[1]*b[1] + b[2]*b[2]); rc = sqrt (c[0]*c[0] + c[1]*c[1] + c[2]*c[2]); /****************************** * points are not on a sphere * ******************************/ if (fabs (ra - rb) > symmetry->initial || fabs (ra - rc) > symmetry->initial || fabs (rb - rc) > symmetry->initial) return NULL; /*************************** * distance between points * ***************************/ rab = sqrt (pow2 (a[0]-b[0]) + pow2 (a[1]-b[1]) + pow2 (a[2]-b[2])); rac = sqrt (pow2 (a[0]-c[0]) + pow2 (a[1]-c[1]) + pow2 (a[2]-c[2])); rbc = sqrt (pow2 (b[0]-c[0]) + pow2 (b[1]-c[1]) + pow2 (b[2]-c[2])); /************************************** * points are not rotation-equivalent * **************************************/ if (fabs (rab - rbc) > symmetry->initial) return NULL; /******************************************** * rotation is underdefined by these points * ********************************************/ if (rab <= GAMGI_MATH_TOLERANCE_LENGTH || rbc <= GAMGI_MATH_TOLERANCE_LENGTH || rac <= GAMGI_MATH_TOLERANCE_LENGTH) return NULL; /***************************************** * The internal angle is calculated from * * the triangle formed by adjacent atoms * * abc, in this order, so ra = rb = rc * * and rab = rbc != rac. * * * * divide the triangle a,c, (horizontal) * * b (below) in two right triangles: * * rac/2 is the opposite side * * (rab+rbc)/2 is the average diagonal * * * * get the half-angle, then multiply by * * 2, to get the full internal angle. * * For a polygon of order n, the angle * * of rotation is 360/n = 180 - internal * * angle. * *****************************************/ /************************************************ * atoms are too close to a straight line, so * * order goes to infinit and angle goes to zero * ************************************************/ angle = GAMGI_MATH_PI - 2*asin (rac/(rab+rbc)); if (fabs(angle) <= GAMGI_MATH_TOLERANCE_ANGLE) return NULL; /********************************************************* * the rotation axis order must be above 2: C2 axes are * * handled elsewhere and S2 axes are handled differently * *********************************************************/ order = floor ((2*GAMGI_MATH_PI)/angle + 0.5); if (order <= 2) return NULL; axis = static_create (symmetry); axis->order = order; axis->parameters = 7; /**************************************************** * distance from the origin to the geometric center * ****************************************************/ r = sqrt (pow2 (center[0]) + pow2 (center[1]) + pow2 (center[2])); axis->distance = r; /************************************ * unitary vector pointing from the * * origin to the geometric center * ************************************/ if (r > 0) { axis->normal[0] = center[0] / r; axis->normal[1] = center[1] / r; axis->normal[2] = center[2] / r; } else { axis->normal[0] = 1.0; axis->normal[1] = 0.0; axis->normal[2] = 0.0; } /***************************************************** * arbitrarily select axis direction so that first * * non-zero component of axis->direction is positive * *****************************************************/ direction[0] = (b[1]-a[1])*(c[2]-b[2]) - (b[2]-a[2])*(c[1]-b[1]); direction[1] = (b[2]-a[2])*(c[0]-b[0]) - (b[0]-a[0])*(c[2]-b[2]); direction[2] = (b[0]-a[0])*(c[1]-b[1]) - (b[1]-a[1])*(c[0]-b[0]); /***************************************************** * arbitrarily select axis direction so that first * * non-zero component of axis->direction is positive * *****************************************************/ sign = 0 ; if (direction[0] <= 0) { if (direction[0] < 0) sign = 1; else { if (direction[1] <= 0) { if (direction[1] < 0) sign = 1; else if (direction[2] < 0) sign = 1; } } } if (sign == 1) { /************************** * reverse axis direction * **************************/ direction[0] = -direction[0]; direction[1] = -direction[1]; direction[2] = -direction[2]; } /****************************************** * normalize axis vector: >r< cannot be 0 * * because of the tests applied above on * * >ra<, >rb<, >rc<, >rab<, >rbc<, >rac< * ******************************************/ r = sqrt (pow2 (direction[0]) + pow2 (direction[1]) + pow2 (direction[2])); axis->direction[0] = direction[0] / r; axis->direction[1] = direction[1] / r; axis->direction[2] = direction[2] / r; /**************************************************** * axis origin is at: axis->distance * axis->normal * * axis is in the direction: axis->direction * *****************************************************/ return axis; } static gamgi_element *static_try_Cn (gamgi_symmetry *symmetry, int na, int nb, int nc) { gamgi_element *axis; double a[3], b[3], c[3]; int i; for (i = 0; i < 3; i++) { a[i] = symmetry->atoms[na]->position[i] - symmetry->center[i]; b[i] = symmetry->atoms[nb]->position[i] - symmetry->center[i]; c[i] = symmetry->atoms[nc]->position[i] - symmetry->center[i]; } /******************************************************* * Do a quick check of geometry validity, to see if it * * is possible a coherent axis defined by these points * ********************************************************/ if ((axis = static_try_axis (symmetry, a, b, c)) == NULL) return NULL; /*********************************************** * Trying Cn axis for the triplet (na, nb, nc) * ***********************************************/ axis->function = static_rotate; if (static_refine (symmetry, axis, 1) < 0) { /*************************************************** * after refinement: C(axis->order) axis not found * ***************************************************/ static_remove (axis); return NULL ; } return axis; } /************************************ * improper axes-specific functions * ************************************/ static gamgi_element *static_try_S0 (gamgi_symmetry *symmetry) { gamgi_atom **atoms = symmetry->atoms; gamgi_element *axis; int n_atoms = symmetry->n_atoms; double *center = symmetry->center; double sum[3], rel[3]; double r; int i, k; /************************************* * Try the axis containing all atoms * *************************************/ axis = static_create (symmetry); axis->function = static_rotate_reflect; axis->order = 0; axis->parameters = 7; /******************************************** * calculate average vector paralel to axis * ********************************************/ sum[0] = 0; sum[1] = 0; sum[2] = 0; for (i = 0; i < n_atoms; i++) { rel[0] = atoms[i]->position[0] - center[0]; rel[1] = atoms[i]->position[1] - center[1]; rel[2] = atoms[i]->position[2] - center[2]; /********************************************************** * add vectors from origin to all atoms. We need to check * * the dot product to guarantee that the new >rel< vector * * and the sum >sum< of all previous vectors are pointing * * to the same side, thus summing up and not subtracting * **********************************************************/ r = rel[0]*sum[0] + rel[1]*sum[1] + rel[2]*sum[2]; if (r >= 0) for (k = 0; k < 3; k++) sum[k] += rel[k]; else for (k = 0; k < 3; k++) sum[k] -= rel[k]; } /************************* * normalize axis vector * *************************/ r = sqrt (sum[0]*sum[0] + sum[1]*sum[1] + sum[2]*sum[2]); if (r > 0) { sum[0] /= r; sum[1] /= r; sum[2] /= r; } else sum[0] = 1; axis->direction[0] = sum[0]; axis->direction[1] = sum[1]; axis->direction[2] = sum[2]; /**************************************************** * distance from the origin to the geometric center * ****************************************************/ r = sqrt (pow2 (center[0]) + pow2 (center[1]) + pow2 (center[2])); axis->distance = r; /************************************ * unitary vector pointing from the * * origin to the geometric center * ************************************/ if (r > 0) { axis->normal[0] = center[0] / r; axis->normal[1] = center[1] / r; axis->normal[2] = center[2] / r; } else { axis->normal[0] = 1; axis->normal[1] = 0; axis->normal[2] = 0; } if (static_refine (symmetry, axis, 1) < 0) { /********************************************************* * after refinement: axis containing all atoms not found * *********************************************************/ static_remove (axis); return NULL ; } return axis; } static gamgi_element *static_try_Sn (gamgi_symmetry *symmetry, int na, int nb, int nc) { gamgi_element * axis; double a[3], b[3], c[3]; double centerpoint[3]; double r; int i; /********************************************************************** * we are looking for this geometry: a,c are below the mirror plane * * and b is above, so their height is - + - as is always the case * * in improper rotations. Summing b+a, with b+c gives a vector that * * lives in the mirror plane. Then we define the vector equivalent * * to b that is below the mirror, so a,c and this new vector define * * a proper rotation which has the same axis as the improper rotation * **********************************************************************/ /**************************************** * first, reduce the problem to Cn case * ****************************************/ for (i = 0; i < 3; i++) { a[i] = symmetry->atoms[na]->position[i] - symmetry->center[i]; b[i] = symmetry->atoms[nb]->position[i] - symmetry->center[i]; c[i] = symmetry->atoms[nc]->position[i] - symmetry->center[i]; } centerpoint[0] = a[0] + c[0] + 2*b[0]; centerpoint[1] = a[1] + c[1] + 2*b[1]; centerpoint[2] = a[2] + c[2] + 2*b[2]; r = sqrt (pow2 (centerpoint[0]) + pow2 (centerpoint[1]) + pow2 (centerpoint[2])); if (r <= GAMGI_MATH_TOLERANCE_LENGTH) return NULL; centerpoint[0] /= r; centerpoint[1] /= r; centerpoint[2] /= r; r = centerpoint[0] * b[0] + centerpoint[1] * b[1] + centerpoint[2] * b[2]; /************************************************************ * The new b is a point which, together with a and c, would * * define a proper axis of the same order, and the same * * direction, as the improper axis we are looking for. * ************************************************************/ b[0] = 2*r*centerpoint[0] - b[0]; b[1] = 2*r*centerpoint[1] - b[1]; b[2] = 2*r*centerpoint[2] - b[2]; /************************************************************* * Do a quick check of geometry validity, to see if it is * * possible a coherent improper axis defined by these points * *************************************************************/ if ((axis = static_try_axis (symmetry, a, b, c)) == NULL) return NULL; /*********************************************** * Trying Sn axis for the triplet (na, nb, nc) * ***********************************************/ axis->function = static_rotate_reflect; if (static_refine (symmetry, axis, 1) < 0) { /*************************************************** * after refinement: S(axis->order) axis not found * ***************************************************/ static_remove (axis); return NULL ; } return axis; } /******************** * Control routines * ********************/ static void static_center (gamgi_symmetry *symmetry) { int i; int n_atoms = symmetry->n_atoms; gamgi_atom **atoms = symmetry->atoms; double center[3]; /****************************** * calculate geometric center * ******************************/ center[0] = 0.0; center[1] = 0.0; center[2] = 0.0; for (i = 0; i < n_atoms; i++) { center[0] += atoms[i]->position[0]; center[1] += atoms[i]->position[1]; center[2] += atoms[i]->position[2]; } symmetry->center[0] = center[0] / n_atoms; symmetry->center[1] = center[1] / n_atoms; symmetry->center[2] = center[2] / n_atoms; /************************************************************** * calculate atomic distances (squared) from geometric center * **************************************************************/ symmetry->distance = (double *) malloc (n_atoms * sizeof (double)); for (i = 0; i < n_atoms; i++) symmetry->distance[i] = pow2 (atoms[i]->position[0] - symmetry->center[0]) + pow2 (atoms[i]->position[1] - symmetry->center[1]) + pow2 (atoms[i]->position[2] - symmetry->center[2]); } static void static_find_i (gamgi_symmetry *symmetry) { gamgi_element *center; /************************ * get inversion center * ************************/ center = static_try_i (symmetry); if (center != NULL) { symmetry->i = (gamgi_element **) calloc (1, sizeof (gamgi_element *)); symmetry->i[0] = center; symmetry->n_i = 1; } } static void static_find_m (gamgi_symmetry *symmetry) { gamgi_element *plane; int n_atoms = symmetry->n_atoms; gamgi_atom **atoms = symmetry->atoms; int i, j; /********************************** * find plane including all atoms * **********************************/ plane = static_try_m0 (symmetry); if (plane != NULL) { symmetry->plane = plane; /*********************************** * update array of symmetry planes * ***********************************/ symmetry->n_m++; symmetry->m = (gamgi_element **) realloc (symmetry->m, sizeof (gamgi_element *) * symmetry->n_m); symmetry->m[symmetry->n_m - 1] = plane; } /********************************* * find planes between atoms i,j * *********************************/ for (i = 1; i < n_atoms; i++) { for (j = 0; j < i; j++) { if (atoms[i]->element != atoms[j]->element) continue; plane = static_try_m (symmetry, i, j); if (plane != NULL) { /*********************************** * update array of symmetry planes * ***********************************/ symmetry->n_m++; symmetry->m = (gamgi_element **) realloc (symmetry->m, sizeof (gamgi_element *) * symmetry->n_m); symmetry->m[symmetry->n_m - 1] = plane; } } } } static void static_find_C0 (gamgi_symmetry *symmetry) { gamgi_element *axis; /********************************* * find axis including all atoms * *********************************/ axis = static_try_C0 (symmetry); if (axis != NULL) { symmetry->n_C++; symmetry->C = (gamgi_element **) realloc (symmetry->C, sizeof (gamgi_element *) * symmetry->n_C); symmetry->C[symmetry->n_C - 1] = axis; } } static void static_find_C2 (gamgi_symmetry *symmetry) { int i, j, k, l; int n_atoms = symmetry->n_atoms; gamgi_atom **atoms = symmetry->atoms; double *distances; double r, center[3]; gamgi_element *axis; /********************************************* * try C2 axis perpendicular to global plane * *********************************************/ if (symmetry->plane != NULL && n_atoms > 1 && (axis = static_try_Cm (symmetry)) != NULL) { symmetry->n_C++; symmetry->C = (gamgi_element **) realloc (symmetry->C, sizeof (gamgi_element *) * symmetry->n_C); symmetry->C[symmetry->n_C - 1] = axis; } /**************************************************** * distances is allocated only inside this function * ****************************************************/ distances = malloc (sizeof (double) * n_atoms); for (i = 0; i < n_atoms; i++) distances[i] = 0.0; for (i = 1; i < n_atoms; i++) { for (j = 0; j < i; j++) { if (atoms[i]->element != atoms[j]->element) continue; /******************************************* * A very cheap, but quite effective check * *******************************************/ if (fabs (symmetry->distance[i] - symmetry->distance[j]) > symmetry->initial) continue; /************************************************************** * First, let's try to get it cheap and use the global center * **************************************************************/ center[0] = (atoms[i]->position[0] + atoms[j]->position[0]) / 2; center[1] = (atoms[i]->position[1] + atoms[j]->position[1]) / 2; center[2] = (atoms[i]->position[2] + atoms[j]->position[2]) / 2; r = sqrt (pow2 (center[0] - symmetry->center[0]) + pow2 (center[1] - symmetry->center[1]) + pow2 (center[2] - symmetry->center[2])); /************************************************* * the global center can be used as the support * * point as long as its distance to the midpoint * * is big enought to accurately define a vector * *************************************************/ if (r > GAMGI_MATH_TOLERANCE_LENGTH) { /******************************************** * the global center is far enough from i,j * * midpoint to be used as the support point * ********************************************/ axis = static_try_C2 (symmetry, i, j, symmetry->center); if (axis != NULL) { symmetry->n_C++; symmetry->C = (gamgi_element **) realloc (symmetry->C, sizeof (gamgi_element *) * symmetry->n_C); symmetry->C[symmetry->n_C - 1] = axis; } /*************************************************** * we can now leave this i,j pair because symmetry * * axes must pass through the global center, so * * other C2 axis for this i,j pair is not possible * ***************************************************/ continue; } /******************************* * C2 can pass through some * * other atom, used as support * *******************************/ for (k = 0; k < n_atoms; k++) { /************************************************************* * the i,j midpoint is in (or fairly close to) the geometric * * center, so it is possible to have an unlimited number of * * c2 axes passing in this i,j midpoint and any atom k * *************************************************************/ if ((axis = static_try_C2 (symmetry, i, j, atoms[k]->position)) != NULL) { symmetry->n_C++; symmetry->C = (gamgi_element **) realloc (symmetry->C, sizeof (gamgi_element *) * symmetry->n_C); symmetry->C[symmetry->n_C - 1] = axis; } /****************************************************** * we cannot leave this i,j pair yet because other * * C2 symmetry axis are possible for this i,j pair, * * as long as they all pass through the global center * ******************************************************/ } /****************************************************** * Prepare data for an additional pre-screening check * ******************************************************/ for (k = 0; k < n_atoms; k++) distances[k] = sqrt (pow2 (atoms[k]->position[0] - center[0]) + pow2 (atoms[k]->position[1] - center[1]) + pow2 (atoms[k]->position[2] - center[2])); /************************************* * C2 can pass through the middle of * * some other pair, used as support * *************************************/ for (k = 0; k < n_atoms; k++) { for (l = 0 ; l < n_atoms; l++) { if (atoms[k]->element != atoms[l]->element) continue; /*************************************************** * We really need this one to run reasonably fast! * ***************************************************/ if (fabs (symmetry->distance[k] - symmetry->distance[l]) > symmetry->initial || fabs (distances[k] - distances[l]) > symmetry->initial) continue; /************ * midpoint * ************/ center[0] = (atoms[k]->position[0] + atoms[l]->position[0]) / 2; center[1] = (atoms[k]->position[1] + atoms[l]->position[1]) / 2; center[2] = (atoms[k]->position[2] + atoms[l]->position[2]) / 2; /************************************************************* * the i,j midpoint is in (or fairly close to) the geometric * * center, so it is possible to have an unlimited number of * * c2 axes passing in this i,j midpoint and any k,l midpoint * *************************************************************/ axis = static_try_C2 (symmetry, i, j, center); if (axis != NULL) { symmetry->n_C++ ; symmetry->C = (gamgi_element **) realloc (symmetry->C, sizeof (gamgi_element *) * symmetry->n_C); symmetry->C[symmetry->n_C - 1] = axis; } } } } } free (distances); } static void static_find_Cn (gamgi_symmetry *symmetry) { gamgi_atom **atoms = symmetry->atoms; gamgi_element *axis; int n_atoms = symmetry->n_atoms; int i, j, k ; for (i = 0; i < n_atoms; i++) { for (j = i + 1; j < n_atoms; j++) { if (atoms[i]->element != atoms[j]->element) continue; /******************************************* * A very cheap, but quite effective check * *******************************************/ if (fabs (symmetry->distance[i] - symmetry->distance[j]) > symmetry->initial) continue; for (k = 0; k < symmetry->n_atoms; k++) { if (atoms[i]->element != atoms[k]->element) continue; /********************************************************** * distance between atoms i,j,k and the geometric center * * must be equal, distances i-j and j-k must be equal but * * distance i-k can be different (j is the central atom) * **********************************************************/ if ((fabs (symmetry->distance[i] - symmetry->distance[k]) > symmetry->initial) || (fabs (symmetry->distance[j] - symmetry->distance[k]) > symmetry->initial)) continue; axis = static_try_Cn (symmetry, i, j, k); if (axis != NULL) { symmetry->n_C++; symmetry->C = (gamgi_element **) realloc (symmetry->C, sizeof (gamgi_element *) * symmetry->n_C); symmetry->C[symmetry->n_C - 1] = axis; } } } } } static void static_find_S0 (gamgi_symmetry *symmetry) { gamgi_element *axis; /************************************* * Try the axis containing all atoms * *************************************/ axis = static_try_S0 (symmetry); if (axis != NULL) { symmetry->n_S++; symmetry->S = (gamgi_element **) realloc (symmetry->S, sizeof (gamgi_element *) * symmetry->n_S); symmetry->S[symmetry->n_S - 1] = axis; } } static void static_find_Sn (gamgi_symmetry *symmetry) { int i, j, k; int n_atoms = symmetry->n_atoms; gamgi_element *axis; for (i = 0; i < n_atoms; i++) { for (j = i + 1; j < n_atoms; j++) { for (k = 0; k < n_atoms; k++) { if ((axis = static_try_Sn (symmetry, i, j, k)) != NULL) { symmetry->n_S++; symmetry->S = (gamgi_element **) realloc (symmetry->S, sizeof (gamgi_element *) * symmetry->n_S); symmetry->S[symmetry->n_S - 1] = axis; } } } } } static void static_find (gamgi_symmetry *symmetry) { static_center (symmetry); static_find_i (symmetry); static_find_m (symmetry); static_find_C0 (symmetry); static_find_C2 (symmetry); static_find_Cn (symmetry); static_find_S0 (symmetry); static_find_Sn (symmetry); } static int static_compare (const void *a, const void *b) { gamgi_element *axis_a = *(gamgi_element **) a; gamgi_element *axis_b = *(gamgi_element **) b; int i, order_a, order_b; /******************************************************* * elements are swaped if the return value is positive * *******************************************************/ /***************************************** * align first element with higher order * * the highest order is infinite (0) * * order_a and order_b cannot be both 0 * *****************************************/ order_a = axis_a->order; order_b = axis_b->order; if (order_a == 0) order_a = order_b + 1; if (order_b == 0) order_b = order_a + 1; if ((i = order_b - order_a) != 0) return i; /****************************************************** * same order: align first element with smaller error * ******************************************************/ if (axis_a->error > axis_b->error) return 1; return -1; } static void static_sort (gamgi_element **elements, int n_elements) { if (n_elements > 1) qsort (elements, n_elements, sizeof (gamgi_element *), static_compare); } static void static_max_m (double *direction, gamgi_element **m, int n_m) { gamgi_element *element; double dot, dot_max; int n, n_max; n_max = -1; dot_max = -DBL_MAX; for (n = 0; n < n_m; n++) { dot = gamgi_math_vector_dot (direction, m[n]->normal); dot = fabs (dot); if (dot > dot_max ) { dot_max = dot; n_max = n; } } element = m[n_max]; for (n = 0; n < n_max; n++) m[n_max - n] = m[n_max - n - 1]; m[0] = element; } static void static_max_C2 (double *direction, gamgi_symmetry *symmetry) { gamgi_element *element; double dot, dot_max; int n, n_max, start; for (n = 0; n < symmetry->n_C; n++) if (symmetry->C[n]->order == 2) break; start = n; n_max = -1; dot_max = -DBL_MAX; for (n = start; n < symmetry->n_C; n++) { if (symmetry->C[n]->order > 2) continue; dot = gamgi_math_vector_dot (direction, symmetry->C[n]->direction); dot = fabs (dot); if (dot > dot_max ) { dot_max = dot; n_max = n; } } element = symmetry->C[n_max]; for (n = start; n < n_max; n++) symmetry->C[start + n_max - n] = symmetry->C[start + n_max - n - 1]; symmetry->C[start] = element; } static void static_min_C2 (double *direction, gamgi_element **C, int n_C) { gamgi_element *element; double dot, dot_min; int n, n_min; n_min = -1; dot_min = DBL_MAX; for (n = 0; n < n_C; n++) { dot = gamgi_math_vector_dot (direction, C[n]->direction); dot = fabs (dot); if (dot < dot_min ) { dot_min = dot; n_min = n; } } element = C[n_min]; for (n = 0; n < n_min; n++) C[n_min - n] = C[n_min - n - 1]; C[0] = element; } static void static_sum (gamgi_element **elements, int n_elements, int **sum) { int n, max = 0; /********************************************* * in the D_0h group, elements[0]->order = 0 * * and elements[1]->order = 2, so the first * * element might not have the highest order * *********************************************/ for (n = 0; n < n_elements; n++) if (max < elements[n]->order) max = elements[n]->order; if (elements != NULL) { /************************************************* * for each order, count number of rotation axes * *************************************************/ max++; free (*sum); *sum = (int *) malloc (sizeof (int) * max); for (n = 0; n < max; n++) (*sum)[n] = 0; for (n = 0; n < n_elements; n++) (*sum)[elements[n]->order]++; } } static void static_operations (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry) { int n, operations; int *sum_C = symmetry->sum_C; int *sum_S = symmetry->sum_S; /************ * Identity * ************/ gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "\nE "); /******************** * inversion center * ********************/ if (symmetry->n_i == 1) gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "i "); /************************************** * normal axes: show in reverse order * **************************************/ if (symmetry->n_C != 0) { if (sum_C[0] == 1) { gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "2C0 "); if (symmetry->n_C > 1) gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "C2 "); } else { for (n = symmetry->C[0]->order; n > 1; n--) { operations = sum_C[n] * static_multiplicity (n); if (operations == 1) gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "C%d ", n); if (operations > 1) gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%dC%d ", operations, n); } } } /**************************************** * improper axes: show in reverse order * ****************************************/ if (symmetry->n_S != 0) { if (sum_S[0] == 1) gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "2S0 "); else { for (n = symmetry->S[0]->order; n > 1; n--) { operations = sum_S[n] * static_multiplicity (n); if (operations == 1) gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "S%d ", n); if (operations > 1) gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%dS%d ", operations, n); } } } /***************** * mirror planes * *****************/ if (symmetry->n_m == 1) gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "m "); if (symmetry->n_m > 1) gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%dm ", symmetry->n_m); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "\n"); } static void static_elements_i (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry) { int n, n_i = symmetry->n_i; gamgi_element **i = symmetry->i; gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_link", "\nInversion center: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%d\n", n_i); for (n = 0; n < n_i; n++) { gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_bold", "Position: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "(%.*f, %.*f, %.*f)", gamgi->gamgi->length, symmetry->center[0], gamgi->gamgi->length, symmetry->center[1], gamgi->gamgi->length, symmetry->center[2]); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_bold", " Error: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%.*e\n", gamgi->gamgi->length, i[n]->error); } } static void static_elements_m (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry) { int n, n_m = symmetry->n_m; gamgi_element **m = symmetry->m; gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_link", "\nMirror planes: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%d\n", n_m); for (n = 0; n < n_m; n++) { gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_bold", "Normal: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "(%.*f, %.*f, %.*f)", gamgi->gamgi->length, m[n]->normal[0], gamgi->gamgi->length, m[n]->normal[1], gamgi->gamgi->length, m[n]->normal[2]); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_bold", " Error: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%.*e\n", gamgi->gamgi->length, m[n]->error); } } static void static_elements_C (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry) { int n, n_C = symmetry->n_C; gamgi_element **C = symmetry->C; gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_link", "\nNormal axes: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%d\n", n_C); for (n = 0; n < n_C; n++) { gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_bold", "Order: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%d", C[n]->order); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_bold", " Direction: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "(%.*f, %.*f, %.*f)", gamgi->gamgi->length, C[n]->direction[0], gamgi->gamgi->length, C[n]->direction[1], gamgi->gamgi->length, C[n]->direction[2]); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_bold", " Error: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%.*e\n", gamgi->gamgi->length, C[n]->error); } } static void static_elements_S (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry) { int n, n_S = symmetry->n_S; gamgi_element **S = symmetry->S; gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_link", "\nImproper axes: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%d\n", n_S); for (n = 0; n < n_S; n++) { gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_bold", "Order: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%d", S[n]->order); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_bold", " Direction: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "(%.*f, %.*f, %.*f)", gamgi->gamgi->length, S[n]->direction[0], gamgi->gamgi->length, S[n]->direction[1], gamgi->gamgi->length, S[n]->direction[2]); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_bold", " Error: "); gamgi_gtk_dialog_text_insert (buffer, iter, "size_normal", "color_text", "%.*e\n", gamgi->gamgi->length, S[n]->error); } } static void static_elements (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry) { static_elements_i (buffer, iter, symmetry); static_elements_m (buffer, iter, symmetry); static_elements_C (buffer, iter, symmetry); static_elements_S (buffer, iter, symmetry); } static void static_report (char *group, gamgi_symmetry *symmetry) { GtkTextBuffer *buffer; GtkTextIter iter; /********************* * initialize buffer * *********************/ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (symmetry->text)); gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0); /*************** * report data * ***************/ gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nPoint Group\n"); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_normal", "color_text", "\n%s\n", group); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nSymmetry Operations\n"); static_operations (buffer, &iter, symmetry); gamgi_gtk_dialog_text_insert (buffer, &iter, "size_large", "color_bold", "\nSymmetry Elements\n"); static_elements (buffer, &iter, symmetry); } /******************************************* * Chemical to Crystalographic conversions * *******************************************/ static void static_Cs (double *d_m, double e_m, gamgi_symmetry *symmetry) { static_delete (&symmetry->i, &symmetry->n_i, 0); static_delete (&symmetry->m, &symmetry->n_m, 0); static_delete (&symmetry->C, &symmetry->n_C, 0); static_delete (&symmetry->S, &symmetry->n_S, 0); static_insert (&symmetry->m, &symmetry->n_m, 0); gamgi_math_vector_copy (d_m, symmetry->m[0]->normal); symmetry->m[0]->error = e_m; static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } static void static_C2 (double *d_C2, double e_C2, gamgi_symmetry *symmetry) { static_delete (&symmetry->i, &symmetry->n_i, 0); static_delete (&symmetry->m, &symmetry->n_m, 0); static_delete (&symmetry->C, &symmetry->n_C, 0); static_delete (&symmetry->S, &symmetry->n_S, 0); static_insert (&symmetry->C, &symmetry->n_C, 0); gamgi_math_vector_copy (d_C2, symmetry->C[0]->direction); gamgi_math_vector_normal (symmetry->C[0]->direction); symmetry->C[0]->order = 2; symmetry->C[0]->error = e_C2; static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } static void static_C3 (double *d_C3, double e_C3, gamgi_symmetry *symmetry) { static_delete (&symmetry->i, &symmetry->n_i, 0); static_delete (&symmetry->m, &symmetry->n_m, 0); static_delete (&symmetry->C, &symmetry->n_C, 0); static_delete (&symmetry->S, &symmetry->n_S, 0); static_insert (&symmetry->C, &symmetry->n_C, 0); gamgi_math_vector_copy (d_C3, symmetry->C[0]->direction); gamgi_math_vector_normal (symmetry->C[0]->direction); symmetry->C[0]->order = 3; symmetry->C[0]->error = e_C3; static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } static void static_C4 (double *d_C4, double *d_C2, double e_C4, double e_C2, gamgi_symmetry *symmetry) { static_C2 (d_C2, e_C2, symmetry); static_insert (&symmetry->C, &symmetry->n_C, 0); gamgi_math_vector_copy (d_C4, symmetry->C[0]->direction); gamgi_math_vector_normal (symmetry->C[0]->direction); symmetry->C[0]->order = 4; symmetry->C[0]->error = e_C4; static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); } static void static_C6 (double *d_C6, double *d_C3, double *d_C2, double e_C6, double e_C3, double e_C2, gamgi_symmetry *symmetry) { static_C3 (d_C3, e_C3, symmetry); static_insert (&symmetry->C, &symmetry->n_C, 0); gamgi_math_vector_copy (d_C6, symmetry->C[0]->direction); gamgi_math_vector_normal (symmetry->C[0]->direction); symmetry->C[0]->order = 6; symmetry->C[0]->error = e_C6; static_insert (&symmetry->C, &symmetry->n_C, 2); gamgi_math_vector_copy (d_C2, symmetry->C[2]->direction); gamgi_math_vector_normal (symmetry->C[2]->direction); symmetry->C[2]->order = 2; symmetry->C[2]->error = e_C2; static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); } static void static_S4 (double *d_S4, double *d_C2, double e_S4, double e_C2, gamgi_symmetry *symmetry) { static_C2 (d_C2, e_C2, symmetry); static_insert (&symmetry->S, &symmetry->n_S, 0); gamgi_math_vector_copy (d_S4, symmetry->S[0]->direction); gamgi_math_vector_normal (symmetry->S[0]->direction); symmetry->S[0]->order = 4; symmetry->S[0]->error = e_S4; static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } static void static_S6 (double *d_S6, double *d_C3, double e_S6, double e_C3, double e_i, gamgi_symmetry *symmetry) { static_C3 (d_C3, e_C3, symmetry); static_insert (&symmetry->S, &symmetry->n_S, 0); gamgi_math_vector_copy (d_S6, symmetry->S[0]->direction); gamgi_math_vector_normal (symmetry->S[0]->direction); symmetry->S[0]->order = 6; symmetry->S[0]->error = e_S6; static_insert (&symmetry->i, &symmetry->n_i, 0); symmetry->i[0]->order = 0; symmetry->i[0]->error = e_i; static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } static void static_D2 (double *d_C2, double *d_Ch, double e_C2, double e_Ch, gamgi_symmetry *symmetry) { double rotate[9]; double *direction, *normal; static_C2 (d_C2, e_C2, symmetry); static_insert (&symmetry->C, &symmetry->n_C, 1); gamgi_math_vector_copy (d_Ch, symmetry->C[1]->direction); gamgi_math_vector_normal (symmetry->C[1]->direction); symmetry->C[1]->order = 2; symmetry->C[1]->error = e_Ch; static_insert_copy (&symmetry->C, &symmetry->n_C, 1, 2); direction = symmetry->C[0]->direction; normal = symmetry->C[1]->direction; gamgi_math_matrix_rotation (90.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[2]->direction); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); } static void static_D3 (double *d_C3, double *d_Ch, double e_C3, double e_Ch, gamgi_symmetry *symmetry) { double rotate[9]; double *direction, *normal; static_C3 (d_C3, e_C3, symmetry); static_insert (&symmetry->C, &symmetry->n_C, 1); gamgi_math_vector_copy (d_Ch, symmetry->C[1]->direction); gamgi_math_vector_normal (symmetry->C[1]->direction); symmetry->C[1]->order = 2; symmetry->C[1]->error = e_Ch; static_insert_copy (&symmetry->C, &symmetry->n_C, 1, 2); static_insert_copy (&symmetry->C, &symmetry->n_C, 1, 3); direction = symmetry->C[0]->direction; normal = symmetry->C[1]->direction; gamgi_math_matrix_rotation (60.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[2]->direction); gamgi_math_matrix_rotation (120.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[3]->direction); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); } static void static_D4 (double *d_C4, double *d_C2, double *d_Ch, double e_C4, double e_C2, double e_Ch, gamgi_symmetry *symmetry) { double rotate[9]; double *direction, *normal; static_C4 (d_C4, d_C2, e_C4, e_C2, symmetry); static_insert (&symmetry->C, &symmetry->n_C, 2); gamgi_math_vector_copy (d_Ch, symmetry->C[2]->direction); gamgi_math_vector_normal (symmetry->C[2]->direction); symmetry->C[2]->order = 2; symmetry->C[2]->error = e_Ch; static_insert_copy (&symmetry->C, &symmetry->n_C, 2, 3); static_insert_copy (&symmetry->C, &symmetry->n_C, 2, 4); static_insert_copy (&symmetry->C, &symmetry->n_C, 2, 5); direction = symmetry->C[0]->direction; normal = symmetry->C[2]->direction; gamgi_math_matrix_rotation (45.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[3]->direction); gamgi_math_matrix_rotation (90.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[4]->direction); gamgi_math_matrix_rotation (135.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[5]->direction); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); } static void static_D6 (double *d_C6, double *d_C3, double *d_C2, double *d_Ch, double e_C6, double e_C3, double e_C2, double e_Ch, gamgi_symmetry *symmetry) { double rotate[9]; double *direction, *normal; static_C6 (d_C6, d_C3, d_C2, e_C6, e_C3, e_C2, symmetry); static_insert (&symmetry->C, &symmetry->n_C, 3); gamgi_math_vector_copy (d_Ch, symmetry->C[3]->direction); gamgi_math_vector_normal (symmetry->C[3]->direction); symmetry->C[3]->order = 2; symmetry->C[3]->error = e_Ch; static_insert_copy (&symmetry->C, &symmetry->n_C, 3, 4); static_insert_copy (&symmetry->C, &symmetry->n_C, 3, 5); static_insert_copy (&symmetry->C, &symmetry->n_C, 3, 6); static_insert_copy (&symmetry->C, &symmetry->n_C, 3, 7); static_insert_copy (&symmetry->C, &symmetry->n_C, 3, 8); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); direction = symmetry->C[0]->direction; normal = symmetry->C[3]->direction; gamgi_math_matrix_rotation (30.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[4]->direction); gamgi_math_matrix_rotation (60.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[5]->direction); gamgi_math_matrix_rotation (90.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[6]->direction); gamgi_math_matrix_rotation (120.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[7]->direction); gamgi_math_matrix_rotation (150.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[8]->direction); } static void static_C3v (double *d_C3, double *d_m, double e_C3, double e_m, gamgi_symmetry *symmetry) { double rotate[9]; double *direction, *normal; static_C3 (d_C3, e_C3, symmetry); static_insert (&symmetry->m, &symmetry->n_m, 0); gamgi_math_vector_copy (d_m, symmetry->m[0]->normal); gamgi_math_vector_normal (symmetry->m[0]->normal); symmetry->m[0]->order = 0; symmetry->m[0]->error = e_m; static_insert_copy (&symmetry->m, &symmetry->n_m, 0, 1); static_insert_copy (&symmetry->m, &symmetry->n_m, 0, 2); direction = symmetry->C[0]->direction; normal = symmetry->m[0]->normal; gamgi_math_matrix_rotation (60.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[1]->normal); gamgi_math_matrix_rotation (120.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[2]->normal); } static void static_C4v (double *d_C4, double *d_C2, double *d_m, double e_C4, double e_C2, double e_m, gamgi_symmetry *symmetry) { double rotate[9]; double *direction, *normal; static_C4 (d_C4, d_C2, e_C4, e_C2, symmetry); static_insert (&symmetry->m, &symmetry->n_m, 0); gamgi_math_vector_copy (d_m, symmetry->m[0]->normal); gamgi_math_vector_normal (symmetry->m[0]->normal); symmetry->m[0]->order = 0; symmetry->m[0]->error = e_m; static_insert_copy (&symmetry->m, &symmetry->n_m, 0, 1); static_insert_copy (&symmetry->m, &symmetry->n_m, 0, 2); static_insert_copy (&symmetry->m, &symmetry->n_m, 0, 3); direction = symmetry->C[0]->direction; normal = symmetry->m[0]->normal; gamgi_math_matrix_rotation (45.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[1]->normal); gamgi_math_matrix_rotation (90.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[2]->normal); gamgi_math_matrix_rotation (1350.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[3]->normal); } static void static_C6v (double *d_C6, double *d_C3, double *d_C2, double *d_m, double e_C6, double e_C3, double e_C2, double e_m, gamgi_symmetry *symmetry) { double rotate[9]; double *direction, *normal; static_C6 (d_C6, d_C3, d_C2, e_C6, e_C3, e_C2, symmetry); static_insert (&symmetry->m, &symmetry->n_m, 0); gamgi_math_vector_copy (d_m, symmetry->m[0]->normal); gamgi_math_vector_normal (symmetry->m[0]->normal); symmetry->m[0]->order = 0; symmetry->m[0]->error = e_m; static_insert_copy (&symmetry->m, &symmetry->n_m, 0, 1); static_insert_copy (&symmetry->m, &symmetry->n_m, 0, 2); static_insert_copy (&symmetry->m, &symmetry->n_m, 0, 3); static_insert_copy (&symmetry->m, &symmetry->n_m, 0, 4); static_insert_copy (&symmetry->m, &symmetry->n_m, 0, 5); direction = symmetry->C[0]->direction; normal = symmetry->m[0]->normal; gamgi_math_matrix_rotation (30.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[1]->normal); gamgi_math_matrix_rotation (60.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[2]->normal); gamgi_math_matrix_rotation (90.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[3]->normal); gamgi_math_matrix_rotation (120.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[4]->normal); gamgi_math_matrix_rotation (150.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[5]->normal); } static void static_C2h (double *d_C2, double *d_mh, double e_C2, double e_i, double e_mh, gamgi_symmetry *symmetry) { static_C2 (d_C2, e_C2, symmetry); static_insert (&symmetry->i, &symmetry->n_i, 0); symmetry->i[0]->order = 0; symmetry->i[0]->error = e_i; static_insert (&symmetry->m, &symmetry->n_m, 0); gamgi_math_vector_copy (d_mh, symmetry->m[0]->normal); gamgi_math_vector_normal (symmetry->m[0]->normal); symmetry->m[0]->order = 0; symmetry->m[0]->error = e_mh; } static void static_C4h (double *d_C4, double *d_C2, double *d_S4, double *d_mh, double e_C4, double e_C2, double e_S4, double e_i, double e_mh, gamgi_symmetry *symmetry) { static_C4 (d_C4, d_C2, e_C4, e_C2, symmetry); static_insert (&symmetry->S, &symmetry->n_S, 0); gamgi_math_vector_copy (d_S4, symmetry->S[0]->direction); gamgi_math_vector_normal (symmetry->S[0]->direction); symmetry->S[0]->order = 4; symmetry->S[0]->error = e_S4; static_insert (&symmetry->i, &symmetry->n_i, 0); symmetry->i[0]->order = 0; symmetry->i[0]->error = e_i; static_insert (&symmetry->m, &symmetry->n_m, 0); gamgi_math_vector_copy (d_mh, symmetry->m[0]->normal); gamgi_math_vector_normal (symmetry->m[0]->normal); symmetry->m[0]->order = 0; symmetry->m[0]->error = e_mh; static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } static void static_C6h (double *d_C6, double *d_C3, double *d_C2, double *d_S6, double *d_S3, double *d_mh, double e_C6, double e_C3, double e_C2, double e_S6, double e_S3, double e_i, double e_mh, gamgi_symmetry *symmetry) { static_C6 (d_C6, d_C3, d_C2, e_C6, e_C3, e_C2, symmetry); static_insert (&symmetry->S, &symmetry->n_S, 0); gamgi_math_vector_copy (d_S6, symmetry->S[0]->direction); gamgi_math_vector_normal (symmetry->S[0]->direction); symmetry->S[0]->order = 6; symmetry->S[0]->error = e_S6; static_insert (&symmetry->S, &symmetry->n_S, 1); gamgi_math_vector_copy (d_S3, symmetry->S[1]->direction); gamgi_math_vector_normal (symmetry->S[1]->direction); symmetry->S[1]->order = 3; symmetry->S[1]->error = e_S3; static_insert (&symmetry->i, &symmetry->n_i, 0); symmetry->i[0]->order = 0; symmetry->i[0]->error = e_i; static_insert (&symmetry->m, &symmetry->n_m, 0); gamgi_math_vector_copy (d_mh, symmetry->m[0]->normal); gamgi_math_vector_normal (symmetry->m[0]->normal); symmetry->m[0]->order = 0; symmetry->m[0]->error = e_mh; static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } static void static_D4h (double *d_C4, double *d_C2, double *d_Ch, double *d_S4, double *d_mh, double *d_m, double e_C4, double e_C2, double e_Ch, double e_S4, double e_i, double e_mh, double e_m, gamgi_symmetry *symmetry) { double rotate[9]; double *direction, *normal; static_C4h (d_C4, d_C2, d_S4, d_mh, e_C4, e_C2, e_S4, e_i, e_mh, symmetry); /*********************** * add horizontal axes * ***********************/ static_insert (&symmetry->C, &symmetry->n_C, 2); gamgi_math_vector_copy (d_Ch, symmetry->C[2]->direction); gamgi_math_vector_normal (symmetry->C[2]->direction); symmetry->C[2]->order = 2; symmetry->C[2]->error = e_Ch; static_insert_copy (&symmetry->C, &symmetry->n_C, 2, 3); static_insert_copy (&symmetry->C, &symmetry->n_C, 2, 4); static_insert_copy (&symmetry->C, &symmetry->n_C, 2, 5); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); direction = symmetry->C[0]->direction; normal = symmetry->C[2]->direction; gamgi_math_matrix_rotation (45.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[3]->direction); gamgi_math_matrix_rotation (90.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[4]->direction); gamgi_math_matrix_rotation (135.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[5]->direction); /*********************** * add vertical planes * ***********************/ static_insert (&symmetry->m, &symmetry->n_m, 1); gamgi_math_vector_copy (d_m, symmetry->m[1]->normal); gamgi_math_vector_normal (symmetry->m[1]->normal); symmetry->m[1]->order = 0; symmetry->m[1]->error = e_m; static_insert_copy (&symmetry->m, &symmetry->n_m, 1, 2); static_insert_copy (&symmetry->m, &symmetry->n_m, 1, 3); static_insert_copy (&symmetry->m, &symmetry->n_m, 1, 4); direction = symmetry->C[0]->direction; normal = symmetry->m[1]->normal; gamgi_math_matrix_rotation (45.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[2]->normal); gamgi_math_matrix_rotation (90.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[3]->normal); gamgi_math_matrix_rotation (1350.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[4]->normal); } static void static_D6h (double *d_C6, double *d_C3, double *d_C2, double *d_Ch, double *d_S6, double *d_S3, double *d_mh, double *d_m, double e_C6, double e_C3, double e_C2, double e_Ch, double e_S6, double e_S3, double e_i, double e_mh, double e_m, gamgi_symmetry *symmetry) { double rotate[9]; double *direction, *normal; static_C6h (d_C6, d_C3, d_C2, d_S6, d_S3, d_mh, e_C6, e_C3, e_C2, e_S6, e_S3, e_i, e_mh, symmetry); /*********************** * add horizontal axes * ***********************/ static_insert (&symmetry->C, &symmetry->n_C, 3); gamgi_math_vector_copy (d_Ch, symmetry->C[3]->direction); gamgi_math_vector_normal (symmetry->C[3]->direction); symmetry->C[3]->order = 2; symmetry->C[3]->error = e_Ch; static_insert_copy (&symmetry->C, &symmetry->n_C, 3, 4); static_insert_copy (&symmetry->C, &symmetry->n_C, 3, 5); static_insert_copy (&symmetry->C, &symmetry->n_C, 3, 6); static_insert_copy (&symmetry->C, &symmetry->n_C, 3, 7); static_insert_copy (&symmetry->C, &symmetry->n_C, 3, 8); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); direction = symmetry->C[0]->direction; normal = symmetry->C[3]->direction; gamgi_math_matrix_rotation (30.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[4]->direction); gamgi_math_matrix_rotation (60.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[5]->direction); gamgi_math_matrix_rotation (90.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[6]->direction); gamgi_math_matrix_rotation (120.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[7]->direction); gamgi_math_matrix_rotation (150.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[8]->direction); /*********************** * add vertical planes * ***********************/ static_insert (&symmetry->m, &symmetry->n_m, 1); gamgi_math_vector_copy (d_m, symmetry->m[1]->normal); gamgi_math_vector_normal (symmetry->m[1]->normal); symmetry->m[1]->order = 0; symmetry->m[1]->error = e_m; static_insert_copy (&symmetry->m, &symmetry->n_m, 1, 2); static_insert_copy (&symmetry->m, &symmetry->n_m, 1, 3); static_insert_copy (&symmetry->m, &symmetry->n_m, 1, 4); static_insert_copy (&symmetry->m, &symmetry->n_m, 1, 5); static_insert_copy (&symmetry->m, &symmetry->n_m, 1, 6); direction = symmetry->C[0]->direction; normal = symmetry->m[1]->normal; gamgi_math_matrix_rotation (30.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[2]->normal); gamgi_math_matrix_rotation (60.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[3]->normal); gamgi_math_matrix_rotation (90.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[4]->normal); gamgi_math_matrix_rotation (120.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[5]->normal); gamgi_math_matrix_rotation (150.0, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[6]->normal); } static void static_T (double *rotate, double e_C3, double e_C2, gamgi_symmetry *symmetry) { double v[3]; static_delete (&symmetry->i, &symmetry->n_i, 0); static_delete (&symmetry->m, &symmetry->n_m, 0); static_delete (&symmetry->C, &symmetry->n_C, 0); static_delete (&symmetry->S, &symmetry->n_S, 0); /****** * C3 * ******/ static_insert (&symmetry->C, &symmetry->n_C, 0); gamgi_math_vector_absolute (v, 1.0, 1.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[0]->direction); symmetry->C[0]->order = 3; symmetry->C[0]->error = e_C3; static_insert (&symmetry->C, &symmetry->n_C, 1); gamgi_math_vector_absolute (v, -1.0, 1.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[1]->direction); symmetry->C[1]->order = 3; symmetry->C[1]->error = e_C3; static_insert (&symmetry->C, &symmetry->n_C, 2); gamgi_math_vector_absolute (v, 1.0, -1.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[2]->direction); symmetry->C[2]->order = 3; symmetry->C[2]->error = e_C3; static_insert (&symmetry->C, &symmetry->n_C, 3); gamgi_math_vector_absolute (v, -1.0, -1.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[3]->direction); symmetry->C[3]->order = 3; symmetry->C[3]->error = e_C3; /****** * C2 * ******/ static_insert (&symmetry->C, &symmetry->n_C, 4); gamgi_math_vector_absolute (v, 1.0, 0.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[4]->direction); symmetry->C[4]->order = 2; symmetry->C[4]->error = e_C2; static_insert (&symmetry->C, &symmetry->n_C, 5); gamgi_math_vector_absolute (v, 0.0, 1.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[5]->direction); symmetry->C[5]->order = 2; symmetry->C[5]->error = e_C2; static_insert (&symmetry->C, &symmetry->n_C, 6); gamgi_math_vector_absolute (v, 0.0, 0.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[6]->direction); symmetry->C[6]->order = 2; symmetry->C[6]->error = e_C2; static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } static void static_Th (double *rotate, double e_C3, double e_C2, double e_S6, double e_i, double e_m, gamgi_symmetry *symmetry) { double v[3]; static_T (rotate, e_C3, e_C2, symmetry); /***** * m * *****/ static_insert (&symmetry->m, &symmetry->n_m, 0); gamgi_math_vector_absolute (v, 1.0, 0.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->m[0]->normal); symmetry->m[0]->order = 0; symmetry->m[0]->error = e_m; static_insert (&symmetry->m, &symmetry->n_m, 1); gamgi_math_vector_absolute (v, 0.0, 1.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->m[1]->normal); symmetry->m[1]->order = 0; symmetry->m[1]->error = e_m; static_insert (&symmetry->m, &symmetry->n_m, 2); gamgi_math_vector_absolute (v, 0.0, 0.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->m[2]->normal); symmetry->m[2]->order = 0; symmetry->m[2]->error = e_m; /***** * i * *****/ static_insert (&symmetry->i, &symmetry->n_i, 0); symmetry->i[0]->order = 0; symmetry->i[0]->error = e_i; /****** * S6 * ******/ static_insert (&symmetry->S, &symmetry->n_S, 0); gamgi_math_vector_absolute (v, 1.0, 1.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->S[0]->direction); symmetry->S[0]->order = 6; symmetry->S[0]->error = e_S6; static_insert (&symmetry->S, &symmetry->n_S, 1); gamgi_math_vector_absolute (v, -1.0, 1.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->S[1]->direction); symmetry->S[1]->order = 6; symmetry->S[1]->error = e_S6; static_insert (&symmetry->S, &symmetry->n_S, 2); gamgi_math_vector_absolute (v, 1.0, -1.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->S[2]->direction); symmetry->S[2]->order = 6; symmetry->S[2]->error = e_S6; static_insert (&symmetry->S, &symmetry->n_S, 3); gamgi_math_vector_absolute (v, -1.0, -1.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->S[3]->direction); symmetry->S[3]->order = 6; symmetry->S[3]->error = e_S6; static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } static void static_Oh (double *rotate, double e_C4, double e_C3, double e_C2, double e_Cd, double e_S6, double e_S4, double e_i, double e_m, double e_md, gamgi_symmetry *symmetry) { double v[3]; static_Th (rotate, e_C3, e_C2, e_S6, e_i, e_m, symmetry); /****** * C4 * ******/ static_insert (&symmetry->C, &symmetry->n_C, 0); gamgi_math_vector_absolute (v, 1.0, 0.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[0]->direction); symmetry->C[0]->order = 4; symmetry->C[0]->error = e_C4; static_insert (&symmetry->C, &symmetry->n_C, 1); gamgi_math_vector_absolute (v, 0.0, 1.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[1]->direction); symmetry->C[1]->order = 4; symmetry->C[1]->error = e_C4; static_insert (&symmetry->C, &symmetry->n_C, 2); gamgi_math_vector_absolute (v, 0.0, 0.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[2]->direction); symmetry->C[2]->order = 4; symmetry->C[2]->error = e_C4; /****** * C2 * ******/ static_insert (&symmetry->C, &symmetry->n_C, 10); gamgi_math_vector_absolute (v, 1.0, 1.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[10]->normal); symmetry->C[10]->order = 2; symmetry->C[10]->error = e_Cd; static_insert (&symmetry->C, &symmetry->n_C, 11); gamgi_math_vector_absolute (v, 1.0, -1.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[11]->normal); symmetry->C[11]->order = 2; symmetry->C[11]->error = e_Cd; static_insert (&symmetry->C, &symmetry->n_C, 12); gamgi_math_vector_absolute (v, 1.0, 0.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[12]->normal); symmetry->C[12]->order = 2; symmetry->C[12]->error = e_Cd; static_insert (&symmetry->C, &symmetry->n_C, 13); gamgi_math_vector_absolute (v, 1.0, 0.0, -1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[13]->normal); symmetry->C[13]->order = 2; symmetry->C[13]->error = e_Cd; static_insert (&symmetry->C, &symmetry->n_C, 14); gamgi_math_vector_absolute (v, 0.0, 1.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[14]->normal); symmetry->C[14]->order = 2; symmetry->C[14]->error = e_Cd; static_insert (&symmetry->C, &symmetry->n_C, 15); gamgi_math_vector_absolute (v, 0.0, 1.0, -1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->C[15]->normal); symmetry->C[15]->order = 2; symmetry->C[15]->error = e_Cd; /***** * m * *****/ static_insert (&symmetry->m, &symmetry->n_m, 3); gamgi_math_vector_absolute (v, 1.0, 1.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->m[3]->normal); symmetry->m[3]->order = 0; symmetry->m[3]->error = e_md; static_insert (&symmetry->m, &symmetry->n_m, 4); gamgi_math_vector_absolute (v, 1.0, -1.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->m[4]->normal); symmetry->m[4]->order = 0; symmetry->m[4]->error = e_md; static_insert (&symmetry->m, &symmetry->n_m, 5); gamgi_math_vector_absolute (v, 1.0, 0.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->m[5]->normal); symmetry->m[5]->order = 0; symmetry->m[5]->error = e_md; static_insert (&symmetry->m, &symmetry->n_m, 6); gamgi_math_vector_absolute (v, 1.0, 0.0, -1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->m[6]->normal); symmetry->m[6]->order = 0; symmetry->m[6]->error = e_md; static_insert (&symmetry->m, &symmetry->n_m, 7); gamgi_math_vector_absolute (v, 0.0, 1.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->m[7]->normal); symmetry->m[7]->order = 0; symmetry->m[7]->error = e_md; static_insert (&symmetry->m, &symmetry->n_m, 8); gamgi_math_vector_absolute (v, 0.0, 1.0, -1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->m[8]->normal); symmetry->m[8]->order = 0; symmetry->m[8]->error = e_md; /****** * S4 * ******/ static_insert (&symmetry->S, &symmetry->n_S, 4); gamgi_math_vector_absolute (v, 1.0, 0.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->S[4]->direction); symmetry->S[4]->order = 4; symmetry->S[4]->error = e_S4; static_insert (&symmetry->S, &symmetry->n_S, 5); gamgi_math_vector_absolute (v, 0.0, 1.0, 0.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->S[5]->direction); symmetry->S[5]->order = 4; symmetry->S[5]->error = e_S4; static_insert (&symmetry->S, &symmetry->n_S, 6); gamgi_math_vector_absolute (v, 0.0, 0.0, 1.0); gamgi_math_vector_normal (v); gamgi_math_matrix_vector (rotate, v, symmetry->S[6]->direction); symmetry->S[6]->order = 4; symmetry->S[6]->error = e_S4; static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } static void static_space_C0v (char *group, gamgi_symmetry *symmetry) { double e_C0, e_m; double d_C0[3], d_m[3]; gamgi_math_vector_copy (symmetry->C[0]->direction, d_C0); gamgi_math_vector_copy (symmetry->m[0]->normal, d_m); e_C0 = symmetry->C[0]->error; e_m = symmetry->m[0]->error; /******* * C4v * *******/ static_C4v (d_C0, d_C0, d_m, e_C0, e_C0, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /******* * C6v * *******/ static_C6v (d_C0, d_C0, d_C0, d_m, e_C0, e_C0, e_C0, e_m, symmetry); static_group (group, symmetry); } static void static_space_D0h (char *group, gamgi_symmetry *symmetry) { double d_C0[3], d_Ch[3]; double d_S0[3]; double d_mh[3], d_m[3]; double e_C0, e_Ch; double e_S0; double e_mh, e_m; double e_i; gamgi_math_vector_copy (symmetry->C[0]->direction, d_C0); gamgi_math_vector_copy (symmetry->C[1]->direction, d_Ch); gamgi_math_vector_copy (symmetry->S[0]->direction, d_S0); gamgi_math_vector_copy (symmetry->m[0]->normal, d_mh); gamgi_math_vector_copy (symmetry->m[1]->normal, d_m); e_C0 = symmetry->C[0]->error; e_Ch = symmetry->C[1]->error; e_S0 = symmetry->S[0]->error; e_mh = symmetry->m[0]->error; e_m = symmetry->m[1]->error; e_i = symmetry->i[0]->error; /******* * D4h * *******/ static_D4h (d_C0, d_C0, d_Ch, d_S0, d_mh, d_m, e_C0, e_C0, e_Ch, e_S0, e_i, e_mh, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /******* * D6h * *******/ static_D6h (d_C0, d_C0, d_C0, d_Ch, d_S0, d_S0, d_mh, d_m, e_C0, e_C0, e_C0, e_Ch, e_S0, e_S0, e_i, e_mh, e_m, symmetry); static_group (group, symmetry); } static void static_space_Kh (char *group, gamgi_symmetry *symmetry) { double rotate[9]; double d_C0[3]; double d_S0[3]; double d_m[3]; gamgi_math_vector_copy (symmetry->C[0]->direction, d_C0); gamgi_math_vector_copy (symmetry->S[0]->direction, d_S0); gamgi_math_vector_copy (symmetry->m[0]->normal, d_m); /******* * D4h * *******/ static_D4h (d_C0, d_C0, d_m, d_S0, d_C0, d_m, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, symmetry); static_group (group, symmetry); static_report (group, symmetry); /******* * D6h * *******/ static_D6h (d_C0, d_C0, d_C0, d_m, d_S0, d_S0, d_C0, d_m, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, symmetry); static_group (group, symmetry); static_report (group, symmetry); /******* * Oh * *******/ gamgi_math_matrix_unit (rotate); static_Oh (rotate, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, symmetry); static_group (group, symmetry); } static void static_space_Cn (char *group, gamgi_symmetry *symmetry) { double d_C6[3], d_C4[3], d_C3[3], d_C2[3]; double e_C6, e_C4, e_C3, e_C2; /******************************************** * remove axes when order is not 6, 4, 3, 2 * ********************************************/ static_restrict (&symmetry->C, &symmetry->n_C); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); if (symmetry->n_C == 4) { /****************************** * C6, C4, C3, C2 axes exist: * * the group can be C4 or C6 * ******************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C6); gamgi_math_vector_copy (symmetry->C[1]->direction, d_C4); gamgi_math_vector_copy (symmetry->C[2]->direction, d_C3); gamgi_math_vector_copy (symmetry->C[3]->direction, d_C2); e_C6 = symmetry->C[0]->error; e_C4 = symmetry->C[1]->error; e_C3 = symmetry->C[2]->error; e_C2 = symmetry->C[3]->error; /****** * C4 * ******/ static_C4 (d_C4, d_C2, e_C4, e_C2, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * C6 * ******/ static_C6 (d_C6, d_C3, d_C2, e_C6, e_C3, e_C2, symmetry); } /********************** * show (recursively) * **********************/ static_group (group, symmetry); } static void static_space_Dn (char *group, gamgi_symmetry *symmetry) { double d_C6[3], d_C4[3], d_C3[3], d_C2[3], d_Ch[3]; double e_C6, e_C4, e_C3, e_C2, e_Ch; double rotate[9]; double *normal, *direction; int n, h, order_C; /******************************************** * remove axes when order is not 6, 4, 3, 2 * ********************************************/ order_C = symmetry->C[0]->order; static_restrict (&symmetry->C, &symmetry->n_C); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); /************************** * remove horizontal axes * **************************/ for (n = 0; n < symmetry->n_C; n++) if (symmetry->C[n]->order == 2) break; h = n; if (order_C % 2 == 0) h++; symmetry->C[h]->error = symmetry->C[symmetry->n_C - 1]->error; static_delete (&symmetry->C, &symmetry->n_C, h + 1); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); gamgi_math_vector_copy (symmetry->C[h]->direction, d_Ch); e_Ch = symmetry->C[h]->error; if (symmetry->n_C == 5) { /****************************** * C6, C4, C3, C2 axes exist: * * the group can be D4 or D6 * ******************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C6); gamgi_math_vector_copy (symmetry->C[1]->direction, d_C4); gamgi_math_vector_copy (symmetry->C[2]->direction, d_C3); gamgi_math_vector_copy (symmetry->C[3]->direction, d_C2); e_C6 = symmetry->C[0]->error; e_C4 = symmetry->C[1]->error; e_C3 = symmetry->C[2]->error; e_C2 = symmetry->C[3]->error; /****** * D4 * ******/ static_D4 (d_C4, d_C2, d_Ch, e_C4, e_C2, e_Ch, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * D6 * ******/ static_D6 (d_C6, d_C3, d_C2, d_Ch, e_C6, e_C3, e_C2, e_Ch, symmetry); } else if (h > 0) { /******************* * horizontal axes * *******************/ order_C = symmetry->C[0]->order; for (n = 1; n < order_C; n++) static_insert_copy (&symmetry->C, &symmetry->n_C, h, h + n); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); direction = symmetry->C[0]->direction; normal = symmetry->C[h]->direction; for (n = 1; n < order_C; n++) { gamgi_math_matrix_rotation (n * 180.0 / order_C, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[h + n]->direction); } } /********************** * show (recursively) * **********************/ static_group (group, symmetry); } static void static_space_Sn (char *group, gamgi_symmetry *symmetry) { double d_C6[3], d_C4[3], d_C3[3], d_C2[3]; double d_S4[3]; double e_C6, e_C4, e_C3, e_C2; double e_S4; /******************************************** * remove axes when order is not 6, 4, 3, 2 * ********************************************/ static_restrict (&symmetry->C, &symmetry->n_C); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_restrict (&symmetry->S, &symmetry->n_S); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); if (symmetry->n_C == 4) { /****************************** * C6, C4, C3, C2 axes exist: * * the group can be C4 or C6 * ******************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C6); gamgi_math_vector_copy (symmetry->C[1]->direction, d_C4); gamgi_math_vector_copy (symmetry->C[2]->direction, d_C3); gamgi_math_vector_copy (symmetry->C[3]->direction, d_C2); e_C6 = symmetry->C[0]->error; e_C4 = symmetry->C[1]->error; e_C3 = symmetry->C[2]->error; e_C2 = symmetry->C[3]->error; /****** * C4 * ******/ static_C4 (d_C4, d_C2, e_C4, e_C2, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * C6 * ******/ static_C6 (d_C6, d_C3, d_C2, e_C6, e_C3, e_C2, symmetry); } else if (symmetry->n_C + symmetry->n_S == 4) { /****************************** * C6, C3, C2, S4 axes exist: * * the group can be S4 or C6 * ******************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C6); gamgi_math_vector_copy (symmetry->C[1]->direction, d_C3); gamgi_math_vector_copy (symmetry->C[2]->direction, d_C2); gamgi_math_vector_copy (symmetry->S[0]->direction, d_S4); e_C6 = symmetry->C[0]->error; e_C3 = symmetry->C[1]->error; e_C2 = symmetry->C[2]->error; e_S4 = symmetry->S[0]->error; /****** * S4 * ******/ static_S4 (d_S4, d_C2, e_S4, e_C2, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * C6 * ******/ static_C6 (d_C6, d_C3, d_C2, e_C6, e_C3, e_C2, symmetry); } /********************** * show (recursively) * **********************/ static_group (group, symmetry); } static void static_space_Cnv (char *group, gamgi_symmetry *symmetry) { double d_C6[3], d_C4[3], d_C3[3], d_C2[3]; double d_m[3]; double e_C6, e_C4, e_C3, e_C2; double e_m; double rotate[9]; double *normal, *direction; int n, order_C; /******************************************** * remove axes when order is not 6, 4, 3, 2 * ********************************************/ static_restrict (&symmetry->C, &symmetry->n_C); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); /********************************************************* * horizontal planes and axes were previously sorted out * * according to its error, so the element of symmetry * * identified with a highest degree of confidence comes * * first. When recreating automatically a subset of the * * horizontal elements, give them the geometry of the * * first element and the error of the last element. * *********************************************************/ symmetry->m[0]->error = symmetry->m[symmetry->n_m - 1]->error; static_delete (&symmetry->m, &symmetry->n_m, 1); gamgi_math_vector_copy (symmetry->m[0]->normal, d_m); e_m = symmetry->m[0]->error; if (symmetry->n_C == 4) { /******************************* * C6, C4, C3, C2 axes exist: * * the group can be C4v or C6v * *******************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C6); gamgi_math_vector_copy (symmetry->C[1]->direction, d_C4); gamgi_math_vector_copy (symmetry->C[2]->direction, d_C3); gamgi_math_vector_copy (symmetry->C[3]->direction, d_C2); e_C6 = symmetry->C[0]->error; e_C4 = symmetry->C[1]->error; e_C3 = symmetry->C[2]->error; e_C2 = symmetry->C[3]->error; /******* * C4v * *******/ static_C4v (d_C4, d_C2, d_m, e_C4, e_C2, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /******* * C6v * *******/ static_C6v (d_C6, d_C3, d_C2, d_m, e_C6, e_C3, e_C2, e_m, symmetry); } else { /******************* * vertical planes * *******************/ if (symmetry->n_C > 0) { order_C = symmetry->C[0]->order; for (n = 1; n < order_C; n++) static_insert_copy (&symmetry->m, &symmetry->n_m, 0, n); direction = symmetry->C[0]->direction; normal = symmetry->m[0]->normal; for (n = 1; n < order_C; n++) { gamgi_math_matrix_rotation (n * 180.0 / order_C, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[n]->normal); } } } /********************** * show (recursively) * **********************/ static_group (group, symmetry); } static void static_space_Cnh (char *group, gamgi_symmetry *symmetry) { double d_C6[3], d_C4[3], d_C3[3], d_C2[3]; double d_S6[3], d_S4[3], d_S3[3]; double d_mh[3]; double e_C6, e_C4, e_C3, e_C2; double e_S6, e_S4, e_S3; double e_mh; double e_i; /******************************************** * remove axes when order is not 6, 4, 3, 2 * ********************************************/ static_restrict (&symmetry->C, &symmetry->n_C); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_restrict (&symmetry->S, &symmetry->n_S); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); gamgi_math_vector_copy (symmetry->m[0]->normal, d_mh); e_mh = symmetry->m[0]->error; if (symmetry->n_C == 4) { /******************************* * C6, C4, C3, C2 axes exist: * * the group can be C4h or C6h * *******************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C6); gamgi_math_vector_copy (symmetry->C[1]->direction, d_C4); gamgi_math_vector_copy (symmetry->C[2]->direction, d_C3); gamgi_math_vector_copy (symmetry->C[3]->direction, d_C2); gamgi_math_vector_copy (symmetry->S[0]->direction, d_S6); gamgi_math_vector_copy (symmetry->S[1]->direction, d_S4); gamgi_math_vector_copy (symmetry->S[2]->direction, d_S3); e_C6 = symmetry->C[0]->error; e_C4 = symmetry->C[1]->error; e_C3 = symmetry->C[2]->error; e_C2 = symmetry->C[3]->error; e_S6 = symmetry->S[0]->error; e_S4 = symmetry->S[1]->error; e_S3 = symmetry->S[2]->error; e_i = symmetry->i[0]->error; /******* * C4h * *******/ static_C4h (d_C4, d_C2, d_S4, d_mh, e_C4, e_C2, e_S4, e_i, e_mh, symmetry); static_group (group, symmetry); static_report (group, symmetry); /******* * C6h * *******/ static_C6h (d_C6, d_C3, d_C2, d_S6, d_S3, d_mh, e_C6, e_C3, e_C2, e_S6, e_S3, e_i, e_mh, symmetry); } /********************** * show (recursively) * **********************/ static_group (group, symmetry); } static void static_space_Dnh (char *group, gamgi_symmetry *symmetry) { double rotate[9]; double *normal, *direction; double d_C6[3], d_C4[3], d_C3[3], d_C2[3], d_Ch[3]; double d_S6[3], d_S4[3], d_S3[3]; double d_mh[3], d_m[3]; double e_C6, e_C4, e_C3, e_C2, e_Ch; double e_S6, e_S4, e_S3; double e_mh, e_m; double e_i; int n, h, order_C; /******************************************** * remove axes when order is not 6, 4, 3, 2 * ********************************************/ order_C = symmetry->C[0]->order; static_restrict (&symmetry->C, &symmetry->n_C); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_restrict (&symmetry->S, &symmetry->n_S); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); /********************************************************* * horizontal planes and axes were previously sorted out * * according to its error, so the element of symmetry * * identified with a highest degree of confidence comes * * first. When recreating automatically a subset of the * * horizontal elements, give them the geometry of the * * first element and the error of the last element. * *********************************************************/ /************************** * remove horizontal axes * **************************/ h = symmetry->n_C - symmetry->n_m + 1; symmetry->C[h]->error = symmetry->C[symmetry->n_C - 1]->error; static_delete (&symmetry->C, &symmetry->n_C, h + 1); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); /************************** * remove vertical planes * **************************/ symmetry->m[1]->error = symmetry->m[symmetry->n_m - 1]->error; static_delete (&symmetry->m, &symmetry->n_m, 2); gamgi_math_vector_copy (symmetry->C[h]->direction, d_Ch); gamgi_math_vector_copy (symmetry->m[0]->normal, d_mh); gamgi_math_vector_copy (symmetry->m[1]->normal, d_m); e_Ch = symmetry->C[h]->error; e_mh = symmetry->m[0]->error; e_m = symmetry->m[1]->error; if (symmetry->n_C == 5) { /******************************* * C6, C4, C3, C2 axes exist: * * the group can be D4h or D6h * *******************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C6); gamgi_math_vector_copy (symmetry->C[1]->direction, d_C4); gamgi_math_vector_copy (symmetry->C[2]->direction, d_C3); gamgi_math_vector_copy (symmetry->C[3]->direction, d_C2); gamgi_math_vector_copy (symmetry->S[0]->direction, d_S6); gamgi_math_vector_copy (symmetry->S[1]->direction, d_S4); gamgi_math_vector_copy (symmetry->S[2]->direction, d_S3); e_C6 = symmetry->C[0]->error; e_C4 = symmetry->C[1]->error; e_C3 = symmetry->C[2]->error; e_C2 = symmetry->C[3]->error; e_S6 = symmetry->S[0]->error; e_S4 = symmetry->S[1]->error; e_S3 = symmetry->S[2]->error; e_i = symmetry->i[0]->error; /******* * D4h * *******/ static_D4h (d_C4, d_C2, d_Ch, d_S4, d_mh, d_m, e_C4, e_C2, e_Ch, e_S4, e_i, e_mh, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /******* * D6h * *******/ static_D6h (d_C6, d_C3, d_C2, d_Ch, d_S6, d_S3, d_mh, d_m, e_C6, e_C3, e_C2, e_Ch, e_S6, e_S3, e_i, e_mh, e_m, symmetry); } else if (h > 0) { /******************* * horizontal axes * *******************/ order_C = symmetry->C[0]->order; for (n = 1; n < order_C; n++) static_insert_copy (&symmetry->C, &symmetry->n_C, h, h + n); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); direction = symmetry->C[0]->direction; normal = symmetry->C[h]->direction; for (n = 1; n < order_C; n++) { gamgi_math_matrix_rotation (n * 180.0 / order_C, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->C[h + n]->direction); } /******************* * vertical planes * *******************/ for (n = 1; n < order_C; n++) static_insert_copy (&symmetry->m, &symmetry->n_m, 1, 1 + n); normal = symmetry->m[1]->normal; for (n = 1; n < order_C; n++) { gamgi_math_matrix_rotation (n * 180.0 / order_C, direction, rotate); gamgi_math_matrix_vector (rotate, normal, symmetry->m[1 + n]->normal); } } /********************** * show (recursively) * **********************/ static_group (group, symmetry); } static void static_space_Dnd (char *group, gamgi_symmetry *symmetry) { double d_C6[3], d_C4[3], d_C3[3], d_C2[3], d_Ch[3]; double d_S6[3], d_S4[3]; double d_m[3]; double e_C6, e_C4, e_C3, e_C2, e_Ch; double e_S6, e_S4; double e_m, e_i; int h; /******************************************** * remove axes when order is not 6, 4, 3, 2 * ********************************************/ static_restrict (&symmetry->C, &symmetry->n_C); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_restrict (&symmetry->S, &symmetry->n_S); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); /********************************************************* * h signals the first horizontal axis * * * * horizontal planes and axes were previously sorted out * * according to its error, so the element of symmetry * * identified with a highest degree of confidence comes * * first. When recreating automatically a subset of the * * horizontal elements, give them the geometry of the * * first element and the error of the last element. * *********************************************************/ h = symmetry->n_C - symmetry->n_m; gamgi_math_vector_copy (symmetry->C[h]->direction, d_Ch); gamgi_math_vector_copy (symmetry->m[0]->normal, d_m); e_m = symmetry->m[symmetry->n_m - 1]->error; e_Ch = symmetry->C[symmetry->n_C - 1]->error; /********************************************** * C2h is always a subgroup of odd Dnd groups * * D2 is always a subgroup of even Dnd groups * **********************************************/ if (symmetry->n_m % 6 == 0 && symmetry->n_m % 4 == 0) { /*************************************** * C6, C4, C3, C2 axes exist: * * the group can be C4v, C6v, D4 or D6 * ***************************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C6); gamgi_math_vector_copy (symmetry->C[1]->direction, d_C4); gamgi_math_vector_copy (symmetry->C[2]->direction, d_C3); gamgi_math_vector_copy (symmetry->C[3]->direction, d_C2); e_C6 = symmetry->C[0]->error; e_C4 = symmetry->C[1]->error; e_C3 = symmetry->C[2]->error; e_C2 = symmetry->C[3]->error; /******* * C4v * *******/ static_C4v (d_C4, d_C2, d_m, e_C4, e_C2, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /******* * C6v * *******/ static_C6v (d_C6, d_C3, d_C2, d_m, e_C6, e_C3, e_C2, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * D4 * ******/ static_D4 (d_C4, d_C2, d_Ch, e_C4, e_C2, e_Ch, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * D6 * ******/ static_D6 (d_C6, d_C3, d_C2, d_Ch, e_C6, e_C3, e_C2, e_Ch, symmetry); static_group (group, symmetry); } else if (symmetry->n_m % 6 == 0 && symmetry->n_m % 4 != 0) { /********************************** * C6, S4, C3, C2 axes exist: * * the group can be C6v, D6 or S4 * **********************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C6); gamgi_math_vector_copy (symmetry->C[1]->direction, d_C3); gamgi_math_vector_copy (symmetry->C[2]->direction, d_C2); gamgi_math_vector_copy (symmetry->S[0]->direction, d_S4); e_C6 = symmetry->C[0]->error; e_C3 = symmetry->C[1]->error; e_C2 = symmetry->C[2]->error; e_S4 = symmetry->S[0]->error; /******* * C6v * *******/ static_C6v (d_C6, d_C3, d_C2, d_m, e_C6, e_C3, e_C2, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * D6 * ******/ static_D6 (d_C6, d_C3, d_C2, d_Ch, e_C6, e_C3, e_C2, e_Ch, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * S4 * ******/ static_S4 (d_S4, d_C2, e_S4, e_C2, symmetry); } else if (symmetry->n_m % 6 != 0 && symmetry->n_m % 4 == 0) { /****************************** * C4, C2 axes exist: * * the group can be C4v or D4 * ******************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C4); gamgi_math_vector_copy (symmetry->C[1]->direction, d_C2); e_C4 = symmetry->C[0]->error; e_C2 = symmetry->C[1]->error; /******* * C4v * *******/ static_C4v (d_C4, d_C2, d_m, e_C4, e_C2, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * D4 * ******/ static_D4 (d_C4, d_C2, d_Ch, e_C4, e_C2, e_Ch, symmetry); } else if (symmetry->n_m % 3 == 0 && symmetry->n_m % 2 != 0) { /*************************************** * C3, S6 axes exist: * * the group can be C2h, C3v, D3 or S6 * ***************************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C3); gamgi_math_vector_copy (symmetry->S[0]->direction, d_S6); e_C3 = symmetry->C[0]->error; e_S6 = symmetry->S[0]->error; e_i = symmetry->i[0]->error; /******* * C2h * *******/ static_C2h (d_Ch, d_Ch, e_Ch, e_i, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /******* * C3v * *******/ static_C3v (d_C3, d_m, e_C3, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * D3 * ******/ static_D3 (d_C3, d_Ch, e_C3, e_Ch, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * S6 * ******/ static_S6 (d_S6, d_C3, e_S6, e_C3, e_i, symmetry); } else if (symmetry->n_m % 3 != 0 && symmetry->n_m % 2 == 0) { /********************************* * C2, S4 axes exist: * * the group can be Cs, D2 or S4 * *********************************/ gamgi_math_vector_copy (symmetry->C[0]->direction, d_C2); gamgi_math_vector_copy (symmetry->S[0]->direction, d_S4); e_C2 = symmetry->C[0]->error; e_S4 = symmetry->S[0]->error; /****** * Cs * ******/ static_Cs (d_m, e_m, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * D2 * ******/ static_D2 (d_C2, d_Ch, e_C2, e_Ch, symmetry); static_group (group, symmetry); static_report (group, symmetry); /****** * S4 * ******/ static_S4 (d_S4, d_C2, e_S4, e_C2, symmetry); } else if (symmetry->n_m % 3 != 0 && symmetry->n_m % 2 != 0) { /************************ * C2 axis exist: * * the group can be C2h * ************************/ e_i = symmetry->i[0]->error; /******* * C2h * *******/ static_C2h (d_Ch, d_Ch, e_Ch, e_i, e_m, symmetry); } /********************** * show (recursively) * **********************/ static_group (group, symmetry); } static void static_space_I (char *group, gamgi_symmetry *symmetry) { double rotate[9]; double *col1, *col2, *col3; double e_C3, e_C2; /******************************************** * remove axes when order is not 6, 4, 3, 2 * ********************************************/ static_restrict (&symmetry->C, &symmetry->n_C); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); /********************************************************* * horizontal planes and axes were previously sorted out * * according to its error, so the element of symmetry * * identified with a highest degree of confidence comes * * first. When recreating automatically a subset of the * * element of symmetry, give them the geometry of the * * first element and the error of the last element. * *********************************************************/ e_C3 = symmetry->C[9]->error; e_C2 = symmetry->C[24]->error; /********************************************************* * set first the best 3 normal C2 axes: these axes * * form the real referential used to rotate the symmetry * * elements from the standard to the real orientation * *********************************************************/ static_min_C2 (symmetry->C[10]->direction, symmetry->C + 11, symmetry->n_C - 11); static_min_C2 (symmetry->C[10]->direction, symmetry->C + 12, symmetry->n_C - 12); col1 = symmetry->C[10]->direction; col2 = symmetry->C[11]->direction; col3 = symmetry->C[12]->direction; gamgi_math_matrix_absolute (rotate, col1[0], col2[0], col3[0], col1[1], col2[1], col3[1], col1[2], col2[2], col3[2]); /***** * T * *****/ static_T (rotate, e_C3, e_C2, symmetry); static_group (group, symmetry); } static void static_space_Ih (char *group, gamgi_symmetry *symmetry) { double rotate[9]; double *col1, *col2, *col3; double e_C3, e_C2; double e_S6; double e_i; double e_m; /******************************************** * remove axes when order is not 6, 4, 3, 2 * ********************************************/ static_restrict (&symmetry->C, &symmetry->n_C); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_restrict (&symmetry->S, &symmetry->n_S); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); /********************************************************* * horizontal planes and axes were previously sorted out * * according to its error, so the element of symmetry * * identified with a highest degree of confidence comes * * first. When recreating automatically a subset of the * * element of symmetry, give them the geometry of the * * first element and the error of the last element. * *********************************************************/ e_C3 = symmetry->C[9]->error; e_C2 = symmetry->C[24]->error; e_S6 = symmetry->S[9]->error; e_i = symmetry->i[0]->error; e_m = symmetry->m[14]->error; /********************************************************* * set first the best 3 normal C2 axes: these axes * * form the real referential used to rotate the symmetry * * elements from the standard to the real orientation * *********************************************************/ static_min_C2 (symmetry->C[10]->direction, symmetry->C + 11, symmetry->n_C - 11); static_min_C2 (symmetry->C[10]->direction, symmetry->C + 12, symmetry->n_C - 12); col1 = symmetry->C[10]->direction; col2 = symmetry->C[11]->direction; col3 = symmetry->C[12]->direction; gamgi_math_matrix_absolute (rotate, col1[0], col2[0], col3[0], col1[1], col2[1], col3[1], col1[2], col2[2], col3[2]); /******* * Th * *******/ static_Th (rotate, e_C3, e_C2, e_S6, e_i, e_m, symmetry); static_group (group, symmetry); } static void static_chemical_C1 (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 0) return; if (symmetry->n_m != 0) return; if (symmetry->n_S != 0) return; sprintf (group, "C1"); if (symmetry->periodic == FALSE) return; sprintf (group, "1 C1"); } static void static_chemical_Cs (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 0) return; if (symmetry->n_S != 0) return; sprintf (group, "Cs"); if (symmetry->periodic == FALSE) return; sprintf (group, "m Cs"); } static void static_chemical_Ci (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_m != 0) return; if (symmetry->n_S != 0) return; sprintf (group, "Ci"); if (symmetry->periodic == FALSE) return; sprintf (group, "-1 Ci"); } static void static_chemical_C0v (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 0) return; if (symmetry->n_m != 1) return; if (symmetry->n_C != 1) return; if (symmetry->n_S != 0) return; sprintf (group, "C0v"); if (symmetry->periodic == FALSE) return; static_space_C0v (group, symmetry); } static void static_chemical_D0h (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 1) return; if (symmetry->sum_C[0] != 1) return; if (symmetry->n_C != 2) return; if (symmetry->C[1]->order != 2) return; if (symmetry->n_S != 1) return; if (symmetry->sum_S[0] != 1) return; sprintf (group, "D0h"); if (symmetry->periodic == FALSE) return; static_space_D0h (group, symmetry); } static void static_chemical_Kh (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_m != 1) return; if (symmetry->n_C != 1) return; if (symmetry->n_S != 1) return; if (symmetry->sum_S[0] != 1) return; sprintf (group, "Kh"); if (symmetry->periodic == FALSE) return; static_space_Kh (group, symmetry); } static void static_chemical_Cn (char *group, gamgi_symmetry *symmetry) { int n, order_C; if (symmetry->n_i != 0) return; n = order_C = symmetry->C[0]->order; while (n > 1) { if (order_C % n == 0 && symmetry->sum_C[n] != 1) return; if (order_C % n != 0 && symmetry->sum_C[n] != 0) return; n--; } sprintf (group, "C%d", order_C); if (symmetry->periodic == FALSE) return; sprintf (group, "%d C%d", order_C, order_C); if (order_C > 6 || order_C == 5) static_space_Cn (group, symmetry); } static void static_chemical_Dn (char *group, gamgi_symmetry *symmetry) { int n, order_C; int *sum_C = symmetry->sum_C; if (symmetry->n_i != 0) return; n = order_C = symmetry->C[0]->order; while (n > 2) { if (order_C % n == 0 && sum_C[n] != 1) return; if (order_C % n != 0 && sum_C[n] != 0) return; n--; } if (order_C / 2 * 2 + 1 != sum_C[2]) return; static_max_C2 (symmetry->C[0]->direction, symmetry); sprintf (group, "D%d", order_C); if (symmetry->periodic == FALSE) return; if (order_C == 6) sprintf (group, "622 D6"); else if (order_C == 4) sprintf (group, "422 D4"); else if (order_C == 3) sprintf (group, "32 D3"); else sprintf (group, "222 D2"); if (order_C > 6 || order_C == 5) static_space_Dn (group, symmetry); } static void static_chemical_Sn (char *group, gamgi_symmetry *symmetry) { int n, order_C, order_S; int *sum_C = symmetry->sum_C; int *sum_S = symmetry->sum_S; n = order_C = symmetry->C[0]->order; if (order_C % 2 == 0 && (sum_C[2] != 1 || symmetry->n_i != 0)) return; if (order_C % 2 != 0 && (sum_C[2] != 0 || symmetry->n_i != 1)) return; while (n > 2) { if (order_C % n == 0 && sum_C[n] != 1) return; if (order_C % n != 0 && sum_C[n] != 0) return; n--; } n = order_S = symmetry->S[0]->order; if (order_S != 2 * order_C) return; if (sum_S[2] != 0) return; while (n > 2) { if (order_S % n != 0 && sum_S[n] != 0) return; if (order_S % n == 0) { if (order_S / n % 2 == 0 && sum_S[n] != 0) return; if (order_S / n % 2 != 0 && sum_S[n] != 1) return; } n--; } sprintf (group, "S%d", order_S); if (symmetry->periodic == FALSE) return; if (order_S == 6) sprintf (group, "-3 S6"); else if (order_S == 4) sprintf (group, "-4 S4"); if (order_S > 6) static_space_Sn (group, symmetry); } static void static_chemical_Cnv (char *group, gamgi_symmetry *symmetry) { int n, order_C; if (symmetry->n_i != 0) return; n = order_C = symmetry->C[0]->order; if (symmetry->n_m != order_C) return; while (n > 1) { if (order_C % n == 0 && symmetry->sum_C[n] != 1) return; if (order_C % n != 0 && symmetry->sum_C[n] != 0) return; n--; } sprintf (group, "C%dv", order_C); if (symmetry->periodic == FALSE) return; if (order_C == 6) sprintf (group, "6mm C6v"); else if (order_C == 4) sprintf (group, "4mm C4v"); else if (order_C == 3) sprintf (group, "3m C3v"); else sprintf (group, "mm2 C2v"); if (order_C > 6 || order_C == 5) static_space_Cnv (group, symmetry); } static void static_chemical_Cnh (char *group, gamgi_symmetry *symmetry) { int n, order_C, order_S; int *sum_C = symmetry->sum_C; int *sum_S = symmetry->sum_S; n = order_C = symmetry->C[0]->order; if (order_C % 2 == 0 && symmetry->n_i != 1) return; if (order_C % 2 != 0 && symmetry->n_i != 0) return; while (n > 1) { if (order_C % n == 0 && sum_C[n] != 1) return; if (order_C % n != 0 && sum_C[n] != 0) return; n--; } if (order_C == 2 && symmetry->n_S != 0) return; if (order_C > 2) { if (symmetry->n_S == 0) return; n = order_S = symmetry->S[0]->order; if (order_S != order_C) return; while (n > 2) { if (order_S % n == 0 && sum_S[n] != 1) return; if (order_S % n != 0 && sum_S[n] != 0) return; n--; } } sprintf (group, "C%dh", order_C); if (symmetry->periodic == FALSE) return; if (order_C == 6) sprintf (group, "6/m C6h"); else if (order_C == 4) sprintf (group, "4/m C4h"); else if (order_C == 3) sprintf (group, "-6 C3h"); else sprintf (group, "2/m C2h"); if (order_C > 6 || order_C == 5) static_space_Cnh (group, symmetry); } static void static_chemical_Dnh (char *group, gamgi_symmetry *symmetry) { int n, order_C, order_S; int *sum_C = symmetry->sum_C; int *sum_S = symmetry->sum_S; n = order_C = symmetry->C[0]->order; if (order_C % 2 == 0 && symmetry->n_i != 1) return; if (order_C % 2 != 0 && symmetry->n_i != 0) return; while (n > 2) { if (order_C % n == 0 && sum_C[n] != 1) return; if (order_C % n != 0 && sum_C[n] != 0) return; n--; } if (order_C / 2 * 2 + 1 != sum_C[2]) return; if (order_C == 2 && symmetry->n_S != 0) return; if (order_C > 2) { if (symmetry->n_S == 0) return; n = order_S = symmetry->S[0]->order; if (order_S != order_C) return; while (n > 2) { if (order_S % n == 0 && sum_S[n] != 1) return; if (order_S % n != 0 && sum_S[n] != 0) return; n--; } } static_max_C2 (symmetry->C[0]->direction, symmetry); static_max_m (symmetry->C[0]->direction, symmetry->m, symmetry->n_m); sprintf (group, "D%dh", order_C); if (symmetry->periodic == FALSE) return; if (order_C == 6) sprintf (group, "6/mmm D6h"); else if (order_C == 4) sprintf (group, "4/mmm D4h"); else if (order_C == 3) sprintf (group, "-6m2 D3h"); else sprintf (group, "mmm D2h"); if (order_C > 6 || order_C == 5) static_space_Dnh (group, symmetry); } static void static_chemical_Dnd (char *group, gamgi_symmetry *symmetry) { int order_C, order_S; int n; int *sum_C = symmetry->sum_C; int *sum_S = symmetry->sum_S; n = order_C = symmetry->C[0]->order; if (order_C % 2 == 0 && symmetry->n_i != 0) return; if (order_C % 2 != 0 && symmetry->n_i != 1) return; if (symmetry->n_m != order_C) return; if (sum_C[2] != order_C / 2 * 2 + 1) return; while (n > 2) { if (order_C % n == 0 && sum_C[n] != 1) return; if (order_C % n != 0 && sum_C[n] != 0) return; n--; } if (symmetry->n_S == 0) return; n = order_S = symmetry->S[0]->order; if (order_S != 2 * order_C) return; if (sum_S[2] != 0) return; while (n > 2) { if (order_S % n != 0 && sum_S[n] != 0) return; if (order_S % n == 0) { if (order_S / n % 2 == 0 && sum_S[n] != 0) return; if (order_S / n % 2 != 0 && sum_S[n] != 1) return; } n--; } static_max_C2 (symmetry->C[0]->direction, symmetry); sprintf (group, "D%dd", order_C); if (symmetry->periodic == FALSE) return; if (order_C == 3) sprintf (group, "-3m D3d"); else sprintf (group, "-42m D2d"); if (order_C > 3) static_space_Dnd (group, symmetry); } static void static_chemical_T (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 0) return; if (symmetry->n_C != 7) return; if (symmetry->sum_C[2] != 3) return; if (symmetry->n_S != 0) return; sprintf (group, "T"); if (symmetry->periodic == FALSE) return; sprintf (group, "23 T"); } static void static_chemical_Td (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 0) return; if (symmetry->n_m != 6) return; if (symmetry->n_C != 7) return; if (symmetry->sum_C[2] != 3) return; if (symmetry->n_S != 3) return; if (symmetry->S[0]->order != 4) return; if (symmetry->sum_S[4] != 3) return; sprintf (group, "Td"); if (symmetry->periodic == FALSE) return; sprintf (group, "-43m Td"); } static void static_chemical_Th (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 1) return; if (symmetry->n_m != 3) return; if (symmetry->n_C != 7) return; if (symmetry->sum_C[2] != 3) return; if (symmetry->n_S != 4) return; if (symmetry->S[0]->order != 6) return; if (symmetry->sum_S[6] != 4) return; sprintf (group, "Th"); if (symmetry->periodic == FALSE) return; sprintf (group, "m-3 Th"); } static void static_chemical_O (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 0) return; if (symmetry->n_C != 16) return; if (symmetry->sum_C[3] != 4) return; if (symmetry->sum_C[2] != 9) return; if (symmetry->n_S != 0) return; sprintf (group, "O"); if (symmetry->periodic == FALSE) return; sprintf (group, "432 O"); } static void static_chemical_Oh (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 1) return; if (symmetry->n_m != 9) return; if (symmetry->n_C != 16) return; if (symmetry->sum_C[3] != 4) return; if (symmetry->sum_C[2] != 9) return; if (symmetry->n_S != 7) return; if (symmetry->S[0]->order != 6) return; if (symmetry->sum_S[6] != 4) return; if (symmetry->sum_S[4] != 3) return; sprintf (group, "Oh"); if (symmetry->periodic == FALSE) return; sprintf (group, "m-3m Oh"); } static void static_chemical_I (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 0) return; if (symmetry->n_C != 31) return; if (symmetry->sum_C[3] != 10) return; if (symmetry->sum_C[2] != 15) return; if (symmetry->n_S != 0) return; sprintf (group, "I"); if (symmetry->periodic == FALSE) return; static_space_I (group, symmetry); } static void static_chemical_Ih (char *group, gamgi_symmetry *symmetry) { if (symmetry->n_i != 1) return; if (symmetry->n_m != 15) return; if (symmetry->n_C != 31) return; if (symmetry->sum_C[3] != 10) return; if (symmetry->sum_C[2] != 15) return; if (symmetry->n_S != 16) return; if (symmetry->S[0]->order != 10) return; if (symmetry->sum_S[10] != 6) return; if (symmetry->sum_S[6] != 10) return; sprintf (group, "Ih"); if (symmetry->periodic == FALSE) return; static_space_Ih (group, symmetry); } static void static_group (char *group, gamgi_symmetry *symmetry) { /*************** * the default * ***************/ sprintf (group, "Undefined"); /************************************************************************ * Always check that an array position indeed exists before calling it! * * We can only take for granted that: 1) if symmetry->n_C != 0 then at * * least one C axis exists; 2) if one C axis exists then symmetry->C[0] * * must exist and symmetry->C[0]->order gives the highest order axis * * found; 3) the sum_C[] array must describe all the orders found, so * * all the array positions smaller or equal to the highest order exist. * ************************************************************************/ if (symmetry->n_C == 0) { /************ * axis: no * ************/ /*********************************** * low symmetry groups: Cs, Ci, C1 * ***********************************/ if (symmetry->n_m == 1) static_chemical_Cs (group, symmetry); else if (symmetry->n_i == 1) static_chemical_Ci (group, symmetry); else static_chemical_C1 (group, symmetry); } else if (symmetry->C[0]->order == 0) { /********************** * infinite axis: yes * **********************/ /**************************************************** * infinite rotation order groups: Dinfh, Kh, Cinfv * ****************************************************/ if (symmetry->n_m == 2) static_chemical_D0h (group, symmetry); else if (symmetry->n_i == 1) static_chemical_Kh (group, symmetry); else static_chemical_C0v (group, symmetry); } else if (symmetry->n_m == 0) { /************** * planes: no * **************/ /*************************** * special groups: I, O, T * ***************************/ if (symmetry->C[0]->order == 5 && symmetry->sum_C[5] == 6) static_chemical_I (group, symmetry); else if (symmetry->C[0]->order == 4 && symmetry->sum_C[4] == 3) static_chemical_O (group, symmetry); else if (symmetry->C[0]->order == 3 && symmetry->sum_C[3] == 4) static_chemical_T (group, symmetry); /**************************** * other groups: Sn, Cn, Dn * ****************************/ else if (symmetry->n_S != 0) static_chemical_Sn (group, symmetry); else if (static_divisors (symmetry->C[0]->order) == symmetry->n_C) static_chemical_Cn (group, symmetry); else static_chemical_Dn (group, symmetry); } else { /*************** * planes: yes * ***************/ /********************************** * special groups: Ih, Oh, Td, Th * **********************************/ if (symmetry->C[0]->order == 5 && symmetry->sum_C[5] == 6) static_chemical_Ih (group, symmetry); else if (symmetry->C[0]->order == 4 && symmetry->sum_C[4] == 3) static_chemical_Oh (group, symmetry); else if (symmetry->C[0]->order == 3 && symmetry->sum_C[3] == 4) { if (symmetry->n_i == 0) static_chemical_Td (group, symmetry); else static_chemical_Th (group, symmetry); } /************************************ * other groups: Cnh, Dnh, Cnv, Dnd * ************************************/ else if (symmetry->n_m == 1) static_chemical_Cnh (group, symmetry); else if (symmetry->n_m == symmetry->C[0]->order + 1) static_chemical_Dnh (group, symmetry); else if (symmetry->n_S == 0) static_chemical_Cnv (group, symmetry); else static_chemical_Dnd (group, symmetry); } if (symmetry->periodic == TRUE && strcmp (group, "Undefined") == 0) { /******************************************** * remove axes when order is not 6, 4, 3, 2 * ********************************************/ static_restrict (&symmetry->C, &symmetry->n_C); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_restrict (&symmetry->S, &symmetry->n_S); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); } } static gamgi_symmetry *static_start (gamgi_object *object, gamgi_bool periodic, float initial, float final, GtkWidget *text) { gamgi_symmetry *symmetry; gamgi_dlist *dlist, *atom_list; gamgi_atom **atoms; int n; /************************************** * calloc initializes everything to 0 * **************************************/ symmetry = (gamgi_symmetry *) calloc (1, sizeof (gamgi_symmetry)); /******************************************************* * set type of point symmetry, text widget, tolerances * *******************************************************/ symmetry->periodic = periodic; symmetry->initial = initial; symmetry->final = final; symmetry->text = text; /********************* * create atom array * *********************/ atom_list = gamgi_engine_dlist_atom_object (object, NULL); n = 0; for (dlist = atom_list; dlist != NULL; dlist = dlist->next) n++; symmetry->n_atoms = n; atoms = (gamgi_atom **) malloc (n * sizeof (gamgi_atom *)); symmetry->atoms = atoms; /******************* * fill atom array * *******************/ n = 0; for (dlist = atom_list; dlist != NULL; dlist = dlist->next) atoms[n++] = GAMGI_CAST_ATOM dlist->data; gamgi_engine_dlist_remove_all (atom_list); return symmetry; } static void static_end (gamgi_symmetry *symmetry) { int n; free (symmetry->atoms); free (symmetry->distance); n = symmetry->n_i; while (n-- > 0) { free (symmetry->i[n]->table); free (symmetry->i[n]); } free (symmetry->i); n = symmetry->n_m; while (n-- > 0) { free (symmetry->m[n]->table); free (symmetry->m[n]); } free (symmetry->m); n = symmetry->n_C; while (n-- > 0) { free (symmetry->C[n]->table); free (symmetry->C[n]); } free (symmetry->C); n = symmetry->n_S; while (n-- > 0) { free (symmetry->S[n]->table); free (symmetry->S[n]); } free (symmetry->S); free (symmetry->sum_C); free (symmetry->sum_S); free (symmetry); } gamgi_bool gamgi_chem_symmetry (gamgi_object *object, gamgi_bool all, float initial, float final, GtkWidget *text) { gamgi_symmetry *symmetry; char token[GAMGI_ENGINE_TOKEN]; /************************************************** * start: allocate resources, including atom list * **************************************************/ symmetry = static_start (object, all, initial, final, text); /***************** * find elements * *****************/ static_find (symmetry); /********************* * organize elements * *********************/ static_sort (symmetry->m, symmetry->n_m); static_sort (symmetry->C, symmetry->n_C); static_sort (symmetry->S, symmetry->n_S); static_sum (symmetry->C, symmetry->n_C, &symmetry->sum_C); static_sum (symmetry->S, symmetry->n_S, &symmetry->sum_S); /************* * get group * *************/ static_group (token, symmetry); static_report (token, symmetry); /******************************************** * end: free resources, including atom list * ********************************************/ static_end (symmetry); return TRUE; } gamgi-0.17.5/src/chem/gamgi_chem_symmetry.h000066400000000000000000000301721433127522700206060ustar00rootroot00000000000000/************************************************************************* * * $GAMGI/src/chem/gamgi_chem_symmetry.h * * Point group symmetry analyzer. * * Copyright (C) 1996, 2003 Serguei Patchkovskii * Serguei.Patchkovskii@nrc.ca * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /********************** * internal functions * ********************** static double pow2 (double x); static int static_divisors (int number); static int static_redundant (int n, int p); static int static_multiplicity (int n); static void static_invert (gamgi_symmetry *symmetry, gamgi_element *center, gamgi_atom *from, gamgi_atom *to); static void static_reflect (gamgi_symmetry *symmetry, gamgi_element *plane, gamgi_atom *from, gamgi_atom *to); static void static_rotate (gamgi_symmetry *symmetry, gamgi_element *axis, gamgi_atom *from, gamgi_atom *to); static void static_rotate_reflect (gamgi_symmetry *symmetry, gamgi_element *axis, gamgi_atom *from, gamgi_atom *to); static int static_apply (gamgi_symmetry *symmetry, gamgi_element *element); static int static_order (gamgi_symmetry *symmetry, gamgi_element *element); static int static_same (gamgi_symmetry *symmetry, gamgi_element *a, gamgi_element *b); static gamgi_element *static_element (void); static gamgi_element *static_create (gamgi_symmetry *symmetry); static gamgi_element *static_copy (gamgi_element *old); static void static_insert (gamgi_element ***elements, int *n_elements, int new); static void static_insert_copy (gamgi_element ***elements, int *n_elements, int old, int new); static void static_resize (gamgi_element ***elements, int *n_elements); static void static_remove (gamgi_element *element); static void static_restrict (gamgi_element ***elements, int *n_elements); static void static_delete (gamgi_element ***elements, int *n_elements, int offset); static int static_quality (gamgi_symmetry *symmetry, gamgi_element *element); static int static_evaluate (gamgi_symmetry *symmetry, gamgi_element *element, double *sum, double *max); static void static_get (gamgi_element *element, double *parameters); static void static_set (gamgi_element *element, double *parameters); static int static_optimize (gamgi_symmetry *symmetry, gamgi_element *element); static int static_refine (gamgi_symmetry *symmetry, gamgi_element *element, int apply); static void static_invert (gamgi_symmetry *symmetry, gamgi_element *center, gamgi_atom *from, gamgi_atom *to); static gamgi_element *static_try_i (gamgi_symmetry *symmetry); static void static_reflect (gamgi_symmetry *symmetry, gamgi_element *plane, gamgi_atom *from, gamgi_atom *to); static gamgi_element *static_try_m (gamgi_symmetry *symmetry, int i, int j); static gamgi_element *static_try_m0 (gamgi_symmetry *symmetry); static void static_rotate (gamgi_symmetry *symmetry, gamgi_element *axis, gamgi_atom *from, gamgi_atom *to); static gamgi_element *static_try_C0 (gamgi_symmetry *symmetry); static gamgi_element *static_try_Cm (gamgi_symmetry *symmetry); static gamgi_element *static_try_C2 (gamgi_symmetry *symmetry, int i, int j, double *support); static gamgi_element *static_try_axis (gamgi_symmetry *symmetry, double a[3], double b[3], double c[3]); static gamgi_element *static_try_Cn (gamgi_symmetry *symmetry, int ia, int ib, int ic); static void static_rotate_reflect (gamgi_symmetry *symmetry, gamgi_element *axis, gamgi_atom *from, gamgi_atom *to); static gamgi_element *static_try_S0 (gamgi_symmetry *symmetry); static gamgi_element *static_try_Sn (gamgi_symmetry *symmetry, int ia, int ib, int ic); static void static_center (gamgi_symmetry *symmetry); static void static_find_i (gamgi_symmetry *symmetry); static void static_find_m (gamgi_symmetry *symmetry); static void static_find_C0 (gamgi_symmetry *symmetry); static void static_find_C2 (gamgi_symmetry *symmetry); static void static_find_Cn (gamgi_symmetry *symmetry); static void static_find_S0 (gamgi_symmetry *symmetry); static void static_find_Sn (gamgi_symmetry *symmetry); static void static_find (gamgi_symmetry *symmetry); static int static_compare (const void *a, const void *b); static void static_sort (gamgi_element **elements, int n_elements); static void static_max_m (double *direction, gamgi_element **m, int n_m); static void static_max_C2 (double *direction, gamgi_symmetry *symmetry); static void static_min_C2 (double *direction, gamgi_element **C, int n_C); static void static_sum (gamgi_element **elements, int n_elements, int **sum); static void static_operations (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry); static void static_elements_i (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry); static void static_elements_m (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry); static void static_elements_C (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry); static void static_elements_S (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry); static void static_elements (GtkTextBuffer *buffer, GtkTextIter *iter, gamgi_symmetry *symmetry); static void static_report (char *group, gamgi_symmetry *symmetry); static void static_Cs (double *d_m, double e_m, gamgi_symmetry *symmetry); static void static_C2 (double *d_C2, double e_C2, gamgi_symmetry *symmetry); static void static_C3 (double *d_C3, double e_C3, gamgi_symmetry *symmetry); static void static_C4 (double *d_C4, double *d_C2, double e_C4, double e_C2, gamgi_symmetry *symmetry); static void static_C6 (double *d_C6, double *d_C3, double *d_C2, double e_C6, double e_C3, double e_C2, gamgi_symmetry *symmetry); static void static_S4 (double *d_S4, double *d_C2, double e_S4, double e_C2, gamgi_symmetry *symmetry); static void static_S6 (double *d_S6, double *d_C3, double e_S6, double e_C3, double e_i, gamgi_symmetry *symmetry); static void static_D2 (double *d_C2, double *d_Ch, double e_C2, double e_Ch, gamgi_symmetry *symmetry); static void static_D3 (double *d_C3, double *d_Ch, double e_C3, double e_Ch, gamgi_symmetry *symmetry); static void static_D4 (double *d_C4, double *d_C2, double *d_Ch, double e_C4, double e_C2, double e_Ch, gamgi_symmetry *symmetry); static void static_D6 (double *d_C6, double *d_C3, double *d_C2, double *d_Ch, double e_C6, double e_C3, double e_C2, double e_Ch, gamgi_symmetry *symmetry); static void static_C3v (double *d_C3, double *d_m, double e_C3, double e_m, gamgi_symmetry *symmetry); static void static_C4v (double *d_C4, double *d_C2, double *d_m, double e_C4, double e_C2, double e_m, gamgi_symmetry *symmetry); static void static_C6v (double *d_C6, double *d_C3, double *d_C2, double *d_m, double e_C6, double e_C3, double e_C2, double e_m, gamgi_symmetry *symmetry); static void static_C2h (double *d_C2, double *d_mh, double e_C2, double e_i, double e_mh, gamgi_symmetry *symmetry); static void static_C4h (double *d_C4, double *d_C2, double *d_S4, double *d_mh, double e_C4, double e_C2, double e_S4, double e_i, double e_mh, gamgi_symmetry *symmetry); static void static_C6h (double *d_C6, double *d_C3, double *d_C2, double *d_S6, double *d_S3, double *d_mh, double e_C6, double e_C3, double e_C2, double e_S6, double e_S3, double e_i, double e_mh, gamgi_symmetry *symmetry); static void static_D4h (double *d_C4, double *d_C2, double *d_Ch, double *d_S4, double *d_mh, double *d_m, double e_C4, double e_C2, double e_Ch, double e_S4, double e_i, double e_mh, double e_m, gamgi_symmetry *symmetry); static void static_D6h (double *d_C6, double *d_C3, double *d_C2, double *d_Ch, double *d_S6, double *d_S3, double *d_mh, double *d_m, double e_C6, double e_C3, double e_C2, double e_Ch, double e_S6, double e_S3, double e_i, double e_mh, double e_m, gamgi_symmetry *symmetry); static void static_T (double *rotate, double e_C3, double e_C2, gamgi_symmetry *symmetry); static void static_Th (double *rotate, double e_C3, double e_C2, double e_S6, double e_i, double e_m, gamgi_symmetry *symmetry); static void static_Oh (double *rotate, double e_C4, double e_C3, double e_C2, double e_C2d, double e_S6, double e_S4, double e_i, double e_m, double e_md, gamgi_symmetry *symmetry); static void static_space_C0v (char *group, gamgi_symmetry *symmetry); static void static_space_D0h (char *group, gamgi_symmetry *symmetry); static void static_space_Kh (char *group, gamgi_symmetry *symmetry); static void static_space_Cn (gamgi_symmetry *symmetry); static void static_space_Dn (gamgi_symmetry *symmetry); static void static_space_Sn (gamgi_symmetry *symmetry); static void static_space_Cnv (gamgi_symmetry *symmetry); static void static_space_Cnh (gamgi_symmetry *symmetry); static void static_space_Dnh (gamgi_symmetry *symmetry); static void static_space_Dnd (gamgi_symmetry *symmetry); static void static_space_I (gamgi_symmetry *symmetry); static void static_space_Ih (gamgi_symmetry *symmetry); static void static_chemical_C1 (char *group, gamgi_symmetry *symmetry); static void static_chemical_Cs (char *group, gamgi_symmetry *symmetry); static void static_chemical_Ci (char *group, gamgi_symmetry *symmetry); static void static_chemical_C0v (char *group, gamgi_symmetry *symmetry); static void static_chemical_D0h (char *group, gamgi_symmetry *symmetry) static void static_chemical_Kh (char *group, gamgi_symmetry *symmetry); static void static_chemical_Cn (char *group, gamgi_symmetry *symmetry); static void static_chemical_Dn (char *group, gamgi_symmetry *symmetry); static void static_chemical_Sn (char *group, gamgi_symmetry *symmetry); static void static_chemical_Cnv (char *group, gamgi_symmetry *symmetry); static void static_chemical_Cnh (char *group, gamgi_symmetry *symmetry); static void static_chemical_Dnh (char *group, gamgi_symmetry *symmetry); static void static_chemical_Dnd (char *group, gamgi_symmetry *symmetry); static void static_chemical_T (char *group, gamgi_symmetry *symmetry); static void static_chemical_Td (char *group, gamgi_symmetry *symmetry); static void static_chemical_Th (char *group, gamgi_symmetry *symmetry); static void static_chemical_O (char *group, gamgi_symmetry *symmetry); static void static_chemical_Oh (char *group, gamgi_symmetry *symmetry); static void static_chemical_I (char *group, gamgi_symmetry *symmetry); static void static_chemical_Ih (char *group, gamgi_symmetry *symmetry); static void static_group (char *group, gamgi_symmetry *symmetry); static gamgi_symmetry *static_start (gamgi_object *object, gamgi_bool periodic, float initial, float final, GtkWidget *text); static void static_end (gamgi_symmetry *symmetry); ********************** * external functions * **********************/ gamgi_bool gamgi_chem_symmetry (gamgi_object *object, gamgi_bool all, float initial, float final, GtkWidget *text); /************* * Rationale * ************* Implemented, needs cleaning. ************* * Rationale * *************/ gamgi-0.17.5/src/chem/makefile000066400000000000000000000024431433127522700161040ustar00rootroot00000000000000########################################### # # $GAMGI/src/chem/makefile # # Copyright (C) 2001, 2004 Carlos Pereira # # Distributed under the terms of the GNU # General Public License: $GAMGI/LICENSE # #========================== Chem files =============================== GAMGI_CHEM_h = gamgi_chem.h GAMGI_CHEM_o = gamgi_chem_atom.o gamgi_chem_bond.o \ gamgi_chem_bond_create.o gamgi_chem_geometry.o \ gamgi_chem_graphene.o gamgi_chem_graphene_cone.o \ gamgi_chem_graphene_tube.o gamgi_chem_orbital.o \ gamgi_chem_property.o gamgi_chem_symmetry.o \ gamgi_chem_polytope.o #========================= Gamgi paths =============================== ifndef FLAG FLAG = 1 SRC = ../ include $(SRC)make_paths #========================= Gamgi files =============================== GAMGI_o = $(GAMGI_ENGINE_o) $(GAMGI_GTK_o) $(GAMGI_MESA_o) \ $(GAMGI_MATH_o) $(GAMGI_CHEM_o) $(GAMGI_PHYS_o) \ $(GAMGI_IO_o) $(GAMGI_EXPAT_o) $(GAMGI_GLOBAL_o) GAMGI_h = $(GAMGI_ENGINE_h) $(GAMGI_GTK_h) $(GAMGI_MESA_h) \ $(GAMGI_MATH_h) $(GAMGI_CHEM_h) $(GAMGI_PHYS_h) \ $(GAMGI_IO_h) $(GAMGI_EXPAT_h) $(GAMGI_GLOBAL_h) #========================= Gamgi local =============================== include $(SRC)make_local #========================= Gamgi rules =============================== include $(SRC)make_rules endif gamgi-0.17.5/src/engine/000077500000000000000000000000001433127522700147325ustar00rootroot00000000000000gamgi-0.17.5/src/engine/gamgi_engine.h000066400000000000000000000434641433127522700175270ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #ifndef GAMGI_ENGINE #define GAMGI_ENGINE /******** libraries ******* **************************/ #include #include #include #include #include #include #include #include #include #include #include /************* macros ************ *********************************/ #define GAMGI_ENGINE_TOKEN 20 #define GAMGI_ENGINE_STRING 50 #define GAMGI_ENGINE_LINE 200 /********************************************** * arrays of bits * * source: http://c-faq.com/misc/bitsets.html * **********************************************/ #define GAMGI_ENGINE_BITMASK(b) (1 << ((b) % CHAR_BIT)) #define GAMGI_ENGINE_BITSLOT(b) ((b) / CHAR_BIT) #define GAMGI_ENGINE_BITSET(a, b) ((a)[GAMGI_ENGINE_BITSLOT(b)] |= GAMGI_ENGINE_BITMASK(b)) #define GAMGI_ENGINE_BITCLEAR(a, b) ((a)[GAMGI_ENGINE_BITSLOT(b)] &= ~GAMGI_ENGINE_BITMASK(b)) #define GAMGI_ENGINE_BITTEST(a, b) ((a)[GAMGI_ENGINE_BITSLOT(b)] & GAMGI_ENGINE_BITMASK(b)) #define GAMGI_ENGINE_BITNSLOTS(nb) ((nb + CHAR_BIT - 1) / CHAR_BIT) /********** types ********* **************************/ /*************************************** * for the sake of simplicity, the * * folowing GTK and OpenGL types are * * NOT used in GAMGI, the built-in * * C types are applied instead. * * * * defined in glib/include/glib.h: * * typedef char gchar; * * typedef short gshort; * * typedef long glong; * * typedef int gint; * * typedef gint gboolean; * * typedef void* gpointer; * * typedef unsigned char guchar; * * typedef unsigned short gushort; * * typedef unsigned long gulong; * * typedef unsigned int guint; * * typedef float gfloat; * * typedef double gdouble; * * * * defined in mesa/include/GL/gl.h: * * typedef unsigned int GLenum; * * typedef unsigned char GLboolean; * * typedef unsigned int GLbitfield; * * typedef void GLvoid; * * typedef signed char GLbyte; * * typedef short GLshort; * * typedef int GLint; * * typedef unsigned char GLubyte; * * typedef unsigned short GLushort; * * typedef unsigned int GLuint; * * typedef float GLfloat; * * typedef double GLdouble; * ***************************************/ /**************************************** * these types improve code readability * ****************************************/ typedef int gamgi_enum; typedef int gamgi_bool; /********* * lists * *********/ typedef struct _gamgi_slist { void *data; struct _gamgi_slist *next; } gamgi_slist; typedef struct _gamgi_dlist { void *data; struct _gamgi_dlist *next, *before; } gamgi_dlist; /****************** * dynamic arrays * ******************/ typedef struct _gamgi_iarray { int *array, *last; int size, increment, dimension, offset; } gamgi_iarray; typedef struct _gamgi_darray { double *array, *last; int size, increment, dimension, offset; } gamgi_darray; /********** * object * **********/ typedef struct _gamgi_object { char name[GAMGI_ENGINE_TOKEN]; char label[GAMGI_ENGINE_TOKEN]; unsigned int number; int class; double scale; unsigned int task; struct _gamgi_object *object; gamgi_dlist *dlist; gamgi_dlist *selection; } gamgi_object; /******** * text * ********/ typedef struct _gamgi_text { gamgi_object object; void (*draw) (struct _gamgi_text *); int mark; char *string; int length; gamgi_enum style; gamgi_enum font; double origin[3]; double center[3]; double quaternion[4]; float red, green, blue; gamgi_dlist *text_start; gamgi_dlist *text_end; struct _gamgi_text *next, *before; } gamgi_text; /*********** * orbital * ***********/ typedef struct _gamgi_orbital { gamgi_object object; void (*draw) (struct _gamgi_orbital *); /**************** * quantum data * ****************/ int n, l, m; double charge; /************** * model data * **************/ gamgi_enum style; double radius, density; int sampling, seed; /*************** * volume data * ***************/ gamgi_bool phase, frame; int octants[8]; gamgi_enum axes; /************** * array data * **************/ int dots[3]; double *points; int *lines; int n_points, n_lines; /************ * position * ************/ double origin[3]; double center[3]; double quaternion[4]; /********** * colors * **********/ float base_r, base_g, base_b; float phase_r, phase_g, phase_b; float frame_r, frame_g, frame_b; gamgi_dlist *text_start; gamgi_dlist *text_end; struct _gamgi_orbital *next, *before; } gamgi_orbital; /******** * atom * ********/ typedef struct _gamgi_atom { gamgi_object object; void (*draw) (struct _gamgi_atom *); int element; double position[3]; double mass, radius, charge; double temperature, occupancy; float variancy, size; float red, green, blue; int mark; gamgi_dlist *text_start; gamgi_dlist *text_end; gamgi_dlist *orbital_start; gamgi_dlist *orbital_end; gamgi_dlist *bond_start; gamgi_dlist *bond_end; struct _gamgi_atom *next, *before; } gamgi_atom; /******** * bond * ********/ typedef struct _gamgi_bond { gamgi_object object; void (*draw) (struct _gamgi_bond *); gamgi_atom *atom1, *atom2; gamgi_dlist *dlist1, *dlist2; unsigned char color1[3], color2[3]; int first; gamgi_atom *copy; float order; float covalency; float size; gamgi_bool color; float red, green, blue; gamgi_dlist *text_start; gamgi_dlist *text_end; gamgi_dlist *orbital_start; gamgi_dlist *orbital_end; struct _gamgi_bond *next, *before; } gamgi_bond; /************* * direction * *************/ typedef struct _gamgi_direction { gamgi_object object; void (*draw) (struct _gamgi_direction *); void (*net) (double *, double *); gamgi_enum reference; gamgi_enum model; int uvw[3]; gamgi_enum vectors; int node[4]; double origin[3], center[3]; double quaternion[4]; double *points; int *loops; int n_points, n_loops; float red, green, blue; gamgi_dlist *text_start; gamgi_dlist *text_end; gamgi_dlist *orbital_start; gamgi_dlist *orbital_end; gamgi_dlist *bond_start; gamgi_dlist *bond_end; gamgi_dlist *atom_start; gamgi_dlist *atom_end; struct _gamgi_direction *next, *before; } gamgi_direction; /********* * plane * *********/ typedef struct _gamgi_plane { gamgi_object object; void (*draw) (struct _gamgi_plane *); void (*net) (double *, double *); gamgi_enum reference; gamgi_enum model; int hkl[3]; gamgi_enum vectors; int order; double origin[3], center[3]; double quaternion[4]; double *points; int *loops; int n_points, n_loops; float red, green, blue; gamgi_dlist *text_start; gamgi_dlist *text_end; gamgi_dlist *orbital_start; gamgi_dlist *orbital_end; gamgi_dlist *bond_start; gamgi_dlist *bond_end; gamgi_dlist *atom_start; gamgi_dlist *atom_end; gamgi_dlist *direction_start; gamgi_dlist *direction_end; struct _gamgi_plane *next, *before; } gamgi_plane; /********* * group * *********/ typedef struct _gamgi_group { gamgi_object object; void (*draw) (struct _gamgi_group *); int mark; gamgi_enum reference; double origin[3], center[3]; double quaternion[4]; gamgi_bool faces; double *points; int *loops; int n_points, n_loops; float red, green, blue; gamgi_dlist *text_start; gamgi_dlist *text_end; gamgi_dlist *orbital_start; gamgi_dlist *orbital_end; gamgi_dlist *bond_start; gamgi_dlist *bond_end; gamgi_dlist *atom_start; gamgi_dlist *atom_end; gamgi_dlist *direction_start; gamgi_dlist *direction_end; gamgi_dlist *plane_start; gamgi_dlist *plane_end; gamgi_dlist *group_start; gamgi_dlist *group_end; struct _gamgi_group *next, *before; } gamgi_group; /************ * molecule * ************/ typedef struct _gamgi_molecule { gamgi_object object; void (*draw) (struct _gamgi_molecule *); double origin[3], center[3]; double quaternion[4]; gamgi_dlist *text_start; gamgi_dlist *text_end; gamgi_dlist *orbital_start; gamgi_dlist *orbital_end; gamgi_dlist *bond_start; gamgi_dlist *bond_end; gamgi_dlist *atom_start; gamgi_dlist *atom_end; gamgi_dlist *direction_start; gamgi_dlist *direction_end; gamgi_dlist *plane_start; gamgi_dlist *plane_end; gamgi_dlist *group_start; gamgi_dlist *group_end; struct _gamgi_molecule *next, *before; } gamgi_molecule; /*********** * cluster * ***********/ typedef struct _gamgi_cluster { gamgi_object object; int mark; gamgi_enum reference; double origin[3], center[3]; double quaternion[4]; gamgi_bool faces; double *points; int *loops; float *colors; int *paints; int n_points, n_loops; int n_colors, n_paints; int atoms; gamgi_dlist *text_start; gamgi_dlist *text_end; gamgi_dlist *orbital_start; gamgi_dlist *orbital_end; gamgi_dlist *bond_start; gamgi_dlist *bond_end; gamgi_dlist *atom_start; gamgi_dlist *atom_end; gamgi_dlist *direction_start; gamgi_dlist *direction_end; gamgi_dlist *plane_start; gamgi_dlist *plane_end; gamgi_dlist *group_start; gamgi_dlist *group_end; gamgi_dlist *molecule_start; gamgi_dlist *molecule_end; gamgi_dlist *cluster_start; gamgi_dlist *cluster_end; struct _gamgi_cluster *next, *before; } gamgi_cluster; /******** * cell * ********/ typedef struct _gamgi_cell { gamgi_object object; double a, b, c, ab, ac, bc; double a1[3], a2[3], a3[3]; double p1[3], p2[3], p3[3]; double v1, v2, v3, v12, v13, v23; double reciprocal; gamgi_enum lattice, model, borders; gamgi_bool faces, nodes; int group, n1, n2, n3; double origin[3], center[3]; double quaternion[4]; /************** * origin node * * origin axes * **************/ int o1, o2, o3; gamgi_enum origin_vectors; gamgi_bool axes; gamgi_enum axes_vectors; double *points; int *loops, *lines; int n_points, n_loops, n_lines, n_nodes; float red, green, blue; gamgi_dlist *text_start; gamgi_dlist *text_end; gamgi_dlist *orbital_start; gamgi_dlist *orbital_end; gamgi_dlist *bond_start; gamgi_dlist *bond_end; gamgi_dlist *atom_start; gamgi_dlist *atom_end; gamgi_dlist *direction_start; gamgi_dlist *direction_end; gamgi_dlist *plane_start; gamgi_dlist *plane_end; gamgi_dlist *group_start; gamgi_dlist *group_end; gamgi_dlist *molecule_start; gamgi_dlist *molecule_end; gamgi_dlist *cluster_start; gamgi_dlist *cluster_end; struct _gamgi_cell *next, *before; } gamgi_cell; /********* * arrow * *********/ typedef struct _gamgi_arrow { gamgi_object object; void (*draw) (struct _gamgi_arrow *); gamgi_dlist *text_start; gamgi_dlist *text_end; struct _gamgi_arrow *next, *before; } gamgi_arrow; /********* * shape * *********/ typedef struct _gamgi_shape { gamgi_object object; void (*draw) (struct _gamgi_shape *); gamgi_dlist *text_start; gamgi_dlist *text_end; struct _gamgi_shape *next, *before; } gamgi_shape; /********* * graph * *********/ typedef struct _gamgi_graph { gamgi_object object; void (*draw) (struct _gamgi_graph *); gamgi_dlist *text_start; gamgi_dlist *text_end; struct _gamgi_graph *next, *before; } gamgi_graph; /************ * assembly * ************/ typedef struct _gamgi_assembly { gamgi_object object; void (*draw) (struct _gamgi_assembly *); int mark; double origin[3], center[3]; double quaternion[4]; gamgi_dlist *text_start; gamgi_dlist *text_end; gamgi_dlist *orbital_start; gamgi_dlist *orbital_end; gamgi_dlist *bond_start; gamgi_dlist *bond_end; gamgi_dlist *atom_start; gamgi_dlist *atom_end; gamgi_dlist *direction_start; gamgi_dlist *direction_end; gamgi_dlist *plane_start; gamgi_dlist *plane_end; gamgi_dlist *group_start; gamgi_dlist *group_end; gamgi_dlist *molecule_start; gamgi_dlist *molecule_end; gamgi_dlist *cluster_start; gamgi_dlist *cluster_end; gamgi_dlist *cell_start; gamgi_dlist *cell_end; gamgi_dlist *arrow_start; gamgi_dlist *arrow_end; gamgi_dlist *shape_start; gamgi_dlist *shape_end; gamgi_dlist *graph_start; gamgi_dlist *graph_end; gamgi_dlist *assembly_start; gamgi_dlist *assembly_end; struct _gamgi_assembly *next, *before; } gamgi_assembly; /********* * light * *********/ typedef struct _gamgi_light { gamgi_object object; void (*draw) (struct _gamgi_light *); /****************** * rgb color data * ******************/ float ambient[4]; float diffuse[4]; float specular[4]; /***************** * geometry data * *****************/ float position[4]; float direction[3]; float angle; /******************** * attenuation data * ********************/ float constant; float linear; float quadratic; float radial; struct _gamgi_light *next, *before; } gamgi_light; /********* * layer * *********/ typedef struct _gamgi_layer { gamgi_object object; void (*draw) (struct _gamgi_layer *); /************************* * modelview matrix data * *************************/ double eye[3]; double center[3]; double up[3]; double referential[9]; /************************** * projection matrix data * **************************/ int perspective; double top, near, far; /******************** * visibility data * * * * referential axes * * * * background color * ********************/ gamgi_enum visibility_in; gamgi_enum visibility_out; gamgi_bool axes; float color[4]; /******************** * number of lights * ********************/ int light; /**************** * history data * ****************/ gamgi_dlist *undo; gamgi_dlist *save; /*************** * child links * ***************/ gamgi_dlist *text_start; gamgi_dlist *text_end; gamgi_dlist *orbital_start; gamgi_dlist *orbital_end; gamgi_dlist *bond_start; gamgi_dlist *bond_end; gamgi_dlist *atom_start; gamgi_dlist *atom_end; gamgi_dlist *direction_start; gamgi_dlist *direction_end; gamgi_dlist *plane_start; gamgi_dlist *plane_end; gamgi_dlist *group_start; gamgi_dlist *group_end; gamgi_dlist *molecule_start; gamgi_dlist *molecule_end; gamgi_dlist *cluster_start; gamgi_dlist *cluster_end; gamgi_dlist *cell_start; gamgi_dlist *cell_end; gamgi_dlist *arrow_start; gamgi_dlist *arrow_end; gamgi_dlist *shape_start; gamgi_dlist *shape_end; gamgi_dlist *graph_start; gamgi_dlist *graph_end; gamgi_dlist *assembly_start; gamgi_dlist *assembly_end; gamgi_dlist *light_start; gamgi_dlist *light_end; struct _gamgi_layer *next, *before; } gamgi_layer; /********** * window * **********/ typedef struct _gamgi_window { gamgi_object object; void (*draw) (struct _gamgi_window *); /************* * resources * *************/ GtkWidget *window; GtkWidget *dialog0; GtkWidget *dialog1; GtkWidget *help; gamgi_dlist *history; gamgi_layer *layer; gamgi_object *focus; gamgi_enum action; gamgi_enum mode; gamgi_enum class; gamgi_bool axes; /********************* * window dimensions * *********************/ int origin_x, origin_y; int width, height; /**************** * menu section * ****************/ GtkWidget *top; GtkWidget *medium; GtkWidget *bottom; gamgi_bool top_flag; gamgi_bool medium_flag; gamgi_bool bottom_flag; /******************* * graphic section * *******************/ GtkWidget *area; float begin_x; float begin_y; /**************** * tool section * ****************/ GtkWidget *entry; GtkWidget *ruler; gamgi_enum axis; double total; /****************** * status section * ******************/ GtkWidget *statusbar_focus, *statusbar_layer; GtkWidget *statusbar_message, *statusbar_time; int context_focus, context_layer; int context_message, context_time; int timer_focus; int timer_layer; int timer_message; int timer_progress; GtkWidget *progress_bar; gamgi_bool demo_flag; /*************** * child links * ***************/ gamgi_dlist *layer_start; gamgi_dlist *layer_end; struct _gamgi_window *next, *before; } gamgi_window; /******************************************* * general functions: * * 1) called to show a selected Help topic * * 2) called after an object is selected * *******************************************/ typedef void (* gamgi_function1) (void *data); typedef void (* gamgi_function2) (gamgi_object *object, void *data); /************* macros ************ *********************************/ #define GAMGI_ENGINE_UNDO 5 #define GAMGI_ENGINE_SAVE 5 #define GAMGI_CAST_SLIST (gamgi_slist *) #define GAMGI_CAST_DLIST (gamgi_dlist *) #define GAMGI_CAST_OBJECT (gamgi_object *) #define GAMGI_CAST_TEXT (gamgi_text *) #define GAMGI_CAST_ORBITAL (gamgi_orbital *) #define GAMGI_CAST_BOND (gamgi_bond *) #define GAMGI_CAST_ATOM (gamgi_atom *) #define GAMGI_CAST_DIRECTION (gamgi_direction *) #define GAMGI_CAST_PLANE (gamgi_plane *) #define GAMGI_CAST_GROUP (gamgi_group *) #define GAMGI_CAST_MOLECULE (gamgi_molecule *) #define GAMGI_CAST_CLUSTER (gamgi_cluster *) #define GAMGI_CAST_CELL (gamgi_cell *) #define GAMGI_CAST_ARROW (gamgi_arrow *) #define GAMGI_CAST_SHAPE (gamgi_shape *) #define GAMGI_CAST_GRAPH (gamgi_graph *) #define GAMGI_CAST_ASSEMBLY (gamgi_assembly *) #define GAMGI_CAST_LIGHT (gamgi_light *) #define GAMGI_CAST_LAYER (gamgi_layer *) #define GAMGI_CAST_WINDOW (gamgi_window *) #define GAMGI_CAST_GAMGI (gamgi_gamgi *) #define GAMGI_INT_TO_POINTER(integer) ((void *)((char *) 0 + (integer))) #define GAMGI_POINTER_TO_INT(pointer) ((unsigned int)((char *)(pointer) - (char *) 0)) /********** enumerations ********** **********************************/ /************************************************************** * All external enumerations start at 1 and share FALSE for 0 * **************************************************************/ enum {GAMGI_ENGINE_HELP = 1, GAMGI_ENGINE_TEXT, GAMGI_ENGINE_ORBITAL, GAMGI_ENGINE_BOND, GAMGI_ENGINE_ATOM, GAMGI_ENGINE_DIRECTION, GAMGI_ENGINE_PLANE, GAMGI_ENGINE_GROUP, GAMGI_ENGINE_MOLECULE, GAMGI_ENGINE_CLUSTER, GAMGI_ENGINE_CELL, GAMGI_ENGINE_ARROW, GAMGI_ENGINE_SHAPE, GAMGI_ENGINE_GRAPH, GAMGI_ENGINE_ASSEMBLY, GAMGI_ENGINE_LIGHT, GAMGI_ENGINE_LAYER, GAMGI_ENGINE_WINDOW, GAMGI_ENGINE_GAMGI}; enum {GAMGI_ENGINE_SELECT_ELEMENT = 1, GAMGI_ENGINE_SELECT_LENGTH}; #endif gamgi-0.17.5/src/engine/gamgi_engine_array.c000066400000000000000000000200761433127522700207120ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_array.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" /***************** internal function ******************** * * ********************************************************/ static void static_iarray_start (gamgi_iarray *iarray, int size, int increment, int dimension) { iarray->size = size; iarray->increment = increment; iarray->dimension = dimension; iarray->offset = 0; iarray->last = NULL; } /***************** internal function ******************** * * ********************************************************/ static void static_darray_start (gamgi_darray *darray, int size, int increment, int dimension) { darray->size = size; darray->increment = increment; darray->dimension = dimension; darray->offset = 0; darray->last = NULL; } /***************** external function ******************** * * ********************************************************/ gamgi_iarray *gamgi_engine_iarray_create (int size, int increment, int dimension) { gamgi_iarray *iarray = (gamgi_iarray *) malloc (sizeof (gamgi_iarray)); iarray->array = (int *) malloc (size * dimension * sizeof (int)); static_iarray_start (iarray, size, increment, dimension); return iarray; } /***************** external function ******************** * * ********************************************************/ gamgi_iarray *gamgi_engine_iarray_recreate (gamgi_iarray *iarray, int size, int increment, int dimension) { iarray->array = (int *) realloc (iarray->array, size * dimension * sizeof (int)); iarray->size = size; iarray->increment = increment; iarray->dimension = dimension; iarray->offset = size; /******************************* * set pointer to last element * *******************************/ iarray->last = iarray->array + iarray->offset * iarray->dimension; return iarray; } /***************** external function ******************** * * ********************************************************/ int *gamgi_engine_iarray_push (gamgi_iarray *iarray, int *vector) { int i; /*********************************** * enlarge full array, adding more * * (user-controled) step elements * ***********************************/ if (iarray->offset == iarray->size) { iarray->size += iarray->increment; iarray->array = (int *) realloc (iarray->array, iarray->size * iarray->dimension * sizeof (int)); } /******************************* * set pointer to last element * *******************************/ iarray->last = iarray->array + iarray->offset * iarray->dimension; /***************************** * copy data to last element * *****************************/ if (vector != NULL) for (i = 0; i < iarray->dimension; i++) iarray->last[i] = vector[i]; /*********************** * update array offset * ***********************/ iarray->offset++; /********************************** * return pointer to last element * **********************************/ return iarray->last; } /***************** external function ******************** * * ********************************************************/ void gamgi_engine_iarray_pop (gamgi_iarray *iarray, int offset) { /************************************************************ * memory is not deallocated, to avoid expensive reallocs * * when the array is reused, only offset and last are reset * ************************************************************/ iarray->offset = offset; if (offset == 0) iarray->last = NULL; else iarray->last = iarray->array + (offset - 1) * iarray->dimension; } /***************** external function ******************** * * ********************************************************/ void gamgi_engine_iarray_remove (gamgi_iarray *iarray) { free (iarray->array); free (iarray); } /***************** external function ******************** * * ********************************************************/ void gamgi_engine_iarray_copy_remove (gamgi_iarray *iarray, int **array, int *size) { *array = iarray->array; *size = iarray->offset; free (iarray); } /***************** external function ******************** * * ********************************************************/ gamgi_darray *gamgi_engine_darray_create (int size, int increment, int dimension) { gamgi_darray *darray = (gamgi_darray *) malloc (sizeof (gamgi_darray)); darray->array = (double *) malloc (size * dimension * sizeof (double)); static_darray_start (darray, size, increment, dimension); return darray; } /***************** external function ******************** * * ********************************************************/ gamgi_darray *gamgi_engine_darray_recreate (gamgi_darray *darray, int size, int increment, int dimension) { darray->array = (double *) realloc (darray->array, size * dimension * sizeof (double)); darray->size = size; darray->increment = increment; darray->dimension = dimension; darray->offset = size; /******************************* * set pointer to last element * *******************************/ darray->last = darray->array + darray->offset * darray->dimension; return darray; } /***************** external function ******************** * * ********************************************************/ double *gamgi_engine_darray_push (gamgi_darray *darray, double *vector) { int i; /*********************************** * enlarge full array, adding more * * (user-controled) step elements * ***********************************/ if (darray->offset == darray->size) { darray->size += darray->increment; darray->array = (double *) realloc (darray->array, darray->size * darray->dimension * sizeof (double)); } /******************************* * set pointer to last element * *******************************/ darray->last = darray->array + darray->offset * darray->dimension; /***************************** * copy data to last element * *****************************/ if (vector != NULL) for (i = 0; i < darray->dimension; i++) darray->last[i] = vector[i]; /*********************** * update array offset * ***********************/ darray->offset++; /********************************** * return pointer to last element * **********************************/ return darray->last; } /***************** external function ******************** * * ********************************************************/ void gamgi_engine_darray_pop (gamgi_darray *darray, int offset) { /************************************************************ * memory is not deallocated, to avoid expensive reallocs * * when the array is reused, only offset and last are reset * ************************************************************/ darray->offset = offset; if (offset == 0) darray->last = NULL; else darray->last = darray->array + (offset - 1) * darray->dimension; } /***************** external function ******************** * * ********************************************************/ void gamgi_engine_darray_remove (gamgi_darray *darray) { free (darray->array); free (darray); } /***************** external function ******************** * * ********************************************************/ void gamgi_engine_darray_copy_remove (gamgi_darray *darray, double **array, int *size) { *array = darray->array; *size = darray->offset; free (darray); } gamgi-0.17.5/src/engine/gamgi_engine_array.h000066400000000000000000000031031433127522700207070ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_array.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * internal functions * ********************** static void static_iarray_start (gamgi_iarray *iarray, int size, int increment, int dimension); static void static_darray_start (gamgi_darray *darray, int size, int increment, int dimension); ********************** * external functions * **********************/ gamgi_iarray *gamgi_engine_iarray_create (int total, int step, int dimensions); gamgi_iarray *gamgi_engine_iarray_recreate (gamgi_iarray *iarray, int total, int step, int dimensions); int *gamgi_engine_iarray_push (gamgi_iarray *iarray, int *vector); void gamgi_engine_iarray_pop (gamgi_iarray *iarray, int offset); void gamgi_engine_iarray_remove (gamgi_iarray *iarray); void gamgi_engine_iarray_copy_remove (gamgi_iarray *iarray, int **array, int *size); gamgi_darray *gamgi_engine_darray_create (int total, int step, int dimensions); gamgi_darray *gamgi_engine_darray_recreate (gamgi_darray *darray, int total, int step, int dimensions); double *gamgi_engine_darray_push (gamgi_darray *darray, double *vector); void gamgi_engine_darray_pop (gamgi_darray *darray, int offset); void gamgi_engine_darray_remove (gamgi_darray *darray); void gamgi_engine_darray_copy_remove (gamgi_darray *darray, double **array, int *size); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_copy.c000066400000000000000000000640511433127522700205470ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_copy.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_engine_create.h" #include "gamgi_engine_copy_out.h" #include "gamgi_engine_link.h" #include "gamgi_engine_number.h" static void static_start (gamgi_object *object) { object->task = 0; object->selection = NULL; object->object = NULL; object->dlist = NULL; } gamgi_text *gamgi_engine_copy_text (gamgi_text *text) { gamgi_dlist *dlist; gamgi_text *text_new, *text_child; text_new = gamgi_engine_create_text (); static_start (GAMGI_CAST_OBJECT text_new); gamgi_engine_copy_out_text (text, text_new); text_new->object.number = gamgi_engine_number_text_get (); dlist = text->text_start; while (dlist != NULL) { text_child = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_text (text_child, text_new); dlist = dlist->next; } return text_new; } gamgi_orbital *gamgi_engine_copy_orbital (gamgi_orbital *orbital) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; orbital_new = gamgi_engine_create_orbital (); static_start (GAMGI_CAST_OBJECT orbital_new); gamgi_engine_copy_out_orbital (orbital, orbital_new); orbital_new->object.number = gamgi_engine_number_orbital_get (); dlist = orbital->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_orbital (text_new, orbital_new); dlist = dlist->next; } return orbital_new; } gamgi_bond *gamgi_engine_copy_bond (gamgi_bond *bond) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; gamgi_bond *bond_new; bond_new = gamgi_engine_create_bond (); static_start (GAMGI_CAST_OBJECT bond_new); gamgi_engine_copy_out_bond (bond, bond_new); bond_new->object.number = gamgi_engine_number_bond_get (); dlist = bond->orbital_start; while (dlist != NULL) { orbital_new = gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL dlist->data); gamgi_engine_link_orbital_bond (orbital_new, bond_new); dlist = dlist->next; } dlist = bond->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_bond (text_new, bond_new); dlist = dlist->next; } return bond_new; } gamgi_atom *gamgi_engine_copy_atom (gamgi_atom *atom) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; gamgi_bond *bond, *bond_new; gamgi_atom *atom_new; atom_new = gamgi_engine_create_atom (); static_start (GAMGI_CAST_OBJECT atom_new); gamgi_engine_copy_out_atom (atom, atom_new); atom_new->object.number = gamgi_engine_number_atom_get (); dlist = atom->bond_start; while (dlist != NULL) { bond = GAMGI_CAST_BOND dlist->data; dlist = dlist->next; /************************************** * in case second link does not exist * * this case should never occur! * **************************************/ if (bond->atom2 == NULL) continue; if (bond->copy == NULL) bond->copy = atom_new; else { bond_new = gamgi_engine_copy_bond (bond); gamgi_engine_link_bond_atom (bond_new, bond->copy); gamgi_engine_link_bond_atom (bond_new, atom_new); bond->copy = NULL; } } dlist = atom->orbital_start; while (dlist != NULL) { orbital_new = gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL dlist->data); gamgi_engine_link_orbital_atom (orbital_new, atom_new); dlist = dlist->next; } dlist = atom->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_atom (text_new, atom_new); dlist = dlist->next; } return atom_new; } gamgi_direction *gamgi_engine_copy_direction (gamgi_direction *direction) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; gamgi_atom *atom_new; gamgi_direction *direction_new; direction_new = gamgi_engine_create_direction (); static_start (GAMGI_CAST_OBJECT direction_new); gamgi_engine_copy_out_direction (direction, direction_new); direction_new->object.number = gamgi_engine_number_direction_get (); dlist = direction->atom_start; while (dlist != NULL) { atom_new = gamgi_engine_copy_atom (GAMGI_CAST_ATOM dlist->data); gamgi_engine_link_atom_direction (atom_new, direction_new); dlist = dlist->next; } dlist = direction->orbital_start; while (dlist != NULL) { orbital_new = gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL dlist->data); gamgi_engine_link_orbital_direction (orbital_new, direction_new); dlist = dlist->next; } dlist = direction->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_direction (text_new, direction_new); dlist = dlist->next; } return direction_new; } gamgi_plane *gamgi_engine_copy_plane (gamgi_plane *plane) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; gamgi_atom *atom_new; gamgi_direction *direction_new; gamgi_plane *plane_new; plane_new = gamgi_engine_create_plane (); static_start (GAMGI_CAST_OBJECT plane_new); gamgi_engine_copy_out_plane (plane, plane_new); plane_new->object.number = gamgi_engine_number_plane_get (); dlist = plane->direction_start; while (dlist != NULL) { direction_new = gamgi_engine_copy_direction (GAMGI_CAST_DIRECTION dlist->data); gamgi_engine_link_direction_plane (direction_new, plane_new); dlist = dlist->next; } dlist = plane->atom_start; while (dlist != NULL) { atom_new = gamgi_engine_copy_atom (GAMGI_CAST_ATOM dlist->data); gamgi_engine_link_atom_plane (atom_new, plane_new); dlist = dlist->next; } dlist = plane->orbital_start; while (dlist != NULL) { orbital_new = gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL dlist->data); gamgi_engine_link_orbital_plane (orbital_new, plane_new); dlist = dlist->next; } dlist = plane->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_plane (text_new, plane_new); dlist = dlist->next; } return plane_new; } gamgi_group *gamgi_engine_copy_group (gamgi_group *group) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; gamgi_atom *atom_new; gamgi_direction *direction_new; gamgi_plane *plane_new; gamgi_group *group_new, *group_child; group_new = gamgi_engine_create_group (); static_start (GAMGI_CAST_OBJECT group_new); gamgi_engine_copy_out_group (group, group_new); group_new->object.number = gamgi_engine_number_group_get (); dlist = group->group_start; while (dlist != NULL) { group_child = gamgi_engine_copy_group (GAMGI_CAST_GROUP dlist->data); gamgi_engine_link_group_group (group_child, group_new); dlist = dlist->next; } dlist = group->plane_start; while (dlist != NULL) { plane_new = gamgi_engine_copy_plane (GAMGI_CAST_PLANE dlist->data); gamgi_engine_link_plane_group (plane_new, group_new); dlist = dlist->next; } dlist = group->direction_start; while (dlist != NULL) { direction_new = gamgi_engine_copy_direction (GAMGI_CAST_DIRECTION dlist->data); gamgi_engine_link_direction_group (direction_new, group_new); dlist = dlist->next; } dlist = group->atom_start; while (dlist != NULL) { atom_new = gamgi_engine_copy_atom (GAMGI_CAST_ATOM dlist->data); gamgi_engine_link_atom_group (atom_new, group_new); dlist = dlist->next; } dlist = group->orbital_start; while (dlist != NULL) { orbital_new = gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL dlist->data); gamgi_engine_link_orbital_group (orbital_new, group_new); dlist = dlist->next; } dlist = group->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_group (text_new, group_new); dlist = dlist->next; } return group_new; } gamgi_molecule *gamgi_engine_copy_molecule (gamgi_molecule *molecule) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; gamgi_atom *atom_new; gamgi_direction *direction_new; gamgi_plane *plane_new; gamgi_group *group_new; gamgi_molecule *molecule_new; molecule_new = gamgi_engine_create_molecule (); static_start (GAMGI_CAST_OBJECT molecule_new); gamgi_engine_copy_out_molecule (molecule, molecule_new); molecule_new->object.number = gamgi_engine_number_molecule_get (); dlist = molecule->group_start; while (dlist != NULL) { group_new = gamgi_engine_copy_group (GAMGI_CAST_GROUP dlist->data); gamgi_engine_link_group_molecule (group_new, molecule_new); dlist = dlist->next; } dlist = molecule->plane_start; while (dlist != NULL) { plane_new = gamgi_engine_copy_plane (GAMGI_CAST_PLANE dlist->data); gamgi_engine_link_plane_molecule (plane_new, molecule_new); dlist = dlist->next; } dlist = molecule->direction_start; while (dlist != NULL) { direction_new = gamgi_engine_copy_direction (GAMGI_CAST_DIRECTION dlist->data); gamgi_engine_link_direction_molecule (direction_new, molecule_new); dlist = dlist->next; } dlist = molecule->atom_start; while (dlist != NULL) { atom_new = gamgi_engine_copy_atom (GAMGI_CAST_ATOM dlist->data); gamgi_engine_link_atom_molecule (atom_new, molecule_new); dlist = dlist->next; } dlist = molecule->orbital_start; while (dlist != NULL) { orbital_new = gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL dlist->data); gamgi_engine_link_orbital_molecule (orbital_new, molecule_new); dlist = dlist->next; } dlist = molecule->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_molecule (text_new, molecule_new); dlist = dlist->next; } return molecule_new; } gamgi_cluster *gamgi_engine_copy_cluster (gamgi_cluster *cluster) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; gamgi_atom *atom_new; gamgi_direction *direction_new; gamgi_plane *plane_new; gamgi_group *group_new; gamgi_molecule *molecule_new; gamgi_cluster *cluster_new, *cluster_child; cluster_new = gamgi_engine_create_cluster (); static_start (GAMGI_CAST_OBJECT cluster_new); gamgi_engine_copy_out_cluster (cluster, cluster_new); cluster_new->object.number = gamgi_engine_number_cluster_get (); dlist = cluster->cluster_start; while (dlist != NULL) { cluster_child = gamgi_engine_copy_cluster (GAMGI_CAST_CLUSTER dlist->data); gamgi_engine_link_cluster_cluster (cluster_child, cluster_new); dlist = dlist->next; } dlist = cluster->molecule_start; while (dlist != NULL) { molecule_new = gamgi_engine_copy_molecule (GAMGI_CAST_MOLECULE dlist->data); gamgi_engine_link_molecule_cluster (molecule_new, cluster_new); dlist = dlist->next; } dlist = cluster->group_start; while (dlist != NULL) { group_new = gamgi_engine_copy_group (GAMGI_CAST_GROUP dlist->data); gamgi_engine_link_group_cluster (group_new, cluster_new); dlist = dlist->next; } dlist = cluster->plane_start; while (dlist != NULL) { plane_new = gamgi_engine_copy_plane (GAMGI_CAST_PLANE dlist->data); gamgi_engine_link_plane_cluster (plane_new, cluster_new); dlist = dlist->next; } dlist = cluster->direction_start; while (dlist != NULL) { direction_new = gamgi_engine_copy_direction (GAMGI_CAST_DIRECTION dlist->data); gamgi_engine_link_direction_cluster (direction_new, cluster_new); dlist = dlist->next; } dlist = cluster->atom_start; while (dlist != NULL) { atom_new = gamgi_engine_copy_atom (GAMGI_CAST_ATOM dlist->data); gamgi_engine_link_atom_cluster (atom_new, cluster_new); dlist = dlist->next; } dlist = cluster->orbital_start; while (dlist != NULL) { orbital_new = gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL dlist->data); gamgi_engine_link_orbital_cluster (orbital_new, cluster_new); dlist = dlist->next; } dlist = cluster->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_cluster (text_new, cluster_new); dlist = dlist->next; } return cluster_new; } gamgi_cell *gamgi_engine_copy_cell (gamgi_cell *cell) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; gamgi_atom *atom_new; gamgi_direction *direction_new; gamgi_plane *plane_new; gamgi_group *group_new; gamgi_molecule *molecule_new; gamgi_cluster *cluster_new; gamgi_cell *cell_new; cell_new = gamgi_engine_create_cell (); static_start (GAMGI_CAST_OBJECT cell_new); gamgi_engine_copy_out_cell (cell, cell_new); cell_new->object.number = gamgi_engine_number_cell_get (); dlist = cell->cluster_start; while (dlist != NULL) { cluster_new = gamgi_engine_copy_cluster (GAMGI_CAST_CLUSTER dlist->data); gamgi_engine_link_cluster_cell (cluster_new, cell_new); dlist = dlist->next; } dlist = cell->molecule_start; while (dlist != NULL) { molecule_new = gamgi_engine_copy_molecule (GAMGI_CAST_MOLECULE dlist->data); gamgi_engine_link_molecule_cell (molecule_new, cell_new); dlist = dlist->next; } dlist = cell->group_start; while (dlist != NULL) { group_new = gamgi_engine_copy_group (GAMGI_CAST_GROUP dlist->data); gamgi_engine_link_group_cell (group_new, cell_new); dlist = dlist->next; } dlist = cell->plane_start; while (dlist != NULL) { plane_new = gamgi_engine_copy_plane (GAMGI_CAST_PLANE dlist->data); gamgi_engine_link_plane_cell (plane_new, cell_new); dlist = dlist->next; } dlist = cell->direction_start; while (dlist != NULL) { direction_new = gamgi_engine_copy_direction (GAMGI_CAST_DIRECTION dlist->data); gamgi_engine_link_direction_cell (direction_new, cell_new); dlist = dlist->next; } dlist = cell->atom_start; while (dlist != NULL) { atom_new = gamgi_engine_copy_atom (GAMGI_CAST_ATOM dlist->data); gamgi_engine_link_atom_cell (atom_new, cell_new); dlist = dlist->next; } dlist = cell->orbital_start; while (dlist != NULL) { orbital_new = gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL dlist->data); gamgi_engine_link_orbital_cell (orbital_new, cell_new); dlist = dlist->next; } dlist = cell->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_cell (text_new, cell_new); dlist = dlist->next; } return cell_new; } gamgi_arrow *gamgi_engine_copy_arrow (gamgi_arrow *arrow) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_arrow *arrow_new; arrow_new = gamgi_engine_create_arrow (); static_start (GAMGI_CAST_OBJECT arrow_new); gamgi_engine_copy_out_arrow (arrow, arrow_new); arrow_new->object.number = gamgi_engine_number_arrow_get (); dlist = arrow->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_arrow (text_new, arrow_new); dlist = dlist->next; } return arrow_new; } gamgi_shape *gamgi_engine_copy_shape (gamgi_shape *shape) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_shape *shape_new; shape_new = gamgi_engine_create_shape (); static_start (GAMGI_CAST_OBJECT shape_new); gamgi_engine_copy_out_shape (shape, shape_new); shape_new->object.number = gamgi_engine_number_shape_get (); dlist = shape->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_shape (text_new, shape_new); dlist = dlist->next; } return shape_new; } gamgi_graph *gamgi_engine_copy_graph (gamgi_graph *graph) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_graph *graph_new; graph_new = gamgi_engine_create_graph (); static_start (GAMGI_CAST_OBJECT graph_new); gamgi_engine_copy_out_graph (graph, graph_new); graph_new->object.number = gamgi_engine_number_graph_get (); dlist = graph->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_graph (text_new, graph_new); dlist = dlist->next; } return graph_new; } gamgi_assembly *gamgi_engine_copy_assembly (gamgi_assembly *assembly) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; gamgi_atom *atom_new; gamgi_direction *direction_new; gamgi_plane *plane_new; gamgi_group *group_new; gamgi_molecule *molecule_new; gamgi_cluster *cluster_new; gamgi_cell *cell_new; gamgi_arrow *arrow_new; gamgi_shape *shape_new; gamgi_graph *graph_new; gamgi_assembly *assembly_new, *assembly_child; assembly_new = gamgi_engine_create_assembly (); static_start (GAMGI_CAST_OBJECT assembly_new); gamgi_engine_copy_out_assembly (assembly, assembly_new); assembly_new->object.number = gamgi_engine_number_assembly_get (); dlist = assembly->assembly_start; while (dlist != NULL) { assembly_child = gamgi_engine_copy_assembly (GAMGI_CAST_ASSEMBLY dlist->data); gamgi_engine_link_assembly_assembly (assembly_child, assembly_new); dlist = dlist->next; } dlist = assembly->graph_start; while (dlist != NULL) { graph_new = gamgi_engine_copy_graph (GAMGI_CAST_GRAPH dlist->data); gamgi_engine_link_graph_assembly (graph_new, assembly_new); dlist = dlist->next; } dlist = assembly->shape_start; while (dlist != NULL) { shape_new = gamgi_engine_copy_shape (GAMGI_CAST_SHAPE dlist->data); gamgi_engine_link_shape_assembly (shape_new, assembly_new); dlist = dlist->next; } dlist = assembly->arrow_start; while (dlist != NULL) { arrow_new = gamgi_engine_copy_arrow (GAMGI_CAST_ARROW dlist->data); gamgi_engine_link_arrow_assembly (arrow_new, assembly_new); dlist = dlist->next; } dlist = assembly->cell_start; while (dlist != NULL) { cell_new = gamgi_engine_copy_cell (GAMGI_CAST_CELL dlist->data); gamgi_engine_link_cell_assembly (cell_new, assembly_new); dlist = dlist->next; } dlist = assembly->cluster_start; while (dlist != NULL) { cluster_new = gamgi_engine_copy_cluster (GAMGI_CAST_CLUSTER dlist->data); gamgi_engine_link_cluster_assembly (cluster_new, assembly_new); dlist = dlist->next; } dlist = assembly->molecule_start; while (dlist != NULL) { molecule_new = gamgi_engine_copy_molecule (GAMGI_CAST_MOLECULE dlist->data); gamgi_engine_link_molecule_assembly (molecule_new, assembly_new); dlist = dlist->next; } dlist = assembly->group_start; while (dlist != NULL) { group_new = gamgi_engine_copy_group (GAMGI_CAST_GROUP dlist->data); gamgi_engine_link_group_assembly (group_new, assembly_new); dlist = dlist->next; } dlist = assembly->plane_start; while (dlist != NULL) { plane_new = gamgi_engine_copy_plane (GAMGI_CAST_PLANE dlist->data); gamgi_engine_link_plane_assembly (plane_new, assembly_new); dlist = dlist->next; } dlist = assembly->direction_start; while (dlist != NULL) { direction_new = gamgi_engine_copy_direction (GAMGI_CAST_DIRECTION dlist->data); gamgi_engine_link_direction_assembly (direction_new, assembly_new); dlist = dlist->next; } dlist = assembly->atom_start; while (dlist != NULL) { atom_new = gamgi_engine_copy_atom (GAMGI_CAST_ATOM dlist->data); gamgi_engine_link_atom_assembly (atom_new, assembly_new); dlist = dlist->next; } dlist = assembly->orbital_start; while (dlist != NULL) { orbital_new = gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL dlist->data); gamgi_engine_link_orbital_assembly (orbital_new, assembly_new); dlist = dlist->next; } dlist = assembly->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_assembly (text_new, assembly_new); dlist = dlist->next; } return assembly_new; } gamgi_light *gamgi_engine_copy_light (gamgi_light *light) { gamgi_light *light_new; light_new = gamgi_engine_create_light (); static_start (GAMGI_CAST_OBJECT light_new); gamgi_engine_copy_out_light (light, light_new); light_new->object.number = gamgi_engine_number_light_get (); return light_new; } gamgi_layer *gamgi_engine_copy_layer (gamgi_layer *layer) { gamgi_dlist *dlist; gamgi_text *text_new; gamgi_orbital *orbital_new; gamgi_atom *atom_new; gamgi_direction *direction_new; gamgi_plane *plane_new; gamgi_group *group_new; gamgi_molecule *molecule_new; gamgi_cluster *cluster_new; gamgi_cell *cell_new; gamgi_arrow *arrow_new; gamgi_shape *shape_new; gamgi_graph *graph_new; gamgi_assembly *assembly_new; gamgi_light *light_new; gamgi_layer *layer_new; layer_new = gamgi_engine_create_layer (); static_start (GAMGI_CAST_OBJECT layer_new); gamgi_engine_copy_out_layer (layer, layer_new); layer_new->object.number = gamgi_engine_number_layer_get (); dlist = layer->light_start; while (dlist != NULL) { light_new = gamgi_engine_copy_light (GAMGI_CAST_LIGHT dlist->data); gamgi_engine_link_light_layer (light_new, layer_new); dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { assembly_new = gamgi_engine_copy_assembly (GAMGI_CAST_ASSEMBLY dlist->data); gamgi_engine_link_assembly_layer (assembly_new, layer_new); dlist = dlist->next; } dlist = layer->graph_start; while (dlist != NULL) { graph_new = gamgi_engine_copy_graph (GAMGI_CAST_GRAPH dlist->data); gamgi_engine_link_graph_layer (graph_new, layer_new); dlist = dlist->next; } dlist = layer->shape_start; while (dlist != NULL) { shape_new = gamgi_engine_copy_shape (GAMGI_CAST_SHAPE dlist->data); gamgi_engine_link_shape_layer (shape_new, layer_new); dlist = dlist->next; } dlist = layer->arrow_start; while (dlist != NULL) { arrow_new = gamgi_engine_copy_arrow (GAMGI_CAST_ARROW dlist->data); gamgi_engine_link_arrow_layer (arrow_new, layer_new); dlist = dlist->next; } dlist = layer->cell_start; while (dlist != NULL) { cell_new = gamgi_engine_copy_cell (GAMGI_CAST_CELL dlist->data); gamgi_engine_link_cell_layer (cell_new, layer_new); dlist = dlist->next; } dlist = layer->cluster_start; while (dlist != NULL) { cluster_new = gamgi_engine_copy_cluster (GAMGI_CAST_CLUSTER dlist->data); gamgi_engine_link_cluster_layer (cluster_new, layer_new); dlist = dlist->next; } dlist = layer->molecule_start; while (dlist != NULL) { molecule_new = gamgi_engine_copy_molecule (GAMGI_CAST_MOLECULE dlist->data); gamgi_engine_link_molecule_layer (molecule_new, layer_new); dlist = dlist->next; } dlist = layer->group_start; while (dlist != NULL) { group_new = gamgi_engine_copy_group (GAMGI_CAST_GROUP dlist->data); gamgi_engine_link_group_layer (group_new, layer_new); dlist = dlist->next; } dlist = layer->plane_start; while (dlist != NULL) { plane_new = gamgi_engine_copy_plane (GAMGI_CAST_PLANE dlist->data); gamgi_engine_link_plane_layer (plane_new, layer_new); dlist = dlist->next; } dlist = layer->direction_start; while (dlist != NULL) { direction_new = gamgi_engine_copy_direction (GAMGI_CAST_DIRECTION dlist->data); gamgi_engine_link_direction_layer (direction_new, layer_new); dlist = dlist->next; } dlist = layer->atom_start; while (dlist != NULL) { atom_new = gamgi_engine_copy_atom (GAMGI_CAST_ATOM dlist->data); gamgi_engine_link_atom_layer (atom_new, layer_new); dlist = dlist->next; } dlist = layer->orbital_start; while (dlist != NULL) { orbital_new = gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL dlist->data); gamgi_engine_link_orbital_layer (orbital_new, layer_new); dlist = dlist->next; } dlist = layer->text_start; while (dlist != NULL) { text_new = gamgi_engine_copy_text (GAMGI_CAST_TEXT dlist->data); gamgi_engine_link_text_layer (text_new, layer_new); dlist = dlist->next; } return layer_new; } gamgi_window *gamgi_engine_copy_window (gamgi_window *window) { gamgi_dlist *dlist; gamgi_layer *layer; gamgi_layer *layer_new; gamgi_window *window_new; window_new = gamgi_engine_create_window (); static_start (GAMGI_CAST_OBJECT window_new); gamgi_engine_copy_out_window (window, window_new); window_new->object.number = gamgi_engine_number_window_get (); dlist = window->layer_start; while (dlist != NULL) { layer = GAMGI_CAST_LAYER dlist->data; layer_new = gamgi_engine_copy_layer (layer); gamgi_engine_link_layer_window (layer_new, window_new); if (window->layer == layer) window_new->layer = layer_new; dlist = dlist->next; } return window_new; } /*************** external function *********** * * * GAMGI_ENGINE_COPY_OBJECT * * * *********************************************/ gamgi_object *gamgi_engine_copy_object (gamgi_object *object) { gamgi_object *object_new; switch (object->class) { case GAMGI_ENGINE_TEXT: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_text (GAMGI_CAST_TEXT object); break; case GAMGI_ENGINE_ORBITAL: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_orbital (GAMGI_CAST_ORBITAL object); break; case GAMGI_ENGINE_BOND: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_bond (GAMGI_CAST_BOND object); break; case GAMGI_ENGINE_ATOM: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_atom (GAMGI_CAST_ATOM object); break; case GAMGI_ENGINE_DIRECTION: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_direction (GAMGI_CAST_DIRECTION object); break; case GAMGI_ENGINE_PLANE: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_plane (GAMGI_CAST_PLANE object); break; case GAMGI_ENGINE_GROUP: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_group (GAMGI_CAST_GROUP object); break; case GAMGI_ENGINE_MOLECULE: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_molecule (GAMGI_CAST_MOLECULE object); break; case GAMGI_ENGINE_CLUSTER: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_cluster (GAMGI_CAST_CLUSTER object); break; case GAMGI_ENGINE_CELL: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_cell (GAMGI_CAST_CELL object); break; case GAMGI_ENGINE_ARROW: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_arrow (GAMGI_CAST_ARROW object); break; case GAMGI_ENGINE_SHAPE: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_shape (GAMGI_CAST_SHAPE object); break; case GAMGI_ENGINE_GRAPH: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_graph (GAMGI_CAST_GRAPH object); break; case GAMGI_ENGINE_ASSEMBLY: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_assembly (GAMGI_CAST_ASSEMBLY object); break; case GAMGI_ENGINE_LIGHT: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_light (GAMGI_CAST_LIGHT object); break; case GAMGI_ENGINE_LAYER: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_layer (GAMGI_CAST_LAYER object); break; case GAMGI_ENGINE_WINDOW: object_new = GAMGI_CAST_OBJECT gamgi_engine_copy_window (GAMGI_CAST_WINDOW object); break; default: object_new = NULL; } return object_new; } gamgi-0.17.5/src/engine/gamgi_engine_copy.h000066400000000000000000000031611433127522700205470ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_copy.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * internal functions * ********************** static void static_start (gamgi_object *object); ********************** * external functions * **********************/ gamgi_text *gamgi_engine_copy_text (gamgi_text *text); gamgi_orbital *gamgi_engine_copy_orbital (gamgi_orbital *orbital); gamgi_bond *gamgi_engine_copy_bond (gamgi_bond *bond); gamgi_atom *gamgi_engine_copy_atom (gamgi_atom *atom); gamgi_direction *gamgi_engine_copy_direction (gamgi_direction *direction); gamgi_plane *gamgi_engine_copy_plane (gamgi_plane *plane); gamgi_group *gamgi_engine_copy_group (gamgi_group *group); gamgi_molecule *gamgi_engine_copy_molecule (gamgi_molecule *molecule); gamgi_cluster *gamgi_engine_copy_cluster (gamgi_cluster *cluster); gamgi_cell *gamgi_engine_copy_cell (gamgi_cell *cell); gamgi_arrow *gamgi_engine_copy_arrow (gamgi_arrow *arrow); gamgi_shape *gamgi_engine_copy_shape (gamgi_shape *shape); gamgi_graph *gamgi_engine_copy_graph (gamgi_graph *graph); gamgi_assembly *gamgi_engine_copy_assembly (gamgi_assembly *assembly); gamgi_light *gamgi_engine_copy_light (gamgi_light *light); gamgi_layer *gamgi_engine_copy_layer (gamgi_layer *layer); gamgi_window *gamgi_engine_copy_window (gamgi_window *window); gamgi_object *gamgi_engine_copy_object (gamgi_object *object); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_copy_out.c000066400000000000000000000550641433127522700214420ustar00rootroot00000000000000/********************************************* * * $GAMGI/src/engine/gamgi_engine_copy_out.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_mesa.h" #include "gamgi_io.h" #include "gamgi_math_vector.h" #include "gamgi_math_matrix.h" #include "gamgi_mesa_text.h" static void static_copy (gamgi_object *object, gamgi_object *object_new) { strcpy (object_new->name, object->name); strcpy (object_new->label, object->label); object_new->class = object->class; object_new->scale = object->scale; } void gamgi_engine_copy_out_text (gamgi_text *text, gamgi_text *text_new) { static_copy (GAMGI_CAST_OBJECT text, GAMGI_CAST_OBJECT text_new); text_new->draw = text->draw; text_new->mark = text->mark; /********************************** * safe programming: text->string * * should never be NULL here * **********************************/ if (text->string != NULL) { text_new->string = (char *) malloc ((text->length + 1) * sizeof (char)); strcpy (text_new->string, text->string); } text_new->length = text->length; text_new->style = text->style; text_new->font = text->font; gamgi_mesa_text_font_increase (text_new, NULL); /**************************** * position and orientation * ****************************/ text_new->origin[0] = text->origin[0]; text_new->origin[1] = text->origin[1]; text_new->origin[2] = text->origin[2]; text_new->center[0] = text->center[0]; text_new->center[1] = text->center[1]; text_new->center[2] = text->center[2]; text_new->quaternion[0] = text->quaternion[0]; text_new->quaternion[1] = text->quaternion[1]; text_new->quaternion[2] = text->quaternion[2]; text_new->quaternion[3] = text->quaternion[3]; /************* * view data * *************/ text_new->red = text->red; text_new->green = text->green; text_new->blue = text->blue; } void gamgi_engine_copy_out_orbital (gamgi_orbital *orbital, gamgi_orbital *orbital_new) { int i; static_copy (GAMGI_CAST_OBJECT orbital, GAMGI_CAST_OBJECT orbital_new); orbital_new->draw = orbital->draw; orbital_new->n = orbital->n; orbital_new->l = orbital->l; orbital_new->m = orbital->m; orbital_new->charge = orbital->charge; orbital_new->style = orbital->style; orbital_new->radius = orbital->radius; orbital_new->density = orbital->density; orbital_new->sampling = orbital->sampling; orbital_new->seed = orbital->seed; orbital_new->phase = orbital->phase; orbital_new->frame = orbital->frame; for (i = 0; i < 8; i++) orbital_new->octants[i] = orbital->octants[i]; orbital_new->axes = orbital->axes; /****************************** * copy arrays: points, lines * ******************************/ orbital_new->dots[0] = orbital->dots[0]; orbital_new->dots[1] = orbital->dots[1]; orbital_new->dots[2] = orbital->dots[2]; orbital_new->points = NULL; i = 3 * orbital->n_points; if (i != 0) orbital_new->points = (double *) malloc (sizeof (double) * i); while (i-- > 0) orbital_new->points[i] = orbital->points[i]; orbital_new->lines = NULL; i = orbital->n_lines; if (i != 0) orbital_new->lines = (int *) malloc (sizeof (int) * i); while (i-- > 0) orbital_new->lines[i] = orbital->lines[i]; orbital_new->n_points = orbital->n_points; orbital_new->n_lines = orbital->n_lines; /************************************** * copy position and orientation data * **************************************/ orbital_new->origin[0] = orbital->origin[0]; orbital_new->origin[1] = orbital->origin[1]; orbital_new->origin[2] = orbital->origin[2]; orbital_new->center[0] = orbital->center[0]; orbital_new->center[1] = orbital->center[1]; orbital_new->center[2] = orbital->center[2]; orbital_new->quaternion[0] = orbital->quaternion[0]; orbital_new->quaternion[1] = orbital->quaternion[1]; orbital_new->quaternion[2] = orbital->quaternion[2]; orbital_new->quaternion[3] = orbital->quaternion[3]; /************************** * copy color information * **************************/ orbital_new->base_r = orbital->base_r; orbital_new->base_g = orbital->base_g; orbital_new->base_b = orbital->base_b; orbital_new->phase_r = orbital->phase_r; orbital_new->phase_g = orbital->phase_g; orbital_new->phase_b = orbital->phase_b; orbital_new->frame_r = orbital->frame_r; orbital_new->frame_g = orbital->frame_g; orbital_new->frame_b = orbital->frame_b; } void gamgi_engine_copy_out_bond (gamgi_bond *bond, gamgi_bond *bond_new) { /************* * copy data * *************/ static_copy (GAMGI_CAST_OBJECT bond, GAMGI_CAST_OBJECT bond_new); bond_new->draw = bond->draw; bond_new->size = bond->size; bond_new->color = bond->color; bond_new->red = bond->red; bond_new->green = bond->green; bond_new->blue = bond->blue; bond_new->order = bond->order; bond_new->covalency = bond->covalency; /************** * start data * **************/ bond_new->first = TRUE; bond_new->copy = NULL; bond_new->atom1 = NULL; bond_new->atom2 = NULL; bond_new->dlist1 = NULL; bond_new->dlist2 = NULL; } void gamgi_engine_copy_out_atom (gamgi_atom *atom, gamgi_atom *atom_new) { static_copy (GAMGI_CAST_OBJECT atom, GAMGI_CAST_OBJECT atom_new); atom_new->draw = atom->draw; atom_new->mark = atom->mark; atom_new->element = atom->element; atom_new->mass = atom->mass; atom_new->radius = atom->radius; atom_new->charge = atom->charge; atom_new->temperature = atom->temperature; atom_new->occupancy = atom->occupancy; atom_new->position[0] = atom->position[0]; atom_new->position[1] = atom->position[1]; atom_new->position[2] = atom->position[2]; /************* * view data * *************/ atom_new->size = atom->size; atom_new->variancy = atom->variancy; atom_new->red = atom->red; atom_new->green = atom->green; atom_new->blue = atom->blue; } void gamgi_engine_copy_out_direction (gamgi_direction *direction, gamgi_direction *direction_new) { int i; static_copy (GAMGI_CAST_OBJECT direction, GAMGI_CAST_OBJECT direction_new); direction_new->net = direction->net; direction_new->draw = direction->draw; direction_new->reference = direction->reference; direction_new->model = direction->model; /***************************** * copy description: indices * *****************************/ direction_new->uvw[0] = direction->uvw[0]; direction_new->uvw[1] = direction->uvw[1]; direction_new->uvw[2] = direction->uvw[2]; direction_new->vectors = direction->vectors; direction_new->node[0] = direction->node[0]; direction_new->node[1] = direction->node[1]; direction_new->node[2] = direction->node[2]; direction_new->node[3] = direction->node[3]; /************************************** * copy position and orientation data * **************************************/ direction_new->origin[0] = direction->origin[0]; direction_new->origin[1] = direction->origin[1]; direction_new->origin[2] = direction->origin[2]; direction_new->center[0] = direction->center[0]; direction_new->center[1] = direction->center[1]; direction_new->center[2] = direction->center[2]; direction_new->quaternion[0] = direction->quaternion[0]; direction_new->quaternion[1] = direction->quaternion[1]; direction_new->quaternion[2] = direction->quaternion[2]; direction_new->quaternion[3] = direction->quaternion[3]; /****************************** * copy arrays: points, loops * ******************************/ direction_new->points = NULL; i = 3 * direction->n_points; if (i != 0) direction_new->points = (double *) malloc (sizeof (double) * i); while (i-- > 0) direction_new->points[i] = direction->points[i]; direction_new->loops = NULL; i = direction->n_loops; if (i != 0) direction_new->loops = (int *) malloc (sizeof (int) * i); while (i-- > 0) direction_new->loops[i] = direction->loops[i]; direction_new->n_points = direction->n_points; direction_new->n_loops = direction->n_loops; /***************************** * copy visualization: color * *****************************/ direction_new->red = direction->red; direction_new->green = direction->green; direction_new->blue = direction->blue; } void gamgi_engine_copy_out_plane (gamgi_plane *plane, gamgi_plane *plane_new) { int i; static_copy (GAMGI_CAST_OBJECT plane, GAMGI_CAST_OBJECT plane_new); plane_new->net = plane->net; plane_new->draw = plane->draw; plane_new->reference = plane->reference; plane_new->model = plane->model; /***************************** * copy description: indices * *****************************/ plane_new->hkl[0] = plane->hkl[0]; plane_new->hkl[1] = plane->hkl[1]; plane_new->hkl[2] = plane->hkl[2]; plane_new->vectors = plane->vectors; plane_new->order = plane->order; /************************************** * copy position and orientation data * **************************************/ plane_new->origin[0] = plane->origin[0]; plane_new->origin[1] = plane->origin[1]; plane_new->origin[2] = plane->origin[2]; plane_new->center[0] = plane->center[0]; plane_new->center[1] = plane->center[1]; plane_new->center[2] = plane->center[2]; plane_new->quaternion[0] = plane->quaternion[0]; plane_new->quaternion[1] = plane->quaternion[1]; plane_new->quaternion[2] = plane->quaternion[2]; plane_new->quaternion[3] = plane->quaternion[3]; /******************************************** * copy visualization arrays: points, loops * ********************************************/ plane_new->points = NULL; i = 3 * plane->n_points; if (i != 0) plane_new->points = (double *) malloc (sizeof (double) * i); while (i-- > 0) plane_new->points[i] = plane->points[i]; plane_new->loops = NULL; i = plane->n_loops; if (i != 0) plane_new->loops = (int *) malloc (sizeof (int) * i); while (i-- > 0) plane_new->loops[i] = plane->loops[i]; plane_new->n_points = plane->n_points; plane_new->n_loops = plane->n_loops; /************** * copy color * **************/ plane_new->red = plane->red; plane_new->green = plane->green; plane_new->blue = plane->blue; } void gamgi_engine_copy_out_group (gamgi_group *group, gamgi_group *group_new) { int i; static_copy (GAMGI_CAST_OBJECT group, GAMGI_CAST_OBJECT group_new); group_new->draw = group->draw; group_new->reference = group->reference; group_new->mark = group->mark; /************************************** * copy position and orientation data * **************************************/ group_new->origin[0] = group->origin[0]; group_new->origin[1] = group->origin[1]; group_new->origin[2] = group->origin[2]; group_new->center[0] = group->center[0]; group_new->center[1] = group->center[1]; group_new->center[2] = group->center[2]; group_new->quaternion[0] = group->quaternion[0]; group_new->quaternion[1] = group->quaternion[1]; group_new->quaternion[2] = group->quaternion[2]; group_new->quaternion[3] = group->quaternion[3]; /****************************** * copy arrays: points, loops * ******************************/ group_new->points = NULL; i = 3 * group->n_points; if (i > 0) group_new->points = (double *) malloc (sizeof (double) * i); while (i-- > 0) group_new->points[i] = group->points[i]; group_new->loops = NULL; i = group->n_loops; if (i > 0) group_new->loops = (int *) malloc (sizeof (int) * i); while (i-- > 0) group_new->loops[i] = group->loops[i]; /******************************** * copy number of points, loops * ********************************/ group_new->n_points = group->n_points; group_new->n_loops = group->n_loops; /****************** * copy view data * ******************/ group_new->faces = group->faces; group_new->red = group->red; group_new->green = group->green; group_new->blue = group->blue; } void gamgi_engine_copy_out_molecule (gamgi_molecule *molecule, gamgi_molecule *molecule_new) { static_copy (GAMGI_CAST_OBJECT molecule, GAMGI_CAST_OBJECT molecule_new); molecule_new->draw = molecule->draw; /************************************** * copy position and orientation data * **************************************/ molecule_new->origin[0] = molecule->origin[0]; molecule_new->origin[1] = molecule->origin[1]; molecule_new->origin[2] = molecule->origin[2]; molecule_new->center[0] = molecule->center[0]; molecule_new->center[1] = molecule->center[1]; molecule_new->center[2] = molecule->center[2]; molecule_new->quaternion[0] = molecule->quaternion[0]; molecule_new->quaternion[1] = molecule->quaternion[1]; molecule_new->quaternion[2] = molecule->quaternion[2]; molecule_new->quaternion[3] = molecule->quaternion[3]; } void gamgi_engine_copy_out_cluster (gamgi_cluster *cluster, gamgi_cluster *cluster_new) { int i; static_copy (GAMGI_CAST_OBJECT cluster, GAMGI_CAST_OBJECT cluster_new); cluster_new->reference = cluster->reference; cluster_new->mark = cluster->mark; /************************************** * copy position and orientation data * **************************************/ cluster_new->origin[0] = cluster->origin[0]; cluster_new->origin[1] = cluster->origin[1]; cluster_new->origin[2] = cluster->origin[2]; cluster_new->center[0] = cluster->center[0]; cluster_new->center[1] = cluster->center[1]; cluster_new->center[2] = cluster->center[2]; cluster_new->quaternion[0] = cluster->quaternion[0]; cluster_new->quaternion[1] = cluster->quaternion[1]; cluster_new->quaternion[2] = cluster->quaternion[2]; cluster_new->quaternion[3] = cluster->quaternion[3]; /********************************************** * copy arrays: points, loops, colors, paints * **********************************************/ cluster_new->points = NULL; i = 3 * cluster->n_points; if (i > 0) cluster_new->points = (double *) malloc (sizeof (double) * i); while (i-- > 0) cluster_new->points[i] = cluster->points[i]; cluster_new->loops = NULL; i = cluster->n_loops; if (i > 0) cluster_new->loops = (int *) malloc (sizeof (int) * i); while (i-- > 0) cluster_new->loops[i] = cluster->loops[i]; cluster_new->colors = NULL; i = 3 * cluster->n_colors; if (i > 0) cluster_new->colors = (float *) malloc (sizeof (float) * i); while (i-- > 0) cluster_new->colors[i] = cluster->colors[i]; cluster_new->paints = NULL; i = cluster->n_paints; if (i > 0) cluster_new->paints = (int *) malloc (sizeof (int) * i); while (i-- > 0) cluster_new->paints[i] = cluster->paints[i]; /********************************************************** * copy number of points, loops, colors, paints and seeds * **********************************************************/ cluster_new->n_points = cluster->n_points; cluster_new->n_loops = cluster->n_loops; cluster_new->n_colors = cluster->n_colors; cluster_new->n_paints = cluster->n_paints; cluster_new->atoms = cluster->atoms; /************* * View data * *************/ cluster_new->faces = cluster->faces; } void gamgi_engine_copy_out_cell (gamgi_cell *cell, gamgi_cell *cell_new) { int i; static_copy (GAMGI_CAST_OBJECT cell, GAMGI_CAST_OBJECT cell_new); /****************************** * copy crystallographic data * ******************************/ cell_new->lattice = cell->lattice; cell_new->group = cell->group; cell_new->reciprocal = cell->reciprocal; cell_new->a = cell->a; cell_new->b = cell->b; cell_new->c = cell->c; cell_new->ab = cell->ab; cell_new->ac = cell->ac; cell_new->bc = cell->bc; /******************************************* * copy conventional and primitive vectors * *******************************************/ gamgi_math_vector_copy (cell->a1, cell_new->a1); gamgi_math_vector_copy (cell->a2, cell_new->a2); gamgi_math_vector_copy (cell->a3, cell_new->a3); gamgi_math_vector_copy (cell->p1, cell_new->p1); gamgi_math_vector_copy (cell->p2, cell_new->p2); gamgi_math_vector_copy (cell->p3, cell_new->p3); /************************************** * copy position and orientation data * **************************************/ cell_new->origin[0] = cell->origin[0]; cell_new->origin[1] = cell->origin[1]; cell_new->origin[2] = cell->origin[2]; cell_new->center[0] = cell->center[0]; cell_new->center[1] = cell->center[1]; cell_new->center[2] = cell->center[2]; cell_new->quaternion[0] = cell->quaternion[0]; cell_new->quaternion[1] = cell->quaternion[1]; cell_new->quaternion[2] = cell->quaternion[2]; cell_new->quaternion[3] = cell->quaternion[3]; /************************************* * copy arrays: points, loops, lines * *************************************/ cell_new->points = NULL; i = 3 * cell->n_points; if (i != 0) cell_new->points = (double *) malloc (sizeof (double) * i); while (i-- > 0) cell_new->points[i] = cell->points[i]; cell_new->loops = NULL; i = cell->n_loops; if (i != 0) cell_new->loops = (int *) malloc (sizeof (int) * i); while (i-- > 0) cell_new->loops[i] = cell->loops[i]; cell_new->lines = NULL; i = cell->n_lines; if (i != 0) cell_new->lines = (int *) malloc (sizeof (int) * i); while (i-- > 0) cell_new->lines[i] = cell->lines[i]; /************************************************* * copy number of points, loops, lines and nodes * *************************************************/ cell_new->n_points = cell->n_points; cell_new->n_loops = cell->n_loops; cell_new->n_lines = cell->n_lines; cell_new->n_nodes = cell->n_nodes; /******************************************************** * copy volume data: number of cells, volume parameters * ********************************************************/ cell_new->model = cell->model; cell_new->n1 = cell->n1; cell_new->n2 = cell->n2; cell_new->n3 = cell->n3; cell_new->v1 = cell->v1; cell_new->v2 = cell->v2; cell_new->v3 = cell->v3; cell_new->v12 = cell->v12; cell_new->v13 = cell->v13; cell_new->v23 = cell->v23; /******************** * copy origin data * ********************/ cell_new->o1 = cell->o1; cell_new->o2 = cell->o2; cell_new->o3 = cell->o3; cell_new->origin_vectors = cell->origin_vectors; /****************** * copy axes data * ******************/ cell_new->axes = cell->axes; cell_new->axes_vectors = cell->axes_vectors; /************************************************ * copy enumerations and booleans, regarding * * the type of lattice, group, volume, borders, * * and whether faces and nodes are visible. * ************************************************/ cell_new->borders = cell->borders; cell_new->faces = cell->faces; cell_new->nodes = cell->nodes; /************************** * copy color information * **************************/ cell_new->red = cell->red; cell_new->green = cell->green; cell_new->blue = cell->blue; } void gamgi_engine_copy_out_arrow (gamgi_arrow *arrow, gamgi_arrow *arrow_new) { static_copy (GAMGI_CAST_OBJECT arrow, GAMGI_CAST_OBJECT arrow_new); arrow_new->draw = arrow->draw; } void gamgi_engine_copy_out_shape (gamgi_shape *shape, gamgi_shape *shape_new) { static_copy (GAMGI_CAST_OBJECT shape, GAMGI_CAST_OBJECT shape_new); shape_new->draw = shape->draw; } void gamgi_engine_copy_out_graph (gamgi_graph *graph, gamgi_graph *graph_new) { static_copy (GAMGI_CAST_OBJECT graph, GAMGI_CAST_OBJECT graph_new); graph_new->draw = graph->draw; } void gamgi_engine_copy_out_assembly (gamgi_assembly *assembly, gamgi_assembly *assembly_new) { static_copy (GAMGI_CAST_OBJECT assembly, GAMGI_CAST_OBJECT assembly_new); assembly_new->draw = assembly->draw; assembly_new->mark = assembly->mark; /************************************** * copy position and orientation data * **************************************/ assembly_new->origin[0] = assembly->origin[0]; assembly_new->origin[1] = assembly->origin[1]; assembly_new->origin[2] = assembly->origin[2]; assembly_new->center[0] = assembly->center[0]; assembly_new->center[1] = assembly->center[1]; assembly_new->center[2] = assembly->center[2]; assembly_new->quaternion[0] = assembly->quaternion[0]; assembly_new->quaternion[1] = assembly->quaternion[1]; assembly_new->quaternion[2] = assembly->quaternion[2]; assembly_new->quaternion[3] = assembly->quaternion[3]; } void gamgi_engine_copy_out_light (gamgi_light *light, gamgi_light *light_new) { static_copy (GAMGI_CAST_OBJECT light, GAMGI_CAST_OBJECT light_new); light_new->draw = light->draw; light_new->ambient [0] = light->ambient [0]; light_new->ambient [1] = light->ambient [1]; light_new->ambient [2] = light->ambient [2]; light_new->ambient [3] = light->ambient [3]; light_new->diffuse [0] = light->diffuse [0]; light_new->diffuse [1] = light->diffuse [1]; light_new->diffuse [2] = light->diffuse [2]; light_new->diffuse [3] = light->diffuse [3]; light_new->specular [0] = light->specular [0]; light_new->specular [1] = light->specular [1]; light_new->specular [2] = light->specular [2]; light_new->specular [3] = light->specular [3]; light_new->position[0] = light->position[0]; light_new->position[1] = light->position[1]; light_new->position[2] = light->position[2]; light_new->position[3] = light->position[3]; light_new->direction[0] = light->direction[0]; light_new->direction[1] = light->direction[1]; light_new->direction[2] = light->direction[2]; light_new->constant = light->constant; light_new->linear = light->linear; light_new->quadratic = light->quadratic; light_new->angle = light->angle; light_new->radial = light->radial; } void gamgi_engine_copy_out_layer (gamgi_layer *layer, gamgi_layer *layer_new) { static_copy (GAMGI_CAST_OBJECT layer, GAMGI_CAST_OBJECT layer_new); layer_new->draw = layer->draw; layer_new->perspective = layer->perspective; layer_new->top = layer->top; layer_new->near = layer->near; layer_new->far = layer->far; gamgi_math_vector_copy (layer->eye, layer_new->eye); gamgi_math_vector_copy (layer->center, layer_new->center); gamgi_math_vector_copy (layer->up, layer_new->up); gamgi_math_matrix_copy (layer->referential, layer_new->referential); layer_new->visibility_in = layer->visibility_in; layer_new->visibility_out = layer->visibility_out; layer_new->axes = layer->axes; layer_new->light = layer->light; layer_new->color[0] = layer->color[0]; layer_new->color[1] = layer->color[1]; layer_new->color[2] = layer->color[2]; layer_new->color[3] = layer->color[3]; } void gamgi_engine_copy_out_window (gamgi_window *window, gamgi_window *window_new) { /************* * copy data * *************/ static_copy (GAMGI_CAST_OBJECT window, GAMGI_CAST_OBJECT window_new); window_new->draw = window->draw; window_new->origin_x = window->origin_x; window_new->origin_y = window->origin_y; window_new->width = window->width; window_new->height = window->height; window_new->top = window->top; window_new->medium = window->medium; window_new->bottom = window->bottom; window_new->top_flag = window->top_flag; window_new->medium_flag = window->medium_flag; window_new->bottom_flag = window->bottom_flag; /************** * start data * **************/ window_new->window = NULL; window_new->dialog0 = NULL; window_new->dialog1 = NULL; window_new->help = NULL; window_new->area = NULL; window_new->history = NULL; window_new->layer = NULL; window_new->focus = NULL; window_new->action = FALSE; window_new->mode = FALSE; window_new->axes = FALSE; window_new->class = FALSE; window_new->top_flag = TRUE; window_new->medium_flag = TRUE; window_new->bottom_flag = TRUE; window_new->timer_focus = 0; window_new->timer_layer = 0; window_new->timer_message = 0; window_new->timer_progress = 0; window_new->axis = FALSE; window_new->total = 0.0; window_new->demo_flag = 0; } gamgi-0.17.5/src/engine/gamgi_engine_copy_out.h000066400000000000000000000036571433127522700214500ustar00rootroot00000000000000/********************************************* * * $GAMGI/src/engine/gamgi_engine_copy_out.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * internal functions * ********************** static void static_copy (gamgi_object *object, gamgi_object *object_new); ********************** * external functions * **********************/ void gamgi_engine_copy_out_text (gamgi_text *text, gamgi_text *text_new); void gamgi_engine_copy_out_orbital (gamgi_orbital *orbital, gamgi_orbital *orbital_new); void gamgi_engine_copy_out_bond (gamgi_bond *bond, gamgi_bond *bond_new); void gamgi_engine_copy_out_atom (gamgi_atom *atom, gamgi_atom *atom_new); void gamgi_engine_copy_out_direction (gamgi_direction *direction, gamgi_direction *direction_new); void gamgi_engine_copy_out_plane (gamgi_plane *plane, gamgi_plane *plane_new); void gamgi_engine_copy_out_group (gamgi_group *group, gamgi_group *group_new); void gamgi_engine_copy_out_molecule (gamgi_molecule *molecule, gamgi_molecule *molecule_new); void gamgi_engine_copy_out_cluster (gamgi_cluster *cluster, gamgi_cluster *cluster_new); void gamgi_engine_copy_out_cell (gamgi_cell *cell, gamgi_cell *cell_new); void gamgi_engine_copy_out_arrow (gamgi_arrow *arrow, gamgi_arrow *arrow_new); void gamgi_engine_copy_out_shape (gamgi_shape *shape, gamgi_shape *shape_new); void gamgi_engine_copy_out_graph (gamgi_graph *graph, gamgi_graph *graph_new); void gamgi_engine_copy_out_assembly (gamgi_assembly *assembly, gamgi_assembly *assembly_new); void gamgi_engine_copy_out_light (gamgi_light *light, gamgi_light *light_new); void gamgi_engine_copy_out_layer (gamgi_layer *layer, gamgi_layer *layer_new); void gamgi_engine_copy_out_window (gamgi_window *window, gamgi_window *window_new); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_count.c000066400000000000000000000474631433127522700207350ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_count.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_global.h" void gamgi_engine_count_text (gamgi_text *text, int class, int *number) { gamgi_dlist *dlist; /* count text */ dlist = text->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_TEXT) *number += 1; } void gamgi_engine_count_orbital (gamgi_orbital *orbital, int class, int *number) { gamgi_dlist *dlist; if (class == GAMGI_ENGINE_ORBITAL) { *number += 1; return; } /* count text */ dlist = orbital->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_bond (gamgi_bond *bond, int class, int *number) { gamgi_dlist *dlist; /* in case second link does not exist */ if (bond->atom2 == NULL) return; /* first scan */ if (bond->first == TRUE) bond->first = FALSE; /* second scan */ else { bond->first = TRUE; if (class == GAMGI_ENGINE_BOND) { *number += 1; return; } /* draw orbital list */ dlist = bond->orbital_start; while (dlist != NULL) { gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL dlist->data, class, number); dlist = dlist->next; } /* draw text list */ dlist = bond->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } } void gamgi_engine_count_atom (gamgi_atom *atom, int class, int *number) { gamgi_dlist *dlist; if (class == GAMGI_ENGINE_ATOM) { *number += 1; return; } /* count bond */ dlist = atom->bond_start; while (dlist != NULL) { gamgi_engine_count_bond (GAMGI_CAST_BOND dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_BOND) return; /* count orbital */ dlist = atom->orbital_start; while (dlist != NULL) { gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ORBITAL) return; /* count text */ dlist = atom->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_direction (gamgi_direction *direction, int class, int *number) { gamgi_dlist *dlist; if (class == GAMGI_ENGINE_DIRECTION) { *number += 1; return; } /* count atom */ dlist = direction->atom_start; while (dlist != NULL) { gamgi_engine_count_atom (GAMGI_CAST_ATOM dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ATOM) return; /* count orbital */ dlist = direction->orbital_start; while (dlist != NULL) { gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ORBITAL) return; /* count text */ dlist = direction->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_plane (gamgi_plane *plane, int class, int *number) { gamgi_dlist *dlist; if (class == GAMGI_ENGINE_PLANE) { *number += 1; return; } if (class == GAMGI_ENGINE_PLANE) return; /* count direction */ dlist = plane->direction_start; while (dlist != NULL) { gamgi_engine_count_direction (GAMGI_CAST_DIRECTION dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_DIRECTION) return; /* count atom */ dlist = plane->atom_start; while (dlist != NULL) { gamgi_engine_count_atom (GAMGI_CAST_ATOM dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ATOM) return; /* count orbital */ dlist = plane->orbital_start; while (dlist != NULL) { gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ORBITAL) return; /* count text */ dlist = plane->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_group (gamgi_group *group, int class, int *number) { gamgi_dlist *dlist; /* count group */ dlist = group->group_start; while (dlist != NULL) { gamgi_engine_count_group (GAMGI_CAST_GROUP dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_GROUP) { *number += 1; return; } /* count plane */ dlist = group->plane_start; while (dlist != NULL) { gamgi_engine_count_plane (GAMGI_CAST_PLANE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_PLANE) return; /* count direction */ dlist = group->direction_start; while (dlist != NULL) { gamgi_engine_count_direction (GAMGI_CAST_DIRECTION dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_DIRECTION) return; /* count atom */ dlist = group->atom_start; while (dlist != NULL) { gamgi_engine_count_atom (GAMGI_CAST_ATOM dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ATOM) return; /* count orbital */ dlist = group->orbital_start; while (dlist != NULL) { gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ORBITAL) return; /* count text */ dlist = group->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_molecule (gamgi_molecule *molecule, int class, int *number) { gamgi_dlist *dlist; if (class == GAMGI_ENGINE_MOLECULE) { *number += 1; return; } /* count group */ dlist = molecule->group_start; while (dlist != NULL) { gamgi_engine_count_group (GAMGI_CAST_GROUP dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_GROUP) return; /* count plane */ dlist = molecule->plane_start; while (dlist != NULL) { gamgi_engine_count_plane (GAMGI_CAST_PLANE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_PLANE) return; /* count direction */ dlist = molecule->direction_start; while (dlist != NULL) { gamgi_engine_count_direction (GAMGI_CAST_DIRECTION dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_DIRECTION) return; /* count atom */ dlist = molecule->atom_start; while (dlist != NULL) { gamgi_engine_count_atom (GAMGI_CAST_ATOM dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ATOM) return; /* count orbital */ dlist = molecule->orbital_start; while (dlist != NULL) { gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ORBITAL) return; /* count text */ dlist = molecule->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_cluster (gamgi_cluster *cluster, int class, int *number) { gamgi_dlist *dlist; /* count cluster */ dlist = cluster->cluster_start; while (dlist != NULL) { gamgi_engine_count_cluster (GAMGI_CAST_CLUSTER dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_CLUSTER) { *number += 1; return; } /* count molecule */ dlist = cluster->molecule_start; while (dlist != NULL) { gamgi_engine_count_molecule (GAMGI_CAST_MOLECULE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_MOLECULE) return; /* count group */ dlist = cluster->group_start; while (dlist != NULL) { gamgi_engine_count_group (GAMGI_CAST_GROUP dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_GROUP) return; /* count plane */ dlist = cluster->plane_start; while (dlist != NULL) { gamgi_engine_count_plane (GAMGI_CAST_PLANE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_PLANE) return; /* count direction */ dlist = cluster->direction_start; while (dlist != NULL) { gamgi_engine_count_direction (GAMGI_CAST_DIRECTION dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_DIRECTION) return; /* count atom */ dlist = cluster->atom_start; while (dlist != NULL) { gamgi_engine_count_atom (GAMGI_CAST_ATOM dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ATOM) return; /* count orbital */ dlist = cluster->orbital_start; while (dlist != NULL) { gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ORBITAL) return; /* count text */ dlist = cluster->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_cell (gamgi_cell *cell, int class, int *number) { gamgi_dlist *dlist; if (class == GAMGI_ENGINE_CELL) { *number += 1; return; } /* count cluster */ dlist = cell->cluster_start; while (dlist != NULL) { gamgi_engine_count_cluster (GAMGI_CAST_CLUSTER dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_CLUSTER) return; /* count molecule */ dlist = cell->molecule_start; while (dlist != NULL) { gamgi_engine_count_molecule (GAMGI_CAST_MOLECULE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_MOLECULE) return; /* count group */ dlist = cell->group_start; while (dlist != NULL) { gamgi_engine_count_group (GAMGI_CAST_GROUP dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_GROUP) return; /* count plane */ dlist = cell->plane_start; while (dlist != NULL) { gamgi_engine_count_plane (GAMGI_CAST_PLANE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_PLANE) return; /* count direction */ dlist = cell->direction_start; while (dlist != NULL) { gamgi_engine_count_direction (GAMGI_CAST_DIRECTION dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_DIRECTION) return; /* count atom */ dlist = cell->atom_start; while (dlist != NULL) { gamgi_engine_count_atom (GAMGI_CAST_ATOM dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ATOM) return; /* count orbital */ dlist = cell->orbital_start; while (dlist != NULL) { gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ORBITAL) return; /* count text */ dlist = cell->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_arrow (gamgi_arrow *arrow, int class, int *number) { gamgi_dlist *dlist; if (class == GAMGI_ENGINE_ARROW) { *number += 1; return; } /* count text */ dlist = arrow->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_shape (gamgi_shape *shape, int class, int *number) { gamgi_dlist *dlist; if (class == GAMGI_ENGINE_SHAPE) { *number += 1; return; } /* count text */ dlist = shape->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_graph (gamgi_graph *graph, int class, int *number) { gamgi_dlist *dlist; if (class == GAMGI_ENGINE_GRAPH) { *number += 1; return; } /* count text */ dlist = graph->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_assembly (gamgi_assembly *assembly, int class, int *number) { gamgi_dlist *dlist; /* count assembly */ dlist = assembly->assembly_start; while (dlist != NULL) { gamgi_engine_count_assembly (GAMGI_CAST_ASSEMBLY dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ASSEMBLY) { *number += 1; return; } /* count graph */ dlist = assembly->graph_start; while (dlist != NULL) { gamgi_engine_count_graph (GAMGI_CAST_GRAPH dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_GRAPH) return; /* count shape */ dlist = assembly->shape_start; while (dlist != NULL) { gamgi_engine_count_shape (GAMGI_CAST_SHAPE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_SHAPE) return; /* count arrow */ dlist = assembly->arrow_start; while (dlist != NULL) { gamgi_engine_count_arrow (GAMGI_CAST_ARROW dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ARROW) return; /* count cell */ dlist = assembly->cell_start; while (dlist != NULL) { gamgi_engine_count_cell (GAMGI_CAST_CELL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_CELL) return; /* count cluster */ dlist = assembly->cluster_start; while (dlist != NULL) { gamgi_engine_count_cluster (GAMGI_CAST_CLUSTER dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_CLUSTER) return; /* count molecule */ dlist = assembly->molecule_start; while (dlist != NULL) { gamgi_engine_count_molecule (GAMGI_CAST_MOLECULE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_MOLECULE) return; /* count group */ dlist = assembly->group_start; while (dlist != NULL) { gamgi_engine_count_group (GAMGI_CAST_GROUP dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_GROUP) return; /* count plane */ dlist = assembly->plane_start; while (dlist != NULL) { gamgi_engine_count_plane (GAMGI_CAST_PLANE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_PLANE) return; /* count direction */ dlist = assembly->direction_start; while (dlist != NULL) { gamgi_engine_count_direction (GAMGI_CAST_DIRECTION dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_DIRECTION) return; /* count atom */ dlist = assembly->atom_start; while (dlist != NULL) { gamgi_engine_count_atom (GAMGI_CAST_ATOM dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ATOM) return; /* count orbital */ dlist = assembly->orbital_start; while (dlist != NULL) { gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ORBITAL) return; /* count text */ dlist = assembly->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_layer (gamgi_layer *layer, int class, int *number) { gamgi_dlist *dlist; /* count assembly */ dlist = layer->assembly_start; while (dlist != NULL) { gamgi_engine_count_assembly (GAMGI_CAST_ASSEMBLY dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ASSEMBLY) return; /* count graph */ dlist = layer->graph_start; while (dlist != NULL) { gamgi_engine_count_graph (GAMGI_CAST_GRAPH dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_GRAPH) return; /* count shape */ dlist = layer->shape_start; while (dlist != NULL) { gamgi_engine_count_shape (GAMGI_CAST_SHAPE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_SHAPE) return; /* count arrow */ dlist = layer->arrow_start; while (dlist != NULL) { gamgi_engine_count_arrow (GAMGI_CAST_ARROW dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ARROW) return; /* count cell */ dlist = layer->cell_start; while (dlist != NULL) { gamgi_engine_count_cell (GAMGI_CAST_CELL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_CELL) return; /* count cluster */ dlist = layer->cluster_start; while (dlist != NULL) { gamgi_engine_count_cluster (GAMGI_CAST_CLUSTER dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_CLUSTER) return; /* count molecule */ dlist = layer->molecule_start; while (dlist != NULL) { gamgi_engine_count_molecule (GAMGI_CAST_MOLECULE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_MOLECULE) return; /* count group */ dlist = layer->group_start; while (dlist != NULL) { gamgi_engine_count_group (GAMGI_CAST_GROUP dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_GROUP) return; /* count plane */ dlist = layer->plane_start; while (dlist != NULL) { gamgi_engine_count_plane (GAMGI_CAST_PLANE dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_PLANE) return; /* count direction */ dlist = layer->direction_start; while (dlist != NULL) { gamgi_engine_count_direction (GAMGI_CAST_DIRECTION dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_DIRECTION) return; /* count atom */ dlist = layer->atom_start; while (dlist != NULL) { gamgi_engine_count_atom (GAMGI_CAST_ATOM dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ATOM) return; /* count orbital */ dlist = layer->orbital_start; while (dlist != NULL) { gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL dlist->data, class, number); dlist = dlist->next; } if (class == GAMGI_ENGINE_ORBITAL) return; /* count text */ dlist = layer->text_start; while (dlist != NULL) { gamgi_engine_count_text (GAMGI_CAST_TEXT dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_window (gamgi_window *window, gamgi_enum class, int *number) { gamgi_dlist *dlist; /*************************************** * count class objects in window scope * ***************************************/ dlist = window->layer_start; while (dlist != NULL) { gamgi_engine_count_layer (GAMGI_CAST_LAYER dlist->data, class, number); dlist = dlist->next; } } void gamgi_engine_count_gamgi (gamgi_enum class, int *number) { gamgi_window *window; /************************************** * count class objects in gamgi scope * **************************************/ window = gamgi->window_start; while (window != NULL) { gamgi_engine_count_window (window, class, number); window = window->next; } } void gamgi_engine_count_object (gamgi_object *object, gamgi_enum class, int *number) { switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_count_text (GAMGI_CAST_TEXT object, class, number); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_count_orbital (GAMGI_CAST_ORBITAL object, class, number); break; case GAMGI_ENGINE_BOND: gamgi_engine_count_bond (GAMGI_CAST_BOND object, class, number); break; case GAMGI_ENGINE_ATOM: gamgi_engine_count_atom (GAMGI_CAST_ATOM object, class, number); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_count_direction (GAMGI_CAST_DIRECTION object, class, number); break; case GAMGI_ENGINE_PLANE: gamgi_engine_count_plane (GAMGI_CAST_PLANE object, class, number); break; case GAMGI_ENGINE_GROUP: gamgi_engine_count_group (GAMGI_CAST_GROUP object, class, number); break; case GAMGI_ENGINE_MOLECULE: gamgi_engine_count_molecule (GAMGI_CAST_MOLECULE object, class, number); break; case GAMGI_ENGINE_CLUSTER: gamgi_engine_count_cluster (GAMGI_CAST_CLUSTER object, class, number); break; case GAMGI_ENGINE_CELL: gamgi_engine_count_cell (GAMGI_CAST_CELL object, class, number); break; case GAMGI_ENGINE_ARROW: gamgi_engine_count_arrow (GAMGI_CAST_ARROW object, class, number); break; case GAMGI_ENGINE_SHAPE: gamgi_engine_count_shape (GAMGI_CAST_SHAPE object, class, number); break; case GAMGI_ENGINE_GRAPH: gamgi_engine_count_graph (GAMGI_CAST_GRAPH object, class, number); break; case GAMGI_ENGINE_ASSEMBLY: gamgi_engine_count_assembly (GAMGI_CAST_ASSEMBLY object, class, number); break; case GAMGI_ENGINE_LAYER: gamgi_engine_count_layer (GAMGI_CAST_LAYER object, class, number); break; default: break; } } gamgi-0.17.5/src/engine/gamgi_engine_count.h000066400000000000000000000036261433127522700207330ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_count.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ void gamgi_engine_count_text (gamgi_text *text, gamgi_enum class, int *number); void gamgi_engine_count_orbital (gamgi_orbital *orbital, gamgi_enum class, int *number); void gamgi_engine_count_bond (gamgi_bond *bond, gamgi_enum class, int *number); void gamgi_engine_count_atom (gamgi_atom *atom, gamgi_enum class, int *number); void gamgi_engine_count_direction (gamgi_direction *direction, gamgi_enum class, int *number); void gamgi_engine_count_plane (gamgi_plane *plane, gamgi_enum class, int *number); void gamgi_engine_count_group (gamgi_group *group, gamgi_enum class, int *number); void gamgi_engine_count_molecule (gamgi_molecule *molecule, gamgi_enum class, int *number); void gamgi_engine_count_cluster (gamgi_cluster *cluster, gamgi_enum class, int *number); void gamgi_engine_count_cell (gamgi_cell *cell, gamgi_enum class, int *number); void gamgi_engine_count_arrow (gamgi_arrow *arrow, gamgi_enum class, int *number); void gamgi_engine_count_shape (gamgi_shape *shape, gamgi_enum class, int *number); void gamgi_engine_count_graph (gamgi_graph *graph, gamgi_enum class, int *number); void gamgi_engine_count_assembly (gamgi_assembly *assembly, gamgi_enum class, int *number); void gamgi_engine_count_layer (gamgi_layer *layer, gamgi_enum class, int *number); void gamgi_engine_count_window (gamgi_window *window, gamgi_enum class, int *number); void gamgi_engine_count_gamgi (gamgi_enum class, int *number); void gamgi_engine_count_object (gamgi_object *object, gamgi_enum class, int *number); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_create.c000066400000000000000000000606541433127522700210450ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_create.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_io.h" #include "gamgi_global.h" #include "gamgi_engine_number.h" #include "gamgi_mesa_text.h" #include "gamgi_chem_atom.h" #include "gamgi_global_create.h" /***************** external function ******************** * * * GAMGI_ENGINE_TEXT_CREATE * * * * Creates an object describing a 2D or 3D text string. * * * ********************************************************/ gamgi_text *gamgi_engine_create_text (void) { gamgi_text *old_text = gamgi->text_end, *text; /******************* * allocate memory * *******************/ text = GAMGI_CAST_TEXT malloc (sizeof (gamgi_text)); /************************* * initialise down links * *************************/ text->text_start = NULL; text->text_end = NULL; /******************** * update text list * ********************/ gamgi->text_end = text; text->before = old_text; text->next = NULL; if (old_text != NULL) old_text->next = text; else gamgi->text_start = text; return text; } /***************** external function ******************* * * * GAMGI_ENGINE_ORBITAL_CREATE * * * * Creates an object describing a 3D chemical orbital. * * * *******************************************************/ gamgi_orbital *gamgi_engine_create_orbital (void) { gamgi_orbital *old_orbital = gamgi->orbital_end, *orbital; /******************* * allocate memory * *******************/ orbital = GAMGI_CAST_ORBITAL malloc (sizeof (gamgi_orbital)); /************************* * initialise down links * *************************/ orbital->text_start = NULL; orbital->text_end = NULL; /*********************** * update orbital list * ***********************/ gamgi->orbital_end = orbital; orbital->before = old_orbital; orbital->next = NULL; if (old_orbital != NULL) old_orbital->next = orbital; else gamgi->orbital_start = orbital; return orbital; } /**************** external function ************* * * * GAMGI_ENGINE_BOND_CREATE * * * * Creates an object describing a chemical bond * * * ************************************************/ gamgi_bond *gamgi_engine_create_bond (void) { gamgi_bond *old_bond = gamgi->bond_end, *bond; /******************* * allocate memory * *******************/ bond = GAMGI_CAST_BOND malloc (sizeof (gamgi_bond)); /************************* * initialise down links * *************************/ bond->text_start = NULL; bond->text_end = NULL; bond->orbital_start = NULL; bond->orbital_end = NULL; /******************** * update bond list * ********************/ gamgi->bond_end = bond; bond->before = old_bond; bond->next = NULL; if (old_bond != NULL) old_bond->next = bond; else gamgi->bond_start = bond; return bond; } /*********** external function *********** * * * GAMGI_ENGINE_ATOM_CREATE * * * * Creates an object describing an atom. * * * *****************************************/ gamgi_atom *gamgi_engine_create_atom (void) { gamgi_atom *old_atom = gamgi->atom_end, *atom; /******************* * allocate memory * *******************/ atom = GAMGI_CAST_ATOM malloc (sizeof (gamgi_atom)); /************************* * initialise down links * *************************/ atom->text_start = NULL; atom->text_end = NULL; atom->orbital_start = NULL; atom->orbital_end = NULL; atom->bond_start = NULL; atom->bond_end = NULL; /******************** * update atom list * ********************/ gamgi->atom_end = atom; atom->before = old_atom; atom->next = NULL; if (old_atom != NULL) old_atom->next = atom; else gamgi->atom_start = atom; return atom; } /********************* external function ********************** * * * GAMGI_ENGINE_DIRECTION_CREATE * * * * Creates an object describing a crystallographic direction. * * * **************************************************************/ gamgi_direction *gamgi_engine_create_direction (void) { gamgi_direction *old_direction = gamgi->direction_end, *direction; /******************* * allocate memory * *******************/ direction = GAMGI_CAST_DIRECTION malloc (sizeof (gamgi_direction)); /************************* * initialise down links * *************************/ direction->text_start = NULL; direction->text_end = NULL; direction->orbital_start = NULL; direction->orbital_end = NULL; direction->bond_start = NULL; direction->bond_end = NULL; direction->atom_start = NULL; direction->atom_end = NULL; /************************* * update direction list * *************************/ gamgi->direction_end = direction; direction->before = old_direction; direction->next = NULL; if (old_direction != NULL) old_direction->next = direction; else gamgi->direction_start = direction; return direction; } /********************* external function ****************** * * * GAMGI_ENGINE_PLANE_CREATE * * * * Creates an object describing a crystallographic plane. * * * **********************************************************/ gamgi_plane *gamgi_engine_create_plane (void) { gamgi_plane *old_plane = gamgi->plane_end, *plane; /******************* * allocate memory * *******************/ plane = GAMGI_CAST_PLANE malloc (sizeof (gamgi_plane)); /************************* * initialise down links * *************************/ plane->text_start = NULL; plane->text_end = NULL; plane->orbital_start = NULL; plane->orbital_end = NULL; plane->atom_start = NULL; plane->atom_end = NULL; plane->bond_start = NULL; plane->bond_end = NULL; plane->direction_start = NULL; plane->direction_end = NULL; /********************* * update plane list * *********************/ gamgi->plane_end = plane; plane->before = old_plane; plane->next = NULL; if (old_plane != NULL) old_plane->next = plane; else gamgi->plane_start = plane; return plane; } /***************** external function ************** * * * GAMGI_ENGINE_GROUP_CREATE * * * * Creates an object describing a group of atoms. * * * **************************************************/ gamgi_group *gamgi_engine_create_group (void) { gamgi_group *old_group = gamgi->group_end, *group; /******************* * allocate memory * *******************/ group = GAMGI_CAST_GROUP malloc (sizeof (gamgi_group)); /************************* * initialise down links * *************************/ group->text_start = NULL; group->text_end = NULL; group->orbital_start = NULL; group->orbital_end = NULL; group->bond_start = NULL; group->bond_end = NULL; group->atom_start = NULL; group->atom_end = NULL; group->direction_start = NULL; group->direction_end = NULL; group->plane_start = NULL; group->plane_end = NULL; group->group_start = NULL; group->group_end = NULL; /********************* * update group list * *********************/ gamgi->group_end = group; group->before = old_group; group->next = NULL; if (old_group != NULL) old_group->next = group; else gamgi->group_start = group; return group; } /************* external function ************ * * * GAMGI_ENGINE_MOLECULE_CREATE * * * * Creates an object describing a molecule. * * * ********************************************/ gamgi_molecule *gamgi_engine_create_molecule (void) { gamgi_molecule *old_molecule = gamgi->molecule_end, *molecule; /******************* * allocate memory * *******************/ molecule = GAMGI_CAST_MOLECULE malloc (sizeof (gamgi_molecule)); /************************* * initialise down links * *************************/ molecule->text_start = NULL; molecule->text_end = NULL; molecule->orbital_start = NULL; molecule->orbital_end = NULL; molecule->bond_start = NULL; molecule->bond_end = NULL; molecule->atom_start = NULL; molecule->atom_end = NULL; molecule->direction_start = NULL; molecule->direction_end = NULL; molecule->plane_start = NULL; molecule->plane_end = NULL; molecule->group_start = NULL; molecule->group_end = NULL; /************************ * update molecule list * ************************/ gamgi->molecule_end = molecule; molecule->before = old_molecule; molecule->next = NULL; if (old_molecule != NULL) old_molecule->next = molecule; else gamgi->molecule_start = molecule; return molecule; } /******************* external function ****************** * * * GAMGI_ENGINE_CLUSTER_CREATE * * * * Creates an object describing a cluster of molecules. * * * ********************************************************/ gamgi_cluster *gamgi_engine_create_cluster (void) { gamgi_cluster *old_cluster = gamgi->cluster_end, *cluster; /******************* * allocate memory * *******************/ cluster = GAMGI_CAST_CLUSTER malloc (sizeof (gamgi_cluster)); /************************* * initialise down links * *************************/ cluster->text_start = NULL; cluster->text_end = NULL; cluster->orbital_start = NULL; cluster->orbital_end = NULL; cluster->bond_start = NULL; cluster->bond_end = NULL; cluster->atom_start = NULL; cluster->atom_end = NULL; cluster->direction_start = NULL; cluster->direction_end = NULL; cluster->plane_start = NULL; cluster->plane_end = NULL; cluster->group_start = NULL; cluster->group_end = NULL; cluster->molecule_start = NULL; cluster->molecule_end = NULL; cluster->cluster_start = NULL; cluster->cluster_end = NULL; /*********************** * update cluster list * ***********************/ gamgi->cluster_end = cluster; cluster->before = old_cluster; cluster->next = NULL; if (old_cluster != NULL) old_cluster->next = cluster; else gamgi->cluster_start = cluster; return cluster; } /***************** external function ************* * * * GAMGI_ENGINE_CELL_CREATE * * * * Creates an object describing a periodic cell. * * * *************************************************/ gamgi_cell *gamgi_engine_create_cell (void) { gamgi_cell *old_cell = gamgi->cell_end, *cell; /******************* * allocate memory * *******************/ cell = GAMGI_CAST_CELL malloc (sizeof (gamgi_cell)); /************************* * initialise down links * *************************/ cell->text_start = NULL; cell->text_end = NULL; cell->orbital_start = NULL; cell->orbital_end = NULL; cell->bond_start = NULL; cell->bond_end = NULL; cell->atom_start = NULL; cell->atom_end = NULL; cell->direction_start = NULL; cell->direction_end = NULL; cell->plane_start = NULL; cell->plane_end = NULL; cell->group_start = NULL; cell->group_end = NULL; cell->molecule_start = NULL; cell->molecule_end = NULL; cell->cluster_start = NULL; cell->cluster_end = NULL; /******************** * update cell list * ********************/ gamgi->cell_end = cell; cell->before = old_cell; cell->next = NULL; if (old_cell != NULL) old_cell->next = cell; else gamgi->cell_start = cell; return cell; } /******************** external function ******************* * * * GAMGI_ENGINE_ARROW_CREATE * * * * Creates an object describing a single or double arrow. * * * **********************************************************/ gamgi_arrow *gamgi_engine_create_arrow (void) { gamgi_arrow *old_arrow = gamgi->arrow_end, *arrow; /******************* * allocate memory * *******************/ arrow = GAMGI_CAST_ARROW malloc (sizeof (gamgi_arrow)); /************************* * initialise down links * *************************/ arrow->text_start = NULL; arrow->text_end = NULL; /********************* * update arrow list * *********************/ gamgi->arrow_end = arrow; arrow->before = old_arrow; arrow->next = NULL; if (old_arrow != NULL) old_arrow->next = arrow; else gamgi->arrow_start = arrow; return arrow; } /******************** external function ******************** * * * GAMGI_ENGINE_SHAPE_CREATE * * * * Creates an object describing a contoured or full shape. * * * ***********************************************************/ gamgi_shape *gamgi_engine_create_shape (void) { gamgi_shape *old_shape = gamgi->shape_end, *shape; /******************* * allocate memory * *******************/ shape = GAMGI_CAST_SHAPE malloc (sizeof (gamgi_shape)); /************************* * initialise down links * *************************/ shape->text_start = NULL; shape->text_end = NULL; /********************* * update shape list * *********************/ gamgi->shape_end = shape; shape->before = old_shape; shape->next = NULL; if (old_shape != NULL) old_shape->next = shape; else gamgi->shape_start = shape; return shape; } /****************** external function ************* * * * GAMGI_ENGINE_GRAPH_CREATE * * * * Creates an object describing a 2D or 3D graph. * * * **************************************************/ gamgi_graph *gamgi_engine_create_graph (void) { gamgi_graph *old_graph = gamgi->graph_end, *graph; /******************* * allocate memory * *******************/ graph = GAMGI_CAST_GRAPH malloc (sizeof (gamgi_graph)); /************************* * initialise down links * *************************/ graph->text_start = NULL; graph->text_end = NULL; /********************* * update graph list * *********************/ gamgi->graph_end = graph; graph->before = old_graph; graph->next = NULL; if (old_graph != NULL) old_graph->next = graph; else gamgi->graph_start = graph; return graph; } /******************** external function ***************** * * * GAMGI_ENGINE_ASSEMBLY_CREATE * * * * Creates an object describing an assembly of objects. * * * ********************************************************/ gamgi_assembly *gamgi_engine_create_assembly (void) { gamgi_assembly *old_assembly = gamgi->assembly_end, *assembly; /******************* * allocate memory * *******************/ assembly = GAMGI_CAST_ASSEMBLY malloc (sizeof (gamgi_assembly)); /************************* * initialise down links * *************************/ assembly->text_start = NULL; assembly->text_end = NULL; assembly->orbital_start = NULL; assembly->orbital_end = NULL; assembly->bond_start = NULL; assembly->bond_end = NULL; assembly->atom_start = NULL; assembly->atom_end = NULL; assembly->direction_start = NULL; assembly->direction_end = NULL; assembly->plane_start = NULL; assembly->plane_end = NULL; assembly->group_start = NULL; assembly->group_end = NULL; assembly->molecule_start = NULL; assembly->molecule_end = NULL; assembly->cluster_start = NULL; assembly->cluster_end = NULL; assembly->cell_start = NULL; assembly->cell_end = NULL; assembly->arrow_start = NULL; assembly->arrow_end = NULL; assembly->shape_start = NULL; assembly->shape_end = NULL; assembly->graph_start = NULL; assembly->graph_end = NULL; assembly->assembly_start = NULL; assembly->assembly_end = NULL; /************************ * update assembly list * ************************/ gamgi->assembly_end = assembly; assembly->before = old_assembly; assembly->next = NULL; if (old_assembly != NULL) old_assembly->next = assembly; else gamgi->assembly_start = assembly; return assembly; } /**************** external function ************** * * * GAMGI_ENGINE_LIGHT_CREATE * * * * Creates an object describing an OpenGL light. * * * *************************************************/ gamgi_light *gamgi_engine_create_light (void) { gamgi_light *old_light = gamgi->light_end, *light; /******************* * allocate memory * *******************/ light = GAMGI_CAST_LIGHT malloc (sizeof (gamgi_light)); /********************* * update light list * *********************/ gamgi->light_end = light; light->before = old_light; light->next = NULL; if (old_light != NULL) old_light->next = light; else gamgi->light_start = light; return light; } /*********************** external function ********************* * * * GAMGI_ENGINE_CREATE_LAYER * * * * Creates an object describing a transparent or opaque layer. * * * ***************************************************************/ gamgi_layer *gamgi_engine_create_layer (void) { gamgi_layer *old_layer = gamgi->layer_end, *layer; /******************* * allocate memory * *******************/ layer = GAMGI_CAST_LAYER malloc (sizeof (gamgi_layer)); /************************* * initialise down links * *************************/ layer->text_start = NULL; layer->text_end = NULL; layer->orbital_start = NULL; layer->orbital_end = NULL; layer->bond_start = NULL; layer->bond_end = NULL; layer->atom_start = NULL; layer->atom_end = NULL; layer->direction_start = NULL; layer->direction_end = NULL; layer->plane_start = NULL; layer->plane_end = NULL; layer->group_start = NULL; layer->group_end = NULL; layer->molecule_start = NULL; layer->molecule_end = NULL; layer->cluster_start = NULL; layer->cluster_end = NULL; layer->cell_start = NULL; layer->cell_end = NULL; layer->arrow_start = NULL; layer->arrow_end = NULL; layer->shape_start = NULL; layer->shape_end = NULL; layer->graph_start = NULL; layer->graph_end = NULL; layer->assembly_start = NULL; layer->assembly_end = NULL; layer->light_start = NULL; layer->light_end = NULL; /********************* * update layer list * *********************/ gamgi->layer_end = layer; layer->before = old_layer; layer->next = NULL; if (old_layer != NULL) old_layer->next = layer; else gamgi->layer_start = layer; return layer; } /**************** external function *************** * * * GAMGI_ENGINE_WINDOW_CREATE * * * * Creates an object describing a GTK top window. * * * **************************************************/ gamgi_window *gamgi_engine_create_window (void) { gamgi_window *old_window = gamgi->window_end, *window; /******************* * allocate memory * *******************/ window = GAMGI_CAST_WINDOW malloc (sizeof (gamgi_window)); /************************* * initialise down links * *************************/ window->layer_start = NULL; window->layer_end = NULL; /********************** * update window list * **********************/ gamgi->window_end = window; window->before = old_window; window->next = NULL; if (old_window != NULL) old_window->next = window; else gamgi->window_start = window; return window; } /*********************** external function ******************* * * * GAMGI_ENGINE_CREATE_GAMGI * * * * Creates an object to allocate the GAMGI system resources. * * * *************************************************************/ void gamgi_engine_create_gamgi () { /************************************************** * gamgi is the only global variable defined in * * GAMGI. Its purpose is to contain the global * * resources used by the program. Every data * * available in GAMGI can be obtained from gamgi. * **************************************************/ gamgi = GAMGI_CAST_GAMGI malloc (sizeof (gamgi_gamgi)); /******************************* * create hash table to speed * * up atom element recognition * *******************************/ gamgi->element = gamgi_chem_atom_element (); /**************************** * create font glyph arrays * ****************************/ gamgi_mesa_text_font_start (); /********************************** * initialize pointers to windows * **********************************/ gamgi->message = NULL; gamgi->question = NULL; /************************************** * create configuration class objects * **************************************/ gamgi->help = gamgi_global_create_help (); gamgi->text = gamgi_global_create_text (); gamgi->orbital = gamgi_global_create_orbital (); gamgi->bond = gamgi_global_create_bond (); gamgi->atom = gamgi_global_create_atom (); gamgi->direction = gamgi_global_create_direction (); gamgi->plane = gamgi_global_create_plane (); gamgi->group = gamgi_global_create_group (); gamgi->molecule = gamgi_global_create_molecule (); gamgi->cluster = gamgi_global_create_cluster (); gamgi->cell = gamgi_global_create_cell (); gamgi->arrow = gamgi_global_create_arrow (); gamgi->shape = gamgi_global_create_shape (); gamgi->graph = gamgi_global_create_graph (); gamgi->assembly = gamgi_global_create_assembly (); gamgi->light = gamgi_global_create_light (); gamgi->layer = gamgi_global_create_layer (); gamgi->window = gamgi_global_create_window (); gamgi->gamgi = gamgi_global_create_gamgi (); /*************************************************** * initialize object selection tools, lists, focus * ***************************************************/ gamgi->function = NULL; gamgi->window_dialog = NULL; gamgi->window_mouse = NULL; gamgi->state = FALSE; gamgi->texts = NULL; gamgi->orbitals = NULL; gamgi->bonds = NULL; gamgi->atoms = NULL; gamgi->directions = NULL; gamgi->planes = NULL; gamgi->groups = NULL; gamgi->molecules = NULL; gamgi->clusters = NULL; gamgi->cells = NULL; gamgi->arrows = NULL; gamgi->shapes = NULL; gamgi->graphs = NULL; gamgi->assemblys = NULL; gamgi->lights = NULL; gamgi->layers = NULL; gamgi->windows = NULL; gamgi->focus = FALSE; /********************************** * initialise pointers to objects * **********************************/ gamgi->text_start = NULL; gamgi->text_end = NULL; gamgi->orbital_start = NULL; gamgi->orbital_end = NULL; gamgi->bond_start = NULL; gamgi->bond_end = NULL; gamgi->atom_start = NULL; gamgi->atom_end = NULL; gamgi->direction_start = NULL; gamgi->direction_end = NULL; gamgi->plane_start = NULL; gamgi->plane_end = NULL; gamgi->group_start = NULL; gamgi->group_end = NULL; gamgi->molecule_start = NULL; gamgi->molecule_end = NULL; gamgi->cluster_start = NULL; gamgi->cluster_end = NULL; gamgi->cell_start = NULL; gamgi->cell_end = NULL; gamgi->arrow_start = NULL; gamgi->arrow_end = NULL; gamgi->shape_start = NULL; gamgi->shape_end = NULL; gamgi->graph_start = NULL; gamgi->graph_end = NULL; gamgi->assembly_start = NULL; gamgi->assembly_end = NULL; gamgi->light_start = NULL; gamgi->light_end = NULL; gamgi->layer_start = NULL; gamgi->layer_end = NULL; gamgi->window_start = NULL; gamgi->window_end = NULL; } gamgi-0.17.5/src/engine/gamgi_engine_create.h000066400000000000000000000023761433127522700210470ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_create.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ gamgi_text *gamgi_engine_create_text (void); gamgi_orbital *gamgi_engine_create_orbital (void); gamgi_bond *gamgi_engine_create_bond (void); gamgi_atom *gamgi_engine_create_atom (void); gamgi_direction *gamgi_engine_create_direction (void); gamgi_plane *gamgi_engine_create_plane (void); gamgi_group *gamgi_engine_create_group (void); gamgi_molecule *gamgi_engine_create_molecule (void); gamgi_cluster *gamgi_engine_create_cluster (void); gamgi_cell *gamgi_engine_create_cell (void); gamgi_arrow *gamgi_engine_create_arrow (void); gamgi_shape *gamgi_engine_create_shape (void); gamgi_graph *gamgi_engine_create_graph (void); gamgi_assembly *gamgi_engine_create_assembly (void); gamgi_light *gamgi_engine_create_light (void); gamgi_layer *gamgi_engine_create_layer (void); gamgi_window *gamgi_engine_create_window (void); void gamgi_engine_create_gamgi (void); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_dlist.c000066400000000000000000002424741433127522700207230ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_dlist.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_global.h" #include "gamgi_engine_list.h" gamgi_dlist *gamgi_engine_dlist_text_text (gamgi_text *text, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = text->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT text; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_orbital (gamgi_orbital *orbital, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = orbital->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_bond (gamgi_bond *bond, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = bond->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist = bond->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_atom (gamgi_atom *atom, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = atom->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist = atom->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = atom->bond_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_bond (GAMGI_CAST_BOND dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_direction (gamgi_direction *direction, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = direction->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist = direction->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = direction->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_plane (gamgi_plane *plane, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = plane->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist = plane->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = plane->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = plane->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_group (gamgi_group *group, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = group->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist = group->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = group->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = group->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = group->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = group->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = molecule->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cluster->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_cell (gamgi_cell *cell, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cell->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_arrow (gamgi_arrow *arrow, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = arrow->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_shape (gamgi_shape *shape, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = shape->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_graph (gamgi_graph *graph, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = graph->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->arrow_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_arrow (GAMGI_CAST_ARROW dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->shape_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_shape (GAMGI_CAST_SHAPE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->graph_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_graph (GAMGI_CAST_GRAPH dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->text_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_text (GAMGI_CAST_TEXT dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->arrow_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_arrow (GAMGI_CAST_ARROW dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->shape_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_shape (GAMGI_CAST_SHAPE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->graph_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_graph (GAMGI_CAST_GRAPH dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_text_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_text_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_text_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_orbital (gamgi_orbital *orbital, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT orbital; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_bond (gamgi_bond *bond, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = bond->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_atom (gamgi_atom *atom, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = atom->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = atom->bond_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_bond (GAMGI_CAST_BOND dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_direction (gamgi_direction *direction, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = direction->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = direction->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_plane (gamgi_plane *plane, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = plane->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = plane->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = plane->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_group (gamgi_group *group, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = group->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = group->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = group->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = group->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = group->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = molecule->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cluster->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_cell (gamgi_cell *cell, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cell->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->orbital_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_orbital (GAMGI_CAST_ORBITAL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_orbital_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_orbital_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_orbital_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_bond (gamgi_bond *bond, gamgi_dlist *dlist_start) { /*********************************************** * Bonds are owned by two parent atoms, so * * they should appear twice, when searching * * for atoms child. Bonds are stack listed * * immediately when an atom references them. * * As last bonds come first in the list and * * atoms are also generated from end to start, * * the overall results are: * * * * a bond appears in the list when the second * * atom appears (ordered from start to end). * * * * half bonds, that are be referenced only * * by one atom, will always be listed, making * * it easy to reset the bond->first flag, * * that would be corrupted otherwise. This * * is safe programming only: half bonds * * should not really exist in GAMGI. * ***********************************************/ if (bond->first == TRUE) { bond->first = FALSE; dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT bond; } else bond->first = TRUE; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_atom (gamgi_atom *atom, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = atom->bond_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_bond (GAMGI_CAST_BOND dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_direction (gamgi_direction *direction, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = direction->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_plane (gamgi_plane *plane, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = plane->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = plane->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_group (gamgi_group *group, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = group->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = group->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = group->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = group->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = molecule->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cluster->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_cell (gamgi_cell *cell, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cell->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_bond_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_bond_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_bond_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_atom (gamgi_atom *atom, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT atom; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_direction (gamgi_direction *direction, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = direction->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_plane (gamgi_plane *plane, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = plane->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = plane->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_group (gamgi_group *group, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = group->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = group->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = group->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = group->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = molecule->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cluster->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_cell (gamgi_cell *cell, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cell->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->atom_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_atom (GAMGI_CAST_ATOM dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_atom_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_atom_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_direction_direction (gamgi_direction *direction, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT direction; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_direction_plane (gamgi_plane *plane, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = plane->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_direction_group (gamgi_group *group, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = group->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = group->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = group->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_direction_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = molecule->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_direction_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cluster->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_direction_cell (gamgi_cell *cell, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cell->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_direction_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_direction_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->direction_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_direction (GAMGI_CAST_DIRECTION dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_direction_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_direction_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_direction_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_direction_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_plane_plane (gamgi_plane *plane, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT plane; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_plane_group (gamgi_group *group, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = group->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = group->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_plane_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = molecule->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = molecule->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_plane_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cluster->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_plane_cell (gamgi_cell *cell, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cell->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_plane_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_plane_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->plane_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_plane (GAMGI_CAST_PLANE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_plane_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_plane_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_plane_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_plane_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_group_group (gamgi_group *group, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = group->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT group; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_group_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = molecule->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_group_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cluster->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_group_cell (gamgi_cell *cell, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cell->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_group_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_group_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->group_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_group (GAMGI_CAST_GROUP dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_group_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_group_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_group_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_group_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_molecule_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT molecule; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_molecule_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cluster->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cluster->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_molecule_cell (gamgi_cell *cell, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cell->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = cell->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_molecule_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_molecule_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->molecule_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_molecule (GAMGI_CAST_MOLECULE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_molecule_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_molecule_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_molecule_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_molecule_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cluster_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cluster->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cluster_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT cluster; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cluster_cell (gamgi_cell *cell, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = cell->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cluster_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cluster_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cluster_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cluster_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cluster_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cluster_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->cluster_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cluster_cluster (GAMGI_CAST_CLUSTER dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cluster_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cluster_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cluster_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cluster_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cluster_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_cluster_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cell_cell (gamgi_cell *cell, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT cell; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cell_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cell_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cell_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cell_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->cell_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cell_cell (GAMGI_CAST_CELL dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cell_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cell_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_cell_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_cell_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_cell_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_arrow_arrow (gamgi_arrow *arrow, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT arrow; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_arrow_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->arrow_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_arrow_arrow (GAMGI_CAST_ARROW dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_arrow_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->arrow_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_arrow_arrow (GAMGI_CAST_ARROW dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_arrow_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_arrow_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_arrow_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_arrow_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_arrow_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_shape_shape (gamgi_shape *shape, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT shape; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_shape_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->shape_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_shape_shape (GAMGI_CAST_SHAPE dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_shape_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->shape_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_shape_shape (GAMGI_CAST_SHAPE dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_shape_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_shape_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_shape_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_shape_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_shape_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_graph_graph (gamgi_graph *graph, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT graph; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_graph_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->graph_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_graph_graph (GAMGI_CAST_GRAPH dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_graph_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->graph_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_graph_graph (GAMGI_CAST_GRAPH dlist->data, dlist_start); dlist = dlist->before; } dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_graph_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_graph_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_graph_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_graph_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_graph_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_assembly_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = assembly->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_assembly_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT assembly; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_assembly_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->assembly_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_assembly_assembly (GAMGI_CAST_ASSEMBLY dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_assembly_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_assembly_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_assembly_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_assembly_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_light_light (gamgi_light *light, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT light; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_light_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = layer->light_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_light_light (GAMGI_CAST_LIGHT dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_light_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_light_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_light_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_light_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_layer_layer (gamgi_layer *layer, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT layer; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_layer_window (gamgi_window *window, gamgi_dlist *dlist_start) { gamgi_dlist *dlist; dlist = window->layer_end; while (dlist != NULL) { dlist_start = gamgi_engine_dlist_layer_layer (GAMGI_CAST_LAYER dlist->data, dlist_start); dlist = dlist->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_layer_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_layer_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_window_window (gamgi_window *window, gamgi_dlist *dlist_start) { dlist_start = gamgi_engine_dlist_add_start (dlist_start); dlist_start->data = GAMGI_CAST_OBJECT window; return dlist_start; } gamgi_dlist *gamgi_engine_dlist_window_gamgi (gamgi_dlist *dlist_start) { gamgi_window *window; window = gamgi->window_end; while (window != NULL) { dlist_start = gamgi_engine_dlist_window_window (window, dlist_start); window = window->before; } return dlist_start; } gamgi_dlist *gamgi_engine_dlist_atom_object (gamgi_object *object, gamgi_dlist *dlist_start) { switch (object->class) { case GAMGI_ENGINE_ATOM: dlist_start = gamgi_engine_dlist_atom_atom (GAMGI_CAST_ATOM object, dlist_start); break; case GAMGI_ENGINE_DIRECTION: dlist_start = gamgi_engine_dlist_atom_direction (GAMGI_CAST_DIRECTION object, dlist_start); break; case GAMGI_ENGINE_PLANE: dlist_start = gamgi_engine_dlist_atom_plane (GAMGI_CAST_PLANE object, dlist_start); break; case GAMGI_ENGINE_GROUP: dlist_start = gamgi_engine_dlist_atom_group (GAMGI_CAST_GROUP object, dlist_start); break; case GAMGI_ENGINE_MOLECULE: dlist_start = gamgi_engine_dlist_atom_molecule (GAMGI_CAST_MOLECULE object, dlist_start); break; case GAMGI_ENGINE_CLUSTER: dlist_start = gamgi_engine_dlist_atom_cluster (GAMGI_CAST_CLUSTER object, dlist_start); break; case GAMGI_ENGINE_CELL: dlist_start = gamgi_engine_dlist_atom_cell (GAMGI_CAST_CELL object, dlist_start); break; case GAMGI_ENGINE_ASSEMBLY: dlist_start = gamgi_engine_dlist_atom_assembly (GAMGI_CAST_ASSEMBLY object, dlist_start); break; case GAMGI_ENGINE_LAYER: dlist_start = gamgi_engine_dlist_atom_layer (GAMGI_CAST_LAYER object, dlist_start); break; case GAMGI_ENGINE_WINDOW: dlist_start = gamgi_engine_dlist_atom_window (GAMGI_CAST_WINDOW object, dlist_start); break; case GAMGI_ENGINE_GAMGI: dlist_start = gamgi_engine_dlist_atom_gamgi (dlist_start); break; default: break; } return dlist_start; } gamgi-0.17.5/src/engine/gamgi_engine_dlist.h000066400000000000000000000302531433127522700207160ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_dlist.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ gamgi_dlist *gamgi_engine_dlist_text_text (gamgi_text *text, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_orbital (gamgi_orbital *orbital, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_bond (gamgi_bond *bond, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_atom (gamgi_atom *atom, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_direction (gamgi_direction *direction, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_plane (gamgi_plane *plane, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_group (gamgi_group *group, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_cell (gamgi_cell *cell, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_arrow (gamgi_arrow *arrow, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_shape (gamgi_shape *shape, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_graph (gamgi_graph *graph, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_text_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_orbital (gamgi_orbital *orbital, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_bond (gamgi_bond *bond, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_atom (gamgi_atom *atom, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_direction (gamgi_direction *direction, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_plane (gamgi_plane *plane, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_group (gamgi_group *group, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_cell (gamgi_cell *cell, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_orbital_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_bond (gamgi_bond *bond, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_atom (gamgi_atom *atom, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_direction (gamgi_direction *direction, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_plane (gamgi_plane *plane, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_group (gamgi_group *group, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_cell (gamgi_cell *cell, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_atom (gamgi_atom *atom, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_direction (gamgi_direction *direction, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_plane (gamgi_plane *plane, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_group (gamgi_group *group, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_cell (gamgi_cell *cell, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_bond_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_direction_direction (gamgi_direction *direction, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_direction_plane (gamgi_plane *plane, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_direction_group (gamgi_group *group, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_direction_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_direction_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_direction_cell (gamgi_cell *cell, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_direction_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_direction_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_direction_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_direction_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_plane_plane (gamgi_plane *plane, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_plane_group (gamgi_group *group, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_plane_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_plane_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_plane_cell (gamgi_cell *cell, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_plane_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_plane_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_plane_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_plane_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_group_group (gamgi_group *group, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_group_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_group_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_group_cell (gamgi_cell *cell, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_group_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_group_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_group_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_group_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_molecule_molecule (gamgi_molecule *molecule, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_molecule_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_molecule_cell (gamgi_cell *cell, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_molecule_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_molecule_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_molecule_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_molecule_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cluster_cluster (gamgi_cluster *cluster, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cluster_cell (gamgi_cell *cell, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cluster_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cluster_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cluster_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cluster_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cell_cell (gamgi_cell *cell, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cell_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cell_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cell_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_cell_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_arrow_arrow (gamgi_arrow *arrow, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_arrow_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_arrow_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_arrow_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_arrow_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_shape_shape (gamgi_shape *shape, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_shape_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_shape_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_shape_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_shape_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_graph_graph (gamgi_graph *graph, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_graph_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_graph_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_graph_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_graph_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_assembly_assembly (gamgi_assembly *assembly, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_assembly_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_assembly_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_assembly_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_light_light (gamgi_light *light, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_light_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_light_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_light_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_layer_layer (gamgi_layer *layer, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_layer_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_layer_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_window_window (gamgi_window *window, gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_window_gamgi (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_atom_object (gamgi_object *object, gamgi_dlist *dlist_start); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_empty.c000066400000000000000000000120101433127522700207170ustar00rootroot00000000000000/****************************************** * * $GAMGI/src/engine/gamgi_engine_empty.c * * Copyright (C) 2006 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_mesa.h" #include "gamgi_chem.h" #include "gamgi_global.h" gamgi_bool gamgi_engine_empty_text (gamgi_text *text) { if (text->text_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_orbital (gamgi_orbital *orbital) { if (orbital->text_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_bond (gamgi_bond *bond) { if (bond->text_start != NULL) return FALSE; if (bond->orbital_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_atom (gamgi_atom *atom) { if (atom->text_start != NULL) return FALSE; if (atom->orbital_start != NULL) return FALSE; if (atom->bond_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_direction (gamgi_direction *direction) { if (direction->text_start != NULL) return FALSE; if (direction->orbital_start != NULL) return FALSE; if (direction->atom_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_plane (gamgi_plane *plane) { if (plane->text_start != NULL) return FALSE; if (plane->orbital_start != NULL) return FALSE; if (plane->atom_start != NULL) return FALSE; if (plane->direction_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_group (gamgi_group *group) { if (group->text_start != NULL) return FALSE; if (group->orbital_start != NULL) return FALSE; if (group->atom_start != NULL) return FALSE; if (group->direction_start != NULL) return FALSE; if (group->plane_start != NULL) return FALSE; if (group->group_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_molecule (gamgi_molecule *molecule) { if (molecule->text_start != NULL) return FALSE; if (molecule->orbital_start != NULL) return FALSE; if (molecule->atom_start != NULL) return FALSE; if (molecule->direction_start != NULL) return FALSE; if (molecule->plane_start != NULL) return FALSE; if (molecule->group_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_cluster (gamgi_cluster *cluster) { if (cluster->text_start != NULL) return FALSE; if (cluster->orbital_start != NULL) return FALSE; if (cluster->atom_start != NULL) return FALSE; if (cluster->direction_start != NULL) return FALSE; if (cluster->plane_start != NULL) return FALSE; if (cluster->group_start != NULL) return FALSE; if (cluster->molecule_start != NULL) return FALSE; if (cluster->cluster_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_cell (gamgi_cell *cell) { if (cell->text_start != NULL) return FALSE; if (cell->orbital_start != NULL) return FALSE; if (cell->atom_start != NULL) return FALSE; if (cell->direction_start != NULL) return FALSE; if (cell->plane_start != NULL) return FALSE; if (cell->group_start != NULL) return FALSE; if (cell->molecule_start != NULL) return FALSE; if (cell->cluster_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_arrow (gamgi_arrow *arrow) { if (arrow->text_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_shape (gamgi_shape *shape) { if (shape->text_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_graph (gamgi_graph *graph) { if (graph->text_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_assembly (gamgi_assembly *assembly) { if (assembly->text_start != NULL) return FALSE; if (assembly->orbital_start != NULL) return FALSE; if (assembly->atom_start != NULL) return FALSE; if (assembly->direction_start != NULL) return FALSE; if (assembly->plane_start != NULL) return FALSE; if (assembly->group_start != NULL) return FALSE; if (assembly->molecule_start != NULL) return FALSE; if (assembly->cluster_start != NULL) return FALSE; if (assembly->cell_start != NULL) return FALSE; if (assembly->arrow_start != NULL) return FALSE; if (assembly->shape_start != NULL) return FALSE; if (assembly->graph_start != NULL) return FALSE; if (assembly->assembly_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_light (gamgi_light *light) { return TRUE; } gamgi_bool gamgi_engine_empty_layer (gamgi_layer *layer) { if (layer->text_start != NULL) return FALSE; if (layer->orbital_start != NULL) return FALSE; if (layer->atom_start != NULL) return FALSE; if (layer->direction_start != NULL) return FALSE; if (layer->plane_start != NULL) return FALSE; if (layer->group_start != NULL) return FALSE; if (layer->molecule_start != NULL) return FALSE; if (layer->cluster_start != NULL) return FALSE; if (layer->cell_start != NULL) return FALSE; if (layer->arrow_start != NULL) return FALSE; if (layer->shape_start != NULL) return FALSE; if (layer->graph_start != NULL) return FALSE; if (layer->assembly_start != NULL) return FALSE; if (layer->light_start != NULL) return FALSE; return TRUE; } gamgi_bool gamgi_engine_empty_window (gamgi_window *window) { if (window->layer_start != NULL) return FALSE; return TRUE; } gamgi-0.17.5/src/engine/gamgi_engine_empty.h000066400000000000000000000026231433127522700207350ustar00rootroot00000000000000/****************************************** * * $GAMGI/src/engine/gamgi_engine_empty.h * * Copyright (C) 2006 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ gamgi_bool gamgi_engine_empty_text (gamgi_text *text); gamgi_bool gamgi_engine_empty_orbital (gamgi_orbital *orbital); gamgi_bool gamgi_engine_empty_bond (gamgi_bond *bond); gamgi_bool gamgi_engine_empty_atom (gamgi_atom *atom); gamgi_bool gamgi_engine_empty_direction (gamgi_direction *direction); gamgi_bool gamgi_engine_empty_plane (gamgi_plane *plane); gamgi_bool gamgi_engine_empty_group (gamgi_group *group); gamgi_bool gamgi_engine_empty_molecule (gamgi_molecule *molecule); gamgi_bool gamgi_engine_empty_cluster (gamgi_cluster *cluster); gamgi_bool gamgi_engine_empty_cell (gamgi_cell *cell); gamgi_bool gamgi_engine_empty_arrow (gamgi_arrow *arrow); gamgi_bool gamgi_engine_empty_shape (gamgi_shape *shape); gamgi_bool gamgi_engine_empty_graph (gamgi_graph *graph); gamgi_bool gamgi_engine_empty_assembly (gamgi_assembly *assembly); gamgi_bool gamgi_engine_empty_light (gamgi_light *light); gamgi_bool gamgi_engine_empty_layer (gamgi_layer *layer); gamgi_bool gamgi_engine_empty_window (gamgi_window *window); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_filter.c000066400000000000000000000120061433127522700210530ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_filter.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_math.h" #include "gamgi_chem.h" #include "gamgi_engine_list.h" #include "gamgi_engine_unlink.h" #include "gamgi_engine_remove.h" #include "gamgi_math_measure.h" gamgi_dlist *gamgi_engine_filter_bond_length (gamgi_dlist *start, double min, double max) { gamgi_atom *atom1, *atom2; gamgi_bond* bond; gamgi_dlist *dlist, *dlist_next; double length; for (dlist = start; dlist != NULL; dlist = dlist_next) { dlist_next = dlist->next; bond = GAMGI_CAST_BOND dlist->data; atom1 = bond->atom1; atom2 = bond->atom2; gamgi_math_measure_length_2atom (atom1, atom2, &length); if (length < min || length > max) { if (dlist->before == NULL) start = dlist_next; gamgi_engine_dlist_remove_start (dlist); gamgi_engine_unlink_bond (bond); gamgi_engine_remove_bond (bond); } } return start; } gamgi_dlist *gamgi_engine_filter_bond_element (gamgi_dlist *start, int z1, int z2) { gamgi_bond* bond; gamgi_dlist *dlist, *dlist_next; int element1, element2; for (dlist = start; dlist != NULL; dlist = dlist_next) { dlist_next = dlist->next; bond = GAMGI_CAST_BOND dlist->data; element1 = bond->atom1->element; element2 = bond->atom2->element; if ((z1 != element1 && z1 != element2) || (z2 != element1 && z2 != element2)) { if (dlist->before == NULL) start = dlist_next; gamgi_engine_dlist_remove_start (dlist); gamgi_engine_unlink_bond (bond); gamgi_engine_remove_bond (bond); } } return start; } gamgi_dlist *gamgi_engine_filter_atom_element (gamgi_dlist *start, int z1, int z2) { gamgi_atom *atom; gamgi_dlist *dlist, *dlist_next; int element; for (dlist = start; dlist != NULL; dlist = dlist_next) { dlist_next = dlist->next; atom = GAMGI_CAST_ATOM dlist->data; element = atom->element; if (element != z1 && element != z2) { if (dlist->before == NULL) start = dlist_next; gamgi_engine_dlist_remove_start (dlist); } } return start; } gamgi_dlist *gamgi_engine_filter_atom_class (gamgi_dlist *start, int offset, gamgi_enum class) { gamgi_object *object; gamgi_dlist *dlist, *dlist_next; /*********************************************** * unlist objects with specific parent classes * ***********************************************/ for (dlist = start; dlist != NULL; dlist = dlist_next) { dlist_next = dlist->next; /******************************************** * ignore first offset elements of the list * ********************************************/ if (offset-- > 0) continue; object = GAMGI_CAST_OBJECT dlist->data; if (object->object->class == class) { if (dlist->before == NULL) start = dlist_next; gamgi_engine_dlist_remove_start (dlist); } } return start; } gamgi_dlist *gamgi_engine_filter_atom_parent (gamgi_dlist *start, int offset, gamgi_object *parent) { gamgi_object *object; gamgi_dlist *dlist, *dlist_next; /************************************************** * unlist objects without specific parent objects * **************************************************/ for (dlist = start; dlist != NULL; dlist = dlist_next) { dlist_next = dlist->next; /******************************************** * ignore first offset elements of the list * ********************************************/ if (offset-- > 0) continue; object = GAMGI_CAST_OBJECT dlist->data; if (object->object != parent) { if (dlist->before == NULL) start = dlist_next; gamgi_engine_dlist_remove_start (dlist); } } return start; } gamgi_dlist *gamgi_engine_filter_atom_identical (gamgi_dlist *start, int offset) { gamgi_atom *atom_i, *atom_j; gamgi_dlist *i, *j, *j_next; double x, y, z; for (i = start; i != NULL; i = i->next) { /******************************************** * ignore first offset elements of the list * ********************************************/ if (offset-- > 0) continue; atom_i = GAMGI_CAST_ATOM i->data; for (j = i->next; j != NULL; j = j_next) { j_next = j->next; atom_j = GAMGI_CAST_ATOM j->data; x = atom_i->position[0] - atom_j->position[0]; y = atom_i->position[1] - atom_j->position[1]; z = atom_i->position[2] - atom_j->position[2]; if (x * x + y * y + z * z < GAMGI_MATH_TOLERANCE_STRUCTURE * GAMGI_MATH_TOLERANCE_STRUCTURE) gamgi_engine_dlist_remove_start (j); } } return start; } gamgi_dlist *gamgi_engine_filter_atom (gamgi_dlist *start, int offset, gamgi_enum filter, gamgi_enum class, gamgi_object *parent) { if (filter == GAMGI_CHEM_FILTER_CLASS) while (class > GAMGI_ENGINE_ATOM) start = gamgi_engine_filter_atom_class (start, offset, class--); if (filter == GAMGI_CHEM_FILTER_PARENT) start = gamgi_engine_filter_atom_parent (start, offset, parent); if (filter == GAMGI_CHEM_FILTER_IDENTICAL) start = gamgi_engine_filter_atom_identical (start, offset); return start; } gamgi-0.17.5/src/engine/gamgi_engine_filter.h000066400000000000000000000020641433127522700210630ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_filter.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ gamgi_dlist *gamgi_engine_filter_bond_length (gamgi_dlist *start, double min, double max); gamgi_dlist *gamgi_engine_filter_bond_element (gamgi_dlist *start, int z1, int z2); gamgi_dlist *gamgi_engine_filter_atom_element (gamgi_dlist *start, int z1, int z2); gamgi_dlist *gamgi_engine_filter_atom_class (gamgi_dlist *start, int offset, gamgi_enum class); gamgi_dlist *gamgi_engine_filter_atom_parent (gamgi_dlist *start, int offset, gamgi_object *parent); gamgi_dlist *gamgi_engine_filter_atom_identical (gamgi_dlist *start, int offset); gamgi_dlist *gamgi_engine_filter_atom (gamgi_dlist *start, int offset, gamgi_enum filter, gamgi_enum class, gamgi_object *parent); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_find.c000066400000000000000000002617731433127522700205270ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_find.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_global.h" gamgi_bool gamgi_engine_find_object (gamgi_object *object, gamgi_object *parent) { gamgi_bond *bond; int class = parent->class; /*********************************************************************** * handle this case separately because the normal algorithm does not * * work (object->object = NULL) and any object belongs to gamgi anyway * ***********************************************************************/ if (class == GAMGI_ENGINE_GAMGI) return TRUE; /************************************** * when object is a bond, try to find * * one of the two atoms in parent * **************************************/ do { if (object == parent) return TRUE; if (object->class == GAMGI_ENGINE_BOND) { bond = GAMGI_CAST_BOND object; if (gamgi_engine_find_object (GAMGI_CAST_OBJECT bond->atom1, parent) == TRUE) return TRUE; if (gamgi_engine_find_object (GAMGI_CAST_OBJECT bond->atom2, parent) == TRUE) return TRUE; return FALSE; } else object = object->object; } while (object != NULL && object->class <= class); return FALSE; } gamgi_layer *gamgi_engine_find_layer (gamgi_object *object) { if (object->class > GAMGI_ENGINE_LAYER) return NULL; while (object->class < GAMGI_ENGINE_LAYER) { if (object->class == GAMGI_ENGINE_BOND) object = (GAMGI_CAST_BOND object)->atom1->object.object; else object = object->object; } return GAMGI_CAST_LAYER object; } gamgi_window *gamgi_engine_find_window (gamgi_object *object) { gamgi_layer *layer = gamgi_engine_find_layer (object); return GAMGI_CAST_WINDOW layer->object.object; } gamgi_object *gamgi_engine_find_root (gamgi_object *object1, gamgi_object *object2, gamgi_object *scope) { gamgi_object *i, *j; int class = scope->class; for (i = object1; i != NULL && i->class <= class; i = i->object) { for (j = object2; j != NULL && j->class <= class; j = j->object) { if (i->class > j->class) continue; if (i->class < j->class) break; if (i == j) { /****************************** * a common parent was found, * * check if it is in scope * ******************************/ if (gamgi_engine_find_object (i, scope) == TRUE) return j; return NULL; } } } return NULL; } gamgi_text *gamgi_engine_find_text_text (unsigned int number, gamgi_text *text) { gamgi_text *new_text; gamgi_dlist *dlist; if (text->object.number == number) return text; dlist = text->text_start; while (dlist != NULL) { new_text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (new_text != NULL) return new_text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_orbital (unsigned int number, gamgi_orbital *orbital) { gamgi_text *text; gamgi_dlist *dlist; dlist = orbital->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_bond (unsigned int number, gamgi_bond *bond) { gamgi_text *text; gamgi_dlist *dlist; dlist = bond->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = bond->orbital_start; while (dlist != NULL) { text = gamgi_engine_find_text_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_atom (unsigned int number, gamgi_atom *atom) { gamgi_text *text; gamgi_dlist *dlist; dlist = atom->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = atom->orbital_start; while (dlist != NULL) { text = gamgi_engine_find_text_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = atom->bond_start; while (dlist != NULL) { text = gamgi_engine_find_text_bond (number, GAMGI_CAST_BOND dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_direction (unsigned int number, gamgi_direction *direction) { gamgi_text *text; gamgi_dlist *dlist; dlist = direction->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = direction->orbital_start; while (dlist != NULL) { text = gamgi_engine_find_text_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = direction->atom_start; while (dlist != NULL) { text = gamgi_engine_find_text_atom (number, GAMGI_CAST_ATOM dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_plane (unsigned int number, gamgi_plane *plane) { gamgi_text *text; gamgi_dlist *dlist; dlist = plane->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = plane->orbital_start; while (dlist != NULL) { text = gamgi_engine_find_text_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = plane->atom_start; while (dlist != NULL) { text = gamgi_engine_find_text_atom (number, GAMGI_CAST_ATOM dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = plane->direction_start; while (dlist != NULL) { text = gamgi_engine_find_text_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_group (unsigned int number, gamgi_group *group) { gamgi_text *text; gamgi_dlist *dlist; dlist = group->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = group->orbital_start; while (dlist != NULL) { text = gamgi_engine_find_text_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = group->atom_start; while (dlist != NULL) { text = gamgi_engine_find_text_atom (number, GAMGI_CAST_ATOM dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = group->direction_start; while (dlist != NULL) { text = gamgi_engine_find_text_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = group->plane_start; while (dlist != NULL) { text = gamgi_engine_find_text_plane (number, GAMGI_CAST_PLANE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = group->group_start; while (dlist != NULL) { text = gamgi_engine_find_text_group (number, GAMGI_CAST_GROUP dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_molecule (unsigned int number, gamgi_molecule *molecule) { gamgi_text *text; gamgi_dlist *dlist; dlist = molecule->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = molecule->orbital_start; while (dlist != NULL) { text = gamgi_engine_find_text_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = molecule->atom_start; while (dlist != NULL) { text = gamgi_engine_find_text_atom (number, GAMGI_CAST_ATOM dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = molecule->direction_start; while (dlist != NULL) { text = gamgi_engine_find_text_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = molecule->plane_start; while (dlist != NULL) { text = gamgi_engine_find_text_plane (number, GAMGI_CAST_PLANE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = molecule->group_start; while (dlist != NULL) { text = gamgi_engine_find_text_group (number, GAMGI_CAST_GROUP dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_cluster (unsigned int number, gamgi_cluster *cluster) { gamgi_text *text; gamgi_dlist *dlist; dlist = cluster->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cluster->orbital_start; while (dlist != NULL) { text = gamgi_engine_find_text_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cluster->atom_start; while (dlist != NULL) { text = gamgi_engine_find_text_atom (number, GAMGI_CAST_ATOM dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cluster->direction_start; while (dlist != NULL) { text = gamgi_engine_find_text_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cluster->plane_start; while (dlist != NULL) { text = gamgi_engine_find_text_plane (number, GAMGI_CAST_PLANE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cluster->group_start; while (dlist != NULL) { text = gamgi_engine_find_text_group (number, GAMGI_CAST_GROUP dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cluster->molecule_start; while (dlist != NULL) { text = gamgi_engine_find_text_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cluster->cluster_start; while (dlist != NULL) { text = gamgi_engine_find_text_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_cell (unsigned int number, gamgi_cell *cell) { gamgi_text *text; gamgi_dlist *dlist; dlist = cell->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cell->orbital_start; while (dlist != NULL) { text = gamgi_engine_find_text_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cell->atom_start; while (dlist != NULL) { text = gamgi_engine_find_text_atom (number, GAMGI_CAST_ATOM dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cell->direction_start; while (dlist != NULL) { text = gamgi_engine_find_text_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cell->plane_start; while (dlist != NULL) { text = gamgi_engine_find_text_plane (number, GAMGI_CAST_PLANE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cell->group_start; while (dlist != NULL) { text = gamgi_engine_find_text_group (number, GAMGI_CAST_GROUP dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cell->molecule_start; while (dlist != NULL) { text = gamgi_engine_find_text_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = cell->cluster_start; while (dlist != NULL) { text = gamgi_engine_find_text_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_arrow (unsigned int number, gamgi_arrow *arrow) { gamgi_text *text; gamgi_dlist *dlist; dlist = arrow->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_shape (unsigned int number, gamgi_shape *shape) { gamgi_text *text; gamgi_dlist *dlist; dlist = shape->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_graph (unsigned int number, gamgi_graph *graph) { gamgi_text *text; gamgi_dlist *dlist; dlist = graph->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_text *text; gamgi_dlist *dlist; dlist = assembly->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->orbital_start; while (dlist != NULL) { text = gamgi_engine_find_text_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->atom_start; while (dlist != NULL) { text = gamgi_engine_find_text_atom (number, GAMGI_CAST_ATOM dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->direction_start; while (dlist != NULL) { text = gamgi_engine_find_text_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->plane_start; while (dlist != NULL) { text = gamgi_engine_find_text_plane (number, GAMGI_CAST_PLANE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->group_start; while (dlist != NULL) { text = gamgi_engine_find_text_group (number, GAMGI_CAST_GROUP dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->molecule_start; while (dlist != NULL) { text = gamgi_engine_find_text_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->cluster_start; while (dlist != NULL) { text = gamgi_engine_find_text_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->cell_start; while (dlist != NULL) { text = gamgi_engine_find_text_cell (number, GAMGI_CAST_CELL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->arrow_start; while (dlist != NULL) { text = gamgi_engine_find_text_arrow (number, GAMGI_CAST_ARROW dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->shape_start; while (dlist != NULL) { text = gamgi_engine_find_text_shape (number, GAMGI_CAST_SHAPE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->graph_start; while (dlist != NULL) { text = gamgi_engine_find_text_graph (number, GAMGI_CAST_GRAPH dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = assembly->assembly_start; while (dlist != NULL) { text = gamgi_engine_find_text_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_layer (unsigned int number, gamgi_layer *layer) { gamgi_text *text; gamgi_dlist *dlist; dlist = layer->text_start; while (dlist != NULL) { text = gamgi_engine_find_text_text (number, GAMGI_CAST_TEXT dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->orbital_start; while (dlist != NULL) { text = gamgi_engine_find_text_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->atom_start; while (dlist != NULL) { text = gamgi_engine_find_text_atom (number, GAMGI_CAST_ATOM dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->direction_start; while (dlist != NULL) { text = gamgi_engine_find_text_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->plane_start; while (dlist != NULL) { text = gamgi_engine_find_text_plane (number, GAMGI_CAST_PLANE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->group_start; while (dlist != NULL) { text = gamgi_engine_find_text_group (number, GAMGI_CAST_GROUP dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->molecule_start; while (dlist != NULL) { text = gamgi_engine_find_text_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->cluster_start; while (dlist != NULL) { text = gamgi_engine_find_text_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->cell_start; while (dlist != NULL) { text = gamgi_engine_find_text_cell (number, GAMGI_CAST_CELL dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->arrow_start; while (dlist != NULL) { text = gamgi_engine_find_text_arrow (number, GAMGI_CAST_ARROW dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->shape_start; while (dlist != NULL) { text = gamgi_engine_find_text_shape (number, GAMGI_CAST_SHAPE dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->graph_start; while (dlist != NULL) { text = gamgi_engine_find_text_graph (number, GAMGI_CAST_GRAPH dlist->data); if (text != NULL) return text; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { text = gamgi_engine_find_text_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_window (unsigned int number, gamgi_window *window) { gamgi_text *text; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { text = gamgi_engine_find_text_layer (number, GAMGI_CAST_LAYER dlist->data); if (text != NULL) return text; dlist = dlist->next; } return NULL; } gamgi_text *gamgi_engine_find_text_gamgi (unsigned int number) { gamgi_window *window; gamgi_text *text; window = gamgi->window_start; while (window != NULL) { text = gamgi_engine_find_text_window (number, window); if (text != NULL) return text; window = window->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_orbital (unsigned int number, gamgi_orbital *orbital) { if (orbital->object.number == number) return orbital; return NULL; } gamgi_orbital *gamgi_engine_find_orbital_bond (unsigned int number, gamgi_bond *bond) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = bond->orbital_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_atom (unsigned int number, gamgi_atom *atom) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = atom->orbital_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = atom->bond_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_bond (number, GAMGI_CAST_BOND dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_direction (unsigned int number, gamgi_direction *direction) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = direction->orbital_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = direction->atom_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_atom (number, GAMGI_CAST_ATOM dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_plane (unsigned int number, gamgi_plane *plane) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = plane->orbital_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = plane->atom_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_atom (number, GAMGI_CAST_ATOM dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = plane->direction_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_group (unsigned int number, gamgi_group *group) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = group->orbital_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = group->atom_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_atom (number, GAMGI_CAST_ATOM dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = group->direction_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = group->plane_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_plane (number, GAMGI_CAST_PLANE dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = group->group_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_group (number, GAMGI_CAST_GROUP dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_molecule (unsigned int number, gamgi_molecule *molecule) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = molecule->orbital_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = molecule->atom_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_atom (number, GAMGI_CAST_ATOM dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = molecule->direction_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = molecule->plane_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_plane (number, GAMGI_CAST_PLANE dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = molecule->group_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_group (number, GAMGI_CAST_GROUP dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_cluster (unsigned int number, gamgi_cluster *cluster) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = cluster->orbital_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cluster->atom_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_atom (number, GAMGI_CAST_ATOM dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cluster->direction_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cluster->plane_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_plane (number, GAMGI_CAST_PLANE dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cluster->group_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_group (number, GAMGI_CAST_GROUP dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cluster->molecule_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cluster->cluster_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_cell (unsigned int number, gamgi_cell *cell) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = cell->orbital_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cell->atom_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_atom (number, GAMGI_CAST_ATOM dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cell->direction_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cell->plane_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_plane (number, GAMGI_CAST_PLANE dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cell->group_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_group (number, GAMGI_CAST_GROUP dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cell->molecule_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = cell->cluster_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = assembly->orbital_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = assembly->atom_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_atom (number, GAMGI_CAST_ATOM dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = assembly->direction_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = assembly->plane_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_plane (number, GAMGI_CAST_PLANE dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = assembly->group_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_group (number, GAMGI_CAST_GROUP dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = assembly->molecule_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = assembly->cluster_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = assembly->cell_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_cell (number, GAMGI_CAST_CELL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = assembly->assembly_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_layer (unsigned int number, gamgi_layer *layer) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = layer->orbital_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_orbital (number, GAMGI_CAST_ORBITAL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = layer->atom_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_atom (number, GAMGI_CAST_ATOM dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = layer->direction_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = layer->plane_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_plane (number, GAMGI_CAST_PLANE dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = layer->group_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_group (number, GAMGI_CAST_GROUP dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = layer->molecule_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = layer->cluster_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = layer->cell_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_cell (number, GAMGI_CAST_CELL dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_window (unsigned int number, gamgi_window *window) { gamgi_orbital *orbital; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { orbital = gamgi_engine_find_orbital_layer (number, GAMGI_CAST_LAYER dlist->data); if (orbital != NULL) return orbital; dlist = dlist->next; } return NULL; } gamgi_orbital *gamgi_engine_find_orbital_gamgi (unsigned int number) { gamgi_window *window; gamgi_orbital *orbital; window = gamgi->window_start; while (window != NULL) { orbital = gamgi_engine_find_orbital_window (number, window); if (orbital != NULL) return orbital; window = window->next; } return NULL; } gamgi_atom *gamgi_engine_find_atom_atom (unsigned int number, gamgi_atom *atom) { if (atom->object.number == number) return atom; return NULL; } gamgi_atom *gamgi_engine_find_atom_direction (unsigned int number, gamgi_direction *direction) { gamgi_atom *atom; gamgi_dlist *dlist; dlist = direction->atom_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_atom (number, GAMGI_CAST_ATOM dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } return NULL; } gamgi_atom *gamgi_engine_find_atom_plane (unsigned int number, gamgi_plane *plane) { gamgi_atom *atom; gamgi_dlist *dlist; dlist = plane->atom_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_atom (number, GAMGI_CAST_ATOM dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = plane->direction_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } return NULL; } gamgi_atom *gamgi_engine_find_atom_group (unsigned int number, gamgi_group *group) { gamgi_atom *atom; gamgi_dlist *dlist; dlist = group->atom_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_atom (number, GAMGI_CAST_ATOM dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = group->direction_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = group->plane_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_plane (number, GAMGI_CAST_PLANE dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = group->group_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_group (number, GAMGI_CAST_GROUP dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } return NULL; } gamgi_atom *gamgi_engine_find_atom_molecule (unsigned int number, gamgi_molecule *molecule) { gamgi_atom *atom; gamgi_dlist *dlist; dlist = molecule->atom_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_atom (number, GAMGI_CAST_ATOM dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = molecule->direction_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = molecule->plane_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_plane (number, GAMGI_CAST_PLANE dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = molecule->group_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_group (number, GAMGI_CAST_GROUP dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } return NULL; } gamgi_atom *gamgi_engine_find_atom_cluster (unsigned int number, gamgi_cluster *cluster) { gamgi_atom *atom; gamgi_dlist *dlist; dlist = cluster->atom_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_atom (number, GAMGI_CAST_ATOM dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = cluster->direction_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = cluster->plane_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_plane (number, GAMGI_CAST_PLANE dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = cluster->group_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_group (number, GAMGI_CAST_GROUP dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = cluster->molecule_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = cluster->cluster_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } return NULL; } gamgi_atom *gamgi_engine_find_atom_cell (unsigned int number, gamgi_cell *cell) { gamgi_atom *atom; gamgi_dlist *dlist; dlist = cell->atom_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_atom (number, GAMGI_CAST_ATOM dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = cell->direction_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = cell->plane_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_plane (number, GAMGI_CAST_PLANE dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = cell->group_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_group (number, GAMGI_CAST_GROUP dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = cell->molecule_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = cell->cluster_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } return NULL; } gamgi_atom *gamgi_engine_find_atom_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_atom *atom; gamgi_dlist *dlist; dlist = assembly->atom_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_atom (number, GAMGI_CAST_ATOM dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = assembly->direction_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = assembly->plane_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_plane (number, GAMGI_CAST_PLANE dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = assembly->group_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_group (number, GAMGI_CAST_GROUP dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = assembly->molecule_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = assembly->cluster_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = assembly->cell_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_cell (number, GAMGI_CAST_CELL dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = assembly->assembly_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } return NULL; } gamgi_atom *gamgi_engine_find_atom_layer (unsigned int number, gamgi_layer *layer) { gamgi_atom *atom; gamgi_dlist *dlist; dlist = layer->atom_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_atom (number, GAMGI_CAST_ATOM dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = layer->direction_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = layer->plane_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_plane (number, GAMGI_CAST_PLANE dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = layer->group_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_group (number, GAMGI_CAST_GROUP dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = layer->molecule_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = layer->cluster_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = layer->cell_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_cell (number, GAMGI_CAST_CELL dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } return NULL; } gamgi_atom *gamgi_engine_find_atom_window (unsigned int number, gamgi_window *window) { gamgi_atom *atom; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { atom = gamgi_engine_find_atom_layer (number, GAMGI_CAST_LAYER dlist->data); if (atom != NULL) return atom; dlist = dlist->next; } return NULL; } gamgi_atom *gamgi_engine_find_atom_gamgi (unsigned int number) { gamgi_window *window; gamgi_atom *atom; window = gamgi->window_start; while (window != NULL) { atom = gamgi_engine_find_atom_window (number, window); if (atom != NULL) return atom; window = window->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_atom (unsigned int number, gamgi_atom *atom) { gamgi_bond *bond; gamgi_dlist *dlist; dlist = atom->bond_start; while (dlist != NULL) { bond = GAMGI_CAST_BOND dlist->data; if (bond->object.number == number) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_direction (unsigned int number, gamgi_direction *direction) { gamgi_bond *bond; gamgi_dlist *dlist; dlist = direction->atom_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_atom (number, GAMGI_CAST_ATOM dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_plane (unsigned int number, gamgi_plane *plane) { gamgi_bond *bond; gamgi_dlist *dlist; dlist = plane->atom_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_atom (number, GAMGI_CAST_ATOM dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = plane->direction_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_group (unsigned int number, gamgi_group *group) { gamgi_bond *bond; gamgi_dlist *dlist; dlist = group->atom_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_atom (number, GAMGI_CAST_ATOM dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = group->direction_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = group->plane_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_plane (number, GAMGI_CAST_PLANE dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = group->group_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_group (number, GAMGI_CAST_GROUP dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_molecule (unsigned int number, gamgi_molecule *molecule) { gamgi_bond *bond; gamgi_dlist *dlist; dlist = molecule->atom_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_atom (number, GAMGI_CAST_ATOM dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = molecule->direction_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = molecule->plane_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_plane (number, GAMGI_CAST_PLANE dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = molecule->group_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_group (number, GAMGI_CAST_GROUP dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_cluster (unsigned int number, gamgi_cluster *cluster) { gamgi_bond *bond; gamgi_dlist *dlist; dlist = cluster->atom_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_atom (number, GAMGI_CAST_ATOM dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = cluster->direction_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = cluster->plane_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_plane (number, GAMGI_CAST_PLANE dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = cluster->group_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_group (number, GAMGI_CAST_GROUP dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = cluster->molecule_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = cluster->cluster_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_cell (unsigned int number, gamgi_cell *cell) { gamgi_bond *bond; gamgi_dlist *dlist; dlist = cell->atom_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_atom (number, GAMGI_CAST_ATOM dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = cell->direction_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = cell->plane_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_plane (number, GAMGI_CAST_PLANE dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = cell->group_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_group (number, GAMGI_CAST_GROUP dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = cell->molecule_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = cell->cluster_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_bond *bond; gamgi_dlist *dlist; dlist = assembly->atom_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_atom (number, GAMGI_CAST_ATOM dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = assembly->direction_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = assembly->plane_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_plane (number, GAMGI_CAST_PLANE dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = assembly->group_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_group (number, GAMGI_CAST_GROUP dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = assembly->molecule_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = assembly->cluster_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = assembly->cell_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_cell (number, GAMGI_CAST_CELL dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = assembly->assembly_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_layer (unsigned int number, gamgi_layer *layer) { gamgi_bond *bond; gamgi_dlist *dlist; dlist = layer->atom_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_atom (number, GAMGI_CAST_ATOM dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = layer->direction_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = layer->plane_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_plane (number, GAMGI_CAST_PLANE dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = layer->group_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_group (number, GAMGI_CAST_GROUP dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = layer->molecule_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = layer->cluster_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = layer->cell_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_cell (number, GAMGI_CAST_CELL dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_window (unsigned int number, gamgi_window *window) { gamgi_bond *bond; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { bond = gamgi_engine_find_bond_layer (number, GAMGI_CAST_LAYER dlist->data); if (bond != NULL) return bond; dlist = dlist->next; } return NULL; } gamgi_bond *gamgi_engine_find_bond_gamgi (unsigned int number) { gamgi_window *window; gamgi_bond *bond; window = gamgi->window_start; while (window != NULL) { bond = gamgi_engine_find_bond_window (number, window); if (bond != NULL) return bond; window = window->next; } return NULL; } gamgi_direction *gamgi_engine_find_direction_direction (unsigned int number, gamgi_direction *direction) { if (direction->object.number == number) return direction; return NULL; } gamgi_direction *gamgi_engine_find_direction_plane (unsigned int number, gamgi_plane *plane) { gamgi_direction *direction; gamgi_dlist *dlist; dlist = plane->direction_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } return NULL; } gamgi_direction *gamgi_engine_find_direction_group (unsigned int number, gamgi_group *group) { gamgi_direction *direction; gamgi_dlist *dlist; dlist = group->direction_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = group->plane_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_plane (number, GAMGI_CAST_PLANE dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = group->group_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_group (number, GAMGI_CAST_GROUP dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } return NULL; } gamgi_direction *gamgi_engine_find_direction_molecule (unsigned int number, gamgi_molecule *molecule) { gamgi_direction *direction; gamgi_dlist *dlist; dlist = molecule->direction_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = molecule->plane_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_plane (number, GAMGI_CAST_PLANE dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = molecule->group_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_group (number, GAMGI_CAST_GROUP dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } return NULL; } gamgi_direction *gamgi_engine_find_direction_cluster (unsigned int number, gamgi_cluster *cluster) { gamgi_direction *direction; gamgi_dlist *dlist; dlist = cluster->direction_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = cluster->plane_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_plane (number, GAMGI_CAST_PLANE dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = cluster->group_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_group (number, GAMGI_CAST_GROUP dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = cluster->molecule_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = cluster->cluster_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } return NULL; } gamgi_direction *gamgi_engine_find_direction_cell (unsigned int number, gamgi_cell *cell) { gamgi_direction *direction; gamgi_dlist *dlist; dlist = cell->direction_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = cell->plane_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_plane (number, GAMGI_CAST_PLANE dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = cell->group_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_group (number, GAMGI_CAST_GROUP dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = cell->molecule_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = cell->cluster_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } return NULL; } gamgi_direction *gamgi_engine_find_direction_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_direction *direction; gamgi_dlist *dlist; dlist = assembly->direction_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = assembly->plane_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_plane (number, GAMGI_CAST_PLANE dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = assembly->group_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_group (number, GAMGI_CAST_GROUP dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = assembly->molecule_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = assembly->cluster_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = assembly->cell_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_cell (number, GAMGI_CAST_CELL dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = assembly->assembly_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } return NULL; } gamgi_direction *gamgi_engine_find_direction_layer (unsigned int number, gamgi_layer *layer) { gamgi_direction *direction; gamgi_dlist *dlist; dlist = layer->direction_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_direction (number, GAMGI_CAST_DIRECTION dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = layer->plane_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_plane (number, GAMGI_CAST_PLANE dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = layer->group_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_group (number, GAMGI_CAST_GROUP dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = layer->molecule_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = layer->cluster_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = layer->cell_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_cell (number, GAMGI_CAST_CELL dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } return NULL; } gamgi_direction *gamgi_engine_find_direction_window (unsigned int number, gamgi_window *window) { gamgi_direction *direction; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { direction = gamgi_engine_find_direction_layer (number, GAMGI_CAST_LAYER dlist->data); if (direction != NULL) return direction; dlist = dlist->next; } return NULL; } gamgi_direction *gamgi_engine_find_direction_gamgi (unsigned int number) { gamgi_window *window; gamgi_direction *direction; window = gamgi->window_start; while (window != NULL) { direction = gamgi_engine_find_direction_window (number, window); if (direction != NULL) return direction; window = window->next; } return NULL; } gamgi_plane *gamgi_engine_find_plane_plane (unsigned int number, gamgi_plane *plane) { if (plane->object.number == number) return plane; return NULL; } gamgi_plane *gamgi_engine_find_plane_group (unsigned int number, gamgi_group *group) { gamgi_plane *plane; gamgi_dlist *dlist; dlist = group->plane_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_plane (number, GAMGI_CAST_PLANE dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = group->group_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_group (number, GAMGI_CAST_GROUP dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } return NULL; } gamgi_plane *gamgi_engine_find_plane_molecule (unsigned int number, gamgi_molecule *molecule) { gamgi_plane *plane; gamgi_dlist *dlist; dlist = molecule->plane_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_plane (number, GAMGI_CAST_PLANE dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = molecule->group_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_group (number, GAMGI_CAST_GROUP dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } return NULL; } gamgi_plane *gamgi_engine_find_plane_cluster (unsigned int number, gamgi_cluster *cluster) { gamgi_plane *plane; gamgi_dlist *dlist; dlist = cluster->plane_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_plane (number, GAMGI_CAST_PLANE dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = cluster->group_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_group (number, GAMGI_CAST_GROUP dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = cluster->molecule_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = cluster->cluster_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } return NULL; } gamgi_plane *gamgi_engine_find_plane_cell (unsigned int number, gamgi_cell *cell) { gamgi_plane *plane; gamgi_dlist *dlist; dlist = cell->plane_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_plane (number, GAMGI_CAST_PLANE dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = cell->group_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_group (number, GAMGI_CAST_GROUP dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = cell->molecule_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = cell->cluster_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } return NULL; } gamgi_plane *gamgi_engine_find_plane_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_plane *plane; gamgi_dlist *dlist; dlist = assembly->plane_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_plane (number, GAMGI_CAST_PLANE dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = assembly->group_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_group (number, GAMGI_CAST_GROUP dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = assembly->molecule_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = assembly->cluster_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = assembly->cell_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_cell (number, GAMGI_CAST_CELL dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = assembly->assembly_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } return NULL; } gamgi_plane *gamgi_engine_find_plane_layer (unsigned int number, gamgi_layer *layer) { gamgi_plane *plane; gamgi_dlist *dlist; dlist = layer->plane_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_plane (number, GAMGI_CAST_PLANE dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = layer->group_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_group (number, GAMGI_CAST_GROUP dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = layer->molecule_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = layer->cluster_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = layer->cell_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_cell (number, GAMGI_CAST_CELL dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } return NULL; } gamgi_plane *gamgi_engine_find_plane_window (unsigned int number, gamgi_window *window) { gamgi_plane *plane; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { plane = gamgi_engine_find_plane_layer (number, GAMGI_CAST_LAYER dlist->data); if (plane != NULL) return plane; dlist = dlist->next; } return NULL; } gamgi_plane *gamgi_engine_find_plane_gamgi (unsigned int number) { gamgi_window *window; gamgi_plane *plane; window = gamgi->window_start; while (window != NULL) { plane = gamgi_engine_find_plane_window (number, window); if (plane != NULL) return plane; window = window->next; } return NULL; } gamgi_group *gamgi_engine_find_group_group (unsigned int number, gamgi_group *group) { gamgi_group *new_group; gamgi_dlist *dlist; if (group->object.number == number) return group; dlist = group->group_start; while (dlist != NULL) { new_group = gamgi_engine_find_group_group (number, GAMGI_CAST_GROUP dlist->data); if (new_group != NULL) return new_group; dlist = dlist->next; } return NULL; } gamgi_group *gamgi_engine_find_group_molecule (unsigned int number, gamgi_molecule *molecule) { gamgi_group *group; gamgi_dlist *dlist; dlist = molecule->group_start; while (dlist != NULL) { group = gamgi_engine_find_group_group (number, GAMGI_CAST_GROUP dlist->data); if (group != NULL) return group; dlist = dlist->next; } return NULL; } gamgi_group *gamgi_engine_find_group_cluster (unsigned int number, gamgi_cluster *cluster) { gamgi_group *group; gamgi_dlist *dlist; dlist = cluster->group_start; while (dlist != NULL) { group = gamgi_engine_find_group_group (number, GAMGI_CAST_GROUP dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = cluster->molecule_start; while (dlist != NULL) { group = gamgi_engine_find_group_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = cluster->cluster_start; while (dlist != NULL) { group = gamgi_engine_find_group_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (group != NULL) return group; dlist = dlist->next; } return NULL; } gamgi_group *gamgi_engine_find_group_cell (unsigned int number, gamgi_cell *cell) { gamgi_group *group; gamgi_dlist *dlist; dlist = cell->group_start; while (dlist != NULL) { group = gamgi_engine_find_group_group (number, GAMGI_CAST_GROUP dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = cell->molecule_start; while (dlist != NULL) { group = gamgi_engine_find_group_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = cell->cluster_start; while (dlist != NULL) { group = gamgi_engine_find_group_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (group != NULL) return group; dlist = dlist->next; } return NULL; } gamgi_group *gamgi_engine_find_group_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_group *group; gamgi_dlist *dlist; dlist = assembly->group_start; while (dlist != NULL) { group = gamgi_engine_find_group_group (number, GAMGI_CAST_GROUP dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = assembly->molecule_start; while (dlist != NULL) { group = gamgi_engine_find_group_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = assembly->cluster_start; while (dlist != NULL) { group = gamgi_engine_find_group_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = assembly->cell_start; while (dlist != NULL) { group = gamgi_engine_find_group_cell (number, GAMGI_CAST_CELL dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = assembly->assembly_start; while (dlist != NULL) { group = gamgi_engine_find_group_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (group != NULL) return group; dlist = dlist->next; } return NULL; } gamgi_group *gamgi_engine_find_group_layer (unsigned int number, gamgi_layer *layer) { gamgi_group *group; gamgi_dlist *dlist; dlist = layer->group_start; while (dlist != NULL) { group = gamgi_engine_find_group_group (number, GAMGI_CAST_GROUP dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = layer->molecule_start; while (dlist != NULL) { group = gamgi_engine_find_group_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = layer->cluster_start; while (dlist != NULL) { group = gamgi_engine_find_group_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = layer->cell_start; while (dlist != NULL) { group = gamgi_engine_find_group_cell (number, GAMGI_CAST_CELL dlist->data); if (group != NULL) return group; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { group = gamgi_engine_find_group_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (group != NULL) return group; dlist = dlist->next; } return NULL; } gamgi_group *gamgi_engine_find_group_window (unsigned int number, gamgi_window *window) { gamgi_group *group; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { group = gamgi_engine_find_group_layer (number, GAMGI_CAST_LAYER dlist->data); if (group != NULL) return group; dlist = dlist->next; } return NULL; } gamgi_group *gamgi_engine_find_group_gamgi (unsigned int number) { gamgi_window *window; gamgi_group *group; window = gamgi->window_start; while (window != NULL) { group = gamgi_engine_find_group_window (number, window); if (group != NULL) return group; window = window->next; } return NULL; } gamgi_molecule *gamgi_engine_find_molecule_molecule (unsigned int number, gamgi_molecule *molecule) { if (molecule->object.number == number) return molecule; return NULL; } gamgi_molecule *gamgi_engine_find_molecule_cluster (unsigned int number, gamgi_cluster *cluster) { gamgi_molecule *molecule; gamgi_dlist *dlist; dlist = cluster->molecule_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } dlist = cluster->cluster_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } return NULL; } gamgi_molecule *gamgi_engine_find_molecule_cell (unsigned int number, gamgi_cell *cell) { gamgi_molecule *molecule; gamgi_dlist *dlist; dlist = cell->molecule_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } dlist = cell->cluster_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } return NULL; } gamgi_molecule *gamgi_engine_find_molecule_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_molecule *molecule; gamgi_dlist *dlist; dlist = assembly->molecule_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } dlist = assembly->cluster_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } dlist = assembly->cell_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_cell (number, GAMGI_CAST_CELL dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } dlist = assembly->assembly_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } return NULL; } gamgi_molecule *gamgi_engine_find_molecule_layer (unsigned int number, gamgi_layer *layer) { gamgi_molecule *molecule; gamgi_dlist *dlist; dlist = layer->molecule_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_molecule (number, GAMGI_CAST_MOLECULE dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } dlist = layer->cluster_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } dlist = layer->cell_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_cell (number, GAMGI_CAST_CELL dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } return NULL; } gamgi_molecule *gamgi_engine_find_molecule_window (unsigned int number, gamgi_window *window) { gamgi_molecule *molecule; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { molecule = gamgi_engine_find_molecule_layer (number, GAMGI_CAST_LAYER dlist->data); if (molecule != NULL) return molecule; dlist = dlist->next; } return NULL; } gamgi_molecule *gamgi_engine_find_molecule_gamgi (unsigned int number) { gamgi_window *window; gamgi_molecule *molecule; window = gamgi->window_start; while (window != NULL) { molecule = gamgi_engine_find_molecule_window (number, window); if (molecule != NULL) return molecule; window = window->next; } return NULL; } gamgi_cluster *gamgi_engine_find_cluster_cluster (unsigned int number, gamgi_cluster *cluster) { gamgi_cluster *cluster_child; gamgi_dlist *dlist; if (cluster->object.number == number) return cluster; dlist = cluster->cluster_start; while (dlist != NULL) { cluster_child = gamgi_engine_find_cluster_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (cluster_child != NULL) return cluster_child; dlist = dlist->next; } return NULL; } gamgi_cluster *gamgi_engine_find_cluster_cell (unsigned int number, gamgi_cell *cell) { gamgi_cluster *cluster; gamgi_dlist *dlist; dlist = cell->cluster_start; while (dlist != NULL) { cluster = gamgi_engine_find_cluster_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (cluster != NULL) return cluster; dlist = dlist->next; } return NULL; } gamgi_cluster *gamgi_engine_find_cluster_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_cluster *cluster; gamgi_dlist *dlist; dlist = assembly->cluster_start; while (dlist != NULL) { cluster = gamgi_engine_find_cluster_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (cluster != NULL) return cluster; dlist = dlist->next; } dlist = assembly->cell_start; while (dlist != NULL) { cluster = gamgi_engine_find_cluster_cell (number, GAMGI_CAST_CELL dlist->data); if (cluster != NULL) return cluster; dlist = dlist->next; } dlist = assembly->assembly_start; while (dlist != NULL) { cluster = gamgi_engine_find_cluster_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (cluster != NULL) return cluster; dlist = dlist->next; } return NULL; } gamgi_cluster *gamgi_engine_find_cluster_layer (unsigned int number, gamgi_layer *layer) { gamgi_cluster *cluster; gamgi_dlist *dlist; dlist = layer->cluster_start; while (dlist != NULL) { cluster = gamgi_engine_find_cluster_cluster (number, GAMGI_CAST_CLUSTER dlist->data); if (cluster != NULL) return cluster; dlist = dlist->next; } dlist = layer->cell_start; while (dlist != NULL) { cluster = gamgi_engine_find_cluster_cell (number, GAMGI_CAST_CELL dlist->data); if (cluster != NULL) return cluster; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { cluster = gamgi_engine_find_cluster_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (cluster != NULL) return cluster; dlist = dlist->next; } return NULL; } gamgi_cluster *gamgi_engine_find_cluster_window (unsigned int number, gamgi_window *window) { gamgi_cluster *cluster; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { cluster = gamgi_engine_find_cluster_layer (number, GAMGI_CAST_LAYER dlist->data); if (cluster != NULL) return cluster; dlist = dlist->next; } return NULL; } gamgi_cluster *gamgi_engine_find_cluster_gamgi (unsigned int number) { gamgi_window *window; gamgi_cluster *cluster; window = gamgi->window_start; while (window != NULL) { cluster = gamgi_engine_find_cluster_window (number, window); if (cluster != NULL) return cluster; window = window->next; } return NULL; } gamgi_cell *gamgi_engine_find_cell_cell (unsigned int number, gamgi_cell *cell) { if (cell->object.number == number) return cell; return NULL; } gamgi_cell *gamgi_engine_find_cell_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_cell *cell; gamgi_dlist *dlist; dlist = assembly->cell_start; while (dlist != NULL) { cell = gamgi_engine_find_cell_cell (number, GAMGI_CAST_CELL dlist->data); if (cell != NULL) return cell; dlist = dlist->next; } dlist = assembly->assembly_start; while (dlist != NULL) { cell = gamgi_engine_find_cell_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (cell != NULL) return cell; dlist = dlist->next; } return NULL; } gamgi_cell *gamgi_engine_find_cell_layer (unsigned int number, gamgi_layer *layer) { gamgi_cell *cell; gamgi_dlist *dlist; dlist = layer->cell_start; while (dlist != NULL) { cell = gamgi_engine_find_cell_cell (number, GAMGI_CAST_CELL dlist->data); if (cell != NULL) return cell; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { cell = gamgi_engine_find_cell_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (cell != NULL) return cell; dlist = dlist->next; } return NULL; } gamgi_cell *gamgi_engine_find_cell_window (unsigned int number, gamgi_window *window) { gamgi_cell *cell; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { cell = gamgi_engine_find_cell_layer (number, GAMGI_CAST_LAYER dlist->data); if (cell != NULL) return cell; dlist = dlist->next; } return NULL; } gamgi_cell *gamgi_engine_find_cell_gamgi (unsigned int number) { gamgi_window *window; gamgi_cell *cell; window = gamgi->window_start; while (window != NULL) { cell = gamgi_engine_find_cell_window (number, window); if (cell != NULL) return cell; window = window->next; } return NULL; } gamgi_arrow *gamgi_engine_find_arrow_arrow (unsigned int number, gamgi_arrow *arrow) { if (arrow->object.number == number) return arrow; return NULL; } gamgi_arrow *gamgi_engine_find_arrow_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_arrow *arrow; gamgi_dlist *dlist; dlist = assembly->arrow_start; while (dlist != NULL) { arrow = gamgi_engine_find_arrow_arrow (number, GAMGI_CAST_ARROW dlist->data); if (arrow != NULL) return arrow; dlist = dlist->next; } return NULL; } gamgi_arrow *gamgi_engine_find_arrow_layer (unsigned int number, gamgi_layer *layer) { gamgi_arrow *arrow; gamgi_dlist *dlist; dlist = layer->arrow_start; while (dlist != NULL) { arrow = gamgi_engine_find_arrow_arrow (number, GAMGI_CAST_ARROW dlist->data); if (arrow != NULL) return arrow; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { arrow = gamgi_engine_find_arrow_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (arrow != NULL) return arrow; dlist = dlist->next; } return NULL; } gamgi_arrow *gamgi_engine_find_arrow_window (unsigned int number, gamgi_window *window) { gamgi_arrow *arrow; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { arrow = gamgi_engine_find_arrow_layer (number, GAMGI_CAST_LAYER dlist->data); if (arrow != NULL) return arrow; dlist = dlist->next; } return NULL; } gamgi_arrow *gamgi_engine_find_arrow_gamgi (unsigned int number) { gamgi_window *window; gamgi_arrow *arrow; window = gamgi->window_start; while (window != NULL) { arrow = gamgi_engine_find_arrow_window (number, window); if (arrow != NULL) return arrow; window = window->next; } return NULL; } gamgi_shape *gamgi_engine_find_shape_shape (unsigned int number, gamgi_shape *shape) { if (shape->object.number == number) return shape; return NULL; } gamgi_shape *gamgi_engine_find_shape_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_shape *shape; gamgi_dlist *dlist; dlist = assembly->shape_start; while (dlist != NULL) { shape = gamgi_engine_find_shape_shape (number, GAMGI_CAST_SHAPE dlist->data); if (shape != NULL) return shape; dlist = dlist->next; } return NULL; } gamgi_shape *gamgi_engine_find_shape_layer (unsigned int number, gamgi_layer *layer) { gamgi_shape *shape; gamgi_dlist *dlist; dlist = layer->shape_start; while (dlist != NULL) { shape = gamgi_engine_find_shape_shape (number, GAMGI_CAST_SHAPE dlist->data); if (shape != NULL) return shape; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { shape = gamgi_engine_find_shape_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (shape != NULL) return shape; dlist = dlist->next; } return NULL; } gamgi_shape *gamgi_engine_find_shape_window (unsigned int number, gamgi_window *window) { gamgi_shape *shape; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { shape = gamgi_engine_find_shape_layer (number, GAMGI_CAST_LAYER dlist->data); if (shape != NULL) return shape; dlist = dlist->next; } return NULL; } gamgi_shape *gamgi_engine_find_shape_gamgi (unsigned int number) { gamgi_window *window; gamgi_shape *shape; window = gamgi->window_start; while (window != NULL) { shape = gamgi_engine_find_shape_window (number, window); if (shape != NULL) return shape; window = window->next; } return NULL; } gamgi_graph *gamgi_engine_find_graph_graph (unsigned int number, gamgi_graph *graph) { if (graph->object.number == number) return graph; return NULL; } gamgi_graph *gamgi_engine_find_graph_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_graph *graph; gamgi_dlist *dlist; dlist = assembly->graph_start; while (dlist != NULL) { graph = gamgi_engine_find_graph_graph (number, GAMGI_CAST_GRAPH dlist->data); if (graph != NULL) return graph; dlist = dlist->next; } return NULL; } gamgi_graph *gamgi_engine_find_graph_layer (unsigned int number, gamgi_layer *layer) { gamgi_graph *graph; gamgi_dlist *dlist; dlist = layer->graph_start; while (dlist != NULL) { graph = gamgi_engine_find_graph_graph (number, GAMGI_CAST_GRAPH dlist->data); if (graph != NULL) return graph; dlist = dlist->next; } dlist = layer->assembly_start; while (dlist != NULL) { graph = gamgi_engine_find_graph_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (graph != NULL) return graph; dlist = dlist->next; } return NULL; } gamgi_graph *gamgi_engine_find_graph_window (unsigned int number, gamgi_window *window) { gamgi_graph *graph; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { graph = gamgi_engine_find_graph_layer (number, GAMGI_CAST_LAYER dlist->data); if (graph != NULL) return graph; dlist = dlist->next; } return NULL; } gamgi_graph *gamgi_engine_find_graph_gamgi (unsigned int number) { gamgi_window *window; gamgi_graph *graph; window = gamgi->window_start; while (window != NULL) { graph = gamgi_engine_find_graph_window (number, window); if (graph != NULL) return graph; window = window->next; } return NULL; } gamgi_assembly *gamgi_engine_find_assembly_assembly (unsigned int number, gamgi_assembly *assembly) { gamgi_assembly *assembly_child; gamgi_dlist *dlist; if (assembly->object.number == number) return assembly; dlist = assembly->assembly_start; while (dlist != NULL) { assembly_child = gamgi_engine_find_assembly_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (assembly_child != NULL) return assembly_child; dlist = dlist->next; } return NULL; } gamgi_assembly *gamgi_engine_find_assembly_layer (unsigned int number, gamgi_layer *layer) { gamgi_assembly *assembly; gamgi_dlist *dlist; dlist = layer->assembly_start; while (dlist != NULL) { assembly = gamgi_engine_find_assembly_assembly (number, GAMGI_CAST_ASSEMBLY dlist->data); if (assembly != NULL) return assembly; dlist = dlist->next; } return NULL; } gamgi_assembly *gamgi_engine_find_assembly_window (unsigned int number, gamgi_window *window) { gamgi_assembly *assembly; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { assembly = gamgi_engine_find_assembly_layer (number, GAMGI_CAST_LAYER dlist->data); if (assembly != NULL) return assembly; dlist = dlist->next; } return NULL; } gamgi_assembly *gamgi_engine_find_assembly_gamgi (unsigned int number) { gamgi_window *window; gamgi_assembly *assembly; window = gamgi->window_start; while (window != NULL) { assembly = gamgi_engine_find_assembly_window (number, window); if (assembly != NULL) return assembly; window = window->next; } return NULL; } gamgi_light *gamgi_engine_find_light_light (unsigned int number, gamgi_light *light) { if (light->object.number == number) return light; return NULL; } gamgi_light *gamgi_engine_find_light_layer (unsigned int number, gamgi_layer *layer) { gamgi_light *light; gamgi_dlist *dlist; dlist = layer->light_start; while (dlist != NULL) { light = gamgi_engine_find_light_light (number, GAMGI_CAST_LIGHT dlist->data); if (light != NULL) return light; dlist = dlist->next; } return NULL; } gamgi_light *gamgi_engine_find_light_window (unsigned int number, gamgi_window *window) { gamgi_light *light; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { light = gamgi_engine_find_light_layer (number, GAMGI_CAST_LAYER dlist->data); if (light != NULL) return light; dlist = dlist->next; } return NULL; } gamgi_light *gamgi_engine_find_light_gamgi (unsigned int number) { gamgi_window *window; gamgi_light *light; window = gamgi->window_start; while (window != NULL) { light = gamgi_engine_find_light_window (number, window); if (light != NULL) return light; window = window->next; } return NULL; } gamgi_layer *gamgi_engine_find_layer_layer (unsigned int number, gamgi_layer *layer) { if (layer->object.number == number) return layer; return NULL; } gamgi_layer *gamgi_engine_find_layer_window (unsigned int number, gamgi_window *window) { gamgi_layer *layer; gamgi_dlist *dlist; dlist = window->layer_start; while (dlist != NULL) { layer = gamgi_engine_find_layer_layer (number, GAMGI_CAST_LAYER dlist->data); if (layer != NULL) return layer; dlist = dlist->next; } return NULL; } gamgi_layer *gamgi_engine_find_layer_gamgi (unsigned int number) { gamgi_window *window; gamgi_layer *layer; window = gamgi->window_start; while (window != NULL) { layer = gamgi_engine_find_layer_window (number, window); if (layer != NULL) return layer; window = window->next; } return NULL; } gamgi_window *gamgi_engine_find_window_window (unsigned int number, gamgi_window *window) { if (window->object.number == number) return window; return NULL; } gamgi_window *gamgi_engine_find_window_gamgi (unsigned int number) { gamgi_window *window, *new_window; window = gamgi->window_start; while (window != NULL) { new_window = gamgi_engine_find_window_window (number, window); if (new_window != NULL) return new_window; window = window->next; } return NULL; } gamgi-0.17.5/src/engine/gamgi_engine_find.h000066400000000000000000000270731433127522700205250ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_find.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ gamgi_bool gamgi_engine_find_object (gamgi_object *object, gamgi_object *parent); gamgi_layer *gamgi_engine_find_layer (gamgi_object *object); gamgi_window *gamgi_engine_find_window (gamgi_object *object); gamgi_object *gamgi_engine_find_root (gamgi_object *object1, gamgi_object *object2, gamgi_object *scope); gamgi_text *gamgi_engine_find_text_text (unsigned int number, gamgi_text *text); gamgi_text *gamgi_engine_find_text_orbital (unsigned int number, gamgi_orbital *orbital); gamgi_text *gamgi_engine_find_text_bond (unsigned int number, gamgi_bond *bond); gamgi_text *gamgi_engine_find_text_atom (unsigned int number, gamgi_atom *atom); gamgi_text *gamgi_engine_find_text_direction (unsigned int number, gamgi_direction *direction); gamgi_text *gamgi_engine_find_text_plane (unsigned int number, gamgi_plane *plane); gamgi_text *gamgi_engine_find_text_group (unsigned int number, gamgi_group *group); gamgi_text *gamgi_engine_find_text_molecule (unsigned int number, gamgi_molecule *molecule); gamgi_text *gamgi_engine_find_text_cluster (unsigned int number, gamgi_cluster *cluster); gamgi_text *gamgi_engine_find_text_cell (unsigned int number, gamgi_cell *cell); gamgi_text *gamgi_engine_find_text_arrow (unsigned int number, gamgi_arrow *arrow); gamgi_text *gamgi_engine_find_text_shape (unsigned int number, gamgi_shape *shape); gamgi_text *gamgi_engine_find_text_graph (unsigned int number, gamgi_graph *graph); gamgi_text *gamgi_engine_find_text_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_text *gamgi_engine_find_text_layer (unsigned int number, gamgi_layer *layer); gamgi_text *gamgi_engine_find_text_window (unsigned int number, gamgi_window *window); gamgi_text *gamgi_engine_find_text_gamgi (unsigned int number); gamgi_orbital *gamgi_engine_find_orbital_orbital (unsigned int number, gamgi_orbital *orbital); gamgi_orbital *gamgi_engine_find_orbital_bond (unsigned int number, gamgi_bond *bond); gamgi_orbital *gamgi_engine_find_orbital_atom (unsigned int number, gamgi_atom *atom); gamgi_orbital *gamgi_engine_find_orbital_direction (unsigned int number, gamgi_direction *direction); gamgi_orbital *gamgi_engine_find_orbital_plane (unsigned int number, gamgi_plane *plane); gamgi_orbital *gamgi_engine_find_orbital_group (unsigned int number, gamgi_group *group); gamgi_orbital *gamgi_engine_find_orbital_molecule (unsigned int number, gamgi_molecule *molecule); gamgi_orbital *gamgi_engine_find_orbital_cluster (unsigned int number, gamgi_cluster *cluster); gamgi_orbital *gamgi_engine_find_orbital_cell (unsigned int number, gamgi_cell *cell); gamgi_orbital *gamgi_engine_find_orbital_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_orbital *gamgi_engine_find_orbital_layer (unsigned int number, gamgi_layer *layer); gamgi_orbital *gamgi_engine_find_orbital_window (unsigned int number, gamgi_window *window); gamgi_orbital *gamgi_engine_find_orbital_gamgi (unsigned int number); gamgi_atom *gamgi_engine_find_atom_atom (unsigned int number, gamgi_atom *atom); gamgi_atom *gamgi_engine_find_atom_direction (unsigned int number, gamgi_direction *direction); gamgi_atom *gamgi_engine_find_atom_plane (unsigned int number, gamgi_plane *plane); gamgi_atom *gamgi_engine_find_atom_group (unsigned int number, gamgi_group *group); gamgi_atom *gamgi_engine_find_atom_molecule (unsigned int number, gamgi_molecule *molecule); gamgi_atom *gamgi_engine_find_atom_cluster (unsigned int number, gamgi_cluster *cluster); gamgi_atom *gamgi_engine_find_atom_cell (unsigned int number, gamgi_cell *cell); gamgi_atom *gamgi_engine_find_atom_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_atom *gamgi_engine_find_atom_layer (unsigned int number, gamgi_layer *layer); gamgi_atom *gamgi_engine_find_atom_window (unsigned int number, gamgi_window *window); gamgi_atom *gamgi_engine_find_atom_gamgi (unsigned int number); gamgi_bond *gamgi_engine_find_bond_atom (unsigned int number, gamgi_atom *atom); gamgi_bond *gamgi_engine_find_bond_direction (unsigned int number, gamgi_direction *direction); gamgi_bond *gamgi_engine_find_bond_plane (unsigned int number, gamgi_plane *plane); gamgi_bond *gamgi_engine_find_bond_group (unsigned int number, gamgi_group *group); gamgi_bond *gamgi_engine_find_bond_molecule (unsigned int number, gamgi_molecule *molecule); gamgi_bond *gamgi_engine_find_bond_cluster (unsigned int number, gamgi_cluster *cluster); gamgi_bond *gamgi_engine_find_bond_cell (unsigned int number, gamgi_cell *cell); gamgi_bond *gamgi_engine_find_bond_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_bond *gamgi_engine_find_bond_layer (unsigned int number, gamgi_layer *layer); gamgi_bond *gamgi_engine_find_bond_window (unsigned int number, gamgi_window *window); gamgi_bond *gamgi_engine_find_bond_gamgi (unsigned int number); gamgi_direction *gamgi_engine_find_direction_direction (unsigned int number, gamgi_direction *direction); gamgi_direction *gamgi_engine_find_direction_plane (unsigned int number, gamgi_plane *plane); gamgi_direction *gamgi_engine_find_direction_group (unsigned int number, gamgi_group *group); gamgi_direction *gamgi_engine_find_direction_molecule (unsigned int number, gamgi_molecule *molecule); gamgi_direction *gamgi_engine_find_direction_cluster (unsigned int number, gamgi_cluster *cluster); gamgi_direction *gamgi_engine_find_direction_cell (unsigned int number, gamgi_cell *cell); gamgi_direction *gamgi_engine_find_direction_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_direction *gamgi_engine_find_direction_layer (unsigned int number, gamgi_layer *layer); gamgi_direction *gamgi_engine_find_direction_window (unsigned int number, gamgi_window *window); gamgi_direction *gamgi_engine_find_direction_gamgi (unsigned int number); gamgi_plane *gamgi_engine_find_plane_plane (unsigned int number, gamgi_plane *plane); gamgi_plane *gamgi_engine_find_plane_group (unsigned int number, gamgi_group *group); gamgi_plane *gamgi_engine_find_plane_molecule (unsigned int number, gamgi_molecule *molecule); gamgi_plane *gamgi_engine_find_plane_cluster (unsigned int number, gamgi_cluster *cluster); gamgi_plane *gamgi_engine_find_plane_cell (unsigned int number, gamgi_cell *cell); gamgi_plane *gamgi_engine_find_plane_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_plane *gamgi_engine_find_plane_layer (unsigned int number, gamgi_layer *layer); gamgi_plane *gamgi_engine_find_plane_window (unsigned int number, gamgi_window *window); gamgi_plane *gamgi_engine_find_plane_gamgi (unsigned int number); gamgi_group *gamgi_engine_find_group_group (unsigned int number, gamgi_group *group); gamgi_group *gamgi_engine_find_group_molecule (unsigned int number, gamgi_molecule *molecule); gamgi_group *gamgi_engine_find_group_cluster (unsigned int number, gamgi_cluster *cluster); gamgi_group *gamgi_engine_find_group_cell (unsigned int number, gamgi_cell *cell); gamgi_group *gamgi_engine_find_group_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_group *gamgi_engine_find_group_layer (unsigned int number, gamgi_layer *layer); gamgi_group *gamgi_engine_find_group_window (unsigned int number, gamgi_window *window); gamgi_group *gamgi_engine_find_group_gamgi (unsigned int number); gamgi_molecule *gamgi_engine_find_molecule_molecule (unsigned int number, gamgi_molecule *molecule); gamgi_molecule *gamgi_engine_find_molecule_cluster (unsigned int number, gamgi_cluster *cluster); gamgi_molecule *gamgi_engine_find_molecule_cell (unsigned int number, gamgi_cell *cell); gamgi_molecule *gamgi_engine_find_molecule_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_molecule *gamgi_engine_find_molecule_layer (unsigned int number, gamgi_layer *layer); gamgi_molecule *gamgi_engine_find_molecule_window (unsigned int number, gamgi_window *window); gamgi_molecule *gamgi_engine_find_molecule_gamgi (unsigned int number); gamgi_cluster *gamgi_engine_find_cluster_cluster (unsigned int number, gamgi_cluster *cluster); gamgi_cluster *gamgi_engine_find_cluster_cell (unsigned int number, gamgi_cell *cell); gamgi_cluster *gamgi_engine_find_cluster_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_cluster *gamgi_engine_find_cluster_layer (unsigned int number, gamgi_layer *layer); gamgi_cluster *gamgi_engine_find_cluster_window (unsigned int number, gamgi_window *window); gamgi_cluster *gamgi_engine_find_cluster_gamgi (unsigned int number); gamgi_cell *gamgi_engine_find_cell_cell (unsigned int number, gamgi_cell *cell); gamgi_cell *gamgi_engine_find_cell_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_cell *gamgi_engine_find_cell_layer (unsigned int number, gamgi_layer *layer); gamgi_cell *gamgi_engine_find_cell_window (unsigned int number, gamgi_window *window); gamgi_cell *gamgi_engine_find_cell_gamgi (unsigned int number); gamgi_arrow *gamgi_engine_find_arrow_arrow (unsigned int number, gamgi_arrow *arrow); gamgi_arrow *gamgi_engine_find_arrow_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_arrow *gamgi_engine_find_arrow_layer (unsigned int number, gamgi_layer *layer); gamgi_arrow *gamgi_engine_find_arrow_window (unsigned int number, gamgi_window *window); gamgi_arrow *gamgi_engine_find_arrow_gamgi (unsigned int number); gamgi_shape *gamgi_engine_find_shape_shape (unsigned int number, gamgi_shape *shape); gamgi_shape *gamgi_engine_find_shape_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_shape *gamgi_engine_find_shape_layer (unsigned int number, gamgi_layer *layer); gamgi_shape *gamgi_engine_find_shape_window (unsigned int number, gamgi_window *window); gamgi_shape *gamgi_engine_find_shape_gamgi (unsigned int number); gamgi_graph *gamgi_engine_find_graph_graph (unsigned int number, gamgi_graph *graph); gamgi_graph *gamgi_engine_find_graph_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_graph *gamgi_engine_find_graph_layer (unsigned int number, gamgi_layer *layer); gamgi_graph *gamgi_engine_find_graph_window (unsigned int number, gamgi_window *window); gamgi_graph *gamgi_engine_find_graph_gamgi (unsigned int number); gamgi_assembly *gamgi_engine_find_assembly_assembly (unsigned int number, gamgi_assembly *assembly); gamgi_assembly *gamgi_engine_find_assembly_layer (unsigned int number, gamgi_layer *layer); gamgi_assembly *gamgi_engine_find_assembly_window (unsigned int number, gamgi_window *window); gamgi_assembly *gamgi_engine_find_assembly_gamgi (unsigned int number); gamgi_light *gamgi_engine_find_light_light (unsigned int number, gamgi_light *light); gamgi_light *gamgi_engine_find_light_layer (unsigned int number, gamgi_layer *layer); gamgi_light *gamgi_engine_find_light_window (unsigned int number, gamgi_window *window); gamgi_light *gamgi_engine_find_light_gamgi (unsigned int number); gamgi_layer *gamgi_engine_find_layer_layer (unsigned int number, gamgi_layer *layer); gamgi_layer *gamgi_engine_find_layer_window (unsigned int number, gamgi_window *window); gamgi_layer *gamgi_engine_find_layer_gamgi (unsigned int number); gamgi_window *gamgi_engine_find_window_window (unsigned int number, gamgi_window *window); gamgi_window *gamgi_engine_find_window_gamgi (unsigned int number); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_link.c000066400000000000000000001555251433127522700205410ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_link.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_engine_list.h" void gamgi_engine_link_text_text (gamgi_text *child, gamgi_text *parent) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (parent->text_end); parent->text_end = dlist; if (dlist->before == NULL) parent->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = child; child->object.dlist = dlist; child->object.object = GAMGI_CAST_OBJECT parent; } void gamgi_engine_link_text_orbital (gamgi_text *text, gamgi_orbital *orbital) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (orbital->text_end); orbital->text_end = dlist; if (dlist->before == NULL) orbital->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT orbital; } void gamgi_engine_link_text_bond (gamgi_text *text, gamgi_bond *bond) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (bond->text_end); bond->text_end = dlist; if (dlist->before == NULL) bond->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT bond; } void gamgi_engine_link_text_atom (gamgi_text *text, gamgi_atom *atom) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (atom->text_end); atom->text_end = dlist; if (dlist->before == NULL) atom->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT atom; } void gamgi_engine_link_text_direction (gamgi_text *text, gamgi_direction *direction) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (direction->text_end); direction->text_end = dlist; if (dlist->before == NULL) direction->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT direction; } void gamgi_engine_link_text_plane (gamgi_text *text, gamgi_plane *plane) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (plane->text_end); plane->text_end = dlist; if (dlist->before == NULL) plane->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT plane; } void gamgi_engine_link_text_group (gamgi_text *text, gamgi_group *group) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (group->text_end); group->text_end = dlist; if (dlist->before == NULL) group->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT group; } void gamgi_engine_link_text_molecule (gamgi_text *text, gamgi_molecule *molecule) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (molecule->text_end); molecule->text_end = dlist; if (dlist->before == NULL) molecule->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT molecule; } void gamgi_engine_link_text_cluster (gamgi_text *text, gamgi_cluster *cluster) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cluster->text_end); cluster->text_end = dlist; if (dlist->before == NULL) cluster->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT cluster; } void gamgi_engine_link_text_cell (gamgi_text *text, gamgi_cell *cell) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cell->text_end); cell->text_end = dlist; if (dlist->before == NULL) cell->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT cell; } void gamgi_engine_link_text_arrow (gamgi_text *text, gamgi_arrow *arrow) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (arrow->text_end); arrow->text_end = dlist; if (dlist->before == NULL) arrow->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT arrow; } void gamgi_engine_link_text_shape (gamgi_text *text, gamgi_shape *shape) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (shape->text_end); shape->text_end = dlist; if (dlist->before == NULL) shape->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT shape; } void gamgi_engine_link_text_graph (gamgi_text *text, gamgi_graph *graph) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (graph->text_end); graph->text_end = dlist; if (dlist->before == NULL) graph->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT graph; } void gamgi_engine_link_text_assembly (gamgi_text *text, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->text_end); assembly->text_end = dlist; if (dlist->before == NULL) assembly->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_text_layer (gamgi_text *text, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->text_end); layer->text_end = dlist; if (dlist->before == NULL) layer->text_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = text; text->object.dlist = dlist; text->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_orbital_bond (gamgi_orbital *orbital, gamgi_bond *bond) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (bond->orbital_end); bond->orbital_end = dlist; if (dlist->before == NULL) bond->orbital_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = orbital; orbital->object.dlist = dlist; orbital->object.object = GAMGI_CAST_OBJECT bond; } void gamgi_engine_link_orbital_atom (gamgi_orbital *orbital, gamgi_atom *atom) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (atom->orbital_end); atom->orbital_end = dlist; if (dlist->before == NULL) atom->orbital_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = orbital; orbital->object.dlist = dlist; orbital->object.object = GAMGI_CAST_OBJECT atom; } void gamgi_engine_link_orbital_direction (gamgi_orbital *orbital, gamgi_direction *direction) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (direction->orbital_end); direction->orbital_end = dlist; if (dlist->before == NULL) direction->orbital_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = orbital; orbital->object.dlist = dlist; orbital->object.object = GAMGI_CAST_OBJECT direction; } void gamgi_engine_link_orbital_plane (gamgi_orbital *orbital, gamgi_plane *plane) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (plane->orbital_end); plane->orbital_end = dlist; if (dlist->before == NULL) plane->orbital_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = orbital; orbital->object.dlist = dlist; orbital->object.object = GAMGI_CAST_OBJECT plane; } void gamgi_engine_link_orbital_group (gamgi_orbital *orbital, gamgi_group *group) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (group->orbital_end); group->orbital_end = dlist; if (dlist->before == NULL) group->orbital_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = orbital; orbital->object.dlist = dlist; orbital->object.object = GAMGI_CAST_OBJECT group; } void gamgi_engine_link_orbital_molecule (gamgi_orbital *orbital, gamgi_molecule *molecule) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (molecule->orbital_end); molecule->orbital_end = dlist; if (dlist->before == NULL) molecule->orbital_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = orbital; orbital->object.dlist = dlist; orbital->object.object = GAMGI_CAST_OBJECT molecule; } void gamgi_engine_link_orbital_cluster (gamgi_orbital *orbital, gamgi_cluster *cluster) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cluster->orbital_end); cluster->orbital_end = dlist; if (dlist->before == NULL) cluster->orbital_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = orbital; orbital->object.dlist = dlist; orbital->object.object = GAMGI_CAST_OBJECT cluster; } void gamgi_engine_link_orbital_cell (gamgi_orbital *orbital, gamgi_cell *cell) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cell->orbital_end); cell->orbital_end = dlist; if (dlist->before == NULL) cell->orbital_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = orbital; orbital->object.dlist = dlist; orbital->object.object = GAMGI_CAST_OBJECT cell; } void gamgi_engine_link_orbital_assembly (gamgi_orbital *orbital, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->orbital_end); assembly->orbital_end = dlist; if (dlist->before == NULL) assembly->orbital_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = orbital; orbital->object.dlist = dlist; orbital->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_orbital_layer (gamgi_orbital *orbital, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->orbital_end); layer->orbital_end = dlist; if (dlist->before == NULL) layer->orbital_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = orbital; orbital->object.dlist = dlist; orbital->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_bond_atom (gamgi_bond *bond, gamgi_atom *atom) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (atom->bond_end); atom->bond_end = dlist; if (dlist->before == NULL) atom->bond_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = bond; if (bond->atom1 == NULL) { bond->atom1 = atom; bond->dlist1 = dlist; } else { bond->atom2 = atom; bond->dlist2 = dlist; } } void gamgi_engine_link_atom_direction (gamgi_atom *atom, gamgi_direction *direction) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (direction->atom_end); direction->atom_end = dlist; if (dlist->before == NULL) direction->atom_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = atom; atom->object.dlist = dlist; atom->object.object = GAMGI_CAST_OBJECT direction; } void gamgi_engine_link_atom_plane (gamgi_atom *atom, gamgi_plane *plane) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (plane->atom_end); plane->atom_end = dlist; if (dlist->before == NULL) plane->atom_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = atom; atom->object.dlist = dlist; atom->object.object = GAMGI_CAST_OBJECT plane; } void gamgi_engine_link_atom_group (gamgi_atom *atom, gamgi_group *group) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (group->atom_end); group->atom_end = dlist; if (dlist->before == NULL) group->atom_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = atom; atom->object.dlist = dlist; atom->object.object = GAMGI_CAST_OBJECT group; } void gamgi_engine_link_atom_molecule (gamgi_atom *atom, gamgi_molecule *molecule) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (molecule->atom_end); molecule->atom_end = dlist; if (dlist->before == NULL) molecule->atom_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = atom; atom->object.dlist = dlist; atom->object.object = GAMGI_CAST_OBJECT molecule; } void gamgi_engine_link_atom_cluster (gamgi_atom *atom, gamgi_cluster *cluster) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cluster->atom_end); cluster->atom_end = dlist; if (dlist->before == NULL) cluster->atom_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = atom; atom->object.dlist = dlist; atom->object.object = GAMGI_CAST_OBJECT cluster; } void gamgi_engine_link_atom_cell (gamgi_atom *atom, gamgi_cell *cell) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cell->atom_end); cell->atom_end = dlist; if (dlist->before == NULL) cell->atom_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = atom; atom->object.dlist = dlist; atom->object.object = GAMGI_CAST_OBJECT cell; } void gamgi_engine_link_atom_assembly (gamgi_atom *atom, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->atom_end); assembly->atom_end = dlist; if (dlist->before == NULL) assembly->atom_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = atom; atom->object.dlist = dlist; atom->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_atom_layer (gamgi_atom *atom, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->atom_end); layer->atom_end = dlist; if (dlist->before == NULL) layer->atom_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = atom; atom->object.dlist = dlist; atom->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_direction_plane (gamgi_direction *direction, gamgi_plane *plane) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (plane->direction_end); plane->direction_end = dlist; if (dlist->before == NULL) plane->direction_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = direction; direction->object.dlist = dlist; direction->object.object = GAMGI_CAST_OBJECT plane; } void gamgi_engine_link_direction_group (gamgi_direction *direction, gamgi_group *group) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (group->direction_end); group->direction_end = dlist; if (dlist->before == NULL) group->direction_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = direction; direction->object.dlist = dlist; direction->object.object = GAMGI_CAST_OBJECT group; } void gamgi_engine_link_direction_molecule (gamgi_direction *direction, gamgi_molecule *molecule) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (molecule->direction_end); molecule->direction_end = dlist; if (dlist->before == NULL) molecule->direction_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = direction; direction->object.dlist = dlist; direction->object.object = GAMGI_CAST_OBJECT molecule; } void gamgi_engine_link_direction_cluster (gamgi_direction *direction, gamgi_cluster *cluster) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cluster->direction_end); cluster->direction_end = dlist; if (dlist->before == NULL) cluster->direction_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = direction; direction->object.dlist = dlist; direction->object.object = GAMGI_CAST_OBJECT cluster; } void gamgi_engine_link_direction_cell (gamgi_direction *direction, gamgi_cell *cell) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cell->direction_end); cell->direction_end = dlist; if (dlist->before == NULL) cell->direction_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = direction; direction->object.dlist = dlist; direction->object.object = GAMGI_CAST_OBJECT cell; } void gamgi_engine_link_direction_assembly (gamgi_direction *direction, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->direction_end); assembly->direction_end = dlist; if (dlist->before == NULL) assembly->direction_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = direction; direction->object.dlist = dlist; direction->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_direction_layer (gamgi_direction *direction, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->direction_end); layer->direction_end = dlist; if (dlist->before == NULL) layer->direction_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = direction; direction->object.dlist = dlist; direction->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_plane_group (gamgi_plane *plane, gamgi_group *group) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (group->plane_end); group->plane_end = dlist; if (dlist->before == NULL) group->plane_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = plane; plane->object.dlist = dlist; plane->object.object = GAMGI_CAST_OBJECT group; } void gamgi_engine_link_plane_molecule (gamgi_plane *plane, gamgi_molecule *molecule) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (molecule->plane_end); molecule->plane_end = dlist; if (dlist->before == NULL) molecule->plane_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = plane; plane->object.dlist = dlist; plane->object.object = GAMGI_CAST_OBJECT molecule; } void gamgi_engine_link_plane_cluster (gamgi_plane *plane, gamgi_cluster *cluster) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cluster->plane_end); cluster->plane_end = dlist; if (dlist->before == NULL) cluster->plane_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = plane; plane->object.dlist = dlist; plane->object.object = GAMGI_CAST_OBJECT cluster; } void gamgi_engine_link_plane_cell (gamgi_plane *plane, gamgi_cell *cell) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cell->plane_end); cell->plane_end = dlist; if (dlist->before == NULL) cell->plane_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = plane; plane->object.dlist = dlist; plane->object.object = GAMGI_CAST_OBJECT cell; } void gamgi_engine_link_plane_assembly (gamgi_plane *plane, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->plane_end); assembly->plane_end = dlist; if (dlist->before == NULL) assembly->plane_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = plane; plane->object.dlist = dlist; plane->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_plane_layer (gamgi_plane *plane, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->plane_end); layer->plane_end = dlist; if (dlist->before == NULL) layer->plane_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = plane; plane->object.dlist = dlist; plane->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_group_group (gamgi_group *child, gamgi_group *parent) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (parent->group_end); parent->group_end = dlist; if (dlist->before == NULL) parent->group_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = child; child->object.dlist = dlist; child->object.object = GAMGI_CAST_OBJECT parent; } void gamgi_engine_link_group_molecule (gamgi_group *group, gamgi_molecule *molecule) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (molecule->group_end); molecule->group_end = dlist; if (dlist->before == NULL) molecule->group_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = group; group->object.dlist = dlist; group->object.object = GAMGI_CAST_OBJECT molecule; } void gamgi_engine_link_group_cluster (gamgi_group *group, gamgi_cluster *cluster) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cluster->group_end); cluster->group_end = dlist; if (dlist->before == NULL) cluster->group_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = group; group->object.dlist = dlist; group->object.object = GAMGI_CAST_OBJECT cluster; } void gamgi_engine_link_group_cell (gamgi_group *group, gamgi_cell *cell) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cell->group_end); cell->group_end = dlist; if (dlist->before == NULL) cell->group_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = group; group->object.dlist = dlist; group->object.object = GAMGI_CAST_OBJECT cell; } void gamgi_engine_link_group_assembly (gamgi_group *group, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->group_end); assembly->group_end = dlist; if (dlist->before == NULL) assembly->group_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = group; group->object.dlist = dlist; group->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_group_layer (gamgi_group *group, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->group_end); layer->group_end = dlist; if (dlist->before == NULL) layer->group_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = group; group->object.dlist = dlist; group->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_molecule_cluster (gamgi_molecule *molecule, gamgi_cluster *cluster) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cluster->molecule_end); cluster->molecule_end = dlist; if (dlist->before == NULL) cluster->molecule_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = molecule; molecule->object.dlist = dlist; molecule->object.object = GAMGI_CAST_OBJECT cluster; } void gamgi_engine_link_molecule_cell (gamgi_molecule *molecule, gamgi_cell *cell) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cell->molecule_end); cell->molecule_end = dlist; if (dlist->before == NULL) cell->molecule_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = molecule; molecule->object.dlist = dlist; molecule->object.object = GAMGI_CAST_OBJECT cell; } void gamgi_engine_link_molecule_assembly (gamgi_molecule *molecule, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->molecule_end); assembly->molecule_end = dlist; if (dlist->before == NULL) assembly->molecule_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = molecule; molecule->object.dlist = dlist; molecule->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_molecule_layer (gamgi_molecule *molecule, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->molecule_end); layer->molecule_end = dlist; if (dlist->before == NULL) layer->molecule_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = molecule; molecule->object.dlist = dlist; molecule->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_cluster_cluster (gamgi_cluster *child, gamgi_cluster *parent) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (parent->cluster_end); parent->cluster_end = dlist; if (dlist->before == NULL) parent->cluster_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = child; child->object.dlist = dlist; child->object.object = GAMGI_CAST_OBJECT parent; } void gamgi_engine_link_cluster_cell (gamgi_cluster *cluster, gamgi_cell *cell) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (cell->cluster_end); cell->cluster_end = dlist; if (dlist->before == NULL) cell->cluster_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = cluster; cluster->object.dlist = dlist; cluster->object.object = GAMGI_CAST_OBJECT cell; } void gamgi_engine_link_cluster_assembly (gamgi_cluster *cluster, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->cluster_end); assembly->cluster_end = dlist; if (dlist->before == NULL) assembly->cluster_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = cluster; cluster->object.dlist = dlist; cluster->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_cluster_layer (gamgi_cluster *cluster, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->cluster_end); layer->cluster_end = dlist; if (dlist->before == NULL) layer->cluster_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = cluster; cluster->object.dlist = dlist; cluster->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_cell_assembly (gamgi_cell *cell, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->cell_end); assembly->cell_end = dlist; if (dlist->before == NULL) assembly->cell_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = cell; cell->object.dlist = dlist; cell->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_cell_layer (gamgi_cell *cell, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->cell_end); layer->cell_end = dlist; if (dlist->before == NULL) layer->cell_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = cell; cell->object.dlist = dlist; cell->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_arrow_assembly (gamgi_arrow *arrow, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->arrow_end); assembly->arrow_end = dlist; if (dlist->before == NULL) assembly->arrow_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = arrow; arrow->object.dlist = dlist; arrow->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_arrow_layer (gamgi_arrow *arrow, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->arrow_end); layer->arrow_end = dlist; if (dlist->before == NULL) layer->arrow_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = arrow; arrow->object.dlist = dlist; arrow->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_shape_assembly (gamgi_shape *shape, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->shape_end); assembly->shape_end = dlist; if (dlist->before == NULL) assembly->shape_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = shape; shape->object.dlist = dlist; shape->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_shape_layer (gamgi_shape *shape, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->shape_end); layer->shape_end = dlist; if (dlist->before == NULL) layer->shape_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = shape; shape->object.dlist = dlist; shape->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_graph_assembly (gamgi_graph *graph, gamgi_assembly *assembly) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (assembly->graph_end); assembly->graph_end = dlist; if (dlist->before == NULL) assembly->graph_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = graph; graph->object.dlist = dlist; graph->object.object = GAMGI_CAST_OBJECT assembly; } void gamgi_engine_link_graph_layer (gamgi_graph *graph, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->graph_end); layer->graph_end = dlist; if (dlist->before == NULL) layer->graph_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = graph; graph->object.dlist = dlist; graph->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_assembly_assembly (gamgi_assembly *child, gamgi_assembly *parent) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (parent->assembly_end); parent->assembly_end = dlist; if (dlist->before == NULL) parent->assembly_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = child; child->object.dlist = dlist; child->object.object = GAMGI_CAST_OBJECT parent; } void gamgi_engine_link_assembly_layer (gamgi_assembly *assembly, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->assembly_end); layer->assembly_end = dlist; if (dlist->before == NULL) layer->assembly_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = assembly; assembly->object.dlist = dlist; assembly->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_light_layer (gamgi_light *light, gamgi_layer *layer) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (layer->light_end); layer->light_end = dlist; if (dlist->before == NULL) layer->light_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = light; light->object.dlist = dlist; light->object.object = GAMGI_CAST_OBJECT layer; } void gamgi_engine_link_layer_window (gamgi_layer *layer, gamgi_window *window) { gamgi_dlist *dlist; /********************************* * add new member to parent list * *********************************/ dlist = gamgi_engine_dlist_add_end (window->layer_end); window->layer_end = dlist; if (dlist->before == NULL) window->layer_start = dlist; /********************************************** * cross information between parent and child * **********************************************/ dlist->data = layer; layer->object.dlist = dlist; layer->object.object = GAMGI_CAST_OBJECT window; } void gamgi_engine_link_object_bond (gamgi_object *object, gamgi_bond *bond) { switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_bond (GAMGI_CAST_TEXT object, bond); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_orbital_bond (GAMGI_CAST_ORBITAL object, bond); break; default: break; } } void gamgi_engine_link_object_atom (gamgi_object *object, gamgi_atom *atom) { switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_atom (GAMGI_CAST_TEXT object, atom); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_orbital_atom (GAMGI_CAST_ORBITAL object, atom); break; case GAMGI_ENGINE_BOND: gamgi_engine_link_bond_atom (GAMGI_CAST_BOND object, atom); break; default: break; } } void gamgi_engine_link_object_direction (gamgi_object *object, gamgi_direction *direction) { /*********************************** * bonds have no direction parents * ***********************************/ switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_direction (GAMGI_CAST_TEXT object, direction); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_orbital_direction (GAMGI_CAST_ORBITAL object, direction); break; case GAMGI_ENGINE_ATOM: gamgi_engine_link_atom_direction (GAMGI_CAST_ATOM object, direction); break; default: break; } } void gamgi_engine_link_object_plane (gamgi_object *object, gamgi_plane *plane) { /******************************* * bonds have no plane parents * *******************************/ switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_plane (GAMGI_CAST_TEXT object, plane); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_orbital_plane (GAMGI_CAST_ORBITAL object, plane); break; case GAMGI_ENGINE_ATOM: gamgi_engine_link_atom_plane (GAMGI_CAST_ATOM object, plane); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_link_direction_plane (GAMGI_CAST_DIRECTION object, plane); break; default: break; } } void gamgi_engine_link_object_group (gamgi_object *object, gamgi_group *group) { /******************************* * bonds have no group parents * *******************************/ switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_group (GAMGI_CAST_TEXT object, group); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_orbital_group (GAMGI_CAST_ORBITAL object, group); break; case GAMGI_ENGINE_ATOM: gamgi_engine_link_atom_group (GAMGI_CAST_ATOM object, group); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_link_direction_group (GAMGI_CAST_DIRECTION object, group); break; case GAMGI_ENGINE_PLANE: gamgi_engine_link_plane_group (GAMGI_CAST_PLANE object, group); break; case GAMGI_ENGINE_GROUP: gamgi_engine_link_group_group (GAMGI_CAST_GROUP object, group); break; default: break; } } void gamgi_engine_link_object_molecule (gamgi_object *object, gamgi_molecule *molecule) { /********************************** * bonds have no molecule parents * **********************************/ switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_molecule (GAMGI_CAST_TEXT object, molecule); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_orbital_molecule (GAMGI_CAST_ORBITAL object, molecule); break; case GAMGI_ENGINE_ATOM: gamgi_engine_link_atom_molecule (GAMGI_CAST_ATOM object, molecule); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_link_direction_molecule (GAMGI_CAST_DIRECTION object, molecule); break; case GAMGI_ENGINE_PLANE: gamgi_engine_link_plane_molecule (GAMGI_CAST_PLANE object, molecule); break; case GAMGI_ENGINE_GROUP: gamgi_engine_link_group_molecule (GAMGI_CAST_GROUP object, molecule); break; default: break; } } void gamgi_engine_link_object_cluster (gamgi_object *object, gamgi_cluster *cluster) { /********************************* * bonds have no cluster parents * *********************************/ switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_cluster (GAMGI_CAST_TEXT object, cluster); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_orbital_cluster (GAMGI_CAST_ORBITAL object, cluster); break; case GAMGI_ENGINE_ATOM: gamgi_engine_link_atom_cluster (GAMGI_CAST_ATOM object, cluster); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_link_direction_cluster (GAMGI_CAST_DIRECTION object, cluster); break; case GAMGI_ENGINE_PLANE: gamgi_engine_link_plane_cluster (GAMGI_CAST_PLANE object, cluster); break; case GAMGI_ENGINE_GROUP: gamgi_engine_link_group_cluster (GAMGI_CAST_GROUP object, cluster); break; case GAMGI_ENGINE_MOLECULE: gamgi_engine_link_molecule_cluster (GAMGI_CAST_MOLECULE object, cluster); break; case GAMGI_ENGINE_CLUSTER: gamgi_engine_link_cluster_cluster (GAMGI_CAST_CLUSTER object, cluster); break; default: break; } } void gamgi_engine_link_object_cell (gamgi_object *object, gamgi_cell *cell) { /****************************** * bonds have no cell parents * ******************************/ switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_cell (GAMGI_CAST_TEXT object, cell); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_orbital_cell (GAMGI_CAST_ORBITAL object, cell); break; case GAMGI_ENGINE_ATOM: gamgi_engine_link_atom_cell (GAMGI_CAST_ATOM object, cell); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_link_direction_cell (GAMGI_CAST_DIRECTION object, cell); break; case GAMGI_ENGINE_PLANE: gamgi_engine_link_plane_cell (GAMGI_CAST_PLANE object, cell); break; case GAMGI_ENGINE_GROUP: gamgi_engine_link_group_cell (GAMGI_CAST_GROUP object, cell); break; case GAMGI_ENGINE_MOLECULE: gamgi_engine_link_molecule_cell (GAMGI_CAST_MOLECULE object, cell); break; case GAMGI_ENGINE_CLUSTER: gamgi_engine_link_cluster_cell (GAMGI_CAST_CLUSTER object, cell); break; default: break; } } void gamgi_engine_link_object_assembly (gamgi_object *object, gamgi_assembly *assembly) { /********************************** * bonds have no assembly parents * **********************************/ switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_assembly (GAMGI_CAST_TEXT object, assembly); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_orbital_assembly (GAMGI_CAST_ORBITAL object, assembly); break; case GAMGI_ENGINE_ATOM: gamgi_engine_link_atom_assembly (GAMGI_CAST_ATOM object, assembly); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_link_direction_assembly (GAMGI_CAST_DIRECTION object, assembly); break; case GAMGI_ENGINE_PLANE: gamgi_engine_link_plane_assembly (GAMGI_CAST_PLANE object, assembly); break; case GAMGI_ENGINE_GROUP: gamgi_engine_link_group_assembly (GAMGI_CAST_GROUP object, assembly); break; case GAMGI_ENGINE_MOLECULE: gamgi_engine_link_molecule_assembly (GAMGI_CAST_MOLECULE object, assembly); break; case GAMGI_ENGINE_CLUSTER: gamgi_engine_link_cluster_assembly (GAMGI_CAST_CLUSTER object, assembly); break; case GAMGI_ENGINE_CELL: gamgi_engine_link_cell_assembly (GAMGI_CAST_CELL object, assembly); break; case GAMGI_ENGINE_ARROW: gamgi_engine_link_arrow_assembly (GAMGI_CAST_ARROW object, assembly); break; case GAMGI_ENGINE_SHAPE: gamgi_engine_link_shape_assembly (GAMGI_CAST_SHAPE object, assembly); break; case GAMGI_ENGINE_GRAPH: gamgi_engine_link_graph_assembly (GAMGI_CAST_GRAPH object, assembly); break; case GAMGI_ENGINE_ASSEMBLY: gamgi_engine_link_assembly_assembly (GAMGI_CAST_ASSEMBLY object, assembly); break; default: break; } } void gamgi_engine_link_object_layer (gamgi_object *object, gamgi_layer *layer) { /******************************* * bonds have no layer parents * *******************************/ switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_layer (GAMGI_CAST_TEXT object, layer); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_orbital_layer (GAMGI_CAST_ORBITAL object, layer); break; case GAMGI_ENGINE_ATOM: gamgi_engine_link_atom_layer (GAMGI_CAST_ATOM object, layer); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_link_direction_layer (GAMGI_CAST_DIRECTION object, layer); break; case GAMGI_ENGINE_PLANE: gamgi_engine_link_plane_layer (GAMGI_CAST_PLANE object, layer); break; case GAMGI_ENGINE_GROUP: gamgi_engine_link_group_layer (GAMGI_CAST_GROUP object, layer); break; case GAMGI_ENGINE_MOLECULE: gamgi_engine_link_molecule_layer (GAMGI_CAST_MOLECULE object, layer); break; case GAMGI_ENGINE_CLUSTER: gamgi_engine_link_cluster_layer (GAMGI_CAST_CLUSTER object, layer); break; case GAMGI_ENGINE_CELL: gamgi_engine_link_cell_layer (GAMGI_CAST_CELL object, layer); break; case GAMGI_ENGINE_ARROW: gamgi_engine_link_arrow_layer (GAMGI_CAST_ARROW object, layer); break; case GAMGI_ENGINE_SHAPE: gamgi_engine_link_shape_layer (GAMGI_CAST_SHAPE object, layer); break; case GAMGI_ENGINE_GRAPH: gamgi_engine_link_graph_layer (GAMGI_CAST_GRAPH object, layer); break; case GAMGI_ENGINE_ASSEMBLY: gamgi_engine_link_assembly_layer (GAMGI_CAST_ASSEMBLY object, layer); break; case GAMGI_ENGINE_LIGHT: gamgi_engine_link_light_layer (GAMGI_CAST_LIGHT object, layer); break; default: break; } } void gamgi_engine_link_object_object (gamgi_object *child, gamgi_object *parent) { /********************************************************** * only text objects can have text parents * * only text objects can have orbital parents * * only text objects can have arrow, shape, graph parents * * no objects can have light parents * **********************************************************/ switch (parent->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_link_text_text (GAMGI_CAST_TEXT child, GAMGI_CAST_TEXT parent); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_link_text_orbital (GAMGI_CAST_TEXT child, GAMGI_CAST_ORBITAL parent); break; case GAMGI_ENGINE_BOND: gamgi_engine_link_object_bond (child, GAMGI_CAST_BOND parent); break; case GAMGI_ENGINE_ATOM: gamgi_engine_link_object_atom (child, GAMGI_CAST_ATOM parent); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_link_object_direction (child, GAMGI_CAST_DIRECTION parent); break; case GAMGI_ENGINE_PLANE: gamgi_engine_link_object_plane (child, GAMGI_CAST_PLANE parent); break; case GAMGI_ENGINE_GROUP: gamgi_engine_link_object_group (child, GAMGI_CAST_GROUP parent); break; case GAMGI_ENGINE_MOLECULE: gamgi_engine_link_object_molecule (child, GAMGI_CAST_MOLECULE parent); break; case GAMGI_ENGINE_CLUSTER: gamgi_engine_link_object_cluster (child, GAMGI_CAST_CLUSTER parent); break; case GAMGI_ENGINE_CELL: gamgi_engine_link_object_cell (child, GAMGI_CAST_CELL parent); break; case GAMGI_ENGINE_ARROW: gamgi_engine_link_text_arrow (GAMGI_CAST_TEXT child, GAMGI_CAST_ARROW parent); break; case GAMGI_ENGINE_SHAPE: gamgi_engine_link_text_shape (GAMGI_CAST_TEXT child, GAMGI_CAST_SHAPE parent); break; case GAMGI_ENGINE_GRAPH: gamgi_engine_link_text_graph (GAMGI_CAST_TEXT child, GAMGI_CAST_GRAPH parent); break; case GAMGI_ENGINE_ASSEMBLY: gamgi_engine_link_object_assembly (child, GAMGI_CAST_ASSEMBLY parent); break; case GAMGI_ENGINE_LAYER: gamgi_engine_link_object_layer (child, GAMGI_CAST_LAYER parent); break; case GAMGI_ENGINE_WINDOW: gamgi_engine_link_layer_window (GAMGI_CAST_LAYER child, GAMGI_CAST_WINDOW parent); break; default: break; } } gamgi-0.17.5/src/engine/gamgi_engine_link.h000066400000000000000000000164431433127522700205410ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_link.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ void gamgi_engine_link_text_text (gamgi_text *child, gamgi_text *parent); void gamgi_engine_link_text_orbital (gamgi_text *text, gamgi_orbital *orbital); void gamgi_engine_link_text_bond (gamgi_text *text, gamgi_bond *bond); void gamgi_engine_link_text_atom (gamgi_text *text, gamgi_atom *atom); void gamgi_engine_link_text_direction (gamgi_text *text, gamgi_direction *direction); void gamgi_engine_link_text_plane (gamgi_text *text, gamgi_plane *plane); void gamgi_engine_link_text_group (gamgi_text *text, gamgi_group *group); void gamgi_engine_link_text_molecule (gamgi_text *text, gamgi_molecule *molecule); void gamgi_engine_link_text_cluster (gamgi_text *text, gamgi_cluster *cluster); void gamgi_engine_link_text_cell (gamgi_text *text, gamgi_cell *cell); void gamgi_engine_link_text_arrow (gamgi_text *text, gamgi_arrow *arrow); void gamgi_engine_link_text_shape (gamgi_text *text, gamgi_shape *shape); void gamgi_engine_link_text_graph (gamgi_text *text, gamgi_graph *graph); void gamgi_engine_link_text_assembly (gamgi_text *text, gamgi_assembly *assembly); void gamgi_engine_link_text_layer (gamgi_text *text, gamgi_layer *layer); void gamgi_engine_link_orbital_bond (gamgi_orbital *orbital, gamgi_bond *bond); void gamgi_engine_link_orbital_atom (gamgi_orbital *orbital, gamgi_atom *atom); void gamgi_engine_link_orbital_direction (gamgi_orbital *orbital, gamgi_direction *direction); void gamgi_engine_link_orbital_plane (gamgi_orbital *orbital, gamgi_plane *plane); void gamgi_engine_link_orbital_group (gamgi_orbital *orbital, gamgi_group *group); void gamgi_engine_link_orbital_molecule (gamgi_orbital *orbital, gamgi_molecule *molecule); void gamgi_engine_link_orbital_cluster (gamgi_orbital *orbital, gamgi_cluster *cluster); void gamgi_engine_link_orbital_cell (gamgi_orbital *orbital, gamgi_cell *cell); void gamgi_engine_link_orbital_assembly (gamgi_orbital *orbital, gamgi_assembly *assembly); void gamgi_engine_link_orbital_layer (gamgi_orbital *orbital, gamgi_layer *layer); void gamgi_engine_link_bond_atom (gamgi_bond *bond, gamgi_atom *atom); void gamgi_engine_link_atom_direction (gamgi_atom *atom, gamgi_direction *direction); void gamgi_engine_link_atom_plane (gamgi_atom *atom, gamgi_plane *plane); void gamgi_engine_link_atom_group (gamgi_atom *atom, gamgi_group *group); void gamgi_engine_link_atom_molecule (gamgi_atom *atom, gamgi_molecule *molecule); void gamgi_engine_link_atom_cluster (gamgi_atom *atom, gamgi_cluster *cluster); void gamgi_engine_link_atom_cell (gamgi_atom *atom, gamgi_cell *cell); void gamgi_engine_link_atom_assembly (gamgi_atom *atom, gamgi_assembly *assembly); void gamgi_engine_link_atom_layer (gamgi_atom *atom, gamgi_layer *layer); void gamgi_engine_link_direction_plane (gamgi_direction *direction, gamgi_plane *plane); void gamgi_engine_link_direction_group (gamgi_direction *direction, gamgi_group *group); void gamgi_engine_link_direction_molecule (gamgi_direction *direction, gamgi_molecule *molecule); void gamgi_engine_link_direction_cluster (gamgi_direction *direction, gamgi_cluster *cluster); void gamgi_engine_link_direction_cell (gamgi_direction *direction, gamgi_cell *cell); void gamgi_engine_link_direction_assembly (gamgi_direction *direction, gamgi_assembly *assembly); void gamgi_engine_link_direction_layer (gamgi_direction *direction, gamgi_layer *layer); void gamgi_engine_link_plane_group (gamgi_plane *plane, gamgi_group *group); void gamgi_engine_link_plane_molecule (gamgi_plane *plane, gamgi_molecule *molecule); void gamgi_engine_link_plane_cluster (gamgi_plane *plane, gamgi_cluster *cluster); void gamgi_engine_link_plane_cell (gamgi_plane *plane, gamgi_cell *cell); void gamgi_engine_link_plane_assembly (gamgi_plane *plane, gamgi_assembly *assembly); void gamgi_engine_link_plane_layer (gamgi_plane *plane, gamgi_layer *layer); void gamgi_engine_link_group_group (gamgi_group *child, gamgi_group *parent); void gamgi_engine_link_group_molecule (gamgi_group *group, gamgi_molecule *molecule); void gamgi_engine_link_group_cluster (gamgi_group *group, gamgi_cluster *cluster); void gamgi_engine_link_group_cell (gamgi_group *group, gamgi_cell *cell); void gamgi_engine_link_group_assembly (gamgi_group *group, gamgi_assembly *assembly); void gamgi_engine_link_group_layer (gamgi_group *group, gamgi_layer *layer); void gamgi_engine_link_molecule_cluster (gamgi_molecule *molecule, gamgi_cluster *cluster); void gamgi_engine_link_molecule_cell (gamgi_molecule *molecule, gamgi_cell *cell); void gamgi_engine_link_molecule_assembly (gamgi_molecule *molecule, gamgi_assembly *assembly); void gamgi_engine_link_molecule_layer (gamgi_molecule *molecule, gamgi_layer *layer); void gamgi_engine_link_cluster_cluster (gamgi_cluster *child, gamgi_cluster *parent); void gamgi_engine_link_cluster_cell (gamgi_cluster *cluster, gamgi_cell *cell); void gamgi_engine_link_cluster_assembly (gamgi_cluster *cluster, gamgi_assembly *assembly); void gamgi_engine_link_cluster_layer (gamgi_cluster *cluster, gamgi_layer *layer); void gamgi_engine_link_cell_assembly (gamgi_cell *cell, gamgi_assembly *assembly); void gamgi_engine_link_cell_layer (gamgi_cell *cell, gamgi_layer *layer); void gamgi_engine_link_arrow_assembly (gamgi_arrow *arrow, gamgi_assembly *assembly); void gamgi_engine_link_arrow_layer (gamgi_arrow *arrow, gamgi_layer *layer); void gamgi_engine_link_shape_assembly (gamgi_shape *shape, gamgi_assembly *assembly); void gamgi_engine_link_shape_layer (gamgi_shape *shape, gamgi_layer *layer); void gamgi_engine_link_graph_assembly (gamgi_graph *graph, gamgi_assembly *assembly); void gamgi_engine_link_graph_layer (gamgi_graph *graph, gamgi_layer *layer); void gamgi_engine_link_assembly_assembly (gamgi_assembly *child, gamgi_assembly *parent); void gamgi_engine_link_assembly_layer (gamgi_assembly *assembly, gamgi_layer *layer); void gamgi_engine_link_light_layer (gamgi_light *light, gamgi_layer *layer); void gamgi_engine_link_layer_window (gamgi_layer *layer, gamgi_window *window); void gamgi_engine_link_object_bond (gamgi_object *object, gamgi_bond *bond); void gamgi_engine_link_object_atom (gamgi_object *object, gamgi_atom *atom); void gamgi_engine_link_object_direction (gamgi_object *object, gamgi_direction *direction); void gamgi_engine_link_object_plane (gamgi_object *object, gamgi_plane *plane); void gamgi_engine_link_object_group (gamgi_object *object, gamgi_group *group); void gamgi_engine_link_object_molecule (gamgi_object *object, gamgi_molecule *molecule); void gamgi_engine_link_object_cluster (gamgi_object *object, gamgi_cluster *cluster); void gamgi_engine_link_object_cell (gamgi_object *object, gamgi_cell *cell); void gamgi_engine_link_object_assembly (gamgi_object *object, gamgi_assembly *assembly); void gamgi_engine_link_object_layer (gamgi_object *object, gamgi_layer *layer); void gamgi_engine_link_object_object (gamgi_object *child, gamgi_object *parent); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_list.c000066400000000000000000000337221433127522700205510ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_list.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" /***************** external function ******************** * * * GAMGI_ENGINE_SLIST_ADD_START * * * * Add a new slist node before the slist_start node and * * returns the address of the new node. This is usefull * * to add new elements to stacks, but cannot be used to * * add new elements in the middle of a slist! * ********************************************************/ gamgi_slist *gamgi_engine_slist_add_start (gamgi_slist *slist_start) { gamgi_slist *slist_new; slist_new = GAMGI_CAST_SLIST malloc (sizeof (gamgi_slist)); slist_new->next = slist_start; return slist_new; } /**************** external function ********************* * * * GAMGI_ENGINE_SLIST_ADD_END * * * * Add a new slist node after the slist_end node and * * returns the address of the new node. This is usefull * * to add new elements to queues, but can also be used * * to add new elements in the middle of a slist! * ********************************************************/ gamgi_slist *gamgi_engine_slist_add_end (gamgi_slist *slist_end) { gamgi_slist *slist_new; slist_new = GAMGI_CAST_SLIST malloc (sizeof (gamgi_slist)); if (slist_end != NULL) { slist_new->next = slist_end->next; slist_end->next = slist_new; } else slist_new->next = NULL; return slist_new; } /******************* external function ****************** * * * GAMGI_ENGINE_SLIST_REMOVE_START * * * * Remove the slist_start node and returns the address * * of the next node. This is usefull to remove elements * * from both stacks and queues, but cannot be used to * * remove elements in the middle of a slist! * * * * slist_start MUST be non null! * ********************************************************/ gamgi_slist *gamgi_engine_slist_remove_start (gamgi_slist *slist_start) { gamgi_slist *slist_old; slist_old = slist_start->next; free (slist_start); return slist_old; } /********************* external function ********************* * * * GAMGI_ENGINE_SLIST_REMOVE_ALL * * * * Remove all elements of a slist, from slist_start to NULL! * *************************************************************/ void gamgi_engine_slist_remove_all (gamgi_slist *slist_start) { while (slist_start != NULL) slist_start = gamgi_engine_slist_remove_start (slist_start); } /*************** external function ********************** * * * GAMGI_ENGINE_DLIST_ADD_START * * * * Add a new dlist node before the dlist_start node and * * returns the address of the new node. This is usefull * * to add new elements to stacks, but can also be used * * to add new elements in the middle of a dlist! * * * * if dlist_start->before is NULL then dlist_start is * * the start, otherwise is in the middle of the dlist! * ********************************************************/ gamgi_dlist *gamgi_engine_dlist_add_start (gamgi_dlist *dlist_start) { gamgi_dlist *dlist_new; dlist_new = GAMGI_CAST_DLIST malloc (sizeof (gamgi_dlist)); dlist_new->next = dlist_start; if (dlist_start != NULL) { dlist_new->before = dlist_start->before; if (dlist_start->before != NULL) dlist_start->before->next = dlist_new; dlist_start->before = dlist_new; } else dlist_new->before = NULL; return dlist_new; } /**************** external function ********************* * * * GAMGI_ENGINE_DLIST_ADD_END * * * * Add a new dlist node after the dlist_end node and * * returns the address of the new node. This is usefull * * to add new elements to queues, but can also be used * * to add new elements in the middle of a dlist! * * * * if dlist_end->next is NULL then dlist_end is the * * end, otherwise is in the middle of the dlist! * ********************************************************/ gamgi_dlist *gamgi_engine_dlist_add_end (gamgi_dlist *dlist_end) { gamgi_dlist *dlist_new; dlist_new = GAMGI_CAST_DLIST malloc (sizeof (gamgi_dlist)); dlist_new->before = dlist_end; if (dlist_end != NULL) { dlist_new->next = dlist_end->next; if (dlist_end->next != NULL) dlist_end->next->before = dlist_new; dlist_end->next = dlist_new; } else dlist_new->next = NULL; return dlist_new; } /****************** external function ******************* * * * GAMGI_ENGINE_DLIST_REMOVE_START * * * * Remove the dlist_start node and returns the address * * of the next node. This is usefull to remove elements * * from both stacks and queues, but can also be used to * * remove elements in the middle of a dlist! * * * * By-pass dlist_start, linking directly * * left and right nodes to each other! * ********************************************************/ gamgi_dlist *gamgi_engine_dlist_remove_start (gamgi_dlist *dlist_start) { gamgi_dlist *dlist_old; dlist_old = dlist_start->next; if (dlist_old != NULL) dlist_old->before = dlist_start->before; if (dlist_start->before != NULL) dlist_start->before->next = dlist_old; free (dlist_start); return dlist_old; } /******************** external function ********************** * * * GAMGI_ENGINE_DLIST_REMOVE_ALL * * * * Remove all elements of a dlist, from dlist_start to NULL! * *************************************************************/ void gamgi_engine_dlist_remove_all (gamgi_dlist *dlist_start) { while (dlist_start != NULL) dlist_start = gamgi_engine_dlist_remove_start (dlist_start); } /*********************** external function ********************* * * * GAMGI_ENGINE_SLIST_MERGE * * * * Merge two ordered lists of slist nodes in a single ordered * * list, as determined by an external comparing function. When * * the function returns positive, the two nodes are swaped. * ***************************************************************/ gamgi_slist *gamgi_engine_slist_merge (gamgi_slist *a, gamgi_slist *b, int (* function) (const void *, const void *)) { gamgi_slist start; gamgi_slist *c = &start; while (a != NULL && b != NULL) if ((*function) (a, b) > 0) { c->next = b; c = b; b = b->next; } else { c->next = a; c = a; a = a->next; } c->next = (a == NULL) ? b : a; return start.next; } /*********************** external function ********************* * * * GAMGI_ENGINE_DLIST_MERGE * * * * Merge two ordered lists of dlist nodes in a single ordered * * list, as determined by an external comparing function. When * * the function returns positive, the two nodes are swaped. * ***************************************************************/ gamgi_dlist *gamgi_engine_dlist_merge (gamgi_dlist *a, gamgi_dlist *b, int (* function) (const void *, const void *)) { gamgi_dlist start; gamgi_dlist *c = &start; while (a != NULL && b != NULL) if ((*function) (a, b) > 0) { c->next = b; b->before = c; c = b; b = b->next; } else { c->next = a; a->before = c; c = a; a = a->next; } c->next = (a == NULL) ? b : a; return start.next; } /*********************** external function ****************** * * * GAMGI_ENGINE_SLIST_SORT * * * * Use the merge-sort recursive algorithm to sort a list of * * slist nodes, according to an external comparing function * ************************************************************/ gamgi_slist *gamgi_engine_slist_msort (gamgi_slist *c, int (* function) (const void *, const void *)) { gamgi_slist *a, *b; if (c == NULL || c->next == NULL) return c; /**************************************************************** * divide list c in two new lists, a going from the start * * to the middle, and b going from the middle to the end * * * * pointer b moves along the list at twice the speed of pointer * * c, so when b reaches the end of the list, c is at the middle * ****************************************************************/ a = c; b = c->next; while (b != NULL && b->next != NULL) { c = c->next; b = b->next->next; } b = c->next; c->next = NULL; return gamgi_engine_slist_merge (gamgi_engine_slist_msort (a, function), gamgi_engine_slist_msort (b, function), function); } /*********************** external function ****************** * * * GAMGI_ENGINE_DLIST_SORT * * * * Use the merge-sort recursive algorithm to sort a list of * * dlist nodes, according to an external comparing function * ************************************************************/ gamgi_dlist *gamgi_engine_dlist_msort (gamgi_dlist *c, int (* function) (const void *, const void *)) { gamgi_dlist *a, *b; if (c == NULL || c->next == NULL) return c; /**************************************************************** * divide list c in two new lists, a going from the start * * to the middle, and b going from the middle to the end * * * * pointer b moves along the list at twice the speed of pointer * * c, so when b reaches the end of the list, c is at the middle * ****************************************************************/ a = c; b = c->next; while (b != NULL && b->next != NULL) { c = c->next; b = b->next->next; } b = c->next; c->next = NULL; return gamgi_engine_dlist_merge (gamgi_engine_dlist_msort (a, function), gamgi_engine_dlist_msort (b, function), function); } /*********************** external function ******************** * * * GAMGI_ENGINE_SLIST_INVERT * * * * Invert the list, so the first node becomes the last and * * vice-versa. The input should be the first node of a single * * list, and the output is the first node of the new list * **************************************************************/ gamgi_slist *gamgi_engine_slist_invert (gamgi_slist *start) { gamgi_slist *slist, *slist_before, *slist_next; slist_before = NULL; for (slist = start; slist != NULL; slist = slist_next) { slist_next = slist->next; slist->next = slist_before; slist_before = slist; } return slist_before; } /*********************** external function ******************** * * * GAMGI_ENGINE_DLIST_INVERT * * * * Invert the list, so the first node becomes the last and * * vice-versa. The input should be the first node of a double * * list, and the output is the first node of the new list * **************************************************************/ gamgi_dlist *gamgi_engine_dlist_invert (gamgi_dlist *start) { gamgi_dlist *dlist, *dlist_before; dlist_before = NULL; for (dlist = start; dlist != NULL; dlist = dlist->before) { dlist_before = dlist->before; dlist->before = dlist->next; dlist->next = dlist_before; dlist_before = dlist; } return dlist_before; } gamgi_slist *gamgi_engine_slist_copy (gamgi_slist *start) { gamgi_slist *slist, *slist_new, *start_new; if (start == NULL) return NULL; start_new = gamgi_engine_slist_add_end (NULL); start_new->data = start->data; slist_new = start_new; for (slist = start->next; slist != NULL; slist = slist->next) { slist_new = gamgi_engine_slist_add_end (slist_new); slist_new->data = slist->data; } return start_new; } gamgi_dlist *gamgi_engine_dlist_copy (gamgi_dlist *start) { gamgi_dlist *dlist, *dlist_new, *start_new; if (start == NULL) return NULL; start_new = gamgi_engine_dlist_add_end (NULL); start_new->data = start->data; dlist_new = start_new; for (dlist = start->next; dlist != NULL; dlist = dlist->next) { dlist_new = gamgi_engine_dlist_add_end (dlist_new); dlist_new->data = dlist->data; } return start_new; } int gamgi_engine_slist_nodes (gamgi_slist *start) { gamgi_slist *slist; int i = 0; for (slist = start; slist != NULL; slist = slist->next) i++; return i; } int gamgi_engine_dlist_nodes (gamgi_dlist *start) { gamgi_dlist *dlist; int i = 0; for (dlist = start; dlist != NULL; dlist = dlist->next) i++; return i; } gamgi-0.17.5/src/engine/gamgi_engine_list.h000066400000000000000000000033721433127522700205540ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_list.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ gamgi_slist *gamgi_engine_slist_add_start (gamgi_slist *slist_start); gamgi_slist *gamgi_engine_slist_add_end (gamgi_slist *slist_start); gamgi_slist *gamgi_engine_slist_remove_start (gamgi_slist *slist_start); void gamgi_engine_slist_remove_all (gamgi_slist *slist_start); gamgi_dlist *gamgi_engine_dlist_add_start (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_add_end (gamgi_dlist *dlist_start); gamgi_dlist *gamgi_engine_dlist_remove_start (gamgi_dlist *dlist_start); void gamgi_engine_dlist_remove_all (gamgi_dlist *dlist_start); gamgi_slist *gamgi_engine_slist_merge (gamgi_slist *slist_a, gamgi_slist *slist_b, int (* function) (const void *, const void *)); gamgi_dlist *gamgi_engine_dlist_merge (gamgi_dlist *dlist_a, gamgi_dlist *dlist_b, int (* function) (const void *, const void *)); gamgi_slist *gamgi_engine_slist_msort (gamgi_slist *slist_c, int (* function) (const void *, const void *)); gamgi_dlist *gamgi_engine_dlist_msort (gamgi_dlist *dlist_c, int (* function) (const void *, const void *)); gamgi_slist *gamgi_engine_slist_invert (gamgi_slist *start); gamgi_dlist *gamgi_engine_dlist_invert (gamgi_dlist *start); gamgi_slist *gamgi_engine_slist_copy (gamgi_slist *start); gamgi_dlist *gamgi_engine_dlist_copy (gamgi_dlist *start); int gamgi_engine_slist_nodes (gamgi_slist *start); int gamgi_engine_dlist_nodes (gamgi_dlist *start); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_number.c000066400000000000000000000341211433127522700210600ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_number.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_engine_list.h" /****************************************** * Initialise numbers for all objects. * * These numbers are static, so they are * * kept in memory untill GAMGI is closed. * ******************************************/ static unsigned int text_number = 1; static unsigned int orbital_number = 1; static unsigned int bond_number = 1; static unsigned int atom_number = 1; static unsigned int direction_number = 1; static unsigned int plane_number = 1; static unsigned int group_number = 1; static unsigned int molecule_number = 1; static unsigned int cluster_number = 1; static unsigned int cell_number = 1; static unsigned int arrow_number = 1; static unsigned int shape_number = 1; static unsigned int graph_number = 1; static unsigned int assembly_number = 1; static unsigned int light_number = 1; static unsigned int layer_number = 1; static unsigned int window_number = 1; /*************************************************** * Initialise recycling lists for all objects. * * Everytime an object is removed, its number is * * added to the corresponding list. When an object * * is created, its number will be taken from the * * recycled list, unless the list is empty. * ***************************************************/ static gamgi_slist *text_start = NULL, *text_end = NULL; static gamgi_slist *orbital_start = NULL, *orbital_end = NULL; static gamgi_slist *bond_start = NULL, *bond_end = NULL; static gamgi_slist *atom_start = NULL, *atom_end = NULL; static gamgi_slist *direction_start = NULL, *direction_end = NULL; static gamgi_slist *plane_start = NULL, *plane_end = NULL; static gamgi_slist *group_start = NULL, *group_end = NULL; static gamgi_slist *molecule_start = NULL, *molecule_end = NULL; static gamgi_slist *cluster_start = NULL, *cluster_end = NULL; static gamgi_slist *cell_start = NULL, *cell_end = NULL; static gamgi_slist *arrow_start = NULL, *arrow_end = NULL; static gamgi_slist *shape_start = NULL, *shape_end = NULL; static gamgi_slist *graph_start = NULL, *graph_end = NULL; static gamgi_slist *assembly_start = NULL, *assembly_end = NULL; static gamgi_slist *light_start = NULL, *light_end = NULL; static gamgi_slist *layer_start = NULL, *layer_end = NULL; static gamgi_slist *window_start = NULL, *window_end = NULL; unsigned int gamgi_engine_number_text_get (void) { unsigned int number; if (text_start == NULL) return text_number++; else { number = GAMGI_POINTER_TO_INT (text_start->data); text_start = gamgi_engine_slist_remove_start (text_start); if (text_start == NULL) text_end = NULL; return number; } } void gamgi_engine_number_text_recycle (unsigned int number) { text_end = gamgi_engine_slist_add_end (text_end); if (text_start == NULL) text_start = text_end; text_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_text_reset (void) { gamgi_engine_slist_remove_all (text_start); text_start = NULL; text_end = NULL; text_number = 1; } unsigned int gamgi_engine_number_orbital_get (void) { unsigned int number; if (orbital_start == NULL) return orbital_number++; else { number = GAMGI_POINTER_TO_INT (orbital_start->data); orbital_start = gamgi_engine_slist_remove_start (orbital_start); if (orbital_start == NULL) orbital_end = NULL; return number; } } void gamgi_engine_number_orbital_recycle (unsigned int number) { orbital_end = gamgi_engine_slist_add_end (orbital_end); if (orbital_start == NULL) orbital_start = orbital_end; orbital_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_orbital_reset (void) { gamgi_engine_slist_remove_all (orbital_start); orbital_start = NULL; orbital_end = NULL; orbital_number = 1; } unsigned int gamgi_engine_number_bond_get (void) { unsigned int number; if (bond_start == NULL) return bond_number++; else { number = GAMGI_POINTER_TO_INT (bond_start->data); bond_start = gamgi_engine_slist_remove_start (bond_start); if (bond_start == NULL) bond_end = NULL; return number; } } void gamgi_engine_number_bond_recycle (unsigned int number) { bond_end = gamgi_engine_slist_add_end (bond_end); if (bond_start == NULL) bond_start = bond_end; bond_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_bond_reset (void) { gamgi_engine_slist_remove_all (bond_start); bond_start = NULL; bond_end = NULL; bond_number = 1; } unsigned int gamgi_engine_number_atom_get (void) { unsigned int number; if (atom_start == NULL) return atom_number++; else { number = GAMGI_POINTER_TO_INT (atom_start->data); atom_start = gamgi_engine_slist_remove_start (atom_start); if (atom_start == NULL) atom_end = NULL; return number; } } void gamgi_engine_number_atom_recycle (unsigned int number) { atom_end = gamgi_engine_slist_add_end (atom_end); if (atom_start == NULL) atom_start = atom_end; atom_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_atom_reset (void) { gamgi_engine_slist_remove_all (atom_start); atom_start = NULL; atom_end = NULL; atom_number = 1; } unsigned int gamgi_engine_number_direction_get (void) { unsigned int number; if (direction_start == NULL) return direction_number++; else { number = GAMGI_POINTER_TO_INT (direction_start->data); direction_start = gamgi_engine_slist_remove_start (direction_start); if (direction_start == NULL) direction_end = NULL; return number; } } void gamgi_engine_number_direction_recycle (unsigned int number) { direction_end = gamgi_engine_slist_add_end (direction_end); if (direction_start == NULL) direction_start = direction_end; direction_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_direction_reset (void) { gamgi_engine_slist_remove_all (direction_start); direction_start = NULL; direction_end = NULL; direction_number = 1; } unsigned int gamgi_engine_number_plane_get (void) { unsigned int number; if (plane_start == NULL) return plane_number++; else { number = GAMGI_POINTER_TO_INT (plane_start->data); plane_start = gamgi_engine_slist_remove_start (plane_start); if (plane_start == NULL) plane_end = NULL; return number; } } void gamgi_engine_number_plane_recycle (unsigned int number) { plane_end = gamgi_engine_slist_add_end (plane_end); if (plane_start == NULL) plane_start = plane_end; plane_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_plane_reset (void) { gamgi_engine_slist_remove_all (plane_start); plane_start = NULL; plane_end = NULL; plane_number = 1; } unsigned int gamgi_engine_number_group_get (void) { unsigned int number; if (group_start == NULL) return group_number++; else { number = GAMGI_POINTER_TO_INT (group_start->data); group_start = gamgi_engine_slist_remove_start (group_start); if (group_start == NULL) group_end = NULL; return number; } } void gamgi_engine_number_group_recycle (unsigned int number) { group_end = gamgi_engine_slist_add_end (group_end); if (group_start == NULL) group_start = group_end; group_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_group_reset (void) { gamgi_engine_slist_remove_all (group_start); group_start = NULL; group_end = NULL; group_number = 1; } unsigned int gamgi_engine_number_molecule_get (void) { unsigned int number; if (molecule_start == NULL) return molecule_number++; else { number = GAMGI_POINTER_TO_INT (molecule_start->data); molecule_start = gamgi_engine_slist_remove_start (molecule_start); if (molecule_start == NULL) molecule_end = NULL; return number; } } void gamgi_engine_number_molecule_recycle (unsigned int number) { molecule_end = gamgi_engine_slist_add_end (molecule_end); if (molecule_start == NULL) molecule_start = molecule_end; molecule_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_molecule_reset (void) { gamgi_engine_slist_remove_all (molecule_start); molecule_start = NULL; molecule_end = NULL; molecule_number = 1; } unsigned int gamgi_engine_number_cluster_get (void) { unsigned int number; if (cluster_start == NULL) return cluster_number++; else { number = GAMGI_POINTER_TO_INT (cluster_start->data); cluster_start = gamgi_engine_slist_remove_start (cluster_start); if (cluster_start == NULL) cluster_end = NULL; return number; } } void gamgi_engine_number_cluster_recycle (unsigned int number) { cluster_end = gamgi_engine_slist_add_end (cluster_end); if (cluster_start == NULL) cluster_start = cluster_end; cluster_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_cluster_reset (void) { gamgi_engine_slist_remove_all (cluster_start); cluster_start = NULL; cluster_end = NULL; cluster_number = 1; } unsigned int gamgi_engine_number_cell_get (void) { unsigned int number; if (cell_start == NULL) return cell_number++; else { number = GAMGI_POINTER_TO_INT (cell_start->data); cell_start = gamgi_engine_slist_remove_start (cell_start); if (cell_start == NULL) cell_end = NULL; return number; } } void gamgi_engine_number_cell_recycle (unsigned int number) { cell_end = gamgi_engine_slist_add_end (cell_end); if (cell_start == NULL) cell_start = cell_end; cell_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_cell_reset (void) { gamgi_engine_slist_remove_all (cell_start); cell_start = NULL; cell_end = NULL; cell_number = 1; } unsigned int gamgi_engine_number_arrow_get (void) { unsigned int number; if (arrow_start == NULL) return arrow_number++; else { number = GAMGI_POINTER_TO_INT (arrow_start->data); arrow_start = gamgi_engine_slist_remove_start (arrow_start); if (arrow_start == NULL) arrow_end = NULL; return number; } } void gamgi_engine_number_arrow_recycle (unsigned int number) { arrow_end = gamgi_engine_slist_add_end (arrow_end); if (arrow_start == NULL) arrow_start = arrow_end; arrow_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_arrow_reset (void) { gamgi_engine_slist_remove_all (arrow_start); arrow_start = NULL; arrow_end = NULL; arrow_number = 1; } unsigned int gamgi_engine_number_shape_get (void) { unsigned int number; if (shape_start == NULL) return shape_number++; else { number = GAMGI_POINTER_TO_INT (shape_start->data); shape_start = gamgi_engine_slist_remove_start (shape_start); if (shape_start == NULL) shape_end = NULL; return number; } } void gamgi_engine_number_shape_recycle (unsigned int number) { shape_end = gamgi_engine_slist_add_end (shape_end); if (shape_start == NULL) shape_start = shape_end; shape_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_shape_reset (void) { gamgi_engine_slist_remove_all (shape_start); shape_start = NULL; shape_end = NULL; shape_number = 1; } unsigned int gamgi_engine_number_graph_get (void) { unsigned int number; if (graph_start == NULL) return graph_number++; else { number = GAMGI_POINTER_TO_INT (graph_start->data); graph_start = gamgi_engine_slist_remove_start (graph_start); if (graph_start == NULL) graph_end = NULL; return number; } } void gamgi_engine_number_graph_recycle (unsigned int number) { graph_end = gamgi_engine_slist_add_end (graph_end); if (graph_start == NULL) graph_start = graph_end; graph_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_graph_reset (void) { gamgi_engine_slist_remove_all (graph_start); graph_start = NULL; graph_end = NULL; graph_number = 1; } unsigned int gamgi_engine_number_assembly_get (void) { unsigned int number; if (assembly_start == NULL) return assembly_number++; else { number = GAMGI_POINTER_TO_INT (assembly_start->data); assembly_start = gamgi_engine_slist_remove_start (assembly_start); if (assembly_start == NULL) assembly_end = NULL; return number; } } void gamgi_engine_number_assembly_recycle (unsigned int number) { assembly_end = gamgi_engine_slist_add_end (assembly_end); if (assembly_start == NULL) assembly_start = assembly_end; assembly_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_assembly_reset (void) { gamgi_engine_slist_remove_all (assembly_start); assembly_start = NULL; assembly_end = NULL; assembly_number = 1; } unsigned int gamgi_engine_number_light_get (void) { unsigned int number; if (light_start == NULL) return light_number++; else { number = GAMGI_POINTER_TO_INT (light_start->data); light_start = gamgi_engine_slist_remove_start (light_start); if (light_start == NULL) light_end = NULL; return number; } } void gamgi_engine_number_light_recycle (unsigned int number) { light_end = gamgi_engine_slist_add_end (light_end); if (light_start == NULL) light_start = light_end; light_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_light_reset (void) { gamgi_engine_slist_remove_all (light_start); light_start = NULL; light_end = NULL; light_number = 1; } unsigned int gamgi_engine_number_layer_get (void) { unsigned int number; if (layer_start == NULL) return layer_number++; else { number = GAMGI_POINTER_TO_INT (layer_start->data); layer_start = gamgi_engine_slist_remove_start (layer_start); if (layer_start == NULL) layer_end = NULL; return number; } } void gamgi_engine_number_layer_recycle (unsigned int number) { layer_end = gamgi_engine_slist_add_end (layer_end); if (layer_start == NULL) layer_start = layer_end; layer_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_layer_reset (void) { gamgi_engine_slist_remove_all (layer_start); layer_start = NULL; layer_end = NULL; layer_number = 1; } unsigned int gamgi_engine_number_window_get (void) { unsigned int number; if (window_start == NULL) return window_number++; else { number = GAMGI_POINTER_TO_INT (window_start->data); window_start = gamgi_engine_slist_remove_start (window_start); if (window_start == NULL) window_end = NULL; return number; } } void gamgi_engine_number_window_recycle (unsigned int number) { window_end = gamgi_engine_slist_add_end (window_end); if (window_start == NULL) window_start = window_end; window_end->data = GAMGI_INT_TO_POINTER (number); } void gamgi_engine_number_window_reset (void) { gamgi_engine_slist_remove_all (window_start); window_start = NULL; window_end = NULL; window_number = 1; } gamgi-0.17.5/src/engine/gamgi_engine_number.h000066400000000000000000000073441433127522700210740ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_number.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ /******** * text * ********/ unsigned int gamgi_engine_number_text_get (void); void gamgi_engine_number_text_recycle (unsigned int number); void gamgi_engine_number_text_reset (void); /*********** * orbital * ***********/ unsigned int gamgi_engine_number_orbital_get (void); void gamgi_engine_number_orbital_recycle (unsigned int number); void gamgi_engine_number_orbital_reset (void); /******** * bond * ********/ unsigned int gamgi_engine_number_bond_get (void); void gamgi_engine_number_bond_recycle (unsigned int number); void gamgi_engine_number_bond_reset (void); /******** * atom * ********/ unsigned int gamgi_engine_number_atom_get (void); void gamgi_engine_number_atom_recycle (unsigned int number); void gamgi_engine_number_atom_reset (void); /************* * direction * *************/ unsigned int gamgi_engine_number_direction_get (void); void gamgi_engine_number_direction_recycle (unsigned int number); void gamgi_engine_number_direction_reset (void); /********* * plane * *********/ unsigned int gamgi_engine_number_plane_get (void); void gamgi_engine_number_plane_recycle (unsigned int number); void gamgi_engine_number_plane_reset (void); /********* * group * *********/ unsigned int gamgi_engine_number_group_get (void); void gamgi_engine_number_group_recycle (unsigned int number); void gamgi_engine_number_group_reset (void); /************ * molecule * ************/ unsigned int gamgi_engine_number_molecule_get (void); void gamgi_engine_number_molecule_recycle (unsigned int number); void gamgi_engine_number_molecule_reset (void); /*********** * cluster * ***********/ unsigned int gamgi_engine_number_cluster_get (void); void gamgi_engine_number_cluster_recycle (unsigned int number); void gamgi_engine_number_cluster_reset (void); /******** * cell * ********/ unsigned int gamgi_engine_number_cell_get (void); void gamgi_engine_number_cell_recycle (unsigned int number); void gamgi_engine_number_cell_reset (void); /********* * arrow * *********/ unsigned int gamgi_engine_number_arrow_get (void); void gamgi_engine_number_arrow_recycle (unsigned int number); void gamgi_engine_number_arrow_reset (void); /********* * shape * *********/ unsigned int gamgi_engine_number_shape_get (void); void gamgi_engine_number_shape_recycle (unsigned int number); void gamgi_engine_number_shape_reset (void); /********* * graph * *********/ unsigned int gamgi_engine_number_graph_get (void); void gamgi_engine_number_graph_recycle (unsigned int number); void gamgi_engine_number_graph_reset (void); /************ * assembly * ************/ unsigned int gamgi_engine_number_assembly_get (void); void gamgi_engine_number_assembly_recycle (unsigned int number); void gamgi_engine_number_assembly_reset (void); /********* * light * *********/ unsigned int gamgi_engine_number_light_get (void); void gamgi_engine_number_light_recycle (unsigned int number); void gamgi_engine_number_light_reset (void); /********* * layer * *********/ unsigned int gamgi_engine_number_layer_get (void); void gamgi_engine_number_layer_recycle (unsigned int number); void gamgi_engine_number_layer_reset (void); /********** * window * **********/ unsigned int gamgi_engine_number_window_get (void); void gamgi_engine_number_window_recycle (unsigned int number); void gamgi_engine_number_window_reset (void); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_remove.c000066400000000000000000001326501433127522700210730ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_remove.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_chem.h" #include "gamgi_io.h" #include "gamgi_global.h" #include "gamgi_engine_remove_out.h" #include "gamgi_engine_number.h" #include "gamgi_engine_list.h" #include "gamgi_engine_unlink.h" #include "gamgi_gtk_history.h" #include "gamgi_mesa_text.h" #include "gamgi_math_hash.h" #include "gamgi_global_selection.h" #include "gamgi_global_remove.h" /***************** external function ********************* * * * GAMGI_ENGINE_REMOVE_TEXT * * * * Remove all objects which belong to text and remove * * the text. The function calls itself when the child is * * also text. Caution: the text must be unlinked before! * *********************************************************/ void gamgi_engine_remove_text (gamgi_text *text) { gamgi_dlist *dlist; gamgi_text *text_next, *text_before; /******************************** * remove text global selection * ********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_TEXT, &gamgi->texts, "button_text", text->object.selection); /******************** * remove text list * ********************/ dlist = text->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************* * free text contents * * * * unref font, remove it * * when no longer needed * *************************/ gamgi_mesa_text_font_decrease (text); text->font = FALSE; gamgi_mesa_text_remove (text); /*************** * remove text * ***************/ /********************************************* * because recursive removing may occur, * * addressing can be done only after all * * child objects are removed from the lists. * *********************************************/ text_next = text->next; text_before = text->before; gamgi_engine_number_text_recycle (text->object.number); gamgi_engine_remove_out_text (text); if (text_next == NULL) gamgi->text_end = text_before; if (text_before == NULL) gamgi->text_start = text_next; } /******************** external function ********************** * * * GAMGI_ENGINE_REMOVE_ORBITAL * * * * Remove all objects which belong to orbital and remove the * * orbital. Caution: the orbital must be unlinked before! * *************************************************************/ void gamgi_engine_remove_orbital (gamgi_orbital *orbital) { gamgi_dlist *dlist; gamgi_orbital *orbital_next, *orbital_before; /*********************************** * remove orbital global selection * ***********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_ORBITAL, &gamgi->orbitals, "button_orbital", orbital->object.selection); /******************** * remove text list * ********************/ dlist = orbital->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * free array memory * *********************/ free (orbital->points); free (orbital->lines); /****************** * remove orbital * ******************/ orbital_next = orbital->next; orbital_before = orbital->before; gamgi_engine_number_orbital_recycle (orbital->object.number); gamgi_engine_remove_out_orbital (orbital); if (orbital_next == NULL) gamgi->orbital_end = orbital_before; if (orbital_before == NULL) gamgi->orbital_start = orbital_next; } /***************** external function *************** * * * GAMGI_ENGINE_REMOVE_BOND * * * * Remove all objects which belong to bond, unlink * * from the two parent atoms and remove the bond * * * * Caution: the bond must be unlinked before! * ***************************************************/ void gamgi_engine_remove_bond (gamgi_bond *bond) { gamgi_dlist *dlist; gamgi_bond *bond_next, *bond_before; /******************************** * remove bond global selection * ********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_BOND, &gamgi->bonds, "button_bond", bond->object.selection); /******************** * remove text list * ********************/ dlist = bond->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove orbital list * ***********************/ dlist = bond->orbital_start; while (dlist != NULL) { gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*************** * remove bond * ***************/ bond_next = bond->next; bond_before = bond->before; gamgi_engine_number_bond_recycle (bond->object.number); gamgi_engine_remove_out_bond (bond); if (bond_next == NULL) gamgi->bond_end = bond_before; if (bond_before == NULL) gamgi->bond_start = bond_next; } /***************** external function ******************** * * * GAMGI_ENGINE_REMOVE_ATOM * * * * Remove all objects which belong to atom and remove * * the atom. Caution: the atom must be unlinked before! * ********************************************************/ void gamgi_engine_remove_atom (gamgi_atom *atom) { gamgi_dlist *dlist; gamgi_atom *atom_next, *atom_before; gamgi_bond *bond; /******************************** * remove atom global selection * ********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_ATOM, &gamgi->atoms, "button_atom", atom->object.selection); /******************** * remove text list * ********************/ dlist = atom->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove orbital list * ***********************/ dlist = atom->orbital_start; while (dlist != NULL) { gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove bond list * ********************/ dlist = atom->bond_start; while (dlist != NULL) { bond = GAMGI_CAST_BOND dlist->data; dlist = dlist->next; gamgi_engine_unlink_bond (bond); gamgi_engine_remove_bond (bond); } /*************** * remove atom * ***************/ atom_next = atom->next; atom_before = atom->before; gamgi_engine_number_atom_recycle (atom->object.number); gamgi_engine_remove_out_atom (atom); if (atom_next == NULL) gamgi->atom_end = atom_before; if (atom_before == NULL) gamgi->atom_start = atom_next; } /******************** external function ************************ * * * GAMGI_ENGINE_REMOVE_DIRECTION * * * * Remove all objects which belong to direction and remove the * * direction. Caution: the direction must be unlinked before! * ***************************************************************/ void gamgi_engine_remove_direction (gamgi_direction *direction) { gamgi_dlist *dlist; gamgi_direction *direction_next, *direction_before; /************************************* * remove direction global selection * *************************************/ gamgi_global_selection_clean (GAMGI_ENGINE_DIRECTION, &gamgi->directions, "button_direction", direction->object.selection); /******************** * remove text list * ********************/ dlist = direction->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove orbital list * ***********************/ dlist = direction->orbital_start; while (dlist != NULL) { gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove atom list * ********************/ dlist = direction->atom_start; while (dlist != NULL) { gamgi_engine_remove_atom (GAMGI_CAST_ATOM dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * free array memory * *********************/ free (direction->points); free (direction->loops); /******************** * remove direction * ********************/ direction_next = direction->next; direction_before = direction->before; gamgi_engine_number_direction_recycle (direction->object.number); gamgi_engine_remove_out_direction (direction); if (direction_next == NULL) gamgi->direction_end = direction_before; if (direction_before == NULL) gamgi->direction_start = direction_next; } /******************** external function ******************* * * * GAMGI_ENGINE_REMOVE_PLANE * * * * Remove all objects which belong to plane and remove * * the plane. Caution: the plane must be unlinked before! * **********************************************************/ void gamgi_engine_remove_plane (gamgi_plane *plane) { gamgi_dlist *dlist; gamgi_plane *plane_next, *plane_before; /******************************** * remove plane global selection * ********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_PLANE, &gamgi->planes, "button_plane", plane->object.selection); /******************** * remove text list * ********************/ dlist = plane->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove orbital list * ***********************/ dlist = plane->orbital_start; while (dlist != NULL) { gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove atom list * ********************/ dlist = plane->atom_start; while (dlist != NULL) { gamgi_engine_remove_atom (GAMGI_CAST_ATOM dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************* * remove direction list * *************************/ dlist = plane->direction_start; while (dlist != NULL) { gamgi_engine_remove_direction (GAMGI_CAST_DIRECTION dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * free array memory * *********************/ free (plane->points); free (plane->loops); /**************** * remove plane * ****************/ plane_next = plane->next; plane_before = plane->before; gamgi_engine_number_plane_recycle (plane->object.number); gamgi_engine_remove_out_plane (plane); if (plane_next == NULL) gamgi->plane_end = plane_before; if (plane_before == NULL) gamgi->plane_start = plane_next; } /******************* external function ********************* * * * GAMGI_ENGINE_REMOVE_GROUP * * * * Remove all objects which belong to group and remove * * the group. The function calls itself when the child is * * also group. Caution: the group must be unlinked before! * ***********************************************************/ void gamgi_engine_remove_group (gamgi_group *group) { gamgi_dlist *dlist; gamgi_group *group_next, *group_before; /********************************* * remove group global selection * *********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_GROUP, &gamgi->groups, "button_group", group->object.selection); /******************** * remove text list * ********************/ dlist = group->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove orbital list * ***********************/ dlist = group->orbital_start; while (dlist != NULL) { gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove atom list * ********************/ dlist = group->atom_start; while (dlist != NULL) { gamgi_engine_remove_atom (GAMGI_CAST_ATOM dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************* * remove direction list * *************************/ dlist = group->direction_start; while (dlist != NULL) { gamgi_engine_remove_direction (GAMGI_CAST_DIRECTION dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove plane list * *********************/ dlist = group->plane_start; while (dlist != NULL) { gamgi_engine_remove_plane (GAMGI_CAST_PLANE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove group list * *********************/ dlist = group->group_start; while (dlist != NULL) { gamgi_engine_remove_group (GAMGI_CAST_GROUP dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /**************** * remove group * ****************/ /********************************************* * because recursive removing may occur, * * addressing can be done only after all * * child objects are removed from the lists. * *********************************************/ group_next = group->next; group_before = group->before; gamgi_engine_number_group_recycle (group->object.number); gamgi_engine_remove_out_group (group); if (group_next == NULL) gamgi->group_end = group_before; if (group_before == NULL) gamgi->group_start = group_next; } /********************** external function ********************* * * * GAMGI_ENGINE_REMOVE_MOLECULE * * * * Remove all objects which belong to molecule and remove the * * molecule. Caution: the molecule must be unlinked before! * **************************************************************/ void gamgi_engine_remove_molecule (gamgi_molecule *molecule) { gamgi_dlist *dlist; gamgi_molecule *molecule_next, *molecule_before; /************************************ * remove molecule global selection * ************************************/ gamgi_global_selection_clean (GAMGI_ENGINE_MOLECULE, &gamgi->molecules, "button_molecule", molecule->object.selection); /******************** * remove text list * ********************/ dlist = molecule->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove orbital list * ***********************/ /* remove orbital list */ dlist = molecule->orbital_start; while (dlist != NULL) { gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove atom list * ********************/ dlist = molecule->atom_start; while (dlist != NULL) { gamgi_engine_remove_atom (GAMGI_CAST_ATOM dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************* * remove direction list * *************************/ dlist = molecule->direction_start; while (dlist != NULL) { gamgi_engine_remove_direction (GAMGI_CAST_DIRECTION dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove plane list * *********************/ /* remove plane list */ dlist = molecule->plane_start; while (dlist != NULL) { gamgi_engine_remove_plane (GAMGI_CAST_PLANE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove group list * *********************/ dlist = molecule->group_start; while (dlist != NULL) { gamgi_engine_remove_group (GAMGI_CAST_GROUP dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************* * remove molecule * *******************/ molecule_next = molecule->next; molecule_before = molecule->before; gamgi_engine_number_molecule_recycle (molecule->object.number); gamgi_engine_remove_out_molecule (molecule); if (molecule_next == NULL) gamgi->molecule_end = molecule_before; if (molecule_before == NULL) gamgi->molecule_start = molecule_next; } /************************ external function ****************** * * * GAMGI_ENGINE_REMOVE_CLUSTER * * * * Remove all objects which belong to cluster and remove the * * cluster. The function calls itself when the child is also * * cluster. Caution: the cluster must be unlinked before! * *************************************************************/ void gamgi_engine_remove_cluster (gamgi_cluster *cluster) { gamgi_dlist *dlist; gamgi_cluster *cluster_next, *cluster_before; /*********************************** * remove cluster global selection * ***********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_CLUSTER, &gamgi->clusters, "button_cluster", cluster->object.selection); /******************** * remove text list * ********************/ dlist = cluster->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove orbital list * ***********************/ dlist = cluster->orbital_start; while (dlist != NULL) { gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove atom list * ********************/ dlist = cluster->atom_start; while (dlist != NULL) { gamgi_engine_remove_atom (GAMGI_CAST_ATOM dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************* * remove direction list * *************************/ dlist = cluster->direction_start; while (dlist != NULL) { gamgi_engine_remove_direction (GAMGI_CAST_DIRECTION dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove plane list * *********************/ dlist = cluster->plane_start; while (dlist != NULL) { gamgi_engine_remove_plane (GAMGI_CAST_PLANE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove group list * *********************/ dlist = cluster->group_start; while (dlist != NULL) { gamgi_engine_remove_group (GAMGI_CAST_GROUP dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************ * remove molecule list * ************************/ dlist = cluster->molecule_start; while (dlist != NULL) { gamgi_engine_remove_molecule (GAMGI_CAST_MOLECULE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************ * remove clustier list * ************************/ dlist = cluster->cluster_start; while (dlist != NULL) { gamgi_engine_remove_cluster (GAMGI_CAST_CLUSTER dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * free array memory * *********************/ free (cluster->points); free (cluster->loops); free (cluster->colors); free (cluster->paints); /****************** * remove cluster * ******************/ /********************************************* * because recursive removing may occur, * * addressing can be done only after all * * child objects are removed from the lists. * *********************************************/ cluster_next = cluster->next; cluster_before = cluster->before; gamgi_engine_number_cluster_recycle (cluster->object.number); gamgi_engine_remove_out_cluster (cluster); if (cluster_next == NULL) gamgi->cluster_end = cluster_before; if (cluster_before == NULL) gamgi->cluster_start = cluster_next; } /******************** external function ***************** * * * GAMGI_ENGINE_REMOVE_CELL * * * * Remove all objects which belong to cell and remove * * the cell. Caution: the cell must be unlinked before! * ********************************************************/ void gamgi_engine_remove_cell (gamgi_cell *cell) { gamgi_dlist *dlist; gamgi_cell *cell_next, *cell_before; /******************************** * remove cell global selection * ********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_CELL, &gamgi->cells, "button_cell", cell->object.selection); /******************** * remove text list * ********************/ dlist = cell->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove orbital list * ***********************/ dlist = cell->orbital_start; while (dlist != NULL) { gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove atom list * ********************/ dlist = cell->atom_start; while (dlist != NULL) { gamgi_engine_remove_atom (GAMGI_CAST_ATOM dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************* * remove direction list * *************************/ dlist = cell->direction_start; while (dlist != NULL) { gamgi_engine_remove_direction (GAMGI_CAST_DIRECTION dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove plane list * *********************/ dlist = cell->plane_start; while (dlist != NULL) { gamgi_engine_remove_plane (GAMGI_CAST_PLANE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove group list * *********************/ dlist = cell->group_start; while (dlist != NULL) { gamgi_engine_remove_group (GAMGI_CAST_GROUP dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************ * remove molecule list * ************************/ /* remove molecule list */ dlist = cell->molecule_start; while (dlist != NULL) { gamgi_engine_remove_molecule (GAMGI_CAST_MOLECULE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove cluster list * ***********************/ /* remove cluster list */ dlist = cell->cluster_start; while (dlist != NULL) { gamgi_engine_remove_cluster (GAMGI_CAST_CLUSTER dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * free array memory * *********************/ free (cell->points); free (cell->loops); free (cell->lines); /*************** * remove cell * ***************/ cell_next = cell->next; cell_before = cell->before; gamgi_engine_number_cell_recycle (cell->object.number); gamgi_engine_remove_out_cell (cell); if (cell_next == NULL) gamgi->cell_end = cell_before; if (cell_before == NULL) gamgi->cell_start = cell_next; } /******************** external function ******************* * * * GAMGI_ENGINE_REMOVE_ARROW * * * * Remove all objects which belong to arrow and remove * * the arrow. Caution: the arrow must be unlinked before! * **********************************************************/ void gamgi_engine_remove_arrow (gamgi_arrow *arrow) { gamgi_dlist *dlist; gamgi_arrow *arrow_next, *arrow_before; /********************************* * remove arrow global selection * *********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_ARROW, &gamgi->arrows, "button_arrow", arrow->object.selection); /******************** * remove text list * ********************/ dlist = arrow->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /**************** * remove arrow * ****************/ arrow_next = arrow->next; arrow_before = arrow->before; gamgi_engine_number_arrow_recycle (arrow->object.number); gamgi_engine_remove_out_arrow (arrow); if (arrow_next == NULL) gamgi->arrow_end = arrow_before; if (arrow_before == NULL) gamgi->arrow_start = arrow_next; } /******************** external function ******************* * * * GAMGI_ENGINE_REMOVE_SHAPE * * * * Remove all objects which belong to shape and remove * * the shape. Caution: the shape must be unlinked before! * **********************************************************/ void gamgi_engine_remove_shape (gamgi_shape *shape) { gamgi_dlist *dlist; gamgi_shape *shape_next, *shape_before; /********************************* * remove shape global selection * *********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_SHAPE, &gamgi->shapes, "button_shape", shape->object.selection); /******************** * remove text list * ********************/ dlist = shape->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /**************** * remove shape * ****************/ shape_next = shape->next; shape_before = shape->before; gamgi_engine_number_shape_recycle (shape->object.number); gamgi_engine_remove_out_shape (shape); if (shape_next == NULL) gamgi->shape_end = shape_before; if (shape_before == NULL) gamgi->shape_start = shape_next; } /******************** external function ******************* * * * GAMGI_ENGINE_REMOVE_GRAPH * * * * Remove all objects which belong to graph and remove * * the graph. Caution: the graph must be unlinked before! * **********************************************************/ void gamgi_engine_remove_graph (gamgi_graph *graph) { gamgi_dlist *dlist; gamgi_graph *graph_next, *graph_before; /********************************* * remove graph global selection * *********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_GRAPH, &gamgi->graphs, "button_graph", graph->object.selection); /******************** * remove text list * ********************/ dlist = graph->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /**************** * remove graph * ****************/ graph_next = graph->next; graph_before = graph->before; gamgi_engine_number_graph_recycle (graph->object.number); gamgi_engine_remove_out_graph (graph); if (graph_next == NULL) gamgi->graph_end = graph_before; if (graph_before == NULL) gamgi->graph_start = graph_next; } /************************ external function ******************* * * * GAMGI_ENGINE_REMOVE_ASSEMBLY * * * * Remove all objects which belong to assembly and remove the * * assembly. The function calls itself when the child is also * * assembly. Caution: the assembly must be unlinked before! * **************************************************************/ void gamgi_engine_remove_assembly (gamgi_assembly *assembly) { gamgi_dlist *dlist; gamgi_assembly *assembly_next, *assembly_before; /************************************ * remove assembly global selection * ************************************/ gamgi_global_selection_clean (GAMGI_ENGINE_ASSEMBLY, &gamgi->assemblys, "button_assembly", assembly->object.selection); /******************** * remove text list * ********************/ dlist = assembly->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove orbital list * ***********************/ dlist = assembly->orbital_start; while (dlist != NULL) { gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove atom list * ********************/ dlist = assembly->atom_start; while (dlist != NULL) { gamgi_engine_remove_atom (GAMGI_CAST_ATOM dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************* * remove direction list * *************************/ dlist = assembly->direction_start; while (dlist != NULL) { gamgi_engine_remove_direction (GAMGI_CAST_DIRECTION dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove plane list * *********************/ dlist = assembly->plane_start; while (dlist != NULL) { gamgi_engine_remove_plane (GAMGI_CAST_PLANE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove group list * *********************/ dlist = assembly->group_start; while (dlist != NULL) { gamgi_engine_remove_group (GAMGI_CAST_GROUP dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************ * remove molecule list * ************************/ dlist = assembly->molecule_start; while (dlist != NULL) { gamgi_engine_remove_molecule (GAMGI_CAST_MOLECULE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove cluster list * ***********************/ /* remove cluster list */ dlist = assembly->cluster_start; while (dlist != NULL) { gamgi_engine_remove_cluster (GAMGI_CAST_CLUSTER dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove cell list * ********************/ dlist = assembly->cell_start; while (dlist != NULL) { gamgi_engine_remove_cell (GAMGI_CAST_CELL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove arrow list * *********************/ dlist = assembly->arrow_start; while (dlist != NULL) { gamgi_engine_remove_arrow (GAMGI_CAST_ARROW dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove shape list * *********************/ dlist = assembly->shape_start; while (dlist != NULL) { gamgi_engine_remove_shape (GAMGI_CAST_SHAPE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove graph list * *********************/ dlist = assembly->graph_start; while (dlist != NULL) { gamgi_engine_remove_graph (GAMGI_CAST_GRAPH dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************ * remove assembly list * ************************/ dlist = assembly->assembly_start; while (dlist != NULL) { gamgi_engine_remove_assembly (GAMGI_CAST_ASSEMBLY dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************* * remove assembly * *******************/ /********************************************* * because recursive removing may occur, * * addressing can be done only after all * * child objects are removed from the lists. * *********************************************/ assembly_next = assembly->next; assembly_before = assembly->before; gamgi_engine_number_assembly_recycle (assembly->object.number); gamgi_engine_remove_out_assembly (assembly); if (assembly_next == NULL) gamgi->assembly_end = assembly_before; if (assembly_before == NULL) gamgi->assembly_start = assembly_next; } /********* external function ******** * * * GAMGI_ENGINE_REMOVE_LIGHT * * * * Remove the light. Caution: the * * light must be unlinked before! * ************************************/ void gamgi_engine_remove_light (gamgi_light *light) { gamgi_light *light_next, *light_before; /********************************* * remove light global selection * *********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_LIGHT, &gamgi->lights, "button_light", light->object.selection); /**************** * remove light * ****************/ light_next = light->next; light_before = light->before; gamgi_engine_number_light_recycle (light->object.number); gamgi_engine_remove_out_light (light); if (light_next == NULL) gamgi->light_end = light_before; if (light_before == NULL) gamgi->light_start = light_next; } /******************** external function ******************* * * * GAMGI_ENGINE_REMOVE_LAYER * * * * Remove all objects which belong to layer and remove * * the layer. Caution: the layer must be unlinked before! * **********************************************************/ void gamgi_engine_remove_layer (gamgi_layer *layer) { gamgi_dlist *dlist; gamgi_layer *layer_next, *layer_before; /************************************** * clean Undo,Save history mechanisms * **************************************/ if (layer->undo != NULL) gamgi_gtk_history_layer_reset (layer->undo); if (layer->save != NULL) gamgi_gtk_history_layer_reset (layer->save); /********************************* * remove layer global selection * *********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_LAYER, &gamgi->layers, "button_layer", layer->object.selection); /******************** * remove text list * ********************/ dlist = layer->text_start; while (dlist != NULL) { gamgi_engine_remove_text (GAMGI_CAST_TEXT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove orbital list * ***********************/ dlist = layer->orbital_start; while (dlist != NULL) { gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove atom list * ********************/ dlist = layer->atom_start; while (dlist != NULL) { gamgi_engine_remove_atom (GAMGI_CAST_ATOM dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************* * remove direction list * *************************/ dlist = layer->direction_start; while (dlist != NULL) { gamgi_engine_remove_direction (GAMGI_CAST_DIRECTION dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove plane list * *********************/ dlist = layer->plane_start; while (dlist != NULL) { gamgi_engine_remove_plane (GAMGI_CAST_PLANE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove group list * *********************/ dlist = layer->group_start; while (dlist != NULL) { gamgi_engine_remove_group (GAMGI_CAST_GROUP dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************ * remove molecule list * ************************/ dlist = layer->molecule_start; while (dlist != NULL) { gamgi_engine_remove_molecule (GAMGI_CAST_MOLECULE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /*********************** * remove cluster list * ***********************/ dlist = layer->cluster_start; while (dlist != NULL) { gamgi_engine_remove_cluster (GAMGI_CAST_CLUSTER dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /******************** * remove cell list * ********************/ dlist = layer->cell_start; while (dlist != NULL) { gamgi_engine_remove_cell (GAMGI_CAST_CELL dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove arrow list * *********************/ dlist = layer->arrow_start; while (dlist != NULL) { gamgi_engine_remove_arrow (GAMGI_CAST_ARROW dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove shape list * *********************/ dlist = layer->shape_start; while (dlist != NULL) { gamgi_engine_remove_shape (GAMGI_CAST_SHAPE dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove graph list * *********************/ dlist = layer->graph_start; while (dlist != NULL) { gamgi_engine_remove_graph (GAMGI_CAST_GRAPH dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /************************ * remove assembly list * ************************/ dlist = layer->assembly_start; while (dlist != NULL) { gamgi_engine_remove_assembly (GAMGI_CAST_ASSEMBLY dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /********************* * remove light list * *********************/ dlist = layer->light_start; while (dlist != NULL) { gamgi_engine_remove_light (GAMGI_CAST_LIGHT dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /**************** * remove layer * ****************/ /**************************************************************** * addressing must be done after removing the undo/save layers. * ****************************************************************/ layer_next = layer->next; layer_before = layer->before; gamgi_engine_number_layer_recycle (layer->object.number); gamgi_engine_remove_out_layer (layer); if (layer_next == NULL) gamgi->layer_end = layer_before; if (layer_before == NULL) gamgi->layer_start = layer_next; } /***************** external function **************** * * * GAMGI_ENGINE_REMOVE_WINDOW * * * * Remove all layers which belong to window and * * remove the window. A window object does not * * have a link, so it does not need to be unlinked. * ****************************************************/ void gamgi_engine_remove_window (gamgi_window *window) { gamgi_dlist *dlist; gamgi_window *window_next, *window_before; /************************************** * clean Undo,Save history mechanisms * **************************************/ if (window->history != NULL) gamgi_gtk_history_window_reset (window->history); /********************************** * remove window global selection * **********************************/ gamgi_global_selection_clean (GAMGI_ENGINE_WINDOW, &gamgi->windows, "button_window", window->object.selection); /********************* * remove layer list * *********************/ dlist = window->layer_start; while (dlist != NULL) { gamgi_engine_remove_layer (GAMGI_CAST_LAYER dlist->data); dlist = gamgi_engine_dlist_remove_start (dlist); } /***************** * remove window * *****************/ window_next = window->next; window_before = window->before; gamgi_engine_number_window_recycle (window->object.number); gamgi_engine_remove_out_window (window); if (window_next == NULL) gamgi->window_end = window_before; if (window_before == NULL) gamgi->window_start = window_next; } /*************** external function *********** * * * GAMGI_ENGINE_REMOVE_OBJECT * * * *********************************************/ void gamgi_engine_remove_object (gamgi_object *object) { switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_remove_text (GAMGI_CAST_TEXT object); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_remove_orbital (GAMGI_CAST_ORBITAL object); break; case GAMGI_ENGINE_BOND: gamgi_engine_remove_bond (GAMGI_CAST_BOND object); break; case GAMGI_ENGINE_ATOM: gamgi_engine_remove_atom (GAMGI_CAST_ATOM object); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_remove_direction (GAMGI_CAST_DIRECTION object); break; case GAMGI_ENGINE_PLANE: gamgi_engine_remove_plane (GAMGI_CAST_PLANE object); break; case GAMGI_ENGINE_GROUP: gamgi_engine_remove_group (GAMGI_CAST_GROUP object); break; case GAMGI_ENGINE_MOLECULE: gamgi_engine_remove_molecule (GAMGI_CAST_MOLECULE object); break; case GAMGI_ENGINE_CLUSTER: gamgi_engine_remove_cluster (GAMGI_CAST_CLUSTER object); break; case GAMGI_ENGINE_CELL: gamgi_engine_remove_cell (GAMGI_CAST_CELL object); break; case GAMGI_ENGINE_ARROW: gamgi_engine_remove_arrow (GAMGI_CAST_ARROW object); break; case GAMGI_ENGINE_SHAPE: gamgi_engine_remove_shape (GAMGI_CAST_SHAPE object); break; case GAMGI_ENGINE_GRAPH: gamgi_engine_remove_graph (GAMGI_CAST_GRAPH object); break; case GAMGI_ENGINE_ASSEMBLY: gamgi_engine_remove_assembly (GAMGI_CAST_ASSEMBLY object); break; case GAMGI_ENGINE_LIGHT: gamgi_engine_remove_light (GAMGI_CAST_LIGHT object); break; case GAMGI_ENGINE_LAYER: gamgi_engine_remove_layer (GAMGI_CAST_LAYER object); break; case GAMGI_ENGINE_WINDOW: gamgi_engine_remove_window (GAMGI_CAST_WINDOW object); break; } } /*************** external function *********** * * * GAMGI_ENGINE_REMOVE_GAMGI * * * * Deallocate memory for all GAMGI resources * * currently available that are directly * * controlled by the GAMGI engine. * * * *********************************************/ void gamgi_engine_remove_gamgi () { /****************************** * remove all linked objects: * * go through the window list * ******************************/ while (gamgi->window_end != NULL) gamgi_engine_remove_window (gamgi->window_end); /*********************************** * remove all unlinked objects: * * * * this is just a precaution, ALL * * GAMGI objects must be linked! * * * * remove parents before children! * ***********************************/ while (gamgi->layer_end != NULL) gamgi_engine_remove_layer (gamgi->layer_end); while (gamgi->light_end != NULL) gamgi_engine_remove_light (gamgi->light_end); while (gamgi->assembly_end != NULL) gamgi_engine_remove_assembly (gamgi->assembly_end); while (gamgi->graph_end != NULL) gamgi_engine_remove_graph (gamgi->graph_end); while (gamgi->shape_end != NULL) gamgi_engine_remove_shape (gamgi->shape_end); while (gamgi->arrow_end != NULL) gamgi_engine_remove_arrow (gamgi->arrow_end); while (gamgi->cell_end != NULL) gamgi_engine_remove_cell (gamgi->cell_end); while (gamgi->cluster_end != NULL) gamgi_engine_remove_cluster (gamgi->cluster_end); while (gamgi->molecule_end != NULL) gamgi_engine_remove_molecule (gamgi->molecule_end); while (gamgi->group_end != NULL) gamgi_engine_remove_group (gamgi->group_end); while (gamgi->plane_end != NULL) gamgi_engine_remove_plane (gamgi->plane_end); while (gamgi->direction_end != NULL) gamgi_engine_remove_direction (gamgi->direction_end); while (gamgi->atom_end != NULL) gamgi_engine_remove_atom (gamgi->atom_end); while (gamgi->bond_end != NULL) gamgi_engine_remove_bond (gamgi->bond_end); while (gamgi->orbital_end != NULL) gamgi_engine_remove_orbital (gamgi->orbital_end); while (gamgi->text_end != NULL) gamgi_engine_remove_text (gamgi->text_end); /************************************** * remove object number recycle lists * **************************************/ gamgi_engine_number_text_reset (); gamgi_engine_number_orbital_reset (); gamgi_engine_number_bond_reset (); gamgi_engine_number_atom_reset (); gamgi_engine_number_direction_reset (); gamgi_engine_number_plane_reset (); gamgi_engine_number_group_reset (); gamgi_engine_number_molecule_reset (); gamgi_engine_number_cluster_reset (); gamgi_engine_number_cell_reset (); gamgi_engine_number_arrow_reset (); gamgi_engine_number_shape_reset (); gamgi_engine_number_graph_reset (); gamgi_engine_number_assembly_reset (); gamgi_engine_number_light_reset (); gamgi_engine_number_layer_reset (); gamgi_engine_number_window_reset (); /************************ * remove configuration * ************************/ gamgi_global_remove_help (gamgi->help); gamgi_global_remove_text (gamgi->text); gamgi_global_remove_orbital (gamgi->orbital); gamgi_global_remove_bond (gamgi->bond); gamgi_global_remove_atom (gamgi->atom); gamgi_global_remove_direction (gamgi->direction); gamgi_global_remove_plane (gamgi->plane); gamgi_global_remove_group (gamgi->group); gamgi_global_remove_molecule (gamgi->molecule); gamgi_global_remove_cluster (gamgi->cluster); gamgi_global_remove_cell (gamgi->cell); gamgi_global_remove_arrow (gamgi->arrow); gamgi_global_remove_shape (gamgi->shape); gamgi_global_remove_graph (gamgi->graph); gamgi_global_remove_assembly (gamgi->assembly); gamgi_global_remove_light (gamgi->light); gamgi_global_remove_layer (gamgi->layer); gamgi_global_remove_window (gamgi->window); gamgi_global_remove_gamgi (gamgi->gamgi); /**************************** * remove font glyph arrays * ****************************/ gamgi_mesa_text_font_end (); /********************************* * remove hash table to speed up * * atom element name recognition * *********************************/ gamgi_math_hash_remove (gamgi->element, GAMGI_CHEM_HASH_SIZE); /**************************************** * remove the singleton gamgi structure * ****************************************/ free (gamgi); } gamgi-0.17.5/src/engine/gamgi_engine_remove.h000066400000000000000000000026501433127522700210740ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_remove.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ void gamgi_engine_remove_text (gamgi_text *text); void gamgi_engine_remove_orbital (gamgi_orbital *orbital); void gamgi_engine_remove_bond (gamgi_bond *bond); void gamgi_engine_remove_atom (gamgi_atom *atom); void gamgi_engine_remove_direction (gamgi_direction *direction); void gamgi_engine_remove_plane (gamgi_plane *plane); void gamgi_engine_remove_group (gamgi_group *group); void gamgi_engine_remove_molecule (gamgi_molecule *molecule); void gamgi_engine_remove_cluster (gamgi_cluster *cluster); void gamgi_engine_remove_cell (gamgi_cell *cell); void gamgi_engine_remove_arrow (gamgi_arrow *arrow); void gamgi_engine_remove_shape (gamgi_shape *shape); void gamgi_engine_remove_graph (gamgi_graph *graph); void gamgi_engine_remove_assembly (gamgi_assembly *assembly); void gamgi_engine_remove_light (gamgi_light *light); void gamgi_engine_remove_layer (gamgi_layer *layer); void gamgi_engine_remove_window (gamgi_window *window); void gamgi_engine_remove_object (gamgi_object *object); void gamgi_engine_remove_gamgi (void); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_remove_out.c000066400000000000000000000100731433127522700217540ustar00rootroot00000000000000/*********************************************** * * $GAMGI/src/engine/gamgi_engine_remove_out.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" void gamgi_engine_remove_out_text (gamgi_text *text) { /* bypass text list and free text */ if (text->before) text->before->next = text->next; if (text->next) text->next->before = text->before; free(text); } void gamgi_engine_remove_out_orbital (gamgi_orbital *orbital) { /* bypass orbital list and free orbital */ if (orbital->before) orbital->before->next = orbital->next; if (orbital->next) orbital->next->before = orbital->before; free(orbital); } void gamgi_engine_remove_out_bond (gamgi_bond *bond) { /* bypass bond list and free bond */ if (bond->before) bond->before->next = bond->next; if (bond->next) bond->next->before = bond->before; free(bond); } void gamgi_engine_remove_out_atom (gamgi_atom *atom) { /* bypass atom list and free atom */ if (atom->before) atom->before->next = atom->next; if (atom->next) atom->next->before = atom->before; free(atom); } void gamgi_engine_remove_out_direction (gamgi_direction *direction) { /* bypass direction list and free direction */ if (direction->before) direction->before->next = direction->next; if (direction->next) direction->next->before = direction->before; free(direction); } void gamgi_engine_remove_out_plane (gamgi_plane *plane) { /* bypass plane list and free plane */ if (plane->before) plane->before->next = plane->next; if (plane->next) plane->next->before = plane->before; free(plane); } void gamgi_engine_remove_out_group (gamgi_group *group) { /* bypass group list and free group */ if (group->before) group->before->next = group->next; if (group->next) group->next->before = group->before; free(group); } void gamgi_engine_remove_out_molecule (gamgi_molecule *molecule) { /* bypass molecule list and free molecule */ if (molecule->before) molecule->before->next = molecule->next; if (molecule->next) molecule->next->before = molecule->before; free(molecule); } void gamgi_engine_remove_out_cluster (gamgi_cluster *cluster) { /* bypass cluster list and free cluster */ if (cluster->before) cluster->before->next = cluster->next; if (cluster->next) cluster->next->before = cluster->before; free(cluster); } void gamgi_engine_remove_out_cell (gamgi_cell *cell) { /* bypass cell list and free cell */ if (cell->before) cell->before->next = cell->next; if (cell->next) cell->next->before = cell->before; free(cell); } void gamgi_engine_remove_out_arrow (gamgi_arrow *arrow) { /* bypass arrow list and free arrow */ if (arrow->before) arrow->before->next = arrow->next; if (arrow->next) arrow->next->before = arrow->before; free(arrow); } void gamgi_engine_remove_out_shape (gamgi_shape *shape) { /* bypass shape list and free shape */ if (shape->before) shape->before->next = shape->next; if (shape->next) shape->next->before = shape->before; free(shape); } void gamgi_engine_remove_out_graph (gamgi_graph *graph) { /* bypass graph list and free graph */ if (graph->before) graph->before->next = graph->next; if (graph->next) graph->next->before = graph->before; free(graph); } void gamgi_engine_remove_out_assembly (gamgi_assembly *assembly) { /* bypass assembly list and free assembly */ if (assembly->before) assembly->before->next = assembly->next; if (assembly->next) assembly->next->before = assembly->before; free(assembly); } void gamgi_engine_remove_out_light (gamgi_light *light) { /* bypass light list and free light */ if (light->before) light->before->next = light->next; if (light->next) light->next->before = light->before; free(light); } void gamgi_engine_remove_out_layer (gamgi_layer *layer) { /* bypass layer list and free layer */ if (layer->before) layer->before->next = layer->next; if (layer->next) layer->next->before = layer->before; free(layer); } void gamgi_engine_remove_out_window (gamgi_window *window) { /* bypass window list and free window */ if (window->before) window->before->next = window->next; if (window->next) window->next->before = window->before; free(window); } gamgi-0.17.5/src/engine/gamgi_engine_remove_out.h000066400000000000000000000026231433127522700217630ustar00rootroot00000000000000/*********************************************** * * $GAMGI/src/engine/gamgi_engine_remove_out.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ void gamgi_engine_remove_out_text (gamgi_text *text); void gamgi_engine_remove_out_orbital (gamgi_orbital *orbital); void gamgi_engine_remove_out_bond (gamgi_bond *bond); void gamgi_engine_remove_out_atom (gamgi_atom *atom); void gamgi_engine_remove_out_direction (gamgi_direction *direction); void gamgi_engine_remove_out_plane (gamgi_plane *plane); void gamgi_engine_remove_out_group (gamgi_group *group); void gamgi_engine_remove_out_molecule (gamgi_molecule *molecule); void gamgi_engine_remove_out_cluster (gamgi_cluster *cluster); void gamgi_engine_remove_out_cell (gamgi_cell *cell); void gamgi_engine_remove_out_arrow (gamgi_arrow *arrow); void gamgi_engine_remove_out_shape (gamgi_shape *shape); void gamgi_engine_remove_out_graph (gamgi_graph *graph); void gamgi_engine_remove_out_assembly (gamgi_assembly *assembly); void gamgi_engine_remove_out_light (gamgi_light *light); void gamgi_engine_remove_out_layer (gamgi_layer *layer); void gamgi_engine_remove_out_window (gamgi_window *window); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_reparent.c000066400000000000000000000677611433127522700214300ustar00rootroot00000000000000/********************************************* * * $GAMGI/src/engine/gamgi_engine_reparent.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_global.h" #include "gamgi_engine_link.h" #include "gamgi_engine_unlink.h" #include "gamgi_engine_list.h" #include "gamgi_engine_number.h" /*********************** external function ************************** * * * GAMGI_ENGINE_REPARENT_TEXT * * * ********************************************************************/ void gamgi_engine_reparent_text (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_text *child; gamgi_text *text; gamgi_orbital *orbital; gamgi_atom *atom; gamgi_direction *direction; gamgi_plane *plane; gamgi_group *group; gamgi_molecule *molecule; gamgi_cluster *cluster; gamgi_cell *cell; gamgi_assembly *assembly; gamgi_layer *layer; /*********************************** * link text objects to new parent * ***********************************/ switch (parent->class) { case GAMGI_ENGINE_TEXT: text = GAMGI_CAST_TEXT parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_text (child, text); } break; case GAMGI_ENGINE_ORBITAL: orbital = GAMGI_CAST_ORBITAL parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_orbital (child, orbital); } break; case GAMGI_ENGINE_ATOM: atom = GAMGI_CAST_ATOM parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_atom (child, atom); } break; case GAMGI_ENGINE_DIRECTION: direction = GAMGI_CAST_DIRECTION parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_direction (child, direction); } break; case GAMGI_ENGINE_PLANE: plane = GAMGI_CAST_PLANE parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_plane (child, plane); } break; case GAMGI_ENGINE_GROUP: group = GAMGI_CAST_GROUP parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_group (child, group); } break; case GAMGI_ENGINE_MOLECULE: molecule = GAMGI_CAST_MOLECULE parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_molecule (child, molecule); } break; case GAMGI_ENGINE_CLUSTER: cluster = GAMGI_CAST_CLUSTER parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_cluster (child, cluster); } break; case GAMGI_ENGINE_CELL: cell = GAMGI_CAST_CELL parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_cell (child, cell); } break; case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_TEXT dlist->data; dlist = dlist->next; gamgi_engine_unlink_text (child); gamgi_engine_link_text_layer (child, layer); } break; } } /*********************** external function ************************** * * * GAMGI_ENGINE_REPARENT_ORBITAL * * * ********************************************************************/ void gamgi_engine_reparent_orbital (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_orbital *child; gamgi_atom *atom; gamgi_direction *direction; gamgi_plane *plane; gamgi_group *group; gamgi_molecule *molecule; gamgi_cluster *cluster; gamgi_cell *cell; gamgi_assembly *assembly; gamgi_layer *layer; /************************************** * link orbital objects to new parent * **************************************/ switch (parent->class) { case GAMGI_ENGINE_ATOM: atom = GAMGI_CAST_ATOM parent; while (dlist != NULL) { child = GAMGI_CAST_ORBITAL dlist->data; dlist = dlist->next; gamgi_engine_unlink_orbital (child); gamgi_engine_link_orbital_atom (child, atom); } break; case GAMGI_ENGINE_DIRECTION: direction = GAMGI_CAST_DIRECTION parent; while (dlist != NULL) { child = GAMGI_CAST_ORBITAL dlist->data; dlist = dlist->next; gamgi_engine_unlink_orbital (child); gamgi_engine_link_orbital_direction (child, direction); } break; case GAMGI_ENGINE_PLANE: plane = GAMGI_CAST_PLANE parent; while (dlist != NULL) { child = GAMGI_CAST_ORBITAL dlist->data; dlist = dlist->next; gamgi_engine_unlink_orbital (child); gamgi_engine_link_orbital_plane (child, plane); } break; case GAMGI_ENGINE_GROUP: group = GAMGI_CAST_GROUP parent; while (dlist != NULL) { child = GAMGI_CAST_ORBITAL dlist->data; dlist = dlist->next; gamgi_engine_unlink_orbital (child); gamgi_engine_link_orbital_group (child, group); } break; case GAMGI_ENGINE_MOLECULE: molecule = GAMGI_CAST_MOLECULE parent; while (dlist != NULL) { child = GAMGI_CAST_ORBITAL dlist->data; dlist = dlist->next; gamgi_engine_unlink_orbital (child); gamgi_engine_link_orbital_molecule (child, molecule); } break; case GAMGI_ENGINE_CLUSTER: cluster = GAMGI_CAST_CLUSTER parent; while (dlist != NULL) { child = GAMGI_CAST_ORBITAL dlist->data; dlist = dlist->next; gamgi_engine_unlink_orbital (child); gamgi_engine_link_orbital_cluster (child, cluster); } break; case GAMGI_ENGINE_CELL: cell = GAMGI_CAST_CELL parent; while (dlist != NULL) { child = GAMGI_CAST_ORBITAL dlist->data; dlist = dlist->next; gamgi_engine_unlink_orbital (child); gamgi_engine_link_orbital_cell (child, cell); } break; case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_ORBITAL dlist->data; dlist = dlist->next; gamgi_engine_unlink_orbital (child); gamgi_engine_link_orbital_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_ORBITAL dlist->data; dlist = dlist->next; gamgi_engine_unlink_orbital (child); gamgi_engine_link_orbital_layer (child, layer); } break; } } /************************* external function ************************* * * * GAMGI_ENGINE_REPARENT_ATOM * * * *********************************************************************/ void gamgi_engine_reparent_atom (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_atom *child; gamgi_direction *direction; gamgi_plane *plane; gamgi_group *group; gamgi_molecule *molecule; gamgi_cluster *cluster; gamgi_cell *cell; gamgi_assembly *assembly; gamgi_layer *layer; /************************************ * link atoms objects to new parent * ************************************/ switch (parent->class) { case GAMGI_ENGINE_DIRECTION: direction = GAMGI_CAST_DIRECTION parent; while (dlist != NULL) { child = GAMGI_CAST_ATOM dlist->data; dlist = dlist->next; gamgi_engine_unlink_atom (child); gamgi_engine_link_atom_direction (child, direction); } break; case GAMGI_ENGINE_PLANE: plane = GAMGI_CAST_PLANE parent; while (dlist != NULL) { child = GAMGI_CAST_ATOM dlist->data; dlist = dlist->next; gamgi_engine_unlink_atom (child); gamgi_engine_link_atom_plane (child, plane); } break; case GAMGI_ENGINE_GROUP: group = GAMGI_CAST_GROUP parent; while (dlist != NULL) { child = GAMGI_CAST_ATOM dlist->data; dlist = dlist->next; gamgi_engine_unlink_atom (child); gamgi_engine_link_atom_group (child, group); } break; case GAMGI_ENGINE_MOLECULE: molecule = GAMGI_CAST_MOLECULE parent; while (dlist != NULL) { child = GAMGI_CAST_ATOM dlist->data; dlist = dlist->next; gamgi_engine_unlink_atom (child); gamgi_engine_link_atom_molecule (child, molecule); } break; case GAMGI_ENGINE_CLUSTER: cluster = GAMGI_CAST_CLUSTER parent; while (dlist != NULL) { child = GAMGI_CAST_ATOM dlist->data; dlist = dlist->next; gamgi_engine_unlink_atom (child); gamgi_engine_link_atom_cluster (child, cluster); } break; case GAMGI_ENGINE_CELL: cell = GAMGI_CAST_CELL parent; while (dlist != NULL) { child = GAMGI_CAST_ATOM dlist->data; dlist = dlist->next; gamgi_engine_unlink_atom (child); gamgi_engine_link_atom_cell (child, cell); } break; case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_ATOM dlist->data; dlist = dlist->next; gamgi_engine_unlink_atom (child); gamgi_engine_link_atom_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_ATOM dlist->data; dlist = dlist->next; gamgi_engine_unlink_atom (child); gamgi_engine_link_atom_layer (child, layer); } break; } } /* ************************ external function ************************ * * * GAMGI_ENGINE_REPARENT_DIRECTION * * * *********************************************************************/ void gamgi_engine_reparent_direction (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_direction *child; gamgi_plane *plane; gamgi_group *group; gamgi_molecule *molecule; gamgi_cluster *cluster; gamgi_cell *cell; gamgi_assembly *assembly; gamgi_layer *layer; /**************************************** * link direction objects to new parent * ****************************************/ switch (parent->class) { case GAMGI_ENGINE_PLANE: plane = GAMGI_CAST_PLANE parent; while (dlist != NULL) { child = GAMGI_CAST_DIRECTION dlist->data; dlist = dlist->next; gamgi_engine_unlink_direction (child); gamgi_engine_link_direction_plane (child, plane); } break; case GAMGI_ENGINE_GROUP: group = GAMGI_CAST_GROUP parent; while (dlist != NULL) { child = GAMGI_CAST_DIRECTION dlist->data; dlist = dlist->next; gamgi_engine_unlink_direction (child); gamgi_engine_link_direction_group (child, group); } break; case GAMGI_ENGINE_MOLECULE: molecule = GAMGI_CAST_MOLECULE parent; while (dlist != NULL) { child = GAMGI_CAST_DIRECTION dlist->data; dlist = dlist->next; gamgi_engine_unlink_direction (child); gamgi_engine_link_direction_molecule (child, molecule); } break; case GAMGI_ENGINE_CLUSTER: cluster = GAMGI_CAST_CLUSTER parent; while (dlist != NULL) { child = GAMGI_CAST_DIRECTION dlist->data; dlist = dlist->next; gamgi_engine_unlink_direction (child); gamgi_engine_link_direction_cluster (child, cluster); } break; case GAMGI_ENGINE_CELL: cell = GAMGI_CAST_CELL parent; while (dlist != NULL) { child = GAMGI_CAST_DIRECTION dlist->data; dlist = dlist->next; gamgi_engine_unlink_direction (child); gamgi_engine_link_direction_cell (child, cell); } break; case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_DIRECTION dlist->data; dlist = dlist->next; gamgi_engine_unlink_direction (child); gamgi_engine_link_direction_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_DIRECTION dlist->data; dlist = dlist->next; gamgi_engine_unlink_direction (child); gamgi_engine_link_direction_layer (child, layer); } break; } } /************************* external function ************************** * * * GAMGI_ENGINE_REPARENT_PLANE * * * **********************************************************************/ void gamgi_engine_reparent_plane (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_plane *child; gamgi_group *group; gamgi_molecule *molecule; gamgi_cluster *cluster; gamgi_cell *cell; gamgi_assembly *assembly; gamgi_layer *layer; /************************************ * link plane objects to new parent * ************************************/ switch (parent->class) { case GAMGI_ENGINE_GROUP: group = GAMGI_CAST_GROUP parent; while (dlist != NULL) { child = GAMGI_CAST_PLANE dlist->data; dlist = dlist->next; gamgi_engine_unlink_plane (child); gamgi_engine_link_plane_group (child, group); } break; case GAMGI_ENGINE_MOLECULE: molecule = GAMGI_CAST_MOLECULE parent; while (dlist != NULL) { child = GAMGI_CAST_PLANE dlist->data; dlist = dlist->next; gamgi_engine_unlink_plane (child); gamgi_engine_link_plane_molecule (child, molecule); } break; case GAMGI_ENGINE_CLUSTER: cluster = GAMGI_CAST_CLUSTER parent; while (dlist != NULL) { child = GAMGI_CAST_PLANE dlist->data; dlist = dlist->next; gamgi_engine_unlink_plane (child); gamgi_engine_link_plane_cluster (child, cluster); } break; case GAMGI_ENGINE_CELL: cell = GAMGI_CAST_CELL parent; while (dlist != NULL) { child = GAMGI_CAST_PLANE dlist->data; dlist = dlist->next; gamgi_engine_unlink_plane (child); gamgi_engine_link_plane_cell (child, cell); } break; case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_PLANE dlist->data; dlist = dlist->next; gamgi_engine_unlink_plane (child); gamgi_engine_link_plane_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_PLANE dlist->data; dlist = dlist->next; gamgi_engine_unlink_plane (child); gamgi_engine_link_plane_layer (child, layer); } break; } } /************************ external function ************************** * * * GAMGI_ENGINE_REPARENT_GROUP * * * *********************************************************************/ void gamgi_engine_reparent_group (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_group *child; gamgi_group *group; gamgi_molecule *molecule; gamgi_cluster *cluster; gamgi_cell *cell; gamgi_assembly *assembly; gamgi_layer *layer; /************************************ * link group objects to new parent * ************************************/ switch (parent->class) { case GAMGI_ENGINE_GROUP: group = GAMGI_CAST_GROUP parent; while (dlist != NULL) { child = GAMGI_CAST_GROUP dlist->data; dlist = dlist->next; gamgi_engine_unlink_group (child); gamgi_engine_link_group_group (child, group); } break; case GAMGI_ENGINE_MOLECULE: molecule = GAMGI_CAST_MOLECULE parent; while (dlist != NULL) { child = GAMGI_CAST_GROUP dlist->data; dlist = dlist->next; gamgi_engine_unlink_group (child); gamgi_engine_link_group_molecule (child, molecule); } break; case GAMGI_ENGINE_CLUSTER: cluster = GAMGI_CAST_CLUSTER parent; while (dlist != NULL) { child = GAMGI_CAST_GROUP dlist->data; dlist = dlist->next; gamgi_engine_unlink_group (child); gamgi_engine_link_group_cluster (child, cluster); } break; case GAMGI_ENGINE_CELL: cell = GAMGI_CAST_CELL parent; while (dlist != NULL) { child = GAMGI_CAST_GROUP dlist->data; dlist = dlist->next; gamgi_engine_unlink_group (child); gamgi_engine_link_group_cell (child, cell); } break; case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_GROUP dlist->data; dlist = dlist->next; gamgi_engine_unlink_group (child); gamgi_engine_link_group_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_GROUP dlist->data; dlist = dlist->next; gamgi_engine_unlink_group (child); gamgi_engine_link_group_layer (child, layer); } break; } } /************************* external function ********************** * * * GAMGI_ENGINE_REPARENT_MOLECULE * * * ******************************************************************/ void gamgi_engine_reparent_molecule (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_molecule *child; gamgi_cluster *cluster; gamgi_cell *cell; gamgi_assembly *assembly; gamgi_layer *layer; /*************************************** * link molecule objects to new parent * ***************************************/ switch (parent->class) { case GAMGI_ENGINE_CLUSTER: cluster = GAMGI_CAST_CLUSTER parent; while (dlist != NULL) { child = GAMGI_CAST_MOLECULE dlist->data; dlist = dlist->next; gamgi_engine_unlink_molecule (child); gamgi_engine_link_molecule_cluster (child, cluster); } break; case GAMGI_ENGINE_CELL: cell = GAMGI_CAST_CELL parent; while (dlist != NULL) { child = GAMGI_CAST_MOLECULE dlist->data; dlist = dlist->next; gamgi_engine_unlink_molecule (child); gamgi_engine_link_molecule_cell (child, cell); } break; case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_MOLECULE dlist->data; dlist = dlist->next; gamgi_engine_unlink_molecule (child); gamgi_engine_link_molecule_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_MOLECULE dlist->data; dlist = dlist->next; gamgi_engine_unlink_molecule (child); gamgi_engine_link_molecule_layer (child, layer); } break; } } /************************* external function ******************************* * * * GAMGI_ENGINE_REPARENT_CLUSTER * * * ***************************************************************************/ void gamgi_engine_reparent_cluster (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_cluster *child; gamgi_cluster *cluster; gamgi_cell *cell; gamgi_assembly *assembly; gamgi_layer *layer; /************************************** * link cluster objects to new parent * **************************************/ switch (parent->class) { case GAMGI_ENGINE_CLUSTER: cluster = GAMGI_CAST_CLUSTER parent; while (dlist != NULL) { child = GAMGI_CAST_CLUSTER dlist->data; dlist = dlist->next; gamgi_engine_unlink_cluster (child); gamgi_engine_link_cluster_cluster (child, cluster); } break; case GAMGI_ENGINE_CELL: cell = GAMGI_CAST_CELL parent; while (dlist != NULL) { child = GAMGI_CAST_CLUSTER dlist->data; dlist = dlist->next; gamgi_engine_unlink_cluster (child); gamgi_engine_link_cluster_cell (child, cell); } break; case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_CLUSTER dlist->data; dlist = dlist->next; gamgi_engine_unlink_cluster (child); gamgi_engine_link_cluster_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_CLUSTER dlist->data; dlist = dlist->next; gamgi_engine_unlink_cluster (child); gamgi_engine_link_cluster_layer (child, layer); } break; } } /************************ external function ************************ * * * GAMGI_ENGINE_REPARENT_CELL * * * *******************************************************************/ void gamgi_engine_reparent_cell (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_cell *child; gamgi_assembly *assembly; gamgi_layer *layer; /*********************************** * link cell objects to new parent * ***********************************/ switch (parent->class) { case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_CELL dlist->data; dlist = dlist->next; gamgi_engine_unlink_cell (child); gamgi_engine_link_cell_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_CELL dlist->data; dlist = dlist->next; gamgi_engine_unlink_cell (child); gamgi_engine_link_cell_layer (child, layer); } break; } } /************************** external function ******************* * * * GAMGI_ENGINE_REPARENT_ARROW * * * ****************************************************************/ void gamgi_engine_reparent_arrow (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_arrow *child; gamgi_assembly *assembly; gamgi_layer *layer; /************************************ * link arrow objects to new parent * ************************************/ switch (parent->class) { case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_ARROW dlist->data; dlist = dlist->next; gamgi_engine_unlink_arrow (child); gamgi_engine_link_arrow_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_ARROW dlist->data; dlist = dlist->next; gamgi_engine_unlink_arrow (child); gamgi_engine_link_arrow_layer (child, layer); } break; } } /************************** external function ******************** * * * GAMGI_ENGINE_REPARENT_SHAPE * * * *****************************************************************/ void gamgi_engine_reparent_shape (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_shape *child; gamgi_assembly *assembly; gamgi_layer *layer; /************************************ * link shape objects to new parent * ************************************/ switch (parent->class) { case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_SHAPE dlist->data; dlist = dlist->next; gamgi_engine_unlink_shape (child); gamgi_engine_link_shape_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_SHAPE dlist->data; dlist = dlist->next; gamgi_engine_unlink_shape (child); gamgi_engine_link_shape_layer (child, layer); } break; } } /************************** external function ******************** * * * GAMGI_ENGINE_REPARENT_GRAPH * * * *****************************************************************/ void gamgi_engine_reparent_graph (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_graph *child; gamgi_assembly *assembly; gamgi_layer *layer; /************************************ * link graph objects to new parent * ************************************/ switch (parent->class) { case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_GRAPH dlist->data; dlist = dlist->next; gamgi_engine_unlink_graph (child); gamgi_engine_link_graph_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_GRAPH dlist->data; dlist = dlist->next; gamgi_engine_unlink_graph (child); gamgi_engine_link_graph_layer (child, layer); } break; } } /************************** external function ******************** * * * GAMGI_ENGINE_REPARENT_ASSEMBLY * * * *****************************************************************/ void gamgi_engine_reparent_assembly (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_assembly *child; gamgi_assembly *assembly; gamgi_layer *layer; /*************************************** * link assembly objects to new parent * ***************************************/ switch (parent->class) { case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; while (dlist != NULL) { child = GAMGI_CAST_ASSEMBLY dlist->data; dlist = dlist->next; gamgi_engine_unlink_assembly (child); gamgi_engine_link_assembly_assembly (child, assembly); } break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_ASSEMBLY dlist->data; dlist = dlist->next; gamgi_engine_unlink_assembly (child); gamgi_engine_link_assembly_layer (child, layer); } break; } } /************************** external function ******************** * * * GAMGI_ENGINE_REPARENT_LIGHT * * * *****************************************************************/ void gamgi_engine_reparent_light (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_light *child; gamgi_layer *layer; /*************************************** * link assembly objects to new parent * ***************************************/ switch (parent->class) { case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; while (dlist != NULL) { child = GAMGI_CAST_LIGHT dlist->data; dlist = dlist->next; gamgi_engine_unlink_light (child); gamgi_engine_link_light_layer (child, layer); } break; } } /************************** external function ******************** * * * GAMGI_ENGINE_REPARENT_LAYER * * * *****************************************************************/ void gamgi_engine_reparent_layer (gamgi_dlist *dlist, gamgi_object *parent) { gamgi_layer *child; gamgi_window *window; /*************************************** * link assembly objects to new parent * ***************************************/ switch (parent->class) { case GAMGI_ENGINE_WINDOW: window = GAMGI_CAST_WINDOW parent; while (dlist != NULL) { child = GAMGI_CAST_LAYER dlist->data; dlist = dlist->next; gamgi_engine_unlink_layer (child); gamgi_engine_link_layer_window (child, window); } break; } } gamgi-0.17.5/src/engine/gamgi_engine_reparent.h000066400000000000000000000030351433127522700214150ustar00rootroot00000000000000/********************************************* * * $GAMGI/src/engine/gamgi_engine_reparent.h * * Copyright (C) 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ void gamgi_engine_reparent_text (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_orbital (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_atom (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_direction (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_plane (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_group (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_molecule (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_cluster (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_cell (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_arrow (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_shape (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_graph (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_assembly (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_light (gamgi_dlist *dlist, gamgi_object *parent); void gamgi_engine_reparent_layer (gamgi_dlist *dlist, gamgi_object *parent); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_start.c000066400000000000000000000440601433127522700207300ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_start.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_mesa.h" #include "gamgi_chem.h" #include "gamgi_phys.h" #include "gamgi_global.h" #include "gamgi_engine_number.h" #include "gamgi_global_start.h" /**** internal function ****** * * * STATIC_START * * * * Initialise GAMGI objects. * * * *****************************/ void gamgi_engine_start_object (gamgi_object *object, int class) { strcpy (object->name, ""); strcpy (object->label, ""); object->class = class; object->scale = GAMGI_MESA_SCALE; object->task = 0; object->selection = NULL; object->dlist = NULL; object->object = NULL; } /**** external function ***** * * * GAMGI_ENGINE_START_TEXT * * * * Initialise text objects. * * * ****************************/ void gamgi_engine_start_text (gamgi_text *text) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT text, GAMGI_ENGINE_TEXT); text->object.number = gamgi_engine_number_text_get (); /******************* * initialise text * *******************/ text->draw = NULL; text->mark = 0; text->origin[0] = 0.0; text->origin[1] = 0.0; text->origin[2] = 0.0; text->center[0] = 0.0; text->center[1] = 0.0; text->center[2] = 0.0; text->quaternion[0] = 0.0; text->quaternion[1] = 0.0; text->quaternion[2] = 0.0; text->quaternion[3] = 1.0; text->string = NULL; text->length = 0; text->style = FALSE; text->font = FALSE; } /******* external function ***** * * * GAMGI_ENGINE_START_ORBITAL * * * * Initialise orbital objects. * * * *******************************/ void gamgi_engine_start_orbital (gamgi_orbital *orbital) { int i; /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT orbital, GAMGI_ENGINE_ORBITAL); orbital->object.number = gamgi_engine_number_orbital_get (); /********************** * initialise orbital * **********************/ orbital->draw = NULL; orbital->n = 0; orbital->l = 0; orbital->m = 0; orbital->charge = 0.0; orbital->style = FALSE; orbital->radius = 0.0; orbital->density = 0.0; orbital->sampling = 0; orbital->seed = 0; orbital->phase = FALSE; orbital->frame = FALSE; for (i = 0; i < 8; i++) orbital->octants[i] = 0; orbital->axes = FALSE; orbital->dots[0] = 0; orbital->dots[1] = 0; orbital->dots[2] = 0; orbital->points = NULL; orbital->lines= NULL; orbital->n_points = 0; orbital->n_lines = 0; orbital->origin[0] = 0.0; orbital->origin[1] = 0.0; orbital->origin[2] = 0.0; orbital->center[0] = 0.0; orbital->center[1] = 0.0; orbital->center[2] = 0.0; orbital->quaternion[0] = 0.0; orbital->quaternion[1] = 0.0; orbital->quaternion[2] = 0.0; orbital->quaternion[3] = 1.0; } /**** external function ***** * * * GAMGI_ENGINE_START_BOND * * * * Initialise bond objects. * * * ****************************/ void gamgi_engine_start_bond (gamgi_bond *bond) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT bond, GAMGI_ENGINE_BOND); bond->object.number = gamgi_engine_number_bond_get (); /******************* * initialise bond * *******************/ bond->draw = NULL; bond->covalency = -1.0; bond->order = 1.0; bond->size = 1.0; bond->color = FALSE; bond->first = TRUE; bond->copy = NULL; bond->atom1 = NULL; bond->atom2 = NULL; bond->dlist1 = NULL; bond->dlist2 = NULL; } /**** external function ***** * * * GAMGI_ENGINE_START_ATOM * * * * Initialise atom objects. * * * ****************************/ void gamgi_engine_start_atom (gamgi_atom *atom) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT atom, GAMGI_ENGINE_ATOM); atom->object.number = gamgi_engine_number_atom_get (); /******************* * initialise atom * *******************/ atom->draw = NULL; atom->mark = 0; atom->size = 1.0; atom->variancy = 0.0; atom->mass = 0.0; atom->radius = 0.0; atom->charge = 0.0; atom->temperature = 0.0; atom->occupancy = 1.0; } /******** external function ****** * * * GAMGI_ENGINE_START_DIRECTION * * * * Initialise direction objects. * * * *********************************/ void gamgi_engine_start_direction (gamgi_direction *direction) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT direction, GAMGI_ENGINE_DIRECTION); direction->object.number = gamgi_engine_number_direction_get (); /************************ * initialise direction * ************************/ direction->reference = FALSE; direction->uvw[0] = 0; direction->uvw[1] = 0; direction->uvw[2] = 0; direction->vectors = FALSE; direction->node[0] = 0; direction->node[1] = 0; direction->node[2] = 0; direction->node[3] = 0; direction->origin[0] = 0.0; direction->origin[1] = 0.0; direction->origin[2] = 0.0; direction->center[0] = 0.0; direction->center[1] = 0.0; direction->center[2] = 0.0; direction->quaternion[0] = 0.0; direction->quaternion[1] = 0.0; direction->quaternion[2] = 0.0; direction->quaternion[3] = 1.0; direction->draw = NULL; direction->net = NULL; direction->model = FALSE; direction->points = NULL; direction->loops = NULL; direction->n_points = 0; direction->n_loops = 0; } /***** external function ***** * * * GAMGI_ENGINE_START_PLANE * * * * Initialise plane objects. * * * *****************************/ void gamgi_engine_start_plane (gamgi_plane *plane) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT plane, GAMGI_ENGINE_PLANE); plane->object.number = gamgi_engine_number_plane_get (); /******************** * initialise plane * ********************/ plane->reference = FALSE; plane->hkl[0] = 0; plane->hkl[1] = 0; plane->hkl[2] = 0; plane->vectors = FALSE; plane->order = 1; plane->origin[0] = 0.0; plane->origin[1] = 0.0; plane->origin[2] = 0.0; plane->center[0] = 0.0; plane->center[1] = 0.0; plane->center[2] = 0.0; plane->quaternion[0] = 0.0; plane->quaternion[1] = 0.0; plane->quaternion[2] = 0.0; plane->quaternion[3] = 1.0; plane->draw = NULL; plane->net = NULL; plane->model = FALSE; plane->points = NULL; plane->loops = NULL; plane->n_points = 0; plane->n_loops = 0; } /***** external function ***** * * * GAMGI_ENGINE_START_GROUP * * * * Initialise group objects. * * * *****************************/ void gamgi_engine_start_group (gamgi_group *group) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT group, GAMGI_ENGINE_GROUP); group->object.number = gamgi_engine_number_group_get (); /******************** * initialise group * ********************/ group->draw = NULL; group->reference = FALSE; group->mark = 0; group->origin[0] = 0.0; group->origin[1] = 0.0; group->origin[2] = 0.0; group->center[0] = 0.0; group->center[1] = 0.0; group->center[2] = 0.0; group->quaternion[0] = 0.0; group->quaternion[1] = 0.0; group->quaternion[2] = 0.0; group->quaternion[3] = 1.0; group->points = NULL; group->loops = NULL; group->n_points = 0; group->n_loops = 0; group->faces = FALSE; } /******* external function ****** * * * GAMGI_ENGINE_START_MOLECULE * * * * Initialise molecule objects. * * * ********************************/ void gamgi_engine_start_molecule (gamgi_molecule *molecule) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT molecule, GAMGI_ENGINE_MOLECULE); molecule->object.number = gamgi_engine_number_molecule_get (); /*********************** * initialise molecule * ***********************/ molecule->origin[0] = 0.0; molecule->origin[1] = 0.0; molecule->origin[2] = 0.0; molecule->center[0] = 0.0; molecule->center[1] = 0.0; molecule->center[2] = 0.0; molecule->quaternion[0] = 0.0; molecule->quaternion[1] = 0.0; molecule->quaternion[2] = 0.0; molecule->quaternion[3] = 1.0; molecule->draw = NULL; } /****** external function ****** * * * GAMGI_ENGINE_START_CLUSTER * * * * Initialise cluster objects. * * * *******************************/ void gamgi_engine_start_cluster (gamgi_cluster *cluster) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT cluster, GAMGI_ENGINE_CLUSTER); cluster->object.number = gamgi_engine_number_cluster_get (); /********************** * initialise cluster * **********************/ cluster->reference = FALSE; cluster->mark = 0; cluster->origin[0] = 0.0; cluster->origin[1] = 0.0; cluster->origin[2] = 0.0; cluster->center[0] = 0.0; cluster->center[1] = 0.0; cluster->center[2] = 0.0; cluster->quaternion[0] = 0.0; cluster->quaternion[1] = 0.0; cluster->quaternion[2] = 0.0; cluster->quaternion[3] = 1.0; cluster->points = NULL; cluster->loops = NULL; cluster->colors = NULL; cluster->paints = NULL; cluster->n_points = 0; cluster->n_loops = 0; cluster->n_colors = 0; cluster->n_paints = 0; cluster->atoms = 0; cluster->faces = FALSE; } /***** external function **** * * * GAMGI_ENGINE_START_CELL * * * * Initialise cell objects. * * * ****************************/ void gamgi_engine_start_cell (gamgi_cell *cell) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT cell, GAMGI_ENGINE_CELL); cell->object.number = gamgi_engine_number_cell_get (); /******************** * initialise cell * ********************/ cell->lattice = FALSE; cell->group = 0; cell->reciprocal = 0.0; cell->a = 0.0; cell->b = 0.0; cell->c = 0.0; cell->ab = 0.0; cell->ac = 0.0; cell->bc = 0.0; cell->origin[0] = 0.0; cell->origin[1] = 0.0; cell->origin[2] = 0.0; cell->center[0] = 0.0; cell->center[1] = 0.0; cell->center[2] = 0.0; cell->quaternion[0] = 0.0; cell->quaternion[1] = 0.0; cell->quaternion[2] = 0.0; cell->quaternion[3] = 1.0; cell->model = FALSE; cell->n1 = 1; cell->n2 = 1; cell->n3 = 1; cell->v1 = 0.0; cell->v2 = 0.0; cell->v3 = 0.0; cell->v12 = 0.0; cell->v13 = 0.0; cell->v23 = 0.0; cell->points = NULL; cell->loops = NULL; cell->lines= NULL; cell->n_points = 0; cell->n_loops = 0; cell->n_lines = 0; cell->n_nodes = 0; cell->o1 = 0; cell->o2 = 0; cell->o3 = 0; cell->origin_vectors = FALSE; cell->axes = FALSE; cell->axes_vectors = FALSE; cell->faces = FALSE; cell->nodes = FALSE; cell->borders = GAMGI_PHYS_NONE; } /***** external function ***** * * * GAMGI_ENGINE_START_ARROW * * * * Initialise arrow objects. * * * *****************************/ void gamgi_engine_start_arrow (gamgi_arrow *arrow) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT arrow, GAMGI_ENGINE_ARROW); arrow->object.number = gamgi_engine_number_arrow_get (); /******************** * initialise arrow * ********************/ arrow->draw = NULL; } /***** external function ***** * * * GAMGI_ENGINE_START_SHAPE * * * * Initialise shape objects. * * * *****************************/ void gamgi_engine_start_shape (gamgi_shape *shape) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT shape, GAMGI_ENGINE_SHAPE); shape->object.number = gamgi_engine_number_shape_get (); /******************** * initialise shape * ********************/ shape->draw = NULL; } /***** external function ***** * * * GAMGI_ENGINE_START_GRAPH * * * * Initialise graph objects. * * * *****************************/ void gamgi_engine_start_graph (gamgi_graph *graph) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT graph, GAMGI_ENGINE_GRAPH); graph->object.number = gamgi_engine_number_graph_get (); /******************** * initialise graph * ********************/ graph->draw = NULL; } /******* external function ****** * * * GAMGI_ENGINE_START_ASSEMBLY * * * * Initialise assembly objects. * * * ********************************/ void gamgi_engine_start_assembly (gamgi_assembly *assembly) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT assembly, GAMGI_ENGINE_ASSEMBLY); assembly->object.number = gamgi_engine_number_assembly_get (); /*********************** * initialise assembly * ***********************/ assembly->draw = NULL; assembly->mark = 0; assembly->origin[0] = 0.0; assembly->origin[1] = 0.0; assembly->origin[2] = 0.0; assembly->center[0] = 0.0; assembly->center[1] = 0.0; assembly->center[2] = 0.0; assembly->quaternion[0] = 0.0; assembly->quaternion[1] = 0.0; assembly->quaternion[2] = 0.0; assembly->quaternion[3] = 1.0; } /***** external function ***** * * * GAMGI_ENGINE_START_LIGHT * * * * Initialise light objects. * * * *****************************/ void gamgi_engine_start_light (gamgi_light *light) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT light, GAMGI_ENGINE_LIGHT); light->object.number = gamgi_engine_number_light_get (); /******************** * initialise light * ********************/ light->ambient[0] = 0.0; light->ambient[1] = 0.0; light->ambient[2] = 0.0; light->ambient[3] = 1.0; light->diffuse[0] = 0.0; light->diffuse[1] = 0.0; light->diffuse[2] = 0.0; light->diffuse[3] = 1.0; light->specular[0] = 0.0; light->specular[1] = 0.0; light->specular[2] = 0.0; light->specular[3] = 1.0; light->direction[0] = GAMGI_MESA_LIGHT_DIRECTION_X; light->direction[1] = GAMGI_MESA_LIGHT_DIRECTION_Y; light->direction[2] = GAMGI_MESA_LIGHT_DIRECTION_Z; light->angle = 180.0; light->constant = GAMGI_MESA_LIGHT_CONSTANT; light->linear = GAMGI_MESA_LIGHT_LINEAR; light->quadratic = GAMGI_MESA_LIGHT_QUADRATIC; light->radial = GAMGI_MESA_LIGHT_RADIAL; light->draw = NULL; } /***** external function ***** * * * GAMGI_ENGINE_START_LAYER * * * * Initialise layer objects. * * * *****************************/ void gamgi_engine_start_layer (gamgi_layer *layer) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT layer, GAMGI_ENGINE_LAYER); layer->object.number = gamgi_engine_number_layer_get (); /******************** * initialise layer * ********************/ layer->draw = NULL; layer->undo = NULL; layer->save = NULL; /******** * axis * ********/ layer->axes = FALSE; /******************************* * initialise background color * *******************************/ layer->color[0] = 0.0; layer->color[1] = 0.0; layer->color[2] = 0.0; layer->color[3] = 1.0; } /**** external function ******* * * * GAMGI_ENGINE_START_WINDOW * * * * Initialise window objects. * * * ******************************/ void gamgi_engine_start_window (gamgi_window *window) { /********************* * initialise object * *********************/ gamgi_engine_start_object (GAMGI_CAST_OBJECT window, GAMGI_ENGINE_WINDOW); window->object.number = gamgi_engine_number_window_get (); /********************* * initialise window * *********************/ window->draw = NULL; window->window = NULL; window->dialog0 = NULL; window->dialog1 = NULL; window->help = NULL; window->area = NULL; window->history = NULL; window->layer = NULL; window->focus = NULL; window->action = FALSE; window->mode = FALSE; window->axes = FALSE; window->class = FALSE; window->top_flag = TRUE; window->medium_flag = TRUE; window->bottom_flag = TRUE; window->timer_focus = 0; window->timer_layer = 0; window->timer_message = 0; window->timer_progress = 0; window->axis = FALSE; window->total = 0.0; window->demo_flag = 0; } /**** external function ******* * * * GAMGI_ENGINE_START_GAMGI * * * * Initialise gamgi object. * * * ******************************/ void gamgi_engine_start_gamgi (void) { /*************************************** * Initialise GAMGI configuration data * ***************************************/ gamgi_global_start_gamgi (gamgi->gamgi); gamgi_global_start_window (gamgi->window); gamgi_global_start_layer (gamgi->layer); gamgi_global_start_light (gamgi->light); gamgi_global_start_assembly (gamgi->assembly); gamgi_global_start_graph (gamgi->graph); gamgi_global_start_shape (gamgi->shape); gamgi_global_start_arrow (gamgi->arrow); gamgi_global_start_cell (gamgi->cell); gamgi_global_start_cluster (gamgi->cluster); gamgi_global_start_molecule (gamgi->molecule); gamgi_global_start_group (gamgi->group); gamgi_global_start_plane (gamgi->plane); gamgi_global_start_direction (gamgi->direction); gamgi_global_start_atom (gamgi->atom); gamgi_global_start_bond (gamgi->bond); gamgi_global_start_orbital (gamgi->orbital); gamgi_global_start_text (gamgi->text); gamgi_global_start_help (gamgi->help); } gamgi-0.17.5/src/engine/gamgi_engine_start.h000066400000000000000000000026401433127522700207330ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_start.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ void gamgi_engine_start_object (gamgi_object *object, int class); void gamgi_engine_start_text (gamgi_text *text); void gamgi_engine_start_orbital (gamgi_orbital *orbital); void gamgi_engine_start_bond (gamgi_bond *bond); void gamgi_engine_start_atom (gamgi_atom *atom); void gamgi_engine_start_direction (gamgi_direction *direction); void gamgi_engine_start_plane (gamgi_plane *plane); void gamgi_engine_start_group (gamgi_group *group); void gamgi_engine_start_molecule (gamgi_molecule *molecule); void gamgi_engine_start_cluster (gamgi_cluster *cluster); void gamgi_engine_start_cell (gamgi_cell *cell); void gamgi_engine_start_arrow (gamgi_arrow *arrow); void gamgi_engine_start_shape (gamgi_shape *shape); void gamgi_engine_start_graph (gamgi_graph *graph); void gamgi_engine_start_assembly (gamgi_assembly *assembly); void gamgi_engine_start_light (gamgi_light *light); void gamgi_engine_start_layer (gamgi_layer *layer); void gamgi_engine_start_window (gamgi_window *window); void gamgi_engine_start_gamgi (void); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/gamgi_engine_task.c000066400000000000000000000053771433127522700205450ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_task.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_global.h" static unsigned int task; unsigned int gamgi_engine_task_get (void) { return task; } void gamgi_engine_task_start (void) { gamgi_text *text; gamgi_orbital *orbital; gamgi_bond *bond; gamgi_atom *atom; gamgi_direction *direction; gamgi_plane *plane; gamgi_group *group; gamgi_molecule *molecule; gamgi_cluster *cluster; gamgi_cell *cell; gamgi_arrow *arrow; gamgi_shape *shape; gamgi_graph *graph; gamgi_assembly *assembly; gamgi_light *light; gamgi_layer *layer; gamgi_window *window; task = 0; for (text = gamgi->text_start; text != NULL; text = text->next) (GAMGI_CAST_OBJECT text)->task = 0; for (orbital = gamgi->orbital_start; orbital != NULL; orbital = orbital->next) (GAMGI_CAST_OBJECT orbital)->task = 0; for (bond = gamgi->bond_start; bond != NULL; bond = bond->next) (GAMGI_CAST_OBJECT bond)->task = 0; for (atom = gamgi->atom_start; atom != NULL; atom = atom->next) (GAMGI_CAST_OBJECT atom)->task = 0; for (direction = gamgi->direction_start; direction != NULL; direction = direction->next) (GAMGI_CAST_OBJECT direction)->task = 0; for (plane = gamgi->plane_start; plane != NULL; plane = plane->next) (GAMGI_CAST_OBJECT plane)->task = 0; for (group = gamgi->group_start; group != NULL; group = group->next) (GAMGI_CAST_OBJECT group)->task = 0; for (molecule = gamgi->molecule_start; molecule != NULL; molecule = molecule->next) (GAMGI_CAST_OBJECT molecule)->task = 0; for (cluster = gamgi->cluster_start; cluster != NULL; cluster = cluster->next) (GAMGI_CAST_OBJECT cluster)->task = 0; for (cell = gamgi->cell_start; cell != NULL; cell = cell->next) (GAMGI_CAST_OBJECT cell)->task = 0; for (shape = gamgi->shape_start; shape != NULL; shape = shape->next) (GAMGI_CAST_OBJECT shape)->task = 0; for (arrow = gamgi->arrow_start; arrow != NULL; arrow = arrow->next) (GAMGI_CAST_OBJECT arrow)->task = 0; for (graph = gamgi->graph_start; graph != NULL; graph = graph->next) (GAMGI_CAST_OBJECT graph)->task = 0; for (assembly = gamgi->assembly_start; assembly != NULL; assembly = assembly->next) (GAMGI_CAST_OBJECT assembly)->task = 0; for (light = gamgi->light_start; light != NULL; light = light->next) (GAMGI_CAST_OBJECT light)->task = 0; for (layer = gamgi->layer_start; layer != NULL; layer = layer->next) (GAMGI_CAST_OBJECT layer)->task = 0; for (window = gamgi->window_start; window != NULL; window = window->next) (GAMGI_CAST_OBJECT window)->task = 0; } unsigned int gamgi_engine_task_new (void) { if (task == UINT_MAX) gamgi_engine_task_start (); return ++task; } gamgi-0.17.5/src/engine/gamgi_engine_task.h000066400000000000000000000005741433127522700205440ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_task.h * * Copyright (C) 2011 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" unsigned int gamgi_engine_task_current (void); void gamgi_engine_task_start (void); unsigned int gamgi_engine_task_new (void); gamgi-0.17.5/src/engine/gamgi_engine_unlink.c000066400000000000000000001152041433127522700210720ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_unlink.c * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_engine_list.h" void gamgi_engine_unlink_text (gamgi_text *text) { gamgi_dlist *dlist; gamgi_object *object; gamgi_text *parent_text; gamgi_orbital *parent_orbital; gamgi_bond *parent_bond; gamgi_atom *parent_atom; gamgi_direction *parent_direction; gamgi_plane *parent_plane; gamgi_group *parent_group; gamgi_molecule *parent_molecule; gamgi_cluster *parent_cluster; gamgi_cell *parent_cell; gamgi_arrow *parent_arrow; gamgi_shape *parent_shape; gamgi_graph *parent_graph; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = text->object.object; dlist = text->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_TEXT: parent_text = GAMGI_CAST_TEXT object; parent_text->text_end = dlist->before; break; case GAMGI_ENGINE_ORBITAL: parent_orbital = GAMGI_CAST_ORBITAL object; parent_orbital->text_end = dlist->before; break; case GAMGI_ENGINE_BOND: parent_bond = GAMGI_CAST_BOND object; parent_bond->text_end = dlist->before; break; case GAMGI_ENGINE_ATOM: parent_atom = GAMGI_CAST_ATOM object; parent_atom->text_end = dlist->before; break; case GAMGI_ENGINE_DIRECTION: parent_direction = GAMGI_CAST_DIRECTION object; parent_direction->text_end = dlist->before; break; case GAMGI_ENGINE_PLANE: parent_plane = GAMGI_CAST_PLANE object; parent_plane->text_end = dlist->before; break; case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->text_end = dlist->before; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->text_end = dlist->before; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->text_end = dlist->before; break; case GAMGI_ENGINE_ARROW: parent_arrow = GAMGI_CAST_ARROW object; parent_arrow->text_end = dlist->before; break; case GAMGI_ENGINE_SHAPE: parent_shape = GAMGI_CAST_SHAPE object; parent_shape->text_end = dlist->before; break; case GAMGI_ENGINE_GRAPH: parent_graph = GAMGI_CAST_GRAPH object; parent_graph->text_end = dlist->before; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->text_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->text_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_TEXT: parent_text = GAMGI_CAST_TEXT object; parent_text->text_start = dlist->next; break; case GAMGI_ENGINE_ORBITAL: parent_orbital = GAMGI_CAST_ORBITAL object; parent_orbital->text_start = dlist->next; break; case GAMGI_ENGINE_BOND: parent_bond = GAMGI_CAST_BOND object; parent_bond->text_start = dlist->next; break; case GAMGI_ENGINE_ATOM: parent_atom = GAMGI_CAST_ATOM object; parent_atom->text_start = dlist->next; break; case GAMGI_ENGINE_DIRECTION: parent_direction = GAMGI_CAST_DIRECTION object; parent_direction->text_start = dlist->next; break; case GAMGI_ENGINE_PLANE: parent_plane = GAMGI_CAST_PLANE object; parent_plane->text_start = dlist->next; break; case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->text_start = dlist->next; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->text_start = dlist->next; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->text_start = dlist->next; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->text_start = dlist->next; break; case GAMGI_ENGINE_ARROW: parent_arrow = GAMGI_CAST_ARROW object; parent_arrow->text_start = dlist->next; break; case GAMGI_ENGINE_SHAPE: parent_shape = GAMGI_CAST_SHAPE object; parent_shape->text_start = dlist->next; break; case GAMGI_ENGINE_GRAPH: parent_graph = GAMGI_CAST_GRAPH object; parent_graph->text_start = dlist->next; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->text_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->text_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); text->object.object = NULL; text->object.dlist = NULL; } void gamgi_engine_unlink_orbital (gamgi_orbital *orbital) { gamgi_dlist *dlist; gamgi_object *object; gamgi_bond *parent_bond; gamgi_atom *parent_atom; gamgi_direction *parent_direction; gamgi_plane *parent_plane; gamgi_group *parent_group; gamgi_molecule *parent_molecule; gamgi_cluster *parent_cluster; gamgi_cell *parent_cell; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = orbital->object.object; dlist = orbital->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_BOND: parent_bond = GAMGI_CAST_BOND object; parent_bond->orbital_end = dlist->before; break; case GAMGI_ENGINE_ATOM: parent_atom = GAMGI_CAST_ATOM object; parent_atom->orbital_end = dlist->before; break; case GAMGI_ENGINE_DIRECTION: parent_direction = GAMGI_CAST_DIRECTION object; parent_direction->orbital_end = dlist->before; break; case GAMGI_ENGINE_PLANE: parent_plane = GAMGI_CAST_PLANE object; parent_plane->orbital_end = dlist->before; break; case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->orbital_end = dlist->before; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->orbital_end = dlist->before; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->orbital_end = dlist->before; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->orbital_end = dlist->before; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->orbital_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->orbital_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_BOND: parent_bond = GAMGI_CAST_BOND object; parent_bond->orbital_start = dlist->next; break; case GAMGI_ENGINE_ATOM: parent_atom = GAMGI_CAST_ATOM object; parent_atom->orbital_start = dlist->next; break; case GAMGI_ENGINE_DIRECTION: parent_direction = GAMGI_CAST_DIRECTION object; parent_direction->orbital_start = dlist->next; break; case GAMGI_ENGINE_PLANE: parent_plane = GAMGI_CAST_PLANE object; parent_plane->orbital_start = dlist->next; break; case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->orbital_start = dlist->next; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->orbital_start = dlist->next; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->orbital_start = dlist->next; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->orbital_start = dlist->next; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->orbital_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->orbital_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); orbital->object.object = NULL; orbital->object.dlist = NULL; } void gamgi_engine_unlink_bond (gamgi_bond *bond) { gamgi_dlist *dlist1, *dlist2; gamgi_atom *atom1, *atom2; atom1 = bond->atom1; atom2 = bond->atom2; dlist1 = bond->dlist1; dlist2 = bond->dlist2; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist1->next == NULL) atom1->bond_end = dlist1->before; if (dlist2->next == NULL) atom2->bond_end = dlist2->before; /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist1->before == NULL) atom1->bond_start = dlist1->next; if (dlist2->before == NULL) atom2->bond_start = dlist2->next; /************************************ * remove node from parents list * * and reset child links to parents * ************************************/ gamgi_engine_dlist_remove_start (dlist1); gamgi_engine_dlist_remove_start (dlist2); bond->atom1 = NULL; bond->atom2 = NULL; bond->dlist1 = NULL; bond->dlist2 = NULL; } void gamgi_engine_unlink_atom (gamgi_atom *atom) { gamgi_dlist *dlist; gamgi_object *object; gamgi_direction *parent_direction; gamgi_plane *parent_plane; gamgi_group *parent_group; gamgi_molecule *parent_molecule; gamgi_cluster *parent_cluster; gamgi_cell *parent_cell; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = atom->object.object; dlist = atom->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_DIRECTION: parent_direction = GAMGI_CAST_DIRECTION object; parent_direction->atom_end = dlist->before; break; case GAMGI_ENGINE_PLANE: parent_plane = GAMGI_CAST_PLANE object; parent_plane->atom_end = dlist->before; break; case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->atom_end = dlist->before; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->atom_end = dlist->before; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->atom_end = dlist->before; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->atom_end = dlist->before; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->atom_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->atom_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_DIRECTION: parent_direction = GAMGI_CAST_DIRECTION object; parent_direction->atom_start = dlist->next; break; case GAMGI_ENGINE_PLANE: parent_plane = GAMGI_CAST_PLANE object; parent_plane->atom_start = dlist->next; break; case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->atom_start= dlist->next; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->atom_start = dlist->next; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->atom_start = dlist->next; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->atom_start = dlist->next; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->atom_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->atom_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); atom->object.object = NULL; atom->object.dlist = NULL; } void gamgi_engine_unlink_direction (gamgi_direction *direction) { gamgi_dlist *dlist; gamgi_object *object; gamgi_plane *parent_plane; gamgi_group *parent_group; gamgi_molecule *parent_molecule; gamgi_cluster *parent_cluster; gamgi_cell *parent_cell; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = direction->object.object; dlist = direction->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_PLANE: parent_plane = GAMGI_CAST_PLANE object; parent_plane->direction_end = dlist->before; break; case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->direction_end = dlist->before; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->direction_end = dlist->before; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->direction_end = dlist->before; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->direction_end = dlist->before; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->direction_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->direction_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_PLANE: parent_plane = GAMGI_CAST_PLANE object; parent_plane->direction_start = dlist->next; break; case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->direction_start = dlist->next; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->direction_start = dlist->next; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->direction_start = dlist->next; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->direction_start = dlist->next; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->direction_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->direction_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); direction->object.object = NULL; direction->object.dlist = NULL; } void gamgi_engine_unlink_plane (gamgi_plane *plane) { gamgi_dlist *dlist; gamgi_object *object; gamgi_group *parent_group; gamgi_molecule *parent_molecule; gamgi_cluster *parent_cluster; gamgi_cell *parent_cell; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = plane->object.object; dlist = plane->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->plane_end = dlist->before; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->plane_end = dlist->before; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->plane_end = dlist->before; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->plane_end = dlist->before; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->plane_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->plane_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->plane_start = dlist->next; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->plane_start = dlist->next; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->plane_start = dlist->next; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->plane_start = dlist->next; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->plane_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->plane_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); plane->object.object = NULL; plane->object.dlist = NULL; } void gamgi_engine_unlink_group (gamgi_group *group) { gamgi_dlist *dlist; gamgi_object *object; gamgi_group *parent_group; gamgi_molecule *parent_molecule; gamgi_cluster *parent_cluster; gamgi_cell *parent_cell; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = group->object.object; dlist = group->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->group_end = dlist->before; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->group_end = dlist->before; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->group_end = dlist->before; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->group_end = dlist->before; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->group_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->group_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_GROUP: parent_group = GAMGI_CAST_GROUP object; parent_group->group_start = dlist->next; break; case GAMGI_ENGINE_MOLECULE: parent_molecule = GAMGI_CAST_MOLECULE object; parent_molecule->group_start = dlist->next; break; case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->group_start = dlist->next; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->group_start = dlist->next; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->group_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->group_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); group->object.object = NULL; group->object.dlist = NULL; } void gamgi_engine_unlink_molecule (gamgi_molecule *molecule) { gamgi_dlist *dlist; gamgi_object *object; gamgi_cluster *parent_cluster; gamgi_cell *parent_cell; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = molecule->object.object; dlist = molecule->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->molecule_end = dlist->before; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->molecule_end = dlist->before; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->molecule_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->molecule_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->molecule_start = dlist->next; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->molecule_start = dlist->next; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->molecule_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->molecule_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); molecule->object.object = NULL; molecule->object.dlist = NULL; } void gamgi_engine_unlink_cluster (gamgi_cluster *cluster) { gamgi_dlist *dlist; gamgi_object *object; gamgi_cluster *parent_cluster; gamgi_cell *parent_cell; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = cluster->object.object; dlist = cluster->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->cluster_end = dlist->before; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->cluster_end = dlist->before; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->cluster_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->cluster_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_CLUSTER: parent_cluster = GAMGI_CAST_CLUSTER object; parent_cluster->cluster_start = dlist->next; break; case GAMGI_ENGINE_CELL: parent_cell = GAMGI_CAST_CELL object; parent_cell->cluster_start = dlist->next; break; case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->cluster_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->cluster_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); cluster->object.object = NULL; cluster->object.dlist = NULL; } void gamgi_engine_unlink_cell (gamgi_cell *cell) { gamgi_dlist *dlist; gamgi_object *object; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = cell->object.object; dlist = cell->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->cell_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->cell_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->cell_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->cell_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); cell->object.object = NULL; cell->object.dlist = NULL; } void gamgi_engine_unlink_arrow (gamgi_arrow *arrow) { gamgi_dlist *dlist; gamgi_object *object; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = arrow->object.object; dlist = arrow->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->arrow_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->arrow_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->arrow_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->arrow_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); arrow->object.object = NULL; arrow->object.dlist = NULL; } void gamgi_engine_unlink_shape (gamgi_shape *shape) { gamgi_dlist *dlist; gamgi_object *object; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = shape->object.object; dlist = shape->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->shape_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->shape_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->shape_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->shape_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); shape->object.object = NULL; shape->object.dlist = NULL; } void gamgi_engine_unlink_graph (gamgi_graph *graph) { gamgi_dlist *dlist; gamgi_object *object; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = graph->object.object; dlist = graph->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->graph_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->graph_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->graph_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->graph_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); graph->object.object = NULL; graph->object.dlist = NULL; } void gamgi_engine_unlink_assembly (gamgi_assembly *assembly) { gamgi_dlist *dlist; gamgi_object *object; gamgi_assembly *parent_assembly; gamgi_layer *parent_layer; object = assembly->object.object; dlist = assembly->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { switch (object->class) { case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->assembly_end = dlist->before; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->assembly_end = dlist->before; break; } } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { switch (object->class) { case GAMGI_ENGINE_ASSEMBLY: parent_assembly = GAMGI_CAST_ASSEMBLY object; parent_assembly->assembly_start = dlist->next; break; case GAMGI_ENGINE_LAYER: parent_layer = GAMGI_CAST_LAYER object; parent_layer->assembly_start = dlist->next; break; } } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); assembly->object.object = NULL; assembly->object.dlist = NULL; } void gamgi_engine_unlink_light (gamgi_light *light) { gamgi_dlist *dlist; gamgi_object *object; gamgi_layer *parent_layer; object = light->object.object; dlist = light->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { parent_layer = GAMGI_CAST_LAYER object; parent_layer->light_end = dlist->before; } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { parent_layer = GAMGI_CAST_LAYER object; parent_layer->light_start = dlist->next; } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); light->object.object = NULL; light->object.dlist = NULL; } void gamgi_engine_unlink_layer (gamgi_layer *layer) { gamgi_dlist *dlist; gamgi_object *object; gamgi_window *parent_window; object = layer->object.object; dlist = layer->object.dlist; /****************************************************** * If this is the last object in the parent list * * then the queue end must point to the object before * ******************************************************/ if (dlist->next == NULL) { parent_window = GAMGI_CAST_WINDOW object; parent_window->layer_end = dlist->before; } /****************************************************** * If this is the first object in the parent list * * then the queue start must point to the object next * ******************************************************/ if (dlist->before == NULL) { parent_window = GAMGI_CAST_WINDOW object; parent_window->layer_start = dlist->next; } /************************************ * remove node from parent list and * * reset child links to parent * ************************************/ gamgi_engine_dlist_remove_start (dlist); layer->object.object = NULL; layer->object.dlist = NULL; } void gamgi_engine_unlink_object (gamgi_object *object) { switch (object->class) { case GAMGI_ENGINE_TEXT: gamgi_engine_unlink_text (GAMGI_CAST_TEXT object); break; case GAMGI_ENGINE_ORBITAL: gamgi_engine_unlink_orbital (GAMGI_CAST_ORBITAL object); break; case GAMGI_ENGINE_BOND: gamgi_engine_unlink_bond (GAMGI_CAST_BOND object); break; case GAMGI_ENGINE_ATOM: gamgi_engine_unlink_atom (GAMGI_CAST_ATOM object); break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_unlink_direction (GAMGI_CAST_DIRECTION object); break; case GAMGI_ENGINE_PLANE: gamgi_engine_unlink_plane (GAMGI_CAST_PLANE object); break; case GAMGI_ENGINE_GROUP: gamgi_engine_unlink_group (GAMGI_CAST_GROUP object); break; case GAMGI_ENGINE_MOLECULE: gamgi_engine_unlink_molecule (GAMGI_CAST_MOLECULE object); break; case GAMGI_ENGINE_CLUSTER: gamgi_engine_unlink_cluster (GAMGI_CAST_CLUSTER object); break; case GAMGI_ENGINE_CELL: gamgi_engine_unlink_cell (GAMGI_CAST_CELL object); break; case GAMGI_ENGINE_ARROW: gamgi_engine_unlink_arrow (GAMGI_CAST_ARROW object); break; case GAMGI_ENGINE_SHAPE: gamgi_engine_unlink_shape (GAMGI_CAST_SHAPE object); break; case GAMGI_ENGINE_GRAPH: gamgi_engine_unlink_graph (GAMGI_CAST_GRAPH object); break; case GAMGI_ENGINE_ASSEMBLY: gamgi_engine_unlink_assembly (GAMGI_CAST_ASSEMBLY object); break; case GAMGI_ENGINE_LIGHT: gamgi_engine_unlink_light (GAMGI_CAST_LIGHT object); break; case GAMGI_ENGINE_LAYER: gamgi_engine_unlink_layer (GAMGI_CAST_LAYER object); break; default: break; } } gamgi-0.17.5/src/engine/gamgi_engine_unlink.h000066400000000000000000000025071433127522700211000ustar00rootroot00000000000000/******************************************* * * $GAMGI/src/engine/gamgi_engine_unlink.h * * Copyright (C) 2001, 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ void gamgi_engine_unlink_text (gamgi_text *text); void gamgi_engine_unlink_orbital (gamgi_orbital *orbital); void gamgi_engine_unlink_bond (gamgi_bond *bond); void gamgi_engine_unlink_atom (gamgi_atom *atom); void gamgi_engine_unlink_direction (gamgi_direction *direction); void gamgi_engine_unlink_plane (gamgi_plane *plane); void gamgi_engine_unlink_group (gamgi_group *group); void gamgi_engine_unlink_molecule (gamgi_molecule *molecule); void gamgi_engine_unlink_cluster (gamgi_cluster *cluster); void gamgi_engine_unlink_cell (gamgi_cell *cell); void gamgi_engine_unlink_arrow (gamgi_arrow *arrow); void gamgi_engine_unlink_shape (gamgi_shape *shape); void gamgi_engine_unlink_graph (gamgi_graph *graph); void gamgi_engine_unlink_assembly (gamgi_assembly *assembly); void gamgi_engine_unlink_light (gamgi_light *light); void gamgi_engine_unlink_layer (gamgi_layer *layer); void gamgi_engine_unlink_object (gamgi_object *object); /************* * Rationale * ************* ************* * Rationale * *************/ gamgi-0.17.5/src/engine/makefile000066400000000000000000000027021433127522700164330ustar00rootroot00000000000000########################################### # # $GAMGI/src/engine/makefile # # Copyright (C) 2001, 2004 Carlos Pereira # # Distributed under the terms of the GNU # General Public License: $GAMGI/LICENSE # #======================== Engine files =============================== GAMGI_ENGINE_h = gamgi_engine.h GAMGI_ENGINE_o = gamgi_engine_array.o gamgi_engine_copy.o \ gamgi_engine_copy_out.o gamgi_engine_count.o \ gamgi_engine_create.o gamgi_engine_dlist.o \ gamgi_engine_empty.o gamgi_engine_filter.o \ gamgi_engine_find.o gamgi_engine_link.o \ gamgi_engine_list.o gamgi_engine_number.o \ gamgi_engine_remove.o gamgi_engine_remove_out.o \ gamgi_engine_reparent.o gamgi_engine_start.o \ gamgi_engine_task.o gamgi_engine_unlink.o #========================= Gamgi paths =============================== ifndef FLAG FLAG = 1 SRC = ../ include $(SRC)make_paths #========================= Gamgi files =============================== GAMGI_o = $(GAMGI_ENGINE_o) $(GAMGI_GTK_o) $(GAMGI_MESA_o) \ $(GAMGI_MATH_o) $(GAMGI_CHEM_o) $(GAMGI_PHYS_o) \ $(GAMGI_IO_o) $(GAMGI_EXPAT_o) $(GAMGI_GLOBAL_o) GAMGI_h = $(GAMGI_ENGINE_h) $(GAMGI_GTK_h) $(GAMGI_MESA_h) \ $(GAMGI_MATH_h) $(GAMGI_CHEM_h) $(GAMGI_PHYS_h) \ $(GAMGI_IO_h) $(GAMGI_EXPAT_h) $(GAMGI_GLOBAL_h) #========================= Gamgi local =============================== include $(SRC)make_local #========================= Gamgi rules =============================== include $(SRC)make_rules endif gamgi-0.17.5/src/expat/000077500000000000000000000000001433127522700146065ustar00rootroot00000000000000gamgi-0.17.5/src/expat/gamgi_expat.h000066400000000000000000000141771433127522700172560ustar00rootroot00000000000000/****************************************** * * $GAMGI/src/expat/gamgi_expat.h * * Copyright (C) 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #ifndef GAMGI_EXPAT #define GAMGI_EXPAT /******** libraries ******* **************************/ #include /********** types ********* **************************/ typedef struct _gamgi_ml { XML_Parser parser; gamgi_window *window; char *filename; gamgi_slist *parent; gamgi_bool valid; } gamgi_ml; typedef struct _gamgi_html { gamgi_ml ml; /******************************************************** * the actual buffer and position where text is written * ********************************************************/ GtkTextBuffer *buffer; GtkTextIter iter; /********************************** * flags controlling if character * * data is accepted or refused * **********************************/ gamgi_bool contents; gamgi_bool delimiter; gamgi_bool preserve; /******************************* * current text size and color * *******************************/ char size[GAMGI_ENGINE_TOKEN]; char color[GAMGI_ENGINE_TOKEN]; } gamgi_html; typedef struct _gamgi_gml { gamgi_ml ml; /****************************************** * list of all object and config elements * ******************************************/ gamgi_dlist *object_start; gamgi_dlist *object_end; /********************** * hash table used to * * speed up id search * **********************/ gamgi_slist **hash; char *id; int id_used; int id_total; gamgi_dlist **id_object; char *ref; int ref_used; int ref_total; gamgi_dlist **ref_object; /*********************************************************************** * used to import polygon arrays in Directions,Planes,Groups,Clusters: * * int points_driver, int colors_driver, float colors, double points * ***********************************************************************/ gamgi_enum type; void *array; int size; int count; char line[GAMGI_ENGINE_LINE]; int used; /************************************* * to properly report error messages * *************************************/ int *ref_line; char **ref_file; gamgi_slist *files; } gamgi_gml; /********** enumerations ********** **********************************/ /************************************************************ * All GAMGI enumerations start at 1 and share FALSE for 0. * ************************************************************/ /************************************************* * This enumeration lists all HTML tags that * * GAMGI accepts, when reading Help XHTML files. * *************************************************/ enum { GAMGI_EXPAT_HTML = 1, GAMGI_EXPAT_HEAD, GAMGI_EXPAT_TITLE, GAMGI_EXPAT_LINK, GAMGI_EXPAT_BODY, GAMGI_EXPAT_DIV, GAMGI_EXPAT_SPAN, GAMGI_EXPAT_UL, GAMGI_EXPAT_OL, GAMGI_EXPAT_LI, GAMGI_EXPAT_A, GAMGI_EXPAT_IMG, GAMGI_EXPAT_PRE, GAMGI_EXPAT_BR, GAMGI_EXPAT_P, GAMGI_EXPAT_H1, GAMGI_EXPAT_H3, GAMGI_EXPAT_B }; enum { GAMGI_EXPAT_INT = 1, GAMGI_EXPAT_FLOAT, GAMGI_EXPAT_DOUBLE }; /************* macros ************ *********************************/ /************************************************* * GAMGI_EXPAT_GML acts as a continuation of the * * object enumeration defined in gamgi_engine.h * *************************************************/ #define GAMGI_EXPAT_GML GAMGI_ENGINE_GAMGI + 1 #define GAMGI_EXPAT_BOND_BASE 20 #define GAMGI_EXPAT_BOND_FACTOR 2 #define GAMGI_EXPAT_FILE_BASE 1 #define GAMGI_EXPAT_FILE_FACTOR 2 /************************************************ * Control which information should be exported * ************************************************/ #define GAMGI_EXPAT_CONFIG TRUE #define GAMGI_EXPAT_OBJECT TRUE /******************************************** * Control OUTPUT style: * * * * HEADER_GML: write XML (GML) header * * HEADER_X3D: write XML (X3D) header * * * * START: indentation space before element * * MIDDLE: interval space before parameter * * END: interval space before element end * * * * LINE: maximum output line size * * DEPTH: maximum output indentation depth * ****************************************** */ #define GAMGI_EXPAT_HEADER_GML TRUE #define GAMGI_EXPAT_HEADER_X3D TRUE #define GAMGI_EXPAT_VERSION "1.0" #define GAMGI_EXPAT_ENCODING "UTF-8" #define GAMGI_EXPAT_STANDALONE "yes" #define GAMGI_EXPAT_START 2 #define GAMGI_EXPAT_MIDDLE 1 #define GAMGI_EXPAT_END 0 #define GAMGI_EXPAT_LINE 80 #define GAMGI_EXPAT_DEPTH_MIN 0 #define GAMGI_EXPAT_DEPTH_MAX 10 /************************************** * Choose whether to write IDs * * for objects of each given class. * * * * Bonded atoms will have an ID even * * if GAMGI_EXPAT_ID_ATOM is FALSE, * * because this is the only way bonds * * have to identify its parent atoms. * **************************************/ #define GAMGI_EXPAT_ID_TEXT FALSE #define GAMGI_EXPAT_ID_ORBITAL FALSE #define GAMGI_EXPAT_ID_BOND FALSE #define GAMGI_EXPAT_ID_ATOM FALSE #define GAMGI_EXPAT_ID_DIRECTION FALSE #define GAMGI_EXPAT_ID_PLANE FALSE #define GAMGI_EXPAT_ID_GROUP FALSE #define GAMGI_EXPAT_ID_MOLECULE FALSE #define GAMGI_EXPAT_ID_CLUSTER FALSE #define GAMGI_EXPAT_ID_CELL FALSE #define GAMGI_EXPAT_ID_ARROW FALSE #define GAMGI_EXPAT_ID_SHAPE FALSE #define GAMGI_EXPAT_ID_GRAPH FALSE #define GAMGI_EXPAT_ID_ASSEMBLY FALSE #define GAMGI_EXPAT_ID_LIGHT FALSE #define GAMGI_EXPAT_ID_LAYER FALSE #define GAMGI_EXPAT_ID_WINDOW FALSE /**************************************************** * Hash multipliers: 31 (used by Kernighan), 37 * * (used in the Java library); Hash numbers: prime * * numbers. Source: The Practice of Programming, * * Brian Kernighan, Rob Pike, Addison-Wesley, 1999 * ****************************************************/ #define GAMGI_EXPAT_HASH_MULTIPLIER 31 #define GAMGI_EXPAT_HASH_SIZE 1037 /**************** * object casts * ****************/ #define GAMGI_CAST_ML (gamgi_ml *) #define GAMGI_CAST_GML (gamgi_gml *) #define GAMGI_CAST_HTML (gamgi_html *) #endif gamgi-0.17.5/src/expat/gamgi_expat_export.c000066400000000000000000002261561433127522700206540ustar00rootroot00000000000000/***************************************** * * $GAMGI/src/expat/gamgi_expat_export.c * * Copyright (C) 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_gtk.h" #include "gamgi_math.h" #include "gamgi_chem.h" #include "gamgi_phys.h" #include "gamgi_io.h" #include "gamgi_expat.h" #include "gamgi_global.h" #include "gamgi_engine_list.h" #include "gamgi_engine_find.h" #include "gamgi_gtk_dialog.h" #include "gamgi_math_sort.h" #include "gamgi_chem_bond.h" #include "gamgi_chem_atom.h" #include "gamgi_expat_export_config.h" #include "gamgi_expat_export_object.h" #include "gamgi_io_file.h" #include "gamgi_io_x3d.h" #include "gamgi_global_selection.h" /***************** internal function ********************* * * *********************************************************/ static void static_space (FILE *fp, int space, gamgi_bool *error) { while (space-- > 0) gamgi_io_file_fprintf (fp, " ", error); } /***************** internal function ********************* * * *********************************************************/ static int static_end (FILE *fp, char *string, gamgi_bool *error) { static_space (fp, GAMGI_EXPAT_END, error); gamgi_io_file_fprintf (fp, string, error); return GAMGI_EXPAT_END; } /***************** internal function ********************* * * *********************************************************/ static int static_middle (FILE *fp, char *string, gamgi_bool *error) { static_space (fp, GAMGI_EXPAT_MIDDLE, error); gamgi_io_file_fprintf (fp, string, error); return GAMGI_EXPAT_MIDDLE; } /***************** internal function ********************* * * *********************************************************/ static int static_start (FILE *fp, char *string, int depth, gamgi_bool *error) { gamgi_io_file_fprintf (fp, "\n", error); depth = gamgi_math_sort_min (depth, GAMGI_EXPAT_DEPTH_MAX); static_space (fp, depth * GAMGI_EXPAT_START, error); gamgi_io_file_fprintf (fp, string, error); return depth * GAMGI_EXPAT_START; } /***************** external function ********************* * * *********************************************************/ void gamgi_expat_export_cdata (FILE *fp, char *string, int depth, int *column, gamgi_bool *error) { int length = strlen (string); if (*column >= 0 && *column + length < GAMGI_EXPAT_LINE) *column += length + static_middle (fp, string, error); else *column = length + static_start (fp, string, depth, error); } /***************** external function ********************* * * *********************************************************/ void gamgi_expat_export_attribute (FILE *fp, char *string, int depth, int *column, gamgi_bool *error) { int length = strlen (string); /******************************************************************* * to guarantee that the element can still be closed in the same * * line, in the worst case (/>) we need to allow for 2 more spaces * *******************************************************************/ if (*column + length < GAMGI_EXPAT_LINE - GAMGI_EXPAT_END - 2) *column += length + static_middle (fp, string, error); else *column = length + static_start (fp, string, depth, error); } /***************** external function ********************* * * *********************************************************/ void gamgi_expat_export_element (FILE *fp, char *element, char *string, int depth_parent, int *depth_last, int *column, gamgi_bool *output, gamgi_bool *error) { int depth; if (*output == FALSE) { *output = TRUE; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); if (depth - *depth_last == 2) *column = strlen ("") + static_start (fp, "", depth - 1, error); *column = strlen (element) + static_start (fp, element, depth, error); *depth_last = depth; } gamgi_expat_export_attribute (fp, string, *depth_last, column, error); } void gamgi_expat_export_bond (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error, int element1, int element2, double min, double max) { gamgi_bool output = FALSE; gamgi_expat_export_config_bond_local (window, fp, depth_parent, depth_last, &output, error, element1, element2, min, max); if (output == TRUE) static_end (fp, "/>", error); } void gamgi_expat_export_atom (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error, int element, double mass, double radius, float red, float green, float blue) { gamgi_bool output = FALSE; gamgi_expat_export_config_atom_local (window, fp, depth_parent, depth_last, &output, error, element, mass, radius, red, green, blue); if (output == TRUE) static_end (fp, "/>", error); } static void static_cdata_double (int size, double *array, FILE *fp, int depth, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; int column, i; /**************** * double array * ****************/ column = -1; for (i = 0; i < size; i++) { sprintf (string, "%.*f", gamgi->gamgi->length, array[i]); gamgi_expat_export_cdata (fp, string, depth, &column, error); } } static void static_cdata_float (int size, float *array, FILE *fp, int depth, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; int column, i; /*************** * float array * ***************/ column = -1; for (i = 0; i < size; i++) { sprintf (string, "%.*f", GAMGI_MATH_DECIMAL_COLOR, array[i]); gamgi_expat_export_cdata (fp, string, depth, &column, error); } } static void static_cdata_int (int size, int *array, FILE *fp, int depth, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; int column, i; /************* * int array * *************/ column = -1; for (i = 0; i < size; i++) { sprintf (string, "%d", array[i]); gamgi_expat_export_cdata (fp, string, depth, &column, error); } } static void static_cdata (char *name, char *type, int size, void *array, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("", error); /************** * cdata here * **************/ if (strcmp (type, "double") == 0) static_cdata_double (size, array, fp, depth, error); if (strcmp (type, "float") == 0) static_cdata_float (size, array, fp, depth, error); if (strcmp (type, "int") == 0) static_cdata_int (size, array, fp, depth, error); static_start (fp, "", depth, error); } static void static_config_help (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_help (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_text (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_text (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_orbital (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_orbital (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_bond (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_bond_global (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_atom (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_atom_global (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_direction (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_direction (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_plane (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_plane (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_group (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_group (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_molecule (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_molecule (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_cluster (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_cluster (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_cell (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_cell (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_arrow (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_arrow (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_shape (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_shape (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_graph (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_graph (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_assembly (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_assembly (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_light (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_light (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_layer (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_layer (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_window (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; gamgi_expat_export_config_window (window, fp, depth_parent, depth_last, &output, error); if (output == TRUE) static_end (fp, "/>", error); } static void static_config_gamgi (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_bool output = FALSE; int depth; gamgi_expat_export_config_gamgi (window, fp, depth_parent, depth_last, &output, error); depth = depth_parent + 1; static_config_window (window, fp, depth, depth_last, error); static_config_layer (window, fp, depth, depth_last, error); static_config_light (window, fp, depth, depth_last, error); static_config_assembly (window, fp, depth, depth_last, error); static_config_graph (window, fp, depth, depth_last, error); static_config_shape (window, fp, depth, depth_last, error); static_config_arrow (window, fp, depth, depth_last, error); static_config_cell (window, fp, depth, depth_last, error); static_config_cluster (window, fp, depth, depth_last, error); static_config_molecule (window, fp, depth, depth_last, error); static_config_group (window, fp, depth, depth_last, error); static_config_plane (window, fp, depth, depth_last, error); static_config_direction (window, fp, depth, depth_last, error); static_config_atom (window, fp, depth, depth_last, error); gamgi_chem_atom_export (window, fp, depth, depth_last, error); static_config_bond (window, fp, depth, depth_last, error); gamgi_chem_bond_export (window, fp, depth, depth_last, error); static_config_orbital (window, fp, depth, depth_last, error); static_config_text (window, fp, depth, depth_last, error); static_config_help (window, fp, depth, depth_last, error); if (*depth_last == depth) static_end (fp, "/>", error); else if (*depth_last == depth + 1) static_start (fp, "", depth, error); } static void static_config (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { static_config_gamgi (window, fp, depth_parent, depth_last, error); } static void static_bond_add (gamgi_object *parent, gamgi_bond *bond) { gamgi_direction *direction; gamgi_plane *plane; gamgi_group *group; gamgi_molecule *molecule; gamgi_cluster *cluster; gamgi_cell *cell; gamgi_assembly *assembly; gamgi_layer *layer; gamgi_dlist *dlist = NULL; switch (parent->class) { case GAMGI_ENGINE_DIRECTION: direction = GAMGI_CAST_DIRECTION parent; dlist = gamgi_engine_dlist_add_end (direction->bond_end); direction->bond_end = dlist; if (dlist->before == NULL) direction->bond_start = dlist; break; case GAMGI_ENGINE_PLANE: plane = GAMGI_CAST_PLANE parent; dlist = gamgi_engine_dlist_add_end (plane->bond_end); plane->bond_end = dlist; if (dlist->before == NULL) plane->bond_start = dlist; break; case GAMGI_ENGINE_GROUP: group = GAMGI_CAST_GROUP parent; dlist = gamgi_engine_dlist_add_end (group->bond_end); group->bond_end = dlist; if (dlist->before == NULL) group->bond_start = dlist; break; case GAMGI_ENGINE_MOLECULE: molecule = GAMGI_CAST_MOLECULE parent; dlist = gamgi_engine_dlist_add_end (molecule->bond_end); molecule->bond_end = dlist; if (dlist->before == NULL) molecule->bond_start = dlist; break; case GAMGI_ENGINE_CLUSTER: cluster = GAMGI_CAST_CLUSTER parent; dlist = gamgi_engine_dlist_add_end (cluster->bond_end); cluster->bond_end = dlist; if (dlist->before == NULL) cluster->bond_start = dlist; break; case GAMGI_ENGINE_CELL: cell = GAMGI_CAST_CELL parent; dlist = gamgi_engine_dlist_add_end (cell->bond_end); cell->bond_end = dlist; if (dlist->before == NULL) cell->bond_start = dlist; break; case GAMGI_ENGINE_ASSEMBLY: assembly = GAMGI_CAST_ASSEMBLY parent; dlist = gamgi_engine_dlist_add_end (assembly->bond_end); assembly->bond_end = dlist; if (dlist->before == NULL) assembly->bond_start = dlist; break; case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER parent; dlist = gamgi_engine_dlist_add_end (layer->bond_end); layer->bond_end = dlist; if (dlist->before == NULL) layer->bond_start = dlist; break; /************************ * Control should never * * reach this point * ************************/ default: break; } dlist->data = bond; } /***************** internal function ********************* * * *********************************************************/ static void static_bond_parent (gamgi_bond *bond, gamgi_window *window, gamgi_object *scope, int *id, gamgi_bool *error) { gamgi_object *parent; if (bond->first == TRUE) { parent = gamgi_engine_find_root (GAMGI_CAST_OBJECT bond->atom1, GAMGI_CAST_OBJECT bond->atom2, scope); if (parent != NULL) { /********************************************** * If the parent is out of range, the second * * atom will not appear and this bond can be * * safely discarded without further action. * * * * If a common parent is found, then the * * second atom must necessarily show up: * * we don't need to care about half bonds. * * * * atom id numbers must be saved in a place * * that the bond can reach, in order to allow * * the bond later on to identify its parent * * atoms, when the bond is actually exported * * (at the end of the common parent block) * * * * the first and second atom ids are saved * * in the unused bond->object.object and * * bond->object.dlist addresses. * * * * atom->mark is used to flag when the atom * * id identifiers must be written. If atoms * * A,B form a bond between atoms B,A, atom A * * is scanned first but marked last, so all * * atoms must be marked in the first scan, * * before their blocks are exported. * **********************************************/ bond->atom1->mark = TRUE; bond->atom2->mark = TRUE; static_bond_add (parent, bond); bond->object.object = GAMGI_INT_TO_POINTER (*id); bond->first = FALSE; } } else { bond->object.dlist = GAMGI_INT_TO_POINTER (*id); bond->first = TRUE; } } /***************** internal function ********************* * * *********************************************************/ static void static_object_text (gamgi_text *text, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_orbital (gamgi_orbital *orbital, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_bond (gamgi_bond *bond, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("object.object = NULL; bond->object.dlist = NULL; /****************** * child elements * ******************/ dlist = bond->orbital_start; while (dlist != NULL) { static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } dlist = bond->text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "
", depth, error); else static_end (fp, "/>", error); } static void static_object_atom (gamgi_atom *atom, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("bond_start; while (dlist != NULL) { static_bond_parent (GAMGI_CAST_BOND dlist->data, window, scope, id, error); dlist = dlist->next; } gamgi_expat_export_object_atom (atom, fp, depth, &column, id, error); /****************** * child elements * ******************/ dlist = atom->orbital_start; while (dlist != NULL) { static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } dlist = atom->text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_direction (gamgi_direction *direction, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("atom_start; while (dlist != NULL) { static_object_atom (GAMGI_CAST_ATOM dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write bond list * *******************/ dlist = direction->bond_start; while (dlist != NULL) { static_object_bond (GAMGI_CAST_BOND dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = gamgi_engine_dlist_remove_start (dlist); } direction->bond_start = NULL; direction->bond_end = NULL; /********************** * write orbital list * **********************/ dlist = direction->orbital_start; while (dlist != NULL) { static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write text list * *******************/ dlist = direction->text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_plane (gamgi_plane *plane, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("direction_start; while (dlist != NULL) { static_object_direction (GAMGI_CAST_DIRECTION dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write atom list * *******************/ dlist = plane->atom_start; while (dlist != NULL) { static_object_atom (GAMGI_CAST_ATOM dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write bond list * *******************/ dlist = plane->bond_start; while (dlist != NULL) { static_object_bond (GAMGI_CAST_BOND dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = gamgi_engine_dlist_remove_start (dlist); } plane->bond_start = NULL; plane->bond_end = NULL; /********************** * write orbital list * **********************/ dlist = plane->orbital_start; while (dlist != NULL) { static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write text list * *******************/ dlist = plane->text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /*************************************************** * write cdata: each point has 3 coordinates x,y,z * ***************************************************/ if (plane->model == GAMGI_PHYS_POLYGON) { static_cdata ("points", "double", 3 * plane->n_points, plane->points, window, fp, depth, depth_last, error); static_cdata ("points_driver", "int", plane->n_loops, plane->loops, window, fp, depth, depth_last, error); } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_group (gamgi_group *group, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("group_start; while (dlist != NULL) { static_object_group (GAMGI_CAST_GROUP dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write plane list * ********************/ dlist = group->plane_start; while (dlist != NULL) { static_object_plane (GAMGI_CAST_PLANE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /************************ * write direction list * ************************/ dlist = group->direction_start; while (dlist != NULL) { static_object_direction (GAMGI_CAST_DIRECTION dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write atom list * *******************/ dlist = group->atom_start; while (dlist != NULL) { static_object_atom (GAMGI_CAST_ATOM dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write bond list * *******************/ dlist = group->bond_start; while (dlist != NULL) { static_object_bond (GAMGI_CAST_BOND dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = gamgi_engine_dlist_remove_start (dlist); } group->bond_start = NULL; group->bond_end = NULL; /********************** * write orbital list * **********************/ dlist = group->orbital_start; while (dlist != NULL) { static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write text list * *******************/ dlist = group->text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /*************************************************** * write cdata: each point has 3 coordinates x,y,z * ***************************************************/ if (group->reference == GAMGI_CHEM_POLYTOPE) { static_cdata ("points", "double", 3 * group->n_points, group->points, window, fp, depth, depth_last, error); static_cdata ("points_driver", "int", group->n_loops, group->loops, window, fp, depth, depth_last, error); } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_molecule (gamgi_molecule *molecule, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("group_start; while (dlist != NULL) { static_object_group (GAMGI_CAST_GROUP dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write plane list * ********************/ dlist = molecule->plane_start; while (dlist != NULL) { static_object_plane (GAMGI_CAST_PLANE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /************************ * write direction list * ************************/ dlist = molecule->direction_start; while (dlist != NULL) { static_object_direction (GAMGI_CAST_DIRECTION dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write atom list * *******************/ dlist = molecule->atom_start; while (dlist != NULL) { static_object_atom (GAMGI_CAST_ATOM dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write bond list * *******************/ dlist = molecule->bond_start; while (dlist != NULL) { static_object_bond (GAMGI_CAST_BOND dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = gamgi_engine_dlist_remove_start (dlist); } molecule->bond_start = NULL; molecule->bond_end = NULL; /********************** * write orbital list * **********************/ dlist = molecule->orbital_start; while (dlist != NULL) { static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write text list * *******************/ dlist = molecule->text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_cluster (gamgi_cluster *cluster, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("cluster_start; while (dlist != NULL) { static_object_cluster (GAMGI_CAST_CLUSTER dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /*********************** * write molecule list * ***********************/ dlist = cluster->molecule_start; while (dlist != NULL) { static_object_molecule (GAMGI_CAST_MOLECULE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write group list * ********************/ dlist = cluster->group_start; while (dlist != NULL) { static_object_group (GAMGI_CAST_GROUP dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write plane list * ********************/ dlist = cluster->plane_start; while (dlist != NULL) { static_object_plane (GAMGI_CAST_PLANE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /************************ * write direction list * ************************/ dlist = cluster->direction_start; while (dlist != NULL) { static_object_direction (GAMGI_CAST_DIRECTION dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write atom list * *******************/ dlist = cluster->atom_start; while (dlist != NULL) { static_object_atom (GAMGI_CAST_ATOM dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write bond list * *******************/ dlist = cluster->bond_start; while (dlist != NULL) { static_object_bond (GAMGI_CAST_BOND dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = gamgi_engine_dlist_remove_start (dlist); } cluster->bond_start = NULL; cluster->bond_end = NULL; /********************** * write orbital list * **********************/ dlist = cluster->orbital_start; while (dlist != NULL) { static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write text list * *******************/ dlist = cluster->text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /*********************************************** * write cdata: each point has 3 coordinates * * x,y,z and each color has 3 components r,g,b * ***********************************************/ if (cluster->reference == GAMGI_CHEM_POLYTOPE) { if (cluster->points != NULL) static_cdata ("points", "double", 3 * cluster->n_points, cluster->points, window, fp, depth, depth_last, error); if (cluster->loops != NULL) static_cdata ("points_driver", "int", cluster->n_loops, cluster->loops, window, fp, depth, depth_last, error); if (cluster->colors != NULL) static_cdata ("colors", "float", 3 * cluster->n_colors, cluster->colors, window, fp, depth, depth_last, error); if (cluster->paints != NULL) static_cdata ("colors_driver", "int", cluster->n_paints, cluster->paints, window, fp, depth, depth_last, error); } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_cell (gamgi_cell *cell, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("cluster_start; while (dlist != NULL) { static_object_cluster (GAMGI_CAST_CLUSTER dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /*********************** * write molecule list * ***********************/ dlist = cell->molecule_start; while (dlist != NULL) { static_object_molecule (GAMGI_CAST_MOLECULE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write group list * ********************/ dlist = cell->group_start; while (dlist != NULL) { static_object_group (GAMGI_CAST_GROUP dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write plane list * ********************/ dlist = cell->plane_start; while (dlist != NULL) { static_object_plane (GAMGI_CAST_PLANE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /************************ * write direction list * ************************/ dlist = cell->direction_start; while (dlist != NULL) { static_object_direction (GAMGI_CAST_DIRECTION dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write atom list * *******************/ dlist = cell->atom_start; while (dlist != NULL) { static_object_atom (GAMGI_CAST_ATOM dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write bond list * *******************/ dlist = cell->bond_start; while (dlist != NULL) { static_object_bond (GAMGI_CAST_BOND dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = gamgi_engine_dlist_remove_start (dlist); } cell->bond_start = NULL; cell->bond_end = NULL; /********************** * write orbital list * **********************/ dlist = cell->orbital_start; while (dlist != NULL) { static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write text list * *******************/ dlist = cell->text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_arrow (gamgi_arrow *arrow, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_shape (gamgi_shape *shape, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_graph (gamgi_graph *graph, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_assembly (gamgi_assembly *assembly, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("assembly_start; while (dlist != NULL) { static_object_assembly (GAMGI_CAST_ASSEMBLY dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write graph list * ********************/ dlist = assembly->graph_start; while (dlist != NULL) { static_object_graph (GAMGI_CAST_GRAPH dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write shape list * ********************/ dlist = assembly->shape_start; while (dlist != NULL) { static_object_shape (GAMGI_CAST_SHAPE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write arrow list * ********************/ dlist = assembly->arrow_start; while (dlist != NULL) { static_object_arrow (GAMGI_CAST_ARROW dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write cell list * *******************/ dlist = assembly->cell_start; while (dlist != NULL) { static_object_cell (GAMGI_CAST_CELL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /********************** * write cluster list * **********************/ dlist = assembly->cluster_start; while (dlist != NULL) { static_object_cluster (GAMGI_CAST_CLUSTER dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /*********************** * write molecule list * ***********************/ dlist = assembly->molecule_start; while (dlist != NULL) { static_object_molecule (GAMGI_CAST_MOLECULE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write group list * ********************/ dlist = assembly->group_start; while (dlist != NULL) { static_object_group (GAMGI_CAST_GROUP dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write plane list * ********************/ dlist = assembly->plane_start; while (dlist != NULL) { static_object_plane (GAMGI_CAST_PLANE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /************************ * write direction list * ************************/ dlist = assembly->direction_start; while (dlist != NULL) { static_object_direction (GAMGI_CAST_DIRECTION dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write atom list * *******************/ dlist = assembly->atom_start; while (dlist != NULL) { static_object_atom (GAMGI_CAST_ATOM dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write bond list * *******************/ dlist = assembly->bond_start; while (dlist != NULL) { static_object_bond (GAMGI_CAST_BOND dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = gamgi_engine_dlist_remove_start (dlist); } assembly->bond_start = NULL; assembly->bond_end = NULL; /********************** * write orbital list * **********************/ dlist = assembly->orbital_start; while (dlist != NULL) { static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write text list * *******************/ dlist = assembly->text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_light (gamgi_light *light, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_layer (gamgi_layer *layer, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("light_start; while (dlist != NULL) { static_object_light (GAMGI_CAST_LIGHT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /*********************** * write assembly list * ***********************/ dlist = layer->assembly_start; while (dlist != NULL) { static_object_assembly (GAMGI_CAST_ASSEMBLY dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write graph list * ********************/ dlist = layer->graph_start; while (dlist != NULL) { static_object_graph (GAMGI_CAST_GRAPH dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write shape list * ********************/ dlist = layer->shape_start; while (dlist != NULL) { static_object_shape (GAMGI_CAST_SHAPE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write arrow list * ********************/ dlist = layer->arrow_start; while (dlist != NULL) { static_object_arrow (GAMGI_CAST_ARROW dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write cell list * *******************/ dlist = layer->cell_start; while (dlist != NULL) { static_object_cell (GAMGI_CAST_CELL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /********************** * write cluster list * **********************/ dlist = layer->cluster_start; while (dlist != NULL) { static_object_cluster (GAMGI_CAST_CLUSTER dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /*********************** * write molecule list * ***********************/ dlist = layer->molecule_start; while (dlist != NULL) { static_object_molecule (GAMGI_CAST_MOLECULE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write group list * ********************/ dlist = layer->group_start; while (dlist != NULL) { static_object_group (GAMGI_CAST_GROUP dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************** * write plane list * ********************/ dlist = layer->plane_start; while (dlist != NULL) { static_object_plane (GAMGI_CAST_PLANE dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /************************ * write direction list * ************************/ dlist = layer->direction_start; while (dlist != NULL) { static_object_direction (GAMGI_CAST_DIRECTION dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write atom list * *******************/ dlist = layer->atom_start; while (dlist != NULL) { static_object_atom (GAMGI_CAST_ATOM dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write bond list * *******************/ dlist = layer->bond_start; while (dlist != NULL) { static_object_bond (GAMGI_CAST_BOND dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = gamgi_engine_dlist_remove_start (dlist); } layer->bond_start = NULL; layer->bond_end = NULL; /********************** * write orbital list * **********************/ dlist = layer->orbital_start; while (dlist != NULL) { static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } /******************* * write text list * *******************/ dlist = layer->text_start; while (dlist != NULL) { static_object_text (GAMGI_CAST_TEXT dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } /***************** internal function ********************* * * *********************************************************/ static void static_object_window (gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; int column, depth; depth = depth_parent + 1; if (depth > *depth_last) gamgi_io_file_fprintf (fp, ">", error); column = strlen ("layer_start; while (dlist != NULL) { static_object_layer (GAMGI_CAST_LAYER dlist->data, window, scope, fp, depth, depth_last, id, error); dlist = dlist->next; } if (depth < *depth_last) static_start (fp, "", depth, error); else static_end (fp, "/>", error); } static void static_bond_atom (gamgi_atom *atom, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { int mark; /*********************************** * save atom->mark as this is * * reset in static_object_atom * * * * set scope to atom, so bonds are * * ignored in static_object_atom * ***********************************/ if (atom->mark == 0) { mark = atom->mark = *id; static_object_atom (atom, window, GAMGI_CAST_OBJECT atom, fp, depth_parent, depth_last, id, error); atom->mark = mark; } } static void static_bond_id (gamgi_bond *bond, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { bond->object.object = GAMGI_INT_TO_POINTER (bond->atom1->mark); bond->object.dlist = GAMGI_INT_TO_POINTER (bond->atom2->mark); static_object_bond (bond, window, GAMGI_CAST_OBJECT bond, fp, depth_parent, depth_last, id, error); } static void static_bond_single (gamgi_bond *bond, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { static_bond_atom (bond->atom1, window, fp, depth_parent, depth_last, id, error); static_bond_atom (bond->atom2, window, fp, depth_parent, depth_last, id, error); static_bond_id (bond, window, fp, depth_parent, depth_last, id, error); bond->atom1->mark = 0; bond->atom2->mark = 0; } static void static_object_text_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_text *text; gamgi_dlist *dlist; /******************* * write text list * *******************/ for (dlist = gamgi->texts; dlist != NULL; dlist = dlist->next) gamgi_global_selection_text (GAMGI_CAST_TEXT dlist->data, TRUE); for (dlist = gamgi->texts; dlist != NULL; dlist = dlist->next) { text = GAMGI_CAST_TEXT dlist->data; if (text->mark == FALSE) static_object_text (text, window, GAMGI_CAST_OBJECT text, fp, depth_parent, depth_last, id, error); } for (dlist = gamgi->texts; dlist != NULL; dlist = dlist->next) gamgi_global_selection_text (GAMGI_CAST_TEXT dlist->data, FALSE); } static void static_object_orbital_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /********************** * write orbital list * **********************/ for (dlist = gamgi->orbitals; dlist != NULL; dlist = dlist->next) static_object_orbital (GAMGI_CAST_ORBITAL dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_bond_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; gamgi_bond *bond; /******************* * write bond list * *******************/ /********************************************** * export atoms, saving ids in atom->mark and * * ignoring lists of bonds pointed from atoms * **********************************************/ for (dlist = gamgi->bonds; dlist != NULL; dlist = dlist->next) { bond = GAMGI_CAST_BOND dlist->data; static_bond_atom (bond->atom1, window, fp, depth_parent, depth_last, id, error); static_bond_atom (bond->atom2, window, fp, depth_parent, depth_last, id, error); } /*********************************************** * export bonds, using ids saved in atom->mark * ***********************************************/ for (dlist = gamgi->bonds; dlist != NULL; dlist = dlist->next) static_bond_id (GAMGI_CAST_BOND dlist->data, window, fp, depth_parent, depth_last, id, error); /*************** * clean atoms * ***************/ for (dlist = gamgi->bonds; dlist != NULL; dlist = dlist->next) { bond = GAMGI_CAST_BOND dlist->data; bond->atom1->mark = 0; bond->atom2->mark = 0; } } static void static_object_atom_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /******************* * write atom list * *******************/ for (dlist = gamgi->atoms; dlist != NULL; dlist = dlist->next) static_object_atom (GAMGI_CAST_ATOM dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_direction_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /************************ * write direction list * ************************/ for (dlist = gamgi->directions; dlist != NULL; dlist = dlist->next) static_object_direction (GAMGI_CAST_DIRECTION dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_plane_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /******************** * write plane list * ********************/ for (dlist = gamgi->planes; dlist != NULL; dlist = dlist->next) static_object_plane (GAMGI_CAST_PLANE dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_group_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_group *group; gamgi_dlist *dlist; /********************** * write cluster list * **********************/ for (dlist = gamgi->groups; dlist != NULL; dlist = dlist->next) gamgi_global_selection_group (GAMGI_CAST_GROUP dlist->data, TRUE); for (dlist = gamgi->groups; dlist != NULL; dlist = dlist->next) { group = GAMGI_CAST_GROUP dlist->data; if (group->mark == FALSE) static_object_group (group, window, GAMGI_CAST_OBJECT group, fp, depth_parent, depth_last, id, error); } for (dlist = gamgi->groups; dlist != NULL; dlist = dlist->next) gamgi_global_selection_group (GAMGI_CAST_GROUP dlist->data, FALSE); } static void static_object_molecule_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /*********************** * write molecule list * ***********************/ for (dlist = gamgi->molecules; dlist != NULL; dlist = dlist->next) static_object_molecule (GAMGI_CAST_MOLECULE dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_cluster_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_cluster *cluster; gamgi_dlist *dlist; /********************** * write cluster list * **********************/ for (dlist = gamgi->clusters; dlist != NULL; dlist = dlist->next) gamgi_global_selection_cluster (GAMGI_CAST_CLUSTER dlist->data, TRUE); for (dlist = gamgi->clusters; dlist != NULL; dlist = dlist->next) { cluster = GAMGI_CAST_CLUSTER dlist->data; if (cluster->mark == FALSE) static_object_cluster (cluster, window, GAMGI_CAST_OBJECT cluster, fp, depth_parent, depth_last, id, error); } for (dlist = gamgi->clusters; dlist != NULL; dlist = dlist->next) gamgi_global_selection_cluster (GAMGI_CAST_CLUSTER dlist->data, FALSE); } static void static_object_cell_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /******************* * write cell list * *******************/ for (dlist = gamgi->cells; dlist != NULL; dlist = dlist->next) static_object_cell (GAMGI_CAST_CELL dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_arrow_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /******************** * write arrow list * ********************/ for (dlist = gamgi->arrows; dlist != NULL; dlist = dlist->next) static_object_arrow (GAMGI_CAST_ARROW dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_shape_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /******************** * write shape list * ********************/ for (dlist = gamgi->shapes; dlist != NULL; dlist = dlist->next) static_object_shape (GAMGI_CAST_SHAPE dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_graph_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /******************** * write graph list * ********************/ for (dlist = gamgi->graphs; dlist != NULL; dlist = dlist->next) static_object_graph (GAMGI_CAST_GRAPH dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_assembly_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_assembly *assembly; gamgi_dlist *dlist; for (dlist = gamgi->assemblys; dlist != NULL; dlist = dlist->next) gamgi_global_selection_assembly (GAMGI_CAST_ASSEMBLY dlist->data, TRUE); for (dlist = gamgi->assemblys; dlist != NULL; dlist = dlist->next) { assembly = GAMGI_CAST_ASSEMBLY dlist->data; if (assembly->mark == FALSE) static_object_assembly (assembly, window, GAMGI_CAST_OBJECT assembly, fp, depth_parent, depth_last, id, error); } for (dlist = gamgi->assemblys; dlist != NULL; dlist = dlist->next) gamgi_global_selection_assembly (GAMGI_CAST_ASSEMBLY dlist->data, FALSE); } static void static_object_light_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /******************** * write light list * ********************/ for (dlist = gamgi->lights; dlist != NULL; dlist = dlist->next) static_object_light (GAMGI_CAST_LIGHT dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_layer_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /******************** * write layer list * ********************/ for (dlist = gamgi->layers; dlist != NULL; dlist = dlist->next) static_object_layer (GAMGI_CAST_LAYER dlist->data, window, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_window_list (FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_dlist *dlist; /********************* * write window list * *********************/ for (dlist = gamgi->windows; dlist != NULL; dlist = dlist->next) static_object_window (GAMGI_CAST_WINDOW dlist->data, GAMGI_CAST_OBJECT dlist->data, fp, depth_parent, depth_last, id, error); } static void static_object_gamgi_list (FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { gamgi_window *window; /******************** * write gamgi list * ********************/ for (window = gamgi->window_start; window != NULL; window = window->next) static_object_window (window, GAMGI_CAST_OBJECT window, fp, depth_parent, depth_last, id, error); } void static_object_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error) { switch (gamgi->focus) { case GAMGI_ENGINE_TEXT: static_object_text_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_ORBITAL: static_object_orbital_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_BOND: static_object_bond_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_ATOM: static_object_atom_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_DIRECTION: static_object_direction_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_PLANE: static_object_plane_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_GROUP: static_object_group_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_MOLECULE: static_object_molecule_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_CLUSTER: static_object_cluster_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_CELL: static_object_cell_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_ARROW: static_object_arrow_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_SHAPE: static_object_shape_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_GRAPH: static_object_graph_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_ASSEMBLY: static_object_assembly_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_LIGHT: static_object_light_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_LAYER: static_object_layer_list (window, fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_WINDOW: static_object_window_list (fp, depth_parent, depth_last, id, error); break; case GAMGI_ENGINE_GAMGI: static_object_gamgi_list (fp, depth_parent, depth_last, id, error); break; default: return; } } static void static_object (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error) { gamgi_object *object = window->focus; int id = 1; if (gamgi->focus != FALSE) { static_object_list (window, fp, depth_parent, depth_last, &id, error); return; } switch (object->class) { case GAMGI_ENGINE_TEXT: static_object_text (GAMGI_CAST_TEXT object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_ORBITAL: static_object_orbital (GAMGI_CAST_ORBITAL object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_BOND: static_bond_single (GAMGI_CAST_BOND object, window, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_ATOM: static_object_atom (GAMGI_CAST_ATOM object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_DIRECTION: static_object_direction (GAMGI_CAST_DIRECTION object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_PLANE: static_object_plane (GAMGI_CAST_PLANE object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_GROUP: static_object_group (GAMGI_CAST_GROUP object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_MOLECULE: static_object_molecule (GAMGI_CAST_MOLECULE object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_CLUSTER: static_object_cluster (GAMGI_CAST_CLUSTER object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_CELL: static_object_cell (GAMGI_CAST_CELL object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_ARROW: static_object_arrow (GAMGI_CAST_ARROW object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_SHAPE: static_object_shape (GAMGI_CAST_SHAPE object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_GRAPH: static_object_graph (GAMGI_CAST_GRAPH object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_ASSEMBLY: static_object_assembly (GAMGI_CAST_ASSEMBLY object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_LIGHT: static_object_light (GAMGI_CAST_LIGHT object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_LAYER: static_object_layer (GAMGI_CAST_LAYER object, window, object, fp, depth_parent, depth_last, &id, error); break; case GAMGI_ENGINE_WINDOW: static_object_window (window, object, fp, depth_parent, depth_last, &id, error); break; } } static void static_header_xml (FILE *fp, gamgi_bool *error) { char string[GAMGI_ENGINE_LINE]; int column; /******************************** * first row: XML common header * ********************************/ gamgi_io_file_fprintf (fp, "\n", error); } static void static_header_gml (FILE *fp, gamgi_bool *error) { char string[GAMGI_ENGINE_LINE]; int column; /************* * first row * *************/ static_header_xml (fp, error); /************** * second row * **************/ gamgi_io_file_fprintf (fp, "\n", error); } static void static_header_x3d (FILE *fp, gamgi_bool *error) { char string[GAMGI_ENGINE_LINE]; int column; /************* * first row * *************/ static_header_xml (fp, error); /************** * second row * **************/ gamgi_io_file_fprintf (fp, "\n", error); } int gamgi_expat_export_length (gamgi_text *text) { char *s; int i; /*********************************************** * get buffer size (add 1 to count final '\0') * ***********************************************/ i = 0; for (s = text->string; *s != '\0'; s++) { i++; if (*s == '<' || *s == '>') i += 3; else if (*s == '&') i += 4; else if (*s == '\'' || *s == '\"') i += 5; } return i; } void gamgi_expat_export_string (gamgi_text *text, char *buffer) { char *s; int i; /****************************** * translate string to buffer * ******************************/ i = 0; for (s = text->string; *s != '\0'; s++) { switch (*s) { case '<': buffer[i++] = '&'; buffer[i++] = 'l'; buffer[i++] = 't'; buffer[i++] = ';'; break; case '>': buffer[i++] = '&'; buffer[i++] = 'g'; buffer[i++] = 't'; buffer[i++] = ';'; break; case '&': buffer[i++] = '&'; buffer[i++] = 'a'; buffer[i++] = 'm'; buffer[i++] = 'p'; buffer[i++] = ';'; break; case '\'': buffer[i++] = '&'; buffer[i++] = 'a'; buffer[i++] = 'p'; buffer[i++] = 'o'; buffer[i++] = 's'; buffer[i++] = ';'; break; case '\"': buffer[i++] = '&'; buffer[i++] = 'q'; buffer[i++] = 'u'; buffer[i++] = 'o'; buffer[i++] = 't'; buffer[i++] = ';'; break; default: buffer[i++] = *s; break; } } buffer[i] = '\0'; } void gamgi_expat_export_gml (FILE *fp, gamgi_window *window, gamgi_bool *error) { int depth = GAMGI_EXPAT_DEPTH_MIN; int depth_last = GAMGI_EXPAT_DEPTH_MIN; /******************** * write gml header * ********************/ if (GAMGI_EXPAT_HEADER_GML == TRUE) static_header_gml (fp, error); /*********************** * start gml root node * ***********************/ static_space (fp, depth * GAMGI_EXPAT_START, error); gamgi_io_file_fprintf (fp, "", error); else static_start (fp, "", depth, error); gamgi_io_file_fprintf (fp, "\n", error); } void gamgi_expat_export_x3d (FILE *fp, gamgi_window *window, gamgi_bool *error) { char string[GAMGI_ENGINE_LINE]; int depth = 0; /******************** * write X3D header * ********************/ if (GAMGI_EXPAT_HEADER_X3D == TRUE) static_header_x3d (fp, error); /*********************** * start X3D root node * ***********************/ sprintf (string, "\n", GAMGI_IO_X3D_PROFILE, GAMGI_IO_X3D_VERSION); gamgi_io_file_fprintf (fp, string, error); /******************************************************** * export in X3D format everything in the current layer * ********************************************************/ gamgi_io_x3d (fp, window, error); /********************* * end X3D root node * *********************/ static_start (fp, "", depth, error); gamgi_io_file_fprintf (fp, "\n", error); } gamgi-0.17.5/src/expat/gamgi_expat_export.h000066400000000000000000000252171433127522700206540ustar00rootroot00000000000000/***************************************** * * $GAMGI/src/expat/gamgi_expat_export.h * * Copyright (C) 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * internal functions * ********************** static void static_space (FILE *fp, int space, gamgi_bool *error); static int static_end (FILE *fp, char *string, gamgi_bool *error); static int static_middle (FILE *fp, char *string, gamgi_bool *error); static int static_start (FILE *fp, char *string, int depth, gamgi_bool *error); ********************** * external functions * **********************/ void gamgi_expat_export_cdata (FILE *fp, char *string, int depth, int *column, gamgi_bool *error); void gamgi_expat_export_attribute (FILE *fp, char *string, int depth, int *column, gamgi_bool *error); void gamgi_expat_export_element (FILE *fp, char *element, char *string, int depth_parent, int *depth_last, int *column, gamgi_bool *output, gamgi_bool *error); void gamgi_expat_export_bond (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error, int element1, int element2, double min, double max); void gamgi_expat_export_atom (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error, int element, double mass, double radius, float red, float green, float blue); /********************** * internal functions * ********************** static void static_cdata_double (int size, double *array, FILE *fp, int depth, gamgi_bool *error); static void static_cdata_float (int size, float *array, FILE *fp, int depth, gamgi_bool *error); static void static_cdata_int (int size, int *array, FILE *fp, int depth, gamgi_bool *error); static void static_cdata (char *name, char *type, int size, void *array, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_help (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_text (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_orbital (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_bond (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_atom (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_direction (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_plane (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_group (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_molecule (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_cluster (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_cell (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_arrow (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_shape (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_graph (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_assembly (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_light (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_layer (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_window (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config_gamgi (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_config (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_bond_add (gamgi_object *parent, gamgi_bond *bond); static void static_bond_parent (gamgi_bond *bond, gamgi_window *window, gamgi_object *scope, int *id, gamgi_bool *error); static void static_object_text (gamgi_text *text, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_orbital (gamgi_orbital *orbital, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_bond (gamgi_bond *bond, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_atom (gamgi_atom *atom, gamgi_window *window, gamgi_object *scope, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_direction (gamgi_direction *direction, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_plane (gamgi_plane *plane, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_group (gamgi_group *group, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_molecule (gamgi_molecule *molecule, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_cluster (gamgi_cluster *cluster, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_cell (gamgi_cell *cell, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_arrow (gamgi_arrow *arrow, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_shape (gamgi_shape *shape, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_graph (gamgi_graph *graph, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_assembly (gamgi_assembly *assembly, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_light (gamgi_light *light, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_layer (gamgi_layer *layer, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_window (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_bond_atom (gamgi_atom *atom, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_bond_id (gamgi_bond *bond, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_bond_single (gamgi_bond *bond, gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_text_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_orbital_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_bond_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_atom_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_direction_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_plane_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_group_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_molecule_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_cluster_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_cell_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_arrow_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_shape_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_graph_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_assembly_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_light_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_layer_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_window_list (FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object_gamgi_list (FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); void static_object_list (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, int *id, gamgi_bool *error); static void static_object (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *error); static void static_header_xml (FILE *fp, gamgi_bool *error); static void static_header_gml (FILE *fp, gamgi_bool *error); static void static_header_x3d (FILE *fp, gamgi_bool *error); ********************** * external functions * **********************/ int gamgi_expat_export_length (gamgi_text *text); void gamgi_expat_export_string (gamgi_text *text, char *buffer); void gamgi_expat_export_gml (FILE *fp, gamgi_window *window, gamgi_bool *error); void gamgi_expat_export_x3d (FILE *fp, gamgi_window *window, gamgi_bool *error); /************* * Rationale * ************* Last update (lists of objects): July 2011. ************* * Rationale * *************/ gamgi-0.17.5/src/expat/gamgi_expat_export_config.c000066400000000000000000001212361433127522700221720ustar00rootroot00000000000000/************************************************ * * $GAMGI/src/expat/gamgi_expat_export_config.c * * Copyright (C) 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_gtk.h" #include "gamgi_mesa.h" #include "gamgi_math.h" #include "gamgi_chem.h" #include "gamgi_phys.h" #include "gamgi_expat.h" #include "gamgi_io.h" #include "gamgi_global.h" #include "gamgi_mesa_bond.h" #include "gamgi_mesa_atom.h" #include "gamgi_chem_atom.h" #include "gamgi_chem_property.h" #include "gamgi_expat_export.h" void gamgi_expat_export_config_help (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *output, gamgi_bool *error) { gamgi_help_class *help_class = gamgi->help; char string[GAMGI_ENGINE_TOKEN + GAMGI_IO_FULLNAME]; char *name; int column; /************************ * source: local,remote * ************************/ /*********************************************************** * remote source is non-default only when local is defined * ***********************************************************/ if (help_class->source_in == FALSE && help_class->local != NULL) { sprintf (string, "source=\"remote\""); gamgi_expat_export_element (fp, "agent_in == FALSE) { sprintf (string, "agent=\"browser\""); gamgi_expat_export_element (fp, "local != NULL && (name == NULL || strcmp (help_class->local, name) != 0)) { sprintf (string, "local=\"%s\"", help_class->local); gamgi_expat_export_element (fp, "remote != NULL && strcmp (help_class->remote, GAMGI_IO_WEBSITE) != 0) { sprintf (string, "remote=\"%s\"", help_class->remote); gamgi_expat_export_element (fp, "browser != NULL && (name == NULL || strcmp (help_class->browser, name) != 0)) { sprintf (string, "browser=\"%s\"", help_class->browser); gamgi_expat_export_element (fp, "text; char string[GAMGI_ENGINE_STRING]; int column; /*********************** * style: wired, solid * ***********************/ if (text_class->style != GAMGI_MESA_TEXT_STYLE) { if (text_class->style == GAMGI_MESA_WIRED) sprintf (string, "style=\"wired\""); if (text_class->style == GAMGI_MESA_SOLID) sprintf (string, "style=\"solid\""); gamgi_expat_export_element (fp, "wired != GAMGI_IO_TEXT_WIRED) { if (text_class->wired == GAMGI_IO_SUN_ROMAN) sprintf (string, "wired=\"roman\""); else if (text_class->wired == GAMGI_IO_SUN_ROMAN_MONO) sprintf (string, "wired=\"roman_mono\""); else if (text_class->wired == GAMGI_IO_HERSHEY_SANS) sprintf (string, "wired=\"sans\""); else if (text_class->wired == GAMGI_IO_HERSHEY_SANS_BOLD) sprintf (string, "wired=\"sans_bold\""); else if (text_class->wired == GAMGI_IO_HERSHEY_SERIF) sprintf (string, "wired=\"serif\""); else if (text_class->wired == GAMGI_IO_HERSHEY_SERIF_BOLD) sprintf (string, "wired=\"serif_bold\""); else if (text_class->wired == GAMGI_IO_HERSHEY_SCRIPT) sprintf (string, "wired=\"script\""); else if (text_class->wired == GAMGI_IO_HERSHEY_SCRIPT_BOLD) sprintf (string, "wired=\"script_bold\""); else if (text_class->wired == GAMGI_IO_HERSHEY_GOTHIC_ENGLISH) sprintf (string, "wired=\"gothic_english\""); else if (text_class->wired == GAMGI_IO_HERSHEY_GOTHIC_GERMAN) sprintf (string, "wired=\"gothic_german\""); else if (text_class->wired == GAMGI_IO_HERSHEY_GOTHIC_ITALIAN) sprintf (string, "wired=\"gothic_italian\""); else if (text_class->wired == GAMGI_IO_HERSHEY_SYMBOL_SANS) sprintf (string, "wired=\"symbol_sans\""); else if (text_class->wired == GAMGI_IO_HERSHEY_SYMBOL_SERIF) sprintf (string, "wired=\"symbol_serif\""); else if (text_class->wired == GAMGI_IO_HERSHEY_SYMBOL_SERIF_BOLD) sprintf (string, "wired=\"symbol_serif_bold\""); gamgi_expat_export_element (fp, "solid != GAMGI_IO_TEXT_SOLID) { if (text_class->solid == GAMGI_IO_DEJAVU_SANS) sprintf (string, "solid=\"sans\""); else if (text_class->solid == GAMGI_IO_DEJAVU_SANS_BOLD) sprintf (string, "solid=\"sans_bold\""); else if (text_class->solid == GAMGI_IO_DEJAVU_SANS_ITALIC) sprintf (string, "solid=\"sans_italic\""); else if (text_class->solid == GAMGI_IO_DEJAVU_SANS_BOLD_ITALIC) sprintf (string, "solid=\"sans_bold_italic\""); else if (text_class->solid == GAMGI_IO_DEJAVU_SERIF) sprintf (string, "solid=\"serif\""); else if (text_class->solid == GAMGI_IO_DEJAVU_SERIF_BOLD) sprintf (string, "solid=\"serif_bold\""); else if (text_class->solid == GAMGI_IO_DEJAVU_SERIF_ITALIC) sprintf (string, "solid=\"serif_italic\""); else if (text_class->solid == GAMGI_IO_DEJAVU_SERIF_BOLD_ITALIC) sprintf (string, "solid=\"serif_bold_italic\""); else if (text_class->solid == GAMGI_IO_DEJAVU_MONO) sprintf (string, "solid=\"mono\""); else if (text_class->solid == GAMGI_IO_DEJAVU_MONO_BOLD) sprintf (string, "solid=\"mono_bold\""); else if (text_class->solid == GAMGI_IO_DEJAVU_MONO_ITALIC) sprintf (string, "solid=\"mono_italic\""); else if (text_class->solid == GAMGI_IO_DEJAVU_MONO_BOLD_ITALIC) sprintf (string, "solid=\"mono_bold_italic\""); gamgi_expat_export_element (fp, "red - GAMGI_MESA_TEXT_R) > GAMGI_MATH_TOLERANCE || fabs (text_class->green - GAMGI_MESA_TEXT_G) > GAMGI_MATH_TOLERANCE || fabs (text_class->blue - GAMGI_MESA_TEXT_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, text_class->red); gamgi_expat_export_element (fp, "green); gamgi_expat_export_element (fp, "blue); gamgi_expat_export_element (fp, "bond; char string[GAMGI_ENGINE_STRING]; int column; /*********************** * style: wired, solid * ***********************/ if (bond_class->draw != GAMGI_MESA_BOND_DRAW) { if (bond_class->draw == gamgi_mesa_bond_draw_line) sprintf (string, "style=\"wired\""); else if (bond_class->draw == gamgi_mesa_bond_draw_cylinder) sprintf (string, "style=\"solid\""); gamgi_expat_export_element (fp, "lower - GAMGI_CHEM_BOND_LOWER) > GAMGI_MATH_TOLERANCE) { sprintf (string, "lower=\"%.*f\"", gamgi->gamgi->length, bond_class->lower); gamgi_expat_export_element (fp, "upper - GAMGI_CHEM_BOND_UPPER) > GAMGI_MATH_TOLERANCE) { sprintf (string, "upper=\"%.*f\"", gamgi->gamgi->length, bond_class->upper); gamgi_expat_export_element (fp, "size - GAMGI_CHEM_BOND_SIZE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "size=\"%.*f\"", GAMGI_MATH_DECIMAL_SIZE, bond_class->size); gamgi_expat_export_element (fp, "color != GAMGI_MESA_BOND_COLOR) { if (bond_class->color == TRUE) sprintf (string, "color=\"yes\""); else sprintf (string, "color=\"no\""); gamgi_expat_export_element (fp, "red - GAMGI_MESA_BOND_R) > GAMGI_MATH_TOLERANCE || fabs (bond_class->green - GAMGI_MESA_BOND_G) > GAMGI_MATH_TOLERANCE || fabs (bond_class->blue - GAMGI_MESA_BOND_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, bond_class->red); gamgi_expat_export_element (fp, "green); gamgi_expat_export_element (fp, "blue); gamgi_expat_export_element (fp, " element2 * *******************************************************/ sprintf (string, "element1=\"%s\" element2=\"%s\"" " min=\"%.*f\" max=\"%.*f\"", name1, name2, gamgi->gamgi->length, min, gamgi->gamgi->length, max); gamgi_expat_export_element (fp, "atom; char string[GAMGI_ENGINE_STRING]; int column; /*************** * temperature * ***************/ if (fabs (atom_class->temperature - GAMGI_CHEM_ATOM_TEMPERATURE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "temperature=\"%.*f\"", GAMGI_MATH_DECIMAL_OCCUPANCY, atom_class->temperature); gamgi_expat_export_element (fp, "draw != GAMGI_MESA_ATOM_DRAW) { if (atom_class->draw == gamgi_mesa_atom_draw_cross) sprintf (string, "style=\"wired\""); else if (atom_class->draw == gamgi_mesa_atom_draw_sphere) sprintf (string, "style=\"solid\""); gamgi_expat_export_element (fp, "size - GAMGI_CHEM_ATOM_SIZE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "size=\"%.*f\"", GAMGI_MATH_DECIMAL_SIZE, atom_class->size); gamgi_expat_export_element (fp, "variancy - GAMGI_CHEM_ATOM_VARIANCY) > GAMGI_MATH_TOLERANCE) { sprintf (string, "variancy=\"%.*f\"", GAMGI_MATH_DECIMAL_VARIANCY, atom_class->variancy); gamgi_expat_export_element (fp, "min - gamgi_chem_property_radius[GAMGI_CHEM_RADIUS_DEFAULT]) > GAMGI_MATH_TOLERANCE) { sprintf (string, "min=\"%.*f\"", gamgi->gamgi->length, atom_class->min); gamgi_expat_export_element (fp, "slices != GAMGI_MESA_ATOM_SLICES) { sprintf (string, "slices=\"%d\"", atom_class->slices); gamgi_expat_export_element (fp, "width != GAMGI_MESA_ATOM_WIDTH) { sprintf (string, "width=\"%d\"", atom_class->width); gamgi_expat_export_element (fp, "atom; char string_element[GAMGI_ENGINE_STRING]; char string_attribute[GAMGI_ENGINE_STRING]; char token[GAMGI_ENGINE_TOKEN]; int column; gamgi_chem_atom_name (element, token); sprintf (string_element, "mass[element] - mass) > GAMGI_MATH_TOLERANCE) { sprintf (string_attribute, "mass=\"%.*f\"", gamgi->gamgi->mass, atom_class->mass[element]); gamgi_expat_export_element (fp, string_element, string_attribute, depth_parent, depth_last, &column, output, error); } if (fabs (atom_class->radius[element] - radius) > GAMGI_MATH_TOLERANCE) { sprintf (string_attribute, "radius=\"%.*f\"", gamgi->gamgi->length, atom_class->radius[element]); gamgi_expat_export_element (fp, string_element, string_attribute, depth_parent, depth_last, &column, output, error); } if (fabs (atom_class->red[element] - red) > GAMGI_MATH_TOLERANCE || fabs (atom_class->green[element] - green) > GAMGI_MATH_TOLERANCE || fabs (atom_class->blue[element] - blue) > GAMGI_MATH_TOLERANCE) { sprintf (string_attribute, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, atom_class->red[element]); gamgi_expat_export_element (fp, string_element, string_attribute, depth_parent, depth_last, &column, output, error); sprintf (string_attribute, "green=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, atom_class->green[element]); gamgi_expat_export_element (fp, string_element, string_attribute, depth_parent, depth_last, &column, output, error); sprintf (string_attribute, "blue=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, atom_class->blue[element]); gamgi_expat_export_element (fp, string_element, string_attribute, depth_parent, depth_last, &column, output, error); } } void gamgi_expat_export_config_direction (gamgi_window *window, FILE *fp, int depth_parent, int *depth_last, gamgi_bool *output, gamgi_bool *error) { gamgi_direction_class *direction_class = gamgi->direction; char string[GAMGI_ENGINE_STRING]; int column; /**************************** * red,green,blue (coupled) * ****************************/ if (fabs (direction_class->red - GAMGI_MESA_DIRECTION_R) > GAMGI_MATH_TOLERANCE || fabs (direction_class->green - GAMGI_MESA_DIRECTION_G) > GAMGI_MATH_TOLERANCE || fabs (direction_class->blue - GAMGI_MESA_DIRECTION_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, direction_class->red); gamgi_expat_export_element (fp, "green); gamgi_expat_export_element (fp, "blue); gamgi_expat_export_element (fp, "plane; char string[GAMGI_ENGINE_STRING]; int column; /**************************** * red,green,blue (coupled) * ****************************/ if (fabs (plane_class->red - GAMGI_MESA_PLANE_R) > GAMGI_MATH_TOLERANCE || fabs (plane_class->green - GAMGI_MESA_PLANE_G) > GAMGI_MATH_TOLERANCE || fabs (plane_class->blue - GAMGI_MESA_PLANE_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, plane_class->red); gamgi_expat_export_element (fp, "green); gamgi_expat_export_element (fp, "blue); gamgi_expat_export_element (fp, "cell; char string[GAMGI_ENGINE_STRING]; int column; /*************** * model, axes * ***************/ if (cell_class->model != GAMGI_PHYS_CELL_MODEL) { if (cell_class->model == GAMGI_PHYS_CONVENTIONAL) sprintf (string, "model=\"conventional\""); else if (cell_class->model == GAMGI_PHYS_PRIMITIVE) sprintf (string, "model=\"primitive\""); else if (cell_class->model == GAMGI_PHYS_WIGNER) sprintf (string, "model=\"wigner\""); else if (cell_class->model == GAMGI_PHYS_PARALLELEPIPED) sprintf (string, "model=\"parallelepiped\""); else if (cell_class->model == GAMGI_PHYS_SPHERE) sprintf (string, "model=\"sphere\""); else if (cell_class->model == GAMGI_PHYS_PROJECTION) sprintf (string, "model=\"projection\""); gamgi_expat_export_element (fp, "axes != GAMGI_PHYS_CELL_AXES) { if (cell_class->axes == TRUE) sprintf (string, "axes=\"yes\""); else sprintf (string, "axes=\"no\""); gamgi_expat_export_element (fp, "borders != GAMGI_PHYS_CELL_BORDERS) { if (cell_class->borders == GAMGI_PHYS_ALL) sprintf (string, "borders=\"all\""); else if (cell_class->borders == GAMGI_PHYS_FACES) sprintf (string, "borders=\"faces\""); else if (cell_class->borders == GAMGI_PHYS_EDGES) sprintf (string, "borders=\"edges\""); else if (cell_class->borders == GAMGI_PHYS_NONE) sprintf (string, "borders=\"none\""); gamgi_expat_export_element (fp, "faces != GAMGI_PHYS_CELL_FACES) { if (cell_class->faces == TRUE) sprintf (string, "faces=\"yes\""); else sprintf (string, "faces=\"no\""); gamgi_expat_export_element (fp, "nodes != GAMGI_PHYS_CELL_NODES) { if (cell_class->nodes == TRUE) sprintf (string, "nodes=\"yes\""); else sprintf (string, "nodes=\"no\""); gamgi_expat_export_element (fp, "red - GAMGI_MESA_CELL_R) > GAMGI_MATH_TOLERANCE || fabs (cell_class->green - GAMGI_MESA_CELL_G) > GAMGI_MATH_TOLERANCE || fabs (cell_class->blue - GAMGI_MESA_CELL_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, cell_class->red); gamgi_expat_export_element (fp, "green); gamgi_expat_export_element (fp, "blue); gamgi_expat_export_element (fp, "axes_size - GAMGI_MESA_AXES_SIZE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "axes_size=\"%.*f\"", GAMGI_MATH_DECIMAL_SIZE, cell_class->axes_size); gamgi_expat_export_element (fp, "borders_width != GAMGI_MESA_CELL_LINE) { sprintf (string, "borders_width=\"%d\"", cell_class->borders_width); gamgi_expat_export_element (fp, "nodes_width != GAMGI_MESA_CELL_POINT) { sprintf (string, "nodes_width=\"%d\"", cell_class->nodes_width); gamgi_expat_export_element (fp, "light; char string[GAMGI_ENGINE_STRING]; int column; /************* * shininess * *************/ if (fabs (light_class->shininess - GAMGI_MESA_LIGHT_SHININESS) > GAMGI_MATH_TOLERANCE) { sprintf (string, "shininess=\"%.*f\"", GAMGI_MATH_DECIMAL_SHININESS, light_class->shininess); gamgi_expat_export_element (fp, "ambient[0] - GAMGI_MESA_LIGHT_AMBIENT_R) > GAMGI_MATH_TOLERANCE || fabs (light_class->ambient[1] - GAMGI_MESA_LIGHT_AMBIENT_G) > GAMGI_MATH_TOLERANCE || fabs (light_class->ambient[2] - GAMGI_MESA_LIGHT_AMBIENT_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "ambient_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light_class->ambient[0]); gamgi_expat_export_element (fp, "ambient[1]); gamgi_expat_export_element (fp, "ambient[2]); gamgi_expat_export_element (fp, "diffuse[0] - GAMGI_MESA_LIGHT_DIFFUSE_R) > GAMGI_MATH_TOLERANCE || fabs (light_class->diffuse[1] - GAMGI_MESA_LIGHT_DIFFUSE_G) > GAMGI_MATH_TOLERANCE || fabs (light_class->diffuse[2] - GAMGI_MESA_LIGHT_DIFFUSE_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "diffuse_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light_class->diffuse[0]); gamgi_expat_export_element (fp, "diffuse[1]); gamgi_expat_export_element (fp, "diffuse[2]); gamgi_expat_export_element (fp, "specular[0] - GAMGI_MESA_LIGHT_SPECULAR_R) > GAMGI_MATH_TOLERANCE || fabs (light_class->specular[1] - GAMGI_MESA_LIGHT_SPECULAR_G) > GAMGI_MATH_TOLERANCE || fabs (light_class->specular[2] - GAMGI_MESA_LIGHT_SPECULAR_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "specular_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light_class->specular[0]); gamgi_expat_export_element (fp, "specular[1]); gamgi_expat_export_element (fp, "specular[2]); gamgi_expat_export_element (fp, "layer; char string[GAMGI_ENGINE_STRING]; int column; /************** * undo, save * **************/ if (layer_class->undo != GAMGI_ENGINE_UNDO) { sprintf (string, "undo=\"%d\"", layer_class->undo); gamgi_expat_export_element (fp, "save != GAMGI_ENGINE_SAVE) { sprintf (string, "save=\"%d\"", layer_class->save); gamgi_expat_export_element (fp, "perspective != GAMGI_MESA_LAYER_PERSPECTIVE) { if (layer_class->perspective == TRUE) sprintf (string, "perspective=\"yes\""); else sprintf (string, "perspective=\"no\""); gamgi_expat_export_element (fp, "top - GAMGI_MESA_LAYER_TOP) > GAMGI_MATH_TOLERANCE) { sprintf (string, "top=\"%.*f\"", gamgi->gamgi->length, layer_class->top); gamgi_expat_export_element (fp, "near - GAMGI_MESA_LAYER_NEAR) > GAMGI_MATH_TOLERANCE) { sprintf (string, "near=\"%.*f\"", gamgi->gamgi->length, layer_class->near); gamgi_expat_export_element (fp, "far - GAMGI_MESA_LAYER_FAR) > GAMGI_MATH_TOLERANCE) { sprintf (string, "far=\"%.*f\"", gamgi->gamgi->length, layer_class->far); gamgi_expat_export_element (fp, "eye[0] - GAMGI_MESA_LAYER_EYEX) > GAMGI_MATH_TOLERANCE || fabs (layer_class->eye[1] - GAMGI_MESA_LAYER_EYEY) > GAMGI_MATH_TOLERANCE || fabs (layer_class->eye[2] - GAMGI_MESA_LAYER_EYEZ) > GAMGI_MATH_TOLERANCE) { sprintf (string, "eye_x=\"%.*f\"", gamgi->gamgi->length, layer_class->eye[0]); gamgi_expat_export_element (fp, "gamgi->length, layer_class->eye[1]); gamgi_expat_export_element (fp, "gamgi->length, layer_class->eye[2]); gamgi_expat_export_element (fp, "center[0] - GAMGI_MESA_LAYER_CENTERX) > GAMGI_MATH_TOLERANCE || fabs (layer_class->center[1] - GAMGI_MESA_LAYER_CENTERY) > GAMGI_MATH_TOLERANCE || fabs (layer_class->center[2] - GAMGI_MESA_LAYER_CENTERZ) > GAMGI_MATH_TOLERANCE) { sprintf (string, "center_x=\"%.*f\"", gamgi->gamgi->length, layer_class->center[0]); gamgi_expat_export_element (fp, "gamgi->length, layer_class->center[1]); gamgi_expat_export_element (fp, "gamgi->length, layer_class->center[2]); gamgi_expat_export_element (fp, "up[0] - GAMGI_MESA_LAYER_UPX) > GAMGI_MATH_TOLERANCE || fabs (layer_class->up[1] - GAMGI_MESA_LAYER_UPY) > GAMGI_MATH_TOLERANCE || fabs (layer_class->up[2] - GAMGI_MESA_LAYER_UPZ) > GAMGI_MATH_TOLERANCE) { sprintf (string, "up_x=\"%.*f\"", gamgi->gamgi->length, layer_class->up[0]); gamgi_expat_export_element (fp, "gamgi->length, layer_class->up[1]); gamgi_expat_export_element (fp, "gamgi->length, layer_class->up[2]); gamgi_expat_export_element (fp, "window; char string[GAMGI_ENGINE_STRING]; int column; /******************** * ruler parameters * ********************/ /********** * rotate * **********/ if (fabs (window_class->rotate_max - GAMGI_GTK_ROTATE_MAX) > GAMGI_MATH_TOLERANCE) { sprintf (string, "rotate_max=\"%.*f\"", gamgi->gamgi->angle, window_class->rotate_max); gamgi_expat_export_element (fp, "rotate_step - GAMGI_GTK_ROTATE_STEP) > GAMGI_MATH_TOLERANCE) { sprintf (string, "rotate_step=\"%.*f\"", gamgi->gamgi->angle, window_class->rotate_step); gamgi_expat_export_element (fp, "move_max - GAMGI_GTK_MOVE_MAX) > GAMGI_MATH_TOLERANCE) { sprintf (string, "move_max=\"%.*f\"", gamgi->gamgi->angle, window_class->move_max); gamgi_expat_export_element (fp, "move_step - GAMGI_GTK_MOVE_STEP) > GAMGI_MATH_TOLERANCE) { sprintf (string, "move_step=\"%.*f\"", gamgi->gamgi->angle, window_class->move_step); gamgi_expat_export_element (fp, "scale_max - GAMGI_GTK_SCALE_MAX) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale_max=\"%.*f\"", gamgi->gamgi->angle, window_class->scale_max); gamgi_expat_export_element (fp, "scale_step - GAMGI_GTK_SCALE_STEP) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale_step=\"%.*f\"", gamgi->gamgi->angle, window_class->scale_step); gamgi_expat_export_element (fp, "gamgi; char string[GAMGI_ENGINE_STRING]; int column; /************** * beep sound * **************/ if (gamgi_class->beep != GAMGI_GTK_BEEP) { if (gamgi_class->beep == TRUE) sprintf (string, "sound=\"yes\""); else sprintf (string, "sound=\"no\""); gamgi_expat_export_element (fp, "tolerance != GAMGI_MESA_PICK_TOLERANCE) { sprintf (string, "tolerance=\"%d\"", gamgi_class->tolerance); gamgi_expat_export_element (fp, "button1 != GDK_BUTTON1_MASK || gamgi_class->button2 != GDK_BUTTON2_MASK || gamgi_class->button3 != GDK_BUTTON3_MASK) { sprintf (string, "button1=\"%d\"", gamgi_class->button1); gamgi_expat_export_element (fp, "button2); gamgi_expat_export_element (fp, "button3); gamgi_expat_export_element (fp, "length != GAMGI_MATH_DECIMAL_LENGTH) { sprintf (string, "length=\"%d\"", gamgi_class->length); gamgi_expat_export_element (fp, "angle != GAMGI_MATH_DECIMAL_ANGLE) { sprintf (string, "angle=\"%d\"", gamgi_class->angle); gamgi_expat_export_element (fp, "charge != GAMGI_MATH_DECIMAL_CHARGE) { sprintf (string, "charge=\"%d\"", gamgi_class->charge); gamgi_expat_export_element (fp, "mass != GAMGI_MATH_DECIMAL_MASS) { sprintf (string, "mass=\"%d\"", gamgi_class->mass); gamgi_expat_export_element (fp, "background[0] - GAMGI_GTK_BACKGROUND_R) > GAMGI_MATH_TOLERANCE || fabs (gamgi_class->background[1] - GAMGI_GTK_BACKGROUND_G) > GAMGI_MATH_TOLERANCE || fabs (gamgi_class->background[2] - GAMGI_GTK_BACKGROUND_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "base_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, gamgi_class->background[0]); gamgi_expat_export_element (fp, "background[1]); gamgi_expat_export_element (fp, "background[2]); gamgi_expat_export_element (fp, "foreground[0] - GAMGI_GTK_FOREGROUND_R) > GAMGI_MATH_TOLERANCE || fabs (gamgi_class->foreground[1] - GAMGI_GTK_FOREGROUND_G) > GAMGI_MATH_TOLERANCE || fabs (gamgi_class->foreground[2] - GAMGI_GTK_FOREGROUND_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "text_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, gamgi_class->foreground[0]); gamgi_expat_export_element (fp, "foreground[1]); gamgi_expat_export_element (fp, "foreground[2]); gamgi_expat_export_element (fp, "title[0] - GAMGI_GTK_TITLE_R) > GAMGI_MATH_TOLERANCE || fabs (gamgi_class->title[1] - GAMGI_GTK_TITLE_G) > GAMGI_MATH_TOLERANCE || fabs (gamgi_class->title[2] - GAMGI_GTK_TITLE_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "title_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, gamgi_class->title[0]); gamgi_expat_export_element (fp, "title[1]); gamgi_expat_export_element (fp, "title[2]); gamgi_expat_export_element (fp, "bold[0] - GAMGI_GTK_BOLD_R) > GAMGI_MATH_TOLERANCE || fabs (gamgi_class->bold[1] - GAMGI_GTK_BOLD_G) > GAMGI_MATH_TOLERANCE || fabs (gamgi_class->bold[2] - GAMGI_GTK_BOLD_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "bold_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, gamgi_class->bold[0]); gamgi_expat_export_element (fp, "bold[1]); gamgi_expat_export_element (fp, "bold[2]); gamgi_expat_export_element (fp, "link[0] - GAMGI_GTK_LINK_R) > GAMGI_MATH_TOLERANCE || fabs (gamgi_class->link[1] - GAMGI_GTK_LINK_G) > GAMGI_MATH_TOLERANCE || fabs (gamgi_class->link[2] - GAMGI_GTK_LINK_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "link_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, gamgi_class->link[0]); gamgi_expat_export_element (fp, "link[1]); gamgi_expat_export_element (fp, "link[2]); gamgi_expat_export_element (fp, "object.name, "Text") != 0) { sprintf (string, "name=\"%s\"", text->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_TEXT == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /*********************** * contents (required) * ***********************/ /************************************************************ * translate XML special characters to predefined entities: * * < = < > = > & = & ' = &pos; " = " * ************************************************************/ length = strlen ("contents=\"\"") + gamgi_expat_export_length (text) + 1; buffer = (char *) malloc (length * sizeof (char)); strcpy (buffer, "contents=\""); gamgi_expat_export_string (text, buffer + strlen ("contents=\"")); strcat (buffer, "\""); gamgi_expat_export_attribute (fp, buffer, depth, column, error); free (buffer); /******************** * style (optional) * ********************/ if (text->style != gamgi->text->style) { if (text->style == GAMGI_MESA_WIRED) sprintf (string, "style=\"wired\""); if (text->style == GAMGI_MESA_SOLID) sprintf (string, "style=\"solid\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************* * font (optional) * *******************/ if (text->style == GAMGI_MESA_WIRED && text->font != gamgi->text->wired) { if (text->font == GAMGI_IO_SUN_ROMAN) sprintf (string, "font=\"roman\""); else if (text->font == GAMGI_IO_SUN_ROMAN_MONO) sprintf (string, "font=\"roman_mono\""); else if (text->font == GAMGI_IO_HERSHEY_SANS) sprintf (string, "font=\"sans\""); else if (text->font == GAMGI_IO_HERSHEY_SANS_BOLD) sprintf (string, "font=\"sans_bold\""); else if (text->font == GAMGI_IO_HERSHEY_SERIF) sprintf (string, "font=\"serif\""); else if (text->font == GAMGI_IO_HERSHEY_SERIF_BOLD) sprintf (string, "font=\"serif_bold\""); else if (text->font == GAMGI_IO_HERSHEY_SCRIPT) sprintf (string, "font=\"script\""); else if (text->font == GAMGI_IO_HERSHEY_SCRIPT_BOLD) sprintf (string, "font=\"script_bold\""); else if (text->font == GAMGI_IO_HERSHEY_GOTHIC_ENGLISH) sprintf (string, "font=\"gothic_english\""); else if (text->font == GAMGI_IO_HERSHEY_GOTHIC_GERMAN) sprintf (string, "font=\"gothic_german\""); else if (text->font == GAMGI_IO_HERSHEY_GOTHIC_ITALIAN) sprintf (string, "font=\"gothic_italian\""); else if (text->font == GAMGI_IO_HERSHEY_SYMBOL_SANS) sprintf (string, "font=\"symbol_sans\""); else if (text->font == GAMGI_IO_HERSHEY_SYMBOL_SERIF) sprintf (string, "font=\"symbol_serif\""); else if (text->font == GAMGI_IO_HERSHEY_SYMBOL_SERIF_BOLD) sprintf (string, "font=\"symbol_serif_bold\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (text->style == GAMGI_MESA_SOLID && text->font != gamgi->text->solid) { if (text->font == GAMGI_IO_DEJAVU_SANS) sprintf (string, "font=\"sans\""); else if (text->font == GAMGI_IO_DEJAVU_SANS_BOLD) sprintf (string, "font=\"sans_bold\""); else if (text->font == GAMGI_IO_DEJAVU_SANS_ITALIC) sprintf (string, "font=\"sans_italic\""); else if (text->font == GAMGI_IO_DEJAVU_SANS_BOLD_ITALIC) sprintf (string, "font=\"sans_bold_italic\""); else if (text->font == GAMGI_IO_DEJAVU_SERIF) sprintf (string, "font=\"serif\""); else if (text->font == GAMGI_IO_DEJAVU_SERIF_BOLD) sprintf (string, "font=\"serif_bold\""); else if (text->font == GAMGI_IO_DEJAVU_SERIF_ITALIC) sprintf (string, "font=\"serif_italic\""); else if (text->font == GAMGI_IO_DEJAVU_SERIF_BOLD_ITALIC) sprintf (string, "font=\"serif_bold_italic\""); else if (text->font == GAMGI_IO_DEJAVU_MONO) sprintf (string, "font=\"mono\""); else if (text->font == GAMGI_IO_DEJAVU_MONO_BOLD) sprintf (string, "font=\"mono_bold\""); else if (text->font == GAMGI_IO_DEJAVU_MONO_ITALIC) sprintf (string, "font=\"mono_italic\""); else if (text->font == GAMGI_IO_DEJAVU_MONO_BOLD_ITALIC) sprintf (string, "font=\"mono_bold_italic\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************* * origin: x,y,z (optional, coupled) * *************************************/ if (fabs (text->origin[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (text->origin[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (text->origin[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "x=\"%.*f\"", gamgi->gamgi->length, text->origin[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "y=\"%.*f\"", gamgi->gamgi->length, text->origin[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "z=\"%.*f\"", gamgi->gamgi->length, text->origin[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************************** * Euler angles: e1,e2,e3 (optional, coupled) * **********************************************/ gamgi_math_quaternion_to_matrix (text->quaternion, rotate); gamgi_math_euler_from_matrix (rotate, euler); if (fabs (euler[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "e1=\"%.*f\"", gamgi->gamgi->angle, euler[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e2=\"%.*f\"", gamgi->gamgi->angle, euler[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e3=\"%.*f\"", gamgi->gamgi->angle, euler[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************** * red,green,blue (optional, coupled) * **************************************/ if (fabs (text->red - GAMGI_MESA_TEXT_R) > GAMGI_MATH_TOLERANCE || fabs (text->green - GAMGI_MESA_TEXT_G) > GAMGI_MATH_TOLERANCE || fabs (text->blue - GAMGI_MESA_TEXT_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, text->red); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "green=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, text->green); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "blue=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, text->blue); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (text->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, text->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_orbital (gamgi_orbital *orbital, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; char token[GAMGI_ENGINE_TOKEN]; double rotate[9], euler[3]; double radius; int sampling, i; /******************* * name (optional) * *******************/ if (strcmp (orbital->object.name, "Orbital") != 0) { sprintf (string, "name=\"%s\"", orbital->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_ORBITAL == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /**************************** * n,l,m numbers (required) * ****************************/ sprintf (string, "n=\"%d\"", orbital->n); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "l=\"%d\"", orbital->l); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "m=\"%d\"", orbital->m); gamgi_expat_export_attribute (fp, string, depth, column, error); /********************* * charge (optional) * *********************/ if (fabs (orbital->charge - GAMGI_CHEM_ORBITAL_CHARGE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "charge=\"%.*f\"", gamgi->gamgi->charge, orbital->charge); gamgi_expat_export_attribute (fp, string, depth, column, error); } /**************************************************** * style density, sampling, radius, seed (optional) * ****************************************************/ if (orbital->style != GAMGI_MESA_ORBITAL_STYLE) { if (orbital->style == GAMGI_MESA_WIRED) sprintf (string, "style=\"wired\""); if (orbital->style == GAMGI_MESA_SOLID) sprintf (string, "style=\"solid\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (orbital->density - GAMGI_CHEM_ORBITAL_DENSITY) > GAMGI_MATH_TOLERANCE_ORBITAL) { sprintf (string, "density=\"%.*E\"", 1, orbital->density); gamgi_expat_export_attribute (fp, string, depth, column, error); } sampling = gamgi_chem_orbital_sampling (orbital->n, orbital->style); if (orbital->sampling != sampling) { sprintf (string, "sampling=\"%d\"", orbital->sampling); gamgi_expat_export_attribute (fp, string, depth, column, error); } radius = gamgi_chem_orbital_radius (orbital->n, orbital->l, orbital->m, orbital->charge); if (fabs (orbital->radius - radius) > GAMGI_MATH_TOLERANCE) { sprintf (string, "radius=\"%.*f\"", gamgi->gamgi->length, orbital->radius); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (orbital->seed != GAMGI_MATH_SEED) { sprintf (string, "seed=\"%d\"", orbital->seed); gamgi_expat_export_attribute (fp, string, depth, column, error); } /****************************************** * phase, frame, octants, axes (optional) * ******************************************/ if (orbital->phase == FALSE) gamgi_expat_export_attribute (fp, "phase=\"no\"", depth, column, error); if (orbital->frame == FALSE) gamgi_expat_export_attribute (fp, "frame=\"no\"", depth, column, error); token[8] = '\0'; for (i = 0; i < 8; i++) token[i] = (orbital->octants[i] == 0) ? '0' : '1'; if (strcmp (token, "11111111") != 0) { sprintf (string, "octants=\"%s\"", token); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (orbital->axes == GAMGI_CHEM_RADIUS) gamgi_expat_export_attribute (fp, "axes=\"radius\"", depth, column, error); else if (orbital->axes == GAMGI_CHEM_UNIT) gamgi_expat_export_attribute (fp, "axes=\"unit\"", depth, column, error); else if (orbital->axes == GAMGI_CHEM_BOHR) gamgi_expat_export_attribute (fp, "axes=\"bohr\"", depth, column, error); /************************************* * origin: x,y,z (optional, coupled) * *************************************/ if (fabs (orbital->origin[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (orbital->origin[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (orbital->origin[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "x=\"%.*f\"", gamgi->gamgi->length, orbital->origin[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "y=\"%.*f\"", gamgi->gamgi->length, orbital->origin[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "z=\"%.*f\"", gamgi->gamgi->length, orbital->origin[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************************** * Euler angles: e1,e2,e3 (optional, coupled) * **********************************************/ gamgi_math_quaternion_to_matrix (orbital->quaternion, rotate); gamgi_math_euler_from_matrix (rotate, euler); if (fabs (euler[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "e1=\"%.*f\"", gamgi->gamgi->angle, euler[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e2=\"%.*f\"", gamgi->gamgi->angle, euler[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e3=\"%.*f\"", gamgi->gamgi->angle, euler[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************************************* * red,green,blue base (optional, coupled) * *******************************************/ if (fabs (orbital->base_r - GAMGI_MESA_ORBITAL_BASE_R) > GAMGI_MATH_TOLERANCE || fabs (orbital->base_g - GAMGI_MESA_ORBITAL_BASE_G) > GAMGI_MATH_TOLERANCE || fabs (orbital->base_b - GAMGI_MESA_ORBITAL_BASE_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "base_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, orbital->base_r); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "base_g=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, orbital->base_g); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "base_b=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, orbital->base_b); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************************************** * red,green,blue phase (optional, coupled) * ********************************************/ if (fabs (orbital->phase_r - GAMGI_MESA_ORBITAL_PHASE_R) > GAMGI_MATH_TOLERANCE || fabs (orbital->phase_g - GAMGI_MESA_ORBITAL_PHASE_G) > GAMGI_MATH_TOLERANCE || fabs (orbital->phase_b - GAMGI_MESA_ORBITAL_PHASE_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "phase_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, orbital->phase_r); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "phase_g=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, orbital->phase_g); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "phase_b=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, orbital->phase_b); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************************************** * red,green,blue frame (optional, coupled) * ********************************************/ if (fabs (orbital->frame_r - GAMGI_MESA_ORBITAL_FRAME_R) > GAMGI_MATH_TOLERANCE || fabs (orbital->frame_g - GAMGI_MESA_ORBITAL_FRAME_G) > GAMGI_MATH_TOLERANCE || fabs (orbital->frame_b - GAMGI_MESA_ORBITAL_FRAME_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "frame_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, orbital->frame_r); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "frame_g=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, orbital->frame_g); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "frame_b=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, orbital->frame_b); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (orbital->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, orbital->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_bond (gamgi_bond *bond, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_BOND == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************* * name (optional) * *******************/ gamgi_chem_bond_name (bond, string); if (strcmp (bond->object.name, string) != 0) { sprintf (string, "name=\"%s\"", bond->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /*************************************** * ids for parent1, parent2 (required) * * * * unused bond->object.object and * * bond->object.dlist addresses * * are used to save atom ids * ***************************************/ sprintf (string, "parent1=\"%d\"", GAMGI_POINTER_TO_INT (bond->object.object)); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "parent2=\"%d\"", GAMGI_POINTER_TO_INT (bond->object.dlist)); gamgi_expat_export_attribute (fp, string, depth, column, error); /******************************* * covalency, order (optional) * *******************************/ if (bond->covalency + GAMGI_MATH_TOLERANCE >= 0) { sprintf (string, "covalency=\"%.*f\"", GAMGI_MATH_DECIMAL_COVALENCY, bond->covalency); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (bond->order - 1.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "order=\"%.*f\"", GAMGI_MATH_DECIMAL_ORDER, bond->order); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * style (optional) * ********************/ if (bond->draw == gamgi_mesa_bond_draw_line && gamgi->bond->draw != gamgi_mesa_bond_draw_line) gamgi_expat_export_attribute (fp, "style=\"wired\"", depth, column, error); if (bond->draw == gamgi_mesa_bond_draw_cylinder && gamgi->bond->draw != gamgi_mesa_bond_draw_cylinder) gamgi_expat_export_attribute (fp, "style=\"solid\"", depth, column, error); /******************* * size (optional) * *******************/ if (bond->draw == gamgi_mesa_bond_draw_cylinder && fabs (bond->size - gamgi->bond->size) > GAMGI_MATH_TOLERANCE) { sprintf (string, "size=\"%.*f\"", GAMGI_MATH_DECIMAL_SIZE, bond->size); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * color (optional) * ********************/ if (bond->color != gamgi->bond->color) { if (bond->color == TRUE) sprintf (string, "color=\"yes\""); else sprintf (string, "color=\"no\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************** * red,green,blue (optional, coupled) * **************************************/ if (bond->color == TRUE) { if (fabs (bond->red - gamgi->bond->red) > GAMGI_MATH_TOLERANCE || fabs (bond->green - gamgi->bond->green) > GAMGI_MATH_TOLERANCE || fabs (bond->blue - gamgi->bond->blue) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, bond->red); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "green=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, bond->green); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "blue=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, bond->blue); gamgi_expat_export_attribute (fp, string, depth, column, error); } } /******************** * scale (optional) * ********************/ if (fabs (bond->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, bond->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_atom (gamgi_atom *atom, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; char token[GAMGI_ENGINE_TOKEN]; /******************************************* * Although GAMGI is currently recognizing * * only elements until Rg[111], therefore * * with 2 char names, the source code is * * ready to accept elements with 3 char * * names such as UUo[118], so after adding * * the end '\0' char, we need element[4]. * *******************************************/ /************************************* * id (optional, required if bonded) * *************************************/ if (GAMGI_EXPAT_ID_ATOM == TRUE || atom->mark > 0) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); atom->mark = 0; } /******************* * name (optional) * *******************/ gamgi_chem_atom_name (atom->element, token); if (strcmp (atom->object.name, token) != 0) { sprintf (string, "name=\"%s\"", atom->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************************************** * element, x,y,z coordinates (required) * *****************************************/ sprintf (string, "element=\"%s\"", token); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "x=\"%.*f\"", gamgi->gamgi->length, atom->position[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "y=\"%.*f\"", gamgi->gamgi->length, atom->position[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "z=\"%.*f\"", gamgi->gamgi->length, atom->position[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); /****************************************** * label, mass, radius, charge (optional) * * * * radius, mass is -1 when undefined * ******************************************/ gamgi_io_token_lower (token, token+10); if (strcmp (atom->object.label, token+10) != 0) { sprintf (string, "label=\"%s\"", atom->object.label); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (atom->mass - gamgi->atom->mass[atom->element]) > GAMGI_MATH_TOLERANCE) { sprintf (string, "mass=\"%.*f\"", gamgi->gamgi->mass, atom->mass); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (atom->radius - gamgi->atom->radius[atom->element]) > GAMGI_MATH_TOLERANCE) { sprintf (string, "radius=\"%.*f\"", gamgi->gamgi->length, atom->radius); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (atom->charge - GAMGI_CHEM_ATOM_CHARGE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "charge=\"%.*f\"", gamgi->gamgi->charge, atom->charge); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************* * temperature, occupancy (optional) * *************************************/ if (fabs (atom->temperature - gamgi->atom->temperature) > GAMGI_MATH_TOLERANCE) { sprintf (string, "temperature=\"%.*f\"", GAMGI_MATH_DECIMAL_OCCUPANCY, atom->temperature); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (atom->occupancy - 1.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "occupancy=\"%.*f\"", GAMGI_MATH_DECIMAL_OCCUPANCY, atom->occupancy); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************************** * r,g,b (optional, coupled) * *****************************/ if (fabs (atom->red - gamgi->atom->red[atom->element]) > GAMGI_MATH_TOLERANCE || fabs (atom->green - gamgi->atom->green[atom->element]) > GAMGI_MATH_TOLERANCE || fabs (atom->blue - gamgi->atom->blue[atom->element]) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, atom->red); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "green=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, atom->green); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "blue=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, atom->blue); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * style (optional) * ********************/ if (atom->draw == gamgi_mesa_atom_draw_cross && gamgi->atom->draw != gamgi_mesa_atom_draw_cross) gamgi_expat_export_attribute (fp, "style=\"wired\"", depth, column, error); if (atom->draw == gamgi_mesa_atom_draw_sphere && gamgi->atom->draw != gamgi_mesa_atom_draw_sphere) gamgi_expat_export_attribute (fp, "style=\"solid\"", depth, column, error); /***************************** * variancy, size (optional) * *****************************/ if (atom->draw == gamgi_mesa_atom_draw_sphere && fabs (atom->variancy - gamgi->atom->variancy) > GAMGI_MATH_TOLERANCE) { sprintf (string, "variancy=\"%.*f\"", GAMGI_MATH_DECIMAL_VARIANCY, atom->variancy); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (atom->draw == gamgi_mesa_atom_draw_sphere && fabs (atom->size - gamgi->atom->size) > GAMGI_MATH_TOLERANCE) { sprintf (string, "size=\"%.*f\"", GAMGI_MATH_DECIMAL_SIZE, atom->size); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (atom->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, atom->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_direction (gamgi_direction *direction, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; double rotation[9]; double euler[3]; /******************* * name (optional) * *******************/ sprintf (string, "[%d.%d.%d]", direction->uvw[0], direction->uvw[1], direction->uvw[2]); if (direction->reference != GAMGI_ENGINE_CELL || strcmp (direction->object.name, string) != 0) { sprintf (string, "name=\"%s\"", direction->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_DIRECTION == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /****************************** * export direction reference * * (how direction is defined) * ******************************/ if (direction->reference != FALSE) { if (direction->reference == GAMGI_ENGINE_CELL) sprintf (string, "reference=\"cell\""); if (direction->reference == GAMGI_ENGINE_ATOM) sprintf (string, "reference=\"atoms\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (direction->reference == GAMGI_ENGINE_CELL) { /**************************************** * this is a crystallographic direction * ****************************************/ /****************** * uvw (required) * ******************/ sprintf (string, "u=\"%d\" v=\"%d\" w=\"%d\"", direction->uvw[0], direction->uvw[1], direction->uvw[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); /********************** * vectors (optional) * **********************/ if (direction->vectors != GAMGI_PHYS_DIRECTION_VECTORS) { if (direction->vectors == GAMGI_PHYS_CONVENTIONAL) sprintf (string, "vectors=\"conventional\""); if (direction->vectors == GAMGI_PHYS_PRIMITIVE) sprintf (string, "vectors=\"primitive\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************************** * projection net (optional) * *****************************/ if (direction->net != NULL && direction->net != GAMGI_PHYS_PROJECTION_NET) { if (direction->net == gamgi_phys_projection_wulff) sprintf (string, "net=\"wulff\""); if (direction->net == gamgi_phys_projection_schmidt) sprintf (string, "net=\"schmidt\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************* * line is default for 3D space, * * pole is default for 2D projection * *************************************/ if (direction->model == GAMGI_PHYS_TRACE) { sprintf (string, "model=\"trace\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************* * node (optional) * *******************/ if (gamgi_phys_direction_zero (direction->node) == FALSE) { sprintf (string, "o1=\"%d\"", direction->node[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "o2=\"%d\"", direction->node[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "o3=\"%d\"", direction->node[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (direction->node[3] != FALSE) { if (direction->node[3] == GAMGI_PHYS_110) sprintf (string, "o4=\"110\""); if (direction->node[3] == GAMGI_PHYS_101) sprintf (string, "o4=\"101\""); if (direction->node[3] == GAMGI_PHYS_011) sprintf (string, "o4=\"011\""); if (direction->node[3] == GAMGI_PHYS_111) sprintf (string, "o4=\"111\""); if (direction->node[3] == GAMGI_PHYS_211) sprintf (string, "o4=\"211\""); if (direction->node[3] == GAMGI_PHYS_122) sprintf (string, "o4=\"122\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } } /************* * Line page * *************/ /************************************************** * initial,final x,y,z points (required, coupled) * **************************************************/ if (direction->model == GAMGI_PHYS_LINE) { sprintf (string, "begin_x=\"%.*f\"", gamgi->gamgi->length, direction->points[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "begin_y=\"%.*f\"", gamgi->gamgi->length, direction->points[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "begin_z=\"%.*f\"", gamgi->gamgi->length, direction->points[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "end_x=\"%.*f\"", gamgi->gamgi->length, direction->points[3]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "end_y=\"%.*f\"", gamgi->gamgi->length, direction->points[4]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "end_z=\"%.*f\"", gamgi->gamgi->length, direction->points[5]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * Position page * *****************/ /************************************* * origin: x,y,z (optional, coupled) * *************************************/ if (fabs (direction->origin[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (direction->origin[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (direction->origin[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "x=\"%.*f\"", gamgi->gamgi->length, direction->origin[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "y=\"%.*f\"", gamgi->gamgi->length, direction->origin[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "z=\"%.*f\"", gamgi->gamgi->length, direction->origin[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************* * center: x,y,z (optional, coupled) * *************************************/ if (fabs (direction->center[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (direction->center[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (direction->center[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "center_x=\"%.*f\"", gamgi->gamgi->length, direction->center[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "center_y=\"%.*f\"", gamgi->gamgi->length, direction->center[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "center_z=\"%.*f\"", gamgi->gamgi->length, direction->center[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************************** * Euler angles: e1,e2,e3 (optional, coupled) * **********************************************/ gamgi_math_quaternion_to_matrix (direction->quaternion, rotation); gamgi_math_euler_from_matrix (rotation, euler); if (fabs (euler[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "e1=\"%.*f\"", gamgi->gamgi->angle, euler[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e2=\"%.*f\"", gamgi->gamgi->angle, euler[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e3=\"%.*f\"", gamgi->gamgi->angle, euler[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************* * View page * *************/ /************************************** * red,green,blue (optional, coupled) * **************************************/ if (fabs (direction->red - gamgi->direction->red) > GAMGI_MATH_TOLERANCE || fabs (direction->green - gamgi->direction->green) > GAMGI_MATH_TOLERANCE || fabs (direction->blue - gamgi->direction->blue) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, direction->red); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "green=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, direction->green); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "blue=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, direction->blue); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (direction->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, direction->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_plane (gamgi_plane *plane, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; double rotation[9]; double euler[3]; /******************* * name (optional) * *******************/ sprintf (string, "(%d.%d.%d)", plane->hkl[0], plane->hkl[1], plane->hkl[2]); if (plane->reference != GAMGI_ENGINE_CELL || strcmp (plane->object.name, string) != 0) { sprintf (string, "name=\"%s\"", plane->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_PLANE == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************** * export plane reference * * (how plane is defined) * **************************/ if (plane->reference != FALSE) { if (plane->reference == GAMGI_ENGINE_CELL) sprintf (string, "reference=\"cell\""); if (plane->reference == GAMGI_ENGINE_ATOM) sprintf (string, "reference=\"atoms\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (plane->reference == GAMGI_ENGINE_CELL) { /************************************ * this is a crystallographic plane * ************************************/ /****************** * hkl (required) * ******************/ sprintf (string, "h=\"%d\" k=\"%d\" l=\"%d\"", plane->hkl[0], plane->hkl[1], plane->hkl[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); /******************** * order (optional) * ********************/ if (plane->order != 1) { sprintf (string, "order=\"%d\"", plane->order); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************** * vectors (optional) * **********************/ if (plane->vectors != GAMGI_PHYS_PLANE_VECTORS) { if (plane->vectors == GAMGI_PHYS_CONVENTIONAL) sprintf (string, "vectors=\"conventional\""); if (plane->vectors == GAMGI_PHYS_PRIMITIVE) sprintf (string, "vectors=\"primitive\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************************** * projection net (optional) * *****************************/ if (plane->net != NULL && plane->net != GAMGI_PHYS_PROJECTION_NET) { if (plane->net == gamgi_phys_projection_wulff) sprintf (string, "net=\"wulff\""); if (plane->net == gamgi_phys_projection_schmidt) sprintf (string, "net=\"schmidt\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************* * polygon is default for 3D space, * * pole is default for 2D projection * *************************************/ if (plane->model == GAMGI_PHYS_TRACE) { sprintf (string, "model=\"trace\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (plane->model == GAMGI_PHYS_VECTOR) { sprintf (string, "model=\"vector\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } } /***************** * Position page * *****************/ /************************************* * origin: x,y,z (optional, coupled) * *************************************/ if (fabs (plane->origin[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (plane->origin[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (plane->origin[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "x=\"%.*f\"", gamgi->gamgi->length, plane->origin[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "y=\"%.*f\"", gamgi->gamgi->length, plane->origin[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "z=\"%.*f\"", gamgi->gamgi->length, plane->origin[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************* * center: x,y,z (optional, coupled) * *************************************/ if (fabs (plane->center[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (plane->center[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (plane->center[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "center_x=\"%.*f\"", gamgi->gamgi->length, plane->center[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "center_y=\"%.*f\"", gamgi->gamgi->length, plane->center[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "center_z=\"%.*f\"", gamgi->gamgi->length, plane->center[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************************** * Euler angles: e1,e2,e3 (optional, coupled) * **********************************************/ gamgi_math_quaternion_to_matrix (plane->quaternion, rotation); gamgi_math_euler_from_matrix (rotation, euler); if (fabs (euler[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "e1=\"%.*f\"", gamgi->gamgi->angle, euler[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e2=\"%.*f\"", gamgi->gamgi->angle, euler[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e3=\"%.*f\"", gamgi->gamgi->angle, euler[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************* * View page * *************/ /************************************** * red,green,blue (optional, coupled) * **************************************/ if (fabs (plane->red - gamgi->plane->red) > GAMGI_MATH_TOLERANCE || fabs (plane->green - gamgi->plane->green) > GAMGI_MATH_TOLERANCE || fabs (plane->blue - gamgi->plane->blue) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, plane->red); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "green=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, plane->green); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "blue=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, plane->blue); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (plane->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, plane->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_group (gamgi_group *group, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; double rotate[9], euler[3]; /******************* * name (optional) * *******************/ if (strcmp (group->object.name, "Group") != 0) { sprintf (string, "name=\"%s\"", group->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_GROUP == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /****************** * Reference page * ******************/ if (group->reference == GAMGI_CHEM_POLYTOPE) gamgi_expat_export_attribute (fp, "reference=\"polytope\"", depth, column, error); /***************** * Position page * *****************/ /************************************* * origin: x,y,z (optional, coupled) * *************************************/ if (fabs (group->origin[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (group->origin[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (group->origin[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "x=\"%.*f\"", gamgi->gamgi->length, group->origin[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "y=\"%.*f\"", gamgi->gamgi->length, group->origin[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "z=\"%.*f\"", gamgi->gamgi->length, group->origin[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************* * center: x,y,z (optional, coupled) * *************************************/ if (fabs (group->center[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (group->center[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (group->center[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "center_x=\"%.*f\"", gamgi->gamgi->length, group->center[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "center_y=\"%.*f\"", gamgi->gamgi->length, group->center[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "center_z=\"%.*f\"", gamgi->gamgi->length, group->center[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************************** * Euler angles: e1,e2,e3 (optional, coupled) * **********************************************/ gamgi_math_quaternion_to_matrix (group->quaternion, rotate); gamgi_math_euler_from_matrix (rotate, euler); if (fabs (euler[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "e1=\"%.*f\"", gamgi->gamgi->angle, euler[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e2=\"%.*f\"", gamgi->gamgi->angle, euler[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e3=\"%.*f\"", gamgi->gamgi->angle, euler[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************* * View page * *************/ /******************** * style (optional) * ********************/ if (group->faces == TRUE) gamgi_expat_export_attribute (fp, "faces=\"yes\"", depth, column, error); /************************************** * red,green,blue (optional, coupled) * **************************************/ if (fabs (group->red - GAMGI_MESA_GROUP_R) > GAMGI_MATH_TOLERANCE || fabs (group->green - GAMGI_MESA_GROUP_G) > GAMGI_MATH_TOLERANCE || fabs (group->blue - GAMGI_MESA_GROUP_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, group->red); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "green=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, group->green); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "blue=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, group->blue); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (group->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, group->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_molecule (gamgi_molecule *molecule, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; /******************* * name (optional) * *******************/ if (strcmp (molecule->object.name, "Molecule") != 0) { sprintf (string, "name=\"%s\"", molecule->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_MOLECULE == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (molecule->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, molecule->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_cluster (gamgi_cluster *cluster, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; double rotate[9], euler[3]; /******************* * name (optional) * *******************/ if (strcmp (cluster->object.name, "Cluster") != 0) { sprintf (string, "name=\"%s\"", cluster->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_CLUSTER == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /****************** * Reference page * ******************/ if (cluster->reference == GAMGI_CHEM_POLYTOPE) gamgi_expat_export_attribute (fp, "reference=\"polytope\"", depth, column, error); /***************** * Position data * *****************/ /************************************* * origin: x,y,z (optional, coupled) * *************************************/ if (fabs (cluster->origin[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (cluster->origin[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (cluster->origin[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "x=\"%.*f\"", gamgi->gamgi->length, cluster->origin[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "y=\"%.*f\"", gamgi->gamgi->length, cluster->origin[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "z=\"%.*f\"", gamgi->gamgi->length, cluster->origin[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************* * center: x,y,z (optional, coupled) * *************************************/ if (fabs (cluster->center[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (cluster->center[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (cluster->center[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "center_x=\"%.*f\"", gamgi->gamgi->length, cluster->center[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "center_y=\"%.*f\"", gamgi->gamgi->length, cluster->center[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "center_z=\"%.*f\"", gamgi->gamgi->length, cluster->center[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************************** * Euler angles: e1,e2,e3 (optional, coupled) * **********************************************/ gamgi_math_quaternion_to_matrix (cluster->quaternion, rotate); gamgi_math_euler_from_matrix (rotate, euler); if (fabs (euler[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "e1=\"%.*f\"", gamgi->gamgi->angle, euler[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e2=\"%.*f\"", gamgi->gamgi->angle, euler[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e3=\"%.*f\"", gamgi->gamgi->angle, euler[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************** * atoms,faces (optional) * **************************/ if (cluster->atoms > 0) { sprintf (string, "atoms=\"%d\"", cluster->atoms); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (cluster->faces == TRUE) gamgi_expat_export_attribute (fp, "faces=\"yes\"", depth, column, error); /******************** * scale (optional) * ********************/ if (fabs (cluster->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, cluster->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_cell (gamgi_cell *cell, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; char system[GAMGI_ENGINE_TOKEN]; char lattice[GAMGI_ENGINE_TOKEN]; double euler[3], origin[3]; int o1, o2, o3, o4; /******************* * name (optional) * *******************/ if (strcmp (cell->object.name, "Cell") != 0) { sprintf (string, "name=\"%s\"", cell->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_CELL == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /*********************** * symmetry (required) * ***********************/ if (cell->group == 0) { gamgi_gtk_cell_symmetry_export (cell, system, lattice); sprintf (string, "system=\"%s\"", system); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "lattice=\"%s\"", lattice); gamgi_expat_export_attribute (fp, string, depth, column, error); } else { sprintf (string, "group=\"%d\"", cell->group); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************* * lattice parameters (required) * *********************************/ sprintf (string, "a=\"%.*f\"", gamgi->gamgi->length, cell->a); gamgi_expat_export_attribute (fp, string, depth, column, error); if (cell->lattice == GAMGI_PHYS_TRICLINIC_P || cell->lattice == GAMGI_PHYS_MONOCLINIC_P || cell->lattice == GAMGI_PHYS_MONOCLINIC_C || cell->lattice == GAMGI_PHYS_ORTHORHOMBIC_P || cell->lattice == GAMGI_PHYS_ORTHORHOMBIC_C || cell->lattice == GAMGI_PHYS_ORTHORHOMBIC_I || cell->lattice == GAMGI_PHYS_ORTHORHOMBIC_F) { sprintf (string, "b=\"%.*f\"", gamgi->gamgi->length, cell->b); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (cell->lattice != GAMGI_PHYS_CUBIC_P && cell->lattice != GAMGI_PHYS_CUBIC_I && cell->lattice != GAMGI_PHYS_CUBIC_F) { sprintf (string, "c=\"%.*f\"", gamgi->gamgi->length, cell->c); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (cell->lattice == GAMGI_PHYS_TRICLINIC_P) { sprintf (string, "ab=\"%.*f\"", gamgi->gamgi->angle, cell->ab); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (cell->lattice == GAMGI_PHYS_TRICLINIC_P || cell->lattice == GAMGI_PHYS_MONOCLINIC_P || cell->lattice == GAMGI_PHYS_MONOCLINIC_C) { sprintf (string, "ac=\"%.*f\"", gamgi->gamgi->angle, cell->ac); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (cell->lattice == GAMGI_PHYS_TRICLINIC_P) { sprintf (string, "bc=\"%.*f\"", gamgi->gamgi->angle, cell->bc); gamgi_expat_export_attribute (fp, string, depth, column, error); } /*************************************** * reciprocal lattice: export constant * ***************************************/ if (cell->reciprocal != 0.0) { sprintf (string, "reciprocal=\"%.*f\"", gamgi->gamgi->length, cell->reciprocal); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************* * volume (optional) * *********************/ if (cell->model != gamgi->cell->model) { if (cell->model == GAMGI_PHYS_CONVENTIONAL) sprintf (string, "model=\"%s\"", "conventional"); else if (cell->model == GAMGI_PHYS_PRIMITIVE) sprintf (string, "model=\"%s\"", "primitive"); else if (cell->model == GAMGI_PHYS_WIGNER) sprintf (string, "model=\"%s\"", "wigner"); else if (cell->model == GAMGI_PHYS_PARALLELEPIPED) sprintf (string, "model=\"%s\"", "parallelepiped"); else if (cell->model == GAMGI_PHYS_SPHERE) sprintf (string, "model=\"%s\"", "sphere"); else if (cell->model == GAMGI_PHYS_PROJECTION) sprintf (string, "model=\"%s\"", "projection"); gamgi_expat_export_attribute (fp, string, depth, column, error); } if ((cell->model == GAMGI_PHYS_CONVENTIONAL || cell->model == GAMGI_PHYS_PRIMITIVE || cell->model == GAMGI_PHYS_WIGNER) && (cell->n1 != 1 || cell->n2 != 1 || cell->n3 != 1)) { /******************************** * n1,n2,n3 (optional, coupled) * ********************************/ sprintf (string, "n1=\"%d\"", cell->n1); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "n2=\"%d\"", cell->n2); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "n3=\"%d\"", cell->n3); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (cell->model == GAMGI_PHYS_PARALLELEPIPED || cell->model == GAMGI_PHYS_SPHERE) { /***************** * v1 (required) * *****************/ sprintf (string, "v1=\"%.*f\"", gamgi->gamgi->length, cell->v1); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (cell->model == GAMGI_PHYS_PARALLELEPIPED) { /******************************** * v2,v3,v12,v13,v23 (required) * ********************************/ sprintf (string, "v2=\"%.*f\"", gamgi->gamgi->length, cell->v2); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "v3=\"%.*f\"", gamgi->gamgi->length, cell->v3); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "v12=\"%.*f\"", gamgi->gamgi->angle, cell->v12); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "v13=\"%.*f\"", gamgi->gamgi->angle, cell->v13); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "v23=\"%.*f\"", gamgi->gamgi->angle, cell->v23); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************* * origin: x,y,z (optional, coupled) * *************************************/ gamgi_math_position_cell_translation_get (cell, origin); if (fabs (origin[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (origin[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (origin[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "x=\"%.*f\"", gamgi->gamgi->length, origin[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "y=\"%.*f\"", gamgi->gamgi->length, origin[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "z=\"%.*f\"", gamgi->gamgi->length, origin[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************************** * Euler angles: e1,e2,e3 (optional, coupled) * **********************************************/ gamgi_math_position_cell_rotation_get (cell, euler); if (fabs (euler[0] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[1] - 0.0) > GAMGI_MATH_TOLERANCE || fabs (euler[2] - 0.0) > GAMGI_MATH_TOLERANCE) { sprintf (string, "e1=\"%.*f\"", gamgi->gamgi->angle, euler[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e2=\"%.*f\"", gamgi->gamgi->angle, euler[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "e3=\"%.*f\"", gamgi->gamgi->angle, euler[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************* * o1,o2,o3, (optional, coupled) * * o4, origin_vectors (optional) * *********************************/ if (cell->origin_vectors == GAMGI_PHYS_CONVENTIONAL) gamgi_math_node_conventional (cell->lattice, cell->o1, cell->o2, cell->o3, &o1, &o2, &o3, &o4); else { o1 = cell->o1; o2 = cell->o2; o3 = cell->o3; o4 = FALSE; } if (o1 != 0 || o2 != 0 || o3 != 0) { sprintf (string, "o1=\"%d\"", o1); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "o2=\"%d\"", o2); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "o3=\"%d\"", o3); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (o4 != FALSE) { if (o4 == GAMGI_PHYS_110) sprintf (string, "o4=\"110\""); if (o4 == GAMGI_PHYS_101) sprintf (string, "o4=\"101\""); if (o4 == GAMGI_PHYS_011) sprintf (string, "o4=\"011\""); if (o4 == GAMGI_PHYS_111) sprintf (string, "o4=\"111\""); if (o4 == GAMGI_PHYS_211) sprintf (string, "o4=\"211\""); if (o4 == GAMGI_PHYS_122) sprintf (string, "o4=\"122\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************************************* * by default, vectors are conventional for conventional * * parallelepiped, sphere and projection cells, and * * primitive for primitive and wigner-seitz cells * *********************************************************/ if (o4 == FALSE && (o1 != 0 || o2 != 0 || 03 != 0)) { if (cell->origin_vectors == GAMGI_PHYS_PRIMITIVE && (cell->model != GAMGI_PHYS_PRIMITIVE && cell->model != GAMGI_PHYS_WIGNER)) gamgi_expat_export_attribute (fp, "origin_vectors=\"primitive\"", depth, column, error); if (cell->origin_vectors == GAMGI_PHYS_CONVENTIONAL && (cell->model == GAMGI_PHYS_PRIMITIVE || cell->model == GAMGI_PHYS_WIGNER)) gamgi_expat_export_attribute (fp, "origin_vectors=\"conventional\"", depth, column, error); } /********************************* * axes, axes_vectors (optional) * *********************************/ if (cell->axes != gamgi->cell->axes) { if (cell->axes == TRUE) gamgi_expat_export_attribute (fp, "axes=\"yes\"", depth, column, error); else gamgi_expat_export_attribute (fp, "axes=\"no\"", depth, column, error); } /********************************************************* * by default, vectors are conventional for conventional * * parallelepiped, sphere and projection cells, and * * primitive for primitive and wigner-seitz cells * *********************************************************/ if (cell->axes == TRUE) { if (cell->axes_vectors == GAMGI_PHYS_PRIMITIVE && (cell->model != GAMGI_PHYS_PRIMITIVE && cell->model != GAMGI_PHYS_WIGNER)) gamgi_expat_export_attribute (fp, "axes_vectors=\"primitive\"", depth, column, error); if (cell->axes_vectors == GAMGI_PHYS_CONVENTIONAL && (cell->model == GAMGI_PHYS_PRIMITIVE || cell->model == GAMGI_PHYS_WIGNER)) gamgi_expat_export_attribute (fp, "axes_vectors=\"conventional\"", depth, column, error); } /********************************** * borders,faces,nodes (optional) * **********************************/ if (cell->borders != gamgi->cell->borders && cell->model != GAMGI_PHYS_PROJECTION) { if (cell->borders == GAMGI_PHYS_ALL) gamgi_expat_export_attribute (fp, "borders=\"all\"", depth, column, error); else if (cell->borders == GAMGI_PHYS_FACES) gamgi_expat_export_attribute (fp, "borders=\"faces\"", depth, column, error); else if (cell->borders == GAMGI_PHYS_EDGES) gamgi_expat_export_attribute (fp, "borders=\"edges\"", depth, column, error); else if (cell->borders == GAMGI_PHYS_NONE) gamgi_expat_export_attribute (fp, "borders=\"none\"", depth, column, error); } if (cell->faces != gamgi->cell->faces && cell->model != GAMGI_PHYS_PROJECTION && cell->model != GAMGI_PHYS_PARALLELEPIPED && cell->model != GAMGI_PHYS_SPHERE) { if (cell->faces == TRUE) gamgi_expat_export_attribute (fp, "faces=\"yes\"", depth, column, error); else gamgi_expat_export_attribute (fp, "faces=\"no\"", depth, column, error); } if (cell->nodes != gamgi->cell->nodes && cell->model != GAMGI_PHYS_PROJECTION) { if (cell->nodes == TRUE) gamgi_expat_export_attribute (fp, "nodes=\"yes\"", depth, column, error); else gamgi_expat_export_attribute (fp, "nodes=\"no\"", depth, column, error); } /************************************** * red,green,blue (optional, coupled) * **************************************/ if (fabs (cell->red - GAMGI_MESA_CELL_R) > GAMGI_MATH_TOLERANCE || fabs (cell->green - GAMGI_MESA_CELL_G) > GAMGI_MATH_TOLERANCE || fabs (cell->blue - GAMGI_MESA_CELL_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, cell->red); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "green=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, cell->green); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "blue=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, cell->blue); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (cell->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, cell->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_arrow (gamgi_arrow *arrow, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; /******************* * name (optional) * *******************/ if (strcmp (arrow->object.name, "Arrow") != 0) { sprintf (string, "name=\"%s\"", arrow->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_ARROW == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (arrow->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, arrow->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_shape (gamgi_shape *shape, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; /******************* * name (optional) * *******************/ if (strcmp (shape->object.name, "Shape") != 0) { sprintf (string, "name=\"%s\"", shape->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_SHAPE == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (shape->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, shape->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_graph (gamgi_graph *graph, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; /******************* * name (optional) * *******************/ if (strcmp (graph->object.name, "Graph") != 0) { sprintf (string, "name=\"%s\"", graph->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_GRAPH == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (graph->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, graph->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_assembly (gamgi_assembly *assembly, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; /******************* * name (optional) * *******************/ if (strcmp (assembly->object.name, "Assembly") != 0) { sprintf (string, "name=\"%s\"", assembly->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_ASSEMBLY == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (assembly->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, assembly->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_light (gamgi_light *light, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; /******************* * name (optional) * *******************/ if (strcmp (light->object.name, "Light") != 0) { sprintf (string, "name=\"%s\"", light->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_LIGHT == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************ * red,green,blue ambient (coupled) * ************************************/ if (light->ambient[0] > GAMGI_MATH_TOLERANCE || light->ambient[1] > GAMGI_MATH_TOLERANCE || light->ambient[2] > GAMGI_MATH_TOLERANCE) { sprintf (string, "ambient_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light->ambient[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "ambient_g=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light->ambient[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "ambient_b=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light->ambient[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************ * red,green,blue diffuse (coupled) * ************************************/ if (light->diffuse[0] > GAMGI_MATH_TOLERANCE || light->diffuse[1] > GAMGI_MATH_TOLERANCE || light->diffuse[2] > GAMGI_MATH_TOLERANCE) { sprintf (string, "diffuse_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light->diffuse[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "diffuse_g=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light->diffuse[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "diffuse_b=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light->diffuse[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************* * red,green,blue specular (coupled) * *************************************/ if (light->specular[0] > GAMGI_MATH_TOLERANCE || light->specular[1] > GAMGI_MATH_TOLERANCE || light->specular[2] > GAMGI_MATH_TOLERANCE) { sprintf (string, "specular_r=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light->specular[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "specular_g=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light->specular[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "specular_b=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, light->specular[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (light->position[3] - 0.0) < GAMGI_MATH_TOLERANCE) { /************************************************** * direction_x,direction_y,direction_z (required) * **************************************************/ /************************************************************ * invert the vector direction, so it has the same physical * * meaning in directional and positional lights, always * * pointing from the light source to the light destination * ************************************************************/ sprintf (string, "direction_x=\"%.*f\"", gamgi->gamgi->length, -light->position[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "direction_y=\"%.*f\"", gamgi->gamgi->length, -light->position[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "direction_z=\"%.*f\"", gamgi->gamgi->length, -light->position[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } else { /*********************************************** * position_x,position_y,position_z (required) * ***********************************************/ sprintf (string, "position_x=\"%.*f\"", gamgi->gamgi->length, light->position[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "position_y=\"%.*f\"", gamgi->gamgi->length, light->position[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "position_z=\"%.*f\"", gamgi->gamgi->length, light->position[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); if (fabs (light->angle - 180.0) > GAMGI_MATH_TOLERANCE) { /************************************************** * direction_x,direction_y,direction_z (required) * **************************************************/ sprintf (string, "direction_x=\"%.*f\"", gamgi->gamgi->length, light->direction[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "direction_y=\"%.*f\"", gamgi->gamgi->length, light->direction[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "direction_z=\"%.*f\"", gamgi->gamgi->length, light->direction[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); /******************** * angle (required) * ********************/ sprintf (string, "angle=\"%.*f\"", gamgi->gamgi->angle, light->angle); gamgi_expat_export_attribute (fp, string, depth, column, error); } } /*********************************************** * constant,linear,quadratic,radial (optional) * ***********************************************/ if (fabs (light->constant - GAMGI_MESA_LIGHT_CONSTANT) > GAMGI_MATH_TOLERANCE) { sprintf (string, "constant=\"%.*f\"", GAMGI_MATH_DECIMAL_ATTENUATION, light->constant); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (light->linear - GAMGI_MESA_LIGHT_LINEAR) > GAMGI_MATH_TOLERANCE) { sprintf (string, "linear=\"%.*f\"", GAMGI_MATH_DECIMAL_ATTENUATION, light->linear); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (light->quadratic - GAMGI_MESA_LIGHT_QUADRATIC) > GAMGI_MATH_TOLERANCE) { sprintf (string, "quadratic=\"%.*f\"", GAMGI_MATH_DECIMAL_ATTENUATION, light->quadratic); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (light->radial - GAMGI_MESA_LIGHT_RADIAL) > GAMGI_MATH_TOLERANCE) { sprintf (string, "radial=\"%.*f\"", GAMGI_MATH_DECIMAL_ATTENUATION, light->radial); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_layer (gamgi_layer *layer, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; /******************* * name (optional) * *******************/ if (strcmp (layer->object.name, "Layer") != 0) { sprintf (string, "name=\"%s\"", layer->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_LAYER == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************** * perspective (optional) * **************************/ if (layer->perspective != gamgi->layer->perspective) { if (layer->perspective == TRUE) sprintf (string, "perspective=\"yes\""); else sprintf (string, "perspective=\"no\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /*************************** * top,near,far (optional) * ***************************/ if (fabs (layer->top - gamgi->layer->top) > GAMGI_MATH_TOLERANCE) { sprintf (string, "top=\"%.*f\"", gamgi->gamgi->length, layer->top); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (layer->near - gamgi->layer->near) > GAMGI_MATH_TOLERANCE) { sprintf (string, "near=\"%.*f\"", gamgi->gamgi->length, layer->near); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (fabs (layer->far - gamgi->layer->far) > GAMGI_MATH_TOLERANCE) { sprintf (string, "far=\"%.*f\"", gamgi->gamgi->length, layer->far); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************************************** * eye_x,eye_y,eye_z (optional, coupled) * *****************************************/ if (fabs (layer->eye[0] - gamgi->layer->eye[0]) > GAMGI_MATH_TOLERANCE || fabs (layer->eye[1] - gamgi->layer->eye[1]) > GAMGI_MATH_TOLERANCE || fabs (layer->eye[2] - gamgi->layer->eye[2]) > GAMGI_MATH_TOLERANCE) { sprintf (string, "eye_x=\"%.*f\"", gamgi->gamgi->length, layer->eye[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "eye_y=\"%.*f\"", gamgi->gamgi->length, layer->eye[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "eye_z=\"%.*f\"", gamgi->gamgi->length, layer->eye[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************************** * center_x,center_y,center_z (optional, coupled) * **************************************************/ if (fabs (layer->center[0] - gamgi->layer->center[0]) > GAMGI_MATH_TOLERANCE || fabs (layer->center[1] - gamgi->layer->center[1]) > GAMGI_MATH_TOLERANCE || fabs (layer->center[2] - gamgi->layer->center[2]) > GAMGI_MATH_TOLERANCE) { sprintf (string, "center_x=\"%.*f\"", gamgi->gamgi->length, layer->center[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "center_y=\"%.*f\"", gamgi->gamgi->length, layer->center[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "center_z=\"%.*f\"", gamgi->gamgi->length, layer->center[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************** * up_x,up_y,up_z (optional, coupled) * **************************************/ if (fabs (layer->up[0] - gamgi->layer->up[0]) > GAMGI_MATH_TOLERANCE || fabs (layer->up[1] - gamgi->layer->up[1]) > GAMGI_MATH_TOLERANCE || fabs (layer->up[2] - gamgi->layer->up[2]) > GAMGI_MATH_TOLERANCE) { sprintf (string, "up_x=\"%.*f\"", gamgi->gamgi->length, layer->up[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "up_y=\"%.*f\"", gamgi->gamgi->length, layer->up[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "up_z=\"%.*f\"", gamgi->gamgi->length, layer->up[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************************************* * visibility_in,visibility_out (optional) * *******************************************/ if (layer->visibility_in != GAMGI_GTK_ALL) { if (layer->visibility_in == GAMGI_GTK_PARTIAL) sprintf (string, "visibility_in=\"partial\""); else if (layer->visibility_in == GAMGI_GTK_NONE) sprintf (string, "visibility_in=\"none\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (layer->visibility_out != GAMGI_GTK_ALL) { if (layer->visibility_out == GAMGI_GTK_PARTIAL) sprintf (string, "visibility_out=\"partial\""); else if (layer->visibility_out == GAMGI_GTK_NONE) sprintf (string, "visibility_out=\"none\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************************** * red,green,blue (optional, coupled) * **************************************/ if (fabs (layer->color[0] - GAMGI_MESA_LAYER_R) > GAMGI_MATH_TOLERANCE || fabs (layer->color[1] - GAMGI_MESA_LAYER_G) > GAMGI_MATH_TOLERANCE || fabs (layer->color[2] - GAMGI_MESA_LAYER_B) > GAMGI_MATH_TOLERANCE) { sprintf (string, "red=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, layer->color[0]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "green=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, layer->color[1]); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "blue=\"%.*f\"", GAMGI_MATH_DECIMAL_COLOR, layer->color[2]); gamgi_expat_export_attribute (fp, string, depth, column, error); } /******************** * scale (optional) * ********************/ if (fabs (layer->object.scale - GAMGI_MESA_SCALE) > GAMGI_MATH_TOLERANCE) { sprintf (string, "scale=\"%.*f\"", GAMGI_MATH_DECIMAL_SCALE, layer->object.scale); gamgi_expat_export_attribute (fp, string, depth, column, error); } } void gamgi_expat_export_object_window (gamgi_window *window, FILE *fp, int depth, int *column, int *id, gamgi_bool *error) { char string[GAMGI_ENGINE_STRING]; /******************* * name (optional) * *******************/ if (strcmp (window->object.name, "Window") != 0) { sprintf (string, "name=\"%s\"", window->object.name); gamgi_expat_export_attribute (fp, string, depth, column, error); } /***************** * id (optional) * *****************/ if (GAMGI_EXPAT_ID_WINDOW == TRUE) { sprintf (string, "id=\"%d\"", (*id)++); gamgi_expat_export_attribute (fp, string, depth, column, error); } /************************* * x,y origin (optional) * *************************/ gtk_window_get_position (GTK_WINDOW (window->window), &window->origin_x, &window->origin_y); if (window->origin_x != GAMGI_GTK_WINDOW_ORIGIN_X || window->origin_y != GAMGI_GTK_WINDOW_ORIGIN_Y) { sprintf (string, "x=\"%d\"", window->origin_x); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "y=\"%d\"", window->origin_y); gamgi_expat_export_attribute (fp, string, depth, column, error); } /********************************** * width,height size (optional) * * * * exported windows should not * * exceed 2 times the screen size * **********************************/ gtk_window_get_size (GTK_WINDOW (window->window), &window->width, &window->height); if (window->width > 2 * gamgi->width) window->width = 2 * gamgi->width; if (window->height > 2 * gamgi->height) window->height = 2 * gamgi->height; if (window->width != GAMGI_GTK_WINDOW_WIDTH || window->height != GAMGI_GTK_WINDOW_HEIGHT) { sprintf (string, "width=\"%d\"", window->width); gamgi_expat_export_attribute (fp, string, depth, column, error); sprintf (string, "height=\"%d\"", window->height); gamgi_expat_export_attribute (fp, string, depth, column, error); } /****************************************** * show top,medium,bottom,full (optional) * ******************************************/ if (window->top_flag != TRUE) { sprintf (string, "top=\"no\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (window->medium_flag != TRUE) { sprintf (string, "medium=\"no\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } if (window->bottom_flag != TRUE) { sprintf (string, "bottom=\"no\""); gamgi_expat_export_attribute (fp, string, depth, column, error); } } gamgi-0.17.5/src/expat/gamgi_expat_export_object.h000066400000000000000000000047621433127522700222040ustar00rootroot00000000000000/************************************************ * * $GAMGI/src/expat/gamgi_expat_export_object.h * * Copyright (C) 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ /********************** * external functions * **********************/ void gamgi_expat_export_object_text (gamgi_text *text, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_orbital (gamgi_orbital *orbital, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_bond (gamgi_bond *bond, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_atom (gamgi_atom *atom, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_direction (gamgi_direction *direction, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_plane (gamgi_plane *plane, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_group (gamgi_group *group, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_molecule (gamgi_molecule *molecule, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_cluster (gamgi_cluster *cluster, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_cell (gamgi_cell *cell, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_arrow (gamgi_arrow *arrow, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_shape (gamgi_shape *shape, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_graph (gamgi_graph *graph, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_assembly (gamgi_assembly *assembly, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_light (gamgi_light *light, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_layer (gamgi_layer *layer, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); void gamgi_expat_export_object_window (gamgi_window *window, FILE *fp, int depth, int *column, int *id, gamgi_bool *error); /************* * Rationale * ************* Under development. ************* * Rationale * *************/ gamgi-0.17.5/src/expat/gamgi_expat_import.c000066400000000000000000001605601433127522700206410ustar00rootroot00000000000000/****************************************** * * $GAMGI/src/expat/gamgi_expat_import.c * * Copyright (C) 2004 Carlos Pereira * * Distributed under the terms of the GNU * General Public License: $GAMGI/LICENSE * */ #include "gamgi_engine.h" #include "gamgi_gtk.h" #include "gamgi_mesa.h" #include "gamgi_expat.h" #include "gamgi_math.h" #include "gamgi_phys.h" #include "gamgi_io.h" #include "gamgi_global.h" #include "gamgi_engine_list.h" #include "gamgi_engine_find.h" #include "gamgi_engine_dlist.h" #include "gamgi_engine_link.h" #include "gamgi_engine_remove.h" #include "gamgi_gtk_dialog.h" #include "gamgi_gtk_object.h" #include "gamgi_gtk_history.h" #include "gamgi_gtk_window_create.h" #include "gamgi_mesa_lists.h" #include "gamgi_mesa_rotate_out.h" #include "gamgi_math_vector.h" #include "gamgi_math_matrix.h" #include "gamgi_math_euler.h" #include "gamgi_math_quaternion.h" #include "gamgi_math_hash.h" #include "gamgi_math_node.h" #include "gamgi_math_position.h" #include "gamgi_chem_bond.h" #include "gamgi_phys_direction.h" #include "gamgi_phys_projection.h" #include "gamgi_phys_reciprocal.h" #include "gamgi_io_token.h" #include "gamgi_io_file.h" #include "gamgi_expat_import.h" #include "gamgi_expat_import_object.h" #include "gamgi_expat_import_config.h" #include "gamgi_expat_import_help.h" #include "gamgi_io_error.h" #include "gamgi_global_remove.h" static void static_remove (gamgi_gml *gml, gamgi_bool valid) { gamgi_slist *slist; gamgi_dlist *dlist; gamgi_object *object; free (gml->id); free (gml->ref); free (gml->id_object); free (gml->ref_object); free (gml->ref_line); free (gml->ref_file); gamgi_math_hash_remove (gml->hash, GAMGI_EXPAT_HASH_SIZE); /***************************** * remove list of file names * *****************************/ slist = gml->files; while (slist != NULL) { free (slist->data); slist = gamgi_engine_slist_remove_start (slist); } /************************************************************* * For well behaved input files, gml->parent will be NULL at * * this stage. Otherwise, gml->parent stack must be removed. * *************************************************************/ slist = gml->ml.parent; while (slist != NULL) slist = gamgi_engine_slist_remove_start (slist); /************************************************* * 1) gml->object_start->data must be NULL, as * * the first dlist node is always for . * * Elsewhere, dlist->data is always non NULL. * * * * 2) gml->object_start will be NULL if an * * error occurs before or inside . * *************************************************/ dlist = gml->object_start; if (dlist != NULL) dlist = gamgi_engine_dlist_remove_start (dlist); /**************** * data cleanup * ****************/ while (dlist != NULL) { object = GAMGI_CAST_OBJECT dlist->data; if (valid == FALSE) gamgi_engine_remove_object (object); dlist = gamgi_engine_dlist_remove_start (dlist); } /****************** * config cleanup * ******************/ object = GAMGI_CAST_OBJECT gamgi->gamgi; if (object->object != NULL) { gamgi_global_remove_gamgi ((gamgi_gamgi_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->window; if (object->object != NULL) { gamgi_global_remove_window ((gamgi_window_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->layer; if (object->object != NULL) { gamgi_global_remove_layer ((gamgi_layer_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->light; if (object->object != NULL) { gamgi_global_remove_light ((gamgi_light_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->assembly; if (object->object != NULL) { gamgi_global_remove_assembly ((gamgi_assembly_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->graph; if (object->object != NULL) { gamgi_global_remove_graph ((gamgi_graph_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->shape; if (object->object != NULL) { gamgi_global_remove_shape ((gamgi_shape_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->arrow; if (object->object != NULL) { gamgi_global_remove_arrow ((gamgi_arrow_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->cell; if (object->object != NULL) { gamgi_global_remove_cell ((gamgi_cell_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->cluster; if (object->object != NULL) { gamgi_global_remove_cluster ((gamgi_cluster_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->molecule; if (object->object != NULL) { gamgi_global_remove_molecule ((gamgi_molecule_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->group; if (object->object != NULL) { gamgi_global_remove_group ((gamgi_group_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->plane; if (object->object != NULL) { gamgi_global_remove_plane ((gamgi_plane_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->direction; if (object->object != NULL) { gamgi_global_remove_direction ((gamgi_direction_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->atom; if (object->object != NULL) { gamgi_global_remove_atom ((gamgi_atom_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->bond; if (object->object != NULL) { gamgi_global_remove_bond ((gamgi_bond_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->orbital; if (object->object != NULL) { gamgi_global_remove_orbital ((gamgi_orbital_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->text; if (object->object != NULL) { gamgi_global_remove_text ((gamgi_text_class *) object->object); object->object = NULL; } object = GAMGI_CAST_OBJECT gamgi->help; if (object->object != NULL) { gamgi_global_remove_help ((gamgi_help_class *) object->object); object->object = NULL; } free (gml); } static void static_config (gamgi_gml *gml) { gamgi_object *object, *object_old; gamgi_atom_class *atom; object = GAMGI_CAST_OBJECT gamgi->gamgi; if (object->object != NULL) { object_old = object; gamgi->gamgi = (gamgi_gamgi_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->window; if (object->object != NULL) { object_old = object; gamgi->window = (gamgi_window_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->layer; if (object->object != NULL) { object_old = object; gamgi->layer = (gamgi_layer_class *) object->object; object->object = object_old; /****************************************** * The number of undo/save allowed levels * * might have changed: remove all levels * * in GAMGI that pass the new limit. * *****************************************/ gamgi_gtk_history_gamgi_reset (); } object = GAMGI_CAST_OBJECT gamgi->light; if (object->object != NULL) { object_old = object; gamgi->light = (gamgi_light_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->assembly; if (object->object != NULL) { object_old = object; gamgi->assembly = (gamgi_assembly_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->graph; if (object->object != NULL) { object_old = object; gamgi->graph = (gamgi_graph_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->shape; if (object->object != NULL) { object_old = object; gamgi->shape = (gamgi_shape_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->arrow; if (object->object != NULL) { object_old = object; gamgi->arrow = (gamgi_arrow_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->cell; if (object->object != NULL) { object_old = object; gamgi->cell = (gamgi_cell_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->cluster; if (object->object != NULL) { object_old = object; gamgi->cluster = (gamgi_cluster_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->molecule; if (object->object != NULL) { object_old = object; gamgi->molecule = (gamgi_molecule_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->group; if (object->object != NULL) { object_old = object; gamgi->group = (gamgi_group_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->plane; if (object->object != NULL) { object_old = object; gamgi->plane = (gamgi_plane_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->direction; if (object->object != NULL) { object_old = object; gamgi->direction = (gamgi_direction_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->atom; if (object->object != NULL) { atom = (gamgi_atom_class *) object->object; /****************************************** * recreate OpenGL pre-compiled shared * * lists with the new width/slices values * ******************************************/ if (atom->width != gamgi->atom->width) { gamgi_mesa_lists_cross (atom->width); gamgi_mesa_lists_line (atom->width); } if (atom->slices != gamgi->atom->slices) { gamgi_mesa_lists_sphere (atom->slices, atom->slices); gamgi_mesa_lists_cylinder_1 (atom->slices, 1); gamgi_mesa_lists_cylinder_3 (atom->slices, 1); gamgi_mesa_lists_cylinder_5 (atom->slices, 1); } object_old = object; gamgi->atom = (gamgi_atom_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->bond; if (object->object != NULL) { object_old = object; gamgi->bond = (gamgi_bond_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->orbital; if (object->object != NULL) { object_old = object; gamgi->orbital = (gamgi_orbital_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->text; if (object->object != NULL) { object_old = object; gamgi->text = (gamgi_text_class *) object->object; object->object = object_old; } object = GAMGI_CAST_OBJECT gamgi->help; if (object->object != NULL) { object_old = object; gamgi->help = (gamgi_help_class *) object->object; object->object = object_old; } } static void static_object (gamgi_gml *gml) { gamgi_window *window; gamgi_layer *layer; gamgi_cell *cell; gamgi_plane *plane; gamgi_direction *direction; gamgi_object *object; gamgi_dlist *dlist; /****************************** * first object is , so * * we start with the next one * ******************************/ for (dlist = gml->object_start->next; dlist != NULL; dlist = dlist->next) { object = GAMGI_CAST_OBJECT dlist->data; switch (object->class) { /************************************************************ * for each new window, window->layer and window->focus * * are updated immediately everytime a new layer is found * * because if an error is found the whole window is removed * ************************************************************/ case GAMGI_ENGINE_WINDOW: window = GAMGI_CAST_WINDOW object; gamgi_gtk_window_create (window, window->layer); break; /***************************************************** * for the current window, window->layer is set only * * here, after error checking, because if an error * * is found we must go back to the initial window * * * * window->focus is kept untouched, to check later * * if the current object is gamgi, the global object * *****************************************************/ case GAMGI_ENGINE_LAYER: layer = GAMGI_CAST_LAYER object; window = GAMGI_CAST_WINDOW object->object; gamgi_engine_link_layer_window (layer, window); if (window == gml->ml.window) window->layer = layer; break; case GAMGI_ENGINE_PLANE: gamgi_engine_link_object_object (object, object->object); plane = GAMGI_CAST_PLANE object; if (plane->reference == GAMGI_ENGINE_CELL) { /************************** * crystallographic plane * **************************/ cell = GAMGI_CAST_CELL object->object; if (cell->model == GAMGI_PHYS_PROJECTION) { gamgi_phys_projection_create (plane->model, &plane->points, &plane->n_points, &plane->loops, &plane->n_loops); gamgi_mesa_rotate_out_plane (plane, NULL, NULL, NULL); } if (plane->model == GAMGI_PHYS_VECTOR) gamgi_phys_reciprocal_points (plane); } break; case GAMGI_ENGINE_DIRECTION: gamgi_engine_link_object_object (object, object->object); direction = GAMGI_CAST_DIRECTION object; if (direction->reference == GAMGI_ENGINE_CELL) { /****************************** * crystallographic direction * ******************************/ cell = GAMGI_CAST_CELL object->object; if (cell->model == GAMGI_PHYS_PROJECTION) { gamgi_phys_projection_create (direction->model, &direction->points, &direction->n_points, &direction->loops, &direction->n_loops); gamgi_mesa_rotate_out_direction (direction, NULL, NULL, NULL); } } break; default: gamgi_engine_link_object_object (object, object->object); break; } } /************************************************************ * Update current window: when this point is reached, the * * top layer (that existed before or was created by the * * importing operation) is always equal to window->layer * * and window->focus retains the original value. When this * * value is gamgi->gamgi, the other windows statusbars must * * be updated again. Unless this happens, the other windows * * already show the right data when created. * ************************************************************/ window = gml->ml.window; gamgi_gtk_object_layer_local (window->layer, window); gamgi_gtk_object_focus_local (GAMGI_CAST_OBJECT window->layer, window); } static void static_doctype_gml (void *data, const char *doctype, const char *system_id, const char *public_id, int internal) { gamgi_ml *ml = GAMGI_CAST_ML data; int fileline; /****************************************** * used only in error messages: file line * * indicates where current header starts * ******************************************/ fileline = XML_GetCurrentLineNumber (ml->parser); if (strcmp (doctype, "gml") != 0) { ml->valid = gamgi_io_error_header (doctype, ml->filename, fileline, ml->window); } else if (system_id != NULL && strcmp (system_id, GAMGI_IO_GML_SYSTEM) != 0) { ml->valid = gamgi_io_error_header (system_id, ml->filename, fileline, ml->window); } else if (public_id != NULL && strcmp (public_id, GAMGI_IO_GML_PUBLIC) != 0) { ml->valid = gamgi_io_error_header (public_id, ml->filename, fileline, ml->window); } } static void static_doctype_html (void *data, const char *doctype, const char *system_id, const char *public_id, int internal) { gamgi_ml *ml = GAMGI_CAST_ML data; int fileline; /****************************************** * used only in error messages: file line * * indicates where current header starts * ******************************************/ fileline = XML_GetCurrentLineNumber (ml->parser); if (strcmp (doctype, "html") != 0) { ml->valid = gamgi_io_error_header (doctype, ml->filename, fileline, ml->window); } else if (system_id != NULL && strcmp (system_id, GAMGI_IO_HTML_SYSTEM) != 0) { ml->valid = gamgi_io_error_header (system_id, ml->filename, fileline, ml->window); } else if (public_id != NULL && strcmp (public_id, GAMGI_IO_HTML_PUBLIC) != 0) { ml->valid = gamgi_io_error_header (public_id, ml->filename, fileline, ml->window); } } static void static_cdata_ml (void *data, const char *cdata, int length) { gamgi_ml *ml = GAMGI_CAST_ML data; char line[GAMGI_ENGINE_LINE]; int fileline; /****************************************** * used only in error messages: file line * * indicates where current cdata starts * ******************************************/ fileline = XML_GetCurrentLineNumber (ml->parser); /*************************************************** * Adding 1 to length is needed because cdata * * is NOT NULL terminated, so its size is one * * char larger than reported by EXPAT callback. * * * * If the number of (ignored) char in element * * content cannot fit in a GAMGI line string, * * an error is immediately reported without * * even checking whether the char are good or not. * * This test is not as stringent as it looks, * * because EXPAT feeds GAMGI with a new cdata * * batch every time a new line char is found, this * * way resetting the char count and allowing an * * unlimited number of delimiter char in element * * content, as long as each line is not larger * * than GAMGI_ENGINE_LINE. * ***************************************************/ if (length + 1 > GAMGI_ENGINE_LINE) ml->valid = gamgi_io_error_cdata (ml->filename, fileline, ml->window); else { gamgi_io_token_cut (cdata, line, length + 1); /*********************************** * Only delimiter char (by default * * defined by GAMGI_IO_DELIMITERS) * * are allowed in element content. * ***********************************/ if (gamgi_io_token_check (line) == TRUE) ml->valid = gamgi_io_error_cdata (ml->filename, fileline, ml->window); } } static void static_cdata_gml (void *data, const char *cdata, int length) { gamgi_gml *gml = GAMGI_CAST_GML data; char *token, *string; double dvalue; float fvalue; int ivalue; int n, fileline; /****************************************** * used only in error messages: file line * * indicates where current cdata starts * ******************************************/ fileline = XML_GetCurrentLineNumber (gml->ml.parser); /******************************************************* * For most elements, only delimiter char (defined by * * GAMGI_IO_DELIMITERS) are allowed as character data. * *******************************************************/ if (gml->type == FALSE) { static_cdata_ml (data, cdata, length); return; } /******************************************************************* * Character data in Expat is handled like this: * * 1) when cdata continues, cdata[length] == '\0' * * 2) when cdata ends and a element starts, cdata[length] == '<' * * 3) when cdata ends and a new line starts cdata[length] == '\n' * * in cases 2 and 3, a new callback is issued, reporting only a * * end of line. In Linux, length = 1, and cdata[length - 1] = '\n' * * * * The whole strategy is: concatenate line until a end * * of line is found, then parse the line and restart again * * * * To catch ends of line, looking for Char 10 (Linux), Char 13 * * (Mac OS X) or Char 10 + Char 13 (Windows) should be enough * * * * Make sure there is space to end line with a '\0' character * *******************************************************************/ if (gml->used + length + 1 > GAMGI_ENGINE_LINE) { gml->ml.valid = gamgi_io_error_cdata (gml->ml.filename, fileline, gml->ml.window); return; } strncpy (gml->line + gml->used, cdata, length); gml->used += length; if (cdata[length - 1] != 10 && cdata[length - 1] != 13) return; /********************************************* * parse line looking for tokens that can be * * converted into doubles, floats or ints * *********************************************/ gml->line[gml->used] = '\0'; for (string = gml->line; (token = strtok (string, GAMGI_IO_DELIMITERS)) != NULL; string = NULL) { if (gml->count == gml->size) { gml->ml.valid = gamgi_io_error_incompatible (gml->ml.filename, fileline, gml->ml.window); return; } n = 0; if (gml->type == GAMGI_EXPAT_DOUBLE) n = sscanf (token, "%lf", &dvalue); if (gml->type == GAMGI_EXPAT_FLOAT) n = sscanf (token, "%f", &fvalue); if (gml->type == GAMGI_EXPAT_INT) n = sscanf (token, "%d", &ivalue); if (n != 1) { gml->ml.valid = gamgi_io_error_cdata (gml->ml.filename, fileline, gml->ml.window); return; } if (gml->type == GAMGI_EXPAT_DOUBLE) ((double *) gml->array)[gml->count] = dvalue; if (gml->type == GAMGI_EXPAT_FLOAT) ((float *) gml->array)[gml->count] = fvalue; if (gml->type == GAMGI_EXPAT_INT) ((int *) gml->array)[gml->count] = ivalue; gml->count += 1; } gml->used = 0; } static void static_cdata_html (void *data, const char *cdata, int length) { gamgi_html *html = GAMGI_CAST_HTML data; gamgi_enum parent; int i, fileline; char character; /****************************************** * used only in error messages: file line * * indicates where current cdata starts * ******************************************/ fileline = XML_GetCurrentLineNumber (html->ml.parser); /******************************************************* * For most elements, only delimiter char (defined by * * GAMGI_IO_DELIMITERS) are allowed as character data. * *******************************************************/ parent = GAMGI_POINTER_TO_INT (html->ml.parent->data); if (parent == GAMGI_EXPAT_HTML || parent == GAMGI_EXPAT_HEAD || parent == GAMGI_EXPAT_LINK || parent == GAMGI_EXPAT_UL || parent == GAMGI_EXPAT_OL || parent == GAMGI_EXPAT_BR) { static_cdata_ml (data, cdata, length); return; } /***************************************************** * insert data, line by line instead of char by char * *****************************************************/ for (i = 0; i < length; i++) { character = cdata[i]; /********************************************** * make sure that every character belongs to * * ISO-8859-1 standard (basically ASCII with * * accents), even if cdata comes from outside * * a contents block and thus will be ignored. * **********************************************/ if (strchr (GAMGI_IO_FONT_88591, character) == NULL) { html->ml.valid = gamgi_io_error_cdata (html->ml.filename, fileline, html->ml.window); return; } /*********************************************************** * if character is outside a