Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it

563641 views
1
#include <typedef.h>
2
#include <base.h>
3
#include <bravais.h>
4
#include <matrix.h>
5
#include <getput.h>
6
#include <presentation.h>
7
#include <tsubgroups.h>
8
#include <name.h>
9
10
#define DATABASE_NAME TOPDIR "/tables/qcatalog/data"
11
12
13
14
/* ---------------------------------------------------------------------- */
15
/* Berechne diejenigen t-Obergruppen einer Raumgruppe, die in einer */
16
/* gegebenen Q-Klasse sind. */
17
/* ---------------------------------------------------------------------- */
18
/* pfad: Pfad zur Q-Klasse, die ueberprueft werden soll */
19
/* qnameS: Name der Q-Klasse */
20
/* RName: Name der affinen Klasse der Raumgruppe */
21
/* anzahl: speichere die Anzahl der Obergruppen hier */
22
/* aff_class_no: Anzahl der affinen Klassen in der Q-Klasse */
23
/* database: Datenbank der Q-Klassen in einer Dimension */
24
/* trafoinv: RName.trafo^{-1} */
25
/* ---------------------------------------------------------------------- */
26
static bravais_TYP **get_supergr(char *pfad,
27
char *qnameS,
28
CARATname_TYP RName,
29
int *anzahl,
30
int aff_class_no,
31
database *database,
32
matrix_TYP *trafoinv)
33
{
34
int i, k, j, z1ri, z2ri, number, anz, nr, laenge;
35
36
bravais_TYP *Sstd, *Ri, **Si = NULL, *Sstdinv;
37
38
CARATname_TYP NameSstd, NameRi;
39
40
char filename[1024], string[512];
41
42
matrix_TYP **mat, *inv, *trafo;
43
44
FILE *infile;
45
46
MP_INT aff_name_ri;
47
48
TSubgroup_TYP *SG;
49
50
51
52
53
/* Vorbereitungen */
54
anzahl[0] = 0;
55
sprintf(filename, "%s/words.%s", pfad, qnameS);
56
if ( (infile = fopen(filename, "r")) == NULL ) {
57
fprintf(stderr, "get_supergr: Error: Could not open input-file!\n");
58
exit (4);
59
}
60
61
/* Hole Worte fuer alle Untergruppen */
62
fscanf (infile, "%[^\n]",string);
63
if ( string[0] != '#' ) {
64
anz = 1;
65
mat = (matrix_TYP **)malloc(sizeof(matrix_TYP *));
66
rewind(infile);
67
mat[0] = fget_mat(infile);
68
}
69
else{
70
sscanf (string, "#%u", &anz);
71
mat = (matrix_TYP **)malloc(anz * sizeof(matrix_TYP *));
72
for (k = 0; k < anz; k++){
73
mat[k] = fget_mat(infile);
74
}
75
}
76
77
/* trivialer Fall */
78
if (anz == 0){
79
fclose(infile);
80
return(NULL);
81
}
82
83
/* suche die affinen Klassen, die unsere affine Klasse als Untergruppe haben */
84
for (k = 0; k < aff_class_no; k++){ /* durchlaufe alle affinen Klassen */
85
Sstd = NULL;
86
strcpy(NameSstd.qname, qnameS);
87
if (fscanf(infile, "%s%i%i", string, &NameSstd.zname[0], &NameSstd.zname[1]) != 3){
88
fprintf (stderr, "get_supergr: Error: Data has wrong structure.\n");
89
exit (4);
90
}
91
if (sscanf (string, "#%i", &number) != 1){
92
fprintf (stderr, "get_supergr: Error: Data has wrong structure.\n");
93
exit (4);
94
}
95
mpz_init(&NameSstd.aff_name);
96
mpz_inp_str(&NameSstd.aff_name, infile, 10);
97
98
/* lese Infos ueber die Vertreter der t-Untergr. bis auf Konj.
99
unter dem aff. Normalisator */
100
for (i = 0; i < number; i++){ /* durchlaufe alle Untergruppenbahnen der aff. Kl. */
101
if (fscanf(infile, "%i%i%s%i%i", &nr, &laenge, string, &z1ri, &z2ri) != 5){
102
fprintf (stderr, "get_supergr: Error: Data has wrong structure.\n");
103
exit (4);
104
}
105
mpz_init(&aff_name_ri);
106
mpz_inp_str(&aff_name_ri, infile, 10);
107
108
if (strcmp(RName.qname, string) == 0 &&
109
z1ri == RName.zname[0] && z2ri == RName.zname[1] &&
110
mpz_cmp(&aff_name_ri, &RName.aff_name) == 0){
111
/* wir haben eine solche affine Klasse gefunden */
112
113
if (RName.order == 1){ /* die Raumgruppe ist die trivial */
114
if (anzahl[0] == 0)
115
Si = (bravais_TYP **)calloc(1, sizeof(bravais_TYP *));
116
else
117
Si = (bravais_TYP **)realloc(Si, (anzahl[0] + 1) * sizeof(bravais_TYP *));
118
Si[anzahl[0]] = get_std_rep(pfad, NameSstd);
119
anzahl[0]++;
120
}
121
else{ /* die Raumgruppe ist nicht trivial */
122
123
/* berechne Standardvertreter der Obergruppe */
124
if (Sstd == NULL){
125
Sstd = get_std_rep(pfad, NameSstd);
126
Sstdinv = init_bravais(Sstd->dim);
127
Sstdinv->gen_no = Sstd->gen_no;
128
Sstdinv->gen = (matrix_TYP **)calloc(Sstd->gen_no, sizeof(bravais_TYP *));
129
for (j = 0; j < Sstd->gen_no; j++)
130
Sstdinv->gen[j] = mat_inv(Sstd->gen[j]);
131
}
132
133
/* berechne die Untergruppe von Sstd */
134
SG = ite_gruppe(Sstd, NULL, Sstdinv, NULL, mat[nr], FALSE);
135
Ri = SG->R;
136
SG->R = NULL;
137
free_TSubgroup_TYP(SG);
138
139
/* berechne Matrix, die Ri zu Standardvertreter Rstd konjugiert */
140
/* (dies koennte man wesentlich eleganter machen, da man ja den
141
Standardvertreter schon kennt und ihn nicht erst suchen muss) */
142
NameRi = name_fct(Ri, database);
143
trafo = mat_mul(NameRi.trafo, trafoinv);
144
inv = mat_inv(trafo);
145
free_CARATname_TYP(NameRi);
146
147
/* konjugiere Sstd zu Obergruppe von Standardvertreter Rstd */
148
if (anzahl[0] == 0)
149
Si = (bravais_TYP **)calloc(1, sizeof(bravais_TYP *));
150
else
151
Si = (bravais_TYP **)realloc(Si, (anzahl[0] + 1) * sizeof(bravais_TYP *));
152
Si[anzahl[0]] = init_bravais(Sstd->dim);
153
Si[anzahl[0]]->gen_no = Sstd->gen_no;
154
Si[anzahl[0]]->gen = (matrix_TYP **)calloc(Sstd->gen_no, sizeof(matrix_TYP *));
155
for (j = 0; j < Sstd->gen_no; j++){
156
Si[anzahl[0]]->gen[j] = mat_kon(inv, Sstd->gen[j], trafo);
157
}
158
anzahl[0]++;
159
free_mat(inv);
160
free_mat(trafo);
161
free_bravais(Ri);
162
}
163
}
164
mpz_clear(&aff_name_ri);
165
}
166
if (Sstd){
167
free_bravais(Sstd);
168
free_bravais(Sstdinv);
169
}
170
free_CARATname_TYP(NameSstd);
171
}
172
173
/* clean */
174
for (k = 0; k < anz; k++)
175
free_mat(mat[k]);
176
free(mat);
177
178
179
return(Si);
180
}
181
182
183
184
185
/* ---------------------------------------------------------------------- */
186
/* Berechne die minimalen translationengleichen Obergruppen einer */
187
/* Raumgruppe bis auf Konjugation unter dem affinen Normalisator der */
188
/* Raumgruppe unter Zuhilfename der Datenbank. */
189
/* ---------------------------------------------------------------------- */
190
/* R: Raumgruppe in Standard affiner Form ohne Translationen */
191
/* anzahl: speicher die Anzahl der Raumgruppen dort */
192
/* ---------------------------------------------------------------------- */
193
bravais_TYP **tsupergroups(bravais_TYP *R,
194
int *anzahl)
195
{
196
CARATname_TYP Name;
197
198
bravais_TYP **Super, **tmp;
199
200
matrix_TYP *inv;
201
202
database *database;
203
204
char pfad[1024];
205
206
int i, j, no, dim;
207
208
209
/* Vorbereitungen */
210
anzahl[0] = 0;
211
Super = (bravais_TYP **)calloc(0, sizeof(bravais_TYP *));
212
213
/* lade Datenbank */
214
dim = R->dim - 1;
215
database = load_database(DATABASE_NAME, dim);
216
217
/* berechne den Namen */
218
Name = name_fct(R, database);
219
inv = mat_inv(Name.trafo);
220
221
for (i = 0; i < database->nr; i++){
222
if (database->entry[i].order > Name.order &&
223
database->entry[i].order % Name.order == 0){
224
sprintf(pfad,"%s/tables/qcatalog/dim%d/dir.%s/ordnung.%d/%s/",
225
TOPDIR, dim, database->entry[i].symbol,
226
database->entry[i].order, database->entry[i].discriminant);
227
228
tmp = get_supergr(pfad, database->entry[i].abbreviation, Name,
229
&no, database->entry[i].affine, database, inv);
230
231
if (no > 0){
232
Super = (bravais_TYP **)realloc(Super, (anzahl[0] + no) * sizeof(bravais_TYP *));
233
for (j = 0; j < no; j++){
234
Super[anzahl[0] + j] = tmp[j];
235
tmp[j] = NULL;
236
}
237
free(tmp);
238
anzahl[0] += no;
239
}
240
}
241
}
242
243
244
/* clean */
245
free_database (database);
246
free_mat(inv);
247
free_CARATname_TYP(Name);
248
249
return(Super);
250
}
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265