I am glad to see that the new release of GAP has tables of crystallographic
groups and associated structures. Thanks to the developers for a great piece
of work. The manual also mentions that further functions may be added at a
later time. Here are a couple of items that would be nice to have :
(1) A function that for a given space group gives an IT type table
for the fixed points, symmetry operation types, ... .(2) A list of centering matrices.
The second item might already exist in this release, but I couldn't find it.
The first is outlined in the book "Crystallographic Groups in Four Dimensional
Space". I actually tried to follow this outline but stumbled at the last, and
probably trickiest, step. I can get the equations for the fixed points and
determine the ones in the unit cell; but collecting this data into IT type
format seems a bit more involved.
In case anyone's interested here's the code I tried along with the example
described in the above book :
################################################################################ FixedPoints:=function(sgrp) local data,type,dim,pgrp,elms,mats,invs,nmats,m,v,umats,points,u,w;
data:=rec();
type:=sgrp.crSpaceGroupType;
dim:=type[1];# presentation and elements of the (finite) point group
pgrp:=FpGroupQClass(type[1],type[2],type[3]);
elms:=Elements(pgrp);# representatives of space group operations
m:=Length(sgrp.generators);
elms:=List(elms,x->MappedWord(x,pgrp.generators,sgrp.generators{[1..m-dim]}));# non-translation part of space group operations
mats:=List(elms,mat->mat{[1..dim]}{[1..dim]});# invariants of the operations : order,trace, determinant, ... # these can be used to get the Hermann symbol,IT symbol, ... of the operation invs:=List(mats, s->[OrderMat(s), TraceMat(s), DeterminantMat(s), Sum(Combinations([1..dim],2), x->s[x[1]][x[1]]*s[x[2]][x[2]]-s[x[1]][x[2]]*s[x[2]][x[1]])]); data.invariants:=invs; # normalize translation part to be in unit cell 0 <= ti < 1 nmats:=Copy(elms); for m in nmats do for v in m{[1..dim]} do w:=v[dim+1]-Int(v[dim+1]); if w<0 then w:=w+1; fi; if IsInt(w) then w:=0; fi; v[dim+1]:=w; od; od;# solve m*x + u = x for x; this is done by using 2*dim + 1 variables
# {x1,...,xdim,t,u1,...,udim}; the result "umats" is a dim x dim+1 matrix
# with the i-th row expressing xi as a linear combinations of t,u1,...,udim.
umats:=[];
for m in nmats do
v:=TransposedMat(Concatenation(TransposedMat(m-m^0),TransposedMat(m^0)));
TriangulizeMat(v);
Add(umats,-v{[1..dim]}{[dim+1..2*dim+1]});
od;
data.equations:=umats;# generate fixed points in unit cell.
# This uses the above equations and by trial an error on a set of ui's
# in the range -2 <= ui <= 2 finds which points are in the unit cell.
# this approach is probably not the best, but it does seem to work for
# the examples I tried.
points:=[];
for m in umats do
w:=[];
for u in Tuples([-2..2],dim) do
v:=m*Concatenation([1],u);
if ForAll(v,x-> 0<=x and x<1) then AddSet(w,v);fi;
od;
Add(points,w);
od;
data.points:=points;return data;
end; ################################################################################ ################################################################################ gap> example4:=FixedPoints( SpaceGroup(4,32,1,2,2) );; # the "invariants" here correspond to the order of the matrix,its trace, # its determinant,and one more invariant needed for n>3 gap> PrintArray( example4.invariants ); [ [ 1, 4, 1, 6 ], # identity 1111 [ 4, 0, 1, 2 ], # 44 [ 4, 0, 1, 2 ], # 44 [ 2, -4, 1, 6 ], # inversion 2222 [ 4, 0, 1, 2 ], # 44 [ 4, 0, 1, 2 ], # 44 [ 4, 0, 1, 2 ], # 44 [ 4, 0, 1, 2 ] ] # 44 # this corresponds to the equations for the fixed points of (S2,s2) in the book gap> PrintArray( example4.equations[3] ); [ [ -1/2, 0, -1/2, -1/2, 1 ], # x = -1/2 - u2/2 - u3/2 + u4 [ 1/2, 0, 1/2, 1/2, 0 ], # y = 1/2 + u2/2 + u3/2 [ 0, 0, -1/2, 1/2, 0 ], # z = -u2/2 + u3/2 [ -1/2, -1/2, -1/2, 0, 1 ] ] # w = -1/2 - u1/2 - u2/2 + u4 # this corresponds to the fixed points in the unit cell of (S2,s2) in the book gap> PrintArray( example4.points[3] ); [ [ 0, 0, 1/2, 0 ], [ 0, 0, 1/2, 1/2 ], [ 1/2, 1/2, 0, 0 ], [ 1/2, 1/2, 0, 1/2 ] ] # the equations for the centers of inversion -- (S3,s3) in the book gap> PrintArray( example4.equations[4] ); [ [ 0, 1/2, 0, 0, 0 ], [ 0, 0, 1/2, 0, 0 ], [ 0, 0, 0, 1/2, 0 ], [ 0, 0, 0, 0, 1/2 ] ] # the fixed points in the unit cell for the point inversion (S3,s3) # 12 of these 16 are fixed by other ("larger") operations gap> PrintArray( example4.points[4] ); [ [ 0, 0, 0, 0 ], [ 0, 0, 0, 1/2 ], [ 0, 0, 1/2, 0 ], [ 0, 0, 1/2, 1/2 ], [ 0, 1/2, 0, 0 ], [ 0, 1/2, 0, 1/2 ], [ 0, 1/2, 1/2, 0 ], [ 0, 1/2, 1/2, 1/2 ], [ 1/2, 0, 0, 0 ], [ 1/2, 0, 0, 1/2 ], [ 1/2, 0, 1/2, 0 ], [ 1/2, 0, 1/2, 1/2 ], [ 1/2, 1/2, 0, 0 ], [ 1/2, 1/2, 0, 1/2 ], [ 1/2, 1/2, 1/2, 0 ], [ 1/2, 1/2, 1/2, 1/2 ] ] # of the 8 operations in the group there are only 5 distinct fixed point sets: # this is consistent with S1,S2=S4,S3,S5=S7,S6=S8 in the book. gap> Length(Set(example4.points)); 5 ################################################################################
Jacob Hirbawi <JcbHrb@CERF.net>