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 <presentation.h>5#include <tsubgroups.h>6#include <name.h>78#define DATABASE_NAME TOPDIR "/tables/qcatalog/data"910111213/* ---------------------------------------------------------------------- */14/* Berechne die maximalen t-Untergruppen einer Raumgruppe */15/* bis auf Konjugation unter der Raumgruppe unter Zuhilfename der */16/* Datenbank. */17/* ---------------------------------------------------------------------- */18/* R: Raumgruppe in Standard affiner Form ohne Translationen */19/* aflag: berechne Untergruppen bis auf Konjugation unter dem affinen */20/* Normalisator */21/* anzahl: speichere die Anzahl der Untergruppen hier */22/* ---------------------------------------------------------------------- */23TSubgroup_TYP **tsubgroup_db(bravais_TYP *R,24boolean aflag,25int *anzahl)26{27CARATname_TYP Name;2829TSubgroup_TYP **sbg;3031bravais_TYP *Rstd, *Rinv;3233matrix_TYP **mat, *tmp, *inv;3435database *database;3637char pfad[1024];3839int i, k, dim, found = 0, j;40414243/* berechne den Namen */44dim = R->dim - 1;45database = load_database(DATABASE_NAME, dim);46Name = name_fct(R, database);474849/* suche Pfad (wird schon in name_fct bzw. deren Unterfunktionen50im Prinzip berechnet, koennte man da abspeichern) */51i = 0;52while (!found && i<database->nr ){53found = (strcmp(database->entry[i].abbreviation, Name.qname) == 0);54i++;55}5657if (found){58i--;59sprintf(pfad,"%s/tables/qcatalog/dim%d/dir.%s/ordnung.%d/%s/",60TOPDIR, dim, database->entry[i].symbol,61database->entry[i].order, database->entry[i].discriminant);6263Rstd = get_std_rep(pfad, Name);6465mat = get_words(pfad, Name, database->entry[i].affine, aflag, anzahl);6667sbg = (TSubgroup_TYP **)calloc(anzahl[0], sizeof(TSubgroup_TYP *));6869/* Nur die triviale Raumgruppe ist maximale Untergruppe! */70if (anzahl[0] == 1 && mat[0]->rows == 1){71sbg = (TSubgroup_TYP **)calloc(anzahl[0], sizeof(TSubgroup_TYP *));72sbg[0] = (TSubgroup_TYP *)calloc(1, sizeof(TSubgroup_TYP));7374sbg[0]->R = init_bravais(R->dim);75sbg[0]->R->gen = (matrix_TYP **)calloc(1, sizeof(matrix_TYP *));76sbg[0]->R->gen_no = 1;77sbg[0]->R->gen[0] = init_mat(R->dim, R->dim, "1");78sbg[0]->orbitlength = 1;79sbg[0]->pointgrouporder = 1;8081sbg[0]->P = init_bravais(R->dim - 1);82sbg[0]->P->gen = (matrix_TYP **)calloc(1, sizeof(matrix_TYP *));83sbg[0]->P->gen_no = 1;84sbg[0]->P->gen[0] = init_mat(R->dim - 1, R->dim - 1, "1");85}86else{87inv = mat_inv(Name.trafo);88Rinv = init_bravais(Rstd->dim);89Rinv->gen_no = Rstd->gen_no;90Rinv->gen = (matrix_TYP **)calloc(Rstd->gen_no, sizeof(bravais_TYP *));91for (k = 0; k < Rstd->gen_no; k++){92Rinv->gen[k] = mat_inv(Rstd->gen[k]);93}94for (k = 0; k < anzahl[0]; k++){95sbg[k] = ite_gruppe(Rstd, NULL, Rinv, NULL, mat[k], FALSE);96for (j = 0; j < sbg[k]->R->gen_no; j++){97tmp = mat_kon(Name.trafo, sbg[k]->R->gen[j], inv);98free_mat(sbg[k]->R->gen[j]);99sbg[k]->R->gen[j] = tmp;100tmp = NULL;101}102}103free_mat(inv);104free_bravais(Rinv);105}106107if (mat){108for (k = 0; k < anzahl[0]; k++)109free_mat(mat[k]);110free(mat);111}112113free_bravais(Rstd);114}115else{116fprintf(stderr, "ERROR in tsubgroup_db!\n");117exit(77);118}119120/* clean */121free_database (database);122free_CARATname_TYP(Name);123124return(sbg);125}126127128129130131132133134135136137138139140141