How can I visualize new minimal surfaces given by Weierstrass data with GRAPE?

As an example we are going to explain how you can visualize Gackstatter's surface.
The Weierstrass data G (Gauss map) and dh (differential of the height-function) are given in a chart p, i.e. G = G(p) and dh = k(p)dp.

In this case p is the geometric normalised Weierstrass p-function, which is defined on a squared torus (see H. Karcher: Construction of Minimal Surfaces, Vorlesungsreihe Nr. 12, Bonn, 1989) and k = 1. Of course, you only have to compute the fundamental domain of the surface you want to visualisize, so you have to find out what part of the Riemann surface (in our case an eights of the squared torus) is to be mapped into the three dimensional euclidian space.

The Weierstrass data of Gackstatter's surface are:
G = sqrt (2p * 0.72948 / (1+2p-p*p)),
dh = dp.

For surface computing the function f (defined as f = k/g) is used to avoid problems with the zeros of G. In this example G is called gack1_g and f is called gack1_f.

Therefore the file arg_weier.c which contains the Weierstrass data and the parametrisation looks like that:


#include
#include "complex.h"
#include "arg_weier.h"

extern COMPLEX (*INTEGRATE) ANSI_PARM((COMPLEX (*)(COMPLEX), COMPLEX, COMPLEX));

static double konst;

COMPLEX my_get_arg(AMANDUS *amandus, int part, double u, double v)
{
TIME_PARM *surf;
COMPLEX z;

if(amandus->class != Amandus)
return cmplx(u, v);

surf = amandus->time_parm;

if (!strcmp(amandus->name, "gack1")) {
konst = surf->double_parm[0];
INTEGRATE = &integrate;

if (part == 1)
u = exp(u-1.);
z = cmplx(u * cos(v), u * sin(v));
if((z.y < .0001)&&(fabs(z.x-1.) < .0001)) {
INTEGRATE = &integrate2;
printf("p-Verzweigungspunkt z = (z.x| z.y)\n", z.x, z.y);
}
return z;
}
ASSURE(0, "my_get_arg: unknown surface", return(CZERO));
}

EXPLICIT *explicit_set_compute_arg(void)
{
EXPLICIT *explicit;

explicit = (EXPLICIT *)START_METHOD(G_INSTANCE);
ASSURE(explicit, "", END_METHOD(NULL));

explicit->compute_arg = my_get_arg;

END_METHOD(explicit);
}

static COMPLEX gack1_g(COMPLEX z)
{
COMPLEX w;
w = crmul(z, konst);
w = cdiv(w, cradd(cneg(csquare(z)), 1.));
w = csqrt(w);
return w;
}

static COMPLEX gack1_f(COMPLEX z)
{
COMPLEX w;
w = crmul(z, konst);
w = cdiv(cradd(cneg(csquare(z)), 1.), w);
w = csqrt(w);
return w;
}

AMANDUS *amandus_set_weier_f(void)
{
AMANDUS *amandus;

ASSURE(amandus = (AMANDUS *)START_METHOD(G_INSTANCE),
"",
END_METHOD(NULL));

if(!strcmp(amandus->name, "gack1")) {
amandus->weier_f.g = gack1_g;
amandus->weier_f.dh = gack1_f;
}

END_METHOD(amandus);
}


Return to the introduction.
Return to the project list.
Go back to the main menu.
grape@iam.uni-bonn.de