Edit I've included another method for creating the crystal structure which should be useful for pedagogical purposes, but assumes that MoS2 behaves ideally.
Short Answer
It can't be done with ChemicalData
alone, (as of 2014) since there is important information missing. We are not given any information about the crystal structure, and therefore need to find additional sources.
Roll your own
We can try to make our own crystal structure if we have the relevant information. Here's one way to do it, starting first with a simpler structure, that of sodium chloride, which crystallizes in a face centered cubic lattice. We can use LatticeData
to visualize this structure:
LatticeData["FaceCenteredCubic", "Image"]
We need to look elsewhere for the unit cell dimensions (the cell dimension is 429 pm) but we can get ionic radii from WolframAlpha
naradius =
QuantityMagnitude@WolframAlpha["sodium ion radius", "WolframResult"]
clradius =
QuantityMagnitude@
WolframAlpha["chloride ion radius", "WolframResult"]
celldim = 429;
Now, playing with the lattice above, we can style it for the anions:
chloride =
LatticeData["FaceCenteredCubic", "Image"] /. {Line[_] -> Null,
Polygon[_] -> Null, GrayLevel[0] -> Blue,
Sphere[x_List, y_] :> Sphere[x, clradius/celldim]}
We do the same thing for the sodium ions and note that these ions are shifted by one half the dimensions of the unit cell. Putting all of this together gets us:
sodium = LatticeData["FaceCenteredCubic",
"Image"] /. {Line[_] -> Null, Polygon[_] -> Null,
GrayLevel[0] -> Green,
Sphere[x_List, y_] :> Sphere[x, naradius/celldim]}
unitcell =
Show[{chloride,
Graphics3D[
GeometricTransformation[sodium[[1]],
TranslationTransform[{0.5, 0.5, 0.5}]]]},
PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}}, Boxed -> True]
I really like this view, since it clearly shows us that the unit cell contains 4 full ions of sodium, and the 4 chloride ions are counted by noting that each corner is 1/8 an ion and each face is 1/2 an ion. Making a table of transformations gets us a nice looking crystal (that is admittedly inefficient and needs a little bit of cleanup around the edges).
Graphics3D[
GeometricTransformation[
unitcell[[1]],
Flatten@Table[
TranslationTransform[{i 1, j 1, k 1}], {i, 0, 3}, {j, 0, 3}, {k,
0, 3}]]]
Back to MoS2
Molybdenum disulfide is a challenge since it has a hexagonal packing structure with an a-typical coordination. I think it's best to draw our own unit cell for these purposes. I note from this paper that the metal is encapsulated in a trigonal prismatic cage of sulfur atoms, and the sulfur atoms form an eclipsed hexagonal structure. The unit cell for this form is a rhombus and we can use known relationships to get our unit cell. The dimensions from the paper are a = 3.12 angstroms and the layer spacing is 3.11 angstroms.
a = 3.12;
c = 3.11;
p = -2 a Cos[120 Degree];
q = 2 a Sin[120 Degree];
sulfur = Graphics3D[{Yellow, Specularity[GrayLevel[1], 5],
Sphere[#, 0.5] & /@ {{0, p/2, c/2}, {0, -p/2, c/2}, {q/2, 0,
c/2}, {-q/2, 0, c/2}, {0, p/2, -c/2}, {0, -p/2, -c/2}, {q/2,
0, -c/2}, {-q/2, 0, -c/2}}}, Boxed -> False]
Let's have Mathematica figure out where the Molybdenum is supposed to be, given that we know it is coordinated to 6 of the sulfur atoms. We'll add some bonds while were at it.
coordsulfur = {{0, p/2, c/2}, {0, -p/2, c/2}, {-q/2, 0, c/2}, {0,
p/2, -c/2}, {0, -p/2, -c/2}, {-q/2, 0, -c/2}};
momin = NMinimize[
Total[EuclideanDistance[#, {x, y, z}] & /@ coordsulfur], {x, y, z}]
mopos = {x, y, z} /. momin[[2]]
unitcell =
Graphics3D[
Flatten[{sulfur[[1]], {Blue, Sphere[mopos, 0.4]}, {GrayLevel[0.5],
bonds}}], Boxed -> False]
bonds = Tube[{#, mopos}, 0.2] & /@ coordsulfur;
sbonds = Tube[#, 0.2] & /@ {
{{0, -p/2, c/2}, {-q/2, 0, c/2}},
{{-q/2, 0, c/2}, {0, p/2, c/2}},
{{0, p/2, c/2}, {q/2, 0, c/2}},
{{q/2, 0, c/2}, {0, -p/2, c/2}},
{{0, -p/2, -c/2}, {-q/2, 0, -c/2}},
{{-q/2, 0, -c/2}, {0, p/2, -c/2}},
{{0, p/2, -c/2}, {q/2, 0, -c/2}},
{{q/2, 0, -c/2}, {0, -p/2, -c/2}},
{{q/2, 0, -c/2}, {q/2, 0, c/2}},
{{-q/2, 0, -c/2}, {-q/2, 0, c/2}},
{{0, p/2, -c/2}, {0, p/2, c/2}},
{{0, -p/2, -c/2}, {0, -p/2, c/2}},
{{0, -p/2, c/2}, {0, p/2, c/2}},
{{0, -p/2, -c/2}, {0, p/2, -c/2}}
};
One can perform a GeometricTransformation
on this unit cell to get the expanded crystal structure; however this is the part that I don't like, so I'll sleep on it before adding to this already-too-long answer.
Update, another crystal structure fabrication process
I've thought a bit about the MoS2 crystal structure, and here's how I came about some pictures. Start with the hcp lattice from curated data. Grab the spheres and (manually) select the 8 that represent the unit cell. We also need to adjust the z height (to 1 instead of 2) and add the Mo atom in the appropriate place.
hcp = LatticeData["HexagonalClosePacking", "Image"];
spheres = Cases[hcp[[1]], Sphere[x_, y_] :> x, Infinity];
unitcellspheres = spheres[[ {1, 2, 4, 5, 11, 12, 14, 15}]];
unitcellspheres[[All, 3]] =
unitcellspheres[[All, 3]] /. {1 -> 0.5, -1 -> -0.5};
csphere = {-1/2, 1/(2 Sqrt[3]), 0};
Now, I find it easiest to use a GraphicsComplex
to make the first figure.
unitcell = GraphicsComplex[Join[unitcellspheres, {csphere}],
{
(* 'global' directives *)
Specularity[GrayLevel[1], 9],
(* sulfur atoms*)
{Yellow, Table[Sphere[i, 0.1], {i, 1, 8}]},
(* sulfur 'bonds' *)
{Yellow,
Tube[#, 0.03] & /@ {{1, 3}, {3, 4}, {4, 2}, {2, 1}, {3, 2}, {5,
7}, {7, 8}, {8, 6}, {6, 5}, {7, 6}, {1, 5}, {2, 6}, {3,
7}, {4, 8}}},
(* Mo *)
{Blue, Sphere[9, 0.1]},
(* Mo bonds Mo side*)
{Blue,
GeometricTransformation[ Tube[{#, 9}, 0.03],
ScalingTransform[0.5, unitcellspheres[[#]] - csphere,
csphere]] & /@ {1, 2, 3, 5, 6, 7}},
(* Mo bonds S side *)
{Yellow,
GeometricTransformation[ Tube[{#, 9}, 0.03],
ScalingTransform[0.5, unitcellspheres[[#]] - csphere,
unitcellspheres[[#]]]] & /@ {1, 2, 3, 5, 6, 7}}
}] // Graphics3D
The remaining figures can be made using GeometricTransformation
of the unit cell, and I wrap that into a Manipulate
to have some fun. I've created another unitcell (unitcell2
) that doesn't have the sulfur-sulfur bonds shown in the previous figure.
unitcell2 = GraphicsComplex[Join[unitcellspheres, {csphere}],
{
(* 'global' directives *)
Specularity[GrayLevel[1], 9],
(* sulfur atoms*)
{Yellow, Table[Sphere[i, 0.1], {i, 1, 8}]},
(* Mo *)
{Blue, Sphere[9, 0.1]},
(* Mo bonds *)
{GrayLevel[0.5], Tube[{#, 9}, 0.05] & /@ {1, 2, 3, 5, 6, 7}}
}] // Graphics3D;
Manipulate[Graphics3D[GeometricTransformation[unitcell2[[1]],
Flatten@{
TranslationTransform[{0, 0, 0}],
Table[
TranslationTransform[{j 0.5 + i, j Sqrt[3]/2 + Mod[k, 2],
2 k }], {i, 0, imax}, {j, 0, jmax}, {k, 0, kmax}]
}], SphericalRegion -> True, Boxed -> False], {imax, 0, 5,
1}, {jmax, 0, 5, 1}, {kmax, 0, 3, 1}]