> < ^ From:

^ Subject:

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>

> < [top]