GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#include <typedef.h>1#include <base.h>2#include <bravais.h>3#include <matrix.h>4#include <getput.h>5#include <presentation.h>6#include <tsubgroups.h>7#include <name.h>89#define DATABASE_NAME TOPDIR "/tables/qcatalog/data"10111213/* ---------------------------------------------------------------------- */14/* Berechne diejenigen t-Obergruppen einer Raumgruppe, die in einer */15/* gegebenen Q-Klasse sind. */16/* ---------------------------------------------------------------------- */17/* pfad: Pfad zur Q-Klasse, die ueberprueft werden soll */18/* qnameS: Name der Q-Klasse */19/* RName: Name der affinen Klasse der Raumgruppe */20/* anzahl: speichere die Anzahl der Obergruppen hier */21/* aff_class_no: Anzahl der affinen Klassen in der Q-Klasse */22/* database: Datenbank der Q-Klassen in einer Dimension */23/* trafoinv: RName.trafo^{-1} */24/* ---------------------------------------------------------------------- */25static bravais_TYP **get_supergr(char *pfad,26char *qnameS,27CARATname_TYP RName,28int *anzahl,29int aff_class_no,30database *database,31matrix_TYP *trafoinv)32{33int i, k, j, z1ri, z2ri, number, anz, nr, laenge;3435bravais_TYP *Sstd, *Ri, **Si = NULL, *Sstdinv;3637CARATname_TYP NameSstd, NameRi;3839char filename[1024], string[512];4041matrix_TYP **mat, *inv, *trafo;4243FILE *infile;4445MP_INT aff_name_ri;4647TSubgroup_TYP *SG;4849505152/* Vorbereitungen */53anzahl[0] = 0;54sprintf(filename, "%s/words.%s", pfad, qnameS);55if ( (infile = fopen(filename, "r")) == NULL ) {56fprintf(stderr, "get_supergr: Error: Could not open input-file!\n");57exit (4);58}5960/* Hole Worte fuer alle Untergruppen */61fscanf (infile, "%[^\n]",string);62if ( string[0] != '#' ) {63anz = 1;64mat = (matrix_TYP **)malloc(sizeof(matrix_TYP *));65rewind(infile);66mat[0] = fget_mat(infile);67}68else{69sscanf (string, "#%u", &anz);70mat = (matrix_TYP **)malloc(anz * sizeof(matrix_TYP *));71for (k = 0; k < anz; k++){72mat[k] = fget_mat(infile);73}74}7576/* trivialer Fall */77if (anz == 0){78fclose(infile);79return(NULL);80}8182/* suche die affinen Klassen, die unsere affine Klasse als Untergruppe haben */83for (k = 0; k < aff_class_no; k++){ /* durchlaufe alle affinen Klassen */84Sstd = NULL;85strcpy(NameSstd.qname, qnameS);86if (fscanf(infile, "%s%i%i", string, &NameSstd.zname[0], &NameSstd.zname[1]) != 3){87fprintf (stderr, "get_supergr: Error: Data has wrong structure.\n");88exit (4);89}90if (sscanf (string, "#%i", &number) != 1){91fprintf (stderr, "get_supergr: Error: Data has wrong structure.\n");92exit (4);93}94mpz_init(&NameSstd.aff_name);95mpz_inp_str(&NameSstd.aff_name, infile, 10);9697/* lese Infos ueber die Vertreter der t-Untergr. bis auf Konj.98unter dem aff. Normalisator */99for (i = 0; i < number; i++){ /* durchlaufe alle Untergruppenbahnen der aff. Kl. */100if (fscanf(infile, "%i%i%s%i%i", &nr, &laenge, string, &z1ri, &z2ri) != 5){101fprintf (stderr, "get_supergr: Error: Data has wrong structure.\n");102exit (4);103}104mpz_init(&aff_name_ri);105mpz_inp_str(&aff_name_ri, infile, 10);106107if (strcmp(RName.qname, string) == 0 &&108z1ri == RName.zname[0] && z2ri == RName.zname[1] &&109mpz_cmp(&aff_name_ri, &RName.aff_name) == 0){110/* wir haben eine solche affine Klasse gefunden */111112if (RName.order == 1){ /* die Raumgruppe ist die trivial */113if (anzahl[0] == 0)114Si = (bravais_TYP **)calloc(1, sizeof(bravais_TYP *));115else116Si = (bravais_TYP **)realloc(Si, (anzahl[0] + 1) * sizeof(bravais_TYP *));117Si[anzahl[0]] = get_std_rep(pfad, NameSstd);118anzahl[0]++;119}120else{ /* die Raumgruppe ist nicht trivial */121122/* berechne Standardvertreter der Obergruppe */123if (Sstd == NULL){124Sstd = get_std_rep(pfad, NameSstd);125Sstdinv = init_bravais(Sstd->dim);126Sstdinv->gen_no = Sstd->gen_no;127Sstdinv->gen = (matrix_TYP **)calloc(Sstd->gen_no, sizeof(bravais_TYP *));128for (j = 0; j < Sstd->gen_no; j++)129Sstdinv->gen[j] = mat_inv(Sstd->gen[j]);130}131132/* berechne die Untergruppe von Sstd */133SG = ite_gruppe(Sstd, NULL, Sstdinv, NULL, mat[nr], FALSE);134Ri = SG->R;135SG->R = NULL;136free_TSubgroup_TYP(SG);137138/* berechne Matrix, die Ri zu Standardvertreter Rstd konjugiert */139/* (dies koennte man wesentlich eleganter machen, da man ja den140Standardvertreter schon kennt und ihn nicht erst suchen muss) */141NameRi = name_fct(Ri, database);142trafo = mat_mul(NameRi.trafo, trafoinv);143inv = mat_inv(trafo);144free_CARATname_TYP(NameRi);145146/* konjugiere Sstd zu Obergruppe von Standardvertreter Rstd */147if (anzahl[0] == 0)148Si = (bravais_TYP **)calloc(1, sizeof(bravais_TYP *));149else150Si = (bravais_TYP **)realloc(Si, (anzahl[0] + 1) * sizeof(bravais_TYP *));151Si[anzahl[0]] = init_bravais(Sstd->dim);152Si[anzahl[0]]->gen_no = Sstd->gen_no;153Si[anzahl[0]]->gen = (matrix_TYP **)calloc(Sstd->gen_no, sizeof(matrix_TYP *));154for (j = 0; j < Sstd->gen_no; j++){155Si[anzahl[0]]->gen[j] = mat_kon(inv, Sstd->gen[j], trafo);156}157anzahl[0]++;158free_mat(inv);159free_mat(trafo);160free_bravais(Ri);161}162}163mpz_clear(&aff_name_ri);164}165if (Sstd){166free_bravais(Sstd);167free_bravais(Sstdinv);168}169free_CARATname_TYP(NameSstd);170}171172/* clean */173for (k = 0; k < anz; k++)174free_mat(mat[k]);175free(mat);176177178return(Si);179}180181182183184/* ---------------------------------------------------------------------- */185/* Berechne die minimalen translationengleichen Obergruppen einer */186/* Raumgruppe bis auf Konjugation unter dem affinen Normalisator der */187/* Raumgruppe unter Zuhilfename der Datenbank. */188/* ---------------------------------------------------------------------- */189/* R: Raumgruppe in Standard affiner Form ohne Translationen */190/* anzahl: speicher die Anzahl der Raumgruppen dort */191/* ---------------------------------------------------------------------- */192bravais_TYP **tsupergroups(bravais_TYP *R,193int *anzahl)194{195CARATname_TYP Name;196197bravais_TYP **Super, **tmp;198199matrix_TYP *inv;200201database *database;202203char pfad[1024];204205int i, j, no, dim;206207208/* Vorbereitungen */209anzahl[0] = 0;210Super = (bravais_TYP **)calloc(0, sizeof(bravais_TYP *));211212/* lade Datenbank */213dim = R->dim - 1;214database = load_database(DATABASE_NAME, dim);215216/* berechne den Namen */217Name = name_fct(R, database);218inv = mat_inv(Name.trafo);219220for (i = 0; i < database->nr; i++){221if (database->entry[i].order > Name.order &&222database->entry[i].order % Name.order == 0){223sprintf(pfad,"%s/tables/qcatalog/dim%d/dir.%s/ordnung.%d/%s/",224TOPDIR, dim, database->entry[i].symbol,225database->entry[i].order, database->entry[i].discriminant);226227tmp = get_supergr(pfad, database->entry[i].abbreviation, Name,228&no, database->entry[i].affine, database, inv);229230if (no > 0){231Super = (bravais_TYP **)realloc(Super, (anzahl[0] + no) * sizeof(bravais_TYP *));232for (j = 0; j < no; j++){233Super[anzahl[0] + j] = tmp[j];234tmp[j] = NULL;235}236free(tmp);237anzahl[0] += no;238}239}240}241242243/* clean */244free_database (database);245free_mat(inv);246free_CARATname_TYP(Name);247248return(Super);249}250251252253254255256257258259260261262263264265