GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#include "typedef.h"12#include "matrix.h"3#include"getput.h"4#include"datei.h"5#include"longtools.h"67/**************************************************************************\8@---------------------------------------------------------------------------9@---------------------------------------------------------------------------10@ FILE: read_symbol.c11@---------------------------------------------------------------------------12@---------------------------------------------------------------------------13@14\**************************************************************************/15static void clear(merk)16char *merk;17{18int i, k;19k = strlen(merk);20for(i=0; i<k; i++)21merk[i] = '\0';22}232425/**************************************************************************\26@---------------------------------------------------------------------------27@ symbol_out *read_symbol(file_name)28@ char *file_name;29@30@ reads the symbol for the Crystal-fammily used in the 'Datei' programm31@ and constructs the first almost decomposable group by reading the32@ atoms from the libary.33@---------------------------------------------------------------------------34@35\**************************************************************************/36symbol_out *read_symbol(file_name)37char *file_name;3839{40char string[80],41slash, *str ;42char f[80];43/* changed from "static char fn[80]" to switch away from static variables */44char *fn;45char *dat;46FILE *infile;47int i, j, k, l, m, n, p, q, x, groesser;48int no;49int breite;50char merk[15];51char merk1[10];52int index;53char konst[MAXDIM][80];54int konst_dim;55int komp[MAXDIM];56int artgleich[MAXDIM];57int dim = 0, konstit = 0;58int zerleg[MAXDIM][5];59bravais_TYP **grps;60symbol_out *erg;61matrix_TYP *In;6263/* it is assumed that string contains a 0-string, all not all64compiler will asure that (inserted 24/4/97 tilman) */65for (i=0;i<80;i++) string[i] = 0;6667/* inserted to switch away from static variables */68fn = (char *) calloc(80,sizeof(char));6970/*------------------------------------------------------------*\71| Open input file |72\*------------------------------------------------------------*/73if ( file_name == NULL )74infile = stdin;75else76if ( (infile = fopen (file_name, "r")) == NULL ) {77fprintf (stderr, "read_symbol: Could not open input-file %s\n", file_name);78exit (4);79}80/*------------------------------------------------------------*\81| Read and scan header line |82\*------------------------------------------------------------*/83for( i=0; i<MAXDIM; i++)84komp[i] = 0;85for(i=0; i<MAXDIM; i++)86for(j=0; j<5;j++)87zerleg[i][j] = 0;88printf("Please input the symbol for the crystal-family: ");89fscanf (infile, "%[ \t\n]", string);90fscanf (infile, "%[^\n]",string);91strtok (string, "%");9293right_order(string);9495printf("%s\n",string);9697str = string;98while( strlen(str) != 0)99{100i = strcspn(str, ";,");101if(i>0)102{103sscanf(str, "%d", &konst_dim);104dim += konst_dim;105if(dim > MAXDIM)106{107printf("dimension of a.d. bravais-group is to big\n");108exit(3);109}110zerleg[konstit][0] = konst_dim;111itoa(konst_dim, konst[konstit]);112k = strcspn(str, ";");113if(k == i)114zerleg[konstit][3] = 1;115j = strcspn(str, "-");116l = strcspn(str, "'");117if(j<i)118{119strcat(konst[konstit], "-");120str = str+j+1;121sscanf(str, "%d", &index);122zerleg[konstit][1] = index;123itoa(index, merk);124strcat(konst[konstit], merk);125clear(merk);126if(l<i)127{128strcat(konst[konstit], "'");129zerleg[konstit][2] = 1;130}131i = i-j-1;132}133konstit++;134}135str = str+i+1;136}137138/*------------------------------------------------------------*\139| Close input file |140\*------------------------------------------------------------*/141if ( infile != stdin )142fclose (infile);143144erg = (symbol_out *) malloc(sizeof(symbol_out));145erg->grp = (bravais_TYP *) calloc(1, sizeof(bravais_TYP));146erg->grp->dim = dim;147148/*--------------------------------------------------------------------*\149| swap the atoms into the right order |150\*--------------------------------------------------------------------*/151for(i=0; i<MAXDIM-1; i++)152{153if(zerleg[i][0] != zerleg[i+1][0] || zerleg[i][1] != zerleg[i+1][1] || zerleg[i][2] != zerleg[i+1][2])154zerleg[i][3] = 1;155}156if(zerleg[MAXDIM-1][0] != 0)157zerleg[MAXDIM-1][3] = 1;158i=0;159while(i<MAXDIM)160{161while( i< MAXDIM && zerleg[i][0] == 0)162i++;163k = 1;164while(i<MAXDIM && zerleg[i][3] == 0 && zerleg[i][0] != 0)165{ i++; k++;}166if(i != MAXDIM)167zerleg[i][4] = k;168i++;169}170for(i=0; i<MAXDIM; i++)171{172for(j=i+1; j<MAXDIM; j++)173{174groesser = 1;175if(zerleg[i][4] == 0 && zerleg[j][4] != 0)176groesser = 0;177for(k=0; k<3 && zerleg[j][k] == zerleg[i][k]; k++);178if(k == 0 && zerleg[i][k] < zerleg[j][k])179groesser = 0;180if(k == 1 && zerleg[i][1] > zerleg[j][1])181groesser = 0;182if(k == 2 && zerleg[i][2] < zerleg[j][2])183groesser = 0;184if(k == 3 && zerleg[i][4] < zerleg[j][4])185groesser = 0;186if(groesser == 0)187{188for(k=0; k<5; k++)189{190x = zerleg[i][k]; zerleg[i][k] = zerleg[j][k]; zerleg[j][k] = x;191}192}193}194}195/************************196for(i=0; i<konstit; i++)197{198for(j=0; j<5; j++)199printf("%d ", zerleg[i][j]);200printf("\n");201}202*************************/203204konstit = 0;205for(i=0; i<MAXDIM; i++)206{207if(zerleg[i][4] != 0)208{209itoa(zerleg[i][0], konst[konstit]);210if(zerleg[i][1] != 0)211{212strcat(konst[konstit], "-");213itoa(zerleg[i][1], merk);214strcat(konst[konstit], merk);215clear(merk);216if(zerleg[i][2] != 0)217strcat(konst[konstit], "\'");218}219konstit++;220}221}222223/*--------------------------------------------------------------------*\224| read the atoms |225\*--------------------------------------------------------------------*/226grps = (bravais_TYP **) malloc(konstit *sizeof(bravais_TYP *));227dat = ATOMS;228/**************229dat = TOPDIR "/lib/atoms/";230f = (char **) malloc(konstit *sizeof(char *));231***************/232for(i=0; i<konstit; i++)233{234strcpy(f, dat);235itoa(zerleg[i][0], merk);236strcat(f, merk);237if(zerleg[i][1] != 0)238{239strcat(f, "-");240itoa(zerleg[i][1], merk);241strcat(f, merk);242clear(merk);243}244if(zerleg[i][2] != 0)245{246strcat(f, "\'");247}248/* fprintf(stderr,"file-name: %s\n",f); */249grps[i] = get_bravais(f);250for(j=0; j<grps[i]->form_no; j++)251Check_mat(grps[i]->form[j]);252}253254/*--------------------------------------------------------------------*\255| calculate the generators of erg->grp |256\*--------------------------------------------------------------------*/257erg->grp->gen_no = 0;258erg->grp->form_no = 0;259erg->grp->zentr_no = 0;260erg->grp->normal_no = 0;261for(i=0; i<konstit; i++)262erg->grp->gen_no += grps[i]->gen_no;263erg->grp->gen = (matrix_TYP **)malloc(erg->grp->gen_no *sizeof(matrix_TYP));264for(i=0; i<erg->grp->gen_no; i++)265erg->grp->gen[i] = init_mat(erg->grp->dim, erg->grp->dim, "");266j=0;267p=0;268for(i=0; i<konstit; i++)269{270for(k=0; k<grps[i]->gen_no; k++)271{272for(l=0; l<zerleg[i][4] * grps[i]->dim; l += grps[i]->dim)273{274for(m=0; m<grps[i]->dim; m++)275for(n=0; n<grps[i]->dim; n++)276erg->grp->gen[p+k]->array.SZ[j+l+m][j+l+n]=grps[i]->gen[k]->array.SZ[m][n];277}278for(m=0; m<j; m++)279erg->grp->gen[p+k]->array.SZ[m][m] = 1;280for(m=( j + zerleg[i][4] * grps[i]->dim); m<erg->grp->dim; m++)281erg->grp->gen[p+k]->array.SZ[m][m] = 1;282}283j = j + zerleg[i][4] * grps[i]->dim;284p = p + grps[i]->gen_no;285}286287/*--------------------------------------------------------------------*\288| calculate the invariant forms of erg->grp |289\*--------------------------------------------------------------------*/290for(i=0; i<konstit; i++)291{292for(j=0; j<grps[i]->form_no; j++)293{294if(grps[i]->form[j]->flags.Symmetric == TRUE)295erg->grp->form_no += (zerleg[i][4] * (zerleg[i][4] +1)/2);296if(grps[i]->form[j]->flags.Symmetric == FALSE)297erg->grp->form_no += (zerleg[i][4] * (zerleg[i][4] -1)/2);298}299}300erg->grp->form = (matrix_TYP **)malloc(erg->grp->form_no *sizeof(matrix_TYP *));301for(i=0; i<erg->grp->form_no; i++)302erg->grp->form[i] = init_mat(erg->grp->dim, erg->grp->dim, "");303j=0;304q=0;305for(i=0; i<konstit; i++)306{307for(k=0; k<grps[i]->form_no; k++)308{309for(l=j; l< j+zerleg[i][4] * grps[i]->dim; l += grps[i]->dim)310{311if(grps[i]->form[k]->flags.Symmetric == TRUE)312{313for(n=0; n<grps[i]->dim; n++)314{315for(p=0; p<grps[i]->dim; p++)316{317erg->grp->form[q]->array.SZ[l+n][l+p] = grps[i]->form[k]->array.SZ[n][p];318}319}320q++;321}322for(m=(l+grps[i]->dim); m<(j+zerleg[i][4] * grps[i]->dim); m +=grps[i]->dim)323{324for(n=0; n<grps[i]->dim; n++)325{326for(p=0; p<grps[i]->dim; p++)327{328erg->grp->form[q]->array.SZ[l+n][m+p] = grps[i]->form[k]->array.SZ[n][p];329erg->grp->form[q]->array.SZ[m+p][l+n] = grps[i]->form[k]->array.SZ[n][p];330}331}332q++;333}334}335}336j = j + zerleg[i][4] * grps[i]->dim;337}338/* inserted 06/05/97 tilman: assure that the full integral lattice is passed */339long_rein_formspace(erg->grp->form,erg->grp->form_no,1);340341/*--------------------------------------------------------------------*\342| calculate the centralizer of the group |343\*--------------------------------------------------------------------*/344for(i=0; i<konstit; i++)345{346erg->grp->cen_no = erg->grp->cen_no + grps[i]->cen_no;347if(zerleg[i][4] >= 2)348erg->grp->cen_no = erg->grp->cen_no + grps[i]->zentr_no + 1;349if(zerleg[i][4] > 2)350erg->grp->cen_no ++;351}352erg->grp->cen = (matrix_TYP **)malloc(erg->grp->cen_no *sizeof(matrix_TYP));353for(i=0; i<erg->grp->cen_no; i++)354erg->grp->cen[i] = init_mat(erg->grp->dim, erg->grp->dim, "");355j=0;356no = 0;357for(i=0; i<konstit; i++)358{359for(k=0; k<grps[i]->cen_no; k++)360{361for(l=0; l<j; l++)362erg->grp->cen[no]->array.SZ[l][l] = 1;363for(l=j+grps[i]->dim; l<erg->grp->dim; l++)364erg->grp->cen[no]->array.SZ[l][l] = 1;365for(l=0; l<grps[i]->dim; l++)366for(m=0; m<grps[i]->dim; m++)367erg->grp->cen[no]->array.SZ[j+l][j+m] = grps[i]->cen[k]->array.SZ[l][m];368no++;369}370if(zerleg[i][4] >=2)371{372for(k=0; k<grps[i]->zentr_no; k++)373{374for(l=0; l<j; l++)375erg->grp->cen[no]->array.SZ[l][l] = 1;376for(l=j; l<j+grps[i]->dim; l++)377erg->grp->cen[no]->array.SZ[l][l] = -1;378for(l=j+grps[i]->dim; l<erg->grp->dim; l++)379erg->grp->cen[no]->array.SZ[l][l] = 1;380for(l=0; l<grps[i]->dim; l++)381for(m=0; m<grps[i]->dim; m++)382erg->grp->cen[no]->array.SZ[j+l+grps[i]->dim][j+m] = grps[i]->zentr[k]->array.SZ[l][m];383no++;384}385for(l=0; l<j; l++)386erg->grp->cen[no]->array.SZ[l][l] = 1;387for(l=j+(2 * grps[i]->dim); l<erg->grp->dim; l++)388erg->grp->cen[no]->array.SZ[l][l] = 1;389for(l=0; l<grps[i]->dim; l++)390{391erg->grp->cen[no]->array.SZ[j+l+grps[i]->dim][j+l] = 1;392erg->grp->cen[no]->array.SZ[j+l][j+l+grps[i]->dim] = 1;393}394no++;395}396if(zerleg[i][4] > 2)397{398for(l=0; l<j; l++)399erg->grp->cen[no]->array.SZ[l][l] = 1;400for(l=j+(zerleg[i][4] * grps[i]->dim); l<erg->grp->dim; l++)401erg->grp->cen[no]->array.SZ[l][l] = 1;402for(l=0; l< ((zerleg[i][4] -1) * grps[i]->dim); l++)403erg->grp->cen[no]->array.SZ[l+j+grps[i]->dim][l+j] = 1;404for(l=0; l<grps[i]->dim; l++)405erg->grp->cen[no]->array.SZ[j+l][l+j+((zerleg[i][4]-1) * grps[i]->dim)] = 1;406no++;407}408409j = j + zerleg[i][4] * grps[i]->dim;410}411412/*--------------------------------------------------------------------*\413| calculate the normalizer of the group |414\*--------------------------------------------------------------------*/415416for(i=0; i<konstit; i++)417{418artgleich[i] = 0;419erg->grp->normal_no += grps[i]->normal_no;420if(i+1 < konstit)421{422if(zerleg[i][0] == zerleg[i+1][0] && zerleg[i][1] == zerleg[i+1][1] &&423zerleg[i][2] == zerleg[i+1][2] && zerleg[i][3] == zerleg[i+1][3] &&424zerleg[i][4] == zerleg[i+1][4])425{426artgleich[i] = TRUE;427erg->grp->normal_no++;428}429}430}431erg->grp->normal = (matrix_TYP **)malloc(erg->grp->normal_no *sizeof(matrix_TYP));432for(i=0; i<erg->grp->normal_no; i++)433erg->grp->normal[i] = init_mat(erg->grp->dim, erg->grp->dim, "");434j=0;435no = 0;436for(i=0; i<konstit; i++)437{438for(k=0; k<grps[i]->normal_no; k++)439{440for(l=0; l<j;l++)441erg->grp->normal[no]->array.SZ[l][l] = 1;442for(l=(j+zerleg[i][4] * grps[i]->dim); l<erg->grp->dim; l++)443erg->grp->normal[no]->array.SZ[l][l] = 1;444for(l=j; l< (j+zerleg[i][4] * grps[i]->dim); l += grps[i]->dim)445{446for(m=0; m<grps[i]->dim; m++)447for(p=0; p<grps[i]->dim; p++)448erg->grp->normal[no]->array.SZ[m+l][p+l] = grps[i]->normal[k]->array.SZ[m][p];449}450no++;451}452if(artgleich[i] == TRUE)453{454breite = grps[i]->dim * zerleg[i][4];455for(l=0; l<j; l++)456erg->grp->normal[no]->array.SZ[l][l] = 1;457for(l=(j + 2 * breite); l<erg->grp->dim; l++)458erg->grp->normal[no]->array.SZ[l][l] = 1;459for(l=j; l< (j+breite); l++)460{461erg->grp->normal[no]->array.SZ[l][l+breite] = 1;462erg->grp->normal[no]->array.SZ[l+breite][l] = 1;463}464no++;465}466j = j + zerleg[i][4] * grps[i]->dim;467}468469/*--------------------------------------------------------------------*\470| if no additional normalizer or centraliser nessecarry, put identity |471\*--------------------------------------------------------------------*/472if(erg->grp->normal_no == 0 || erg->grp->cen_no == 0)473{474if(erg->grp->normal_no == 0)475{476erg->grp->normal_no = 1;477erg->grp->normal = (matrix_TYP **) malloc(1 *sizeof(matrix_TYP *));478erg->grp->normal[0] = einheitsmatrix(erg->grp->dim);479}480if(erg->grp->cen_no == 0)481{482erg->grp->cen_no = 1;483erg->grp->cen = (matrix_TYP **) malloc(1 *sizeof(matrix_TYP *));484erg->grp->cen[0] = einheitsmatrix(erg->grp->dim);485}486}487488/*--------------------------------------------------------------------*\489| calculate the order of erg->grp |490\*--------------------------------------------------------------------*/491for(j=0; j<100; j++)492erg->grp->divisors[j] = 0;493erg->grp->order = 1;494for(i=0; i<konstit; i++)495{496for(j=0; j<100; j++)497erg->grp->divisors[j] += grps[i]->divisors[j];498erg->grp->order *= grps[i]->order;499}500501/*--------------------------------------------------------------------*\502| find file where erg->grp->zentr are stored |503\*--------------------------------------------------------------------*/504strcpy(fn, TABLEDIM);505/*********************************506strcpy(fn, TOPDIR "/lib/dim");507*********************************/508itoa(erg->grp->dim, merk);509strcat(fn, merk);510strcat(fn, "/");511for(i=0; i<konstit; i++)512{513itoa(zerleg[i][0], merk);514if(zerleg[i][1] != 0)515{516strcat(merk, "-");517itoa(zerleg[i][1], merk1);518strcat(merk, merk1);519}520if(zerleg[i][2] != 0)521strcat(merk, "\'");522for(j=0; j<zerleg[i][4]; j++)523{524strcat(fn, merk);525if(j != (zerleg[i][4] -1))526strcat(fn, ",");527else528{529if(i!= (konstit -1))530strcat(fn, ";");531}532}533}534erg->fn = fn;535536/* printf("%s\n", erg->fn); */537538return(erg);539}540/*{{{}}}*/541542543