GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#include <typedef.h>1#include <bravais.h>2#include <name.h>3#include <tsubgroups.h>4#include "tools.h"5#include "matrix.h"6#include "getput.h"7#include <string.h>891011/* -------------------------------------------------------- */12/* Free TSubgroup_TYP and pointer to this! */13/* -------------------------------------------------------- */14void free_TSubgroup_TYP(TSubgroup_TYP *sbg)15{16if (sbg){17if (sbg->R)18free_bravais(sbg->R);19if (sbg->P)20free_bravais(sbg->P);21free(sbg);22}23}24252627/* -------------------------------------------------------- */28/* Free CARATname_TYP! */29/* -------------------------------------------------------- */30void free_CARATname_TYP(CARATname_TYP Name)31{32if (&Name.aff_name)33mpz_clear(&Name.aff_name);34if (Name.trafo)35free_mat(Name.trafo);36}3738394041/* -------------------------------------------------------- */42/* Free TSUB_TYP! */43/* -------------------------------------------------------- */44void free_TSUB_TYP(TSUB_TYP TSUB)45{46int i;4748for (i = 0; i < TSUB.word_no; i++){49if (TSUB.words[i])50free_mat(TSUB.words[i]);51}52}535455/* -------------------------------------------------------- */56/* Get standardrepresentative of an affine class */57/* (compare with reverse_name_fct.c) */58/* -------------------------------------------------------- */59/* pfad: Pfad, wo Q-Klassen-Vertreter ist */60/* Name: CARAT-Name */61/* -------------------------------------------------------- */62bravais_TYP *get_std_rep(char *pfad,63CARATname_TYP Name)64{65bravais_TYP *R;6667char filename[1024];6869bravais_TYP *DATAZ, *DATAQ;7071matrix_TYP *PRES;727374/* calculate standard representative */75sprintf(filename, "%s/%s", pfad, Name.qname);76DATAQ = get_bravais(filename);77sprintf(filename,"%s/pres.%s", pfad, Name.qname);78PRES = get_mat(filename);79DATAZ = get_zclass_by_name(DATAQ, Name.zname, Name.zname+1, FALSE);80R = get_affine_class_by_name(DATAZ, PRES, &Name.aff_name, 1);8182/* clean */83cleanup_prime();84free_bravais(DATAQ);85free_bravais(DATAZ);86free_mat(PRES);8788return(R);89}9091929394/* -------------------------------------------------------- */95/* hole die Worte fuer die t-Untergruppen einer Raumgruppe */96/* aus der Datenbank */97/* -------------------------------------------------------- */98/* pfad: Verzeichnis der Q-Klasse zu der Raumgruppe */99/* Name: CARATname der Raumgruppe */100/* aff_class_no: Anzahl der aff. Klassen in der Q-Klasse */101/* aflag: berechne die t-Untergr. bis auf Konjugation unter */102/* dem affinen Normalisator */103/* anzahl: speichere die Anzahl der t-Untergr. hier */104/* -------------------------------------------------------- */105matrix_TYP **get_words(char *pfad,106CARATname_TYP Name,107int aff_class_no,108boolean aflag,109int *anzahl)110{111int anz, k, i, z1, z2, *woerter, nr, laenge;112113char filename[1024], string[512];114115matrix_TYP **mat, **tmp;116117FILE *infile;118119MP_INT aff_name;120121boolean FLAG;122123124/* oeffne Datei */125sprintf(filename, "%s/words.%s", pfad, Name.qname);126if ( (infile = fopen(filename, "r")) == NULL ) {127fprintf(stderr, "get_words: Error: Could not open input-file!\n");128exit (4);129}130131/* Hole Worte fuer alle Untergruppen */132fscanf (infile, "%[^\n]",string);133if ( string[0] != '#' ) {134anz = 1;135mat = (matrix_TYP **)malloc(sizeof(matrix_TYP *));136rewind(infile);137mat[0] = fget_mat(infile);138}139else{140sscanf (string, "#%u", &anz);141mat = (matrix_TYP **)malloc(anz * sizeof(matrix_TYP *));142for (k = 0; k < anz; k++){143mat[k] = fget_mat(infile);144}145}146147/* trivialer Fall */148if (anz == 0){149anzahl[0] = 0;150fclose(infile);151return(NULL);152}153154if (aflag){155woerter = (int *)calloc(anz, sizeof(int));156FLAG = FALSE;157158/* suche die richtige affine Klasse */159for (k = 0; k < aff_class_no; k++){160if (fscanf(infile, "%s%i%i", string, &z1, &z2) != 3){161fprintf (stderr, "Data has wrong structure.\n");162exit (4);163}164if (sscanf (string, "#%i", anzahl) != 1){165fprintf (stderr, "Data has wrong structure.\n");166exit (4);167}168mpz_init(&aff_name);169mpz_inp_str(&aff_name, infile, 10);170171if (z1 == Name.zname[0] && z2 == Name.zname[1] &&172mpz_cmp(&aff_name, &Name.aff_name) == 0){173FLAG = TRUE;174}175mpz_clear(&aff_name);176177/* lese Infos ueber die Vertreter der t-Untergr. bis auf Konj.178unter dem aff. Normalisator */179for (i = 0; i < anzahl[0]; i++){180if (fscanf(infile, "%i%i%s%i%i", &nr, &laenge, string, &z1, &z2) != 5){181fprintf (stderr, "Data has wrong structure.\n");182exit (4);183}184mpz_init(&aff_name);185mpz_inp_str(&aff_name, infile, 10);186mpz_clear(&aff_name);187if (FLAG){188woerter[nr]++;189190/* Laenge der Bahn unter dem affinen Normalisator */191mat[nr]->array.SZ[mat[nr]->rows - 1][0] = laenge;192}193}194if (FLAG)195break;196}197if (!FLAG){198fprintf(stderr, "ERROR in get_words!\n");199exit(56);200}201202/* lasse nur die Matrizen fuer die Vertreter uebrig */203tmp = (matrix_TYP **)calloc(anz, sizeof(matrix_TYP *));204i = 0;205for (k = 0; k < anz; k++){206if (woerter[k]){207if (woerter[k] != 1){208fprintf(stderr, "ERROR in get_words!\n");209exit(58);210}211tmp[i] = mat[k];212i++;213}214else215free_mat(mat[k]);216}217if (i != anzahl[0]){218fprintf(stderr, "ERROR in get_words!\n");219exit(57);220}221free(mat);222mat = tmp;223tmp = NULL;224free(woerter);225}226else{227anzahl[0] = anz;228}229230fclose(infile);231232return(mat);233}234235236237238239240241242243244245246247248249250251252253254255