1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
|
We introduce a way to calculate a sufficient part of an orbit and the
stabilizer of a point.
<Section><Heading>Orbit Stabilizer for Crystallographic Groups</Heading>
<ManSection>
<Meth Name="OrbitStabilizerInUnitCubeOnRight"
Arg="group, x"/>
<Returns>
A record containing
<List>
<Item>
<K>.stabilizer</K>: the stabilizer of <Arg>x</Arg>.
</Item>
<Item>
<K>.orbit</K> set of vectors from <M>[0,1)^n</M> which
represents the orbit.
</Item>
</List>
</Returns>
<Description>
Let <Arg>x</Arg> be a rational vector from <M>[0,1)^n</M> and
<Arg>group</Arg> a space group in standard form.
The function then calculates the part of the orbit which lies inside the
cube <M>[0,1)^n</M> and the stabilizer of <Arg>x</Arg>. Observe that every
element of the full orbit differs from a point in the returned orbit only
by a pure translation.
</Description>
</ManSection>
Note that the restriction to points from <M>[0,1)^n</M> makes sense if orbits
should be compared and the vector passed to
<C>OrbitStabilizerInUnitCubeOnRight</C> should be an element of the returned
orbit (part).
<Example>
<![CDATA[
gap> S:=SpaceGroup(3,5);;
gap> OrbitStabilizerInUnitCubeOnRight(S,[1/2,0,9/11]);
rec( orbit := [ [ 0, 1/2, 2/11 ], [ 1/2, 0, 9/11 ] ],
stabilizer := Group([ [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ],
[ 0, 0, 0, 1 ] ] ]) )
gap> OrbitStabilizerInUnitCubeOnRight(S,[0,0,0]);
rec( orbit := [ [ 0, 0, 0 ] ], stabilizer := <matrix group with 2 generators> )
]]>
</Example>
If you are interested in other parts of the orbit, you can use <Ref
Meth="VectorModOne"/> for the base point and the functions <Ref
Meth="ShiftedOrbitPart"/>, <Ref Meth="TranslationsToOneCubeAroundCenter"/> and
<Ref Meth="TranslationsToBox"/> for the resulting orbit<Br/>
Suppose we want to calculate the part of the orbit of <C>[4/3,5/3,7/3]</C> in
the cube of sidelength <C>1</C> around this point:
<Example>
gap> S:=SpaceGroup(3,5);;
gap> p:=[4/3,5/3,7/3];;
gap> o:=OrbitStabilizerInUnitCubeOnRight(S,VectorModOne(p)).orbit;
[ [ 1/3, 2/3, 1/3 ], [ 1/3, 2/3, 2/3 ] ]
gap> box:=p+[[-1,1],[-1,1],[-1,1]];
[ [ 1/3, 8/3, 7/3 ], [ 1/3, 8/3, 7/3 ], [ 1/3, 8/3, 7/3 ] ]
gap> o2:=Concatenation(List(o,i->i+TranslationsToBox(i,box)));;
gap> # This is what we looked for. But it is somewhat large:
gap> Size(o2);
54
</Example>
<ManSection>
<Meth Name="OrbitStabilizerInUnitCubeOnRightOnSets"
Arg="group, set"/>
<Returns>
A record containing
<List>
<Item>
<K>.stabilizer</K>: the stabilizer of <Arg>set</Arg>.
</Item>
<Item>
<K>.orbit</K> set of sets of vectors from <M>[0,1)^n</M> which
represents the orbit.
</Item>
</List>
</Returns>
<Description>
Calculates orbit and stabilizer of a set of vectors. Just as <Ref
Meth="OrbitStabilizerInUnitCubeOnRight"></Ref>, it needs input from
<M>[0,1)^n</M>.
The returned orbit part <K>.orbit</K> is a set of sets such that every
element of <K>.orbit</K> has a non-trivial intersection with the
cube <M>[0,1)^n</M>. In general, these sets will not lie inside
<M>[0,1)^n</M> completely.
</Description>
</ManSection>
<Example>
gap> S:=SpaceGroup(3,5);;
gap> OrbitStabilizerInUnitCubeOnRightOnSets(S,[[0,0,0],[0,1/2,0]]);
rec( orbit := [ [ [ -1/2, 0, 0 ], [ 0, 0, 0 ] ],
[ [ 0, 0, 0 ], [ 0, 1/2, 0 ] ],
[ [ 1/2, 0, 0 ], [ 1, 0, 0 ] ] ],
stabilizer := Group([ [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ],
[ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ] ]) )
</Example>
<ManSection>
<Meth Name="OrbitPartInVertexSetsStandardSpaceGroup"
Arg="group vertexset allvertices"/>
<Returns>
Set of subsets of <A>allvertices</A>.
</Returns>
<Description>
If <A>allvertices</A> is a set of vectors and <A>vertexset</A> is
a subset thereof, then <Ref
Meth="OrbitPartInVertexSetsStandardSpaceGroup"></Ref> returns
that part of the orbit of <A>vertexset</A> which consists entirely of
subsets of <A>allvertices</A>.
Note that,unlike the other <C>OrbitStabilizer</C> algorithms, this does not
require the input to lie in some particular part of the space.
</Description>
</ManSection>
<Example>
gap> S:=SpaceGroup(3,5);;
gap> OrbitPartInVertexSetsStandardSpaceGroup(S,[[0,1,5],[1,2,0]],
> Set([[1,2,0],[2,3,1],[1,2,6],[1,1,0],[0,1,5],[3/5,7,12],[1/17,6,1/2]]));
[ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ], [ [ 1, 2, 6 ], [ 2, 3, 1 ] ] ]
gap> OrbitPartInVertexSetsStandardSpaceGroup(S, [[1,2,0]],
> Set([[1,2,0],[2,3,1],[1,2,6],[1,1,0],[0,1,5],[3/5,7,12],[1/17,6,1/2]]));
[ [ [ 0, 1, 5 ] ], [ [ 1, 1, 0 ] ], [ [ 1, 2, 0 ] ], [ [ 1, 2, 6 ] ], [ [ 2, 3, 1 ] ] ]
</Example>
<ManSection>
<Meth Name="OrbitPartInFacesStandardSpaceGroup"
Arg="group vertexset faceset"/>
<Returns>
Set of subsets of <A>faceset</A>.
</Returns>
<Description>
This calculates the orbit of a space group on sets restricted to a set of
faces.<Br/>
If <A>faceset</A> is a set of sets of vectors and <A>vertexset</A> is
an element of <A>faceset</A>, then <Ref
Meth="OrbitPartInFacesStandardSpaceGroup"></Ref> returns
that part of the orbit of <A>vertexset</A> which consists entirely of
elements of <A>faceset</A>.<Br/>
Note that,unlike the other <C>OrbitStabilizer</C> algorithms, this does not
require the input to lie in some particular part of the space.
</Description>
</ManSection>
<ManSection>
<Meth Name="OrbitPartAndRepresentativesInFacesStandardSpaceGroup"
Arg="group vertexset faceset"/>
<Returns>
A set of face-matrix pairs .
</Returns>
<Description>
This is a slight variation of
<Ref Meth="OrbitPartInFacesStandardSpaceGroup"></Ref>
that also returns a representative for every orbit element.
</Description>
</ManSection>
<Example>
gap> S:=SpaceGroup(3,5);;
gap> OrbitPartInVertexSetsStandardSpaceGroup(S,[[0,1,5],[1,2,0]],
> Set([[1,2,0],[2,3,1],[1,2,6],[1,1,0],[0,1,5],[3/5,7,12],[1/17,6,1/2]]));
[ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ], [ [ 1, 2, 6 ], [ 2, 3, 1 ] ] ]
gap> OrbitPartInFacesStandardSpaceGroup(S,[[0,1,5],[1,2,0]],
> Set( [ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ], [[1/17,6,1/2],[1,2,7]]]));
[ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ] ]
gap> OrbitPartAndRepresentativesInFacesStandardSpaceGroup(S,[[0,1,5],[1,2,0]],
> Set( [ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ], [[1/17,6,1/2],[1,2,7]]]));
[ [ [ [ 0, 1, 5 ], [ 1, 2, 0 ] ],
[ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ] ] ]
</Example>
<ManSection>
<Meth Name="StabilizerOnSetsStandardSpaceGroup"
Arg="group set"/>
<Returns>finite group of affine matrices (OnRight)</Returns>
<Description>
Given a set <A>set</A> of vectors and a space group <A>group</A> in
standard form, this method calculates the stabilizer of that set in
the full crystallographic group.<Br/>
</Description>
</ManSection>
<Example>
<![CDATA[
gap> G:=SpaceGroup(3,12);;
gap> v:=[ 0, 0,0 ];;
gap> s:=StabilizerOnSetsStandardSpaceGroup(G,[v]);
<matrix group with 2 generators>
gap> s2:=OrbitStabilizerInUnitCubeOnRight(G,v).stabilizer;
<matrix group with 2 generators>
gap> s2=s;
true
]]>
</Example>
<ManSection>
<Meth Name="RepresentativeActionOnRightOnSets"
Arg="group set imageset"/>
<Returns>
Affine matrix.
</Returns>
<Description>
Returns an element of the space group
<M>S</M> which takes the set <A>set</A> to the set
<A>imageset</A>. The group must be in standard form and act on the right.
</Description>
</ManSection>
<Example>
gap> S:=SpaceGroup(3,5);;
gap> RepresentativeActionOnRightOnSets(G, [[0,0,0],[0,1/2,0]],
> [ [ 0, 1/2, 0 ], [ 0, 1, 0 ] ]);
[ [ 0, -1, 0, 0 ], [ -1, 0, 0, 0 ], [ 0, 0, -1, 0 ], [ 0, 1, 0, 1 ] ]
</Example>
<Subsection><Heading>Getting other orbit parts</Heading>
<Package>HAPcryst</Package> does not calculate the full orbit but only the part
of it having coefficients between <M>-1/2</M> and <M>1/2</M>. The other parts
of the orbit can be calculated using the following functions.
</Subsection>
<ManSection>
<Meth Name="ShiftedOrbitPart" Arg="point, orbitpart"/>
<Returns>Set of vectors </Returns>
<Description>
Takes each vector in <A>orbitpart</A> to the cube unit cube centered in
<A>point</A>.
</Description>
</ManSection>
<Example>
gap> ShiftedOrbitPart([0,0,0],[[1/2,1/2,1/3],-[1/2,1/2,1/2],[19,3,1]]);
[ [ 1/2, 1/2, 1/3 ], [ 1/2, 1/2, 1/2 ], [ 0, 0, 0 ] ]
gap> ShiftedOrbitPart([1,1,1],[[1/2,1/2,1/2],-[1/2,1/2,1/2]]);
[ [ 3/2, 3/2, 3/2 ] ]
</Example>
<ManSection>
<Meth Name="TranslationsToOneCubeAroundCenter" Arg="point, center"/>
<Returns>List of integer vectors</Returns>
<Description>
This method returns the list of all integer vectors which translate
<A>point</A> into the box <A>center</A><M>+[-1/2,1/2]^n</M>
</Description>
</ManSection>
<Example>
gap> TranslationsToOneCubeAroundCenter([1/2,1/2,1/3],[0,0,0]);
[ [ 0, 0, 0 ], [ 0, -1, 0 ], [ -1, 0, 0 ], [ -1, -1, 0 ] ]
gap> TranslationsToOneCubeAroundCenter([1,0,1],[0,0,0]);
[ [ -1, 0, -1 ] ]
</Example>
<ManSection>
<Meth Name="TranslationsToBox" Arg="point, box"/>
<!-- <Returns>List of integer vectors or the empty list</Returns>-->
<Returns>An iterator of integer vectors or the empty iterator</Returns>
<Description>
Given a vector <M>v</M> and a list of pairs, this function returns the
translation vectors (integer vectors) which take <M>v</M> into the box
<A>box</A>. The box <A>box</A> has to be given as a list of pairs.
</Description>
</ManSection>
<Example>
gap> TranslationsToBox([0,0],[[1/2,2/3],[1/2,2/3]]);
[ ]
gap> TranslationsToBox([0,0],[[-3/2,1/2],[1,4/3]]);
[ [ -1, 1 ], [ 0, 1 ] ]
gap> TranslationsToBox([0,0],[[-3/2,1/2],[2,1]]);
Error, Box must not be empty called from
...
</Example>
</Section>
|