commit 0a16ed9629969d838b22a0eb9e89630cf7140f81
parent b1fc91dd6271e484ccf8caf41d3abb9cc92e98e8
Author: Bakar Chargeishvili <bakar@bcharge.de>
Date: Wed, 16 Feb 2022 16:59:13 +0100
Initial import
Diffstat:
A | .gitignore | | | 55 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | LICENSE | | | 29 | +++++++++++++++++++++++++++++ |
A | Makefile | | | 51 | +++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | config.def.h | | | 1 | + |
A | config.mk | | | 25 | +++++++++++++++++++++++++ |
A | util.c | | | 30 | ++++++++++++++++++++++++++++++ |
A | util.h | | | 14 | ++++++++++++++ |
A | webs.c | | | 178 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
8 files changed, 383 insertions(+), 0 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1,55 @@
+# Prerequisites
+*.d
+
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Linker output
+*.ilk
+*.map
+*.exp
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
+# Debug files
+*.dSYM/
+*.su
+*.idb
+*.pdb
+
+# Kernel Module Compile Results
+*.mod*
+*.cmd
+.tmp_versions/
+modules.order
+Module.symvers
+Mkfile.old
+dkms.conf
+
+# Main binary of this project
+WilsonWebs
diff --git a/LICENSE b/LICENSE
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2021, Bakar Chargeishvili
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Makefile b/Makefile
@@ -0,0 +1,51 @@
+# WilsonWebs - Generate n-Loop Wilson webs
+# See LICENSE file for copyright and license details.
+
+include config.mk
+
+SRC = webs.c util.c
+OBJ = ${SRC:.c=.o}
+
+all: options webs
+
+options:
+ @echo WilsonWebs build options:
+ @echo "CFLAGS = ${CFLAGS}"
+ @echo "LDFLAGS = ${LDFLAGS}"
+ @echo "CC = ${CC}"
+
+.c.o:
+ ${CC} -c ${CFLAGS} $<
+
+${OBJ}: config.mk
+
+config.h:
+ cp config.def.h $@
+
+webs: ${OBJ}
+ ${CC} -o WilsonWebs ${OBJ} ${LDFLAGS}
+
+clean:
+ rm -f WilsonWebs ${OBJ}
+
+dist: clean
+ mkdir -p WilsonWebs-${VERSION}
+ cp -R LICENSE Makefile README config.def.h config.mk\
+ WilsonWebs.1 WilsonWebs.h util.h ${SRC} WilsonWebs-${VERSION}
+ tar -cf WilsonWebs-${VERSION}.tar WilsonWebs-${VERSION}
+ gzip WilsonWebs-${VERSION}.tar
+ rm -rf WilsonWebs-${VERSION}
+
+install: all
+ mkdir -p ${DESTDIR}${PREFIX}/bin
+ cp -f WilsonWebs ${DESTDIR}${PREFIX}/bin
+ chmod 755 ${DESTDIR}${PREFIX}/bin/WilsonWebs
+ mkdir -p ${DESTDIR}${MANPREFIX}/man1
+ sed "s/VERSION/${VERSION}/g" < WilsonWebs.1 > ${DESTDIR}${MANPREFIX}/man1/WilsonWebs.1
+ chmod 644 ${DESTDIR}${MANPREFIX}/man1/WilsonWebs.1
+
+uninstall:
+ rm -f ${DESTDIR}${PREFIX}/bin/WilsonWebs\
+ ${DESTDIR}${MANPREFIX}/man1/WilsonWebs.1
+
+.PHONY: all options clean dist install uninstall
diff --git a/config.def.h b/config.def.h
@@ -0,0 +1 @@
+/* See LICENSE file for copyright and license details. */
diff --git a/config.mk b/config.mk
@@ -0,0 +1,25 @@
+# WilsonWebs version
+VERSION = 0.1
+
+# Customize below to fit your system
+
+# paths
+PREFIX = /usr/local
+MANPREFIX = ${PREFIX}/share/man
+
+# includes and libs
+INCS =
+LIBS =
+
+# flags
+CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\"
+#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
+CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
+LDFLAGS = ${LIBS}
+
+# Solaris
+#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
+#LDFLAGS = ${LIBS}
+
+# compiler and linker
+CC = cc
diff --git a/util.c b/util.c
@@ -0,0 +1,30 @@
+/* See LICENSE file for copyright and license details. */
+#include "util.h"
+
+void* ecalloc(size_t nmemb, size_t size)
+{
+ void *p;
+
+ if (!(p = calloc(nmemb, size)))
+ die("calloc:");
+ return p;
+}
+
+void die(const char *fmt, ...) {
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+
+ if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
+ fputc(' ', stderr);
+ perror(NULL);
+ } else {
+ fputc('\n', stderr);
+ }
+
+ exit(1);
+}
+
+
diff --git a/util.h b/util.h
@@ -0,0 +1,14 @@
+/* See LICENSE file for copyright and license details. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define MAX(A, B) ((A) > (B) ? (A) : (B))
+#define MIN(A, B) ((A) < (B) ? (A) : (B))
+#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
+#define NELEMS(A) (sizeof(A) / sizeof((A)[0]))
+
+void die(const char *fmt, ...);
+void *ecalloc(size_t nmemb, size_t size);
diff --git a/webs.c b/webs.c
@@ -0,0 +1,178 @@
+/* See LICENSE file for copyright and license details. */
+#include <stdio.h>
+#include <string.h>
+
+#include "util.h"
+
+typedef struct {
+ char *name;
+ int init;
+ unsigned int id;
+ int isMassive;
+ int isGluon;
+} Leg;
+
+typedef struct {
+ unsigned int legId;
+ unsigned int id;
+} Vertex;
+
+typedef struct {
+ Vertex emitter;
+ Vertex absorber;
+} Link;
+
+void
+generate_legs(char **init, size_t n_init, char **fin, size_t n_fin, Leg *Legs)
+{
+ for (int i=0; i<n_init; ++i) {
+ int isGluon = 0;
+ if (!strcmp("g", init[i]))
+ isGluon = 1;
+ Legs[i] = (Leg){init[i], 1, i, 0, isGluon};
+ }
+
+ for (int i=0; i<n_fin; ++i) {
+ int isGluon = 0;
+ if (!strcmp("g", fin[i]))
+ isGluon = 1;
+ Legs[n_init+i] = (Leg){init[i], 1, n_init+i, 0, isGluon};
+ }
+}
+
+void
+generate_vertices(Leg *Legs, size_t nLegs, int nLoops, Vertex *Vertices)
+{
+ for (int i=0; i<nLegs; ++i) {
+ for (int j=0; j<nLoops; ++j) {
+ /* TODO: Don't forget to add vertices for self-energies later */
+ Vertices[j+nLoops*i] = (Vertex){i, j+nLoops*i};
+ }
+ }
+
+ /*
+ for (int i = 0; i < nLegs*nLoops; ++i) {
+ printf("test %d\n", Vertices[i].legId);
+ }
+ */
+}
+
+void
+generate_loops(Vertex *Vertices, int *deletedVertices, Link *Graphs, size_t nVx, int nLoops, int nGenLoops)
+{
+ /* Find the first non-deleted vertex */
+ int mVx = -1;
+ for (int iVx=0; iVx<nVx; ++iVx) {
+ if (!deletedVertices[iVx]) {
+ mVx = iVx;
+ break;
+ }
+ }
+ printf("mVx %d\n", mVx);
+
+ Vertex *AllPossConns = (Vertex *)ecalloc(nVx, sizeof(Vertex));
+ size_t nConns = 0;
+ for (int iVx=mVx; iVx<nVx; ++iVx) {
+ if (!deletedVertices[iVx] && Vertices[iVx].legId != Vertices[mVx].legId) {
+ AllPossConns[nConns++] = Vertices[iVx];
+ }
+ }
+
+ if (nConns == 0 || mVx == -1) {
+ free(deletedVertices);
+ printf("End rec");
+ return;
+ }
+
+ /* We build the connections here */
+ static int iGraph = 0;
+ for (int iVx = 0; iVx < nConns; ++iVx) {
+ if (!nGenLoops)
+ printf("yess");
+ Graphs[iGraph*nLoops+nGenLoops] = (Link){Vertices[mVx], AllPossConns[iVx]};
+ printf("V%d%d - V%d%d\n", Vertices[mVx].legId, Vertices[mVx].id, AllPossConns[iVx].legId, AllPossConns[iVx].id);
+ /* Gluon connection introduces new vertices.
+ * Gluon legId = (emitter legId + 100)
+ */
+
+ /*
+ for (int i = 0; i < nLoops-nGenLoops; ++i) {
+ AllPossConns[i] = (Vertex){Vertices[mVx].legId+100,i}
+ }
+ */
+
+ deletedVertices[mVx] = 1;
+ deletedVertices[AllPossConns[iVx].id] = 1;
+ nGenLoops++;
+ if(nGenLoops < nLoops) {
+ int *deletedCopy = (int *)ecalloc(nVx, sizeof(int));
+ deletedCopy[mVx] = 1;
+ deletedCopy[AllPossConns[iVx].id] = 1;
+ generate_loops(Vertices, deletedCopy, Graphs, nVx, nLoops, nGenLoops);
+ }
+ else if (nGenLoops == nLoops) {
+ iGraph++;
+ }
+ nGenLoops--;
+ }
+ free(AllPossConns);
+
+ /*
+ for (int iVx=mVx+1; iVx<nVx; ++iVx)
+ deletedVertices[iVx] = 0;
+ */
+ /*
+ printf("%d\n", nConns);
+ printf("%d\n", deletedVertices[mVx-1]);
+ printf("%d\n", deletedVertices[mVx]);
+ printf("%d\n", deletedVertices[mVx+1]);
+ */
+
+ generate_loops(Vertices, deletedVertices, Graphs, nVx, nLoops, nGenLoops);
+
+ //memmove(&AllPossVertices[0], &Vertices[1], (n_vx - 1) * sizeof(Vertex));
+
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ if (argc == 2 && !strcmp("-v", argv[1]))
+ die("WilsonWebs-"VERSION);
+ else if (argc != 1)
+ die("usage: webs [-v]");
+
+ char *initial[] = {"g","g"};
+ char *final[] = {"q","qbar", "g"};
+
+ int nLoops = 2;
+
+ size_t nLegs = NELEMS(initial) + NELEMS(final);
+ Leg Legs[nLegs];
+ generate_legs(initial,NELEMS(initial), final, NELEMS(final), Legs);
+
+ Vertex *Vertices = (Vertex *)ecalloc(nLoops*nLegs, sizeof(Vertex));
+ generate_vertices(Legs, nLegs, nLoops, Vertices);
+
+ printf("%d\n",Vertices[0].legId);
+ printf("%d\n",Vertices[1].legId);
+
+ size_t nVx = nLegs*nLoops;
+ int *deletedVertices = (int *)ecalloc(nVx, sizeof(int));
+ Link *Graphs = (Link *)ecalloc(300*nLoops, sizeof(Link));
+
+ generate_loops(Vertices, deletedVertices, Graphs, nVx, nLoops, 0);
+
+ for (int iVx=0; iVx<300; ++iVx) {
+ printf("Graph ID: %d\n",iVx);
+ for (int i=0; i<nLoops; ++i) {
+ printf("V%d%d-V%d%d\n",Graphs[iVx*nLoops+i].emitter.legId, Graphs[iVx*nLoops+i].emitter.id, Graphs[iVx*nLoops+i].absorber.legId, Graphs[iVx*nLoops+i].absorber.id);
+ }
+ }
+
+ //draw(Legs, Connections);
+
+
+ return 0;
+}