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

563604 views
1
#include "typedef.h"
2
#include "tools.h"
3
#include "matrix.h"
4
5
vertex_TYP *init_vertex_fuber(dim, wall_no)
6
int dim;
7
int wall_no;
8
{
9
int i,j;
10
vertex_TYP *erg;
11
erg = (vertex_TYP *)malloc(sizeof(vertex_TYP));
12
if(dim!=0)
13
erg->v = (int *)malloc(dim *sizeof(int));
14
erg->dim = dim;
15
erg->wall_no = wall_no;
16
if( wall_no > 0)
17
{
18
j = wall_no/extsize1 +1;
19
erg->wall_SIZE = j * extsize1;
20
erg->wall = (int *)malloc(erg->wall_SIZE *sizeof(int));
21
}
22
else
23
erg->wall_SIZE=0;
24
25
return(erg);
26
}
27
28
wall_TYP *init_wall_fuber(dim)
29
int dim;
30
{
31
int i,j;
32
wall_TYP *erg;
33
34
erg = (wall_TYP *)malloc(sizeof(wall_TYP));
35
erg->gl = (int *)malloc(dim *sizeof(int));
36
erg->norm = 0;
37
erg->dim = dim;
38
erg->product = NULL;
39
erg->nproduct = 0;
40
erg->mat = NULL;
41
return(erg);
42
}
43
44
void free_vertex_fuber(vertex_TYP**);
45
void free_wall_fuber(wall_TYP**);
46
/*
47
Aenderung: 12.10.94 JK
48
Speicherplatz wieder freigeben
49
*/
50
void free_fund_domain( fudo )
51
fund_domain* fudo;
52
{
53
int i;
54
for (i=0;i<fudo->wall_no;i++)
55
free_wall_fuber( &fudo->wall[i]);
56
if (fudo->wall_no>0)
57
free( (int *)fudo->wall);
58
for (i=0;i<fudo->vert_no;i++)
59
free_vertex_fuber( &fudo->vert[i]);
60
if (fudo->vert_no>0)
61
free( (int *)fudo->vert);
62
free( (int *)fudo);
63
}
64
65
fund_domain *init_fund_domain(vert_no, wall_no)
66
int vert_no, wall_no;
67
{
68
int i,j;
69
fund_domain *erg;
70
71
erg = (fund_domain *)malloc(sizeof(fund_domain));
72
erg->vert_no = vert_no;
73
erg->wall_no = wall_no;
74
j = vert_no/extsize1 +1;
75
j *= extsize1;
76
erg->vert_SIZE = j;
77
erg->vert = (vertex_TYP **)malloc(j*sizeof(vertex_TYP *));
78
j = wall_no/extsize1 +1;
79
j *= extsize1;
80
erg->wall_SIZE = j;
81
erg->wall = (wall_TYP **)malloc(j*sizeof(wall_TYP *));
82
return(erg);
83
}
84
85
86
87
88
fund_domain *get_fund_domain(file_name)
89
char *file_name;
90
{
91
int vertno, wallno;
92
int dim,wn,i,j;
93
fund_domain *F;
94
FILE *infile;
95
96
97
/*------------------------------------------------------------*\
98
| Open input file |
99
\*------------------------------------------------------------*/
100
if ( file_name == NULL )
101
infile = stdin;
102
else
103
if ( (infile = fopen (file_name, "r")) == NULL ) {
104
fprintf (stderr, "Could not open input-file %s\n", file_name);
105
exit (4);
106
}
107
/*--------------------------------------------------*\
108
| read fundamental domain |
109
\*--------------------------------------------------*/
110
fscanf (infile, "%d", &vertno);
111
fscanf (infile, "%d", &wallno);
112
F = init_fund_domain(vertno, wallno);
113
for(i=0;i<vertno;i++)
114
{
115
fscanf (infile, "%d", &dim);
116
fscanf (infile, "%d", &wn);
117
F->vert[i] = init_vertex_fuber(dim, wn);
118
for(j=0;j<dim;j++)
119
fscanf(infile, "%d", &F->vert[i]->v[j]);
120
for(j=0;j<wn;j++)
121
fscanf(infile, "%d", &F->vert[i]->wall[j]);
122
}
123
for(i=0;i<wallno;i++)
124
{
125
fscanf(infile, "%d", &dim);
126
F->wall[i] = init_wall_fuber(dim);
127
for(j=0;j<dim;j++)
128
fscanf(infile, "%d", &F->wall[i]->gl[j]);
129
}
130
131
132
/*------------------------------------------------------------*\
133
| close input file |
134
\*------------------------------------------------------------*/
135
if ( infile != stdin )
136
fclose (infile);
137
return ( F );
138
}
139
140
141
void put_fund_domain(F)
142
fund_domain *F;
143
{
144
int i,j;
145
printf("%d %d\n", F->vert_no, F->wall_no);
146
printf("\n");
147
for(i=0;i<F->vert_no;i++)
148
{
149
printf("%d %d\n", F->vert[i]->dim, F->vert[i]->wall_no);
150
for(j=0;j<F->vert[i]->dim;j++)
151
printf("%d ", F->vert[i]->v[j]);
152
printf("\n");
153
for(j=0;j<F->vert[i]->wall_no;j++)
154
printf("%d ", F->vert[i]->wall[j]);
155
printf("\n");
156
}
157
printf("\n");
158
for(i=0;i<F->wall_no;i++)
159
{
160
printf("%d\n", F->wall[i]->dim);
161
for(j=0;j<F->wall[i]->dim;j++)
162
printf("%d ", F->wall[i]->gl[j]);
163
printf("\n");
164
}
165
166
fflush(stdout);
167
}
168
169
170
int wall_times_vertex_fuber(w, v)
171
wall_TYP *w;
172
vertex_TYP *v;
173
{
174
int i;
175
int e,wa;
176
e=0;
177
for(i=0;i<v->dim;i++)
178
e += v->v[i] * w->gl[i];
179
return(e);
180
}
181
182
void free_vertex_fuber(v)
183
vertex_TYP **v;
184
{
185
int i;
186
if((*v)!= NULL)
187
{
188
free((int *)(*v)->v);
189
if((*v)->wall_SIZE != 0)
190
free((int *)(*v)->wall);
191
free((int *)(*v));
192
(*v)=NULL;
193
}
194
}
195
196
void free_wall_fuber(v)
197
wall_TYP **v;
198
{
199
int i;
200
if((*v)!= NULL)
201
{
202
free((*v)->gl);
203
if((*v)->mat != NULL)
204
free_mat((*v)->mat);
205
if ((*v)->nproduct!=0)
206
free((*v)->product);
207
free( (int *)(*v));
208
(*v)=NULL;
209
}
210
}
211
212
/*
213
commented out this function tilman 21/3/97
214
wall_TYP *mat_to_wall(M)
215
matrix_TYP *M;
216
{
217
int i;
218
wall_TYP *erg;
219
erg = init_wall_fuber(M->cols);
220
for(i=0;i<erg->dim;i++)
221
erg->gl[i] = M->array.SZ[0][i];
222
return(erg);
223
}
224
*/
225
226
void wall_standard(v)
227
wall_TYP *v;
228
{
229
int i,j;
230
int w1;
231
232
if(v->dim>0)
233
{
234
w1 = 0;
235
i=0;
236
while(i<v->dim && v->gl[i] == 0)
237
i++;
238
if(i<v->dim)
239
w1 = v->gl[i];
240
for(j=i+1;j<v->dim;j++)
241
{
242
if(v->gl[j] != 0)
243
w1 = GGT(w1, v->gl[j]);
244
}
245
if(w1 < 0)
246
w1 = -w1;
247
if(w1 != 0)
248
{
249
for(j=i;j<v->dim;j++)
250
v->gl[j] /= w1;
251
}
252
v->norm = 0;
253
for(i=0;i<v->dim;i++)
254
v->norm += v->gl[i] * v->gl[i];
255
}
256
}
257
/*{{{}}}*/
258
259