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

563680 views
1
/* author: Oliver Heidbuechel */
2
/* last change: 13.09.2000 */
3
4
5
#include <ZZ.h>
6
#include <typedef.h>
7
#include <bravais.h>
8
#include<getput.h>
9
#include<matrix.h>
10
#include<longtools.h>
11
#include<tools.h>
12
#include"zass.h"
13
#include"symm.h"
14
#include"base.h"
15
#include"autgrp.h"
16
#include"voronoi.h"
17
#include"polyeder.h"
18
#include <graph.h>
19
20
boolean GRAPH = FALSE;
21
22
23
/* ---------------------------------------------------------------------------- */
24
/* Fill the structure Q_data_TYP for G, i.e. calculate various informations we */
25
/* need for calculating the indlusiongraph of subgroup relations in a Q-class */
26
/* pres has to be a correct presentation for G in Gl_n(Z) */
27
/* ---------------------------------------------------------------------------- */
28
Q_data_TYP *get_Q_data(bravais_TYP *G,
29
matrix_TYP *pres,
30
boolean l_option)
31
{
32
int i, j;
33
34
Q_data_TYP *data;
35
36
37
38
data = (Q_data_TYP *)calloc(1, sizeof(Q_data_TYP));
39
data->G = copy_bravais(G);
40
data->pres = copy_mat(pres);
41
data->l_option = l_option;
42
43
/* calculate the Z-classes */
44
data->INZ = (QtoZ_TYP *)calloc(1, sizeof(QtoZ_TYP));
45
GRAPH = TRUE;
46
data->Z = q2z(G, &data->Z_no, 0, data->INZ, 1);
47
cleanup_prime();
48
GRAPH = FALSE;
49
50
/* affine classes */
51
data->all = 0;
52
data->aff_no = (int *)calloc(data->Z_no, sizeof(int));
53
data->WORDS = (int ****)calloc(data->Z_no, sizeof(int ***));
54
data->NUMBER_OF_WORDS = (int **)calloc(data->Z_no, sizeof(int *));
55
data->N = (matrix_TYP ***)calloc(data->Z_no, sizeof(matrix_TYP **));
56
data->X = (matrix_TYP ***)calloc(data->Z_no, sizeof(matrix_TYP **));
57
data->names = (MP_INT **)calloc(data->Z_no, sizeof(MP_INT *));
58
if (!data->l_option)
59
data->names_int = (int **)calloc(data->Z_no, sizeof(int *));
60
data->gen_inv = (matrix_TYP ***)calloc(data->Z_no, sizeof(matrix_TYP **));
61
data->coz = (matrix_TYP ***)calloc(data->Z_no, sizeof(matrix_TYP **));
62
data->norm_inv = (matrix_TYP ***)calloc(data->Z_no, sizeof(matrix_TYP **));
63
data->X_2_inv = (matrix_TYP **)calloc(data->Z_no, sizeof(matrix_TYP *));
64
data->coho_size = (int *)calloc(data->Z_no, sizeof(int));
65
data->stab_coz = (matrix_TYP ****)calloc(data->Z_no, sizeof(matrix_TYP ***));
66
data->stab_gen_no = (int **)calloc(data->Z_no, sizeof(int *));
67
data->first_aff = (int *)calloc(data->Z_no, sizeof(int));
68
data->list_of_names = (int **)calloc(data->Z_no, sizeof(int *));
69
for (i = 0; i < data->Z_no; i++){
70
cen_to_norm(data->Z[i]);
71
data->first_aff[i] = data->all;
72
data->WORDS[i] = (int ***)calloc(MIN_SPEICHER, sizeof(int **));
73
data->NUMBER_OF_WORDS[i] = (int *)calloc(MIN_SPEICHER, sizeof(int));
74
data->gen_inv[i] = (matrix_TYP **)calloc(data->Z[i]->gen_no, sizeof(matrix_TYP *));
75
data->coz[i] = all_cocycles(pres, data->Z[i], &data->aff_no[i], data->gen_inv[i],
76
&data->X[i], &data->names[i], &data->WORDS[i],
77
&data->NUMBER_OF_WORDS[i], &data->N[i], &data->coho_size[i],
78
&data->list_of_names[i], data->l_option);
79
data->all += data->aff_no[i];
80
data->norm_inv[i] = (matrix_TYP **)calloc(data->Z[i]->normal_no, sizeof(matrix_TYP *));
81
for (j = 0; j < data->Z[i]->normal_no; j++){
82
data->norm_inv[i][j] = mat_inv(data->Z[i]->normal[j]);
83
}
84
data->X_2_inv[i] = mat_inv(data->X[i][2]);
85
data->stab_coz[i] = (matrix_TYP ***)calloc(data->aff_no[i], sizeof(matrix_TYP **));
86
data->stab_gen_no[i] = (int *)calloc(data->aff_no[i], sizeof(int));
87
for (j = 0; j < data->aff_no[i]; j++){
88
data->stab_coz[i][j] = stab_coz(data->WORDS[i][j], data->NUMBER_OF_WORDS[i][j],
89
data->Z[i]->normal, data->norm_inv[i],
90
data->Z[i]->normal_no, j, &data->stab_gen_no[i][j]);
91
}
92
}
93
94
/* put cocycles and pointgroup together */
95
data->aff = (bravais_TYP ***)calloc(data->Z_no, sizeof(bravais_TYP **));
96
for (i = 0; i < data->Z_no; i++){
97
data->aff[i] = (bravais_TYP **)calloc(data->aff_no[i], sizeof(bravais_TYP *));
98
if (!data->l_option)
99
data->names_int[i] = (int *)calloc(data->aff_no[i], sizeof(int));
100
for (j = 0; j < data->aff_no[i]; j++){
101
if (!data->l_option)
102
data->names_int[i][j] = mpz_get_ui(&data->names[i][j]);
103
data->aff[i][j] = extract_r(data->Z[i], data->coz[i][j]);
104
}
105
}
106
return(data);
107
}
108
109
110
111
112
/* ---------------------------------------------------------------------------- */
113
/* Write the number of Z-classes and affine classes in each Z-class to stdout! */
114
/* If printflag, we write the Z-classes and affine classes in files. */
115
/* data->aff, data->aff_no, data->Z, data->Z_no have to be filled correctly */
116
/* and completely */
117
/* ---------------------------------------------------------------------------- */
118
void put_Q_data(Q_data_TYP *data,
119
char *groupname,
120
int printflag)
121
{
122
int i, j;
123
124
char comment[1000],
125
file[1000];
126
127
matrix_TYP *form, *id;
128
129
id = init_mat(data->G->dim, data->G->dim, "1");
130
131
if (printflag){
132
for (i = 0; i < data->Z_no; i++){
133
sprintf(comment, "%d-th Z-class of %s", i+1, groupname);
134
sprintf(file, "%s.%d",groupname, i+1);
135
put_bravais(data->Z[i], file, comment);
136
137
form = rform(data->Z[i]->gen, data->Z[i]->gen_no, id, 100);
138
sprintf(comment, "form of the %d-th Z-class of %s", i+1, groupname);
139
sprintf(file, "form.%s.%d",groupname, i+1);
140
put_mat(form, file, comment,0);
141
free_mat(form);
142
143
for (j = 0; j < data->aff_no[i]; j++){
144
sprintf(comment, "%d-th affine class of the %d-th Z-class of %s",
145
j+1, i+1, groupname);
146
sprintf(file, "%s.%d.%d", groupname, i+1, j+1);
147
put_bravais(data->aff[i][j], file, comment);
148
}
149
}
150
}
151
152
printf("There are %i Z-Classes with ", data->Z_no);
153
for (i = 0; i < data->Z_no; i++){
154
printf("%i ",data->aff_no[i]);
155
}
156
printf("Space Groups!\n");
157
158
free_mat(id);
159
}
160
161
162
163
/* ---------------------------------------------------------------------------- */
164
/* Free the structure Q_data_TYP */
165
/* data has to be filled correctly and completely */
166
/* ---------------------------------------------------------------------------- */
167
void free_Q_data(Q_data_TYP *data)
168
{
169
int i, j, k, Nanz;
170
171
172
if (data->first_aff){
173
free(data->first_aff);
174
}
175
if (data->names_int){
176
for (i = 0; i < data->Z_no; i++){
177
if (data->names_int[i] != NULL)
178
free(data->names_int[i]);
179
}
180
free(data->names_int);
181
}
182
if (data->list_of_names){
183
for (i = 0; i < data->Z_no; i++){
184
if (data->list_of_names[i] != NULL)
185
free(data->list_of_names[i]);
186
}
187
free(data->list_of_names);
188
}
189
if (data->stab_coz){
190
for (i = 0; i < data->Z_no; i++){
191
for (j = 0; j < data->aff_no[i]; j++){
192
for (k = 0; k < data->stab_gen_no[i][j]; k++){
193
free_mat(data->stab_coz[i][j][k]);
194
}
195
free(data->stab_coz[i][j]);
196
}
197
free(data->stab_coz[i]);
198
}
199
free(data->stab_coz);
200
}
201
if (data->stab_gen_no){
202
for (i = 0; i < data->Z_no; i++){
203
if (data->stab_gen_no[i] != NULL)
204
free(data->stab_gen_no[i]);
205
}
206
free(data->stab_gen_no);
207
}
208
if (data->norm_inv){
209
for (i = 0; i < data->Z_no; i++){
210
for (j = 0; j < data->Z[i]->normal_no; j++)
211
free_mat(data->norm_inv[i][j]);
212
free(data->norm_inv[i]);
213
}
214
free(data->norm_inv);
215
}
216
if (data->gen_inv){
217
for (i = 0; i < data->Z_no; i++){
218
for (j = 0; j < data->Z[i]->gen_no; j++)
219
if (data->gen_inv[i][j])
220
free_mat(data->gen_inv[i][j]);
221
free(data->gen_inv[i]);
222
}
223
free(data->gen_inv);
224
}
225
if (data->N){
226
for (i = 0; i < data->Z_no; i++){
227
if (data->N[i] != NULL){
228
Nanz = data->Z[i]->cen_no + data->Z[i]->normal_no;
229
for (j = 0; j < Nanz; j++)
230
free_mat(data->N[i][j]);
231
free(data->N[i]);
232
}
233
}
234
free(data->N);
235
}
236
if (data->WORDS && data->NUMBER_OF_WORDS && data->X){
237
for (i = 0; i < data->Z_no; i++){
238
if (data->X[i][0]->cols >= 1){
239
for (j = 0; j < data->aff_no[i]; j++){
240
for (k = 0; k < data->NUMBER_OF_WORDS[i][j]; k++){
241
free(data->WORDS[i][j][k]);
242
}
243
free(data->WORDS[i][j]);
244
}
245
}
246
free(data->WORDS[i]);
247
free(data->NUMBER_OF_WORDS[i]);
248
}
249
free(data->WORDS);
250
free(data->NUMBER_OF_WORDS);
251
}
252
if (data->X){
253
for (i = 0; i < data->Z_no; i++){
254
for (j = 0; j < 3; j++){
255
if (data->X[i][j] != NULL) free_mat(data->X[i][j]);
256
}
257
free(data->X[i]);
258
}
259
free(data->X);
260
}
261
if (data->X_2_inv){
262
for (i = 0; i < data->Z_no; i++){
263
if (data->X_2_inv[i] != NULL) free_mat(data->X_2_inv[i]);
264
}
265
free(data->X_2_inv);
266
}
267
if (data->names)
268
{
269
for (i = 0; i < data->Z_no; i++)
270
{
271
if (data->names[i] != NULL)
272
{
273
for (j = 0; j < data->aff_no[i]; j++)
274
mpz_clear(data->names[i] + j);
275
free(data->names[i]);
276
}
277
}
278
free(data->names);
279
}
280
if (data->coho_size){
281
free(data->coho_size);
282
}
283
free_QtoZ(data->INZ, 0);
284
for (i = 0; i < data->Z_no; i++){
285
for (j = 0; j < data->aff_no[i]; j++){
286
free_bravais(data->aff[i][j]);
287
free_mat(data->coz[i][j]);
288
}
289
free_bravais(data->Z[i]);
290
free(data->aff[i]);
291
free(data->coz[i]);
292
}
293
free(data->aff_no);
294
free(data->aff);
295
free(data->coz);
296
free(data->Z);
297
free_bravais(data->G);
298
free_mat(data->pres);
299
free(data);
300
}
301
302
303
304
305
306
307
308
309
310
311
312