I am interested in constructing graphs of icosahedral fullerenes, following the construction explained in the first few pages of this article (alternate link). Mathematica has built-in information about the 60-site graph, $C_{60}$, in GraphData["TruncatedIcosahedralGraph"]
and ChemicalData["Fullerene60"]
and information about the 20-site dodecahedron, but there's a whole zoo of icosahedral fullerenes.
First, I construct an underlying hexagonal grid of ions:
Li = 10;
Lj = 10;
offset = {-3 - 1/2, Sqrt[3]/2};
a1 = {3/2, +Sqrt[3]/2};
a2 = {3/2, -Sqrt[3]/2};
ions = Flatten[Outer[offset + #1 a1 + #2 a2 + #3 (a1 + a2)/3 &,
Range[-Li, Li], Range[-Lj, Lj], {0, 1}
(* A/B shift comes last to ensure even/odd sites alternate *)], 2];
with a face centered on the origin. Then I compute the locations of the pentagonal defects:
Gi = 1;
Gj = 2;
b1 = {3/2, Sqrt[3]/2};
b2 = {0, Sqrt[3]};
upRight = {+1, +1} Gj b2 + {+1, -1}*Gi b1;
downRight = {+1, -1} Gi b2 + {+1, +1}*Gj b1 - upRight;
horizontal = upRight + downRight;
pentagonCenters = Flatten[{# horizontal, # horizontal + upRight, # horizontal +
2 upRight, # horizontal + downRight} & /@ Range[0, 4], 1] ~Join~
{5 horizontal, 5 horizontal + upRight};
So that you can visually see what I've got,
Show[ListPlot[{ions, pentagonCenters}, AspectRatio -> 1,
PlotRange -> {{0, 20}, {-10, 10}},
PlotMarkers -> ({#, Large} & /@ {\[FilledSmallCircle], ★})],
Graphics[Line /@ (pentagonCenters[[#]] & /@ {
{1, 3}, {4, 7}, {8, 11}, {12, 15}, {16, 19}, {20, 22}, {1, 4}, {2, 8}, {3, 12},
{7, 16}, {11, 20}, {15, 21}, {19, 22}, {1, 21}, {2, 22}})]
]
which, for Gi = 1; Gj = 2
yields the $C_{60}$ graph where the blue circles are locations of the ions and the stars will be the centers of the pentagonal defects. The triangles with stars as their vertices are the faces of the icosahedron.
Running again with Gi=1;Gj=3
yields a 170-ion graph
My questions are all aimed at constructing the adjacency matrix for these icosahedral fullerenes.
How can I easily "cut out" the ions that aren't inside the black triangles. Also: the
sites
I generate are definitely too many...[EDIT]: This can be accomplished with by construction a region:
region = Region[Polygon[pentagonCenters[[ {1, 2, 3, 6, 7, 10, 11, 14, 15, 18, 19, 22, 21, 20, 17, 16, 13, 12, 9, 8, 5, 4}]]]];
and then using
RegionMember
. I still have to pickLi
andLj
large enough to cover the area of interest. [Updated question]: how can I just generate the "needed" hexagonal grid to begin with, or just the needed ones plus a little extra, that can then be discarded viaRegionMember
?How can I "stitch up" the sides of the black triangles? On a hexagonal grid I can detect if two ions are nearest neighbors by seeing if the
Norm
of the difference of their locations differ by 1. How should I make these identifications in an easy, programmatic way that Mathematica will understand?- Bonus: In an ideal world, I'd know the geometrical locations of all of these ions when the graph is thought of as a polyhedron. Is there something relatively automatic I can do to get at this information? [EDIT: once I have a
Graph
object I can cast to aGraph3D
and useAbsoluteOptions[ graph3D, VertexCoordinates]
to get the locations.]
Note that sometimes ions land exactly on the sides of the black triangles (as in the Gi=1;Gj=2
case).
Buckygen
in Mathematica! But as that's obviously a huge task whose benefits I wouldn't reap for a very long time, I would gladly settle for just the icosahedral ones (those where the pentagons are evenly distributed). $\endgroup$