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

563595 views
1
#include <typedef.h>
2
#include <base.h>
3
#include <bravais.h>
4
#include <matrix.h>
5
#include <presentation.h>
6
#include <tsubgroups.h>
7
#include <name.h>
8
9
#define DATABASE_NAME TOPDIR "/tables/qcatalog/data"
10
11
12
13
14
/* ---------------------------------------------------------------------- */
15
/* Berechne die maximalen t-Untergruppen einer Raumgruppe */
16
/* bis auf Konjugation unter der Raumgruppe unter Zuhilfename der */
17
/* Datenbank. */
18
/* ---------------------------------------------------------------------- */
19
/* R: Raumgruppe in Standard affiner Form ohne Translationen */
20
/* aflag: berechne Untergruppen bis auf Konjugation unter dem affinen */
21
/* Normalisator */
22
/* anzahl: speichere die Anzahl der Untergruppen hier */
23
/* ---------------------------------------------------------------------- */
24
TSubgroup_TYP **tsubgroup_db(bravais_TYP *R,
25
boolean aflag,
26
int *anzahl)
27
{
28
CARATname_TYP Name;
29
30
TSubgroup_TYP **sbg;
31
32
bravais_TYP *Rstd, *Rinv;
33
34
matrix_TYP **mat, *tmp, *inv;
35
36
database *database;
37
38
char pfad[1024];
39
40
int i, k, dim, found = 0, j;
41
42
43
44
/* berechne den Namen */
45
dim = R->dim - 1;
46
database = load_database(DATABASE_NAME, dim);
47
Name = name_fct(R, database);
48
49
50
/* suche Pfad (wird schon in name_fct bzw. deren Unterfunktionen
51
im Prinzip berechnet, koennte man da abspeichern) */
52
i = 0;
53
while (!found && i<database->nr ){
54
found = (strcmp(database->entry[i].abbreviation, Name.qname) == 0);
55
i++;
56
}
57
58
if (found){
59
i--;
60
sprintf(pfad,"%s/tables/qcatalog/dim%d/dir.%s/ordnung.%d/%s/",
61
TOPDIR, dim, database->entry[i].symbol,
62
database->entry[i].order, database->entry[i].discriminant);
63
64
Rstd = get_std_rep(pfad, Name);
65
66
mat = get_words(pfad, Name, database->entry[i].affine, aflag, anzahl);
67
68
sbg = (TSubgroup_TYP **)calloc(anzahl[0], sizeof(TSubgroup_TYP *));
69
70
/* Nur die triviale Raumgruppe ist maximale Untergruppe! */
71
if (anzahl[0] == 1 && mat[0]->rows == 1){
72
sbg = (TSubgroup_TYP **)calloc(anzahl[0], sizeof(TSubgroup_TYP *));
73
sbg[0] = (TSubgroup_TYP *)calloc(1, sizeof(TSubgroup_TYP));
74
75
sbg[0]->R = init_bravais(R->dim);
76
sbg[0]->R->gen = (matrix_TYP **)calloc(1, sizeof(matrix_TYP *));
77
sbg[0]->R->gen_no = 1;
78
sbg[0]->R->gen[0] = init_mat(R->dim, R->dim, "1");
79
sbg[0]->orbitlength = 1;
80
sbg[0]->pointgrouporder = 1;
81
82
sbg[0]->P = init_bravais(R->dim - 1);
83
sbg[0]->P->gen = (matrix_TYP **)calloc(1, sizeof(matrix_TYP *));
84
sbg[0]->P->gen_no = 1;
85
sbg[0]->P->gen[0] = init_mat(R->dim - 1, R->dim - 1, "1");
86
}
87
else{
88
inv = mat_inv(Name.trafo);
89
Rinv = init_bravais(Rstd->dim);
90
Rinv->gen_no = Rstd->gen_no;
91
Rinv->gen = (matrix_TYP **)calloc(Rstd->gen_no, sizeof(bravais_TYP *));
92
for (k = 0; k < Rstd->gen_no; k++){
93
Rinv->gen[k] = mat_inv(Rstd->gen[k]);
94
}
95
for (k = 0; k < anzahl[0]; k++){
96
sbg[k] = ite_gruppe(Rstd, NULL, Rinv, NULL, mat[k], FALSE);
97
for (j = 0; j < sbg[k]->R->gen_no; j++){
98
tmp = mat_kon(Name.trafo, sbg[k]->R->gen[j], inv);
99
free_mat(sbg[k]->R->gen[j]);
100
sbg[k]->R->gen[j] = tmp;
101
tmp = NULL;
102
}
103
}
104
free_mat(inv);
105
free_bravais(Rinv);
106
}
107
108
if (mat){
109
for (k = 0; k < anzahl[0]; k++)
110
free_mat(mat[k]);
111
free(mat);
112
}
113
114
free_bravais(Rstd);
115
}
116
else{
117
fprintf(stderr, "ERROR in tsubgroup_db!\n");
118
exit(77);
119
}
120
121
/* clean */
122
free_database (database);
123
free_CARATname_TYP(Name);
124
125
return(sbg);
126
}
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141