diff --git a/Adapt/Adapt.h b/Adapt/Adapt.h new file mode 100644 index 0000000000000000000000000000000000000000..93535a75d1280bff6c936c57980a3c17a049347c --- /dev/null +++ b/Adapt/Adapt.h @@ -0,0 +1,20 @@ +#ifndef _ADAPT_H_ +#define _ADAPT_H_ + +#define ADAPT_P1 1 +#define ADAPT_P2 2 +#define ADAPT_H1 3 +#define ADAPT_H2 4 + +double optimesh ( + int N, /* Nombre d'elements a traiter */ + int method, /* H1 , P1 , H2 ou P2 */ + int dim, /* 2 pour 2D et 3 pour 3D */ + double *err, /* erreurs elementaires */ + double *h, /* tailles de mailles elementaires */ + double *p, /* exposante elementaires */ + double e0, /* erreur prescrite par l'utilisateur */ + double N0 /* nbre d'elements ds le maillage opt */ + ); + +#endif diff --git a/Adapt/Makefile b/Adapt/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..11dde31017aa475a8601fb9e272415365a5d6be8 --- /dev/null +++ b/Adapt/Makefile @@ -0,0 +1,71 @@ +# +# Makefile for "libAdapt.a" +# + +.IGNORE: + +CC = c++ +C_FLAGS = -g + +OS_FLAGS = -D_UNIX + +RM = rm +RMFLAGS = -f +RANLIB = ranlib + +LIB = ../lib/libAdapt.a +INCLUDE = -I../Common -I../DataStr + +CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE) + +SRC = brent.cpp \ + mnbrak.cpp \ + nrutil.cpp \ + optimesh.cpp \ + dsvdcmp.cpp \ + newt.cpp \ + fmin.cpp \ + fdjac.cpp \ + lnsrch.cpp \ + lubksb.cpp \ + ludcmp.cpp + +OBJ = $(SRC:.cpp=.o) + +.SUFFIXES: .o .cpp + +$(LIB): $(OBJ) + ar ruvs $(LIB) $(OBJ) + $(RANLIB) $(LIB) + +.cpp.o: + $(CC) $(CFLAGS) -c $< + +clean: + $(RM) $(RMFLAGS) *.o + +lint: + $(LINT) $(CFLAGS) $(SRC) + +depend: + (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ + $(CC) -MM $(CFLAGS) ${SRC} \ + ) >Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) $(RMFLAGS) Makefile.new + +# DO NOT DELETE THIS LINE +brent.o: brent.cpp nrutil.h ../Common/Const.h +mnbrak.o: mnbrak.cpp nrutil.h ../Common/Const.h +nrutil.o: nrutil.cpp +optimesh.o: optimesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h Adapt.h nrutil.h ../Common/Const.h +dsvdcmp.o: dsvdcmp.cpp nrutil.h ../Common/Const.h +newt.o: newt.cpp nrutil.h ../Common/Const.h +fmin.o: fmin.cpp nrutil.h ../Common/Const.h +fdjac.o: fdjac.cpp nrutil.h ../Common/Const.h +lnsrch.o: lnsrch.cpp nrutil.h ../Common/Const.h +lubksb.o: lubksb.cpp +ludcmp.o: ludcmp.cpp nrutil.h ../Common/Const.h diff --git a/Adapt/brent.cpp b/Adapt/brent.cpp new file mode 100644 index 0000000000000000000000000000000000000000..63adc4bc809253719e23e47872146417ccac8127 --- /dev/null +++ b/Adapt/brent.cpp @@ -0,0 +1,98 @@ + + +#include <math.h> +#define NRANSI +#include "nrutil.h" +#define ITMAX 100 +#define CGOLD 0.3819660 +#define ZEPS 1.0e-10 +#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d); + +double +brent (double ax, double bx, double cx, double (*f) (double), double tol, + double *xmin) +{ + int iter; + double a, b, d=0.0, etemp, fu, fv, fw, fx, p, q, r, tol1, tol2, u, v, w, + x, xm; + double e = 0.0; + + a = (ax < cx ? ax : cx); + b = (ax > cx ? ax : cx); + x = w = v = bx; + fw = fv = fx = (*f) (x); + for (iter = 1; iter <= ITMAX; iter++) + { + xm = 0.5 * (a + b); + tol2 = 2.0 * (tol1 = tol * fabs (x) + ZEPS); + if (fabs (x - xm) <= (tol2 - 0.5 * (b - a))) + { + *xmin = x; + return fx; + } + if (fabs (e) > tol1) + { + r = (x - w) * (fx - fv); + q = (x - v) * (fx - fw); + p = (x - v) * q - (x - w) * r; + q = 2.0 * (q - r); + if (q > 0.0) + p = -p; + q = fabs (q); + etemp = e; + e = d; + if (fabs (p) >= fabs (0.5 * q * etemp) || p <= q * (a - x) || p >= q * (b - x)) + d = CGOLD * (e = (x >= xm ? a - x : b - x)); + else + { + d = p / q; + u = x + d; + if (u - a < tol2 || b - u < tol2) + d = SIGN (tol1, xm - x); + } + } + else + { + d = CGOLD * (e = (x >= xm ? a - x : b - x)); + } + u = (fabs (d) >= tol1 ? x + d : x + SIGN (tol1, d)); + fu = (*f) (u); + if (fu <= fx) + { + if (u >= x) + a = x; + else + b = x; + SHFT (v, w, x, u) + SHFT (fv, fw, fx, fu) + } + else + { + if (u < x) + a = u; + else + b = u; + if (fu <= fw || w == x) + { + v = w; + w = u; + fv = fw; + fw = fu; + } + else if (fu <= fv || v == x || v == w) + { + v = u; + fv = fu; + } + } + } + nrerror ("Too many iterations in brent"); + *xmin = x; + return fx; +} +#undef ITMAX +#undef CGOLD +#undef ZEPS +#undef SHFT +#undef NRANSI +/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */ diff --git a/Adapt/dsvdcmp.cpp b/Adapt/dsvdcmp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b105aff243c2eb3443477398bd9847e5ed7a6613 --- /dev/null +++ b/Adapt/dsvdcmp.cpp @@ -0,0 +1,239 @@ +#include <math.h> + +#include "nrutil.h" + +double dpythag(double a, double b) +{ + double absa,absb; + absa=fabs(a); + absb=fabs(b); + if (absa > absb) return absa*sqrt(1.0+SQR(absb/absa)); + else return (absb == 0.0 ? 0.0 : absb*sqrt(1.0+SQR(absa/absb))); +} + +void dsvdcmp(double **a, int m, int n, double w[], double **v) +{ + double dpythag(double a, double b); + int flag,i,its,j,jj,k,l,nm; + double anorm,c,f,g,h,s,scale,x,y,z,*rv1; + + rv1=dvector(1,n); + g=scale=anorm=0.0; + for (i=1;i<=n;i++) { + l=i+1; + rv1[i]=scale*g; + g=s=scale=0.0; + if (i <= m) { + for (k=i;k<=m;k++) scale += fabs(a[k][i]); + if (scale) { + for (k=i;k<=m;k++) { + a[k][i] /= scale; + s += a[k][i]*a[k][i]; + } + f=a[i][i]; + g = -SIGN(sqrt(s),f); + h=f*g-s; + a[i][i]=f-g; + for (j=l;j<=n;j++) { + for (s=0.0,k=i;k<=m;k++) s += a[k][i]*a[k][j]; + f=s/h; + for (k=i;k<=m;k++) a[k][j] += f*a[k][i]; + } + for (k=i;k<=m;k++) a[k][i] *= scale; + } + } + w[i]=scale *g; + g=s=scale=0.0; + if (i <= m && i != n) { + for (k=l;k<=n;k++) scale += fabs(a[i][k]); + if (scale) { + for (k=l;k<=n;k++) { + a[i][k] /= scale; + s += a[i][k]*a[i][k]; + } + f=a[i][l]; + g = -SIGN(sqrt(s),f); + h=f*g-s; + a[i][l]=f-g; + for (k=l;k<=n;k++) rv1[k]=a[i][k]/h; + for (j=l;j<=m;j++) { + for (s=0.0,k=l;k<=n;k++) s += a[j][k]*a[i][k]; + for (k=l;k<=n;k++) a[j][k] += s*rv1[k]; + } + for (k=l;k<=n;k++) a[i][k] *= scale; + } + } + anorm=DMAX(anorm,(fabs(w[i])+fabs(rv1[i]))); + } + for (i=n;i>=1;i--) { + if (i < n) { + if (g) { + for (j=l;j<=n;j++) v[j][i]=(a[i][j]/a[i][l])/g; + for (j=l;j<=n;j++) { + for (s=0.0,k=l;k<=n;k++) s += a[i][k]*v[k][j]; + for (k=l;k<=n;k++) v[k][j] += s*v[k][i]; + } + } + for (j=l;j<=n;j++) v[i][j]=v[j][i]=0.0; + } + v[i][i]=1.0; + g=rv1[i]; + l=i; + } + for (i=IMIN(m,n);i>=1;i--) { + l=i+1; + g=w[i]; + for (j=l;j<=n;j++) a[i][j]=0.0; + if (g) { + g=1.0/g; + for (j=l;j<=n;j++) { + for (s=0.0,k=l;k<=m;k++) s += a[k][i]*a[k][j]; + f=(s/a[i][i])*g; + for (k=i;k<=m;k++) a[k][j] += f*a[k][i]; + } + for (j=i;j<=m;j++) a[j][i] *= g; + } else for (j=i;j<=m;j++) a[j][i]=0.0; + ++a[i][i]; + } + for (k=n;k>=1;k--) { + for (its=1;its<=30;its++) { + flag=1; + for (l=k;l>=1;l--) { + nm=l-1; + if ((double)(fabs(rv1[l])+anorm) == anorm) { + flag=0; + break; + } + if ((double)(fabs(w[nm])+anorm) == anorm) break; + } + if (flag) { + c=0.0; + s=1.0; + for (i=l;i<=k;i++) { + f=s*rv1[i]; + rv1[i]=c*rv1[i]; + if ((double)(fabs(f)+anorm) == anorm) break; + g=w[i]; + h=dpythag(f,g); + w[i]=h; + h=1.0/h; + c=g*h; + s = -f*h; + for (j=1;j<=m;j++) { + y=a[j][nm]; + z=a[j][i]; + a[j][nm]=y*c+z*s; + a[j][i]=z*c-y*s; + } + } + } + z=w[k]; + if (l == k) { + if (z < 0.0) { + w[k] = -z; + for (j=1;j<=n;j++) v[j][k] = -v[j][k]; + } + break; + } + if (its == 30) nrerror("no convergence in 30 dsvdcmp iterations"); + x=w[l]; + nm=k-1; + y=w[nm]; + g=rv1[nm]; + h=rv1[k]; + f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y); + g=dpythag(f,1.0); + f=((x-z)*(x+z)+h*((y/(f+SIGN(g,f)))-h))/x; + c=s=1.0; + for (j=l;j<=nm;j++) { + i=j+1; + g=rv1[i]; + y=w[i]; + h=s*g; + g=c*g; + z=dpythag(f,h); + rv1[j]=z; + c=f/z; + s=h/z; + f=x*c+g*s; + g = g*c-x*s; + h=y*s; + y *= c; + for (jj=1;jj<=n;jj++) { + x=v[jj][j]; + z=v[jj][i]; + v[jj][j]=x*c+z*s; + v[jj][i]=z*c-x*s; + } + z=dpythag(f,h); + w[j]=z; + if (z) { + z=1.0/z; + c=f*z; + s=h*z; + } + f=c*g+s*y; + x=c*y-s*g; + for (jj=1;jj<=m;jj++) { + y=a[jj][j]; + z=a[jj][i]; + a[jj][j]=y*c+z*s; + a[jj][i]=z*c-y*s; + } + } + rv1[l]=0.0; + rv1[k]=f; + w[k]=x; + } + } + free_dvector(rv1,1,n); +} + + +/* cf. Numerical Recipes in C, p. 62 */ + +#define PREC 1.e-16 + +void invert_singular_matrix(double **M, int n, double **I){ + double **V, **T, *W; + int i, j, k; + + V = dmatrix(1,n,1,n); + T = dmatrix(1,n,1,n); + W = dvector(1,n); + + dsvdcmp(M, n, n, W, V); + + for(i=1 ; i<=n ; i++){ + for(j=1 ; j<=n ; j++){ + I[i][j] = 0.0 ; + T[i][j] = 0.0 ; + } + } + + for(i=1 ; i<=n ; i++){ + for(j=1 ; j<=n ; j++){ + if(fabs(W[i]) > PREC){ + T[i][j] += M[j][i] / W[i] ; + } + /* + else{ + T[i][j] += 0.0 ; + } + */ + } + } + for(i=1 ; i<=n ; i++){ + for(j=1 ; j<=n ; j++){ + for(k=1 ; k<=n ; k++){ + I[i][j] += V[i][k] * T[k][j] ; + } + } + } + + free_dmatrix(V,1,n,1,n); + free_dmatrix(T,1,n,1,n); + free_dvector(W,1,n); +} + +#undef PREC diff --git a/Adapt/fdjac.cpp b/Adapt/fdjac.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d433da408d9a4e1c01caf8ae3a1aeafd7f9ba026 --- /dev/null +++ b/Adapt/fdjac.cpp @@ -0,0 +1,31 @@ +#include <math.h> +#define NRANSI +#include "nrutil.h" +#define EPS 1.0e-4 + +void +fdjac (int n, float x[], float fvec[], float **df, + void (*vecfunc) (int, float[], float[])) +{ + int i, j; + float h, temp, *f; + + f = vector (1, n); + for (j = 1; j <= n; j++) + { + temp = x[j]; + h = EPS * fabs (temp); + if (h == 0.0) + h = EPS; + x[j] = temp + h; + h = x[j] - temp; + (*vecfunc) (n, x, f); + x[j] = temp; + for (i = 1; i <= n; i++) + df[i][j] = (f[i] - fvec[i]) / h; + } + free_vector (f, 1, n); +} +#undef EPS +#undef NRANSI +/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */ diff --git a/Adapt/fmin.cpp b/Adapt/fmin.cpp new file mode 100644 index 0000000000000000000000000000000000000000..12db64bfa16ffdd494271f9d98caee19df1a71a9 --- /dev/null +++ b/Adapt/fmin.cpp @@ -0,0 +1,20 @@ +#define NRANSI +#include "nrutil.h" + +extern int nn; +extern float *fvec; +extern void (*nrfuncv) (int n, float v[], float f[]); + +float +fmin (float x[]) +{ + int i; + float sum; + + (*nrfuncv) (nn, x, fvec); + for (sum = 0.0, i = 1; i <= nn; i++) + sum += SQR (fvec[i]); + return 0.5 * sum; +} +#undef NRANSI +/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */ diff --git a/Adapt/lnsrch.cpp b/Adapt/lnsrch.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6b4d87d454a2e18d0d9ef453206289c4b19f18bd --- /dev/null +++ b/Adapt/lnsrch.cpp @@ -0,0 +1,80 @@ +#include <math.h> +#define NRANSI +#include "nrutil.h" +#define ALF 1.0e-4 +#define TOLX 1.0e-7 + +void +lnsrch (int n, float xold[], float fold, float g[], float p[], float x[], + float *f, float stpmax, int *check, float (*func) (float[])) +{ + int i; + float a, alam, alam2, alamin, b, disc, f2, fold2, rhs1, rhs2, slope, + sum, temp, test, tmplam; + + *check = 0; + for (sum = 0.0, i = 1; i <= n; i++) + sum += p[i] * p[i]; + sum = sqrt (sum); + if (sum > stpmax) + for (i = 1; i <= n; i++) + p[i] *= stpmax / sum; + for (slope = 0.0, i = 1; i <= n; i++) + slope += g[i] * p[i]; + test = 0.0; + for (i = 1; i <= n; i++) + { + temp = fabs (p[i]) / FMAX (fabs (xold[i]), 1.0); + if (temp > test) + test = temp; + } + alamin = TOLX / test; + alam = 1.0; + for (;;) + { + for (i = 1; i <= n; i++) + x[i] = xold[i] + alam * p[i]; + *f = (*func) (x); + if (alam < alamin) + { + for (i = 1; i <= n; i++) + x[i] = xold[i]; + *check = 1; + return; + } + else if (*f <= fold + ALF * alam * slope) + return; + else + { + if (alam == 1.0) + tmplam = -slope / (2.0 * (*f - fold - slope)); + else + { + rhs1 = *f - fold - alam * slope; + rhs2 = f2 - fold2 - alam2 * slope; + a = (rhs1 / (alam * alam) - rhs2 / (alam2 * alam2)) / (alam - alam2); + b = (-alam2 * rhs1 / (alam * alam) + alam * rhs2 / (alam2 * alam2)) / (alam - alam2); + if (a == 0.0) + tmplam = -slope / (2.0 * b); + else + { + disc = b * b - 3.0 * a * slope; + if (disc < 0.0) + nrerror ("Roundoff problem in lnsrch."); + else + tmplam = (-b + sqrt (disc)) / (3.0 * a); + } + if (tmplam > 0.5 * alam) + tmplam = 0.5 * alam; + } + } + alam2 = alam; + f2 = *f; + fold2 = fold; + alam = FMAX (tmplam, 0.1 * alam); + } +} +#undef ALF +#undef TOLX +#undef NRANSI +/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */ diff --git a/Adapt/lubksb.cpp b/Adapt/lubksb.cpp new file mode 100644 index 0000000000000000000000000000000000000000..31c5164188f585b111ca3b8280e268f4b0843837 --- /dev/null +++ b/Adapt/lubksb.cpp @@ -0,0 +1,27 @@ +void +lubksb (float **a, int n, int *indx, float b[]) +{ + int i, ii = 0, ip, j; + float sum; + + for (i = 1; i <= n; i++) + { + ip = indx[i]; + sum = b[ip]; + b[ip] = b[i]; + if (ii) + for (j = ii; j <= i - 1; j++) + sum -= a[i][j] * b[j]; + else if (sum) + ii = i; + b[i] = sum; + } + for (i = n; i >= 1; i--) + { + sum = b[i]; + for (j = i + 1; j <= n; j++) + sum -= a[i][j] * b[j]; + b[i] = sum / a[i][i]; + } +} +/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */ diff --git a/Adapt/ludcmp.cpp b/Adapt/ludcmp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8b77834dbfa1a86fd0467af0f67181d4f1ca31f0 --- /dev/null +++ b/Adapt/ludcmp.cpp @@ -0,0 +1,72 @@ +#include <math.h> +#define NRANSI +#include "nrutil.h" +#define TINY 1.0e-20; + +void +ludcmp (float **a, int n, int *indx, float *d) +{ + int i, imax, j, k; + float big, dum, sum, temp; + float *vv; + + vv = vector (1, n); + *d = 1.0; + for (i = 1; i <= n; i++) + { + big = 0.0; + for (j = 1; j <= n; j++) + if ((temp = fabs (a[i][j])) > big) + big = temp; + if (big == 0.0) + nrerror ("Singular matrix in routine ludcmp"); + vv[i] = 1.0 / big; + } + for (j = 1; j <= n; j++) + { + for (i = 1; i < j; i++) + { + sum = a[i][j]; + for (k = 1; k < i; k++) + sum -= a[i][k] * a[k][j]; + a[i][j] = sum; + } + big = 0.0; + for (i = j; i <= n; i++) + { + sum = a[i][j]; + for (k = 1; k < j; k++) + sum -= a[i][k] * a[k][j]; + a[i][j] = sum; + if ((dum = vv[i] * fabs (sum)) >= big) + { + big = dum; + imax = i; + } + } + if (j != imax) + { + for (k = 1; k <= n; k++) + { + dum = a[imax][k]; + a[imax][k] = a[j][k]; + a[j][k] = dum; + } + *d = -(*d); + vv[imax] = vv[j]; + } + indx[j] = imax; + if (a[j][j] == 0.0) + a[j][j] = TINY; + if (j != n) + { + dum = 1.0 / (a[j][j]); + for (i = j + 1; i <= n; i++) + a[i][j] *= dum; + } + } + free_vector (vv, 1, n); +} +#undef TINY +#undef NRANSI +/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */ diff --git a/Adapt/mnbrak.cpp b/Adapt/mnbrak.cpp new file mode 100644 index 0000000000000000000000000000000000000000..85d839633572b94ff7a81eb8317fd09e0056e037 --- /dev/null +++ b/Adapt/mnbrak.cpp @@ -0,0 +1,79 @@ +#include <math.h> +#define NRANSI +#include "nrutil.h" +#define GOLD 1.618034 +#define GLIMIT 100.0 +#define TINY 1.0e-20 +#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d); + +void +mnbrak (double *ax, double *bx, double *cx, double *fa, double *fb, double *fc, + double (*func) (double)) +{ + double ulim, u, r, q, fu, dum; + + *fa = (*func) (*ax); + *fb = (*func) (*bx); + if (*fb > *fa) + { + SHFT (dum, *ax, *bx, dum) + SHFT (dum, *fb, *fa, dum) + } + *cx = (*bx) + GOLD * (*bx - *ax); + *fc = (*func) (*cx); + while (*fb > *fc) + { + r = (*bx - *ax) * (*fb - *fc); + q = (*bx - *cx) * (*fb - *fa); + u = (*bx) - ((*bx - *cx) * q - (*bx - *ax) * r) / + (2.0 * SIGN (FMAX (fabs (q - r), TINY), q - r)); + ulim = (*bx) + GLIMIT * (*cx - *bx); + if ((*bx - u) * (u - *cx) > 0.0) + { + fu = (*func) (u); + if (fu < *fc) + { + *ax = (*bx); + *bx = u; + *fa = (*fb); + *fb = fu; + return; + } + else if (fu > *fb) + { + *cx = u; + *fc = fu; + return; + } + u = (*cx) + GOLD * (*cx - *bx); + fu = (*func) (u); + } + else if ((*cx - u) * (u - ulim) > 0.0) + { + fu = (*func) (u); + if (fu < *fc) + { + SHFT (*bx, *cx, u, *cx + GOLD * (*cx - *bx)) + SHFT (*fb, *fc, fu, (*func) (u)) + } + } + else if ((u - ulim) * (ulim - *cx) >= 0.0) + { + u = ulim; + fu = (*func) (u); + } + else + { + u = (*cx) + GOLD * (*cx - *bx); + fu = (*func) (u); + } + SHFT (*ax, *bx, *cx, u) + SHFT (*fa, *fb, *fc, fu) + } +} +#undef GOLD +#undef GLIMIT +#undef TINY +#undef SHFT +#undef NRANSI +/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */ diff --git a/Adapt/newt.cpp b/Adapt/newt.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ece185703ea5fb00224149c4bef1caa78332f2f3 --- /dev/null +++ b/Adapt/newt.cpp @@ -0,0 +1,107 @@ +#include <math.h> +#define NRANSI +#include "nrutil.h" +#define MAXITS 200 +#define TOLF 1.0e-4 +#define TOLMIN 1.0e-6 +#define TOLX 1.0e-7 +#define STPMX 100.0 + +int nn; +float *fvec; +void (*nrfuncv) (int n, float v[], float f[]); +#define FREERETURN {free_vector(fvec,1,n);free_vector(xold,1,n);\ + free_vector(p,1,n);free_vector(g,1,n);free_matrix(fjac,1,n,1,n);\ + free_ivector(indx,1,n);return;} + +void +newt (float x[], int n, int *check, + void (*vecfunc) (int, float[], float[])) +{ + void fdjac (int n, float x[], float fvec[], float **df, + void (*vecfunc) (int, float[], float[])); + float fmin (float x[]); + void lnsrch (int n, float xold[], float fold, float g[], float p[], float x[], + float *f, float stpmax, int *check, float (*func) (float[])); + void lubksb (float **a, int n, int *indx, float b[]); + void ludcmp (float **a, int n, int *indx, float *d); + int i, its, j, *indx; + float d, den, f, fold, stpmax, sum, temp, test, **fjac, *g, *p, *xold; + + indx = ivector (1, n); + fjac = matrix (1, n, 1, n); + g = vector (1, n); + p = vector (1, n); + xold = vector (1, n); + fvec = vector (1, n); + nn = n; + nrfuncv = vecfunc; + f = fmin (x); + test = 0.0; + for (i = 1; i <= n; i++) + if (fabs (fvec[i]) > test) + test = fabs (fvec[i]); + if (test < 0.01 * TOLF) + FREERETURN + for (sum = 0.0, i = 1; i <= n; i++) + sum += SQR (x[i]); + stpmax = STPMX * FMAX (sqrt (sum), (float) n); + for (its = 1; its <= MAXITS; its++) + { + fdjac (n, x, fvec, fjac, vecfunc); + for (i = 1; i <= n; i++) + { + for (sum = 0.0, j = 1; j <= n; j++) + sum += fjac[j][i] * fvec[j]; + g[i] = sum; + } + for (i = 1; i <= n; i++) + xold[i] = x[i]; + fold = f; + for (i = 1; i <= n; i++) + p[i] = -fvec[i]; + ludcmp (fjac, n, indx, &d); + lubksb (fjac, n, indx, p); + lnsrch (n, xold, fold, g, p, x, &f, stpmax, check, fmin); + test = 0.0; + for (i = 1; i <= n; i++) + if (fabs (fvec[i]) > test) + test = fabs (fvec[i]); + if (test < TOLF) + { + *check = 0; + FREERETURN + } + if (*check) + { + test = 0.0; + den = FMAX (f, 0.5 * n); + for (i = 1; i <= n; i++) + { + temp = fabs (g[i]) * FMAX (fabs (x[i]), 1.0) / den; + if (temp > test) + test = temp; + } + *check = (test < TOLMIN ? 1 : 0); + FREERETURN + } + test = 0.0; + for (i = 1; i <= n; i++) + { + temp = (fabs (x[i] - xold[i])) / FMAX (fabs (x[i]), 1.0); + if (temp > test) + test = temp; + } + if (test < TOLX) + FREERETURN + } + nrerror ("MAXITS exceeded in newt"); + } +#undef MAXITS +#undef TOLF +#undef TOLMIN +#undef TOLX +#undef STPMX +#undef FREERETURN +#undef NRANSI +/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */ diff --git a/Adapt/nrutil.cpp b/Adapt/nrutil.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1b6b7b8fb82d43863c6249d26db33f489bccc489 --- /dev/null +++ b/Adapt/nrutil.cpp @@ -0,0 +1,290 @@ +#include <stdio.h> +#include <stddef.h> +#include <stdlib.h> +#include <malloc.h> + + +#define NR_END 1 +#define FREE_ARG char* + +void nrerror(char error_text[]) +/* Numerical Recipes standard error handler */ +{ + fprintf(stderr,"Numerical Recipes run-time error...\n"); + fprintf(stderr,"%s\n",error_text); + fprintf(stderr,"...now exiting to system...\n"); + exit(1); +} + +float *vector(long nl, long nh) +/* allocate a float vector with subscript range v[nl..nh] */ +{ + float *v; + + v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float))); + if (!v) nrerror("allocation failure in vector()"); + return v-nl+NR_END; +} + +int *ivector(long nl, long nh) +/* allocate an int vector with subscript range v[nl..nh] */ +{ + int *v; + + v=(int *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(int))); + if (!v) nrerror("allocation failure in ivector()"); + return v-nl+NR_END; +} + +unsigned char *cvector(long nl, long nh) +/* allocate an unsigned char vector with subscript range v[nl..nh] */ +{ + unsigned char *v; + + v=(unsigned char *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(unsigned char))); + if (!v) nrerror("allocation failure in cvector()"); + return v-nl+NR_END; +} + +unsigned long *lvector(long nl, long nh) +/* allocate an unsigned long vector with subscript range v[nl..nh] */ +{ + unsigned long *v; + + v=(unsigned long *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(long))); + if (!v) nrerror("allocation failure in lvector()"); + return v-nl+NR_END; +} + +double *dvector(long nl, long nh) +/* allocate a double vector with subscript range v[nl..nh] */ +{ + double *v; + + v=(double *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(double))); + if (!v) nrerror("allocation failure in dvector()"); + return v-nl+NR_END; +} + +float **matrix(long nrl, long nrh, long ncl, long nch) +/* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */ +{ + long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; + float **m; + + /* allocate pointers to rows */ + m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*))); + if (!m) nrerror("allocation failure 1 in matrix()"); + m += NR_END; + m -= nrl; + + /* allocate rows and set pointers to them */ + m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float))); + if (!m[nrl]) nrerror("allocation failure 2 in matrix()"); + m[nrl] += NR_END; + m[nrl] -= ncl; + + for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; + + /* return pointer to array of pointers to rows */ + return m; +} + +double **dmatrix(long nrl, long nrh, long ncl, long nch) +/* allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] */ +{ + long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; + double **m; + + /* allocate pointers to rows */ + m=(double **) malloc((size_t)((nrow+NR_END)*sizeof(double*))); + if (!m) nrerror("allocation failure 1 in matrix()"); + m += NR_END; + m -= nrl; + + /* allocate rows and set pointers to them */ + m[nrl]=(double *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double))); + if (!m[nrl]) nrerror("allocation failure 2 in matrix()"); + m[nrl] += NR_END; + m[nrl] -= ncl; + + for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; + + /* return pointer to array of pointers to rows */ + return m; +} + +int **imatrix(long nrl, long nrh, long ncl, long nch) +/* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */ +{ + long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; + int **m; + + /* allocate pointers to rows */ + m=(int **) malloc((size_t)((nrow+NR_END)*sizeof(int*))); + if (!m) nrerror("allocation failure 1 in matrix()"); + m += NR_END; + m -= nrl; + + + /* allocate rows and set pointers to them */ + m[nrl]=(int *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(int))); + if (!m[nrl]) nrerror("allocation failure 2 in matrix()"); + m[nrl] += NR_END; + m[nrl] -= ncl; + + for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; + + /* return pointer to array of pointers to rows */ + return m; +} + +float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch, + long newrl, long newcl) +/* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */ +{ + long i,j,nrow=oldrh-oldrl+1,ncol=oldcl-newcl; + float **m; + + /* allocate array of pointers to rows */ + m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*))); + if (!m) nrerror("allocation failure in submatrix()"); + m += NR_END; + m -= newrl; + + /* set pointers to rows */ + for(i=oldrl,j=newrl;i<=oldrh;i++,j++) m[j]=a[i]+ncol; + + /* return pointer to array of pointers to rows */ + return m; +} + +float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch) +/* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix +declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1 +and ncol=nch-ncl+1. The routine should be called with the address +&a[0][0] as the first argument. */ +{ + long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1; + float **m; + + /* allocate pointers to rows */ + m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*))); + if (!m) nrerror("allocation failure in convert_matrix()"); + m += NR_END; + m -= nrl; + + /* set pointers to rows */ + m[nrl]=a-ncl; + for(i=1,j=nrl+1;i<nrow;i++,j++) m[j]=m[j-1]+ncol; + /* return pointer to array of pointers to rows */ + return m; +} + +float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh) +/* allocate a float 3tensor with range t[nrl..nrh][ncl..nch][ndl..ndh] */ +{ + long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1,ndep=ndh-ndl+1; + float ***t; + + /* allocate pointers to pointers to rows */ + t=(float ***) malloc((size_t)((nrow+NR_END)*sizeof(float**))); + if (!t) nrerror("allocation failure 1 in f3tensor()"); + t += NR_END; + t -= nrl; + + /* allocate pointers to rows and set pointers to them */ + t[nrl]=(float **) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float*))); + if (!t[nrl]) nrerror("allocation failure 2 in f3tensor()"); + t[nrl] += NR_END; + t[nrl] -= ncl; + + /* allocate rows and set pointers to them */ + t[nrl][ncl]=(float *) malloc((size_t)((nrow*ncol*ndep+NR_END)*sizeof(float))); + if (!t[nrl][ncl]) nrerror("allocation failure 3 in f3tensor()"); + t[nrl][ncl] += NR_END; + t[nrl][ncl] -= ndl; + + for(j=ncl+1;j<=nch;j++) t[nrl][j]=t[nrl][j-1]+ndep; + for(i=nrl+1;i<=nrh;i++) { + t[i]=t[i-1]+ncol; + t[i][ncl]=t[i-1][ncl]+ncol*ndep; + for(j=ncl+1;j<=nch;j++) t[i][j]=t[i][j-1]+ndep; + } + + /* return pointer to array of pointers to rows */ + return t; +} + +void free_vector(float *v, long nl, long nh) +/* free a float vector allocated with vector() */ +{ + free((FREE_ARG) (v+nl-NR_END)); +} + +void free_ivector(int *v, long nl, long nh) +/* free an int vector allocated with ivector() */ +{ + free((FREE_ARG) (v+nl-NR_END)); +} + +void free_cvector(unsigned char *v, long nl, long nh) +/* free an unsigned char vector allocated with cvector() */ +{ + free((FREE_ARG) (v+nl-NR_END)); +} + +void free_lvector(unsigned long *v, long nl, long nh) +/* free an unsigned long vector allocated with lvector() */ +{ + free((FREE_ARG) (v+nl-NR_END)); +} + +void free_dvector(double *v, long nl, long nh) +/* free a double vector allocated with dvector() */ +{ + free((FREE_ARG) (v+nl-NR_END)); +} + +void free_matrix(float **m, long nrl, long nrh, long ncl, long nch) +/* free a float matrix allocated by matrix() */ +{ + free((FREE_ARG) (m[nrl]+ncl-NR_END)); + free((FREE_ARG) (m+nrl-NR_END)); +} + +void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch) +/* free a double matrix allocated by dmatrix() */ +{ + free((FREE_ARG) (m[nrl]+ncl-NR_END)); + free((FREE_ARG) (m+nrl-NR_END)); +} + +void free_imatrix(int **m, long nrl, long nrh, long ncl, long nch) +/* free an int matrix allocated by imatrix() */ +{ + free((FREE_ARG) (m[nrl]+ncl-NR_END)); + free((FREE_ARG) (m+nrl-NR_END)); +} + +void free_submatrix(float **b, long nrl, long nrh, long ncl, long nch) +/* free a submatrix allocated by submatrix() */ +{ + free((FREE_ARG) (b+nrl-NR_END)); +} + +void free_convert_matrix(float **b, long nrl, long nrh, long ncl, long nch) +/* free a matrix allocated by convert_matrix() */ +{ + free((FREE_ARG) (b+nrl-NR_END)); +} + +void free_f3tensor(float ***t, long nrl, long nrh, long ncl, long nch, + long ndl, long ndh) +/* free a float f3tensor allocated by f3tensor() */ +{ + free((FREE_ARG) (t[nrl][ncl]+ndl-NR_END)); + free((FREE_ARG) (t[nrl]+ncl-NR_END)); + free((FREE_ARG) (t+nrl-NR_END)); +} + diff --git a/Adapt/nrutil.h b/Adapt/nrutil.h new file mode 100644 index 0000000000000000000000000000000000000000..5eb39aac0b5df638ff735364fe4d919b0f845a7d --- /dev/null +++ b/Adapt/nrutil.h @@ -0,0 +1,35 @@ +#ifndef _NR_UTILS_H_ +#define _NR_UTILS_H_ + +#include "Const.h" + +#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a)) + +void nrerror (char error_text[]); +float *vector (long nl, long nh); +int *ivector (long nl, long nh); +unsigned char *cvector (long nl, long nh); +unsigned long *lvector (long nl, long nh); +double *dvector (long nl, long nh); +float **matrix (long nrl, long nrh, long ncl, long nch); +double **dmatrix (long nrl, long nrh, long ncl, long nch); +int **imatrix (long nrl, long nrh, long ncl, long nch); +float **submatrix (float **a, long oldrl, long oldrh, long oldcl, long oldch, + long newrl, long newcl); +float **convert_matrix (float *a, long nrl, long nrh, long ncl, long nch); +float ***f3tensor (long nrl, long nrh, long ncl, long nch, long ndl, long ndh); +void free_vector (float *v, long nl, long nh); +void free_ivector (int *v, long nl, long nh); +void free_cvector (unsigned char *v, long nl, long nh); +void free_lvector (unsigned long *v, long nl, long nh); +void free_dvector (double *v, long nl, long nh); +void free_matrix (float **m, long nrl, long nrh, long ncl, long nch); +void free_dmatrix (double **m, long nrl, long nrh, long ncl, long nch); +void free_imatrix (int **m, long nrl, long nrh, long ncl, long nch); +void free_submatrix (float **b, long nrl, long nrh, long ncl, long nch); +void free_convert_matrix (float **b, long nrl, long nrh, long ncl, long nch); +void free_f3tensor (float ***t, long nrl, long nrh, long ncl, long nch, + long ndl, long ndh); + + +#endif /* _NR_UTILS_H_ */ diff --git a/Adapt/optimesh.cpp b/Adapt/optimesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..486809ebcea5b5322c31782623814748a16ed25a --- /dev/null +++ b/Adapt/optimesh.cpp @@ -0,0 +1,238 @@ + +#include "Gmsh.h" +#include "Adapt.h" +#include "nrutil.h" + +#define TOL 1.e-08 +#define MAXDEG 999 + +void frprmn(double p[], int n, double ftol, int *iter, double *fret, + double (*func)(double []), void (*dfunc)(double [], double [])); + +extern void SetError(char *, char *); + +static int NN,METHOD; +static double MINH , *ERR , *HH , *PP , E0, DIM ; + +/* METODE H VERSION 1 : MINIMISER LE NOMBRE D'ELEMENTS + TOUT EN GARDANT UNE ERREUR GLOBALE DONNEE. ON MODIFIE + ICI LE VECTEUR TAILLE DE MAILLE +*/ + +double fH1 ( double l ){ + + int i; + double val1,val2; + + val1 = 0.0; + + for(i=1;i<=NN;i++){ + val1 += pow(2.*l*DSQR(ERR[i])*PP[i]/DIM,(DIM/(2.*PP[i]+DIM))); + } + val2 = 0.0; + for(i=1;i<=NN;i++){ + val2 += DSQR(ERR[i])*pow(2.*l*DSQR(ERR[i])*PP[i]/DIM,(-2.*PP[i]/(2.*PP[i]+DIM))); + } + return -(val1 + l * ( val2 - DSQR(E0))); +} + +/* METODE H VERSION 2 : MINIMISER L'ERREUR + TOUT EN GARDANT UN NOMBRE D'ELEMENTS DONNE. ON MODIFIE + ICI LE VECTEUR TAILLE DE MAILLE +*/ + +double fH2 ( double l ){ + + int i; + double val1,val2,qi; + + val1 = val2 = 0.0; + for(i=1;i<=NN;i++){ + qi = pow((DIM*l)/(2.*PP[i] * DSQR(ERR[i])) + ,-DIM/(DIM+2.*PP[i])); + val1 += DSQR(ERR[i]) * pow(qi,-2.*PP[i]/DIM); + val2 += qi; + } +/* + printf( "%12.5e %12.5e\n",l,val1 + l * ( val2 - E0)); +*/ + return -(val1 + l * ( val2 - E0)); +} + + +/* METODE P VERSION 1 : MINIMISER LE NOMBRE D'ELEMENTS + TOUT EN GARDANT UNE ERREUR GLOBALE DONNEE. ON MODIFIE + ICI LE VECTEUR DEGRE D'INTERPOLATION +*/ + +double fP1 ( double l ){ + + int i; + double val1,val2,qi,e; + + val1 = val2 = 0.0; + for(i=1;i<=NN;i++){ + e = ERR[i]; + if(e==0.0)e=1.e-12; + qi = - log (2. * l * log (HH[i]/MINH) * DSQR(e)) / log (HH[i]/MINH); + val1 -= .5 * qi; + val2 += pow(HH[i]/MINH,qi) * DSQR(e); + } +/* + printf( "%12.5e %12.5e\n",l,val1 + l * ( val2 - DSQR(E0))); +*/ + return -(val1 + l * ( val2 - DSQR(E0))); +} + + +double min1d ( double (*funct)(double), double *xmin){ + double brent(double ax, double bx, double cx, + double (*f)(double), double tol, double *xmin); + void mnbrak(double *ax, double *bx, double *cx, double *fa, double *fb, + double *fc, double (*func)(double)); + double xx,fx,fb,fa,bx,ax; + + switch(METHOD){ + case ADAPT_H1: + case ADAPT_P1: + ax=1.e-12; + xx=1.e2; + break; + default: + ax=1.e-15; + xx=1.e-12; + break; + } + mnbrak(&ax,&xx,&bx,&fa,&fx,&fb,funct); + return brent(ax,xx,bx,funct,TOL,xmin); +} + + +/* optimesh renvoie la contrainte (N0 ou e0) pour le probleme optimise */ + +double optimesh (int N, /* Nombre d'elements a traiter */ + int method, /* ADAPT_H1 , ADAPT_P1 , ADAPT_H2 ou ADAPT_P2 */ + int dim, /* 2 pour 2D et 3 pour 3D */ + double *err, /* erreurs elementaires */ + double *h, /* tailles de mailles elementaires */ + double *p, /* exposante elementaires */ + double e0, /* erreur prescrite par l'utilisateur */ + double N0 /* nbre d'elements ds le maillage opt */ + ) +{ + + int i; + double contr,pivrai,lambda,minf,qi,ri,pi,obj,obj2,minri,maxri; + double errmin,errmax; + + + Msg(INFOS, "N=%d Meth=%d dim=%d err[1]=%g err[2]=%g p[1]=%g p[2]=%g prescr=%g", + N,method,dim,err[1],err[2],p[1],p[2],e0); + + METHOD = method; + + h[N+1] = 1.0; + p[N+1] = 1.0; + + NN = N; + ERR = err; + HH = h; + PP = p; + NN = N; + E0 = e0; + DIM = (double)dim; + + + for(i=1;i<=N;i++){ + if(i==1){ + errmin=errmax=err[i]; + } + else{ + errmin = DMIN(errmin,err[i]); + errmax = DMAX(errmax,err[i]); + } + } + + switch (method) { + case ADAPT_H1 : + + minf = min1d (fH1,&lambda); + obj = 0.0; + for(i=1;i<=N;i++){ + qi = pow(2.*lambda*DSQR(err[i])*p[i]/DIM,DIM/(2.*p[i]+DIM)); + ri = pow(qi,1./DIM); + if(i==1){ + minri=maxri=ri; + } + if(err[i]==0.0)ri = .5; + + minri = DMIN(minri,ri); + maxri = DMAX(maxri,ri); + obj += DSQR(err[i]) * pow(ri,-2.*p[i]) ; + h[i-1] = sqrt(2.) * h[i]/ri; + p[i-1] = ri; + } + + contr = fabs(minf); + + Msg(INFOS, "Constraint : asked %g <==> obtained %g",e0,sqrt(obj)); + Msg(INFOS, "Objective function (Nb. of elements) : %g",-minf); + Msg(INFOS, "Minimum reduction factor : %g maximum : %g",minri,maxri); + break; + + case ADAPT_P1 : + MINH=h[1]; + for(i=1;i<=N;i++){ + MINH =DMIN(h[i],MINH); + } + MINH/=2.; + + minf = min1d (fP1,&lambda); + obj = obj2 = 0.0; + for(i=1;i<=N;i++){ + qi = -log(2.*lambda*DSQR(err[i])*log(h[i]/MINH))/log(h[i]/MINH); + pi = p[i] - .5 * qi; + pivrai = DMIN(DMAX(1.,(double)(int)(pi+.99)),MAXDEG); + obj2 += pow(h[i]/MINH,2.*(p[i]-pivrai))*DSQR(err[i]); + obj += DSQR(err[i]) * pow(h[i]/MINH,qi) ; + h[i-1] = h[i]; + p[i-1] = pi; + } + Msg(INFOS, "Constraint : %g = %g ==> %g",e0,sqrt(obj),sqrt(obj2)); + Msg(INFOS, "Objective function : %g",minf); + contr = fabs(minf); + break; + + case ADAPT_H2 : + minf = min1d (fH2,&lambda); + obj = 0.0; + for(i=1;i<=N;i++){ + qi = pow((DIM*lambda)/(2.*DSQR(err[i])*p[i]) + ,-DIM/(DIM+2.*p[i])); + ri = pow(qi,1./DIM); + if(i==1){ + minri=maxri=ri; + } + minri = DMIN(minri,ri); + maxri = DMAX(maxri,ri); + obj += pow(ri,DIM) ; + h[i-1] = h[i]/ri; + p[i-1] = p[i]; + } + + Msg(INFOS, "Constraint : %g = %g",e0,obj); + Msg(INFOS, "Objective function (Error in %%) : %g", 100. * sqrt(fabs(minf))); + Msg(INFOS, "Minri : %g maximum %g",minri,maxri); + contr = sqrt(fabs(minf)); + break; + + case ADAPT_P2 : + minf = min1d (fH1,&lambda); + break; + + default : + Msg(WARNING, "Unknown mesh optimisation method"); + } + + return contr; +} diff --git a/Box/Box.cpp b/Box/Box.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9249fcb401a7f8dc421271f2d9dc00acb8717f72 --- /dev/null +++ b/Box/Box.cpp @@ -0,0 +1,387 @@ + +#include <signal.h> + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "Mesh.h" +#include "Views.h" +#include "Parser.h" +#include "Context.h" +#include "Main.h" +#include "MinMax.h" + +#include "Static.h" + +int VERBOSE = 0 ; + +char progname[] = "This is Gmsh (non-interactive)" ; +char copyright[] = "Copyright (C) 1997-2000 C. Geuzaine, J.-F. Remacle" ; +char clargs[] = + "Usage: %s [options] [files]\n" + "Mesh options:\n" + " -0 parse input and exit\n" + " -1, -2, -3 batch 1-, 2- or 3-dimensional mesh\n" + " -smooth int mesh smoothing (default: 3)\n" + " -degree int mesh degree (default: 1)\n" + " -format msh|unv|gref mesh format (default: msh)\n" + " -algo iso|aniso mesh algorithm (default: iso)\n" + " -scale float scaling factor (default: 1.0)\n" + " -recombine recombine extruded meshes\n" + " -bgm file load backround mesh from file\n" + "Other options:\n" + " -v print debug information\n" + " -path string set path for included files\n" + " -version show version number\n" + " -info show detailed version information\n" + " -help show this message\n" + ; + + +/* dummy defs for link purposes */ + +void color_table_init_param (int number, ColorTable * ct, int rgb_flag, int alpha_flag){;} +void color_table_recompute (ColorTable * ct, int rgb_flag, int alpha_flag){;} +void ZeroHighlight(Mesh *){;} +void AddView(int, char *, int){;} +void draw_polygon_2d (double, double, double, int, double *, double *, double *){;} + +/* ------------------------------------------------------------------------ */ +/* p a r s e */ +/* ------------------------------------------------------------------------ */ + +void ParseFile(char *f){ + strncpy(yyname,f,NAME_STR_L); + yyerrorstate=0; + yylineno=1; + if(!(yyin = fopen(yyname,"r"))){ + Msg(INFO, "File '%s' dos not exist", f); + return; + } + while(!feof(yyin)) yyparse(); + fclose(yyin); +} + +void MergeProblem(char *name){ + Msg(INFOS, "Merging %s",name); + + ParseFile(name); + if (yyerrorstate) return; +} + +void OpenProblem(char *name){ + char ext[6]; + + InitSymbols(); + Init_Mesh(&M, 1); + BD_EXISTS = 1; + + strncpy(TheFileName,name,NAME_STR_L); + strncpy(TheBaseFileName,name,NAME_STR_L); + + strcpy(ext,name+(strlen(name)-4)); + if(!strcmp(ext,".GEO") || + !strcmp(ext,".geo") || + !strcmp(ext,".msh") || + !strcmp(ext,".pos")){ + TheBaseFileName[strlen(name)-4] = '\0'; + } + else{ + strcat(TheFileName,".geo"); + } + + strncpy(THEM->name, TheBaseFileName,NAME_STR_L); + + Msg(INFOS, "Opening %s", TheFileName); + + ParseFile(TheFileName); + + mai3d(THEM,0); + + Maillage_Dimension_0(&M); + ZeroHighlight(&M); + CalculateMinMax(THEM->Points); +} + +/* ------------------------------------------------------------------------ */ +/* G e t _ O p t i o n s */ +/* ------------------------------------------------------------------------ */ + +void Get_Options (int argc, char *argv[]) { + int i=1; + + if(argc < 2) Info(0,argv[0]); + + strncpy(TheFileNameTab[0], "unnamed.geo",NAME_STR_L); + + while (i < argc) { + + if (argv[i][0] == '-') { + + if(!strcmp(argv[i]+1, "0")){ + CTX.interactive = -1; i++; + } + else if(!strcmp(argv[i]+1, "1")){ + CTX.interactive = 1; i++; + } + else if(!strcmp(argv[i]+1, "2")){ + CTX.interactive = 2; i++; + } + else if(!strcmp(argv[i]+1, "3")){ + CTX.interactive = 3; i++; + } + else if(!strcmp(argv[i]+1, "v")){ + VERBOSE = 1; i++; + } + else if(!strcmp(argv[i]+1, "path")){ + i++; + if(argv[i] != NULL){ + strncpy(ThePathForIncludes,argv[i++],NAME_STR_L); + } + } + else if(!strcmp(argv[i]+1, "bgm")){ + i++; + if(argv[i] != NULL){ + strncpy(TheBgmFileName,argv[i++],NAME_STR_L); + INITIALBGMESH = ONFILE; + } + } + else if(!strcmp(argv[i]+1, "smooth")){ + i++; + LISSAGE = atoi(argv[i]); i++; + } + else if(!strcmp(argv[i]+1, "scale")){ + i++; + GLOBALSCALINGFACTOR = atof(argv[i]); i++; + } + else if(!strcmp(argv[i]+1, "degree")){ + i++; + if(argv[i]!=NULL){ + CTX.mesh.degree = atoi(argv[i]); i++; + if(CTX.mesh.degree != 1 || CTX.mesh.degree != 2){ + fprintf(stderr, "Error: Wrong degree\n"); + exit(1); + } + } + else { + fprintf(stderr, "Error: Missing Number\n"); + exit(1); + } + } + else if(!strcmp(argv[i]+1, "format")){ + i++; + if(argv[i]!=NULL){ + if(!strcmp(argv[i],"msh")) + CTX.mesh.format = FORMAT_MSH ; + else if(!strcmp(argv[i],"unv")) + CTX.mesh.format = FORMAT_UNV ; + else if(!strcmp(argv[i],"gref")) + CTX.mesh.format = FORMAT_GREF ; + else{ + fprintf(stderr, "Error: Unknown mesh format\n"); + exit(1); + } + i++; + } + else { + fprintf(stderr, "Error: Missing format\n"); + exit(1); + } + } + else if(!strcmp(argv[i]+1, "algo")){ + i++; + if(argv[i]!=NULL){ + if(!strcmp(argv[i],"iso")) + CTX.mesh.algo = DELAUNAY_OLDALGO ; + else if(!strcmp(argv[i],"aniso")) + CTX.mesh.algo = DELAUNAY_NEWALGO ; + else{ + fprintf(stderr, "Error: Unknown mesh algorithm\n"); + exit(1); + } + i++; + } + else { + fprintf(stderr, "Error: Missing algorithm\n"); + exit(1); + } + } + else if(!strcmp(argv[i]+1, "info")){ + Info(2,argv[0]); + } + else if(!strcmp(argv[i]+1, "version")){ + Info(1,argv[0]); + } + else if(!strcmp(argv[i]+1, "help")){ + Info(0,argv[0]); + } + else{ + fprintf(stderr, "Warning: Unknown option '%s'\n", argv[i]); + Info(0,argv[0]); + } + } + + else { + if(NbFileName<MAX_OPEN_FILES){ + strncpy(TheFileNameTab[NbFileName++], argv[i++], NAME_STR_L); + } + else{ + fprintf(stderr, "Error: Too many input files\n"); + exit(1); + } + } + + } + + strncpy(TheFileName, TheFileNameTab[0], NAME_STR_L); + +} + +/* ------------------------------------------------------------------------ */ +/* m a i n */ +/* ------------------------------------------------------------------------ */ + +int main(int argc, char *argv[]){ + int i; + + InitContext(&CTX); + Get_Options(argc, argv); + + signal(SIGINT, Signal); + signal(SIGSEGV, Signal); + signal(SIGFPE, Signal); + + OpenProblem(TheFileName); + if(yyerrorstate) + exit(1); + else{ + if(NbFileName>1){ + for(i=1;i<NbFileName;i++) MergeProblem(TheFileNameTab[i]); + } + if(INITIALBGMESH == ONFILE){ + MergeProblem(TheBgmFileName); + if(List_Nbr(Post_ViewList)){ + BGMWithView((Post_View*)List_Pointer(Post_ViewList, List_Nbr(Post_ViewList)-1)); + TYPBGMESH = ONFILE; + Create_BgMesh(TYPBGMESH,.2,THEM); + } + else{ + fprintf(stderr, "Error: invalid BGM (no view)\n"); exit(1); + } + } + if(CTX.interactive > 0){ + mai3d(THEM, CTX.interactive); + Print_Mesh(THEM,NULL,CTX.mesh.format); + } + exit(1); + } + +} + + + +/* ------------------------------------------------------------------------ */ +/* I n f o */ +/* ------------------------------------------------------------------------ */ + +void Info (int level, char *arg0){ + switch(level){ + case 0 : + fprintf(stderr, "%s\n", progname); + fprintf(stderr, "%s\n", copyright); + fprintf(stderr, clargs, arg0); + exit(1); + case 1: + fprintf(stderr, "%g\n", GMSH_VERSION); + exit(1) ; + case 2: + fprintf(stderr, "Version : %g\n", GMSH_VERSION); + fprintf(stderr, "OS : %s\n", GMSH_OS); + fprintf(stderr, "Build Date : %s\n", GMSH_DATE); + fprintf(stderr, "Build Host : %s\n", GMSH_HOST); + fprintf(stderr, "Packager : %s\n", GMSH_PACKAGER); + exit(1) ; + default : + break; + } +} + + +/* ------------------------------------------------------------------------ */ +/* S i g n a l */ +/* ------------------------------------------------------------------------ */ + + +void Signal (int sig_num){ + + switch (sig_num){ + case SIGSEGV : Msg(ERROR, "Segmentation Violation (invalid memory reference)"); break; + case SIGFPE : Msg(ERROR, "Floating point exception (division by zero?)"); break; + case SIGINT : Msg(ERROR, "Interrupt (generated from terminal special char)"); break; + default : Msg(ERROR, "Unknown signal"); break; + } +} + + +/* ------------------------------------------------------------------------ */ +/* M s g */ +/* ------------------------------------------------------------------------ */ + +void Msg(int level, char *fmt, ...){ + va_list args; + int abort=0; + int nb, nbvis; + + va_start (args, fmt); + + switch(level){ + + case PARSER_ERROR : + fprintf(stderr, "Parse Error: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + break ; + + case PARSER_INFO : + if(VERBOSE){ + fprintf(stderr, "Parse Info: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + } + break ; + + case ERROR : + fprintf(stderr, "Error: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + abort = 1 ; + break ; + + case WARNING : + fprintf(stderr, "Warning: "); vfprintf(stderr, fmt,args); fprintf(stderr, "\n"); + break; + + case INFOS : + case INFO : + case SELECT : + case STATUS : + if(VERBOSE){ + vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + } + break; + } + + va_end (args); + + if(abort) exit(1); + +} + +/* ------------------------------------------------------------------------ */ +/* C p u */ +/* ------------------------------------------------------------------------ */ + +double Cpu(void){ + return 0.; +} + +/* ------------------------------------------------------------------------ */ +/* P r o g r e s s */ +/* ------------------------------------------------------------------------ */ + +void Progress(int i){ +} diff --git a/Box/Makefile b/Box/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..4d7d25b51dbac6d45abb5b59da902b82662a9d69 --- /dev/null +++ b/Box/Makefile @@ -0,0 +1,57 @@ +# +# Makefile for ".a" +# + +.IGNORE: + +CC = c++ +C_FLAGS = -g + +VERSION_FLAGS = +OS_FLAGS = -D_UNIX + +RM = rm +RMFLAGS = -f +RANLIB = ranlib + +LIB = ../lib/libBox.a +INCLUDE = -I../Common -I../DataStr -I../Geo\ + -I../Graphics -I../Mesh -I../Parser -I../Unix + +CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(VERSION_FLAGS) $(INCLUDE) + +SRC = Box.cpp + +OBJ = $(SRC:.cpp=.o) + +.SUFFIXES: .o .cpp + +$(LIB): $(OBJ) + ar ruvs $(LIB) $(OBJ) + $(RANLIB) $(LIB) + +.cpp.o: + $(CC) $(CFLAGS) -c $< + +clean: + $(RM) $(RMFLAGS) *.o + +lint: + $(LINT) $(CFLAGS) $(SRC) + +depend: + (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ + $(CC) -MM $(CFLAGS) ${SRC} \ + ) >Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) $(RMFLAGS) Makefile.new + +# DO NOT DELETE THIS LINE +box.o: box.cpp ../includes/msh_Include.h ../GmshDataStr/listman.h \ + ../GmshDataStr/treeman.h ../GmshDataStr/avl.h ../GmshDataStr/ualloc.h \ + ../GmshDataStr/outil.h ../base/base.h ../geo/geo.h \ + ../GmshUnix/message.h ../includes/msh_Const.h ../mesh/structure.h \ + ../includes/msh_Tree.h ../includes/msh_Proto.h \ + ../includes/msh_Version.h ../geo/context.h ../GmshGL/Draw_Post.h \ + ../GmshGL/colortable.h diff --git a/Common/Colors.h b/Common/Colors.h new file mode 100644 index 0000000000000000000000000000000000000000..7f410cbbbb23df407d176daab8dc1e96db820287 --- /dev/null +++ b/Common/Colors.h @@ -0,0 +1,724 @@ +#ifndef _COLORS_H_ +#define _COLORS_H_ + +#include "Context.h" + +extern Context_T CTX ; + +StringXPointer ColorGeneral[] = { + { "Background" , &CTX.color.bg }, + { "Foreground" , &CTX.color.fg }, + { "Text" , &CTX.color.text }, + { "Axes" , &CTX.color.axes }, + { "SmallAxes" , &CTX.color.little_axes }, + { NULL , NULL } +} ; + +StringXPointer ColorGeometry[] = { + { "Points" , &CTX.color.geom.point }, + { "Lines" , &CTX.color.geom.line }, + { "Surfaces" , &CTX.color.geom.surface }, + { "Volumes" , &CTX.color.geom.volume }, + { "PointsSelect" , &CTX.color.geom.point_sel }, + { "LinesSelect" , &CTX.color.geom.line_sel }, + { "SurfacesSelect" , &CTX.color.geom.surface_sel }, + { "VolumesSelect" , &CTX.color.geom.volume_sel }, + { "PointsHighlight" , &CTX.color.geom.point_hlt }, + { "LinesHighlight" , &CTX.color.geom.line_hlt }, + { "SurfacesHighlight" , &CTX.color.geom.surface_hlt }, + { "VolumesHighlight" , &CTX.color.geom.volume_hlt }, + { "Tangents" , &CTX.color.geom.tangents }, + { "Normals" , &CTX.color.geom.normals }, + { NULL , NULL } +} ; + +StringXPointer ColorMesh[] = { + { "Points" , &CTX.color.mesh.vertex }, + { "PointsSupp" , &CTX.color.mesh.vertex_supp }, + { "Lines" , &CTX.color.mesh.line }, + { "Triangles" , &CTX.color.mesh.triangle }, + { "Quadrangles" , &CTX.color.mesh.quadrangle }, + { "Tetrahedra" , &CTX.color.mesh.tetrahedron }, + { "Hexahedra" , &CTX.color.mesh.hexahedron }, + { "Prisms" , &CTX.color.mesh.prism }, + { "Pyramids" , &CTX.color.mesh.pyramid }, + { "Tangents" , &CTX.color.mesh.tangents }, + { "Normals" , &CTX.color.mesh.normals }, + { "One" , &CTX.color.mesh.carousel[0] }, + { "Two" , &CTX.color.mesh.carousel[1] }, + { "Three" , &CTX.color.mesh.carousel[2] }, + { "Four" , &CTX.color.mesh.carousel[3] }, + { "Five" , &CTX.color.mesh.carousel[4] }, + { "Six" , &CTX.color.mesh.carousel[5] }, + { "Seven" , &CTX.color.mesh.carousel[6] }, + { "Eight" , &CTX.color.mesh.carousel[7] }, + { "Nine" , &CTX.color.mesh.carousel[8] }, + { "Ten" , &CTX.color.mesh.carousel[9] }, + { NULL , NULL } +} ; + +StringX4Int ColorString[] = { + { "Snow" , 255, 250, 250, 255 } , + { "GhostWhite" , 248, 248, 255, 255 } , + { "WhiteSmoke" , 245, 245, 245, 255 } , + { "Gainsboro" , 220, 220, 220, 255 } , + { "FloralWhite" , 255, 250, 240, 255 } , + { "OldLace" , 253, 245, 230, 255 } , + { "Linen" , 250, 240, 230, 255 } , + { "AntiqueWhite" , 250, 235, 215, 255 } , + { "PapayaWhip" , 255, 239, 213, 255 } , + { "BlanchedAlmond" , 255, 235, 205, 255 } , + { "Bisque" , 255, 228, 196, 255 } , + { "PeachPuff" , 255, 218, 185, 255 } , + { "Navajo white" , 255, 222, 173, 255 } , + { "NavajoWhite" , 255, 222, 173, 255 } , + { "Moccasin" , 255, 228, 181, 255 } , + { "Cornsilk" , 255, 248, 220, 255 } , + { "Ivory" , 255, 255, 240, 255 } , + { "LemonChiffon" , 255, 250, 205, 255 } , + { "Seashell" , 255, 245, 238, 255 } , + { "Honeydew" , 240, 255, 240, 255 } , + { "MintCream" , 245, 255, 250, 255 } , + { "Azure" , 240, 255, 255, 255 } , + { "AliceBlue" , 240, 248, 255, 255 } , + { "Lavender" , 230, 230, 250, 255 } , + { "LavenderBlush" , 255, 240, 245, 255 } , + { "MistyRose" , 255, 228, 225, 255 } , + { "White" , 255, 255, 255, 255 } , + { "Black" , 0, 0, 0, 255 } , + { "DarkSlateGray" , 47, 79, 79, 255 } , + { "DarkSlateGrey" , 47, 79, 79, 255 } , + { "DimGray" , 105, 105, 105, 255 } , + { "DimGrey" , 105, 105, 105, 255 } , + { "SlateGray" , 112, 128, 144, 255 } , + { "SlateGrey" , 112, 128, 144, 255 } , + { "LightSlateGray" , 119, 136, 153, 255 } , + { "LightSlateGrey" , 119, 136, 153, 255 } , + { "Gray" , 190, 190, 190, 255 } , + { "Grey" , 190, 190, 190, 255 } , + { "LightGrey" , 211, 211, 211, 255 } , + { "LightGray" , 211, 211, 211, 255 } , + { "MidnightBlue" , 25, 25, 112, 255 } , + { "Navy" , 0, 0, 128, 255 } , + { "NavyBlue" , 0, 0, 128, 255 } , + { "CornflowerBlue" , 100, 149, 237, 255 } , + { "DarkSlateBlue" , 72, 61, 139, 255 } , + { "SlateBlue" , 106, 90, 205, 255 } , + { "MediumSlateBlue" , 123, 104, 238, 255 } , + { "LightSlateBlue" , 132, 112, 255, 255 } , + { "MediumBlue" , 0, 0, 205, 255 } , + { "RoyalBlue" , 65, 105, 225, 255 } , + { "Blue" , 0, 0, 255, 255 } , + { "DodgerBlue" , 30, 144, 255, 255 } , + { "DeepSkyBlue" , 0, 191, 255, 255 } , + { "SkyBlue" , 135, 206, 235, 255 } , + { "LightSkyBlue" , 135, 206, 250, 255 } , + { "SteelBlue" , 70, 130, 180, 255 } , + { "LightSteelBlue" , 176, 196, 222, 255 } , + { "LightBlue" , 173, 216, 230, 255 } , + { "PowderBlue" , 176, 224, 230, 255 } , + { "PaleTurquoise" , 175, 238, 238, 255 } , + { "DarkTurquoise" , 0, 206, 209, 255 } , + { "MediumTurquoise" , 72, 209, 204, 255 } , + { "Turquoise" , 64, 224, 208, 255 } , + { "Cyan" , 0, 255, 255, 255 } , + { "LightCyan" , 224, 255, 255, 255 } , + { "CadetBlue" , 95, 158, 160, 255 } , + { "MediumAquamarine" , 102, 205, 170, 255 } , + { "Aquamarine" , 127, 255, 212, 255 } , + { "DarkGreen" , 0, 100, 0, 255 } , + { "DarkOliveGreen" , 85, 107, 47, 255 } , + { "DarkSeaGreen" , 143, 188, 143, 255 } , + { "SeaGreen" , 46, 139, 87, 255 } , + { "MediumSeaGreen" , 60, 179, 113, 255 } , + { "LightSeaGreen" , 32, 178, 170, 255 } , + { "PaleGreen" , 152, 251, 152, 255 } , + { "SpringGreen" , 0, 255, 127, 255 } , + { "LawnGreen" , 124, 252, 0, 255 } , + { "Green" , 0, 255, 0, 255 } , + { "chartreuse" , 127, 255, 0, 255 } , + { "MediumSpringGreen" , 0, 250, 154, 255 } , + { "GreenYellow" , 173, 255, 47, 255 } , + { "LimeGreen" , 50, 205, 50, 255 } , + { "YellowGreen" , 154, 205, 50, 255 } , + { "ForestGreen" , 34, 139, 34, 255 } , + { "OliveDrab" , 107, 142, 35, 255 } , + { "DarkKhaki" , 189, 183, 107, 255 } , + { "Khaki" , 240, 230, 140, 255 } , + { "PaleGoldenrod" , 238, 232, 170, 255 } , + { "LightGoldenrodYellow" , 250, 250, 210, 255 } , + { "LightYellow" , 255, 255, 224, 255 } , + { "Yellow" , 255, 255, 0, 255 } , + { "Gold" , 255, 215, 0, 255 } , + { "LightGoldenrod" , 238, 221, 130, 255 } , + { "Goldenrod" , 218, 165, 32, 255 } , + { "DarkGoldenrod" , 184, 134, 11, 255 } , + { "RosyBrown" , 188, 143, 143, 255 } , + { "IndianRed" , 205, 92, 92, 255 } , + { "SaddleBrown" , 139, 69, 19, 255 } , + { "Sienna" , 160, 82, 45, 255 } , + { "Peru" , 205, 133, 63, 255 } , + { "Burlywood" , 222, 184, 135, 255 } , + { "Beige" , 245, 245, 220, 255 } , + { "Wheat" , 245, 222, 179, 255 } , + { "SandyBrown" , 244, 164, 96, 255 } , + { "Tan" , 210, 180, 140, 255 } , + { "Chocolate" , 210, 105, 30, 255 } , + { "Firebrick" , 178, 34, 34, 255 } , + { "Brown" , 165, 42, 42, 255 } , + { "DarkSalmon" , 233, 150, 122, 255 } , + { "Salmon" , 250, 128, 114, 255 } , + { "LightSalmon" , 255, 160, 122, 255 } , + { "Orange" , 255, 165, 0, 255 } , + { "DarkOrange" , 255, 140, 0, 255 } , + { "Coral" , 255, 127, 80, 255 } , + { "LightCoral" , 240, 128, 128, 255 } , + { "Tomato" , 255, 99, 71, 255 } , + { "OrangeRed" , 255, 69, 0, 255 } , + { "Red" , 255, 0, 0, 255 } , + { "HotPink" , 255, 105, 180, 255 } , + { "DeepPink" , 255, 20, 147, 255 } , + { "Pink" , 255, 192, 203, 255 } , + { "LightPink" , 255, 182, 193, 255 } , + { "PaleVioletRed" , 219, 112, 147, 255 } , + { "Maroon" , 176, 48, 96, 255 } , + { "MediumVioletRed" , 199, 21, 133, 255 } , + { "VioletRed" , 208, 32, 144, 255 } , + { "Magenta" , 255, 0, 255, 255 } , + { "Violet" , 238, 130, 238, 255 } , + { "Plum" , 221, 160, 221, 255 } , + { "Orchid" , 218, 112, 214, 255 } , + { "MediumOrchid" , 186, 85, 211, 255 } , + { "DarkOrchid" , 153, 50, 204, 255 } , + { "DarkViolet" , 148, 0, 211, 255 } , + { "BlueViolet" , 138, 43, 226, 255 } , + { "Purple" , 160, 32, 240, 255 } , + { "MediumPurple" , 147, 112, 219, 255 } , + { "Thistle" , 216, 191, 216, 255 } , + { "Snow1" , 255, 250, 250, 255 } , + { "Snow2" , 238, 233, 233, 255 } , + { "Snow3" , 205, 201, 201, 255 } , + { "Snow4" , 139, 137, 137, 255 } , + { "Seashell1" , 255, 245, 238, 255 } , + { "Seashell2" , 238, 229, 222, 255 } , + { "Seashell3" , 205, 197, 191, 255 } , + { "Seashell4" , 139, 134, 130, 255 } , + { "AntiqueWhite1" , 255, 239, 219, 255 } , + { "AntiqueWhite2" , 238, 223, 204, 255 } , + { "AntiqueWhite3" , 205, 192, 176, 255 } , + { "AntiqueWhite4" , 139, 131, 120, 255 } , + { "Bisque1" , 255, 228, 196, 255 } , + { "Bisque2" , 238, 213, 183, 255 } , + { "Bisque3" , 205, 183, 158, 255 } , + { "Bisque4" , 139, 125, 107, 255 } , + { "PeachPuff1" , 255, 218, 185, 255 } , + { "PeachPuff2" , 238, 203, 173, 255 } , + { "PeachPuff3" , 205, 175, 149, 255 } , + { "PeachPuff4" , 139, 119, 101, 255 } , + { "NavajoWhite1" , 255, 222, 173, 255 } , + { "NavajoWhite2" , 238, 207, 161, 255 } , + { "NavajoWhite3" , 205, 179, 139, 255 } , + { "NavajoWhite4" , 139, 121, 94, 255 } , + { "LemonChiffon1" , 255, 250, 205, 255 } , + { "LemonChiffon2" , 238, 233, 191, 255 } , + { "LemonChiffon3" , 205, 201, 165, 255 } , + { "LemonChiffon4" , 139, 137, 112, 255 } , + { "Cornsilk1" , 255, 248, 220, 255 } , + { "Cornsilk2" , 238, 232, 205, 255 } , + { "Cornsilk3" , 205, 200, 177, 255 } , + { "Cornsilk4" , 139, 136, 120, 255 } , + { "Ivory1" , 255, 255, 240, 255 } , + { "Ivory2" , 238, 238, 224, 255 } , + { "Ivory3" , 205, 205, 193, 255 } , + { "Ivory4" , 139, 139, 131, 255 } , + { "Honeydew1" , 240, 255, 240, 255 } , + { "Honeydew2" , 224, 238, 224, 255 } , + { "Honeydew3" , 193, 205, 193, 255 } , + { "Honeydew4" , 131, 139, 131, 255 } , + { "LavenderBlush1" , 255, 240, 245, 255 } , + { "LavenderBlush2" , 238, 224, 229, 255 } , + { "LavenderBlush3" , 205, 193, 197, 255 } , + { "LavenderBlush4" , 139, 131, 134, 255 } , + { "MistyRose1" , 255, 228, 225, 255 } , + { "MistyRose2" , 238, 213, 210, 255 } , + { "MistyRose3" , 205, 183, 181, 255 } , + { "MistyRose4" , 139, 125, 123, 255 } , + { "Azure1" , 240, 255, 255, 255 } , + { "Azure2" , 224, 238, 238, 255 } , + { "Azure3" , 193, 205, 205, 255 } , + { "Azure4" , 131, 139, 139, 255 } , + { "SlateBlue1" , 131, 111, 255, 255 } , + { "SlateBlue2" , 122, 103, 238, 255 } , + { "SlateBlue3" , 105, 89, 205, 255 } , + { "SlateBlue4" , 71, 60, 139, 255 } , + { "RoyalBlue1" , 72, 118, 255, 255 } , + { "RoyalBlue2" , 67, 110, 238, 255 } , + { "RoyalBlue3" , 58, 95, 205, 255 } , + { "RoyalBlue4" , 39, 64, 139, 255 } , + { "Blue1" , 0, 0, 255, 255 } , + { "Blue2" , 0, 0, 238, 255 } , + { "Blue3" , 0, 0, 205, 255 } , + { "Blue4" , 0, 0, 139, 255 } , + { "DodgerBlue1" , 30, 144, 255, 255 } , + { "DodgerBlue2" , 28, 134, 238, 255 } , + { "DodgerBlue3" , 24, 116, 205, 255 } , + { "DodgerBlue4" , 16, 78, 139, 255 } , + { "SteelBlue1" , 99, 184, 255, 255 } , + { "SteelBlue2" , 92, 172, 238, 255 } , + { "SteelBlue3" , 79, 148, 205, 255 } , + { "SteelBlue4" , 54, 100, 139, 255 } , + { "DeepSkyBlue1" , 0, 191, 255, 255 } , + { "DeepSkyBlue2" , 0, 178, 238, 255 } , + { "DeepSkyBlue3" , 0, 154, 205, 255 } , + { "DeepSkyBlue4" , 0, 104, 139, 255 } , + { "SkyBlue1" , 135, 206, 255, 255 } , + { "SkyBlue2" , 126, 192, 238, 255 } , + { "SkyBlue3" , 108, 166, 205, 255 } , + { "SkyBlue4" , 74, 112, 139, 255 } , + { "LightSkyBlue1" , 176, 226, 255, 255 } , + { "LightSkyBlue2" , 164, 211, 238, 255 } , + { "LightSkyBlue3" , 141, 182, 205, 255 } , + { "LightSkyBlue4" , 96, 123, 139, 255 } , + { "SlateGray1" , 198, 226, 255, 255 } , + { "SlateGray2" , 185, 211, 238, 255 } , + { "SlateGray3" , 159, 182, 205, 255 } , + { "SlateGray4" , 108, 123, 139, 255 } , + { "LightSteelBlue1" , 202, 225, 255, 255 } , + { "LightSteelBlue2" , 188, 210, 238, 255 } , + { "LightSteelBlue3" , 162, 181, 205, 255 } , + { "LightSteelBlue4" , 110, 123, 139, 255 } , + { "LightBlue1" , 191, 239, 255, 255 } , + { "LightBlue2" , 178, 223, 238, 255 } , + { "LightBlue3" , 154, 192, 205, 255 } , + { "LightBlue4" , 104, 131, 139, 255 } , + { "LightCyan1" , 224, 255, 255, 255 } , + { "LightCyan2" , 209, 238, 238, 255 } , + { "LightCyan3" , 180, 205, 205, 255 } , + { "LightCyan4" , 122, 139, 139, 255 } , + { "PaleTurquoise1" , 187, 255, 255, 255 } , + { "PaleTurquoise2" , 174, 238, 238, 255 } , + { "PaleTurquoise3" , 150, 205, 205, 255 } , + { "PaleTurquoise4" , 102, 139, 139, 255 } , + { "CadetBlue1" , 152, 245, 255, 255 } , + { "CadetBlue2" , 142, 229, 238, 255 } , + { "CadetBlue3" , 122, 197, 205, 255 } , + { "CadetBlue4" , 83, 134, 139, 255 } , + { "Turquoise1" , 0, 245, 255, 255 } , + { "Turquoise2" , 0, 229, 238, 255 } , + { "Turquoise3" , 0, 197, 205, 255 } , + { "Turquoise4" , 0, 134, 139, 255 } , + { "Cyan1" , 0, 255, 255, 255 } , + { "Cyan2" , 0, 238, 238, 255 } , + { "Cyan3" , 0, 205, 205, 255 } , + { "Cyan4" , 0, 139, 139, 255 } , + { "DarkSlateGray1" , 151, 255, 255, 255 } , + { "DarkSlateGray2" , 141, 238, 238, 255 } , + { "DarkSlateGray3" , 121, 205, 205, 255 } , + { "DarkSlateGray4" , 82, 139, 139, 255 } , + { "Aquamarine1" , 127, 255, 212, 255 } , + { "Aquamarine2" , 118, 238, 198, 255 } , + { "Aquamarine3" , 102, 205, 170, 255 } , + { "Aquamarine4" , 69, 139, 116, 255 } , + { "DarkSeaGreen1" , 193, 255, 193, 255 } , + { "DarkSeaGreen2" , 180, 238, 180, 255 } , + { "DarkSeaGreen3" , 155, 205, 155, 255 } , + { "DarkSeaGreen4" , 105, 139, 105, 255 } , + { "SeaGreen1" , 84, 255, 159, 255 } , + { "SeaGreen2" , 78, 238, 148, 255 } , + { "SeaGreen3" , 67, 205, 128, 255 } , + { "SeaGreen4" , 46, 139, 87, 255 } , + { "PaleGreen1" , 154, 255, 154, 255 } , + { "PaleGreen2" , 144, 238, 144, 255 } , + { "PaleGreen3" , 124, 205, 124, 255 } , + { "PaleGreen4" , 84, 139, 84, 255 } , + { "SpringGreen1" , 0, 255, 127, 255 } , + { "SpringGreen2" , 0, 238, 118, 255 } , + { "SpringGreen3" , 0, 205, 102, 255 } , + { "SpringGreen4" , 0, 139, 69, 255 } , + { "Green1" , 0, 255, 0, 255 } , + { "Green2" , 0, 238, 0, 255 } , + { "Green3" , 0, 205, 0, 255 } , + { "Green4" , 0, 139, 0, 255 } , + { "Chartreuse1" , 127, 255, 0, 255 } , + { "Chartreuse2" , 118, 238, 0, 255 } , + { "Chartreuse3" , 102, 205, 0, 255 } , + { "Chartreuse4" , 69, 139, 0, 255 } , + { "OliveDrab1" , 192, 255, 62, 255 } , + { "OliveDrab2" , 179, 238, 58, 255 } , + { "OliveDrab3" , 154, 205, 50, 255 } , + { "OliveDrab4" , 105, 139, 34, 255 } , + { "DarkOliveGreen1" , 202, 255, 112, 255 } , + { "DarkOliveGreen2" , 188, 238, 104, 255 } , + { "DarkOliveGreen3" , 162, 205, 90, 255 } , + { "DarkOliveGreen4" , 110, 139, 61, 255 } , + { "Khaki1" , 255, 246, 143, 255 } , + { "Khaki2" , 238, 230, 133, 255 } , + { "Khaki3" , 205, 198, 115, 255 } , + { "Khaki4" , 139, 134, 78, 255 } , + { "LightGoldenrod1" , 255, 236, 139, 255 } , + { "LightGoldenrod2" , 238, 220, 130, 255 } , + { "LightGoldenrod3" , 205, 190, 112, 255 } , + { "LightGoldenrod4" , 139, 129, 76, 255 } , + { "LightYellow1" , 255, 255, 224, 255 } , + { "LightYellow2" , 238, 238, 209, 255 } , + { "LightYellow3" , 205, 205, 180, 255 } , + { "LightYellow4" , 139, 139, 122, 255 } , + { "Yellow1" , 255, 255, 0, 255 } , + { "Yellow2" , 238, 238, 0, 255 } , + { "Yellow3" , 205, 205, 0, 255 } , + { "Yellow4" , 139, 139, 0, 255 } , + { "Gold1" , 255, 215, 0, 255 } , + { "Gold2" , 238, 201, 0, 255 } , + { "Gold3" , 205, 173, 0, 255 } , + { "Gold4" , 139, 117, 0, 255 } , + { "Goldenrod1" , 255, 193, 37, 255 } , + { "Goldenrod2" , 238, 180, 34, 255 } , + { "Goldenrod3" , 205, 155, 29, 255 } , + { "Goldenrod4" , 139, 105, 20, 255 } , + { "DarkGoldenrod1" , 255, 185, 15, 255 } , + { "DarkGoldenrod2" , 238, 173, 14, 255 } , + { "DarkGoldenrod3" , 205, 149, 12, 255 } , + { "DarkGoldenrod4" , 139, 101, 8, 255 } , + { "RosyBrown1" , 255, 193, 193, 255 } , + { "RosyBrown2" , 238, 180, 180, 255 } , + { "RosyBrown3" , 205, 155, 155, 255 } , + { "RosyBrown4" , 139, 105, 105, 255 } , + { "IndianRed1" , 255, 106, 106, 255 } , + { "IndianRed2" , 238, 99, 99, 255 } , + { "IndianRed3" , 205, 85, 85, 255 } , + { "IndianRed4" , 139, 58, 58, 255 } , + { "Sienna1" , 255, 130, 71, 255 } , + { "Sienna2" , 238, 121, 66, 255 } , + { "Sienna3" , 205, 104, 57, 255 } , + { "Sienna4" , 139, 71, 38, 255 } , + { "Burlywood1" , 255, 211, 155, 255 } , + { "Burlywood2" , 238, 197, 145, 255 } , + { "Burlywood3" , 205, 170, 125, 255 } , + { "Burlywood4" , 139, 115, 85, 255 } , + { "Wheat1" , 255, 231, 186, 255 } , + { "Wheat2" , 238, 216, 174, 255 } , + { "Wheat3" , 205, 186, 150, 255 } , + { "Wheat4" , 139, 126, 102, 255 } , + { "Tan1" , 255, 165, 79, 255 } , + { "Tan2" , 238, 154, 73, 255 } , + { "Tan3" , 205, 133, 63, 255 } , + { "Tan4" , 139, 90, 43, 255 } , + { "Chocolate1" , 255, 127, 36, 255 } , + { "Chocolate2" , 238, 118, 33, 255 } , + { "Chocolate3" , 205, 102, 29, 255 } , + { "Chocolate4" , 139, 69, 19, 255 } , + { "Firebrick1" , 255, 48, 48, 255 } , + { "Firebrick2" , 238, 44, 44, 255 } , + { "Firebrick3" , 205, 38, 38, 255 } , + { "Firebrick4" , 139, 26, 26, 255 } , + { "Brown1" , 255, 64, 64, 255 } , + { "Brown2" , 238, 59, 59, 255 } , + { "Brown3" , 205, 51, 51, 255 } , + { "Brown4" , 139, 35, 35, 255 } , + { "Salmon1" , 255, 140, 105, 255 } , + { "Salmon2" , 238, 130, 98, 255 } , + { "Salmon3" , 205, 112, 84, 255 } , + { "Salmon4" , 139, 76, 57, 255 } , + { "LightSalmon1" , 255, 160, 122, 255 } , + { "LightSalmon2" , 238, 149, 114, 255 } , + { "LightSalmon3" , 205, 129, 98, 255 } , + { "LightSalmon4" , 139, 87, 66, 255 } , + { "Orange1" , 255, 165, 0, 255 } , + { "Orange2" , 238, 154, 0, 255 } , + { "Orange3" , 205, 133, 0, 255 } , + { "Orange4" , 139, 90, 0, 255 } , + { "DarkOrange1" , 255, 127, 0, 255 } , + { "DarkOrange2" , 238, 118, 0, 255 } , + { "DarkOrange3" , 205, 102, 0, 255 } , + { "DarkOrange4" , 139, 69, 0, 255 } , + { "Coral1" , 255, 114, 86, 255 } , + { "Coral2" , 238, 106, 80, 255 } , + { "Coral3" , 205, 91, 69, 255 } , + { "Coral4" , 139, 62, 47, 255 } , + { "Tomato1" , 255, 99, 71, 255 } , + { "Tomato2" , 238, 92, 66, 255 } , + { "Tomato3" , 205, 79, 57, 255 } , + { "Tomato4" , 139, 54, 38, 255 } , + { "OrangeRed1" , 255, 69, 0, 255 } , + { "OrangeRed2" , 238, 64, 0, 255 } , + { "OrangeRed3" , 205, 55, 0, 255 } , + { "OrangeRed4" , 139, 37, 0, 255 } , + { "Red1" , 255, 0, 0, 255 } , + { "Red2" , 238, 0, 0, 255 } , + { "Red3" , 205, 0, 0, 255 } , + { "Red4" , 139, 0, 0, 255 } , + { "DeepPink1" , 255, 20, 147, 255 } , + { "DeepPink2" , 238, 18, 137, 255 } , + { "DeepPink3" , 205, 16, 118, 255 } , + { "DeepPink4" , 139, 10, 80, 255 } , + { "HotPink1" , 255, 110, 180, 255 } , + { "HotPink2" , 238, 106, 167, 255 } , + { "HotPink3" , 205, 96, 144, 255 } , + { "HotPink4" , 139, 58, 98, 255 } , + { "Pink1" , 255, 181, 197, 255 } , + { "Pink2" , 238, 169, 184, 255 } , + { "Pink3" , 205, 145, 158, 255 } , + { "Pink4" , 139, 99, 108, 255 } , + { "LightPink1" , 255, 174, 185, 255 } , + { "LightPink2" , 238, 162, 173, 255 } , + { "LightPink3" , 205, 140, 149, 255 } , + { "LightPink4" , 139, 95, 101, 255 } , + { "PaleVioletRed1" , 255, 130, 171, 255 } , + { "PaleVioletRed2" , 238, 121, 159, 255 } , + { "PaleVioletRed3" , 205, 104, 137, 255 } , + { "PaleVioletRed4" , 139, 71, 93, 255 } , + { "Maroon1" , 255, 52, 179, 255 } , + { "Maroon2" , 238, 48, 167, 255 } , + { "Maroon3" , 205, 41, 144, 255 } , + { "Maroon4" , 139, 28, 98, 255 } , + { "VioletRed1" , 255, 62, 150, 255 } , + { "VioletRed2" , 238, 58, 140, 255 } , + { "VioletRed3" , 205, 50, 120, 255 } , + { "VioletRed4" , 139, 34, 82, 255 } , + { "Magenta1" , 255, 0, 255, 255 } , + { "Magenta2" , 238, 0, 238, 255 } , + { "Magenta3" , 205, 0, 205, 255 } , + { "Magenta4" , 139, 0, 139, 255 } , + { "Orchid1" , 255, 131, 250, 255 } , + { "Orchid2" , 238, 122, 233, 255 } , + { "Orchid3" , 205, 105, 201, 255 } , + { "Orchid4" , 139, 71, 137, 255 } , + { "Plum1" , 255, 187, 255, 255 } , + { "Plum2" , 238, 174, 238, 255 } , + { "Plum3" , 205, 150, 205, 255 } , + { "Plum4" , 139, 102, 139, 255 } , + { "MediumOrchid1" , 224, 102, 255, 255 } , + { "MediumOrchid2" , 209, 95, 238, 255 } , + { "MediumOrchid3" , 180, 82, 205, 255 } , + { "MediumOrchid4" , 122, 55, 139, 255 } , + { "DarkOrchid1" , 191, 62, 255, 255 } , + { "DarkOrchid2" , 178, 58, 238, 255 } , + { "DarkOrchid3" , 154, 50, 205, 255 } , + { "DarkOrchid4" , 104, 34, 139, 255 } , + { "purple1" , 155, 48, 255, 255 } , + { "purple2" , 145, 44, 238, 255 } , + { "purple3" , 125, 38, 205, 255 } , + { "purple4" , 85, 26, 139, 255 } , + { "MediumPurple1" , 171, 130, 255, 255 } , + { "MediumPurple2" , 159, 121, 238, 255 } , + { "MediumPurple3" , 137, 104, 205, 255 } , + { "MediumPurple4" , 93, 71, 139, 255 } , + { "Thistle1" , 255, 225, 255, 255 } , + { "Thistle2" , 238, 210, 238, 255 } , + { "Thistle3" , 205, 181, 205, 255 } , + { "Thistle4" , 139, 123, 139, 255 } , + { "Gray0" , 0, 0, 0, 255 } , + { "Grey0" , 0, 0, 0, 255 } , + { "Gray1" , 3, 3, 3, 255 } , + { "Grey1" , 3, 3, 3, 255 } , + { "Gray2" , 5, 5, 5, 255 } , + { "Grey2" , 5, 5, 5, 255 } , + { "Gray3" , 8, 8, 8, 255 } , + { "Grey3" , 8, 8, 8, 255 } , + { "Gray4" , 10, 10, 10, 255 } , + { "Grey4" , 10, 10, 10, 255 } , + { "Gray5" , 13, 13, 13, 255 } , + { "Grey5" , 13, 13, 13, 255 } , + { "Gray6" , 15, 15, 15, 255 } , + { "Grey6" , 15, 15, 15, 255 } , + { "Gray7" , 18, 18, 18, 255 } , + { "Grey7" , 18, 18, 18, 255 } , + { "Gray8" , 20, 20, 20, 255 } , + { "Grey8" , 20, 20, 20, 255 } , + { "Gray9" , 23, 23, 23, 255 } , + { "Grey9" , 23, 23, 23, 255 } , + { "Gray10" , 26, 26, 26, 255 } , + { "Grey10" , 26, 26, 26, 255 } , + { "Gray11" , 28, 28, 28, 255 } , + { "Grey11" , 28, 28, 28, 255 } , + { "Gray12" , 31, 31, 31, 255 } , + { "Grey12" , 31, 31, 31, 255 } , + { "Gray13" , 33, 33, 33, 255 } , + { "Grey13" , 33, 33, 33, 255 } , + { "Gray14" , 36, 36, 36, 255 } , + { "Grey14" , 36, 36, 36, 255 } , + { "Gray15" , 38, 38, 38, 255 } , + { "Grey15" , 38, 38, 38, 255 } , + { "Gray16" , 41, 41, 41, 255 } , + { "Grey16" , 41, 41, 41, 255 } , + { "Gray17" , 43, 43, 43, 255 } , + { "Grey17" , 43, 43, 43, 255 } , + { "Gray18" , 46, 46, 46, 255 } , + { "Grey18" , 46, 46, 46, 255 } , + { "Gray19" , 48, 48, 48, 255 } , + { "Grey19" , 48, 48, 48, 255 } , + { "Gray20" , 51, 51, 51, 255 } , + { "Grey20" , 51, 51, 51, 255 } , + { "Gray21" , 54, 54, 54, 255 } , + { "Grey21" , 54, 54, 54, 255 } , + { "Gray22" , 56, 56, 56, 255 } , + { "Grey22" , 56, 56, 56, 255 } , + { "Gray23" , 59, 59, 59, 255 } , + { "Grey23" , 59, 59, 59, 255 } , + { "Gray24" , 61, 61, 61, 255 } , + { "Grey24" , 61, 61, 61, 255 } , + { "Gray25" , 64, 64, 64, 255 } , + { "Grey25" , 64, 64, 64, 255 } , + { "Gray26" , 66, 66, 66, 255 } , + { "Grey26" , 66, 66, 66, 255 } , + { "Gray27" , 69, 69, 69, 255 } , + { "Grey27" , 69, 69, 69, 255 } , + { "Gray28" , 71, 71, 71, 255 } , + { "Grey28" , 71, 71, 71, 255 } , + { "Gray29" , 74, 74, 74, 255 } , + { "Grey29" , 74, 74, 74, 255 } , + { "Gray30" , 77, 77, 77, 255 } , + { "Grey30" , 77, 77, 77, 255 } , + { "Gray31" , 79, 79, 79, 255 } , + { "Grey31" , 79, 79, 79, 255 } , + { "Gray32" , 82, 82, 82, 255 } , + { "Grey32" , 82, 82, 82, 255 } , + { "Gray33" , 84, 84, 84, 255 } , + { "Grey33" , 84, 84, 84, 255 } , + { "Gray34" , 87, 87, 87, 255 } , + { "Grey34" , 87, 87, 87, 255 } , + { "Gray35" , 89, 89, 89, 255 } , + { "Grey35" , 89, 89, 89, 255 } , + { "Gray36" , 92, 92, 92, 255 } , + { "Grey36" , 92, 92, 92, 255 } , + { "Gray37" , 94, 94, 94, 255 } , + { "Grey37" , 94, 94, 94, 255 } , + { "Gray38" , 97, 97, 97, 255 } , + { "Grey38" , 97, 97, 97, 255 } , + { "Gray39" , 99, 99, 99, 255 } , + { "Grey39" , 99, 99, 99, 255 } , + { "Gray40" , 102, 102, 102, 255 } , + { "Grey40" , 102, 102, 102, 255 } , + { "Gray41" , 105, 105, 105, 255 } , + { "Grey41" , 105, 105, 105, 255 } , + { "Gray42" , 107, 107, 107, 255 } , + { "Grey42" , 107, 107, 107, 255 } , + { "Gray43" , 110, 110, 110, 255 } , + { "Grey43" , 110, 110, 110, 255 } , + { "Gray44" , 112, 112, 112, 255 } , + { "Grey44" , 112, 112, 112, 255 } , + { "Gray45" , 115, 115, 115, 255 } , + { "Grey45" , 115, 115, 115, 255 } , + { "Gray46" , 117, 117, 117, 255 } , + { "Grey46" , 117, 117, 117, 255 } , + { "Gray47" , 120, 120, 120, 255 } , + { "Grey47" , 120, 120, 120, 255 } , + { "Gray48" , 122, 122, 122, 255 } , + { "Grey48" , 122, 122, 122, 255 } , + { "Gray49" , 125, 125, 125, 255 } , + { "Grey49" , 125, 125, 125, 255 } , + { "Gray50" , 127, 127, 127, 255 } , + { "Grey50" , 127, 127, 127, 255 } , + { "Gray51" , 130, 130, 130, 255 } , + { "Grey51" , 130, 130, 130, 255 } , + { "Gray52" , 133, 133, 133, 255 } , + { "Grey52" , 133, 133, 133, 255 } , + { "Gray53" , 135, 135, 135, 255 } , + { "Grey53" , 135, 135, 135, 255 } , + { "Gray54" , 138, 138, 138, 255 } , + { "Grey54" , 138, 138, 138, 255 } , + { "Gray55" , 140, 140, 140, 255 } , + { "Grey55" , 140, 140, 140, 255 } , + { "Gray56" , 143, 143, 143, 255 } , + { "Grey56" , 143, 143, 143, 255 } , + { "Gray57" , 145, 145, 145, 255 } , + { "Grey57" , 145, 145, 145, 255 } , + { "Gray58" , 148, 148, 148, 255 } , + { "Grey58" , 148, 148, 148, 255 } , + { "Gray59" , 150, 150, 150, 255 } , + { "Grey59" , 150, 150, 150, 255 } , + { "Gray60" , 153, 153, 153, 255 } , + { "Grey60" , 153, 153, 153, 255 } , + { "Gray61" , 156, 156, 156, 255 } , + { "Grey61" , 156, 156, 156, 255 } , + { "Gray62" , 158, 158, 158, 255 } , + { "Grey62" , 158, 158, 158, 255 } , + { "Gray63" , 161, 161, 161, 255 } , + { "Grey63" , 161, 161, 161, 255 } , + { "Gray64" , 163, 163, 163, 255 } , + { "Grey64" , 163, 163, 163, 255 } , + { "Gray65" , 166, 166, 166, 255 } , + { "Grey65" , 166, 166, 166, 255 } , + { "Gray66" , 168, 168, 168, 255 } , + { "Grey66" , 168, 168, 168, 255 } , + { "Gray67" , 171, 171, 171, 255 } , + { "Grey67" , 171, 171, 171, 255 } , + { "Gray68" , 173, 173, 173, 255 } , + { "Grey68" , 173, 173, 173, 255 } , + { "Gray69" , 176, 176, 176, 255 } , + { "Grey69" , 176, 176, 176, 255 } , + { "Gray70" , 179, 179, 179, 255 } , + { "Grey70" , 179, 179, 179, 255 } , + { "Gray71" , 181, 181, 181, 255 } , + { "Grey71" , 181, 181, 181, 255 } , + { "Gray72" , 184, 184, 184, 255 } , + { "Grey72" , 184, 184, 184, 255 } , + { "Gray73" , 186, 186, 186, 255 } , + { "Grey73" , 186, 186, 186, 255 } , + { "Gray74" , 189, 189, 189, 255 } , + { "Grey74" , 189, 189, 189, 255 } , + { "Gray75" , 191, 191, 191, 255 } , + { "Grey75" , 191, 191, 191, 255 } , + { "Gray76" , 194, 194, 194, 255 } , + { "Grey76" , 194, 194, 194, 255 } , + { "Gray77" , 196, 196, 196, 255 } , + { "Grey77" , 196, 196, 196, 255 } , + { "Gray78" , 199, 199, 199, 255 } , + { "Grey78" , 199, 199, 199, 255 } , + { "Gray79" , 201, 201, 201, 255 } , + { "Grey79" , 201, 201, 201, 255 } , + { "Gray80" , 204, 204, 204, 255 } , + { "Grey80" , 204, 204, 204, 255 } , + { "Gray81" , 207, 207, 207, 255 } , + { "Grey81" , 207, 207, 207, 255 } , + { "Gray82" , 209, 209, 209, 255 } , + { "Grey82" , 209, 209, 209, 255 } , + { "Gray83" , 212, 212, 212, 255 } , + { "Grey83" , 212, 212, 212, 255 } , + { "Gray84" , 214, 214, 214, 255 } , + { "Grey84" , 214, 214, 214, 255 } , + { "Gray85" , 217, 217, 217, 255 } , + { "Grey85" , 217, 217, 217, 255 } , + { "Gray86" , 219, 219, 219, 255 } , + { "Grey86" , 219, 219, 219, 255 } , + { "Gray87" , 222, 222, 222, 255 } , + { "Grey87" , 222, 222, 222, 255 } , + { "Gray88" , 224, 224, 224, 255 } , + { "Grey88" , 224, 224, 224, 255 } , + { "Gray89" , 227, 227, 227, 255 } , + { "Grey89" , 227, 227, 227, 255 } , + { "Gray90" , 229, 229, 229, 255 } , + { "Grey90" , 229, 229, 229, 255 } , + { "Gray91" , 232, 232, 232, 255 } , + { "Grey91" , 232, 232, 232, 255 } , + { "Gray92" , 235, 235, 235, 255 } , + { "Grey92" , 235, 235, 235, 255 } , + { "Gray93" , 237, 237, 237, 255 } , + { "Grey93" , 237, 237, 237, 255 } , + { "Gray94" , 240, 240, 240, 255 } , + { "Grey94" , 240, 240, 240, 255 } , + { "Gray95" , 242, 242, 242, 255 } , + { "Grey95" , 242, 242, 242, 255 } , + { "Gray96" , 245, 245, 245, 255 } , + { "Grey96" , 245, 245, 245, 255 } , + { "Gray97" , 247, 247, 247, 255 } , + { "Grey97" , 247, 247, 247, 255 } , + { "Gray98" , 250, 250, 250, 255 } , + { "Grey98" , 250, 250, 250, 255 } , + { "Gray99" , 252, 252, 252, 255 } , + { "Grey99" , 252, 252, 252, 255 } , + { "Gray100" , 255, 255, 255, 255 } , + { "Grey100" , 255, 255, 255, 255 } , + { "DarkGrey" , 169, 169, 169, 255 } , + { "DarkGray" , 169, 169, 169, 255 } , + { "DarkBlue" , 0 , 0, 139, 255 } , + { "DarkCyan" , 0 , 139, 139, 255 } , + { "DarkMagenta" , 139, 0, 139, 255 } , + { "DarkRed" , 139, 0, 0, 255 } , + { "LightGreen" , 144, 238, 144, 255 } , + { NULL , 0 , 0, 0, 255 } +} ; + + + +#endif diff --git a/Common/Const.h b/Common/Const.h new file mode 100644 index 0000000000000000000000000000000000000000..85f437715b28f6df85599247a70f7260adac9452 --- /dev/null +++ b/Common/Const.h @@ -0,0 +1,53 @@ +#ifndef _CONSTS_H_ +#define _CONSTS_H_ + +//#define RAND_LONG LC * ((rand()%1000)/1.E08) +//#define RAND_LONG LC * ((rand()%1000)/1.E08)/10. + +//RAND_LONG in [0, LC/1.e6] +#define RAND_LONG (LC/1.e6*rand()/RAND_MAX) + +//EPSILON_LONG in [0, LC/1.e12] +#define EPSILON_LC (LC/1.e12*rand()/RAND_MAX) + +#define RADTODEG 57.29578 + +#define TEXT_BUFFER_SIZE 1024 +#define SELECTION_BUFFER_SIZE 1024 +#define LABEL_STR_L 16 +#define NAME_STR_L 256 +#define MAX_OPEN_FILES 20 + +#define RacineDeDeux 1.41421356237 +#define RacineDeTrois 1.73205080757 +#define Pi 3.14159265359 +#define Deux_Pi 6.28318530718 +#define UnTiers 0.33333333333 + +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)<(b))?(b):(a)) +#define SQR(a) (((a)==0.0)?0.0:((a)*(a))) + +#define IMIN MIN +#define LMIN MIN +#define FMIN MIN +#define DMIN MIN + +#define IMAX MAX +#define LMAX MAX +#define FMAX MAX +#define DMAX MAX + +#define DSQR SQR +#define FSQR SQU + +#define THRESHOLD(a,b,c) (((a)>(c))?(c):((a)<(b)?(b):(a))) + +#define myhypot(a,b) (sqrt((a)*(a)+(b)*(b))) + +#define sign(x) (((x)>=0)?1:-1) +#define Pred(x) ((x)->prev) +#define Succ(x) ((x)->next) +#define square(x) ((x)*(x)) + +#endif diff --git a/Common/Context.cpp b/Common/Context.cpp new file mode 100644 index 0000000000000000000000000000000000000000..86ac187a633126fb30803a0b6666d355b051b370 --- /dev/null +++ b/Common/Context.cpp @@ -0,0 +1,251 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Context.h" + +void InitColors(rgbacolors * col, int num){ + + if(col->id == num){ + return ; + } + + col->id = num ; + + switch(num){ + + case 0 : /* default drawing colors: black background */ + case 1 : /* alternative drawing colors: white background */ + switch(num){ + case 0 : + col->bg = PACK_COLOR(0, 0, 0, 255) ; + col->fg = PACK_COLOR(255, 255, 255, 255) ; + col->text = PACK_COLOR(255, 255, 255, 255) ; + col->axes = PACK_COLOR(255, 255, 0, 255) ; + col->little_axes = PACK_COLOR(255, 255, 255, 255) ; + break; + case 1 : + col->bg = PACK_COLOR(255, 255, 255, 255) ; + col->fg = PACK_COLOR(0, 0, 0, 255) ; + col->text = PACK_COLOR(0, 0, 0, 255) ; + col->axes = PACK_COLOR(128, 128, 128, 255) ; + col->little_axes = PACK_COLOR(0, 0, 0, 255) ; + break; + } + col->geom.point = PACK_COLOR(178, 182, 129, 255) ; + col->geom.line = PACK_COLOR(0, 0, 255, 255) ; + col->geom.surface = PACK_COLOR(128, 128, 128, 255) ; + col->geom.volume = PACK_COLOR(128, 128, 128, 255) ; + col->geom.point_sel = PACK_COLOR(255, 0, 0, 255) ; + col->geom.line_sel = PACK_COLOR(255, 0, 0, 255) ; + col->geom.surface_sel = PACK_COLOR(255, 0, 0, 255) ; + col->geom.volume_sel = PACK_COLOR(255, 0, 0, 255) ; + col->geom.point_hlt = PACK_COLOR(0, 255, 0, 255) ; + col->geom.line_hlt = PACK_COLOR(0, 0, 255, 255) ; + col->geom.surface_hlt = PACK_COLOR(128, 128, 128, 255) ; + col->geom.volume_hlt = PACK_COLOR(128, 128, 128, 255) ; + col->geom.tangents = PACK_COLOR(255, 255, 0, 255) ; + col->geom.normals = PACK_COLOR(255, 0, 0, 255) ; + + col->mesh.vertex = PACK_COLOR(0 , 123, 59 , 255) ; + col->mesh.vertex_supp = PACK_COLOR(255, 0, 255, 255) ; + col->mesh.line = PACK_COLOR(0, 255, 0, 255) ; + col->mesh.triangle = PACK_COLOR(0, 255, 0, 255) ; + col->mesh.quadrangle = PACK_COLOR(0, 255, 0, 255) ; + col->mesh.tetrahedron = PACK_COLOR(0, 255, 0, 255) ; + col->mesh.hexahedron = PACK_COLOR(128, 255, 0, 255) ; + col->mesh.prism = PACK_COLOR(0, 255, 128, 255) ; + col->mesh.pyramid = PACK_COLOR(128, 255, 128, 255) ; + col->mesh.tangents = PACK_COLOR(128, 128, 128, 255) ; + col->mesh.normals = PACK_COLOR(128, 128, 128, 255) ; + + col->mesh.carousel[0] = PACK_COLOR(0 , 82 , 138, 255) ; + col->mesh.carousel[1] = PACK_COLOR(255, 0 , 0 , 255) ; + col->mesh.carousel[2] = PACK_COLOR(31 , 110, 171, 255) ; + col->mesh.carousel[3] = PACK_COLOR(255, 255, 0 , 255) ; + col->mesh.carousel[4] = PACK_COLOR(255, 0 , 255, 255) ; + col->mesh.carousel[4] = PACK_COLOR(0 , 255, 255, 255) ; + col->mesh.carousel[5] = PACK_COLOR(128, 128, 0 , 255) ; + col->mesh.carousel[6] = PACK_COLOR(128, 0 , 255, 255) ; + col->mesh.carousel[7] = PACK_COLOR(128, 128, 255, 255) ; + col->mesh.carousel[8] = PACK_COLOR(128, 128, 255, 255) ; + col->mesh.carousel[9] = PACK_COLOR(0 , 0 , 255, 255) ; + break; + + case 2 : /* grayscale */ + col->bg = PACK_COLOR(255, 255, 255, 255) ; + col->fg = PACK_COLOR(0, 0, 0, 255) ; + col->text = PACK_COLOR(0, 0, 0, 255) ; + col->axes = PACK_COLOR(0, 0, 0, 255) ; + col->little_axes = PACK_COLOR(0, 0, 0, 255) ; + + col->geom.point = PACK_COLOR(0, 0, 0, 255) ; + col->geom.line = PACK_COLOR(0, 0, 0, 255) ; + col->geom.surface = PACK_COLOR(0, 0, 0, 255) ; + col->geom.volume = PACK_COLOR(0, 0, 0, 255) ; + col->geom.point_sel = PACK_COLOR(0, 0, 0, 255) ; + col->geom.line_sel = PACK_COLOR(0, 0, 0, 255) ; + col->geom.surface_sel = PACK_COLOR(0, 0, 0, 255) ; + col->geom.volume_sel = PACK_COLOR(0, 0, 0, 255) ; + col->geom.point_hlt = PACK_COLOR(0, 0, 0, 255) ; + col->geom.line_hlt = PACK_COLOR(0, 0, 0, 255) ; + col->geom.surface_hlt = PACK_COLOR(0, 0, 0, 255) ; + col->geom.volume_hlt = PACK_COLOR(0, 0, 0, 255) ; + col->geom.tangents = PACK_COLOR(0, 0, 0, 255) ; + col->geom.normals = PACK_COLOR(0, 0, 0, 255) ; + + col->mesh.vertex = PACK_COLOR(0, 0, 0, 255) ; + col->mesh.vertex_supp = PACK_COLOR(0, 0, 0, 255) ; + col->mesh.line = PACK_COLOR(0, 0, 0, 255) ; + col->mesh.triangle = PACK_COLOR(0, 0, 0, 255) ; + col->mesh.quadrangle = PACK_COLOR(0, 0, 0, 255) ; + col->mesh.tetrahedron = PACK_COLOR(0, 0, 0, 255) ; + col->mesh.hexahedron = PACK_COLOR(0, 0, 0, 255) ; + col->mesh.prism = PACK_COLOR(0, 0, 0, 255) ; + col->mesh.pyramid = PACK_COLOR(0, 0, 0, 255) ; + col->mesh.tangents = PACK_COLOR(0, 0, 0, 255) ; + col->mesh.normals = PACK_COLOR(0, 0, 0, 255) ; + + col->mesh.carousel[0] = PACK_COLOR(255, 255, 255, 255) ; + col->mesh.carousel[1] = PACK_COLOR(255, 255, 255, 255) ; + col->mesh.carousel[2] = PACK_COLOR(255, 255, 255, 255) ; + col->mesh.carousel[3] = PACK_COLOR(255, 255, 255, 255) ; + col->mesh.carousel[4] = PACK_COLOR(255, 255, 255, 255) ; + col->mesh.carousel[4] = PACK_COLOR(255, 255, 255, 255) ; + col->mesh.carousel[5] = PACK_COLOR(255, 255, 255, 255) ; + col->mesh.carousel[6] = PACK_COLOR(255, 255, 255, 255) ; + col->mesh.carousel[7] = PACK_COLOR(255, 255, 255, 255) ; + col->mesh.carousel[8] = PACK_COLOR(255, 255, 255, 255) ; + col->mesh.carousel[9] = PACK_COLOR(255, 255, 255, 255) ; + + } + +} + + +void InitContext(Context_T *ctx){ + + ctx->interactive = 0 ; + + ctx->r[0] = 0.0 ; + ctx->r[1] = 0.0 ; + ctx->r[2] = 0.0 ; + ctx->t[0] = 0.0 ; + ctx->t[1] = 0.0 ; + ctx->t[2] = 0.0 ; + ctx->s[0] = 1.0 ; + ctx->s[1] = 1.0 ; + ctx->s[2] = 1.0 ; + + ctx->min[0] = 0.0 ; + ctx->min[1] = 0.0 ; + ctx->min[2] = 0.0 ; + ctx->max[0] = 0.0 ; + ctx->max[1] = 0.0 ; + ctx->max[2] = 0.0 ; + ctx->range[0] = 0.0 ; + ctx->range[1] = 0.0 ; + ctx->range[2] = 0.0 ; + + ctx->viewport[0] = 0 ; + ctx->viewport[1] = 0 ; + ctx->viewport[2] = 1 ; + ctx->viewport[3] = 1 ; + ctx->render_mode = GMSH_RENDER ; + ctx->pixel_equiv_x = 0. ; + ctx->pixel_equiv_y = 0. ; + +#ifdef _UNIX + ctx->font_string = "-*-helvetica-medium-r-*-*-*-*-*-*-*-*-*-*"; + ctx->colorbar_font_string = "fixed"; +#else + ctx->font_string = "dummy"; + ctx->colorbar_font_string = "dummy"; +#endif + + ctx->light0[0] = 0.5 ; + ctx->light0[1] = 0.3 ; + ctx->light0[2] = 1.0 ; + ctx->light0[3] = 0.0 ; + ctx->shine = 0.4 ; + ctx->alpha = 0 ; /* disable alpha blending by default */ + ctx->flash = 0 ; + ctx->same_visual = 0 ; + + ctx->db = 1 ; + ctx->overlay = 1 ; + ctx->stream = TO_SCREEN ; + ctx->axes = 1 ; + ctx->little_axes = 1 ; + ctx->ortho = 1 ; + ctx->fast = 1 ; + ctx->display_lists = 0 ; + ctx->command_win = 0 ; + ctx->threads = 0 ; // bugge avec Open3D sur DEC ... + ctx->threads_lock = 0 ; + + ctx->geom.vis_type = 0 ; + ctx->geom.points = 1 ; + ctx->geom.lines = 1 ; + ctx->geom.surfaces = 0 ; + ctx->geom.volumes = 0 ; + ctx->geom.points_num = 0 ; + ctx->geom.lines_num = 0 ; + ctx->geom.surfaces_num = 0 ; + ctx->geom.volumes_num = 0 ; + ctx->geom.level = ELEMENTARY ; + ctx->geom.normals = 0.0 ; + ctx->geom.tangents = 0.0 ; + ctx->geom.highlight = 1 ; + ctx->geom.hidden = 0 ; + ctx->geom.shade = 0 ; + + ctx->mesh.vis_type = 0 ; + ctx->mesh.draw = 1 ; + ctx->mesh.points = 1 ; + ctx->mesh.lines = 1 ; + ctx->mesh.surfaces = 1 ; + ctx->mesh.volumes = 1 ; + ctx->mesh.points_num = 0 ; + ctx->mesh.lines_num = 0 ; + ctx->mesh.surfaces_num = 0 ; + ctx->mesh.volumes_num = 0 ; + ctx->mesh.normals = 0.0 ; + ctx->mesh.tangents = 0.0 ; + ctx->mesh.explode = 1.0 ; + ctx->mesh.hidden = 0 ; + ctx->mesh.shade = 0 ; + ctx->mesh.format = FORMAT_MSH ; + ctx->mesh.nb_smoothing = 0 ; + ctx->mesh.algo = DELAUNAY_OLDALGO ; + ctx->mesh.degree = 1 ; + ctx->mesh.is_limit_gamma = 0 ; + ctx->mesh.limit_gamma = 0.1 ; + ctx->mesh.dual = 0 ; + ctx->mesh.reco_extrude = 0 ; + + ctx->post.draw = 1 ; + ctx->post.scales = 1 ; + ctx->post.link = 0 ; + ctx->post.font = "Courier" ; + ctx->post.fontsize = 12 ; + ctx->post.initial_visibility = 1 ; + ctx->post.initial_intervals = DRAW_POST_ISO ; + ctx->post.initial_nbiso = 15 ; + ctx->post.anim_delay = 0 ; + +#ifdef _UNIX + ctx->print.type = GLPRPAINTER ; + ctx->print.format = FORMAT_EPS ; +#else + ctx->print.type = -1 ; + ctx->print.format = -1 ; +#endif + + ctx->color.id = -1; + InitColors(&ctx->color, 0) ; + +} + diff --git a/Common/Context.h b/Common/Context.h new file mode 100644 index 0000000000000000000000000000000000000000..0f8140ee0ef32f9cb407e138b51acce69139279f --- /dev/null +++ b/Common/Context.h @@ -0,0 +1,143 @@ +#ifndef _CONTEXT_H_ +#define _CONTEXT_H_ + +/* + Interface-independant context + */ + +/* How RGBA values are packed and unpacked into/from a 4-byte integer */ + +# ifdef _LITTLE +# define PACK_COLOR(R,G,B,A) ( (A)<<24 | (B)<<16 | (G)<<8 | (R) ) +# define UNPACK_RED(X) ( (X) & 0xff ) +# define UNPACK_GREEN(X) ( ( (X) >> 8 ) & 0xff ) +# define UNPACK_BLUE(X) ( ( (X) >> 16 ) & 0xff ) +# define UNPACK_ALPHA(X) ( ( (X) >> 24 ) & 0xff ) +# else +# define PACK_COLOR(R,G,B,A) ( (R)<<24 | (G)<<16 | (B)<<8 | (A) ) +# define UNPACK_RED(X) ( ( (X) >> 24 ) & 0xff ) +# define UNPACK_GREEN(X) ( ( (X) >> 16 ) & 0xff ) +# define UNPACK_BLUE(X) ( ( (X) >> 8 ) & 0xff ) +# define UNPACK_ALPHA(X) ( (X) & 0xff ) +# endif + +typedef struct{ + int id; /* the current rgbacolors id */ + + /* general colors */ + unsigned int bg, fg, text, axes, little_axes; + + /* geometry colors */ + struct{ + unsigned int point, line, surface, volume; + unsigned int point_sel, line_sel, surface_sel, volume_sel; + unsigned int point_hlt, line_hlt, surface_hlt, volume_hlt; + unsigned int tangents, normals; + } + geom; + + /* mesh colors */ + struct{ + unsigned int vertex, vertex_supp, line, triangle, quadrangle; + unsigned int tetrahedron, hexahedron, prism, pyramid; + unsigned int carousel[10]; + unsigned int tangents, normals; + } + mesh; + +}rgbacolors; + +typedef struct { + + int interactive; /* 0=full gfx; -1=just parse; 1,2,3=batch mesh */ + + double r[3], t[3], s[3]; /* current rotation, translation and scale */ + int rlock[3], tlock[3], slock[3]; /* locks for r, t and s */ + + double min[3]; /* x, y and z min for the current geometry */ + double max[3]; /* x, y and z max for the current geometry */ + double range[3]; /* maximum range in the three directions */ + + int db; /* double buffer? */ + int overlay; /* overlay graphic window? */ + int stream; /* output stream: TO_SCREEN or TO_FILE */ + int ortho; /* orthogonal projection? */ + int fast; /* inhibit mesh and postpro drawing when changing r,s,t */ + int command_win; /* command window? */ + int display_lists; /* use display lists? */ + int font_base; /* display list indice for the font */ + int axes, little_axes; /* draw axes? */ + int threads, threads_lock; /* threads?, lock (should be a mutex...) */ + int alpha; /* enable alpha blending */ + int flash; /* authorize colormap flashing (beek) */ + int same_visual; /* force same visual for GUI and Graphics */ + + char *font_string; /* main font */ + char *colorbar_font_string; /* font for colorbar */ + + /* OpenGL stuff */ + int viewport[4]; + float light0[4]; /* light source position */ + float shine; /* specular value */ + int render_mode; /* RENDER, SELECT, FEEDBACK */ + + double pixel_equiv_x, pixel_equiv_y ; /* approximative equivalent model lenght of a pixel */ + + /* all colors except postpro colormaps */ + rgbacolors color; + + /* geometry options */ + struct{ + int vis_type; + int points, lines, surfaces, volumes; + int points_num, lines_num, surfaces_num, volumes_num; + int hidden, shade; + int highlight; + int level; + double normals, tangents; + } geom; + + /* mesh options */ + struct { + int vis_type; + int draw; + int points, lines, surfaces, volumes; + int points_num, lines_num, surfaces_num, volumes_num; + int is_limit_gamma, dual; + double limit_gamma; + int hidden, shade; + int format, nb_smoothing, algo, degree; + int reco_extrude; + double normals, tangents, explode; + } mesh; + + /* post processing options */ + struct{ + int draw, scales, link ; + char *font; + int fontsize; + int initial_visibility, initial_nbiso, initial_intervals ; + long anim_delay ; + }post; + + /* print options */ + struct{ + int format, type; + } print; + +} Context_T; + +typedef struct { + char *string ; + int int1, int2, int3, int4 ; +} StringX4Int; + +typedef struct { + char *string ; + void *Pointer ; +} StringXPointer ; + +void InitContext (Context_T * ctx); +void InitColors (rgbacolors * col, int num); + +#endif diff --git a/Common/Gmsh.h b/Common/Gmsh.h new file mode 100644 index 0000000000000000000000000000000000000000..477f71c1c3d4ca50575324db8de7dd5580cbdea4 --- /dev/null +++ b/Common/Gmsh.h @@ -0,0 +1,25 @@ +#ifndef _GMSH_H_ +#define _GMSH_H_ + +/* This header should be included in any Gmsh source file. Modify it + only if really necessary, since it will force the whole code to be + rebuilt... */ + +#undef true +#define true 1 + +#undef false +#define false 0 + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> + +#include "Message.h" +#include "Malloc.h" +#include "List.h" +#include "Tree.h" +#include "Tools.h" + +#endif diff --git a/Common/GmshUI.h b/Common/GmshUI.h new file mode 100644 index 0000000000000000000000000000000000000000..f759c73139f49248bea044cea81d51da30caefd7 --- /dev/null +++ b/Common/GmshUI.h @@ -0,0 +1,24 @@ + +#ifdef _UNIX + +/* UNIX includes */ + +#include <X11/keysym.h> +#include <Xm/XmAll.h> +#include <GL/gl.h> +#include <GL/glu.h> +#include <GL/glx.h> +#include <GL/GLwMDrawA.h> + +#else + +/* Windows includes */ + +#include<windows.h> +#include <GL/gl.h> +#include <GL/glu.h> +extern "C"{ +#include <GL/glaux.h> +} + +#endif diff --git a/Common/Makefile b/Common/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..b0a0b3c4f70e9a16b5c659cfb43f78cf3fbd7221 --- /dev/null +++ b/Common/Makefile @@ -0,0 +1,59 @@ +# +# Makefile for "libCommon.a" +# + +.IGNORE: + +CC = c++ +C_FLAGS = -g -Wall + +OS_FLAGS = -D_UNIX + +RANLIB = /usr/bin/ranlib +RM = rm +RMFLAGS = -f + +LIB = ../lib/libCommon.a +INCLUDE = -I../includes -I../Common -I../DataStr -I../Geo -I../Graphics\ + -I../Mesh -I../Parser -I../Unix + +CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE) $(GL_INCLUDE) + +SRC = Context.cpp\ + Views.cpp + +OBJ = $(SRC:.cpp=.o) + +.SUFFIXES: .o .cpp + +$(LIB): $(OBJ) + ar ruvs $(LIB) $(OBJ) + $(RANLIB) $(LIB) + +.cpp.o: + $(CC) $(CFLAGS) -c $< + +clean: + $(RM) $(RMFLAGS) *.o + +lint: + $(LINT) $(CFLAGS) $(SRC) + +depend: + (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ + $(CC) -MM $(CFLAGS) ${SRC} \ + ) >Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) $(RMFLAGS) Makefile.new + +# DO NOT DELETE THIS LINE +Context.o: Context.cpp Gmsh.h Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + Const.h ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h \ + ../Graphics/Draw.h ../Common/Views.h ../Common/Const.h \ + ../Graphics/ColorTable.h Context.h +Views.o: Views.cpp Gmsh.h Message.h ../DataStr/Malloc.h ../DataStr/List.h \ + ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h Views.h Const.h \ + ../Graphics/ColorTable.h Context.h diff --git a/Common/Message.h b/Common/Message.h new file mode 100644 index 0000000000000000000000000000000000000000..e8f7d194a00ca2c89607c91f9cf904b6d3c87a88 --- /dev/null +++ b/Common/Message.h @@ -0,0 +1,21 @@ +#ifndef _MESSAGE_H_ +#define _MESSAGE_H_ + +#include <stdarg.h> + +#define ERROR 0 +#define WARNING 1 +#define INFO 2 +#define INFOS 3 +#define SELECT 4 +#define STATUS 5 +#define PARSER_ERROR 6 +#define PARSER_INFO 7 + +void Info (int level, char *arg0); +void Signal (int signum); +void Msg (int level, char *fmt, ...); +double Cpu (void); +void Progress(int); + +#endif diff --git a/Common/Static.h b/Common/Static.h new file mode 100644 index 0000000000000000000000000000000000000000..1cf77d9a3638d7adb8d39c12ed8e7b4e5b39e46e --- /dev/null +++ b/Common/Static.h @@ -0,0 +1,53 @@ +#ifndef _STATIC_H_ +#define _STATIC_H_ + +#include "Version.h" + +char gmsh_progname[] = "This is Gmsh" ; +char gmsh_copyright[] = "Copyright (C) 1997-2000 J.-F. Remacle, C. Geuzaine"; +char gmsh_version[] = "Version : " ; +char gmsh_os[] = "Operating System : " GMSH_OS ; +char gmsh_date[] = "Build Date : " GMSH_DATE ; +char gmsh_host[] = "Build Host : " GMSH_HOST ; +char gmsh_packager[] = "Packager : " GMSH_PACKAGER ; +char gmsh_email[] = "E-Mail : " + "Christophe.Geuzaine@ulg.ac.be, Remacle@scorec.rpi.edu"; +char gmsh_url[] = "URL : http://www.geuz.org/gmsh/"; + + +char yyname[NAME_STR_L]; +int yyerrorstate; + +char TheFileNameTab[MAX_OPEN_FILES][NAME_STR_L], TheFileName[NAME_STR_L]; +char TheBaseFileName[NAME_STR_L], TheMshFileName[NAME_STR_L], TheBgmFileName[NAME_STR_L]; +char ThePathForIncludes[NAME_STR_L] = ""; + +Context_T CTX ; +Mesh M, *THEM, *LOCAL; +Simplex Boundary; + +Tree_T *EntitesVisibles = NULL; +List_T *TrsfVolNum = NULL; +List_T *Post_ViewList = NULL; + +double LC, MiddleLC, FACTEUR_MULTIPLICATIF=1.0; +int LC_ORDER; +double RANDOM_FACTOR=1.0, GLOBALSCALINGFACTOR=1.0; + +char *TextBuffer, TextAbout[1024]; + +int NbFileName=0; +int EXPOSE = 0 ; +int WARNING_OVERRIDE=0; +int ACTUAL_ENTITY, SHOW_ALL; +int LocalNewPoint= CENTER_CIRCCIRC, FindQualityMethod=FEM_INTERPOLATION; +int Alerte_Point_Scabreux, Alerte_Point_Exterieur, Highlight_Selection=0; +int SPEED_MAX=0 ; +int LISSAGE=3; +int INITIALBGMESH=NONE, TYPBGMESH=WITHPOINTS; +int CurrentNodeNumber, CurrentSimplexNumber; +int NbComplexVolumes=0, BD_EXISTS=0; +int FLAG_OLD_CIRCLE = 0 ; /* Pour David : cercles > Pi */ + + +#endif diff --git a/Common/Version.h b/Common/Version.h new file mode 100644 index 0000000000000000000000000000000000000000..05d5af1bcb0b8ab34f1ebd6e57ea97e9276b5ebd --- /dev/null +++ b/Common/Version.h @@ -0,0 +1,5 @@ +#define GMSH_VERSION 0.995 +#define GMSH_DATE "Thu Nov 23 00:50:59 CET 2000" +#define GMSH_HOST "geuz.montefiore.ulg.ac.be" +#define GMSH_PACKAGER "geuzaine" +#define GMSH_OS "Linux 2.2.16-22" diff --git a/Common/Views.cpp b/Common/Views.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9488d1ed7a20ac63fd8bbbfc2a53979813e3be53 --- /dev/null +++ b/Common/Views.cpp @@ -0,0 +1,488 @@ + +#include "Gmsh.h" +#include "Views.h" +#include "Context.h" +#include "ColorTable.h" + +extern Context_T CTX ; + +extern List_T *Post_ViewList; +extern double LC; + +static Post_View *ActualView; +static int ActualViewNum=0; + +/* ------------------------------------------------------------------------ */ +/* V i e w s */ +/* ------------------------------------------------------------------------ */ + +void AddView(int , char *, int); + +void BeginView(int allocate){ + ActualView = (Post_View*)Malloc(sizeof(Post_View)); + ActualView->Num = ++ActualViewNum; + ActualView->Changed = 1; + if(allocate){ + ActualView->Allocated = 1; + ActualView->Simplices = List_Create(100,100,sizeof(Post_Simplex)); + ActualView->Triangles = List_Create(100,100,sizeof(Post_Triangle)); + ActualView->Lines = List_Create(100,100,sizeof(Post_Line)); + ActualView->Points = List_Create(100,100,sizeof(Post_Point)); + } + else{ + ActualView->Allocated = 0; + } + ActualView->NbIso = CTX.post.initial_nbiso; + ActualView->IntervalsType = CTX.post.initial_intervals; + ActualView->Light = 0; + ActualView->ShowElement = 0; + ActualView->Visible = CTX.post.initial_visibility; + ActualView->TimeStep = 0; + ActualView->ArrowScale = 100.; + ActualView->ArrowType = DRAW_POST_ARROW; + ActualView->ArrowLocation = DRAW_POST_LOCATE_COG; + ActualView->RangeType = DRAW_POST_DEFAULT; + ActualView->ShowScale = 1; + ActualView->TransparentScale = 1; + ActualView->ScaleType = DRAW_POST_LINEAR; + ActualView->Raise[0] = 0.0; + ActualView->Raise[1] = 0.0; + ActualView->Raise[2] = 0.0; + ActualView->ScalarOnly = 1; + ActualView->Min = 1.e200; + ActualView->Max = -1.e200; + ActualView->NbTimeStep = 0; + + ActualView->CT.size = 255; + ActualView->CT.ipar[COLORTABLE_MODE] = COLORTABLE_RGB; + color_table_init_param(1, &ActualView->CT, 1, 1); + color_table_recompute(&ActualView->CT, 1, 1); +} + +void EndView(char *Name, double XOffset, double YOffset, double ZOffset){ + strcpy(ActualView->Name,Name); + strcpy(ActualView->Format, "%.3e"); + ActualView->CustomMin = ActualView->Min; + ActualView->CustomMax = ActualView->Max; + + ActualView->Offset[0] = XOffset*(CTX.range[0]?CTX.range[0]:LC)*1.e-3; + ActualView->Offset[1] = YOffset*(CTX.range[1]?CTX.range[1]:LC)*1.e-3; + ActualView->Offset[2] = ZOffset*(CTX.range[2]?CTX.range[2]:LC)*1.e-3; + + /* j'en alloue directement le max pour eviter les problemes avec + * CurrentView: cf. rem dans cb_post.c + */ + if(!Post_ViewList) + Post_ViewList = List_Create(20,1,sizeof(Post_View)); + + List_Add(Post_ViewList,ActualView); + + AddView(List_Nbr(Post_ViewList), ActualView->Name, 1); + ActualView = NULL; +} + +/* ------------------------------------------------------------------------ */ +/* S i m p l e x */ +/* ------------------------------------------------------------------------ */ + +void AddView_ScalarSimplex(double x0,double y0,double z0, + double x1,double y1,double z1, + double x2,double y2,double z2, + double x3,double y3,double z3, + List_T *v){ + Post_Simplex S; + int i,N ; + + S.Type = DRAW_POST_SCALAR; + S.X[0] = x0; S.X[1] = x1; S.X[2] = x2; S.X[3] = x3; + S.Y[0] = y0; S.Y[1] = y1; S.Y[2] = y2; S.Y[3] = y3; + S.Z[0] = z0; S.Z[1] = z1; S.Z[2] = z2; S.Z[3] = z3; + + N = List_Nbr(v); + S.V = (double*)Malloc(N*sizeof(double)); + + for(i=0 ; i<N ; i+=4){ + List_Read(v,i, &S.V[i]) ; + List_Read(v,i+1,&S.V[i+1]) ; + List_Read(v,i+2,&S.V[i+2]) ; + List_Read(v,i+3,&S.V[i+3]) ; + + if(!List_Nbr(ActualView->Points) && + !List_Nbr(ActualView->Lines) && + !List_Nbr(ActualView->Triangles) && + !List_Nbr(ActualView->Simplices)){ + ActualView->Min = DMIN(DMIN(DMIN(S.V[i],S.V[i+1]),S.V[i+2]),S.V[i+3]); + ActualView->Max = DMAX(DMAX(DMAX(S.V[i],S.V[i+1]),S.V[i+2]),S.V[i+3]); + ActualView->NbTimeStep = N/4; + } + else{ + ActualView->Min = DMIN(DMIN(DMIN(DMIN(S.V[i],S.V[i+1]),S.V[i+2]), + S.V[i+3]),ActualView->Min); + ActualView->Max = DMAX(DMAX(DMAX(DMAX(S.V[i],S.V[i+1]),S.V[i+2]), + S.V[i+3]),ActualView->Max); + ActualView->NbTimeStep = IMIN(N/4,ActualView->NbTimeStep); + } + } + + List_Add(ActualView->Simplices,&S); +} + +void AddView_VectorSimplex(double x0,double y0,double z0, + double x1,double y1,double z1, + double x2,double y2,double z2, + double x3,double y3,double z3, + List_T *v){ + Post_Simplex S; + double l0,l1,l2,l3; + int i,N ; + + S.Type = DRAW_POST_VECTOR; + S.X[0] = x0; S.X[1] = x1; S.X[2] = x2; S.X[3] = x3; + S.Y[0] = y0; S.Y[1] = y1; S.Y[2] = y2; S.Y[3] = y3; + S.Z[0] = z0; S.Z[1] = z1; S.Z[2] = z2; S.Z[3] = z3; + + N = List_Nbr(v); + S.V = (double*)Malloc(N*sizeof(double)); + + for(i=0 ; i<N ; i+=12){ + List_Read(v,i, &S.V[i]); List_Read(v,i+1,&S.V[i+1]); List_Read(v,i+2,&S.V[i+2]); + List_Read(v,i+3,&S.V[i+3]); List_Read(v,i+4,&S.V[i+4]); List_Read(v,i+5,&S.V[i+5]); + List_Read(v,i+6,&S.V[i+6]); List_Read(v,i+7,&S.V[i+7]); List_Read(v,i+8,&S.V[i+8]); + List_Read(v,i+9,&S.V[i+9]); List_Read(v,i+10,&S.V[i+10]); List_Read(v,i+11,&S.V[i+11]); + + l0 = sqrt(S.V[i] *S.V[i] +S.V[i+1]*S.V[i+1] +S.V[i+2]*S.V[i+2]); + l1 = sqrt(S.V[i+3]*S.V[i+3]+S.V[i+4]*S.V[i+4] +S.V[i+5]*S.V[i+5]); + l2 = sqrt(S.V[i+6]*S.V[i+6]+S.V[i+7]*S.V[i+7] +S.V[i+8]*S.V[i+8]); + l3 = sqrt(S.V[i+9]*S.V[i+9]+S.V[i+10]*S.V[i+10]+S.V[i+11]*S.V[i+11]); + if(!List_Nbr(ActualView->Points) && + !List_Nbr(ActualView->Lines) && + !List_Nbr(ActualView->Triangles) && + !List_Nbr(ActualView->Simplices)){ + ActualView->Min = DMIN(DMIN(DMIN(l0,l1),l2),l3); + ActualView->Max = DMAX(DMAX(DMAX(l0,l1),l2),l3); + ActualView->NbTimeStep = N/12; + } + else{ + ActualView->Min = DMIN(DMIN(DMIN(DMIN(l0,l1),l2),l3),ActualView->Min); + ActualView->Max = DMAX(DMAX(DMAX(DMAX(l0,l1),l2),l3),ActualView->Max); + ActualView->NbTimeStep = IMIN(N/12,ActualView->NbTimeStep); + } + } + + ActualView->ScalarOnly = 0; + List_Add(ActualView->Simplices,&S); +} + +void AddView_TensorSimplex(double x0,double y0,double z0, + double x1,double y1,double z1, + double x2,double y2,double z2, + double x3,double y3,double z3, + List_T *v){ +} + + +/* ------------------------------------------------------------------------ */ +/* T r i a n g l e */ +/* ------------------------------------------------------------------------ */ + +void AddView_ScalarTriangle(double x0,double y0,double z0, + double x1,double y1,double z1, + double x2,double y2,double z2, + List_T *v){ + Post_Triangle T; + int i,N ; + + T.Type = DRAW_POST_SCALAR; + T.X[0] = x0; T.X[1] = x1; T.X[2] = x2; + T.Y[0] = y0; T.Y[1] = y1; T.Y[2] = y2; + T.Z[0] = z0; T.Z[1] = z1; T.Z[2] = z2; + + N = List_Nbr(v); + T.V = (double*)Malloc(N*sizeof(double)); + + for(i=0 ; i<N ; i+=3){ + List_Read(v,i, &T.V[i]) ; + List_Read(v,i+1,&T.V[i+1]) ; + List_Read(v,i+2,&T.V[i+2]) ; + + if(!List_Nbr(ActualView->Points) && + !List_Nbr(ActualView->Lines) && + !List_Nbr(ActualView->Triangles) && + !List_Nbr(ActualView->Simplices)){ + ActualView->Min = DMIN(DMIN(T.V[i],T.V[i+1]),T.V[i+2]); + ActualView->Max = DMAX(DMAX(T.V[i],T.V[i+1]),T.V[i+2]); + ActualView->NbTimeStep = N/3; + } + else{ + ActualView->Min = DMIN(DMIN(DMIN(T.V[i],T.V[i+1]),T.V[i+2]),ActualView->Min); + ActualView->Max = DMAX(DMAX(DMAX(T.V[i],T.V[i+1]),T.V[i+2]),ActualView->Max); + ActualView->NbTimeStep = IMIN(N/3,ActualView->NbTimeStep); + } + } + + List_Add(ActualView->Triangles,&T); +} + +void AddView_VectorTriangle(double x0,double y0,double z0, + double x1,double y1,double z1, + double x2,double y2,double z2, + List_T *v){ + Post_Triangle T; + double l0,l1,l2; + int i,N ; + + T.Type = DRAW_POST_VECTOR; + T.X[0] = x0; T.X[1] = x1; T.X[2] = x2; + T.Y[0] = y0; T.Y[1] = y1; T.Y[2] = y2; + T.Z[0] = z0; T.Z[1] = z1; T.Z[2] = z2; + + N = List_Nbr(v); + T.V = (double*)Malloc(N*sizeof(double)); + + for(i=0 ; i<N ; i+=9){ + List_Read(v,i, &T.V[i]); List_Read(v,i+1,&T.V[i+1]); List_Read(v,i+2,&T.V[i+2]); + List_Read(v,i+3,&T.V[i+3]); List_Read(v,i+4,&T.V[i+4]); List_Read(v,i+5,&T.V[i+5]); + List_Read(v,i+6,&T.V[i+6]); List_Read(v,i+7,&T.V[i+7]); List_Read(v,i+8,&T.V[i+8]); + + l0 = sqrt(T.V[i] *T.V[i] +T.V[i+1]*T.V[i+1]+T.V[i+2]*T.V[i+2]); + l1 = sqrt(T.V[i+3]*T.V[i+3]+T.V[i+4]*T.V[i+4]+T.V[i+5]*T.V[i+5]); + l2 = sqrt(T.V[i+6]*T.V[i+6]+T.V[i+7]*T.V[i+7]+T.V[i+8]*T.V[i+8]); + if(!List_Nbr(ActualView->Points) && + !List_Nbr(ActualView->Lines) && + !List_Nbr(ActualView->Triangles) && + !List_Nbr(ActualView->Simplices)){ + ActualView->Min = DMIN(DMIN(l0,l1),l2); + ActualView->Max = DMAX(DMAX(l0,l1),l2); + ActualView->NbTimeStep = N/9; + } + else{ + ActualView->Min = DMIN(DMIN(DMIN(l0,l1),l2),ActualView->Min); + ActualView->Max = DMAX(DMAX(DMAX(l0,l1),l2),ActualView->Max); + ActualView->NbTimeStep = IMIN(N/9,ActualView->NbTimeStep); + } + } + + ActualView->ScalarOnly = 0; + List_Add(ActualView->Triangles,&T); +} + +void AddView_TensorTriangle(double x0,double y0,double z0, + double x1,double y1,double z1, + double x2,double y2,double z2, + List_T *v){ + Post_Triangle T; + double l0,l1,l2; + int i,N ; + + T.Type = DRAW_POST_TENSOR; + T.X[0] = x0; T.X[1] = x1; T.X[2] = x2; + T.Y[0] = y0; T.Y[1] = y1; T.Y[2] = y2; + T.Z[0] = z0; T.Z[1] = z1; T.Z[2] = z2; + + N = List_Nbr(v); + T.V = (double*)Malloc(N*sizeof(double)); + + for(i=0 ; i<N ; i+=27){ + List_Read(v,i, &T.V[i]); List_Read(v,i+1,&T.V[i+1]); List_Read(v,i+2,&T.V[i+2]); + List_Read(v,i+3,&T.V[i+3]); List_Read(v,i+4,&T.V[i+4]); List_Read(v,i+5,&T.V[i+5]); + List_Read(v,i+6,&T.V[i+6]); List_Read(v,i+7,&T.V[i+7]); List_Read(v,i+8,&T.V[i+8]); + List_Read(v,i+9,&T.V[i+9]); List_Read(v,i+10,&T.V[i+10]); List_Read(v,i+11,&T.V[i+11]); + List_Read(v,i+12,&T.V[i+12]); List_Read(v,i+13,&T.V[i+13]); List_Read(v,i+14,&T.V[i+14]); + List_Read(v,i+15,&T.V[i+15]); List_Read(v,i+16,&T.V[i+16]); List_Read(v,i+17,&T.V[i+17]); + List_Read(v,i+18,&T.V[i+18]); List_Read(v,i+19,&T.V[i+19]); List_Read(v,i+20,&T.V[i+20]); + List_Read(v,i+21,&T.V[i+21]); List_Read(v,i+22,&T.V[i+22]); List_Read(v,i+23,&T.V[i+23]); + List_Read(v,i+24,&T.V[i+24]); List_Read(v,i+25,&T.V[i+25]); List_Read(v,i+26,&T.V[i+26]); + + l0 = sqrt(T.V[i] *T.V[i] +T.V[i+1]*T.V[i+1]+T.V[i+2]*T.V[i+2]); + l1 = sqrt(T.V[i+3]*T.V[i+3]+T.V[i+4]*T.V[i+4]+T.V[i+5]*T.V[i+5]); + l2 = sqrt(T.V[i+6]*T.V[i+6]+T.V[i+7]*T.V[i+7]+T.V[i+8]*T.V[i+8]); + if(!List_Nbr(ActualView->Points) && + !List_Nbr(ActualView->Lines) && + !List_Nbr(ActualView->Triangles) && + !List_Nbr(ActualView->Simplices)){ + ActualView->Min = DMIN(DMIN(l0,l1),l2); + ActualView->Max = DMAX(DMAX(l0,l1),l2); + ActualView->NbTimeStep = N/9; + } + else{ + ActualView->Min = DMIN(DMIN(DMIN(l0,l1),l2),ActualView->Min); + ActualView->Max = DMAX(DMAX(DMAX(l0,l1),l2),ActualView->Max); + ActualView->NbTimeStep = IMIN(N/9,ActualView->NbTimeStep); + } + } + + ActualView->ScalarOnly = 0; + List_Add(ActualView->Triangles,&T); +} + +/* ------------------------------------------------------------------------ */ +/* L i n e */ +/* ------------------------------------------------------------------------ */ + +void AddView_ScalarLine(double x0,double y0,double z0, + double x1,double y1,double z1, + List_T *v){ + Post_Line L; + int i,N ; + + L.Type = DRAW_POST_SCALAR; + L.X[0] = x0; L.X[1] = x1; + L.Y[0] = y0; L.Y[1] = y1; + L.Z[0] = z0; L.Z[1] = z1; + + N = List_Nbr(v); + L.V = (double*)Malloc(N*sizeof(double)); + + for(i=0 ; i<N ; i+=2){ + List_Read(v,i,&L.V[i]) ; + List_Read(v,i+1,&L.V[i+1]) ; + if(!List_Nbr(ActualView->Points) && + !List_Nbr(ActualView->Lines) && + !List_Nbr(ActualView->Triangles) && + !List_Nbr(ActualView->Simplices)){ + ActualView->Min = DMIN(L.V[i],L.V[i+1]); + ActualView->Max = DMAX(L.V[i],L.V[i+1]); + ActualView->NbTimeStep = N/2; + } + else{ + ActualView->Min = DMIN(DMIN(L.V[i],L.V[i+1]),ActualView->Min); + ActualView->Max = DMAX(DMAX(L.V[i],L.V[i+1]),ActualView->Max); + ActualView->NbTimeStep = IMIN(N/2,ActualView->NbTimeStep); + } + } + + List_Add(ActualView->Lines,&L); +} + + +void AddView_VectorLine(double x0,double y0,double z0, + double x1,double y1,double z1, + List_T *v){ + Post_Line L; + double l0,l1; + int i,N ; + + L.Type = DRAW_POST_VECTOR; + L.X[0] = x0; L.X[1] = x1; + L.Y[0] = y0; L.Y[1] = y1; + L.Z[0] = z0; L.Z[1] = z1; + + N = List_Nbr(v); + L.V = (double*)Malloc(N*sizeof(double)); + + for(i=0 ; i<N ; i+=6){ + List_Read(v,i, &L.V[i]); List_Read(v,i+1,&L.V[i+1]); + List_Read(v,i+2,&L.V[i+2]); List_Read(v,i+3,&L.V[i+3]); + List_Read(v,i+4,&L.V[i+4]); List_Read(v,i+5,&L.V[i+5]); + + l0 = sqrt(L.V[i] *L.V[i] +L.V[i+1]*L.V[i+1]+L.V[i+2]*L.V[i+2]); + l1 = sqrt(L.V[i+3]*L.V[i+3]+L.V[i+4]*L.V[i+4]+L.V[i+5]*L.V[i+5]); + if(!List_Nbr(ActualView->Points) && + !List_Nbr(ActualView->Lines) && + !List_Nbr(ActualView->Triangles) && + !List_Nbr(ActualView->Simplices)){ + ActualView->Min = DMIN(l0,l1); + ActualView->Max = DMAX(l0,l1); + ActualView->NbTimeStep = N/6; + } + else{ + ActualView->Min = DMIN(DMIN(l0,l1),ActualView->Min); + ActualView->Max = DMAX(DMAX(l0,l1),ActualView->Max); + ActualView->NbTimeStep = IMIN(N/6,ActualView->NbTimeStep); + } + } + + ActualView->ScalarOnly = 0; + List_Add(ActualView->Lines,&L); +} + +void AddView_TensorLine(double x0,double y0,double z0, + double x1,double y1,double z1, + List_T *v){ +} + + +/* ------------------------------------------------------------------------ */ +/* P o i n t */ +/* ------------------------------------------------------------------------ */ + +void AddView_ScalarPoint(double x0,double y0,double z0, + List_T *v){ + Post_Point P; + double l; + int i,N ; + + P.Type = DRAW_POST_SCALAR; + P.X = x0; + P.Y = y0; + P.Z = z0; + + N = List_Nbr(v); + P.V = (double*)Malloc(N*sizeof(double)); + + for(i=0 ; i<N ; i++){ + List_Read(v,i, &P.V[i]); + l = P.V[i]; + if(!List_Nbr(ActualView->Points) && + !List_Nbr(ActualView->Lines) && + !List_Nbr(ActualView->Triangles) && + !List_Nbr(ActualView->Simplices)){ + ActualView->Min = l; + ActualView->Max = l; + ActualView->NbTimeStep = N/3; + } + else{ + ActualView->Min = DMIN(l,ActualView->Min); + ActualView->Max = DMAX(l,ActualView->Max); + ActualView->NbTimeStep = IMIN(N,ActualView->NbTimeStep); + } + } + + ActualView->ScalarOnly = 1; + List_Add(ActualView->Points,&P); +} + + +void AddView_VectorPoint(double x0,double y0,double z0, + List_T *v){ + Post_Point P; + double l; + int i,N ; + + P.Type = DRAW_POST_VECTOR; + P.X = x0; + P.Y = y0; + P.Z = z0; + + N = List_Nbr(v); + P.V = (double*)Malloc(N*sizeof(double)); + + for(i=0 ; i<N ; i+=3){ + List_Read(v,i, &P.V[i]); + List_Read(v,i+1,&P.V[i+1]); + List_Read(v,i+2,&P.V[i+2]); + + l = sqrt(P.V[i]*P.V[i] + P.V[i+1]*P.V[i+1] + P.V[i+2]*P.V[i+2]); + if(!List_Nbr(ActualView->Points) && + !List_Nbr(ActualView->Lines) && + !List_Nbr(ActualView->Triangles) && + !List_Nbr(ActualView->Simplices)){ + ActualView->Min = l; + ActualView->Max = l; + ActualView->NbTimeStep = N/3; + } + else{ + ActualView->Min = DMIN(l,ActualView->Min); + ActualView->Max = DMAX(l,ActualView->Max); + ActualView->NbTimeStep = IMIN(N/3,ActualView->NbTimeStep); + } + } + + ActualView->ScalarOnly = 0; + List_Add(ActualView->Points,&P); +} + +void AddView_TensorPoint(double x0,double y0,double z0, + List_T *v){ +} + diff --git a/Common/Views.h b/Common/Views.h new file mode 100644 index 0000000000000000000000000000000000000000..bf2abfe112ec14854ae5e48908c283128190e80f --- /dev/null +++ b/Common/Views.h @@ -0,0 +1,144 @@ +#ifndef _VIEWS_H_ +#define _VIEWS_H_ + +#include "Const.h" + +typedef struct{ + int Type; + double X[4], Y[4], Z[4]; + double *V; +}Post_Simplex; + +typedef struct{ + int Type; + double X[3], Y[3], Z[3]; + double *V; +}Post_Triangle; + +typedef struct{ + int Type; + double X[2], Y[2], Z[2]; + double *V; +}Post_Line; + +typedef struct{ + int Type; + double X, Y, Z; + double *V; +}Post_Point; + +/* Post_XXX.Type. The keys are important ! */ +#define DRAW_POST_SCALAR 1 +#define DRAW_POST_VECTOR 3 +#define DRAW_POST_TENSOR 9 + +/* IntervalsType */ +#define DRAW_POST_ISO 1 +#define DRAW_POST_CONTINUOUS 2 +#define DRAW_POST_DISCRETE 3 +#define DRAW_POST_NUMERIC 4 + +/* ArrowType */ +#define DRAW_POST_SEGMENT 1 +#define DRAW_POST_ARROW 2 +#define DRAW_POST_PYRAMID 3 +#define DRAW_POST_CONE 4 +#define DRAW_POST_DISPLACEMENT 5 +#define DRAW_POST_ARROW_HEAD 6 + +/* ArrowLovation */ +#define DRAW_POST_LOCATE_COG 1 +#define DRAW_POST_LOCATE_VERTEX 2 + +/* ScaleType */ +#define DRAW_POST_DEFAULT 1 +#define DRAW_POST_CUSTOM 2 + +/* RangeType */ +#define DRAW_POST_LINEAR 1 +#define DRAW_POST_LOGARITHMIC 2 + +#include "ColorTable.h" + +typedef struct{ + int Num, Changed, Allocated; + char Name[NAME_STR_L], Format[NAME_STR_L]; + double Min, Max, CustomMin, CustomMax; + double Offset[3], Raise[3], ArrowScale; + int Visible, ScalarOnly; + int IntervalsType, NbIso, Light, ShowElement; + int ShowScale, TransparentScale, ScaleType, RangeType; + int ArrowType, ArrowLocation; + int TimeStep, NbTimeStep; + ColorTable CT; + List_T *Simplices, *Triangles, *Lines, *Points; + + double (*GVFI) (double min, double max, int nb, int index); + int (*GIFV) (double min, double max, int nb, double value); +}Post_View; + + + +void BeginView (int alloc); +void EndView (char *Name, double XOffset, double YOffset, double ZOffset); + +void AddView_ScalarSimplex (double x0, double y0, double z0, + double x1, double y1, double z1, + double x2, double y2, double z2, + double x3, double y3, double z3, + List_T * v); + +void AddView_VectorSimplex (double x0, double y0, double z0, + double x1, double y1, double z1, + double x2, double y2, double z2, + double x3, double y3, double z3, + List_T * v); + +void AddView_TensorSimplex (double x0, double y0, double z0, + double x1, double y1, double z1, + double x2, double y2, double z2, + double x3, double y3, double z3, + List_T * v); + +void AddView_ScalarTriangle (double x0, double y0, double z0, + double x1, double y1, double z1, + double x2, double y2, double z2, + List_T * v); + +void AddView_VectorTriangle (double x0, double y0, double z0, + double x1, double y1, double z1, + double x2, double y2, double z2, + List_T * v); + +void AddView_TensorTriangle (double x0, double y0, double z0, + double x1, double y1, double z1, + double x2, double y2, double z2, + List_T * v); + +void AddView_ScalarLine (double x0, double y0, double z0, + double x1, double y1, double z1, + List_T * v); + +void AddView_VectorLine (double x0, double y0, double z0, + double x1, double y1, double z1, + List_T * v); + +void AddView_TensorLine (double x0, double y0, double z0, + double x1, double y1, double z1, + List_T * v); + +void AddView_ScalarPoint(double x0,double y0,double z0, + List_T *v); + +void AddView_VectorPoint(double x0,double y0,double z0, + List_T *v); + +void AddView_TensorPoint(double x0,double y0,double z0, + List_T *v); + +int BGMWithView (Post_View *ErrView); +int CreateBGM(Post_View *ErrView, int OptiMethod, double Degree, + double OptiValue, double *ObjFunct, char *OutFile); +double ErrorInView(Post_View * ErrView, int *n); + +#endif diff --git a/DataStr/List.cpp b/DataStr/List.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ae9d1b65422ca123ec65896124cf7ffd6c6a47a2 --- /dev/null +++ b/DataStr/List.cpp @@ -0,0 +1,333 @@ +#define RCSID "$Id: List.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $" +/* Original author: Marc UME */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <sys/types.h> + +#include "Malloc.h" +#include "List.h" +#include "Message.h" + +static char *startptr; + + +List_T *List_Create(int n, int incr, int size) +{ + List_T *liste; + + if (n <= 0) n = 1 ; + if (incr <= 0) incr = 1; + + liste = (List_T *)Malloc(sizeof(List_T)); + + liste->nmax = 0; + liste->incr = incr; + liste->size = size; + liste->n = 0; + liste->isorder = 0; + liste->array = NULL; + + List_Realloc(liste,n); + return(liste); +} + +void List_Delete(List_T *liste) +{ + Free(liste->array); + Free(liste); +} + +void List_Realloc(List_T *liste,int n) +{ + if (n <= 0) return; + + if (liste->array == NULL) { + liste->nmax = ((n - 1) / liste->incr + 1) * liste->incr; + liste->array = (char *)Malloc(liste->nmax * liste->size); + } + else + if (n > liste->nmax) { + liste->nmax = ((n - 1) / liste->incr + 1) * liste->incr; + liste->array = (char *)Realloc(liste->array, + liste->nmax * liste->size); + } +} + +void List_Add(List_T *liste, void *data) +{ + liste->n++; + + List_Realloc(liste,liste->n); + liste->isorder = 0; + memcpy(&liste->array[(liste->n - 1) * liste->size],data,liste->size); +} + +int List_Nbr(List_T *liste) +{ + return (liste)? liste->n : 0 ; +} + +void List_Insert(List_T *liste, void *data, + int (*fcmp)(const void *a, const void *b)) +{ + if (List_Search(liste,data,fcmp) == 0) + List_Add(liste,data); +} + +int List_Replace(List_T *liste, void *data, + int (*fcmp)(const void *a, const void *b)) +{ + void *ptr; + + if (liste->isorder != 1) List_Sort(liste,fcmp); + liste->isorder = 1; + ptr = (void *) bsearch(data,liste->array,liste->n,liste->size,fcmp); + if (ptr == NULL) { + List_Add(liste,data); + return(0); + } + else { + memcpy(ptr,data,liste->size); + return (1); + } +} + +void List_Read(List_T *liste, int index, void *data) +{ + if ((index < 0) || (index >= liste->n)) + Msg(ERROR, "Wrong List Index in List_Read"); + memcpy(data,&liste->array[index * liste->size],liste->size); +} + +void List_Write(List_T *liste, int index, void *data) +{ + if ((index < 0) || (index >= liste->n)) + Msg(ERROR, "Wrong List Index in List_Write"); + liste->isorder = 0; + memcpy(&liste->array[index * liste->size],data,liste->size); +} + +void List_Put(List_T *liste, int index, void *data) +{ + if (index < 0) + Msg(ERROR, "Wrong List Index in List_Put"); + + if (index >= liste->n) { + liste->n = index + 1; + List_Realloc(liste,liste->n); + List_Write(liste,index,data); + } else { + List_Write(liste,index,data); + } +} + +void List_Pop(List_T *liste) +{ + liste->n -- ; +} + +void *List_Pointer(List_T *liste, int index) +{ + if ((index < 0) || (index >= liste->n)) + Msg(ERROR, "Wrong List Index in List_Pointer"); + + liste->isorder = 0; /* getdp: a examiner... */ + return(&liste->array[index * liste->size]); +} + +void *List_Pointer_NoChange(List_T *liste, int index) +{ + if ((index < 0) || (index >= liste->n)) + Msg(ERROR, "Wrong List Index in List_Pointer_NoChange"); + + return(&liste->array[index * liste->size]); +} + +void List_Sort(List_T *liste, int (*fcmp)(const void *a, const void *b)) +{ + qsort(liste->array,liste->n,liste->size,fcmp); +} + +int List_Search(List_T *liste, void *data, + int (*fcmp)(const void *a, const void *b)) +{ + void *ptr; + + if (liste->isorder != 1) { List_Sort(liste,fcmp) ; liste->isorder = 1 ; } + ptr = (void *) bsearch(data,liste->array,liste->n,liste->size,fcmp); + if (ptr == NULL) return(0); + return (1); +} + +int List_ISearch(List_T *liste, void *data, + int (*fcmp)(const void *a, const void *b)) +{ + void *ptr; + + if (liste->isorder != 1) List_Sort(liste,fcmp); + liste->isorder = 1; + ptr = (void *) bsearch(data,liste->array,liste->n,liste->size,fcmp); + if (ptr == NULL) return(-1); + return (((long)ptr - (long)liste->array) / liste->size); +} + +int List_ISearchSeq(List_T *liste, void * data, + int (*fcmp)(const void *a, const void *b)) { + int i ; + + if (!liste) return -1 ; + i = 0 ; + while ((i < List_Nbr(liste)) && + fcmp(data, (void *)List_Pointer(liste, i)) ) i++ ; + if (i == List_Nbr(liste)) i = -1 ; + return i ; +} + +int List_ISearchSeqPartial(List_T *liste, void * data, int i_Start, + int (*fcmp)(const void *a, const void *b)) { + int i ; + + if (!liste) return -1 ; + i = i_Start ; + while ((i < List_Nbr(liste)) && + fcmp(data, (void *)List_Pointer(liste, i)) ) i++ ; + if (i == List_Nbr(liste)) i = -1 ; + return i ; +} + +int List_Query(List_T *liste, void *data, + int (*fcmp)(const void *a, const void *b)) +{ + void *ptr; + + if (liste->isorder != 1) List_Sort(liste,fcmp); + liste->isorder = 1; + ptr = (void *) bsearch(data,liste->array,liste->n,liste->size,fcmp); + if (ptr == NULL) return(0); + + memcpy(data,ptr,liste->size); + return (1); +} + +void *lolofind(void *data, void *array, int n, int size, + int (*fcmp)(const void *a, const void *b) ) +{ + char *ptr; + int i; + + ptr = (char*)array; + for (i = 0; i < n; i++) { + if (fcmp(ptr,data) == 0) break; + ptr += size; + } + if (i < n) return(ptr); + return(NULL); +} + +int List_LQuery(List_T *liste, void *data, + int (*fcmp)(const void *a, const void *b), int first) +{ + char *ptr; + + if (first == 1) { + ptr = (char *) lolofind(data,liste->array,liste->n,liste->size,fcmp); + } + else { + if (startptr != NULL) + ptr = (char *) lolofind(data,startptr,liste->n,liste->size,fcmp); + else + return(0); + } + + if (ptr == NULL) return(0); + + startptr = ptr + liste->size; + if ( startptr >= ( liste->array + liste->n * liste->size)) + startptr = NULL; + memcpy(data,ptr,liste->size); + return (1); +} + +void *List_PQuery(List_T *liste, void *data, + int (*fcmp)(const void *a, const void *b)) +{ + void *ptr; + + if (liste->isorder != 1) List_Sort(liste,fcmp); + liste->isorder = 1; + ptr = (void *) bsearch(data,liste->array,liste->n,liste->size,fcmp); + return(ptr); +} + +int List_Suppress(List_T *liste, void *data, + int (*fcmp)(const void *a, const void *b)) +{ + char *ptr; + int len; + + ptr = (char*)List_PQuery(liste,data,fcmp) ; + if (ptr == NULL) return(0); + + liste->n--; + len = liste->n - (((long)ptr - (long)liste->array) / liste->size); + if (len > 0) memmove(ptr, ptr + liste->size, len * liste->size); + return(1); +} + +int List_PSuppress(List_T *liste, int index) +{ + char *ptr; + int len; + + ptr = (char*)List_Pointer_NoChange(liste,index) ; + if (ptr == NULL) return(0); + + liste->n--; + len = liste->n - (((long)ptr - (long)liste->array) / liste->size); + if (len > 0) memmove(ptr, ptr + liste->size, len * liste->size); + return(1); +} + +void List_Invert(List_T *a , List_T *b) +{ + int i,N; + N = List_Nbr(a); + for(i=0;i<N;i++){ + List_Add(b,List_Pointer(a,N-i-1)); + } +} + +void List_Reset(List_T *liste) +{ + liste->n = 0; +} + +void List_Action(List_T *liste, void (*action)(void *data, void *dummy)) +{ + int i,dummy; + + for(i=0 ; i<List_Nbr(liste) ; i++){ + (*action)(List_Pointer_NoChange(liste,i),&dummy); + } + +} + +void List_Action_Inverse(List_T *liste, void (*action)(void *data, void *dummy)) +{ + int i,dummy; + + for(i=List_Nbr(liste) ; i>0 ; i--){ + (*action)(List_Pointer_NoChange(liste,i-1),&dummy); + } + +} + +void List_Copy(List_T *a , List_T *b){ + int i,N; + N = List_Nbr(a); + for(i=0;i<N;i++){ + List_Add(b,List_Pointer(a,i)); + } +} diff --git a/DataStr/List.h b/DataStr/List.h new file mode 100644 index 0000000000000000000000000000000000000000..abbba807c5e626cd5e34879f3095826815246665 --- /dev/null +++ b/DataStr/List.h @@ -0,0 +1,45 @@ +/* $Id: List.h,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ */ +#ifndef _LIST_H_ +#define _LIST_H_ + +typedef struct { + int nmax; + int size; + int incr; + int n; + int isorder; + char *array; +} List_T; + +List_T *List_Create(int n, int incr, int size); +void List_Delete(List_T *liste); +void List_Realloc(List_T *liste,int n); +void List_Add(List_T *liste, void *data); +int List_Nbr(List_T *liste); +void List_Insert(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b)); +int List_Replace(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b)); +void List_Read(List_T *liste, int index, void *data); +void List_Write(List_T *liste, int index, void *data); +void List_Put(List_T *liste, int index, void *data); +void List_Pop(List_T *liste); +void *List_Pointer(List_T *liste, int index); +void *List_Pointer_NoChange(List_T *liste, int index); +void List_Sort(List_T *liste, int (*fcmp)(const void *a, const void *b)); +int List_Search(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b)); +int List_ISearch(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b)); +int List_ISearchSeq(List_T *liste, void * data, int (*fcmp)(const void *a, const void *b)); +int List_ISearchSeqPartial(List_T *liste, void * data, int i_Start, + int (*fcmp)(const void *a, const void *b)) ; +int List_Query(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b)); +int List_LQuery(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b), int first); +void *List_PQuery(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b)); +int List_Suppress(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b)); +int List_PSuppress(List_T *liste, int index); +void List_Invert(List_T *a, List_T *b); +void List_Reset(List_T *liste); +void List_Action(List_T *liste, void (*action)(void *data, void *dummy)); +void List_Action_Inverse(List_T *liste, void (*action)(void *data, void *dummy)); +void List_Copy(List_T *a , List_T *b); + +#endif + diff --git a/DataStr/Makefile b/DataStr/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..8a3278506e5badf547e113744ddc6903e878c099 --- /dev/null +++ b/DataStr/Makefile @@ -0,0 +1,54 @@ +# +# Makefile for "libSataStr.a" +# + +.IGNORE: + +CC = c++ +C_FLAGS = -g -Wall + +RANLIB = /usr/bin/ranlib + +LIB = ../lib/libDataStr.a +INCLUDE = -I../Common + +CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE) + +SRC = List.cpp \ + Malloc.cpp \ + Tree.cpp \ + avl.cpp \ + Tools.cpp + +OBJ = $(SRC:.cpp=.o) + +.SUFFIXES: .o .cpp + +$(LIB): $(OBJ) + ar ruvs $(LIB) $(OBJ) + $(RANLIB) $(LIB) + +.cpp.o: + $(CC) $(CFLAGS) -c $< + +clean: + $(RM) $(RMFLAGS) *.o + +lint: + lint $(CFLAGS) $(SRC) + +depend: + (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ + $(CC) -MM $(CFLAGS) ${SRC} \ + ) >Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + + +# DO NOT DELETE THIS LINE +List.o: List.cpp Malloc.h List.h ../Common/Message.h +Malloc.o: Malloc.cpp Malloc.h ../Common/Message.h +Tree.o: Tree.cpp Malloc.h Tree.h avl.h ../Common/Message.h +avl.o: avl.cpp avl.h Malloc.h +Tools.o: Tools.cpp Tools.h List.h Tree.h avl.h diff --git a/DataStr/Malloc.cpp b/DataStr/Malloc.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1b716656dc7dc02b184413da924c2686fe45277d --- /dev/null +++ b/DataStr/Malloc.cpp @@ -0,0 +1,44 @@ +#define RCSID "$Id: Malloc.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $" +#include <stdio.h> +#include <stdlib.h> +#include <malloc.h> + +#include "Malloc.h" +#include "Message.h" + +void *Malloc(size_t size) +{ + void *ptr; + + if (!size) return(NULL); + ptr = malloc(size); + if (ptr == NULL) + Msg(ERROR, "Out of Memory in Malloc"); + return(ptr); +} + +void *Calloc(size_t num, size_t size) +{ + void *ptr; + + if (!size) return(NULL); + ptr = calloc(num, size); + if (ptr == NULL) + Msg(ERROR, "Out of Memory in Calloc"); + return(ptr); +} + +void *Realloc(void *ptr, size_t size) +{ + if (!size) return(NULL); + ptr = realloc(ptr,size); + if (ptr == NULL) + Msg(ERROR, "Out of Memory in Realloc"); + return(ptr); +} + +void Free(void *ptr) +{ + if (ptr == NULL) return; + free(ptr); +} diff --git a/DataStr/Malloc.h b/DataStr/Malloc.h new file mode 100644 index 0000000000000000000000000000000000000000..6f840b7bae8405083b63fe6881b72269ed6560dc --- /dev/null +++ b/DataStr/Malloc.h @@ -0,0 +1,13 @@ +/* $Id: Malloc.h,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ */ +#ifndef _UALLOC_H_ +#define _UALLOC_H_ + +/* #define size_t unsigned */ +/* #define NULL ((char *) 0) */ + +void *Malloc(size_t size); +void *Calloc(size_t num, size_t size); +void *Realloc(void *ptr, size_t size); +void Free(void *ptr); + +#endif diff --git a/DataStr/Tools.cpp b/DataStr/Tools.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6660beb36783494da46be7aee7b2701ac91ec784 --- /dev/null +++ b/DataStr/Tools.cpp @@ -0,0 +1,98 @@ +#define RCSID "$Id: Tools.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $" +#include <stdlib.h> +#include <math.h> +#include "Tools.h" + +/* Comparison functions */ + +int fcmp_int(const void *a, const void *b){ + return(*(int*)a - *(int*)b ); +} + +int fcmp_absint(const void *a, const void *b){ + return( abs(*(int*)a) - abs(*(int*)b) ); +} + +int fcmp_double(const void *a, const void *b){ + double cmp ; + + cmp = *(double*)a - *(double*)b ; + if (cmp > 1.e-16) return 1 ; + else if (cmp < -1.e-16) return -1 ; + else return 0 ; +} + +/* Tree ==> List transfer */ + +List_T *pListeTransfert; + +void TransfereListe(void *a,void *b){ + List_Add(pListeTransfert,a); +} +List_T *Tree2List(Tree_T *pTree){ + int Nb; + Nb = Tree_Nbr(pTree) ; if (Nb == 0) Nb = 1 ; + pListeTransfert = List_Create(Nb,Nb,Tree_Size(pTree)); + Tree_Action(pTree,TransfereListe); + return(pListeTransfert); +} + +/* Algebraic utilities */ + +Tree_T *pTreeTransfert; +Tree_T *pTreeTransfert2; + +void DupliqueArbre(void *a,void *b){ + Tree_Add(pTreeTransfert,a); +} +Tree_T *Tree_Duplique(Tree_T *pTree){ + pTreeTransfert = Tree_Create(pTree->size,pTree->root->compar); + Tree_Action(pTree,DupliqueArbre); + return(pTreeTransfert); +} + +void UnitArbre(void *a,void *b){ + Tree_Replace(pTreeTransfert,a); +} +Tree_T *Tree_Union(Tree_T *pTreeA, Tree_T *pTreeB){ + pTreeTransfert = Tree_Duplique(pTreeA); + Tree_Action(pTreeB,UnitArbre); + return(pTreeTransfert); +} +void Tree_Unit(Tree_T *pTreeA, Tree_T *pTreeB){ + pTreeTransfert = pTreeA; + Tree_Action(pTreeB,UnitArbre); +} + + +void SoustraitArbre(void *a,void *b){ + Tree_Suppress(pTreeTransfert,a); +} +Tree_T *Tree_Soustraction(Tree_T *pTreeA, Tree_T *pTreeB){ + pTreeTransfert = Tree_Duplique(pTreeA); + Tree_Action(pTreeB,SoustraitArbre); + return(pTreeTransfert); +} +void Tree_Soustrait(Tree_T *pTreeA, Tree_T *pTreeB){ + pTreeTransfert = pTreeA; + Tree_Action(pTreeB,SoustraitArbre); +} + + +void IntersecteArbre(void *a,void *b){ + if (Tree_Query(pTreeTransfert,a)) Tree_Add(pTreeTransfert2,a); +} +Tree_T *Tree_Intersection(Tree_T *pTreeA, Tree_T *pTreeB){ + pTreeTransfert = Tree_Duplique(pTreeA); + pTreeTransfert2= Tree_Create(pTreeA->size,pTreeA->root->compar); + Tree_Action(pTreeB,IntersecteArbre); + Tree_Delete(pTreeTransfert); + return(pTreeTransfert2); +} +void Tree_Intersecte(Tree_T *pTreeA, Tree_T *pTreeB){ + pTreeTransfert2 = pTreeA; + pTreeTransfert = Tree_Create(pTreeA->size,pTreeA->root->compar); + Tree_Action(pTreeB,IntersecteArbre); + pTreeA = pTreeTransfert2; + Tree_Delete(pTreeA); +} diff --git a/DataStr/Tools.h b/DataStr/Tools.h new file mode 100644 index 0000000000000000000000000000000000000000..0032ac90498c6da888534e58dc72c08528b68d78 --- /dev/null +++ b/DataStr/Tools.h @@ -0,0 +1,23 @@ +/* $Id: Tools.h,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ */ +#ifndef _TOOLS_H_ +#define _TOOLS_H_ + +#include "List.h" +#include "Tree.h" + +int fcmp_int(const void *a, const void *b); +int fcmp_absint(const void *a, const void *b); +int fcmp_double(const void *a, const void *b); + +List_T *Tree2List(Tree_T *pTree) ; + +Tree_T *Tree_Duplique(Tree_T *pTree) ; +Tree_T *Tree_Union (Tree_T *pTreeA, Tree_T *pTreeB) ; +Tree_T *Tree_Soustraction(Tree_T *pTreeA, Tree_T *pTreeB) ; +Tree_T *Tree_Intersection(Tree_T *pTreeA, Tree_T *pTreeB) ; + +void Tree_Unit (Tree_T *pTreeA, Tree_T *pTreeB) ; +void Tree_Soustrait (Tree_T *pTreeA, Tree_T *pTreeB) ; +void Tree_Intersecte(Tree_T *pTreeA, Tree_T *pTreeB) ; + +#endif diff --git a/DataStr/Tree.cpp b/DataStr/Tree.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cb90a7c4ce5ce41138b2724fa5aa16d251f152e3 --- /dev/null +++ b/DataStr/Tree.cpp @@ -0,0 +1,177 @@ +#define RCSID "$Id: Tree.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $" + +#include <stdlib.h> +#include <string.h> + +#include "Malloc.h" +#include "Tree.h" +#include "Message.h" + +Tree_T *Tree_Create(int size, int (*fcmp)(const void *a, const void *b)) +{ + Tree_T *tree; + + tree = (Tree_T *) Malloc(sizeof(Tree_T)); + + tree->size = size; + tree->root = avl_init_table(fcmp); + + return(tree); +} + +void Tree_Delete(Tree_T *tree) +{ + if(!tree) return; + avl_free_table(tree->root, Free, 0); + Free(tree); +} + +void Tree_Add(Tree_T *tree, void *data) +{ + void *ptr; + + if(!tree) + Msg(ERROR, "Impossible to Add in Unallocated Tree"); + ptr = Malloc(tree->size); + memcpy(ptr,data,tree->size); + avl_insert(tree->root, ptr, ptr); +} + +void * Tree_AddP(Tree_T *tree, void *data) +{ + void *ptr; + + if(!tree) + Msg(ERROR, "Impossible to Add in Unallocated Tree"); + ptr = Malloc(tree->size); + memcpy(ptr,data,tree->size); + avl_insert(tree->root, ptr, ptr); + return ptr ; +} + +int Tree_Nbr(Tree_T *tree) +{ + if(!tree) return 0; + return(avl_count(tree->root)); +} + +void Tree_Insert(Tree_T *tree, void *data) +{ + if (Tree_Search(tree,data) == 0) + Tree_Add(tree,data); +} + +int Tree_Replace(Tree_T *tree, void *data) +{ + void *ptr; + int state; + + if(!tree) + Msg(ERROR, "Impossible to Replace in Unallocated Tree"); + state = avl_lookup(tree->root, data, &ptr); + if (state == 0) { + Tree_Add(tree,data); + return(0); + } + else { + memcpy(ptr,data,tree->size); + return (1); + } +} + +int Tree_Search(Tree_T *tree, void *data) +{ + void *ptr; + + if(!tree) return 0; + return (avl_lookup(tree->root, data, &ptr)); +} + +int Tree_Query(Tree_T *tree, void *data) +{ + void *ptr; + int state; + + if(!tree) return 0; + + state = avl_lookup(tree->root, data, &ptr); + + if (state == 0) return(0); + + memcpy(data,ptr,tree->size); + + return (1); +} + +void *Tree_PQuery(Tree_T *tree, void *data) +{ + void *ptr; + int state; + + if(!tree) return 0; + + state = avl_lookup(tree->root, data, &ptr); + + if (state == 0) return(NULL); + return (ptr); +} + +int Tree_Suppress(Tree_T *tree, void *data) +{ + void *ptr; + int state; + + if(!tree) return 0; + + ptr = data; + state = avl_delete(tree->root, &ptr, &ptr) ; + if (state == 0) return(0); + + Free(ptr); + return(1); +} + +int Tree_Left(Tree_T *tree, void *data) +{ + void *ptr; + int state; + + if(!tree) return 0; + + state = avl_extremum(tree->root, AVL_MOST_LEFT, &ptr); + + if (state == 0) return (0); + + memcpy(data,ptr,tree->size); + + return (1); +} + +int Tree_Right(Tree_T *tree, void *data) +{ + void *ptr; + int state; + + if(!tree) return 0; + + state = avl_extremum(tree->root, AVL_MOST_RIGHT, &ptr); + + if (state == 0) return (0); + + memcpy(data,ptr,tree->size); + + return (1); +} + +void Tree_Action(Tree_T *tree, void (*action) (void *data, void *dummy)) +{ + if(!tree) return; + + avl_foreach(tree->root, action, AVL_FORWARD); +} + +int Tree_Size(Tree_T *tree) { + if(!tree) return 0; + + return(tree->size); +} diff --git a/DataStr/Tree.h b/DataStr/Tree.h new file mode 100644 index 0000000000000000000000000000000000000000..82c8656ab782607f9555cd6e7f5543f42f5278e3 --- /dev/null +++ b/DataStr/Tree.h @@ -0,0 +1,29 @@ +/* $Id: Tree.h,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ */ +#ifndef _TREE_H_ +#define _TREE_H_ + +#include "avl.h" + +typedef struct { + int size; + avl_tree *root; +} Tree_T; + +Tree_T *Tree_Create(int size, int (*fcmp)(const void *a, const void *b)); +void Tree_Delete(Tree_T *Tree); +void Tree_Add(Tree_T *tree, void *data); +void *Tree_AddP(Tree_T *tree, void *data); +int Tree_Nbr(Tree_T *Tree); +void Tree_Insert(Tree_T *Tree, void *data); +int Tree_Replace(Tree_T *Tree, void *data); +int Tree_Search(Tree_T *Tree, void *data); +int Tree_Query(Tree_T *Tree, void *data); +void *Tree_PQuery(Tree_T *Tree, void *data); +int Tree_Suppress(Tree_T *Tree, void *data); +int Tree_Left(Tree_T *tree, void *data); +int Tree_Right(Tree_T *tree, void *data); +void Tree_Action(Tree_T *tree, void (*action) (void *data, void *dummy)); +int Tree_Size(Tree_T *tree) ; + +#endif + diff --git a/DataStr/avl.cpp b/DataStr/avl.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1f67e788304ce4db3a3123f5535fcf247fcae6d1 --- /dev/null +++ b/DataStr/avl.cpp @@ -0,0 +1,443 @@ +#define RCSID "$Id: avl.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $" + +/* + * This is a modified version for Gmsh (for c++, 64-bit architectures, etc.) + */ + +/* + * avl package + * + * Copyright (c) 1988-1993, The Regents of the University of California. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the University of California not + * be used in advertising or publicity pertaining to distribution of + * the software without specific, written prior permission. The University + * of California makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * THE UNIVERSITY OF CALIFORNIA DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR + * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <stdio.h> + +#include "avl.h" +#include "Malloc.h" + +#define ALLOC(type, number) (type *) Malloc((unsigned) sizeof(type) * number) +#define NIL(type) (type *) 0 +#define FREE(item) (void) Free(item) +#define XRNMAX(a,b) ((a) > (b) ? (a) : (b)) +#define HEIGHT(node) (node == NIL(avl_node) ? -1 : (node)->height) +#define BALANCE(node) (HEIGHT((node)->right) - HEIGHT((node)->left)) + +#define compute_height(node) { \ + int x=HEIGHT(node->left), y=HEIGHT(node->right); \ + (node)->height = XRNMAX(x,y) + 1; \ +} + +#define COMPARE(key, nodekey, compare) \ + ((compare == avl_numcmp) ? \ + (long int) key - (long int) nodekey : \ + (*compare)(key, nodekey)) + +static void avl_record_gen_forward(avl_node *node, avl_generator *gen); +static void avl_record_gen_backward(avl_node *node, avl_generator *gen); +static avl_node *find_rightmost(avl_node **node_p); +static void do_rebalance(avl_node ***stack_nodep, int stack_n); +static void rotate_left(avl_node **node_p); +static void rotate_right(avl_node **node_p); +static void avl_walk_forward(avl_node *node, void (*func)(void *key, void *value)); +static void avl_walk_backward(avl_node *node, void (*func)(void *key, void *value)); +static void free_entry(avl_node *node, void (*key_free)(void *key), + void (*value_free)(void *value)); +static avl_node *new_node(void *key, void *value); +static int do_check_tree(avl_node *node, int (*compar)(const void *key1, const void *key2), + int *error); + + +avl_tree *avl_init_table(int (*compar)(const void *key1, const void *key2)) +{ + avl_tree *tree; + + tree = ALLOC(avl_tree, 1); + tree->root = NIL(avl_node); + tree->compar = compar; + tree->num_entries = 0; + return tree; +} + +int avl_lookup(avl_tree *tree, void *key, void **value_p) +{ + register avl_node *node; + register int (*compare)(const void*, const void *) = tree->compar, diff; + + node = tree->root; + while (node != NIL(avl_node)) { + diff = COMPARE(key, node->key, compare); + if (diff == 0) { + /* got a match, give the user a 'value' only if non-null */ + if (value_p != NIL(void *)) *value_p = node->value; + return 1; + } + node = (diff < 0) ? node->left : node->right; + } + return 0; +} + +int avl_insert(avl_tree *tree, void *key, void *value) +{ + register avl_node **node_p, *node; + register int stack_n = 0; + register int (*compare)(const void*, const void *) = tree->compar; + avl_node **stack_nodep[32]; + int diff, status; + + node_p = &tree->root; + + /* walk down the tree (saving the path); stop at insertion point */ + status = 0; + while ((node = *node_p) != NIL(avl_node)) { + stack_nodep[stack_n++] = node_p; + diff = COMPARE(key, node->key, compare); + if (diff == 0) status = 1; + node_p = (diff < 0) ? &node->left : &node->right; + } + + /* insert the item and re-balance the tree */ + *node_p = new_node(key, value); + do_rebalance(stack_nodep, stack_n); + tree->num_entries++; + tree->modified = 1; + return status; +} + +int avl_delete(avl_tree *tree, void **key_p, void **value_p) +{ + register avl_node **node_p, *node, *rightmost; + register int stack_n = 0; + void *key = *key_p; + int (*compare)(const void*, const void*) = tree->compar, diff; + avl_node **stack_nodep[32]; + + node_p = &tree->root; + + /* Walk down the tree saving the path; return if not found */ + while ((node = *node_p) != NIL(avl_node)) { + diff = COMPARE(key, node->key, compare); + if (diff == 0) goto delete_item; + stack_nodep[stack_n++] = node_p; + node_p = (diff < 0) ? &node->left : &node->right; + } + return 0; /* not found */ + + /* prepare to delete node and replace it with rightmost of left tree */ + delete_item: + *key_p = node->key; + if (value_p != 0) *value_p = node->value; + if (node->left == NIL(avl_node)) { + *node_p = node->right; + } else { + rightmost = find_rightmost(&node->left); + rightmost->left = node->left; + rightmost->right = node->right; + rightmost->height = -2; /* mark bogus height for do_rebal */ + *node_p = rightmost; + stack_nodep[stack_n++] = node_p; + } + FREE(node); + + /* work our way back up, re-balancing the tree */ + do_rebalance(stack_nodep, stack_n); + tree->num_entries--; + tree->modified = 1; + return 1; +} + +static void avl_record_gen_forward(avl_node *node, avl_generator *gen) +{ + if (node != NIL(avl_node)) { + avl_record_gen_forward(node->left, gen); + gen->nodelist[gen->count++] = node; + avl_record_gen_forward(node->right, gen); + } +} + +static void avl_record_gen_backward(avl_node *node, avl_generator *gen) +{ + if (node != NIL(avl_node)) { + avl_record_gen_backward(node->right, gen); + gen->nodelist[gen->count++] = node; + avl_record_gen_backward(node->left, gen); + } +} + +avl_generator *avl_init_gen(avl_tree *tree, int dir) +{ + avl_generator *gen; + + /* what a hack */ + gen = ALLOC(avl_generator, 1); + gen->tree = tree; + gen->nodelist = ALLOC(avl_node *, avl_count(tree)); + gen->count = 0; + if (dir == AVL_FORWARD) { + avl_record_gen_forward(tree->root, gen); + } else { + avl_record_gen_backward(tree->root, gen); + } + gen->count = 0; + + /* catch any attempt to modify the tree while we generate */ + tree->modified = 0; + return gen; +} + +int avl_gen(avl_generator *gen, void **key_p, void **value_p) +{ + avl_node *node; + + if (gen->count == gen->tree->num_entries) { + return 0; + } else { + node = gen->nodelist[gen->count++]; + if (key_p != NIL(void *)) *key_p = node->key; + if (value_p != NIL(void *)) *value_p = node->value; + return 1; + } +} + +void avl_free_gen(avl_generator *gen) +{ + FREE(gen->nodelist); + FREE(gen); +} + +static avl_node *find_rightmost(avl_node **node_p) +{ + register avl_node *node; + register int stack_n = 0; + avl_node **stack_nodep[32]; + + node = *node_p; + while (node->right != NIL(avl_node)) { + stack_nodep[stack_n++] = node_p; + node_p = &node->right; + node = *node_p; + } + *node_p = node->left; + + do_rebalance(stack_nodep, stack_n); + return node; +} + +static void do_rebalance(avl_node ***stack_nodep, int stack_n) +{ + register avl_node **node_p, *node; + register int hl, hr; + int height; + + /* work our way back up, re-balancing the tree */ + while (--stack_n >= 0) { + node_p = stack_nodep[stack_n]; + node = *node_p; + hl = HEIGHT(node->left); /* watch for NIL */ + hr = HEIGHT(node->right); /* watch for NIL */ + if ((hr - hl) < -1) { + rotate_right(node_p); + } else if ((hr - hl) > 1) { + rotate_left(node_p); + } else { + height = XRNMAX(hl, hr) + 1; + if (height == node->height) break; + node->height = height; + } + } +} + +static void rotate_left(avl_node **node_p) +{ + register avl_node *old_root = *node_p, *new_root, *new_right; + + if (BALANCE(old_root->right) >= 0) { + *node_p = new_root = old_root->right; + old_root->right = new_root->left; + new_root->left = old_root; + } else { + new_right = old_root->right; + *node_p = new_root = new_right->left; + old_root->right = new_root->left; + new_right->left = new_root->right; + new_root->right = new_right; + new_root->left = old_root; + compute_height(new_right); + } + compute_height(old_root); + compute_height(new_root); +} + +static void rotate_right(avl_node **node_p) +{ + register avl_node *old_root = *node_p, *new_root, *new_left; + + if (BALANCE(old_root->left) <= 0) { + *node_p = new_root = old_root->left; + old_root->left = new_root->right; + new_root->right = old_root; + } else { + new_left = old_root->left; + *node_p = new_root = new_left->right; + old_root->left = new_root->right; + new_left->right = new_root->left; + new_root->left = new_left; + new_root->right = old_root; + compute_height(new_left); + } + compute_height(old_root); + compute_height(new_root); +} + +static void avl_walk_forward(avl_node *node, void (*func)(void *key, void *value)) +{ + if (node != NIL(avl_node)) { + avl_walk_forward(node->left, func); + (*func)(node->key, node->value); + avl_walk_forward(node->right, func); + } +} + +static void avl_walk_backward(avl_node *node, void (*func)(void *key, void *value)) +{ + if (node != NIL(avl_node)) { + avl_walk_backward(node->right, func); + (*func)(node->key, node->value); + avl_walk_backward(node->left, func); + } +} + +void avl_foreach(avl_tree *tree, void (*func)(void *key, void *value), int direction) +{ + if (direction == AVL_FORWARD) { + avl_walk_forward(tree->root, func); + } else { + avl_walk_backward(tree->root, func); + } +} + +int avl_extremum(avl_tree *tree, int side, void **value_p) +{ + register avl_node *node; + + node = tree->root; + if (node == NIL(avl_node)) return 0; + + if (side == AVL_MOST_LEFT) + while (node->left != NIL(avl_node)) node = node->left; + else + while (node->right != NIL(avl_node)) node = node->right; + + if (value_p != NIL(void *)) { + *value_p = node->value; + return 1; + } + return 0; +} + +static void free_entry(avl_node *node, void (*key_free)(void *key), void (*value_free)(void *value)) +{ + if (node != NIL(avl_node)) { + free_entry(node->left, key_free, value_free); + free_entry(node->right, key_free, value_free); + if (key_free != 0) (*key_free)(node->key); + if (value_free != 0) (*value_free)(node->value); + FREE(node); + } +} + +void avl_free_table(avl_tree *tree, void (*key_free)(void *key), void (*value_free)(void *value)) +{ + free_entry(tree->root, key_free, value_free); + FREE(tree); +} + +int avl_count(avl_tree *tree) +{ + return tree->num_entries; +} + +static avl_node *new_node(void *key, void *value) +{ + register avl_node *newn; + + newn = ALLOC(avl_node, 1); + newn->key = key; + newn->value = value; + newn->height = 0; + newn->left = newn->right = NIL(avl_node); + return newn; +} +int avl_numcmp(const void *x, const void*y) +{ + return (long int) x - (long int) y; +} + +int avl_check_tree(avl_tree *tree) +{ + int error = 0; + (void) do_check_tree(tree->root, tree->compar, &error); + return error; +} + +static int do_check_tree(avl_node *node, + int (*compar)(const void *key1, const void *key2), int *error) +{ + int l_height, r_height, comp_height, bal; + + if (node == NIL(avl_node)) { + return -1; + } + + r_height = do_check_tree(node->right, compar, error); + l_height = do_check_tree(node->left, compar, error); + + comp_height = XRNMAX(l_height, r_height) + 1; + bal = r_height - l_height; + + if (comp_height != node->height) { + (void) printf("Bad height for %p: computed=%d stored=%d\n", + node, comp_height, node->height); + ++*error; + } + + if (bal > 1 || bal < -1) { + (void) printf("Out of balance at node %p, balance = %d\n", + node, bal); + ++*error; + } + + if (node->left != NIL(avl_node) && + (*compar)(node->left->key, node->key) > 0) { + (void) printf("Bad ordering between %p and %p", + node, node->left); + ++*error; + } + + if (node->right != NIL(avl_node) && + (*compar)(node->key, node->right->key) > 0) { + (void) printf("Bad ordering between %p and %p", + node, node->right); + ++*error; + } + + return comp_height; +} diff --git a/DataStr/avl.h b/DataStr/avl.h new file mode 100644 index 0000000000000000000000000000000000000000..a9acfe257c9b906f806ce31e798dc9eb0735f2ae --- /dev/null +++ b/DataStr/avl.h @@ -0,0 +1,85 @@ +/* $Id: avl.h,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ */ +#ifndef _AVL_H_ +#define _AVL_H_ + +/* + * avl package + * + * Copyright (c) 1988-1993, The Regents of the University of California. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the University of California not + * be used in advertising or publicity pertaining to distribution of + * the software without specific, written prior permission. The University + * of California makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * THE UNIVERSITY OF CALIFORNIA DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR + * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +typedef struct avl_node_struct avl_node; +struct avl_node_struct { + avl_node *left, *right; + void *key; + void *value; + int height; +}; + + +typedef struct avl_tree_struct avl_tree; +struct avl_tree_struct { + avl_node *root; + int (*compar)(const void *key1, const void *key2); + int num_entries; + int modified; +}; + + +typedef struct avl_generator_struct avl_generator; +struct avl_generator_struct { + avl_tree *tree; + avl_node **nodelist; + int count; +}; + + +#define AVL_FORWARD 0 +#define AVL_BACKWARD 1 + +#define AVL_MOST_LEFT 0 +#define AVL_MOST_RIGHT 1 + +#define avl_is_member(tree, key) avl_lookup(tree, key, (void **) 0) + +#define avl_foreach_item(table, gen, dir, key_p, value_p) \ + for(gen = avl_init_gen(table, dir); \ + avl_gen(gen, key_p, value_p) || (avl_free_gen(gen),0);) + + +avl_tree *avl_init_table(int (*compar)(const void *key1, const void *key2)); +int avl_lookup(avl_tree *tree, void *key, void **value_p); +int avl_insert(avl_tree *tree, void *key, void *value); +int avl_delete(avl_tree *tree, void **key_p, void **value_p); +void avl_foreach(avl_tree *tree, void (*func)(void *key, void *value), int direction); +void avl_free_table(avl_tree *tree, void (*key_free)(void *key), void (*value_free)(void *value)); +int avl_count(avl_tree *tree); +int avl_check_tree(avl_tree *tree); +int avl_extremum(avl_tree *tree, int side, void **value_p); + +avl_generator *avl_init_gen(avl_tree *tree, int dir); +int avl_gen(avl_generator *gen, void **key_p, void **value_p); +void avl_free_gen(avl_generator *gen); + +int avl_numcmp(const void *x, const void*y); + +#endif diff --git a/Geo/CAD.cpp b/Geo/CAD.cpp new file mode 100644 index 0000000000000000000000000000000000000000..265f9c33163edea603bcd36b5639c52a947c4881 --- /dev/null +++ b/Geo/CAD.cpp @@ -0,0 +1,1642 @@ + +#include "Gmsh.h" +#include "Geo.h" +#include "Mesh.h" +#include "DataBase.h" +#include "Interpolation.h" +#include "Numeric.h" +#include "Const.h" +#include "Create.h" +#include "CAD.h" + +extern Mesh *THEM; +extern int CurrentNodeNumber; +extern double LC ; + +static int MAXREG,MAXPOINT; +static List_T *ListOfTransformedPoints; + +int compare2Lists (List_T *List1, List_T *List2, + int (*fcmp)(const void *a, const void *b)){ + int i,found; + + if(List_Nbr(List1) != List_Nbr(List2))return List_Nbr(List1) - List_Nbr(List2); + + List_T *List1Prime = List_Create(List_Nbr(List1),1,List1->size); + List_T *List2Prime = List_Create(List_Nbr(List2),1,List2->size); + List_Copy(List1,List1Prime); + List_Copy(List2,List2Prime); + List_Sort(List1Prime,fcmp); + List_Sort(List2Prime,fcmp); + + for(i=0;i<List_Nbr(List1Prime);i++){ + found = fcmp(List_Pointer(List1Prime,i), + List_Pointer(List2Prime,i)); + if(found != 0){ + List_Delete(List1Prime); + List_Delete(List2Prime); + return found; + } + } + List_Delete(List1Prime); + List_Delete(List2Prime); + return 0; +} + +void MaxNumCurve(void *a, void *b){ + Curve *c = *(Curve**)a; + MAXREG = (c->Num>MAXREG)?c->Num:MAXREG; +} + +void MaxNumSurface(void *a, void *b){ + Surface *s = *(Surface**)a; + MAXREG = (s->Num>MAXREG)?s->Num:MAXREG; +} + +void MaxNumEdgeLoop(void *a, void *b){ + EdgeLoop *s = *(EdgeLoop**)a; + MAXREG = (s->Num>MAXREG)?s->Num:MAXREG; +} + +void MaxNumSurfaceLoop(void *a, void *b){ + SurfaceLoop *s = *(SurfaceLoop**)a; + MAXREG = (s->Num>MAXREG)?s->Num:MAXREG; +} + +void MaxNumPoint(void *a, void *b){ + Vertex *v = *(Vertex**)a; + MAXPOINT = (v->Num>MAXPOINT)?v->Num:MAXPOINT; +} + +void dist_ddg(double x1,double y1,double z1, + double x2,double y2,double z2, + double x3,double y3,double z3, + double x4,double y4,double z4, + double *x,double *y,double *z){ + + double v[3],u[3],d; + + u[0] = x1-x3; + u[1] = y1-y3; + u[2] = z1-z3; + + v[0] = x4-x3; + v[1] = y4-y3; + v[2] = z4-z3; + + norme(v); + prosca(u,v,&d); + + *x = d* x4 + x3 * (1.-d); + *y = d* y4 + y3 * (1.-d); + *z = d* z4 + z3 * (1.-d); +} + + +int NEWREG(void){ + MAXREG = 0; + PhysicalGroup *p; + Tree_Action(THEM->Curves,MaxNumCurve); + Tree_Action(THEM->Surfaces,MaxNumSurface); + Tree_Action(THEM->EdgeLoops,MaxNumEdgeLoop); + Tree_Action(THEM->SurfaceLoops,MaxNumSurfaceLoop); + for(int i=0;i<List_Nbr(THEM->PhysicalGroups);i++){ + List_Read( THEM->PhysicalGroups , i, &p); + MAXREG = IMAX(MAXREG,p->Num); + } + return MAXREG+1; +} + +int NEWPOINT(void){ + MAXPOINT = 0; + Tree_Action(THEM->Points,MaxNumPoint); + return MAXPOINT+1; +} + +Vertex *FindVertex(int inum, Mesh *M){ + Vertex C,*pc; + pc = &C; + pc->Num = inum; + if(Tree_Query(M->Points,&pc)){ + return pc; + } + return NULL; +} + + + +Curve *FindCurve(int inum, Mesh *M){ + Curve C,*pc; + pc = &C; + pc->Num = inum; + if(Tree_Query(M->Curves,&pc)){ + return pc; + } + return NULL; +} + +Surface *FindSurface(int inum, Mesh *M){ + Surface S,*ps; + ps = &S; + ps->Num = inum; + if(Tree_Query(M->Surfaces,&ps)){ + return ps; + } + return NULL; +} + +Volume *FindVolume(int inum, Mesh *M){ + Volume V,*pv; + pv = &V; + pv->Num = inum; + if(Tree_Query(M->Volumes,&pv)){ + return pv; + } + return NULL; +} + +EdgeLoop *FindEdgeLoop(int inum, Mesh *M){ + EdgeLoop S,*ps; + ps = &S; + ps->Num = inum; + if(Tree_Query(M->EdgeLoops,&ps)){ + return ps; + } + return NULL; +} + +SurfaceLoop *FindSurfaceLoop(int inum, Mesh *M){ + SurfaceLoop S,*ps; + ps = &S; + ps->Num = inum; + if(Tree_Query(M->SurfaceLoops,&ps)){ + return ps; + } + return NULL; +} + +/* + S = (sx(u,v),sy(u,v),sz(u,v)) + C = (cx(w),cy(w),cz(w)) + + sx - cx = 0 + sy - cy = 0 + sz - cz = 0 + + 3eqs 3incs +*/ + +static Curve *CURVE, *CURVE_2; +static Surface *SURFACE; +static Vertex *VERTEX; +extern double min1d ( double (*funct)(double), double *xmin); +extern void newt(float x[], int n, int *check, + void (*vecfunc)(int, float [], float [])); + +static void intersectCS (int N, float x[], float res[]){ + //x[1] = u x[2] = v x[3] = w + Vertex s,c; + s = InterpolateSurface(SURFACE,x[1],x[2],0,0); + c = InterpolateCurve (CURVE,x[3],0); + res[1] = s.Pos.X - c.Pos.X; + res[2] = s.Pos.Y - c.Pos.Y; + res[3] = s.Pos.Z - c.Pos.Z; +} + +static void intersectCC (int N, float x[], float res[]){ + //x[1] = u x[2] = v + Vertex c2,c; + c2 = InterpolateCurve(CURVE_2,x[2],0); + c = InterpolateCurve (CURVE,x[1],0); + res[1] = c2.Pos.X - c.Pos.X; + res[2] = c2.Pos.Y - c.Pos.Y; +} + +static void projectPS (int N, float x[], float res[]){ + //x[1] = u x[2] = v + Vertex du,dv,c; + c = InterpolateSurface(SURFACE,x[1],x[2],0,0); + du = InterpolateSurface(SURFACE,x[1],x[2],1,1); + dv = InterpolateSurface(SURFACE,x[1],x[2],1,2); + res[1] = + (c.Pos.X - VERTEX->Pos.X)*du.Pos.X + + (c.Pos.Y - VERTEX->Pos.Y)*du.Pos.Y + + (c.Pos.Z - VERTEX->Pos.Z)*du.Pos.Z; + res[2] = + (c.Pos.X - VERTEX->Pos.X)*dv.Pos.X + + (c.Pos.Y - VERTEX->Pos.Y)*dv.Pos.Y + + (c.Pos.Z - VERTEX->Pos.Z)*dv.Pos.Z; +} + +static double projectPC (double u){ + //x[1] = u x[2] = v + if(u<CURVE->ubeg)u = CURVE->ubeg; + if(u<CURVE->ubeg)u = CURVE->ubeg; + Vertex c; + c = InterpolateCurve(CURVE,u,0); + return sqrt( DSQR(c.Pos.X -VERTEX->Pos.X)+ + DSQR(c.Pos.Y -VERTEX->Pos.Y)+ + DSQR(c.Pos.Z -VERTEX->Pos.Z)); +} + +static int UFIXED=0,VFIXED=0; +static double FIX; +static double projectPCS (double u){ + //x[1] = u x[2] = v + double tmin,tmax; + if(UFIXED){ + tmin = SURFACE->kv[0]; + tmax = SURFACE->kv[SURFACE->Nv+SURFACE->OrderV]; + } + else{ + tmin = SURFACE->ku[0]; + tmax = SURFACE->ku[SURFACE->Nu+SURFACE->OrderU]; + } + + if(u<tmin)u = tmin; + if(u>tmax)u = tmax; + Vertex c; + if(UFIXED) + c = InterpolateSurface(SURFACE,FIX,u,0,0); + else + c = InterpolateSurface(SURFACE,u,FIX,0,0); + return sqrt(DSQR(c.Pos.X -VERTEX->Pos.X)+ + DSQR(c.Pos.Y -VERTEX->Pos.Y)+ + DSQR(c.Pos.Z -VERTEX->Pos.Z)); +} + +bool ProjectPointOnCurve (Curve *c, Vertex *v, Vertex *RES, Vertex *DER){ + double x,xmin; + int check; + CURVE = c; + VERTEX = v; + x = min1d ( projectPC, &xmin); + *RES = InterpolateCurve(CURVE,xmin,0); + *DER = InterpolateCurve(CURVE,xmin,1); + if(xmin > c->uend){ + *RES = InterpolateCurve(CURVE,c->uend,0); + *DER = InterpolateCurve(CURVE,c->uend,1); + } + else if(xmin < c->ubeg){ + *RES = InterpolateCurve(CURVE,c->ubeg,0); + *DER = InterpolateCurve(CURVE,c->ubeg,1); + } + if(!check)return false; + return true; +} + +bool search_in_boundary ( Surface *s, Vertex *p, double t, int Fixu, + double *uu, double *vv){ + double l,umin,vmin,lmin = 1.e24; + int i,N; + Vertex vr; + double tmin, tmax,u,v; + + if(Fixu){ + tmin = s->kv[0]; + tmax = s->kv[s->Nv+s->OrderV]; + N = 3*s->Nu; + } + else{ + tmin = s->ku[0]; + tmax = s->ku[s->Nu+s->OrderU]; + N = 3*s->Nv; + } + for(i=0;i<N;i++){ + if(Fixu){ + u = t; + v = tmin + (tmax-tmin)*(double)(i)/(double)(N-1); + } + else { + v = t; + u = tmin + (tmax-tmin)*(double)(i)/(double)(N-1); + } + vr = InterpolateSurface(SURFACE,u,v,0,0); + l = sqrt(DSQR(vr.Pos.X - p->Pos.X) + + DSQR(vr.Pos.Y - p->Pos.Y) + + DSQR(vr.Pos.Z - p->Pos.Z)); + if(l<lmin){ + lmin = l; + umin = u; + vmin = v; + } + } + + FIX = t; + UFIXED = Fixu; + VFIXED = !Fixu; + double xm,xq; + if(Fixu)xm = vmin; + else xm = umin; + if(lmin > 1.e-3)xq = min1d ( projectPCS, &xm); + if(Fixu){ + *uu = t; + *vv = xm; + } + else{ + *vv = t; + *uu = xm; + } + vr = InterpolateSurface(SURFACE,*uu,*vv,0,0); + l = sqrt(DSQR(vr.Pos.X - p->Pos.X) + + DSQR(vr.Pos.Y - p->Pos.Y) + + DSQR(vr.Pos.Z - p->Pos.Z)); + if(l<1.e-3)return true; + return false; +} + +bool try_a_value(Surface *s, Vertex *p, double u, double v,double *uu, double *vv){ + Vertex vr = InterpolateSurface(s,u,v,0,0); + double l = sqrt(DSQR(vr.Pos.X - p->Pos.X) + + DSQR(vr.Pos.Y - p->Pos.Y) + + DSQR(vr.Pos.Z - p->Pos.Z)); + *uu = u;*vv=v; + if(l<1.e-3)return true; + return false; +} + +bool ProjectPointOnSurface (Surface *s, Vertex &p){ + float x[3] = {0.5,0.5,0.5}; + Vertex vv; + int check; + SURFACE = s; + VERTEX = &p; + double UMIN = 0.; + double UMAX = 1.; + double VMIN = 0.; + double VMAX = 1.; + while(1){ + newt(x,2,&check,projectPS); + vv = InterpolateSurface(s,x[1],x[2],0,0); + if(x[1] >= UMIN && x[1] <= UMAX && x[2] >=VMIN && x[2] <= VMAX)break; + x[1] = UMIN + (UMAX-UMIN)*((rand() % 10000)/10000.); + x[2] = VMIN + (VMAX-VMIN)*((rand() % 10000)/10000.); + } + p.Pos.X = vv.Pos.X; + p.Pos.Y = vv.Pos.Y; + p.Pos.Z = vv.Pos.Z; + if(!check){ + return false; + } + return true; +} + +bool ProjectPointOnSurface (Surface *s, Vertex *p,double *u, double *v){ + static float x[3]; + int check; + static int deb = 1; + double VMIN,VMAX,UMIN,UMAX,l, lmin; + Vertex vv; + + SURFACE = s; + VERTEX = p; + lmin = 1.e24; + UMAX = s->ku[s->Nu + s->OrderU]; + UMIN = s->ku[0]; + VMAX = s->kv[s->Nv + s->OrderV]; + VMIN = s->kv[0]; + if(deb){ + x[1] = UMIN + (UMAX-UMIN)*((rand() % 10000)/10000.); + x[2] = VMIN + (VMAX-VMIN)*((rand() % 10000)/10000.); + deb = 0; + } + + if(p->Num == 160){ + lmin += 1.e90; + if(p->Num == 133)UMAX = s->ku[s->Nu + s->OrderU]; + } + + if(try_a_value(SURFACE,VERTEX,SURFACE->ku[0]+VERTEX->u, + SURFACE->kv[0],u,v)) + return true; + if(try_a_value(SURFACE,VERTEX,SURFACE->ku[0]+VERTEX->u, + SURFACE->kv[SURFACE->Nv+SURFACE->OrderV],u,v)) + return true; + if(try_a_value(SURFACE,VERTEX,SURFACE->ku[SURFACE->Nu+SURFACE->OrderU]-VERTEX->u, + SURFACE->kv[0],u,v)) + return true; + if(try_a_value(SURFACE,VERTEX,SURFACE->ku[SURFACE->Nu+SURFACE->OrderU]-VERTEX->u, + SURFACE->kv[SURFACE->Nv+SURFACE->OrderV],u,v)) + return true; + if(try_a_value(SURFACE,VERTEX,SURFACE->ku[0],SURFACE->kv[0]+VERTEX->u,u,v)) + return true; + if(try_a_value(SURFACE,VERTEX,SURFACE->ku[0], + SURFACE->kv[SURFACE->Nv+SURFACE->OrderV]-VERTEX->u,u,v)) + return true; + if(try_a_value(SURFACE,VERTEX,SURFACE->ku[SURFACE->Nu+SURFACE->OrderU], + SURFACE->kv[0]+VERTEX->u,u,v)) + return true; + if(try_a_value(SURFACE,VERTEX,SURFACE->ku[SURFACE->Nu+SURFACE->OrderU], + SURFACE->kv[SURFACE->Nv+SURFACE->OrderV]-VERTEX->u,u,v)) + return true; + + + if(search_in_boundary(SURFACE,VERTEX,SURFACE->kv[0],0,u,v)) + return true; + if(search_in_boundary(SURFACE,VERTEX,SURFACE->kv[SURFACE->Nv+SURFACE->OrderV],0,u,v)) + return true; + if(search_in_boundary(SURFACE,VERTEX,SURFACE->ku[0],1,u,v)) + return true; + if(search_in_boundary(SURFACE,VERTEX,SURFACE->ku[SURFACE->Nu+SURFACE->OrderU],1,u,v)) + return true; + + while(1){ + newt(x,2,&check,projectPS); + vv = InterpolateSurface(s,x[1],x[2],0,0); + l = sqrt(DSQR(vv.Pos.X - p->Pos.X) + + DSQR(vv.Pos.Y - p->Pos.Y) + + DSQR(vv.Pos.Z - p->Pos.Z)); + if(l < 1.e-1)break; + else { + x[1] = UMIN + (UMAX-UMIN)*((rand() % 10000)/10000.); + x[2] = VMIN + (VMAX-VMIN)*((rand() % 10000)/10000.); + } + } + *u = x[1]; + *v = x[2]; + + if(!check){ + return false; + } + return true; +} + +bool IntersectCurveSurface (Curve *c, Surface *s){ + float x[4]; + int check; + SURFACE = s; + CURVE = c; + newt(x,3,&check,intersectCS); + if(!check)return false; + return true; +} + +void CopyVertex (Vertex *v, Vertex *vv){ + vv->lc = v->lc; + vv->u = v->u; + vv->Pos.X = v->Pos.X; + vv->Pos.Y = v->Pos.Y; + vv->Pos.Z = v->Pos.Z; + vv->Freeze.X = v->Freeze.X; + vv->Freeze.Y = v->Freeze.Y; + vv->Freeze.Z = v->Freeze.Z; +} + +Vertex *DuplicateVertex (Vertex *v){ + Vertex *pv; + pv = Create_Vertex(MAXPOINT++,0,0,0,0,0); + + CopyVertex (v,pv); + CurrentNodeNumber = (CurrentNodeNumber>pv->Num)?CurrentNodeNumber:pv->Num; + Tree_Insert(THEM->Points,&pv); + return pv; +} + +void CopyCurve (Curve *c, Curve *cc){ + int i,j; + cc->Typ = c->Typ; + cc->Method = c->Method; + for(i=0;i<4;i++)cc->ipar[i] = c->ipar[i]; + for(i=0;i<4;i++)cc->dpar[i] = c->dpar[i]; + cc->l = c->l; + for(i=0;i<4;i++)for(j=0;j<4;j++)cc->mat[i][j] = c->mat[i][j]; + cc->beg = c->beg; + cc->end = c->end; + cc->ubeg = c->ubeg; + cc->uend = c->uend; + cc->Control_Points = List_Create(List_Nbr(c->Control_Points),1,sizeof(Vertex*)); + List_Copy(c->Control_Points,cc->Control_Points); + End_Curve(cc); + Tree_Insert(THEM->Curves,&cc); +} + +Curve *DuplicateCurve (Curve *c){ + Curve *pc; + Vertex *v,*newv; + pc = Create_Curve(MAXREG++,0,1,NULL,NULL,-1,-1,0.,1.); + CopyCurve(c,pc); + for(int i=0;i<List_Nbr(c->Control_Points);i++){ + List_Read(pc->Control_Points,i,&v); + newv = DuplicateVertex(v); + List_Write(pc->Control_Points,i,&newv); + } + pc->beg = DuplicateVertex(c->beg); + pc->end = DuplicateVertex(c->end); + CreateReversedCurve (THEM,pc); + + return pc; +} + +void CopySurface (Surface *s, Surface *ss){ + int i,j; + ss->Typ = s->Typ; + ss->Mat = s->Mat; + ss->Method = s->Method; + ss->Recombine = s->Recombine; + ss->RecombineAngle = s->RecombineAngle; + for(i=0;i<4;i++)ss->ipar[i] = s->ipar[i]; + ss->Nu = s->Nu; + ss->Nv = s->Nv; + ss->a = s->a;ss->b = s->b;ss->c = s->c; ss->d = s->d; + for(i=0;i<3;i++)for(j=0;j<3;j++)ss->plan[i][j] = s->plan[i][j]; + for(i=0;i<3;i++)for(j=0;j<3;j++)ss->invplan[i][j] = s->invplan[i][j]; + ss->s.Generatrices = List_Create(List_Nbr(s->s.Generatrices),1,sizeof(Curve*)); + List_Copy(s->s.Generatrices,ss->s.Generatrices); + if( s->Control_Points ){ + ss->Control_Points = List_Create(List_Nbr(s->Control_Points),1,sizeof(Vertex*)); + List_Copy(s->Control_Points,ss->Control_Points); + } + End_Surface(ss); + Tree_Insert(THEM->Surfaces,&ss); +} + +Surface *DuplicateSurface (Surface *s, int addthesurf){ + Surface *ps; + Curve *c,*newc; + Vertex *v,*newv; + ps = Create_Surface(addthesurf?MAXREG++:-MAXREG,0,0); + CopySurface(s,ps); + for(int i=0;i<List_Nbr(ps->s.Generatrices);i++){ + List_Read(ps->s.Generatrices,i,&c); + newc = DuplicateCurve(c); + List_Write(ps->s.Generatrices,i,&newc); + } + + for(int i=0;i<List_Nbr(ps->Control_Points);i++){ + List_Read(ps->Control_Points,i,&v); + newv = DuplicateVertex(v); + List_Write(ps->Control_Points,i,&newv); + } + return ps; +} + +static void vecmat4x4(double mat[4][4],double vec[4], double res[4]){ + int i,j; + for(i=0;i<4;i++){ + res[i] = 0.0; + for(j=0;j<4;j++){ + res[i] += mat[i][j] * vec[j]; + } + } +} + +void ApplyTransformationToPoint ( double matrix[4][4], Vertex *v ){ + double pos[4],vec[4]; + + if(!ListOfTransformedPoints)ListOfTransformedPoints = List_Create(2,2,sizeof(int)); + + if(!List_Search(ListOfTransformedPoints,&v->Num,fcmp_absint)){ + List_Add(ListOfTransformedPoints,&v->Num); + } + else + return; + + vec[0] = v->Pos.X; + vec[1] = v->Pos.Y; + vec[2] = v->Pos.Z; + vec[3] = v->w; + vecmat4x4(matrix,vec,pos); + v->Pos.X = pos[0]; + v->Pos.Y = pos[1]; + v->Pos.Z = pos[2]; + v->w = pos[3]; +} + +/* Linear Applications */ + +void SetTranslationMatrix (double matrix[4][4],double T[3]){ + for(int i=0;i<4;i++){ + for(int j=0;j<4;j++){ + matrix[i][j] = (i==j)? 1.0:0.0; + } + } + for(int i=0;i<3;i++)matrix[i][3] = T[i]; +} + +void SetSymmetryMatrix (double matrix[4][4],double A, double B, double C, double D){ + double F = -2.0 / (A*A+B*B+C*C); + matrix[0][0] = 1. + A*A*F; + matrix[0][1] = A*B*F; + matrix[0][2] = A*C*F; + matrix[0][3] = A*D*F; + matrix[1][0] = A*B*F; + matrix[1][1] = 1. + B*B*F; + matrix[1][2] = B*C*F; + matrix[1][3] = B*D*F; + matrix[2][0] = A*C*F; + matrix[2][1] = B*C*F; + matrix[2][2] = 1. + C*C*F; + matrix[2][3] = C*D*F; + matrix[3][0] = B*C*F; + matrix[3][1] = 0.0; + matrix[3][2] = 0.0; + matrix[3][3] = 1.0; +} + +void SetDilatationMatrix (double matrix[4][4],double T[3],double A){ + matrix[0][0] = A; + matrix[0][1] = 0.0; + matrix[0][2] = 0.0; + matrix[0][3] = T[0]*(1.0-A); + matrix[1][0] = 0.0; + matrix[1][1] = A; + matrix[1][2] = 0.0; + matrix[1][3] = T[1]*(1.0-A); + matrix[2][0] = 0.0; + matrix[2][1] = 0.0; + matrix[2][2] = A; + matrix[2][3] = T[2]*(1.0-A); + matrix[3][0] = 0.0; + matrix[3][1] = 0.0; + matrix[3][2] = 0.0; + matrix[3][3] = 1.0; +} + +void GramSchmidt (double v1[3], double v2[3], double v3[3]){ + double tmp[3]; + norme(v1); + prodve(v3,v1,tmp); + norme(tmp); + v2[0] = tmp[0];v2[1] = tmp[1];v2[2] = tmp[2]; + prodve(v1,v2,v3); + norme(v3); +} + +void SetRotationMatrix( double matrix[4][4],double Axe[3], double alpha){ + double t1[3],t2[3]; + if(Axe[0] != 0.0){ + t1[0] = 0.0; + t1[1] = 1.0; + t1[2] = 0.0; + t2[0] = 0.0; + t2[1] = 0.0; + t2[2] = 1.0; + } + else if(Axe[1] != 0.0){ + t1[0] = 1.0; + t1[1] = 0.0; + t1[2] = 0.0; + t2[0] = 0.0; + t2[1] = 0.0; + t2[2] = 1.0; + } + else { + t1[0] = 1.0; + t1[1] = 0.0; + t1[2] = 0.0; + t2[0] = 0.0; + t2[1] = 1.0; + t2[2] = 0.0; + } + GramSchmidt(Axe,t1,t2); + double rot[3][3],plan[3][3],invplan[3][3]; + plan[0][0] = Axe[0]; plan[0][1] = Axe[1]; plan[0][2] = Axe[2]; + plan[1][0] = t1[0] ; plan[1][1] = t1[1]; plan[1][2] = t1[2]; + plan[2][0] = t2[0] ; plan[2][1] = t2[1]; plan[2][2] = t2[2]; + rot[2][2] = cos(alpha) ; rot[2][1] = sin(alpha) ; rot[2][0] = 0.; + rot[1][2] = -sin(alpha); rot[1][1] = cos(alpha) ; rot[1][0] = 0.; + rot[0][2] = 0. ; rot[0][1] = 0. ; rot[0][0] = 1.; + int i,j,k; + for(i=0;i<3;i++)for(j=0;j<3;j++)invplan[i][j] = plan[j][i]; + double interm[3][3]; + for(i=0;i<3;i++)for(j=0;j<3;j++){ + interm[i][j] = 0.0; + for(k=0;k<3;k++)interm[i][j] += invplan[i][k] * rot[k][j]; + } + for(i=0;i<4;i++)for(j=0;j<4;j++)matrix[i][j] = 0.0; + for(i=0;i<3;i++)for(j=0;j<3;j++){ + for(k=0;k<3;k++)matrix[i][j] += interm[i][k] * plan[k][j]; + } + matrix[3][3] = 1.0; +} + +void SetRotationMatrixs(double matrix[4][4],double Axe[3], double alpha){ + double phi,C,S,C2,S2; + double teta; + double a,b,c,d,e,f,g,h,ii; + double Ax=Axe[0],Ay=Axe[1],Az=Axe[2]; + if(Ax != 0.0){ + phi = atan2(Ay,Ax); + teta = atan2(Az,myhypot(Ax,Ay)); + C = cos(phi); + S = sin(phi); + C2= cos(teta); + S2= sin(teta); + } + else if(Ay != 0.0){ + teta = atan2(Az,myhypot(Ax,Ay)); + C = 0.0; + S = 1.0; + C2= cos(teta); + S2= sin(teta); + } + else{ + C = 1.0; + S = 0.0; + C2= 0.0; + S2= 1.0; + } + + a = C2*C; + b = -C2*S; + c = S2; + d = cos(alpha)*S + sin(alpha)*S2*C; + e = cos(alpha)*C - sin(alpha)*S*S2; + f = -sin(alpha)*C2; + g = sin(alpha)*S - cos(alpha)*S2*C; + h = sin(alpha)*C + cos(alpha)*S*S2; + ii=cos(alpha)*C2; + + matrix[0][0] = a*a + S*d -C*S2*g; + matrix[0][1] = a*b+S*e-C*S2*h; + matrix[0][2] = a*c+S*f-C*S2*ii; + matrix[0][3] = 0.0; + matrix[1][0] = -S*C2*a+C*d+S*S2*g; + matrix[1][1] = -S*C2*b+C*e+S*S2*h; + matrix[1][2] = -S*C2*c+C*f+S*S2*ii; + matrix[1][3] = 0.0; + matrix[2][0] = S2*a+C2*g; + matrix[2][1] = S2*b+C2*h; + matrix[2][2] = S2*c+C2*ii; + matrix[2][3] = 0.0; + matrix[3][0] = 0.; + matrix[3][1] = 0.; + matrix[3][2] = 0.; + matrix[3][3] = 1.0; +} + +void ApplyTransformationToCurve (double matrix[4][4],Curve *c){ + Vertex *v; + + ApplyTransformationToPoint (matrix,c->beg); + ApplyTransformationToPoint (matrix,c->end); + + for(int i=0;i<List_Nbr(c->Control_Points);i++){ + List_Read(c->Control_Points,i,&v); + ApplyTransformationToPoint (matrix,v); + } + End_Curve(c); +} + +void ApplyTransformationToSurface (double matrix[4][4],Surface *s){ + Curve *c; + Vertex *v; + + for(int i=0;i<List_Nbr(s->s.Generatrices);i++){ + List_Read(s->s.Generatrices,i,&c); + ApplyTransformationToCurve (matrix,c); + } + for(int i=0;i<List_Nbr(s->Control_Points);i++){ + List_Read(s->Control_Points,i,&v); + ApplyTransformationToPoint (matrix,v); + } + End_Surface(s); +} + +void printCurve(Curve *c){ + Vertex *v; + int N = List_Nbr(c->Control_Points); + Msg(INFO,"Curve %d %d cp (%d->%d)",c->Num,N,c->beg->Num,c->end->Num); + for(int i=0;i<N;i++){ + List_Read(c->Control_Points,i,&v); + Msg(INFO,"Vertex %d (%f %f %f %f)",v->Num,v->Pos.X,v->Pos.Y,v->Pos.Z,v->lc); + } +} + +void ProtudeXYZ ( double &x, double &y, double &z, ExtrudeParams *e){ + double matrix[4][4]; + double T[3]; + Vertex v(x,y,z); + T[0] = -e->geo.pt[0]; + T[1] = -e->geo.pt[1]; + T[2] = -e->geo.pt[2]; + List_Reset(ListOfTransformedPoints); + SetTranslationMatrix(matrix,T); + ApplyTransformationToPoint(matrix,&v); + List_Reset(ListOfTransformedPoints); + SetRotationMatrix(matrix,e->geo.axe,e->geo.angle); + ApplyTransformationToPoint(matrix,&v); + List_Reset(ListOfTransformedPoints); + T[0] = -T[0]; T[1] = -T[1]; T[2] = -T[2]; + SetTranslationMatrix(matrix,T); + ApplyTransformationToPoint(matrix,&v); + List_Reset(ListOfTransformedPoints); + x = v.Pos.X; + y = v.Pos.Y; + z = v.Pos.Z; +} + +void Extrude_ProtudePoint(int ep, int ip, double A, double B, double C, + double X, double Y, double Z, double alpha, + Curve **pc, Curve **prc, ExtrudeParams *e){ + double xnew,ynew,znew,matrix[4][4],T[3],Ax[3]; + Vertex V,*pv, *chapeau; + Curve *c; + + MAXREG = NEWREG(); + MAXPOINT = NEWPOINT(); + + pv= &V; + pv->Num = ip; + *pc = *prc = NULL; + if(!Tree_Query(THEM->Points, &pv) )return; + + chapeau = DuplicateVertex(pv); + if(ep){ + T[0] = A; T[1] = B; T[2] = C; + SetTranslationMatrix(matrix,T); + ApplyTransformationToPoint(matrix,chapeau); + List_Reset(ListOfTransformedPoints); + } + else{ + T[0] = X; T[1] = Y; T[2] = Z; + Ax[0] = A; Ax[1] = B; Ax[2] = C; + T[0] = -T[0]; T[1] = -T[1]; T[2] = -T[2]; + SetTranslationMatrix(matrix,T); + ApplyTransformationToPoint(matrix,chapeau); + List_Reset(ListOfTransformedPoints); + SetRotationMatrix(matrix,Ax,alpha); + ApplyTransformationToPoint(matrix,chapeau); + List_Reset(ListOfTransformedPoints); + T[0] = -T[0]; T[1] = -T[1]; T[2] = -T[2]; + SetTranslationMatrix(matrix,T); + ApplyTransformationToPoint(matrix,chapeau); + List_Reset(ListOfTransformedPoints); + Msg(INFO,"Angle %f point %f %f %f axe %f %f %f",alpha,X,Y,Z,A,B,C); + } + + c = Create_Curve(MAXREG++,(ep)?MSH_SEGM_LINE:MSH_SEGM_CIRC,1,NULL,NULL,-1,-1,0.,1.); + c->Control_Points = List_Create((ep)?2:3,1,sizeof(Vertex*)); + + // je me souviens + c->Extrude = new ExtrudeParams; + c->Extrude->fill(ep,A,B,C,X,Y,Z,alpha); + if(e)c->Extrude->mesh = e->mesh; + + if(ep){ + List_Add(c->Control_Points,&pv); + List_Add(c->Control_Points,&chapeau); + c->beg = pv; + c->end = chapeau; + } + else{ + List_Add(c->Control_Points,&pv); + + dist_ddg(pv->Pos.X,pv->Pos.Y,pv->Pos.Z, + chapeau->Pos.X,chapeau->Pos.Y,chapeau->Pos.Z, + X,Y,Z,X+A,Y+B,Z+C,&xnew,&ynew,&znew); + Vertex *newp = DuplicateVertex(pv); + newp->Pos.X = xnew; + newp->Pos.Y = ynew; + newp->Pos.Z = znew; + List_Add(c->Control_Points,&newp); + List_Add(c->Control_Points,&chapeau); + c->beg = pv; + c->end = chapeau; + printCurve(c); + } + End_Curve(c); + Tree_Add(THEM->Curves,&c); + CreateReversedCurve (THEM,c); + *pc = c; + *prc = FindCurve(-c->Num,THEM); + +} + +void printSurface(Surface*s){ + Curve *c; + int N = List_Nbr(s->s.Generatrices); + + Msg(INFO,"Surface %d %d generatrices",s->Num,N); + for(int i=0;i<N;i++){ + List_Read(s->s.Generatrices,i,&c); + printCurve(c); + } +} + +Surface *Extrude_ProtudeCurve(int ep, int ic, + double A, double B, double C, + double X, double Y, double Z, + double alpha, ExtrudeParams *e){ + double matrix[4][4],T[3],Ax[3]; + Curve *CurveBeg,*CurveEnd; + Curve *ReverseChapeau,*ReverseBeg,*ReverseEnd; + Curve *pc, *revpc, *chapeau; + Surface *s; + + MAXREG = NEWREG(); + MAXPOINT = NEWPOINT(); + + pc = FindCurve(ic,THEM); + revpc = FindCurve(-ic,THEM); + + if(!pc || !revpc){ + return NULL; + } + chapeau = DuplicateCurve(pc); + + chapeau->Extrude = new ExtrudeParams(COPIED_ENTITY); + chapeau->Extrude->fill(ep,A,B,C,X,Y,Z,alpha); + chapeau->Extrude->geo.Source = pc->Num; + if(e)chapeau->Extrude->mesh = e->mesh; + + ReverseChapeau = FindCurve(-chapeau->Num,THEM); + if(ep){ + T[0] = A; T[1] = B; T[2] = C; + SetTranslationMatrix(matrix,T); + ApplyTransformationToCurve(matrix,chapeau); + } + else{ + T[0] = -X; T[1] = -Y; T[2] = -Z; + SetTranslationMatrix(matrix,T); + ApplyTransformationToCurve(matrix,chapeau); + List_Reset(ListOfTransformedPoints); + + Ax[0] = A; Ax[1] = B; Ax[2] = C; + SetRotationMatrix(matrix,Ax,alpha); + ApplyTransformationToCurve(matrix,chapeau); + List_Reset(ListOfTransformedPoints); + + T[0] = X; T[1] = Y; T[2] = Z; + SetTranslationMatrix(matrix,T); + ApplyTransformationToCurve(matrix,chapeau); + List_Reset(ListOfTransformedPoints); + } + Extrude_ProtudePoint(ep,pc->beg->Num,A,B,C,X,Y,Z,alpha, + &CurveBeg,&ReverseBeg,e); + Extrude_ProtudePoint(ep,pc->end->Num,A,B,C,X,Y,Z,alpha, + &CurveEnd,&ReverseEnd,e); + + s = Create_Surface(MAXREG++,MSH_SURF_REGL,0); + s->s.Generatrices = List_Create(4,1,sizeof(Curve*)); + + // je me souviens + s->Extrude = new ExtrudeParams; + s->Extrude->fill(ep,A,B,C,X,Y,Z,alpha); + s->Extrude->geo.Source = pc->Num; + if(e)s->Extrude->mesh = e->mesh; + + if(!pc) + Msg(INFO,"zarbi 1"); + if(!CurveEnd) + Msg(INFO,"zarbi 2"); + if(!ReverseChapeau) + Msg(INFO,"zarbi 3"); + if(!ReverseBeg) + Msg(INFO,"zarbi 4"); + + List_Add(s->s.Generatrices,&pc); + List_Add(s->s.Generatrices,&CurveEnd); + List_Add(s->s.Generatrices,&ReverseChapeau); + List_Add(s->s.Generatrices,&ReverseBeg); + End_Surface(s); + Tree_Add(THEM->Surfaces,&s); + List_Reset(ListOfTransformedPoints); + return s; +} + +void Extrude_ProtudeSurface(int ep, int is, + double A, double B, double C, + double X, double Y, double Z, + double alpha, + int NewVolume, ExtrudeParams *e){ + double matrix[4][4],T[3],Ax[3]; + Curve *c,*c2; + int i; + Surface *s,*ps, *chapeau; + Volume *pv = NULL; + + if(!(ps = FindSurface(is,THEM)) )return; + + if(NewVolume){ + pv = Create_Volume(NewVolume,0,0); + pv->Extrude = new ExtrudeParams; + pv->Extrude->fill(ep,A,B,C,X,Y,Z,alpha); + pv->Extrude->geo.Source = is; + if(e)pv->Extrude->mesh = e->mesh; + if(pv)List_Add(pv->Surfaces,&ps); + } + + MAXREG = NEWREG(); + MAXPOINT = NEWPOINT(); + + chapeau = DuplicateSurface(ps,1); + chapeau->Extrude = new ExtrudeParams(COPIED_ENTITY); + chapeau->Extrude->fill(ep,A,B,C,X,Y,Z,alpha); + chapeau->Extrude->geo.Source = ps->Num; + if(e)chapeau->Extrude->mesh = e->mesh; + + for(i=0;i<List_Nbr(chapeau->s.Generatrices);i++) { + List_Read(ps->s.Generatrices,i,&c2); + List_Read(chapeau->s.Generatrices,i,&c); + if(c->Num<0)c = FindCurve(-c->Num,THEM); + c->Extrude = new ExtrudeParams(COPIED_ENTITY); + c->Extrude->fill(ep,A,B,C,X,Y,Z,alpha); + c->Extrude->geo.Source = abs(c2->Num); + if(e)c->Extrude->mesh = e->mesh; + } + + if(pv)List_Add(pv->Surfaces,&chapeau); + + // filling extrude params + + for(i=0;i<List_Nbr(ps->s.Generatrices);i++){ + List_Read(ps->s.Generatrices,i,&c); + s = Extrude_ProtudeCurve(ep,c->Num,A,B,C,X,Y,Z,alpha,e); + if(pv)List_Add(pv->Surfaces,&s); + //printSurface(s); + } + + if(ep){ + T[0] = A; T[1] = B; T[2] = C; + SetTranslationMatrix(matrix,T); + ApplyTransformationToSurface(matrix,chapeau); + } + else{ + T[0] = -X; T[1] = -Y; T[2] = -Z; + SetTranslationMatrix(matrix,T); + ApplyTransformationToSurface(matrix,chapeau); + List_Reset(ListOfTransformedPoints); + + Ax[0] = A;Ax[1]=B;Ax[2]=C; + SetRotationMatrix(matrix,Ax,alpha); + ApplyTransformationToSurface(matrix,chapeau); + List_Reset(ListOfTransformedPoints); + + T[0] = X; T[1] = Y; T[2] = Z; + SetTranslationMatrix(matrix,T); + ApplyTransformationToSurface(matrix,chapeau); + List_Reset(ListOfTransformedPoints); + } + Tree_Suppress(THEM->Surfaces,&chapeau); + chapeau->Num = NEWREG(); + Tree_Add(THEM->Surfaces,&chapeau); + + if(pv)Tree_Add(THEM->Volumes,&pv); + + ReplaceAllDuplicates ( THEM ); + List_Reset(ListOfTransformedPoints); + +} + +void DivideCurve (Curve *c , double u, Vertex *v, Curve **c1, Curve **c2){ + (*c1) = Create_Curve(MAXREG++,c->Typ,1,NULL,NULL,-1,-1,0.,1.); + (*c2) = Create_Curve(MAXREG++,c->Typ,1,NULL,NULL,-1,-1,0.,1.); + CopyCurve(c,*c1); + CopyCurve(c,*c2); + (*c1)->uend = u; + (*c2)->ubeg = u; + (*c1)->end = v; + (*c2)->beg = v; +} + +bool IntersectCurves (Curve *c1, Curve *c2, + Curve **c11, Curve **c12, + Curve **c21, Curve **c22, Vertex **v){ + float x[3]; + Vertex v1,v2; + Vertex V,*pv; + int check; + + if(!compareVertex(&c1->beg,&c2->beg))return false; + if(!compareVertex(&c1->end,&c2->end))return false; + if(!compareVertex(&c1->beg,&c2->end))return false; + if(!compareVertex(&c2->beg,&c1->end))return false; + + CURVE_2 = c2; + CURVE = c1; + x[1] = x[2] = 0.0; + newt(x,2,&check,intersectCC); + if(check)return false; + v1 = InterpolateCurve(c1,x[1],0); + v2 = InterpolateCurve(c2,x[2],0); + if(x[1] <= c1->ubeg)return false; + if(x[1] >= c1->uend)return false; + if(x[2] <= c2->ubeg)return false; + if(x[2] >= c2->uend)return false; + if(fabs(v1.Pos.Z - v2.Pos.Z) > 1.e-06 * LC )return false; + pv = &V; + pv->Num = MAXPOINT++; + Cdbpts101(pv->Num,v1.Pos.X,v1.Pos.Y,v1.Pos.Z,v1.lc,x[1]); + v = (Vertex**)Tree_PQuery(THEM->Points,&pv); + DivideCurve(c1,x[1],*v,c11,c12); + DivideCurve(c2,x[2],*v,c21,c22); + return true; +} + +bool IntersectAllSegmentsTogether (void) { + bool intersectionfound = true; + List_T *TempList; + Curve *c1,*c2,*c11,*c12,*c21,*c22; + Vertex *v; + int i,j; + + while(intersectionfound){ + TempList = Tree2List(THEM->Curves); + if(!List_Nbr(TempList))return true; + for(i=0;i<List_Nbr(TempList);i++){ + List_Read(TempList,i,&c1); + intersectionfound = false; + for(j=0;j<List_Nbr(TempList);j++){ + List_Read(TempList,j,&c2); + if(c1->Num > 0 && c2->Num >0 && i!=j && intersectionfound == false){ + if(IntersectCurves(c1,c2,&c11,&c12,&c21,&c22,&v)){ + Msg(INFO, "Intersection curve %d %d",c1->Num,c2->Num); + intersectionfound = true; + DeleteCurve(c1->Num); + DeleteCurve(c2->Num); + Tree_Add(THEM->Curves,&c11); + Tree_Add(THEM->Curves,&c12); + Tree_Add(THEM->Curves,&c21); + Tree_Add(THEM->Curves,&c22); + + CreateReversedCurve(THEM,c11); + CreateReversedCurve(THEM,c12); + CreateReversedCurve(THEM,c21); + CreateReversedCurve(THEM,c22); + return true; + } + } + } + if(intersectionfound) break; + } + List_Delete(TempList); + } + return false; + +} + +void IntersectSurfaces (Surface *s1, Surface *s2){ + + +} + +int compareTwoCurves (const void *a, const void *b){ + Curve *c1, *c2; + c1 = *(Curve**)a; + c2 = *(Curve**)b; + int comp; + + if(c1->Typ != c2->Typ)return c1->Typ - c2->Typ; + comp = compareVertex(&c1->beg,&c2->beg); + if(comp)return comp; + comp = compareVertex(&c1->end,&c2->end); + if(comp)return comp; + // a finir pour des splines !! + return 0; + return c1->Num - c2->Num; +} + +int compareAbsCurve (const void *a, const void *b){ + Curve **q, **w; + + q = (Curve **) a; + w = (Curve **) b; + return (abs((*q)->Num) - abs((*w)->Num)); +} + +int compareTwoSurfaces (const void *a, const void *b){ + Surface *s1, *s2; + s1 = *(Surface**)a; + s2 = *(Surface**)b; + return compare2Lists(s1->s.Generatrices, + s2->s.Generatrices, + compareAbsCurve); +} + + +/* Fonction eliminant les doublons dans une + geometrie*/ + +void Coherence_PS(void){ + ReplaceAllDuplicates (THEM); +} + +void ReplaceAllDuplicates ( Mesh *m ){ + List_T *All = Tree2List(m->Points); + Vertex *v; + Curve *c,*c2; + Surface *s; + Volume *vol; + int i,j; + + /*Creation de points uniques*/ + Tree_T *allNonDulpicatedPoints; + allNonDulpicatedPoints = Tree_Create(sizeof(Vertex*),comparePosition); + Msg(INFO, "Beginning with %d points",List_Nbr(All)); + for(i=0;i<List_Nbr(All);i++){ + List_Read(All,i,&v); + if(!Tree_Search(allNonDulpicatedPoints,&v)){ + Tree_Insert(allNonDulpicatedPoints,&v); + } + else{ + Tree_Suppress(m->Points,&v); + } + } + + List_Delete(All); + Msg(INFO, "Ending with %d points",Tree_Nbr(m->Points)); + + /*Remplacement dans les courbes*/ + All = Tree2List(m->Curves); + + Msg(INFO, "Beginning with %d curves",List_Nbr(All)); + for(i=0;i<List_Nbr(All);i++){ + List_Read(All,i,&c); + Tree_Query( allNonDulpicatedPoints,&c->beg); + Tree_Query( allNonDulpicatedPoints,&c->end); + for(j=0;j<List_Nbr(c->Control_Points);j++){ + List_Write(c->Control_Points,j, + Tree_PQuery( allNonDulpicatedPoints, + List_Pointer(c->Control_Points,j))); + } + } + List_Delete(All); + All = Tree2List(m->Surfaces); + for(i=0;i<List_Nbr(All);i++){ + List_Read(All,i,&s); + for(j=0;j<List_Nbr(s->Control_Points);j++){ + List_Write(s->Control_Points,j, + Tree_PQuery( allNonDulpicatedPoints, + List_Pointer(s->Control_Points,j))); + } + } + + List_Delete(All); + All = Tree2List(m->Curves); + + /*Creation de courbes uniques*/ + Tree_T *allNonDulpicatedCurves; + allNonDulpicatedCurves = Tree_Create(sizeof(Curve*),compareTwoCurves); + for(i=0;i<List_Nbr(All);i++){ + List_Read(All,i,&c); + if(c->Num > 0){ + if(!Tree_Search(allNonDulpicatedCurves,&c)){ + Tree_Insert(allNonDulpicatedCurves,&c); + c2 = FindCurve(-c->Num,m); + Tree_Insert(allNonDulpicatedCurves,&c2); + } + else{ + Tree_Suppress(m->Curves,&c); + c2 = FindCurve(-c->Num,m); + Tree_Suppress(m->Curves,&c2); + } + } + } + + List_Delete(All); + Msg(INFO, "Ending with %d curves",Tree_Nbr(m->Curves)); + + /*Remplacement dans les surfaces*/ + All = Tree2List(m->Surfaces); + for(i=0;i<List_Nbr(All);i++){ + List_Read(All,i,&s); + for(j=0;j<List_Nbr(s->s.Generatrices);j++){ + List_Write(s->s.Generatrices,j, + Tree_PQuery( allNonDulpicatedCurves, + List_Pointer(s->s.Generatrices,j))); + } + } + + /*Creation de surfaces uniques*/ + Msg(INFO, "Beginning with %d surfaces",List_Nbr(All)); + + Tree_T *allNonDulpicatedSurfaces; + allNonDulpicatedSurfaces = Tree_Create(sizeof(Curve*),compareTwoSurfaces); + for(i=0;i<List_Nbr(All);i++){ + List_Read(All,i,&s); + //printSurface(s); + if(s->Num > 0){ + if(!Tree_Search(allNonDulpicatedSurfaces,&s)){ + Tree_Insert(allNonDulpicatedSurfaces,&s); + } + else{ + Tree_Suppress(m->Surfaces,&s); + } + } + } + List_Delete(All); + Msg(INFO, "Ending with %d surfaces",Tree_Nbr(m->Surfaces)); + + /*Remplacement dans les volumes*/ + All = Tree2List(m->Volumes); + for(i=0;i<List_Nbr(All);i++){ + List_Read(All,i,&vol); + for(j=0;j<List_Nbr(vol->Surfaces);j++){ + List_Write(vol->Surfaces,j, + Tree_PQuery( allNonDulpicatedSurfaces, + List_Pointer(vol->Surfaces,j))); + } + } +} + +/* NEW CAD FUNCTIONS */ + +void ModifyLcPoint(int ip, double lc){ + Vertex *v = FindVertex(ip,THEM); + if(v)v->lc = lc; +} + +void ApplicationOnPoint(int ip,double matrix[4][4]){ + Vertex *v = FindVertex(ip,THEM); + if(v)ApplyTransformationToPoint ( matrix, v ); +} + +void ApplicationOnLine(int ip, double matrix[4][4]){ + Curve *c = FindCurve(ip,THEM); + if(c)ApplyTransformationToCurve ( matrix, c ); +} + +void ApplicationOnSurface(int ip, double matrix[4][4]){ + Surface *s = FindSurface(ip,THEM); + if(s)ApplyTransformationToSurface ( matrix, s ); +} + +void ApplicationOnShapes(double matrix[4][4], List_T *ListShapes){ + int i; + Shape O; + + for(i=0;i<List_Nbr(ListShapes);i++){ + List_Read(ListShapes,i,&O); + switch(O.Type){ + case MSH_POINT: + ApplicationOnPoint(O.Num,matrix); + break; + case MSH_SEGM_LINE: + case MSH_SEGM_SPLN: + case MSH_SEGM_CIRC: + case MSH_SEGM_ELLI: + case MSH_SEGM_NURBS: + ApplicationOnLine(O.Num,matrix); + break; + case MSH_SURF_NURBS : + case MSH_SURF_REGL : + case MSH_SURF_TRIC : + case MSH_SURF_PLAN : + ApplicationOnSurface(O.Num,matrix); + break; + default: + printf("Impossible de translater le truc %d de type %d\n",O.Num,O.Type); + break; + } + } + List_Reset(ListOfTransformedPoints); +} + +void TranslateShapes(double X,double Y,double Z, + List_T *ListShapes, int isFinal){ + double T[3],matrix[4][4]; + T[0] = X;T[1] = Y;T[2] = Z; + SetTranslationMatrix(matrix,T); + ApplicationOnShapes(matrix,ListShapes); + if(isFinal)ReplaceAllDuplicates ( THEM ); +} + +void DilatShapes(double X,double Y,double Z, double A, + List_T *ListShapes, int isFinal){ + double T[3],matrix[4][4]; + T[0] = X;T[1] = Y;T[2] = Z; + SetDilatationMatrix(matrix,T,A); + ApplicationOnShapes(matrix,ListShapes); + ReplaceAllDuplicates ( THEM ); +} + + +void RotateShapes (double Ax,double Ay,double Az, + double Px,double Py, double Pz, + double alpha, List_T *ListShapes){ + double A[3],matrix[4][4]; + A[0] = Ax;A[1] = Ay;A[2] = Az; + TranslateShapes(-Px,-Py,-Pz,ListShapes,0); + List_Reset(ListOfTransformedPoints); + SetRotationMatrix(matrix,A,alpha); + ApplicationOnShapes(matrix,ListShapes); + TranslateShapes(Px,Py,Pz,ListShapes,0); + List_Reset(ListOfTransformedPoints); + ReplaceAllDuplicates ( THEM ); +} + +void SymetryShapes (double A,double B,double C, + double D, List_T *ListShapes, int x){ + double matrix[4][4]; + SetSymmetryMatrix(matrix,A,B,C,D); + ApplicationOnShapes(matrix,ListShapes); + ReplaceAllDuplicates ( THEM ); +} + + +void CopyShape(int Type, int Num, int *New){ + Surface *s,*news; + Curve *c, *newc; + Vertex *v,*newv; + + MAXREG = NEWREG(); + MAXPOINT = NEWPOINT(); + + switch(Type){ + case MSH_POINT: + v = FindVertex(Num,THEM); + newv = DuplicateVertex(v); + *New = newv->Num; + break; + case MSH_SEGM_LINE: + case MSH_SEGM_SPLN: + case MSH_SEGM_CIRC: + case MSH_SEGM_ELLI: + case MSH_SEGM_NURBS: + c = FindCurve(Num,THEM); + newc = DuplicateCurve(c); + *New = newc->Num; + break; + case MSH_SURF_NURBS: + case MSH_SURF_TRIC: + case MSH_SURF_REGL: + case MSH_SURF_PLAN: + s = FindSurface(Num,THEM); + news = DuplicateSurface(s,1); + *New = news->Num; + break; + default: + printf("Impossible de copier le truc %d de type %d\n",Num,Type); + break; + } +} + +void DeletePoint(int ip){ + Vertex *v = FindVertex(ip,THEM); + if(!v)return; + List_T *Curves = Tree2List(THEM->Curves); + for(int i=0;i<List_Nbr(Curves);i++){ + Curve *c; + List_Read(Curves,i,&c); + for(int j=0;j<List_Nbr(c->Control_Points);j++){ + if(!compareVertex(List_Pointer(c->Control_Points,j),&v))return; + } + } + List_Delete(Curves); + Tree_Suppress(THEM->Points,&v); +} + +void DeleteCurve(int ip){ + Curve *c = FindCurve(ip,THEM); + if(!c)return; + List_T *Surfs = Tree2List(THEM->Surfaces); + for(int i=0;i<List_Nbr(Surfs);i++){ + Surface *s; + List_Read(Surfs,i,&s); + for(int j=0;j<List_Nbr(s->s.Generatrices);j++){ + if(!compareCurve(List_Pointer(s->s.Generatrices,j),&c))return; + } + } + List_Delete(Surfs); + Tree_Suppress(THEM->Curves,&c); +} + +void DeleteSurf( int is ){ + + // Il faut absolument coder une + // structure coherente pour les volumes. + Surface *s = FindSurface(is,THEM); + if(!s)return; + List_T *Vols = Tree2List(THEM->Volumes); + for(int i=0;i<List_Nbr(Vols);i++){ + Volume *v; + List_Read(Vols,i,&v); + for(int j=0;j<List_Nbr(v->Surfaces);j++){ + if(!compareCurve(List_Pointer(v->Surfaces,j),&s))return; + } + } + List_Delete(Vols); + //s->Num = 1000000000; + Tree_Suppress(THEM->Surfaces,&s); +} + +void DeleteLine(int ip, int i){DeleteCurve(ip);} + +void DeleteShape(int Type, int Num){ + + switch(Type){ + case MSH_POINT: + DeletePoint(Num); + break; + case MSH_SEGM_LINE: + case MSH_SEGM_SPLN: + case MSH_SEGM_CIRC: + case MSH_SEGM_ELLI: + case MSH_SEGM_NURBS: + DeleteCurve(Num); + break; + case MSH_SURF_NURBS: + case MSH_SURF_TRIC: + case MSH_SURF_REGL: + case MSH_SURF_PLAN: + DeleteSurf(Num); + break; + default: + printf("Impossible de copier le truc %d de type %d\n",Num,Type); + break; + } +} + +Curve * CreateReversedCurve (Mesh *M,Curve *c){ + Curve *newc; + Vertex *e1,*e2,*e3,*e4; + int i; + newc = Create_Curve(-c->Num, c->Typ,1,NULL,NULL,-1,-1,0.,1.); + newc->Control_Points = List_Create(List_Nbr(c->Control_Points), 1, sizeof(Vertex*)); + if (c->Typ == MSH_SEGM_ELLI || c->Typ == MSH_SEGM_ELLI_INV){ + List_Read(c->Control_Points,0,&e1); + List_Read(c->Control_Points,1,&e2); + List_Read(c->Control_Points,2,&e3); + List_Read(c->Control_Points,3,&e4); + List_Add(newc->Control_Points,&e4); + List_Add(newc->Control_Points,&e2); + List_Add(newc->Control_Points,&e3); + List_Add(newc->Control_Points,&e1); + } + else + List_Invert(c->Control_Points, newc->Control_Points); + + if (c->Typ == MSH_SEGM_NURBS && c->k){ + newc->k = (float*)malloc((c->degre + List_Nbr(c->Control_Points)+1)*sizeof(float)); + for(i=0;i<c->degre + List_Nbr(c->Control_Points)+1;i++) + newc->k[c->degre + List_Nbr(c->Control_Points)-i] = c->k[i]; + } + + if (c->Typ == MSH_SEGM_CIRC) newc->Typ = MSH_SEGM_CIRC_INV; + if (c->Typ == MSH_SEGM_CIRC_INV) newc->Typ = MSH_SEGM_CIRC; + if (c->Typ == MSH_SEGM_ELLI) newc->Typ = MSH_SEGM_ELLI_INV; + if (c->Typ == MSH_SEGM_ELLI_INV) newc->Typ = MSH_SEGM_ELLI; + newc->Vertices = List_Create(10 ,1 ,sizeof(Vertex*)); + newc->Method = c->Method; + newc->degre = c->degre; + newc->beg = c->end; + newc->end = c->beg; + newc->ubeg = 1. - c->uend; + newc->uend = 1. - c->ubeg; + Tree_Insert(M->Curves, &newc); + End_Curve(newc); + return newc; +} + +int recognize_seg(int typ, List_T * liste, int *seg){ + int i,beg,end; + Curve *pc; + + List_T *temp = Tree2List(THEM->Curves); + List_Read(liste,0,&beg); + List_Read(liste,List_Nbr(liste)-1,&end); + for(i=0;i<List_Nbr(temp);i++){ + List_Read(temp,i,&pc); + if(pc->Typ == typ && + pc->beg->Num == beg && + pc->end->Num == end){ + List_Delete(temp); + *seg = pc->Num; + return 1; + } + } + List_Delete(temp); + return 0; +} + + + +int recognize_loop(List_T * liste, int *loop){ + int i,res; + EdgeLoop *pe; + + res = 0; + *loop = 0; + List_T *temp = Tree2List(THEM->EdgeLoops); + for(i=0;i<List_Nbr(temp);i++){ + List_Read(temp,i,&pe); + if(!compare2Lists(pe->Curves,liste,fcmp_absint)){ + res = 1; + *loop = pe->Num; + break; + } + } + List_Delete(temp); + return res; +} + +int recognize_surfloop(List_T * liste, int *loop){ + int i,res; + EdgeLoop *pe; + + res = 0; + *loop = 0; + List_T *temp = Tree2List(THEM->SurfaceLoops); + for(i=0;i<List_Nbr(temp);i++){ + List_Read(temp,i,&pe); + if(!compare2Lists(pe->Curves,liste,fcmp_absint)){ + res = 1; + *loop = pe->Num; + break; + } + } + List_Delete(temp); + return res; +} + diff --git a/Geo/CAD.h b/Geo/CAD.h new file mode 100644 index 0000000000000000000000000000000000000000..cf1bc88644d897f73c176d1720c2e9a5165d9366 --- /dev/null +++ b/Geo/CAD.h @@ -0,0 +1,60 @@ +#ifndef _CAD_H_ +#define _CAD_H_ + +#include "Mesh.h" + +int NEWREG(void); +int NEWPOINT(void); + +Vertex *FindVertex(int inum, Mesh *M); +Curve *FindCurve(int inum, Mesh *M); +Surface *FindSurface(int inum, Mesh *M); +Volume *FindVolume(int inum, Mesh *M); +EdgeLoop *FindEdgeLoop(int inum, Mesh *M); +SurfaceLoop *FindSurfaceLoop(int inum, Mesh *M); + +bool ProjectPointOnCurve (Curve *c, Vertex *v, Vertex *RES, Vertex *DER); +bool ProjectPointOnSurface (Surface *s, Vertex &p); +bool ProjectPointOnSurface (Surface *s, Vertex *p,double *u, double *v); + +void Extrude_ProtudePoint(int ep, int ip, double A, double B, double C, + double X, double Y, double Z, double alpha, + Curve **pc, Curve **prc, ExtrudeParams *e); +Surface *Extrude_ProtudeCurve(int ep, int ic, + double A, double B, double C, + double X, double Y, double Z, + double alpha, ExtrudeParams *e); +void Extrude_ProtudeSurface(int ep, int is, + double A, double B, double C, + double X, double Y, double Z, + double alpha, + int NewVolume, ExtrudeParams *e); +void ProtudeXYZ ( double &x, double &y, double &z, ExtrudeParams *e); +void ReplaceAllDuplicates ( Mesh *m ); +void Coherence_PS(void); + +void ModifyLcPoint(int ip, double lc); +void TranslateShapes(double X,double Y,double Z, + List_T *ListShapes, int isFinal); +void DilatShapes(double X,double Y,double Z, double A, + List_T *ListShapes, int isFinal); +void RotateShapes (double Ax,double Ay,double Az, + double Px,double Py, double Pz, + double alpha, List_T *ListShapes); +void SymetryShapes (double A,double B,double C, + double D, List_T *ListShapes, int x); +void CopyShape(int Type, int Num, int *New); + +void DeletePoint(int ip); +void DeleteCurve(int ip); +void DeleteSurf( int is ); +void DeleteShape(int Type, int Num); + +Curve * CreateReversedCurve (Mesh *M,Curve *c); + +int recognize_seg(int typ, List_T * liste, int *seg); +int recognize_loop(List_T * liste, int *loop); +int recognize_surfloop(List_T * liste, int *loop); + + +#endif diff --git a/Geo/DataBase.cpp b/Geo/DataBase.cpp new file mode 100644 index 0000000000000000000000000000000000000000..76a333c8b9cbba225d981d39bc618bf56fdc3f42 --- /dev/null +++ b/Geo/DataBase.cpp @@ -0,0 +1,459 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "Mesh.h" +#include "CAD.h" +#include "Create.h" +#include "Verif.h" + +extern int CurrentNodeNumber; +extern Mesh *THEM; + +/* POINTS */ + +void Cdbpts101(int ip, double x, double y, double z, double l, double w){ + Vertex *v; + CurrentNodeNumber = IMAX(CurrentNodeNumber, ip); + v = Create_Vertex(ip,x,y,z,l,0.0); + v->w = w; + Tree_Insert(THEM->Points,&v); +} + +/* CURVES */ + +void AddCurveInDataBase (int NumCurve, int TypCurve, int Order, + List_T *ControlPoints, List_T *Knots, + int VertexBeg, int VertexEnd, + double uBeg, double uEnd){ + Curve *c; + + if(NumCurve<0) return; /* Negative Curves are reversed from positive ones*/ + + c = Create_Curve(NumCurve,TypCurve,Order,ControlPoints,Knots, + VertexBeg,VertexEnd,uBeg,uEnd); + + /* Courbe dans l'autre sens */ + + Curve *rc = CreateReversedCurve(THEM,c); + Tree_Insert(THEM->Curves,&c); + Tree_Insert(THEM->Curves,&rc); +} + +void AddCircleInDataBase (int NumCurve, int TypCurve, List_T *ControlPoints, + double n[3]){ + Curve *c; + + if(NumCurve<0) return; /* Negative Curves are reversed from positive ones*/ + + c = Create_Curve(NumCurve,TypCurve,2,ControlPoints,NULL,-1,-1,0.,1.); + + c->Circle.n[0] = n[0]; + c->Circle.n[1] = n[1]; + c->Circle.n[2] = n[2]; + + End_Curve(c); + + /* Courbe dans l'autre sens */ + + Curve *rc = CreateReversedCurve(THEM,c); + + rc->Circle.n[0] = n[0]; + rc->Circle.n[1] = n[1]; + rc->Circle.n[2] = n[2]; + End_Curve(rc); + + Tree_Insert(THEM->Curves,&c); + Tree_Insert(THEM->Curves,&rc); +} + +void Cdbseg101(int iseg, int typseg, int degre, List_T *liste, List_T *listint, + int i1,int i2,double u1 ,double u2,char *c1, char *c2, char *c3){ + int i,j; + double d; + List_T *Temp; + if(listint){ + AddCurveInDataBase (iseg,typseg,degre,listint,NULL,i1,i2,u1,u2); + } + else{ + Temp = List_Create(List_Nbr(liste),1,sizeof(int)); + for(i=0;i<List_Nbr(liste);i++){ + List_Read(liste,i,&d); + j = (int)d; + List_Add(Temp,&j); + } + AddCurveInDataBase (iseg,typseg,degre,Temp,NULL,i1,i2,u1,u2); + List_Delete(Temp); + } + +} + + +/* SURFACES AND VOLUMES */ + +void AddQuadricSurfaceInDataBase (int Typ, int NumQuadric, double zaxis[3], + double xaxis[3], double center[3], + double radius1, double radius2, List_T *loops){ + int ic,i,j,NbLoop,iLoop; + Surface *s; + Curve *c; + EdgeLoop *el; + + s = Create_Surface(NumQuadric,Typ,0); + s->Method = LIBRE; + for(i=0;i<3;i++)s->Cyl.xaxis[i] = xaxis[i]; + for(i=0;i<3;i++)s->Cyl.zaxis[i] = zaxis[i]; + for(i=0;i<3;i++)s->Cyl.center[i] = center[i]; + s->Cyl.radius1 = radius1; + s->Cyl.radius2 = radius2; + s->s.Generatrices = List_Create(4, 1, sizeof(Curve*)); + + NbLoop = List_Nbr(loops); + s->s.Generatrices = List_Create(4, 1, sizeof(Curve*)); + for(i=0;i<NbLoop;i++){ + List_Read(loops,i,&iLoop); + if(!(el = FindEdgeLoop(iLoop,THEM))) + Msg(ERROR, "Unknown Loop %d", iLoop); + else{ + for(j=0;j<List_Nbr(el->Curves);j++){ + List_Read(el->Curves,j,&ic); + if(!(c = FindCurve(ic,THEM))) + Msg(ERROR, "Unknown Curve %d", ic); + else + List_Add (s->s.Generatrices, &c); + } + } + } + s->Support = s; + End_Surface(s); + Tree_Insert (THEM->Surfaces , &s); +} + +void CreateSurfaceFromOldCrappyDatabase (int izon, int typzon, int o1, int o2, + int nbu, int nbv, int sup, + List_T *liste, List_T *loops, Mesh *M){ + + int ic,i,j,l,NbLoop,iLoop; + Surface *s,*pS; + Curve *c; + Vertex V,*v; + EdgeLoop *el; + + s = Create_Surface(izon,typzon,0); + s->Method = LIBRE; + + NbLoop = List_Nbr(loops); + s->s.Generatrices = List_Create(4, 1, sizeof(Curve*)); + for(i=0;i<NbLoop;i++){ + List_Read(loops,i,&iLoop); + if(!(el = FindEdgeLoop(iLoop,THEM))) + Msg(ERROR, "Unknown Line Loop %d", iLoop); + else{ + for(j=0;j<List_Nbr(el->Curves);j++){ + List_Read(el->Curves,j,&ic); + if(!(c = FindCurve(ic,THEM))) + Msg(ERROR, "Unknown Curve %d", ic); + else + List_Add (s->s.Generatrices, &c); + } + } + } + + if((pS = FindSurface(sup,THEM))){ + s->Support = pS; + } + else{ + s->Support = s; + } + + if(typzon == MSH_SURF_NURBS && !pS){ + s->Control_Points = List_Create(4, 1, sizeof(Vertex*)); + s->OrderU = o1; + s->OrderV = o2; + s->Nu = nbu; + s->Nv = nbv; + for(l=0;l<List_Nbr(liste);l++){ + List_Read(liste,l,&iLoop); + v = &V; + v->Num = iLoop; + List_Add (s->Control_Points, Tree_PQuery(M->Points, &v)); + } + } + + End_Surface(s); + Tree_Insert (M->Surfaces , &s); +} + +void CreateVolumeFromOldCrappyDatabase (int izon, List_T *loops, Mesh *M){ + SurfaceLoop *sl; + int i,j,iLoop,is; + Surface *s; + Volume *v; + + v = Create_Volume(izon,MSH_VOLUME,0); + v->Surfaces = List_Create(4, 1, sizeof(Surface*)); + for(i=0;i<List_Nbr(loops);i++){ + List_Read(loops,i,&iLoop); + if(!(sl = FindSurfaceLoop(iLoop,THEM))) + Msg(ERROR, "Unknown Surface Loop %d", iLoop); + else{ + for(j=0;j<List_Nbr(sl->Surfaces);j++){ + List_Read(sl->Surfaces,j,&is); + if(!(s = FindSurface(abs(is),THEM))) + Msg(ERROR, "Unknown Surface %d", is); + else + List_Add (v->Surfaces, &s); + } + } + } + Tree_Add(M->Volumes,&v); +} + + +void Cdbz101(int izon, int typzon,int o1, int o2, int nbu, int nbv, + int support, List_T *ListCP, List_T *liste, + List_T *intlist){ + + int i,j; + double f; + List_T *templist; + + if(liste){ + templist = List_Create(4,1,sizeof(int)); + for(i=0;i<List_Nbr(liste);i++){ + List_Read (liste, i, &f); + j = (int)f; + List_Add(templist,&j); + } + } + else if (intlist){ + templist = intlist; + } + + if(typzon == MSH_SURF_REGL || typzon == MSH_SURF_TRIC || + typzon == MSH_SURF_PLAN || typzon == MSH_SURF_TRIMMED || + typzon == MSH_SURF_NURBS ){ + CreateSurfaceFromOldCrappyDatabase (izon, typzon, o1,o2, nbu, nbv, + support, ListCP,templist,THEM); + } + else if(typzon == MSH_SURF_LOOP){ + Add_SurfaceLoop(izon,templist,THEM); + } + else if(typzon == MSH_SEGM_LOOP){ + Add_EdgeLoop(izon,templist,THEM); + } + else if(typzon == MSH_VOLUME){ + CreateVolumeFromOldCrappyDatabase (izon,templist,THEM); + } + else{ + Add_PhysicalGroup(izon,typzon,templist,THEM); + } +} + +void CreateNurbsSurfaceSupport (int Num , int Order1, int Order2 , + List_T *List, List_T *ku, List_T *kv){ + + List_T *ListOfDouble_L; + List_T *ListCP; + int i,j,Nv,Nu,N; + Surface *s; + double d; + float f; + ListCP = List_Create(2,2,sizeof(int)); + + for(j=0;j<List_Nbr(List);j++){ + List_Read(List,j,&ListOfDouble_L); + for(i=0;i<List_Nbr(ListOfDouble_L);i++){ + List_Read(ListOfDouble_L,i,&d); + N = (int)d; + List_Add(ListCP,&N); + } + } + List_Read(List,0,&ListOfDouble_L); + Nu = List_Nbr(List); + Nv = List_Nbr(ListOfDouble_L); + Cdbz101(Num,MSH_SURF_NURBS,Order1,Order2,Nv,Nu,0,ListCP,NULL,NULL); + + if(!(s = FindSurface(Num,THEM))) + Msg(ERROR, "Unknown Surface Loop %d", Num); + else{ + s->ku = (float*)malloc(List_Nbr(ku)*sizeof(float)); + s->kv = (float*)malloc(List_Nbr(kv)*sizeof(float)); + s->Support = NULL; + + double kumin = 0., kumax = 1.; + double kvmin = 0., kvmax = 1.; + /* + List_Read(ku,0,&kumin); + List_Read(ku,List_Nbr(ku)-1,&kumax); + List_Read(kv,0,&kvmin); + List_Read(kv,List_Nbr(kv)-1,&kvmax); + */ + + for(i=0;i<List_Nbr(ku);i++){ + List_Read(ku,i,&d); + f = (float) ((d-kumin)/(kumax-kumin)); + s->ku[i] = f; + } + for(i=0;i<List_Nbr(kv);i++) { + List_Read(kv,i,&d); + f = (float) ((d-kvmin)/(kvmax-kvmin)); + s->kv[i] = f; + } + } + + List_Delete(ListCP); +} + +void CreateNurbsSurface (int Num , int Order1 , int Order2 , List_T *List, + List_T *ku, List_T *kv ){ + List_T *ListOfDouble_L; + List_T *Listint,*ListCP; + int i,j,Loop[4],N,Nu,Nv; + double d; + int TypLine = MSH_SEGM_NURBS; + Curve *cc; + + Listint = List_Create(2,2,sizeof(int)); + ListCP = List_Create(2,2,sizeof(int)); + + double kumin, kumax; + List_Read(ku,0,&kumin); + List_Read(ku,List_Nbr(ku)-1,&kumax); + double kvmin, kvmax; + List_Read(kv,0,&kvmin); + List_Read(kv,List_Nbr(kv)-1,&kvmax); + for(j=0;j<List_Nbr(List);j++){ + List_Read(List,j,&ListOfDouble_L); + for(i=0;i<List_Nbr(ListOfDouble_L);i++){ + List_Read(ListOfDouble_L,i,&d); + N = (int)d; + List_Add(ListCP,&N); + } + } + + List_Read(List,0,&ListOfDouble_L); + Nu = List_Nbr(List); + Nv = List_Nbr(ListOfDouble_L); + + for(i=0;i<List_Nbr(ListOfDouble_L);i++){ + List_Read(ListOfDouble_L,i,&d); + j = (int)d; + List_Add(Listint,&j); + } + if(recognize_seg(TypLine,Listint,&Loop[0])){ + } + else{ + Loop[0] = NEWREG(); + Cdbseg101(Loop[0],TypLine,Order1,ListOfDouble_L,NULL,-1,-1,kumin,kumax,NULL,NULL,NULL); + if(!(cc = FindCurve(Loop[0],THEM))) + Msg(ERROR, "Unknown Curve %d", Loop[0]); + else{ + cc->k = (float*)malloc(4*List_Nbr(ku)*sizeof(float)); + for(i=0;i<List_Nbr(ku);i++){ + List_Read(ku,i,&d); + cc->k[i] = (float)d/*((d-kumin)/(kumax-kumin))*/; + } + } + } + List_Reset(Listint); + + List_Read(List,List_Nbr(List)-1,&ListOfDouble_L); + for(i=0;i<List_Nbr(ListOfDouble_L);i++){ + List_Read(ListOfDouble_L,i,&d); + j = (int)d; + List_Add(Listint,&j); + } + if(recognize_seg(TypLine,Listint,&Loop[2])){ + } + else{ + Loop[2] = NEWREG(); + Cdbseg101(Loop[2],TypLine,Order1,ListOfDouble_L,NULL,-1,-1,kumin,kumax,NULL,NULL,NULL); + if(!(cc = FindCurve(Loop[2],THEM))) + Msg(ERROR, "Unknown Curve %d", Loop[2]); + else{ + cc->k = (float*)malloc(4*List_Nbr(ku)*sizeof(float)); + for(i=0;i<List_Nbr(ku);i++){ + List_Read(ku,i,&d); + cc->k[i] = (float)d/*((d-kumin)/(kumax-kumin))*/; + } + } + } + List_Reset(Listint); + + List_T *List1 = List_Create(List_Nbr(List),1,sizeof(double)); + List_T *List2 = List_Create(List_Nbr(List),1,sizeof(double)); + + for(i=0;i<List_Nbr(List);i++){ + List_Read(List,i,&ListOfDouble_L); + List_Add(List1,List_Pointer(ListOfDouble_L,0)); + List_Add(List2,List_Pointer(ListOfDouble_L,List_Nbr(ListOfDouble_L)-1)); + } + + for(i=0;i<List_Nbr(List1);i++){ + List_Read(List1,i,&d); + j = (int)d; + List_Add(Listint,&j); + } + if(recognize_seg(TypLine,Listint,&Loop[1])){ + } + else{ + Loop[1] = NEWREG(); + Cdbseg101(Loop[1],TypLine,Order2,List1,NULL,-1,-1,kvmin,kvmax,NULL,NULL,NULL); + if(!(cc = FindCurve(Loop[1],THEM))) + Msg(ERROR, "Unknown Curve %d", Loop[1]); + else{ + cc->k = (float*)malloc(4*List_Nbr(kv) * sizeof(float)); + for(i=0;i<List_Nbr(kv);i++){ + List_Read(kv,i,&d); + cc->k[i] = (float)d/*((d-kvmin)/(kvmax-kvmin))*/; + } + } + } + List_Reset(Listint); + + for(i=0;i<List_Nbr(List2);i++){ + List_Read(List2,i,&d); + j = (int)d; + List_Add(Listint,&j); + } + if(recognize_seg(TypLine,Listint,&Loop[3])){ + } + else{ + Loop[3] = NEWREG(); + Cdbseg101(Loop[3],TypLine,Order2,List2,NULL,-1,-1,kvmin,kvmax,NULL,NULL,NULL); + if(!(cc = FindCurve(Loop[3],THEM))) + Msg(ERROR, "Unknown Curve %d", Loop[3]); + else{ + cc->k = (float*)malloc(4*List_Nbr(kv)*sizeof(float)); + for(i=0;i<List_Nbr(kv);i++){ + List_Read(kv,i,&d); + cc->k[i] = (float)d/*((d-kvmin)/(kvmax-kvmin))*/; + } + } + } + + List_Reset(Listint); + List_Delete(List1); + List_Reset(List2); + double f = (double)-Loop[0]; + List_Add(List2,&f); + f = (double)Loop[1]; + List_Add(List2,&f); + f = (double)Loop[2]; + List_Add(List2,&f); + f = (double)-Loop[3]; + List_Add(List2,&f); + + int topnew = NEWREG(); + CreateNurbsSurfaceSupport (topnew,Order1 , Order2 ,List,ku,kv); + j = NEWREG(); + Cdbz101(j,MSH_SEGM_LOOP,0,0,0,0,0,NULL,List2,NULL); + List_Delete(List2); + List_Add(Listint,&j); + j = NEWREG(); + Cdbz101(j,MSH_SURF_TRIMMED,Order1,Order2,Nv,Nu,topnew,ListCP,NULL,Listint); + List_Delete(Listint); + List_Delete(ListCP); +} + diff --git a/Geo/DataBase.h b/Geo/DataBase.h new file mode 100644 index 0000000000000000000000000000000000000000..addbfb80f39d24687a4d06faa07c4b2480224daf --- /dev/null +++ b/Geo/DataBase.h @@ -0,0 +1,33 @@ +#ifndef _DATABASE_H_ +#define _DATABASE_H_ + +void Cdbpts101 (int ip, double x, double y, double z, double l, double w); +void Cdbpts105 (int ip, double x, double y, double z, double l, double w); +void Cdbseg102 (int iseg, int ip, int newp); +void Cdbz102 (int izon, int ip, int newp, int oldp); +void Cdbseg101 (int iseg, int typseg, int degre, List_T * liste, List_T * listint, + int, int, double, double, char *, char *, char *); +void Cdbpts201 (int ip); +void Cdbseg201 (int ip); +void Cdbz201 (int ip); +void Cdbz101 (int izon, int typzon, int o1, int o2, int nbu, int nbv, + int support, List_T * ListCP, List_T * liste, List_T * intlist); +void CreateNurbsSurface (int Num, int Order1, int Order2, List_T *, List_T *, List_T *); +void CreateNurbsSurfaceSupport (int Num, int Order2, int Order1, + List_T * List, List_T *, List_T *); +void Cdbseg301 (int ip); +void Cdbz301 (int ip); +void Cdbn101 (int in, double X, double Y, double Z); +void Cdbe101 (int nElm, int iEnt, int nnoe[4]); + +void AddCurveInDataBase (int NumCurve, int TypCurve, int Order, List_T * ControlPoints, + List_T * Knots, int VertexBeg, int VertexEnd, double uBeg, + double uEnd); +void AddCircleInDataBase (int NumCurve, int TypCurve, List_T * ControlPoints, + double n[3]); +void AddQuadricSurfaceInDataBase (int Typ, int NumCyl, double zaxis[3], + double xaxis[3], double center[3], + double radius1, double radius2, + List_T * loops); + +#endif diff --git a/Geo/ExtrudeParams.cpp b/Geo/ExtrudeParams.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ed9f19451d1eb4ea11fbe3145b7ee03dbb5dc8fb --- /dev/null +++ b/Geo/ExtrudeParams.cpp @@ -0,0 +1,93 @@ + +#include "Gmsh.h" +#include "Geo.h" +#include "CAD.h" +#include "ExtrudeParams.h" + +void Projette (double p[3],double mat[3][3]) { + double X, Y, Z ; + + X = p[0] * mat[0][0] + p[1] * mat[0][1] + p[2] * mat[0][2]; + Y = p[0] * mat[1][0] + p[1] * mat[1][1] + p[2] * mat[1][2]; + Z = p[0] * mat[2][0] + p[1] * mat[2][1] + p[2] * mat[2][2]; + p[0] = X; + p[1] = Y; + p[2] = Z; +} + +ExtrudeParams :: ExtrudeParams (int ModeEx){ + mesh.ExtrudeMesh = false; + geo.Mode = ModeEx; + mesh.Simplexes = true; +} + + +void ExtrudeParams :: fill (int ep , double A, double B, double C, + double X, double Y, double Z, double angle){ + geo.axe[0] = A; + geo.axe[1] = B; + geo.axe[2] = C; + geo.pt[0] = X; + geo.pt[1] = Y; + geo.pt[2] = Z; + geo.angle = angle; + geo.Type = ep; +} + +void ExtrudeParams :: Extrude ( int iLayer, int iElemLayer, + double &x, double &y, double &z){ + + double dx0,dy0,dz0,dx1,dy1,dz1; + double dx,dy,dz; + if(!iLayer){ + dx0=dy0=dz0=0.0; + dx1 = mesh.hLayer[0]; + dy1 = mesh.hLayer[0]; + dz1 = mesh.hLayer[0]; + } + else{ + dx0 = mesh.hLayer[iLayer-1]; + dy0 = mesh.hLayer[iLayer-1]; + dz0 = mesh.hLayer[iLayer-1]; + dx1 = mesh.hLayer[iLayer]; + dy1 = mesh.hLayer[iLayer]; + dz1 = mesh.hLayer[iLayer]; + } + double t = (double) iElemLayer /(double)mesh.NbElmLayer[iLayer]; + if(geo.Type){ + dx = geo.axe[0]*(dx0 + t * (dx1-dx0)); + dy = geo.axe[1]*(dy0 + t * (dy1-dy0)); + dz = geo.axe[2]*(dz0 + t * (dz1-dz0)); + x+=dx;y+=dy;z+=dz; + } + else{ + double angle = geo.angle; + geo.angle = geo.angle*(dx0 + t * (dx1-dx0)); + ProtudeXYZ(x,y,z,this); + geo.angle = angle; + } +} + +void ExtrudeParams :: Rotate(double matr[3][3]){ + Projette(geo.axe,matr); + Projette(geo.pt,matr); + geo.angle = -geo.angle; +} + +void ExtrudeParams :: Extrude (double t, double &x, double &y, double &z){ + + double dx,dy,dz; + if(geo.Type){ + dx = geo.axe[0]*t; + dy = geo.axe[1]*t; + dz = geo.axe[2]*t; + x+=dx;y+=dy;z+=dz; + } + else{ + double angle = geo.angle; + geo.angle = geo.angle*t; + ProtudeXYZ(x,y,z,this); + geo.angle = angle; + } +} + diff --git a/Geo/ExtrudeParams.h b/Geo/ExtrudeParams.h new file mode 100644 index 0000000000000000000000000000000000000000..555451341a882191fc54c825dc36373343345acd --- /dev/null +++ b/Geo/ExtrudeParams.h @@ -0,0 +1,37 @@ +#ifndef _EXTRUDE_PARAMS_H_ +#define _EXTRUDE_PARAMS_H_ + +#define NB_LAYER_MAX 30 + +#define EXTRUDED_ENTITY 1 +#define COPIED_ENTITY 2 + +class ExtrudeParams{ + public : + + ExtrudeParams(int Mode = EXTRUDED_ENTITY); + void fill (int ep,double A, double B, double C, + double X, double Y, double Z, double angle); + void Extrude ( int iLayer, int iElemLayer, + double &dx, double &dy, double &dz); + void Extrude (double t, double &x, double &y, double &z); + void Rotate(double matr[3][3]); + struct{ + bool ExtrudeMesh; + bool Simplexes; + int NbLayer; + int NbElmLayer [NB_LAYER_MAX]; + int ZonLayer [NB_LAYER_MAX]; + double hLayer [NB_LAYER_MAX]; + }mesh; + struct{ + int Mode; + int Type; + int Source; + double axe[3]; + double pt[3]; + double angle; + }geo; +}; + +#endif diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..24f7da0cc401b80bbf2254d8bbe80eda9686ff40 --- /dev/null +++ b/Geo/Geo.cpp @@ -0,0 +1,543 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "DataBase.h" +#include "Parser.h" + +#define BUFFSIZE 32000 + +char x_text[100] = "0.0", y_text[100] = "0.0", z_text[100] = "0.0"; +char l_text[100] = "1.0" ; +char tx_text[100] = "0.0", ty_text[100] = "0.0", tz_text[100] = "0.0"; +char attrx_text[100] = "1.0", attry_text[100] = "1.0", attrz_text[100] = "1.0" ; +char attrdec_text[100] = "2.0"; +char px_text[100] = "0.0", py_text[100] = "0.0", pz_text[100] = "0.0" ; +char angle_text[100] = "3.14159/2" ; +char ax_text[100] = "0.0", ay_text[100] = "0.0", az_text[100] = "1.0"; +char dx_text[100] = "0.0", dy_text[100] = "0.0", dz_text[100] = "0.0"; +char df_text[100] = "1.0"; +char nb_pts[100] ="10", mode_value[100] = "1"; +char trsf_pts_text[100] = "2", trsf_type_text[100] = "Power 1.0"; +char trsf_vol_text[100] = "1"; +char char_length_text[100] = "1.0"; + +int Mode_Transfinite = 0; + +double evaluate_scalarfunction (char *var, double val, char *funct){ + FILE *tempf; + tempf = yyin; + yyin = fopen("gmsh.tmp","w"); + + /* On pose la variable = la fonction et on evalue la fonction */ + + fprintf(yyin,"%s = %g ;\n",var,val); + fprintf(yyin,"ValeurTemporaire__ = %s ;\n",funct); + fclose(yyin); + yyin = fopen("gmsh.tmp","r"); + while(!feof(yyin)){ + yyparse(); + } + fclose(yyin); + Symbol TheSymbol; + TheSymbol.Name = (char*)malloc(100); + strcpy(TheSymbol.Name,"ValeurTemporaire__"); + yyin = tempf; + if (!List_Query(Symbol_L, &TheSymbol, CompareSymbols)) { + free(TheSymbol.Name); + return 0.0; + } + free(TheSymbol.Name); + return TheSymbol.val; +} + +#ifndef _UNIX +extern AddALineInTheEditGeometryForm (char* line); +#endif + +void add_infile(char *text, char *fich){ + FILE *file; + + yyin = fopen("gmsh.tmp","w"); + file = fopen(fich,"a"); + fprintf(yyin,"%s\n",text); + fclose(yyin); + yyin = fopen("gmsh.tmp","r"); + while(!feof(yyin)){ + yyparse(); + } + fclose(yyin); + fprintf(file,"%s\n",text); + fclose(file); +#ifndef _UNIX + AddALineInTheEditGeometryForm (text); +#endif +} + +void del_pnt(int p1, char *fich){ + char text[BUFFSIZE]; + + sprintf(text,"Delete {\n Point(%d);\n}",p1); + add_infile(text,fich); +} + +void del_seg(int p1, char *fich){ + char text[BUFFSIZE]; + + sprintf(text,"Delete {\n Line(%d);\n}",p1); + add_infile(text,fich); +} + +void del_srf(int p1, char *fich){ + char text[BUFFSIZE]; + + sprintf(text,"Delete {\n Surface(%d);\n}",p1); + add_infile(text,fich); +} + +void add_trsfsurf (int N, int *l, char *fich){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i; + sprintf(text,"Transfinite Surface {%d} = {",l[0]); + for(i=1;i<N;i++){ + if(i==1)sprintf(text2,"%d ",l[i]); + else sprintf(text2,",%d ",l[i]); + strcat(text,text2); + } + sprintf(text2,"};"); + strcat(text,text2); + add_infile(text,fich); +} + +void add_ellipticsurf (int N, int *l, char *fich){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i; + sprintf(text,"Elliptic Surface {%d} = {",l[0]); + for(i=1;i<N;i++){ + if(i==1)sprintf(text2,"%d ",l[i]); + else sprintf(text2,",%d ",l[i]); + strcat(text,text2); + } + sprintf(text2,"};"); + strcat(text,text2); + add_infile(text,fich); +} + +void add_charlength (int N, int *l, char *fich){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i; + sprintf(text,"Characteristic Length {"); + for(i=0;i<N;i++){ + if(i==0)sprintf(text2,"%d ",l[i]); + else sprintf(text2,",%d ",l[i]); + strcat(text,text2); + } + sprintf(text2,"} = %s;", char_length_text); + strcat(text,text2); + add_infile(text,fich); +} + +void add_recosurf (int N, int *l, char *fich){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i; + sprintf(text,"Recombine Surface {"); + for(i=0;i<N;i++){ + if(i==0)sprintf(text2,"%d ",l[i]); + else sprintf(text2,",%d ",l[i]); + strcat(text,text2); + } + sprintf(text2,"};"); + strcat(text,text2); + add_infile(text,fich); +} + + +void add_trsfline (int N, int *l, char *fich){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i; + sprintf(text,"Transfinite Line {"); + for(i=0;i<N;i++){ + if(!i)sprintf(text2,"%d ",l[i]); + else sprintf(text2,",%d ",l[i]); + strcat(text,text2); + } + if(Mode_Transfinite == 0) + sprintf(text2,"} = %s;",nb_pts); + else if(Mode_Transfinite == 2) + sprintf(text2,"} = %s Using Bump %s;",nb_pts,mode_value); + else if(Mode_Transfinite == 1) + sprintf(text2,"} = %s Using Power %s;",nb_pts,mode_value); + strcat(text,text2); + add_infile(text,fich); +} + + +void add_param (char *par, char *value, char *fich){ + char text[BUFFSIZE]; + sprintf(text,"%s = %s;",par,value); + add_infile(text,fich); +} + +void add_point(char *fich){ + char text[BUFFSIZE]; + int ip; + + ip = NEWPOINT(); + sprintf(text,"Point(%d) = {%s,%s,%s,%s};",ip,x_text,y_text,z_text,l_text); + add_infile(text,fich); +} + +void add_attractor(char *fich, int ip, int typ){ + char text[BUFFSIZE]; + if(typ == 0) { + sprintf(text,"Attractor Point (%s,%s,%s) = {%d};", + attrx_text,attry_text,attrdec_text,ip); + } + else if(typ == 1){ + sprintf(text,"Attractor Line (%s,%s,%s) = {%d};", + attrx_text,attry_text,attrdec_text,ip); + } + else if(typ == 2) { + sprintf(text,"Attractor Surface (%s,%s,%s) = {%d};", + attrx_text,attry_text,attrdec_text,ip); + } + add_infile(text,fich); +} + + +void add_line(int p1, int p2, char *fich){ + char text[BUFFSIZE]; + int iseg; + List_T *list = List_Create(2,2,sizeof(int)); + List_Add(list,&p1); + List_Add(list,&p2); + if((recognize_seg(MSH_SEGM_LINE,list,&iseg))){ + List_Delete(list); + return; + } + List_Delete(list); + + sprintf(text,"Line(%d) = {%d,%d};",NEWREG(),p1,p2); + add_infile(text,fich); +} + +void add_circ(int p1, int p2, int p3, char *fich){ + char text[BUFFSIZE]; + + sprintf(text,"Circle(%d) = {%d,%d,%d};",NEWREG(),p1,p2,p3); + add_infile(text,fich); +} + +void add_ell(int p1, int p2, int p3, int p4, char *fich){ + char text[BUFFSIZE]; + + sprintf(text,"Ellipsis(%d) = {%d,%d,%d,%d};",NEWREG(),p1,p2,p3,p4); + add_infile(text,fich); +} + +void add_spline(int N, int *p, char *fich){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i; + + sprintf(text,"CatmullRom(%d) = {",NEWREG()); + for(i=0;i<N;i++){ + if(i != N-1) + sprintf(text2,"%d,",p[i]); + else + sprintf(text2,"%d};",p[i]); + strcat(text,text2); + } + add_infile(text,fich); +} + +void add_bezier(int N, int *p, char *fich){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i; + + sprintf(text,"Bezier(%d) = {",NEWREG()); + for(i=0;i<N;i++){ + if(i != N-1) + sprintf(text2,"%d,",p[i]); + else + sprintf(text2,"%d};",p[i]); + strcat(text,text2); + } + add_infile(text,fich); +} + + +void add_bspline(int N, int *p, char *fich){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i; + + sprintf(text,"BSpline(%d) = {",NEWREG()); + for(i=0;i<N;i++){ + if(i != N-1) + sprintf(text2,"%d,",p[i]); + else + sprintf(text2,"%d};",p[i]); + strcat(text,text2); + } + add_infile(text,fich); +} + +void add_multline(int N, int *p, char *fich){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i; + + int iseg; + List_T *list = List_Create(N,2,sizeof(int)); + for(i=0;i<N;i++) + List_Add(list,&p[i]); + if((recognize_seg(MSH_SEGM_LINE,list,&iseg))){ + List_Delete(list); + return; + } + List_Delete(list); + + sprintf(text,"Line(%d) = {",NEWREG()); + for(i=0;i<N;i++){ + if(i != N-1) + sprintf(text2,"%d,",p[i]); + else + sprintf(text2,"%d};",p[i]); + strcat(text,text2); + } + add_infile(text,fich); +} + + +int recognize_zone(int ityp,List_T *list){ + return 0 ; +} + +void add_loop(List_T *list, char *fich, int *numloop){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i,seg; + + if((recognize_loop(list,numloop))) return; + + *numloop = NEWREG(); + sprintf(text,"Line Loop(%d) = {",NEWREG()); + for(i=0;i<List_Nbr(list);i++){ + List_Read(list,i,&seg); + if(i != List_Nbr(list)-1) + sprintf(text2,"%d,",seg); + else + sprintf(text2,"%d};",seg); + strcat(text,text2); + } + add_infile(text,fich); +} + + +void add_surf(List_T *list, char *fich, int support, int typ){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i,seg; + + if((i = recognize_zone(MSH_SURF_PLAN,list)) != 0)return; + if((i = recognize_zone(MSH_SURF_REGL,list)) != 0)return; + if((i = recognize_zone(MSH_SURF_TRIMMED,list)) != 0)return; + + if(typ ==1){ + sprintf(text,"Ruled Surface(%d) = {",NEWREG()); + } + else if (typ == 2){ + sprintf(text,"Plane Surface(%d) = {",NEWREG()); + } + else + { + sprintf(text,"Trimmed Surface(%d) = %d {",NEWREG(),support); + } + for(i=0;i<List_Nbr(list);i++){ + List_Read(list,i,&seg); + if(i != List_Nbr(list)-1) + sprintf(text2,"%d,",seg); + else + sprintf(text2,"%d};",seg); + strcat(text,text2); + } + add_infile(text,fich); +} + +void add_vol(List_T *list, char *fich, int *numvol){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i,seg; + + if((recognize_surfloop(list,numvol))) return; + + *numvol = NEWREG(); + sprintf(text,"Surface Loop(%d) = {",*numvol); + for(i=0;i<List_Nbr(list);i++){ + List_Read(list,i,&seg); + if(i != List_Nbr(list)-1) + sprintf(text2,"%d,",seg); + else + sprintf(text2,"%d};",seg); + strcat(text,text2); + } + add_infile(text,fich); +} + +void add_multvol(List_T *list, char *fich){ + char text[BUFFSIZE]; + char text2[BUFFSIZE]; + int i,seg; + + if((i= recognize_zone(MSH_VOLUME,list)))return; + + sprintf(text,"Complex Volume(%d) = {",NEWREG()); + for(i=0;i<List_Nbr(list);i++){ + List_Read(list,i,&seg); + if(i != List_Nbr(list)-1) + sprintf(text2,"%d,",seg); + else + sprintf(text2,"%d};",seg); + strcat(text,text2); + } + add_infile(text,fich); +} + +void add_trsfvol(int N, int *l, char *fich){ + char text[TEXT_BUFFER_SIZE], text2[TEXT_BUFFER_SIZE]; + int i; + + sprintf(text,"Transfinite Volume{%s} = {", trsf_vol_text); + for(i=0;i<N;i++){ + if(i==0)sprintf(text2,"%d ",l[i]); + else sprintf(text2,",%d ",l[i]); + strcat(text,text2); + } + sprintf(text2,"};"); + strcat(text,text2); + add_infile(text,fich); +} + + +void add_physical_entity(List_T *list, char *fich, int type, int *num){ + char text[BUFFSIZE], text2[BUFFSIZE]; + int i, elementary_entity; + + if(((*num) = recognize_zone(MSH_PHYSICAL_LINE,list))) return; + if(((*num) = recognize_zone(MSH_PHYSICAL_SURFACE,list))) return; + if(((*num) = recognize_zone(MSH_PHYSICAL_VOLUME,list))) return; + + *num = NEWREG(); + if (type == 1) + sprintf(text, "Physical Line(%d) = {", *num); + else if (type == 2) + sprintf(text, "Physical Surface(%d) = {", *num); + else if (type == 0) + sprintf(text, "Physical Point(%d) = {", *num); + else + sprintf(text, "Physical Volume(%d) = {", *num); + + for(i=0; i<List_Nbr(list); i++){ + List_Read(list, i, &elementary_entity); + if(i != List_Nbr(list)-1) + sprintf(text2, "%d,", elementary_entity); + else + sprintf(text2, "%d};", elementary_entity); + strcat(text, text2); + } + add_infile(text, fich); +} + +void extrude(int s, char *fich, char *what){ + char text[BUFFSIZE]; + + sprintf(text,"Extrude %s (%d, {%s,%s,%s});",what,s,tx_text,ty_text,tz_text); + add_infile(text,fich); + add_infile("Coherence;",fich); +} +void translate_seg(int add, int s, char *fich){ + char text[BUFFSIZE]; + + if(add) + sprintf(text,"Translate({%s,%s,%s}) {\n Duplicata { Line(%d); }\n}", + tx_text,ty_text,tz_text,s); + else + sprintf(text,"Translate({%s,%s,%s}) {\n Line(%d);\n}", + tx_text,ty_text,tz_text,s); + add_infile(text,fich); + add_infile("Coherence;",fich); +} + + +void translate_surf(int add, int s, char *fich){ + char text[BUFFSIZE]; + + if(add) + sprintf(text,"Translate({%s,%s,%s}) {\n Duplicata { Surface(%d); }\n}", + tx_text,ty_text,tz_text,s); + else + sprintf(text,"Translate({%s,%s,%s}) {\n Surface(%d);\n}", + tx_text,ty_text,tz_text,s); + add_infile(text,fich); + add_infile("Coherence;",fich); +} + +void translate_pt(int add, int s, char *fich){ + char text[BUFFSIZE]; + + if(add) + sprintf(text,"Translate({%s,%s,%s}) {\n Duplicata { Point(%d); }\n}", + tx_text,ty_text,tz_text,s); + else + sprintf(text,"Translate({%s,%s,%s}) {\n Point(%d);\n}", + tx_text,ty_text,tz_text,s); + add_infile(text,fich); + add_infile("Coherence;",fich); +} + +void rotate(int add, int s, char *fich, char *quoi){ + char text[BUFFSIZE]; + + if(add) + sprintf(text,"Rotate({%s,%s,%s},{%s,%s,%s},%s) {\n Duplicata { %s(%d); }\n}", + ax_text,ay_text,az_text,px_text,py_text,pz_text,angle_text, quoi,s); + else + sprintf(text,"Rotate({%s,%s,%s},{%s,%s,%s},%s) {\n %s(%d);\n }", + ax_text,ay_text,az_text,px_text,py_text,pz_text,angle_text, quoi,s); + add_infile(text,fich); + add_infile("Coherence;",fich); +} + +void dilate(int add, int s, char *fich, char *quoi){ + char text[BUFFSIZE]; + + if(add) + sprintf(text,"Dilate({%s,%s,%s},%s) {\n Duplicata { %s(%d); }\n}", + dx_text,dy_text,dz_text,df_text, quoi,s); + else + sprintf(text,"Dilate({%s,%s,%s},%s) {\n %s(%d);\n }", + dx_text,dy_text,dz_text,df_text, quoi,s); + add_infile(text,fich); + add_infile("Coherence;",fich); +} + + +void protude(int s, char *fich, char *what){ + char text[BUFFSIZE]; + + sprintf(text,"Extrude %s(%d, {%s,%s,%s}, {%s,%s,%s}, %s);",what,s,ax_text,ay_text, + az_text,px_text,py_text,pz_text,angle_text); + add_infile(text,fich); + add_infile("Coherence;",fich); +} + + + diff --git a/Geo/Geo.h b/Geo/Geo.h new file mode 100644 index 0000000000000000000000000000000000000000..c32f7de66e54abd66f23042c18aa66601990da99 --- /dev/null +++ b/Geo/Geo.h @@ -0,0 +1,113 @@ +#ifndef _GEO_H_ +#define _GEO_H_ + +#define ELEMENTARY 1 +#define PHYSICAL 2 + +#define INFILE 1 +#define INSTRING 2 +#define STRINGMAX 1024 + +#define NMAX_SPLINE 100 + +#define ENT_POINT 1 +#define ENT_LINE 2 +#define ENT_SURFACE 3 +#define ENT_VOLUME 4 + +#define MSH_TRSF_LINE 1 +#define MSH_TRSF_SURFACE 2 +#define MSH_TRSF_VOLUME 3 + +#define MSH_ASSOCIATION 6 + +#define MSH_RECOMBINE 5 + +#define MSH_POINT 1 + +#define MSH_SEGM_LINE 2 +#define MSH_SEGM_SPLN 3 +#define MSH_SEGM_CIRC 4 +#define MSH_SEGM_CIRC_INV 5 +#define MSH_SEGM_ELLI 6 +#define MSH_SEGM_ELLI_INV 7 +#define MSH_SEGM_LOOP 8 +#define MSH_SEGM_PARAMETRIC 888 +#define MSH_SEGM_MERGEDSEGS 889 + +#define MSH_SURF_PLAN 9 +#define MSH_SURF_REGL 10 +#define MSH_SURF_TRIC 11 +#define MSH_SURF_NURBS 12 +#define MSH_SURF_LOOP 13 +#define MSH_SURF_CYLNDR 1299 +#define MSH_SURF_TORUS 1399 +#define MSH_SURF_CONE 1499 +#define MSH_SURF_TRIMMED 1599 +#define MSH_SURF_STL 1599 + +#define MSH_VOLUME 14 +#define MSH_SEGM_BSPLN 15 +#define MSH_SEGM_URBS 16 +#define MSH_SEGM_NURBS 17 +#define MSH_SEGM_BEZIER 18 + +#define MSH_PHYSICAL_POINT 300 +#define MSH_PHYSICAL_LINE 310 +#define MSH_PHYSICAL_SURFACE 320 +#define MSH_PHYSICAL_VOLUME 330 + +typedef struct { + int Type; + int Num; + union { + int I; + double F; + double V[4]; + List_T *ListDouble; + } obj; +} Shape; + + +double evaluate_scalarfunction (char *var, double val, char *funct); + +void del_pnt(int p1, char *fich); +void del_seg(int p1, char *fich); +void del_srf(int p1, char *fich); + +void add_infile(char *text, char *fich); +void add_trsfsurf (int N, int *l, char *fich); +void add_trsfvol (int N, int *l, char *fich); +void add_ellipticsurf (int N, int *l, char *fich); +void add_charlength (int N, int *l, char *fich); +void add_recosurf (int N, int *l, char *fich); +void add_trsfline (int N, int *l, char *fich); +void add_param (char *par, char *value, char *fich); +void add_point(char *fich); +void add_attractor(char *fich, int ip, int typ); +void add_line(int p1, int p2, char *fich); +void add_circ(int p1, int p2, int p3, char *fich); +void add_ell(int p1, int p2, int p3, int p4, char *fich); +void add_spline(int N, int *p, char *fich); +void add_bezier(int N, int *p, char *fich); +void add_bspline(int N, int *p, char *fich); +void add_multline(int N, int *p, char *fich); + +int recognize_zone(int ityp,List_T *list); + +void add_loop(List_T *list, char *fich, int *numloop); +void add_surf(List_T *list, char *fich, int support, int typ); +void add_vol(List_T *list, char *fich, int *numvol); +void add_multvol(List_T *list, char *fich); +void add_physical_entity(List_T *list, char *fich, int type, int *num); + +void extrude(int s, char *fich, char *what); +void translate_seg(int add, int s, char *fich); +void translate_surf(int add, int s, char *fich); +void translate_pt(int add, int s, char *fich); +void rotate(int add, int s, char *fich, char *quoi); +void dilate(int add, int s, char *fich, char *quoi); +void protude(int s, char *fich, char *what); + + +#endif diff --git a/Geo/Makefile b/Geo/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d1d252f8700cbee6fa86288ac031c214c4a667be --- /dev/null +++ b/Geo/Makefile @@ -0,0 +1,94 @@ +# +# Makefile for "libGeo.a" +# + +.IGNORE: + +CC = c++ +C_FLAGS = -g -Wall + +OS_FLAGS = -D_UNIX + +RANLIB = /usr/bin/ranlib +RM = rm +RMFLAGS = -f + +LIB = ../lib/libGeo.a +INCLUDE = -I../Common -I../DataStr -I../Geo -I../Mesh -I../Parser -I../Unix + +CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE) + +SRC = CAD.cpp \ + DataBase.cpp \ + MinMax.cpp \ + ExtrudeParams.cpp \ + Geo.cpp \ + StepGeomDatabase.cpp \ + Verif.cpp \ + Print_Geo.cpp + +OBJ = $(SRC:.cpp=.o) + +.SUFFIXES: .o .cpp + +$(LIB): $(OBJ) + ar ruvs $(LIB) $(OBJ) + $(RANLIB) $(LIB) + +.cpp.o: + $(CC) $(CFLAGS) -c $< + +clean: + $(RM) $(RMFLAGS) *.o + +lint: + $(LINT) $(CFLAGS) $(SRC) + +depend: + (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ + $(CC) -MM $(CFLAGS) ${SRC} \ + ) >Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) $(RMFLAGS) Makefile.new + +# DO NOT DELETE THIS LINE +CAD.o: CAD.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h DataBase.h \ + ../Mesh/Interpolation.h ../Mesh/Numeric.h ../Common/Const.h \ + ../Mesh/Create.h CAD.h +DataBase.o: DataBase.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Geo.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h CAD.h ../Mesh/Create.h Verif.h +MinMax.o: MinMax.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Mesh/Vertex.h \ + ../Common/Context.h +ExtrudeParams.o: ExtrudeParams.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h Geo.h CAD.h ../Mesh/Mesh.h \ + ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h ExtrudeParams.h +Geo.o: Geo.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + ../Common/Const.h Geo.h CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h \ + ../Mesh/Simplex.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \ + ../Mesh/Metric.h DataBase.h ../Parser/Parser.h +StepGeomDatabase.o: StepGeomDatabase.cpp ../Common/Gmsh.h \ + ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \ + ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h Geo.h \ + StepGeomDatabase.h DataBase.h +Verif.o: Verif.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h Geo.h CAD.h ../Mesh/Mesh.h \ + ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h DataBase.h +Print_Geo.o: Print_Geo.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h Geo.h ../Mesh/Mesh.h \ + ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h CAD.h diff --git a/Geo/MinMax.cpp b/Geo/MinMax.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a49df54ddc7f3c916f63c41feab90ff9c601c103 --- /dev/null +++ b/Geo/MinMax.cpp @@ -0,0 +1,108 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Vertex.h" +#include "Context.h" + +extern Context_T CTX ; + +extern double LC, MiddleLC; +extern int LC_ORDER; + +/* ------------------------------------------------------------------------ */ +/* m i n m a x */ +/* ------------------------------------------------------------------------ */ + +void minmax(void *a , void*b){ + Vertex *v; + v = *(Vertex**)a; + CTX.min[0] = (CTX.min[0] < v->Pos.X) ? CTX.min[0] : v->Pos.X; + CTX.max[0] = (CTX.max[0] > v->Pos.X) ? CTX.max[0] : v->Pos.X; + CTX.min[1] = (CTX.min[1] < v->Pos.Y) ? CTX.min[1] : v->Pos.Y; + CTX.max[1] = (CTX.max[1] > v->Pos.Y) ? CTX.max[1] : v->Pos.Y; + CTX.min[2] = (CTX.min[2] < v->Pos.Z) ? CTX.min[2] : v->Pos.Z; + CTX.max[2] = (CTX.max[2] > v->Pos.Z) ? CTX.max[2] : v->Pos.Z; +} + +void CalculateMinMax (Tree_T *t){ + Vertex *v; + double frac; + int exp; + + if(!Tree_Nbr(t)){ + CTX.min[0] = CTX.min[1] = CTX.min[2] = -1.; + CTX.max[0] = CTX.max[1] = CTX.max[2] = 1.; + CTX.range[0] = CTX.range[1] = CTX.range[2] = 0.; + LC = MiddleLC = 1.; + return; + } + + Tree_Right(t,&v); + CTX.min[0] = CTX.max[0] = v->Pos.X; + CTX.min[1] = CTX.max[1] = v->Pos.Y; + CTX.min[2] = CTX.max[2] = v->Pos.Z; + Tree_Action(t,minmax); + + CTX.range[0] = CTX.max[0]-CTX.min[0]; + CTX.range[1] = CTX.max[1]-CTX.min[1]; + CTX.range[2] = CTX.max[2]-CTX.min[2]; + + if(CTX.range[0] == 0. && CTX.range[1] == 0. && CTX.range[2] == 0.){ + CTX.min[0] -= 1. ; + CTX.min[1] -= 1. ; + CTX.max[0] += 1. ; + CTX.max[1] += 1. ; + LC = 1.; + MiddleLC = 0.; + } + else if(CTX.range[0] == 0. && CTX.range[1] == 0.){ + LC = MiddleLC = CTX.range[2]; + CTX.min[0] -= LC; + CTX.min[1] -= LC; + CTX.max[0] += LC; + CTX.max[1] += LC; + } + else if(CTX.range[0] == 0. && CTX.range[2] == 0.){ + LC = MiddleLC = CTX.range[1]; + CTX.min[0] -= LC; + CTX.max[0] += LC; + } + else if(CTX.range[1] == 0. && CTX.range[2] == 0.){ + LC = MiddleLC = CTX.range[0]; + CTX.min[1] -= LC; + CTX.max[1] += LC; + } + else if(CTX.range[0] == 0.){ + LC = sqrt(DSQR(CTX.range[1])+DSQR(CTX.range[2])); + MiddleLC = DMIN(CTX.range[1], CTX.range[2]); + CTX.min[0] -= LC; + CTX.max[0] += LC; + } + else if(CTX.range[1] == 0.){ + LC = sqrt(DSQR(CTX.range[0])+DSQR(CTX.range[2])); + MiddleLC = DMIN(CTX.range[0], CTX.range[2]); + CTX.min[1] -= LC; + CTX.max[1] += LC; + } + else if(CTX.range[2] == 0.){ + LC = sqrt(DSQR(CTX.range[0])+DSQR(CTX.range[1])); + MiddleLC = DMIN(CTX.range[0], CTX.range[1]); + } + else{ + LC = sqrt(DSQR(CTX.range[0])+DSQR(CTX.range[1])+DSQR(CTX.range[2])); + if((CTX.range[1] <= CTX.range[0] && CTX.range[0] <= CTX.range[2]) || + (CTX.range[2] <= CTX.range[0] && CTX.range[0] <= CTX.range[1])) + MiddleLC = CTX.range[0]; + else if((CTX.range[0] <= CTX.range[1] && CTX.range[1] <= CTX.range[2]) || + (CTX.range[2] <= CTX.range[1] && CTX.range[1] <= CTX.range[0])) + MiddleLC = CTX.range[1]; + else + MiddleLC = CTX.range[2]; + } + + /* LC_ORDER : LC == f * 10^LC_ORDER with -1<f<1 */ + + frac = frexp(LC, &exp); + LC_ORDER = (int)floor(log10(ldexp(frac,exp))); +} + diff --git a/Geo/MinMax.h b/Geo/MinMax.h new file mode 100644 index 0000000000000000000000000000000000000000..a2abe8b8b417e78f9b7f2608033c26a0c26cc4a1 --- /dev/null +++ b/Geo/MinMax.h @@ -0,0 +1,6 @@ +#ifndef _MINMAX_H_ +#define _MINMAX_H_ + +void CalculateMinMax (Tree_T *t); + +#endif diff --git a/Geo/Print_Geo.cpp b/Geo/Print_Geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..160e7ed16a2f62563dd1ad04c3cf4c2460e328da --- /dev/null +++ b/Geo/Print_Geo.cpp @@ -0,0 +1,154 @@ + +#include "Gmsh.h" +#include "Geo.h" +#include "Mesh.h" +#include "Vertex.h" +#include "CAD.h" + +FILE *FOUT; + +void Print_Point(void *a, void *b){ + Vertex *v; + v = *(Vertex**)a; + fprintf(FOUT, "Point(%d) = {%g, %gE, %g, %g};\n", + v->Num,v->Pos.X,v->Pos.Y,v->Pos.Z,v->lc); +} + +void Print_Nurbs (Curve *c, FILE *f){ + int i,j; + Vertex *v; + + fprintf(f,"Nurbs (%d) = {",c->Num); + for(i=0;i<List_Nbr(c->Control_Points);i++){ + List_Read(c->Control_Points,i,&v); + if(!i) + fprintf(FOUT,"%3d",v->Num); + else + fprintf(FOUT,",%3d",v->Num); + if(i%8 == 7 && i!=List_Nbr(c->Control_Points)-1)fprintf(FOUT,"\n"); + } + fprintf(f,"}\n"); + fprintf(f,"Knots {"); + for(j=0;j<List_Nbr(c->Control_Points)+c->degre+1;j++){ + if(!j)fprintf(f,"%12.5E",c->k[j]); + else fprintf(f,",%12.5E",c->k[j]); + if(j%5 == 4 && j!=List_Nbr(c->Control_Points)+c->degre)fprintf(FOUT,"\n"); + } + fprintf(f,"}"); + fprintf(f,"Order %3d;\n\n",c->degre); +} + +void Print_Curve(void *a, void *b){ + Curve *c; + Vertex *v; + int i; + c = *(Curve**)a; + + if(c->Num < 0)return; + + switch(c->Typ){ + case MSH_SEGM_LINE: + fprintf(FOUT,"Line (%d) = ",c->Num); + break; + case MSH_SEGM_CIRC: + fprintf(FOUT,"Circle (%d) = ",c->Num); + break; + case MSH_SEGM_NURBS: + Print_Nurbs(c,FOUT); + return; + case MSH_SEGM_SPLN: + fprintf(FOUT,"CatmullRom (%d) = ",c->Num); + break; + } + + for(i=0;i<List_Nbr(c->Control_Points);i++){ + List_Read(c->Control_Points,i,&v); + if(i) + fprintf(FOUT,",%d",v->Num); + else + fprintf(FOUT,"{%d",v->Num); + if(i%6 == 7)fprintf(FOUT,"\n"); + } + if(c->Typ != MSH_SEGM_CIRC) + fprintf(FOUT,"};\n"); + else + fprintf(FOUT,"} Plane{%12.5E,%12.5E,%12.5E};\n", + c->Circle.n[0],c->Circle.n[1],c->Circle.n[2]); + +} + +void Print_Surface(void *a, void *b){ + Curve *c; + Surface *s; + Vertex *v; + int i,j; + s = *(Surface**)a; + + int NUMLOOP = s->Num + 1000000; + + if(s->Typ != MSH_SURF_NURBS){ + fprintf(FOUT,"Line Loop (%d) = ",NUMLOOP); + + for(i=0;i<List_Nbr(s->s.Generatrices);i++){ + List_Read(s->s.Generatrices,i,&c); + if(i) + fprintf(FOUT,",%3d",c->Num); + else + fprintf(FOUT,"{%3d",c->Num); + } + fprintf(FOUT,"};\n"); + } + + switch(s->Typ){ + case MSH_SURF_REGL: + fprintf(FOUT,"Ruled Surface (%d) = {%d};\n",s->Num,NUMLOOP); + break; + case MSH_SURF_PLAN: + fprintf(FOUT,"Plane Surface (%d) = {%d};\n",s->Num,NUMLOOP); + break; + case MSH_SURF_TRIMMED: + fprintf(FOUT,"Trimmed Surface (%d) = %d {%d};\n",s->Num,s->Support->Num,NUMLOOP); + break; + case MSH_SURF_NURBS: + fprintf(FOUT,"Nurbs Surface (%d) = {\n",s->Num); + for(i=0;i<s->Nv;i++){ + fprintf(FOUT,"\t\t{"); + for(j=0;j<s->Nu;j++){ + List_Read(s->Control_Points,j+s->Nu *i,&v); + if(!j) + fprintf(FOUT,"%3d",v->Num); + else + fprintf(FOUT,",%3d",v->Num); + } + if(i!=s->Nv-1) + fprintf(FOUT,"},\n"); + else + fprintf(FOUT,"}}\n"); + } + fprintf(FOUT,"\t\tKnots\n\t\t{"); + for(j=0;j<s->Nu+s->OrderU+1;j++){ + if(!j)fprintf(FOUT,"%12.5E",s->ku[j]); + else fprintf(FOUT,",%12.5E",s->ku[j]); + if(j%5 == 4 && j!=s->Nu + s->OrderU)fprintf(FOUT,"\n\t\t"); + } + fprintf(FOUT,"}\n\t\t{"); + for(j=0;j<s->Nv+s->OrderV+1;j++){ + if(!j)fprintf(FOUT,"%12.5E",s->kv[j]); + else fprintf(FOUT,",%12.5E",s->kv[j]); + if(j%5 == 4 && j!=s->Nv + s->OrderV)fprintf(FOUT,"\n\t\t"); + } + fprintf(FOUT,"}\n\t\tOrder %3d %3d;\n\n",s->OrderU,s->OrderV); + break; + } +} + +void Print_Geo(Mesh *M, char *filename){ + Coherence_PS(); + FOUT = fopen(filename,"w"); + if(!FOUT)return; + Tree_Action(M->Points,Print_Point); + Tree_Action(M->Curves,Print_Curve); + Tree_Action(M->Surfaces,Print_Surface); + fclose(FOUT); +} + diff --git a/Geo/Print_Geo.h b/Geo/Print_Geo.h new file mode 100644 index 0000000000000000000000000000000000000000..4b6de6998483c6aa332c648c103c046471d1423d --- /dev/null +++ b/Geo/Print_Geo.h @@ -0,0 +1,7 @@ +#ifndef _PRINT_GEO_H_ +#define _PRINT_GEO_H_ + +void Print_Geo(Mesh *M, char *filename); + + +#endif diff --git a/Geo/StepGeomDatabase.cpp b/Geo/StepGeomDatabase.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1b2a39b63595495c6bf5cdd1c4a2d15dd6657c28 --- /dev/null +++ b/Geo/StepGeomDatabase.cpp @@ -0,0 +1,674 @@ + +#include "Gmsh.h" +#include "Geo.h" +#include "StepGeomDatabase.h" +#include "DataBase.h" + +#define MAX(A,B) ((A)<(B))?(B):(A); +#define MIN(A,B) ((A)<(B))?(A):(B); +#define SQR(A) (A)*(A) + +extern double LC ; + +static Step_Solid_BRep_t *BREP=NULL; + +Step_Solid_BRep_t *Create_Step_Solid_BRep(void){ + Step_Solid_BRep_t *NEWBREP; + NEWBREP = (Step_Solid_BRep_t *)Malloc(sizeof(Step_Solid_BRep_t)); + NEWBREP->AllDirections = List_Create(10,10,sizeof(Step_Direction_t)); + NEWBREP->AllVectors = List_Create(10,10,sizeof(Step_Vector_t)); + NEWBREP->AllCartesian_Points = List_Create(10,10,sizeof(Step_Cartesian_Point_t)); + NEWBREP->AllVertex_Points = List_Create(10,10,sizeof(Step_Vertex_Point_t)); + NEWBREP->AllCurves = List_Create(10,10,sizeof(Step_Curve_t)); + NEWBREP->AllSurfaces = List_Create(10,10,sizeof(Step_Surface_t)); + NEWBREP->AllClosed_Shells = List_Create(10,10,sizeof(Step_Closed_Shell_t)); + NEWBREP->AllFaces_Outer_Bound = List_Create(10,10,sizeof(Step_Face_Outer_Bound_t)); + NEWBREP->AllOriented_Edges = List_Create(10,10,sizeof(Step_Oriented_Edge_t)); + NEWBREP->AllEdge_Loops = List_Create(10,10,sizeof(Step_Edge_Loop_t)); + NEWBREP->AllEdge_Curves = List_Create(10,10,sizeof(Step_Edge_Curve_t)); + NEWBREP->AllAdvanced_Faces = List_Create(10,10,sizeof(Step_Advanced_Face_t)); + NEWBREP->AllAxis2_Placement3D = List_Create(10,10,sizeof(Step_Axis2_Placement3D_t)); + NEWBREP->AllClosed_Shells = List_Create(10,10,sizeof(Step_Closed_Shell_t)); + BREP = NEWBREP; + return NEWBREP; +} + +/*---------------- Directions --------------------------------------------*/ + +void Add_Direction (int Num , char *name , double x, double y, double z ){ + Step_Direction_t Dir; + if(!BREP)return; + Dir.Pos.X = x; + Dir.Pos.Y = y; + Dir.Pos.Z = z; + Dir.Num = Num; + List_Add(BREP->AllDirections,&Dir); +} + +static int comparedir (const void *a, const void *b){ + return (((Step_Direction_t *)a)->Num - + ((Step_Direction_t *)b)->Num); +} + +Step_Direction_t *Get_Direction (int Num){ + Step_Direction_t Dir; + if(!BREP)return NULL; + Dir.Num = Num; + return (Step_Direction_t*)List_PQuery ( BREP->AllDirections,&Dir, comparedir ); +} + +/*---------------- Axis2_Placement3D--------------------------------------*/ + +void Add_Axis2_Placement3D (int Num, int dir1, int dir2, int ver){ + Step_Axis2_Placement3D_t Axe; + if(!BREP)return; + Axe.Num = Num; + Axe.Step_Cartesian_Point = ver; + Axe.Step_Direction1 = dir1; + Axe.Step_Direction2 = dir2; + List_Add(BREP->AllAxis2_Placement3D,&Axe); +} + +static int compareax (const void *a, const void *b){ + return (((Step_Axis2_Placement3D_t *)a)->Num - + ((Step_Axis2_Placement3D_t *)b)->Num); +} + +Step_Axis2_Placement3D_t *Get_Axis2_Placement3D (int Num){ + Step_Axis2_Placement3D_t Axe; + if(!BREP)return NULL; + Axe.Num = Num; + return (Step_Axis2_Placement3D_t*)List_PQuery ( BREP->AllAxis2_Placement3D, + &Axe, compareax ); +} + +/*---------------- Vectors -----------------------------------------------*/ + +void Add_Vector (int Num , char *name , int Dir, double l ){ + Step_Vector_t Vec; + if(!BREP)return; + Vec.Lenght = l; + Vec.Step_Direction = Dir; + Vec.Num = Num; + List_Add(BREP->AllVectors,&Vec); +} + +static int comparevec (const void *a, const void *b){ + return (((Step_Vector_t *)a)->Num - + ((Step_Vector_t *)b)->Num); +} + +Step_Vector_t *Get_Vector (int Num){ + Step_Vector_t Vec; + if(!BREP)return NULL; + Vec.Num = Num; + return (Step_Vector_t*)List_PQuery ( BREP->AllVectors,&Vec, comparevec ); +} + +/*---------------- Cartesian_Points --------------------------------------*/ + +void Add_Cartesian_Point (int Num , char *name , double x, double y, double z){ + Step_Cartesian_Point_t CP; + + if(!BREP){ + return; + } + CP.Pos.X = x; + CP.Pos.Y = y; + CP.Pos.Z = z; + CP.Num = Num; + + List_Add(BREP->AllCartesian_Points,&CP); +} +static int comparecp (const void *a, const void *b){ + return (((Step_Cartesian_Point_t *)a)->Num - + ((Step_Cartesian_Point_t *)b)->Num); +} +Step_Cartesian_Point_t *Get_Cartesian_Point (int Num){ + Step_Cartesian_Point_t CP; + if(!BREP)return NULL; + CP.Num = Num; + return (Step_Cartesian_Point_t*)List_PQuery ( BREP->AllCartesian_Points,&CP, comparecp ); +} + +/*---------------- Vertex_Points -----------------------------------------*/ + +void Add_Vertex_Point (int Num , char *name, int cp){ + Step_Vertex_Point_t VP; + if(!BREP)return; + VP.Cartesian_Point = cp; + VP.Num = Num; + List_Add(BREP->AllVertex_Points,&VP); +} +static int comparevp (const void *a, const void *b){ + return (((Step_Vertex_Point_t *)a)->Num - + ((Step_Vertex_Point_t *)b)->Num); +} +Step_Vertex_Point_t *Get_Vertex_Point (int Num){ + Step_Vertex_Point_t VP; + if(!BREP)return NULL; + VP.Num = Num; + return (Step_Vertex_Point_t*)List_PQuery ( BREP->AllVertex_Points,&VP, comparevp ); +} + + +/*---------------- Curves ------------------------------------------------*/ + +void Add_Line (int Num, char *name , int begin, int dir){ + Step_Curve_t Curve; + if(!BREP)return; + Curve.Num = Num; + Curve.Typ = STEP_LINE; + Curve.Curve.Line.Step_Cartesian_Point = begin; + Curve.Curve.Line.Step_Vector = dir; + List_Add(BREP->AllCurves,&Curve); +} + +void Add_Circle (int Num, char *name , int axis, double radius){ + Step_Curve_t Curve; + if(!BREP)return; + Curve.Num = Num; + Curve.Typ = STEP_CIRC; + Curve.Curve.Circle.Radius1 = radius; + Curve.Curve.Circle.Radius2 = radius; + Curve.Curve.Circle.Step_Axis2_Placement3D = axis; + List_Add(BREP->AllCurves,&Curve); +} + +void Add_Ellipsis (int Num, char *name , int axis, double radius1, double radius2){ + Step_Curve_t Curve; + if(!BREP)return; + Curve.Num = Num; + Curve.Typ = STEP_ELLP; + Curve.Curve.Circle.Radius1 = radius1; + Curve.Curve.Circle.Radius2 = radius2; + Curve.Curve.Circle.Step_Axis2_Placement3D = axis; + List_Add(BREP->AllCurves,&Curve); +} + +void Add_BSpline_Curve_With_Knots (int Num, char *name, int Order, List_T *lcp, + List_T *multk, List_T *knots, double udeb, double uend){ + Step_Curve_t Curve; + int i,j,mult; + double d; + + if(!BREP)return; + Curve.Num = Num; + Curve.Typ = STEP_BSPL; + Curve.Curve.BSpline.ListOf_Knots = List_Create (List_Nbr(lcp) + Order + 1 + ,1,sizeof(double)); + /* Adding knots with their multiplicity */ + for(i=0;i<List_Nbr(multk);i++){ + List_Read(multk,i,&d); + mult = (int)d; + List_Read(knots,i,&d); + for(j=0;j<mult;j++){ + List_Add(Curve.Curve.BSpline.ListOf_Knots,&d); + } + } + Curve.Curve.BSpline.ListOf_Cartesian_Points = List_Create(List_Nbr(lcp),1,sizeof(int)); + for(i=0;i<List_Nbr(lcp);i++){ + List_Read(lcp,i,&d); + j = (int)d; + List_Add(Curve.Curve.BSpline.ListOf_Cartesian_Points,&j); + } + Curve.Curve.BSpline.Order = Order; + Curve.Curve.BSpline.Ubeg = udeb; + Curve.Curve.BSpline.Uend = uend; + List_Add(BREP->AllCurves,&Curve); +} + +static int comparecur (const void *a, const void *b){ + return (((Step_Curve_t *)a)->Num - + ((Step_Curve_t *)b)->Num); +} +Step_Curve_t *Get_Curve (int Num){ + Step_Curve_t C; + if(!BREP)return NULL; + C.Num = Num; + return (Step_Curve_t*)List_PQuery ( BREP->AllCurves,&C, comparecur ); +} + +/*---------------- Edge_Curves -------------------------------------------*/ + +void Add_Edge_Curve (int Num, char *name , int beg, int end, int curve ){ + Step_Edge_Curve_t EC; + if(!BREP)return; + EC.Num = Num; + EC.Step_Vertex_Point_Begin = beg; + EC.Step_Vertex_Point_End = end; + EC.Step_Curve = curve; + List_Add(BREP->AllEdge_Curves,&EC); +} + +static int compareec (const void *a, const void *b){ + return (((Step_Edge_Curve_t *)a)->Num - + ((Step_Edge_Curve_t *)b)->Num); +} +Step_Edge_Curve_t *Get_Edge_Curve (int Num){ + Step_Edge_Curve_t EC; + if(!BREP)return NULL; + EC.Num = Num; + return (Step_Edge_Curve_t*)List_PQuery ( BREP->AllEdge_Curves,&EC, compareec ); +} + +/*---------------- Oriented_Edges ----------------------------------------*/ + +void Add_Oriented_Edge (int Num, char *name , int ec, bool dir ){ + Step_Oriented_Edge_t OE; + if(!BREP)return; + OE.Num = Num; + OE.Step_Edge_Curve = ec; + OE.dir = dir; + List_Add(BREP->AllOriented_Edges,&OE); +} + +static int compareoe (const void *a, const void *b){ + return (((Step_Oriented_Edge_t *)a)->Num - + ((Step_Oriented_Edge_t *)b)->Num); +} +Step_Oriented_Edge_t *Get_Oriented_Edge (int Num){ + Step_Oriented_Edge_t OE; + if(!BREP)return NULL; + OE.Num = Num; + return (Step_Oriented_Edge_t*)List_PQuery ( BREP->AllOriented_Edges,&OE, compareoe ); +} + +/*---------------- Edge_Loops --------------------------------------------*/ + +void Add_Edge_Loop (int Num, char *name , List_T *list ){ + Step_Edge_Loop_t EL; + if(!BREP)return; + EL.Num = Num; + EL.ListOf_Step_Oriented_Edge = list; + List_Add(BREP->AllEdge_Loops,&EL); +} + +static int compareel (const void *a, const void *b){ + return (((Step_Edge_Loop_t *)a)->Num - + ((Step_Edge_Loop_t *)b)->Num); +} +Step_Edge_Loop_t *Get_Edge_Loop (int Num){ + Step_Edge_Loop_t EL; + if(!BREP)return NULL; + EL.Num = Num; + return (Step_Edge_Loop_t*)List_PQuery ( BREP->AllEdge_Loops,&EL, compareel ); +} + +/*---------------- Faces_Outer_Bounds ------------------------------------*/ + +void Add_Face_Outer_Bound (int Num, char *name , int el, bool dir, bool outer ){ + Step_Face_Outer_Bound_t F; + if(!BREP)return; + F.Num = Num; + F.Step_Edge_Loop = el; + F.dir = dir; + F.outer = outer; + List_Add(BREP->AllFaces_Outer_Bound,&F); +} + +static int comparefab (const void *a, const void *b){ + return (((Step_Face_Outer_Bound_t *)a)->Num - + ((Step_Face_Outer_Bound_t *)b)->Num); +} +Step_Face_Outer_Bound_t *Get_Face_Outer_Bound (int Num){ + Step_Face_Outer_Bound_t F; + if(!BREP)return NULL; + F.Num = Num; + return (Step_Face_Outer_Bound_t*)List_PQuery ( BREP->AllFaces_Outer_Bound,&F, comparefab ); +} + +/*---------------- Advanced_Faces ----------------------------------------*/ + +void Add_Advanced_Face (int Num, char *name , List_T *el, int surf, bool dir ){ + Step_Advanced_Face_t F; + if(!BREP)return; + F.Num = Num; + F.ListOf_Step_Face_Outer_Bound = el; + F.Step_Surface = surf; + F.dir = dir; + List_Add(BREP->AllAdvanced_Faces,&F); +} + +static int compareaf (const void *a, const void *b){ + return (((Step_Advanced_Face_t *)a)->Num - + ((Step_Advanced_Face_t *)b)->Num); +} +Step_Advanced_Face_t *Get_Advanced_Face (int Num){ + Step_Advanced_Face_t F; + if(!BREP)return NULL; + F.Num = Num; + return (Step_Advanced_Face_t*)List_PQuery ( BREP->AllAdvanced_Faces,&F, compareaf ); +} + +/*---------------- Surfaces ----------------------------------------------*/ + +void Add_Plane (int Num, char *name , int axis){ + Step_Surface_t Surface; + if(!BREP)return; + Surface.Num = Num; + Surface.Typ = STEP_PLAN; + Surface.Surface.Plane.Step_Axis2_Placement3D = axis; + List_Add(BREP->AllSurfaces,&Surface); +} + +void Add_Cylinder (int Num, char *name , int axis, double radius){ + Step_Surface_t S; + if(!BREP)return; + S.Num = Num; + S.Typ = STEP_CYLD; + S.Surface.Quadric.Radius1 = radius; + S.Surface.Quadric.Radius2 = 0.0; + S.Surface.Quadric.Step_Axis2_Placement3D = axis; + List_Add(BREP->AllSurfaces,&S); +} + +void Add_Torus (int Num, char *name , int axis, double radius1, double radius2){ + Step_Surface_t S; + if(!BREP)return; + S.Num = Num; + S.Typ = STEP_TORD; + S.Surface.Quadric.Radius1 = radius1; + S.Surface.Quadric.Radius2 = radius2; + S.Surface.Quadric.Step_Axis2_Placement3D = axis; + List_Add(BREP->AllSurfaces,&S); +} + +void Add_Cone (int Num, char *name , int axis, double radius1, double radius2){ + Step_Surface_t S; + if(!BREP)return; + S.Num = Num; + S.Typ = STEP_CONE; + S.Surface.Quadric.Radius1 = radius1; + S.Surface.Quadric.Radius2 = radius2; + S.Surface.Quadric.Step_Axis2_Placement3D = axis; + List_Add(BREP->AllSurfaces,&S); +} + + +void Add_BSpline_Surface_With_Knots (int Num,char *name, int OrderU,int OrderV, + List_T *lcp,List_T *lmu, List_T *lmv, List_T *lku, + List_T *lkv, double udeb, double uend, double vdeb, + double vend){ + Step_Surface_t Surface; + int i,j,mult; + double d; + + if(!BREP)return; + + Surface.Surface.BSpline.ListOf_KnotsU = + List_Create (List_Nbr(lku) + OrderU + 1,1,sizeof(double)); + Surface.Surface.BSpline.ListOf_KnotsV = + List_Create (List_Nbr(lkv) + OrderV + 1,1,sizeof(double)); + + /* Adding knots with their multiplicity */ + for(i=0;i<List_Nbr(lmu);i++){ + List_Read(lmu,i,&d); + mult = (int)d; + List_Read(lku,i,&d); + for(j=0;j<mult;j++){ + List_Add(Surface.Surface.BSpline.ListOf_KnotsU,&d); + } + } + for(i=0;i<List_Nbr(lmv);i++){ + List_Read(lmv,i,&d); + mult = (int)d; + List_Read(lkv,i,&d); + for(j=0;j<mult;j++){ + List_Add(Surface.Surface.BSpline.ListOf_KnotsV,&d); + } + } + + /*Adding the points !*/ + Surface.Surface.BSpline.ListOf_Cartesian_Points = lcp; + + Surface.Num = Num; + Surface.Typ = STEP_BSPL; + Surface.Surface.BSpline.OrderU = OrderU; + Surface.Surface.BSpline.OrderV = OrderV; + Surface.Surface.BSpline.Ubeg = udeb; + Surface.Surface.BSpline.Uend = uend; + Surface.Surface.BSpline.Vbeg = vdeb; + Surface.Surface.BSpline.Vend = vend; + List_Add(BREP->AllSurfaces,&Surface); +} + +static int comparesur (const void *a, const void *b){ + return (((Step_Surface_t *)a)->Num - + ((Step_Surface_t *)b)->Num); +} +Step_Surface_t *Get_Surface (int Num){ + Step_Surface_t S; + if(!BREP)return NULL; + S.Num = Num; + return (Step_Surface_t*)List_PQuery ( BREP->AllSurfaces,&S, comparesur ); +} + +/*---------------- Closed_Shells ----------------------------------------*/ + +void Add_Closed_Shell (int Num, char *name , List_T *list ){ + Step_Closed_Shell_t S; + if(!BREP)return; + S.Num = Num; + S.ListOf_Step_Advanced_Face = list; + List_Add(BREP->AllClosed_Shells,&S); +} + +static int comparecs (const void *a, const void *b){ + return (((Step_Closed_Shell_t *)a)->Num - + ((Step_Closed_Shell_t *)b)->Num); +} +Step_Closed_Shell_t *Get_Closed_Shell (int Num){ + Step_Closed_Shell_t F; + if(!BREP)return NULL; + F.Num = Num; + return (Step_Closed_Shell_t*)List_PQuery ( BREP->AllClosed_Shells,&F, comparecs ); +} + +/*---------------- Closed_Shells ----------------------------------------*/ + +void Resolve_BREP (void){ + int i,j,k,l; + double d; + int obj,err,typ; + Step_Vertex_Point_t vp; + Step_Direction_t *d1,*d2; + Step_Cartesian_Point_t *pcp,cp; + Step_Edge_Curve_t ec; + Step_Curve_t *pc; + Step_Advanced_Face_t af, *paf; + Step_Surface_t s; + Step_Surface_t *ps; + Step_Face_Outer_Bound_t *pfab; + Step_Edge_Loop_t *pel; + Step_Oriented_Edge_t *poe; + Step_Axis2_Placement3D_t *axs; + Step_Closed_Shell_t cs; + List_T *ListInt,*ListIntBis,*ListDouble; + double ubeg,uend,n[3],t[3],p[3],XMIN,XMAX,YMIN,YMAX,ZMIN,ZMAX,L; + int fob; + + ListInt = List_Create(2,2,sizeof(int)); + ListIntBis = List_Create(2,2,sizeof(int)); + ListDouble = List_Create(2,2,sizeof(double)); + + for(i=0;i<List_Nbr(BREP->AllCartesian_Points);i++){ + List_Read(BREP->AllCartesian_Points,i,&cp); + XMAX = MAX(cp.Pos.X,XMAX); + YMAX = MAX(cp.Pos.Y,YMAX); + ZMAX = MAX(cp.Pos.Z,ZMAX); + XMIN = MIN(cp.Pos.X,XMIN); + YMIN = MIN(cp.Pos.Y,YMIN); + ZMIN = MIN(cp.Pos.Z,ZMIN); + } + L = sqrt(SQR(XMIN-XMAX) + SQR(YMIN-YMAX) + SQR(ZMIN-ZMAX)); + LC = L; + + /* resolving cartesian_points */ + for(i=0;i<List_Nbr(BREP->AllCartesian_Points);i++){ + List_Read(BREP->AllCartesian_Points,i,&cp); + Cdbpts101(cp.Num,cp.Pos.X,cp.Pos.Y,cp.Pos.Z,L*.01,1); + } + + /* resolving vertex_points */ + for(i=0;i<List_Nbr(BREP->AllVertex_Points);i++){ + List_Read(BREP->AllVertex_Points,i,&vp); + if((pcp = Get_Cartesian_Point(vp.Cartesian_Point))){ + Cdbpts101(vp.Num,pcp->Pos.X,pcp->Pos.Y,pcp->Pos.Z,L*.01,1); + } + } + + /* resolving Edge_Curves*/ + for(i=0;i<List_Nbr(BREP->AllEdge_Curves);i++){ + List_Read(BREP->AllEdge_Curves,i,&ec); + if((pc = Get_Curve(ec.Step_Curve))){ + if(pc->Typ == STEP_LINE){ + List_Add(ListInt,&ec.Step_Vertex_Point_Begin); + List_Add(ListInt,&ec.Step_Vertex_Point_End); + Cdbseg101(ec.Num,MSH_SEGM_LINE,1,NULL,ListInt,-1,-1,0.,1.,NULL,NULL,NULL); + List_Reset(ListInt); + } + else if(pc->Typ == STEP_BSPL){ + List_Read( pc->Curve.BSpline.ListOf_Knots , 0, &ubeg); + List_Read( pc->Curve.BSpline.ListOf_Knots , + List_Nbr(pc->Curve.BSpline.ListOf_Knots)-1, &uend); + AddCurveInDataBase (ec.Num, + MSH_SEGM_NURBS, + pc->Curve.BSpline.Order, + pc->Curve.BSpline.ListOf_Cartesian_Points, + pc->Curve.BSpline.ListOf_Knots, + ec.Step_Vertex_Point_Begin, + ec.Step_Vertex_Point_End, + ubeg, + uend); + } + else if(pc->Typ == STEP_CIRC || pc->Typ == STEP_ELLP){ + axs = Get_Axis2_Placement3D(pc->Curve.Circle.Step_Axis2_Placement3D); + pcp = Get_Cartesian_Point(axs->Step_Cartesian_Point); + d1 = Get_Direction(axs->Step_Direction1); + d2 = Get_Direction(axs->Step_Direction2); + n[0] = d1->Pos.X; + n[1] = d1->Pos.Y; + n[2] = d1->Pos.Z; + + List_Add(ListInt,&ec.Step_Vertex_Point_Begin); + List_Add(ListInt,&pcp->Num); + List_Add(ListInt,&ec.Step_Vertex_Point_End); + AddCircleInDataBase ( ec.Num,MSH_SEGM_CIRC , + ListInt,n); + /*Cdbseg101(ec.Num,MSH_SEGM_CIRC,1,NULL, + ListInt,-1,-1,0.,1.,NULL,NULL,NULL); + */ + List_Reset(ListInt); + } + } + } + + /* resolving Surfaces */ + for(i=0;i<List_Nbr(BREP->AllSurfaces);i++){ + List_Read(BREP->AllSurfaces,i,&s); + if(s.Typ == STEP_BSPL){ + CreateNurbsSurfaceSupport ( + s.Num , + s.Surface.BSpline.OrderV , + s.Surface.BSpline.OrderU , + s.Surface.BSpline.ListOf_Cartesian_Points , + s.Surface.BSpline.ListOf_KnotsV , + s.Surface.BSpline.ListOf_KnotsU ); + + } + } + + /*resolving Advanced_Faces*/ + + for(i=0;i<List_Nbr(BREP->AllAdvanced_Faces);i++){ + err = 0; + List_Read(BREP->AllAdvanced_Faces,i,&af); + fob = 0; + for(j=0;j<List_Nbr(af.ListOf_Step_Face_Outer_Bound);j++){ + List_Read(af.ListOf_Step_Face_Outer_Bound,j,&d); + obj = (int)d; + if((pfab = Get_Face_Outer_Bound(obj)) && + (!j || fob)){ + if(pfab->outer)fob = 1; + if((pel = Get_Edge_Loop(pfab->Step_Edge_Loop))){ + for(k=0;k<List_Nbr(pel->ListOf_Step_Oriented_Edge);k++){ + List_Read(pel->ListOf_Step_Oriented_Edge,k,&d); + obj = (int)d; + if((poe = Get_Oriented_Edge(obj))){ + l = (poe->dir)?poe->Step_Edge_Curve:-poe->Step_Edge_Curve; + List_Add(ListInt,&l); + } + else err = 1; + } + } + else err = 1; + if(!err){ + Cdbz101(pfab->Num,MSH_SEGM_LOOP,0,0,0,0,0,NULL,NULL,ListInt); + List_Add(ListIntBis,& pfab->Num); + } + List_Reset(ListInt); + } + else err = 0; + } + if(!err && (ps = Get_Surface(af.Step_Surface))){ + if(ps->Typ == STEP_PLAN){ + Cdbz101(af.Num,MSH_SURF_PLAN,0,0,0,0,0,NULL,NULL,ListIntBis); + } + else if(ps->Typ == STEP_CYLD || ps->Typ == STEP_CONE + /*|| ps->Typ == STEP_TORD || ps->Typ == STEP_CONE*/){ + axs = Get_Axis2_Placement3D(ps->Surface.Quadric.Step_Axis2_Placement3D); + pcp = Get_Cartesian_Point(axs->Step_Cartesian_Point); + d1 = Get_Direction(axs->Step_Direction1); + d2 = Get_Direction(axs->Step_Direction2); + n[0] = d1->Pos.X;n[1] = d1->Pos.Y;n[2] = d1->Pos.Z; + t[0] = d2->Pos.X;t[1] = d2->Pos.Y;t[2] = d2->Pos.Z; + p[0] = pcp->Pos.X;p[1] = pcp->Pos.Y;p[2] = pcp->Pos.Z; + switch(ps->Typ){ + case STEP_CYLD: + typ = MSH_SURF_CYLNDR; + break; + case STEP_TORD: + typ = MSH_SURF_TORUS; + break; + case STEP_CONE: + typ = MSH_SURF_CONE; + break; + } + AddQuadricSurfaceInDataBase (typ, + af.Num, + n,t,p, + ps->Surface.Quadric.Radius1, + ps->Surface.Quadric.Radius2, + ListIntBis); + + //Cdbz101(af.Num,MSH_SURF_REGL,0,0,0,0,0,NULL,NULL,ListIntBis); + } + + else if(ps->Typ == STEP_BSPL){ + Cdbz101(af.Num,MSH_SURF_TRIMMED,0,0,0,0,af.Step_Surface,NULL,NULL,ListIntBis); + } + } + List_Reset(ListIntBis); + } + + /*resolving closed shells (sheila)*/ + for(i=0;i<List_Nbr(BREP->AllClosed_Shells);i++){ + List_Reset(ListInt); + List_Read(BREP->AllClosed_Shells,i,&cs); + for(j=0;j<List_Nbr(cs.ListOf_Step_Advanced_Face);j++){ + List_Read(cs.ListOf_Step_Advanced_Face,j,&d); + obj = (int)d; + if((paf = Get_Advanced_Face(obj))){ + List_Add(ListInt,&paf->Num); + } + } + Cdbz101(cs.Num+1000000,MSH_SURF_LOOP,0,0,0,0,0,NULL,NULL,ListInt); + List_Reset(ListInt); + j = cs.Num+1000000; + List_Add(ListInt,&j); + Cdbz101(cs.Num,MSH_VOLUME,0,0,0,0,0,NULL,NULL,ListInt); + } +} + + diff --git a/Geo/StepGeomDatabase.h b/Geo/StepGeomDatabase.h new file mode 100644 index 0000000000000000000000000000000000000000..a763fcdd8666f41b9b62b1dd1f8d14780e260980 --- /dev/null +++ b/Geo/StepGeomDatabase.h @@ -0,0 +1,202 @@ +#ifndef _STEP_GEOM_DATABASE_H_ +#define _STEP_GEOM_DATABASE_H_ + +typedef struct{ + double X, Y, Z; +} Step_Coord_t; + +typedef struct{ + int Num; + char *Name; + Step_Coord_t Pos; +}Step_Direction_t; + +typedef struct{ + int Num; + char *Name; + int Step_Direction; + double Lenght; +}Step_Vector_t; + +typedef struct{ + int Num; + char *Name; + int Cartesian_Point; +}Step_Vertex_Point_t; + +typedef struct{ + int Num; + char *Name; + Step_Coord_t Pos; +}Step_Cartesian_Point_t; + + +#define STEP_LINE 1 +#define STEP_CIRC 3 +#define STEP_ELLP 6 +#define STEP_PARA 7 +#define STEP_HYPB 8 + +typedef struct{ + int Step_Cartesian_Point; + int Step_Vector; +}Step_Line_t; + +typedef struct{ + int Step_Axis2_Placement3D; + double Radius1; + double Radius2; +}Step_Circle_t; + +typedef struct{ + int Order; + List_T *ListOf_Cartesian_Points; + List_T *ListOf_Knots; + double Ubeg, Uend; +}Step_BSpline_Curve_With_Knots_t; + +typedef struct{ + int Num; + int Typ; + char *Name; + union{ + Step_BSpline_Curve_With_Knots_t BSpline; + Step_Line_t Line; + Step_Circle_t Circle; + }Curve; +}Step_Curve_t; + + +#define STEP_PLAN 1 +#define STEP_CYLD 2 +#define STEP_TORD 3 +#define STEP_CONE 4 +#define STEP_BSPL 5 + +typedef struct{ + int Num; + int Step_Cartesian_Point; + int Step_Direction1; + int Step_Direction2; +}Step_Axis2_Placement3D_t; + +typedef struct{ + int Step_Axis2_Placement3D; +}Step_Plane_t; + +typedef struct{ + int Step_Axis2_Placement3D; + double Radius1; + double Radius2; +}Step_Quadric_t; + +typedef struct{ + int OrderU, OrderV; + List_T *ListOf_Cartesian_Points; + List_T *ListOf_KnotsU; + List_T *ListOf_KnotsV; + double Ubeg, Uend, Vbeg, Vend; +}Step_BSpline_Surface_With_Knots_t; + +typedef struct{ + int Num; + int Typ; + char *Name; + union{ + Step_BSpline_Surface_With_Knots_t BSpline; + Step_Plane_t Plane; + Step_Quadric_t Quadric; + }Surface; +}Step_Surface_t; + +typedef struct{ + int Num; + char *Name; + int Step_Vertex_Point_Begin; + int Step_Vertex_Point_End; + int Step_Curve; +}Step_Edge_Curve_t; + +typedef struct{ + int Num; + char Name; + int Step_Edge_Curve; + bool dir; +}Step_Oriented_Edge_t; + +typedef struct{ + int Num; + char Name; + List_T *ListOf_Step_Oriented_Edge; +}Step_Edge_Loop_t; + +typedef struct{ + int Num; + char Name; + int Step_Edge_Loop; + bool dir; + bool outer; +}Step_Face_Outer_Bound_t; + +typedef struct{ + int Num; + char Name; + List_T *ListOf_Step_Face_Outer_Bound; + int Step_Surface; + bool dir; +}Step_Advanced_Face_t; + +typedef struct{ + int Num; + char Name; + List_T *ListOf_Step_Advanced_Face; +}Step_Closed_Shell_t; + +typedef struct{ + List_T *AllDirections; + List_T *AllVectors; + List_T *AllCartesian_Points; + List_T *AllVertex_Points; + List_T *AllCurves; + List_T *AllEdge_Curves; + List_T *AllSurfaces; + List_T *AllAxis2_Placement3D; + List_T *AllClosed_Shells; + List_T *AllFaces_Outer_Bound; + List_T *AllOriented_Edges; + List_T *AllEdge_Loops; + List_T *AllAdvanced_Faces; +}Step_Solid_BRep_t; + +Step_Solid_BRep_t *Create_Step_Solid_BRep(void); + +void Add_Direction (int Num, char *name, double x, double y, double z); +void Add_Vector (int Num, char *name, int Dir, double l); +void Add_Cartesian_Point (int Num, char *name, double x, double y, double z); +void Add_Vertex_Point (int Num, char *name, int cp); +void Add_Line (int Num, char *name, int begin, int dir); +void Add_Circle (int Num, char *name, int axis, double Radius); +void Add_Ellipsis (int Num, char *name, int axis, double Radius, double r2); +void Add_Cylinder (int Num, char *name, int axis, double Radius); +void Add_Torus (int Num, char *name, int axis, double radius1, double radius2); +void Add_Cone (int Num, char *name, int axis, double radius1, double radius2); +void Add_Edge_Curve (int Num, char *name, int beg, int end, int curve); +void Add_Vertex_Point (int num, char *name, int cp); +void Add_Oriented_Edge (int Num, char *name, int ec, bool dir); +void Add_Edge_Loop (int Num, char *name, List_T * list); +void Add_Face_Outer_Bound (int Num, char *name, int el, bool dir, bool outer); +void Add_Advanced_Face (int Num, char *name, List_T * lfob, int surf, bool dir); +void Add_Closed_Shell (int Num, char *name, List_T * laf); +void Add_BSpline_Curve_With_Knots (int Num, char *name, int Order, List_T * lcp, + List_T * lm, List_T * lk, double udeb, double uend); +void Add_Plane (int Num, char *name, int axis); +void Add_Axis2_Placement3D (int Num, int cp, int dir1, int dir2); +void Add_Closed_Shell (int Num, char *name, List_T * list); +void Resolve_BREP (void); +void Add_BSpline_Surface_With_Knots (int Num,char *name,int OrderU,int OrderV, + List_T * lcp, List_T * lmu, List_T * lmv, + List_T * lku,List_T * lkv, + double udeb,double uend, + double vdeb,double vend); + +#endif diff --git a/Geo/Verif.cpp b/Geo/Verif.cpp new file mode 100644 index 0000000000000000000000000000000000000000..66bed8fa2339c343799e3083b0850fcf5890a979 --- /dev/null +++ b/Geo/Verif.cpp @@ -0,0 +1,366 @@ + +#include "Gmsh.h" +#include "Geo.h" +#include "CAD.h" +#include "Mesh.h" +#include "DataBase.h" + +extern Mesh *THEM; + +/* Contour extraction by a tree method */ + +static Tree_T *treelink; +static Tree_T *treeedges; +static Tree_T *treefaces; +static List_T *listlink; + +typedef struct { + int n,a,arbre; +}nxa; + +typedef struct { + int n,visited; + List_T *l; +}lnk; + +int complink(const void*a, const void*b){ + lnk *q,*w; + q = (lnk*)a; + w = (lnk*)b; + return q->n-w->n; +} + +static int POINT_FINAL; +static int CONTOUR_TROUVE; +static List_T *VisitedNodes ; //geuz + +void recur_trouvecont(int ip , int ed , List_T *Liste, int gauche , List_T *old ){ + lnk lk; + nxa a; + int i,rev; + + lk.n = ip; + Tree_Query(treelink,&lk); + if(List_Nbr(lk.l) != 2 && !old)return; + for(i=0;i<List_Nbr(lk.l);i++){ + List_Read(lk.l,i,&a); + if(abs(a.a) != abs(ed)){ + if(!old || List_Search(old,&a.a,fcmp_absint) || List_Nbr(lk.l) == 2){ + if(!gauche){ + List_Add(Liste,&a.a); + if(List_Search(VisitedNodes, &a.n, fcmp_absint)){//geuz + CONTOUR_TROUVE =1;//end geuz + return;//end geuz + }//geuz + } + if(a.n == POINT_FINAL){ + CONTOUR_TROUVE = 1; + } + else{ + recur_trouvecont(a.n,abs(a.a),Liste,gauche,old); + } + if(gauche){ + rev = -a.a; + List_Add(Liste,&rev); + List_Add(VisitedNodes, &a.n); //geuz + } + } + } + } +} + + +void recur_trouvevol(int ifac , int iedge, List_T *Liste, List_T *old , + Tree_T *treeedges, Tree_T *treefaces){ + + lnk lk; + nxa a; + int i,is,rev,l; + Curve *c; + Surface *s = FindSurface(abs(ifac),THEM); + + for(l=0;l<List_Nbr(s->s.Generatrices);l++){ + List_Read(s->s.Generatrices,l,&c); + lk.n = abs(c->Num); + is = lk.n; + if(!Tree_Search(treeedges,&is)){ + Tree_Add(treeedges,&is); + } + else{ + Tree_Suppress(treeedges,&is); + } + Tree_Query(treelink,&lk); + if(List_Nbr(lk.l) == 2 || old){ + for(i=0;i<List_Nbr(lk.l);i++){ + List_Read(lk.l,i,&a); + if(abs(a.a) != abs(ifac)){ + if(!Tree_Search(treefaces,&a.a)){ + Tree_Add(treefaces,&a.a); + if(!old || List_Search(old,&a.a,fcmp_absint) || List_Nbr(lk.l) == 2){ + rev = abs(a.a); + List_Add(Liste,&rev); + recur_trouvevol(rev,is,Liste,old,treeedges,treefaces); + } + } + } + } + } + } +} + + +void BegEndCurve (Curve *c, int *ip1, int *ip2){ + *ip1 = c->beg->Num; + *ip2 = c->end->Num; +} + +void CreeLiens ( void ) { + int i,is,ip1,ip2; + lnk li,*pli; + nxa na1,na2; + Curve *ic; + + treelink = Tree_Create(sizeof(lnk),complink); + + List_T *temp = Tree2List(THEM->Curves); + for(i=0;i<List_Nbr(temp);i++){ + List_Read(temp,i,&ic); + if(ic->Num > 0){ + is = ic->Num; + BegEndCurve(ic,&ip1,&ip2); + + na1.a = -is; + na2.a = is; + na2.arbre = na1.arbre = li.visited = 0; + na1.n = li.n = ip1; + na2.n = ip2; + if((pli = (lnk*)Tree_PQuery(treelink,&li))){ + List_Add(pli->l,&na2); + } + else{ + li.l = List_Create(20,1,sizeof(nxa)); + List_Add(li.l,&na2); + Tree_Add(treelink,&li); + } + li.n = ip2; + if((pli = (lnk*)Tree_PQuery(treelink,&li))){ + List_Add(pli->l,&na1); + } + else{ + li.l = List_Create(20,1,sizeof(nxa)); + List_Add(li.l,&na1); + Tree_Add(treelink,&li); + } + } + } + listlink = Tree2List(treelink); +} + + +void CreeLiens2 ( void ) { + int i,k; + lnk li,*pli; + nxa na; + Surface *s; + Curve *c; + + treelink = Tree_Create(sizeof(lnk),complink); + List_T *temp = Tree2List(THEM->Surfaces); + + for(i=0;i<List_Nbr(temp);i++){ + List_Read(temp,i,&s); + if(s->Num > 0) + na.a = s->Num; + for(k=0;k<List_Nbr(s->s.Generatrices);k++){ + List_Read(s->s.Generatrices,k,&c); + li.n = abs(c->Num); + if((pli = (lnk*)Tree_PQuery(treelink,&li))){ + List_Add(pli->l,&na); + } + else{ + li.l = List_Create(20,1,sizeof(nxa)); + List_Add(li.l,&na); + Tree_Add(treelink,&li); + } + } + } + List_Delete(temp); + listlink = Tree2List(treelink); +} + + +int alledgeslinked ( int ed , List_T *Liste , List_T *old){ + + int ip1,ip2,i,rev; + lnk lk; + nxa a; + + VisitedNodes = List_Create(20,20,sizeof(int)); //geuz + + CreeLiens(); + + Curve *c,C; + c = &C; + c->Num = ed; + Tree_Query(THEM->Curves,&c); + + BegEndCurve(c,&ip1,&ip2); + + CONTOUR_TROUVE = 0; + + POINT_FINAL = ip2; + recur_trouvecont(ip1,ed,Liste,1,old); + + if(old){ + List_Sort(old,fcmp_absint); + } + + lk.n = ip2; + Tree_Query(treelink,&lk); + for(i=0;i<List_Nbr(lk.l);i++){ + List_Read(lk.l,i,&a); + if(abs(a.a) == abs(ed)){ + rev = -a.a; + List_Add(Liste,&rev); + } + } + + + if(!CONTOUR_TROUVE){ + POINT_FINAL = ip1; + recur_trouvecont(ip2,ed,Liste,0,old); + } + + List_Delete(VisitedNodes); //geuz + + return(CONTOUR_TROUVE); +} + + +int allfaceslinked (int iz , List_T *Liste , List_T *old){ + + CreeLiens2(); + treeedges = Tree_Create(sizeof(int),fcmp_absint); + treefaces = Tree_Create(sizeof(int),fcmp_absint); + + Tree_Add(treefaces,&iz); + List_Add(Liste,&iz); + recur_trouvevol(iz,0,Liste,old,treeedges,treefaces); + + if(!Tree_Nbr(treeedges)){ + CONTOUR_TROUVE = 1; + } + else{ + CONTOUR_TROUVE = 0; + } + + Tree_Delete(treeedges); + Tree_Delete(treefaces); + + return(CONTOUR_TROUVE); +} + +void PremierVolume(int iSurf, int *iVol){ + int i,j; + Surface *sur; + Volume *vol; + + *iVol = 0; + + List_T *temp = Tree2List(THEM->Volumes); + for(i=0;i<List_Nbr(temp);i++){ + List_Read(temp,i,&vol); + for(j=0;j<List_Nbr(vol->Surfaces);j++){ + List_Read(vol->Surfaces,j,&sur); + if(abs(sur->Num) == iSurf){ + List_Delete(temp); + *iVol = i+1; + return; + } + } + } + List_Delete(temp); +} + +/* Gestion des entites visibles */ + +extern Tree_T *EntitesVisibles; + +typedef struct{ + int Entite; + int Visible; +}EntiteVisible; + +int compareEntiteVisible(const void *a, const void *b){ + EntiteVisible *q,*w; + q = (EntiteVisible*)a; + w = (EntiteVisible*)b; + return(q->Entite-w->Entite); +} + +int EntiteEstElleVisible(int iEnt){ + EntiteVisible e; + e.Entite = iEnt; + if(Tree_Query(EntitesVisibles,&e)) + return e.Visible; + return 1; +} + +void ToutesLesEntitesRelatives(int iEnt, Tree_T *Tree, int add_rem){ + int i; + EntiteVisible e; + + Surface *s; + Volume *v; + Curve *c; + + if((c = FindCurve(iEnt,THEM))){ + } + else if((s = FindSurface(iEnt,THEM))){ + for(i=0;i<List_Nbr(s->s.Generatrices);i++){ + List_Read(s->s.Generatrices,i,&c); + e.Entite = abs(c->Num); + e.Visible = add_rem; + Tree_Replace(Tree,&e); + } + } + else if((v = FindVolume(iEnt,THEM))){ + for(i=0;i<List_Nbr(v->Surfaces);i++){ + List_Read(v->Surfaces,i,&s); + e.Entite = abs(s->Num); + e.Visible = add_rem; + Tree_Replace(Tree,&e); + } + } + + e.Entite = abs(iEnt); + e.Visible = add_rem; + Tree_Replace(Tree,&e); +} + +void RemplirEntitesVisibles (int add_rem){ + int i; + Volume *v; + Surface *s; + Curve *c; + + List_T *ListVolumes = Tree2List (THEM->Volumes); + List_T *ListSurfaces = Tree2List (THEM->Surfaces); + List_T *ListCurves = Tree2List (THEM->Curves); + EntitesVisibles = Tree_Create(sizeof(EntiteVisible),compareEntiteVisible); + for(i=0;i<List_Nbr(ListVolumes);i++){ + List_Read(ListVolumes,i,&v); + ToutesLesEntitesRelatives(v->Num,EntitesVisibles,add_rem); + } + for(i=0;i<List_Nbr(ListSurfaces);i++){ + List_Read(ListSurfaces,i,&s); + ToutesLesEntitesRelatives(s->Num,EntitesVisibles,add_rem); + } + for(i=0;i<List_Nbr(ListCurves);i++){ + List_Read(ListCurves,i,&c); + ToutesLesEntitesRelatives(c->Num,EntitesVisibles,add_rem); + } + List_Delete(ListVolumes); + List_Delete(ListSurfaces); + List_Delete(ListCurves); +} diff --git a/Geo/Verif.h b/Geo/Verif.h new file mode 100644 index 0000000000000000000000000000000000000000..dc51b6d7fe00574d8b64f017a19e4ba1d3ed127a --- /dev/null +++ b/Geo/Verif.h @@ -0,0 +1,11 @@ +#ifndef _VERIF_H_ +#define _VERIF_H_ + +int alledgeslinked (int ed, List_T * Liste, List_T * old); +int allfaceslinked (int iz, List_T * Liste, List_T * old); + +int EntiteEstElleVisible(int iEnt); +void RemplirEntitesVisibles (int add_rem); +void ToutesLesEntitesRelatives(int iEnt, Tree_T *Tree, int add_rem); + +#endif diff --git a/Graphics/ColorTable.cpp b/Graphics/ColorTable.cpp new file mode 100644 index 0000000000000000000000000000000000000000..129a745f9297834c8c04f367695432a24cd139d3 --- /dev/null +++ b/Graphics/ColorTable.cpp @@ -0,0 +1,205 @@ + +#include "Gmsh.h" +#include "ColorTable.h" +#include "Context.h" + +extern Context_T CTX ; + +void color_table_init_param(int number, ColorTable *ct, int rgb_flag, int alpha_flag){ + + ct->ipar[COLORTABLE_NUMBER] = number; + + if(rgb_flag) { + ct->ipar[COLORTABLE_INVERT] = 0; + ct->ipar[COLORTABLE_SWAP] = 0; + ct->ipar[COLORTABLE_ROTATE] = 0; + + ct->fpar[COLORTABLE_CURVE] = 0.0; + ct->fpar[COLORTABLE_BIAS] = 0.0; + ct->fpar[COLORTABLE_BETA] = 0.0; + } + if(alpha_flag) { + ct->fpar[COLORTABLE_ALPHAPOW] = 2.; + ct->fpar[COLORTABLE_ALPHAVAL] = 255.; + } + +} + +void color_table_recompute(ColorTable *ct, int rgb_flag, int alpha_flag){ + float curve, bias; + double gamma; + int i,r,g,b,a,rotate; + float s,t; + + ct->ipar[COLORTABLE_CHANGED] = 1 ; + + bias = ct->fpar[COLORTABLE_BIAS]; + curve = ct->fpar[COLORTABLE_CURVE]; + rotate = ct->ipar[COLORTABLE_ROTATE]; + + for (i=0 ; i<ct->size ; i++) { + + if(i+rotate<0) + s = (float) (i+rotate+ct->size) / (float) (ct->size-1); + else if(i+rotate>ct->size-1) + s = (float) (i+rotate-ct->size) / (float) (ct->size-1); + else + s = (float) (i+rotate) / (float) (ct->size-1); + + if(ct->ipar[COLORTABLE_SWAP]) s = 1.0 - s; + + if (rgb_flag) { + + switch(ct->ipar[COLORTABLE_NUMBER]){ + case 1 : /* vis5d */ + t = (curve+1.4) * (s - (1.+bias)/2.); + r = (int)( 128.0 + 127.0 * atan( 7.0*t ) / 1.57 ); + g = (int)( 128.0 + 127.0 * (2 * exp(-7*t*t) - 1) ); + b = (int)( 128.0 + 127.0 * atan( -7.0*t ) / 1.57 ); + break; + case 2: /* samcef */ + if (s-bias<=0.00){ + r = 0 ; g = 0 ; b = 255 ; + } + else if(s-bias<=0.40){ + r = 0 ; g = (int)((s-bias)*637.5) ; b = (int)(255.-(s-bias)*637.5) ; + } + else if(s-bias<=0.60){ + r = (int)(1275.*(s-bias-0.4)) ; g = 255 ; b = 0 ; + } + else if(s-bias<=1.00){ + r = 255 ; g = (int)(255.-637.5*(s-bias-0.6)) ; b = 0 ; + } + else { + r = 255 ; g = 0 ; b = 0 ; + } + break; + case 3: /* rainbow */ + if (s-bias<=0.00) { + r = 0 ; g = 0 ; b = 255 ; + } + else if(s-bias<=0.25+curve){ + r = 0 ; g = (int)((s-bias)*(255./(0.25+curve))) ; b = 255 ; + } + else if(s-bias<=0.50) { + r = 0 ; g = 255 ; b = (int)(255.-(255./(0.25-curve))*(s-bias-0.25-curve)); + } + else if(s-bias<=0.75-curve){ + r = (int)((s-bias-0.5)*(255./(0.25-curve))); g = 255 ; b = 0 ; + } + else if(s-bias<=1.00) { + r = 255; g = (int)(255.-(255./(0.25+curve))*(s-bias-0.75+curve)) ; b = 0 ; + } + else { + r = 255 ; g = 0 ; b = 0 ; + } + break; + case 4: /* blue-yellow-white */ +#define myfct(a,b,c,d) ((a)+\ + (b)*(s-bias)+\ + (c)*(s-bias)*(s-bias)+\ + (d)*(s-bias)*(s-bias)*(s-bias)) +#define clamp(x) x = (x)<0?0:((x)>255?255:(x)) + r = (int)(255. * myfct(-0.0506169, 2.81633, -1.87033, 0.0524573) ); + g = (int)(255. * myfct(0.0485868, -1.26109, 6.3074, -4.12498) ); + b = (int)(255. * myfct(0.364662, 1.50814, -7.36756, 6.51847 ) ); + clamp(r); clamp(g); clamp(b); +#undef myfct +#undef clamp + break; + case 5: /* grayscale */ + if (s-bias<=0.00){ r = g = b = 0 ; } + else if (s-bias<=1.00){ r = g = b = (int)(255*(s-bias)); } + else { r = g = b = 255 ; } + break; + case 6: /* monochrome */ + r = g = b = 0 ; + break; + default: /* grayscale without white */ + if (s-bias<=0.00){ r = g = b = 0 ; } + else if (s-bias<=1.00){ r = g = b = (int)(220*(s-bias)); } + else { r = g = b = 220 ; } + break; + } + + if(ct->fpar[COLORTABLE_BETA]){ + if(ct->fpar[COLORTABLE_BETA] > 0.0) + gamma = 1. - ct->fpar[COLORTABLE_BETA]; + else + gamma = 1./(1.001 + ct->fpar[COLORTABLE_BETA]); + r = (int)( 255. * pow((double)r/255.,gamma) ); + g = (int)( 255. * pow((double)g/255.,gamma) ); + b = (int)( 255. * pow((double)b/255.,gamma) ); + } + + if(ct->ipar[COLORTABLE_INVERT]){ + r = 255-r ; + g = 255-g ; + b = 255-b ; + } + + } + else { + r = UNPACK_RED( ct->table[i] ); + g = UNPACK_GREEN( ct->table[i] ); + b = UNPACK_BLUE( ct->table[i] ); + } + + if (alpha_flag) { + if (ct->fpar[COLORTABLE_ALPHAVAL]<0) { + a = (int)( 255.0 * pow( s, ct->fpar[COLORTABLE_ALPHAPOW] ) ); + } + else { + a = (int)( ct->fpar[COLORTABLE_ALPHAVAL] ); + } + } + else { + a = UNPACK_ALPHA( ct->table[i] ); + } + + ct->table[i] = PACK_COLOR( r, g, b, a ); + } + +} + + +/* + * File format is ASCII: + * $COL + * <table_size> + * <r> <g> <b> <a> - n lines of rgba values as integers in [0,255] + * ..... + * <r> <g> <b> <a> + */ +void save_color_table(FILE *fp, ColorTable *ct){ + int i, r, g, b, a; + + fprintf(fp, "$COL\n"); + fprintf(fp, "%d\n", ct->size); + for (i=0;i<ct->size;i++) { + r = UNPACK_RED( ct->table[i] ); + g = UNPACK_GREEN( ct->table[i] ); + b = UNPACK_BLUE( ct->table[i] ); + a = UNPACK_ALPHA( ct->table[i] ); + fprintf(fp, "%d %d %d %d\n", r, g, b, a ); + } +} + +void load_color_table(FILE *fp, ColorTable *ct){ + int i, r, g, b, a; + + fscanf(fp, "$COL\n"); + fscanf(fp, "%d\n", &ct->size); + + if(ct->size>COLORTABLE_NBMAX_COLOR){ + Msg(ERROR, "Too many colors in ColorTable (%d > %d)", + ct->size, COLORTABLE_NBMAX_COLOR); + return; + } + + for (i=0;i<ct->size;i++) { + fscanf(fp, "%d %d %d %d\n", &r, &g, &b, &a); + ct->table[i] = PACK_COLOR(r, g, b, a); + } +} + diff --git a/Graphics/ColorTable.h b/Graphics/ColorTable.h new file mode 100644 index 0000000000000000000000000000000000000000..c2dd893324ab37cfb5c9cfe63cfed6e3f47f0594 --- /dev/null +++ b/Graphics/ColorTable.h @@ -0,0 +1,43 @@ +#ifndef _COLORTABLE_H_ +#define _COLORTABLE_H_ + +#define COLORTABLE_NBMAX_PARAM 10 +#define COLORTABLE_NBMAX_COLOR 255 + +typedef struct{ + unsigned int table[COLORTABLE_NBMAX_COLOR]; + int size; + int ipar[COLORTABLE_NBMAX_PARAM]; + float fpar[COLORTABLE_NBMAX_PARAM]; +}ColorTable; + + +/* COLORTABLE_MODE */ + +#define COLORTABLE_RGB 1 +#define COLORTABLE_HSV 2 + + +/* integrer parameters indices */ + +#define COLORTABLE_NUMBER 0 /* predefined curve index */ +#define COLORTABLE_CHANGED 1 /* did the colortable change ? */ +#define COLORTABLE_INVERT 2 /* invert (rbg<->255-rgb) */ +#define COLORTABLE_SWAP 3 /* swap (min<->max) */ +#define COLORTABLE_ROTATE 4 /* rotate */ +#define COLORTABLE_MODE 5 /* mode (rgb, hsv) */ + +/* float parameters indices */ + +#define COLORTABLE_CURVE 0 /* curvature */ +#define COLORTABLE_BIAS 1 /* offset */ +#define COLORTABLE_ALPHAPOW 2 /* alpha channel power */ +#define COLORTABLE_ALPHAVAL 3 /* alpha channel value */ +#define COLORTABLE_BETA 4 /* beta coeff for brighten */ + +void color_table_init_param (int number, ColorTable * ct, int rgb_flag, int alpha_flag); +void color_table_recompute (ColorTable * ct, int rgb_flag, int alpha_flag); +void load_color_table(FILE *fp, ColorTable *ct); +void save_color_table(FILE *fp, ColorTable *ct) ; + +#endif diff --git a/Graphics/Draw.cpp b/Graphics/Draw.cpp new file mode 100644 index 0000000000000000000000000000000000000000..81b4ac75b0d6f65b630dd1526a13640426c0955c --- /dev/null +++ b/Graphics/Draw.cpp @@ -0,0 +1,449 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Context.h" +#include "MinMax.h" + +#ifdef _UNIX +#include "Widgets.h" +#include "XContext.h" +extern XContext_T XCTX ; +extern Widgets_T WID ; +#endif + +void set_r(int i, double val); +void set_t(int i, double val); +void set_s(int i, double val); + +extern Context_T CTX ; +extern GLdouble vxmin, vxmax, vymin, vymax; +extern Mesh M; +extern double LC; +extern int BD_EXISTS, EXPOSE; +extern List_T *Post_ViewList; + +/* ------------------------------------------------------------------------ */ +/* d r a w */ +/* ------------------------------------------------------------------------ */ + +void Draw3d(void){ + if(CTX.alpha){ + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glEnable(GL_ALPHA); + } + else{ + glDisable(GL_BLEND); + glDisable(GL_ALPHA); + } + glPolygonOffset(1.0, 1); + glEnable(GL_CLIP_PLANE0); + + /* This is sufficient, since we NEVER give different normals to nodes of one polygon */ + glShadeModel(GL_FLAT); //glShadeModel(GL_SMOOTH); + glDepthFunc(GL_LESS); + glEnable(GL_DEPTH_TEST); + + /* glEnable(GL_CULL_FACE); */ + + glPushMatrix(); + Draw_Mesh(&M); + glPopMatrix(); +} + +void Draw2d(void){ + glDisable(GL_CLIP_PLANE0); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + glShadeModel(GL_FLAT); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + /* to draw directly in screen coords */ + glOrtho((double)CTX.viewport[0], + (double)CTX.viewport[2], + (double)CTX.viewport[1], + (double)CTX.viewport[3],-1.,1.); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glPushMatrix(); + if(CTX.post.scales) Draw_Scales(); + if(CTX.little_axes) Draw_SmallAxes(); + glPopMatrix(); +} + +#ifdef _UNIX +void Draw(void){ + glClearColor(UNPACK_RED(CTX.color.bg)/255., + UNPACK_GREEN(CTX.color.bg)/255., + UNPACK_BLUE(CTX.color.bg)/255., + 0.); + glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); + if(CTX.db) glDrawBuffer(GL_BACK); + Draw3d(); + Draw2d(); + glFlush(); + if(CTX.db) glXSwapBuffers(XCTX.display,XtWindow(WID.G.glw)); +} +#else +void Draw(void){ + if(CTX.db) glDrawBuffer(GL_BACK); + glClearColor(UNPACK_RED(CTX.color.bg)/255., + UNPACK_GREEN(CTX.color.bg)/255., + UNPACK_BLUE(CTX.color.bg)/255., + 0.); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + Draw3d(); + Draw2d(); + glFlush(); + if(CTX.db) MySwapBuffers(); + if(CTX.db) glDrawBuffer(GL_FRONT); +} +#endif + +/* ------------------------------------------------------------------------ */ +/* o r t h o */ +/* ------------------------------------------------------------------------ */ + +void Orthogonalize(int x, int y){ + double Va,Wa; + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + if(CTX.render_mode == GMSH_SELECT) + gluPickMatrix ((GLdouble)x, + (GLdouble)(CTX.viewport[3]-y), + 5.0, + 5.0, + CTX.viewport); + + Va = (GLdouble)(CTX.viewport[3]-CTX.viewport[1]) / + (GLdouble)(CTX.viewport[2]-CTX.viewport[0]) ; + + Wa = (CTX.max[1]-CTX.min[1]) / (CTX.max[0]-CTX.min[0]); + + if(Va>Wa){ + vxmin = CTX.min[0]; + vxmax = CTX.max[0]; + vymin = 0.5*(CTX.min[1]+CTX.max[1]-Va*(CTX.max[0]-CTX.min[0])); + vymax = 0.5*(CTX.min[1]+CTX.max[1]+Va*(CTX.max[0]-CTX.min[0])); + } + else{ + vxmin = 0.5*(CTX.min[0]+CTX.max[0]-(CTX.max[1]-CTX.min[1])/Va); + vxmax = 0.5*(CTX.min[0]+CTX.max[0]+(CTX.max[1]-CTX.min[1])/Va); + vymin = CTX.min[1]; + vymax = CTX.max[1]; + } + vxmin -= (vxmax-vxmin)/3.; vxmax += 0.25*(vxmax-vxmin); + vymin -= (vymax-vymin)/3.; vymax += 0.25*(vymax-vymin); + + CTX.pixel_equiv_x = (vxmax-vxmin)/(CTX.viewport[2]-CTX.viewport[0]); + CTX.pixel_equiv_y = (vymax-vymin)/(CTX.viewport[3]-CTX.viewport[1]); + + if(CTX.ortho) { + glOrtho(vxmin,vxmax,vymin,vymax,0,100*LC); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslated(0.0, 0.0, -50*LC); + } + else{ + glFrustum(vxmin,vxmax,vymin,vymax,LC,100*LC); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslated(0.0, 0.0, -10*LC); + glScaled(10.,10.,10.); + } + + +} + + +/* ------------------------------------------------------------------------ */ +/* i n i t */ +/* ------------------------------------------------------------------------ */ + +void Init(void){ + /* + Attention: + X11 interdit de changer le contexte (GLX) en mode GL_FEEDBACK ou GL_SELECT, + ce qui serait le cas pour les sorties postscript... + */ +#ifdef _UNIX + if(CTX.stream == TO_SCREEN) + glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context); +#endif + Orthogonalize(0,0); +} + +void InitOv(void){ +#ifdef _UNIX + glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context); +#endif + Orthogonalize(0,0); +} + +void InitShading(void){ + GLfloat specular[4]; + + glLightfv(GL_LIGHT0, GL_POSITION, CTX.light0); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_NORMALIZE); + + /* simple color commands will automatically create appropriate materials */ + glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); + glEnable(GL_COLOR_MATERIAL); + + /* let's add some shininess to all these automatically created materials */ + glMaterialf(GL_FRONT, GL_SHININESS, 40.); + specular[0] = CTX.shine; + specular[1] = CTX.shine; + specular[2] = CTX.shine; + specular[3] = 1.0; + glMaterialfv(GL_FRONT, GL_SPECULAR, specular); +} + + +void InitNoShading(void){ + glDisable(GL_LIGHTING); +} + +void InitPosition(void){ + glScaled (CTX.s[0], CTX.s[1], CTX.s[2]); + glTranslated(CTX.t[0], CTX.t[1], CTX.t[2]); + glRotated (CTX.r[0], 1., 0., 0.); + glRotated (CTX.r[1], 0., 1., 0.); + glRotated (CTX.r[2], 0., 0., 1.); +} + +/* ------------------------------------------------------------------------ */ +/* r e p l o t */ +/* ------------------------------------------------------------------------ */ + +/* n'est plus utilise que dans les cas ou des points peuvent etre + ajoutes dans la base de donnee -> dans cb_geom */ +void Replot(void){ + CalculateMinMax(M.Points); + Init(); + Draw(); +} + +/* ------------------------------------------------------------------------ */ +/* e n t i t y s e l e c t i o n */ +/* ------------------------------------------------------------------------ */ + +void process_selection(int x, int y, int *n, GLuint *ii, GLuint *jj){ + GLuint selectBuf[SELECTION_BUFFER_SIZE]; + GLint i,j,hits,names,*ptr; + + glSelectBuffer(SELECTION_BUFFER_SIZE, selectBuf); + + glRenderMode(GL_SELECT); + CTX.render_mode = GMSH_SELECT; + + glInitNames(); + glPushName(0); + + glPushMatrix(); + Orthogonalize(x,y); + Draw_Mesh(&M); + glPopMatrix (); + + hits = glRenderMode(GL_RENDER); + CTX.render_mode = GMSH_RENDER ; + + if(hits<0) return; /* Selection Buffer Overflow */ + + ptr = (GLint*)selectBuf; + + for(i=0; i<hits; i++){ + names = *ptr; + ptr++; ptr++; ptr++; + for(j=0; j<names; j++){ + if (j==0) ii[i] = *ptr; + else if (j==1) jj[i] = *ptr; + ptr++; + } + } + *n = hits; +} + +void filtre_selection(int n, GLuint *typ, GLuint *ient, Vertex **thev, + Curve **thec, Surface **thes, Mesh *m){ + + Vertex *v=NULL, V; + Curve *c=NULL, C; + Surface *s=NULL, S; + + int i; + GLuint typmin; + + typmin = 4; + for(i=0;i<n;i++){ + if(typ[i]<typmin) typmin = typ[i]; + } + + for(i=0;i<n;i++){ + if(typ[i] == typmin){ + switch(typ[i]){ + case 0: + v = &V; + v->Num = ient[i]; + if(Tree_Query(m->Points,&v)){ + *thev = v; + } + break; + case 1: + c = &C; + c->Num = ient[i]; + if(Tree_Query(m->Curves,&c)){ + *thec = c; + } + break; + case 2: + s = &S; + s->Num = ient[i]; + if(Tree_Query(m->Surfaces,&s)){ + *thes = s; + } + break; + } + } + } +} + + +#ifdef _UNIX + +int check_type(int type, Vertex *v, Curve *c, Surface *s){ + return ( (type==ENT_POINT && v) || + (type==ENT_LINE && c) || + (type==ENT_SURFACE && s) ) ; +} + +int SelectEntity(int type, Vertex **v, Curve **c, Surface **s){ + XEvent event; + XComposeStatus stat; + KeySym keysym; + int hits; + GLuint ii[SELECTION_BUFFER_SIZE],jj[SELECTION_BUFFER_SIZE]; + char buf[100]; + + *v = NULL; + *c = NULL; + *s = NULL; + + while(1){ + XtAppNextEvent(XCTX.AppContext,&event); + XtDispatchEvent(&event); + switch(event.type){ + case KeyPress : + XLookupString(&event.xkey, buf, sizeof(buf), &keysym, &stat); + if(keysym == XK_q) return(0); + if(keysym == XK_e) return(-1); + break; + case ButtonPress : + process_selection(event.xbutton.x, event.xbutton.y, &hits, ii, jj); + filtre_selection(hits,ii,jj,v,c,s,&M); + if(check_type(type,*v,*c,*s)){ + begin_highlight(); + highlight_entity(*v,*c,*s,1); + end_highlight(1); + return(event.xbutton.button); + } + } + } +} + +#else + +int SelectEntity(int x, int y, Vertex **v, Curve **c, Surface **s){ + int hits,i,j; + GLuint ii[SELECTION_BUFFER_SIZE],jj[SELECTION_BUFFER_SIZE]; + + process_selection(x, y, &hits, ii, jj); + *v = NULL; + *s = NULL; + *c = NULL; + filtre_selection(hits,ii,jj,v,c,s,&M); + begin_highlight(); + highlight_entity(*v,*c,*s,1); + end_highlight(1); + return(1); +} + +#endif + + +/* ------------------------------------------------------------------------ */ +/* z o o m */ +/* ------------------------------------------------------------------------ */ + + +void myZoom(GLdouble X1, GLdouble X2, GLdouble Y1, GLdouble Y2, + GLdouble Xc1, GLdouble Xc2, GLdouble Yc1, GLdouble Yc2){ + GLdouble xscale1, yscale1; + + xscale1 = CTX.s[0]; + yscale1 = CTX.s[1]; + set_s(0, CTX.s[0] * (vxmax-vxmin)/(X2-X1)); + set_s(1, CTX.s[1] * (vymax-vymin)/(Y1-Y2)); + /* bif bif bif */ + set_s(2, 0.5*(CTX.s[0]+CTX.s[1])); + set_t(0, CTX.t[0] * (xscale1/CTX.s[0]) - ((Xc1+Xc2)/2.)*(1.-(xscale1/CTX.s[0]))); + set_t(1, CTX.t[1] * (yscale1/CTX.s[1]) - ((Yc1+Yc2)/2.)*(1.-(yscale1/CTX.s[1]))); + Init(); + Draw(); +} + +/* ------------------------------------------------------------------------ */ +/* InitCb, ResizeCb, ExposeCb */ +/* ------------------------------------------------------------------------ */ + +#ifdef _UNIX + +void InitCb(Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *cb){ + glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context); + CTX.viewport[0] = 0 ; + CTX.viewport[1] = 0 ; + CTX.viewport[2] = cb->width ; + CTX.viewport[3] = cb->height ; + glViewport(CTX.viewport[0], + CTX.viewport[1], + CTX.viewport[2], + CTX.viewport[3]); +} + +void ResizeCb(Widget w,XtPointer client_data, GLwDrawingAreaCallbackStruct *cb){ + CTX.viewport[0] = 0 ; + CTX.viewport[1] = 0 ; + CTX.viewport[2] = cb->width ; + CTX.viewport[3] = cb->height ; + glViewport(CTX.viewport[0], + CTX.viewport[1], + CTX.viewport[2], + CTX.viewport[3]); + Init(); + Draw(); + if(CTX.overlay) InitOv(); +} + +void ExposeCb(Widget w,XtPointer client_data, GLwDrawingAreaCallbackStruct *cb){ + + /* compress incoming events as much as possible */ + if(cb->event->xexpose.count != 0){ + return; + } + + if(!BD_EXISTS || !EXPOSE) return; + Init(); + Draw(); + +} + +#endif diff --git a/Graphics/Draw.h b/Graphics/Draw.h new file mode 100644 index 0000000000000000000000000000000000000000..c3e2fb2a16a7cae3416152a3fdc76b5127dd060d --- /dev/null +++ b/Graphics/Draw.h @@ -0,0 +1,114 @@ +#ifndef _DRAW_H_ +#define _DRAW_H_ + +#include "Views.h" + +#define GMSH_RENDER 1 +#define GMSH_SELECT 2 +#define GMSH_FEEDBACK 3 + +#define TO_SCREEN 1 +#define TO_FILE 2 + +#define XDUMP 1 +#define GLPPAINTER 2 +#define GLPRECURSIVE 3 +#define GLPIMAGE 4 +#define GLPRPAINTER 5 +#define GLPRRECURSIVE 6 +#define GIF 7 + +#define FORMAT_XPM 1 +#define FORMAT_PS 2 +#define FORMAT_EPS 3 +#define FORMAT_HPGL 4 +#define FORMAT_CGM 5 +#define FORMAT_BMP 6 +#define FORMAT_GIF 7 + +#define FORMAT_MSH 1 +#define FORMAT_UNV 2 +#define FORMAT_GREF 3 + +#define COLOR 1 +#define COLOR_INV 2 +#define GRAYSCALE 3 +#define GRAYSCALE_INV 4 +#define BLACKWHITE 5 + +void Init(void); +void InitOv(void); +void InitShading(void); +void InitNoShading(void); +void InitPosition(void); + +void Replot(void); + +void RaiseFill (int i, double Val, double ValMin, double Raise[3][5]); +void Palette (Post_View * View, int nbi, int i); +void Palette2 (Post_View * View, double min, double max, double val); +void ColorSwitch(int i); + +int SelectEntity(int type, Vertex **v, Curve **c, Surface **s); +void ZeroHighlight(Mesh *m); +void begin_highlight(void); +void end_highlight(int permanent); +void highlight_entity(Vertex *v,Curve *c, Surface *s, int permanent); +void highlight_entity_num(int v, int c, int s, int permanant); + +void Draw3d(void); +void Draw2d(void); +void Draw(void); + +void Draw_String(char *s); +void Draw_Geom (Mesh *m); +void Draw_Mesh(Mesh *M); +void Draw_Post(void); +void Draw_Scales(void); +void Draw_Axes (double s); +void Draw_SmallAxes(void); + +void Draw_Point(double *x, double *y, double *z, + double *Offset, double Raise[3][5]); + +void Draw_Line (double *x, double *y, double *z, + double *Offset, double Raise[3][5]); + +void Draw_Triangle (double *x, double *y, double *z, + double *Offset, double Raise[3][5], int shade); + +void Draw_Quadrangle (double *x, double *y, double *z, + double *Offset, double Raise[3][5], int shade); + +void Draw_Polygon (int n, double *x, double *y, double *z, + double *Offset, double Raise[3][5]); + +void Draw_Vector (int Type, int Fill, + double x, double y, double z, + double d, double dx, double dy, double dz, + double *Offset, double Raise[3][5]); + + +void Draw_Mesh_Volumes(void *a, void *b); +void Draw_Mesh_Surfaces(void *a, void *b); +void Draw_Mesh_Curves(void *a, void *b); +void Draw_Mesh_Points(void *a, void *b); + +void Draw_Simplex_Surfaces (void *a, void *b); +void Draw_Simplex_Points(void *a,void *b); +void Draw_Extruded_Surfaces(void *a, void *b); + +void Draw_Simplex_Volume (void *a, void *b); +void Draw_Hexahedron_Volume (void *a, void *b); +void Draw_Prism_Volume (void *a, void *b); + +void Draw_Post_Simplex (Post_View * View, Post_Simplex * s, + double ValMin, double ValMax, double Raise[3][5]); +void Draw_Post_Triangle (Post_View * View, Post_Triangle * t, + double ValMin, double ValMax, double Raise[3][5]); +void Draw_Post_Line (Post_View * View, Post_Line * l, + double ValMin, double ValMax, double Raise[3][5]); +void Draw_Post_Point (Post_View * View, Post_Point * p, + double ValMin, double ValMax, double Raise[3][5]); + +#endif diff --git a/Graphics/Entity.cpp b/Graphics/Entity.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8100459df0383bb3a2d29292e1d1e287c20d66a2 --- /dev/null +++ b/Graphics/Entity.cpp @@ -0,0 +1,387 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Mesh.h" +#include "Draw.h" +#include "Context.h" + +extern Context_T CTX; + +/* ------------------------------------------------------------------------ */ +/* D r a w _ P o i n t */ +/* ------------------------------------------------------------------------ */ + +void Draw_Point (double *x, double *y, double *z, + double *Offset, double Raise[3][5]){ + glBegin(GL_POINTS); + glVertex3d(x[0]+Offset[0]+Raise[0][0], + y[0]+Offset[1]+Raise[1][0], + z[0]+Offset[2]+Raise[2][0]); + glEnd(); +} + +/* ------------------------------------------------------------------------ */ +/* D r a w _ L i n e */ +/* ------------------------------------------------------------------------ */ + +void Draw_Line (double *x, double *y, double *z, + double *Offset, double Raise[3][5]){ + glBegin(GL_LINES); + glVertex3d(x[0]+Offset[0]+Raise[0][0], + y[0]+Offset[1]+Raise[1][0], + z[0]+Offset[2]+Raise[2][0]); + glVertex3d(x[1]+Offset[0]+Raise[0][1], + y[1]+Offset[1]+Raise[1][1], + z[1]+Offset[2]+Raise[2][1]); + glEnd(); +} + +/* ------------------------------------------------------------------------ */ +/* D r a w _ T r i a n g l e */ +/* ------------------------------------------------------------------------ */ + +void Draw_Triangle (double *x, double *y, double *z, + double *Offset, double Raise[3][5], int shade){ + + double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0, nn[3]; + + if (shade){ + x1x0 = (x[1]+Raise[0][1]) - (x[0]+Raise[0][0]); + y1y0 = (y[1]+Raise[1][1]) - (y[0]+Raise[1][0]); + z1z0 = (z[1]+Raise[2][1]) - (z[0]+Raise[2][0]); + x2x0 = (x[2]+Raise[0][2]) - (x[0]+Raise[0][0]); + y2y0 = (y[2]+Raise[1][2]) - (y[0]+Raise[1][0]); + z2z0 = (z[2]+Raise[2][2]) - (z[0]+Raise[2][0]); + nn[0] = y1y0 * z2z0 - z1z0 * y2y0 ; + nn[1] = z1z0 * x2x0 - x1x0 * z2z0 ; + nn[2] = x1x0 * y2y0 - y1y0 * x2x0 ; + /* BOF BOF + if(nn[2] < -0.1){ + nn[0] = -nn[0]; + nn[1] = -nn[1]; + nn[2] = -nn[2]; + } + */ + glNormal3dv(nn); + } + + glBegin(GL_TRIANGLES); + glVertex3d(x[0]+Offset[0]+Raise[0][0], + y[0]+Offset[1]+Raise[1][0], + z[0]+Offset[2]+Raise[2][0]); + glVertex3d(x[1]+Offset[0]+Raise[0][1], + y[1]+Offset[1]+Raise[1][1], + z[1]+Offset[2]+Raise[2][1]); + glVertex3d(x[2]+Offset[0]+Raise[0][2], + y[2]+Offset[1]+Raise[1][2], + z[2]+Offset[2]+Raise[2][2]); + glEnd(); + +} + +/* ------------------------------------------------------------------------ */ +/* D r a w _ Q u a d r a n g l e */ +/* ------------------------------------------------------------------------ */ + +void Draw_Quadrangle (double *x, double *y, double *z, + double *Offset, double Raise[3][5], int shade){ + + double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0, nn[3]; + + if (shade){ + x1x0 = (x[1]+Raise[0][1]) - (x[0]+Raise[0][0]); + y1y0 = (y[1]+Raise[1][1]) - (y[0]+Raise[1][0]); + z1z0 = (z[1]+Raise[2][1]) - (z[0]+Raise[2][0]); + x2x0 = (x[2]+Raise[0][2]) - (x[0]+Raise[0][0]); + y2y0 = (y[2]+Raise[1][2]) - (y[0]+Raise[1][0]); + z2z0 = (z[2]+Raise[2][2]) - (z[0]+Raise[2][0]); + nn[0] = y1y0 * z2z0 - z1z0 * y2y0 ; + nn[1] = z1z0 * x2x0 - x1x0 * z2z0 ; + nn[2] = x1x0 * y2y0 - y1y0 * x2x0 ; + /* BOF BOF + if(nn[2] < -0.1){ + nn[0] = -nn[0]; + nn[1] = -nn[1]; + nn[2] = -nn[2]; + } + */ + glNormal3dv(nn); + } + /* dessin de quandrangles "non convexes" */ + + glBegin(GL_TRIANGLE_FAN); + glVertex3d(x[0]+Offset[0]+Raise[0][0], + y[0]+Offset[1]+Raise[1][0], + z[0]+Offset[2]+Raise[2][0]); + glVertex3d(x[1]+Offset[0]+Raise[0][1], + y[1]+Offset[1]+Raise[1][1], + z[1]+Offset[2]+Raise[2][1]); + glVertex3d(x[2]+Offset[0]+Raise[0][2], + y[2]+Offset[1]+Raise[1][2], + z[2]+Offset[2]+Raise[2][2]); + glVertex3d(x[3]+Offset[0]+Raise[0][3], + y[3]+Offset[1]+Raise[1][3], + z[3]+Offset[2]+Raise[2][3]); + glVertex3d(x[1]+Offset[0]+Raise[0][1], + y[1]+Offset[1]+Raise[1][1], + z[1]+Offset[2]+Raise[2][1]); + glEnd(); +} + +/* ------------------------------------------------------------------------ */ +/* D r a w _ P o l y g o n */ +/* ------------------------------------------------------------------------ */ + +void Draw_Polygon (int n, double *x, double *y, double *z, + double *Offset, double Raise[3][5]){ + int i; + + glBegin(GL_POLYGON); + for(i=0;i<n;i++) glVertex3d(x[i]+Offset[0]+Raise[0][i], + y[i]+Offset[1]+Raise[1][i], + z[i]+Offset[2]+Raise[2][i]); + glEnd(); +} + +/* ------------------------------------------------------------------------ */ +/* D r a w _ V e c t o r */ +/* ------------------------------------------------------------------------ */ + +void Draw_Vector (int Type, int Fill, + double x, double y, double z, + double d, double dx, double dy, double dz, + double *Offset, double Raise[3][5]){ + + double n[3],t[3],u[3]; + double l,b,c, f1, f2; + + if(d == 0.0) return; + + if(Offset != NULL && Raise != NULL){ + x += Offset[0]+Raise[0][0] ; + y += Offset[1]+Raise[1][0] ; + z += Offset[2]+Raise[2][0] ; + } + + if(Type == DRAW_POST_SEGMENT){ + glBegin(GL_LINES); + glVertex3d(x, y, z); + glVertex3d(x+dx, y+dy, z+dz); + glEnd(); + return; + } + + n[0] = dx/d ; n[1] = dy/d ; n[2] = dz/d ; + + if( (fabs(n[0]) >= fabs(n[1]) && fabs(n[0]) >= fabs(n[2])) || + (fabs(n[1]) >= fabs(n[0]) && fabs(n[1]) >= fabs(n[2])) ){ + t[0] = n[1] ; t[1] = -n[0] ; t[2] = 0. ; + } + else{ + t[0] = 0. ; t[1] = n[2] ; t[2] = -n[1] ; + } + + l = sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]); + t[0] /= l ; t[1] /= l ; t[2] /= l ; + + u[0] = n[1]*t[2]-n[2]*t[1]; + u[1] = n[2]*t[0]-n[0]*t[2]; + u[2] = n[0]*t[1]-n[1]*t[0]; + + l = sqrt(u[0]*u[0]+u[1]*u[1]+u[2]*u[2]); + u[0] /= l ; u[1] /= l ; u[2] /= l ; + + switch(Type){ + + case DRAW_POST_ARROW : + + b = 0.0666 * d; + + f1 = 0.85 ; + f2 = 0.8 ; + + + b *= 2 ; + f1 /= 1.5 ; + f2 /= 1.5 ; + + if(Fill){ + glBegin(GL_LINES); + glVertex3d(x, y, z); + glVertex3d(x+dx, y+dy, z+dz); + glEnd(); + + glBegin(GL_TRIANGLES); + glVertex3d(x+dx, y+dy, z+dz); + glVertex3d(x+f2*dx+b*(t[0]), y+f2*dy+b*(t[1]), z+f2*dz+b*(t[2])); + glVertex3d(x+f1*dx, y+f1*dy, z+f1*dz); + + glVertex3d(x+dx, y+dy, z+dz); + glVertex3d(x+f2*dx+b*(-t[0]), y+f2*dy+b*(-t[1]), z+f2*dz+b*(-t[2])); + glVertex3d(x+f1*dx, y+f1*dy, z+f1*dz); + + glVertex3d(x+dx, y+dy, z+dz); + glVertex3d(x+f2*dx+b*(-u[0]), y+f2*dy+b*(-u[1]), z+f2*dz+b*(-u[2])); + glVertex3d(x+f1*dx, y+f1*dy, z+f1*dz); + + glVertex3d(x+dx, y+dy, z+dz); + glVertex3d(x+f2*dx+b*(u[0]), y+f2*dy+b*(u[1]), z+f2*dz+b*(u[2])); + glVertex3d(x+f1*dx, y+f1*dy, z+f1*dz); + glEnd(); + } + else{ + glBegin(GL_LINE_STRIP); + glVertex3d(x, y, z); + glVertex3d(x+dx, y+dy, z+dz); + glVertex3d(x+f2*dx+b*(t[0]), y+f2*dy+b*(t[1]), z+f2*dz+b*(t[2])); + glVertex3d(x+f1*dx, y+f1*dy, z+f1*dz); + glVertex3d(x+f2*dx+b*(-t[0]), y+f2*dy+b*(-t[1]), z+f2*dz+b*(-t[2])); + glVertex3d(x+dx, y+dy, z+dz); + glVertex3d(x+f2*dx+b*(-u[0]), y+f2*dy+b*(-u[1]), z+f2*dz+b*(-u[2])); + glVertex3d(x+f1*dx, y+f1*dy, z+f1*dz); + glVertex3d(x+f2*dx+b*(u[0]), y+f2*dy+b*(u[1]), z+f2*dz+b*(u[2])); + glVertex3d(x+dx, y+dy, z+dz); + glEnd(); + } + break ; + + case DRAW_POST_ARROW_HEAD : + + + break ; + + case DRAW_POST_PYRAMID : + + b = .1333 * d; + + if(Fill){ + glBegin(GL_TRIANGLES); + glVertex3d(x+dx, y+dy, z+dz); + glVertex3d(x+b*(t[0]), y+b*(t[1]), z+b*(t[2])); + glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2])); + + glVertex3d(x+dx, y+dy, z+dz); + glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2])); + glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2])); + + glVertex3d(x+dx, y+dy, z+dz); + glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2])); + glVertex3d(x+b*(u[0]), y+b*(u[1]), z+b*(u[2])); + + glVertex3d(x+dx, y+dy, z+dz); + glVertex3d(x+b*(u[0]), y+b*(u[1]), z+b*(u[2])); + glVertex3d(x+b*(t[0]), y+b*(t[1]), z+b*(t[2])); + glEnd(); + } + else{ + glBegin(GL_LINE_LOOP); + glVertex3d(x+b*(t[0]), y+b*(t[1]), z+b*(t[2])); + glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2])); + glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2])); + glVertex3d(x+b*(u[0]), y+b*(u[1]), z+b*(u[2])); + glEnd(); + + glBegin(GL_LINES); + glVertex3d(x+b*(t[0]), y+b*(t[1]), z+b*(t[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d (x+b*(u[0]), y+b*(u[1]), z+b*(u[2])); + glVertex3d(x+dx, y+dy, z+dz); + glEnd(); + } + break ; + + case DRAW_POST_CONE : + + b = .1333 * d; + c = .7071 * b; + + if(Fill){ + glBegin(GL_TRIANGLES); + glVertex3d(x+b*(t[0]), y+b*(t[1]), z+b*(t[2])); + glVertex3d(x+c*(t[0]-u[0]), y+c*(t[1]-u[1]), z+c*(t[2]-u[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+c*(t[0]-u[0]), y+c*(t[1]-u[1]), z+c*(t[2]-u[2])); + glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2])); + glVertex3d(x+c*(-t[0]-u[0]), y+c*(-t[1]-u[1]), z+c*(-t[2]-u[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+c*(-t[0]-u[0]), y+c*(-t[1]-u[1]), z+c*(-t[2]-u[2])); + glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2])); + glVertex3d(x+c*(u[0]-t[0]), y+c*(u[1]-t[1]), z+c*(u[2]-t[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+c*(u[0]-t[0]), y+c*(u[1]-t[1]), z+c*(u[2]-t[2])); + glVertex3d(x+b*(u[0]), y+b*(u[1]), z+b*(u[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+b*(u[0]), y+b*(u[1]), z+b*(u[2])); + glVertex3d(x+c*(t[0]+u[0]), y+c*(t[1]+u[1]), z+c*(t[2]+u[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+c*(t[0]+u[0]), y+c*(t[1]+u[1]), z+c*(t[2]+u[2])); + glVertex3d(x+b*(t[0]), y+b*(t[1]), z+b*(t[2])); + glVertex3d(x+dx, y+dy, z+dz); + glEnd(); + } + else{ + glBegin(GL_LINE_LOOP); + glVertex3d(x+b*(t[0]), y+b*(t[1]), z+b*(t[2])); + glVertex3d(x+c*(t[0]-u[0]), y+c*(t[1]-u[1]), z+c*(t[2]-u[2])); + glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2])); + glVertex3d(x+c*(-t[0]-u[0]), y+c*(-t[1]-u[1]), z+c*(-t[2]-u[2])); + glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2])); + glVertex3d(x+c*(u[0]-t[0]), y+c*(u[1]-t[1]), z+c*(u[2]-t[2])); + glVertex3d(x+b*(u[0]), y+b*(u[1]), z+b*(u[2])); + glVertex3d(x+c*(t[0]+u[0]), y+c*(t[1]+u[1]), z+c*(t[2]+u[2])); + glEnd(); + + glBegin(GL_LINES); + glVertex3d(x+b*(t[0]), y+b*(t[1]), z+b*(t[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+c*(t[0]-u[0]), y+c*(t[1]-u[1]), z+c*(t[2]-u[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+c*(-t[0]-u[0]), y+c*(-t[1]-u[1]), z+c*(-t[2]-u[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+c*(u[0]-t[0]), y+c*(u[1]-t[1]), z+c*(u[2]-t[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+b*(u[0]), y+b*(u[1]), z+b*(u[2])); + glVertex3d(x+dx, y+dy, z+dz); + + glVertex3d(x+c*(t[0]+u[0]), y+c*(t[1]+u[1]), z+c*(t[2]+u[2])); + glVertex3d(x+dx, y+dy, z+dz); + glEnd(); + } + break ; + + default : + //gprintf("Unknown Type of Vector Field Type : %d", Type); + exit(1); + + } + +} + diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d42c96054306d343cfdc5f17f0cfb0c969b7e521 --- /dev/null +++ b/Graphics/Geom.cpp @@ -0,0 +1,951 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Context.h" +#include "Verif.h" +#include "Interpolation.h" +#include "Numeric.h" + +extern Context_T CTX; + +extern Mesh *THEM; +extern double LC; + +/* ------------------------------------------------------------------------ */ +/* D r a w _ P o i n t */ +/* ------------------------------------------------------------------------ */ + +static int Highlighted = 0; + +void Draw_Point (void *a, void *b){ + Vertex **v; + char Num[100]; + + v = (Vertex**)a; + + if(CTX.render_mode == GMSH_SELECT){ + glLoadName(0); + glPushName((*v)->Num); + } + + if((*v)->Frozen){ + glPointSize(5); + glColor4ubv((GLubyte*)&CTX.color.geom.point_sel); + } + else if(Highlighted){ + glPointSize(5); + glColor4ubv((GLubyte*)&CTX.color.geom.point_hlt); + } + else{ + glPointSize(3); + glColor4ubv((GLubyte*)&CTX.color.geom.point); + } + + if(CTX.geom.points){ + glBegin(GL_POINTS); + glVertex3d((*v)->Pos.X, (*v)->Pos.Y, (*v)->Pos.Z); + glEnd(); + } + + if(CTX.geom.points_num){ + sprintf(Num,"%d",(*v)->Num); + glRasterPos3d((*v)->Pos.X+3*CTX.pixel_equiv_x/CTX.s[0], + (*v)->Pos.Y+3*CTX.pixel_equiv_x/CTX.s[1], + (*v)->Pos.Z+3*CTX.pixel_equiv_x/CTX.s[2]); + Draw_String(Num); + } + + if(CTX.render_mode == GMSH_SELECT){ + glPopName(); + } + +} + +/* ------------------------------------------------------------------------ */ +/* D r a w _ C u r v e */ +/* ------------------------------------------------------------------------ */ + + +void Draw_Curve (void *a, void *b){ + int i,N; + double mod,dd; + char Num[100]; + Curve *c; + Vertex v,dv; + + c = *(Curve**)a; + + if(c->Num<0 || !EntiteEstElleVisible(c->Num)) return; + + if(CTX.render_mode == GMSH_SELECT){ + glLoadName(1); + glPushName(c->Num); + } + + if((c)->ipar[3]){ + glLineWidth(2.); + glColor4ubv((GLubyte*)&CTX.color.geom.line_sel); + } + else if(Highlighted){ + glLineWidth(2.); + glColor4ubv((GLubyte*)&CTX.color.geom.line_hlt); + } + else{ + glLineWidth(1.); + glColor4ubv((GLubyte*)&CTX.color.geom.line); + } + + if(CTX.geom.lines){ + + if(c->Typ == MSH_SEGM_LINE) + N = List_Nbr(c->Control_Points); + else + N = 50; + + glBegin(GL_LINE_STRIP); + for(i=0;i<N;i++){ + v = InterpolateCurve(c,(double)i/(double)(N-1),0); + glVertex3d(v.Pos.X,v.Pos.Y,v.Pos.Z); + } + glEnd(); + + } + + if(CTX.geom.lines_num){ + v = InterpolateCurve(c,0.5,0); + sprintf(Num,"%d",c->Num); + glRasterPos3d(v.Pos.X+3*CTX.pixel_equiv_x/CTX.s[0], + v.Pos.Y+3*CTX.pixel_equiv_x/CTX.s[1], + v.Pos.Z+3*CTX.pixel_equiv_x/CTX.s[2]); + Draw_String(Num); + } + + if(CTX.geom.tangents){ + v = InterpolateCurve(c,0.5,0); + dv = InterpolateCurve(c,0.5,1); + mod = sqrt(dv.Pos.X*dv.Pos.X+dv.Pos.Y*dv.Pos.Y+dv.Pos.Z*dv.Pos.Z); + dv.Pos.X = dv.Pos.X / mod * CTX.geom.tangents * CTX.pixel_equiv_x/CTX.s[0] ; + dv.Pos.Y = dv.Pos.Y / mod * CTX.geom.tangents * CTX.pixel_equiv_x/CTX.s[1] ; + dv.Pos.Z = dv.Pos.Z / mod * CTX.geom.tangents * CTX.pixel_equiv_x/CTX.s[2] ; + dd = sqrt(dv.Pos.X*dv.Pos.X+dv.Pos.Y*dv.Pos.Y+dv.Pos.Z*dv.Pos.Z); + glColor4ubv((GLubyte*)&CTX.color.geom.tangents); + Draw_Vector(DRAW_POST_ARROW, 0, v.Pos.X,v.Pos.Y,v.Pos.Z, + dd, dv.Pos.X,dv.Pos.Y,dv.Pos.Z, NULL,NULL); + } + + if(CTX.render_mode == GMSH_SELECT){ + glPopName (); + } + +} + + + +/* ------------------------------------------------------------------------ */ +/* D r a w _ S u r f a c e */ +/* ------------------------------------------------------------------------ */ + +void put_Z (Vertex *v, Surface *s){ + Vertex V; + V.Pos.X = s->a; + V.Pos.Y = s->b; + V.Pos.Z = s->c; + Projette(&V,s->plan); + if(V.Pos.Z != 0.0) + v->Pos.Z = (s->d - V.Pos.X * v->Pos.X - V.Pos.Y * v->Pos.Y)/V.Pos.Z; + else v->Pos.Z = 0.0; + + Projette(v,s->invplan); +} + +int isPointOnPlanarSurface (Surface *S, double X, double Y, double Z, double n[3]){ + Curve *C; + Vertex V,P1,P2; + int i,j,N; + double Angle,u1,u2; + + Angle = 0.0; + V.Pos.X = X; + V.Pos.Y = Y; + V.Pos.Z = Z; + + for(i=0;i<List_Nbr(S->s.Generatrices);i++){ + List_Read(S->s.Generatrices,i,&C); + + switch(C->Typ){ + case MSH_SEGM_LINE: + N = 1; + break; + default: + N = 10; + break; + } + for(j=0;j<N;j++){ + u1 = (double)j/(double)(N); + u2 = (double)(j+1)/(double)(N); + P1 = InterpolateCurve(C,u1,0); + P2 = InterpolateCurve(C,u2,0); + Angle += angle_plan(&V,&P1,&P2,n); + } + } + + if(fabs(Angle) > 6.0 && fabs(Angle) < 7.)return 1; + return 0; + +} + +void Plan_SurfPlane (void *data,void *dum){ + Surface **pS , *s; + Curve *pC; + Vertex *v; + int ix,iy,iz,i,j,N; + double det,sys[3][3],b[3],res[3],mod,t1[3],t2[3],ex[3],s2s[2][2],r2[2],X,Y,Z; + + static List_T *points; + static int deb=1; + + pS = (Surface**)data; + s = *pS; + + if(deb){ + points = List_Create(10,10,sizeof(Vertex*)); + deb = 0; + } + + if(s->Typ == MSH_SURF_PLAN){ + for(i=0;i<List_Nbr(s->s.Generatrices);i++){ + List_Read(s->s.Generatrices,i,&pC); + for(j=0;j<List_Nbr(pC->Control_Points);j++){ + List_Add(points,List_Pointer(pC->Control_Points,j)); + } + } + } + else{ + return; + } + + N = List_Nbr(points); + + for(i=0;i<3;i++){ + b[i] = 0.0; + for(j=0;j<3;j++){ + sys[i][j] = 0.0; + } + } + + /* ax + by + cz = 1 */ + + ix=iy=iz=0; + + for(i=0;i<N;i++){ + List_Read(points,i,&v); + if(!i){ + X = v->Pos.X; + Y = v->Pos.Y; + Z = v->Pos.Z; + } + else{ + if(X != v->Pos.X ) ix = 1; + if(Y != v->Pos.Y ) iy = 1; + if(Z != v->Pos.Z ) iz = 1; + } + + sys[0][0] += v->Pos.X * v->Pos.X; + sys[1][1] += v->Pos.Y * v->Pos.Y; + sys[2][2] += v->Pos.Z * v->Pos.Z; + sys[0][1] += v->Pos.X * v->Pos.Y; + sys[0][2] += v->Pos.X * v->Pos.Z; + sys[1][2] += v->Pos.Y * v->Pos.Z; + sys[2][1] = sys[1][2]; + sys[1][0] = sys[0][1]; + sys[2][0] = sys[0][2]; + b[0] += v->Pos.X; + b[1] += v->Pos.Y; + b[2] += v->Pos.Z; + } + + s->d = 1.0; + + /* x = X */ + + if(!ix){ + s->d = X; + res[0] = 1.; + res[1] = res[2] = 0.0; + + } + + /* y = Y */ + + else if(!iy){ + s->d = Y; + res[1] = 1.; + res[0] = res[2] = 0.0; + } + + /* z = Z */ + + else if(!iz){ + s->d = Z; + res[2] = 1.; + res[1] = res[0] = 0.0; + } + + /* by + cz = -x */ + + else if (!sys3x3(sys,b,res,&det) ){ + s->d = 0.0; + s2s[0][0] = sys[1][1]; + s2s[0][1] = sys[1][2]; + s2s[1][0] = sys[1][2]; + s2s[1][1] = sys[2][2]; + b[0] = -sys[0][1]; + b[1] = -sys[0][2]; + if(sys2x2(s2s,b,r2)){ + res[0] = 1.; + res[1] = r2[0]; + res[2] = r2[1]; + } + /* ax + cz = -y */ + else { + s->d = 0.0; + s2s[0][0] = sys[0][0]; + s2s[0][1] = sys[0][2]; + s2s[1][0] = sys[0][2]; + s2s[1][1] = sys[2][2]; + b[0] = -sys[0][1]; + b[1] = -sys[1][2]; + if(sys2x2(s2s,b,r2)){ + res[0] = r2[0]; + res[1] = 1.; + res[2] = r2[1]; + } + /* ax + by = -z */ + else { + s->d = 1.0; + s2s[0][0] = sys[0][0]; + s2s[0][1] = sys[0][1]; + s2s[1][0] = sys[0][1]; + s2s[1][1] = sys[1][1]; + b[0] = -sys[0][2]; + b[1] = -sys[1][2]; + if(sys2x2(s2s,b,r2)){ + res[0] = r2[0]; + res[1] = r2[1]; + res[2] = 1.; + } + else { + printf("erreur Plan_SurfPlane\n"); + } + } + } + } + + s->a = res[0]; + s->b = res[1]; + s->c = res[2]; + mod = sqrt (res[0] * res[0] + res[1] * res[1] + res[2] * res[2]); + for(i=0;i<3;i++) res[i]/=mod; + + /* L'axe n'est pas l'axe des x */ + if(res[0] > res[1]){ + ex[0] = 0.; + ex[1] = 1.; + ex[2] = 0.; + } + else{ + ex[0] = 1.; + ex[1] = 0.; + ex[2] = 0.; + } + + prodve(res,ex,t1); + + mod = sqrt (t1[0] * t1[0] + t1[1] * t1[1] + t1[2] * t1[2] ) ; + for(i=0;i<3;i++) t1[i]/=mod; + + prodve(t1,res,t2); + + mod = sqrt (t2[0] * t2[0] + t2[1] * t2[1] + t2[2] * t2[2] ) ; + for(i=0;i<3;i++) t2[i]/=mod; + + for(i=0;i<3;i++)s->plan[0][i] = t1[i]; + for(i=0;i<3;i++)s->plan[1][i] = t2[i]; + for(i=0;i<3;i++)s->plan[2][i] = res[i]; + + /* Matrice orthogonale */ + + for(i=0;i<3;i++){ + for(j=0;j<3;j++){ + s->invplan[i][j] = s->plan[j][i]; + } + } + List_Reset(points); +} + + +void Draw_Plane_Surface (Surface *s){ + int i,k; + Curve *c; + double minx,miny,maxx,maxy,t,n[3],nn; + Vertex P1,P2,P3,V[4],vv,vv1,vv2; + char Num[100]; + + if(!s->Orientations){ + s->Orientations = List_Create(20,2,sizeof(Vertex)); + Plan_SurfPlane(&s,NULL); + k = 0; + + for(i=0;i<List_Nbr(s->s.Generatrices);i++){ + List_Read (s->s.Generatrices,i,&c); + P1 = InterpolateCurve(c,0.0,0); + P2 = InterpolateCurve(c,0.5,0); + P3 = InterpolateCurve(c,1.0,0); + Projette(&P1,s->plan); + Projette(&P2,s->plan); + Projette(&P3,s->plan); + + if(!k){ + k = 1; + minx = maxx = P1.Pos.X; + miny = maxy = P1.Pos.Y; + } + minx = DMIN(DMIN(DMIN(minx,P1.Pos.X),P2.Pos.X),P3.Pos.X); + miny = DMIN(DMIN(DMIN(miny,P1.Pos.Y),P2.Pos.Y),P3.Pos.Y); + maxx = DMAX(DMAX(DMAX(maxx,P1.Pos.X),P2.Pos.X),P3.Pos.X); + maxy = DMAX(DMAX(DMAX(maxy,P1.Pos.Y),P2.Pos.Y),P3.Pos.Y); + } + + V[0].Pos.X = minx; + V[0].Pos.Y = miny; + + V[1].Pos.X = maxx; + V[1].Pos.Y = miny; + + V[2].Pos.X = maxx; + V[2].Pos.Y = maxy; + + V[3].Pos.X = minx; + V[3].Pos.Y = maxy; + for(i=0;i<4;i++){ + V[i].Pos.Z = 0.0; + put_Z(&V[i],s); + } + n[0] = s->plan[2][0]; + n[1] = s->plan[2][1]; + n[2] = s->plan[2][2]; + norme(n); + + k = 0; + for(i=0;i<100;i++){ + t = (double)i/(double)(100); + vv.Pos.X = t * 0.5 * (V[0].Pos.X + V[1].Pos.X) + (1.-t) * + 0.5 * (V[2].Pos.X + V[3].Pos.X); + vv.Pos.Y = t * 0.5 * (V[0].Pos.Y + V[1].Pos.Y) + (1.-t) * + 0.5 * (V[2].Pos.Y + V[3].Pos.Y); + vv.Pos.Z = t * 0.5 * (V[0].Pos.Z + V[1].Pos.Z) + (1.-t) * + 0.5 * (V[2].Pos.Z + V[3].Pos.Z); + if(isPointOnPlanarSurface(s,vv.Pos.X,vv.Pos.Y,vv.Pos.Z,n)){ + if(!k){ + List_Add(s->Orientations,&vv); + k = 1; + } + } + else{ + if(k){ + List_Add(s->Orientations,&vv); + k = 0; + } + } + } + if(k) List_Add(s->Orientations,&vv); + + k = 0; + for(i=0;i<100;i++){ + + t = (double)i/(double)(100); + vv.Pos.X = t*.5*(V[0].Pos.X+V[3].Pos.X)+(1.-t)*.5*(V[2].Pos.X+V[1].Pos.X); + vv.Pos.Y = t*.5*(V[0].Pos.Y+V[3].Pos.Y)+(1.-t)*.5*(V[2].Pos.Y+V[1].Pos.Y); + vv.Pos.Z = t*.5*(V[0].Pos.Z+V[3].Pos.Z)+(1.-t)*.5*(V[2].Pos.Z+V[1].Pos.Z); + if(isPointOnPlanarSurface(s,vv.Pos.X,vv.Pos.Y,vv.Pos.Z,n)){ + if(!k){ + List_Add(s->Orientations,&vv); + k = 1; + } + } + else{ + if(k){ + List_Add(s->Orientations,&vv); + k = 0; + } + } + } + if(k)List_Add(s->Orientations,&vv); + fprintf(stderr, "Surface %d %d points\n",s->Num,List_Nbr(s->Orientations)); + } + + if(CTX.geom.surfaces){ + glBegin(GL_LINES); + for(i=0;i<List_Nbr(s->Orientations);i++){ + List_Read(s->Orientations,i,&vv); + glVertex3d(vv.Pos.X,vv.Pos.Y,vv.Pos.Z); + } + glEnd(); + } + + glDisable(GL_LINE_STIPPLE); + + if(CTX.geom.surfaces_num){ + List_Read(s->Orientations,0,&vv1); + List_Read(s->Orientations,1,&vv2); + sprintf(Num,"%d",s->Num); + glRasterPos3d((vv2.Pos.X+vv1.Pos.X)/2. + 3*CTX.pixel_equiv_x/CTX.s[0], + (vv2.Pos.Y+vv1.Pos.Y)/2. + 3*CTX.pixel_equiv_x/CTX.s[1], + (vv2.Pos.Z+vv1.Pos.Z)/2. + 3*CTX.pixel_equiv_x/CTX.s[2]); + Draw_String(Num); + } + + if(CTX.geom.normals) { + List_Read(s->Orientations,0,&vv1); + List_Read(s->Orientations,1,&vv2); + n[0] = s->plan[2][0]; + n[1] = s->plan[2][1]; + n[2] = s->plan[2][2]; + norme(n); + n[0] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[0] ; + n[1] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[1] ; + n[2] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[2] ; + nn = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]); + glColor4ubv((GLubyte*)&CTX.color.geom.normals); + Draw_Vector(DRAW_POST_ARROW, 0, (vv2.Pos.X+vv1.Pos.X)/2., (vv2.Pos.Y+vv1.Pos.Y)/2., + (vv2.Pos.Z+vv1.Pos.Z)/2., nn, n[0],n[1],n[2],NULL,NULL); + } + +} + + +void Draw_NonPlane_Surface (Surface *s){ + Vertex v,n1,n2,n3; + int i,NbTics,N; + double u,n[3],nn,nx[3],ny[3]; + double tics[20]; + double u0, un,v0,vn; + int kk; + char Num[100]; + + u0 =v0= 0; + un =vn= 1; + + if(!s)return; + + if((s->Typ == MSH_SURF_NURBS)){ + NbTics = 5; + u0 = s->ku[0]; + un = s->ku[s->OrderU + s->Nu]; + v0 = s->kv[0]; + vn = s->kv[s->OrderV + s->Nv]; + for(i=0;i<NbTics;i++){ + tics[i] = v0 + ((double)(i+1)/(double)NbTics) * (vn - v0); + } + if(CTX.geom.shade){ + GLUnurbsObj *nurb; + nurb=gluNewNurbsRenderer(); + gluNurbsProperty(nurb,(GLenum)GLU_SAMPLING_TOLERANCE,50.0); + gluNurbsProperty(nurb,(GLenum)GLU_DISPLAY_MODE,GLU_FILL ); + gluBeginSurface(nurb); + gluNurbsSurface(nurb, s->Nu+s->OrderU+1,s->ku, s->Nv+s->OrderV+1,s->kv, + 4, 4*s->Nu, s->cp, s->OrderU+1,s->OrderV+1, + GL_MAP2_VERTEX_4); + gluEndSurface(nurb); + gluDeleteNurbsRenderer(nurb); + return; + } + } + else { + NbTics = 1; + tics[0] = 0.5; + } + + glEnable(GL_LINE_STIPPLE); + + + if(CTX.geom.surfaces){ + for(kk = 0;kk<NbTics;kk++){ + N = 50; + glBegin(GL_LINE_STRIP); + for(i=0;i<N+1;i++){ + u = u0 + (un-u0)*(double)i/(double)N; + v = InterpolateSurface(s,u,tics[kk],0,0); + glVertex3d(v.Pos.X,v.Pos.Y,v.Pos.Z); + } + glEnd(); + } + } + + if(s->Typ == MSH_SURF_NURBS){ + for(i=0;i<NbTics;i++){ + tics[i] = u0+((double)(i+1)/(double)NbTics) * (un - u0); + } + } + + if(CTX.geom.surfaces){ + for( kk = 0;kk<NbTics;kk++){ + glBegin(GL_LINE_STRIP); + for(i=0;i<N+1;i++){ + u = v0 + (vn-v0)*(double)i/(double)N; + v = InterpolateSurface(s,tics[kk],u,0,0); + glVertex3d(v.Pos.X,v.Pos.Y,v.Pos.Z); + } + glEnd(); + } + } + + if(s->Mat){ + glLineWidth(1.); + } + + if(CTX.geom.surfaces_num){ + v = InterpolateSurface(s,0.5,0.5,0,0); + sprintf(Num,"%d",s->Num); + glRasterPos3d(v.Pos.X+3*CTX.pixel_equiv_x/CTX.s[0], + v.Pos.Y+3*CTX.pixel_equiv_x/CTX.s[1], + v.Pos.Z+3*CTX.pixel_equiv_x/CTX.s[2]); + Draw_String(Num); + } + + if(CTX.geom.normals){ + glDisable(GL_LINE_STIPPLE); + n1 = InterpolateSurface(s,0.5,0.5,0,0); + n2 = InterpolateSurface(s,0.6,0.5,0,0); + n3 = InterpolateSurface(s,0.5,0.6,0,0); + nx[0] = n2.Pos.X - n1.Pos.X; + nx[1] = n2.Pos.Y - n1.Pos.Y; + nx[2] = n2.Pos.Z - n1.Pos.Z; + ny[0] = n3.Pos.X - n1.Pos.X; + ny[1] = n3.Pos.Y - n1.Pos.Y; + ny[2] = n3.Pos.Z - n1.Pos.Z; + prodve(nx,ny,n); + norme(n); + n[0] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[0] ; + n[1] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[1] ; + n[2] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[2] ; + nn = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]); + glColor4ubv((GLubyte*)&CTX.color.geom.normals); + Draw_Vector(DRAW_POST_ARROW, 0, n1.Pos.X, n1.Pos.Y, n1.Pos.Z, + nn, n[0],n[1],n[2],NULL,NULL); + glEnable(GL_LINE_STIPPLE); + } + +} + +void Draw_Simplex_Surfaces (void *a, void *b); + +void Draw_Surface (void *a, void *b){ + Surface *s; + + s = *(Surface**)a; + + // if(!s->Support)return; + + if(!EntiteEstElleVisible(s->Num)) return; + + if(CTX.render_mode == GMSH_SELECT){ + glLoadName(2); + glPushName(s->Num); + } + + if(!CTX.geom.shade){ + if(s->Mat){ + glLineWidth(2.); + glColor4ubv((GLubyte*)&CTX.color.geom.surface_sel); + } + else if (Highlighted){ + glLineWidth(2.); + glColor4ubv((GLubyte*)&CTX.color.geom.surface_hlt); + glEnable(GL_LINE_STIPPLE); + glLineStipple(1,0x0F0F); + } + else{ + glLineWidth(1.); + glColor4ubv((GLubyte*)&CTX.color.geom.surface); + glEnable(GL_LINE_STIPPLE); + glLineStipple(1,0x0F0F); + } + } + else{ + ColorSwitch(abs(s->Num)); + } + + if(s->Typ == MSH_SURF_STL){ + glDisable(GL_LINE_STIPPLE); + Tree_Action(s->STL->Simplexes,Draw_Simplex_Surfaces); + } + else if(s->Typ == MSH_SURF_PLAN) + Draw_Plane_Surface(s); + else + Draw_NonPlane_Surface(s); + + if(CTX.render_mode == GMSH_SELECT){ + glPopName (); + glDisable(GL_LINE_STIPPLE); + } + + glDisable(GL_LINE_STIPPLE); + + +} + + + + +/* ------------------------------------------------------------------------ */ +/* D r a w _ G e o m */ +/* ------------------------------------------------------------------------ */ + +extern void DrawVolumes (Mesh *m); + +void Draw_Geom (Mesh *m) { + + if(m->status == -1) return; + + if(CTX.geom.points || CTX.geom.points_num) + Tree_Action(m->Points, Draw_Point); + if(CTX.geom.lines || CTX.geom.lines_num) + Tree_Action(m->Curves, Draw_Curve ); + if(CTX.geom.surfaces || CTX.geom.surfaces_num) + Tree_Action(m->Surfaces,Draw_Surface); + if(CTX.geom.volumes || CTX.geom.volumes_num) + DrawVolumes(m); + +} + +void ZeroCurve(void *a,void *b){ + Curve *c; + c = *(Curve**)a; + c->ipar[3] = 0; +} + +void ZeroPoint(void *a,void *b){ + Vertex *v; + v = *(Vertex**)a; + v->Frozen = 0; +} + +void ZeroSurface(void *a,void *b){ + Surface *s; + s = *(Surface**)a; + s->Mat = 0; +} + +void ZeroHighlight(Mesh *m){ + Tree_Action(m->Points,ZeroPoint); + Tree_Action(m->Curves,ZeroCurve); + Tree_Action(m->Surfaces,ZeroSurface); +} + + +/* ------------------------------------------------------------------------ */ +/* D r a w _ A x e s */ +/* ------------------------------------------------------------------------ */ + +void Draw_Axes (double s) { + double f, g, b, c; + + if(s == 0.) return; + + f = 0.666 * s; + g = 1.233 * s; + b = .1 * s; + c = 0.666 * b; + + glLineWidth(1.); + glColor4ubv((GLubyte*)&CTX.color.axes); + + glBegin(GL_LINES); + if(CTX.range[2] != 0.){ + /* X */ + glVertex3d(0., 0., 0.); + glVertex3d(s, 0., 0.); + glVertex3d(g-b, b, 0.); + glVertex3d(g+b, -b, 0.); + glVertex3d(g, -b, b); + glVertex3d(g, b, -b); + /* Y */ + glVertex3d(0., 0., 0.); + glVertex3d(0., s, 0.); + glVertex3d(-b, g+b, 0.); + glVertex3d(0., g, 0.); + glVertex3d(0., g, 0.); + glVertex3d(0., g+b, -b); + glVertex3d(0., g, 0.); + glVertex3d(.5*b, g-b, .5*b); + /* Z */ + glVertex3d(0., 0., 0.); + glVertex3d(0., 0., s); + glVertex3d(-b, b, g); + glVertex3d(0., b, g-b); + glVertex3d(0., b, g-b); + glVertex3d(0., -b, g+b); + glVertex3d(0., -b, g+b); + glVertex3d(b, -b, g); + } + else{ + /* X */ + glVertex3d(0., 0., 0.); + glVertex3d(s, 0., 0.); + glVertex3d(g-c, b, 0.); + glVertex3d(g+c, -b, 0.); + glVertex3d(g-c, -b, 0.); + glVertex3d(g+c, b, 0.); + /* Y */ + glVertex3d(0., 0., 0.); + glVertex3d(0., s, 0.); + glVertex3d(-c, g+b, 0.); + glVertex3d(0., g, 0.); + glVertex3d(0., g, 0.); + glVertex3d(c, g+b, 0.); + glVertex3d(0., g, 0.); + glVertex3d(0., g-b, 0.); + } + glEnd(); + + glEnable(GL_LINE_STIPPLE); + glLineStipple(2,0x0F0F); + glBegin(GL_LINES); + if(CTX.range[2] != 0.){ + glVertex3d(f, 0., 0.); + glVertex3d(f, 0., f ); + glVertex3d(f, 0., f ); + glVertex3d(0., 0., f ); + glVertex3d(0., 0., f ); + glVertex3d(0., f, f ); + glVertex3d(0., f, f ); + glVertex3d(0., f, 0.); + } + glVertex3d(0., f, 0.); + glVertex3d(f, f, 0.); + glVertex3d(f, f, 0.); + glVertex3d(f, 0., 0.); + glEnd(); + glDisable(GL_LINE_STIPPLE); + +} + + +/* ------------------------------------------------------------------------ */ +/* H i g h l i g h t */ +/* ------------------------------------------------------------------------ */ + +void begin_highlight(void){ + if(CTX.geom.highlight){ + Highlighted = 1; + if(CTX.overlay){ + InitOv(); + } + else{ + Init(); + } + glPushMatrix(); + InitPosition(); + if(CTX.db) glDrawBuffer(GL_FRONT); + } +} + + +void end_highlight(int permanent){ + Highlighted = 0; + if(permanent){ + Init(); + Draw(); + } + else{ + if(CTX.geom.highlight) { + glPopMatrix(); + if(CTX.db) glDrawBuffer(GL_BACK); + } + } +} + +void highlight_entity(Vertex *v,Curve *c, Surface *s, int permanent){ + + Curve *cc; + Vertex *v1,*v2; + char Message[256],temp[256]; + int i,nbg; + + if(v){ + if(permanent) v->Frozen = 1; + if(CTX.geom.highlight) Draw_Point(&v,NULL); + Msg(SELECT,"Point %d {%.5g,%.5g,%.5g} (%.5g)", v->Num,v->Pos.X,v->Pos.Y,v->Pos.Z,v->lc); + } + else if(c){ + if(permanent) c->ipar[3] = 1; + if(CTX.geom.highlight) Draw_Curve(&c,NULL); + + List_Read(c->Control_Points,0,&v1); + List_Read(c->Control_Points,List_Nbr(c->Control_Points)-1,&v2); + Msg(SELECT,"Line %d {%d->%d}",c->Num,v1->Num,v2->Num); + } + else if(s){ + if(permanent && s->Mat == 1) return; + if(permanent) s->Mat = 1; + if(CTX.geom.highlight) Draw_Surface(&s,NULL); + + if(s->Typ == MSH_SURF_PLAN)sprintf(Message,"Plan Surf %d {",s->Num); + else if(s->Typ == MSH_SURF_REGL)sprintf(Message,"Ruld Surf %d {",s->Num); + else sprintf(Message,"Surf %d {",s->Num); + + nbg = List_Nbr(s->s.Generatrices) ; + + if(nbg < 10){ + for(i=0;i<nbg;i++){ + List_Read(s->s.Generatrices,i,&cc); + if(!i)sprintf(temp,"%d",cc->Num); + else sprintf(temp,",%d",cc->Num); + strcat(Message,temp); + } + } + else{ + strcat(Message,"..."); + } + strcat(Message,"}"); + Msg(SELECT,Message); + } + else{ + Msg(SELECT," "); + } + +} + + +void highlight_entity_num(int v, int c, int s, int permanant){ + Vertex *pv,V; + Curve *pc,C; + Surface *ps,S; + if(v){ + pv = &V; + pv->Num = v; + if(Tree_Query(THEM->Vertices,&pv)){ + highlight_entity(pv,NULL,NULL,permanant); + } + } + if(c){ + pc = &C; + pc->Num = c; + if(Tree_Query(THEM->Curves,&pc)){ + highlight_entity(NULL,pc,NULL,permanant); + } + } + if(s){ + ps = &S; + ps->Num = s; + if(Tree_Query(THEM->Surfaces,&ps)){ + highlight_entity(NULL,NULL,ps,permanant); + } + } + glFlush(); +} + diff --git a/Graphics/Iso.cpp b/Graphics/Iso.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3222465355da09ae8c9c289655916283eb86e2ef --- /dev/null +++ b/Graphics/Iso.cpp @@ -0,0 +1,315 @@ + +#include "Gmsh.h" +#include "Mesh.h" +#include "Draw.h" + +void RaiseFill(int i, double Val, double ValMin, double Raise[3][5]); + +/* ------------------------------------------------------------------------ */ +/* I n t e r p o l a t e */ +/* ------------------------------------------------------------------------ */ + +void Interpolate(double *X, double *Y, double *Z, + double *Val, double V, int I1, int I2, + double *XI, double *YI ,double *ZI){ + + if(Val[I1] == Val[I2]){ + *XI = X[I1]; + *YI = Y[I1]; + *ZI = Z[I1]; + } + else{ + *XI= (V - Val[I1])*(X[I2]-X[I1])/(Val[I2]-Val[I1]) + X[I1]; + *YI= (V - Val[I1])*(Y[I2]-Y[I1])/(Val[I2]-Val[I1]) + Y[I1]; + *ZI= (V - Val[I1])*(Z[I2]-Z[I1])/(Val[I2]-Val[I1]) + Z[I1]; + } +} + +/* ------------------------------------------------------------------------ */ +/* S i m p l e x */ +/* ------------------------------------------------------------------------ */ + +void IsoSimplex(double *X, double *Y, double *Z, double *Val, + double V, double Vmin, double Vmax, + double *Offset, double Raise[3][5], int shade){ + int nb; + double Xp[6],Yp[6],Zp[6]; + + if(V != Vmax){ + nb = 0; + if((Val[0] > V && Val[1] <= V) || (Val[1] > V && Val[0] <= V)){ + Interpolate(X,Y,Z,Val,V,0,1,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + if((Val[0] > V && Val[2] <= V) || (Val[2] > V && Val[0] <= V)){ + Interpolate(X,Y,Z,Val,V,0,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + if((Val[0] > V && Val[3] <= V) || (Val[3] > V && Val[0] <= V)){ + Interpolate(X,Y,Z,Val,V,0,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + if((Val[1] > V && Val[2] <= V) || (Val[2] > V && Val[1] <= V)){ + Interpolate(X,Y,Z,Val,V,1,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + if((Val[1] > V && Val[3] <= V) || (Val[3] > V && Val[1] <= V)){ + Interpolate(X,Y,Z,Val,V,1,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + if((Val[2] > V && Val[3] <= V) || (Val[3] > V && Val[2] <= V)){ + Interpolate(X,Y,Z,Val,V,2,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + } + else{ + nb=0; + if((Val[0] < V && Val[1] <= V) || (Val[1] < V && Val[0] <= V)){ + Interpolate(X,Y,Z,Val,V,0,1,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + if((Val[0] < V && Val[2] <= V) || (Val[2] < V && Val[0] <= V)){ + Interpolate(X,Y,Z,Val,V,0,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + if((Val[0] < V && Val[3] <= V) || (Val[3] < V && Val[0] <= V)){ + Interpolate(X,Y,Z,Val,V,0,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + if((Val[1] < V && Val[2] <= V) || (Val[2] < V && Val[1] <= V)){ + Interpolate(X,Y,Z,Val,V,1,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + if((Val[1] < V && Val[3] <= V) || (Val[3] < V && Val[1] <= V)){ + Interpolate(X,Y,Z,Val,V,1,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + if((Val[2] < V && Val[3] <= V) || (Val[3] < V && Val[2] <= V)){ + Interpolate(X,Y,Z,Val,V,2,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++; + } + } + + if(nb == 3) + Draw_Triangle(Xp,Yp,Zp,Offset,Raise,shade); + else if(nb == 4) + Draw_Quadrangle(Xp,Yp,Zp,Offset,Raise,shade); + +} + +/* ------------------------------------------------------------------------ */ +/* T r i a n g l e */ +/* ------------------------------------------------------------------------ */ + +void CutTriangle1D(double *X, double *Y, double *Z, double *Val, + double V, double Vmin, double Vmax, + double *Xp, double *Yp, double *Zp, int *nb){ + + if(V != Vmax){ + *nb = 0; + if((Val[0] > V && Val[1] <= V) || (Val[1] > V && Val[0] <= V)){ + Interpolate(X,Y,Z,Val,V,0,1,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++; + } + if((Val[0] > V && Val[2] <= V) || (Val[2] > V && Val[0] <= V)){ + Interpolate(X,Y,Z,Val,V,0,2,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++; + } + if((Val[1] > V && Val[2] <= V) || (Val[2] > V && Val[1] <= V)){ + Interpolate(X,Y,Z,Val,V,1,2,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++; + } + } + else{ + *nb = 0; + if((Val[0] < V && Val[1] >= V) || (Val[1] < V && Val[0] >= V)){ + Interpolate(X,Y,Z,Val,V,0,1,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++; + } + if((Val[0] < V && Val[2] >= V) || (Val[2] < V && Val[0] >= V)){ + Interpolate(X,Y,Z,Val,V,0,2,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++; + } + if((Val[1] < V && Val[2] >= V) || (Val[2] < V && Val[1] >= V)){ + Interpolate(X,Y,Z,Val,V,1,2,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++; + } + } + +} + +void CutTriangle2D(double *X, double *Y, double *Z, double *Val, + double V1, double V2, double Vmin, double Vmax, + double *Xp2, double *Yp2, double *Zp2, int *Np2, double *Vp2){ + + int i, io[3],j,iot,Np,Fl; + double Xp[5],Yp[5],Zp[5],Vp[5]; + + *Np2 = 0; + + for(i=0;i<3;i++) io[i] = i; + + for(i=0;i<2;i++){ + for(j=i+1;j<3;j++){ + if(Val[io[i]]>Val[io[j]]){ + iot = io[i]; + io[i] = io[j]; + io[j] = iot; + } + } + } + + /* io[] contient un indexage des noeuds t.q. Val[io[i]] > Val[io[j]] si i > j */ + + if(Val[io[0]] > V2) return; + if(Val[io[2]] < V1) return; + + if(V1 <= Val[io[0]] && Val[io[2]] <= V2){ + memcpy(Vp2,Val,3*sizeof(double)); + memcpy(Xp2,X,3*sizeof(double)); + memcpy(Yp2,Y,3*sizeof(double)); + memcpy(Zp2,Z,3*sizeof(double)); + *Np2 = 3; + return; + } + + Np = 0; + if(V1<=Val[io[0]]){ + Vp[Np] = Val[io[0]]; + Xp[Np] = X[io[0]]; + Yp[Np] = Y[io[0]]; + Zp[Np] = Z[io[0]]; + Np++; Fl = 1; + } + else if(Val[io[0]] < V1 && V1 <= Val[io[1]]){ + Vp[Np] = V1; + Interpolate(X,Y,Z,Val,V1,io[0],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; + Vp[Np] = V1; + Interpolate(X,Y,Z,Val,V1,io[0],io[1],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; Fl = 1; + } + else { + Vp[Np] = V1; + Interpolate(X,Y,Z,Val,V1,io[0],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; + Vp[Np] = V1; + Interpolate(X,Y,Z,Val,V1,io[1],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; Fl = 0; + } + + if(V2 == Val[io[0]]){ + return; + } + else if((Val[io[0]]<V2) && ( V2 < Val[io[1]])){ + Vp[Np] = V2; + Interpolate(X,Y,Z,Val,V2,io[0],io[1],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; + Vp[Np] = V2; + Interpolate(X,Y,Z,Val,V2,io[0],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; + } + else if(V2 < Val[io[2]]){ + if(Fl){ + Vp[Np] = Val[io[1]]; + Xp[Np] = X[io[1]]; + Yp[Np] = Y[io[1]]; + Zp[Np] = Z[io[1]]; + Np++; + } + Vp[Np] = V2; + Interpolate(X,Y,Z,Val,V2,io[1],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; + Vp[Np] = V2; + Interpolate(X,Y,Z,Val,V2,io[0],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; + } + else{ + if(Fl){ + Vp[Np] = Val[io[1]]; + Xp[Np] = X[io[1]]; + Yp[Np] = Y[io[1]]; + Zp[Np] = Z[io[1]]; + Np++; + } + Vp[Np] = Val[io[2]]; + Xp[Np] = X[io[2]]; + Yp[Np] = Y[io[2]]; + Zp[Np] = Z[io[2]]; + Np++; + } + + Vp2[0] = Vp[0]; + Xp2[0] = Xp[0]; + Yp2[0] = Yp[0]; + Zp2[0] = Zp[0]; + *Np2 = 1; + + for(i=1;i<Np;i++){ + if((Xp[i] != Xp2[(*Np2)-1]) ||(Yp[i] != Yp2[(*Np2)-1]) ||(Zp[i] != Zp2[(*Np2)-1])){ + Vp2[*Np2] = Vp[i]; + Xp2[*Np2] = Xp[i]; + Yp2[*Np2] = Yp[i]; + Zp2[*Np2] = Zp[i]; + (*Np2)++; + } + } + + if(Xp2[0] == Xp2[(*Np2)-1] && Yp2[0] == Yp2[(*Np2)-1] && Zp2[0] == Zp2[(*Np2)-1]){ + (*Np2)-- ; + } + +} + +/* ------------------------------------------------------------------------ */ +/* L i n e */ +/* ------------------------------------------------------------------------ */ + +void CutLine0D(double *X, double *Y, double *Z, double *Val, + double V, double Vmin, double Vmax, + double *Xp, double *Yp, double *Zp, int *nb){ + + *nb = 0; + + if(V != Vmax){ + if((Val[0] > V && Val[1] <= V) || (Val[1] > V && Val[0] <= V)){ + Interpolate(X,Y,Z,Val,V,0,1,Xp,Yp,Zp); *nb = 1; + } + } + else{ + if((Val[0] < V && Val[1] >= V) || (Val[1] < V && Val[0] >= V)){ + Interpolate(X,Y,Z,Val,V,0,1,Xp,Yp,Zp); *nb = 1; + } + } +} + +void CutLine1D(double *X, double *Y, double *Z, double *Val, + double V1, double V2, double Vmin, double Vmax, + double *Xp2, double *Yp2, double *Zp2, int *Np2, double *Vp2){ + + int io[2]; + + if(Val[0]<Val[1]){ + io[0] = 0; + io[1] = 1; + } + else{ + io[0] = 1; + io[1] = 0; + } + + /* io[] contient un indexage des noeuds t.q. Val[io[i]] > Val[io[j]] si i > j */ + + *Np2 = 0; + + if(Val[io[0]] > V2) return; + if(Val[io[1]] < V1) return; + + *Np2 = 2; + + if(V1 <= Val[io[0]] && Val[io[1]] <= V2){ + memcpy(Vp2,Val,2*sizeof(double)); + memcpy(Xp2,X,2*sizeof(double)); + memcpy(Yp2,Y,2*sizeof(double)); + memcpy(Zp2,Z,2*sizeof(double)); + return; + } + + if(V1<=Val[io[0]]){ + Vp2[0] = Val[io[0]]; + Xp2[0] = X[io[0]]; + Yp2[0] = Y[io[0]]; + Zp2[0] = Z[io[0]]; + } + else{ + Vp2[0] = V1; + Interpolate(X,Y,Z,Val,V1,io[0],io[1],&Xp2[0],&Yp2[0],&Zp2[0]); + } + + if(V2>=Val[io[1]]){ + Vp2[1] = Val[io[1]]; + Xp2[1] = X[io[1]]; + Yp2[1] = Y[io[1]]; + Zp2[1] = Z[io[1]]; + } + else{ + Vp2[1] = V2; + Interpolate(X,Y,Z,Val,V2,io[0],io[1],&Xp2[1],&Yp2[1],&Zp2[1]); + } + +} + diff --git a/Graphics/Iso.h b/Graphics/Iso.h new file mode 100644 index 0000000000000000000000000000000000000000..fa435160687d7509576b6e5586e72ac23f4320ec --- /dev/null +++ b/Graphics/Iso.h @@ -0,0 +1,26 @@ +#ifndef _ISO_H_ +#define _ISO_H_ + +void IsoSimplex (double *X, double *Y, double *Z, double *Val, + double V, double Vmin, double Vmax, + double *Offset, double Raise[3][5], int shade); + +void CutTriangle1D (double *X, double *Y, double *Z, double *Val, + double V, double Vmin, double Vmax, + double *Xp, double *Yp, double *Zp, int *nb); + +void CutTriangle2D (double *X, double *Y, double *Z, double *Val, + double V1, double V2, double Vmin, double Vmax, + double *Xp, double *Yp, double *Zp, int *nb, + double *value); + +void CutLine0D (double *X, double *Y, double *Z, double *Val, + double V, double Vmin, double Vmax, + double *Xp, double *Yp, double *Zp, int *nb); + +void CutLine1D (double *X, double *Y, double *Z, double *Val, + double V1, double V2, double Vmin, double Vmax, + double *Xp, double *Yp, double *Zp, int *nb, + double *value); + +#endif diff --git a/Graphics/Makefile b/Graphics/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..741d62fa49bd24babe3b12cd1775191cb4d05f3c --- /dev/null +++ b/Graphics/Makefile @@ -0,0 +1,149 @@ +# +# Makefile for "libGraphics.a" +# + +.IGNORE: + +CC = c++ +C_FLAGS = -g -Wall + +VERSION_FLAGS = +OS_FLAGS = -D_UNIX + +GL_INCLUDE = -I$(HOME)/SOURCES/Mesa-3.1/include\ + -I$(HOME)/SOURCES/Mesa-3.1/include/GL +MOTIF_INCLUDE = -I/usr/X11R6/LessTif/Motif1.2/include + +RANLIB = ranlib +RM = rm +RMFLAGS = -f + +LIB = ../lib/libGraphics.a +INCLUDE = -I../Common -I../DataStr -I../Geo -I../Graphics -I../Unix -I../Mesh + +CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(VERSION_FLAGS) $(INCLUDE)\ + $(GL_INCLUDE) $(MOTIF_INCLUDE) + +SRC = Draw.cpp \ + Mesh.cpp \ + Geom.cpp \ + Post.cpp \ + PostSimplex.cpp \ + PostTriangle.cpp \ + PostLine.cpp \ + PostPoint.cpp \ + Iso.cpp \ + Entity.cpp \ + Scale.cpp \ + Volume.cpp \ + ColorTable.cpp \ + gl2ps.cpp gl2gif.cpp + + +OBJ = $(SRC:.cpp=.o) + +.SUFFIXES: .o .cpp + +$(LIB): $(OBJ) + ar ruvs $(LIB) $(OBJ) + $(RANLIB) $(LIB) + +.cpp.o: + $(CC) $(CFLAGS) -c $< + +clean: + $(RM) $(RMFLAGS) *.o + +lint: + $(LINT) $(CFLAGS) $(SRC) + +depend: + (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ + $(CC) -MM $(CFLAGS) ${SRC} \ + ) >Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) $(RMFLAGS) Makefile.new + +# DO NOT DELETE THIS LINE +Draw.o: Draw.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + ../Common/GmshUI.h ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h \ + ../Mesh/Simplex.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \ + ../Mesh/Metric.h Draw.h ../Common/Views.h ../Common/Const.h \ + ../Graphics/ColorTable.h ../Common/Context.h ../Geo/MinMax.h \ + ../Unix/Widgets.h ../Unix/XContext.h +Mesh.o: Mesh.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + ../Common/GmshUI.h ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h \ + ../Mesh/Simplex.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \ + ../Mesh/Metric.h Draw.h ../Common/Views.h ../Common/Const.h \ + ../Graphics/ColorTable.h ../Common/Context.h ../Geo/MinMax.h gl2ps.h \ + ../Geo/Verif.h ../Mesh/Numeric.h +Geom.o: Geom.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + ../Common/GmshUI.h ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h \ + ../Mesh/Simplex.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \ + ../Mesh/Metric.h Draw.h ../Common/Views.h ../Common/Const.h \ + ../Graphics/ColorTable.h ../Common/Context.h ../Geo/Verif.h \ + ../Mesh/Interpolation.h ../Mesh/Numeric.h +Post.o: Post.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + ../Common/GmshUI.h ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h \ + ../Mesh/Simplex.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \ + ../Mesh/Metric.h Draw.h ../Common/Views.h ../Common/Const.h \ + ../Graphics/ColorTable.h ../Common/Context.h +PostSimplex.o: PostSimplex.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \ + ../Common/Const.h ../Graphics/ColorTable.h Iso.h ../Common/Context.h +PostTriangle.o: PostTriangle.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \ + ../Common/Const.h ../Graphics/ColorTable.h Iso.h ../Common/Context.h +PostLine.o: PostLine.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \ + ../Common/Const.h ../Graphics/ColorTable.h Iso.h ../Common/Context.h +PostPoint.o: PostPoint.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \ + ../Common/Const.h ../Graphics/ColorTable.h Iso.h ../Common/Context.h +Iso.o: Iso.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \ + ../Common/Const.h ../Graphics/ColorTable.h +Entity.o: Entity.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Mesh/Mesh.h \ + ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \ + ../Common/Const.h ../Graphics/ColorTable.h ../Common/Context.h +Scale.o: Scale.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h \ + ../Common/Const.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h \ + ../Common/Views.h ../Graphics/ColorTable.h ../Common/Context.h gl2ps.h \ + ../Unix/XContext.h +Volume.o: Volume.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \ + ../Common/Const.h ../Graphics/ColorTable.h ../Mesh/Interpolation.h \ + ../Common/Context.h +ColorTable.o: ColorTable.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ColorTable.h ../Common/Context.h +gl2ps.o: gl2ps.cpp gl2ps.h +gl2gif.o: gl2gif.cpp gl2gif.h diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..208eb6f4391072d37cf0e3ace32f97dd33d11f60 --- /dev/null +++ b/Graphics/Mesh.cpp @@ -0,0 +1,685 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Context.h" +#include "MinMax.h" +#include "gl2ps.h" +#include "Verif.h" +#include "Numeric.h" + +extern Mesh *THEM; +extern Context_T CTX; + +extern double MiddleLC; +extern double ClipPlane[4]; +extern double LC; + +static int iVolume; + +/* ------------------------------------------------------------------------ */ +/* D r a w _ M e s h */ +/* ------------------------------------------------------------------------ */ + + +void draw_polygon_2d (double r, double g, double b, int n, + double *x, double *y, double *z){ + int i ; + + CalculateMinMax(THEM->Points); + Init(); + InitPosition(); + + glDisable(GL_DEPTH_TEST); + glDrawBuffer(GL_FRONT); + glColor3f(r,g,b); + glBegin(GL_LINE_STRIP); + for(i=0 ; i<n ; i++) + if(z)glVertex3d(x[i], y[i],z[i]); + else glVertex2d(x[i], y[i]); + glEnd(); + glFlush(); + glDrawBuffer(GL_BACK); + glEnable(GL_DEPTH_TEST); + +} + +void ColorSwitch(int i){ + glColor4ubv((GLubyte*)&CTX.color.mesh.carousel[i%10]); +} + +static int DrawVertexSupp ; + +void Draw_Mesh (Mesh *M) { + + InitPosition(); + + if(CTX.mesh.shade){ + InitShading(); + } + else{ + InitNoShading(); + } + glClipPlane(GL_CLIP_PLANE0, ClipPlane); + glPointSize(2); + glLineWidth(1); + + switch(M->status) { + case 3 : + if(CTX.mesh.draw && + (CTX.mesh.volumes || CTX.mesh.volumes_num) && + CTX.render_mode != GMSH_SELECT) + Tree_Action(M->Volumes, Draw_Mesh_Volumes); + /* fall-through! */ + case 2 : + if(CTX.mesh.draw && + (CTX.mesh.surfaces || CTX.mesh.surfaces_num) && + CTX.render_mode != GMSH_SELECT){ + Tree_Action(M->Surfaces, Draw_Mesh_Surfaces); + } + /* fall-through! */ + case 1 : + if(CTX.mesh.draw && + (CTX.mesh.lines || CTX.mesh.lines_num) && + CTX.render_mode != GMSH_SELECT){ + Tree_Action(M->Curves, Draw_Mesh_Curves); + DrawVertexSupp = 1 ; + Tree_Action(M->VertexEdges,Draw_Mesh_Points); + } + /* fall-through! */ + case 0 : + if(CTX.mesh.draw && + (CTX.mesh.points || CTX.mesh.points_num) && + CTX.render_mode != GMSH_SELECT){ + DrawVertexSupp = 0 ; + Tree_Action(M->Vertices,Draw_Mesh_Points); + } + glPointSize(4); + if(!CTX.geom.shade) InitNoShading(); + Draw_Geom(M); + break; + default : + break; + } + + if(CTX.render_mode != GMSH_SELECT){ + if(CTX.axes) + Draw_Axes(MiddleLC/4.); + if(CTX.post.draw) /* les init de shading se font par view */ + Draw_Post(); + } +} + +void Draw_Mesh_Volumes(void *a, void *b){ + Volume **v; + v = (Volume**)a; + Tree_Action((*v)->Simplexes, Draw_Simplex_Volume); + Tree_Action((*v)->Hexahedra, Draw_Hexahedron_Volume); + Tree_Action((*v)->Prisms, Draw_Prism_Volume); +} + +void PremierVolume(int iSurf, int *iVol); + +void Draw_Mesh_Surfaces (void *a,void *b){ + Surface **s; + s = (Surface**)a; + PremierVolume(abs((*s)->Num),&iVolume); + iVolume = -iVolume; + Tree_Action((*s)->Simplexes, Draw_Simplex_Surfaces); +} + +void Draw_Mesh_Curves (void *a, void *b){ + Curve **c; + + c = (Curve**)a; + if((*c)->Num < 0)return; + Tree_Action((*c)->Simplexes,Draw_Simplex_Points); +} + + +void Draw_Mesh_Points (void *a, void *b){ + Vertex **v; + char Num[100]; + + v = (Vertex**)a; + + if(CTX.render_mode == GMSH_SELECT){ + glLoadName(0); + glPushName((*v)->Num); + } + + glPointSize(3); + if(DrawVertexSupp) + glColor4ubv((GLubyte*)&CTX.color.mesh.vertex_supp); + else + glColor4ubv((GLubyte*)&CTX.color.mesh.vertex); + + if(CTX.mesh.points){ + glBegin(GL_POINTS); + glVertex3d((*v)->Pos.X, (*v)->Pos.Y, (*v)->Pos.Z); + glEnd(); + } + + if(CTX.mesh.points_num){ + sprintf(Num,"%d",(*v)->Num); + glRasterPos3d((*v)->Pos.X+3*CTX.pixel_equiv_x/CTX.s[0], + (*v)->Pos.Y+3*CTX.pixel_equiv_x/CTX.s[1], + (*v)->Pos.Z+3*CTX.pixel_equiv_x/CTX.s[2]); + Draw_String(Num); + } + + if(CTX.render_mode == GMSH_SELECT){ + glPopName(); + } +} + +/* ------------------------------------------------------------------------ */ +/* D r a w _ S i m p l e x */ +/* ------------------------------------------------------------------------ */ + +void Draw_Simplex_Volume (void *a, void *b){ + Simplex **s; + char Num[100]; + double X[4],Y[4],Z[4]; + + s = (Simplex**)a; + + if(!EntiteEstElleVisible((*s)->iEnt)) return; + + if(!(*s)->V[3]) return; + + /* + if(CTX.mesh.is_limit_gamma) + { + if((*s)->GammaShapeMeasure() > CTX.mesh.limit_gamma)return; + } + */ + + ColorSwitch((*s)->iEnt+1); + + double Xc = .25 * ((*s)->V[0]->Pos.X + (*s)->V[1]->Pos.X + (*s)->V[2]->Pos.X + (*s)->V[3]->Pos.X); + double Yc = .25 * ((*s)->V[0]->Pos.Y + (*s)->V[1]->Pos.Y + (*s)->V[2]->Pos.Y + (*s)->V[3]->Pos.Y); + double Zc = .25 * ((*s)->V[0]->Pos.Z + (*s)->V[1]->Pos.Z + (*s)->V[2]->Pos.Z + (*s)->V[3]->Pos.Z); + + for (int i=0 ; i<4 ; i++) { + X[i] = Xc + CTX.mesh.explode * ((*s)->V[i]->Pos.X - Xc); + Y[i] = Yc + CTX.mesh.explode * ((*s)->V[i]->Pos.Y - Yc); + Z[i] = Zc + CTX.mesh.explode * ((*s)->V[i]->Pos.Z - Zc); + } + + if(CTX.mesh.volumes){ + glBegin(GL_LINES); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[0], Y[0], Z[0]); + + glVertex3d(X[2], Y[2], Z[2]); + glVertex3d(X[0], Y[0], Z[0]); + + glVertex3d(X[3], Y[3], Z[3]); + glVertex3d(X[0], Y[0], Z[0]); + + glVertex3d(X[3], Y[3], Z[3]); + glVertex3d(X[1], Y[1], Z[1]); + + glVertex3d(X[3], Y[3], Z[3]); + glVertex3d(X[2], Y[2], Z[2]); + + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[2], Y[2], Z[2]); + + glVertex3d(X[2], Y[2], Z[2]); + glVertex3d(X[3], Y[3], Z[3]); + glEnd(); + } + + if(CTX.mesh.volumes_num){ + sprintf(Num,"%d",(*s)->Num); + glRasterPos3d(Xc,Yc,Zc); + Draw_String(Num); + } + + + if (CTX.mesh.dual){ + glColor4ubv((GLubyte*)&CTX.color.fg); + glEnable(GL_LINE_STIPPLE); + glLineStipple(1,0x0F0F); + gl2psEnable(GL2PS_LINE_STIPPLE); + glBegin(GL_LINES); + glVertex3d(Xc, Yc, Zc); + glVertex3d((X[0]+X[1]+X[2])/3., (Y[0]+Y[1]+Y[2])/3., (Z[0]+Z[1]+Z[2])/3.); + glVertex3d(Xc, Yc, Zc); + glVertex3d((X[0]+X[1]+X[3])/3., (Y[0]+Y[1]+Y[3])/3., (Z[0]+Z[1]+Z[3])/3.); + glVertex3d(Xc, Yc, Zc); + glVertex3d((X[0]+X[2]+X[3])/3., (Y[0]+Y[2]+Y[3])/3., (Z[0]+Z[2]+Z[3])/3.); + glVertex3d(Xc, Yc, Zc); + glVertex3d((X[1]+X[2]+X[3])/3., (Y[1]+Y[2]+Y[3])/3., (Z[1]+Z[2]+Z[3])/3.); + glEnd(); + glDisable(GL_LINE_STIPPLE); + gl2psDisable(GL2PS_LINE_STIPPLE); + } + +#if 0 /* never here for the moment */ + + double n[4], x1x0, y1y0, z1z0, x2x0, y2y0, z2z0; + + ColorSwitch((*s)->iEnt); + + if (CTX.mesh.hidden) { + glEnable(GL_POLYGON_OFFSET_FILL); + + x1x0 = X[1]-X[0]; y1y0 = Y[1]-Y[0]; + z1z0 = Z[1]-Z[0]; x2x0 = X[2]-X[0]; + y2y0 = Y[2]-Y[0]; z2z0 = Z[2]-Z[0]; + n[0] = y1y0 * z2z0 - z1z0 * y2y0 ; + n[1] = z1z0 * x2x0 - x1x0 * z2z0 ; + n[2] = x1x0 * y2y0 - y1y0 * x2x0; + glNormal3dv(n); + + glBegin(GL_TRIANGLES); + glVertex3d(X[0], Y[0], Z[0]); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[2], Y[2], Z[2]); + glEnd(); + + x1x0 = X[1]-X[0]; y1y0 = Y[1]-Y[0]; + z1z0 = Z[1]-Z[0]; x2x0 = X[3]-X[0]; + y2y0 = Y[3]-Y[0]; z2z0 = Z[3]-Z[0]; + n[0] = y1y0 * z2z0 - z1z0 * y2y0 ; + n[1] = z1z0 * x2x0 - x1x0 * z2z0 ; + n[2] = x1x0 * y2y0 - y1y0 * x2x0; + glNormal3dv(n); + + glBegin(GL_TRIANGLES); + glVertex3d(X[0], Y[0], Z[0]); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[3], Y[3], Z[3]); + glEnd(); + + x1x0 = X[3]-X[0]; y1y0 = Y[3]-Y[0]; + z1z0 = Z[3]-Z[0]; x2x0 = X[2]-X[0]; + y2y0 = Y[2]-Y[0]; z2z0 = Z[2]-Z[0]; + n[0] = y1y0 * z2z0 - z1z0 * y2y0 ; + n[1] = z1z0 * x2x0 - x1x0 * z2z0 ; + n[2] = x1x0 * y2y0 - y1y0 * x2x0; + glNormal3dv(n); + + + glBegin(GL_TRIANGLES); + glVertex3d(X[0], Y[0], Z[0]); + glVertex3d(X[2], Y[2], Z[2]); + glVertex3d(X[3], Y[3], Z[3]); + glEnd(); + + x1x0 = X[3]-X[1]; y1y0 = Y[3]-Y[1]; + z1z0 = Z[3]-Z[1]; x2x0 = X[2]-X[1]; + y2y0 = Y[2]-Y[1]; z2z0 = Z[2]-Z[1]; + n[0] = y1y0 * z2z0 - z1z0 * y2y0 ; + n[1] = z1z0 * x2x0 - x1x0 * z2z0 ; + n[2] = x1x0 * y2y0 - y1y0 * x2x0; + glNormal3dv(n); + + glBegin(GL_TRIANGLES); + glVertex3d(X[3], Y[3], Z[3]); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[2], Y[2], Z[2]); + glEnd(); + glDisable(GL_POLYGON_OFFSET_FILL); + } + +#endif + +} + + +void Draw_Simplex_Surfaces (void *a, void *b){ + + Simplex **s; + double X[4],Y[4],Z[4],Xc,Yc,Zc,pX[8],pY[8],pZ[8]; + double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0, n[3], m[3], mm; + int i,j,K,L,k,special; + char Num[256]; + + s = (Simplex**)a; + + if(!(*s)->V[2]) return ; + + if(!EntiteEstElleVisible ((*s)->iEnt)) return; + + if((*s)->VSUP) L=1; + else L=0; + + if ((*s)->V[3]) { + K = 4; + Xc = .25 * ((*s)->V[0]->Pos.X + (*s)->V[1]->Pos.X + (*s)->V[2]->Pos.X + (*s)->V[3]->Pos.X); + Yc = .25 * ((*s)->V[0]->Pos.Y + (*s)->V[1]->Pos.Y + (*s)->V[2]->Pos.Y + (*s)->V[3]->Pos.Y); + Zc = .25 * ((*s)->V[0]->Pos.Z + (*s)->V[1]->Pos.Z + (*s)->V[2]->Pos.Z + (*s)->V[3]->Pos.Z); + } + else { + K = 3; + Xc = .333333333333 * ((*s)->V[0]->Pos.X + (*s)->V[1]->Pos.X + (*s)->V[2]->Pos.X); + Yc = .333333333333 * ((*s)->V[0]->Pos.Y + (*s)->V[1]->Pos.Y + (*s)->V[2]->Pos.Y); + Zc = .333333333333 * ((*s)->V[0]->Pos.Z + (*s)->V[1]->Pos.Z + (*s)->V[2]->Pos.Z); + } + + k=0; + for (i=0 ; i<K ; i++) { + pX[k] = Xc + CTX.mesh.explode * ((*s)->V[i]->Pos.X - Xc); + pY[k] = Yc + CTX.mesh.explode * ((*s)->V[i]->Pos.Y - Yc); + pZ[k] = Zc + CTX.mesh.explode * ((*s)->V[i]->Pos.Z - Zc); + k+=(L+1); + } + + if(L){ + k=1; + for (i=0 ; i<K ; i++) { + pX[k] = Xc + CTX.mesh.explode * ((*s)->VSUP[i]->Pos.X - Xc); + pY[k] = Yc + CTX.mesh.explode * ((*s)->VSUP[i]->Pos.Y - Yc); + pZ[k] = Zc + CTX.mesh.explode * ((*s)->VSUP[i]->Pos.Z - Zc); + k+=(L+1); + } + } + + if (CTX.mesh.dual){ + glColor4ubv((GLubyte*)&CTX.color.fg); + glEnable(GL_LINE_STIPPLE); + glLineStipple(1,0x0F0F); + gl2psEnable(GL2PS_LINE_STIPPLE); + glBegin(GL_LINES); + for (i=0 ; i<K ; i++) { + (!i) ? j = K-1 : j = i-1 ; + glVertex3d(Xc, Yc, Zc); + glVertex3d((pX[i]+pX[j])/2., (pY[i]+pY[j])/2., (pZ[i]+pZ[j])/2.); + } + glEnd(); + glDisable(GL_LINE_STIPPLE); + gl2psDisable(GL2PS_LINE_STIPPLE); + } + + if (CTX.mesh.normals || CTX.mesh.shade){ + for (i=0 ; i<K ; i++) { + X[i] = Xc + CTX.mesh.explode * ((*s)->V[i]->Pos.X - Xc); + Y[i] = Yc + CTX.mesh.explode * ((*s)->V[i]->Pos.Y - Yc); + Z[i] = Zc + CTX.mesh.explode * ((*s)->V[i]->Pos.Z - Zc); + } + x1x0 = X[1]-X[0]; y1y0 = Y[1]-Y[0]; + z1z0 = Z[1]-Z[0]; x2x0 = X[2]-X[0]; + y2y0 = Y[2]-Y[0]; z2z0 = Z[2]-Z[0]; + n[0] = m[0] = y1y0 * z2z0 - z1z0 * y2y0 ; + n[1] = m[1] = z1z0 * x2x0 - x1x0 * z2z0 ; + n[2] = m[2] = x1x0 * y2y0 - y1y0 * x2x0; + // norme(n); not necessary with glEnable(GL_NORMALIZE); + /* BOF BOF BOF */ + if(n[2] < -0.1){ + n[0] = -n[0]; + n[1] = -n[1]; + n[2] = -n[2]; + } + + } + + if (CTX.mesh.hidden && CTX.mesh.shade){ + glNormal3dv(n); + } + + ColorSwitch(abs(iVolume)); + + if(CTX.mesh.surfaces_num){ + sprintf(Num,"%d",(*s)->Num); + glRasterPos3d(Xc,Yc,Zc); + Draw_String(Num); + } + + + if(CTX.mesh.surfaces){ + + special = + CTX.mesh.hidden && + CTX.stream == TO_FILE && + (CTX.print.type == GLPPAINTER || CTX.print.type == GLPRECURSIVE) ; + + + if (CTX.mesh.hidden) { + glEnable(GL_POLYGON_OFFSET_FILL); + glBegin(GL_POLYGON); + for(i=0 ; i<K*(1+L) ; i++) glVertex3d(pX[i], pY[i], pZ[i]); + glEnd(); + glDisable(GL_POLYGON_OFFSET_FILL); + } + + if(CTX.mesh.lines && !special){ + glColor4ubv((GLubyte*)&CTX.color.mesh.line); + glBegin(GL_LINE_LOOP); + for(i=0 ; i<K*(1+L) ; i++){ + glVertex3d(pX[i],pY[i],pZ[i]); + } + glEnd(); + } + + } + + if(CTX.mesh.normals) { + norme(m); + glColor4ubv((GLubyte*)&CTX.color.mesh.normals); + m[0] *= CTX.mesh.normals * CTX.pixel_equiv_x/CTX.s[0] ; + m[1] *= CTX.mesh.normals * CTX.pixel_equiv_x/CTX.s[1] ; + m[2] *= CTX.mesh.normals * CTX.pixel_equiv_x/CTX.s[2] ; + mm=sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]); + Draw_Vector(DRAW_POST_ARROW, 0, Xc,Yc,Zc, mm, m[0],m[1],m[2],NULL,NULL); + } + + +} + + +void Draw_Simplex_Points(void *a,void *b){ + Simplex *s; + char Num[100]; + + s = *(Simplex**)a; + + glColor4ubv((GLubyte*)&CTX.color.mesh.vertex); + + glBegin(GL_POINTS); + glVertex3d(s->V[1]->Pos.X, s->V[1]->Pos.Y, s->V[1]->Pos.Z); + glEnd(); + + if(s->VSUP){ + glColor4ubv((GLubyte*)&CTX.color.mesh.vertex_supp); + glBegin(GL_POINTS); + glVertex3d(s->VSUP[0]->Pos.X, s->VSUP[0]->Pos.Y, s->VSUP[0]->Pos.Z); + glEnd(); + } + + if(CTX.mesh.lines_num){ + glColor4ubv((GLubyte*)&CTX.color.mesh.line); + sprintf(Num,"%d",s->Num); + glRasterPos3d(0.5*(s->V[0]->Pos.X+s->V[1]->Pos.X) + 3*CTX.pixel_equiv_x/CTX.s[0], + 0.5*(s->V[0]->Pos.Y+s->V[1]->Pos.Y) + 3*CTX.pixel_equiv_x/CTX.s[1], + 0.5*(s->V[0]->Pos.Z+s->V[1]->Pos.Z) + 3*CTX.pixel_equiv_x/CTX.s[2]); + Draw_String(Num); + } + + +} + + +/* ------------------------------------------------------------------------ */ +/* D r a w _ H e x a e d r o n */ +/* ------------------------------------------------------------------------ */ + +void Draw_Hexahedron_Volume (void *a, void *b){ + Hexahedron **h; + int i ; + double Xc = 0.0 , Yc = 0.0, Zc = 0.0 ; + + h = (Hexahedron**)a; + + if(!EntiteEstElleVisible((*h)->iEnt)) return; + + //glColor4ubv((GLubyte*)&CTX.color.mesh.hexahedron); + ColorSwitch((*h)->iEnt+1); + + glBegin(GL_LINE_LOOP); + glVertex3d((*h)->V[0]->Pos.X, (*h)->V[0]->Pos.Y, (*h)->V[0]->Pos.Z); + glVertex3d((*h)->V[1]->Pos.X, (*h)->V[1]->Pos.Y, (*h)->V[1]->Pos.Z); + glVertex3d((*h)->V[2]->Pos.X, (*h)->V[2]->Pos.Y, (*h)->V[2]->Pos.Z); + glVertex3d((*h)->V[3]->Pos.X, (*h)->V[3]->Pos.Y, (*h)->V[3]->Pos.Z); + glEnd(); + + glBegin(GL_LINE_LOOP); + glVertex3d((*h)->V[4]->Pos.X, (*h)->V[4]->Pos.Y, (*h)->V[4]->Pos.Z); + glVertex3d((*h)->V[5]->Pos.X, (*h)->V[5]->Pos.Y, (*h)->V[5]->Pos.Z); + glVertex3d((*h)->V[6]->Pos.X, (*h)->V[6]->Pos.Y, (*h)->V[6]->Pos.Z); + glVertex3d((*h)->V[7]->Pos.X, (*h)->V[7]->Pos.Y, (*h)->V[7]->Pos.Z); + glEnd(); + + glBegin(GL_LINES); + glVertex3d((*h)->V[0]->Pos.X, (*h)->V[0]->Pos.Y, (*h)->V[0]->Pos.Z); + glVertex3d((*h)->V[4]->Pos.X, (*h)->V[4]->Pos.Y, (*h)->V[4]->Pos.Z); + glVertex3d((*h)->V[1]->Pos.X, (*h)->V[1]->Pos.Y, (*h)->V[1]->Pos.Z); + glVertex3d((*h)->V[5]->Pos.X, (*h)->V[5]->Pos.Y, (*h)->V[5]->Pos.Z); + glVertex3d((*h)->V[2]->Pos.X, (*h)->V[2]->Pos.Y, (*h)->V[2]->Pos.Z); + glVertex3d((*h)->V[6]->Pos.X, (*h)->V[6]->Pos.Y, (*h)->V[6]->Pos.Z); + glVertex3d((*h)->V[3]->Pos.X, (*h)->V[3]->Pos.Y, (*h)->V[3]->Pos.Z); + glVertex3d((*h)->V[7]->Pos.X, (*h)->V[7]->Pos.Y, (*h)->V[7]->Pos.Z); + glEnd(); + + if (CTX.mesh.dual){ + for(i=0 ; i<8 ; i++){ + Xc += (*h)->V[i]->Pos.X; + Yc += (*h)->V[i]->Pos.Y; + Zc += (*h)->V[i]->Pos.Z; + } + Xc /= 8. ; + Zc /= 8. ; + Yc /= 8. ; + + glColor4ubv((GLubyte*)&CTX.color.fg); + glEnable(GL_LINE_STIPPLE); + glLineStipple(1,0x0F0F); + gl2psEnable(GL2PS_LINE_STIPPLE); + glBegin(GL_LINES); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*h)->V[0]->Pos.X+(*h)->V[1]->Pos.X+(*h)->V[5]->Pos.X+(*h)->V[4]->Pos.X)/4., + ((*h)->V[0]->Pos.Y+(*h)->V[1]->Pos.Y+(*h)->V[5]->Pos.Y+(*h)->V[4]->Pos.Y)/4., + ((*h)->V[0]->Pos.Z+(*h)->V[1]->Pos.Z+(*h)->V[5]->Pos.Z+(*h)->V[4]->Pos.Z)/4. ); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*h)->V[0]->Pos.X+(*h)->V[3]->Pos.X+(*h)->V[2]->Pos.X+(*h)->V[1]->Pos.X)/4., + ((*h)->V[0]->Pos.Y+(*h)->V[3]->Pos.Y+(*h)->V[2]->Pos.Y+(*h)->V[1]->Pos.Y)/4., + ((*h)->V[0]->Pos.Z+(*h)->V[3]->Pos.Z+(*h)->V[2]->Pos.Z+(*h)->V[1]->Pos.Z)/4. ); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*h)->V[0]->Pos.X+(*h)->V[4]->Pos.X+(*h)->V[7]->Pos.X+(*h)->V[3]->Pos.X)/4., + ((*h)->V[0]->Pos.Y+(*h)->V[4]->Pos.Y+(*h)->V[7]->Pos.Y+(*h)->V[3]->Pos.Y)/4., + ((*h)->V[0]->Pos.Z+(*h)->V[4]->Pos.Z+(*h)->V[7]->Pos.Z+(*h)->V[3]->Pos.Z)/4. ); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*h)->V[1]->Pos.X+(*h)->V[2]->Pos.X+(*h)->V[6]->Pos.X+(*h)->V[5]->Pos.X)/4., + ((*h)->V[1]->Pos.Y+(*h)->V[2]->Pos.Y+(*h)->V[6]->Pos.Y+(*h)->V[5]->Pos.Y)/4., + ((*h)->V[1]->Pos.Z+(*h)->V[2]->Pos.Z+(*h)->V[6]->Pos.Z+(*h)->V[5]->Pos.Z)/4. ); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*h)->V[2]->Pos.X+(*h)->V[3]->Pos.X+(*h)->V[7]->Pos.X+(*h)->V[6]->Pos.X)/4., + ((*h)->V[2]->Pos.Y+(*h)->V[3]->Pos.Y+(*h)->V[7]->Pos.Y+(*h)->V[6]->Pos.Y)/4., + ((*h)->V[2]->Pos.Z+(*h)->V[3]->Pos.Z+(*h)->V[7]->Pos.Z+(*h)->V[6]->Pos.Z)/4. ); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*h)->V[4]->Pos.X+(*h)->V[5]->Pos.X+(*h)->V[6]->Pos.X+(*h)->V[7]->Pos.X)/4., + ((*h)->V[4]->Pos.Y+(*h)->V[5]->Pos.Y+(*h)->V[6]->Pos.Y+(*h)->V[7]->Pos.Y)/4., + ((*h)->V[4]->Pos.Z+(*h)->V[5]->Pos.Z+(*h)->V[6]->Pos.Z+(*h)->V[7]->Pos.Z)/4. ); + glEnd(); + glDisable(GL_LINE_STIPPLE); + gl2psDisable(GL2PS_LINE_STIPPLE); + } + +} + +/* ------------------------------------------------------------------------ */ +/* D r a w _ P r i s m */ +/* ------------------------------------------------------------------------ */ + +void Draw_Prism_Volume (void *a, void *b){ + Prism **p; + int i ; + double Xc = 0.0 , Yc = 0.0, Zc = 0.0 ; + + p = (Prism**)a; + + if(!EntiteEstElleVisible((*p)->iEnt)) return; + + //glColor4ubv((GLubyte*)&CTX.color.mesh.prism); + ColorSwitch((*p)->iEnt+1); + + glBegin(GL_LINE_LOOP); + glVertex3d((*p)->V[0]->Pos.X, (*p)->V[0]->Pos.Y, (*p)->V[0]->Pos.Z); + glVertex3d((*p)->V[1]->Pos.X, (*p)->V[1]->Pos.Y, (*p)->V[1]->Pos.Z); + glVertex3d((*p)->V[2]->Pos.X, (*p)->V[2]->Pos.Y, (*p)->V[2]->Pos.Z); + glEnd(); + + glBegin(GL_LINE_LOOP); + glVertex3d((*p)->V[3]->Pos.X, (*p)->V[3]->Pos.Y, (*p)->V[3]->Pos.Z); + glVertex3d((*p)->V[4]->Pos.X, (*p)->V[4]->Pos.Y, (*p)->V[4]->Pos.Z); + glVertex3d((*p)->V[5]->Pos.X, (*p)->V[5]->Pos.Y, (*p)->V[5]->Pos.Z); + glEnd(); + + glBegin(GL_LINES); + glVertex3d((*p)->V[0]->Pos.X, (*p)->V[0]->Pos.Y, (*p)->V[0]->Pos.Z); + glVertex3d((*p)->V[3]->Pos.X, (*p)->V[3]->Pos.Y, (*p)->V[3]->Pos.Z); + glVertex3d((*p)->V[1]->Pos.X, (*p)->V[1]->Pos.Y, (*p)->V[1]->Pos.Z); + glVertex3d((*p)->V[4]->Pos.X, (*p)->V[4]->Pos.Y, (*p)->V[4]->Pos.Z); + glVertex3d((*p)->V[2]->Pos.X, (*p)->V[2]->Pos.Y, (*p)->V[2]->Pos.Z); + glVertex3d((*p)->V[5]->Pos.X, (*p)->V[5]->Pos.Y, (*p)->V[5]->Pos.Z); + glEnd(); + + if (CTX.mesh.dual){ + for(i=0 ; i<6 ; i++){ + Xc += (*p)->V[i]->Pos.X; + Yc += (*p)->V[i]->Pos.Y; + Zc += (*p)->V[i]->Pos.Z; + } + Xc /= 6. ; + Zc /= 6. ; + Yc /= 6. ; + + glColor4ubv((GLubyte*)&CTX.color.fg); + glEnable(GL_LINE_STIPPLE); + glLineStipple(1,0x0F0F); + gl2psEnable(GL2PS_LINE_STIPPLE); + glBegin(GL_LINES); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*p)->V[0]->Pos.X+(*p)->V[2]->Pos.X+(*p)->V[1]->Pos.X)/3., + ((*p)->V[0]->Pos.Y+(*p)->V[2]->Pos.Y+(*p)->V[1]->Pos.Y)/3., + ((*p)->V[0]->Pos.Z+(*p)->V[2]->Pos.Z+(*p)->V[1]->Pos.Z)/3. ); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*p)->V[3]->Pos.X+(*p)->V[4]->Pos.X+(*p)->V[5]->Pos.X)/3., + ((*p)->V[3]->Pos.Y+(*p)->V[4]->Pos.Y+(*p)->V[5]->Pos.Y)/3., + ((*p)->V[3]->Pos.Z+(*p)->V[4]->Pos.Z+(*p)->V[5]->Pos.Z)/3. ); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*p)->V[0]->Pos.X+(*p)->V[1]->Pos.X+(*p)->V[4]->Pos.X+(*p)->V[3]->Pos.X)/4., + ((*p)->V[0]->Pos.Y+(*p)->V[1]->Pos.Y+(*p)->V[4]->Pos.Y+(*p)->V[3]->Pos.Y)/4., + ((*p)->V[0]->Pos.Z+(*p)->V[1]->Pos.Z+(*p)->V[4]->Pos.Z+(*p)->V[3]->Pos.Z)/4. ); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*p)->V[0]->Pos.X+(*p)->V[3]->Pos.X+(*p)->V[5]->Pos.X+(*p)->V[2]->Pos.X)/4., + ((*p)->V[0]->Pos.Y+(*p)->V[3]->Pos.Y+(*p)->V[5]->Pos.Y+(*p)->V[2]->Pos.Y)/4., + ((*p)->V[0]->Pos.Z+(*p)->V[3]->Pos.Z+(*p)->V[5]->Pos.Z+(*p)->V[2]->Pos.Z)/4. ); + glVertex3d(Xc, Yc, Zc); + glVertex3d + ( ((*p)->V[1]->Pos.X+(*p)->V[2]->Pos.X+(*p)->V[5]->Pos.X+(*p)->V[4]->Pos.X)/4., + ((*p)->V[1]->Pos.Y+(*p)->V[2]->Pos.Y+(*p)->V[5]->Pos.Y+(*p)->V[4]->Pos.Y)/4., + ((*p)->V[1]->Pos.Z+(*p)->V[2]->Pos.Z+(*p)->V[5]->Pos.Z+(*p)->V[4]->Pos.Z)/4. ); + glEnd(); + glDisable(GL_LINE_STIPPLE); + gl2psDisable(GL2PS_LINE_STIPPLE); + } + + +} + diff --git a/Graphics/Post.cpp b/Graphics/Post.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7b9d084f0cc8a606a66b0ce6d6d11ed2f26483ff --- /dev/null +++ b/Graphics/Post.cpp @@ -0,0 +1,207 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Views.h" +#include "Context.h" + +extern Context_T CTX; +extern List_T *Post_ViewList; + +static double Raise[3][5]; +static double RaiseFactor[3]; + +/* ------------------------------------------------------------------------ + Give Value from Index + ------------------------------------------------------------------------ */ + +double GiveValueFromIndex_Lin(double ValMin, double ValMax, int NbIso, int Iso){ + if(NbIso==1) return (ValMax+ValMin)/2.; + return ValMin + Iso*(ValMax-ValMin)/(NbIso-1.) ; +} + +double GiveValueFromIndex_Log(double ValMin, double ValMax, int NbIso, int Iso){ + if(NbIso==1) return (ValMax+ValMin)/2.; + if(ValMin <= 0.) return 0. ; + return pow(10.,log10(ValMin)+Iso*(log10(ValMax)-log10(ValMin))/(NbIso-1.)) ; +} + + +/* ------------------------------------------------------------------------ + Give Index From Value + ------------------------------------------------------------------------ */ + +int GiveIndexFromValue_Lin(double ValMin, double ValMax, int NbIso, double Val){ + if(ValMin==ValMax) return NbIso/2 ; + return (int)((Val-ValMin)*(NbIso-1)/(ValMax-ValMin)) ; +} + +int GiveIndexFromValue_Log(double ValMin, double ValMax, int NbIso, double Val){ + if(ValMin==ValMax) return NbIso/2 ; + if(ValMin <= 0.) return 0 ; + return (int)((log10(Val)-log10(ValMin))*(NbIso-1)/(log10(ValMax)-log10(ValMin))) ; +} + + +/* ------------------------------------------------------------------------ + Color Palette + ------------------------------------------------------------------------ */ + +void Palette(Post_View *v, int nbi, int i){ /* i in [0,nbi-1] */ + int index ; + + index = (nbi==1) ? + v->CT.size/2 : + (int) (i/(double)(nbi-1)*(v->CT.size-1)) ; + + glColor4ubv( (GLubyte *) &v->CT.table[index] ); +} + +void Palette2(Post_View *v,double min, double max, double val){ /* val in [min,max] */ + int index; + + index = (int)( (val-min)/(max-min)*(v->CT.size-1) ); + + glColor4ubv((GLubyte *) &v->CT.table[index]); +} + +void RaiseFill(int i, double Val, double ValMin, double Raise[3][5]){ + int j ; + for(j=0 ; j<3 ; j++) Raise[j][i] = (Val-ValMin) * RaiseFactor[j] ; +} + + +int fcmp_Post_Triangle(const void *a, const void *b){ + return 0; + +#if 0 + Post_Triangle *PT; + double bary1[3], bary2[3]; + + /* sorting % eye with barycenters */ + + z1 = (PT->X[1]+View->Offset[0]+Raise[0][1]) + (PT->X[0]+View->Offset[0]+Raise[0][0]); + y1y0 = (PT->Y[1]+View->Offset[1]+Raise[1][1]) - (PT->Y[0]+View->Offset[1]+Raise[1][0]); + z1z0 = (PT->Z[1]+View->Offset[2]+Raise[2][1]) - (PT->Z[0]+View->Offset[2]+Raise[2][0]); + + x2x0 = (PT->X[2]+View->Offset[0]+Raise[0][2]) - (PT->X[0]+View->Offset[0]+Raise[0][0]); + y2y0 = (PT->Y[2]+View->Offset[1]+Raise[1][2]) - (PT->Y[0]+View->Offset[1]+Raise[1][0]); + z2z0 = (PT->Z[2]+View->Offset[2]+Raise[2][2]) - (PT->Z[0]+View->Offset[2]+Raise[2][0]); + + q = *(GL2PSprimitive**)a; + w = *(GL2PSprimitive**)b; + diff = q->depth - w->depth; + if(diff > 0.) + return 1; + else if(diff < 0.) + return -1; + else + return 0; +#endif +} + +/* ------------------------------------------------------------------------ + D r a w _ P o s t + ------------------------------------------------------------------------ */ + +void Draw_Post (void) { + int i,j,k,n; + double ValMin,ValMax,AbsMax; + Post_View *v; + + if(!Post_ViewList) return; + + for(i=0 ; i<List_Nbr(Post_ViewList) ; i++){ + + v = (Post_View*)List_Pointer(Post_ViewList,i); + + if(v->Visible){ + + if(CTX.display_lists && !v->Changed && glIsList(v->Num)){ + + glCallList(v->Num); + + } + else{ + + if(CTX.display_lists){ + if(glIsList(v->Num)) glDeleteLists(v->Num,1); + // printf("new dl\n"); + glNewList(v->Num, GL_COMPILE_AND_EXECUTE); + } + + if(v->Light && v->IntervalsType != DRAW_POST_ISO){ + InitShading(); + } + else{ + InitNoShading(); + } + + /* force this */ + if(v->IntervalsType == DRAW_POST_CONTINUOUS) + glShadeModel(GL_SMOOTH); + + switch(v->RangeType){ + case DRAW_POST_DEFAULT : ValMin = v->Min ; ValMax = v->Max ; break; + case DRAW_POST_CUSTOM : ValMin = v->CustomMin ; ValMax = v->CustomMax ; break; + } + + switch(v->ScaleType){ + case DRAW_POST_LINEAR : + v->GIFV = GiveIndexFromValue_Lin ; + v->GVFI = GiveValueFromIndex_Lin ; + break; + case DRAW_POST_LOGARITHMIC : + v->GIFV = GiveIndexFromValue_Log ; + v->GVFI = GiveValueFromIndex_Log ; + break; + } + + AbsMax = DMAX(fabs(ValMin),fabs(ValMax)); + AbsMax = (AbsMax==0.) ? 1. : AbsMax; + + for(j=0;j<3;j++){ + RaiseFactor[j] = v->Raise[j] / AbsMax ; + for(k=0;k<5;k++) Raise[j][k] = 0. ; + } + + if((n = List_Nbr(v->Simplices))) + for(j=0 ; j<n ; j++) + Draw_Post_Simplex(v, (Post_Simplex*)List_Pointer(v->Simplices,j), + ValMin, ValMax, Raise); + + if((n = List_Nbr(v->Triangles))){ + //if(there is alpha)List_Sort(v->Triangles, fcmp_Post_Triangle); + for(j=0 ; j<n ; j++) + Draw_Post_Triangle(v, (Post_Triangle*)List_Pointer(v->Triangles,j), + ValMin, ValMax, Raise); + } + + if((n = List_Nbr(v->Lines))) + for(j=0 ; j<n ; j++) + Draw_Post_Line(v, (Post_Line*)List_Pointer(v->Lines,j), + ValMin, ValMax, Raise); + + if((n = List_Nbr(v->Points))) + for(j=0 ; j<n ; j++) + Draw_Post_Point(v, (Post_Point*)List_Pointer(v->Points,j), + ValMin, ValMax, Raise); + + if(CTX.display_lists){ + glEndList(); + v->Changed=0; + } + + } + + } + + } + + /* revenir au shading par defaut, pour l'echelle */ + InitNoShading(); + +} + diff --git a/Graphics/PostLine.cpp b/Graphics/PostLine.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f4646658661caae9ff15cd7580e4b733f99bea7b --- /dev/null +++ b/Graphics/PostLine.cpp @@ -0,0 +1,131 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Iso.h" +#include "Context.h" + +extern Context_T CTX; +extern double LC; + +void Draw_Post_Line(Post_View *View, Post_Line *PL, + double ValMin, double ValMax, double Raise[3][5]){ + + int i,k,nb=0; + double d,dx,dy,dz,fact; + double Xp[5],Yp[5],Zp[5],value[5],thev; + char Num[100] ; + + switch(PL->Type){ + case DRAW_POST_SCALAR: + + if(View->IntervalsType==DRAW_POST_NUMERIC){ + d = (PL->V[2*View->TimeStep]+PL->V[2*View->TimeStep+1]) / 2.; + if(d >= ValMin && d <= ValMax){ + sprintf(Num, "%g", d); + glColor4ubv((GLubyte*)&CTX.color.fg); + glRasterPos3d((PL->X[0] + PL->X[1])/2., + (PL->Y[0] + PL->Y[1])/2., + (PL->Z[0] + PL->Z[1])/2.); + Draw_String(Num); + } + break ; + } + + glDisable(GL_LINE_STIPPLE); + for(k=0 ; k<2 ; k++) RaiseFill(k, PL->V[2*View->TimeStep+k], ValMin, Raise); + + if(View->IntervalsType==DRAW_POST_CONTINUOUS){ + glBegin(GL_LINES); + Palette2(View,ValMin,ValMax,PL->V[2*View->TimeStep]); + glVertex3d(PL->X[0]+View->Offset[0]+Raise[0][0], + PL->Y[0]+View->Offset[1]+Raise[1][0], + PL->Z[0]+View->Offset[2]+Raise[2][0]); + Palette2(View,ValMin,ValMax,PL->V[2*View->TimeStep+1]); + glVertex3d(PL->X[1]+View->Offset[0]+Raise[0][1], + PL->Y[1]+View->Offset[1]+Raise[1][1], + PL->Z[1]+View->Offset[2]+Raise[2][1]); + glEnd(); + } + else{ + for(k=0 ; k<View->NbIso ; k++){ + Palette(View,View->NbIso,k); + if(View->IntervalsType==DRAW_POST_DISCRETE){ + CutLine1D(PL->X,PL->Y,PL->Z,&PL->V[2*View->TimeStep], + View->GVFI(ValMin,ValMax,View->NbIso+1,k), + View->GVFI(ValMin,ValMax,View->NbIso+1,k+1), + ValMin,ValMax,Xp,Yp,Zp,&nb,value); + if(nb == 2){ + for(i=0;i<2;i++) RaiseFill(i,value[i],ValMin,Raise); + Draw_Line(Xp,Yp,Zp,View->Offset,Raise); + } + } + else{ + thev = View->GVFI(ValMin,ValMax,View->NbIso,k); + CutLine0D(PL->X,PL->Y,PL->Z,&PL->V[2*View->TimeStep], + thev, ValMin,ValMax,Xp,Yp,Zp,&nb); + if(nb){ + RaiseFill(0,thev,ValMin,Raise); + Draw_Point(Xp,Yp,Zp,View->Offset,Raise); + } + } + } + + } + break; + + case DRAW_POST_VECTOR: + if(View->ArrowLocation == DRAW_POST_LOCATE_COG){ + dx = 0.5 * (PL->V[6*View->TimeStep] +PL->V[6*View->TimeStep+3]); + dy = 0.5 * (PL->V[6*View->TimeStep+1]+PL->V[6*View->TimeStep+4]); + dz = 0.5 * (PL->V[6*View->TimeStep+2]+PL->V[6*View->TimeStep+5]); + d = sqrt(dx*dx+dy*dy+dz*dz); + if(d!=0.0 && d>=ValMin && d<=ValMax){ + Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d)); + fact = 2.e-4 * LC * View->ArrowScale/View->Max ; + if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){ + dx /= d ; dy /= d ; dz /= d ; + d = log10(d/ValMin) ; + dx *= d ; dy *= d ; dz *= d ; + } + RaiseFill(0, d, ValMin, Raise); + Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO, + 0.5 * (PL->X[0] + PL->X[1]), + 0.5 * (PL->Y[0] + PL->Y[1]), + 0.5 * (PL->Z[0] + PL->Z[1]), + fact*d, fact*dx, fact*dy, fact*dz, + View->Offset, Raise); + } + } + else{ + for(k=0 ; k<2 ; k++){ + dx = PL->V[6*View->TimeStep +3*k] ; + dy = PL->V[6*View->TimeStep+1+3*k] ; + dz = PL->V[6*View->TimeStep+2+3*k] ; + d = sqrt(dx*dx+dy*dy+dz*dz); + if(d!=0.0 && d>=ValMin && d<=ValMax){ + Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d)); + fact = 2.e-4 * LC * View->ArrowScale/View->Max ; + if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){ + dx /= d ; dy /= d ; dz /= d ; + d = log10(d/ValMin) ; + dx *= d ; dy *= d ; dz *= d ; + } + RaiseFill(0, d, ValMin, Raise); + Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO, + PL->X[k], PL->Y[k], PL->Z[k], + fact*d, fact*dx, fact*dy, fact*dz, + View->Offset, Raise); + } + } + } + break; + + case DRAW_POST_TENSOR : + break; + + } +} + diff --git a/Graphics/PostPoint.cpp b/Graphics/PostPoint.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ca9a2046a75b2a654a1362eca482ceedd3fba6e8 --- /dev/null +++ b/Graphics/PostPoint.cpp @@ -0,0 +1,85 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Iso.h" +#include "Context.h" + +extern Context_T CTX; +extern double LC; + +int GiveIndexFromValue_Lin(double ValMin, double ValMax, int NbIso, double Val) ; + +void Draw_Post_Point(Post_View *View, Post_Point *PP, + double ValMin, double ValMax, double Raise[3][5]){ + + int i; + double d,dx,dy,dz,fact; + + switch(PP->Type){ + + case DRAW_POST_SCALAR: + d = PP->V[View->TimeStep]; + if(d>=ValMin && d<=ValMax){ + Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d)); + glBegin(GL_POINTS); + glVertex3d(PP->X, PP->Y, PP->Z); + glEnd(); + } + break; + + case DRAW_POST_VECTOR: + + if(View->ArrowType == DRAW_POST_DISPLACEMENT){ + fact = View->ArrowScale/100. ; + glColor4ubv((GLubyte*)&CTX.color.fg); + glBegin(GL_POINTS); + glVertex3d(fact*PP->V[3*View->TimeStep], + fact*PP->V[3*View->TimeStep+1], + fact*PP->V[3*View->TimeStep+2]); + glEnd(); + if(View->TimeStep){ + glBegin(GL_LINE_STRIP); + for(i=0 ; i<View->TimeStep+1 ; i++) + glVertex3d(fact*PP->V[3*(View->TimeStep-i)], + fact*PP->V[3*(View->TimeStep-i)+1], + fact*PP->V[3*(View->TimeStep-i)+2]); + glEnd(); + } + break; + } + + dx = PP->V[3*View->TimeStep]; + dy = PP->V[3*View->TimeStep+1]; + dz = PP->V[3*View->TimeStep+2]; + d = sqrt(dx*dx+dy*dy+dz*dz); + + if(d!=0.0 && d>=ValMin && d<=ValMax){ + + Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d)); + + fact = 2.e-4 * LC * View->ArrowScale/View->Max ; + + if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){ + dx /= d ; dy /= d ; dz /= d ; + d = log10(d/ValMin) ; + dx *= d ; dy *= d ; dz *= d ; + } + + RaiseFill(0, d, ValMin, Raise); + + Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO, + PP->X, PP->Y, PP->Z, + fact*d, fact*dx, fact*dy, fact*dz, + View->Offset, Raise); + } + break; + + case DRAW_POST_TENSOR : + break; + + } +} + diff --git a/Graphics/PostSimplex.cpp b/Graphics/PostSimplex.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c9ec1d518948bddbc04540d99bedc4ec3886b409 --- /dev/null +++ b/Graphics/PostSimplex.cpp @@ -0,0 +1,92 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Iso.h" +#include "Context.h" + +extern Context_T CTX; +extern double LC; + +void Draw_Post_Simplex(Post_View *View, Post_Simplex *PS, + double ValMin, double ValMax, double Raise[3][5]){ + + int k; + double d,dx,dy,dz,fact; + + switch(PS->Type){ + case DRAW_POST_SCALAR: + for(k=0 ; k<View->NbIso ; k++){ + Palette(View,View->NbIso,k); + IsoSimplex(PS->X, PS->Y, PS->Z, &PS->V[4*View->TimeStep], + View->GVFI(ValMin,ValMax,View->NbIso,k), + ValMin, ValMax, View->Offset, Raise, View->Light); + } + break; + + /* + la plus grande fleche (d=ValMax) est de taille LC/50 + (View->ArrowScale == 100 par defaut) + */ + + case DRAW_POST_VECTOR: + if(View->ArrowLocation == DRAW_POST_LOCATE_COG){ + dx = 0.25 * (PS->V[12*View->TimeStep] +PS->V[12*View->TimeStep+3]+ + PS->V[12*View->TimeStep+6]+PS->V[12*View->TimeStep+9] ); + dy = 0.25 * (PS->V[12*View->TimeStep+1]+PS->V[12*View->TimeStep+4]+ + PS->V[12*View->TimeStep+7]+PS->V[12*View->TimeStep+10] ); + dz = 0.25 * (PS->V[12*View->TimeStep+2]+PS->V[12*View->TimeStep+5]+ + PS->V[12*View->TimeStep+8]+PS->V[12*View->TimeStep+11] ); + d = sqrt(dx*dx+dy*dy+dz*dz); + + if(d!=0.0 && d>=ValMin && d<=ValMax){ + Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d)); + fact = 2.e-4 * LC * View->ArrowScale/View->Max ; + if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){ + dx /= d ; dy /= d ; dz /= d ; + d = log10(d/ValMin) ; + dx *= d ; dy *= d ; dz *= d ; + } + RaiseFill(0, d, ValMin, Raise); + Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO, + 0.25 * (PS->X[0] + PS->X[1] + PS->X[2] + PS->X[3]), + 0.25 * (PS->Y[0] + PS->Y[1] + PS->Y[2] + PS->Y[3]), + 0.25 * (PS->Z[0] + PS->Z[1] + PS->Z[2] + PS->Z[3]), + fact*d, fact*dx, fact*dy, fact*dz, + View->Offset, Raise); + } + } + else{ + for(k=0 ; k<4 ; k++){ + dx = PS->V[12*View->TimeStep +3*k] ; + dy = PS->V[12*View->TimeStep+1+3*k] ; + dz = PS->V[12*View->TimeStep+2+3*k] ; + d = sqrt(dx*dx+dy*dy+dz*dz); + + if(d!=0.0 && d>=ValMin && d<=ValMax){ + Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d)); + fact = 2.e-4 * LC * View->ArrowScale/View->Max ; + if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){ + dx /= d ; dy /= d ; dz /= d ; + d = log10(d/ValMin) ; + dx *= d ; dy *= d ; dz *= d ; + } + RaiseFill(0, d, ValMin, Raise); + Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO, + PS->X[k], PS->Y[k], PS->Z[k], + fact*d, fact*dx, fact*dy, fact*dz, + View->Offset, Raise); + } + } + } + break; + + case DRAW_POST_TENSOR : + break; + + } + +} + diff --git a/Graphics/PostTriangle.cpp b/Graphics/PostTriangle.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1e2d9c25243fd13382a8159fc08a6cc3a7e0b8bf --- /dev/null +++ b/Graphics/PostTriangle.cpp @@ -0,0 +1,219 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Iso.h" +#include "Context.h" + +extern Context_T CTX; +extern double LC; + +void Draw_Post_Triangle(Post_View *View, Post_Triangle *PT, + double ValMin, double ValMax, double Raise[3][5]){ + + int i, k, m, nb=0; + double d,dx,dy,dz,fact; + double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0, nn[3]; + double xx[3],yy[3],zz[3]; + double Xp[5],Yp[5],Zp[5],value[5],thev; + char Num[100] ; + + if(View->ShowElement) + glEnable(GL_POLYGON_OFFSET_FILL); + + switch(PT->Type){ + + case DRAW_POST_SCALAR: + + if(View->IntervalsType==DRAW_POST_NUMERIC){ + d = (PT->V[3*View->TimeStep]+PT->V[3*View->TimeStep+1]+PT->V[3*View->TimeStep+2]) / 3.; + if(d >= ValMin && d <= ValMax){ + sprintf(Num, "%g", d); + glColor4ubv((GLubyte*)&CTX.color.fg); + glRasterPos3d((PT->X[0] + PT->X[1] + PT->X[2])/3., + (PT->Y[0] + PT->Y[1] + PT->Y[2])/3., + (PT->Z[0] + PT->Z[1] + PT->Z[2])/3.); + Draw_String(Num); + } + break ; + } + + if(View->IntervalsType!=DRAW_POST_ISO) + for(i=0;i<3;i++)RaiseFill(i, PT->V[3*View->TimeStep+i], ValMin, Raise); + + if(View->Light){ + x1x0 = (PT->X[1]+Raise[0][1]) - (PT->X[0]+Raise[0][0]); + y1y0 = (PT->Y[1]+Raise[1][1]) - (PT->Y[0]+Raise[1][0]); + z1z0 = (PT->Z[1]+Raise[2][1]) - (PT->Z[0]+Raise[2][0]); + x2x0 = (PT->X[2]+Raise[0][2]) - (PT->X[0]+Raise[0][0]); + y2y0 = (PT->Y[2]+Raise[1][2]) - (PT->Y[0]+Raise[1][0]); + z2z0 = (PT->Z[2]+Raise[2][2]) - (PT->Z[0]+Raise[2][0]); + nn[0] = y1y0 * z2z0 - z1z0 * y2y0 ; + nn[1] = z1z0 * x2x0 - x1x0 * z2z0 ; + nn[2] = x1x0 * y2y0 - y1y0 * x2x0 ; + //norme(nn); unnecessary with glEnable(GL_NORMALIZE); + /* BOF BOF BOF + if(nn[2] < -0.1){ + nn[0] = -nn[0]; + nn[1] = -nn[1]; + nn[2] = -nn[2]; + } + */ + glNormal3dv(nn); + } + + if(View->IntervalsType==DRAW_POST_CONTINUOUS){ + if(PT->V[3*View->TimeStep] >=ValMin && PT->V[3*View->TimeStep] <=ValMax && + PT->V[3*View->TimeStep+1]>=ValMin && PT->V[3*View->TimeStep+1]<=ValMax && + PT->V[3*View->TimeStep+2]>=ValMin && PT->V[3*View->TimeStep+2]<=ValMax){ + glBegin(GL_TRIANGLES); + Palette2(View,ValMin,ValMax,PT->V[3*View->TimeStep]); + glVertex3d(PT->X[0]+View->Offset[0]+Raise[0][0], + PT->Y[0]+View->Offset[1]+Raise[1][0], + PT->Z[0]+View->Offset[2]+Raise[2][0]); + Palette2(View,ValMin,ValMax,PT->V[3*View->TimeStep+1]); + glVertex3d(PT->X[1]+View->Offset[0]+Raise[0][1], + PT->Y[1]+View->Offset[1]+Raise[1][1], + PT->Z[1]+View->Offset[2]+Raise[2][1]); + Palette2(View,ValMin,ValMax,PT->V[3*View->TimeStep+2]); + glVertex3d(PT->X[2]+View->Offset[0]+Raise[0][2], + PT->Y[2]+View->Offset[1]+Raise[1][2], + PT->Z[2]+View->Offset[2]+Raise[2][2]); + glEnd(); + } + else{ + CutTriangle2D(PT->X,PT->Y,PT->Z,&PT->V[3*View->TimeStep], + ValMin,ValMax,ValMin,ValMax, + Xp,Yp,Zp,&nb,value); + if(nb >= 3){ + glBegin(GL_POLYGON); + for(i=0;i<nb;i++){ + Palette2(View,ValMin,ValMax,value[i]); + RaiseFill(i,value[i],ValMin,Raise); + glVertex3d(Xp[i]+View->Offset[0]+Raise[0][i], + Yp[i]+View->Offset[1]+Raise[1][i], + Zp[i]+View->Offset[2]+Raise[2][i]); + } + glEnd(); + } + } + } + else{ + for(k=0 ; k<View->NbIso ; k++){ + if(View->IntervalsType==DRAW_POST_DISCRETE){ + Palette(View,View->NbIso,k); + CutTriangle2D(PT->X,PT->Y,PT->Z,&PT->V[3*View->TimeStep], + View->GVFI(ValMin,ValMax,View->NbIso+1,k), + View->GVFI(ValMin,ValMax,View->NbIso+1,k+1), + ValMin,ValMax, + Xp,Yp,Zp,&nb,value); + if(nb >= 3){ + for(i=0;i<nb;i++) RaiseFill(i,value[i],ValMin,Raise); + Draw_Polygon(nb,Xp,Yp,Zp,View->Offset,Raise); + } + } + else{ + Palette(View,View->NbIso,k); + + thev = View->GVFI(ValMin,ValMax,View->NbIso,k); + CutTriangle1D(PT->X,PT->Y,PT->Z,&PT->V[3*View->TimeStep], + thev, ValMin,ValMax,Xp,Yp,Zp,&nb); + if(nb == 2){ + for(i=0;i<2;i++) RaiseFill(i,thev,ValMin,Raise); + Draw_Line(Xp,Yp,Zp,View->Offset,Raise); + } + } + } + } + break; + + case DRAW_POST_VECTOR: + + if(View->ArrowType == DRAW_POST_DISPLACEMENT){ + fact = View->ArrowScale/100. ; + for(m=0;m<3;m++){ + xx[m] = PT->X[m] + fact * PT->V[9*View->TimeStep + 3 * m ]; + yy[m] = PT->Y[m] + fact * PT->V[9*View->TimeStep + 3 * m + 1]; + zz[m] = PT->Z[m] + fact * PT->V[9*View->TimeStep + 3 * m + 2]; + } + glEnable(GL_POLYGON_OFFSET_FILL); + glColor4ubv((GLubyte*)&CTX.color.bg); + if(View->IntervalsType!=DRAW_POST_ISO) + Draw_Polygon (3, xx, yy, zz, View->Offset, Raise); + glColor4ubv((GLubyte*)&CTX.color.fg); + glBegin(GL_LINE_LOOP); + for(m=0 ; m<3 ; m++) glVertex3d(xx[m], yy[m], zz[m]); + glEnd(); + glDisable(GL_POLYGON_OFFSET_FILL); + break; + } + + if(View->ArrowLocation == DRAW_POST_LOCATE_COG){ + dx = (PT->V[9*View->TimeStep] +PT->V[9*View->TimeStep+3]+PT->V[9*View->TimeStep+6])/3.; + dy = (PT->V[9*View->TimeStep+1]+PT->V[9*View->TimeStep+4]+PT->V[9*View->TimeStep+7])/3.; + dz = (PT->V[9*View->TimeStep+2]+PT->V[9*View->TimeStep+5]+PT->V[9*View->TimeStep+8])/3.; + d = sqrt(dx*dx+dy*dy+dz*dz); + if(d!=0.0 && d>=ValMin && d<=ValMax){ + Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d)); + fact = 2.e-4 * LC * View->ArrowScale/View->Max ; + if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){ + dx /= d ; dy /= d ; dz /= d ; + d = log10(d/ValMin) ; + dx *= d ; dy *= d ; dz *= d ; + } + RaiseFill(0, d, ValMin, Raise); + Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO, + (PT->X[0] + PT->X[1] + PT->X[2])/3., + (PT->Y[0] + PT->Y[1] + PT->Y[2])/3., + (PT->Z[0] + PT->Z[1] + PT->Z[2])/3., + fact*d, fact*dx, fact*dy, fact*dz, + View->Offset, Raise); + } + } + else{ + for(k=0 ; k<3 ; k++){ + dx = PT->V[9*View->TimeStep +3*k] ; + dy = PT->V[9*View->TimeStep+1+3*k] ; + dz = PT->V[9*View->TimeStep+2+3*k] ; + d = sqrt(dx*dx+dy*dy+dz*dz); + + if(d!=0.0 && d>=ValMin && d<=ValMax){ + Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d)); + fact = 2.e-4 * LC * View->ArrowScale/View->Max ; + if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){ + dx /= d ; dy /= d ; dz /= d ; + d = log10(d/ValMin) ; + dx *= d ; dy *= d ; dz *= d ; + } + RaiseFill(0, d, ValMin, Raise); + Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO, + PT->X[k], PT->Y[k], PT->Z[k], + fact*d, fact*dx, fact*dy, fact*dz, + View->Offset, Raise); + + } + } + } + break; + + case DRAW_POST_TENSOR : + break; + + } + + if(View->ShowElement){ + glDisable(GL_POLYGON_OFFSET_FILL) ; + glColor4ubv((GLubyte*)&CTX.color.fg); + glBegin(GL_LINE_LOOP); + for(i=0 ; i<3 ; i++) + glVertex3d(PT->X[i]+View->Offset[0]+Raise[0][i], + PT->Y[i]+View->Offset[1]+Raise[1][i], + PT->Z[i]+View->Offset[2]+Raise[2][i]); + glEnd(); + } + +} + + diff --git a/Graphics/Scale.cpp b/Graphics/Scale.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ac8f464e5fb45f19057f544af863dc5ce167d4e7 --- /dev/null +++ b/Graphics/Scale.cpp @@ -0,0 +1,313 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Const.h" +#include "Mesh.h" +#include "Draw.h" +#include "Context.h" +#include "gl2ps.h" + +extern Context_T CTX; + +#ifdef _UNIX +#include "XContext.h" +extern XContext_T XCTX; +#define FONTHEIGHT XCTX.xfont.helve_h +#define FONTASCENT XCTX.xfont.helve_a +#else +#define FONTHEIGHT 21 +#define FONTASCENT 21 +#endif + +/* Even if all computations in these routines are made in window + coordinates, double precision is used to work at subpixel accuracy */ + +extern List_T *Post_ViewList; + +/* ------------------------------------------------------------------------ */ +/* D r a w _ S c a l e */ +/* ------------------------------------------------------------------------ */ + +void Draw_String(char *s){ + + if(CTX.stream == TO_FILE){ + if(CTX.print.type == GLPRPAINTER || CTX.print.type == GLPRRECURSIVE) { + gl2psText(s,CTX.post.font,CTX.post.fontsize); + return ; + } + } + + glListBase(CTX.font_base); + glCallLists(strlen(s), GL_UNSIGNED_BYTE, (GLubyte *)s); +} + + +#ifdef _UNIX +static int dir,ascent, descent; +static XCharStruct overall; +#define CHECK_W \ + XTextExtents(XCTX.xfont.helve, label, strlen(label), &dir,&ascent,&descent,&overall); \ + if(overall.width > cv_w) cv_w=overall.width +#else +#define CHECK_W cv_w=200 +#endif + + +extern double GiveValueFromIndex_Lin(double ValMin, double ValMax, int NbIso, int Iso); +extern double GiveValueFromIndex_Log(double ValMin, double ValMax, int NbIso, int Iso); +extern int GiveIndexFromValue_Lin(double ValMin, double ValMax, int NbIso, double Val); +extern int GiveIndexFromValue_Log(double ValMin, double ValMax, int NbIso, double Val); + +void draw_scale(Post_View *v, double xmin, double ymin, double *width, double height){ + int i, nbv; + double font_h, font_a, label_h; + double cs_xmin, cs_ymin, cs_h, cs_w, cs_bh; + double cv_xmin, cv_ymin, cv_h, cv_w, cv_bh; + char label[128] ; + double Val, ValMin, ValMax; + + font_h = FONTHEIGHT ; /* hauteur totale de la fonte */ + font_a = FONTASCENT ; /* hauteur de la fonte au dessus de pt de ref */ + label_h = 1.8*font_h ; /* hauteur du label */ + + cs_xmin = xmin ; /* colorscale xmin */ + cs_ymin = ymin+label_h ; /* colorscale ymin */ + cs_w = 16. ; /* colorscale width */ + cs_h = height-label_h ; /* colorscale height */ + cs_bh = cs_h/v->NbIso ; /* colorscale box height */ + + cv_xmin = cs_xmin+cs_w+5 ; /* valuescale xmin */ + cv_ymin = cs_ymin ; /* valuescale ymin */ + cv_w = 0.0 ; /* valuescale width: to be computed */ + cv_h = cs_h ; /* valuescale height */ + cv_bh = 0.0 ; /* valuescale box height: to be computed */ + + + switch(v->IntervalsType){ + case DRAW_POST_CONTINUOUS : + glShadeModel(GL_SMOOTH); break; + case DRAW_POST_ISO : + case DRAW_POST_DISCRETE : + glShadeModel(GL_FLAT); break; + } + + switch(v->RangeType){ + case DRAW_POST_DEFAULT : ValMin = v->Min ; ValMax = v->Max ; break; + case DRAW_POST_CUSTOM : ValMin = v->CustomMin ; ValMax = v->CustomMax ; break; + } + + switch(v->ScaleType){ + case DRAW_POST_LINEAR : + v->GIFV = GiveIndexFromValue_Lin ; + v->GVFI = GiveValueFromIndex_Lin ; + break; + case DRAW_POST_LOGARITHMIC : + v->GIFV = GiveIndexFromValue_Log ; + v->GVFI = GiveValueFromIndex_Log ; + break; + } + + /* background : bidouille + il faudra changer l'ordre des operations + */ + + if(!v->TransparentScale){ + sprintf(label, v->Format, (ValMin+ValMax)/Pi); + CHECK_W; + *width = cv_xmin-cs_xmin+cv_w; + glColor4ubv((GLubyte*)&CTX.color.bg); + glBegin(GL_QUADS); + glVertex2d(xmin, ymin); + glVertex2d(xmin+*width, ymin); + glVertex2d(xmin+*width, ymin+height); + glVertex2d(xmin, ymin+height); + glEnd(); + } + + /* colorscale */ + + for(i=0;i<v->NbIso;i++){ + if(v->IntervalsType==DRAW_POST_DISCRETE){ + Palette(v,v->NbIso,i); + glBegin(GL_QUADS); + glVertex2d(cs_xmin, cs_ymin+i*cs_bh); + glVertex2d(cs_xmin+cs_w, cs_ymin+i*cs_bh); + glVertex2d(cs_xmin+cs_w, cs_ymin+(i+1)*cs_bh); + glVertex2d(cs_xmin, cs_ymin+(i+1)*cs_bh); + glEnd(); + } + else if (v->IntervalsType==DRAW_POST_CONTINUOUS){ + glBegin(GL_QUADS); + Palette2(v,ValMin,ValMax,ValMin+i*(ValMax-ValMin)/v->NbIso); + glVertex2d(cs_xmin, cs_ymin+i*cs_bh); + glVertex2d(cs_xmin+cs_w, cs_ymin+i*cs_bh); + Palette2(v,ValMin,ValMax,ValMin+(i+1)*(ValMax-ValMin)/v->NbIso); + glVertex2d(cs_xmin+cs_w, cs_ymin+(i+1)*cs_bh); + glVertex2d(cs_xmin, cs_ymin+(i+1)*cs_bh); + glEnd(); + } + else{ + Palette(v,v->NbIso,i); + glBegin(GL_LINES); + glVertex2d(cs_xmin, cs_ymin+i*cs_bh+0.5*cs_bh); + glVertex2d(cs_xmin+cs_w, cs_ymin+i*cs_bh+0.5*cs_bh); + glEnd(); + } + } + + /* valuescale */ + + nbv = (v->NbIso<floor(cs_h/font_h))?v->NbIso:-1; + cv_bh = cv_h/nbv; + + glColor4ubv((GLubyte*)&CTX.color.text); + + /* only min and max if not enough room */ + if(nbv<0){ + if(v->IntervalsType!=DRAW_POST_ISO){ + sprintf(label, v->Format, ValMin); + glRasterPos2d(cv_xmin,cv_ymin-font_a/3.); + Draw_String(label); CHECK_W; + + sprintf(label, v->Format, ValMax); + glRasterPos2d(cv_xmin,cv_ymin+cv_h-font_a/3.); + Draw_String(label); CHECK_W; + } + else { + sprintf(label, v->Format, ValMin); + glRasterPos2d(cv_xmin,cv_ymin+(cs_bh/2)-font_a/3.); + Draw_String(label); CHECK_W; + + sprintf(label, v->Format, ValMax); + glRasterPos2d(cv_xmin,cv_ymin+cv_h-(cs_bh/2)-font_a/3.); + Draw_String(label); CHECK_W; + } + } + + /* all the values if enough space */ + else { + if(v->IntervalsType!=DRAW_POST_ISO){ + for(i=0 ; i<nbv+1 ; i++){ + Val = v->GVFI(ValMin,ValMax,nbv+1,i); + sprintf(label, v->Format, Val); + glRasterPos2d(cv_xmin,cv_ymin+i*cv_bh-font_a/3.); + Draw_String(label); CHECK_W; + } + } + else { + for(i=0 ; i<nbv ; i++){ + Val = v->GVFI(ValMin,ValMax,nbv,i); + sprintf(label, v->Format, Val); + glRasterPos2d(cv_xmin,cv_ymin+(2*i+1)*(cv_bh/2)-font_a/3.); + Draw_String(label); CHECK_W; + } + } + } + + /* the label */ + + glRasterPos2d(cv_xmin,ymin); + sprintf(label, "%s", v->Name); + Draw_String(label); CHECK_W; + + + /* compute the width */ + *width = cv_xmin-cs_xmin+cv_w; + +} + +static List_T *todraw=NULL; + +void Draw_Scales(void){ + int i; + double xmin, ymin, width, height, xsep, ysep; + double oldwidth, totalwidth; + Post_View *v; + + if(!Post_ViewList) return; + + /* scales to draw ? */ + + if(!todraw) + todraw = List_Create(5,5,sizeof(Post_View*)); + else + List_Reset(todraw); + + for(i=0;i<List_Nbr(Post_ViewList);i++){ + v = (Post_View*)List_Pointer(Post_ViewList,i); + if(v->Visible && v->ShowScale) List_Add(todraw,&v); + } + + if(!List_Nbr(todraw)){ + return; + } + + if(List_Nbr(todraw)==1){ + xsep = 20. ; + ysep = (CTX.viewport[3]-CTX.viewport[1])/6. ; + xmin = CTX.viewport[0] + xsep ; + ymin = CTX.viewport[1] + ysep ; + width = 0.0; + height = CTX.viewport[3]-CTX.viewport[1] - 2*ysep ; + + v = *((Post_View**)List_Pointer(todraw,0)); + draw_scale(v,xmin,ymin,&width,height); + } + else{ + xsep = 20. ; + ysep = (CTX.viewport[3]-CTX.viewport[1])/15. ; + xmin = CTX.viewport[0] + xsep ; + ymin = CTX.viewport[1] + ysep ; + width = 0.0; + totalwidth = 0.0; + height = (CTX.viewport[3]-CTX.viewport[1]-3*ysep)/2. ; + + for(i=0;i<List_Nbr(todraw);i++){ + v = *(Post_View**)List_Pointer(todraw,i); + oldwidth = width; + draw_scale(v, + xmin+totalwidth+(i/2)*xsep, + ymin+(1-i%2)*(height+ysep), + &width, + height); + if(i%2) totalwidth += DMAX(width,oldwidth); + } + } + +} + + +/* ------------------------------------------------------------------------ */ +/* D r a w _ S m a l l A x e s */ +/* ------------------------------------------------------------------------ */ + +void Draw_SmallAxes(void){ + double a,b,c; + double l,o,xx,xy,yx,yy,zx,zy,cx,cy; + + a = CTX.r[0] * Pi/180. ; + b = CTX.r[1] * Pi/180. ; + c = CTX.r[2] * Pi/180. ; + + l = 30 ; + o = 2 ; + cx = CTX.viewport[2] - 45; + cy = CTX.viewport[1] + 35; + + xx = l*cos(b)*cos(c) ; xy = l*(sin(a)*sin(b)*cos(c)+cos(a)*sin(c)) ; + yx = -l*cos(b)*sin(c) ; yy = -l*(sin(a)*sin(b)*sin(c)-cos(a)*cos(c)) ; + zx = l*sin(b) ; zy = -l*sin(a)*cos(b) ; + + glColor4ubv((GLubyte*)&CTX.color.little_axes); + + glBegin(GL_LINES); + glVertex2d(cx,cy); glVertex2d(cx+xx,cy+xy); + glVertex2d(cx,cy); glVertex2d(cx+yx,cy+yy); + glVertex2d(cx,cy); glVertex2d(cx+zx,cy+zy); + glEnd(); + glRasterPos2d(cx+xx+o,cy+xy+o); Draw_String("X"); + glRasterPos2d(cx+yx+o,cy+yy+o); Draw_String("Y"); + glRasterPos2d(cx+zx+o,cy+zy+o); Draw_String("Z"); + +} + diff --git a/Graphics/Volume.cpp b/Graphics/Volume.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b393beacd151f5d9d3932b8990ba4f00843062c2 --- /dev/null +++ b/Graphics/Volume.cpp @@ -0,0 +1,67 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Interpolation.h" +#include "Context.h" + +extern Context_T CTX; + +int TheVolume; + +extern Mesh *THEM; + +void Draw_Curve_For_Volume (void *a, void *b){ + int i,N; + Curve *c; + Vertex v; + + glLineWidth(2.); + + c = *(Curve**)a; + + if(CTX.render_mode == GMSH_SELECT){ + glLoadName(3); + glPushName(TheVolume); + } + + if(c->Typ == MSH_SEGM_LINE) + N = List_Nbr(c->Control_Points); + else + N = 10; + + glBegin(GL_LINE_STRIP); + for(i=0;i<N;i++){ + v = InterpolateCurve(c,0.2*(double)i/(double)(N-1),0); + glVertex3d(v.Pos.X,v.Pos.Y,v.Pos.Z); + } + glEnd(); + + glBegin(GL_LINE_STRIP); + for(i=N-1;i>=0;i--){ + v = InterpolateCurve(c,1.-0.2*(double)i/(double)(N-1),0); + glVertex3d(v.Pos.X,v.Pos.Y,v.Pos.Z); + } + glEnd(); + + + if(CTX.render_mode == GMSH_SELECT){ + glPopName (); + } + + if((c)->ipar[3]){ + glLineWidth(1.); + } + +} + + +void DrawVolumes (Mesh *m){ + + +} + + + diff --git a/Graphics/gl2gif.cpp b/Graphics/gl2gif.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8c0c96f598080aa47976783022101084d89875f0 --- /dev/null +++ b/Graphics/gl2gif.cpp @@ -0,0 +1,1066 @@ +/* + This file is a big hack from + + The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond + + */ + +#include <stdio.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <ctype.h> +#include <unistd.h> + +#include <GL/gl.h> +#include "gl2gif.h" + +static int _GifError = 0; +static int ExpNumOfColors = 8, ColorMapSize = 256; + + +/****************************************************************************** +* Initialize HashTable - allocate the memory needed and clear it. * +******************************************************************************/ +GifHashTableType *_InitHashTable(void) +{ + GifHashTableType *HashTable; + + if ((HashTable = (GifHashTableType *) malloc(sizeof(GifHashTableType))) + == NULL) + return NULL; + + _ClearHashTable(HashTable); + + return HashTable; +} + +/****************************************************************************** +* Routine to clear the HashTable to an empty state. * +* This part is a little machine depended. Use the commented part otherwise. * +******************************************************************************/ +void _ClearHashTable(GifHashTableType *HashTable) +{ + int index = HT_SIZE; + unsigned long* HTable = HashTable->HTable; + while (--index>=0) + HTable[index] = 0xfffffffful; +} + +/****************************************************************************** +* Routine to generate an HKey for the hashtable out of the given unique key. * +* The given Key is assumed to be 20 bits as follows: lower 8 bits are the * +* new postfix character, while the upper 12 bits are the prefix code. * +* Because the average hit ratio is only 2 (2 hash references per entry), * +* evaluating more complex keys (such as twin prime keys) does not worth it! * +******************************************************************************/ +static int KeyItem(unsigned long Item) +{ + return ((Item >> 12) ^ Item) & HT_KEY_MASK; +} + +/****************************************************************************** +* Routine to insert a new Item into the HashTable. The data is assumed to be * +* new one. * +******************************************************************************/ +void _InsertHashTable(GifHashTableType *HashTable, unsigned long Key, int Code) +{ + int HKey = KeyItem(Key); + unsigned long *HTable = HashTable -> HTable; + + while (HT_GET_KEY(HTable[HKey]) != 0xFFFFFL) { + HKey = (HKey + 1) & HT_KEY_MASK; + } + HTable[HKey] = HT_PUT_KEY(Key) | HT_PUT_CODE(Code); +} + +/****************************************************************************** +* Routine to test if given Key exists in HashTable and if so returns its code * +* Returns the Code if key was found, -1 if not. * +******************************************************************************/ +int _ExistsHashTable(GifHashTableType *HashTable, unsigned long Key) +{ + int HKey = KeyItem(Key); + unsigned long *HTable = HashTable -> HTable, HTKey; + + while ((HTKey = HT_GET_KEY(HTable[HKey])) != 0xFFFFFL) { + if (Key == HTKey) return HT_GET_CODE(HTable[HKey]); + HKey = (HKey + 1) & HT_KEY_MASK; + } + + return -1; +} + +/****************************************************************************** +* Miscellaneous utility functions * +******************************************************************************/ + +int BitSize(int n) +/* return smallest bitfield size n will fit in */ +{ + register int i; + + for (i = 1; i <= 8; i++) + if ((1 << i) >= n) + break; + return(i); +} + + +/****************************************************************************** +* Color map object functions * +******************************************************************************/ + +ColorMapObject *MakeMapObject(int ColorCount, GifColorType *ColorMap) +{ + ColorMapObject *Object; + + if (ColorCount != (1 << BitSize(ColorCount))){ + printf("Arrrrrgggg\n"); + return((ColorMapObject *)NULL); + } + + Object = (ColorMapObject *)malloc(sizeof(ColorMapObject)); + if (Object == (ColorMapObject *)NULL) + return((ColorMapObject *)NULL); + + Object->Colors = (GifColorType *)calloc(ColorCount, sizeof(GifColorType)); + if (Object->Colors == (GifColorType *)NULL) + return((ColorMapObject *)NULL); + + Object->ColorCount = ColorCount; + Object->BitsPerPixel = BitSize(ColorCount); + + if (ColorMap) + memcpy((char *)Object->Colors, + (char *)ColorMap, ColorCount * sizeof(GifColorType)); + + return(Object); +} + +void FreeMapObject(ColorMapObject *Object) +{ + free(Object->Colors); + free(Object); +} + +/***************************************************************************** +* Print the last GIF error to stderr. * +*****************************************************************************/ +void PrintGifError(void) +{ + char *Err; + + switch(_GifError) { + case E_GIF_ERR_OPEN_FAILED: + Err = "Failed to open given file"; + break; + case E_GIF_ERR_WRITE_FAILED: + Err = "Failed to Write to given file"; + break; + case E_GIF_ERR_HAS_SCRN_DSCR: + Err = "Screen Descriptor already been set"; + break; + case E_GIF_ERR_HAS_IMAG_DSCR: + Err = "Image Descriptor is still active"; + break; + case E_GIF_ERR_NO_COLOR_MAP: + Err = "Neither Global Nor Local color map"; + break; + case E_GIF_ERR_DATA_TOO_BIG: + Err = "#Pixels bigger than Width * Height"; + break; + case E_GIF_ERR_NOT_ENOUGH_MEM: + Err = "Fail to allocate required memory"; + break; + case E_GIF_ERR_DISK_IS_FULL: + Err = "Write failed (disk full?)"; + break; + case E_GIF_ERR_CLOSE_FAILED: + Err = "Failed to close given file"; + break; + case E_GIF_ERR_NOT_WRITEABLE: + Err = "Given file was not opened for write"; + break; + default: + Err = NULL; + break; + } + if (Err != NULL) + fprintf(stderr, "Error: %s\n", Err); + else + fprintf(stderr, "Error: GIF undefined error %d\n", _GifError); +} + +#define ABS(x) ((x) > 0 ? (x) : (-(x))) + +#define COLOR_ARRAY_SIZE 32768 +#define BITS_PER_PRIM_COLOR 5 +#define MAX_PRIM_COLOR 0x1f + +static int SortRGBAxis; + +typedef struct QuantizedColorType { + GifByteType RGB[3]; + GifByteType NewColorIndex; + long Count; + struct QuantizedColorType *Pnext; +} QuantizedColorType; + +typedef struct NewColorMapType { + GifByteType RGBMin[3], RGBWidth[3]; + int NumEntries; /* # of QuantizedColorType in linked list below. */ + long Count; /* Total number of pixels in all the entries. */ + QuantizedColorType *QuantizedColors; +} NewColorMapType; + +static int SubdivColorMap(NewColorMapType *NewColorSubdiv, + int ColorMapSize, + int *NewColorMapSize); +static int SortCmpRtn(const VoidPtr Entry1, const VoidPtr Entry2); + +/****************************************************************************** +* Quantize high resolution image into lower one. Input image consists of a * +* 2D array for each of the RGB colors with size Width by Height. There is no * +* Color map for the input. Output is a quantized image with 2D array of * +* indexes into the output color map. * +* Note input image can be 24 bits at the most (8 for red/green/blue) and * +* the output has 256 colors at the most (256 entries in the color map.). * +* ColorMapSize specifies size of color map up to 256 and will be updated to * +* real size before returning. * +* Also non of the parameter are allocated by this routine. * +* This function returns GIF_OK if succesfull, GIF_ERROR otherwise. * +******************************************************************************/ +int QuantizeBuffer(int Width, int Height, int *ColorMapSize, + GifByteType *RedInput, GifByteType *GreenInput, GifByteType *BlueInput, + GifByteType *OutputBuffer, GifColorType *OutputColorMap) +{ + int Index, NumOfEntries; + int i, j, MaxRGBError[3]; + int NewColorMapSize; + long Red, Green, Blue; + NewColorMapType NewColorSubdiv[256]; + QuantizedColorType *ColorArrayEntries, *QuantizedColor; + + if ((ColorArrayEntries = (QuantizedColorType *) + malloc(sizeof(QuantizedColorType) * COLOR_ARRAY_SIZE)) == NULL) { + _GifError = E_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + + for (i = 0; i < COLOR_ARRAY_SIZE; i++) { + ColorArrayEntries[i].RGB[0]= i >> (2 * BITS_PER_PRIM_COLOR); + ColorArrayEntries[i].RGB[1] = (i >> BITS_PER_PRIM_COLOR) & + MAX_PRIM_COLOR; + ColorArrayEntries[i].RGB[2] = i & MAX_PRIM_COLOR; + ColorArrayEntries[i].Count = 0; + } + + /* Sample the colors and their distribution: */ + for (i = 0; i < (int)(Width * Height); i++) { + Index = ((RedInput[i] >> (8 - BITS_PER_PRIM_COLOR)) + << (2 * BITS_PER_PRIM_COLOR)) + + ((GreenInput[i] >> (8 - BITS_PER_PRIM_COLOR)) + << BITS_PER_PRIM_COLOR) + + (BlueInput[i] >> (8 - BITS_PER_PRIM_COLOR)); + ColorArrayEntries[Index].Count++; + } + + /* Put all the colors in the first entry of the color map, and call the */ + /* recursive subdivision process. */ + for (i = 0; i < 256; i++) { + NewColorSubdiv[i].QuantizedColors = NULL; + NewColorSubdiv[i].Count = NewColorSubdiv[i].NumEntries = 0; + for (j = 0; j < 3; j++) { + NewColorSubdiv[i].RGBMin[j] = 0; + NewColorSubdiv[i].RGBWidth[j] = 255; + } + } + + /* Find the non empty entries in the color table and chain them: */ + for (i = 0; i < COLOR_ARRAY_SIZE; i++) + if (ColorArrayEntries[i].Count > 0) break; + QuantizedColor = NewColorSubdiv[0].QuantizedColors = &ColorArrayEntries[i]; + NumOfEntries = 1; + while (++i < COLOR_ARRAY_SIZE) + if (ColorArrayEntries[i].Count > 0) { + QuantizedColor -> Pnext = &ColorArrayEntries[i]; + QuantizedColor = &ColorArrayEntries[i]; + NumOfEntries++; + } + QuantizedColor -> Pnext = NULL; + + NewColorSubdiv[0].NumEntries = NumOfEntries;/* Different sampled colors. */ + NewColorSubdiv[0].Count = ((long) Width) * Height; /* Pixels. */ + NewColorMapSize = 1; + if (SubdivColorMap(NewColorSubdiv, *ColorMapSize, &NewColorMapSize) != + GIF_OK) { + free((char *) ColorArrayEntries); + return GIF_ERROR; + } + if (NewColorMapSize < *ColorMapSize) { + /* And clear rest of color map: */ + for (i = NewColorMapSize; i < *ColorMapSize; i++) + OutputColorMap[i].Red = + OutputColorMap[i].Green = + OutputColorMap[i].Blue = 0; + } + + /* Average the colors in each entry to be the color to be used in the */ + /* output color map, and plug it into the output color map itself. */ + for (i = 0; i < NewColorMapSize; i++) { + if ((j = NewColorSubdiv[i].NumEntries) > 0) { + QuantizedColor = NewColorSubdiv[i].QuantizedColors; + Red = Green = Blue = 0; + while (QuantizedColor) { + QuantizedColor -> NewColorIndex = i; + Red += QuantizedColor -> RGB[0]; + Green += QuantizedColor -> RGB[1]; + Blue += QuantizedColor -> RGB[2]; + QuantizedColor = QuantizedColor -> Pnext; + } + OutputColorMap[i].Red = (Red << (8 - BITS_PER_PRIM_COLOR)) / j; + OutputColorMap[i].Green = (Green << (8 - BITS_PER_PRIM_COLOR)) / j; + OutputColorMap[i].Blue= (Blue << (8 - BITS_PER_PRIM_COLOR)) / j; + } + else + fprintf(stderr, "Warning, Null entry in quantized color map - that's weird\n"); + } + + /* Finally scan the input buffer again and put the mapped index in the */ + /* output buffer. */ + MaxRGBError[0] = MaxRGBError[1] = MaxRGBError[2] = 0; + for (i = 0; i < (int)(Width * Height); i++) { + Index = ((RedInput[i] >> (8 - BITS_PER_PRIM_COLOR)) + << (2 * BITS_PER_PRIM_COLOR)) + + ((GreenInput[i] >> (8 - BITS_PER_PRIM_COLOR)) + << BITS_PER_PRIM_COLOR) + + (BlueInput[i] >> (8 - BITS_PER_PRIM_COLOR)); + Index = ColorArrayEntries[Index].NewColorIndex; + OutputBuffer[i] = Index; + if (MaxRGBError[0] < ABS(OutputColorMap[Index].Red - RedInput[i])) + MaxRGBError[0] = ABS(OutputColorMap[Index].Red - RedInput[i]); + if (MaxRGBError[1] < ABS(OutputColorMap[Index].Green - GreenInput[i])) + MaxRGBError[1] = ABS(OutputColorMap[Index].Green - GreenInput[i]); + if (MaxRGBError[2] < ABS(OutputColorMap[Index].Blue - BlueInput[i])) + MaxRGBError[2] = ABS(OutputColorMap[Index].Blue - BlueInput[i]); + } + + free((char *) ColorArrayEntries); + + *ColorMapSize = NewColorMapSize; + + return GIF_OK; +} + +/****************************************************************************** +* Routine to subdivide the RGB space recursively using median cut in each * +* axes alternatingly until ColorMapSize different cubes exists. * +* The biggest cube in one dimension is subdivide unless it has only one entry.* +* Returns GIF_ERROR if failed, otherwise GIF_OK. * +******************************************************************************/ +static int SubdivColorMap(NewColorMapType *NewColorSubdiv, + int ColorMapSize, + int *NewColorMapSize) +{ + int MaxSize; + int i, j, Index = 0, NumEntries, MinColor, MaxColor; + long Sum, Count; + QuantizedColorType *QuantizedColor, **SortArray; + + while (ColorMapSize > *NewColorMapSize) { + /* Find candidate for subdivision: */ + MaxSize = -1; + for (i = 0; i < *NewColorMapSize; i++) { + for (j = 0; j < 3; j++) { + if (((int) NewColorSubdiv[i].RGBWidth[j]) > MaxSize && + NewColorSubdiv[i].NumEntries > 1) { + MaxSize = NewColorSubdiv[i].RGBWidth[j]; + Index = i; + SortRGBAxis = j; + } + } + } + + if (MaxSize == -1) + return GIF_OK; + + /* Split the entry Index into two along the axis SortRGBAxis: */ + + /* Sort all elements in that entry along the given axis and split at */ + /* the median. */ + if ((SortArray = (QuantizedColorType **) + malloc(sizeof(QuantizedColorType *) * + NewColorSubdiv[Index].NumEntries)) == NULL) + return GIF_ERROR; + for (j = 0, QuantizedColor = NewColorSubdiv[Index].QuantizedColors; + j < NewColorSubdiv[Index].NumEntries && QuantizedColor != NULL; + j++, QuantizedColor = QuantizedColor -> Pnext) + SortArray[j] = QuantizedColor; + qsort(SortArray, NewColorSubdiv[Index].NumEntries, + sizeof(QuantizedColorType *), SortCmpRtn); + + /* Relink the sorted list into one: */ + for (j = 0; j < NewColorSubdiv[Index].NumEntries - 1; j++) + SortArray[j] -> Pnext = SortArray[j + 1]; + SortArray[NewColorSubdiv[Index].NumEntries - 1] -> Pnext = NULL; + NewColorSubdiv[Index].QuantizedColors = QuantizedColor = SortArray[0]; + free((char *) SortArray); + + /* Now simply add the Counts until we have half of the Count: */ + Sum = NewColorSubdiv[Index].Count / 2 - QuantizedColor -> Count; + NumEntries = 1; + Count = QuantizedColor -> Count; + while ((Sum -= QuantizedColor -> Pnext -> Count) >= 0 && + QuantizedColor -> Pnext != NULL && + QuantizedColor -> Pnext -> Pnext != NULL) { + QuantizedColor = QuantizedColor -> Pnext; + NumEntries++; + Count += QuantizedColor -> Count; + } + /* Save the values of the last color of the first half, and first */ + /* of the second half so we can update the Bounding Boxes later. */ + /* Also as the colors are quantized and the BBoxes are full 0..255, */ + /* they need to be rescaled. */ + MaxColor = QuantizedColor -> RGB[SortRGBAxis];/* Max. of first half. */ + MinColor = QuantizedColor -> Pnext -> RGB[SortRGBAxis];/* of second. */ + MaxColor <<= (8 - BITS_PER_PRIM_COLOR); + MinColor <<= (8 - BITS_PER_PRIM_COLOR); + + /* Partition right here: */ + NewColorSubdiv[*NewColorMapSize].QuantizedColors = + QuantizedColor -> Pnext; + QuantizedColor -> Pnext = NULL; + NewColorSubdiv[*NewColorMapSize].Count = Count; + NewColorSubdiv[Index].Count -= Count; + NewColorSubdiv[*NewColorMapSize].NumEntries = + NewColorSubdiv[Index].NumEntries - NumEntries; + NewColorSubdiv[Index].NumEntries = NumEntries; + for (j = 0; j < 3; j++) { + NewColorSubdiv[*NewColorMapSize].RGBMin[j] = + NewColorSubdiv[Index].RGBMin[j]; + NewColorSubdiv[*NewColorMapSize].RGBWidth[j] = + NewColorSubdiv[Index].RGBWidth[j]; + } + NewColorSubdiv[*NewColorMapSize].RGBWidth[SortRGBAxis] = + NewColorSubdiv[*NewColorMapSize].RGBMin[SortRGBAxis] + + NewColorSubdiv[*NewColorMapSize].RGBWidth[SortRGBAxis] - + MinColor; + NewColorSubdiv[*NewColorMapSize].RGBMin[SortRGBAxis] = MinColor; + + NewColorSubdiv[Index].RGBWidth[SortRGBAxis] = + MaxColor - NewColorSubdiv[Index].RGBMin[SortRGBAxis]; + + (*NewColorMapSize)++; + } + + return GIF_OK; +} + +/****************************************************************************** +* Routine called by qsort to compare to entries. * +******************************************************************************/ +static int SortCmpRtn(const VoidPtr Entry1, const VoidPtr Entry2) +{ + return (* ((QuantizedColorType **) Entry1)) -> RGB[SortRGBAxis] - + (* ((QuantizedColorType **) Entry2)) -> RGB[SortRGBAxis]; +} + +#define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */ +#define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */ + +/* Masks given codes to BitsPerPixel, to make sure all codes are in range: */ +static GifPixelType CodeMask[] = { + 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff +}; + +static char *GifVersionPrefix = GIF87_STAMP; + +#define WRITE(_gif,_buf,_len) \ + fwrite(_buf, 1, _len, ((GifFilePrivateType*)_gif->Private)->File) + +static int EGifPutWord(int Word, GifFileType *GifFile); +static int EGifSetupCompress(GifFileType *GifFile); +static int EGifCompressLine(GifFileType *GifFile, GifPixelType *Line, + int LineLen); +static int EGifCompressOutput(GifFileType *GifFile, int Code); +static int EGifBufferedOutput(GifFileType *GifFile, GifByteType *Buf, int c); + +/****************************************************************************** +* Update a new gif file, given its file handle, which must be opened for * +* write in binary mode. * +* Returns GifFileType pointer dynamically allocated which serves as the gif * +* info record. _GifError is cleared if succesfull. * +******************************************************************************/ +GifFileType *EGifOpenFileHandle(FILE *f, int FileHandle) +{ + GifFileType *GifFile; + GifFilePrivateType *Private; + + if ((GifFile = (GifFileType *) malloc(sizeof(GifFileType))) == NULL) { + _GifError = E_GIF_ERR_NOT_ENOUGH_MEM; + return NULL; + } + + memset(GifFile, '\0', sizeof(GifFileType)); + + if ((Private = (GifFilePrivateType *) + malloc(sizeof(GifFilePrivateType))) == NULL) { + free(GifFile); + _GifError = E_GIF_ERR_NOT_ENOUGH_MEM; + return NULL; + } + if ((Private->HashTable = _InitHashTable()) == NULL) { + free(GifFile); + free(Private); + _GifError = E_GIF_ERR_NOT_ENOUGH_MEM; + return NULL; + } + + GifFile->Private = (VoidPtr) Private; + Private->FileHandle = FileHandle; + Private->File = f; + Private->FileState = FILE_STATE_WRITE; + + _GifError = 0; + + return GifFile; +} + +/****************************************************************************** +* Routine to set current GIF version. All files open for write will be * +* using this version until next call to this routine. Version consists of * +* 3 characters as "87a" or "89a". No test is made to validate the version. * +******************************************************************************/ +void EGifSetGifVersion(char *Version) +{ + strncpy(&GifVersionPrefix[3], Version, 3); +} + +/****************************************************************************** +* This routine should be called before any other EGif calls, immediately * +* follows the GIF file openning. * +******************************************************************************/ +int EGifPutScreenDesc(GifFileType *GifFile, + int Width, int Height, int ColorRes, int BackGround, + ColorMapObject *ColorMap) +{ + int i; + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; + + if (Private->FileState & FILE_STATE_SCREEN) { + /* If already has screen descriptor - something is wrong! */ + _GifError = E_GIF_ERR_HAS_SCRN_DSCR; + return GIF_ERROR; + } + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + + /* First write the version prefix into the file. */ + if (WRITE(GifFile, GifVersionPrefix, strlen(GifVersionPrefix)) != strlen(GifVersionPrefix)) { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + + GifFile->SWidth = Width; + GifFile->SHeight = Height; + GifFile->SColorResolution = ColorRes; + GifFile->SBackGroundColor = BackGround; + if(ColorMap) + GifFile->SColorMap=MakeMapObject(ColorMap->ColorCount,ColorMap->Colors); + else + GifFile->SColorMap=NULL; + + /* Put the screen descriptor into the file: */ + EGifPutWord(Width, GifFile); + EGifPutWord(Height, GifFile); + Buf[0] = (ColorMap ? 0x80 : 0x00) | + ((ColorRes - 1) << 4) | + (ColorMap->BitsPerPixel - 1); + Buf[1] = BackGround; + Buf[2] = 0; + WRITE(GifFile, Buf, 3); + + /* If we have Global color map - dump it also: */ + if (ColorMap != NULL) + for (i = 0; i < ColorMap->ColorCount; i++) { + /* Put the ColorMap out also: */ + Buf[0] = ColorMap->Colors[i].Red; + Buf[1] = ColorMap->Colors[i].Green; + Buf[2] = ColorMap->Colors[i].Blue; + if (WRITE(GifFile, Buf, 3) != 3) { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + } + + /* Mark this file as has screen descriptor, and no pixel written yet: */ + Private->FileState |= FILE_STATE_SCREEN; + + return GIF_OK; +} + +/****************************************************************************** +* This routine should be called before any attemp to dump an image - any * +* call to any of the pixel dump routines. * +******************************************************************************/ +int EGifPutImageDesc(GifFileType *GifFile, + int Left, int Top, int Width, int Height, int Interlace, + ColorMapObject *ColorMap) +{ + int i; + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; + + if (Private->FileState & FILE_STATE_IMAGE && +#if defined(__GNUC__) + Private->PixelCount > 0xffff0000UL) { +#else + Private->PixelCount > 0xffff0000) { +#endif + /* If already has active image descriptor - something is wrong! */ + _GifError = E_GIF_ERR_HAS_IMAG_DSCR; + return GIF_ERROR; + } + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + GifFile->Image.Left = Left; + GifFile->Image.Top = Top; + GifFile->Image.Width = Width; + GifFile->Image.Height = Height; + GifFile->Image.Interlace = Interlace; + if(ColorMap) + GifFile->Image.ColorMap =MakeMapObject(ColorMap->ColorCount,ColorMap->Colors); + else + GifFile->Image.ColorMap = NULL; + + /* Put the image descriptor into the file: */ + Buf[0] = ','; /* Image seperator character. */ + WRITE(GifFile, Buf, 1); + EGifPutWord(Left, GifFile); + EGifPutWord(Top, GifFile); + EGifPutWord(Width, GifFile); + EGifPutWord(Height, GifFile); + Buf[0] = (ColorMap ? 0x80 : 0x00) | + (Interlace ? 0x40 : 0x00) | + (ColorMap ? ColorMap->BitsPerPixel - 1 : 0); + WRITE(GifFile, Buf, 1); + + /* If we have Global color map - dump it also: */ + if (ColorMap != NULL) + for (i = 0; i < ColorMap->ColorCount; i++) { + /* Put the ColorMap out also: */ + Buf[0] = ColorMap->Colors[i].Red; + Buf[1] = ColorMap->Colors[i].Green; + Buf[2] = ColorMap->Colors[i].Blue; + if (WRITE(GifFile, Buf, 3) != 3) { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + } + if (GifFile->SColorMap == NULL && GifFile->Image.ColorMap == NULL) + { + _GifError = E_GIF_ERR_NO_COLOR_MAP; + return GIF_ERROR; + } + + /* Mark this file as has screen descriptor: */ + Private->FileState |= FILE_STATE_IMAGE; + Private->PixelCount = (long) Width * (long) Height; + + EGifSetupCompress(GifFile); /* Reset compress algorithm parameters. */ + + return GIF_OK; +} + +/****************************************************************************** +* Put one full scanned line (Line) of length LineLen into GIF file. * +******************************************************************************/ +int EGifPutLine(GifFileType *GifFile, GifPixelType *Line, int LineLen) +{ + int i; + GifPixelType Mask; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; + + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + + if (!LineLen) + LineLen = GifFile->Image.Width; + if (Private->PixelCount < (unsigned)LineLen) { + _GifError = E_GIF_ERR_DATA_TOO_BIG; + return GIF_ERROR; + } + Private->PixelCount -= LineLen; + + /* Make sure the codes are not out of bit range, as we might generate */ + /* wrong code (because of overflow when we combine them) in this case: */ + Mask = CodeMask[Private->BitsPerPixel]; + for (i = 0; i < LineLen; i++) Line[i] &= Mask; + + return EGifCompressLine(GifFile, Line, LineLen); +} + +/****************************************************************************** +* This routine should be called last, to close GIF file. * +******************************************************************************/ +int EGifCloseFile(GifFileType *GifFile) +{ + GifByteType Buf; + GifFilePrivateType *Private; + + if (GifFile == NULL) return GIF_ERROR; + + Private = (GifFilePrivateType *) GifFile->Private; + if (!IS_WRITEABLE(Private)) { + /* This file was NOT open for writing: */ + _GifError = E_GIF_ERR_NOT_WRITEABLE; + return GIF_ERROR; + } + + Buf = ';'; + WRITE(GifFile, &Buf, 1); + + if (GifFile->Image.ColorMap) + FreeMapObject(GifFile->Image.ColorMap); + if (GifFile->SColorMap) + FreeMapObject(GifFile->SColorMap); + if (Private) { + if (Private->HashTable) free((char *) Private->HashTable); + free((char *) Private); + } + free(GifFile); + return GIF_OK; +} + +/****************************************************************************** +* Put 2 bytes (word) into the given file: * +******************************************************************************/ +static int EGifPutWord(int Word, GifFileType *GifFile) +{ + char c[2]; + + c[0] = Word & 0xff; + c[1] = (Word >> 8) & 0xff; + if (WRITE(GifFile, c, 2) == 2) + return GIF_OK; + else + return GIF_ERROR; +} + +/****************************************************************************** +* Setup the LZ compression for this image: * +******************************************************************************/ +static int EGifSetupCompress(GifFileType *GifFile) +{ + int BitsPerPixel; + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; + + /* Test and see what color map to use, and from it # bits per pixel: */ + if (GifFile->Image.ColorMap) + BitsPerPixel = GifFile->Image.ColorMap->BitsPerPixel; + else if (GifFile->SColorMap) + BitsPerPixel = GifFile->SColorMap->BitsPerPixel; + else { + _GifError = E_GIF_ERR_NO_COLOR_MAP; + return GIF_ERROR; + } + + Buf = BitsPerPixel = (BitsPerPixel < 2 ? 2 : BitsPerPixel); + WRITE(GifFile, &Buf, 1); /* Write the Code size to file. */ + + Private->Buf[0] = 0; /* Nothing was output yet. */ + Private->BitsPerPixel = BitsPerPixel; + Private->ClearCode = (1 << BitsPerPixel); + Private->EOFCode = Private->ClearCode + 1; + Private->RunningCode = Private->EOFCode + 1; + Private->RunningBits = BitsPerPixel + 1; /* Number of bits per code. */ + Private->MaxCode1 = 1 << Private->RunningBits; /* Max. code + 1. */ + Private->CrntCode = FIRST_CODE; /* Signal that this is first one! */ + Private->CrntShiftState = 0; /* No information in CrntShiftDWord. */ + Private->CrntShiftDWord = 0; + + /* Clear hash table and send Clear to make sure the decoder do the same. */ + _ClearHashTable(Private->HashTable); + + if (EGifCompressOutput(GifFile, Private->ClearCode) == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + return GIF_OK; +} + +/****************************************************************************** +* The LZ compression routine: * +* This version compress the given buffer Line of length LineLen. * +* This routine can be called few times (one per scan line, for example), in * +* order the complete the whole image. * +******************************************************************************/ +static int EGifCompressLine(GifFileType *GifFile, GifPixelType *Line, + int LineLen) +{ + int i = 0, CrntCode, NewCode; + unsigned long NewKey; + GifPixelType Pixel; + GifHashTableType *HashTable; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; + + HashTable = Private->HashTable; + + if (Private->CrntCode == FIRST_CODE) /* Its first time! */ + CrntCode = Line[i++]; + else + CrntCode = Private->CrntCode; /* Get last code in compression. */ + + while (i < LineLen) { /* Decode LineLen items. */ + Pixel = Line[i++]; /* Get next pixel from stream. */ + /* Form a new unique key to search hash table for the code combines */ + /* CrntCode as Prefix string with Pixel as postfix char. */ + NewKey = (((unsigned long) CrntCode) << 8) + Pixel; + if ((NewCode = _ExistsHashTable(HashTable, NewKey)) >= 0) { + /* This Key is already there, or the string is old one, so */ + /* simple take new code as our CrntCode: */ + CrntCode = NewCode; + } + else { + /* Put it in hash table, output the prefix code, and make our */ + /* CrntCode equal to Pixel. */ + if (EGifCompressOutput(GifFile, CrntCode) + == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + CrntCode = Pixel; + + /* If however the HashTable if full, we send a clear first and */ + /* Clear the hash table. */ + if (Private->RunningCode >= LZ_MAX_CODE) { + /* Time to do some clearance: */ + if (EGifCompressOutput(GifFile, Private->ClearCode) + == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + Private->RunningCode = Private->EOFCode + 1; + Private->RunningBits = Private->BitsPerPixel + 1; + Private->MaxCode1 = 1 << Private->RunningBits; + _ClearHashTable(HashTable); + } + else { + /* Put this unique key with its relative Code in hash table: */ + _InsertHashTable(HashTable, NewKey, Private->RunningCode++); + } + } + + } + + /* Preserve the current state of the compression algorithm: */ + Private->CrntCode = CrntCode; + + if (Private->PixelCount == 0) + { + /* We are done - output last Code and flush output buffers: */ + if (EGifCompressOutput(GifFile, CrntCode) + == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + if (EGifCompressOutput(GifFile, Private->EOFCode) + == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + if (EGifCompressOutput(GifFile, FLUSH_OUTPUT) == GIF_ERROR) { + _GifError = E_GIF_ERR_DISK_IS_FULL; + return GIF_ERROR; + } + } + + return GIF_OK; +} + +/****************************************************************************** +* The LZ compression output routine: * +* This routine is responsible for the compression of the bit stream into * +* 8 bits (bytes) packets. * +* Returns GIF_OK if written succesfully. * +******************************************************************************/ +static int EGifCompressOutput(GifFileType *GifFile, int Code) +{ + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + int retval = GIF_OK; + + if (Code == FLUSH_OUTPUT) { + while (Private->CrntShiftState > 0) { + /* Get Rid of what is left in DWord, and flush it. */ + if (EGifBufferedOutput(GifFile, Private->Buf, + Private->CrntShiftDWord & 0xff) == GIF_ERROR) + retval = GIF_ERROR; + Private->CrntShiftDWord >>= 8; + Private->CrntShiftState -= 8; + } + Private->CrntShiftState = 0; /* For next time. */ + if (EGifBufferedOutput(GifFile, Private->Buf, + FLUSH_OUTPUT) == GIF_ERROR) + retval = GIF_ERROR; + } + else { + Private->CrntShiftDWord |= ((long) Code) << Private->CrntShiftState; + Private->CrntShiftState += Private->RunningBits; + while (Private->CrntShiftState >= 8) { + /* Dump out full bytes: */ + if (EGifBufferedOutput(GifFile, Private->Buf, + Private->CrntShiftDWord & 0xff) == GIF_ERROR) + retval = GIF_ERROR; + Private->CrntShiftDWord >>= 8; + Private->CrntShiftState -= 8; + } + } + + /* If code cannt fit into RunningBits bits, must raise its size. Note */ + /* however that codes above 4095 are used for special signaling. */ + if (Private->RunningCode >= Private->MaxCode1 && Code <= 4095) { + Private->MaxCode1 = 1 << ++Private->RunningBits; + } + + return retval; +} + +/****************************************************************************** +* This routines buffers the given characters until 255 characters are ready * +* to be output. If Code is equal to -1 the buffer is flushed (EOF). * +* The buffer is Dumped with first byte as its size, as GIF format requires. * +* Returns GIF_OK if written succesfully. * +******************************************************************************/ +static int EGifBufferedOutput(GifFileType *GifFile, GifByteType *Buf, int c) +{ + if (c == FLUSH_OUTPUT) { + /* Flush everything out. */ + if (Buf[0] != 0 && WRITE(GifFile, Buf, Buf[0]+1) != (unsigned)(Buf[0] + 1)) + { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + /* Mark end of compressed data, by an empty block (see GIF doc): */ + Buf[0] = 0; + if (WRITE(GifFile, Buf, 1) != 1) + { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + } + else { + if (Buf[0] == 255) { + /* Dump out this buffer - it is full: */ + if (WRITE(GifFile, Buf, Buf[0] + 1) != (unsigned)(Buf[0] + 1)) + { + _GifError = E_GIF_ERR_WRITE_FAILED; + return GIF_ERROR; + } + Buf[0] = 0; + } + Buf[++Buf[0]] = c; + } + + return GIF_OK; +} + +static void QuitGifError(GifFileType *GifFile) +{ + PrintGifError(); + if (GifFile != NULL) EGifCloseFile(GifFile); +} + +static void SaveGif(FILE *fp, + GifByteType *OutputBuffer, + ColorMapObject *OutputColorMap, + int ExpColorMapSize, int Width, int Height){ + int i; + GifFileType *GifFile; + GifByteType *Ptr; + + if ((GifFile = EGifOpenFileHandle(fp, 1)) == NULL){ + QuitGifError(GifFile); + return; + } + + if (EGifPutScreenDesc(GifFile, Width, Height, ExpColorMapSize, 0, OutputColorMap) == GIF_ERROR){ + QuitGifError(GifFile); + return; + } + + if (EGifPutImageDesc(GifFile, 0, 0, Width, Height, FALSE, NULL) == GIF_ERROR){ + QuitGifError(GifFile); + return; + } + + Ptr = &OutputBuffer[(Height-1)*Width] ; + for (i = 0; i < Height; i++) { + if (EGifPutLine(GifFile, Ptr, Width) == GIF_ERROR){ + QuitGifError(GifFile); + return; + } + Ptr -= Width; + } + + if (EGifCloseFile(GifFile) == GIF_ERROR) + QuitGifError(GifFile); +} + +void create_gif(FILE *fp, int width, int height){ + GifByteType *RedBuffer, *GreenBuffer, *BlueBuffer, *OutputBuffer = NULL; + ColorMapObject *OutputColorMap = NULL; + + _GifError = 0; + ExpNumOfColors = 8; + ColorMapSize = 256; + + RedBuffer = (unsigned char *)malloc(height*width*sizeof(unsigned char)); + GreenBuffer = (unsigned char *)malloc(height*width*sizeof(unsigned char)); + BlueBuffer = (unsigned char *)malloc(height*width*sizeof(unsigned char)); + + if(!RedBuffer || !GreenBuffer || !BlueBuffer){ + fprintf(stderr, "Error: Failed to allocate memory for RGB Buffers\n"); + return; + } + + glReadPixels(0,0,width,height,GL_RED,GL_UNSIGNED_BYTE,RedBuffer); + glReadPixels(0,0,width,height,GL_GREEN,GL_UNSIGNED_BYTE,GreenBuffer); + glReadPixels(0,0,width,height,GL_BLUE,GL_UNSIGNED_BYTE,BlueBuffer); + + if (!(OutputColorMap = MakeMapObject(ColorMapSize, NULL))){ + fprintf(stderr, "Warning: Failed to allocate memory for ColorMap\n"); + return; + } + + if(!(OutputBuffer = (GifByteType *) malloc(width * height * sizeof(GifByteType)))){ + fprintf(stderr, "Error: Failed to allocate memory for Output Buffer\n"); + return; + } + + if (QuantizeBuffer(width, height, &ColorMapSize, + RedBuffer, GreenBuffer, BlueBuffer, + OutputBuffer, OutputColorMap->Colors) == GIF_ERROR) + fprintf(stderr, "Warning: Quantize Buffer Failed\n"); + + free(RedBuffer); + free(GreenBuffer); + free(BlueBuffer); + + SaveGif(fp, OutputBuffer, OutputColorMap, ExpNumOfColors, width, height); +} + diff --git a/Graphics/gl2gif.h b/Graphics/gl2gif.h new file mode 100644 index 0000000000000000000000000000000000000000..e848560192dcaee3be78b54930cb3d72d2d21ddf --- /dev/null +++ b/Graphics/gl2gif.h @@ -0,0 +1,150 @@ +#ifndef _GL2GIF_H_ +#define _GL2GIF_H_ + +#define GIF_ERROR 0 +#define GIF_OK 1 + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#define VoidPtr void * + +typedef unsigned char GifPixelType; +typedef unsigned char GifByteType; + +typedef struct GifColorType { + GifByteType Red, Green, Blue; +} GifColorType; + +typedef struct ColorMapObject{ + int ColorCount; + int BitsPerPixel; + GifColorType *Colors; /* on malloc(3) heap */ +} ColorMapObject; + +typedef struct GifImageDesc { + int Left, Top, Width, Height ; /* Current image dimensions. */ + int Interlace; /* Sequential/Interlaced lines. */ + ColorMapObject *ColorMap; /* The local color map */ +} GifImageDesc; + +typedef struct GifFileType { + int SWidth, SHeight; /* Screen dimensions. */ + int SColorResolution; /* How many colors can we generate? */ + int SBackGroundColor; /* I hope you understand this one... */ + ColorMapObject *SColorMap; /* NULL if not exists. */ + int ImageCount; /* Number of current image */ + GifImageDesc Image; /* Block describing current image */ + VoidPtr Private; /* Don't mess with this! */ +} GifFileType; + +typedef enum { + UNDEFINED_RECORD_TYPE, + SCREEN_DESC_RECORD_TYPE, + IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */ + TERMINATE_RECORD_TYPE /* Begin with ';' */ +} GifRecordType; + +#define HT_SIZE 8192 /* 12bits = 4096 or twice as big! */ +#define HT_KEY_MASK 0x1FFF /* 13bits keys */ +#define HT_KEY_NUM_BITS 13 /* 13bits keys */ +#define HT_MAX_KEY 8191 /* 13bits - 1, maximal code possible */ +#define HT_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ + +/* The 32 bits of the long are divided into two parts for the key & code: */ +/* 1. The code is 12 bits as our compression algorithm is limited to 12bits */ +/* 2. The key is 12 bits Prefix code + 8 bit new char or 20 bits. */ +#define HT_GET_KEY(l) (l >> 12) +#define HT_GET_CODE(l) (l & 0x0FFF) +#define HT_PUT_KEY(l) (l << 12) +#define HT_PUT_CODE(l) (l & 0x0FFF) + +typedef struct GifHashTableType { + unsigned long HTable[HT_SIZE]; +} GifHashTableType; + +#define LZ_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ +#define LZ_BITS 12 + +#define FLUSH_OUTPUT 4096 /* Impossible code, to signal flush. */ +#define FIRST_CODE 4097 /* Impossible code, to signal first. */ +#define NO_SUCH_CODE 4098 /* Impossible code, to signal empty. */ + +#define FILE_STATE_WRITE 0x01 +#define FILE_STATE_SCREEN 0x02 +#define FILE_STATE_IMAGE 0x04 +#define FILE_STATE_READ 0x08 + +#define IS_READABLE(Private) (Private->FileState & FILE_STATE_READ) +#define IS_WRITEABLE(Private) (Private->FileState & FILE_STATE_WRITE) + +typedef struct GifFilePrivateType { + int FileState; + int FileHandle; /* Where all this data goes to! */ + int BitsPerPixel; /* Bits per pixel (Codes uses at least this + 1). */ + int ClearCode; /* The CLEAR LZ code. */ + int EOFCode; /* The EOF LZ code. */ + int RunningCode; /* The next code algorithm can generate. */ + int RunningBits;/* The number of bits required to represent RunningCode. */ + int MaxCode1; /* 1 bigger than max. possible code, in RunningBits bits. */ + int LastCode; /* The code before the current code. */ + int CrntCode; /* Current algorithm code. */ + int StackPtr; /* For character stack (see below). */ + int CrntShiftState; /* Number of bits in CrntShiftDWord. */ + unsigned long CrntShiftDWord; /* For bytes decomposition into codes. */ + unsigned long PixelCount; /* Number of pixels in image. */ + FILE *File; /* File as stream. */ + GifByteType Buf[256]; /* Compressed input is buffered here. */ + GifByteType Stack[LZ_MAX_CODE]; /* Decoded pixels are stacked here. */ + GifByteType Suffix[LZ_MAX_CODE+1]; /* So we can trace the codes. */ + int Prefix[LZ_MAX_CODE+1]; + GifHashTableType *HashTable; +} GifFilePrivateType; + + +#define E_GIF_ERR_OPEN_FAILED 1 /* And EGif possible errors. */ +#define E_GIF_ERR_WRITE_FAILED 2 +#define E_GIF_ERR_HAS_SCRN_DSCR 3 +#define E_GIF_ERR_HAS_IMAG_DSCR 4 +#define E_GIF_ERR_NO_COLOR_MAP 5 +#define E_GIF_ERR_DATA_TOO_BIG 6 +#define E_GIF_ERR_NOT_ENOUGH_MEM 7 +#define E_GIF_ERR_DISK_IS_FULL 8 +#define E_GIF_ERR_CLOSE_FAILED 9 +#define E_GIF_ERR_NOT_WRITEABLE 10 + +/* Provate functions */ + +GifHashTableType *_InitHashTable(void); +void _ClearHashTable(GifHashTableType *HashTable); +void _InsertHashTable(GifHashTableType *HashTable, unsigned long Key, int Code); +int _ExistsHashTable(GifHashTableType *HashTable, unsigned long Key); + +GifFileType *EGifOpenFileHandle(int GifFileHandle); +void EGifSetGifVersion(char *Version); +int EGifPutScreenDesc(GifFileType *GifFile, + int GifWidth, int GifHeight, int GifColorRes, int GifBackGround, + ColorMapObject *GifColorMap); +int EGifPutImageDesc(GifFileType *GifFile, + int GifLeft, int GifTop, int Width, int GifHeight, int GifInterlace, + ColorMapObject *GifColorMap); +int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); +int EGifCloseFile(GifFileType *GifFile); + +int QuantizeBuffer(int Width, int Height, int *ColorMapSize, + GifByteType *RedInput, GifByteType *GreenInput, GifByteType *BlueInput, + GifByteType *OutputBuffer, GifColorType *OutputColorMap); + +extern void PrintGifError(void); +extern int GifLastError(void); +extern ColorMapObject *MakeMapObject(int ColorCount, GifColorType *ColorMap); +extern void FreeMapObject(ColorMapObject *Object); +extern int BitSize(int n); + +/* Public functions */ + +void create_gif(FILE *fp, int width, int height); + +#endif diff --git a/Graphics/gl2ps.cpp b/Graphics/gl2ps.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7383d1f2941ee77e67f949d674b25745c66cd7ab --- /dev/null +++ b/Graphics/gl2ps.cpp @@ -0,0 +1,1355 @@ +/* + * GL2PS, an OpenGL to Postscript Printing Library, version 0.31 + * Copyright (C) 1999-2000 Christophe Geuzaine + * + * Last Mod by Christophe on Mon Aug 14 23:49:15 2000 + * + * E-mail: Christophe.Geuzaine@AdValvas.be + * URL: http://www.geuz.org/gl2ps/ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include <string.h> +#include <sys/types.h> +#include <malloc.h> +#include <math.h> +#include <stdarg.h> +#include <time.h> + +#include "gl2ps.h" + +static GL2PScontext gl2ps; + +GLvoid gl2psMsg(GLint level, char *fmt, ...){ + va_list args; + + if(!(gl2ps.options & GL2PS_SILENT)){ + switch(level){ + case GL2PS_INFO : fprintf(stderr, "GL2PS info: "); break; + case GL2PS_WARNING : fprintf(stderr, "GL2PS warning: "); break; + case GL2PS_ERROR : fprintf(stderr, "GL2PS error: "); break; + } + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end (args); + fprintf(stderr, "\n"); + } + if(level == GL2PS_ERROR) exit(1); +} + +GLvoid *gl2psMalloc(size_t size){ + GLvoid *ptr; + + if(!size) return(NULL); + ptr = malloc(size); + if(!ptr) gl2psMsg(GL2PS_ERROR, "Couldn't Allocate Requested Memory"); + return(ptr); +} + +GLvoid *gl2psRealloc(GLvoid *ptr, size_t size){ + if(!size) return(NULL); + ptr = realloc(ptr, size); + if(!ptr) gl2psMsg(GL2PS_ERROR, "Couldn't Reallocate Requested Memory"); + return(ptr); +} + +GLvoid gl2psFree(GLvoid *ptr){ + if(!ptr) return; + free(ptr); +} + +GLvoid gl2psListRealloc(GL2PSlist *list, GLint n){ + if(n <= 0) return; + if(!list->array){ + list->nmax = ((n - 1) / list->incr + 1) * list->incr; + list->array = (char *)gl2psMalloc(list->nmax * list->size); + } + else + if(n > list->nmax){ + list->nmax = ((n - 1) / list->incr + 1) * list->incr; + list->array = (char *)gl2psRealloc(list->array, + list->nmax * list->size); + } +} + +GL2PSlist *gl2psListCreate(GLint n, GLint incr, GLint size){ + GL2PSlist *list; + + if(n < 0) n = 0; + if(incr <= 0) incr = 1; + list = (GL2PSlist *)gl2psMalloc(sizeof(GL2PSlist)); + list->nmax = 0; + list->incr = incr; + list->size = size; + list->n = 0; + list->array = NULL; + gl2psListRealloc(list, n); + return(list); +} + +GLvoid gl2psListDelete(GL2PSlist *list){ + gl2psFree(list->array); + gl2psFree(list); +} + +GLvoid gl2psListAdd(GL2PSlist *list, GLvoid *data){ + list->n++; + gl2psListRealloc(list, list->n); + memcpy(&list->array[(list->n - 1) * list->size], data, list->size); +} + +GLint gl2psListNbr(GL2PSlist *list){ + return(list->n); +} + +GLvoid *gl2psListPointer(GL2PSlist *list, GLint index){ + if((index < 0) || (index >= list->n)) + gl2psMsg(GL2PS_ERROR, "Wrong List Index in gl2psListPointer"); + return(&list->array[index * list->size]); +} + +GLvoid gl2psListSort(GL2PSlist *list, + GLint (*fcmp)(const GLvoid *a, const GLvoid *b)){ + qsort(list->array, list->n, list->size, fcmp); +} + +GLvoid gl2psListAction(GL2PSlist *list, + GLvoid (*action)(GLvoid *data, GLvoid *dummy)){ + GLint i, dummy; + + for(i=0 ; i<gl2psListNbr(list) ; i++) + (*action)(gl2psListPointer(list, i), &dummy); +} + +GLvoid gl2psListActionInverse(GL2PSlist *list, + GLvoid (*action)(GLvoid *data, GLvoid *dummy)){ + GLint i, dummy; + + for(i=gl2psListNbr(list) ; i>0 ; i--) + (*action)(gl2psListPointer(list, i-1), &dummy); +} + +GLfloat gl2psComparePointPlane(GL2PSxyz point, GL2PSplane plane){ + return(plane[0] * point[0] + + plane[1] * point[1] + + plane[2] * point[2] + + plane[3]); +} + +GLfloat gl2psPsca(GLfloat *a, GLfloat *b){ + return(a[0]*b[0] + a[1]*b[1] + a[2]*b[2]); +} + +GLvoid gl2psPvec(GLfloat *a, GLfloat *b, GLfloat *c){ + c[0] = a[1]*b[2] - a[2]*b[1]; + c[1] = a[2]*b[0] - a[0]*b[2]; + c[2] = a[0]*b[1] - a[1]*b[0]; +} + +GLfloat gl2psNorm(GLfloat *a){ + return sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2]); +} + +GLvoid gl2psGetNormal(GLfloat *a, GLfloat *b, GLfloat *c){ + GLfloat norm; + gl2psPvec(a, b, c); + if((norm = gl2psNorm(c))){ + c[0] = c[0] / norm; + c[1] = c[1] / norm; + c[2] = c[2] / norm; + } + else + gl2psMsg(GL2PS_WARNING, "Bad Plane in BSP Tree"); +} + +GLvoid gl2psGetPlane(GL2PSprimitive *prim, GL2PSplane plane){ + GL2PSxyz v={0., 0., 0.}, w={0., 0., 0.}; + + switch(prim->type){ + case GL2PS_TRIANGLE : + case GL2PS_QUADRANGLE : + v[0] = prim->verts[1].xyz[0] - prim->verts[0].xyz[0]; + v[1] = prim->verts[1].xyz[1] - prim->verts[0].xyz[1]; + v[2] = prim->verts[1].xyz[2] - prim->verts[0].xyz[2]; + w[0] = prim->verts[2].xyz[0] - prim->verts[0].xyz[0]; + w[1] = prim->verts[2].xyz[1] - prim->verts[0].xyz[1]; + w[2] = prim->verts[2].xyz[2] - prim->verts[0].xyz[2]; + if((!v[0] && !v[1] && !v[2]) || (!w[0] && !w[1] && !w[2])){ + plane[0] = plane[1] = 0.; + plane[2] = 1.; + plane[3] = -prim->verts[0].xyz[2]; + } + else{ + gl2psGetNormal(v, w, plane); + plane[3] = + - plane[0] * prim->verts[0].xyz[0] + - plane[1] * prim->verts[0].xyz[1] + - plane[2] * prim->verts[0].xyz[2]; + } + break; + case GL2PS_LINE : + v[0] = prim->verts[1].xyz[0] - prim->verts[0].xyz[0]; + v[1] = prim->verts[1].xyz[1] - prim->verts[0].xyz[1]; + v[2] = prim->verts[1].xyz[2] - prim->verts[0].xyz[2]; + if(!v[0] && !v[1] && !v[2]){ + plane[0] = plane[1] = 0.; + plane[2] = 1.; + plane[3] = -prim->verts[0].xyz[2]; + } + else{ + if(!v[0]) w[0] = 1.; + else if(!v[1]) w[1] = 1.; + else w[2] = 1.; + gl2psGetNormal(v, w, plane); + plane[3] = + - plane[0] * prim->verts[0].xyz[0] + - plane[1] * prim->verts[0].xyz[1] + - plane[2] * prim->verts[0].xyz[2]; + } + break; + case GL2PS_POINT : + case GL2PS_TEXT : + plane[0] = plane[1] = 0.; + plane[2] = 1.; + plane[3] = -prim->verts[0].xyz[2]; + break; + default : + gl2psMsg(GL2PS_ERROR, "Unknown Primitive Type in BSP Tree"); + } +} + +GLvoid gl2psCutEdge(GL2PSvertex a, GL2PSvertex b, GL2PSplane plane, + GL2PSvertex *c){ + GL2PSxyz v; + GLfloat sect; + + v[0] = b.xyz[0] - a.xyz[0]; + v[1] = b.xyz[1] - a.xyz[1]; + v[2] = b.xyz[2] - a.xyz[2]; + sect = - gl2psComparePointPlane(a.xyz, plane) / gl2psPsca(plane, v); + + c->xyz[0] = a.xyz[0] + v[0] * sect; + c->xyz[1] = a.xyz[1] + v[1] * sect; + c->xyz[2] = a.xyz[2] + v[2] * sect; + + c->rgba[0] = (1.-sect) * a.rgba[0] + sect * b.rgba[0]; + c->rgba[1] = (1.-sect) * a.rgba[1] + sect * b.rgba[1]; + c->rgba[2] = (1.-sect) * a.rgba[2] + sect * b.rgba[2]; + c->rgba[3] = (1.-sect) * a.rgba[3] + sect * b.rgba[3]; +} + +GLvoid gl2psFreePrimitive(GLvoid *a, GLvoid *b){ + GL2PSprimitive *q ; + + q = *(GL2PSprimitive**)a; + gl2psFree(q->verts); + if(q->type == GL2PS_TEXT){ + if(q->text->str) gl2psFree(q->text->str); + gl2psFree(q->text); + } + gl2psFree(q); +} + +GLvoid gl2psCreateSplittedPrimitive(GL2PSprimitive *parent, GL2PSplane plane, + GL2PSprimitive **child, GLshort numverts, + GLshort *index0, GLshort *index1){ + GLshort i; + + if(numverts > 4){ + gl2psMsg(GL2PS_WARNING, "%d Vertices in Polygon", numverts); + numverts = 4; + } + + switch(numverts){ + case 1 : (*child)->type = GL2PS_POINT; break; + case 2 : (*child)->type = GL2PS_LINE; break; + case 3 : (*child)->type = GL2PS_TRIANGLE; break; + case 4 : (*child)->type = GL2PS_QUADRANGLE; break; + } + (*child)->boundary = 0; /* not done! */ + (*child)->dash = parent->dash; + (*child)->numverts = numverts; + (*child)->verts = (GL2PSvertex *)gl2psMalloc(numverts * sizeof(GL2PSvertex)); + + for(i=0 ; i<numverts ; i++){ + if(index1[i] < 0) + (*child)->verts[i] = parent->verts[index0[i]]; + else + gl2psCutEdge(parent->verts[index0[i]], parent->verts[index1[i]], + plane, &(*child)->verts[i]); + } +} + +GLvoid gl2psAddIndex(GLshort *index0, GLshort *index1, GLshort *nb, + GLshort i, GLshort j){ + GLint k; + + for(k=0 ; k<*nb ; k++) + if((index0[k] == i && index1[k] == j) || + (index1[k] == i && index0[k] == j)) return; + + index0[*nb] = i; + index1[*nb] = j; + (*nb)++; +} + +GLshort gl2psGetIndex(GLshort i, GLshort num){ + return(i < num-1) ? i+1 : 0; +} + +GLint gl2psTestSplitPrimitive(GL2PSprimitive *prim, GL2PSplane plane){ + GLint type=GL2PS_COINCIDENT; + GLshort i, j; + GLfloat d[5]; + + for(i = 0 ; i < prim->numverts ; i++){ + d[i] = gl2psComparePointPlane(prim->verts[i].xyz, plane); + } + + if(prim->type == GL2PS_POINT) + return 0; + else{ + for(i = 0 ; i < prim->numverts ; i++){ + j = gl2psGetIndex(i, prim->numverts); + if(d[j] > GL2PS_EPSILON){ + if(type == GL2PS_COINCIDENT) type = GL2PS_IN_BACK_OF; + else if(type != GL2PS_IN_BACK_OF) return 1; + if(d[i] < -GL2PS_EPSILON) return 1; + } + else if(d[j] < -GL2PS_EPSILON){ + if(type == GL2PS_COINCIDENT) type = GL2PS_IN_FRONT_OF; + else if(type != GL2PS_IN_FRONT_OF) return 1; + if(d[i] > GL2PS_EPSILON) return 1; + } + } + } + return 0; +} + +GLint gl2psSplitPrimitive(GL2PSprimitive *prim, GL2PSplane plane, + GL2PSprimitive **front, GL2PSprimitive **back){ + GLshort i, j, in=0, out=0, in0[5], in1[5], out0[5], out1[5]; + GLint type; + GLfloat d[5]; + + type = GL2PS_COINCIDENT; + + for(i = 0 ; i < prim->numverts ; i++){ + d[i] = gl2psComparePointPlane(prim->verts[i].xyz, plane); + } + + switch(prim->type){ + case GL2PS_POINT : + if(d[0] > GL2PS_EPSILON) type = GL2PS_IN_BACK_OF; + else if(d[0] < -GL2PS_EPSILON) type = GL2PS_IN_FRONT_OF; + else type = GL2PS_COINCIDENT; + break; + default : + for(i = 0 ; i < prim->numverts ; i++){ + j = gl2psGetIndex(i, prim->numverts); + if(d[j] > GL2PS_EPSILON){ + if(type == GL2PS_COINCIDENT) type = GL2PS_IN_BACK_OF; + else if(type != GL2PS_IN_BACK_OF) type = GL2PS_SPANNING; + if(d[i] < -GL2PS_EPSILON){ + gl2psAddIndex(in0, in1, &in, i, j); + gl2psAddIndex(out0, out1, &out, i, j); + type = GL2PS_SPANNING; + } + gl2psAddIndex(out0, out1, &out, j, -1); + } + else if(d[j] < -GL2PS_EPSILON){ + if(type == GL2PS_COINCIDENT) type = GL2PS_IN_FRONT_OF; + else if(type != GL2PS_IN_FRONT_OF) type = GL2PS_SPANNING; + if(d[i] > GL2PS_EPSILON){ + gl2psAddIndex(in0, in1, &in, i, j); + gl2psAddIndex(out0, out1, &out, i, j); + type = GL2PS_SPANNING; + } + gl2psAddIndex(in0, in1, &in, j, -1); + } + else{ + gl2psAddIndex(in0, in1, &in, j, -1); + gl2psAddIndex(out0, out1, &out, j, -1); + } + } + break; + } + + if(type == GL2PS_SPANNING){ + *back = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); + *front = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); + gl2psCreateSplittedPrimitive(prim, plane, back, out, out0, out1); + gl2psCreateSplittedPrimitive(prim, plane, front, in, in0, in1); + } + + return type; +} + +GLvoid gl2psDivideQuad(GL2PSprimitive *quad, + GL2PSprimitive **t1, GL2PSprimitive **t2){ + *t1 = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); + *t2 = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); + (*t1)->type = (*t2)->type = GL2PS_TRIANGLE; + (*t1)->numverts = (*t2)->numverts = 3; + (*t1)->depth = (*t2)->depth = quad->depth; + (*t1)->dash = (*t2)->dash = quad->dash; + (*t1)->verts = (GL2PSvertex *)gl2psMalloc(3 * sizeof(GL2PSvertex)); + (*t2)->verts = (GL2PSvertex *)gl2psMalloc(3 * sizeof(GL2PSvertex)); + (*t1)->verts[0] = quad->verts[0]; + (*t1)->verts[1] = quad->verts[1]; + (*t1)->verts[2] = quad->verts[2]; + (*t1)->boundary = ((quad->boundary & 1) ? 1 : 0) | ((quad->boundary & 2) ? 2 : 0); + (*t2)->verts[0] = quad->verts[0]; + (*t2)->verts[1] = quad->verts[2]; + (*t2)->verts[2] = quad->verts[3]; + (*t1)->boundary = ((quad->boundary & 4) ? 2 : 0) | ((quad->boundary & 4) ? 2 : 0); +} + +int gl2psCompareDepth(const GLvoid *a, const GLvoid *b){ + GL2PSprimitive *q,*w; + GLfloat diff; + + q = *(GL2PSprimitive**)a; + w = *(GL2PSprimitive**)b; + diff = q->depth - w->depth; + if(diff > 0.) + return 1; + else if(diff < 0.) + return -1; + else + return 0; +} + +GLint gl2psTrianglesFirst(const GLvoid *a, const GLvoid *b){ + GL2PSprimitive *q,*w; + + q = *(GL2PSprimitive**)a; + w = *(GL2PSprimitive**)b; + return(q->type < w->type ? 1 : -1); +} + +GLint gl2psFindRoot(GL2PSlist *primitives, GL2PSprimitive **root){ + GLint i, j, count, best=1000000, index=0; + GL2PSprimitive *prim1, *prim2; + GL2PSplane plane; + + if(gl2ps.options & GL2PS_BEST_ROOT){ + *root = *(GL2PSprimitive**)gl2psListPointer(primitives, 0); + for(i=0 ; i<gl2psListNbr(primitives) ; i++){ + prim1 = *(GL2PSprimitive**)gl2psListPointer(primitives, i); + gl2psGetPlane(prim1, plane); + count=0; + for(j=0 ; j<gl2psListNbr(primitives) ; j++){ + if(j != i){ + prim2 = *(GL2PSprimitive**)gl2psListPointer(primitives, j); + count += gl2psTestSplitPrimitive(prim2, plane); + } + if(count > best) break; + } + if(count < best){ + best = count; + index = i; + *root = prim1; + if(!count) return index; + } + } + if(index) printf("GL2PS_BEST_ROOT was worth it: %d\n", index); + return index; + } + else{ + *root = *(GL2PSprimitive**)gl2psListPointer(primitives, 0); + return 0; + } +} + + +GLvoid gl2psAddPrimitiveInList(GL2PSprimitive *prim, GL2PSlist *list){ + GL2PSprimitive *t1, *t2; + + if(prim->type != GL2PS_QUADRANGLE){ + gl2psListAdd(list, &prim); + } + else{ + gl2psDivideQuad(prim, &t1, &t2); + gl2psListAdd(list, &t1); + gl2psListAdd(list, &t2); + gl2psFreePrimitive(&prim, NULL); + } + +} + +GLvoid gl2psBuildBspTree(GL2PSbsptree *tree, GL2PSlist *primitives){ + GL2PSprimitive *prim, *frontprim, *backprim; + GL2PSlist *frontlist, *backlist; + GLint i, index; + + tree->front = NULL; + tree->back = NULL; + tree->primitives = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); + index = gl2psFindRoot(primitives, &prim); + gl2psGetPlane(prim, tree->plane); + gl2psAddPrimitiveInList(prim, tree->primitives); + + frontlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); + backlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); + + for(i=0 ; i<gl2psListNbr(primitives) ; i++){ + if(i != index){ + prim = *(GL2PSprimitive**)gl2psListPointer(primitives,i); + switch(gl2psSplitPrimitive(prim,tree->plane,&frontprim,&backprim)){ + case GL2PS_COINCIDENT: + gl2psAddPrimitiveInList(prim, tree->primitives); + break; + case GL2PS_IN_BACK_OF: + gl2psAddPrimitiveInList(prim, backlist); + break; + case GL2PS_IN_FRONT_OF: + gl2psAddPrimitiveInList(prim, frontlist); + break; + case GL2PS_SPANNING: + gl2psAddPrimitiveInList(backprim, backlist); + gl2psAddPrimitiveInList(frontprim, frontlist); + gl2psFreePrimitive(&prim, NULL); + break; + } + } + } + + if(gl2psListNbr(tree->primitives)) + gl2psListSort(tree->primitives, gl2psTrianglesFirst); + + if(gl2psListNbr(frontlist)){ + gl2psListSort(frontlist, gl2psTrianglesFirst); + tree->front = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree)); + gl2psBuildBspTree(tree->front, frontlist); + } + + if(gl2psListNbr(backlist)){ + gl2psListSort(frontlist, gl2psTrianglesFirst); + tree->back = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree)); + gl2psBuildBspTree(tree->back, backlist); + } +} + +GLvoid gl2psTraverseBspTree(GL2PSbsptree *tree, GL2PSxyz eye, GLfloat epsilon, + GLboolean (*compare)(GLfloat f1, GLfloat f2), + GLvoid (*action)(GLvoid *data, GLvoid *dummy)){ + GLfloat result; + + if(!tree) return; + + result = gl2psComparePointPlane(eye, tree->plane); + + if(compare(result, epsilon)){ + gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action); + gl2psListAction(tree->primitives, action); + gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action); + } + else if(compare(-epsilon, result)){ + gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action); + gl2psListAction(tree->primitives, action); + gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action) ; + } + else{ + gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action); + gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action) ; + } +} + + +GLint gl2psSplit2d(GL2PSxyz a, GL2PSxyz b, GL2PSxy tc, GL2PSxy td){ + GLfloat line[3], n, d[2]; + + /* + in back of == >0 == outside polygon + */ + + line[0] = td[1] - tc[1] ; + line[1] = tc[0] - td[0] ; + n = sqrt(line[0]*line[0]+line[1]*line[1]); + line[0] /= n ; + line[1] /= n ; + line[2] = - line[0] * tc[0] - line[1] * tc[1] ; + + d[0] = line[0]*a[0] + line[1]*a[1] + line[2] ; + + if(b == NULL){ + if(d[0] > GL2PS_EPSILON) return GL2PS_IN_BACK_OF; + else if(d[0] < -GL2PS_EPSILON) return GL2PS_IN_FRONT_OF; + else return GL2PS_COINCIDENT; + } + else{ + d[1] = line[0]*b[0] + line[1]*b[1] + line[2] ; + + if(d[0] > GL2PS_EPSILON){ + if(d[1] < -GL2PS_EPSILON) return GL2PS_SPANNING; + else return GL2PS_IN_BACK_OF; + } + if(d[0] < -GL2PS_EPSILON){ + if(d[1] > GL2PS_EPSILON) return GL2PS_SPANNING; + else return GL2PS_IN_FRONT_OF; + } + else{ + if(d[1] > GL2PS_EPSILON) return GL2PS_IN_BACK_OF; + else if(d[1] < -GL2PS_EPSILON) return GL2PS_IN_FRONT_OF; + /* else return GL2PS_COINCIDENT; */ + else return GL2PS_IN_FRONT_OF; + } + } +} + + +GLvoid gl2psSimplify2d(GL2PSbsptree2d *tree){ + if(!tree) return; + if(tree->back){ + if(tree->flag==0) + gl2psSimplify2d(tree->back); + } + if(tree->front){ + gl2psSimplify2d(tree->front); + } +} + +GLvoid gl2psReset(GL2PSbsptree2d *tree){ + if(!tree) return; + tree->flag=0; + if(tree->back){ + gl2psReset(tree->back); + } + if(tree->front){ + gl2psReset(tree->front); + } +} + + +static GL2PSbsptree2d *image=NULL; + +GLvoid gl2psAddInImageTree(GL2PSprimitive *prim, + GL2PSxyz a, GL2PSxyz b, GL2PSbsptree2d **tree){ + GLint res; + + if(*tree == NULL){ + /* insert the edge, except for lines & points */ + if(prim->numverts > 2){ + prim->depth = -1.; + (*tree) = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); + (*tree)->a[0] = a[0]; + (*tree)->a[1] = a[1]; + (*tree)->b[0] = b[0]; + (*tree)->b[1] = b[1]; + (*tree)->front = NULL; + (*tree)->back = NULL; + (*tree)->flag = 1; + } + } + else{ + res = gl2psSplit2d(a, b, (*tree)->a, (*tree)->b); + + switch(res){ + case GL2PS_IN_BACK_OF: + gl2psAddInImageTree(prim, a, b, &(*tree)->back); + break; + case GL2PS_IN_FRONT_OF: + if((*tree)->flag) gl2psAddInImageTree(prim, a, b, &(*tree)->front); + break; + case GL2PS_SPANNING: + gl2psAddInImageTree(prim, a, b, &(*tree)->back); + if((*tree)->flag) gl2psAddInImageTree(prim, a, b, &(*tree)->front); + break; + case GL2PS_COINCIDENT: + (*tree)->flag = 1; + break; + } + } +} + +static int count=0; + +GLvoid gl2psAddInImage(void *a, void *b){ + GL2PSprimitive *prim; + GLint i; + + prim = *(GL2PSprimitive **)a; + + /* if(prim->numverts == 1) + gl2psAddInImageTree(prim, prim->verts[i].xyz, NULL, &image); */ + if(prim->numverts < 3) + return; + else{ + for(i=0 ; i<prim->numverts ; i++){ + count++; + gl2psAddInImageTree(prim, prim->verts[i].xyz, + prim->verts[gl2psGetIndex(i,prim->numverts)].xyz, &image); + } + } + + /* simplify old/new */ + + gl2psReset(image); + +} + + +#define GL2PS_BOUNDARY_OFFSET 0 + +GLvoid gl2psAddBoundaryInList(GL2PSprimitive *prim, GL2PSlist *list){ + GL2PSprimitive *b; + GLshort i; + GL2PSxyz c; + + c[0] = c[1] = c[2] = 0.; + for(i=0 ; i<prim->numverts ; i++){ + c[0] += prim->verts[i].xyz[0]; + c[1] += prim->verts[i].xyz[1]; + } + c[0] /= prim->numverts; + c[1] /= prim->numverts; + + for(i=0 ; i<prim->numverts ; i++){ + if(prim->boundary & (GLint)pow(2, i)){ + b = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); + b->type = GL2PS_LINE; + b->dash = prim->dash; + b->boundary = 0; + b->numverts = 2; + b->verts = (GL2PSvertex *)gl2psMalloc(2 * sizeof(GL2PSvertex)); + +#if GL2PS_BOUNDARY_OFFSET + v[0] = c[0] - prim->verts[i].xyz[0]; + v[1] = c[1] - prim->verts[i].xyz[1]; + v[2] = 0.; + norm = gl2psNorm(v); + v[0] /= norm; + v[1] /= norm; + b->verts[0].xyz[0] = prim->verts[i].xyz[0] +0.1*v[0]; + b->verts[0].xyz[1] = prim->verts[i].xyz[1] +0.1*v[1]; + b->verts[0].xyz[2] = prim->verts[i].xyz[2]; + v[0] = c[0] - prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0]; + v[1] = c[1] - prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1]; + norm = gl2psNorm(v); + v[0] /= norm; + v[1] /= norm; + b->verts[1].xyz[0] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0] +0.1*v[0]; + b->verts[1].xyz[1] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1] +0.1*v[1]; + b->verts[1].xyz[2] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[2]; +#else + b->verts[0].xyz[0] = prim->verts[i].xyz[0]; + b->verts[0].xyz[1] = prim->verts[i].xyz[1]; + b->verts[0].xyz[2] = prim->verts[i].xyz[2]; + b->verts[1].xyz[0] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0]; + b->verts[1].xyz[1] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1]; + b->verts[1].xyz[2] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[2]; +#endif + + b->verts[0].rgba[0] = 0.; + b->verts[0].rgba[1] = 0.; + b->verts[0].rgba[2] = 0.; + b->verts[0].rgba[3] = 0.; + b->verts[1].rgba[0] = 0.; + b->verts[1].rgba[1] = 0.; + b->verts[1].rgba[2] = 0.; + b->verts[1].rgba[3] = 0.; + gl2psListAdd(list, &b); + } + } + +} + +GLvoid gl2psBuildPolygonBoundary(GL2PSbsptree *tree){ + GLint i, n; + GL2PSprimitive *prim; + + if(!tree) return; + gl2psBuildPolygonBoundary(tree->back); + n = gl2psListNbr(tree->primitives); + for(i=0 ; i<n ; i++){ + prim = *(GL2PSprimitive**)gl2psListPointer(tree->primitives, i); + if(prim->boundary) gl2psAddBoundaryInList(prim, tree->primitives); + } + gl2psBuildPolygonBoundary(tree->front); +} + +GLvoid gl2psPrintPrimitive(GLvoid *a, GLvoid *b){ + GL2PSprimitive *prim; + + prim = *(GL2PSprimitive**) a; + + if(gl2ps.options & GL2PS_OCCLUSION_CULL && prim->depth >= 0.) return; + + switch(prim->type){ + case GL2PS_TEXT : + fprintf(gl2ps.stream, "(%s) %g %g %g %g %g %d /%s S\n", + prim->text->str, prim->verts[0].xyz[0], prim->verts[0].xyz[1], + prim->verts[0].rgba[0], prim->verts[0].rgba[1], + prim->verts[0].rgba[2], prim->text->fontsize, + prim->text->fontname); + break; + case GL2PS_POINT : + fprintf(gl2ps.stream, "%g %g %g %g %g P\n", prim->verts[0].xyz[0], + prim->verts[0].xyz[1], prim->verts[0].rgba[0], + prim->verts[0].rgba[1], prim->verts[0].rgba[2]); + break; + case GL2PS_LINE : + if(prim->dash) + fprintf(gl2ps.stream, "[%d] 0 setdash\n", prim->dash); + if(gl2ps.shade){ + fprintf(gl2ps.stream, "%g %g %g %g %g %g %g %g %g %g SL\n", + prim->verts[1].xyz[0], prim->verts[1].xyz[1], + prim->verts[1].rgba[0], prim->verts[1].rgba[1], + prim->verts[1].rgba[2], prim->verts[0].xyz[0], + prim->verts[0].xyz[1], prim->verts[0].rgba[0], + prim->verts[0].rgba[1], prim->verts[0].rgba[2]); + } + else{ + fprintf(gl2ps.stream, "%g %g %g %g %g %g %g L\n", + prim->verts[1].xyz[0], prim->verts[1].xyz[1], + prim->verts[0].xyz[0], prim->verts[0].xyz[1], + prim->verts[0].rgba[0], prim->verts[0].rgba[1], + prim->verts[0].rgba[2]); + } + if(prim->dash) + fprintf(gl2ps.stream, "[] 0 setdash\n"); + break; + case GL2PS_TRIANGLE : + if(gl2ps.shade){ + fprintf(gl2ps.stream, "%g %g %g %g %g %g %g %g %g %g %g %g %g %g %g ST\n", + prim->verts[2].xyz[0], prim->verts[2].xyz[1], + prim->verts[2].rgba[0], prim->verts[2].rgba[1], + prim->verts[2].rgba[2], prim->verts[1].xyz[0], + prim->verts[1].xyz[1], prim->verts[1].rgba[0], + prim->verts[1].rgba[1], prim->verts[1].rgba[2], + prim->verts[0].xyz[0], prim->verts[0].xyz[1], + prim->verts[0].rgba[0], prim->verts[0].rgba[1], + prim->verts[0].rgba[2]); + } + else{ + fprintf(gl2ps.stream, "%g %g %g %g %g %g %g %g %g T\n", + prim->verts[2].xyz[0], prim->verts[2].xyz[1], + prim->verts[1].xyz[0], prim->verts[1].xyz[1], + prim->verts[0].xyz[0], prim->verts[0].xyz[1], + prim->verts[0].rgba[0], prim->verts[0].rgba[1], + prim->verts[0].rgba[2]); + } + break; + case GL2PS_QUADRANGLE : + gl2psMsg(GL2PS_WARNING, "There Should not be any Quad left to Print"); + break; + default : + gl2psMsg(GL2PS_ERROR, "Unknown Type of Primitive to Print"); + break; + } +} + + +GLvoid gl2psAddPolyPrimitive(GLshort type, GLshort numverts, + GL2PSvertex *verts, GLint offset, GLint dash, + GLshort boundary){ + GLshort i; + GLfloat factor, units, area, dZ, dZdX, dZdY, maxdZ; + GL2PSprimitive *prim; + + prim = (GL2PSprimitive *)gl2psMalloc(sizeof(GL2PSprimitive)); + prim->type = type; + prim->numverts = numverts; + prim->verts = (GL2PSvertex *)gl2psMalloc(numverts * sizeof(GL2PSvertex)); + memcpy(prim->verts, verts, numverts * sizeof(GL2PSvertex)); + prim->boundary = boundary; + + if(gl2ps.options & GL2PS_SIMPLE_LINE_OFFSET){ + if(type == GL2PS_LINE){ + if(gl2ps.sort == GL2PS_SIMPLE_SORT){ + prim->verts[0].xyz[2] -= 1.; + prim->verts[1].xyz[2] -= 1.; + } + else{ + prim->verts[0].xyz[2] -= 0.1; + prim->verts[1].xyz[2] -= 0.1; + } + } + } + else if(offset && type == GL2PS_TRIANGLE){ + + if(gl2ps.sort == GL2PS_SIMPLE_SORT){ + factor = gl2ps.offset[0]; + units = gl2ps.offset[1]; + } + else{ + factor = gl2ps.offset[0] / 800.; + units = gl2ps.offset[1] / 800.; + } + + area = + (prim->verts[1].xyz[0] - prim->verts[0].xyz[0]) * + (prim->verts[2].xyz[1] - prim->verts[1].xyz[1]) - + (prim->verts[2].xyz[0] - prim->verts[1].xyz[0]) * + (prim->verts[1].xyz[1] - prim->verts[0].xyz[1]); + dZdX = + (prim->verts[2].xyz[1] - prim->verts[1].xyz[1]) * + (prim->verts[1].xyz[2] - prim->verts[0].xyz[2]) - + (prim->verts[1].xyz[1] - prim->verts[0].xyz[1]) * + (prim->verts[2].xyz[2] - prim->verts[1].xyz[2]) / area; + dZdY = + (prim->verts[1].xyz[0] - prim->verts[0].xyz[0]) * + (prim->verts[2].xyz[2] - prim->verts[1].xyz[2]) - + (prim->verts[2].xyz[0] - prim->verts[1].xyz[0]) * + (prim->verts[1].xyz[2] - prim->verts[0].xyz[2]) / area; + + maxdZ = sqrt(dZdX*dZdX + dZdY*dZdY); + + dZ = factor * maxdZ + units; + + /* printf("dZ = %g (fact=%g units=%g)\n", dZ, factor, units); */ + + prim->verts[0].xyz[2] += dZ; + prim->verts[1].xyz[2] += dZ; + prim->verts[2].xyz[2] += dZ; + } + + prim->depth = 0.; + prim->dash = dash; + + if(gl2ps.sort == GL2PS_SIMPLE_SORT){ + for(i = 0; i < numverts; i++) + prim->depth += prim->verts[i].xyz[2]; + prim->depth /= (GLfloat)numverts; + } + + gl2psListAdd(gl2ps.primitives, &prim); +} + +GLint gl2psGetVertex(GL2PSvertex *v, GLfloat *p){ + GLint i; + + v->xyz[0] = p[0]; + v->xyz[1] = p[1]; + v->xyz[2] = 1000. * p[2]; + + if(gl2ps.colormode == GL_COLOR_INDEX && gl2ps.colorsize > 0){ + i = (GLint)(p[3] + 0.5); + v->rgba[0] = gl2ps.colormap[i][0]; + v->rgba[1] = gl2ps.colormap[i][1]; + v->rgba[2] = gl2ps.colormap[i][2]; + v->rgba[3] = gl2ps.colormap[i][3]; + return 4; + } + else{ + v->rgba[0] = p[3]; + v->rgba[1] = p[4]; + v->rgba[2] = p[5]; + v->rgba[3] = p[6]; + return 7; + } +} + +GLint gl2psParseFeedbackBuffer(GLvoid){ + GLint i, used, count, v, vtot, offset=0, dash=0; + GLshort boundary, flag; + GLfloat *current; + GL2PSvertex vertices[3]; + + used = glRenderMode(GL_RENDER); + + if(used < 0){ + gl2psMsg(GL2PS_INFO, "OpenGL Feedback Buffer Reallocation"); + return GL2PS_OVERFLOW; + } + + if(used == 0){ + gl2psMsg(GL2PS_WARNING, "Empty Feedback Buffer"); + return GL2PS_NO_FEEDBACK; + } + + current = gl2ps.feedback; + boundary = gl2ps.boundary = 0; + + while(used > 0){ + + if(boundary) gl2ps.boundary = 1; + + switch((GLint)*current){ + case GL_POINT_TOKEN : + current ++; + used --; + i = gl2psGetVertex(&vertices[0], current); + current += i; + used -= i; + gl2psAddPolyPrimitive(GL2PS_POINT, 1, vertices, 0, dash, 0); + break; + case GL_LINE_TOKEN : + case GL_LINE_RESET_TOKEN : + current ++; + used --; + i = gl2psGetVertex(&vertices[0], current); + current += i; + used -= i; + i = gl2psGetVertex(&vertices[1], current); + current += i; + used -= i; + gl2psAddPolyPrimitive(GL2PS_LINE, 2, vertices, 0, dash, 0); + break; + case GL_POLYGON_TOKEN : + count = (GLint)current[1]; + current += 2; + used -= 2; + v = vtot = 0; + while(count > 0 && used > 0){ + i = gl2psGetVertex(&vertices[v], current); + current += i; + used -= i; + count --; + vtot++; + if(v == 2){ + if(boundary){ + if(!count && vtot==2) flag = 1|2|4; + else if(!count) flag = 2|4; + else if(vtot==2) flag = 1|2; + else flag = 2; + } + else + flag = 0; + gl2psAddPolyPrimitive(GL2PS_TRIANGLE, 3, vertices, + offset, dash, flag); + vertices[1] = vertices[2]; + } + else + v ++; + } + break; + case GL_BITMAP_TOKEN : + case GL_DRAW_PIXEL_TOKEN : + case GL_COPY_PIXEL_TOKEN : + current ++; + used --; + i = gl2psGetVertex(&vertices[0], current); + current += i; + used -= i; + break; + case GL_PASS_THROUGH_TOKEN : + switch((GLint)current[1]){ + case GL2PS_BEGIN_POLYGON_OFFSET_FILL : offset=1; break; + case GL2PS_END_POLYGON_OFFSET_FILL : offset=0; break; + case GL2PS_BEGIN_POLYGON_BOUNDARY : boundary=1; break; + case GL2PS_END_POLYGON_BOUNDARY : boundary=0; break; + case GL2PS_BEGIN_LINE_STIPPLE : dash=4; break; + case GL2PS_END_LINE_STIPPLE : dash=0; break; + } + current += 2; + used -= 2; + break; + default : + gl2psMsg(GL2PS_WARNING, "Unknown Token in Buffer"); + current ++; + used --; + break; + } + } + + return GL2PS_SUCCESS; +} + +GLvoid gl2psPrintPostscriptHeader(GLvoid){ + GLint viewport[4], index; + GLfloat rgba[4]; + time_t now; + + time(&now); + + glGetIntegerv(GL_VIEWPORT, viewport); + + /* + Greyscale: r g b G (replace C by G in output to change from rgb to gray) + RGB color: r g b C + Font choose: size fontname FC + String primitive: (string) x y r g b size fontname S + Point primitive: x y r g b P + Flat-shaded line: x2 y2 x1 y1 r g b L + Flat-shaded triangle: x3 y3 x2 y2 x1 y1 r g b T + Smooth-shaded line: x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 SL + Smooth-shaded triangle: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST + */ + + fprintf(gl2ps.stream, + "%%!PS-Adobe-3.0\n" + "%%%%Title: %s\n" + "%%%%Creator: GL2PS, an OpenGL to Postscript Printing Library, V. 0.3\n" + "%%%%For: %s\n" + "%%%%CreationDate: %s" + "%%%%LanguageLevel: 2\n" + "%%%%Pages: 1\n" + "%%%%DocumentData: Clean7Bit\n" + "%%%%PageOrder: Ascend\n" + "%%%%Orientation: Portrait\n" + "%%%%DocumentMedia: Default %d %d 0 () ()\n" + "%%%%BoundingBox: %d %d %d %d\n" + "%%%%Copyright: GNU LGPL (C) 1999-2000 Christophe.Geuzaine@AdValvas.be\n" + "%%%%EndComments\n" + "%%%%BeginProlog\n" + "/gl2psdict 64 dict def gl2psdict begin\n" + "1 setlinecap 1 setlinejoin 0.2 setlinewidth /bd {bind def} bind def\n" + "/G { 0.082 mul exch 0.6094 mul add exch 0.3086 mul add neg 1.0 add\n" + "setgray } bd /C { setrgbcolor } bd /FC { findfont exch scalefont\n" + "setfont } bd /S { FC C moveto show } bd /P { C newpath 0.5 0.0 360.0\n" + "arc closepath fill } bd /L { C newpath moveto lineto stroke } bd\n" + "/T { C newpath moveto lineto lineto closepath fill } bd /SL { /b1\n" + "exch def /g1 exch def /r1 exch def /y1 exch def /x1 exch def\n" + "/b2 exch def /g2 exch def /r2 exch def /y2 exch def /x2 exch def\n" + "b2 b1 sub abs 0.01 gt g2 g1 sub abs 0.005 gt r2 r1 sub abs 0.008 gt\n" + "or or { /bm b1 b2 add 0.5 mul def /gm g1 g2 add 0.5 mul def\n" + "/rm r1 r2 add 0.5 mul def /ym y1 y2 add 0.5 mul def /xm x1 x2 add\n" + "0.5 mul def x1 y1 r1 g1 b1 xm ym rm gm bm SL xm ym rm gm bm x2 y2 r2\n" + "g2 b2 SL } { x1 y1 x2 y2 r1 g1 b1 L } ifelse } bd /ST {/b1 exch\n" + "def /g1 exch def /r1 exch def /y1 exch def /x1 exch def\n" + "/b2 exch def /g2 exch def /r2 exch def /y2 exch def /x2 exch def\n" + "/b3 exch def /g3 exch def /r3 exch def /y3 exch def /x3 exch def\n" + "b2 b1 sub abs 0.05 gt g2 g1 sub abs 0.017 gt r2 r1 sub abs 0.032 gt\n" + "b3 b1 sub abs 0.05 gt g3 g1 sub abs 0.017 gt r3 r1 sub abs 0.032 gt\n" + "b2 b3 sub abs 0.05 gt g2 g3 sub abs 0.017 gt r2 r3 sub abs 0.032 gt\n" + "or or or or or or or or { /b12 b1 b2 add 0.5 mul def /g12 g1 g2 add\n" + "0.5 mul def /r12 r1 r2 add 0.5 mul def /y12 y1 y2 add 0.5 mul def\n" + "/x12 x1 x2 add 0.5 mul def /b13 b1 b3 add 0.5 mul def /g13 g1 g3\n" + "add 0.5 mul def /r13 r1 r3 add 0.5 mul def /y13 y1 y3 add 0.5 mul\n" + "def /x13 x1 x3 add 0.5 mul def /b32 b3 b2 add 0.5 mul def\n" + "/g32 g3 g2 add 0.5 mul def /r32 r3 r2 add 0.5 mul def /y32 y3 y2\n" + "add 0.5 mul def /x32 x3 x2 add 0.5 mul def x1 y1 r1 g1 b1 x12 y12\n" + "r12 g12 b12 x13 y13 r13 g13 b13 x2 y2 r2 g2 b2 x12 y12 r12 g12 b12\n" + "x32 y32 r32 g32 b32 x3 y3 r3 g3 b3 x32 y32 r32 g32 b32 x13 y13 r13\n" + "g13 b13 x32 y32 r32 g32 b32 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13\n" + "ST ST ST ST } { x1 y1 x2 y2 x3 y3 r1 g1 b1 T } ifelse } bd\n" + "end\n" + "%%%%EndProlog\n" + "%%%%BeginSetup\n" + "/DeviceRGB setcolorspace\n" + "gl2psdict begin\n" + "%%%%EndSetup\n" + "%%%%Page: 1 1\n" + "%%%%BeginPageSetup\n" + "%%%%EndPageSetup\n" + "mark\n" + "gsave\n" + "1.0 1.0 scale\n", + gl2ps.title, gl2ps.producer, ctime(&now), viewport[2], viewport[3], + viewport[0], viewport[1], viewport[2], viewport[3]); + + if(gl2ps.options & GL2PS_DRAW_BACKGROUND){ + if(gl2ps.colormode == GL_RGBA || gl2ps.colorsize == 0) + glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba); + else{ + glGetIntegerv(GL_INDEX_CLEAR_VALUE, &index); + rgba[0] = gl2ps.colormap[index][0]; + rgba[1] = gl2ps.colormap[index][1]; + rgba[2] = gl2ps.colormap[index][2]; + rgba[3] = 0.; + } + fprintf(gl2ps.stream, + "%g %g %g C\n" + "newpath %d %d moveto %d %d lineto %d %d lineto %d %d lineto\n" + "closepath fill\n", + rgba[0], rgba[1], rgba[2], + viewport[0], viewport[1], viewport[2], viewport[1], + viewport[2], viewport[3], viewport[0], viewport[3]); + } +} + +GLvoid gl2psFreeBspTree(GL2PSbsptree *tree){ + if(tree->back){ + gl2psFreeBspTree(tree->back); + gl2psFree(tree->back); + } + if(tree->primitives){ + gl2psListAction(tree->primitives, gl2psFreePrimitive); + gl2psListDelete(tree->primitives); + } + if(tree->front){ + gl2psFreeBspTree(tree->front); + gl2psFree(tree->front); + } +} + +GLboolean gl2psGreater(GLfloat f1, GLfloat f2){ + if(f1 > f2) return 1; + else return 0; +} + +GLboolean gl2psLess(GLfloat f1, GLfloat f2){ + if(f1 < f2) return 1; + else return 0; +} + +GLvoid gl2psBeginPage(char *title, char *producer, GLint sort, GLint options, + GLint colormode, GLint colorsize, GL2PSrgba *colormap, + GLint buffersize, FILE *stream){ + + gl2ps.title = title; + gl2ps.producer = producer; + gl2ps.sort = sort; + gl2ps.options = options; + gl2ps.colormode = colormode; + gl2ps.buffersize = buffersize > 0 ? buffersize : 1024 * 1024; + gl2ps.feedback = (GLfloat*)gl2psMalloc(gl2ps.buffersize * sizeof(GLfloat)); + gl2ps.primitives = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*)); + + if(gl2ps.colormode == GL_RGBA){ + gl2ps.colorsize = 0; + gl2ps.colormap = NULL; + } + else if(gl2ps.colormode == GL_COLOR_INDEX){ + if(!colorsize || !colormap) + gl2psMsg(GL2PS_ERROR, "Missing colormap for GL_COLOR_INDEX rendering"); + if(gl2ps.colormap) + gl2psFree(gl2ps.colormap); + gl2ps.colorsize = colorsize; + gl2ps.colormap = (GL2PSrgba*)gl2psMalloc(gl2ps.colorsize * sizeof(GL2PSrgba)); + memcpy(gl2ps.colormap, colormap, gl2ps.colorsize * sizeof(GL2PSrgba)); + } + else + gl2psMsg(GL2PS_ERROR, "Unknown Color Mode in gl2psBeginPage"); + + if(stream) + gl2ps.stream = stream; + else + gl2psMsg(GL2PS_ERROR, "Bad File Pointer"); + + glFeedbackBuffer(gl2ps.buffersize, GL_3D_COLOR, gl2ps.feedback); + glRenderMode(GL_FEEDBACK); +} + +GLint gl2psEndPage(GLvoid){ + GL2PSbsptree *root; + GL2PSxyz eye={0., 0., 100000.}; + GLint shademodel, res; + + glGetIntegerv(GL_SHADE_MODEL, &shademodel); + gl2ps.shade = (shademodel == GL_SMOOTH); + + res = gl2psParseFeedbackBuffer(); + + if(gl2ps.feedback) gl2psFree(gl2ps.feedback); + + if(res == GL2PS_SUCCESS){ + gl2psPrintPostscriptHeader(); + switch(gl2ps.sort){ + case GL2PS_NO_SORT : + gl2psListAction(gl2ps.primitives, gl2psPrintPrimitive); + gl2psListAction(gl2ps.primitives, gl2psFreePrimitive); + gl2psListDelete(gl2ps.primitives); + res = GL2PS_SUCCESS; + break; + case GL2PS_SIMPLE_SORT : + gl2psListSort(gl2ps.primitives, gl2psCompareDepth); + gl2psListActionInverse(gl2ps.primitives, gl2psPrintPrimitive); + gl2psListAction(gl2ps.primitives, gl2psFreePrimitive); + gl2psListDelete(gl2ps.primitives); + res = GL2PS_SUCCESS; + break; + case GL2PS_BSP_SORT : + root = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree)); + gl2psBuildBspTree(root, gl2ps.primitives); + gl2psListDelete(gl2ps.primitives); + if(gl2ps.boundary) gl2psBuildPolygonBoundary(root); + if(gl2ps.options & GL2PS_OCCLUSION_CULL){ + gl2psTraverseBspTree(root, eye, -GL2PS_EPSILON, gl2psLess, + gl2psAddInImage); + } + gl2psTraverseBspTree(root, eye, GL2PS_EPSILON, gl2psGreater, + gl2psPrintPrimitive); + gl2psFreeBspTree(root); + res = GL2PS_SUCCESS; + break; + default : + gl2psMsg(GL2PS_ERROR, "Unknown Sorting Algorithm"); + } + fprintf(gl2ps.stream, + "grestore\n" + "showpage\n" + "cleartomark\n" + "%%%%PageTrailer\n" + "%%%%Trailer\n" + "end\n" + "%%%%EOF\n"); + fflush(gl2ps.stream); + } + + if(gl2ps.colormap) gl2psFree(gl2ps.colormap); + + return res; +} + +GLvoid gl2psText(char *str, char *fontname, GLint fontsize){ + GLfloat pos[4]; + GL2PSprimitive *prim; + GLint len; + + prim = (GL2PSprimitive *)gl2psMalloc(sizeof(GL2PSprimitive)); + prim->type = GL2PS_TEXT; + prim->boundary = 0; + prim->numverts = 1; + prim->verts = (GL2PSvertex *)gl2psMalloc(sizeof(GL2PSvertex)); + glGetFloatv(GL_CURRENT_RASTER_POSITION, pos); + prim->verts[0].xyz[0] = pos[0]; + prim->verts[0].xyz[1] = pos[1]; + prim->verts[0].xyz[2] = pos[2]; + prim->depth = pos[2]; + prim->dash = 0; + glGetFloatv(GL_CURRENT_RASTER_COLOR, prim->verts[0].rgba); + prim->text = (GL2PSstring*)gl2psMalloc(sizeof(GL2PSstring)); + if((len = strlen(str))){ + prim->text->str = (char*)gl2psMalloc(len*sizeof(char)); + strcpy(prim->text->str, str); + } + else + prim->text->str = ""; + prim->text->fontname = fontname; + prim->text->fontsize = fontsize; + gl2psListAdd(gl2ps.primitives, &prim); +} + +GLvoid gl2psEnable(GLint mode){ + switch(mode){ + case GL2PS_POLYGON_OFFSET_FILL : + glPassThrough(GL2PS_BEGIN_POLYGON_OFFSET_FILL); + glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &gl2ps.offset[0]); + glGetFloatv(GL_POLYGON_OFFSET_UNITS, &gl2ps.offset[1]); + break; + case GL2PS_POLYGON_BOUNDARY : + glPassThrough(GL2PS_BEGIN_POLYGON_BOUNDARY); + break; + case GL2PS_LINE_STIPPLE : + glPassThrough(GL2PS_BEGIN_LINE_STIPPLE); + break; + default : + gl2psMsg(GL2PS_WARNING, "Unknown Mode in gl2psEnable"); + break; + } +} + +GLvoid gl2psDisable(GLint mode){ + switch(mode){ + case GL2PS_POLYGON_OFFSET_FILL : + glPassThrough(GL2PS_END_POLYGON_OFFSET_FILL); + break; + case GL2PS_POLYGON_BOUNDARY : + glPassThrough(GL2PS_END_POLYGON_BOUNDARY); + break; + case GL2PS_LINE_STIPPLE : + glPassThrough(GL2PS_END_LINE_STIPPLE); + break; + default : + gl2psMsg(GL2PS_WARNING, "Unknown Mode in gl2psDisable"); + break; + } +} + diff --git a/Graphics/gl2ps.h b/Graphics/gl2ps.h new file mode 100644 index 0000000000000000000000000000000000000000..f3bb6cf85541f1bb68e12f6e8a68ed357fdf51c5 --- /dev/null +++ b/Graphics/gl2ps.h @@ -0,0 +1,160 @@ +/* + * GL2PS, an OpenGL to Postscript Printing Library, version 0.31 + * Copyright (C) 1999-2000 Christophe Geuzaine + * + * Last Mod by Christophe on Mon Aug 14 23:49:47 2000 + * + * E-mail: Christophe.Geuzaine@AdValvas.be + * URL: http://www.geuz.org/gl2ps/ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef __GL2PS_H__ +#define __GL2PS_H__ + +#include <stdio.h> +#include <stdlib.h> +#include <GL/gl.h> + +#define GL2PS_NONE 0 + +/* Sorting algorithms */ + +#define GL2PS_NO_SORT 1 +#define GL2PS_SIMPLE_SORT 2 +#define GL2PS_BSP_SORT 3 + +/* Options for gl2psBeginPage */ + +#define GL2PS_DRAW_BACKGROUND 1 +#define GL2PS_SIMPLE_LINE_OFFSET 2 +#define GL2PS_SILENT 4 +#define GL2PS_BEST_ROOT 8 +#define GL2PS_OCCLUSION_CULL 16 + +/* Arguments for gl2psEnable/gl2psDisable */ + +#define GL2PS_POLYGON_OFFSET_FILL 1 +#define GL2PS_POLYGON_BOUNDARY 2 +#define GL2PS_LINE_STIPPLE 3 + +/* Magic numbers */ + +#define GL2PS_EPSILON 5.e-3 + +/* Message levels */ + +#define GL2PS_INFO 1 +#define GL2PS_WARNING 2 +#define GL2PS_ERROR 3 + +/* Error codes */ + +#define GL2PS_SUCCESS 0 +#define GL2PS_NO_FEEDBACK -1 +#define GL2PS_OVERFLOW -2 + +/* Primitive types */ + +#define GL2PS_TEXT 1 +#define GL2PS_POINT 2 +#define GL2PS_LINE 3 +#define GL2PS_QUADRANGLE 4 +#define GL2PS_TRIANGLE 5 + +/* BSP tree primitive comparison */ + +#define GL2PS_COINCIDENT 1 +#define GL2PS_IN_FRONT_OF 2 +#define GL2PS_IN_BACK_OF 3 +#define GL2PS_SPANNING 4 + +/* Pass through options */ + +#define GL2PS_BEGIN_POLYGON_OFFSET_FILL 1 +#define GL2PS_END_POLYGON_OFFSET_FILL 2 +#define GL2PS_BEGIN_POLYGON_BOUNDARY 3 +#define GL2PS_END_POLYGON_BOUNDARY 4 +#define GL2PS_BEGIN_LINE_STIPPLE 5 +#define GL2PS_END_LINE_STIPPLE 6 + +typedef GLfloat GL2PSrgba[4]; +typedef GLfloat GL2PSxyz[3]; +typedef GLfloat GL2PSxy[2]; +typedef GLfloat GL2PSplane[4]; + +typedef struct { + GLint nmax, size, incr, n; + char *array; +} GL2PSlist; + +typedef struct _GL2PSbsptree GL2PSbsptree; + +struct _GL2PSbsptree { + GL2PSplane plane; + GL2PSlist *primitives; + GL2PSbsptree *front, *back; +}; + +typedef struct _GL2PSbsptree2d GL2PSbsptree2d; + +struct _GL2PSbsptree2d { + GLshort flag; + GL2PSxy a, b; + GL2PSbsptree2d *front, *back; +}; + +typedef struct { + GL2PSxyz xyz; + GL2PSrgba rgba; +} GL2PSvertex; + +typedef struct { + GLshort fontsize; + char *str, *fontname; +} GL2PSstring; + +typedef struct { + GLshort type, numverts, boundary; + GLfloat depth; + GLint dash; + GL2PSvertex *verts; + GL2PSstring *text; +} GL2PSprimitive; + +typedef struct { + GLint sort, options, colorsize, colormode, buffersize; + char *title, *producer; + GLboolean shade, boundary; + GLfloat *feedback, offset[2]; + GL2PSrgba *colormap; + GL2PSlist *primitives; + FILE *stream; +} GL2PScontext; + + +/* public functions */ + +GLvoid gl2psBeginPage(char *title, char *producer, GLint sort, GLint options, + GLint colormode, GLint colorsize, GL2PSrgba *colormap, + GLint buffersize, FILE * stream); +GLint gl2psEndPage(GLvoid); +GLvoid gl2psText(char *str, char *fontname, GLint size); +GLvoid gl2psEnable(GLint mode); +GLvoid gl2psDisable(GLint mode); + +#endif diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..e42e55fe15cc11e657c52a2129e4c1f108430dc3 --- /dev/null +++ b/Makefile @@ -0,0 +1,259 @@ +# ---------------------------------------------------------------------- +# Makefile for gmsh +# ---------------------------------------------------------------------- + + GMSH_RELEASE = 0.995 + + MAKE = make + CC = g++ + RM = rm + RMFLAGS = -f + + OPENGL_INC = -I/usr/include/X11/GLw\ + -I$(HOME)/SOURCES/Mesa-3.1/include\ + -I$(HOME)/SOURCES/Mesa-3.1/include/GL + MOTIF_INC = -I/usr/X11R6/LessTif/Motif1.2/include + + OPENGL_LIB = -lGLw -lGLU -lGL + MESA_LIB = -L$(HOME)/SOURCES/Mesa-3.1/lib -lGLw -lGLU -lGL + MESA_STATIC_LIB = $(HOME)/SOURCES/Mesa-3.0-static/lib/libGLw.a\ + $(HOME)/SOURCES/Mesa-3.0-static/lib/libGLU.a\ + $(HOME)/SOURCES/Mesa-3.0-static/lib/libGL.a + MOTIF_LIB = -L/usr/X11R6/LessTif/Motif1.2/lib -lXm + X_LIB = -L/usr/X11R6/lib -lXt -lX11 -lXext + THREAD_LIB = -L/usr/lib -lpthread + + GMSH_DIR = Adapt Common DataStr Geo Graphics Mesh Parser Unix +GMSH_DISTRIB_DIR = $(GMSH_DIR) utils + GMSH_BOX_DIR = Adapt Box Common DataStr Geo Mesh Parser + GMSH_BIN_DIR = bin + GMSH_LIB_DIR = lib + GMSH_DOC_DIR = doc + GMSH_DEMO_DIR = demos +GMSH_ARCHIVE_DIR = archives + GMSH_LIB = -L$(GMSH_LIB_DIR) -lUnix -lGraphics -lParser -lMesh -lGeo\ + -lAdapt -lCommon -lDataStr + GMSH_BOX_LIB = -L$(GMSH_LIB_DIR) -lBox -lParser -lMesh -lGeo\ + -lAdapt -lCommon -lDataStr + GMSH_ARCHIVE = $(GMSH_ARCHIVE_DIR)/gmsh-`date "+%Y.%m.%d"` + GMSH_SRCRPM = gmsh-$(GMSH_RELEASE) + GMSH_SOURCES = `find . \( ! -name "*.tar*" -a ! -name "*.tgz" \ + -a ! -name "*.o" -a ! -name "lib*.a" \ + -a ! -name "*.msh" -a ! -name "*.bak" \ + -a ! -name "gmsh" -a ! -name "gmsh-*"\ + -a ! -type d \)` + GMSH_UNAME = `uname` + +default: initialtag + @for i in $(GMSH_DIR); do (cd $$i && $(MAKE) \ + "CC=$(CC)" \ + "C_FLAGS=-g -Wall" \ + "OS_FLAGS=-D_UNIX -D_LITTLE" \ + "VERSION_FLAGS=-D_NOTHREADS" \ + "GL_INCLUDE=$(OPENGL_INC)" \ + "MOTIF_INCLUDE=$(MOTIF_INC)" \ + ); done + +profile: initialtag + @for i in $(GMSH_DIR); do (cd $$i && $(MAKE) \ + "CC=$(CC)" \ + "C_FLAGS=-O3 -pg" \ + "OS_FLAGS=-D_UNIX -D_LITTLE" \ + "VERSION_FLAGS=-D_NOTHREADS" \ + "GL_INCLUDE=$(OPENGL_INC)" \ + "MOTIF_INCLUDE=$(MOTIF_INC)" \ + ); done + $(CC) -pg -o $(GMSH_BIN_DIR)/gmsh-profile $(GMSH_LIB) $(OPENGL_LIB) \ + $(MOTIF_LIB) $(X_LIB) $(THREAD_LIB) -lm + +gmsh: + $(CC) -o $(GMSH_BIN_DIR)/gmsh $(GMSH_LIB) $(OPENGL_LIB) \ + $(MOTIF_LIB) $(X_LIB) $(THREAD_LIB) -lm + +gmsh2: + $(CC) -o $(GMSH_BIN_DIR)/gmsh $(GMSH_LIB) $(MESA_LIB) \ + $(MOTIF_LIB) $(X_LIB) $(THREAD_LIB) -lm + +gmshm: + $(CC) -o $(GMSH_BIN_DIR)/gmshm $(GMSH_LIB) $(MESA_STATIC_LIB) \ + $(MOTIF_LIB) $(X_LIB) $(THREAD_LIB) -lm + +parser: + cd Parser && $(MAKE) parser + +purge: + for i in "." $(GMSH_DISTRIB_DIR) $(GMSH_LIB_DIR) $(GMSH_ARCHIVE_DIR)\ + $(GMSH_DEMO_DIR) $(GMSH_DOC_DIR); \ + do (cd $$i && $(RM) $(RMFLAGS) *~ *~~); \ + done + +clean: + for i in $(GMSH_DISTRIB_DIR) $(GMSH_DOC_DIR) $(GMSH_LIB_DIR) ; \ + do (cd $$i && $(MAKE) clean); \ + done + +depend: + for i in $(GMSH_DISTRIB_DIR); \ + do (cd $$i && $(MAKE) depend \ + "CC=$(CC)" \ + "GL_INCLUDE=$(OPENGL_INC)" \ + "MOTIF_INCLUDE=$(MOTIF_INC)" \ + ); done + +nodepend: + for i in $(GMSH_DISTRIB_DIR) ; do \ + (cd $$i && (sed '/^# DO NOT DELETE THIS LINE/q' Makefile) > Makefile.new \ + && cp Makefile Makefile.bak \ + && cp Makefile.new Makefile \ + && $(RM) $(RMFLAGS) Makefile.new); \ + done + +tag: + $(RM) $(RMFLAGS) Common/Version.h + echo "#define GMSH_VERSION $(GMSH_RELEASE)" > Common/Version.h + echo "#define GMSH_DATE \"`date`\"" >> Common/Version.h + echo "#define GMSH_HOST \"`hostname`\"" >> Common/Version.h + echo "#define GMSH_PACKAGER \"`logname`\"" >> Common/Version.h + echo "#define GMSH_OS \"`uname -sr`\"" >> Common/Version.h + +initialtag: + @if [ ! -r Common/Version.h ]; then \ + $(MAKE) tag ; \ + fi + +tgz: + if (test -f $(GMSH_ARCHIVE).tar.gz); \ + then mv -f $(GMSH_ARCHIVE).tar.gz $(GMSH_ARCHIVE).tar.gz~; \ + fi + tar cvf $(GMSH_ARCHIVE).tar $(GMSH_SOURCES) + gzip $(GMSH_ARCHIVE).tar + chmod 640 $(GMSH_ARCHIVE).tar.gz + +src: + tar cvf $(GMSH_SRCRPM).tar $(GMSH_SOURCES) + gzip $(GMSH_SRCRPM).tar + +# ---------------------------------------------------------------------- +# Demos +# ---------------------------------------------------------------------- + +dem: + gtar zcvf gmsh-demos.tgz $(GMSH_DEMO_DIR) + +# ---------------------------------------------------------------------- +# Black Box +# ---------------------------------------------------------------------- + +bb: tag + @for i in $(GMSH_BOX_DIR); do (cd $$i && $(MAKE) \ + "CC=$(CC)" \ + "C_FLAGS=-O3" \ + "OS_FLAGS=-D_UNIX" \ + "VERSION_FLAGS=" \ + "GL_INCLUDE=" \ + "MOTIF_INCLUDE=" \ + ); done + $(CC) -o $(GMSH_BIN_DIR)/gmsh-box $(GMSH_BOX_LIB) -lm + +bbn: tag + @for i in $(GMSH_BOX_DIR) ; do (cd $$i && $(MAKE) \ + "CC=g++ -mno-cygwin -I/mingw/include" \ + "C_FLAGS=-O3" \ + "OS_FLAGS=-D_UNIX" \ + "VERSION_FLAGS=" \ + "GL_INCLUDE=" \ + "MOTIF_INCLUDE=" \ + ); done + g++ -o $(GMSH_BIN_DIR)/gmsh.exe -mno-cygwin -L/mingw/lib $(GMSH_BOX_LIB) -lm + +# ---------------------------------------------------------------------- +# Ready to compile for somes platforms +# ---------------------------------------------------------------------- + +#### -O2 merde dans 3d_smesh.c sur TransfiniteHex() + +sgi: tag + @for i in $(GMSH_DIR); do (cd $$i && $(MAKE) \ + "CC=CC" \ + "C_FLAGS=-O2 -o32" \ + "RANLIB=true"\ + "OS_FLAGS=-D_UNIX" \ + "VERSION_FLAGS=-D_NOTHREADS" \ + "GL_INCLUDE=$(OPENGL_INC)" \ + "MOTIF_INCLUDE=$(MOTIF_INC)" \ + ); done + @for i in mesh; do (cd $$i && $(MAKE) \ + "CC=CC" \ + "C_FLAGS=-O1 -o32" \ + "RANLIB=true"\ + "OS_FLAGS=-D_UNIX" \ + "VERSION_FLAGS=-D_NOTHREADS" \ + "GL_INCLUDE=$(OPENGL_INC)" \ + "MOTIF_INCLUDE=$(MOTIF_INC)" \ + ); done + CC -O2 -o32 -o $(GMSH_BIN_DIR)/gmsh-IRIX $(GMSH_LIB) $(OPENGL_LIB) \ + $(MOTIF_LIB) $(X_LIB) -lm + strip $(GMSH_BIN_DIR)/gmsh-IRIX + +little_endian: tag + @for i in $(GMSH_DISTRIB_DIR); do (cd $$i && $(MAKE) \ + "CC=g++" \ + "C_FLAGS=-O3" \ + "OS_FLAGS=-D_UNIX -D_LITTLE" \ + "VERSION_FLAGS=-D_NOTHREADS" \ + "GL_INCLUDE=$(OPENGL_INC)" \ + "MOTIF_INCLUDE=$(MOTIF_INC)" \ + ); done + +little_endian_compat: tag + @for i in $(GMSH_DISTRIB_DIR); do (cd $$i && $(MAKE) \ + "CC=i386-glibc21-linux-g++" \ + "C_FLAGS=-O3" \ + "OS_FLAGS=-D_UNIX -D_LITTLE" \ + "VERSION_FLAGS=-D_NOTHREADS" \ + "GL_INCLUDE=$(OPENGL_INC)" \ + "MOTIF_INCLUDE=$(MOTIF_INC)" \ + ); done + +big_endian: tag + @for i in $(GMSH_DISTRIB_DIR); do (cd $$i && $(MAKE) \ + "CC=g++" \ + "C_FLAGS=-O3" \ + "OS_FLAGS=-D_UNIX" \ + "VERSION_FLAGS=-D_NOTHREADS" \ + "GL_INCLUDE=$(OPENGL_INC)" \ + "MOTIF_INCLUDE=$(MOTIF_INC)" \ + ); done + + +ogl: + g++ -o $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) $(GMSH_LIB) $(OPENGL_LIB) $(MOTIF_LIB) $(X_LIB) -lm + strip $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) + +mesa: + g++ -o $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) $(GMSH_LIB) $(MESA_LIB) $(MOTIF_LIB) $(X_LIB) -lm + strip $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) + +mesa_compat: + i386-glibc21-linux-g++ -o $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) $(GMSH_LIB) $(MESA_LIB) $(MOTIF_LIB) $(X_LIB) -lm + strip $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) + +dec: little_endian ogl + +linux: little_endian mesa + +linux-compat: little_endian_compat mesa_compat + +ibm: big_endian mesa + +sun: big_endian mesa + +# HP : special linker option is necessary (+s) + set the SHLIB_PATH variable. +hp: big_endian + g++ -Wl,+s -o $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) $(GMSH_LIB) $(MESA_LIB) $(MOTIF_LIB) $(X_LIB) -lm + strip $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) + +comp: + tar cvf gmsh-$(GMSH_UNAME).tar $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) + gzip gmsh-$(GMSH_UNAME).tar + diff --git a/Mesh/1D_Mesh.cpp b/Mesh/1D_Mesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4f0dfed9e6eb39165fdc90e78d614ed6e3365f14 --- /dev/null +++ b/Mesh/1D_Mesh.cpp @@ -0,0 +1,201 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "Mesh.h" +#include "Context.h" +#include "Interpolation.h" +#include "Numeric.h" + +extern Mesh *THEM; +extern Context_T CTX; +extern int CurrentNodeNumber; + +Curve *THEC; +static Vertex *p0, *pn; + +double Fun (double t){ + Vertex der; + double d; + der = InterpolateCurve (THEC, t, 1); + d = sqrt (der.Pos.X * der.Pos.X + der.Pos.Y * der.Pos.Y + der.Pos.Z * der.Pos.Z); + return (d); +} + +double F_Transfini (double t){ + Vertex der; + double d, a, b, ZePauwer; + + der = InterpolateCurve (THEC, t, 1); + d = sqrt (der.Pos.X * der.Pos.X + der.Pos.Y * der.Pos.Y + + der.Pos.Z * der.Pos.Z); + + if (THEC->dpar[0] == 0.0 || THEC->dpar[0] == 1.0) + return (d * (double) THEC->ipar[0] / (THEC->l)); + + switch (abs (THEC->ipar[1])){ + + case 2: + if (sign (THEC->ipar[1]) == -1) + ZePauwer = 1. / THEC->dpar[0]; + else + ZePauwer = THEC->dpar[0]; + b = log (1. / ZePauwer) / THEC->l; + a = (1. - exp (-b * THEC->l)) / (b * (double) THEC->ipar[0]); + return (d / (a * exp (b * (t * THEC->l)))); + + case 1: + if (THEC->dpar[0] > 1.0){ + a = -4. * sqrt (THEC->dpar[0] - 1.) * + atan2 (1., sqrt (THEC->dpar[0] - 1.)) / + ((double) THEC->ipar[0] * THEC->l); + } + else{ + a = 2. * sqrt (1. - THEC->dpar[0]) * + log (fabs ((1. + 1. / sqrt (1. - THEC->dpar[0])) + / (1. - 1. / sqrt (1. - THEC->dpar[0])))) + / ((double) THEC->ipar[0] * THEC->l); + } + b = -a * THEC->l * THEC->l / (4. * (THEC->dpar[0] - 1.)); + return (d / (-a * DSQR (t * THEC->l - (THEC->l) * 0.5) + b)); + + default: + Msg(WARNING, "Unknown Case in Transfinite Mesh Line"); + return 1. ; + } + +} + +double Flc (double t){ + double k = THEM->Metric->getLc (t, THEC); + return (k); +} + +double CIRC_GRAN = 10.; + +void Maillage_Curve (void *data, void *dummy){ + Curve **pc, *c; + Simplex *s; + double b, a, d, dt, dp, t; + int i, N, count, NUMP; + Vertex **v, **vexist, *pV, V, *v1, *v2; + List_T *Points; + IntPoint P1, P2; + + pc = (Curve **) data; + c = *pc; + THEC = c; + + if (c->Num < 0) + return; + + Msg(INFO, "Meshing Curve %d ", c->Num); + + if (c->Method != TRANSFINI && Extrude_Mesh (c)){ + Points = List_Create (10, 10, sizeof (IntPoint)); + c->l = Integration (c->ubeg, c->uend, Fun, Points, 1.e-5); + List_Delete (Points); + } + else{ + p0 = c->beg; + pn = c->end; + + Points = List_Create (10, 10, sizeof (IntPoint)); + c->l = Integration (c->ubeg, c->uend, Fun, Points, 1.e-5); + List_Delete (Points); + + if (c->Method == TRANSFINI){ + Points = List_Create (10, 10, sizeof (IntPoint)); + a = Integration (c->ubeg, c->uend, F_Transfini, Points, 1.e-7); + N = c->ipar[0]; + } + else{ + Points = List_Create (10, 10, sizeof (IntPoint)); + a = Integration (c->ubeg, c->uend, Flc, Points, 1.e-5); + N = IMAX (2, (int) (a + 1.)); + if (c->Typ == MSH_SEGM_CIRC || + c->Typ == MSH_SEGM_CIRC_INV || + c->Typ == MSH_SEGM_ELLI || + c->Typ == MSH_SEGM_ELLI_INV){ + N = IMAX (N, (int) (fabs (c->Circle.t1 - c->Circle.t2) * + CIRC_GRAN / Pi)); + } + else if (c->Typ == MSH_SEGM_NURBS){ + N = IMAX (N, 2); + } + } + b = a / (double) (N - 1); + c->Vertices = List_Create (N, 2, sizeof (Vertex *)); + + v = &c->beg; + if ((vexist = (Vertex **) Tree_PQuery (THEM->Vertices, v))){ + (*vexist)->u = c->ubeg; + Tree_Insert (THEM->Vertices, vexist); + if ((*vexist)->ListCurves) + List_Add ((*vexist)->ListCurves, &c); + List_Add (c->Vertices, vexist); + } + else{ + pV = Create_Vertex ((*v)->Num, (*v)->Pos.X, (*v)->Pos.Y, + (*v)->Pos.Z, (*v)->lc, 0.0); + pV->ListCurves = List_Create (1, 1, sizeof (Curve *)); + List_Add (pV->ListCurves, &c); + Tree_Insert (THEM->Vertices, &pV); + List_Add (c->Vertices, &pV); + } + + count = NUMP = 1; + while (NUMP < N - 1){ + List_Read (Points, count - 1, &P1); + List_Read (Points, count, &P2); + d = (double) NUMP *b; + if ((fabs (P2.p) >= fabs (d)) && (fabs (P1.p) < fabs (d))){ + dt = P2.t - P1.t; + dp = P2.p - P1.p; + t = P1.t + dt / dp * (d - P1.p); + V = InterpolateCurve (c, t, 0); + pV = Create_Vertex (++CurrentNodeNumber, + V.Pos.X, V.Pos.Y, V.Pos.Z, V.lc, t); + pV->w = V.w; + pV->ListCurves = List_Create (1, 1, sizeof (Curve *)); + List_Add (pV->ListCurves, &c); + Tree_Insert (THEM->Vertices, &pV); + List_Add (c->Vertices, &pV); + NUMP++; + } + else{ + count++; + } + } + + v = &c->end; + if ((vexist = (Vertex **) Tree_PQuery (THEM->Vertices, v))){ + (*vexist)->u = c->uend; + Tree_Insert (THEM->Vertices, vexist); + if ((*vexist)->ListCurves) + List_Add ((*vexist)->ListCurves, &c); + List_Add (c->Vertices, vexist); + } + else{ + pV = Create_Vertex ((*v)->Num, (*v)->Pos.X, (*v)->Pos.Y, (*v)->Pos.Z, (*v)->lc, 0.0); + pV->ListCurves = List_Create (1, 1, sizeof (Curve *)); + List_Add (pV->ListCurves, &c); + Tree_Insert (THEM->Vertices, &pV); + List_Add (c->Vertices, &pV); + } + } + for (i = 0; i < List_Nbr (c->Vertices) - 1; i++){ + List_Read (c->Vertices, i, &v1); + List_Read (c->Vertices, i + 1, &v2); + s = Create_Simplex (v1, v2, NULL, NULL); + s->iEnt = c->Num; + Tree_Add (c->Simplexes, &s); + List_Add (c->TrsfSimplexes, &s); + } + + if (CTX.mesh.degree == 2) + Degre2 (THEM->Vertices, THEM->VertexEdges, c->Simplexes, c, NULL); + + THEM->Statistics[4] += List_Nbr (c->Vertices); + +} diff --git a/Mesh/2D_BGMesh.cpp b/Mesh/2D_BGMesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e61e0bf80a79c863e8118b4d86a550042ca6801a --- /dev/null +++ b/Mesh/2D_BGMesh.cpp @@ -0,0 +1,74 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "2D_Mesh.h" + +extern Mesh *THEM; + +/* Calcul de la longueur caracteristique en un point par + interpolation dans le background mesh */ + +double find_quality (MPoint center, DocRecord * BGMESH){ + + int i; + Delaunay *del; + PointRecord *pPointArray; + PointNumero a, b, c; + double qual, q1, q2, q3, X[3], Y[3], u, v, det, Xp, Yp; + double Exp = 2., r, deno, nume; + + if ((del = Find_Triangle (center, BGMESH, BOF)) == NULL) + Msg(WARNING, "Point X=%g Y=%g out of Mesh\n", center.v, center.h); + + pPointArray = BGMESH->points; + + a = del->t.a; + b = del->t.b; + c = del->t.c; + + Xp = center.h; + Yp = center.v; + + X[0] = pPointArray[a].where.h; + X[1] = pPointArray[b].where.h; + X[2] = pPointArray[c].where.h; + + Y[0] = pPointArray[a].where.v; + Y[1] = pPointArray[b].where.v; + Y[2] = pPointArray[c].where.v; + + q1 = pPointArray[a].quality; + q2 = pPointArray[b].quality; + q3 = pPointArray[c].quality; + + det = (X[2] - X[0]) * (Y[1] - Y[0]) - (Y[2] - Y[0]) * (X[1] - X[0]); + + if (det != 0.0){ + u = ((Xp - X[0]) * (Y[1] - Y[0]) - (Yp - Y[0]) * (X[1] - X[0])) / det; + v = ((X[2] - X[0]) * (Yp - Y[0]) - (Y[2] - Y[0]) * (Xp - X[0])) / det; + } + else{ + Msg(WARNING, "Degenerated Triangle (det=%g)\n", det); + u = v = 0.0; + } + + if (u >= -1.e-8 && v >= -1.e-8 && 1. - u - v >= -1.e-8){ + qual = q1 * (1. - u - v) + q2 * v + q3 * u; + return (qual); + } + else{ + pPointArray = BGMESH->points; + deno = nume = 0.0; + for (i = 0; i < BGMESH->numPoints; i++){ + r = sqrt (DSQR (center.h - pPointArray[i].where.h) + + DSQR (center.v - pPointArray[i].where.v)); + r = pow (r, Exp); + if (r < 1.e-10) + return (pPointArray[i].quality); + nume += pPointArray[i].quality / r; + deno += 1. / r; + } + return (nume / deno); + } +} diff --git a/Mesh/2D_Bowyer.cpp b/Mesh/2D_Bowyer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..13c82c7fa7189d5125818c5a438db7238250ca91 --- /dev/null +++ b/Mesh/2D_Bowyer.cpp @@ -0,0 +1,189 @@ +/* + + A L G O R I T H M E D E B O W Y E R - W A T S O N + + definition : il est possible d'obtenir une triangulation de Delaunay en partant + d'une triangulation existante en lui ajoutant un noeud de la facon suivante : + + - on elimine les triangles de la premiere triangulation dont le cercle + circonscrit contient le nouveau point + - on reconstuit une triangulation en joignant le point aux noeuds du polygone + defini par les triangles effaces + + ListEdges = liste liee circulaire et triee contenant les points du polygone + listkill = liste des pointeurs des triangles a effacer + listDelforLink = liste des triangles a la peripherie du polygone + PE_Del_Triangle = Peut-Etre va-t-on effacer le triangle del, si on l'efface alors + on appelle recursivement 3 fois PE_Del_Triangle avec ses trois voisins (si il en a) + comme argument + +*/ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "2D_Mesh.h" + +extern PointRecord *gPointArray; + +int Is_pt_in_CircCircle (Delaunay * del, MPoint pt){ + + double rc, dc, Xa, Ya; + PointNumero a; + + dc = DSQR (del->t.xc - pt.h) + DSQR (del->t.yc - pt.v); + + a = del->t.a; + + Xa = gPointArray[a].where.h; + Ya = gPointArray[a].where.v; + + rc = DSQR (del->t.xc - Xa) + DSQR (del->t.yc - Ya); + + if (rc >= dc) + return 1; + return 0; + +} + +int PE_Del_Triangle (Delaunay *del , MPoint pt, DListPeek *ListEdges , + List_T *listkill, List_T *listDelforlink, + int *numlink, int *numdel){ + int rslt; + PointNumero a,b,c; + int count,order[3],same; + DListPeek p; + Delaunay *de1,*de2,*de3; + + rslt = Is_pt_in_CircCircle ( del , pt ); + + if ( (!rslt) && (*numdel == 0)) { + return(0); + } + if (!rslt) { + + /* On retient les triangles du pourtour */ + + del->t.info = NOTTOLINK; + List_Put(listDelforlink, *numlink, &del); + (*numlink)++; + + return(1); + + } + else { + + List_Put(listkill, *numdel, &del); + (*numdel)++; + + a = del->t.a; + b = del->t.b; + c = del->t.c; + + if ( *ListEdges == NULL ) { + + rslt = DListInsert(ListEdges,pt,a); + rslt &= DListInsert(ListEdges,pt,b); + rslt &= DListInsert(ListEdges,pt,c); + if(!rslt){ + Msg(ERROR, "List insert error"); + } + + } + else { + + count = 0; + p = *ListEdges; + order[0] = order[1] = order[2] = 0; + same = 0; + + do { + if (p->point_num == a ) { + same = same + 1; + order[count]=a; + count++ ; + } + if (p->point_num == b ) { + same = same + 10; + order[count]=b; + count++ ; + } + if (p->point_num == c ) { + same = same + 100; + order[count]=c; + count++ ; + } + p = Pred(p); + }while ( p != *ListEdges ); + if (count == 1) { + return(0); + } + else if (count == 2) { + if (same == 11 ) { + rslt = DListInsert(ListEdges,pt,c); + } + if (same == 101 ) { + rslt = DListInsert(ListEdges,pt,b); + } + if (same == 110 ) { + rslt = DListInsert(ListEdges,pt,a); + } + } + else if (count == 3) { + rslt = DListDelete(ListEdges,order[1]); + } + else { + return(0); + } + } + + de1 = del->v.voisin1; + de2 = del->v.voisin2; + de3 = del->v.voisin3; + + + if(de1 != NULL){ + if (de1->v.voisin1 == del )de1->v.voisin1 = NULL; + else if (de1->v.voisin2 == del )de1->v.voisin2 = NULL; + else if (de1->v.voisin3 == del )de1->v.voisin3 = NULL; + else { + Msg(ERROR, "Bad Link"); + exit(1); + } + } + if(de2 != NULL){ + if (de2->v.voisin1 == del )de2->v.voisin1 = NULL; + else if (de2->v.voisin2 == del )de2->v.voisin2 = NULL; + else if (de2->v.voisin3 == del )de2->v.voisin3 = NULL; + else { + Msg(ERROR," Bad Link"); + exit(1); + } + } + if(de3 != NULL){ + if (de3->v.voisin1 == del )de3->v.voisin1 = NULL; + else if (de3->v.voisin2 == del )de3->v.voisin2 = NULL; + else if (de3->v.voisin3 == del )de3->v.voisin3 = NULL; + else { + Msg(ERROR," Bad Link"); + exit(1); + } + } + + del->v.voisin1 = NULL ; + del->v.voisin2 = NULL ; + del->v.voisin3 = NULL ; + + + if ( de1 != NULL ){ + if(!PE_Del_Triangle ( de1,pt,ListEdges,listkill,listDelforlink, numlink, numdel))return(0); + } + if ( de2 != NULL ){ + if(!PE_Del_Triangle ( de2,pt,ListEdges,listkill,listDelforlink, numlink, numdel))return(0); + } + if ( de3 != NULL ){ + if(!PE_Del_Triangle ( de3,pt,ListEdges,listkill,listDelforlink, numlink, numdel))return(0); + } + return(1); + } +} diff --git a/Mesh/2D_Bricks.cpp b/Mesh/2D_Bricks.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1e8361d2e2c1a4a01e639943db0c93b7b61f94bd --- /dev/null +++ b/Mesh/2D_Bricks.cpp @@ -0,0 +1,329 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "2D_Mesh.h" + +static double XmaxGrid,YmaxGrid,XminGrid,YminGrid,ZmaxGrid,ZminGrid; +static double XminBox,XmaxBox,YminBox,YmaxBox,ZminBox,ZmaxBox; +static int Nx=0,Ny=0,Nz=0; +static List_T *GridList; +static DocRecord *MyMesh; + +extern PointRecord *gPointArray; + +int fcmp_Map(const void * a, const void * b) { + return ((struct Map *)a)->Num - ((struct Map *)b)->Num ; +} + +void Invert_MappingLists (List_T * List1, List_T * List2) { + + struct Map TmpMap1, TmpMap2 ; + struct Map * TmpMap; + List_T * TmpList; + + int i, j, Entity, CurrentEntity; + + TmpList = List_Create(10*List_Nbr(List1), 100, sizeof(int)); + + for(i=0 ; i<List_Nbr(List1) ; i++){ + List_Read(List1, i, &TmpMap1); + for(j=0 ; j<List_Nbr(TmpMap1.List) ; j++){ + List_Read(TmpMap1.List, j, &Entity); + List_Add(TmpList, &Entity); + } + } + + List_Sort(TmpList, fcmp_int); + + List_Read(TmpList, 0, &CurrentEntity); + TmpMap1.Num = CurrentEntity; + TmpMap1.List = List_Create(10, 10, sizeof(int)); + List_Add(List2, &TmpMap1); + for(i=1 ; i<List_Nbr(TmpList) ; i++){ + List_Read(TmpList, i, &Entity); + if (Entity != CurrentEntity) { + CurrentEntity = Entity; + TmpMap1.Num = CurrentEntity; + TmpMap1.List = List_Create(10, 10, sizeof(int)); + List_Add(List2, &TmpMap1); + } + } + + for(i=0 ; i<List_Nbr(List1) ; i++){ + List_Read(List1, i, &TmpMap1); + for(j=0 ; j<List_Nbr(TmpMap1.List) ; j++){ + List_Read(TmpMap1.List, j, &Entity); + TmpMap2.Num = Entity; + if ((TmpMap = (struct Map*)List_PQuery(List2, &TmpMap2, fcmp_Map)) != NULL) { + List_Add(TmpMap->List, &TmpMap1.Num); + } + } + } + + List_Delete(TmpList); + +} + +int InWhichBrick (double X, double Y, double Z) { + + int Ix,Iy,Iz; + + if(X > XmaxGrid || X < XminGrid || Y > YmaxGrid || + Y < YminGrid || Z > ZmaxGrid || Z < ZminGrid) + return(-1); + + Ix = (int) ((double)Nx * (X-XminGrid) / (XmaxGrid-XminGrid)); + Iy = (int) ((double)Ny * (Y-YminGrid) / (YmaxGrid-YminGrid)); + Iz = (int) ((double)Nz * (Z-ZminGrid) / (ZmaxGrid-ZminGrid)); + Ix = (Ix< Nx)? Ix : Nx-1; + Iy = (Iy< Ny)? Iy : Ny-1; + Iz = (Iz< Nz)? Iz : Nz-1; + return(1 + Ix + Iy*Nx + Iz*Nx*Ny); +} + +List_T *AllBricksForABox (void){ + + List_T *List; + int Ix1,Ix2,Iy1,Iy2,Iz1,Iz2; + int i,j,k,Num; + + Ix1 = (int) ( (double)Nx * (XminBox-XminGrid) / (XmaxGrid-XminGrid)); + Ix2 = (int) ( (double)Nx * (XmaxBox-XminGrid) / (XmaxGrid-XminGrid)); + Iy1 = (int) ( (double)Ny * (YminBox-YminGrid) / (YmaxGrid-YminGrid)); + Iy2 = (int) ( (double)Ny * (YmaxBox-YminGrid) / (YmaxGrid-YminGrid)); + Iz1 = (int) ( (double)Nz * (ZminBox-ZminGrid) / (ZmaxGrid-ZminGrid)); + Iz2 = (int) ( (double)Nz * (ZmaxBox-ZminGrid) / (ZmaxGrid-ZminGrid)); + Ix1 = (Ix1<Nx)? Ix1 : Nx-1; + Ix2 = (Ix2<Nx)? Ix2 : Nx-1; + Iy1 = (Iy1<Ny)? Iy1 : Ny-1; + Iy2 = (Iy2<Ny)? Iy2 : Ny-1; + Iz1 = (Iz1<Nz)? Iz1 : Nz-1; + Iz2 = (Iz2<Nz)? Iz2 : Nz-1; + + List = List_Create((Ix2-Ix1+1)*(Iy2-Iy1+1)*(Iz2-Iz1+1), 1, sizeof(int)); + + for(i=Ix1;i<=Ix2;i++){ + for(j=Iy1;j<=Iy2;j++){ + for(k=Iz1;k<=Iz2;k++){ + Num = 1 + i + j*Nx + k*Nx*Ny ; + List_Add(List, &Num); + } + } + } + return(List); +} + +void InitBricks (DocRecord *MESH) { + + int i,j,a,b,c; + List_T *InvList; + struct Map InvMap; + double X[3],Y[3],dx,dy; + + MyMesh = MESH; + + Nx = (int)sqrt((double)MESH->numTriangles) + 1; + Ny = Nx; + Nz=1; + ZminGrid=0.; + ZmaxGrid=1.; + + GridList = List_Create(Nx*Ny*Nz, 1, sizeof(struct Map)); + InvList = List_Create(MESH->numTriangles, 1, sizeof(struct Map)); + + for(i=0;i<MESH->numTriangles;i++){ + a = MESH->delaunay[i].t.a; + b = MESH->delaunay[i].t.b; + c = MESH->delaunay[i].t.c; + + X[0] = MESH->points[a].where.h; + X[1] = MESH->points[b].where.h; + X[2] = MESH->points[c].where.h; + Y[0] = MESH->points[a].where.v; + Y[1] = MESH->points[b].where.v; + Y[2] = MESH->points[c].where.v; + + if(!i){ + XminGrid = XmaxGrid = X[0]; + YminGrid = YmaxGrid = Y[0]; + } + + for(j=0;j<3;j++){ + XmaxGrid = DMAX (XmaxGrid,X[j]); + XminGrid = DMIN (XminGrid,X[j]); + YmaxGrid = DMAX (YmaxGrid,Y[j]); + YminGrid = DMIN (YminGrid,Y[j]); + } + } + dx = XmaxGrid - XminGrid; + dy = YmaxGrid - YminGrid; + XmaxGrid += 0.01 * dx; + YmaxGrid += 0.01 * dy; + XminGrid -= 0.01 * dx; + YminGrid -= 0.01 * dy; + + for(i=0;i<MESH->numTriangles;i++){ + a = MESH->delaunay[i].t.a; + b = MESH->delaunay[i].t.b; + c = MESH->delaunay[i].t.c; + + X[0] = XminBox = XmaxBox = MESH->points[a].where.h; + X[1] = MESH->points[b].where.h; + X[2] = MESH->points[c].where.h; + Y[0] = YminBox = YmaxBox = MESH->points[a].where.v; + Y[1] = MESH->points[b].where.v; + Y[2] = MESH->points[c].where.v; + + for(j=1;j<3;j++){ + XmaxBox = DMAX ( XmaxBox ,X[j] ); + XminBox = DMIN ( XminBox ,X[j] ); + YmaxBox = DMAX ( YmaxBox ,Y[j] ); + YminBox = DMIN ( YminBox ,Y[j] ); + } + ZmaxBox = 1.0; + ZminBox = 0.0; + + InvMap.Num = i; + InvMap.List = AllBricksForABox(); + List_Add(InvList, &InvMap); + } + + Invert_MappingLists(InvList, GridList); + List_Delete(InvList); +} + + +Delaunay * Find_Triangle (MPoint pt, DocRecord *MESH, int typ) { + + int a,b,c,i,found,KeyBrick,j; + Delaunay *del,*del2; + double Z,Znew; + PointRecord *ptr; + double Xcg,Ycg; + struct Map *pBrick; + + ptr = gPointArray; + gPointArray = MESH->points; + + if(MyMesh == MESH){ + KeyBrick = InWhichBrick(pt.h,pt.v,0.0); + if((pBrick = (struct Map *)List_PQuery(GridList, &KeyBrick, fcmp_Map)) == NULL){ + if(typ == A_TOUT_PRIX){ + gPointArray = ptr; + return(NULL); + } + } + else{ + for(i=0;i<List_Nbr(pBrick->List);i++){ + j = *(int *)List_Pointer(pBrick->List,i); + a = MESH->delaunay[j].t.a; + b = MESH->delaunay[j].t.b; + c = MESH->delaunay[j].t.c; + if(MESH->delaunay[j].t.position != EXTERN || typ == BOF){ + if(PtInTriangle(pt,a,b,c)){ + gPointArray = ptr; + return(&MESH->delaunay[j]); + } + } + } + if(typ == A_TOUT_PRIX) { + gPointArray = ptr; + return NULL; + } + } + } + else { + i=0; + found = 0; + while (!found && i<MESH->numTriangles) { + if( (!PtInTriangle(pt,MESH->delaunay[i].t.a,MESH->delaunay[i].t.b, + MESH->delaunay[i].t.c)) || + (MESH->delaunay[i].t.position == EXTERN && typ != BOF ))i++; + else + found = 1; + }; + + if(found == 1){ + gPointArray = ptr; + return(&(MESH->delaunay[i])); + } + if(typ == A_TOUT_PRIX){ + gPointArray = ptr; + return NULL; + } + } + + del = &(MESH->delaunay[0]); + + Xcg = gPointArray[del->t.a].where.h + + gPointArray[del->t.b].where.h + + gPointArray[del->t.c].where.h; + + Ycg = gPointArray[del->t.a].where.v + + gPointArray[del->t.b].where.v + + gPointArray[del->t.c].where.v; + + Xcg/=3.; + Ycg/=3.; + + Z = DSQR(Xcg-pt.h) + DSQR(Ycg-pt.v); + + for (i=1;i<MESH->numTriangles;i++){ + del2 = &(MESH->delaunay[i]); + Xcg = gPointArray[del2->t.a].where.h + + gPointArray[del2->t.b].where.h + + gPointArray[del2->t.c].where.h; + Ycg = gPointArray[del2->t.a].where.v + + gPointArray[del2->t.b].where.v + + gPointArray[del2->t.c].where.v; + Xcg /= 3. ; + Ycg /= 3.; + Znew = DSQR(Xcg-pt.h) + DSQR(Ycg-pt.v); + if (Znew<Z){ + del = del2; + Z = Znew; + } + } + + gPointArray = ptr; + return del; +} + +int PtInTriangle(MPoint p , PointNumero a , PointNumero b , PointNumero c){ + double Xmin , Xmax , Ymin, Ymax , Xtr[4],Ytr[4],A[2],B[2],X,Y,Signus[3]; + int i; + + X = p.h; + Y = p.v; + Xtr[0] = Xmax = Xmin = gPointArray[a].where.h; + Xtr[3] = gPointArray[a].where.h; + Xtr[1] = gPointArray[b].where.h; + Xtr[2] = gPointArray[c].where.h; + Ytr[0] = Ymax = Ymin = gPointArray[a].where.v; + Ytr[3] = gPointArray[a].where.v; + Ytr[1] = gPointArray[b].where.v; + Ytr[2] = gPointArray[c].where.v; + + for(i=1;i<3;i++){ + Xmin = (Xtr[i]<Xmin)?Xtr[i]:Xmin; + Xmax = (Xtr[i]>Xmax)?Xtr[i]:Xmax; + Ymin = (Ytr[i]<Ymin)?Ytr[i]:Ymin; + Ymax = (Ytr[i]>Ymax)?Ytr[i]:Ymax; + } + + if(X>Xmax || X<Xmin || Y>Ymax || Y<Ymin) return(0); + + for (i=0;i<3;i++){ + A[0] = Xtr[i+1] - Xtr[i]; + A[1] = Ytr[i+1] - Ytr[i]; + B[0] = X - Xtr[i]; + B[1] = Y - Ytr[i]; + Signus[i] = A[0] * B[1] - A[1] * B[0]; + } + for (i=0;i<2;i++){ + if(( Signus[i] * Signus[i+1] ) <= 0 ) return(0); + } + return(1); +} + diff --git a/Mesh/2D_Cylindrical.cpp b/Mesh/2D_Cylindrical.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6c5cdcb4f6fc08a7ec3f93d45659c686df1185c3 --- /dev/null +++ b/Mesh/2D_Cylindrical.cpp @@ -0,0 +1,290 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "Context.h" +#include "Numeric.h" + +extern Mesh *THEM; +extern Context_T CTX; + +static Surface *SURF; +double TETAMIN, TETAMAX, TETAFABSMIN; + +void ChangePi (void *a, void *dum){ + Vertex *v; + v = *(Vertex **) a; + + if ((v->Pos.X / SURF->Cyl.radius1) >= TETAMIN + .99999 * Pi){ + Msg(INFO, "%g -> ", v->Pos.X / SURF->Cyl.radius1); + v->Pos.X -= (2. * Pi) * SURF->Cyl.radius1; + Msg(INFO, "%g -> ", v->Pos.X / SURF->Cyl.radius1); + } +} + +void TETAMINMAX (void *a, void *dum){ + Vertex *v; + double ZRepere, S, C, y[3], teta; + double p[3], z[3], x[3], o[3]; + + v = *(Vertex **) a; + + p[0] = v->Pos.X - SURF->Cyl.center[0]; + p[1] = v->Pos.Y - SURF->Cyl.center[1]; + p[2] = v->Pos.Z - SURF->Cyl.center[2]; + z[0] = SURF->Cyl.zaxis[0]; + z[1] = SURF->Cyl.zaxis[1]; + z[2] = SURF->Cyl.zaxis[2]; + norme (z); + prosca (p, z, &ZRepere); + + //ZRepere = fabs(ZRepere); + + o[0] = p[0] - ZRepere * z[0]; + o[1] = p[1] - ZRepere * z[1]; + o[2] = p[2] - ZRepere * z[2]; + x[0] = SURF->Cyl.xaxis[0]; + x[1] = SURF->Cyl.xaxis[1]; + x[2] = SURF->Cyl.xaxis[2]; + + norme (o); + norme (x); + prodve (z, x, y); + norme (y); + prosca (o, x, &C); + prosca (o, y, &S); + teta = atan2 (S, C); + TETAMIN = DMIN (teta, TETAMIN); + TETAMAX = DMAX (teta, TETAMAX); +} + +/* SURFACES CYLINDRIQUES */ +void XYZtoTZ (void *a, void *dum){ + Vertex *v; + double ZRepere, S, C, y[3], teta; + double p[3], z[3], x[3], o[3]; + + v = *(Vertex **) a; + + p[0] = v->Pos.X - SURF->Cyl.center[0]; + p[1] = v->Pos.Y - SURF->Cyl.center[1]; + p[2] = v->Pos.Z - SURF->Cyl.center[2]; + z[0] = SURF->Cyl.zaxis[0]; + z[1] = SURF->Cyl.zaxis[1]; + z[2] = SURF->Cyl.zaxis[2]; + norme (z); + prosca (p, z, &ZRepere); + + //ZRepere = fabs(ZRepere); + + o[0] = p[0] - ZRepere * z[0]; + o[1] = p[1] - ZRepere * z[1]; + o[2] = p[2] - ZRepere * z[2]; + x[0] = SURF->Cyl.xaxis[0]; + x[1] = SURF->Cyl.xaxis[1]; + x[2] = SURF->Cyl.xaxis[2]; + + norme (o); + norme (x); + prodve (z, x, y); + norme (y); + prosca (o, x, &C); + prosca (o, y, &S); + teta = atan2 (S, C); + Msg(INFO, "pt %d %g %g", v->Num, ZRepere, teta); + + v->Pos.X = teta * SURF->Cyl.radius1; + v->Pos.Y = ZRepere; + v->Pos.Z = 0.0; +} + +void TZtoXYZ (void *a, void *dum){ + Vertex *v; + double d[3], x[3], prv[3]; + double XX, YY, ZZ; + + v = *(Vertex **) a; + d[0] = SURF->Cyl.zaxis[0]; + d[1] = SURF->Cyl.zaxis[1]; + d[2] = SURF->Cyl.zaxis[2]; + norme (d); + x[0] = SURF->Cyl.xaxis[0]; + x[1] = SURF->Cyl.xaxis[1]; + x[2] = SURF->Cyl.xaxis[2]; + norme (x); + prodve (d, x, prv); + norme (prv); + + XX = SURF->Cyl.center[0] + v->Pos.Y * d[0] + + SURF->Cyl.radius1 * cos (v->Pos.X / SURF->Cyl.radius1) * x[0] + + SURF->Cyl.radius1 * (sin (v->Pos.X / SURF->Cyl.radius1)) * prv[0]; + YY = SURF->Cyl.center[1] + v->Pos.Y * d[1] + + SURF->Cyl.radius1 * cos (v->Pos.X / SURF->Cyl.radius1) * x[1] + + SURF->Cyl.radius1 * (sin (v->Pos.X / SURF->Cyl.radius1)) * prv[1]; + ZZ = SURF->Cyl.center[2] + v->Pos.Y * d[2] + + SURF->Cyl.radius1 * cos (v->Pos.X / SURF->Cyl.radius1) * x[2] + + SURF->Cyl.radius1 * (sin (v->Pos.X / SURF->Cyl.radius1)) * prv[2]; + + v->Pos.X = XX; + v->Pos.Y = YY; + v->Pos.Z = ZZ; +} + +/* SURFACES CONIQUES */ +void XYZtoCone (void *a, void *dum){ + Vertex *v; + double ZRepere, S, C, y[3], teta; + double p[3], z[3], x[3], o[3]; + double inclinaison, ract; + + v = *(Vertex **) a; + + p[0] = v->Pos.X - SURF->Cyl.center[0]; + p[1] = v->Pos.Y - SURF->Cyl.center[1]; + p[2] = v->Pos.Z - SURF->Cyl.center[2]; + z[0] = SURF->Cyl.zaxis[0]; + z[1] = SURF->Cyl.zaxis[1]; + z[2] = SURF->Cyl.zaxis[2]; + norme (z); + prosca (p, z, &ZRepere); + + //ZRepere = fabs(ZRepere); + + o[0] = p[0] - ZRepere * z[0]; + o[1] = p[1] - ZRepere * z[1]; + o[2] = p[2] - ZRepere * z[2]; + x[0] = SURF->Cyl.xaxis[0]; + x[1] = SURF->Cyl.xaxis[1]; + x[2] = SURF->Cyl.xaxis[2]; + + norme (o); + norme (x); + prodve (z, x, y); + norme (y); + prosca (o, x, &C); + prosca (o, y, &S); + teta = atan2 (S, C); + if (teta >= TETAMIN + .99999 * Pi) + teta -= (2. * Pi); + + inclinaison = Pi * SURF->Cyl.radius2 / 180.; + + ract = SURF->Cyl.radius1 - ZRepere * tan (inclinaison); + + v->Pos.X = ract * cos (teta); + v->Pos.Y = ract * sin (teta); + v->Pos.Z = 0.0; + Msg (INFO, "%g %g", ZRepere, v->Pos.X); +} + +void ConetoXYZ (void *a, void *dum){ + Vertex *v; + double d[3], z, x[3], prv[3]; + double XX, YY, ZZ; + double inclinaison, teta, radiusact; + + v = *(Vertex **) a; + d[0] = SURF->Cyl.zaxis[0]; + d[1] = SURF->Cyl.zaxis[1]; + d[2] = SURF->Cyl.zaxis[2]; + norme (d); + x[0] = SURF->Cyl.xaxis[0]; + x[1] = SURF->Cyl.xaxis[1]; + x[2] = SURF->Cyl.xaxis[2]; + norme (x); + prodve (d, x, prv); + norme (prv); + inclinaison = Pi * SURF->Cyl.radius2 / 180.; + z = (SURF->Cyl.radius1 - myhypot (v->Pos.X, v->Pos.Y)) / tan (inclinaison); + radiusact = (SURF->Cyl.radius1 + z * tan (inclinaison)); + teta = atan2 (v->Pos.Y, v->Pos.X); + + XX = SURF->Cyl.center[0] + z * d[0] + + radiusact * cos (teta) * x[0] + + radiusact * (sin (teta)) * prv[0]; + YY = SURF->Cyl.center[1] + z * d[1] + + radiusact * cos (teta) * x[1] + + radiusact * (sin (teta)) * prv[1]; + ZZ = SURF->Cyl.center[2] + z * d[2] + + radiusact * cos (teta) * x[2] + + radiusact * (sin (teta)) * prv[2]; + + v->Pos.X = XX; + v->Pos.Y = YY; + v->Pos.Z = ZZ; + +} + +int MeshCylindricalSurface (Surface * s){ + + return 0; + +#if 0 + + int i, j, ori; + Curve *pC; + Vertex *v; + Tree_T *tnxe; + char text[256]; + extern double MAXIMUM_LC_FOR_SURFACE; + + if (s->Typ != MSH_SURF_CYLNDR && s->Typ != MSH_SURF_CONE + && s->Typ != MSH_SURF_TORUS) + return 0; + if (s->Typ == MSH_SURF_TORUS) + return 1; + + Msg (INFO, "z %d : %12.5E %12.5E %12.5E", s->Num, s->Cyl.zaxis[0], + s->Cyl.zaxis[1], s->Cyl.zaxis[2]); + Msg(INFO, "x %d : %12.5E %12.5E %12.5E", s->Num, s->Cyl.xaxis[0], + s->Cyl.xaxis[1], s->Cyl.xaxis[2]); + + SURF = s; + + for (i = 0; i < List_Nbr (s->s.Generatrices); i++){ + List_Read (s->s.Generatrices, i, &pC); + for (j = 0; j < List_Nbr (pC->Vertices); j++){ + List_Read (pC->Vertices, j, &v); + Tree_Insert (s->Vertices, List_Pointer (pC->Vertices, j)); + } + } + TETAMIN = 2. * Pi; + TETAMAX = -2. * Pi; + Tree_Action (s->Vertices, TETAMINMAX); + Tree_Action (s->Vertices, Freeze_Vertex); + + if (s->Typ == MSH_SURF_CYLNDR) + Tree_Action (s->Vertices, XYZtoTZ); + else if (s->Typ == MSH_SURF_CONE) + Tree_Action (s->Vertices, XYZtoCone); + + Msg(INFO, "%12.5E %12.5E", TETAMAX, TETAMIN); + + if ((s->Typ == MSH_SURF_CYLNDR) && (TETAMAX - TETAMIN > Pi * 1.01)) + Tree_Action (s->Vertices, ChangePi); + + ori = Calcule_Contours (s); + MAXIMUM_LC_FOR_SURFACE = SURF->Cyl.radius1 / 3.; + + if (CTX.mesh.algo == DELAUNAY_OLDALGO) + Maillage_Automatique_VieuxCode (s, THEM, ori); + else + AlgorithmeMaillage2DAnisotropeModeJF (s); + + for(i = 0 ; i < CTX.mesh.nb_smoothing ; i++){ + tnxe = Tree_Create (sizeof (NXE), compareNXE); + create_NXE (s->Vertices, s->Simplexes, tnxe); + Tree_Action (tnxe, ActionLiss); + Tree_Delete (tnxe); + } + + if (s->Typ == MSH_SURF_CYLNDR) + Tree_Action (s->Vertices, TZtoXYZ); + else if (s->Typ == MSH_SURF_CONE) + Tree_Action (s->Vertices, ConetoXYZ); + Tree_Action (s->Vertices, deFreeze_Vertex); + + return 1; + +#endif +} diff --git a/Mesh/2D_DivAndConq.cpp b/Mesh/2D_DivAndConq.cpp new file mode 100644 index 0000000000000000000000000000000000000000..97e955660c66da5abf3fa6109c9dce9d1261ff4f --- /dev/null +++ b/Mesh/2D_DivAndConq.cpp @@ -0,0 +1,518 @@ +/* + + A L G O R I T H M E D I V I D E A N D C O N Q U E R + + le noeud de cette methode est de pouvoir fusionner + deux triangulations de Delaunay en une seule (routine merge) + on procede alors recursivement en separant les points en deux + groupes puis en separant les groupes en 2 ... jusqu'a n'obtenir + que 1 2 ou 3 points (la triangulation est alors triviale) + + Dans le mailleur, on utilise cet algorithme pour construire + le maillage initial + + !!! il faut PERTURBER les points d'une faible valeur aleatoire + pour eviter d'avoir 3 points alignes ou 4 points cocycliques !!! + + doc : structure contenant la triangulation + +*/ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "2D_Mesh.h" + +#define EPSILON 1.e-15 + +extern double LC; + +PointRecord *pPointArray; +DocPeek gDocTemp; + +int Insert(PointNumero a,PointNumero b); +int Delete(PointNumero a,PointNumero b); + +void PushgPointArray(PointRecord *ptr){ + pPointArray = ptr; +} + +PointRecord *PopgPointArray(void){ + return(pPointArray) ; +} + +PointNumero Predecessor(PointNumero a, PointNumero b){ + DListPeek p; + + p = pPointArray[a].adjacent; + if (p == NULL) + return -1; + + do { + if (p->point_num == b) return (Pred(p)->point_num); + p = Pred(p); + } while (p != pPointArray[a].adjacent); + + return -1; + +} + + +PointNumero Successor(PointNumero a,PointNumero b){ + DListPeek p; + + p = pPointArray[a].adjacent; + if (p == NULL) + return -1; + + do { + if (p->point_num == b) return (Succ(p)->point_num); + p = Succ(p); + } while (p != pPointArray[a].adjacent); + + return -1; + +} + +int FixFirst(PointNumero x,PointNumero f){ + DListPeek p,copy; + int out = 0; + + p = pPointArray[x].adjacent; + if (p == NULL) + return(0); + copy = p; + do { + if (p->point_num == f){ + pPointArray[x].adjacent = p; + out = 1; + } + else + p = p->next; + } while ((p != copy) && !out); + return out; +} + +PointNumero First(PointNumero x){ + return (pPointArray[x].adjacent)->point_num; +} + +Segment LowerCommonTangent(DT vl,DT vr){ + PointNumero x,y,z,z1,z2,temp; + Segment s; + + x = vl.end; /* vu le tri, c'est le point le + a droite */ + y = vr.begin; /* idem, le + a gauche */ + z = First(y); + z1 = First(x); + z2 = Predecessor(x,z1); + for (;;) { + if (Is_right_of(x,y,z)){ + temp = z; + z = Successor(z,y); + y = temp; + } + else if (Is_right_of(x,y,z2)){ + temp = z2; + z2 = Predecessor(z2,x); + x = temp; + } + else { + s.from = x; + s.to = y; + return s; + } + } +} + + +Segment UpperCommonTangent(DT vl,DT vr){ + PointNumero x,y,z,z1,z2,temp; + Segment s; + + x = vl.end; /* vu le tri, c'est le point le + a droite */ + y = vr.begin; /* idem, le + a gauche */ + z = First(y); + z1 = First(x); + z2 = Predecessor(y,z); + for (;;){ + if (Is_left_of(x,y,z2)){ + temp = z2; + z2 = Predecessor(z2,y); + y = temp; + } + else if (Is_left_of(x,y,z1)){ + temp = z1; + z1 = Successor(z1,x); + x = temp; + } + else{ + s.from = x; + s.to = y; + return s; + } + } +} + + +/* return 1 if the point k is NOT in the circumcircle of + triangle hij */ + +int Qtest(PointNumero h,PointNumero i,PointNumero j,PointNumero k){ + double xc,yc,rcarre,distca; + + if ((h == i) && (h == j) && (h == k)){ + Msg(WARNING, "3 points identical"); + return(0); /* returning 1 will cause looping for ever */ + } + if (CircumCircle( (double) pPointArray[h].where.h, + (double) pPointArray[h].where.v, + (double) pPointArray[i].where.h, + (double) pPointArray[i].where.v, + (double) pPointArray[j].where.h, + (double) pPointArray[j].where.v, + &xc, &yc )){ + rcarre = square(xc - (double) pPointArray[i].where.h) + + square(yc - (double) pPointArray[i].where.v); + + distca = square(xc - (double) pPointArray[k].where.h) + + square(yc - (double) pPointArray[k].where.v); + + return (distca > rcarre); + } + else + return(0); /* point not in circle, because no circle ! */ +} + +int merge(DT vl,DT vr){ + Segment bt,ut; + int a,b,out; + PointNumero r,r1,r2,l,l1,l2; + + bt = LowerCommonTangent(vl,vr); + ut = UpperCommonTangent(vl,vr); + l = bt.from; /* left endpoint of BT */ + r = bt.to; /* right endpoint of BT */ + + while ((l != ut.from) || (r != ut.to)) { + a = b = 0; + if (!Insert(l,r)) return(0); + + r1 = Predecessor(r,l); + if (r1 == -1) return(0); + if (Is_right_of(l,r,r1)) + a = 1; + else{ + out = 0; + while (!out){ + r2 = Predecessor(r,r1); + if (r2 == -1) return(0); + if (r2 < vr.begin) + out = 1; + else if (Qtest(l,r,r1,r2)) + out = 1; + else{ + if (!Delete(r,r1)) return(0); + r1 = r2; + if (Is_right_of(l,r,r1)) out = a = 1; + } + } + } + + l1 = Successor(l,r); + if (l1 == -1) return(0); + if (Is_left_of(r,l,l1)) + b = 1; + else{ + out = 0; + while (!out){ + l2 = Successor(l,l1); + if (l2 == -1) return(0); + if (l2 > vl.end) + out = 1; + else if (Qtest(r,l,l1,l2)) + out = 1; + else{ + if (!Delete(l,l1)) return(0); + l1 = l2; + if (Is_left_of(r,l,l1)) out = b = 1; + } + } + } + + if (a) + l = l1; + else if (b) + r = r1; + else{ + if (Qtest(l,r,r1,l1)) + r = r1; + else + l = l1; + } + } + if (!Insert(l,r)) return(0); + + if (!FixFirst(ut.to,ut.from)) return(0); + if (!FixFirst(bt.from,bt.to)) return(0); + return(1); +} + + +DT recur_trig(PointNumero left,PointNumero right){ + int n,m; + DT dt; + + dt.begin = left; + dt.end = right; + n = right - left + 1; /* nombre de points a triangulariser */ + switch (n){ + case 0: + case 1: + /* 0 ou 1 points -> rien a faire */ + break; + + case 2: /* deux points : cas trivial */ + Insert(left,right); + FixFirst(left,right); + FixFirst(right,left); + break; + + case 3: /* trois points : cas trivial */ + Insert(left,right); + Insert(left,left + 1); + Insert(left + 1,right); + if (Is_right_of(left,right,left + 1)){ + FixFirst(left,left + 1); + FixFirst(left + 1,right); + FixFirst(right,left); + } + else{ + FixFirst(left,right); + FixFirst(left + 1,left); + FixFirst(right,left + 1); + } + break; + + default: /* plus de trois points : cas recursif */ + m = (left + right) >> 1; + if (!merge(recur_trig(left,m),recur_trig(m + 1,right))) + + break; + } + return dt; +} + +int comparePoints(const void *i, const void *j){ + double x,y; + + x = ((PointRecord *)i)->where.h - ((PointRecord *)j)->where.h; + if (x == 0.) { + y = ((PointRecord *)i)->where.v - ((PointRecord *)j)->where.v; + return ((y < 0.) ? -1 : 1); + } + else + return ((x < 0.) ? -1 : 1); +} + + +/* this fonction builds the delaunay triangulation and the voronoi for a + window. All error handling is done here. */ + +int DelaunayAndVoronoi(DocPeek doc){ + PushgPointArray(doc->points); + + if (doc->numPoints < 2) return(1); + + qsort(doc->points,doc->numPoints,sizeof(PointRecord),comparePoints); + gDocTemp = doc; + recur_trig(0,doc->numPoints - 1); + + return 1; +} + + +/* this routine puts in xc and yc the coord of the center + of the circumcircle of triangle (x1,y1),(x2,y2),(x3,y3) */ + +int CircumCircle(double x1,double y1,double x2,double y2,double x3,double y3, + double *xc,double *yc){ + double d,a1,a2,a3; + + + d = 2. * (double)(y1*(x2-x3)+y2*(x3-x1)+y3*(x1-x2)); + if (d == 0.0){ + Msg(WARNING, "Points colinear"); + *xc = *yc = -99999.; + return(0); + } + + a1 = x1*x1 + y1*y1; + a2 = x2*x2 + y2*y2; + a3 = x3*x3 + y3*y3; + *xc = (double) ((a1*(y3-y2) + a2*(y1-y3) + a3*(y2-y1)) / d); + *yc = (double) ((a1*(x2-x3) + a2*(x3-x1) + a3*(x1-x2)) / d); + + if(fabs(d) < EPSILON_LC){ + Msg(WARNING, "Points almost colinear d = %g (xc = %g, yc = %g)",d,*xc,*yc); + } + + return(1); +} + + +int Is_right_of(PointNumero x,PointNumero y,PointNumero check){ + return Is_left_of(y,x,check); +} + +int Is_left_of(PointNumero x,PointNumero y,PointNumero check){ + static double xx,yy,alpha,beta; + + yy = (double) (pPointArray[y].where.v - pPointArray[x].where.v); + xx = (double) (pPointArray[y].where.h - pPointArray[x].where.h); + alpha = atan2(yy,xx); + + yy = (double) (pPointArray[check].where.v - pPointArray[x].where.v); + xx = (double) (pPointArray[check].where.h - pPointArray[x].where.h); + beta = atan2(yy,xx) - alpha; + if (beta <= 0) beta += Deux_Pi; + + return ((beta >= 0) && (beta <= Pi)); +} + +/* This routine insert the point 'newPoint' in the list dlist, + respecting the clock-wise orientation. */ + +int DListInsert(DListRecord **dlist, MPoint center, PointNumero newPoint){ + DListRecord *p, *newp; + double alpha1,alpha,beta,xx,yy; + int first; + + newp = (DListRecord*) Malloc(sizeof(DListRecord)); + newp->point_num = newPoint; + + if (*dlist == NULL){ + *dlist = newp; + Pred(*dlist) = newp; + Succ(*dlist) = newp; + return(1); + } + if (Succ(*dlist) == *dlist){ + Pred(*dlist) = newp; + Succ(*dlist) = newp; + Pred(newp) = *dlist; + Succ(newp) = *dlist; + return(1); + } + /* If we are here, the double-linked circular list has 2 or more + elements, so we have to calculate where to put the new one. */ + + p = *dlist; + first = p->point_num; + + /* first, compute polar coord. of the first point. */ + yy = (double) (pPointArray[first].where.v - center.v); + xx = (double) (pPointArray[first].where.h - center.h); + alpha1 = atan2(yy,xx); + + /* compute polar coord of the point to insert. */ + yy = (double) (pPointArray[newPoint].where.v - center.v); + xx = (double) (pPointArray[newPoint].where.h - center.h); + beta = atan2(yy,xx) - alpha1; + if (beta <= 0) beta += Deux_Pi; + + do{ + yy = (double) (pPointArray[Succ(p)->point_num].where.v - center.v); + xx = (double) (pPointArray[Succ(p)->point_num].where.h - center.h); + alpha = atan2(yy,xx) - alpha1; + if (alpha <= EPSILON) alpha += Deux_Pi; + if (alpha >= beta){ + Succ(newp) = Succ(p); + Succ(p) = newp; + Pred(newp) = p; + Pred(Succ(newp)) = newp; + return(1); + } + p = Succ(p); + } while (p != *dlist); + + /*** ON NE DOIT JAMAIS ARRIVER ICI ***/ + return(0); +} + +int Insert(PointNumero a,PointNumero b){ + int rslt; + + /* This routine inserts the point 'a' in the adjency list of 'b' and + the point 'b' in the adjency list of 'a'. */ + + rslt = DListInsert(&pPointArray[a].adjacent,pPointArray[a].where,b); + rslt &= DListInsert(&pPointArray[b].adjacent,pPointArray[b].where,a); + + return rslt; +} + + + +int DListDelete(DListPeek *dlist,PointNumero oldPoint){ + DListPeek p; + + if (*dlist == NULL) + return(0); + if (Succ(*dlist) == *dlist){ + if ((*dlist)->point_num == oldPoint){ + Free(*dlist); + *dlist = NULL; + return(1); + } + else + return(0); + } + p = *dlist; + do{ + if (p->point_num == oldPoint){ + Succ(Pred(p)) = Succ(p); + Pred(Succ(p)) = Pred(p); + if (p == *dlist){ + *dlist = Succ(p); + } + Free(p); + return(1); + } + p = Succ(p); + } while (p != *dlist); + + return(0); +} + + +/* This routine removes the point 'a' in the adjency list of 'b' and + the point 'b' in the adjency list of 'a'. */ + +int Delete(PointNumero a,PointNumero b){ + int rslt; + + rslt = DListDelete(&pPointArray[a].adjacent,b); + rslt &= DListDelete(&pPointArray[b].adjacent,a); + + return rslt; +} + +/* Cette routine efface toutes les listes d'adjacence du pPointArray. */ + +void remove_all_dlist(int n, PointRecord *pPointArray){ + int i; + DListPeek p,temp; + + for (i=0;i<n;i++) + if (pPointArray[i].adjacent != NULL){ + p = pPointArray[i].adjacent; + do{ + temp = p; + p = Pred(p); + Free(temp); + } while (p != pPointArray[i].adjacent); + pPointArray[i].adjacent = NULL; + } +} + diff --git a/Mesh/2D_Elliptic.cpp b/Mesh/2D_Elliptic.cpp new file mode 100644 index 0000000000000000000000000000000000000000..488d945b6c9040c186264873d5ebad5a62cde852 --- /dev/null +++ b/Mesh/2D_Elliptic.cpp @@ -0,0 +1,235 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "Mesh.h" + +extern Mesh *THEM; +extern int CurrentNodeNumber; + +int MeshEllipticSurface (Surface * sur){ + + int i, j, k, nb, N1, N2, N3, N4; + Curve *GG[444]; + Vertex **list; + Simplex *simp; + double alpha, beta, gamma, u, v, lc, x, y, z; + Vertex *S[4], *v11, *v12, *v13, *v21, *v22, *v23, *v31, *v32, *v33; + List_T *l1, *l2, *l3, *l4; + + if (sur->Method != ELLIPTIC) + return (0); + + nb = List_Nbr (sur->s.Generatrices); + if (nb < 4) + return (0); + + for (i = 0; i < nb; i++){ + List_Read (sur->s.Generatrices, i, &GG[i]); + } + + if (!(S[0] = FindVertex (sur->ipar[0], THEM))) + return 0; + if (!(S[1] = FindVertex (sur->ipar[1], THEM))) + return 0; + if (!(S[2] = FindVertex (sur->ipar[2], THEM))) + return 0; + if (!(S[3] = FindVertex (sur->ipar[3], THEM))) + return 0; + N1 = N2 = N3 = N4 = 0; + /*Remplissure de la premiere cuvee de merde */ + l1 = List_Create (20, 10, sizeof (Vertex *)); + for (i = 0; i < nb; i++){ + if (!compareVertex (&GG[i]->beg, &S[0])){ + j = i; + do{ + if (!List_Nbr (l1)) + List_Add (l1, List_Pointer (GG[j]->Vertices, 0)); + for (k = 1; k < List_Nbr (GG[j]->Vertices); k++) + List_Add (l1, List_Pointer (GG[j]->Vertices, k)); + j = (j + 1 < nb) ? j + 1 : 0; + if (j == i) + return 0; + } + while (compareVertex (&GG[j]->beg, &S[1])); + } + } + /*Remplissure de la deuxieme cuvee de merde */ + l2 = List_Create (20, 10, sizeof (Vertex *)); + for (i = 0; i < nb; i++){ + if (!compareVertex (&GG[i]->beg, &S[1])){ + j = i; + do{ + if (!List_Nbr (l2)) + List_Add (l2, List_Pointer (GG[j]->Vertices, 0)); + for (k = 1; k < List_Nbr (GG[j]->Vertices); k++) + List_Add (l2, List_Pointer (GG[j]->Vertices, k)); + j = (j + 1 < nb) ? j + 1 : 0; + if (j == i) + return 0; + } + while (compareVertex (&GG[j]->beg, &S[2])); + } + } + /*Remplissure de la TROISIEME cuvee de merde */ + l3 = List_Create (20, 10, sizeof (Vertex *)); + for (i = 0; i < nb; i++){ + if (!compareVertex (&GG[i]->beg, &S[2])){ + j = i; + do{ + if (!List_Nbr (l3)) + List_Add (l3, List_Pointer (GG[j]->Vertices, 0)); + for (k = 1; k < List_Nbr (GG[j]->Vertices); k++) + List_Add (l3, List_Pointer (GG[j]->Vertices, k)); + j = (j + 1 < nb) ? j + 1 : 0; + if (j == i) + return 0; + } + while (compareVertex (&GG[j]->beg, &S[3])); + } + } + /*Remplissure de la quatrieme cuvee de merde */ + l4 = List_Create (20, 10, sizeof (Vertex *)); + for (i = 0; i < nb; i++){ + if (!compareVertex (&GG[i]->beg, &S[3])){ + j = i; + do{ + if (!List_Nbr (l4)) + List_Add (l4, List_Pointer (GG[j]->Vertices, 0)); + for (k = 1; k < List_Nbr (GG[j]->Vertices); k++) + List_Add (l4, List_Pointer (GG[j]->Vertices, k)); + j = (j + 1 < nb) ? j + 1 : 0; + if (j == i) + return 0; + } + while (compareVertex (&GG[j]->beg, &S[0])); + } + } + N1 = List_Nbr (l1); + N2 = List_Nbr (l2); + N3 = List_Nbr (l3); + N4 = List_Nbr (l4); + if (N1 != N3 || N2 != N4){ + List_Delete (l1); + List_Delete (l2); + List_Delete (l3); + List_Delete (l4); + return 0; + } + + + sur->Nu = N1; + sur->Nv = N2; + list = (Vertex **) Malloc (N1 * N2 * sizeof (Vertex *)); + + for (i = 0; i < N1; i++){ + for (j = 0; j < N2; j++){ + if (i == 0){ + List_Read (l4, N2 - j - 1, &list[i + N1 * j]); + } + else if (i == N1 - 1){ + List_Read (l2, j, &list[i + N1 * j]); + } + else if (j == 0){ + List_Read (l1, i, &list[i + N1 * j]); + } + else if (j == N2 - 1){ + List_Read (l3, N1 - i - 1, &list[i + N1 * j]); + } + else{ + u = 1. - 2. * (double) i / double (N1 - 1); + v = 1. - 2. * (double) j / double (N2 - 1); + x = 0.25 * ((S[0]->Pos.X * (1 + u) * (1. + v)) + + (S[1]->Pos.X * (1 - u) * (1. + v)) + + (S[2]->Pos.X * (1 - u) * (1. - v)) + + (S[3]->Pos.X * (1 + u) * (1. - v))); + y = 0.25 * ((S[0]->Pos.Y * (1 + u) * (1. + v)) + + (S[1]->Pos.Y * (1 - u) * (1. + v)) + + (S[2]->Pos.Y * (1 - u) * (1. - v)) + + (S[3]->Pos.Y * (1 + u) * (1. - v))); + z = 0.25 * ((S[0]->Pos.Z * (1 + u) * (1. + v)) + + (S[1]->Pos.Z * (1 - u) * (1. + v)) + + (S[2]->Pos.Z * (1 - u) * (1. - v)) + + (S[3]->Pos.Z * (1 + u) * (1. - v))); + lc = 0.25 * ((S[0]->lc * (1 + u) * (1. + v)) + + (S[1]->lc * (1 - u) * (1. + v)) + + (S[2]->lc * (1 - u) * (1. - v)) + + (S[3]->lc * (1 + u) * (1. - v))); + + list[i + N1 * j] = Create_Vertex (++CurrentNodeNumber, x, y, z, lc, 0.0); + } + } + } + + k = 0; + + while (1){ + k++; + if (k > 1000) + break; + for (i = 1; i < N1 - 1; i++){ + for (j = 1; j < N2 - 1; j++){ + v11 = list[i - 1 + N1 * (j - 1)]; + v12 = list[i + N1 * (j - 1)]; + v13 = list[i + 1 + N1 * (j - 1)]; + v21 = list[i - 1 + N1 * (j)]; + v22 = list[i + N1 * (j)]; + v23 = list[i + 1 + N1 * (j)]; + v31 = list[i - 1 + N1 * (j + 1)]; + v32 = list[i + N1 * (j + 1)]; + v33 = list[i + 1 + N1 * (j + 1)]; + + alpha = 0.25 * (DSQR (v23->Pos.X - v21->Pos.X) + + DSQR (v23->Pos.Y - v21->Pos.Y)); + gamma = 0.25 * (DSQR (v32->Pos.X - v12->Pos.X) + + DSQR (v32->Pos.Y - v12->Pos.Y)); + beta = 0.0625 * ((v32->Pos.X - v12->Pos.X) * + (v23->Pos.X - v21->Pos.X) + + (v32->Pos.Y - v12->Pos.Y) * + (v23->Pos.Y - v21->Pos.Y)); + + v22->Pos.X = 0.5 * (alpha * (v32->Pos.X + v12->Pos.X) + + gamma * (v23->Pos.X + v21->Pos.X) - + 2. * beta * (v33->Pos.X - v13->Pos.X - v31->Pos.X + v11->Pos.X)) + / (alpha + gamma); + v22->Pos.Y = 0.5 * (alpha * (v32->Pos.Y + v12->Pos.Y) + + gamma * (v23->Pos.Y + v21->Pos.Y) - + 2. * beta * (v33->Pos.Y - v13->Pos.Y - v31->Pos.Y + v11->Pos.Y)) + / (alpha + gamma); + v22->Pos.Z = 0.5 * (alpha * (v32->Pos.Z + v12->Pos.Z) + + gamma * (v23->Pos.Z + v21->Pos.Z) - + 2. * beta * (v33->Pos.Z - v13->Pos.Z - v31->Pos.Z + v11->Pos.Z)) + / (alpha + gamma); + + } + } + + } + for (i = 0; i < N1 - 1; i++){ + for (j = 0; j < N2 - 1; j++){ + if (sur->Recombine){ + simp = Create_Simplex (list[(i) + N1 * (j)], list[(i + 1) + N1 * (j)], + list[(i + 1) + N1 * (j + 1)], NULL); + simp->iEnt = sur->Num; + simp->V[3] = list[i + N1 * (j + 1)]; + Tree_Add (sur->Simplexes, &simp); + List_Add (sur->TrsfSimplexes, &simp); + } + else{ + simp = Create_Simplex (list[(i) + N1 * (j)], list[(i + 1) + N1 * (j)], + list[(i) + N1 * (j + 1)], NULL); + simp->iEnt = sur->Num; + Tree_Add (sur->Simplexes, &simp); + List_Add (sur->TrsfSimplexes, &simp); + + simp = Create_Simplex (list[(i + 1) + N1 * (j + 1)], list[(i) + N1 * (j + 1)], + list[(i + 1) + N1 * (j)], NULL); + simp->iEnt = sur->Num; + Tree_Add (sur->Simplexes, &simp); + List_Add (sur->TrsfSimplexes, &simp); + } + } + } + return 1; +} diff --git a/Mesh/2D_InitMesh.cpp b/Mesh/2D_InitMesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cca8c0df992f151efbec4fa272aac00a50dcbf71 --- /dev/null +++ b/Mesh/2D_InitMesh.cpp @@ -0,0 +1,428 @@ +/* + + Generation du maillage initial 2D + + Dans l'algorithme de maillage, on doit creer un maillage initial a l'aide + de contours orientes aire a doite. Deux types de problemes peuvent se presenter : + + 1) probleme courant : un triangle se trouve a l'exterieur du contour, il faut + que sa variable de localisation soit declaree externe. + + 2) probleme rare : une arete du contour n'a pas ete creee + + On procede comme suit : + trouve le triangle, on procede de la facon suivante : + - on trie les aretes de tous les triangles ; + - Pour chaque contour on prend chaque arete orientee ; + - Si cette arete n'existe pas (bsearch return false) alors on cherche + les 2 triangles reliant cette arete et on les modifie + - Si cette arete possede 2 triangles adjacents, on declare externe + le triangle dont le troisieme noeud se trouve a gauche de l'arete. + + illustration + ------------ + + probleme 1) + = point du contour + + + 3 + - - + --------+ + + + - - 1 \ / + + \ / + + \ / + + + + + 2 3 a gauche de 1-2 -> tr externe + + + probleme 2) arete inexistante 1-2 + + +,*,@ contours + + +1 + + / \ /|\ + / \ / | \ + / \ / | \ + / \ / | \ + * @ ---> *----+----@ + \ / \ | / + \ / \ | / + \ / \ | / + \ / \|/ + +2 + + +*/ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "2D_Mesh.h" +#include "Numeric.h" + +static int pointA,pointB,Counter,Stagnant,StopNow; +static Tree_T *ETree,*EDToSwap; + +extern PointRecord *gPointArray; + +int *permut; + +typedef struct { + int from; + int to; + int NbOccur; + Delaunay *Liste[2]; +}ED; + + +void makepermut (int numpoints){ + int i, ip ; + permut = (int *) Malloc (numpoints * sizeof (int)); + for ( i=0 ; i<numpoints ; i++ ){ + ip = gPointArray[i].permu; + permut[ip] = i; + } +} + +int crossED ( ED * e ){ + double Xma,Xmb,Yma,Ymb,det,t,q; + double XMa,XMb,YMa,YMb; + double xa1,xa2,ya1,ya2; + double xb1,xb2,yb1,yb2; + + xa1 = gPointArray[pointA].where.h; + xa2 = gPointArray[pointB].where.h; + ya1 = gPointArray[pointA].where.v; + ya2 = gPointArray[pointB].where.v; + + xb1 = gPointArray[e->from].where.h; + xb2 = gPointArray[e->to].where.h; + yb1 = gPointArray[e->from].where.v; + yb2 = gPointArray[e->to].where.v; + + Xma = DMIN(xa1,xa2); + Xmb = DMIN(xb1,xb2); + + XMa = DMAX(xa1,xa2); + XMb = DMAX(xb1,xb2); + + if(XMa < Xmb || XMb < Xma)return(0); + + Yma = DMIN(ya1,ya2); + Ymb = DMIN(yb1,yb2); + + YMa = DMAX(ya1,ya2); + YMb = DMAX(yb1,yb2); + + if(YMa < Ymb || YMb < Yma)return(0); + + det = (xa2 - xa1)*(yb1-yb2) - (xb1 - xb2)*(ya2-ya1); + + if(det == 0.0){ + return(0); + } + + t = ((xb1 - xa1)*(yb1-yb2) - (xb1 - xb2)*(yb1-ya1))/det; + q = ((xa2 - xa1)*(yb1-ya1) - (ya2 - ya1)*(xb1-xa1))/det; + + if(t>1. || t<0.)return(0); + if(q>1. || q<0.)return(0); + return(1); +} + +int compareED2 (const void *a, const void *b){ + ED *q,*w; + q=(ED*)a; + w=(ED*)b; + if(q->NbOccur > w->NbOccur)return(-1); + if(q->NbOccur < w->NbOccur)return(1); + if(q->from > w->from)return(1); + if(q->from < w->from)return(-1); + if(q->to > w->to)return(1); + if(q->to < w->to)return(-1); + return(0); +} + +int compareED (const void *a, const void *b){ + ED *q,*w; + q=(ED*)a; + w=(ED*)b; + if(q->from > w->from)return(1); + if(q->from < w->from)return(-1); + if(q->to > w->to)return(1); + if(q->to < w->to)return(-1); + return(0); +} + +void DoWeSwapED ( void *data , void *dummy){ + ED *e; + + e = (ED*)data; + + if(e->from == pointA || e->from == pointB || + e->to == pointA || e->to == pointB){ + return; + } + else if ( Tree_PQuery ( EDToSwap,e) ){ + } + else if ( crossED ( e ) ) { + Tree_Add ( EDToSwap ,e); + } +} + +void Print ( void *data , void *dummy){ + ED *e; + + e = (ED*)data; + Msg(INFO,"%d %d",e->from,e->to); +} + +void SwapED ( void *data , void *dummy){ + ED *e,E; + int from,to; + + e = (ED*)data; + + if(Stagnant && Counter <= StopNow)return; + else if(Stagnant)Counter++; + + if(e->from != e->Liste[0]->t.a && e->from != e->Liste[0]->t.b && + e->from != e->Liste[0]->t.c ) + return; + if(e->from != e->Liste[1]->t.a && e->from != e->Liste[1]->t.b && + e->from != e->Liste[1]->t.c ) + return; + if(e->to != e->Liste[0]->t.a && e->to != e->Liste[0]->t.b && + e->to != e->Liste[0]->t.c ) + return; + if(e->to != e->Liste[1]->t.a && e->to != e->Liste[1]->t.b && + e->to != e->Liste[1]->t.c ) + return; + + + if(e->from != e->Liste[0]->t.a && e->to != e->Liste[0]->t.a) + from = e->Liste[0]->t.a; + else if(e->from != e->Liste[0]->t.b && e->to != e->Liste[0]->t.b) + from = e->Liste[0]->t.b; + else if(e->from != e->Liste[0]->t.c && e->to != e->Liste[0]->t.c) + from = e->Liste[0]->t.c; + + if(e->from != e->Liste[1]->t.a && e->to != e->Liste[1]->t.a) + to = e->Liste[1]->t.a; + else if(e->from != e->Liste[1]->t.b && e->to != e->Liste[1]->t.b) + to = e->Liste[1]->t.b; + else if(e->from != e->Liste[1]->t.c && e->to != e->Liste[1]->t.c) + to = e->Liste[1]->t.c; + + pointA = e->from; + pointB = e->to; + E.from = from; + E.to = to; + if(!crossED(&E))return; + + e->Liste[0]->t.a = from; + e->Liste[0]->t.b = to; + e->Liste[0]->t.c = e->from; + + e->Liste[1]->t.a = from; + e->Liste[1]->t.b = to; + e->Liste[1]->t.c = e->to; + + e->from = IMAX(from,to); + e->to = IMIN(from,to); +} + +void SuppressInETree( void *data , void *dummy){ + if(!Tree_Suppress(ETree,data)) + Msg(WARNING, "Cannot suppress in ETree"); +} + +void AddInETree( void *data , void *dummy){ + Tree_Add(ETree,data); +} + +int verifie_cas_scabreux (int pa, int pb, ContourRecord **ListContours, int Nc){ + ED Edge; + int i,k,a,b; + ContourRecord *contour; + + + Edge.from = IMAX(pa,pb); + Edge.to = IMIN(pa,pb); + for(k=0;k<Nc;k++){ + contour = ListContours[k]; + for ( i = -1 ; i < (contour->numpoints - 1) ; i++) { + if(i == -1){ + a = permut [ contour->oriented_points[0].permu ]; + b = permut [ contour->oriented_points[contour->numpoints - 1].permu ]; + } + else{ + a = permut [ contour->oriented_points[i].permu ]; + b = permut [ contour->oriented_points[i+1].permu ]; + } + + pointA = IMAX(a,b); + pointB = IMIN(a,b); + if(a != pa && b != pa && a != pb && b != pb) + if(crossED(&Edge)) return (1); + } + } + return (0); +} + +void verify_edges (List_T *ListDelaunay, ContourRecord **ListContour, + int NumContours , int NumDelaunay){ + + ED *pEdge; + ED Edge; + int ok,max,i,k,c,a,b; + ContourRecord *contour; + Delaunay *del_P; + + max = 100; + + c = 0; + do { + c++; + if(c>max)break; + ETree = Tree_Create ( sizeof (Edge) , compareED ); + for (i=0;i< NumDelaunay;i++) { + + del_P = *(Delaunay**)List_Pointer(ListDelaunay, i); + + Edge.from = IMAX ( del_P->t.a, del_P->t.b ); + Edge.to = IMIN ( del_P->t.a, del_P->t.b ); + Edge.NbOccur = 1; + + if((pEdge = (ED*)Tree_PQuery(ETree,&Edge))){ + pEdge->Liste[1] = del_P; + } + else { + Edge.Liste[0] = del_P; + Tree_Add (ETree,&Edge); + } + + Edge.from = IMAX ( del_P->t.a, del_P->t.c ); + Edge.to = IMIN ( del_P->t.a, del_P->t.c ); + + if((pEdge = (ED*)Tree_PQuery(ETree,&Edge))){ + pEdge->Liste[1] = del_P; + } + else { + Edge.Liste[0] = del_P; + Tree_Add (ETree,&Edge); + } + + Edge.from = IMAX ( del_P->t.c, del_P->t.b ); + Edge.to = IMIN ( del_P->t.c, del_P->t.b ); + + if((pEdge = (ED*)Tree_PQuery(ETree,&Edge))){ + pEdge->Liste[1] = del_P; + } + else { + Edge.Liste[0] = del_P; + Tree_Add (ETree,&Edge); + } + } + + ok = 0; + for(k=0;k<NumContours;k++){ + contour = ListContour[k]; + for ( i = -1 ; i < contour->numpoints - 1 ; i++){ + + if(i == -1){ + a = permut [ contour->oriented_points[0].permu ]; + b = permut [ contour->oriented_points[contour->numpoints - 1].permu ]; + } + else{ + a = permut [ contour->oriented_points[i].permu ]; + b = permut [ contour->oriented_points[i+1].permu ]; + } + + Edge.from = IMAX(a,b); + Edge.to = IMIN(a,b); + + if(!Tree_Search( ETree , &Edge ))ok++;; + } + } + + if(!ok){ + return; + } + Msg(WARNING, "Swapping : %d missing edges",ok); + + EDToSwap = NULL; + if(EDToSwap)Tree_Delete(EDToSwap); + EDToSwap = Tree_Create (sizeof(ED),compareED2); + for(k=0;k<NumContours;k++){ + contour = ListContour[k]; + for ( i = -1 ; i < contour->numpoints - 1 ; i++){ + + if(i == -1){ + a = permut [ contour->oriented_points[0].permu ]; + b = permut [ contour->oriented_points[contour->numpoints - 1].permu ]; + } + else{ + a = permut [ contour->oriented_points[i].permu ]; + b = permut [ contour->oriented_points[i+1].permu ]; + } + + pointA = IMAX(a,b); + pointB = IMIN(a,b); + + Tree_Action ( ETree , DoWeSwapED ); + + } + } + Msg(WARNING, "Elimination : %d swaps", Tree_Nbr(EDToSwap)); + + Tree_Action (EDToSwap , SuppressInETree); + Tree_Action (EDToSwap , SwapED); + Tree_Action (EDToSwap , AddInETree); + }while(Tree_Nbr(EDToSwap)); +/* + Tree_Delete(EDToSwap); + Tree_Delete(ETree); +*/ +} + + + +int comparepermu(const void *i, const void *j){ + return ( gPointArray[*(PointNumero *)i].permu - gPointArray[*(PointNumero *)j].permu); +} + +void verify_inside (Delaunay * ListDelaunay , int NumDelaunay ){ + + PointNumero pt[3], compare, a, b; + int i, inside, cont[3]; + + for ( i=0 ; i < NumDelaunay ; i++){ + + pt[0] = ListDelaunay[i].t.a; + pt[1] = ListDelaunay[i].t.b; + pt[2] = ListDelaunay[i].t.c; + qsort(pt,3,sizeof(PointNumero),comparepermu); + + cont[0] = gPointArray[pt[0]].numcontour; + cont[1] = gPointArray[pt[1]].numcontour; + cont[2] = gPointArray[pt[2]].numcontour; + + + if((cont[1] != cont[2])||(cont[0]!=cont[1])||(cont[0]!=cont[2])) + inside = 1; + else + inside = 0; + + + a = pt[0]; + b = pt[1]; + compare = pt[2]; + + if ((Is_left_of ( a,b,compare ) && (inside == 0))){ + ListDelaunay[i].t.position = EXTERN ; + } + + } + return; + +} + diff --git a/Mesh/2D_Links.cpp b/Mesh/2D_Links.cpp new file mode 100644 index 0000000000000000000000000000000000000000..43f89c514749af2017b282e4b9f3e63dafa64532 --- /dev/null +++ b/Mesh/2D_Links.cpp @@ -0,0 +1,270 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "2D_Mesh.h" + +extern PointRecord *gPointArray; +extern int LocalNewPoint; +extern DocRecord *FGMESH; + +extern PointNumero First(PointNumero x); + +/* compte les points sur le polygone convexe */ + +int CountPointsOnHull(int n, PointRecord *pPointArray){ + PointNumero p,p2,temp; + int i; + + if (pPointArray[0].adjacent == NULL) return 0; + i = 1; + p = 0; + p2 = First(0); + while ((p2 != 0) && (i < n)) { + i++; + temp = p2; + p2 = Successor(p2,p); + p = temp; + } + return ((i <= n) ? i : -1); +} + + +PointNumero *ConvertDlistToArray(DListPeek *dlist,int *n){ + DListPeek p,temp; + int i,max = 0; + PointNumero *ptr; + + p = *dlist; + do{ + max++; + p = Pred(p); + } while (p != *dlist); + ptr = (PointNumero *) Malloc((int) ((max+1) * sizeof(PointNumero))); + if (ptr == NULL) return NULL; + p = *dlist; + for (i=0;i<max;i++){ + ptr[i] = p->point_num; + temp = p; + p = Pred(p); + Free(temp); + } + ptr[max]=ptr[0]; + *dlist = NULL; + *n = max; + return ptr; +} + + +/* Convertir les listes d'adjacence en triangles */ + +int Conversion(DocPeek doc ){ + + /* on suppose que n >= 3 gPointArray est suppose OK. */ + + Striangle *striangle; + int n,i,j; + int count = 0,count2 = 0; + PointNumero aa,bb,cc; + PointRecord *ptemp; + + ptemp = gPointArray; + gPointArray = doc->points; + + n = doc->numPoints; + striangle = (Striangle *) Malloc((int) (n * sizeof(Striangle))); + count2 = (int) CountPointsOnHull(n,doc->points); + + /* nombre de triangles que l'on doit obtenir */ + count2 = 2 * (n - 1) - count2; + + doc->delaunay = (Delaunay *) Malloc(2*count2 * sizeof(Delaunay)); + + for (i=0;i<n;i++){ + /* on cree une liste de points connectes au point i (t) + nombre de points (t_length) */ + striangle[i].t = ConvertDlistToArray(&gPointArray[i].adjacent,&striangle[i].t_length); + striangle[i].info = NULL; + striangle[i].info_length = 0; + } + + /* on balaye les noeuds de gauche a droite -> on cree les triangles */ + count = 0; + for (i=0;i<n;i++){ + for (j=0;j<striangle[i].t_length;j++){ + if ( ( striangle[i].t[j] > i) && ( striangle[i].t[j+1] > i) && + (Is_right_of(i,striangle[i].t[j],striangle[i].t[j+1])) ) { + aa = i; + bb = striangle[i].t[j]; + cc = striangle[i].t[j+1]; + filldel(&doc->delaunay[count],aa,bb,cc,gPointArray,NULL); + count++; + } + } + } + for (i=0;i<n;i++) Free(striangle[i].t); + Free(striangle); + doc->numTriangles = count2; + gPointArray = ptemp; + return(1); +} + + +int compareEdge(const void *e1, const void *e2){ + PointNumero tmp; + + if ((tmp = ((edge *)e1)->from - ((edge *)e2)->from) != 0) return(tmp); + return(((edge *)e1)->to - ((edge *)e2)->to); +} + +/* pour la liste de delaunays ListDelaunay, CreateLinks cree les liens entre + triangles c.a.d determine les voisins de chaque triangle */ + +int CreateLinks(List_T * ListDelaunay , int NumDelaunay, + ContourRecord **ListContours , int Nc){ + int i; + edge *ListEdges; + MPoint pt; + Delaunay *del_Pi, *del_Pj; + + ListEdges = (edge *) Malloc((3* NumDelaunay + 2)* sizeof(edge)); + + ListEdges[3* NumDelaunay + 1].num=0; + + for (i=0;i< NumDelaunay;i++){ + + del_Pi = *(Delaunay**)List_Pointer(ListDelaunay, i); + + /* arete a b */ + if (del_Pi->t.a > del_Pi->t.b ){ + ListEdges[3*i].from = del_Pi->t.a; + ListEdges[3*i].to = del_Pi->t.b; + ListEdges[3*i].num = i; + } + else { + ListEdges[3*i].from = del_Pi->t.b; + ListEdges[3*i].to = del_Pi->t.a; + ListEdges[3*i].num = i; + } + + /* arete b c */ + if (del_Pi->t.b > del_Pi->t.c ){ + ListEdges[3*i+1].from = del_Pi->t.b; + ListEdges[3*i+1].to = del_Pi->t.c; + ListEdges[3*i+1].num = i; + } + else { + ListEdges[3*i+1].from = del_Pi->t.c; + ListEdges[3*i+1].to = del_Pi->t.b; + ListEdges[3*i+1].num = i; + } + + /* arete c a */ + if (del_Pi->t.c > del_Pi->t.a ){ + ListEdges[3*i+2].from = del_Pi->t.c; + ListEdges[3*i+2].to = del_Pi->t.a; + ListEdges[3*i+2].num = i; + } + else { + ListEdges[3*i+2].from = del_Pi->t.a; + ListEdges[3*i+2].to = del_Pi->t.c; + ListEdges[3*i+2].num = i; + } + + } + + qsort(ListEdges,3*NumDelaunay,sizeof(edge),compareEdge); + + i=0; + + do { + + if ( (ListEdges[i].from == ListEdges[i+1].from) && + (ListEdges[i].to == ListEdges[i+1].to)){ /* create link */ + + del_Pi = *(Delaunay**)List_Pointer(ListDelaunay, ListEdges[i].num); + del_Pj = *(Delaunay**)List_Pointer(ListDelaunay, ListEdges[i+1].num); + + if ( ( del_Pi->t.position != EXTERN ) && + ( del_Pj->t.position != EXTERN ) && + ( (del_Pj->t.info == TOLINK ) || + (del_Pi->t.info == TOLINK ) ) ) { + + if (del_Pi->v.voisin1 == NULL) + del_Pi->v.voisin1 = del_Pj; + else if (del_Pi->v.voisin2 == NULL) + del_Pi->v.voisin2 = del_Pj; + else if (del_Pi->v.voisin3 == NULL) + del_Pi->v.voisin3 = del_Pj; + else { + Msg(ERROR, "Bad Link"); + exit(1); + } + + if (del_Pj->v.voisin1 == NULL) + del_Pj->v.voisin1 = del_Pi; + else if (del_Pj->v.voisin2 == NULL) + del_Pj->v.voisin2 = del_Pi; + else if (del_Pj->v.voisin3 == NULL) + del_Pj->v.voisin3 = del_Pi; + else { + Msg(ERROR, "Bad Link"); + exit(1); + } + } + i+=2; + } + else + i++; + } while ( i < 3*NumDelaunay ); + + Free(ListEdges); + + for(i=0 ; i<NumDelaunay ;i++){ + del_Pi = *(Delaunay**)List_Pointer(ListDelaunay, i); + + if(del_Pi->t.position != EXTERN){ + pt.h = del_Pi->t.xc; + pt.v = del_Pi->t.yc; + + if(!PtInTriangle(pt, del_Pi->t.a, del_Pi->t.b, + del_Pi->t.c)){ + if(!Find_Triangle(pt,FGMESH,A_TOUT_PRIX)){ + if(LocalNewPoint == VORONOI_INSERT) { + del_Pi->t.position = ACCEPTED; + } + del_Pi->t.quality_value /= 1000.; + } + } + } + } + + if((LocalNewPoint == VORONOI_INSERT)){ + for(i=0 ; i<NumDelaunay ;i++){ + del_Pi = *(Delaunay**)List_Pointer(ListDelaunay, i); + if( ((del_Pi->t.position == NONACCEPTED ) || (del_Pi->t.position == INTERN )) && + (del_Pi->t.info == TOLINK )){ + if ((del_Pi->v.voisin1 == NULL) || + (del_Pi->v.voisin2 == NULL) || + (del_Pi->v.voisin3 == NULL)){ + del_Pi->t.position = ACTIF; + } + else if ((del_Pi->v.voisin1->t.position == ACCEPTED) && + (del_Pi->v.voisin2->t.position == ACCEPTED) && + (del_Pi->v.voisin3->t.position == ACCEPTED)){ + del_Pi->t.position = ACCEPTED; + } + else if ((del_Pi->v.voisin1->t.position == ACCEPTED) || + (del_Pi->v.voisin2->t.position == ACCEPTED) || + (del_Pi->v.voisin3->t.position == ACCEPTED)){ + del_Pi->t.position = ACTIF; + } + else { + del_Pi->t.position = WAITING; + } + } + } + } + + return(1); +} + diff --git a/Mesh/2D_Mesh.cpp b/Mesh/2D_Mesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ec0b1d00fc6d3c0e73f026e62ac25a0705e6ed1f --- /dev/null +++ b/Mesh/2D_Mesh.cpp @@ -0,0 +1,1115 @@ +/* + Maillage Delaunay d'une surface (Point insertion Technique) + + 3 types de maillages sont proposes + - Center of circum circle point insertion + - Voronoi Point Insertion (la meilleure en general) + - G Point insertion (intermediaire) + + Le maillage surfacique passe par la determination d'un plan + dont on minimise l'ecart au sens des moindes carres par rap- + port a la surface : + plan ax + bx + cz = 1 + tangeante = t = (a,b,c) +*/ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "Mesh.h" +#include "Create.h" +#include "2D_Mesh.h" +#include "Numeric.h" +#include "Context.h" + +extern Mesh *THEM; +extern Context_T CTX; +extern int CurrentNodeNumber, LocalNewPoint; +extern double LC, FACTEUR_MULTIPLICATIF; + +PointRecord *gPointArray; +DocRecord *BGMESH, *FGMESH; +double qual, newqual, L; +int is_3D = 0, UseBGMesh; + +static Surface *THESURFACE, *THESUPPORT; +static int DEBUG = 0; + +void ProjetteSurface (void *a, void *b){ + Vertex *v; + v = *(Vertex **) a; + + if (!v->ListCurves) + ProjectPointOnSurface (THESUPPORT, *v); +} + +void Projette_Plan_Moyen (void *a, void *b){ + Vertex *v = *(Vertex **) a; + Projette (v, THESURFACE->plan); +} + +void Projette_Inverse (void *a, void *b){ + Vertex *v = *(Vertex **) a; + Projette (v, THESURFACE->invplan); +} + +void Plan_Moyen (void *data, void *dum){ + int ix, iy, iz, i, j, N; + static List_T *points; + Curve *pC; + static int deb = 1; + double det, sys[3][3], b[3], res[3], mod, t1[3], t2[3], ex[3]; + double s2s[2][2], r2[2], X, Y, Z; + Vertex *v; + Surface **pS, *s; + + pS = (Surface **) data; + s = *pS; + + if (deb){ + points = List_Create (10, 10, sizeof (Vertex *)); + deb = 0; + } + + switch (s->Typ){ + case MSH_SURF_PLAN: + case MSH_SURF_TRIC: + case MSH_SURF_REGL: + case MSH_SURF_NURBS: + case MSH_SURF_TRIMMED: + for (i = 0; i < List_Nbr (s->s.Generatrices); i++){ + List_Read (s->s.Generatrices, i, &pC); + for (j = 0; j < List_Nbr (pC->Vertices); j++){ + List_Read (pC->Vertices, j, &v); + List_Add (points, &v); + Tree_Insert (s->Vertices, List_Pointer (pC->Vertices, j)); + } + } + break; + } + + N = List_Nbr (points); + + for (i = 0; i < 3; i++){ + b[i] = 0.0; + for (j = 0; j < 3; j++){ + sys[i][j] = 0.0; + } + } + + /* ax + by + cz = 1 */ + + ix = iy = iz = 0; + + for (i = 0; i < N; i++){ + List_Read (points, i, &v); + + if (!i){ + X = v->Pos.X; + Y = v->Pos.Y; + Z = v->Pos.Z; + } + else{ + if (X != v->Pos.X) + ix = 1; + if (Y != v->Pos.Y) + iy = 1; + if (Z != v->Pos.Z) + iz = 1; + } + + sys[0][0] += v->Pos.X * v->Pos.X; + sys[1][1] += v->Pos.Y * v->Pos.Y; + sys[2][2] += v->Pos.Z * v->Pos.Z; + sys[0][1] += v->Pos.X * v->Pos.Y; + sys[0][2] += v->Pos.X * v->Pos.Z; + sys[1][2] += v->Pos.Y * v->Pos.Z; + sys[2][1] = sys[1][2]; + sys[1][0] = sys[0][1]; + sys[2][0] = sys[0][2]; + b[0] += v->Pos.X; + b[1] += v->Pos.Y; + b[2] += v->Pos.Z; + } + + s->d = 1.0; + + /* x = X */ + + if (!ix){ + s->d = X; + res[0] = 1.; + res[1] = res[2] = 0.0; + if (DEBUG) + Msg(INFO, "Plan de type x = c"); + } + + /* y = Y */ + + else if (!iy){ + s->d = Y; + res[1] = 1.; + res[0] = res[2] = 0.0; + if (DEBUG) + Msg(INFO, "Plan de type y = c"); + } + + /* z = Z */ + + else if (!iz){ + s->d = Z; + res[2] = 1.; + res[1] = res[0] = 0.0; + } + + /* by + cz = -x */ + + else if (!sys3x3 (sys, b, res, &det)){ + s->d = 0.0; + s2s[0][0] = sys[1][1]; + s2s[0][1] = sys[1][2]; + s2s[1][0] = sys[1][2]; + s2s[1][1] = sys[2][2]; + b[0] = -sys[0][1]; + b[1] = -sys[0][2]; + if (sys2x2 (s2s, b, r2)){ + res[0] = 1.; + res[1] = r2[0]; + res[2] = r2[1]; + if (DEBUG) + Msg(INFO, "Plan de type by + cz = -x"); + } + + /* ax + cz = -y */ + + else{ + s->d = 0.0; + s2s[0][0] = sys[0][0]; + s2s[0][1] = sys[0][2]; + s2s[1][0] = sys[0][2]; + s2s[1][1] = sys[2][2]; + b[0] = -sys[0][1]; + b[1] = -sys[1][2]; + if (sys2x2 (s2s, b, r2)){ + res[0] = r2[0]; + res[1] = 1.; + res[2] = r2[1]; + if (DEBUG) + Msg(INFO, "Plan de type ax + cz = -y"); + } + + /* ax + by = -z */ + + else{ + s->d = 1.0; + s2s[0][0] = sys[0][0]; + s2s[0][1] = sys[0][1]; + s2s[1][0] = sys[0][1]; + s2s[1][1] = sys[1][1]; + b[0] = -sys[0][2]; + b[1] = -sys[1][2]; + if (sys2x2 (s2s, b, r2)){ + res[0] = r2[0]; + res[1] = r2[1]; + res[2] = 1.; + if (DEBUG) + Msg(INFO, "Plan de type ax + by = -z"); + } + else{ + Msg(ERROR, "Mean Plane"); + } + } + } + } + + s->a = res[0]; + s->b = res[1]; + s->c = res[2]; + mod = sqrt (res[0] * res[0] + res[1] * res[1] + res[2] * res[2]); + for (i = 0; i < 3; i++) + res[i] /= mod; + + /* L'axe n'est pas l'axe des x */ + + ex[0] = ex[1] = ex[2] = 0.0; + if(res[0] == 0.0) + ex[0] = 1.0; + else if(res[1] == 0.0) + ex[1] = 1.0; + else + ex[2] = 1.0; + + prodve (res, ex, t1); + + mod = sqrt (t1[0] * t1[0] + t1[1] * t1[1] + t1[2] * t1[2]); + for (i = 0; i < 3; i++) + t1[i] /= mod; + + prodve (t1, res, t2); + + mod = sqrt (t2[0] * t2[0] + t2[1] * t2[1] + t2[2] * t2[2]); + for (i = 0; i < 3; i++) + t2[i] /= mod; + + for (i = 0; i < 3; i++) + s->plan[0][i] = t1[i]; + for (i = 0; i < 3; i++) + s->plan[1][i] = t2[i]; + for (i = 0; i < 3; i++) + s->plan[2][i] = res[i]; + + if (DEBUG){ + Msg(INFO, "plan : (%g x + %g y + %g z = %g)", s->a, s->b, s->c, s->d); + Msg(INFO, "normale : (%g , %g , %g )", res[0], res[1], res[2]); + Msg(INFO, "t1 : (%g , %g , %g )", t1[0], t1[1], t1[2]); + Msg(INFO, "t2 : (%g , %g , %g )", t2[0], t2[1], t2[2]); + } + + /* Matrice orthogonale */ + + if (!iz){ + for (i = 0; i < 3; i++){ + for (j = 0; j < 3; j++){ + s->invplan[i][j] = (i == j) ? 1. : 0.; + s->plan[i][j] = (i == j) ? 1. : 0.; + } + } + } + else{ + for (i = 0; i < 3; i++){ + for (j = 0; j < 3; j++){ + s->invplan[i][j] = s->plan[j][i]; + } + } + } + List_Reset (points); +} + + +int Calcule_Contours (Surface * s){ + int i, j, ori, ORI; + Vertex *v, *first, *last; + List_T *l, *linv; + Curve *c; + double n[] = {0., 0., 1.}; + + l = List_Create (10, 10, sizeof (Vertex *)); + for (i = 0; i < List_Nbr (s->s.Generatrices); i++){ + List_Read (s->s.Generatrices, i, &c); + if (!List_Nbr (l)){ + List_Read (c->Vertices, 0, &first); + } + for (j = 1; j < List_Nbr (c->Vertices); j++){ + List_Read (c->Vertices, j, &v); + List_Add (l, &v); + if (j == List_Nbr (c->Vertices) - 1){ + last = v; + } + } + if (!compareVertex (&last, &first)){ + ori = Oriente (l, n); + + /* Le premier contour est oriente aire a droite + Les autes sont des trous orientes aire a gauche */ + + if (!List_Nbr (s->Contours)) + ORI = ori; + + if ((!List_Nbr (s->Contours) && !ori) || + (List_Nbr (s->Contours) && ori)){ + linv = List_Create (10, 10, sizeof (Vertex *)); + List_Invert (l, linv); + List_Delete (l); + l = linv; + } + List_Add (s->Contours, &l); + l = List_Create (10, 10, sizeof (Vertex *)); + } + } + return ORI; +} + + +void Calcule_Z (void *data, void *dum){ + Vertex **pv, *v; + double Z, U, V; + + pv = (Vertex **) data; + v = *pv; + if (v->Frozen || v->Num < 0) + return; + + XYtoUV (THESUPPORT, &v->Pos.X, &v->Pos.Y, &U, &V, &Z); + v->Pos.Z = Z; +} + +void Calcule_Z_Plan (void *data, void *dum){ + Vertex **pv, *v; + Vertex V; + + V.Pos.X = THESURFACE->a; + V.Pos.Y = THESURFACE->b; + V.Pos.Z = THESURFACE->c; + + Projette (&V, THESURFACE->plan); + + pv = (Vertex **) data; + v = *pv; + if (V.Pos.Z != 0.0) + v->Pos.Z = (THESURFACE->d - V.Pos.X * v->Pos.X - V.Pos.Y * v->Pos.Y) + / V.Pos.Z; + else + v->Pos.Z = 0.0; +} + + +void Add_In_Mesh (void *a, void *b){ + if (!Tree_Search (THEM->Vertices, a)) + Tree_Add (THEM->Vertices, a); +} + +void Freeze_Vertex (void *a, void *b){ + Vertex *pv; + pv = *(Vertex **) a; + pv->Freeze.X = pv->Pos.X; + pv->Freeze.Y = pv->Pos.Y; + pv->Freeze.Z = pv->Pos.Z; + pv->Frozen = 1; +} + +void deFreeze_Vertex (void *a, void *b){ + Vertex *pv; + pv = *(Vertex **) a; + if (!pv->Frozen) + return; + pv->Pos.X = pv->Freeze.X; + pv->Pos.Y = pv->Freeze.Y; + pv->Pos.Z = pv->Freeze.Z; + pv->Frozen = 0; +} + +void PutVertex_OnSurf (void *a, void *b){ + Vertex *pv; + pv = *(Vertex **) a; + if (!pv->ListSurf) + pv->ListSurf = List_Create (1, 1, sizeof (Surface *)); + List_Add (pv->ListSurf, &THESURFACE); +} + + +/* remplis la structure Delaunay d'un triangle cree */ + +Delaunay * testconv (avlptr * root, int *conv, DocRecord * ptr){ + + avlptr *proot; + double qual; + Delaunay *pdel; + + proot = root; + + pdel = NULL; + + *conv = 0; + if (*root == NULL) + *conv = 1; + else{ + pdel = findrightest (*proot, ptr); + qual = pdel->t.quality_value; + switch (LocalNewPoint){ + case CENTER_CIRCCIRC: + case BARYCENTER: + if (qual < CONV_VALUE) + *conv = 1; + break; + case VORONOI_INSERT: + if ((*root) == NULL) + *conv = 1; + break; + } + } + return (pdel); +} + + +int mesh_domain (ContourPeek * ListContours, int numcontours, + maillage * mai, int *numpoints, DocRecord * BGMesh, + int OnlyTheInitialMesh){ + List_T *kill_L, *del_L ; + MPoint pt; + DocRecord docm, *doc; + int conv,i,j,nump,numact,numlink,numkil,numaloc,numtri,numtrr,numtrwait; + Delaunay *del, *del_P, *deladd, **listdel; + PointNumero aa, bb, cc, a, b, c; + DListPeek list, p, q; + avlptr *root, *proot, *root_w, *root_acc; + double volume_old, volume_new; + + root = (avlptr *) Malloc (sizeof (avlptr)); + root_w = (avlptr *) Malloc (sizeof (avlptr)); + root_acc = (avlptr *) Malloc (sizeof (avlptr)); + + nump = 0; + for (i = 0; i < numcontours; i++) + nump += ListContours[i]->numpoints; + + /* creation du maillage initial grace au puissant algorithme "divide and conquer" */ + + doc = &docm; + FGMESH = &docm; + doc->points = (PointRecord *) Malloc ((nump + 100) * sizeof(PointRecord)); + gPointArray = doc->points; + + numaloc = nump; + doc->numPoints = nump; + doc->numTriangles = 0; + mai->numtriangles = 0; + mai->numpoints = 0; + + if (!numcontours){ + Msg(ERROR, "No Contour"); + return 0; + } + + numact = 0; + for (i = 0; i < numcontours; i++){ + for (j = 0; j < ListContours[i]->numpoints; j++){ + doc->points[numact + j].where.h = + ListContours[i]->oriented_points[j].where.h + + ListContours[i]->perturbations[j].h; + doc->points[numact + j].where.v = + ListContours[i]->oriented_points[j].where.v + + ListContours[i]->perturbations[j].v; + doc->points[numact + j].quality = + ListContours[i]->oriented_points[j].quality; + doc->points[numact + j].initial = + ListContours[i]->oriented_points[j].initial; + ListContours[i]->oriented_points[j].permu = numact + j; + doc->points[numact + j].permu = numact + j; + doc->points[numact + j].numcontour = ListContours[i]->numerocontour; + doc->points[numact + j].adjacent = NULL; + } + numact += ListContours[i]->numpoints; + } + + DelaunayAndVoronoi (doc); + Conversion (doc); + remove_all_dlist (doc->numPoints, doc->points); + + if (!is_3D){ + if (UseBGMesh == 1) + BGMESH = BGMesh; + else{ + BGMESH = doc; + InitBricks (BGMESH); + } + } + + /* elimination des triangles exterieurs + verification de l'existence + des edges (coherence) */ + + makepermut (nump); + del_L = List_Create(doc->numTriangles, 1000, sizeof(Delaunay*)); + + for(i= 0;i<doc->numTriangles;i++){ + del_P = &doc->delaunay[i] ; + List_Add(del_L, &del_P); + } + + verify_edges (del_L, ListContours, numcontours, doc->numTriangles); + verify_inside (doc->delaunay, doc->numTriangles); + + /* creation des liens ( triangles voisins ) */ + + CreateLinks (del_L, doc->numTriangles, ListContours, numcontours); + + /* initialisation de l'arbre */ + + (*root) = (*root_w) = (*root_acc) = NULL; + + if (doc->numTriangles == 1) + doc->delaunay[0].t.position = INTERN; + + for (i = 0; i < doc->numTriangles; i++){ + if (doc->delaunay[i].t.position != EXTERN){ + del = &doc->delaunay[i]; + switch (LocalNewPoint){ + case CENTER_CIRCCIRC: + case BARYCENTER: + Insert_Triangle (root, del); + break; + case VORONOI_INSERT: + switch (del->t.position){ + case ACTIF: + case INTERN: + Insert_Triangle (root, del); + break; + case WAITING: + Insert_Triangle (root_w, del); + break; + case ACCEPTED: + Insert_Triangle (root_acc, del); + break; + } + } + } + } + + + /* maillage proprement dit : + 1) Les triangles sont tries dans l'arbre suivant leur qualite + 2) on ajoute un noeud au c.g du plus mauvais + 3) on reconstruit le delaunay par Bowyer-Watson + 4) on ajoute les triangles dans l'arbre et on recommence + jusque quand tous les triangles sont OK */ + + del = testconv (root, &conv, doc); + + PushgPointArray (doc->points); + + List_Reset(del_L); + kill_L = List_Create(1000, 1000, sizeof(Delaunay*)); + + if (OnlyTheInitialMesh) + conv = 1; + + while (conv != 1){ + + pt = Localize (del, doc); + + numlink = 0; + numkil = 0; + list = NULL; + + if (!PE_Del_Triangle (del, pt, &list, kill_L, del_L, &numlink, &numkil)){ + Msg(WARNING, "Triangle Non Delete"); + Delete_Triangle (root, del); + Delete_Triangle (root_w, del); + del->t.quality_value /= 10.; + switch (LocalNewPoint){ + case CENTER_CIRCCIRC: + case BARYCENTER: + Insert_Triangle (root, del); + break; + case VORONOI_INSERT: + del->t.position = ACCEPTED; + Insert_Triangle (root_acc, del); + break; + } + + numlink = numkil = 0; + if (list != NULL){ + p = list; + do{ + q = p; + p = Pred (p); + Free (q); + } + while (p != list); + } + list = NULL; + del = testconv (root, &conv, doc); + continue; + } + + /* Test du Volume */ + + i = 0; + p = list; + volume_new = 0.0; + do{ + q = p->next; + bb = p->point_num; + cc = q->point_num; + volume_new += fabs ((doc->points[bb].where.h - pt.h) * + (doc->points[cc].where.v - doc->points[bb].where.v) - + (doc->points[cc].where.h - doc->points[bb].where.h) * + (doc->points[bb].where.v - pt.v)); + p = q; + } while (p != list); + + volume_old = 0.0; + for (i = 0; i < numkil; i++){ + del_P = *(Delaunay**)List_Pointer(kill_L, i); + aa = del_P->t.a; + bb = del_P->t.b; + cc = del_P->t.c; + volume_old += fabs ((doc->points[bb].where.h - doc->points[aa].where.h) * + (doc->points[cc].where.v - doc->points[bb].where.v) - + (doc->points[cc].where.h - doc->points[bb].where.h) * + (doc->points[bb].where.v - doc->points[aa].where.v)); + } + + if ((volume_old - volume_new) / (volume_old + volume_new) > 1.e-6){ + Msg(WARNING, "Volume has changed : %g -> %g", volume_old, volume_new); + Delete_Triangle (root, del); + Delete_Triangle (root_w, del); + del->t.quality_value /= 10.; + switch (LocalNewPoint){ + case CENTER_CIRCCIRC: + case BARYCENTER: + Insert_Triangle (root, del); + break; + case VORONOI_INSERT: + del->t.position = ACCEPTED; + Insert_Triangle (root_acc, del); + break; + } + + numlink = numkil = 0; + if (list != NULL){ + p = list; + do{ + q = p; + p = Pred (p); + Free (q); + } while (p != list); + } + list = NULL; + del = testconv (root, &conv, doc); + continue; + } + + /* Fin test du volume */ + + for (i = 0; i < numkil; i++){ + del_P = *(Delaunay**)List_Pointer(kill_L, i); + + switch (LocalNewPoint){ + case CENTER_CIRCCIRC: + case BARYCENTER: + Delete_Triangle (root, del_P); + break; + case VORONOI_INSERT: + switch (del_P->t.position){ + case WAITING: + Delete_Triangle (root_w, del_P); + break; + case ACTIF: + case INTERN: + Delete_Triangle (root, del_P); + break; + case ACCEPTED: + Delete_Triangle (root_acc, del_P); + break; + } + } + } + + *numpoints = doc->numPoints; + Insert_Point (pt, numpoints, &numaloc, doc, BGMESH, is_3D); + doc->points = gPointArray; + doc->numPoints = *numpoints; + + i = 0; + p = list; + + do{ + q = p->next; + + aa = doc->numPoints - 1; + bb = p->point_num; + cc = q->point_num; + + deladd = (Delaunay *) Malloc (sizeof (Delaunay)); + + filldel (deladd, aa, bb, cc, doc->points, BGMESH); + + List_Put(del_L, numlink+i, &deladd); + i++; + p = q; + + } while (p != list); + + p = list; + + do{ + q = p; + p = Pred (p); + Free (q); + } while (p != list); + + CreateLinks (del_L, i + numlink, ListContours, numcontours); + + for (j = 0; j < i; j++){ + del_P = *(Delaunay**)List_Pointer(del_L, j+numlink) ; + switch (LocalNewPoint) { + case CENTER_CIRCCIRC: + case BARYCENTER: + Insert_Triangle (root, del_P); + break; + case VORONOI_INSERT: + switch (del_P->t.position){ + case ACTIF: + case INTERN: + Insert_Triangle (root, del_P); + break; + case WAITING: + Insert_Triangle (root_w, del_P); + break; + case ACCEPTED: + Insert_Triangle (root_acc, del_P); + break; + } + } + } + + del = testconv (root, &conv, doc); + + } + + numtri = 0; + numtrwait = 0; + + if (*root_w != NULL){ + proot = root_w; + avltree_count (*proot, &numtrwait); + } + + numtrr = 0; + + proot = root; + switch (LocalNewPoint){ + case VORONOI_INSERT: + proot = root_acc; + break; + } + avltree_count (*proot, &numtrr); + + alloue_Mai_Del (mai, numtrr + numtrwait + 1, 100); + + listdel = mai->listdel; + numtri = 0; + avltree_print(*proot,listdel,&numtri); + if(numtrwait != 0){ + numtri = 0; + avltree_print(*root_w,(Delaunay**)del_L->array,&numtri); + for(i=0;i<numtrwait;i++){ + mai->listdel[i+numtrr] = *(Delaunay**)List_Pointer(del_L, i); + } + avltree_remove(root_w); + } + avltree_remove(root); + + List_Delete(del_L); + + mai->numtriangles = numtrr + numtrwait; + mai->numpoints = doc->numPoints; + mai->points = doc->points; + + /* Tous Les Triangles doivent etre orientes */ + + if (!mai->numtriangles) + mai->numtriangles = 1; + + for (i = 0; i < mai->numtriangles; i++){ + a = mai->listdel[i]->t.a; + b = mai->listdel[i]->t.b; + c = mai->listdel[i]->t.c; + + mai->listdel[i]->v.voisin1 = NULL; + if (((doc->points[b].where.h - doc->points[a].where.h) * + (doc->points[c].where.v - doc->points[b].where.v) - + (doc->points[c].where.h - doc->points[b].where.h) * + (doc->points[b].where.v - doc->points[a].where.v)) > 0.0){ + mai->listdel[i]->t.a = b; + mai->listdel[i]->t.b = a; + } + } + return 1; +} + +void Maillage_Automatique_VieuxCode (Surface * pS, Mesh * m, int ori){ + ContourRecord *cp, **liste; + List_T *c; + Vertex *v, V[3], *ver[3], **pp[3]; + maillage M; + int err, i, j, k, N, a, b, d; + Simplex *s; + + if (m->BGM.Typ == WITHPOINTS){ + is_3D = 0; + UseBGMesh = 0; + } + else{ + is_3D = 1; + } + + liste = (ContourPeek *) Malloc (List_Nbr (pS->Contours) * sizeof (ContourPeek)); + + k = 0; + + for (i = 0; i < List_Nbr (pS->Contours); i++){ + cp = (ContourRecord *) Malloc (sizeof (ContourRecord)); + List_Read (pS->Contours, i, &c); + cp->oriented_points = (PointRecord *) Malloc (List_Nbr (c) * sizeof (PointRecord)); + cp->perturbations = (MPoint *) Malloc (List_Nbr (c) * sizeof (MPoint)); + cp->numerocontour = i; + for (j = 0; j < List_Nbr (c); j++){ + List_Read (c, j, &v); + cp->oriented_points[j].where.h = v->Pos.X; + cp->oriented_points[j].where.v = v->Pos.Y; + + cp->perturbations[j].h = RAND_LONG; + cp->perturbations[j].v = RAND_LONG; + cp->oriented_points[j].numcontour = i; + cp->oriented_points[j].quality = v->lc; + cp->oriented_points[j].permu = k++; + cp->oriented_points[j].initial = v->Num; + } + cp->numpoints = List_Nbr (c); + liste[i] = cp; + } + + if (pS->Method){ + /* lets force this, since it's the only one that works... */ + LocalNewPoint = CENTER_CIRCCIRC; + mesh_domain (liste, List_Nbr (pS->Contours), &M, &N, NULL, 0); + } + + for (i = 0; i < M.numpoints; i++){ + if (gPointArray[i].initial < 0){ + gPointArray[i].initial = ++CurrentNodeNumber; + v = Create_Vertex (gPointArray[i].initial, gPointArray[i].where.h, + gPointArray[i].where.v, 0.0, gPointArray[i].quality, 0.0); + if (!Tree_Search (pS->Vertices, &v)) + Tree_Add (pS->Vertices, &v); + } + } + for (i = 0; i < 3; i++) + ver[i] = &V[i]; + + for (i = 0; i < M.numtriangles; i++){ + + a = M.listdel[i]->t.a; + b = M.listdel[i]->t.b; + d = M.listdel[i]->t.c; + + ver[0]->Num = gPointArray[a].initial; + ver[1]->Num = gPointArray[b].initial; + ver[2]->Num = gPointArray[d].initial; + err = 0; + for (j = 0; j < 3; j++){ + if ((pp[j] = (Vertex **) Tree_PQuery (pS->Vertices, &ver[j]))){ + } + else{ + err = 1; + Msg(ERROR, "Unknown Vertex %d\n", ver[j]->Num); + } + } + if (ori && !err) + s = Create_Simplex (*pp[0], *pp[1], *pp[2], NULL); + else if (!err) + s = Create_Simplex (*pp[0], *pp[2], *pp[1], NULL); + if (!err){ + s->iEnt = pS->Num; + Tree_Insert (pS->Simplexes, &s); + } + } + Free (gPointArray); +} + + +void Make_Mesh_With_Points (DocRecord * ptr, PointRecord * Liste, int Numpoints){ + ptr->numTriangles = 0; + ptr->points = Liste; + ptr->numPoints = Numpoints; + DelaunayAndVoronoi (ptr); + Conversion (ptr); + remove_all_dlist (ptr->numPoints, ptr->points); +} + +void filldel (Delaunay * deladd, int aa, int bb, int cc, + PointRecord * points, DocRecord * mesh){ + + double newqual, L; + MPoint pt2, pt4; + Vertex *v, *dum; + + deladd->t.a = aa; + deladd->t.b = bb; + deladd->t.c = cc; + deladd->t.info = TOLINK; + deladd->t.info2 = 0; + deladd->v.voisin1 = NULL; + deladd->v.voisin2 = NULL; + deladd->v.voisin3 = NULL; + + CircumCircle (points[aa].where.h, + points[aa].where.v, + points[bb].where.h, + points[bb].where.v, + points[cc].where.h, + points[cc].where.v, + &deladd->t.xc, + &deladd->t.yc); + + pt2.h = deladd->t.xc; + pt2.v = deladd->t.yc; + if (!is_3D){ + if (mesh){ + newqual = FACTEUR_MULTIPLICATIF * find_quality (pt2, mesh); + } + else{ + newqual = (points[aa].quality + points[bb].quality + points[cc].quality) / 3.; + } + v = Create_Vertex (-1, pt2.h, pt2.v, 0.0, 0.0, 0.0); + Calcule_Z_Plan (&v, &dum); + Projette_Inverse (&v, &dum); + Free (v); + } + else{ + v = Create_Vertex (-1, pt2.h, pt2.v, 0.0, 0.0, 0.0); + Calcule_Z_Plan (&v, &dum); + Projette_Inverse (&v, &dum); + newqual = Lc_XYZ (v->Pos.X, v->Pos.Y, v->Pos.Z, THEM); + Free (v); + } + + switch (LocalNewPoint){ + case CENTER_CIRCCIRC: + case BARYCENTER: + deladd->t.quality_value = + sqrt ((deladd->t.xc - points[cc].where.h) * (deladd->t.xc - points[cc].where.h) + + (deladd->t.yc - points[cc].where.v) * (deladd->t.yc - points[cc].where.v) + ) / newqual; + deladd->t.position = INTERN; + break; + + case VORONOI_INSERT: + pt4.h = points[bb].where.h; + pt4.v = points[bb].where.v; + //pt3.h = .5 * (points[bb].where.h + points[cc].where.h); + //pt3.v = .5 * (points[bb].where.v + points[cc].where.v); + deladd->t.quality_value = myhypot (pt2.h - pt4.h, pt2.v - pt4.v); + L = newqual / deladd->t.quality_value; + if (L > 1.5) + deladd->t.position = ACCEPTED; + else + deladd->t.position = NONACCEPTED; + break; + } +} + +void ActionEndTheCurve (void *a, void *b){ + Curve *c = *(Curve **) a; + End_Curve (c); +} + +int MeshParametricSurface (Surface * s); +int Extrude_Mesh (Surface * s); + +void Maillage_Surface (void *data, void *dum){ + Surface **pS, *s; + Tree_T *tnxe; + int ori; + + pS = (Surface **) data; + s = *pS; + + if (!s->Support) + return; + + THESUPPORT = s->Support; + THESURFACE = s; + + if (Tree_Nbr (s->Simplexes)) + Tree_Delete (s->Simplexes); + s->Simplexes = Tree_Create (sizeof (Simplex *), compareQuality); + if (Tree_Nbr (s->Vertices)) + Tree_Delete (s->Vertices); + s->Vertices = Tree_Create (sizeof (Vertex *), compareVertex); + + Msg(STATUS, "Meshing Surface %d", s->Num); + + if (MeshTransfiniteSurface (s) || + MeshEllipticSurface (s) || + MeshCylindricalSurface (s) || + MeshParametricSurface (s) || + Extrude_Mesh (s)){ + Tree_Action (THEM->Points, PutVertex_OnSurf); + Tree_Action (s->Vertices, PutVertex_OnSurf); + Tree_Action (s->Vertices, Add_In_Mesh); + if (CTX.mesh.degree == 2) + Degre2 (THEM->Vertices, s->Vertices, s->Simplexes, NULL, s); + THEM->Statistics[5] += Tree_Nbr (THESURFACE->Vertices); + THEM->Statistics[7] += Tree_Nbr (THESURFACE->Simplexes); + + /* void TRIE_MON_GARS(void *a, void *b); + Tree_Action (THES->Simplexes, TRIE_MON_GARS); + Link_Simplexes(NULL, THES->Simplexes); + void constraint_the_edge (int ,int ,int); + constraint_the_edge (6, 45, 85); + */ + return; + } + + int TypSurface = s->Typ; + s->Typ = MSH_SURF_PLAN; + Plan_Moyen (pS, dum); + + Tree_Action (THEM->Points, Freeze_Vertex); + Tree_Action (s->Vertices, Freeze_Vertex); + Tree_Action (THEM->Points, Projette_Plan_Moyen); + Tree_Action (s->Vertices, Projette_Plan_Moyen); + Tree_Action (THEM->Curves, ActionEndTheCurve); + + End_Surface (s); + + ori = Calcule_Contours (s); + + if (CTX.mesh.algo == DELAUNAY_OLDALGO) + Maillage_Automatique_VieuxCode (s, THEM, ori); + else + AlgorithmeMaillage2DAnisotropeModeJF (s); + + if(CTX.mesh.nb_smoothing){ + Msg(STATUS, "Mesh Smoothing"); + tnxe = Tree_Create (sizeof (NXE), compareNXE); + create_NXE (s->Vertices, s->Simplexes, tnxe); + for (int i = 0; i < CTX.mesh.nb_smoothing; i++) + Tree_Action (tnxe, ActionLiss); + Tree_Delete (tnxe); + } + + if (s->Recombine) + Recombine (s->Vertices, s->Simplexes, s->RecombineAngle); + + s->Typ = TypSurface; + + if (s->Typ != MSH_SURF_PLAN){ + if (s->Extrude) + s->Extrude->Rotate (s->plan); + Tree_Action (s->Vertices, Calcule_Z); + if (s->Extrude) + s->Extrude->Rotate (s->invplan); + } + else + Tree_Action (s->Vertices, Calcule_Z_Plan); + + Tree_Action (s->Vertices, Projette_Inverse); + Tree_Action (THEM->Points, Projette_Inverse); + + Tree_Action (THEM->Points, deFreeze_Vertex); + Tree_Action (s->Vertices, deFreeze_Vertex); + + Tree_Action (THEM->Points, PutVertex_OnSurf); + Tree_Action (s->Vertices, PutVertex_OnSurf); + Tree_Action (s->Vertices, Add_In_Mesh); + + Tree_Action (THEM->Curves, ActionEndTheCurve); + End_Surface (s->Support); + End_Surface (s); + + if (DEBUG){ + Msg (INFO, "Nombre de triangles : %d", Tree_Nbr(s->Simplexes)); + Msg (INFO, "Nombre de points : %d", Tree_Nbr(s->Vertices)); + } + + if (CTX.mesh.degree == 2) + Degre2 (THEM->Vertices, THEM->VertexEdges, s->Simplexes, NULL, THESUPPORT); + + THEM->Statistics[5] += Tree_Nbr (THESURFACE->Vertices); + THEM->Statistics[7] += Tree_Nbr (THESURFACE->Simplexes); + +} diff --git a/Mesh/2D_Mesh.h b/Mesh/2D_Mesh.h new file mode 100644 index 0000000000000000000000000000000000000000..04cf95bea6c131c1805d7f14fa41e08c40450be2 --- /dev/null +++ b/Mesh/2D_Mesh.h @@ -0,0 +1,75 @@ +#ifndef _2D_MESH_H_ +#define _2D_MESH_H_ + +typedef struct avl{ + void *treedata; + int balance; + struct avl *left; + struct avl *right; +}avlstruct; + +typedef avlstruct *avlptr; + +int remove_tree (avlstruct ** root); +int insert_avltree (avlstruct ** root, void *item, + int (*fcmp)(void *a, void *b)); +int delete_avltree (avlstruct ** root, void *item, + int (*fcmp)(void *a, void *b)); +int avltree_remove (avlstruct **root); +void avltree_count (avlptr root, int *numtri); +void avltree_print (avlptr root, Delaunay **listdel, int *numtri); +int avltree_insert (avlstruct **root, void *item, + int (*fcmp)(void *a, void *b)); +int avltree_delete (avlstruct **root, void *item, + int (*fcmp)(void *a, void *b)); + +PointNumero Successor(PointNumero a,PointNumero b); + + +int Insert_Triangle (avlstruct **root, Delaunay * del); +int Delete_Triangle ( avlstruct **root, Delaunay * del ); +int Insert_Point (MPoint pt, int *numpoints, int *numalloc, + DocRecord *doc, DocRecord *BGM, int is3d); + +void findtree(avlptr root, double *qualm, Delaunay **delf, DocRecord *MESH); +Delaunay *findrightest(avlptr root, DocRecord *MESH); +MPoint Localize (Delaunay * del , DocRecord *MESH); +void alloue_Mai_Pts(maillage *mai , int Nballoc , int incrAlloc); +void alloue_Mai_Del(maillage *mai , int Nballoc , int incrAlloc); + +void InitBricks (DocRecord *MESH); +Delaunay * Find_Triangle (MPoint pt, DocRecord *MESH, int typ); +int PtInTriangle(MPoint p , PointNumero a , PointNumero b , PointNumero c); +int DelaunayAndVoronoi(DocPeek doc); + +int Conversion(DocPeek doc ); +int CreateLinks(List_T * ListDelaunay , int NumDelaunay, + ContourRecord **ListContours , int Nc); + +void makepermut (int numpoints); +void verify_edges (List_T *ListDelaunay, ContourRecord **ListContour, + int NumContours , int NumDelaunay); +void verify_inside (Delaunay * ListDelaunay , int NumDelaunay ); + +void PushgPointArray(PointRecord *ptr); +void remove_all_dlist(int n, PointRecord *pPointArray); + +int PE_Del_Triangle (Delaunay *del , MPoint pt, DListPeek *ListEdges , + List_T *listkill, List_T *listDelforlink, + int *numlink, int *numdel); + +void filldel (Delaunay * deladd, int aa, int bb, int cc, + PointRecord * points, DocRecord * mesh); + +int CircumCircle(double x1,double y1,double x2,double y2,double x3,double y3, + double *xc,double *yc); +double find_quality (MPoint center, DocRecord * BGMESH); +void create_NXE (Tree_T * TreeAllNod, Tree_T * TreeAllElg, + Tree_T * TreeAllNXE); + +int Is_left_of(PointNumero x,PointNumero y,PointNumero check); +int Is_right_of(PointNumero x,PointNumero y,PointNumero check); +int DListInsert(DListRecord **dlist, MPoint center, PointNumero newPoint); +int DListDelete(DListPeek *dlist,PointNumero oldPoint); + +#endif diff --git a/Mesh/2D_Mesh_Aniso.cpp b/Mesh/2D_Mesh_Aniso.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cc0e5435a3160ee1c3e50680f632d259c90d075a --- /dev/null +++ b/Mesh/2D_Mesh_Aniso.cpp @@ -0,0 +1,1119 @@ +/* + Jean-Francois Remacle + + Maillage Delaunay 2-D Anisotrope + Tres joli (a mon avis) +*/ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "Mesh.h" +#include "Interpolation.h" +#include "Create.h" +#include "Context.h" +#include "Numeric.h" + +extern Context_T CTX ; + +void draw_polygon_2d (double r, double g, double b, int n, double *x, double *y, double *z); + +MeshParameters:: MeshParameters (): + NbSmoothing (3), + DelaunayAlgorithm (DELAUNAY_NEWALGO), + DelaunayInsertionMethod (INSERTION_CENTROID), + DelaunayQuality (QUALITY_EDGES_BASED), + DelaunayKernel (DELAUNAY_KERANISO), + InteractiveDelaunay (false) +{ +} + +extern Simplex MyNewBoundary; +extern Mesh *THEM; +extern int SPEED_MAX; +extern int CurrentNodeNumber; +extern double MAXIMUM_LC_FOR_SURFACE, LC, FACTEUR_MULTIPLICATIF; +extern int Alerte_Point_Scabreux; +extern PointRecord *gPointArray; +extern Surface *PARAMETRIC; + +static Tree_T *Tsd, *Sim_Sur_Le_Bord /*,*POINTS_TREE */ ; +static List_T *Simplexes_Destroyed, *Simplexes_New, *Suppress; +static Simplex *THES; +static Vertex *THEV; +static Surface *SURF; +static Tree_T *FacesTree; +static int ZONEELIMINEE, Methode = 0; +static double volume; +static List_T *coquille; +static Edge *THEEDGE; + +extern void Make_Mesh_With_Points (DocRecord * ptr, PointRecord * Liste, int Numpoints); + +double Interpole_lcTriangle (Simplex * s, Vertex * vv){ + double Xp, Yp, X[3], Y[3], det, u, v, q1, q2, q3; + + Xp = vv->Pos.X; + Yp = vv->Pos.Y; + + X[0] = s->V[0]->Pos.X; + X[1] = s->V[1]->Pos.X; + X[2] = s->V[2]->Pos.X; + + Y[0] = s->V[0]->Pos.Y; + Y[1] = s->V[1]->Pos.Y; + Y[2] = s->V[2]->Pos.Y; + + q1 = s->V[0]->lc; + q2 = s->V[1]->lc; + q3 = s->V[2]->lc; + + det = (X[2] - X[0]) * (Y[1] - Y[0]) - (Y[2] - Y[0]) * (X[1] - X[0]); + + if (det != 0.0){ + u = ((Xp - X[0]) * (Y[1] - Y[0]) - (Yp - Y[0]) * (X[1] - X[0])) / det; + v = ((X[2] - X[0]) * (Yp - Y[0]) - (Y[2] - Y[0]) * (Xp - X[0])) / det; + } + else{ + u = v = 0.0; + } + return (q1 * (1. - u - v) + q2 * v + q3 * u); +} + + +/* Au sens Riemannien, trouver le centre de l'ellipse + triangle de sommets (x1,x2,x3) + + T T + (x-x1) M (x-x1) = (x-x2) M (x-x2) + T T + (x-x1) M (x-x1) = (x-x3) M (x-x3) + */ + +void matXmat (int n, double mat1[3][3], double mat2[3][3], double Res[3][3]){ + for (int i = 0; i < n; i++){ + for (int j = 0; j < n; j++){ + Res[i][j] = 0.0; + for (int k = 0; k < n; k++) + Res[i][j] += mat1[i][k] * mat2[k][j]; + } + } +} + +void TmatXmat (int n, double mat1[3][3], double mat2[3][3], double Res[3][3]){ + for (int i = 0; i < n; i++){ + for (int j = 0; j < n; j++){ + Res[i][j] = 0.0; + for (int k = 0; k < n; k++) + Res[i][j] += mat1[k][i] * mat2[k][j]; + } + } +} + +Simplex * Create_Simplex_For2dmesh (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4){ + Simplex *s; + double p12, p23, p13; + + s = Create_Simplex (v1, v2, v3, v4); + + THEM->Metric->setSimplexQuality (s, PARAMETRIC); + + if (PARAMETRIC){ + if ((!v2->ListCurves && !v3->ListCurves && !v3->ListCurves)){ + prosca (v1->us, v2->us, &p12); + p12 = fabs (p12); + prosca (v1->us, v3->us, &p13); + p13 = fabs (p13); + prosca (v2->us, v3->us, &p23); + p23 = fabs (p23); + if (s->Quality < CONV_VALUE && + (p12 < THEM->Metric->min_cos || p13 < THEM->Metric->min_cos || + p23 < THEM->Metric->min_cos)) + s->Quality = 1.0; + } + } + return s; +} + +/*En l'honneur de ma femme Stephanie... */ + +void VSIM_2D (void *a, void *b){ + Simplex *S; + + S = *(Simplex **) a; + if (S->V[2]) + volume += fabs (S->Volume_Simplexe2D ()); +} + +void Box_2_Triangles (List_T * P, Surface * s){ +#define FACT 1.1 +#define LOIN 0.2 + + int i, j; + static int pts[4][2] = { {0, 0}, + {1, 0}, + {1, 1}, + {0, 1} }; + static int tri[2][3] = { {1, 4, 2}, + {2, 4, 3} }; + double Xm, Ym, XM, YM, Xc, Yc; + Simplex *S, *ps; + Vertex *V, *v, *pv; + List_T *smp; + + smp = List_Create (2, 1, sizeof (Simplex *)); + + V = (Vertex *) Malloc (4 * sizeof (Vertex)); + + for (i = 0; i < List_Nbr (P); i++){ + List_Read (P, i, &v); + if (!i){ + Xm = XM = v->Pos.X; + Ym = YM = v->Pos.Y; + } + else{ + Xm = DMIN (Xm, v->Pos.X); + XM = DMAX (XM, v->Pos.X); + Ym = DMIN (Ym, v->Pos.Y); + YM = DMAX (YM, v->Pos.Y); + } + } + if (Xm == XM) + XM = Xm + 1.; + if (Ym == YM) + YM = Ym + 1.; + + Xc = XM - Xm; + Yc = YM - Ym; + + /* initialisation de la grille */ + + s->Grid.init = 0; + s->Grid.min.X = Xm - LOIN * FACT * Xc; + s->Grid.min.Y = Ym - LOIN * FACT * Yc; + s->Grid.max.X = XM + LOIN * FACT * Xc; + s->Grid.max.Y = YM + LOIN * FACT * Yc; + + s->Grid.Nx = s->Grid.Ny = 20; + + /* Longueur Caracteristique */ + + LC = sqrt (Xc * Xc + Yc * Yc); + + for (i = 0; i < 4; i++){ + if (pts[i][0]) + V[i].Freeze.X = V[i].Pos.X = Xm - LOIN * Xc; + else + V[i].Freeze.X = V[i].Pos.X = XM + LOIN * Xc; + if (pts[i][1]) + V[i].Freeze.Y = V[i].Pos.Y = Ym - LOIN * Yc; + else + V[i].Freeze.Y = V[i].Pos.Y = YM + LOIN * Yc; + + V[i].Freeze.Z = V[i].Pos.Z = 0.0; + + V[i].Num = -(++CurrentNodeNumber); + V[i].ListSurf = NULL; + pv = &V[i]; + pv->lc = 1.0; + pv->Mov = NULL; + Tree_Replace (s->Vertices, &pv); + } + + /* 2 Triangles forment le maillage de la boite */ + + for (i = 0; i < 2; i++){ + S = Create_Simplex_For2dmesh (&V[tri[i][0] - 1], &V[tri[i][1] - 1], + &V[tri[i][2] - 1], NULL); + List_Add (smp, &S); + S->iEnt = s->Num; + } + + Link_Simplexes (smp, NULL); + for (i = 0; i < List_Nbr (smp); i++){ + List_Read (smp, i, &ps); + for (j = 0; j < 3; j++) + if (ps->S[j] == NULL) + ps->S[j] = &MyNewBoundary; + Tree_Replace (s->Simplexes, &ps); + } +} + + +int Intersect_Edges_2d (Edge * a, Edge * b){ + double mat[2][2]; + double rhs[2], x[2]; + mat[0][0] = (a->V[1]->Pos.X - a->V[0]->Pos.X); + mat[0][1] = -(b->V[1]->Pos.X - b->V[0]->Pos.X); + mat[1][0] = (a->V[1]->Pos.Y - a->V[0]->Pos.Y); + mat[1][1] = -(b->V[1]->Pos.Y - b->V[0]->Pos.Y); + rhs[0] = b->V[0]->Pos.X - a->V[0]->Pos.X; + rhs[1] = b->V[0]->Pos.Y - a->V[0]->Pos.Y; + if (!sys2x2 (mat, rhs, x)) + return 0; + if (x[0] > 0.0 && x[0] < 1.0 && x[1] > 0.0 && x[1] < 1.0) + return 1; + return 0; +} + +int compareedgeptr (const void *a, const void *b){ + int i1, i2, j1, j2; + Edge *q, *w; + + q = *(Edge **) a; + w = *(Edge **) b; + i1 = IMAX (q->V[0]->Num, q->V[1]->Num); + i2 = IMAX (w->V[0]->Num, w->V[1]->Num); + j1 = IMIN (q->V[0]->Num, q->V[1]->Num); + j2 = IMIN (w->V[0]->Num, w->V[1]->Num); + + if (i1 < i2) + return (1); + if (i1 > i2) + return (-1); + if (j1 < j2) + return (1); + if (j1 > j2) + return (-1); + return 0; +} + +void putaindecoquille_2D (void *a, void *b){ + Edge *e = (Edge *) a; + if (!compareVertex (&e->V[0], &THEEDGE->V[0]) || + !compareVertex (&e->V[0], &THEEDGE->V[1]) || + !compareVertex (&e->V[1], &THEEDGE->V[0]) || + !compareVertex (&e->V[1], &THEEDGE->V[1])){ + return; + } + if (Intersect_Edges_2d (e, THEEDGE)) + List_Add (coquille, &e); +} + +void Recover_Edge (Surface * s, Edge * e, EdgesContainer & Edges){ + THEEDGE = e; + int i; + Edge *me, E; + Vertex *v[2]; + + coquille = List_Create (3, 3, sizeof (Edge *)); + /*On cherche la coquille */ + Tree_Action (Edges.AllEdges, putaindecoquille_2D); + Msg(INFO, "edge (%d %d) %d intersect", + e->V[0]->Num, e->V[1]->Num, List_Nbr (coquille)); + + if(List_Nbr(coquille)==1){ + Msg(WARNING, "Unable to swap edge"); + List_Delete (coquille); + return; + } + + /*on swappe au hasard jusqu'a ce qu l'arete soit recuperee */ + while (List_Nbr(coquille)){ + + i = (int) (List_Nbr(coquille)*rand()/(RAND_MAX+1.0)); + //i = rand () % List_Nbr (coquille); + List_Read (coquille, i, &me); + v[0] = me->V[0]; + v[1] = me->V[1]; + List_Suppress (coquille, &me, compareedgeptr); + Edges.SwapEdge (v); + if (Edges.Search (e->V[0], e->V[1])) + break; + E.V[0] = v[0]; + E.V[1] = v[1]; + me = (Edge *) Tree_PQuery (Edges.AllEdges, &E); + putaindecoquille_2D (me, NULL); + } + + List_Delete (coquille); + /*On swappe */ +} + +Vertex * FindVertex2 (int inum, Mesh * M){ + Vertex C, *pc; + pc = &C; + pc->Num = inum; + if (Tree_Query (M->Vertices, &pc)){ + return pc; + } + return NULL; +} + +void constraint_the_edge (int isurf, int iv1, int iv2){ + Vertex *v1 = FindVertex2 (iv1, THEM); + Vertex *v2 = FindVertex2 (iv2, THEM); + Surface *s = FindSurface (isurf, THEM); + Edge e; + + if (!v1 || !v2) + return; + EdgesContainer EdgesOnSurface (s->Simplexes, false); + e.V[0] = v1; + e.V[1] = v2; + if (!EdgesOnSurface.Search (v1, v2)){ + Recover_Edge (s, &e, EdgesOnSurface); + } +} + +void missing_edges_2d (Surface * s){ + int i, j; + Curve *c; + Vertex *v1, *v2; + Edge e; + + EdgesContainer EdgesOnSurface (s->Simplexes, false); + + for (i = 0; i < List_Nbr (s->s.Generatrices); i++){ + List_Read (s->s.Generatrices, i, &c); + for (j = 1; j < List_Nbr (c->Vertices); j++){ + List_Read (c->Vertices, j - 1, &v1); + List_Read (c->Vertices, j, &v2); + e.V[0] = v1; + e.V[1] = v2; + if (!EdgesOnSurface.Search (v1, v2)) { + Msg(INFO, "Missing edge %d-%d", v1->Num, v2->Num); + Recover_Edge (s, &e, EdgesOnSurface); + } + } + } +} + +int Restore_Boundary (Surface * s){ + missing_edges_2d (s); + return 1; +} + +int Maillage_Edge (Vertex * v1, Vertex * v2, List_T * Points){ + int i; + static int qq = 1; + Simplex S, *s; + + s = &S; + s->F[0].V[0] = v1; + s->F[0].V[1] = v2; + + if (Tree_Search (FacesTree, &s)) + return 0; + + s = Create_Simplex_For2dmesh (v1, v2, NULL, NULL); + Tree_Add (FacesTree, &s); + + Curve *c = Create_Curve (qq++, MSH_SEGM_LINE, 1, NULL, NULL, -1, -1, 0, 1); + Vertex *v; + c->Control_Points = List_Create (2, 1, sizeof (Vertex *)); + List_Add (c->Control_Points, &v1); + List_Add (c->Control_Points, &v2); + c->beg = v1; + c->end = v2; + Maillage_Curve (&c, NULL); + for (i = 1; i < List_Nbr (c->Vertices) - 1; i++){ + List_Read (c->Vertices, i, &v); + List_Delete (v->ListCurves); + v->ListCurves = NULL; + List_Add (Points, &v); + } + List_Delete (c->Vertices); + List_Delete (c->Control_Points); + Free (c); + return 1; +} + +void Action_First_Simplexes_2D (void *a, void *b){ + Simplex *q; + + if (!THES){ + q = *(Simplex **) a; + if (q->Pt_In_Ellipsis (THEV, THEM->Metric->m)){ + THES = q; + } + } +} + +void Fill_Sim_Des_2D (void *a, void *b){ + Simplex *S; + S = *(Simplex **) a; + if (S->Pt_In_Ellipsis (THEV, THEM->Metric->m)) + List_Add (Simplexes_Destroyed, a); +} + +void TStoLS_2D (void *a, void *b){ + List_Add (Simplexes_Destroyed, a); +} + +void TAtoLA_2D (void *a, void *b){ + List_Add (Simplexes_New, a); +} + +void CrSi_2D (void *a, void *b){ + SxF *S; + Simplex *s; + S = (SxF *) a; + if (S->NumFaceSimpl == 1){ + s = Create_Simplex_For2dmesh (THEV, S->F.V[0], S->F.V[1], NULL); + s->iEnt = ZONEELIMINEE; + List_Add (Simplexes_New, &s); + } + else if (S->NumFaceSimpl != 2){ + Msg(WARNING, "GROSSE PANIQUE ..."); + } +} + +void NewSimplexes_2D (Surface * s, List_T * Sim, List_T * news){ + int i, j; + Tree_T *SimXFac; + Simplex *S; + SxF SXF, *pSXF; + + SimXFac = Tree_Create (sizeof (SxF), compareSxF); + + for (i = 0; i < List_Nbr (Sim); i++){ + List_Read (Sim, i, &S); + if (!i) + ZONEELIMINEE = S->iEnt; + else{ + if (S->iEnt != ZONEELIMINEE){ + Msg(WARNING, "Bizzare, l'elimination est foireuse %d %d\n", + S->iEnt, ZONEELIMINEE); + } + } + for (j = 0; j < 3; j++){ + SXF.F = S->F[j]; + + if ((pSXF = (SxF *) Tree_PQuery (SimXFac, &SXF))) { + (pSXF->NumFaceSimpl)++; + } + else { + SXF.NumFaceSimpl = 1; + Tree_Add (SimXFac, &SXF); + } + } + } + + /* Les faces non communes sont obligatoirement a la frontiere ... + -> Nouveaux simplexes */ + + Tree_Action (SimXFac, CrSi_2D); + Tree_Delete (SimXFac); +} + +int recur_bowyer_2D (Simplex * s){ + int i; + + Tree_Insert (Tsd, &s); + for (i = 0; i < 3; i++){ + if (s->S[i] && s->S[i] != &MyNewBoundary && !Tree_Query (Tsd, &s->S[i])){ + if (s->S[i]->Pt_In_Ellipsis (THEV, THEM->Metric->m) && (s->iEnt == s->S[i]->iEnt)){ + recur_bowyer_2D (s->S[i]); + } + else{ + if (s->iEnt != s->S[i]->iEnt){ + Alerte_Point_Scabreux = 1; + } + Tree_Insert (Sim_Sur_Le_Bord, &s->S[i]); + } + } + } + return 1; +} + + +bool draw_simplex2d (Surface * sur, Simplex * s, bool nouv){ + double x[3], y[3], z[3]; + Vertex v1, v2, v3; + + if (!THEM->MeshParams.InteractiveDelaunay) + return false; + + if (s == &MyNewBoundary || !s || !s->iEnt) + return false; + + v1 = InterpolateSurface (sur->Support, s->V[0]->Pos.X, s->V[0]->Pos.Y, 0, 0); + v2 = InterpolateSurface (sur->Support, s->V[1]->Pos.X, s->V[1]->Pos.Y, 0, 0); + v3 = InterpolateSurface (sur->Support, s->V[2]->Pos.X, s->V[2]->Pos.Y, 0, 0); + + x[0] = v1.Pos.X; + x[1] = v2.Pos.X; + x[2] = v3.Pos.X; + y[0] = v1.Pos.Y; + y[1] = v2.Pos.Y; + y[2] = v3.Pos.Y; + z[0] = v1.Pos.Z; + z[1] = v2.Pos.Z; + z[2] = v3.Pos.Z; + + if (nouv) + draw_polygon_2d (1., 0., 0., 3, x, y, z); + else + draw_polygon_2d (0., 0., 0., 3, x, y, z); + + return true; +} + +bool Bowyer_Watson_2D (Surface * sur, Vertex * v, Simplex * S, int force){ + int i; + Simplex *s; + static int init = 1; + double volumeold, volumenew; + + THEV = v; + + double x = (S->V[0]->Pos.X + S->V[1]->Pos.X + S->V[2]->Pos.X) / 3.; + double y = (S->V[0]->Pos.Y + S->V[1]->Pos.Y + S->V[2]->Pos.Y) / 3.; + + if (force) + THEM->Metric->setMetricMin (x, y, sur->Support); + else + THEM->Metric->setMetric (x, y, sur->Support); + + Tsd = Tree_Create (sizeof (Simplex *), compareSimplex); + Sim_Sur_Le_Bord = Tree_Create (sizeof (Simplex *), compareSimplex); + if (init){ + Simplexes_New = List_Create (10, 10, sizeof (Simplex *)); + Simplexes_Destroyed = List_Create (10, 10, sizeof (Simplex *)); + init = 0; + } + + if (Methode){ + Tree_Action (sur->Simplexes, Fill_Sim_Des_2D); + S = NULL; + } + else{ + recur_bowyer_2D (S); + } + + Tree_Action (Tsd, TStoLS_2D); + NewSimplexes_2D (sur, Simplexes_Destroyed, Simplexes_New); + + /* calcul des volumes des simplexes crees */ + + if (Alerte_Point_Scabreux || !SPEED_MAX){ + volume = 0.0; + for (i = 0; i < List_Nbr (Simplexes_Destroyed); i++){ + VSIM_2D (List_Pointer (Simplexes_Destroyed, i), NULL); + } + volumeold = volume; + volume = 0.0; + for (i = 0; i < List_Nbr (Simplexes_New); i++){ + VSIM_2D (List_Pointer (Simplexes_New, i), NULL); + } + volumenew = volume; + if (volumeold + volumenew == 0.0) + volumenew = 1.0; + } + else{ + volumeold = 1.0; + volumenew = 1.0; + } + + /* critere du volume */ + + if ((fabs (volumeold - volumenew) / (volumeold + volumenew)) > 1.e-8){ + if (S){ + Tree_Suppress (sur->Simplexes, &S); + S->Quality /= 2.; + Tree_Add (sur->Simplexes, &S); + } + if(force){ + List_Reset (Simplexes_New); + List_Reset (Simplexes_Destroyed); + Tree_Delete (Sim_Sur_Le_Bord); + Tree_Delete (Tsd); + return false; + } + } + else{ + Tree_Add (sur->Vertices, &THEV); + + /* Suppression des simplexes elimines */ + for (i = 0; i < List_Nbr (Simplexes_Destroyed); i++){ + List_Read (Simplexes_Destroyed, i, &s); + draw_simplex2d (sur, s, 0); + if (!Tree_Suppress (sur->Simplexes, &s)){ + Msg(WARNING, "aie aie aie"); + } + Free (s); + } + for (i = 0; i < List_Nbr (Simplexes_New); i++){ + List_Read (Simplexes_New, i, &s); + draw_simplex2d (sur, s, 1); + Tree_Add (sur->Simplexes, &s); + } + + /* Creation des liens entre nouveaux simplexes */ + + Tree_Action (Sim_Sur_Le_Bord, TAtoLA_2D); + Link_Simplexes (Simplexes_New, sur->Simplexes); + } + + List_Reset (Simplexes_New); + List_Reset (Simplexes_Destroyed); + Tree_Delete (Sim_Sur_Le_Bord); + Tree_Delete (Tsd); + return true; +} + +void Convex_Hull_Mesh_2D (List_T * Points, Surface * s){ + int i, N; + + N = List_Nbr (Points); + + Msg(STATUS, "Meshing 2D... (Initial)"); + + Box_2_Triangles (Points, s); + for (i = 0; i < N; i++){ + THES = NULL; + List_Read (Points, i, &THEV); + Tree_Action (s->Simplexes, Action_First_Simplexes_2D); + /* + if(i%n == n-1){ + volume = 0.0; + Tree_Action(s->Simplexes,VSIM_2D); + Msg(STATUS, %d->%d Nodes, %d Elements",i+1,N,Tree_Nbr(s->Simplexes)); + } + */ + if (!THES){ + Msg(ERROR, "Vertex %12.5E %12.5E %12.5E in no simplex\n", + THEV->Pos.X, THEV->Pos.Y, THEV->Pos.Z); + THEV->Pos.X += 10 * RAND_LONG; + THEV->Pos.Y += 10 * RAND_LONG; + THEV->Pos.Z += 10 * RAND_LONG; + Tree_Action (s->Simplexes, Action_First_Simplexes_2D); + } + bool ca_marche = Bowyer_Watson_2D (s, THEV, THES, 1); + while(!ca_marche){ + double dx = RAND_LONG; + double dy = RAND_LONG; + THEV->Pos.X += dx; + THEV->Pos.Y += dy; + ca_marche = Bowyer_Watson_2D (s, THEV, THES, 1); + THEV->Pos.X -= dx; + THEV->Pos.Y -= dy; + cout << "pb " << endl; + } + } + +} + +/* recuperation de la surface */ + +static List_T *ListCurves, *ListAllCurves; +static Tree_T *keep; +static Simplex *SIMP; +static int iSurface; + +void attribueSurface (void *a, void *b){ + Simplex *s; + s = *(Simplex **) a; + s->iEnt = iSurface; +} + +void Trouve_Simplex_2D (void *a, void *b){ + Simplex *s; + if (SIMP != NULL) + return; + s = *(Simplex **) a; + if (s->iEnt < 0) + SIMP = s; +} + +void Trouve_Simplex_Bord_2D (void *a, void *b){ + Simplex *s; + + if (SIMP != NULL) + return; + s = *(Simplex **) a; + if (s->V[0]->Num < 0 || s->V[1]->Num < 0 || s->V[2]->Num < 0) + SIMP = s; +} + +void CourbesDansSurface (Surface * s, List_T * ListAllCurves){ + int i, iseg; + Curve *c; + for (i = 0; i < List_Nbr (s->s.Generatrices); i++){ + List_Read (s->s.Generatrices, i, &c); + iseg = abs (c->Num); + List_Replace (ListAllCurves, &iseg, fcmp_int); + } +} + +int isListaSurface (List_T * ListSurf, Surface * s){ + int NN, j, srf; + bool found; + Curve *c; + NN = 0; + found = true; + for (j = 0; j < List_Nbr (s->s.Generatrices); j++){ + List_Read (s->s.Generatrices, j, &c); + srf = abs (c->Num); + if (!List_Search (ListSurf, &srf, fcmp_int)){ + found = false; + } + else + NN++; + } + if (found && NN == List_Nbr (ListSurf)) + return s->Num; + return 0; +} + +static List_T *StackSimp; +#define MAX_DEPTH 500 + +void recur_trouve_surface (Simplex * s, int *Depth){ + int i, j; + Simplex *pS, S; + + if (s->iEnt != -1) + return; + + if ((*Depth) > MAX_DEPTH){ + List_Add (StackSimp, &s); + return; + } + + (*Depth)++; + s->iEnt = -2; + Tree_Add (keep, &s); + for (i = 0; i < 3; i++){ + pS = &S; + pS->F[0] = s->F[i]; + if (Tree_Query (FacesTree, &pS) && List_Search (ListAllCurves, &pS->iEnt, fcmp_int)){ + j = abs (pS->iEnt); + List_Replace (ListCurves, &j, fcmp_int); + } + else if (s->S[i] && s->S[i] != &MyNewBoundary){ + recur_trouve_surface (s->S[i], Depth); + } + } + (*Depth)--; +} + +extern int compareSimpSurf (const void *a, const void *b); + +void Restore_Surface (Surface * s){ + int N; + int i, depth; + + StackSimp = List_Create (100, 100, sizeof (Simplex *)); + ListCurves = List_Create (2, 2, sizeof (int)); + iSurface = -1; + Tree_Action (s->Simplexes, attribueSurface); + + /* Les simplexes sur le bord exterieur sont elimines */ + ListAllCurves = List_Create (10, 3, sizeof (int)); + CourbesDansSurface (s, ListAllCurves); + + + SIMP = NULL; + Tree_Action (s->Simplexes, Trouve_Simplex_Bord_2D); + + if (SIMP){ + List_Add (StackSimp, &SIMP); + keep = Tree_Create (sizeof (Simplex *), compareQuality); + depth = 0; + i = 0; + do{ + List_Read (StackSimp, i, &SIMP); + recur_trouve_surface (SIMP, &depth); + } + while (++i < List_Nbr (StackSimp)); + List_Reset (StackSimp); + + N = Tree_Nbr (keep); + + iSurface = 0; + Tree_Action (keep, attribueSurface); + Tree_Delete (keep); + List_Reset (ListCurves); + } + + while (1){ + SIMP = NULL; + keep = Tree_Create (sizeof (Simplex *), compareQuality); + Tree_Action (s->Simplexes, Trouve_Simplex_2D); + if (!SIMP) + break; + List_Add (StackSimp, &SIMP); + depth = 0; + i = 0; + do{ + List_Read (StackSimp, i, &SIMP); + recur_trouve_surface (SIMP, &depth); + }while (++i < List_Nbr (StackSimp)); + + iSurface = isListaSurface (ListCurves, s); + + N = Tree_Nbr (keep); + Msg (INFO, "volume %d maillage initial %d simplexes %d/%d courbes %d fac", + iSurface, N, List_Nbr (ListCurves), List_Nbr (ListAllCurves), + Tree_Nbr (FacesTree)); + + Tree_Action (keep, attribueSurface); + Tree_Delete (keep); + List_Reset (ListCurves); + List_Reset (StackSimp); + } +} + +void suppress_simplex_2D (void *data, void *dum){ + Simplex **pv; + + pv = (Simplex **) data; + if ((*pv)->iEnt == 0) + List_Add (Suppress, pv); +} + +Vertex * NewVertex_2D (Simplex * s){ + Vertex *v; + double lc; + lc = 0.333333333 * (s->V[0]->lc + s->V[1]->lc + s->V[2]->lc); + + //lc = DMIN(MAXIMUM_LC_FOR_SURFACE,lc); + + /*v = Create_Vertex( ++CurrentNodeNumber, + (s->V[0]->Pos.X + s->V[1]->Pos.X + s->V[2]->Pos.X)/3., + (s->V[0]->Pos.Y + s->V[1]->Pos.Y + s->V[2]->Pos.Y)/3., + 0.0, lc, 0.0); + */ + + if (THEM->MeshParams.DelaunayInsertionMethod == INSERTION_CENTROID) + v = Create_Vertex (++CurrentNodeNumber, s->Center.X, s->Center.Y, 0.0, lc, 0.0); + else if (THEM->MeshParams.DelaunayInsertionMethod == INSERTION_EDGE) { + Vertex *vv[2]; + double l = THEM->Metric->getWorstEdge (s, PARAMETRIC, vv); + double f = 0.5; + + if (vv[0]->lc <= vv[1]->lc) + f = vv[0]->lc / l; + else + f = 1. - (vv[1]->lc / l); + + if (f >= 1) + v = Create_Vertex (++CurrentNodeNumber, s->Center.X, s->Center.Y, 0.0, lc, 0.0); + else + v = Create_Vertex (++CurrentNodeNumber, + f * vv[0]->Pos.X + (1. - f) * vv[1]->Pos.X, + f * vv[0]->Pos.Y + (1. - f) * vv[1]->Pos.Y, 0.0, lc, 0.0); + } + + v->lc = Interpole_lcTriangle (s, v); + + if (PARAMETRIC){ + if (!v->ListCurves) + Normal2Surface (PARAMETRIC->Support, v->Pos.X, v->Pos.Y, v->us); + else { + v->us[0] = v->us[1] = v->us[2] = 0.0; + } + } + return (v); +} + +extern Mesh *LOCAL; + +void TRIE_MON_GARS (void *a, void *b){ + Simplex *s = *(Simplex **) a; + s->Fourre_Simplexe (s->V[0], s->V[1], s->V[2], s->V[3]); + s->iEnt = SURF->Num; + s->S[0] = s->S[1] = s->S[2] = NULL; + THEM->Metric->setSimplexQuality (s, PARAMETRIC); + //SURF->Num; + //qsort(s->F[0].V,3,sizeof(Vertex*),compareVertex); +} + +void RandomSwapEdges2d (Surface * s){ + int i, j = 1, k; + List_T *AllTrg = Tree2List (s->Simplexes); + Simplex *t; + for (i = 0; i < List_Nbr (AllTrg); i++){ + k = rand () % List_Nbr (AllTrg); + List_Read (AllTrg, k, &t); + j = rand () % 3; + if (draw_simplex2d (s, t, false)) + draw_simplex2d (s, t->S[j], false); + t->SwapEdge (j); + if (draw_simplex2d (s, t, true)) + draw_simplex2d (s, t->S[j], true); + } +} + +void IntelligentSwapEdges (Surface * s, GMSHMetric * m){ + int i, j, k; + List_T *AllTrg = Tree2List (s->Simplexes); + Vertex *p[4], *q[4]; + Simplex *t; + for (i = 0; i < List_Nbr (AllTrg); i++) { + k = rand () % List_Nbr (AllTrg); + List_Read (AllTrg, k, &t); + j = rand () % 3; + if (t->ExtractOppositeEdges (j, p, q)){ + double qp = 2. * m->EdgeLengthOnSurface (s, p, 1) + / (RacineDeTrois * (p[0]->lc + p[1]->lc)); + double qq = 2. * m->EdgeLengthOnSurface (s, q, 1) + / (RacineDeTrois * (q[0]->lc + q[1]->lc)); + if (fabs (qp) > fabs (qq)){ + if (draw_simplex2d (s, t, false)) + draw_simplex2d (s, t->S[j], false); + t->SwapEdge (j); + if (draw_simplex2d (s, t, true)) + draw_simplex2d (s, t->S[j], true); + } + } + } + List_Delete (AllTrg); +} + +int AlgorithmeMaillage2DAnisotropeModeJF (Surface * s){ + List_T *Points = List_Create (100, 100, sizeof (Vertex *)); + int j, i, N, n; + List_T *c; + Curve *cur, *curinv; + extern int FACE_DIMENSION; + Simplex *simp; + Vertex *newv; + static int COUNT = 0; + + FACE_DIMENSION = 1; + + SURF = s; + SPEED_MAX = 0; + LOCAL = NULL; + + if (s->Typ == MSH_SURF_PLAN || s->Typ == MSH_SURF_REGL || s->Typ == MSH_SURF_TRIC) + PARAMETRIC = NULL; + + ZONEELIMINEE = s->Num; + + for (i = 0; i < List_Nbr (s->Contours); i++){ + List_Read (s->Contours, i, &c); + for (j = 0; j < List_Nbr (c); j++){ + Vertex *pv; + List_Read (c, j, &pv); + List_Add (Points, &pv); + } + } + + N = List_Nbr (Points); + n = N + 100; + + Convex_Hull_Mesh_2D (Points, s); + List_Reset (Points); + Link_Simplexes (NULL, s->Simplexes); + + //return 1; + + if (!Restore_Boundary (s)){ + //s->Simplexes = Tree_Create(sizeof(Simplex*),compareSimplex); + FACE_DIMENSION = 2; + Tree_Action (s->Simplexes, TRIE_MON_GARS); + return 1; + } + + Tree_Action (s->Simplexes, TRIE_MON_GARS); + Link_Simplexes (NULL, s->Simplexes); + List_T *List = Tree2List (s->Simplexes); + Tree_Delete (s->Simplexes); + s->Simplexes = Tree_Create (sizeof (Simplex *), compareQuality); + for (i = 0; i < List_Nbr (List); i++) + Tree_Add (s->Simplexes, List_Pointer (List, i)); + List_Delete (List); + + // return 1; + + FacesTree = Tree_Create (sizeof (Simplex *), compareSimpSurf); + for (i = 0; i < List_Nbr (s->s.Generatrices); i++){ + List_Read (s->s.Generatrices, i, &cur); + curinv = FindCurve (abs (cur->Num), THEM); + List_T *temp = Tree2List (curinv->Simplexes); + for (j = 0; j < List_Nbr (temp); j++){ + Tree_Add (FacesTree, List_Pointer (temp, j)); + } + List_Delete (temp); + } + + Restore_Surface (s); + + Suppress = List_Create (10, 10, sizeof (Simplex *)); + Tree_Action (s->Simplexes, suppress_simplex_2D); + for (i = 0; i < List_Nbr (Suppress); i++){ + Tree_Suppress (s->Simplexes, List_Pointer (Suppress, i)); + } + List_Delete (Suppress); + + if(!Tree_Right (s->Simplexes, &simp)) + Msg(WARNING, "No Simplex left"); + else{ + i = 0; + while ( simp->Quality > CONV_VALUE){ + newv = NewVertex_2D (simp); + while (!simp->Pt_In_Simplex_2D (newv) && + (simp->S[0] == &MyNewBoundary || !simp->S[0]->Pt_In_Simplex_2D (newv)) && + (simp->S[1] == &MyNewBoundary || !simp->S[1]->Pt_In_Simplex_2D (newv)) && + (simp->S[2] == &MyNewBoundary || !simp->S[2]->Pt_In_Simplex_2D (newv))){ + /* + Msg(INFO,"pt : %12.5E %12.5E",newv->Pos.X,newv->Pos.Y); + Msg(INFO,"not in : (%12.5E %12.5E) (%12.5E %12.5E) (%12.5E %12.5E)", + simp->V[0]->Pos.X,simp->V[0]->Pos.Y,simp->V[1]->Pos.X, + simp->V[1]->Pos.Y,simp->V[2]->Pos.X,simp->V[2]->Pos.Y); + */ + Tree_Suppress (s->Simplexes, &simp); + simp->Quality /= 2.; + Tree_Insert (s->Simplexes, &simp); + Tree_Right (s->Simplexes, &simp); + if (simp->Quality < CONV_VALUE) + break; + newv = NewVertex_2D (simp); + } + if (simp->Quality < CONV_VALUE) + break; + i++; + if (i % n == n - 1){ + volume = 0.0; + Tree_Action (s->Simplexes, VSIM_2D); + Msg(STATUS, "%d Nodes, %d Elements", + Tree_Nbr (s->Vertices), Tree_Nbr (s->Simplexes)); + Msg(SELECT, "Vol(%.6e) Conv(%g->%.1f)", volume, simp->Quality, CONV_VALUE); + } + Bowyer_Watson_2D (s, newv, simp, 0); + Tree_Right (s->Simplexes, &simp); + //if(i>COUNT)break; + } + } + + //for(i=0;i<3;i++)RandomSwapEdges2d(s); + //for(i=0;i<2;i++)IntelligentSwapEdges(s,THEM->Metric); + + List_Reset (Points); + FACE_DIMENSION = 2; + COUNT++; + + Tree_Action (s->Simplexes, TRIE_MON_GARS); + Link_Simplexes (NULL, s->Simplexes); + List = Tree2List (s->Simplexes); + Tree_Delete (s->Simplexes); + s->Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex); + for (i = 0; i < List_Nbr (List); i++) + Tree_Add (s->Simplexes, List_Pointer (List, i)); + List_Delete (List); + + /*suppression des points de la boite */ + List = Tree2List (s->Vertices); + for (i = 0; i < List_Nbr (List); i++){ + List_Read (List, i, &THEV); + if (THEV->Num < 0){ + Tree_Suppress (s->Vertices, &THEV); + //delete THEV; + } + } + List_Delete (List); + + /* + RandomSwapEdges2d(s); + for(i=0;i<1;i++)IntelligentSwapEdges(s,THEM->Metric); + */ + //IntelligentSwapEdges(s,THEM->Metric); + + List_Delete (Points); + return 1; +} diff --git a/Mesh/2D_Parametric.cpp b/Mesh/2D_Parametric.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fca01280fc4b43caf64b306c467cf991a4535260 --- /dev/null +++ b/Mesh/2D_Parametric.cpp @@ -0,0 +1,128 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "Interpolation.h" +#include "Mesh.h" +#include "2D_Mesh.h" +#include "Create.h" +#include "Context.h" +#include "Numeric.h" + +extern Mesh *THEM; +extern Context_T CTX; + +static Surface *SURF; +Surface *PARAMETRIC; + +/* SURFACES CYLINDRIQUES */ + +void XYZtoUV (void *a, void *dum){ + Vertex *v; + double uu, vv; + v = *(Vertex **) a; + ProjectPointOnSurface (SURF->Support, v, &uu, &vv); + v->Pos.X = uu; + v->Pos.Y = vv; + v->Pos.Z = 0.0; +} + +void UVtoXYZ (void *a, void *dum){ + Vertex *v, n; + v = *(Vertex **) a; + + n = InterpolateSurface (SURF->Support, v->Pos.X, v->Pos.Y, 0, 0); + + v->Pos.X = n.Pos.X; + v->Pos.Y = n.Pos.Y; + v->Pos.Z = n.Pos.Z; +} + +void printMetric (Mesh * m, Surface * s, char *name){ + + int N = 10, M = 10, i, j; + double u, v; + FILE *f = fopen (name, "w"); + if (!f) + return; + fprintf (f, "View \"metric\" Offset{0,0,0} {\n"); + for (i = 0; i < N; i++){ + u = (s->ku[0]) + (s->ku[s->Nu + s->OrderU] - s->ku[0]) + * (double) i / (double) (N - 1); + for (j = 0; j < M; j++){ + v = (s->kv[0]) + (s->kv[s->Nv + s->OrderV] - s->kv[0]) + * (double) j / (double) (M - 1); + m->Metric->setMetric (u, v, s); + fprintf (f, "VT (%f,%f,0,%f,%f,0,%f,%f,0)" + "{%g,%g,%g,%g,%g,%g,%g,%g,%g};\n", + u, v, u, v, u, v, + m->Metric->m[0][0], m->Metric->m[0][1], 0.0, + m->Metric->m[0][0], m->Metric->m[0][1], 0.0, + m->Metric->m[0][0], m->Metric->m[0][1], 0.0); + fprintf (f, "VT (%f,%f,0,%f,%f,0,%f,%f,0)" + "{%g,%g,%g,%g,%g,%g,%g,%g,%g};\n", + u, v, u, v, u, v, + m->Metric->m[1][0], m->Metric->m[1][1], 0.0, + m->Metric->m[1][0], m->Metric->m[1][1], 0.0, + m->Metric->m[1][0], m->Metric->m[1][1], 0.0); + } + } + fprintf (f, "};\n"); + fclose (f); +} + +int MeshParametricSurface (Surface * s){ + + int i, j, ori; + Curve *pC; + Vertex *v; + Tree_T *tnxe; + + PARAMETRIC = s; + + if (s->Typ == MSH_SURF_NURBS) + return 1; + if (s->Typ != MSH_SURF_TRIMMED || s->Support->Typ != MSH_SURF_NURBS) + return 0; + + SURF = s; + if (!List_Nbr (s->s.Generatrices)) + return 1; + for (i = 0; i < List_Nbr (s->s.Generatrices); i++){ + List_Read (s->s.Generatrices, i, &pC); + for (j = 0; j < List_Nbr (pC->Vertices); j++){ + List_Read (pC->Vertices, j, &v); + Tree_Insert (s->Vertices, List_Pointer (pC->Vertices, j)); + } + } + + //printMetric(THEM,s,"metric.pos"); + + Tree_Action (s->Vertices, Freeze_Vertex); + + Tree_Action (s->Vertices, XYZtoUV); + ori = Calcule_Contours (s); + + if (!AlgorithmeMaillage2DAnisotropeModeJF (s)) + Maillage_Automatique_VieuxCode (s, THEM, ori); + + if (CTX.mesh.nb_smoothing){ + tnxe = Tree_Create (sizeof (NXE), compareNXE); + create_NXE (s->Vertices, s->Simplexes, tnxe); + + for(i = 0 ; i < CTX.mesh.nb_smoothing ; i++) + Tree_Action (tnxe, ActionLiss); + + //AmelioreSurface_EliminationTripet (s, THEM, tnxe); + + Tree_Delete (tnxe); + } + + Tree_Action (s->Vertices, UVtoXYZ); + Tree_Action (s->Vertices, deFreeze_Vertex); + + PARAMETRIC = NULL; + + return 1; +} diff --git a/Mesh/2D_Recombine.cpp b/Mesh/2D_Recombine.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eecf49d57f79280d39c16883a5ba47dacc8ec685 --- /dev/null +++ b/Mesh/2D_Recombine.cpp @@ -0,0 +1,119 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "2D_Mesh.h" +#include "Create.h" +#include "Numeric.h" + +extern Mesh *THEM; + +Tree_T *RecEdges,*Triangles; +Tree_T *RecSimplex,*TREEELM; +double ALPHA; +int RECNUM; + +void addTriangles(void *data, void *dum){ + Simplex *S; + S = *(Simplex**)data; + if(S->V[2] && !S->V[3])Tree_Add(Triangles,&S); +} + +void addrecedges (void *a, void *b){ + Edge *ed; + ed = (Edge*)a; + if(ed->a < ALPHA)Tree_Add(RecEdges,ed); +} + +void CalculeAngles (void *a, void *b){ + Edge *ed; + double Angle; + + ed = (Edge*)a; + if(List_Nbr(ed->Simplexes) != 2){ + ed->a = 90.; + return; + } + + Angle = fabs(90. - angle_3pts(ed->O[0],ed->V[0],ed->O[1])); + Angle = DMAX(fabs(90. - angle_3pts(ed->V[0],ed->O[1],ed->V[1])),Angle); + Angle = DMAX(fabs(90. - angle_3pts(ed->O[1],ed->V[1],ed->O[0])),Angle); + Angle = DMAX(fabs(90. - angle_3pts(ed->V[0],ed->O[0],ed->V[1])),Angle); + ed->a = Angle; +} + + +void Recombine_Farce (void *a, void *b){ + Edge *ed; + Simplex *s1,*s2; + ed = (Edge*)a; + + if (ed->a < ALPHA){ + List_Read(ed->Simplexes,0,&s1); + List_Read(ed->Simplexes,1,&s2); + if(Tree_Search(RecSimplex,&s1)) return; + if(s1->V[3]) return; + if(Tree_Search(RecSimplex,&s2)) return; + if(s2->V[3]) return; + Tree_Add(RecSimplex,&s1); + Tree_Suppress(TREEELM,&s1); + s2->V[0] = ed->V[0]; + s2->V[1] = ed->O[0]; + s2->V[2] = ed->V[1]; + s2->V[3] = ed->O[1]; + RECNUM++; + } +} + +void Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a){ + Tree_T *TreeEdges,*tnxe; + int ntot; + + ALPHA = a; + TREEELM = TreeAllElg; + ntot = 0; + + while(1){ + + /* Initialisation */ + RECNUM = 0; + TreeEdges = Tree_Create(sizeof(Edge),compareedge); + RecEdges = Tree_Create(sizeof(Edge),compareedge_angle); + RecSimplex = Tree_Create(sizeof(Simplex*),compareSimplex); + Triangles = Tree_Create(sizeof(Simplex*),compareSimplex); + + /* Recombinaison */ + Tree_Action(TreeAllElg,addTriangles); + crEdges(Triangles,TreeEdges); + Tree_Action(TreeEdges,CalculeAngles); + Tree_Action(TreeEdges,addrecedges); + Tree_Action(RecEdges,Recombine_Farce); + + /* Lissage */ + tnxe = Tree_Create(sizeof(NXE),compareNXE); + create_NXE(TreeAllVert,TreeAllElg,tnxe); + Tree_Action(tnxe,ActionLissSurf); + Tree_Action(tnxe,ActionLissSurf); + Tree_Action(tnxe,ActionLissSurf); + Tree_Delete(tnxe); + + /* Destruction */ + Tree_Delete(TreeEdges); + Tree_Delete(RecEdges); + Tree_Delete(RecSimplex); + Tree_Delete(Triangles); + + /* Si aucune recombinaison -> fin */ + ntot += RECNUM; + if(!RECNUM)break; + } + + Msg(INFO, "Recombining: %d quadrangles",ntot); + + THEM->Statistics[7] -= ntot/2; + THEM->Statistics[8] += ntot; + +} + + + diff --git a/Mesh/2D_SMesh.cpp b/Mesh/2D_SMesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1b88ee8b698896ecf94e79d4b728ba4a2a83b3bc --- /dev/null +++ b/Mesh/2D_SMesh.cpp @@ -0,0 +1,286 @@ +/* + Maillage transfini surfacique + *s2 + s3 c2 s2 /| + *-----------* / | + | | c2/ |c1 + c3| |c1 / | + | | / | + v *-----------* *-----* + | s0 c0 s1 s0 c0 s1 + *--u + + Decoupages : | + *--* + |\ | + | \| + *--*-- + s0 -> s1 +*/ + +#include "Gmsh.h" +#include "Geo.h" +#include "Mesh.h" +#include "Numeric.h" +#include "Interpolation.h" + +extern Mesh *THEM; +extern int CurrentNodeNumber; + +int index1d (int flag, int N, int n){ + switch(flag){ + case 0 : return(n); + case 1 : return(N-n-1); + default : return -1; + } +} + +int MeshTransfiniteSurface (Surface *sur) { + int i,j,k,flag,nb,N1,N2,issphere; + int nbquad=0,nbtri=0; + Curve *G[4],*GG[4]; + Vertex V,**vexist,*pV,*c1,*c2,**list,*CP[2]; + Simplex *simp; + double u,v; + int C_flag[4]; + Vertex *C[4],*S[4]; + + static int tab1qua[] = {0,1, 1,2, 3,2, 0,3}; + static int tab1tri[] = {0,1, 1,2, 0,2}; + static int tab2[] = {0,1, 1,0}; + + if (sur->Method != TRANSFINI) return(0); + + switch(sur->Typ){ + + case MSH_SURF_REGL: + case MSH_SURF_PLAN: + case MSH_SURF_TRIC: + case MSH_SURF_NURBS: + + nb = List_Nbr(sur->s.Generatrices); + if(nb != 3 && nb != 4) return(0); + + for(i=0;i<4;i++) G[i] = NULL ; + + for(i=0;i<nb;i++){ + V.Num = sur->ipar[i]; + pV = &V; + if((vexist = (Vertex**)Tree_PQuery(THEM->Vertices,&pV)) == NULL) { + Msg(WARNING, "Unknown Control Point %d in Transfinite Surface %d", + V.Num,sur->Num); + return(0); + } + else{ + S[i]=*vexist; + } + } + + for(i=0;i<nb;i++) List_Read(sur->s.Generatrices,i,&GG[i]); + + for(i=0;i<nb;i++){ + List_Read(GG[i]->Control_Points,0,&CP[0]); + List_Read(GG[i]->Control_Points,List_Nbr(GG[i]->Control_Points)-1,&CP[1]); + + for(flag=0;flag<2;flag++){ + for(k=0;k<nb;k++){ + if(nb == 4){ + if(S[tab1qua[2*k ]]->Num == CP[tab2[2*flag ]]->Num && + S[tab1qua[2*k+1]]->Num == CP[tab2[2*flag+1]]->Num){ + G[k]=GG[i]; + C_flag[k]=flag; + } + } + else{ + if(S[tab1tri[2*k ]]->Num == CP[tab2[2*flag ]]->Num && + S[tab1tri[2*k+1]]->Num == CP[tab2[2*flag+1]]->Num){ + G[k]=GG[i]; + C_flag[k]=flag; + } + } + } + } + } + + for(i=0;i<nb;i++) + if(G[i] == NULL) { + Msg(WARNING, "Wrong definition of Transfinite Surface(%d)", + sur->Num); + return(0); + } + + if(nb == 4) { + if((N1 = List_Nbr(G[0]->Vertices)) != List_Nbr(G[2]->Vertices)) return(0); + if((N2 = List_Nbr(G[1]->Vertices)) != List_Nbr(G[3]->Vertices)) return(0); + } + else { + if((N1 = List_Nbr(G[0]->Vertices)) != List_Nbr(G[2]->Vertices)) return(0); + N2 = List_Nbr(G[1]->Vertices); + } + + sur->Nu = N1; + sur->Nv = N2; + list = (Vertex**)Malloc(N1*N2*sizeof(Vertex*)); + + issphere = 1; + for(i=0;i<nb;i++){ + if(G[i]->Typ != MSH_SEGM_CIRC && G[i]->Typ != MSH_SEGM_CIRC_INV){ + issphere = 0; + } + else if (issphere){ + if(!i){ + List_Read(G[i]->Control_Points, 1, &c1); + } + else{ + List_Read(G[i]->Control_Points, 1, &c2); + if(compareVertex(&c1,&c2))issphere = 0; + } + } + } + + for(i=0;i<N1;i++){ + List_Read(G[0]->Vertices, index1d(C_flag[0],N1,i), &C[0]); + List_Read(G[2]->Vertices, index1d(C_flag[2],N1,i), &C[2]); + + if( (G[0]->Num>0 && C_flag[0]) || (G[0]->Num<0 && !C_flag[0]) ) + u = 1.-C[0]->u; + else + u = C[0]->u; + + for(j=0;j<N2;j++){ + List_Read(G[1]->Vertices, index1d(C_flag[1],N2,j), &C[1]); + if(nb == 4) + List_Read(G[3]->Vertices, index1d(C_flag[3],N2,j), &C[3]); + + if( (G[1]->Num>0 && C_flag[1]) || (G[1]->Num<0 && !C_flag[1]) ) + v = 1.-C[1]->u; + else + v = C[1]->u; + + if(i && j && i != N1-1 && j != N2-1){ + if (sur->Typ == MSH_SURF_NURBS) + V = InterpolateSurface (sur, u, v, 0, 0); + else if(nb == 4) + V = TransfiniteQua(*C[0],*C[1],*C[2],*C[3],*S[0],*S[1],*S[2],*S[3],u,v); + else + V = TransfiniteTri(*C[0],*C[1],*C[2],*S[0],*S[1],*S[2],u,v); + if(issphere) + TransfiniteSph(*C[0],*c1,&V); + list[i+N1*j] = Create_Vertex(++CurrentNodeNumber,V.Pos.X,V.Pos.Y,V.Pos.Z,V.lc,0.0); + } + else if(!i) + list[i+N1*j] = (nb == 4)?C[3]:C[2]; + else if(!j) + list[i+N1*j] = C[0]; + else if(i == N1-1) + list[i+N1*j] = C[1]; + else if(j == N2-1) + list[i+N1*j] = C[2]; + + list[i + N1 * j]->us[0] = u; + list[i + N1 * j]->us[1] = v; + } + } + + + for(i=0;i<N1;i++){ + for(j=0;j<N2;j++){ + List_Add(sur->TrsfVertices,&list[i+N1*j]); + } + } + + if(nb == 4){ + for(i=0;i<N1;i++){ + for(j=0;j<N2;j++){ + Tree_Replace(sur->Vertices,&list[i+N1*j]); + } + } + for(i=0;i<N1-1;i++){ + for(j=0;j<N2-1;j++){ + if(sur->Recombine){ + simp = Create_Quadrangle(list[(i) + N1*(j)], list[(i+1)+ N1*(j)], + list[(i+1)+ N1*(j+1)], list[(i)+ N1*(j+1)]); + simp->iEnt = sur->Num; + Tree_Add(sur->Simplexes,&simp); + List_Add(sur->TrsfSimplexes,&simp); + + nbquad++; + } + else{ + simp = Create_Simplex(list[(i) + N1*(j)], list[(i+1) + N1*(j)], + list[(i) + N1*(j+1)], NULL); + simp->iEnt = sur->Num; + Tree_Add(sur->Simplexes,&simp); + List_Add(sur->TrsfSimplexes,&simp); + + simp = Create_Simplex(list[(i+1) + N1*(j+1)], list[(i) + N1*(j+1)], + list[(i+1) + N1*(j)], NULL); + simp->iEnt = sur->Num; + Tree_Add(sur->Simplexes,&simp); + List_Add(sur->TrsfSimplexes,&simp); + + nbtri += 2; + } + } + } + } + else if(nb == 3) { + Tree_Replace(sur->Vertices,&list[0]); + for(i=1;i<N1;i++){ + for(j=0;j<N2;j++){ + Tree_Replace(sur->Vertices,&list[i+N1*j]); + } + } + for(j=0;j<N2-1;j++){ + simp = Create_Simplex(list[1 + N1*(j+1)], list[N1*(j+1)],list[1 + N1*(j)],NULL); + simp->iEnt = sur->Num; + Tree_Add(sur->Simplexes,&simp); + List_Add(sur->TrsfSimplexes,&simp); + + nbtri++; + } + for(i=1;i<N1-1;i++){ + for(j=0;j<N2-1;j++){ + if(sur->Recombine){ + simp = Create_Quadrangle(list[(i) + N1*(j)],list[(i+1) + N1*(j)], + list[(i+1) + N1*(j+1)],list[i+N1*(j+1)]); + simp->iEnt = sur->Num; + Tree_Add(sur->Simplexes,&simp); + List_Add(sur->TrsfSimplexes,&simp); + + nbquad++; + } + else{ + simp = Create_Simplex(list[(i) + N1*(j)], list[(i+1) + N1*(j)], + list[(i) + N1*(j+1)],NULL); + simp->iEnt = sur->Num; + Tree_Add(sur->Simplexes,&simp); + List_Add(sur->TrsfSimplexes,&simp); + + simp = Create_Simplex(list[(i+1) + N1*(j+1)], list[(i) + N1*(j+1)], + list[(i+1) + N1*(j)], NULL); + simp->iEnt = sur->Num; + Tree_Add(sur->Simplexes,&simp); + List_Add(sur->TrsfSimplexes,&simp); + + nbtri += 2; + } + } + } + + } + break; + + default: + return(0); + } + + free(list); + + THEM->Statistics[5] += Tree_Nbr(sur->Vertices); + THEM->Statistics[7] += nbtri; + THEM->Statistics[8] += nbquad; + + return(1); +} + diff --git a/Mesh/2D_Tree.cpp b/Mesh/2D_Tree.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cff696e3129145a68ed51efb09a2bced339cd8bf --- /dev/null +++ b/Mesh/2D_Tree.cpp @@ -0,0 +1,136 @@ + +#include "Gmsh.h" +#include "Mesh.h" +#include "2D_Mesh.h" + +/* BOUSILLE L'ARBRE TOTALEMENT (pas les donnees mais les liens) */ + +int avltree_remove (avlstruct **root){ + int delete_this_node = 0; + + if(*root == NULL) return(1); + + if (((*root)->left == NULL) && ((*root)->right == NULL)) + delete_this_node = 1; + else + { + if ((*root)->left == NULL) + if (avltree_remove(&(*root)->left)) + { + Free((*root)->left); + (*root)->left = NULL; + } + if ((*root)->right == NULL) + if (avltree_remove(&(*root)->right)) + { + Free((*root)->right); + (*root)->right = NULL; + } + if (((*root)->left == NULL) && ((*root)->right == NULL)) + delete_this_node = 1; + } + return delete_this_node; +} + + +/* INSERE UN NOEUD */ + +int avltree_insert (avlstruct **root, void *item, + int (*fcmp)(void *a, void *b)){ + int cmpresult; + + if(*root != NULL) + cmpresult = fcmp(item,(*root)->treedata); + + if (*root == NULL){ + *root = (avlstruct *) Malloc (sizeof(avlstruct)); + (*root)->treedata = item; + (*root)->left = NULL; + (*root)->right = NULL; + } + else if (cmpresult < 0) + avltree_insert(&(*root)->left,item,fcmp); + else + avltree_insert(&(*root)->right,item,fcmp); + return(1); +} + + + +/* EFFACE UN NOEUD */ + +int avltree_delete (avlstruct **root, void *item, + int (*fcmp)(void *a, void *b)){ + + avlstruct *t1,*t12; + int cmpresult; + + if(*root != NULL) + cmpresult = fcmp(item , (*root)->treedata); + + if (*root == NULL) { + return(1); + } + if (cmpresult < 0){ + return(avltree_delete(&(*root)->left,item,fcmp)); + } + else if (cmpresult > 0){ + return(avltree_delete(&(*root)->right,item,fcmp)); + } + else if ((cmpresult == 0)) { + if (((*root)->right == NULL) && (&(*root)->left == NULL)){ + Free(*root); + return(1); + } + else if((*root)->right == NULL){ + t1 = (*root)->left; + Free(*root); + *root = t1; + return(1); + } + else if ((*root)->left == NULL){ + t1 = (*root)->right; + Free(*root); + *root = t1; + return(1); + } + else{ + t1 = t12 = (*root)->right; + while(t12->left != NULL) + t12 = t12->left; + t12->left = (*root)->left; + Free(*root); + *root = t1; + return(1); + } + } + else{ + return(avltree_delete(&(*root)->left,item,fcmp)); + } + +} + +/* compte le nombre d'elements d'un arbre */ + +void avltree_count (avlptr root, int *numtri){ + + if(root != NULL){ + avltree_count(root->left,numtri); + + (*numtri)++; + + avltree_count(root->right,numtri); + } +} + + +/* deroule l'arbre dans un vecteur */ + +void avltree_print (avlptr root, Delaunay **listdel, int *numtri){ + if(root != NULL){ + avltree_print(root->left,listdel,numtri); + listdel[(*numtri)++] = (Delaunay*)(root)->treedata; + avltree_print(root->right,listdel,numtri); + } +} + diff --git a/Mesh/2D_Util.cpp b/Mesh/2D_Util.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bc4b99190ddb591d0464d51ee6b8b6c2339887de --- /dev/null +++ b/Mesh/2D_Util.cpp @@ -0,0 +1,363 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "2D_Mesh.h" + +extern int LocalNewPoint, FindQualityMethod; +extern PointRecord *gPointArray; +extern Mesh *THEM; + +int Comparekey(void * d1,void * d2){ + + double val ; + PointNumero a,b,c,aa,bb,cc; + + a = ((Delaunay*)d1)->t.a; + b = ((Delaunay*)d1)->t.b; + c = ((Delaunay*)d1)->t.c; + aa = ((Delaunay*)d2)->t.a; + bb = ((Delaunay*)d2)->t.b; + cc = ((Delaunay*)d2)->t.c; + + val = ((Delaunay*)d2)->t.quality_value - ((Delaunay*)d1)->t.quality_value; + + if ((aa==a)&&(bb==b)&&(cc==c)){ + return 0; + } + else if (val > 1.e-21 ) + return 1; + else if (val < -1.e-21 ) + return -1; + else{ + if (((Delaunay*)d1)->t.xc > ((Delaunay*)d2)->t.xc) + return -1; + else + return 1; + } +} + +int Insert_Triangle (avlstruct **root, Delaunay * del){ + + if ( !avltree_insert(root,del,Comparekey) ) return(0); + + return(1); +} + +int Delete_Triangle ( avlstruct **root, Delaunay * del ){ + + if (!avltree_delete(root,del,Comparekey)) return(0); + + if (*root == NULL) return(0); + return(1); +} + +int Insert_Point (MPoint pt, int *numpoints, int *numalloc, + DocRecord *doc, DocRecord *BGM, int is3d){ + Vertex *v,*dum; + + if ( *numpoints >= *numalloc ) { + gPointArray = (PointRecord *) Realloc(gPointArray, + (*numalloc + 1000) * sizeof(PointRecord)); + *numalloc += 1000; + doc->points = gPointArray; + } + PushgPointArray(gPointArray); + gPointArray[*numpoints].where.h = pt.h; + gPointArray[*numpoints].where.v = pt.v; + gPointArray[*numpoints].numcontour = -1; + gPointArray[*numpoints].initial = -1; + if(!is3d) + gPointArray[*numpoints].quality = find_quality(pt,BGM); + else{ + v = Create_Vertex (-1,pt.h,pt.v,0.0,0.0,0.0); + Calcule_Z_Plan(&v, &dum); + Projette_Inverse(&v, &dum); + gPointArray[*numpoints].quality = Lc_XYZ ( v->Pos.X,v->Pos.Y,v->Pos.Z,THEM); + Free(v); + } + + (*numpoints)++; + + return 1; +} + +void findtree(avlptr root, double *qualm, Delaunay **delf, DocRecord *MESH){ + + /* + trouve le triangle possedant le facteur de qualite max + modif : le centre du cercle circonscrit de ce triangle + doit etre dans le domaine + */ + + MPoint pt; + double q; + Delaunay *del; + + if(root != NULL){ + findtree((root)->left,qualm,delf,MESH); + del = (Delaunay*)root->treedata; + q = del->t.quality_value; + pt.h = del->t.xc; + pt.v = del->t.yc; + if ((q>*qualm) && (Find_Triangle (pt ,MESH,A_TOUT_PRIX) != NULL) ){ + *qualm = q; + *delf = del; + } + findtree((root)->right,qualm,delf,MESH); + } +} + + +Delaunay *findrightest(avlptr root, DocRecord *MESH){ + + Delaunay *del,**dee; + MPoint pt; + avlptr exroot; + double qualm; + + exroot = root; + + while((exroot)->left != NULL){ + exroot = (exroot)->left; + } + + del = (Delaunay*)(exroot)->treedata; + pt.h = del->t.xc; + pt.v = del->t.yc; + if( (LocalNewPoint == VORONOI_INSERT) ||(LocalNewPoint == SQUARE_TRI) ) + return del; + + if(Find_Triangle(pt,MESH,A_TOUT_PRIX) != NULL )return del; + + exroot = root; + del = (Delaunay*)(root)->treedata; + qualm = del->t.quality_value; + dee = &del; + findtree(exroot, &qualm, dee, MESH); + del = *dee; + + return (del); +} + +double lengthseg (MPoint a, MPoint b){ + return (pow(DSQR(a.h-b.h)+DSQR(a.v-b.v),0.5)); +} + + +MPoint Localize (Delaunay * del , DocRecord *MESH) { + + /* + Routine de localisation du point a inserer. + Variable globale LocalNewPoint : + - CENTER_CIRCCIRC : au centre du cercle circonscrit + - VORONOI_INSERT : sur une branche de voronoi + - BARYCENTER : au centre de gravite + - SQUARE_TRI : essaie de creer des triangles rectangles isoceles + dans le but de mailler avec des quadrangles + */ + + MPoint pt,pta,ptb,ptc,ptm; + PointNumero a,b; + double p,q,val,vec[2],ro,rm; + Delaunay *v1,*v2,*v3,*del2 ; + + switch (LocalNewPoint) { + + case (CENTER_CIRCCIRC) : + + pt.h = del->t.xc; + pt.v = del->t.yc; + + return(pt); + + case (BARYCENTER) : + + pt.h = ( gPointArray[del->t.a].where.h + gPointArray[del->t.b].where.h + + gPointArray[del->t.c].where.h ) /3.; + pt.v = ( gPointArray[del->t.a].where.v + gPointArray[del->t.b].where.v + + gPointArray[del->t.c].where.v ) /3.; + + return(pt); + + case (VORONOI_INSERT) : + case (SQUARE_TRI) : + + /* + si le triangle est pres d'un bord -> ce bord est l'arete choisie + */ + if ((v1 = del->v.voisin1) == NULL) { + /* v1 == NULL; */ + v2 = del->v.voisin2; + v3 = del->v.voisin3; + } + else if ((v2 = del->v.voisin2) == NULL) { + v1 = NULL; + v2 = del->v.voisin1; + v3 = del->v.voisin3; + } + else if ((v3 = del->v.voisin3) == NULL) { + v1 = NULL; + v2 = del->v.voisin1; + v3 = del->v.voisin2; + } + else { + v1 = del->v.voisin1; + v2 = del->v.voisin2; + v3 = del->v.voisin3; + } + + /* + Si l'arete est un bord -> + */ + if (v1 == NULL){ + + if((v2 != NULL) && (v3 != NULL) ) { + + if ( ((del->t.a == v2->t.a) || (del->t.a == v2->t.b) || (del->t.a == v2->t.c)) && + ((del->t.a == v3->t.a) || (del->t.a == v3->t.b) || (del->t.a == v3->t.c))){ + a = del->t.b; + b = del->t.c; + } + else if ( ((del->t.b == v2->t.a) || (del->t.b == v2->t.b) || (del->t.b == v2->t.c)) && + ((del->t.b == v3->t.a) || (del->t.b == v3->t.b) || (del->t.b == v3->t.c))){ + a = del->t.a; + b = del->t.c; + } + else if ( ((del->t.c == v2->t.a) || (del->t.c == v2->t.b) || (del->t.c == v2->t.c)) && + ((del->t.c == v3->t.a) || (del->t.c == v3->t.b) || (del->t.c == v3->t.c))){ + a = del->t.a; + b = del->t.b; + } + else{ + Msg(ERROR, "vor insert 1"); + } + } + else if(v2 != NULL) { + if((del->t.a != v2->t.c) && (del->t.a != v2->t.c) && (del->t.a != v2->t.c)){ + a = del->t.a; + b = del->t.b; + } + else if((del->t.b != v2->t.c) && (del->t.b != v2->t.c) && (del->t.b != v2->t.c)){ + a = del->t.b; + b = del->t.c; + } + else if((del->t.c != v2->t.c) && (del->t.c != v2->t.c) && (del->t.c != v2->t.c)){ + a = del->t.a; + b = del->t.c; + } + else { + Msg(ERROR,"vor insert 2"); + } + } + else if(v3 != NULL) { + if((del->t.a != v3->t.c) && (del->t.a != v3->t.c) && (del->t.a != v3->t.c)){ + a = del->t.a; + b = del->t.b; + } + else if((del->t.b != v3->t.c) && (del->t.b != v3->t.c) && (del->t.b != v3->t.c)){ + a = del->t.b; + b = del->t.c; + } + else if((del->t.c != v3->t.c) && (del->t.c != v3->t.c) && (del->t.c != v3->t.c)){ + a = del->t.a; + b = del->t.c; + } + else { + Msg(ERROR, "vor insert 3"); + } + } + } + else { + if( v1->t.position == ACCEPTED )del2 = v1; + else if( v2->t.position == ACCEPTED )del2 = v2; + else if( v3->t.position == ACCEPTED )del2 = v3; + else { + Msg(ERROR,"coherence"); + } + + if((del->t.a != del2->t.a) && (del->t.a != del2->t.b) && (del->t.a != del2->t.c)){ + a = del->t.b; + b = del->t.c; + } + else if((del->t.b != del2->t.a) && (del->t.b != del2->t.b) && (del->t.b != del2->t.c)){ + a = del->t.a; + b = del->t.c; + } + else if((del->t.c != del2->t.a) && (del->t.c != del2->t.b) && (del->t.c != del2->t.c)){ + a = del->t.a; + b = del->t.b; + } + else{ + Msg(ERROR,"vor insert"); + } + } + + /* + On sait que l'arete du nouveau triangle est a b + */ + + pta.h = gPointArray[a].where.h; + ptb.h = gPointArray[b].where.h; + pta.v = gPointArray[a].where.v; + ptb.v = gPointArray[b].where.v; + + /* + pte.h = gPointArray[c].where.h; + pte.v = gPointArray[c].where.v; + */ + + p = 0.5 * lengthseg(pta,ptb); + + ptc.h = del->t.xc; + ptc.v = del->t.yc; + + ptm.h = 0.5*( pta.h + ptb.h ); + ptm.v = 0.5*( pta.v + ptb.v ); + + q = lengthseg(ptm,ptc); + + vec[0] = (ptc.h - ptm.h)/q; + vec[1] = (ptc.v - ptm.v)/q; + + val = (p*p + q*q) / (2.*q); + + ro = find_quality(ptm,MESH)/RacineDeTrois; + + rm = ((ro > q )? ro : ro ); + rm = ((rm < val)? rm : val); + + // WARNING RANDOM + + pt.h = ptm.h + vec[0] * (rm + pow( rm*rm - p * p,0.5 )) ; + //+ (double) (rand() % 1000) / 1.e8; + pt.v = ptm.v + vec[1] * (rm + pow( rm*rm - p * p,0.5 )) ; + //+ (double) (rand() % 1000) / 1.e8; + + return(pt); + } + + return pt; + +} + +/********************************************************************/ + +void alloue_Mai_Pts(maillage *mai , int Nballoc , int incrAlloc){ + int i; + + mai->points = (PointRecord *)Malloc(Nballoc*sizeof(PointRecord)); + for(i=0;i<Nballoc;i++){ + mai->points[i].where.h=0.0; + mai->points[i].where.v=0.0; + } + mai->IncrAllocPoints = incrAlloc; + mai->NumAllocPoints = Nballoc; +} + +void alloue_Mai_Del(maillage *mai , int Nballoc , int incrAlloc){ + mai->listdel = (delpeek *)Malloc(Nballoc * sizeof(delpeek)); + mai->IncrAllocTri = incrAlloc; + mai->NumAllocTri = Nballoc; +} + diff --git a/Mesh/3D_BGMesh.cpp b/Mesh/3D_BGMesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6bce95e3f0237b035b3e1a11122298fb03776a4d --- /dev/null +++ b/Mesh/3D_BGMesh.cpp @@ -0,0 +1,342 @@ + +#include "Gmsh.h" +#include "Mesh.h" +#include "2D_Mesh.h" +#include "3D_Mesh.h" +#include "Adapt.h" +#include "Views.h" +#include "Numeric.h" + +extern int Alerte_Point_Exterieur; +extern double FACTEUR_MULTIPLICATIF; + +static Mesh m; +static Vertex vvv; +static double XX, YY, ZZ, D, LL; + +void ExportLcFieldOnVolume (Mesh * M){ + List_T *l = Tree2List (M->Volumes); + Volume *vol; + Simplex *simp; + FILE *f = fopen ("OutFile.pos", "w"); + fprintf (f, "View \"LC_FIELD\" Offset{0,0,0} {\n"); + for (int i = 0; i < List_Nbr (l); i++){ + List_Read (l, i, &vol); + List_T *ll = Tree2List (vol->Simplexes); + for (int j = 0; j < List_Nbr (ll); j++){ + List_Read (ll, j, &simp); + simp->ExportLcField (f); + } + List_Delete (ll); + } + List_Delete (l); + fprintf (f, "};\n"); + fclose (f); +} + +void ExportLcFieldOnSurfaces (Mesh * M){ + List_T *l = Tree2List (M->Surfaces); + Surface *surf; + Simplex *simp; + FILE *f = fopen ("OutFileS.pos", "w"); + fprintf (f, "View \"LC_FIELD\" Offset{0,0,0} {\n"); + for (int i = 0; i < List_Nbr (l); i++){ + List_Read (l, i, &surf); + List_T *ll = Tree2List (surf->Simplexes); + for (int j = 0; j < List_Nbr (ll); j++){ + List_Read (ll, j, &simp); + simp->ExportLcField (f); + } + List_Delete (ll); + } + List_Delete (l); + fprintf (f, "};\n"); + fclose (f); +} + +void findcloser (void *a, void *b){ + Vertex *v; + double dd; + v = *(Vertex **) a; + dd = DSQR (v->Pos.X - XX) + DSQR (v->Pos.Y - YY) + DSQR (v->Pos.Z - ZZ); + if (dd < D){ + D = dd; + LL = v->lc; + } +} + +void LCBGM (double X, double Y, double Z, double *l){ + if (Pt_In_Volume (X, Y, Z, &m, l, .01)); + else if (Pt_In_Volume (X, Y, Z, &m, l, .02)); + else if (Pt_In_Volume (X, Y, Z, &m, l, .07)); + else if (Pt_In_Volume (X, Y, Z, &m, l, .1)); + else if (Pt_In_Volume (X, Y, Z, &m, l, .2)); + else if (Pt_In_Volume (X, Y, Z, &m, l, .8)); + else if (Pt_In_Volume (X, Y, Z, &m, l, 20.)); + else { + XX = X; + YY = Y; + ZZ = Z; + D = 1.e24; + LL = 1; + Tree_Action (m.Vertices, findcloser); + *l = LL; + } +} + +double Lc_XYZ (double X, double Y, double Z, Mesh * m){ + double l; + + //l = 0.1 * fabs(cos(2 * 3.14159 * X) * cos( 2 * 3.14159 * Y)) + 0.01; + //return l; + + switch (m->BGM.Typ){ + case FUNCTION: + break; + case CONSTANT: + l = m->BGM.lc; + break; + case ONFILE: + LCBGM (X, Y, Z, &l); + break; + case WITHPOINTS: + if (Pt_In_Volume (X, Y, Z, m, &l, 0.0)); + else if (Pt_In_Volume (X, Y, Z, m, &l, 0.2)); + else if (Pt_In_Volume (X, Y, Z, m, &l, 0.5)); + else{ + Alerte_Point_Exterieur = 1; + l = 1.e-25; + } + break; + } + return (FACTEUR_MULTIPLICATIF * l); +} + +/* ------------------------------------------------------------------------ */ +/* B G M W i t h V i e w */ +/* ------------------------------------------------------------------------ */ + +static Tree_T *Pts; + +static void AIG (void *a, void *b){ + Simplex *s = *(Simplex **) a; + AddSimplexInGrid (&m, s, BOITE); +} + +int BGMWithView (Post_View * ErrView){ + + static Vertex *VertexUp, *v, V, *ver[4]; + extern int TYPBGMESH; + extern Mesh *THEM; + int i, j, k; + Post_Simplex s; + Post_Triangle t; + Simplex *si; + + VertexUp = Create_Vertex (-1, 0., 0., 1., 1., -1.0); + Pts = Tree_Create (sizeof (Vertex *), comparePosition); + + m.BGM.Typ = TYPBGMESH = ONFILE; + + m.Vertices = Tree_Create (sizeof (Vertex *), compareVertex); + m.Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex); + Create_BgMesh (TYPBGMESH, .2, THEM); + + k = 1; + for (i = 0; i < List_Nbr (ErrView->Triangles); i++){ + List_Read (ErrView->Triangles, i, &t); + for (j = 0; j < 3; j++){ + v = &V; + v->Pos.X = t.X[j]; + v->Pos.Y = t.Y[j]; + v->Pos.Z = t.Z[j]; + if (0 /*Tree_Query(Pts,&v) */ ){ + /* Corriger la Lc pour lissage */ + ver[j] = v; + } + else{ + v = Create_Vertex (k++, t.X[j], t.Y[j], t.Z[j] + ,t.V[j], -1.0); + ver[j] = v; + Tree_Add (m.Vertices, &v); + Tree_Add (Pts, &v); + } + } + si = Create_Simplex (ver[0], ver[1], ver[2], VertexUp); + Tree_Add (m.Simplexes, &si); + } + + for (i = 0; i < List_Nbr (ErrView->Simplices); i++){ + List_Read (ErrView->Simplices, i, &s); + for (j = 0; j < 4; j++){ + v = &V; + v->Pos.X = s.X[j]; + v->Pos.Y = s.Y[j]; + v->Pos.Z = s.Z[j]; + if (Tree_Query (Pts, &v)){ + ver[j] = v; + } + else{ + v = Create_Vertex (k++, s.X[k], s.Y[j], s.Z[j], s.V[0], -1.0); + ver[j] = v; + Tree_Add (m.Vertices, &v); + Tree_Add (Pts, &v); + } + } + si = Create_Simplex (ver[0], ver[1], ver[2], ver[4]); + Tree_Add (m.Simplexes, &si); + } + + m.Grid.init = 0; + m.Grid.Nx = 10; + m.Grid.Ny = 10; + m.Grid.Nz = 10; + Tree_Action (m.Vertices, findminmax); + getminmax (&m.Grid.min.X, &m.Grid.min.Y, &m.Grid.min.Z, + &m.Grid.max.X, &m.Grid.max.Y, &m.Grid.max.Z); + + if (m.Grid.max.Z == m.Grid.min.Z){ + m.Grid.Nz = 1; + Tree_Add (m.Vertices, &VertexUp); + Tree_Action (m.Vertices, findminmax); + getminmax (&m.Grid.min.X, &m.Grid.min.Y, &m.Grid.min.Z, + &m.Grid.max.X, &m.Grid.max.Y, &m.Grid.max.Z); + } + + Tree_Action (m.Simplexes, AIG); + + Msg(INFO, "Background Mesh Loaded (%d Nodes, %d Elements)", + Tree_Nbr(m.Vertices), Tree_Nbr(m.Simplexes)); + + return (1); +} + + +double ErrorInView (Post_View * ErrView, int *n){ + + Post_Triangle t; + Post_Simplex s; + double e, tot=0.0; + int i, j=0; + + if(ErrView == NULL){ + Msg(WARNING, "Empty Error View"); + return 0.; + } + + for (i = 0; i < List_Nbr (ErrView->Triangles); i++){ + List_Read (ErrView->Triangles, i, &t); + e = (t.V[0] + t.V[1] + t.V[2]) * 0.33333333333; + tot += e * e; + j++; + } + + for (i = 0; i < List_Nbr (ErrView->Simplices); i++){ + List_Read (ErrView->Simplices, i, &s); + e = (t.V[0] + t.V[1] + t.V[2] + t.V[3]) * 0.25; + tot += e * e; + j++; + } + + *n = j; + return 100 * sqrt (tot); +} + + +/* ------------------------------------------------------------------------ */ +/* C r e a t e B G M */ +/* ------------------------------------------------------------------------ */ + +int CreateBGM (Post_View * ErrView, int OptiMethod, double Degree, + double OptiValue, double *ObjFunct, char *OutFile){ + + Post_Triangle t; + Post_Simplex s; + double *h, *p, *e, xc, yc, zc, c[3]; + int N, i, j, dim; + Simplex smp; + FILE *f; + + if (List_Nbr (ErrView->Simplices)) + dim = 3; + else + dim = 2; + + N = List_Nbr (ErrView->Simplices) + + List_Nbr (ErrView->Triangles) + 2; + + h = (double *) malloc (N * sizeof (double)); + e = (double *) malloc (N * sizeof (double)); + p = (double *) malloc (N * sizeof (double)); + + j = 0; + + for (i = 0; i < List_Nbr (ErrView->Triangles); i++){ + List_Read (ErrView->Triangles, i, &t); + + /* + Attention, cette ligne est seulement valable en + 2d x-y. Si plus, calculer le centre du cercle en + 3d ou utiliser une autre mesure de taille. + */ + CircumCircle (t.X[0], t.Y[0], + t.X[1], t.Y[1], + t.X[2], t.Y[2], + &xc, &yc); + h[j + 1] = sqrt ((xc - t.X[0]) * (xc - t.X[0]) + + (yc - t.Y[0]) * (yc - t.Y[0])); + p[j + 1] = Degree; + e[j + 1] = (t.V[0] + t.V[1] + t.V[2]) * 0.33333333333; + j++; + } + + for (i = 0; i < List_Nbr (ErrView->Simplices); i++){ + List_Read (ErrView->Simplices, i, &s); + + smp.center_tet (t.X, t.Y, t.Z, c); + + xc = c[0]; + yc = c[1]; + zc = c[2]; + + h[j + 1] = sqrt ((xc - t.X[0]) * (xc - t.X[0]) + + (yc - t.X[0]) * (yc - t.X[0]) + + (zc - t.Y[0]) * (zc - t.Y[0])); + p[j + 1] = Degree; + e[j + 1] = (t.V[0] + t.V[1] + t.V[2] + t.V[3]) * 0.25; + j++; + } + + *ObjFunct = optimesh (j, OptiMethod, dim, e, h, p, OptiValue, OptiValue); + + f = fopen (OutFile, "w"); + + fprintf (f, "View \"Auto_BGMesh\" Offset{0,0,0} {\n"); + j = 0; + for (i = 0; i < List_Nbr (ErrView->Triangles); i++){ + List_Read (ErrView->Triangles, i, &t); + fprintf (f, "ST(%f,%f,%f,%f,%f,%f,%f,%f,%f){%12.5E,%12.5E,%12.5E};\n", + t.X[0], t.Y[0], t.Z[0], + t.X[1], t.Y[1], t.Z[1], + t.X[2], t.Y[2], t.Z[2], + h[j], h[j], h[j]); + j++; + } + for (i = 0; i < List_Nbr (ErrView->Simplices); i++){ + List_Read (ErrView->Simplices, i, &s); + fprintf (f, "SS(%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f){%12.5E,%12.5E,%12.5E,%12.5E};\n", + s.X[0], s.Y[0], s.Z[0], + s.X[1], s.Y[1], s.Z[1], + s.X[2], s.Y[2], s.Z[2], + s.X[3], s.Y[3], s.Z[3], + h[j], h[j], h[j], h[j]); + j++; + } + fprintf (f, "};\n"); + fclose (f); + + Msg(INFO,"Wrote background mesh in '%s'", OutFile); + + return 1; +} + diff --git a/Mesh/3D_Bricks.cpp b/Mesh/3D_Bricks.cpp new file mode 100644 index 0000000000000000000000000000000000000000..19ef313bbaf80621f546e1f63f074eddaa5f68a0 --- /dev/null +++ b/Mesh/3D_Bricks.cpp @@ -0,0 +1,152 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" + +Brick LaBrique (Grid_T * pGrid, double X, double Y, double Z){ + int Ix, Iy, Iz, index; + Brick B; + + B.N = -1; + if (X > pGrid->max.X || X < pGrid->min.X || Y > pGrid->max.Y || + Y < pGrid->min.Y || Z > pGrid->max.Z || Z < pGrid->min.Z){ + return (B); + } + + Ix = (int) ((double) pGrid->Nx * (X - pGrid->min.X) / (pGrid->max.X - pGrid->min.X)); + Iy = (int) ((double) pGrid->Ny * (Y - pGrid->min.Y) / (pGrid->max.Y - pGrid->min.Y)); + Iz = (int) ((double) pGrid->Nz * (Z - pGrid->min.Z) / (pGrid->max.Z - pGrid->min.Z)); + Ix = IMIN (Ix, pGrid->Nx - 1); + Iy = IMIN (Iy, pGrid->Ny - 1); + Iz = IMIN (Iz, pGrid->Nz - 1); + + if (Ix < 0) + Ix = 0; + if (Iy < 0) + Iy = 0; + if (Iz < 0) + Iz = 0; + + index = Ix + Iy * pGrid->Nx + Iz * pGrid->Nx * pGrid->Ny; + List_Read (pGrid->Bricks, index, &B); + return (B); +} + + +int DEBUT = 0; +Coord MINIM, MAXIM; + +void getminmax (double *xmin, double *ymin, double *zmin, + double *xmax, double *ymax, double *zmax){ + + double dx, dy, dz, f; + + dx = MAXIM.X - MINIM.X; + dy = MAXIM.Y - MINIM.Y; + dz = MAXIM.Z - MINIM.Z; + f = .1; + + *xmin = MINIM.X - f * dx; + *ymin = MINIM.Y - f * dy; + *zmin = MINIM.Z - f * dz; + *xmax = MAXIM.X + f * dx; + *ymax = MAXIM.Y + f * dy; + *zmax = MAXIM.Z + f * dz; +} + +void findminmax (void *a, void *b){ + + Vertex *v; + v = *(Vertex **) a; + + if (!DEBUT){ + MINIM.X = DMIN (MINIM.X, v->Pos.X); + MAXIM.X = DMAX (MAXIM.X, v->Pos.X); + MINIM.Y = DMIN (MINIM.Y, v->Pos.Y); + MAXIM.Y = DMAX (MAXIM.Y, v->Pos.Y); + MINIM.Z = DMIN (MINIM.Z, v->Pos.Z); + MAXIM.Z = DMAX (MAXIM.Z, v->Pos.Z); + } + else{ + DEBUT = 0; + MINIM.X = v->Pos.X; + MAXIM.X = v->Pos.X; + MINIM.Y = v->Pos.Y; + MAXIM.Y = v->Pos.Y; + MINIM.Z = v->Pos.Z; + MAXIM.Z = v->Pos.Z; + } +} + + +void AddSimplexInGrid (Mesh * m, Simplex * s, int boule_boite){ + + double XminBox, XmaxBox, YminBox, YmaxBox, ZmaxBox, ZminBox; + int Ix1, Ix2, Iy1, Iy2, Iz1, Iz2; + int i, j, k, index; + Brick Br, *pBrick; + + if (!m->Grid.init){ + m->Grid.Bricks = List_Create (m->Grid.Nx * m->Grid.Ny * m->Grid.Nz, 10, sizeof (Brick)); + for (i = 0; i < m->Grid.Nx * m->Grid.Ny * m->Grid.Nz; i++){ + Br.pT = List_Create (2, 2, sizeof (Simplex *)); + Br.N = i + 1; + List_Add (m->Grid.Bricks, &Br); + } + m->Grid.init = 1; + } + + if (boule_boite == BOITE){ + XminBox = XmaxBox = s->V[0]->Pos.X; + YminBox = YmaxBox = s->V[0]->Pos.Y; + ZminBox = ZmaxBox = s->V[0]->Pos.Z; + for (i = 1; i < 4; i++){ + XminBox = DMIN (XminBox, s->V[i]->Pos.X); + XmaxBox = DMAX (XmaxBox, s->V[i]->Pos.X); + YminBox = DMIN (YminBox, s->V[i]->Pos.Y); + YmaxBox = DMAX (YmaxBox, s->V[i]->Pos.Y); + ZminBox = DMIN (ZminBox, s->V[i]->Pos.Z); + ZmaxBox = DMAX (ZmaxBox, s->V[i]->Pos.Z); + } + } + else if ((boule_boite = BOULE)){ + XminBox = s->Center.X - s->Radius; + XmaxBox = s->Center.X + s->Radius; + YminBox = s->Center.Y - s->Radius; + YmaxBox = s->Center.Y + s->Radius; + ZminBox = s->Center.Z - s->Radius; + ZmaxBox = s->Center.Z + s->Radius; + } + + + Ix1 = (int) ((double) m->Grid.Nx * (XminBox - m->Grid.min.X) / + (m->Grid.max.X - m->Grid.min.X)); + Ix2 = (int) ((double) m->Grid.Nx * (XmaxBox - m->Grid.min.X) / + (m->Grid.max.X - m->Grid.min.X)); + Iy1 = (int) ((double) m->Grid.Ny * (YminBox - m->Grid.min.Y) / + (m->Grid.max.Y - m->Grid.min.Y)); + Iy2 = (int) ((double) m->Grid.Ny * (YmaxBox - m->Grid.min.Y) / + (m->Grid.max.Y - m->Grid.min.Y)); + Iz1 = (int) ((double) m->Grid.Nz * (ZminBox - m->Grid.min.Z) / + (m->Grid.max.Z - m->Grid.min.Z)); + Iz2 = (int) ((double) m->Grid.Nz * (ZmaxBox - m->Grid.min.Z) / + (m->Grid.max.Z - m->Grid.min.Z)); + + Ix1 = IMAX (Ix1, 0); + Ix2 = IMIN (Ix2, m->Grid.Nx - 1); + Iy1 = IMAX (Iy1, 0); + Iy2 = IMIN (Iy2, m->Grid.Ny - 1); + Iz1 = IMAX (Iz1, 0); + Iz2 = IMIN (Iz2, m->Grid.Nz - 1); + + for (i = Ix1; i <= Ix2; i++){ + for (j = Iy1; j <= Iy2; j++){ + for (k = Iz1; k <= Iz2; k++){ + index = i + j * m->Grid.Nx + k * m->Grid.Nx * m->Grid.Ny; + pBrick = (Brick *) List_Pointer (m->Grid.Bricks, index); + List_Add (pBrick->pT, &s); + } + } + } + +} diff --git a/Mesh/3D_Coherence.cpp b/Mesh/3D_Coherence.cpp new file mode 100644 index 0000000000000000000000000000000000000000..82042f547e0d36031b2e0fc1c55202b342449c35 --- /dev/null +++ b/Mesh/3D_Coherence.cpp @@ -0,0 +1,1551 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "Mesh.h" +#include "3D_Mesh.h" +#include "Create.h" +#include "Numeric.h" + +extern Mesh *THEM; +extern int CurrentNodeNumber, FACE_DIMENSION; +extern Simplex MyNewBoundary; + +static Volume *THEVOL; +static Edge *TheEdge; +static Face *TheFace; +static List_T *Teti; +static int DEBUG = 0; + +List_T *Missing, *MissingF, *MissingS; +Tree_T *EdgesTree, *FacesTree, *swaps; + +int edges_quad[4][2] = { {0, 1}, + {1, 2}, + {2, 3}, + {3, 0} }; +int edges_tetra[6][2] = { {0, 1}, + {1, 2}, + {2, 0}, + {3, 0}, + {3, 2}, + {3, 1} }; +int edges_non[3] = {2, 0, 1}; +int NbQ; +int EdgesInVolume = 1; + +int memesens (Vertex * v1, Vertex * v2, Vertex * v3, + Vertex * c1, Vertex * c2, Vertex * c3){ + double v12[3], v13[3], n1[3], n2[3], p; + + v12[0] = c1->Pos.X - c2->Pos.X; + v12[1] = c1->Pos.Y - c2->Pos.Y; + v12[2] = c1->Pos.Z - c2->Pos.Z; + + v13[0] = c1->Pos.X - c3->Pos.X; + v13[1] = c1->Pos.Y - c3->Pos.Y; + v13[2] = c1->Pos.Z - c3->Pos.Z; + + prodve (v12, v13, n1); + + v12[0] = v1->Pos.X - v2->Pos.X; + v12[1] = v1->Pos.Y - v2->Pos.Y; + v12[2] = v1->Pos.Z - v2->Pos.Z; + + v13[0] = v1->Pos.X - v3->Pos.X; + v13[1] = v1->Pos.Y - v3->Pos.Y; + v13[2] = v1->Pos.Z - v3->Pos.Z; + + prodve (v12, v13, n2); + + prosca (n1, n2, &p); + + return ((p > 0) ? 1 : 0); +} + +static void pvertex (void *a, void *b){ + /* + Vertex *v; + v = (Vertex *) a; + printf ("noeud %d = (%12.5E,%12.5E,%12.5E)\n", v->Num, v->Pos.X, v->Pos.Y, v->Pos.Z); + */ +} + +static void pedge (void *a, void *b){ + /* + Edge *e; + e = (Edge *) a; + printf ("arete %d (%12.5E,%12.5E,%12.5E) -> %d (%12.5E,%12.5E,%12.5E)\n", + e->V[0]->Num, e->V[0]->Pos.X, e->V[0]->Pos.Y, e->V[0]->Pos.Z, + e->V[1]->Num, e->V[1]->Pos.X, e->V[1]->Pos.Y, e->V[1]->Pos.Z); + */ +} + +void find_quads (void *a, void *b){ + Edge *q; + Edge diag; + Simplex *s1, *s2; + q = (Edge *) a; + + if (!List_Search (Missing, q, compareedge)) + return; + + if (List_Nbr (q->Simplexes) != 2) + return; + + List_Read (q->Simplexes, 0, &s1); + List_Read (q->Simplexes, 1, &s2); + if (s1->iEnt != s2->iEnt) + return; + if (!q->O[1]) + return; + + diag.V[0] = q->O[0]; + diag.V[1] = q->O[1]; + + if (Tree_Search (EdgesTree, &diag)){ + Tree_Add (swaps, q); + } +} + +void swap_quads (void *a, void *b){ + Edge *q; + int i, K; + Simplex *s1, *s2; + Vertex *temp[3], *kk[3]; + q = (Edge *) a; + List_Read (q->Simplexes, 0, &s1); + List_Read (q->Simplexes, 1, &s2); + + K = -1; + + for (i = 0; i < 3; i++){ + if (!compareVertex (&q->O[0], &s1->V[i])) + K = i; + temp[i] = s1->V[i]; + } + /* + printf("s1 : %d %d %d ->",s1->V[0]->Num,s1->V[1]->Num,s1->V[2]->Num); + */ + kk[0] = q->O[0]; + kk[1] = (K == 2) ? s1->V[0] : s1->V[K + 1]; + kk[2] = q->O[1]; + + s1->V[0] = kk[0]; + s1->V[1] = kk[1]; + s1->V[2] = kk[2]; + /* + printf("%d %d %d \n",s1->V[0]->Num,s1->V[1]->Num,s1->V[2]->Num); + */ + s1->F[0].V[0] = s1->V[0]; + s1->F[0].V[1] = s1->V[1]; + s1->F[0].V[2] = s1->V[2]; + + /* + printf("s2 : %d %d %d ->",s2->V[0]->Num,s2->V[1]->Num,s2->V[2]->Num); + */ + s2->V[0] = q->O[1]; + s2->V[1] = (K == 0) ? temp[2] : temp[K - 1]; + s2->V[2] = q->O[0]; + /* + printf("%d %d %d \n",s2->V[0]->Num,s2->V[1]->Num,s2->V[2]->Num); + */ + s2->F[0].V[0] = s2->V[0]; + s2->F[0].V[1] = s2->V[1]; + s2->F[0].V[2] = s2->V[2]; + + qsort (s1->F[0].V, 3, sizeof (Vertex *), compareVertex); + qsort (s2->F[0].V, 3, sizeof (Vertex *), compareVertex); + + List_Suppress (Missing, q, compareedge); + q->V[0] = q->O[0]; + q->V[1] = q->O[1]; +} + + +void swap_quads2 (void *a, void *b){ + Edge *q; + int K; + Simplex *s1, *s2; + + q = (Edge *) a; + List_Read (q->Simplexes, 0, &s1); + List_Read (q->Simplexes, 1, &s2); + + K = -1; + + if (memesens (s1->V[0], s1->V[1], s1->V[2], q->O[0], q->O[1], q->V[0])){ + s1->V[0] = q->O[0]; + s1->V[1] = q->O[1]; + s1->V[2] = q->V[0]; + } + else{ + s1->V[0] = q->O[1]; + s1->V[1] = q->O[0]; + s1->V[2] = q->V[0]; + } + + if (memesens (s2->V[0], s2->V[1], s2->V[2], q->O[0], q->O[1], q->V[1])){ + s2->V[0] = q->O[0]; + s2->V[1] = q->O[1]; + s2->V[2] = q->V[1]; + } + else{ + s2->V[0] = q->O[1]; + s2->V[1] = q->O[0]; + s2->V[2] = q->V[1]; + } + + s1->F[0].V[0] = s1->V[0]; + s1->F[0].V[1] = s1->V[1]; + s1->F[0].V[2] = s1->V[2]; + + s2->F[0].V[0] = s2->V[0]; + s2->F[0].V[1] = s2->V[1]; + s2->F[0].V[2] = s2->V[2]; + + qsort (s1->F[0].V, 3, sizeof (Vertex *), compareVertex); + qsort (s2->F[0].V, 3, sizeof (Vertex *), compareVertex); + + List_Suppress (Missing, q, compareedge); + q->V[0] = q->O[0]; + q->V[1] = q->O[1]; + +} + +void create_Quads (Volume * V){ + int i; + Surface *S; + swaps = Tree_Create (sizeof (Edge), compareedge); + for (i = 0; i < List_Nbr (V->Surfaces); i++){ + List_Read (V->Surfaces, i, &S); + Tree_Action (S->Edges, find_quads); + } + Tree_Action (swaps, swap_quads2); +} + +void create_Fac (void *a, void *b){ + Simplex **ps, *s; + int i; + ps = (Simplex **) a; + s = *ps; + for (i = 0; i < 4; i++){ + Tree_Insert (FacesTree, &s->F[i]); + } +} + + +void create_Faces (Volume * V){ + V->Faces = Tree_Create (sizeof (Face), compareFace); + FacesTree = V->Faces; + Tree_Action (V->Simplexes, create_Fac); +} + +void create_Edge (void *a, void *b){ + Simplex **ps, *s; + int N, i, j; + Edge E, *pE; + ps = (Simplex **) a; + s = *ps; + int edges[6][2]; + + if (s->V[3] && EdgesInVolume){ + N = 6; + for (i = 0; i < N; i++) + for (j = 0; j < 2; j++) + edges[i][j] = edges_tetra[i][j]; + } + else if (s->V[3]){ + N = 4; + for (i = 0; i < N; i++) + for (j = 0; j < 2; j++) + edges[i][j] = edges_quad[i][j]; + } + else if (s->V[2]){ + N = 3; + for (i = 0; i < N; i++) + for (j = 0; j < 2; j++) + edges[i][j] = edges_tetra[i][j]; + } + else{ + N = 1; + for (i = 0; i < N; i++) + for (j = 0; j < 2; j++) + edges[i][j] = edges_tetra[i][j]; + } + + for (i = 0; i < N; i++){ + E.V[0] = s->V[edges[i][0]]; + E.V[1] = s->V[edges[i][1]]; + if ((pE = (Edge *) Tree_PQuery (EdgesTree, &E))){ + List_Add (pE->Simplexes, ps); + if (N == 3) + pE->O[1] = s->V[edges_non[i]]; + } + else{ + E.Simplexes = List_Create (2, 1, sizeof (Simplex *)); + if (N == 3) + E.O[0] = s->V[edges_non[i]]; + if (N == 3) + E.O[1] = NULL; + List_Add (E.Simplexes, &s); + E.newv = NULL; + Tree_Replace (EdgesTree, &E); + } + } +} + +void create_Edges (Volume * V){ + int i; + Surface *S; + V->Edges = Tree_Create (sizeof (Edge), compareedge); + EdgesTree = V->Edges; + + Tree_Action (V->Simplexes, create_Edge); + for (i = 0; i < List_Nbr (V->Surfaces); i++){ + List_Read (V->Surfaces, i, &S); + S->Edges = Tree_Create (sizeof (Edge), compareedge); + EdgesTree = S->Edges; + Tree_Action (S->Simplexes, create_Edge); + } +} + + +void crEdges (Tree_T * TreeElem, Tree_T * treeedges){ + EdgesTree = treeedges; + Tree_Action (TreeElem, create_Edge); +} + + +void find_missing (void *a, void *b){ + Edge *e; + exf_T exf; + + e = (Edge *) a; + exf.e1 = exf.e2 = *e; + if (!Tree_Search (EdgesTree, e)){ + List_Add (Missing, e); + Tree_Add (EdgesTree, e); + } +} + +void find_missingf (void *a, void *b){ + Simplex *s; + s = *(Simplex **) a; + + if (!FacesTree || !Tree_Search (FacesTree, &s->F[0])){ + List_Add (MissingF, &s->F[0]); + List_Add (MissingS, &s); + } +} + + +List_T *Missing_Edges (Volume * V){ + int i; + Surface *S; + Missing = List_Create (10, 10, sizeof (Edge)); + + NbQ = 0; + EdgesTree = V->Edges; + for (i = 0; i < List_Nbr (V->Surfaces); i++){ + List_Read (V->Surfaces, i, &S); + Tree_Action (S->Edges, find_missing); + } + return Missing; +} + +List_T *Missing_Faces (Volume * V){ + int i; + Surface *S; + MissingF = List_Create (10, 10, sizeof (Face)); + MissingS = List_Create (10, 10, sizeof (Simplex *)); + + for (i = 0; i < List_Nbr (V->Surfaces); i++){ + List_Read (V->Surfaces, i, &S); + Tree_Action (S->Simplexes, find_missingf); + } + return MissingF; +} + +/* Creation de listes de tetraedres qui intersectent + l'arete TheEdge */ + +List_T *traite; +Tree_T *traited; + +void Ajoute_traite (Simplex ** s){ + if (!Tree_Search (traited, s)){ + List_Add (traite, s); + Tree_Add (traited, s); + } +} + +Intersection *thei; +Vertex *m1, *m2, *e1, *e2; +Face *f1; +int Cloture; + +void fillRi (void *a, void *b){ + int i, c, l; + Simplex *s; + + s = *(Simplex **) a; + c = l = 0; + for (i = 0; i < 4; i++){ + if (!compareVertex (&e1, &s->V[i])) + c++; + if (!compareVertex (&e2, &s->V[i])) + c++; + } + if (c == 2){ + Ajoute_traite (&s); + } +} + +void fillTeti (void *a, void *b){ + int i; + Simplex *s; + + s = *(Simplex **) a; + for (i = 0; i < 4; i++){ + if (!compareVertex (&m1, &s->V[i])){ + List_Add (Teti, &s); + return; + } + } +} + +Tree_T *TreexNewv; + +typedef struct{ + int ef; + Edge e; + Face *f; + Vertex *newv; +} xNewv; + +int compxNewv (const void *a, const void *b){ + xNewv *q, *w; + + q = (xNewv *) a; + w = (xNewv *) b; + if (q->ef != w->ef) + return (q->ef - w->ef); + if (q->ef == 1) + return compareedge (&q->e, &w->e); + if (q->ef == 2) + return compareFace (q->f, w->f); + return 1; +} + +/* + --------------------------------------------------- + Pour + de details, voir les travaux de P.L. George. + --------------------------------------------------- + + Les routines ci dessous ont pour but de retrouver les + aretes manquantes d'un maillage initial 3-D. + + En resume, il faut d'abord trouver ces aretes : find_missing + + Ensuite, il faut decouvrir les intersections des aretes manquantes + avec les tetraedres du maillage, les intersections sont de plusieurs + types : + + intersection noeud-noeud (type 1) + intersection arete-face (type 2) + intersection face -face (type 3) + intersection arete-arete (type 4) + intersection face -noeud (type 5) + intersection arete-noeud (type 6) + intersection noeud seul (type 7) + intersection arete seule (type 8) + + Selon le type d'intersection, on appliquera une transformation locale au maillage + de telle sorte que l'arete manquante est recouvree. + */ + + +#define eps_prec (-1.e-10) + +int Edge_Node (Edge * e, Vertex * v){ + double u=0.0, lc; + + if (!compareVertex (&e->V[0], &v)) + return 1; + if (!compareVertex (&e->V[1], &v)) + return 1; + + lc = myhypot (myhypot (e->V[0]->Pos.X - e->V[1]->Pos.X, e->V[0]->Pos.Y - e->V[1]->Pos.Y), + e->V[0]->Pos.Z - e->V[1]->Pos.Z); + + if (e->V[0]->Pos.X != e->V[1]->Pos.X){ + u = (v->Pos.X - e->V[0]->Pos.X) / (e->V[1]->Pos.X - e->V[0]->Pos.X); + } + else if (e->V[0]->Pos.Y != e->V[1]->Pos.Y){ + u = (v->Pos.Y - e->V[0]->Pos.Y) / (e->V[1]->Pos.Y - e->V[0]->Pos.Y); + } + else if (e->V[0]->Pos.Z != e->V[1]->Pos.Z){ + u = (v->Pos.Z - e->V[0]->Pos.Z) / (e->V[1]->Pos.Z - e->V[0]->Pos.Z); + } + + if (u < -eps_prec || u > 1. + eps_prec) + return 0; + if (fabs ((1. - u) * e->V[0]->Pos.X + u * e->V[1]->Pos.X - v->Pos.X) > 1.e-7 * lc){ + return 0; + } + if (fabs ((1. - u) * e->V[0]->Pos.Y + u * e->V[1]->Pos.Y - v->Pos.Y) > 1.e-7 * lc){ + return 0; + } + if (fabs ((1. - u) * e->V[0]->Pos.Z + u * e->V[1]->Pos.Z - v->Pos.Z) > 1.e-7 * lc){ + return 0; + } + return 2; +} + +List_T *SurfComm (List_T * S1, List_T * S2){ + int i; + List_T *List; + Surface *s; + List = List_Create (2, 2, sizeof (Surface *)); + + if (!S1 || !S2) + return List; + + for (i = 0; i < List_Nbr (S1); i++){ + List_Read (S1, i, &s); + if (List_Search (S2, &s, compareSurface)) + List_Add (List, &s); + } + return List; +} + + +Vertex *Edge_Face (Edge * e, Face * f){ + Vertex *v; + + double mat[3][3], det; + double b[3], res[3]; + + if (!compareVertex (&e->V[0], &f->V[0])) + return NULL; + if (!compareVertex (&e->V[0], &f->V[1])) + return NULL; + if (!compareVertex (&e->V[0], &f->V[2])) + return NULL; + if (!compareVertex (&e->V[1], &f->V[0])) + return NULL; + if (!compareVertex (&e->V[1], &f->V[1])) + return NULL; + if (!compareVertex (&e->V[1], &f->V[2])) + return NULL; + + mat[0][0] = f->V[1]->Pos.X - f->V[0]->Pos.X; + mat[0][1] = f->V[2]->Pos.X - f->V[0]->Pos.X; + mat[0][2] = e->V[0]->Pos.X - e->V[1]->Pos.X; + + mat[1][0] = f->V[1]->Pos.Y - f->V[0]->Pos.Y; + mat[1][1] = f->V[2]->Pos.Y - f->V[0]->Pos.Y; + mat[1][2] = e->V[0]->Pos.Y - e->V[1]->Pos.Y; + + mat[2][0] = f->V[1]->Pos.Z - f->V[0]->Pos.Z; + mat[2][1] = f->V[2]->Pos.Z - f->V[0]->Pos.Z; + mat[2][2] = e->V[0]->Pos.Z - e->V[1]->Pos.Z; + + b[0] = e->V[0]->Pos.X - f->V[0]->Pos.X; + b[1] = e->V[0]->Pos.Y - f->V[0]->Pos.Y; + b[2] = e->V[0]->Pos.Z - f->V[0]->Pos.Z; + + if (!sys3x3 (mat, b, res, &det)) + return NULL; + + /* res donne les coordonnees u,v de l'intersection dans la + face et donne w la coordonnee de l'intersection dans + l'arete + */ + /* coordonnees dans l'arete */ + if (res[2] >= 1.0 - eps_prec || res[2] <= eps_prec) + return NULL; + + /* coordonnees dans la face */ + if (res[0] >= 1.0 + eps_prec || res[0] <= -eps_prec) + return NULL; + if (res[1] <= -eps_prec || res[1] >= 1. + eps_prec - res[0]) + return NULL; + + + if (res[0] == 1.0 || res[2] == 0.0 || res[0] == 0.0 || + res[1] == 1. - res[0] || res[1] == 0.0 || res[0] == 1.0){ + Msg(INFO, "facette p1 %12.5E %12.5E %12.5E\n", + f->V[0]->Pos.X, f->V[0]->Pos.Y, f->V[0]->Pos.Z); + Msg(INFO, "facette p2 %12.5E %12.5E %12.5E\n", + f->V[1]->Pos.X, f->V[1]->Pos.Y, f->V[1]->Pos.Z); + Msg(INFO, "facette p3 %12.5E %12.5E %12.5E\n", + f->V[2]->Pos.X, f->V[2]->Pos.Y, f->V[2]->Pos.Z); + Msg(INFO, "edge e2 %12.5E %12.5E %12.5E\n", + e->V[0]->Pos.X, e->V[0]->Pos.Y, e->V[0]->Pos.Z); + Msg(INFO, "edge e3 %12.5E %12.5E %12.5E\n", + e->V[1]->Pos.X, e->V[1]->Pos.Y, e->V[1]->Pos.Z); + Msg(INFO, "%22.15E %22.15E %22.15E \n", res[0], res[1], res[2]); + } + + + /* + printf("u v w = %22.15e %22.15e %22.15e\n",res[0],res[1],res[2]); + */ + v = Create_Vertex (++CurrentNodeNumber, + (1. - res[2]) * e->V[0]->Pos.X + res[2] * e->V[1]->Pos.X, + (1. - res[2]) * e->V[0]->Pos.Y + res[2] * e->V[1]->Pos.Y, + (1. - res[2]) * e->V[0]->Pos.Z + res[2] * e->V[1]->Pos.Z, + (1. - res[2]) * e->V[0]->lc + res[2] * e->V[1]->lc, 0.0); + v->ListSurf = List_Create (1, 1, sizeof (Surface *)); + if (DEBUG){ + Msg(INFO, "facette p1 %12.5E %12.5E %12.5E\n", + f->V[0]->Pos.X, f->V[0]->Pos.Y, f->V[0]->Pos.Z); + Msg(INFO,"facette p2 %12.5E %12.5E %12.5E\n", + f->V[1]->Pos.X, f->V[1]->Pos.Y, f->V[1]->Pos.Z); + Msg(INFO,"facette p3 %12.5E %12.5E %12.5E\n", + f->V[2]->Pos.X, f->V[2]->Pos.Y, f->V[2]->Pos.Z); + Msg(INFO,"Newv = %12.5E %12.5E %12.5E\n", v->Pos.X, v->Pos.Y, v->Pos.Z); + } + return v; +} + + +Vertex *Edge_Edge (Edge * e, Vertex * v1, Vertex * v2){ + Vertex *v; + int dir, dx1, dx2, dy1, dy2, dz1, dz2; + double mat[2][2]; + double b[3], res[3]; + double XmaxS, XminS, YmaxS, YminS, ZmaxS, ZminS, lc; + double XmaxV, XminV, YmaxV, YminV, ZmaxV, ZminV, val; + + if (!compareVertex (&e->V[0], &v1)) + return NULL; + if (!compareVertex (&e->V[1], &v1)) + return NULL; + if (!compareVertex (&e->V[0], &v2)) + return NULL; + if (!compareVertex (&e->V[1], &v2)) + return NULL; + + XminS = DMIN (e->V[0]->Pos.X, e->V[1]->Pos.X); + XmaxS = DMAX (e->V[0]->Pos.X, e->V[1]->Pos.X); + YminS = DMIN (e->V[0]->Pos.Y, e->V[1]->Pos.Y); + YmaxS = DMAX (e->V[0]->Pos.Y, e->V[1]->Pos.Y); + ZminS = DMIN (e->V[0]->Pos.Z, e->V[1]->Pos.Z); + ZmaxS = DMAX (e->V[0]->Pos.Z, e->V[1]->Pos.Z); + + XminV = DMIN (v1->Pos.X, v2->Pos.X); + XmaxV = DMAX (v1->Pos.X, v2->Pos.X); + YminV = DMIN (v1->Pos.Y, v2->Pos.Y); + YmaxV = DMAX (v1->Pos.Y, v2->Pos.Y); + ZminV = DMIN (v1->Pos.Z, v2->Pos.Z); + ZmaxV = DMAX (v1->Pos.Z, v2->Pos.Z); + + if (XmaxS < XminV || XmaxV < XminS) + return NULL; + if (YmaxS < YminV || YmaxV < YminS) + return NULL; + if (ZmaxS < ZminV || ZmaxV < ZminS) + return NULL; + + lc = myhypot (myhypot (XminV - XmaxV, YminV - YmaxV), ZminV - ZmaxV); + + if (e->V[1]->Pos.X != e->V[0]->Pos.X && + fabs (e->V[1]->Pos.X - e->V[0]->Pos.X) / lc > 1.e-2) + dx1 = 1; + else + dx1 = 0; + if (e->V[1]->Pos.Y != e->V[0]->Pos.Y && + fabs (e->V[1]->Pos.Y - e->V[0]->Pos.Y) / lc > 1.e-2) + dy1 = 1; + else + dy1 = 0; + if (e->V[1]->Pos.Z != e->V[0]->Pos.Z && + fabs (e->V[1]->Pos.Z - e->V[0]->Pos.Z) / lc > 1.e-2) + dz1 = 1; + else + dz1 = 0; + + if (v1->Pos.X != v2->Pos.X && + fabs (v1->Pos.X - v2->Pos.X) / lc > 1.e-2) + dx2 = 1; + else + dx2 = 0; + if (v1->Pos.Y != v2->Pos.Y && + fabs (v1->Pos.Y - v2->Pos.Y) / lc > 1.e-2) + dy2 = 1; + else + dy2 = 0; + if (v1->Pos.Z != v2->Pos.Z && + fabs (v1->Pos.Z - v2->Pos.Z) / lc > 1.e-2) + dz2 = 1; + else + dz2 = 0; + + /* + if(dx1 && dx2){ + mat[0][0] = e->V[1]->Pos.X - e->V[0]->Pos.X; + mat[0][1] = v1->Pos.X - v2->Pos.X; + b[0] = - e->V[0]->Pos.X + v1->Pos.X; + if(dy1 || dy2){ + mat[1][0] = e->V[1]->Pos.Y - e->V[0]->Pos.Y; + mat[1][1] = v1->Pos.Y - v2->Pos.Y; + b[1] = - e->V[0]->Pos.Y + v1->Pos.Y; + dir = 2; + } + else if(dz1 || dz2){ + mat[1][0] = e->V[1]->Pos.Z - e->V[0]->Pos.Z; + mat[1][1] = v1->Pos.Z - v2->Pos.Z; + b[1] = - e->V[0]->Pos.Z + v1->Pos.Z; + dir = 3; + } + } + else if (dy1 && dy2){ + mat[0][0] = e->V[1]->Pos.Y - e->V[0]->Pos.Y; + mat[0][1] = v1->Pos.Y - v2->Pos.Y; + b[0] = - e->V[0]->Pos.Y + v1->Pos.Y; + if(dy1 || dy2){ + mat[1][0] = e->V[1]->Pos.Y - e->V[0]->Pos.Y; + mat[1][1] = v1->Pos.Y - v2->Pos.Y; + b[1] = - e->V[0]->Pos.Y + v1->Pos.Y; + dir = 2; + } + else if(dz1 || dz2){ + mat[1][0] = e->V[1]->Pos.Z - e->V[0]->Pos.Z; + mat[1][1] = v1->Pos.Z - v2->Pos.Z; + b[1] = - e->V[0]->Pos.Z + v1->Pos.Z; + dir = 3; + } + } + */ + + mat[0][0] = e->V[1]->Pos.X - e->V[0]->Pos.X; + mat[0][1] = v1->Pos.X - v2->Pos.X; + b[0] = -e->V[0]->Pos.X + v1->Pos.X; + mat[1][0] = e->V[1]->Pos.Y - e->V[0]->Pos.Y; + mat[1][1] = v1->Pos.Y - v2->Pos.Y; + b[1] = -e->V[0]->Pos.Y + v1->Pos.Y; + + if (!sys2x2 (mat, b, res)){ + mat[1][0] = e->V[1]->Pos.Z - e->V[0]->Pos.Z; + mat[1][1] = v1->Pos.Z - v2->Pos.Z; + b[1] = -e->V[0]->Pos.Z + v1->Pos.Z; + if (!sys2x2 (mat, b, res)){ + mat[0][0] = e->V[1]->Pos.Y - e->V[0]->Pos.Y; + mat[0][1] = v1->Pos.Y - v2->Pos.Y; + b[0] = -e->V[0]->Pos.Y + v1->Pos.Y; + if (!sys2x2 (mat, b, res)){ + /* SEGMENTS PARALLELES */ + /* printf("systeme singulier\n"); + printf("arete %d -> %d\n",v1->Num,v2->Num); + printf("arete %12.5E %12.5E %12.5E --> %12.5E %12.5E %12.5E\n", + v1->Pos.X,v1->Pos.Y,v1->Pos.Z,v2->Pos.X,v2->Pos.Y,v2->Pos.Z); + printf("arete %12.5E %12.5E %12.5E --> %12.5E %12.5E %12.5E\n", + e->V[0]->Pos.X,e->V[0]->Pos.Y,e->V[0]->Pos.Z, + e->V[1]->Pos.X,e->V[1]->Pos.Y,e->V[1]->Pos.Z); + printf("%12.5E %12.5E\n",mat[0][0],mat[0][1]); + printf("%12.5E %12.5E\n",mat[1][0],mat[1][1]); + getchar(); + */ + return NULL; + } + else{ + dir = 1; + } + } + else{ + dir = 2; + } + } + else{ + dir = 3; + } + + if (res[0] <= eps_prec || res[0] >= 1.0 - eps_prec) + return NULL; + if (res[1] <= eps_prec || res[1] >= 1.0 - eps_prec) + return NULL; + + switch (dir){ + case 1: + val = e->V[0]->Pos.X * (1. - res[0]) + e->V[1]->Pos.X * res[0] - + v1->Pos.X * (1. - res[1]) - v2->Pos.X * res[1]; + break; + case 2: + val = e->V[0]->Pos.Y * (1. - res[0]) + e->V[1]->Pos.Y * res[0] - + v1->Pos.Y * (1. - res[1]) - v2->Pos.Y * res[1]; + break; + case 3: + val = e->V[0]->Pos.Z * (1. - res[0]) + e->V[1]->Pos.Z * res[0] - + v1->Pos.Z * (1. - res[1]) - v2->Pos.Z * res[1]; + break; + } + if (fabs (val / lc) > 1.e-08 /*08 */ ) + return NULL; + v = Create_Vertex (++CurrentNodeNumber, + (1. - res[0]) * e->V[0]->Pos.X + res[0] * e->V[1]->Pos.X, + (1. - res[0]) * e->V[0]->Pos.Y + res[0] * e->V[1]->Pos.Y, + (1. - res[0]) * e->V[0]->Pos.Z + res[0] * e->V[1]->Pos.Z, + (1. - res[0]) * e->V[0]->lc + res[0] * e->V[1]->lc, 0.0); + + v->ListSurf = List_Create (1, 1, sizeof (Surface *)); + return v; + +} + +int intersection_2_aretes (double Xa, double Ya, double Za, + double Xb, double Yb, double Zb, + double Xc, double Yc, double Zc, + double Xd, double Yd, double Zd, + int p1, int p2, int p3, int p4, + double *X, double *Y, double *Z){ + Vertex *v1, *v2, *v3, *v4, *v; + Edge e; + v1 = Create_Vertex (p1, Xa, Ya, Za, 0.0, 0.0); + v2 = Create_Vertex (p2, Xb, Yb, Zb, 0.0, 0.0); + v3 = Create_Vertex (p3, Xc, Yc, Zc, 0.0, 0.0); + v4 = Create_Vertex (p4, Xd, Yd, Zd, 0.0, 0.0); + + e.V[0] = v3; + e.V[1] = v4; + + if ((v = Edge_Edge (&e, v1, v2))){ + + *X = v->Pos.X; + *Y = v->Pos.Y; + *Z = v->Pos.Z; + + Free (v1); + Free (v2); + Free (v3); + Free (v4); + Free (v); + return 1; + } + else{ + Free (v1); + Free (v2); + Free (v3); + Free (v4); + Free (v); + return 0; + } + +} + +List_T *NewPoints; + +void Intersect_Edge_Simplexe (Edge * e, Simplex * s, Intersection * I){ + + int i, NbInt, NbVer, NbEdg, NbFac, j; + Vertex *v; + double XminS, YminS, ZminS, XmaxS, YmaxS, ZmaxS; + double XminE, YminE, ZminE, XmaxE, YmaxE, ZmaxE; + xNewv x; + + /* On initialise l'intersection */ + + I->NbVertex = I->NbFace = I->NbEdge = 0; + I->s = s; + I->e = e; + I->NbIntersect = 0; + + /* + On regarde d'abord si une intersection est possible en + calculant les boites de l'arete et du simplexe + */ + + if (s->V[3]){ + NbVer = 4; + NbEdg = 6; + NbFac = 4; + NbInt = 2; + } + else if (s->V[2]){ + NbVer = 3; + NbEdg = 3; + NbFac = 1; + NbInt = 33; + } + + XminE = DMIN (e->V[0]->Pos.X, e->V[1]->Pos.X); + XmaxE = DMAX (e->V[0]->Pos.X, e->V[1]->Pos.X); + YminE = DMIN (e->V[0]->Pos.Y, e->V[1]->Pos.Y); + YmaxE = DMAX (e->V[0]->Pos.Y, e->V[1]->Pos.Y); + ZminE = DMIN (e->V[0]->Pos.Z, e->V[1]->Pos.Z); + ZmaxE = DMAX (e->V[0]->Pos.Z, e->V[1]->Pos.Z); + + XminS = s->V[0]->Pos.X; + XmaxS = s->V[0]->Pos.X; + YminS = s->V[0]->Pos.Y; + YmaxS = s->V[0]->Pos.Y; + ZminS = s->V[0]->Pos.Z; + ZmaxS = s->V[0]->Pos.Z; + + for (i = 1; i < NbVer; i++){ + XminS = DMIN (XminS, s->V[i]->Pos.X); + XmaxS = DMAX (XmaxS, s->V[i]->Pos.X); + YminS = DMIN (YminS, s->V[i]->Pos.Y); + YmaxS = DMAX (YmaxS, s->V[i]->Pos.Y); + ZminS = DMIN (ZminS, s->V[i]->Pos.Z); + ZmaxS = DMAX (ZmaxS, s->V[i]->Pos.Z); + } + if (XmaxS < XminE || XmaxE < XminS) + return; + if (YmaxS < YminE || YmaxE < YminS) + return; + if (ZmaxS < ZminE || ZmaxE < ZminS) + return; + + /* + On regarde si l'arete coupe un des 4 noeuds du + simplexe + */ + + for (i = 0; i < NbVer; i++){ + if ((j = Edge_Node (e, s->V[i]))){ + I->V[I->NbVertex] = s->V[i]; + I->iV[I->NbVertex++] = i; + (I->NbIntersect)++; + if (j == 2){ + List_Replace (NewPoints, &s->V[i], compareVertex); + /* printf("l'arete intersecte un noeud\n"); */ + pvertex (s->V[i], s->V[i]); + pedge (e, e); + } + } + } + + if (I->NbIntersect == NbInt) + return; + + /* On regarde si l'arete coupe une autre arete */ + for (i = 0; i < NbEdg; i++){ + x.ef = 1; + x.e.V[0] = s->V[edges_tetra[i][0]]; + x.e.V[1] = s->V[edges_tetra[i][1]]; + if (Tree_Query (TreexNewv, &x)){ + v = x.newv; + I->E[I->NbEdge] = i; + I->VE[(I->NbEdge)++] = v; + (I->NbIntersect)++; + } + else if ((v = Edge_Edge (e, s->V[edges_tetra[i][0]], + s->V[edges_tetra[i][1]]))) { + List_Add (NewPoints, &v); + I->E[I->NbEdge] = i; + I->VE[(I->NbEdge)++] = v; + (I->NbIntersect)++; + x.newv = v; + Tree_Add (TreexNewv, &x); + } + } + + if (I->NbIntersect == NbInt) + return; + + /* + On regarde si l'arete coupe une face + */ + + for (i = 0; i < NbFac; i++){ + x.ef = 2; + x.f = &s->F[i]; + if (Tree_Query (TreexNewv, &x)){ + v = x.newv; + I->VF[I->NbFace] = v; + I->F[I->NbFace] = &s->F[i]; + I->iF[(I->NbFace)++] = i; + (I->NbIntersect)++; + } + else if ((v = Edge_Face (e, &s->F[i]))){ + I->VF[I->NbFace] = v; + List_Add (NewPoints, &v); + I->F[I->NbFace] = &s->F[i]; + I->iF[I->NbFace++] = i; + (I->NbIntersect)++; + x.newv = v; + Tree_Add (TreexNewv, &x); + } + } +} + + +void Intersect_Face_Simplexe (Face * f, Simplex * s, Intersection * I){ + + int i ; + Vertex *v; + double XminS, YminS, ZminS, XmaxS, YmaxS, ZmaxS; + double XminE, YminE, ZminE, XmaxE, YmaxE, ZmaxE; + xNewv x; + + /* On initialise l'intersection */ + + I->NbVertex = I->NbFace = I->NbEdge = 0; + I->s = s; + I->f = f; + I->NbIntersect = 0; + + /* + On regarde d'abord si une intersection est possible en + calculant les boites de l'arete et du simplexe + */ + + XminE = DMIN (DMIN (f->V[0]->Pos.X, f->V[1]->Pos.X), f->V[2]->Pos.X); + XmaxE = DMAX (DMAX (f->V[0]->Pos.X, f->V[1]->Pos.X), f->V[2]->Pos.X); + YminE = DMIN (DMIN (f->V[0]->Pos.Y, f->V[1]->Pos.Y), f->V[2]->Pos.Y); + YmaxE = DMAX (DMAX (f->V[0]->Pos.Y, f->V[1]->Pos.Y), f->V[2]->Pos.Y); + ZminE = DMIN (DMIN (f->V[0]->Pos.Z, f->V[1]->Pos.Z), f->V[2]->Pos.Z); + ZmaxE = DMAX (DMAX (f->V[0]->Pos.Z, f->V[1]->Pos.Z), f->V[2]->Pos.Z); + + XminS = s->V[0]->Pos.X; + XmaxS = s->V[0]->Pos.X; + YminS = s->V[0]->Pos.Y; + YmaxS = s->V[0]->Pos.Y; + ZminS = s->V[0]->Pos.Z; + ZmaxS = s->V[0]->Pos.Z; + + for (i = 1; i < 4; i++){ + XminS = DMIN (XminS, s->V[i]->Pos.X); + XmaxS = DMAX (XmaxS, s->V[i]->Pos.X); + YminS = DMIN (YminS, s->V[i]->Pos.Y); + YmaxS = DMAX (YmaxS, s->V[i]->Pos.Y); + ZminS = DMIN (ZminS, s->V[i]->Pos.Z); + ZmaxS = DMAX (ZmaxS, s->V[i]->Pos.Z); + } + if (XmaxS < XminE || XmaxE < XminS) + return; + if (YmaxS < YminE || YmaxE < YminS) + return; + if (ZmaxS < ZminE || ZmaxE < ZminS) + return; + + /* On regarde si l'arete coupe la facette */ + for (i = 0; i < 6; i++){ + x.ef = 1; + x.e.V[0] = s->V[edges_tetra[i][0]]; + x.e.V[1] = s->V[edges_tetra[i][1]]; + if (Tree_Query (TreexNewv, &x)){ + v = x.newv; + I->E[I->NbEdge] = i; + I->VE[(I->NbEdge)++] = v; + (I->NbIntersect)++; + } + else if ((v = Edge_Face (&x.e, f))){ + /* printf("%d %d %d %d\n",s->V[0]->Num,s->V[1]->Num,s->V[2]->Num,s->V[3]->Num); */ + List_Add (NewPoints, &v); + I->E[I->NbEdge] = i; + I->VE[I->NbEdge] = v; + (I->NbEdge)++; + (I->NbIntersect)++; + x.newv = v; + Tree_Add (TreexNewv, &x); + } + } +} + +Tree_T *Actual_Tree, *TetAdd, *TetDel; + +static void _Add (void *data, void *dum){ + Tree_Add (Actual_Tree, data); +} +static void _Del (void *data, void *dum){ + Tree_Suppress (Actual_Tree, data); +} + +void Recover_Edge (void *a, void *b){ + Simplex *s; + Intersection I; + + s = *(Simplex **) a; + Intersect_Edge_Simplexe (TheEdge, s, &I); + if (I.NbIntersect){ + cut_tetraedre (&I, TetAdd, TetDel, THEVOL->Vertices); + } +} + +void Recover_Face (void *a, void *b){ + Simplex *s; + Intersection I; + + s = *(Simplex **) a; + Intersect_Face_Simplexe (TheFace, s, &I); + if (I.NbEdge){ + cut_tetraedre (&I, TetAdd, TetDel, THEVOL->Vertices); + } +} + +static double volume; + +static void VSIM (void *a, void *b){ + Simplex *S; + S = *(Simplex **) a; + if (S->V[3]) + volume += fabs (S->Volume_Simplexe ()); +} + +Vertex *DEPART; + +int comparePos (const void *a, const void *b){ + Vertex *q, *w; + double d1, d2; + q = *(Vertex **) a; + w = *(Vertex **) b; + + d1 = DSQR (q->Pos.X - DEPART->Pos.X) + + DSQR (q->Pos.Y - DEPART->Pos.Y) + + DSQR (q->Pos.Z - DEPART->Pos.Z); + d2 = DSQR (w->Pos.X - DEPART->Pos.X) + + DSQR (w->Pos.Y - DEPART->Pos.Y) + + DSQR (w->Pos.Z - DEPART->Pos.Z); + if (d1 < d2) + return 1; + if (d1 > d2) + return -1; + + exit (1); + return 1; +} + +List_T *ListFaces; + +void findFaces (void *a, void *b){ + Simplex *s; + int i; + s = *(Simplex **) a; + if (List_Search (NewPoints, &s->V[0], compareVertex) || + List_Search (NewPoints, &s->V[1], compareVertex) || + List_Search (NewPoints, &s->V[2], compareVertex) || + List_Search (NewPoints, &s->V[3], compareVertex)) + /* + printf("%d %d %d %d\n",s->V[0]->Num,s->V[1]->Num,s->V[2]->Num,s->V[3]->Num); + */ + for (i = 0; i < 4; i++){ + if (List_Search (NewPoints, &s->F[i].V[0], compareVertex) && + List_Search (NewPoints, &s->F[i].V[1], compareVertex) && + List_Search (NewPoints, &s->F[i].V[2], compareVertex)) + List_Replace (ListFaces, &s->F[i], compareFace); + } +} + +void findEdges (void *a, void *b){ +} + +Simplex * Create_Simplex_MemeSens (Simplex * sold, Vertex * v1, Vertex * v2, Vertex * v3){ + + Simplex *s; + + if (memesens (sold->V[0], sold->V[1], sold->V[2], v1, v2, v3) > 0.0){ + s = Create_Simplex (v1, v2, v3, NULL); + } + else{ + s = Create_Simplex (v2, v1, v3, NULL); + } + s->iEnt = sold->iEnt; + return s; +} + +int Coherence (Volume * v, Mesh * m){ + int i, j, k, Np, Nh; + Surface *s; + Vertex *ver1, V1, *ver2, V2; + Face Face; + static Edge E, *pE1, *pE2, *pE3; + Simplex *simp, *simp1; + List_T *MissingEdges, *MissingFaces; + + FACE_DIMENSION = 2; + + ver1 = &V1; + ver2 = &V2; + + THEVOL = v; + + Remise_A_Zero (); + + create_Edges (v); + MissingEdges = Missing_Edges (v); + + /* Edge Swapping */ + create_Quads (v); + + /* Missing Edges */ + create_Edges (v); + MissingEdges = Missing_Edges (v); + + /* Missing Faces */ + create_Faces (v); + MissingFaces = Missing_Faces (v); + + /* Edges Recovery */ + Msg(STATUS, "Boundary Edges Recovery"); + + volume = 0; + Tree_Action (v->Simplexes, VSIM); + Msg(INFO, "Volume == %12.5E", volume); + + Msg(INFO, " ==================================="); + Msg(INFO, " (1) Nombre d'aretes manquantes %3d", List_Nbr (Missing)); + Msg(INFO, " ==================================="); + for (i = 0; i < List_Nbr (Missing); i++){ + + pE1 = (Edge *) List_Pointer (Missing, i); + TheEdge = pE1; + + TreexNewv = Tree_Create (sizeof (xNewv), compxNewv); + NewPoints = List_Create (1, 1, sizeof (Vertex *)); + TetAdd = Tree_Create (sizeof (Simplex *), compareSimplex); + TetDel = Tree_Create (sizeof (Simplex *), compareSimplex); + + Tree_Action (v->Simplexes, Recover_Edge); + Actual_Tree = v->Simplexes; + Tree_Action (TetAdd, _Add); + Tree_Action (TetDel, _Del); + pE1->Liste = NewPoints; + /* + if(CTX.mesh.nb_smoothing){ + DEPART = pE1->V[0]; + List_Tri(NewPoints,comparePos); + for(j=0;j<List_Nbr(NewPoints);j++){ + List_Read(NewPoints,j,&ver1); + u = (double)(j+1) / (double)(List_Nbr(NewPoints)+1); + ver1->Pos.X = u * pE1->V[1]->Pos.X + (1.-u) * pE1->V[0]->Pos.X; + ver1->Pos.Y = u * pE1->V[1]->Pos.Y + (1.-u) * pE1->V[0]->Pos.Y; + ver1->Pos.Z = u * pE1->V[1]->Pos.Z + (1.-u) * pE1->V[0]->Pos.Z; + } + } + */ + Msg(INFO, "Traitement de %d -> %d", pE1->V[0]->Num, pE1->V[1]->Num); + Msg(INFO, "=> %d divisions", List_Nbr (NewPoints)); + + if (!List_Nbr (NewPoints)){ + Msg(INFO, "%g %g %g", pE1->V[0]->Pos.X, pE1->V[0]->Pos.Y, pE1->V[0]->Pos.Z); + Msg(INFO, "%g %g %g", pE1->V[1]->Pos.X, pE1->V[1]->Pos.Y, pE1->V[1]->Pos.Z); + Msg(ERROR, "Missing Edge Without Any Intersection"); + } + + } + + volume = 0; + Tree_Action (v->Simplexes, VSIM); + Msg(INFO, "Volume == %12.5E", volume); + Msg(STATUS, "Boundary Faces Recovery"); + + /* Missing Faces */ + + Msg(INFO, " ==================================="); + Msg(INFO, " (1) Nombre de facettes manquantes %3d", List_Nbr (MissingFaces)); + Msg(INFO, " ==================================="); + + for (i = 0; i < List_Nbr (MissingS); i++){ + List_Read (MissingS, i, &simp); + TheFace = &simp->F[0]; + Msg(INFO, "missing face %6d %6d %6d", simp->F[0].V[0]->Num, + simp->F[0].V[1]->Num, simp->F[0].V[2]->Num); + E.V[0] = simp->F[0].V[0]; + E.V[1] = simp->F[0].V[1]; + pE1 = (Edge *) List_PQuery (Missing, &E, compareedge); + E.V[0] = simp->F[0].V[1]; + E.V[1] = simp->F[0].V[2]; + pE2 = (Edge *) List_PQuery (Missing, &E, compareedge); + E.V[0] = simp->F[0].V[2]; + E.V[1] = simp->F[0].V[0]; + pE3 = (Edge *) List_PQuery (Missing, &E, compareedge); + + /* On verifie si c'est simple c a d si les tetraedres + couvrent entierement la face */ + NewPoints = List_Create (3, 1, sizeof (Vertex *)); + List_Add (NewPoints, &simp->F[0].V[0]); + if (pE1) + for (j = 0; j < List_Nbr (pE1->Liste); j++) + List_Add (NewPoints, List_Pointer (pE1->Liste, j)); + List_Add (NewPoints, &simp->F[0].V[1]); + if (pE2) + for (j = 0; j < List_Nbr (pE2->Liste); j++) + List_Add (NewPoints, List_Pointer (pE2->Liste, j)); + List_Add (NewPoints, &simp->F[0].V[2]); + if (pE3) + for (j = 0; j < List_Nbr (pE3->Liste); j++) + List_Add (NewPoints, List_Pointer (pE3->Liste, j)); + ListFaces = List_Create (2, 2, sizeof (Face)); + Tree_Action (v->Simplexes, findFaces); + + Nh = List_Nbr (NewPoints); + + /* il reste des intersections */ + + if (List_Nbr (ListFaces) != Nh - 2){ + /* + printf("Recherche des intersections\n"); + printf("La face initiale comprend %d faces existantes\n",List_Nbr(ListFaces)); + printf("La face est divisee en %d points\n",List_Nbr(NewPoints)); + */ + TreexNewv = Tree_Create (sizeof (xNewv), compxNewv); + TetAdd = Tree_Create (sizeof (Simplex *), compareSimplex); + TetDel = Tree_Create (sizeof (Simplex *), compareSimplex); + Tree_Action (v->Simplexes, Recover_Face); + /* + printf("La face est divisee en %d points %d %d \n", + List_Nbr(NewPoints),Tree_Nbr(TetAdd),Tree_Nbr(TetDel)); + */ + Actual_Tree = v->Simplexes; + Tree_Action (TetAdd, _Add); + Tree_Action (TetDel, _Del); + ListFaces = List_Create (2, 2, sizeof (Face)); + Tree_Action (v->Simplexes, findFaces); + } + + Np = List_Nbr (NewPoints); + + if (1 || List_Nbr (ListFaces) == 2 * (Np - 1) - Nh){ + + Msg(INFO, "La face est recuperable (%d <--> %d=2*(%d-1)-%d)*****", + List_Nbr (ListFaces), 2 * (Np - 1) - Nh, Np, Nh); + + for (j = 0; j < List_Nbr (v->Surfaces); j++){ + List_Read (v->Surfaces, j, &s); + if (Tree_Search (s->Simplexes, &simp)){ + for (k = 0; k < List_Nbr (ListFaces); k++){ + List_Read (ListFaces, k, &Face); + simp1 = Create_Simplex_MemeSens (simp, Face.V[0], Face.V[1], Face.V[2]); + Tree_Add (s->Simplexes, &simp1); + Tree_Replace (s->Vertices, &Face.V[0]); + Tree_Replace (s->Vertices, &Face.V[1]); + Tree_Replace (s->Vertices, &Face.V[2]); + Tree_Replace (v->Vertices, &Face.V[0]); + Tree_Replace (v->Vertices, &Face.V[1]); + Tree_Replace (v->Vertices, &Face.V[2]); + } + Tree_Suppress (s->Simplexes, &simp); + } + } + } + else{ + Msg(INFO, "***** La face est irrecuperable (%d <--> %d=2*(%d-1)-%d)*****", + List_Nbr (ListFaces), 2 * (Np - 1) - Nh, Np, Nh); + for (k = 0; k < List_Nbr (ListFaces); k++){ + List_Read (ListFaces, k, &Face); + Msg(INFO, "face %d %d %d", Face.V[0]->Num, Face.V[1]->Num, Face.V[2]->Num); + } + Msg(ERROR, "Unable To Recover One Face"); + Tree_Action (v->Simplexes, findEdges); + } + } + volume = 0; + Tree_Action (v->Simplexes, VSIM); + Msg(INFO, "Volume apres la recup === %12.5E", volume); + + /* Missing Edges */ + create_Edges (v); + MissingEdges = Missing_Edges (v); + + /* Missing Faces */ + create_Faces (v); + MissingFaces = Missing_Faces (v); + + Msg(INFO, "Verification finale : %d edges manquantes", List_Nbr (MissingEdges)); + Msg(INFO, "Verification finale : %d faces manquantes", List_Nbr (MissingFaces)); + + Impression_Resultats (); + + Link_Simplexes (NULL, v->Simplexes); + Msg(STATUS, "Volume Recovery"); + Restore_Volume (v); + + if (List_Nbr (MissingFaces) || List_Nbr (MissingEdges)){ + return 0; + } + return 1; +} + +/* A partir d'un maillage de volume qui respecte la + frontiere, on attribue a chaque tetraedre son + numero de volume */ + +List_T *ListSurfaces, *ListAllSurf; +Tree_T *keep; +Simplex *SIMP; +int iVolume; + +void attribueVolume (void *a, void *b){ + Simplex *s; + s = *(Simplex **) a; + s->iEnt = iVolume; +} + +void Trouve_Simplex (void *a, void *b){ + Simplex *s; + if (SIMP != NULL) + return; + s = *(Simplex **) a; + if (s->iEnt < 0) + SIMP = s; +} + +void Trouve_Simplex_Bord (void *a, void *b){ + Simplex *s; + + if (SIMP != NULL) + return; + s = *(Simplex **) a; + if (s->V[0]->Num < 0 || s->V[1]->Num < 0 || s->V[2]->Num < 0 || s->V[3]->Num < 0) + SIMP = s; +} + +void SurfacesDansVolume (Volume * v, List_T * ListAllSurf){ + int i, iseg; + Surface *s; + for (i = 0; i < List_Nbr (v->Surfaces); i++) + { + List_Read (v->Surfaces, i, &s); + iseg = abs (s->Num); + List_Replace (ListAllSurf, &iseg, fcmp_int); + } +} + +int isListaVolume (List_T * ListSurf, Mesh * M){ + int NN, i, j, srf; + bool found; + Surface *Surf; + Volume *v; + List_T *AllVolumes = Tree2List (M->Volumes); + + for (i = 0; i < List_Nbr (AllVolumes); i++){ + List_Read (AllVolumes, i, &v); + found = true; + NN = 0; + if (v->Typ == MSH_VOLUME){ + for (j = 0; j < List_Nbr (v->Surfaces); j++){ + List_Read (v->Surfaces, j, &Surf); + srf = abs (Surf->Num); + if (!List_Search (ListSurf, &srf, fcmp_int)){ + found = false; + } + else + NN++; + } + if (found && NN == List_Nbr (ListSurf)) + return v->Num; + } + } + return 0; +} + +int compareSimpSurf (const void *a, const void *b){ + Simplex *q, *w; + q = *(Simplex **) a; + w = *(Simplex **) b; + return compareFace (&q->F[0], &w->F[0]); +} + +List_T *StackSimp; +#define MAX_DEPTH 500 + +void recur_trouve_volume (Simplex * s, int *Depth){ + int i, j; + Simplex *pS, S; + + if (s->iEnt != -1) + return; + + if ((*Depth) > MAX_DEPTH) { + List_Add (StackSimp, &s); + return; + } + + (*Depth)++; + s->iEnt = -2; + Tree_Add (keep, &s); + for (i = 0; i < 4; i++){ + pS = &S; + pS->F[0] = s->F[i]; + if (Tree_Query (FacesTree, &pS) && List_Search (ListAllSurf, &pS->iEnt, fcmp_int)){ + j = abs (pS->iEnt); + List_Replace (ListSurfaces, &j, fcmp_int); + } + else if (s->S[i] && s->S[i] != &MyNewBoundary){ + recur_trouve_volume (s->S[i], Depth); + } + } + (*Depth)--; +} + +void Restore_Volume (Volume * v){ + int N; + int j, i, depth; + Surface *s; + + StackSimp = List_Create (100, 100, sizeof (Simplex *)); + + FacesTree = Tree_Create (sizeof (Simplex *), compareSimpSurf); + Actual_Tree = FacesTree; + for (j = 0; j < List_Nbr (v->Surfaces); j++){ + List_Read (v->Surfaces, j, &s); + Tree_Action (s->Simplexes, _Add); + } + + ListSurfaces = List_Create (2, 2, sizeof (int)); + iVolume = -1; + Tree_Action (v->Simplexes, attribueVolume); + + /* Les simplexes sur le bord exterieur sont elimines */ + + ListAllSurf = List_Create (10, 3, sizeof (int)); + SurfacesDansVolume (v, ListAllSurf); + + SIMP = NULL; + Tree_Action (v->Simplexes, Trouve_Simplex_Bord); + + if (SIMP){ + List_Add (StackSimp, &SIMP); + keep = Tree_Create (sizeof (Simplex *), compareQuality); + depth = 0; + i = 0; + do{ + List_Read (StackSimp, i, &SIMP); + recur_trouve_volume (SIMP, &depth); + } while (++i < List_Nbr (StackSimp)); + List_Reset (StackSimp); + + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &j); + Msg(INFO, "surf : %d ", j); + } + + iVolume = 0; + Tree_Action (keep, attribueVolume); + Tree_Delete (keep); + List_Reset (ListSurfaces); + } + + while (1){ + SIMP = NULL; + keep = Tree_Create (sizeof (Simplex *), compareQuality); + Tree_Action (v->Simplexes, Trouve_Simplex); + if (!SIMP) + break; + List_Add (StackSimp, &SIMP); + depth = 0; + i = 0; + do{ + List_Read (StackSimp, i, &SIMP); + recur_trouve_volume (SIMP, &depth); + }while (++i < List_Nbr (StackSimp)); + + iVolume = isListaVolume (ListSurfaces, THEM); + + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &j); + Msg(INFO, "surf : %d ", j); + } + + N = Tree_Nbr (keep); + Msg(INFO, "volume %d maillage initial %d simplexes", iVolume, N); + Tree_Action (keep, attribueVolume); + Tree_Delete (keep); + List_Reset (ListSurfaces); + List_Reset (StackSimp); + } +} diff --git a/Mesh/3D_Divide.cpp b/Mesh/3D_Divide.cpp new file mode 100644 index 0000000000000000000000000000000000000000..006294fac0a631209f6c97a014bf00bd50a3c7d4 --- /dev/null +++ b/Mesh/3D_Divide.cpp @@ -0,0 +1,705 @@ +/* Routine de division des elements tetraedriques + ou triangulaires + + 1 triangle -> 4 triangles ; + 1 tetraedre -> noeuds 1 2 3 4 + faces 1 4 2 + 1 +*/ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" + +extern int edges_tetra[6][2]; +extern int CurrentNodeNumber; + +static Tree_T *New_Edges = NULL; +static int IENT; + +typedef struct { + int i; + int j; +}nxn; + +static int are_exists (Vertex *v1, Vertex *v2){ + nxn nx; + nx.i = IMAX(v1->Num,v2->Num); + nx.j = IMIN(v1->Num,v2->Num); + return Tree_Search(New_Edges,&nx); +} + +static void are_add (Vertex *v1, Vertex *v2){ + nxn nx; + nx.i = IMAX(v1->Num,v2->Num); + nx.j = IMIN(v1->Num,v2->Num); + Tree_Add(New_Edges,&nx); +} + +static int compnxn (const void *a, const void *b){ + nxn *q,*w; + q = (nxn*)a; + w = (nxn*)b; + if(q->i>w->i)return 1; + if(q->i<w->i)return -1; + if(q->j>w->j)return 1; + if(q->j<w->j)return -1; + return 0; +} + +static int FF,FV,EV,EE,FE,EEE,EEEE; +void Remise_A_Zero (void){ + FF=EE=FV=EV=FE=EEE=EEEE=0; +} + +void Impression_Resultats (void){ + Msg(INFOS,"==============================================="); + Msg(INFOS," Surface coherence results: intersections:"); + Msg(INFOS," %d EV, %d EE, %d FV, %d FF, %d FE, %d EEE, %d EEEE", + EV,EE,FV,FF,FE,EEE,EEEE); + Msg(INFOS,"==============================================="); +} + +int PARLE = 0; + +void cut_prism (Vertex * v1, Vertex * v2, Vertex * v3, + Vertex * v4, Vertex * v5, Vertex * v6, + Tree_T * newpoints, Tree_T * AddedTet){ + + Simplex *news; + Vertex *e1; + + Msg (INFOS, "Prism Cut"); + + /* test des meilleures aretes a creer */ + /* + if(!are_exists(v1,v6) && + !are_exists(v4,v3)){ + + if(fabs(angle_3p(v1,v4,v6)) > + fabs(angle_3p(v4,v6,v3))){ + are_add(v4,v3); + } + else{ + are_add(v1,v6); + } + } + + if(!are_exists(v3,v5) && + !are_exists(v6,v2)){ + + if(fabs(angle_3p(v6,v5,v2)) > + fabs(angle_3p(v5,v2,v3))){ + are_add(v5,v3); + } + else{ + are_add(v2,v6); + } + } + + if(!are_exists(v1,v5) && + !are_exists(v4,v2)){ + + if(fabs(angle_3p(v1,v4,v5)) > + fabs(angle_3p(v4,v5,v2))){ + are_add(v4,v2); + } + else{ + are_add(v1,v5); + } + } + */ + if (!are_exists (v1, v5) && //OK + !are_exists (v6, v2) && + !are_exists (v6, v1)){ + news = Create_Simplex (v1, v2, v3, v4); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v4, v5, v6, v3); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v2, v4, v5, v3); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + are_add (v4, v2); + are_add (v5, v3); + are_add (v4, v3); + } + else if (!are_exists (v1, v5) && //OK + !are_exists (v3, v5) && + !are_exists (v1, v6)){ + news = Create_Simplex (v1, v2, v3, v4); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v4, v5, v6, v2); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v4, v2, v6, v3); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + are_add (v4, v2); + are_add (v2, v6); + are_add (v4, v3); + } + else if (!are_exists (v1, v5) && //OK + !are_exists (v3, v5) && + !are_exists (v4, v3)){ + news = Create_Simplex (v1, v2, v3, v6); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v4, v5, v6, v2); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v2, v4, v6, v1); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + are_add (v4, v2); + are_add (v2, v6); + are_add (v6, v1); + } + else if (!are_exists (v4, v2) && //OK + !are_exists (v6, v2) && + !are_exists (v6, v1)){ + news = Create_Simplex (v1, v2, v3, v5); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v4, v5, v6, v3); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v1, v4, v5, v3); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + are_add (v5, v1); + are_add (v5, v3); + are_add (v4, v3); + } + else if (!are_exists (v4, v2) && //OK + !are_exists (v6, v2) && + !are_exists (v4, v3)){ + news = Create_Simplex (v1, v2, v3, v5); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v4, v5, v6, v1); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v1, v3, v5, v6); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + are_add (v5, v1); + are_add (v5, v3); + are_add (v6, v1); + } + else if (!are_exists (v4, v2) && //OK + !are_exists (v3, v5) && + !are_exists (v4, v3)){ + news = Create_Simplex (v1, v2, v3, v6); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v4, v5, v6, v1); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (v1, v2, v5, v6); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + are_add (v5, v1); + are_add (v2, v6); + are_add (v6, v1); + } + + else if (are_exists (v6, v1) && + are_exists (v5, v3) && + are_exists (v4, v2)) { + Msg(INFOS, "Steiner Prism 1 found !"); + + e1 = Create_Vertex (++CurrentNodeNumber, + (v1->Pos.X + v2->Pos.X + v3->Pos.X + v4->Pos.X + v5->Pos.X + v6->Pos.X) / 6., + (v1->Pos.Y + v2->Pos.Y + v3->Pos.Y + v4->Pos.Y + v5->Pos.Y + v6->Pos.Y) / 6., + (v1->Pos.Z + v2->Pos.Z + v3->Pos.Z + v4->Pos.Z + v5->Pos.Z + v6->Pos.Z) / 6., + (v1->lc + v2->lc + v3->lc + v4->lc + v5->lc + v6->lc) / 6., + 0.0); + Tree_Add (newpoints, &e1); + news = Create_Simplex (e1, v6, v1, v4); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (e1, v6, v1, v3); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (e1, v5, v3, v6); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (e1, v5, v3, v2); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (e1, v4, v2, v1); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (e1, v4, v2, v5); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + } + + else if (are_exists (v4, v3) && + are_exists (v6, v2) && + are_exists (v5, v1)){ + Msg(INFOS, "Steiner Prism 2 found !"); + + e1 = Create_Vertex (++CurrentNodeNumber, + (v1->Pos.X + v2->Pos.X + v3->Pos.X + v4->Pos.X + v5->Pos.X + v6->Pos.X) / 6., + (v1->Pos.Y + v2->Pos.Y + v3->Pos.Y + v4->Pos.Y + v5->Pos.Y + v6->Pos.Y) / 6., + (v1->Pos.Z + v2->Pos.Z + v3->Pos.Z + v4->Pos.Z + v5->Pos.Z + v6->Pos.Z) / 6., + (v1->lc + v2->lc + v3->lc + v4->lc + v5->lc + v6->lc) / 6., + 0.0); + Tree_Add (newpoints, &e1); + news = Create_Simplex (e1, v4, v3, v6); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (e1, v4, v3, v1); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (e1, v6, v2, v5); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (e1, v6, v2, v3); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (e1, v5, v1, v4); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + news = Create_Simplex (e1, v5, v1, v2); + news->iEnt = IENT; + Tree_Add (AddedTet, &news); + + } + else{ + Msg (ERROR, "Uncoherent prism !"); + } +} + + +void cut_tetraedre (Intersection * pI, Tree_T * AddedTet, Tree_T * TetDel, + Tree_T * newpoints){ + int i; + nxn nx; + Simplex *s; + Vertex *common, *other1, *other2, *lonely, *e1, *e2, *point1, *point2, *point3, *point4; + Vertex *v1, *v2, *v3, *v4, *v5, *v6, *v7, *v8; + + if (!New_Edges) + New_Edges = Tree_Create (sizeof (nxn), compnxn); + + IENT = pI->s->iEnt; + + /* 1 tetraedre -> 2 tetraedres */ + + if ((pI->NbEdge == 0) && (pI->NbFace == 0)){ + } + else if (pI->NbEdge == 1 && pI->NbFace == 0){ + + Tree_Add (TetDel, &pI->s); + + + EV++; + if (pI->E[0] == 0){ + /* Verifie */ + s = Create_Simplex (pI->s->V[2], pI->s->V[3], pI->s->V[0], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s = Create_Simplex (pI->s->V[1], pI->s->V[3], pI->s->V[2], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + } + if (pI->E[0] == 1){ + /* Verifie */ + s = Create_Simplex (pI->s->V[0], pI->s->V[3], pI->s->V[2], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[3], pI->s->V[1], pI->s->V[0], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + } + if (pI->E[0] == 2){ + /* Verifie */ + s = Create_Simplex (pI->s->V[0], pI->s->V[1], pI->s->V[3], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[1], pI->s->V[3], pI->s->V[2], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + } + if (pI->E[0] == 3){ + /* Verifie */ + s = Create_Simplex (pI->s->V[0], pI->s->V[1], pI->s->V[2], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[1], pI->s->V[2], pI->s->V[3], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + } + if (pI->E[0] == 4){ + /* Verifie */ + s = Create_Simplex (pI->s->V[2], pI->s->V[0], pI->s->V[1], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[1], pI->s->V[3], pI->s->V[0], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + } + if (pI->E[0] == 5){ + /* Verifie */ + s = Create_Simplex (pI->s->V[0], pI->s->V[3], pI->s->V[2], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[0], pI->s->V[1], pI->s->V[2], pI->VE[0]); + if (PARLE) + printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + } + } + else if (pI->NbVertex == 1 && pI->NbFace == 1){ + FV++; + Tree_Add (TetDel, &pI->s); + s = Create_Simplex (pI->V[0], pI->VF[0], pI->F[0]->V[0], pI->F[0]->V[1]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->V[0], pI->VF[0], pI->F[0]->V[1], pI->F[0]->V[2]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->V[0], pI->VF[0], pI->F[0]->V[2], pI->F[0]->V[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + } + + /* DU CUL LES COPINES + TROIS ARETES QUI PENETRENT LA MEME FACE + TRIPLETTE, TRIPLE PENETRATION */ + + else if (pI->NbEdge == 3){ + EEE++; + /* + printf("tet %d %d %d %d\n",pI->s->V[0]->Num,pI->s->V[1]->Num,pI->s->V[2]->Num,pI->s->V[3]->Num); + printf("ed %d %d\n",pI->s->V[edges_tetra[pI->E[0]][0]]->Num, + pI->s->V[edges_tetra[pI->E[0]][1]]->Num); + printf("ed %d %d\n",pI->s->V[edges_tetra[pI->E[1]][0]]->Num, + pI->s->V[edges_tetra[pI->E[1]][1]]->Num); + printf("ed %d %d\n",pI->s->V[edges_tetra[pI->E[2]][0]]->Num, + pI->s->V[edges_tetra[pI->E[2]][1]]->Num); + */ + Tree_Add (TetDel, &pI->s); + v4 = pI->VE[0]; + v5 = pI->VE[1]; + v6 = pI->VE[2]; + if (pI->E[0] == 0 && pI->E[1] == 1 && pI->E[2] == 5){ + v1 = pI->s->V[0]; + v2 = pI->s->V[2]; + v3 = pI->s->V[3]; + v7 = pI->s->V[1]; + } + else if (pI->E[0] == 0 && pI->E[1] == 2 && pI->E[2] == 3){ + v1 = pI->s->V[1]; + v2 = pI->s->V[2]; + v3 = pI->s->V[3]; + v7 = pI->s->V[0]; + } + else if (pI->E[0] == 1 && pI->E[1] == 2 && pI->E[2] == 4){ + v1 = pI->s->V[1]; + v2 = pI->s->V[0]; + v3 = pI->s->V[3]; + v7 = pI->s->V[2]; + } + else if (pI->E[0] == 3 && pI->E[1] == 4 && pI->E[2] == 5){ + v1 = pI->s->V[0]; + v2 = pI->s->V[2]; + v3 = pI->s->V[1]; + v7 = pI->s->V[3]; + } + else{ + Msg (ERROR, "Tree Edges Cut Without Common Point"); + return; + } + + s = Create_Simplex (v4, v5, v6, v7); + Tree_Add (AddedTet, &s); + cut_prism (v1, v2, v3, v4, v5, v6, newpoints, AddedTet); + + } + + else if (pI->NbFace == 2){ + FF++; + point3 = NULL; + Tree_Add (TetDel, &pI->s); + if (PARLE){ + printf ("simp = %d %d %d %d\n", pI->s->V[0]->Num, pI->s->V[1]->Num, pI->s->V[2]->Num, pI->s->V[3]->Num); + printf ("are = %d %d\n", pI->VF[0]->Num, pI->VF[1]->Num); + printf ("face1 = %d %d %d\n", pI->F[0]->V[0]->Num, pI->F[0]->V[1]->Num, pI->F[0]->V[2]->Num); + printf ("face2 = %d %d %d\n", pI->F[1]->V[0]->Num, pI->F[1]->V[1]->Num, pI->F[1]->V[2]->Num); + } + for (i = 0; i < 4; i++){ + if (compareVertex (&pI->F[0]->V[0], &pI->s->V[i]) && + compareVertex (&pI->F[0]->V[1], &pI->s->V[i]) && + compareVertex (&pI->F[0]->V[2], &pI->s->V[i])) + point1 = pI->s->V[i]; + else if (compareVertex (&pI->F[1]->V[0], &pI->s->V[i]) && + compareVertex (&pI->F[1]->V[1], &pI->s->V[i]) && + compareVertex (&pI->F[1]->V[2], &pI->s->V[i])) + point2 = pI->s->V[i]; + else if (point3) + point4 = pI->s->V[i]; + else + point3 = pI->s->V[i]; + } + s = Create_Simplex (point3, point4, pI->VF[0], pI->VF[1]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + if (PARLE) + printf ("simp = %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s = Create_Simplex (point1, point4, pI->VF[0], pI->VF[1]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + if (PARLE) + printf ("simp = %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s = Create_Simplex (point1, point3, pI->VF[0], pI->VF[1]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + if (PARLE) + printf ("simp = %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s = Create_Simplex (point2, point4, point1, pI->VF[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + if (PARLE) + printf ("simp = %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + s = Create_Simplex (point2, point3, point1, pI->VF[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + if (PARLE) + printf ("simp = %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + } + + else if (pI->NbEdge == 2){ + EE++; + Tree_Add (TetDel, &pI->s); + if (pI->E[0] == 1 && pI->E[1] == 3){ + s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[1], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[2], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[1], pI->VE[1], pI->s->V[3], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[2], pI->VE[1], pI->s->V[3], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + return; + } + else if (pI->E[0] == 2 && pI->E[1] == 5){ + s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[1], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[1], pI->VE[1], pI->s->V[2], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[3], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[2], pI->VE[1], pI->s->V[3], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + return; + } + + else if (pI->E[0] == 0 && pI->E[1] == 4){ + s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[2], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[1], pI->VE[1], pI->s->V[2], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[3], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (pI->s->V[1], pI->VE[1], pI->s->V[3], pI->VE[0]); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + return; + } + + e1 = pI->VE[0]; + e2 = pI->VE[1]; + + if (!compareVertex (&pI->s->V[edges_tetra[pI->E[0]][0]], &pI->s->V[edges_tetra[pI->E[1]][0]])){ + common = pI->s->V[edges_tetra[pI->E[0]][0]]; + other1 = pI->s->V[edges_tetra[pI->E[0]][1]]; + other2 = pI->s->V[edges_tetra[pI->E[1]][1]]; + } + else if (!compareVertex (&pI->s->V[edges_tetra[pI->E[0]][0]], &pI->s->V[edges_tetra[pI->E[1]][1]])){ + common = pI->s->V[edges_tetra[pI->E[0]][0]]; + other1 = pI->s->V[edges_tetra[pI->E[0]][1]]; + other2 = pI->s->V[edges_tetra[pI->E[1]][0]]; + } + else if (!compareVertex (&pI->s->V[edges_tetra[pI->E[0]][1]], &pI->s->V[edges_tetra[pI->E[1]][0]])){ + common = pI->s->V[edges_tetra[pI->E[0]][1]]; + other1 = pI->s->V[edges_tetra[pI->E[0]][0]]; + other2 = pI->s->V[edges_tetra[pI->E[1]][1]]; + } + else if (!compareVertex (&pI->s->V[edges_tetra[pI->E[0]][1]], &pI->s->V[edges_tetra[pI->E[1]][1]])){ + common = pI->s->V[edges_tetra[pI->E[0]][1]]; + other1 = pI->s->V[edges_tetra[pI->E[0]][0]]; + other2 = pI->s->V[edges_tetra[pI->E[1]][0]]; + } + + for (i = 0; i < 4; i++){ + if (compareVertex (&pI->s->V[i], &common) && + compareVertex (&pI->s->V[i], &other1) && + compareVertex (&pI->s->V[i], &other2)) + lonely = pI->s->V[i]; + } + + nx.i = IMAX (e1->Num, other2->Num); + nx.j = IMIN (e1->Num, other2->Num); + + if (Tree_Search (New_Edges, &nx)){ + s = Create_Simplex (e1, other1, other2, lonely); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (e2, e1, common, lonely); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (e2, other2, e1, lonely); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + } + else{ + nx.i = IMAX (e2->Num, other1->Num); + nx.j = IMIN (e2->Num, other1->Num); + Tree_Add (New_Edges, &nx); + s = Create_Simplex (e1, other1, e2, lonely); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (e2, e1, common, lonely); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (e2, other1, other2, lonely); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + } + } + else if (pI->NbFace == 1 && pI->NbEdge == 1){ + FE++; + + Tree_Add (TetDel, &pI->s); + for (i = 0; i < 4; i++) + if (compareVertex (&pI->s->V[i], &pI->F[0]->V[0]) && + compareVertex (&pI->s->V[i], &pI->F[0]->V[1]) && + compareVertex (&pI->s->V[i], &pI->F[0]->V[2])) + v1 = pI->s->V[i]; + v2 = NULL; + v3 = NULL; + + for (i = 0; i < 4; i++){ + if (compareVertex (&pI->s->V[i], &v1)){ + if (compareVertex (&pI->s->V[i], &pI->s->V[edges_tetra[pI->E[0]][0]]) && + compareVertex (&pI->s->V[i], &pI->s->V[edges_tetra[pI->E[0]][1]])){ + if (v2) + v3 = pI->s->V[i]; + else + v2 = pI->s->V[i]; + } + else{ + v4 = pI->s->V[i]; + } + } + } + + e1 = pI->VE[0]; + e2 = pI->VF[0]; + + s = Create_Simplex (e1, e2, v3, v4); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (e1, e2, v2, v4); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (e1, e2, v2, v3); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + s = Create_Simplex (e1, v1, v2, v3); + s->iEnt = IENT; + Tree_Add (AddedTet, &s); + + } + else if (pI->NbEdge == 4){ + EEEE++; + + // Allez j-f il faut le faire ! + + Tree_Add (TetDel, &pI->s); + if (pI->E[0] == 1 && pI->E[1] == 2 && pI->E[2] == 3 && pI->E[3] == 5){ + v1 = pI->s->V[0]; + v2 = pI->s->V[1]; + v3 = pI->s->V[2]; + v4 = pI->s->V[3]; + v5 = pI->VE[1]; + v6 = pI->VE[2]; + v7 = pI->VE[0]; + v8 = pI->VE[3]; + } + else if (pI->E[0] == 0 && pI->E[1] == 2 && pI->E[2] == 4 && pI->E[3] == 5){ + v1 = pI->s->V[1]; + v2 = pI->s->V[2]; + v3 = pI->s->V[0]; + v4 = pI->s->V[3]; + v5 = pI->VE[0]; + v6 = pI->VE[3]; + v7 = pI->VE[1]; + v8 = pI->VE[2]; + } + else if (pI->E[0] == 0 && pI->E[1] == 1 && pI->E[2] == 3 && pI->E[3] == 4){ + v1 = pI->s->V[0]; + v2 = pI->s->V[2]; + v3 = pI->s->V[1]; + v4 = pI->s->V[3]; + v5 = pI->VE[0]; + v6 = pI->VE[2]; + v7 = pI->VE[1]; + v8 = pI->VE[3]; + } + else{ + Msg(ERROR, "Incoherent intersection EEEE"); + return; + } + cut_prism (v8, v4, v6, v7, v3, v5, newpoints, AddedTet); + cut_prism (v2, v8, v7, v1, v6, v5, newpoints, AddedTet); + } + else{ + Msg(ERROR, "Error On Cut %d %d %d", pI->NbVertex, pI->NbEdge, pI->NbFace); + } +} + + + + + diff --git a/Mesh/3D_Extrude.cpp b/Mesh/3D_Extrude.cpp new file mode 100644 index 0000000000000000000000000000000000000000..db75cca95cf2517ef60193051ef3eadf67c7a427 --- /dev/null +++ b/Mesh/3D_Extrude.cpp @@ -0,0 +1,650 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "Mesh.h" +#include "Context.h" +#include "Create.h" + +extern Mesh *THEM; +extern Context_T CTX; +extern int CurrentNodeNumber; + +static Tree_T *Tree_Ares = NULL, *Tree_Swaps = NULL; + +Surface *THES; +Volume *THEV; +int TEST_IS_ALL_OK; + +static ExtrudeParams *ep; + +typedef struct{ + int a, b; +}nxn; + +static int compnxn (const void *a, const void *b){ + nxn *q, *w; + q = (nxn *) a; + w = (nxn *) b; + if (q->a > w->a) + return 1; + if (q->a < w->a) + return -1; + if (q->b > w->b) + return 1; + if (q->b < w->b) + return -1; + return 0; +} + +void InitExtrude (){ + if (!Tree_Ares) + Tree_Ares = Tree_Create (sizeof (nxn), compnxn); + if (!Tree_Swaps) + Tree_Swaps = Tree_Create (sizeof (nxn), compnxn); +} + +int are_exist (Vertex * v1, Vertex * v2, Tree_T * t){ + nxn n; + n.a = IMAX (v1->Num, v2->Num); + n.b = IMIN (v1->Num, v2->Num); + return Tree_Search (t, &n); +} + +void are_cree (Vertex * v1, Vertex * v2, Tree_T * t){ + nxn n; + n.a = IMAX (v1->Num, v2->Num); + n.b = IMIN (v1->Num, v2->Num); + Tree_Replace (t, &n); +} + +void are_del (Vertex * v1, Vertex * v2, Tree_T * t){ + nxn n; + n.a = IMAX (v1->Num, v2->Num); + n.b = IMIN (v1->Num, v2->Num); + Tree_Suppress (t, &n); +} + + +void Extrude_Simplex_Phase1 (void *data, void *dum){ + Simplex **pS, *s; + int i, j, k; + Vertex *v1, *v2, *v3, *v4, *v5, *v6; + + pS = (Simplex **) data; + s = *pS; + + k = 0; + for (i = 0; i < ep->mesh.NbLayer; i++){ + for (j = 0; j < ep->mesh.NbElmLayer[i]; j++){ + List_Read (s->V[0]->Extruded_Points, k, &v1); + List_Read (s->V[1]->Extruded_Points, k, &v2); + List_Read (s->V[2]->Extruded_Points, k, &v3); + List_Read (s->V[0]->Extruded_Points, k + 1, &v4); + List_Read (s->V[1]->Extruded_Points, k + 1, &v5); + List_Read (s->V[2]->Extruded_Points, k + 1, &v6); + if (ep->mesh.Simplexes){ + k++; + if (!are_exist (v1, v5, Tree_Ares)) + are_cree (v2, v4, Tree_Ares); + if (!are_exist (v5, v3, Tree_Ares)) + are_cree (v2, v6, Tree_Ares); + if (!are_exist (v4, v3, Tree_Ares)) + are_cree (v1, v6, Tree_Ares); + } + else if (!s->V[3]){ + } + else{ + } + } + } +} + +void Extrude_Simplex_Phase3 (void *data, void *dum){ + + Simplex **pS, *s, *news; + Hexahedron *newh; + Prism *newp; + int i, j, k; + Vertex *v1, *v2, *v3, *v4, *v5, *v6, *v7, *v8; + + pS = (Simplex **) data; + s = *pS; + + if(s->V[3] && !CTX.mesh.reco_extrude){ + Msg(ERROR, "Use '-recombine' to extrude with quadrangles"); + } + + k = 0; + for (i = 0; i < ep->mesh.NbLayer; i++){ + for (j = 0; j < ep->mesh.NbElmLayer[i]; j++){ + + if(s->V[3]){ + List_Read(s->V[0]->Extruded_Points,k,&v1); + List_Read(s->V[1]->Extruded_Points,k,&v2); + List_Read(s->V[2]->Extruded_Points,k,&v3); + List_Read(s->V[3]->Extruded_Points,k,&v4); + List_Read(s->V[0]->Extruded_Points,k+1,&v5); + List_Read(s->V[1]->Extruded_Points,k+1,&v6); + List_Read(s->V[2]->Extruded_Points,k+1,&v7); + List_Read(s->V[3]->Extruded_Points,k+1,&v8); + } + else{ + List_Read (s->V[0]->Extruded_Points, k, &v1); + List_Read (s->V[1]->Extruded_Points, k, &v2); + List_Read (s->V[2]->Extruded_Points, k, &v3); + List_Read (s->V[0]->Extruded_Points, k + 1, &v4); + List_Read (s->V[1]->Extruded_Points, k + 1, &v5); + List_Read (s->V[2]->Extruded_Points, k + 1, &v6); + } + + k++; + if (ep->mesh.ZonLayer[i]){ + + if(CTX.mesh.reco_extrude){ + if(s->V[3]){ + newh = Create_Hexahedron(v1,v2,v3,v4,v5,v6,v7,v8); + newh->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add(THEV->Hexahedra,&newh); + } + else{ + newp = Create_Prism(v1,v2,v3,v4,v5,v6); + newp->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add(THEV->Prisms,&newp); + } + } + else{ + + if (are_exist (v4, v2, Tree_Ares) && + are_exist (v5, v3, Tree_Ares) && + are_exist (v4, v3, Tree_Ares)){ + news = Create_Simplex (v1, v2, v3, v4); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v4, v5, v6, v3); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v2, v4, v5, v3); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + } + if (are_exist (v4, v2, Tree_Ares) && + are_exist (v2, v6, Tree_Ares) && + are_exist (v4, v3, Tree_Ares)){ + news = Create_Simplex (v1, v2, v3, v4); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v4, v5, v6, v2); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v4, v2, v6, v3); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + } + if (are_exist (v4, v2, Tree_Ares) && + are_exist (v2, v6, Tree_Ares) && + are_exist (v6, v1, Tree_Ares)){ + news = Create_Simplex (v1, v2, v3, v6); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v4, v5, v6, v2); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v2, v4, v6, v1); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + } + if (are_exist (v5, v1, Tree_Ares) && + are_exist (v5, v3, Tree_Ares) && + are_exist (v4, v3, Tree_Ares)){ + news = Create_Simplex (v1, v2, v3, v5); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v4, v5, v6, v3); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v1, v4, v5, v3); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + } + if (are_exist (v5, v1, Tree_Ares) && + are_exist (v5, v3, Tree_Ares) && + are_exist (v6, v1, Tree_Ares)){ + news = Create_Simplex (v1, v2, v3, v5); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v4, v5, v6, v1); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v1, v3, v5, v6); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + } + if (are_exist (v5, v1, Tree_Ares) && + are_exist (v2, v6, Tree_Ares) && + are_exist (v6, v1, Tree_Ares)){ + news = Create_Simplex (v1, v2, v3, v6); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v4, v5, v6, v1); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + news = Create_Simplex (v1, v2, v5, v6); + news->iEnt = ep->mesh.ZonLayer[i]; + Tree_Add (THEV->Simplexes, &news); + } + } + } + } + } +} + +void Extrude_Simplex_Phase2 (void *data, void *dum){ + + Simplex **pS, *s; + int i, j, k; + Vertex *v1, *v2, *v3, *v4, *v5, *v6; + + pS = (Simplex **) data; + s = *pS; + + k = 0; + for (i = 0; i < ep->mesh.NbLayer; i++){ + for (j = 0; j < ep->mesh.NbElmLayer[i]; j++){ + List_Read (s->V[0]->Extruded_Points, k, &v1); + List_Read (s->V[1]->Extruded_Points, k, &v2); + List_Read (s->V[2]->Extruded_Points, k, &v3); + List_Read (s->V[0]->Extruded_Points, k + 1, &v4); + List_Read (s->V[1]->Extruded_Points, k + 1, &v5); + List_Read (s->V[2]->Extruded_Points, k + 1, &v6); + k++; + if (are_exist (v4, v2, Tree_Ares) && + are_exist (v5, v3, Tree_Ares) && + are_exist (v1, v6, Tree_Ares)){ + TEST_IS_ALL_OK++; + if (!are_exist (v4, v2, Tree_Swaps)){ + are_del (v4, v2, Tree_Ares); + are_cree (v1, v5, Tree_Ares); + are_cree (v1, v5, Tree_Swaps); + are_cree (v4, v2, Tree_Swaps); + } + else if (!are_exist (v5, v3, Tree_Swaps)){ + are_del (v5, v3, Tree_Ares); + are_cree (v2, v6, Tree_Ares); + are_cree (v5, v3, Tree_Swaps); + are_cree (v2, v6, Tree_Swaps); + } + else if (!are_exist (v1, v6, Tree_Swaps)){ + are_del (v1, v6, Tree_Ares); + are_cree (v4, v3, Tree_Ares); + are_cree (v1, v6, Tree_Swaps); + are_cree (v4, v3, Tree_Swaps); + } + } + else if (are_exist (v1, v5, Tree_Ares) && + are_exist (v2, v6, Tree_Ares) && + are_exist (v4, v3, Tree_Ares)){ + TEST_IS_ALL_OK++; + if (!are_exist (v1, v5, Tree_Swaps)){ + are_del (v1, v5, Tree_Ares); + are_cree (v4, v2, Tree_Ares); + are_cree (v1, v5, Tree_Swaps); + are_cree (v4, v2, Tree_Swaps); + } + else if (!are_exist (v2, v6, Tree_Swaps)){ + are_del (v2, v6, Tree_Ares); + are_cree (v5, v3, Tree_Ares); + are_cree (v5, v3, Tree_Swaps); + are_cree (v2, v6, Tree_Swaps); + } + else if (!are_exist (v4, v3, Tree_Swaps)){ + are_del (v4, v3, Tree_Ares); + are_cree (v1, v6, Tree_Ares); + are_cree (v1, v6, Tree_Swaps); + are_cree (v4, v3, Tree_Swaps); + } + } + } + } +} + +static Tree_T *Vertex_Bound, *ToAdd = NULL; + +void Extrude_Vertex (void *data, void *dum){ + + Vertex **pV, *v, *newv, *exv; + int i, j; + + pV = (Vertex **) data; + v = *pV; + if (v->Extruded_Points) + List_Delete (v->Extruded_Points); + v->Extruded_Points = List_Create (ep->mesh.NbLayer, 1, sizeof (Vertex *)); + List_Add (v->Extruded_Points, &v); + exv = v; + + for (i = 0; i < ep->mesh.NbLayer; i++){ + for (j = 0; j < ep->mesh.NbElmLayer[i]; j++){ + newv = Create_Vertex (++CurrentNodeNumber, v->Pos.X, + v->Pos.Y, v->Pos.Z, v->lc, v->u); + ep->Extrude (i, j + 1, newv->Pos.X, newv->Pos.Y, newv->Pos.Z); + //newv->lc = DMIN(newv->lc,sqrt( ((*newv) - (*exv)) * ((*newv) - (*exv)) )); + exv = newv; + if (Vertex_Bound && (pV = (Vertex **) Tree_PQuery (Vertex_Bound, &newv))){ + List_Add (v->Extruded_Points, pV); + if (ToAdd) + Tree_Insert (ToAdd, pV); + } + else{ + List_Add (v->Extruded_Points, &newv); + Tree_Insert (THEM->Vertices, &newv); + if (ToAdd) + Tree_Insert (ToAdd, &newv); + } + } + } +} + +void Extrude_Surface1 (Surface * s){ + THES = s; + Tree_Action (s->Vertices, Extrude_Vertex); + if(!CTX.mesh.reco_extrude) Tree_Action (s->Simplexes, Extrude_Simplex_Phase1); +} + +void Extrude_Surface2 (Surface * s){ + THES = s; + Tree_Action (s->Simplexes, Extrude_Simplex_Phase2); +} + + +void Extrude_Surface3 (Surface * s){ + THES = s; + Tree_Action (s->Simplexes, Extrude_Simplex_Phase3); +} + + +void Extrude_Seg (Vertex * V1, Vertex * V2){ + int i, j, k; + Vertex *v1, *v2, *v3, *v4; + Simplex *s; + + k = 0; + for (i = 0; i < ep->mesh.NbLayer; i++){ + for (j = 0; j < ep->mesh.NbElmLayer[i]; j++){ + List_Read (V1->Extruded_Points, k, &v1); + List_Read (V2->Extruded_Points, k, &v2); + List_Read (V1->Extruded_Points, k + 1, &v3); + List_Read (V2->Extruded_Points, k + 1, &v4); + if(CTX.mesh.reco_extrude){ + s = Create_Quadrangle(v1,v2,v4,v3); + s->iEnt = THES->Num; + Tree_Add(THES->Simplexes,&s); + } + else{ + if (are_exist (v3, v2, Tree_Ares)){ + s = Create_Simplex (v3, v2, v1, NULL); + s->iEnt = THES->Num; + Tree_Add (THES->Simplexes, &s); + s = Create_Simplex (v3, v4, v2, NULL); + s->iEnt = THES->Num; + Tree_Add (THES->Simplexes, &s); + } + else{ + s = Create_Simplex (v3, v4, v1, NULL); + s->iEnt = THES->Num; + Tree_Add (THES->Simplexes, &s); + s = Create_Simplex (v1, v4, v2, NULL); + s->iEnt = THES->Num; + Tree_Add (THES->Simplexes, &s); + } + } + k++; + } + } + +} + +void Extrude_Curve (void *data, void *dum){ + Curve **pC, *c; + Vertex *v1, *v2; + int i; + pC = (Curve **) data; + c = *pC; + + //if (c->Num < 0) return; + + for (i = 0; i < List_Nbr (c->Vertices) - 1; i++){ + List_Read (c->Vertices, i, &v1); + List_Read (c->Vertices, i + 1, &v2); + Extrude_Seg (v1, v2); + } +} + +int Extrude_Mesh (Curve * c){ + int i; + Vertex **v, *pV, **vexist, *v1; + + if (!c->Extrude) + return 0; + if (!c->Extrude->mesh.ExtrudeMesh) + return false; + + Vertex_Bound = NULL; + ep = c->Extrude; + + Tree_Ares = Tree_Swaps = NULL; + + if (ep->geo.Mode == EXTRUDED_ENTITY){ + Extrude_Vertex (&c->beg, NULL); + c->Vertices = List_Create (List_Nbr (c->beg->Extruded_Points), + 2, sizeof (Vertex *)); + v = &c->beg; + if ((vexist = (Vertex **) Tree_PQuery (THEM->Vertices, v))){ + (*vexist)->u = c->ubeg; + Tree_Insert (THEM->Vertices, vexist); + if ((*vexist)->ListCurves) + List_Add ((*vexist)->ListCurves, &c); + List_Add (c->Vertices, vexist); + } + else{ + pV = Create_Vertex ((*v)->Num, (*v)->Pos.X, (*v)->Pos.Y, (*v)->Pos.Z, (*v)->lc, 0.0); + pV->ListCurves = List_Create (1, 1, sizeof (Curve *)); + List_Add (pV->ListCurves, &c); + Tree_Insert (THEM->Vertices, &pV); + List_Add (c->Vertices, &pV); + } + + for (i = 1; i < List_Nbr (c->beg->Extruded_Points) - 1; i++){ + List_Read (c->beg->Extruded_Points, i, &v1); + if (!v1->ListCurves) + v1->ListCurves = List_Create (1, 1, sizeof (Curve *)); + List_Add (v1->ListCurves, &c); + Tree_Insert (THEM->Vertices, &v1); + v1->u = (double) i / (double) List_Nbr (c->beg->Extruded_Points); + List_Add (c->Vertices, &v1); + } + v = &c->end; + if ((vexist = (Vertex **) Tree_PQuery (THEM->Vertices, v))){ + (*vexist)->u = c->ubeg; + Tree_Insert (THEM->Vertices, vexist); + if ((*vexist)->ListCurves) + List_Add ((*vexist)->ListCurves, &c); + List_Add (c->Vertices, vexist); + } + else{ + pV = Create_Vertex ((*v)->Num, (*v)->Pos.X, (*v)->Pos.Y, (*v)->Pos.Z, (*v)->lc, 0.0); + pV->ListCurves = List_Create (1, 1, sizeof (Curve *)); + List_Add (pV->ListCurves, &c); + Tree_Insert (THEM->Vertices, &pV); + List_Add (c->Vertices, &pV); + } + return true; + } + else{ + return false; + } +} + +void copy_mesh (Surface * from, Surface * to){ + List_T *list = Tree2List (from->Simplexes); + Simplex *s, *news; + Vertex **pV, *v1, *v2, *v3, *v; + + for (int i = 0; i < List_Nbr (list); i++){ + List_Read (list, i, &s); + v = s->V[0]; + v1 = Create_Vertex (++CurrentNodeNumber, v->Pos.X, + v->Pos.Y, v->Pos.Z, v->lc, v->u); + ep->Extrude (ep->mesh.NbLayer - 1, ep->mesh.NbElmLayer[ep->mesh.NbLayer - 1], + v1->Pos.X, v1->Pos.Y, v1->Pos.Z); + + if (Vertex_Bound && (pV = (Vertex **) Tree_PQuery (Vertex_Bound, &v1))) + v1 = *pV; + else{ + Tree_Insert (THEM->Vertices, &v1); + Tree_Insert (Vertex_Bound, &v1); + } + if (ToAdd) + Tree_Insert (ToAdd, &v1); + + v = s->V[1]; + v2 = Create_Vertex (++CurrentNodeNumber, v->Pos.X, + v->Pos.Y, v->Pos.Z, v->lc, v->u); + ep->Extrude (ep->mesh.NbLayer - 1, ep->mesh.NbElmLayer[ep->mesh.NbLayer - 1], + v2->Pos.X, v2->Pos.Y, v2->Pos.Z); + + if (Vertex_Bound && (pV = (Vertex **) Tree_PQuery (Vertex_Bound, &v2))) + v2 = *pV; + else{ + Tree_Insert (THEM->Vertices, &v2); + Tree_Insert (Vertex_Bound, &v2); + } + if (ToAdd) + Tree_Insert (ToAdd, &v2); + + v = s->V[2]; + v3 = Create_Vertex (++CurrentNodeNumber, v->Pos.X, + v->Pos.Y, v->Pos.Z, v->lc, v->u); + ep->Extrude (ep->mesh.NbLayer - 1, ep->mesh.NbElmLayer[ep->mesh.NbLayer - 1], + v3->Pos.X, v3->Pos.Y, v3->Pos.Z); + + if (Vertex_Bound && (pV = (Vertex **) Tree_PQuery (Vertex_Bound, &v3))) + v3 = *pV; + else{ + Tree_Insert (THEM->Vertices, &v3); + Tree_Insert (Vertex_Bound, &v3); + } + if (ToAdd) + Tree_Insert (ToAdd, &v3); + + news = Create_Simplex (v1, v2, v3, NULL); + news->iEnt = to->Num; + Tree_Add (to->Simplexes, &news); + } + List_Delete (list); +} + +int Extrude_Mesh (Surface * s){ + int i; + Vertex *v1; + Curve *cc; + extern int FACE_DIMENSION; + + InitExtrude (); + if (!s->Extrude) + return 0; + if (!s->Extrude->mesh.ExtrudeMesh) + return false; + FACE_DIMENSION = 2; + Vertex_Bound = Tree_Create (sizeof (Vertex *), comparePosition); + + ep = s->Extrude; + THES = s; + + ToAdd = s->Vertices; + + for (i = 0; i < List_Nbr (s->s.Generatrices); i++){ + List_Read (s->s.Generatrices, i, &cc); + for (int j = 0; j < List_Nbr (cc->Vertices); j++){ + List_Read (cc->Vertices, j, &v1); + Tree_Replace (Vertex_Bound, &v1); + } + } + if (ep->geo.Mode == EXTRUDED_ENTITY){ + Curve *c = FindCurve (ep->geo.Source, THEM); + if (!c) + return 0; + for (i = 0; i < List_Nbr (c->Vertices); i++){ + List_Read (c->Vertices, i, &v1); + Extrude_Vertex (&v1, NULL); + } + Extrude_Curve (&c, NULL); + return true; + } + else{ + Surface *ss = FindSurface (ep->geo.Source, THEM); + if (!ss) + return 0; + copy_mesh (ss, s); + return true; + } + ToAdd = NULL; +} + +int Extrude_Mesh (Volume * v){ + int i, j; + Surface *ss; + Vertex *v1; + + if (!v->Extrude) + return 0; + if (!v->Extrude->mesh.ExtrudeMesh) + return false; + + Vertex_Bound = Tree_Create (sizeof (Vertex *), comparePosition); + + ep = v->Extrude; + THEV = v; + if (ep->geo.Mode == EXTRUDED_ENTITY){ + Surface *s = FindSurface (ep->geo.Source, THEM); + if (!s) + return 0; + List_T *list; + for (i = 0; i < List_Nbr (v->Surfaces); i++){ + List_Read (v->Surfaces, i, &ss); + list = Tree2List (ss->Vertices); + for (int j = 0; j < List_Nbr (list); j++){ + List_Read (list, j, &v1); + Tree_Add (Vertex_Bound, &v1); + } + List_Delete (list); + } + list = Tree2List (s->Vertices); + for (i = 0; i < List_Nbr (list); i++){ + List_Read (list, i, &v1); + Extrude_Vertex (&v1, NULL); + } + List_Delete (list); + Extrude_Surface1 (s); + + if(!CTX.mesh.reco_extrude){ + j = TEST_IS_ALL_OK; + do{ + TEST_IS_ALL_OK = 0; + Extrude_Surface2 (s); + if (TEST_IS_ALL_OK == j) + break; + j = TEST_IS_ALL_OK; + } + while (TEST_IS_ALL_OK); + } + + Extrude_Surface3 (s); + //Tree_Ares = Tree_Swaps = NULL; + return true; + } + else{ + return false; + } +} diff --git a/Mesh/3D_Mesh.cpp b/Mesh/3D_Mesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..15d8e5bccd3e535af2c9a47c7c80d7f23a72a5dd --- /dev/null +++ b/Mesh/3D_Mesh.cpp @@ -0,0 +1,867 @@ +/* + + J-F Remacle 1995 + + MAILLAGE DELAUNAY 3D + + tant que l'arbre des tetraedres de qualites inacceptables + n'est pas vide { + prendre le plus mauvais tetraedre; + creer un nouveau point; + eliminer les tetraedres dont le cercle circonscrit contient le point; + reconstruire le volume convexe; + } + +*/ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "3D_Mesh.h" +#include "Create.h" +#include "Numeric.h" +#include "Context.h" + +extern Mesh *THEM, *LOCAL; +extern Context_T CTX; +extern int TYPBGMESH, SPEED_MAX; +extern int CurrentNodeNumber; +extern int Alerte_Point_Scabreux; +extern int NbComplexVolumes, FACE_DIMENSION; +extern double LC; + +static Tree_T *Tsd, *Sim_Sur_Le_Bord, *POINTS_TREE; +static List_T *Simplexes_Destroyed, *Simplexes_New, *Suppress; +static List_T *LLL, *POINTS; +static Simplex *THES; +static Vertex *THEV; + +static Tree_T *SimXFac; +static double volume; +static int ZONEELIMINEE, Methode = 0; + +Simplex MyNewBoundary; + +void DebugSimplexe (Simplex * s){ + int i; + + fprintf (stderr, "Simplexe %p = %d %d %d %d \n", + s, s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num); + + for (i = 0; i < 4; i++){ + if (s->S[i] != &MyNewBoundary) + printf (" face : %d %d %d -> Simplexe %p\n", + s->F[i].V[0]->Num, s->F[i].V[1]->Num, s->F[i].V[2]->Num, s->S[i]); + else + printf (" face : %d %d %d -> Simplexe Boundary\n", + s->F[i].V[0]->Num, s->F[i].V[1]->Num, s->F[i].V[2]->Num); + } +} + +void VSIM (void *a, void *b){ + Simplex *S; + + S = *(Simplex **) a; + if (S->V[3]) + volume += fabs (S->Volume_Simplexe ()); +} + +void add_points (void *a, void *b){ + Vertex **w; + + w = (Vertex **) a; + Tree_Insert (POINTS_TREE, a); +} + +void add_points_2 (void *a, void *b){ + List_Add (POINTS, a); +} + + +double Interpole_lcTetraedre (Simplex * s, Vertex * v){ + double mat[3][3], rhs[3], sol[3], det; + + s->matsimpl (mat); + rhs[0] = v->Pos.X - s->V[0]->Pos.X; + rhs[1] = v->Pos.Y - s->V[0]->Pos.Y; + rhs[2] = v->Pos.Z - s->V[0]->Pos.Z; + + sys3x3 (mat, rhs, sol, &det); + if (det == 0.0 || + (1. - sol[0] - sol[1] - sol[2]) > 1. || + (1. - sol[0] - sol[1] - sol[2]) < 0. || + sol[0] > 1. || + sol[1] > 1. || + sol[2] > 1. || + sol[0] < 0. || + sol[1] < 0. || + sol[2] < 0.){ + return DMAX (s->V[0]->lc, DMAX (s->V[1]->lc, DMAX (s->V[2]->lc, s->V[3]->lc))); + //sol[0] = sol[1] = sol[2] = 0.25; + } + + return (s->V[0]->lc * (1. - sol[0] - sol[1] - sol[2]) + + sol[0] * s->V[1]->lc + + sol[1] * s->V[2]->lc + + sol[2] * s->V[3]->lc); +} + +Vertex *NewVertex (Simplex * s){ + Vertex *v; + + v = Create_Vertex (++CurrentNodeNumber, s->Center.X, s->Center.Y, s->Center.Z, 1., 0.0); + v->lc = Interpole_lcTetraedre (s, v); + + return (v); +} + +int Pt_In_Volume (double X, double Y, double Z, Mesh * m, + double *l, double tol){ + int i; + Vertex V; + double uvw[3]; + Simplex *s; + Brick B; + + V.Pos.X = X; + V.Pos.Y = Y; + V.Pos.Z = Z; + + if (!(m->BGM.Typ == ONFILE) && !m->BGM.bgm){ + *l = -1.0; + return (1); + } + + B = LaBrique (&m->Grid, X, Y, Z); + + if (B.N < 0) + return (0); + + for (i = 0; i < List_Nbr (B.pT); i++){ + List_Read (B.pT, i, &s); + if (s->Pt_In_Simplexe (&V, uvw, tol)){ + *l = (1. - uvw[0] - uvw[1] - uvw[2]) * s->V[0]->lc + + uvw[0] * s->V[1]->lc + + uvw[1] * s->V[2]->lc + + uvw[2] * s->V[3]->lc; + return (1); + } + } + + return (0); +} + +int Pt_In_Circum (Simplex * s, Vertex * v){ + double d1, d2, eps; + + /* Determine si un point est dans le cercle circonscrit a un simplexe */ + + d1 = s->Radius; + d2 = sqrt (DSQR (v->Pos.X - s->Center.X) + + DSQR (v->Pos.Y - s->Center.Y) + + DSQR (v->Pos.Z - s->Center.Z)); + + eps = fabs (d1 - d2) / (d1 + d2); + + if (eps < 1.e-12){ + return (0); /* c'etait 1! GEUZ ????*/ + } + + if (d2 < d1) + return (1); + + return (0); +} + +void Action_First_Simplexes (void *a, void *b){ + Simplex **q; + + if (!THES){ + q = (Simplex **) a; + if (Pt_In_Circum (*q, THEV)){ + THES = *q; + } + } +} + +void LiS (void *a, void *b){ + int j, N; + SxF SXF, *pSXF; + Simplex **pS, *S; + + pS = (Simplex **) a; + S = *pS; + N = (S->V[3]) ? 4 : 3; + + for (j = 0; j < N; j++){ + SXF.F = S->F[j]; + if ((pSXF = (SxF *) Tree_PQuery (SimXFac, &SXF))){ + /* Creation du lien */ + S->S[j] = pSXF->S; + pSXF->S->S[pSXF->NumFaceSimpl] = S; + } + else{ + SXF.S = S; + SXF.NumFaceSimpl = j; + Tree_Add (SimXFac, &SXF); + } + } +} + +void RzS (void *a, void *b){ + int j, N; + Simplex **pS, *S; + pS = (Simplex **) a; + S = *pS; + + N = (S->V[3]) ? 4 : 3; + + for (j = 0; j < N; j++){ + if ((S->S[j]) == NULL){ + S->S[j] = &MyNewBoundary; + } + } +} + +/* Cree les liens entre les simplexes, c.a.d recherche les voisins */ + +void Link_Simplexes (List_T * Sim, Tree_T * Tim){ + Simplex *S; + int i; + + SimXFac = Tree_Create (sizeof (SxF), compareSxF); + if (Sim){ + for (i = 0; i < List_Nbr (Sim); i++){ + List_Read (Sim, i, &S); + LiS (&S, NULL); + } + for (i = 0; i < List_Nbr (Sim); i++){ + List_Read (Sim, i, &S); + RzS (&S, NULL); + } + } + else{ + Tree_Action (Tim, LiS); + Tree_Action (Tim, RzS); + } + Tree_Delete (SimXFac); +} + +void Box_6_Tetraedron (List_T * P, Mesh * m){ +#define FACT 1.1 +#define LOIN 2.2 + + int i, j; + static int pts[8][3] = { {0, 0, 0}, + {1, 0, 0}, + {1, 1, 0}, + {0, 1, 0}, + {0, 0, 1}, + {1, 0, 1}, + {1, 1, 1}, + {0, 1, 1}}; + static int tet[6][4] = { {1, 5, 2, 4}, + {2, 5, 6, 4}, + {4, 5, 6, 8}, + {6, 4, 8, 7}, + {6, 4, 7, 3}, + {2, 3, 4, 6}}; + double Xm, Ym, Zm, XM, YM, ZM, Xc, Yc, Zc; + Simplex *S, *ps; + Vertex *V, *v, *pv; + List_T *smp; + + smp = List_Create (8, 1, sizeof (Simplex *)); + + V = (Vertex *) Malloc (8 * sizeof (Vertex)); + + for (i = 0; i < List_Nbr (P); i++){ + List_Read (P, i, &v); + if (!i){ + Xm = XM = v->Pos.X; + Ym = YM = v->Pos.Y; + Zm = ZM = v->Pos.Z; + } + else{ + Xm = DMIN (Xm, v->Pos.X); + XM = DMAX (XM, v->Pos.X); + Ym = DMIN (Ym, v->Pos.Y); + YM = DMAX (YM, v->Pos.Y); + Zm = DMIN (Zm, v->Pos.Z); + ZM = DMAX (ZM, v->Pos.Z); + } + } + if (Xm == XM) + XM = Xm + 1.; + if (Ym == YM) + YM = Ym + 1.; + if (Zm == ZM) + ZM = Zm + 1.; + + Xc = XM - Xm; + Yc = YM - Ym; + Zc = ZM - Zm; + + /* initialisation de la grille */ + + m->Grid.init = 0; + m->Grid.min.X = Xm - LOIN * FACT * Xc; + m->Grid.min.Y = Ym - LOIN * FACT * Yc; + m->Grid.min.Z = Zm - LOIN * FACT * Zc; + m->Grid.max.X = XM + LOIN * FACT * Xc; + m->Grid.max.Y = YM + LOIN * FACT * Yc; + m->Grid.max.Z = ZM + LOIN * FACT * Zc; + + m->Grid.Nx = m->Grid.Ny = m->Grid.Nz = 20; + + /* Longueur Caracteristique */ + + /* GEUZ SUPPRIME + LC = sqrt (Xc * Xc + Yc * Yc + Zc * Zc); + */ + + /* Points de la boite de 1 a 8 + + Z 8____________7 + | /| /| + | / | / | + | / | / | + 5|/___|________/6 | + | 4|________|___|3 + | / | / + | / Y | / + | / | / + |/____________|/___ X + 1 2 + + */ + + for (i = 0; i < 8; i++){ + if (pts[i][0]) + V[i].Pos.X = Xm - LOIN * Xc; + else + V[i].Pos.X = XM + LOIN * Xc; + + if (pts[i][1]) + V[i].Pos.Y = Ym - LOIN * Yc; + else + V[i].Pos.Y = YM + LOIN * Yc; + + if (pts[i][2]) + V[i].Pos.Z = Zm - LOIN * Zc; + else + V[i].Pos.Z = ZM + LOIN * Zc; + + V[i].Num = -(++CurrentNodeNumber); + pv = &V[i]; + pv->lc = 1.0; + pv->Mov = NULL; + Tree_Replace (m->Vertices, &pv); + } + + /* 6 Tetraedres forment le maillage de la boite */ + + for (i = 0; i < 6; i++){ + S = Create_Simplex (&V[tet[i][0] - 1], &V[tet[i][1] - 1], + &V[tet[i][2] - 1], &V[tet[i][3] - 1]); + List_Add (smp, &S); + } + + Link_Simplexes (smp, NULL); + for (i = 0; i < List_Nbr (smp); i++){ + List_Read (smp, i, &ps); + for (j = 0; j < 4; j++) + if (ps->S[j] == NULL) + ps->S[j] = &MyNewBoundary; + Tree_Replace (m->Simplexes, &ps); + } + +} + + +void Fill_Sim_Des (void *a, void *b){ + Simplex **S; + S = (Simplex **) a; + if (Pt_In_Circum (*S, THEV)) + List_Add (Simplexes_Destroyed, a); +} + +void TStoLS (void *a, void *b){ + List_Add (Simplexes_Destroyed, a); +} + +void TAtoLA (void *a, void *b){ + List_Add (Simplexes_New, a); +} + +void CrSi (void *a, void *b){ + SxF *S; + Simplex *s; + S = (SxF *) a; + if (S->NumFaceSimpl == 1){ + s = Create_Simplex (THEV, S->F.V[0], S->F.V[1], S->F.V[2]); + s->iEnt = ZONEELIMINEE; + THEM->Metric->setSimplexQuality (s); + List_Add (Simplexes_New, &s); + } + else if (S->NumFaceSimpl != 2){ + Msg(WARNING, "GROSSE PANIQUE ...\n"); + } +} + + +void NewSimplexes (Mesh * m, List_T * Sim, List_T * news){ + int i, j; + Tree_T *SimXFac; + Simplex *S; + SxF SXF, *pSXF; + + SimXFac = Tree_Create (sizeof (SxF), compareSxF); + + for (i = 0; i < List_Nbr (Sim); i++){ + List_Read (Sim, i, &S); + if (!i) + ZONEELIMINEE = S->iEnt; + else { + if (S->iEnt != ZONEELIMINEE){ + Msg(WARNING, "Bizzare, l'elimination est foireuse %d %d\n", + S->iEnt, ZONEELIMINEE); + } + } + for (j = 0; j < 4; j++){ + SXF.F = S->F[j]; + if ((pSXF = (SxF *) Tree_PQuery (SimXFac, &SXF))){ + (pSXF->NumFaceSimpl)++; + } + else{ + SXF.NumFaceSimpl = 1; + Tree_Add (SimXFac, &SXF); + } + } + } + + /* Les faces non communes sont obligatoirement a la frontiere ... + -> Nouveaux simplexes */ + + Tree_Action (SimXFac, CrSi); + Tree_Delete (SimXFac); +} + + + +/* Methode recursive : Rempli Tsd les simplexes detruits + Invariant : Le simplexe est a eliminer + Le simplexe n'est pas encore considere */ + +int recur_bowyer (Simplex * s){ + int i; + + Tree_Insert (Tsd, &s); + for (i = 0; i < 4; i++){ + if (s->S[i] && s->S[i] != &MyNewBoundary && !Tree_Query (Tsd, &s->S[i])){ + if (Pt_In_Circum (s->S[i], THEV) && (s->iEnt == s->S[i]->iEnt)){ + recur_bowyer (s->S[i]); + } + else{ + if (s->iEnt != s->S[i]->iEnt){ + Alerte_Point_Scabreux = 1; + } + Tree_Insert (Sim_Sur_Le_Bord, &s->S[i]); + } + } + } + return 1; +} + +bool Bowyer_Watson (Mesh * m, Vertex * v, Simplex * S, int force){ + int i; + Simplex *s; + static int init = 1; + double volumeold, volumenew; + + THEV = v; + + double x = (S->V[0]->Pos.X + S->V[1]->Pos.X + S->V[2]->Pos.X + S->V[3]->Pos.X) / 4.; + double y = (S->V[0]->Pos.Y + S->V[1]->Pos.Y + S->V[2]->Pos.Y + S->V[3]->Pos.Y) / 4.; + double z = (S->V[0]->Pos.Z + S->V[1]->Pos.Z + S->V[2]->Pos.Z + S->V[3]->Pos.Z) / 4.; + + if (force) + THEM->Metric->Identity (); + else + THEM->Metric->setMetric (x, y, z); + + Tsd = Tree_Create (sizeof (Simplex *), compareSimplex); + Sim_Sur_Le_Bord = Tree_Create (sizeof (Simplex *), compareSimplex); + if (init){ + Simplexes_New = List_Create (10, 10, sizeof (Simplex *)); + Simplexes_Destroyed = List_Create (10, 10, sizeof (Simplex *)); + init = 0; + } + List_Reset (Simplexes_Destroyed); + List_Reset (Simplexes_New); + + + if (Methode){ + Tree_Action (m->Simplexes, Fill_Sim_Des); + } + else{ + recur_bowyer (S); + } + + Tree_Action (Tsd, TStoLS); + NewSimplexes (m, Simplexes_Destroyed, Simplexes_New); + + /* calcul des volumes des simplexes crees */ + + if (Alerte_Point_Scabreux || !SPEED_MAX){ + volume = 0.0; + for (i = 0; i < List_Nbr (Simplexes_Destroyed); i++){ + VSIM (List_Pointer (Simplexes_Destroyed, i), NULL); + } + volumeold = volume; + volume = 0.0; + for (i = 0; i < List_Nbr (Simplexes_New); i++){ + VSIM (List_Pointer (Simplexes_New, i), NULL); + } + volumenew = volume; + } + else{ + volumeold = 1.0; + volumenew = 1.0; + } + + /* critere du volume */ + + if ((fabs (volumeold - volumenew) / (volumeold + volumenew)) > 1.e-8){ + if (Tree_Suppress (m->Simplexes, &S)){ + S->Quality = 0.0; + Tree_Add (m->Simplexes, &S); + } + if(force){ + List_Reset (Simplexes_Destroyed); + List_Reset (Simplexes_New); + Tree_Delete (Sim_Sur_Le_Bord); + Tree_Delete (Tsd); + //printf(" %22.15E %22.15E\n",volumeold,volumenew); + return false; + } + } + else{ + Tree_Add (m->Vertices, &THEV); + for (i = 0; i < List_Nbr (Simplexes_New); i++){ + Tree_Add (m->Simplexes, List_Pointer (Simplexes_New, i)); + } + + /* Suppression des simplexes elimines */ + + for (i = 0; i < List_Nbr (Simplexes_Destroyed); i++){ + List_Read (Simplexes_Destroyed, i, &s); + if (!Tree_Suppress (m->Simplexes, &s)) + printf ("Error : Impossible to Delete Simplex\n"); + Free (s); + } + + /* Creation des liens entre nouveaux simplexes */ + + Tree_Action (Sim_Sur_Le_Bord, TAtoLA); + Link_Simplexes (Simplexes_New, m->Simplexes); + } + + Tree_Delete (Sim_Sur_Le_Bord); + Tree_Delete (Tsd); + return true; +} + +double rand_sign(){ + return (rand() % 2 == 0)?-1.0:1.0; +} + +void Convex_Hull_Mesh (List_T * Points, Mesh * m){ + int i, j, N, n; + int Nbr_OK = 0, Nbr_NOTOK = 0; + + N = List_Nbr (Points); + n = IMAX (N / 20, 1); + + Msg(INFO, "Meshing 3D... (Initial)"); + + Box_6_Tetraedron (Points, m); + // List_Sort (Points, comparePosition); + + for (i = 0; i < N; i++){ + THES = NULL; + List_Read (Points, i, &THEV); + + if (Simplexes_New) + for (j = 0; j < List_Nbr (Simplexes_New); j++){ + Action_First_Simplexes (List_Pointer (Simplexes_New, j), NULL); + } + + if (!THES){ + Tree_Action (m->Simplexes, Action_First_Simplexes); + Nbr_OK++; + } + else{ + Nbr_NOTOK++; + } + if (i % n == n - 1){ + volume = 0.0; + Tree_Action (m->Simplexes, VSIM); + Msg(INFO, "Nod=%d/%d Elm=%d", i+1,N,Tree_Nbr(m->Simplexes)); + Msg(STATUS, "Vol=%g",volume); + } + if (!THES){ + Msg(WARNING, "Vertex %12.5E %12.5E %12.5E in no simplex", + THEV->Pos.X,THEV->Pos.Y,THEV->Pos.Z); + THEV->Pos.X += 10 * RAND_LONG; + THEV->Pos.Y += 10 * RAND_LONG; + THEV->Pos.Z += 10 * RAND_LONG; + Tree_Action (m->Simplexes, Action_First_Simplexes); + } + bool ca_marche = Bowyer_Watson (m, THEV, THES, 1); + int count = 0; + while(!ca_marche){ + count ++; + double dx = rand_sign() * 10.*RAND_LONG; + double dy = rand_sign() * 10.*RAND_LONG; + double dz = rand_sign() * 10.*RAND_LONG; + THEV->Pos.X += dx; + THEV->Pos.Y += dy; + THEV->Pos.Z += dz; + THES = NULL; + Tree_Action (m->Simplexes, Action_First_Simplexes); + ca_marche = Bowyer_Watson (m, THEV, THES, 1); + THEV->Pos.X -= dx; + THEV->Pos.Y -= dy; + THEV->Pos.Z -= dz; + if(count > 5){ + N++; + List_Add(POINTS,&THEV); + Msg(WARNING,"UNABLE TO ADD THE POINT %d... WILL DO IT LATER",THEV->Num); + break; + } + } + } +} + +void suppress_vertex (void *data, void *dum){ + Vertex **pv; + + pv = (Vertex **) data; + if ((*pv)->Num < 0) + List_Add (Suppress, pv); +} + +void suppress_simplex (void *data, void *dum){ + Simplex **pv; + + pv = (Simplex **) data; + if ((*pv)->iEnt == 0) + List_Add (Suppress, pv); + + /* + else{ + for(i=0;i<List_Nbr(TrsfVolNum);i++) + if((*pv)->iEnt == (*(int*)List_Pointer(TrsfVolNum,i))->Num) + List_Add(Suppress,pv); + } + */ +} + +void add_in_bgm (void *a, void *b){ + Simplex **s, *S; + + s = (Simplex **) a; + S = *s; + List_Add (LLL, S); +} + +void Bgm_With_Points (Mesh * m, Mesh * bgm){ + int i; + Simplex *s; + + bgm->BGM.bgm = List_Create (Tree_Nbr (bgm->Simplexes), 10, sizeof (Simplex)); + LLL = bgm->BGM.bgm; + Tree_Action (bgm->Simplexes, add_in_bgm); + for (i = 0; i < List_Nbr (LLL); i++){ + s = (Simplex *) List_Pointer (LLL, i); + AddSimplexInGrid (bgm, s, BOITE); + } +} + +void Create_BgMesh (int Type, double lc, Mesh * m){ + m->BGM.Typ = Type; + switch (Type){ + case CONSTANT: + m->BGM.lc = lc; + break; + case ONFILE: + break; + case WITHPOINTS: + m->BGM.bgm = NULL; + break; + } +} + +void Maillage_Volume (void *data, void *dum){ + Volume *v, **pv; + Mesh M; + Surface S, *s; + Simplex *simp; + Vertex *newv; + int n, N; + double uvw[3]; + int i; + + FACE_DIMENSION = 2; + + Msg(INFO, "Nod=0 Elm=0"); + + pv = (Volume **) data; + v = *pv; + + if (Extrude_Mesh (v)){ + } + + if (v->Method == TRANSFINI){ + MeshTransfiniteVolume (v); + } + else if (v->Typ == 99999){ + LOCAL = &M; + s = &S; + Create_BgMesh (TYPBGMESH, .2, LOCAL); + + POINTS_TREE = Tree_Create (sizeof (Vertex *), comparePosition); + POINTS = List_Create (100, 100, sizeof (Vertex *)); + LOCAL->Simplexes = v->Simplexes; + LOCAL->Vertices = v->Vertices; + + for (i = 0; i < List_Nbr (v->Surfaces); i++){ + List_Read (v->Surfaces, i, &s); + Tree_Action (s->Vertices, add_points); + } + Tree_Action (POINTS_TREE, add_points_2); + Tree_Delete (POINTS_TREE); + + N = List_Nbr (POINTS); + n = N / 30 + 1; + + /* Creation d'un maillage initial respectant la frontiere */ + + if(!List_Nbr(POINTS))return; + + Convex_Hull_Mesh (POINTS, LOCAL); + + if (!Coherence (v, LOCAL)) + return; + Link_Simplexes (NULL, LOCAL->Simplexes); + + /* Suppression des noeuds de num < 0 */ + + Suppress = List_Create (10, 10, sizeof (Vertex *)); + Tree_Action (v->Vertices, suppress_vertex); + for (i = 0; i < List_Nbr (Suppress); i++){ + Tree_Suppress (v->Vertices, List_Pointer (Suppress, i)); + } + List_Delete (Suppress); + + /* Suppression des elements dont + - le num de vol == 0 (cad qui n'appartiennent a auncun volume defini) + - le num de vol == num de vol transfini + */ + + Suppress = List_Create (10, 10, sizeof (Simplex *)); + Tree_Action (v->Simplexes, suppress_simplex); + for (i = 0; i < List_Nbr (Suppress); i++){ + Tree_Suppress (v->Simplexes, List_Pointer (Suppress, i)); + } + + List_Delete (Suppress); + + if (Tree_Nbr (LOCAL->Simplexes) == 0) + return; + + /* Si il reste quelque chose a mailler en volume : */ + + v->Simplexes = LOCAL->Simplexes; + + Bgm_With_Points (THEM, LOCAL); + POINTS_TREE = THEM->Simplexes; + + Msg(INFO, "Meshing 3D... (Final)"); + + Tree_Right (LOCAL->Simplexes, &simp); + i = 0; + Progress (102); + while (simp->Quality > CONV_VALUE){ + newv = NewVertex (simp); + + // while(!Pt_In_Volume(newv->Pos.X,newv->Pos.Y,newv->Pos.Z,LOCAL,&l,0.0)){ + while (!simp->Pt_In_Simplexe (newv, uvw, 1.e-5) && + (simp->S[0] == &MyNewBoundary || + !simp->S[0]->Pt_In_Simplexe (newv, uvw, 1.e-5)) && + (simp->S[1] == &MyNewBoundary || + !simp->S[1]->Pt_In_Simplexe (newv, uvw, 1.e-5)) && + (simp->S[2] == &MyNewBoundary || + !simp->S[2]->Pt_In_Simplexe (newv, uvw, 1.e-5)) && + (simp->S[3] == &MyNewBoundary || + !simp->S[3]->Pt_In_Simplexe (newv, uvw, 1.e-5))) { + Tree_Suppress (LOCAL->Simplexes, &simp); + simp->Quality = 0.1; + Tree_Insert (LOCAL->Simplexes, &simp); + Tree_Right (LOCAL->Simplexes, &simp); + if (simp->Quality < CONV_VALUE) + break; + newv = NewVertex (simp); + } + if (simp->Quality < CONV_VALUE) + break; + i++; + if (i % n == n - 1){ + volume = 0.0; + Tree_Action (LOCAL->Simplexes, VSIM); + Msg(STATUS, "%d Nodes, %d Elements", + Tree_Nbr (LOCAL->Vertices), Tree_Nbr (LOCAL->Simplexes)); + Msg(SELECT, "Vol(%.6e) Conv(%g->%.1f)", volume, simp->Quality, CONV_VALUE); + double adv = 100. * (CONV_VALUE / simp->Quality); + Progress ((int) adv); + } + Bowyer_Watson (LOCAL, newv, simp, 0); + Tree_Right (LOCAL->Simplexes, &simp); + } + + POINTS_TREE = THEM->Vertices; + Tree_Action (v->Vertices, add_points); + POINTS_TREE = THEM->Simplexes; + Tree_Action (v->Simplexes, add_points); + + Progress(-1); + + if (CTX.mesh.nb_smoothing){ + /* + Msg(STATUS, "Swapping Edges (1st pass)"); + SwapEdges3D (THEM, v, 0.5, true); + Msg(STATUS, "Swapping Edges (2nd pass)"); + SwapEdges3D (THEM, v, 0.5, false); + Msg(STATUS, "Laplacian Smoothing"); + tnxe = Tree_Create (sizeof (NXE), compareNXE); + create_NXE (v->Vertices, v->Simplexes, tnxe); + for (int i = 0; i < CTX.mesh.nb_smoothing; i++) + Tree_Action (tnxe, ActionLiss); + Tree_Delete (tnxe); + Msg(STATUS, "Swapping Edges (last pass)"); + SwapEdges3D (THEM, v, 0.5, true); + */ + } + + if (CTX.mesh.degree == 2) + Degre2 (THEM->Vertices, THEM->VertexEdges, v->Simplexes, NULL, NULL); + } + + THEM->Statistics[6] += Tree_Nbr (v->Vertices); + THEM->Statistics[9] += Tree_Nbr (v->Simplexes); + + Gamma_Maillage (v, &THEM->Statistics[17], &THEM->Statistics[18], &THEM->Statistics[19]); + Eta_Maillage (v, &THEM->Statistics[20], &THEM->Statistics[21], &THEM->Statistics[22]); + R_Maillage (v, &THEM->Statistics[23], &THEM->Statistics[24], &THEM->Statistics[25]); +} diff --git a/Mesh/3D_Mesh.h b/Mesh/3D_Mesh.h new file mode 100644 index 0000000000000000000000000000000000000000..ac47acd0e8fde29eb8bedb57dafc9cb486dabd50 --- /dev/null +++ b/Mesh/3D_Mesh.h @@ -0,0 +1,21 @@ +#ifndef _3D_MESH_H_ +#define _3D_MESH_H_ + +Brick LaBrique (Grid_T * pGrid, double X, double Y, double Z); +void AddSimplexInGrid (Mesh * m, Simplex * s, int boule_boite); +int Coherence (Volume * v, Mesh * m); +void Gamma_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin); +void Eta_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin); +void R_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin); +int Pt_In_Volume (double X, double Y, double Z, Mesh * m, + double *l, double tol); +void findminmax (void *a, void *b); +void getminmax (double *xmin, double *ymin, double *zmin, + double *xmax, double *ymax, double *zmax); +void cut_tetraedre (Intersection * pI, Tree_T * AddedTet, Tree_T * TetDel, + Tree_T * newpoints); +void Impression_Resultats (void); +void Restore_Volume (Volume * v); +void Remise_A_Zero (void); + +#endif diff --git a/Mesh/3D_SMesh.cpp b/Mesh/3D_SMesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dfe17ceb90aa2e753d1c57ab4436471496e718e5 --- /dev/null +++ b/Mesh/3D_SMesh.cpp @@ -0,0 +1,514 @@ +/* + Maillage transfini volumique + + a0 s0 s1 f0 s0 s1 s5 s4 s6 + s7 s6 a1 s1 s2 f1 s1 s2 s6 s4 * + *-------* a2 s3 s2 f2 s3 s2 s6 s7 /|\ + |\s4 |\ a3 s0 s3 f3 s0 s3 s7 s4 / | \ + | *-------* s5 a4 s4 s5 f4 s0 s1 s2 s3 s7/s4/ |s2\ + | | s2| | a5 s5 s6 f5 s4 s5 s6 s7 *---*---* s5 + s3 *-|-----* | a6 s7 s6 | / \ | + \| \| a7 s4 s7 | / \ | + *-------* a8 s0 s4 |/ \| + v w s0 s1 a9 s1 s5 *-------* + \| a10 s2 s6 v w s3/s0 s1 + *--u a11 s3 s7 \| + *--u + + + Remarque : La definition d'un volume prismatique doit se faire dans l'ordre + donne sur le schema. (degenerescence obligatoirement en s0/s4) + +*/ + +#include "Gmsh.h" +#include "Mesh.h" +#include "Interpolation.h" +#include "Create.h" + +extern Mesh *THEM; +extern int CurrentNodeNumber; + +int index2d (int flag, int M, int N, int m, int n){ + switch(flag){ + case 0 : return(n + N*m); + case 1 : return(M*N - M*(n+1) + m); + case 2 : return(M*N - (n+N*m) - 1); + case 3 : return(M + n*M - m - 1); + case 4 : return(N + m*N - n - 1); + case 5 : return(M*N - (m+M*n) - 1); + case 6 : return(M*N - N*(m+1) + n); + case 7 : return(m + M*n); + default : return 0; + } +} + +void index_uv (int flag, Vertex * ver, double *u, double *v){ + switch (flag){ + case 0: *u = ver->us[0]; *v = ver->us[1]; break; + case 1: *u = ver->us[1]; *v = 1. - ver->us[0]; break; + case 2: *u = 1. - ver->us[0]; *v = 1. - ver->us[1]; break; + case 3: *u = 1. - ver->us[1]; *v = ver->us[0]; break; + case 4: *u = ver->us[0]; *v = 1. - ver->us[1]; break; + case 5: *u = 1. - ver->us[1]; *v = 1. - ver->us[0]; break; + case 6: *u = 1. - ver->us[0]; *v = ver->us[1]; break; + case 7: *u = ver->us[1]; *v = ver->us[0]; break; + } +} + +#define CREATE_HEX Create_Hexahedron(list[(i) + N1*(j) + N1*N2*(k)], \ + list[(i+1) + N1*(j) + N1*N2*(k)], \ + list[(i+1) + N1*(j+1) + N1*N2*(k)], \ + list[(i) + N1*(j+1) + N1*N2*(k)], \ + list[(i) + N1*(j) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j+1) + N1*N2*(k+1)], \ + list[(i) + N1*(j+1) + N1*N2*(k+1)]) + +#define CREATE_PRISM_1 Create_Prism(list[(i) + N1*(j) + N1*N2*(k)], \ + list[(i+1) + N1*(j) + N1*N2*(k)], \ + list[(i) + N1*(j+1) + N1*N2*(k)], \ + list[(i) + N1*(j) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j) + N1*N2*(k+1)], \ + list[(i) + N1*(j+1) + N1*N2*(k+1)]) + +#define CREATE_PRISM_2 Create_Prism(list[(i+1) + N1*(j+1) + N1*N2*(k)], \ + list[(i) + N1*(j+1) + N1*N2*(k)], \ + list[(i+1) + N1*(j) + N1*N2*(k)], \ + list[(i+1) + N1*(j+1) + N1*N2*(k+1)], \ + list[(i) + N1*(j+1) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j) + N1*N2*(k+1)]) + +#define CREATE_SIM_1 Create_Simplex(list[(i) + N1*(j) + N1*N2*(k)], \ + list[(i+1) + N1*(j) + N1*N2*(k)], \ + list[(i) + N1*(j+1) + N1*N2*(k)], \ + list[(i) + N1*(j) + N1*N2*(k+1)]) + +#define CREATE_SIM_2 Create_Simplex(list[(i+1) + N1*(j) + N1*N2*(k)], \ + list[(i) + N1*(j+1) + N1*N2*(k)], \ + list[(i) + N1*(j) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j) + N1*N2*(k+1)]) + +#define CREATE_SIM_3 Create_Simplex(list[(i) + N1*(j) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j) + N1*N2*(k+1)], \ + list[(i) + N1*(j+1) + N1*N2*(k)], \ + list[(i) + N1*(j+1) + N1*N2*(k+1)]) + +#define CREATE_SIM_4 Create_Simplex(list[(i+1) + N1*(j) + N1*N2*(k)], \ + list[(i) + N1*(j+1) + N1*N2*(k)], \ + list[(i+1) + N1*(j) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j+1) + N1*N2*(k)]) + +#define CREATE_SIM_5 Create_Simplex(list[(i) + N1*(j+1) + N1*N2*(k)], \ + list[(i) + N1*(j+1) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j+1) + N1*N2*(k)]) + +#define CREATE_SIM_6 Create_Simplex(list[(i+1) + N1*(j) + N1*N2*(k+1)], \ + list[(i) + N1*(j+1) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j+1) + N1*N2*(k+1)], \ + list[(i+1) + N1*(j+1) + N1*N2*(k)]) + +int MeshTransfiniteVolume (Volume *vol) { + int i,j,k,flag,nbs,nbp,nbg; + int nbtet=0, nbpri=0, nbhex=0; + Surface *G[6],*GG[6]; + Vertex V,**vexist,*pV,*CP[4],**list; + double u,v,w,dum; + int F_flag[6]; + int N1,N2,N3; + Vertex *F[6],*C[12],*Stmp[8],*S[8]; + Hexahedron *hexa; + Prism *prism; + Simplex *simp; + int NbFacesFound=0 ; + + static int tab1hex[] = {0,1,5,4, 1,2,6,5, 3,2,6,7, 0,3,7,4, 0,1,2,3, 4,5,6,7}; + static int tab2[] = {0,1,2,3, 1,2,3,0, 2,3,0,1, 3,0,1,2, + 3,2,1,0, 2,1,0,3, 1,0,3,2, 0,3,2,1}; + + if (vol->Method != TRANSFINI) return(0); + + nbs = List_Nbr(vol->Surfaces); + + if(nbs == 5) nbp = 6; + else if(nbs == 6) nbp = 8; + else return(0); + + for(i=0;i<6;i++) G[i] = NULL ; + + for(i=0;i<nbp;i++){ + V.Num = vol->ipar[i]; + pV = &V; + if((vexist = (Vertex**)Tree_PQuery(THEM->Vertices,&pV)) == NULL) { + Msg(WARNING, "Unknown Control Point %d in Transfinite Volume %d\n", + V.Num,vol->Num); + return(0); + } + else{ + Stmp[i]=*vexist; + } + } + + if(nbp == 8){ + for(i=0;i<8;i++) S[i]=Stmp[i]; + } + else if(nbp == 6){ + S[0] = S[3] = Stmp[0]; + S[1] = Stmp[1]; + S[2] = Stmp[2]; + S[4] = S[7] = Stmp[3]; + S[5] = Stmp[4]; + S[6] = Stmp[5]; + } + + /* + for(i=0;i<8;i++) printf("S[%d]=%d \n", i, S[i]->Num); + */ + + for(i=0;i<nbs;i++) List_Read(vol->Surfaces,i,&GG[i]); + + for(i=0;i<nbs;i++){ + nbg = List_Nbr(GG[i]->s.Generatrices); + + for(j=0;j<nbg;j++){ + V.Num = GG[i]->ipar[j]; + pV = &V; + if((vexist = (Vertex**)Tree_PQuery(THEM->Vertices,&pV)) == NULL) { + Msg(WARNING, "Unknown Control Point %d in Transfinite Surface %d\n", + V.Num,GG[i]->Num); + return(0); + } + else{ + CP[j]=*vexist; + } + } + + if(nbg == 3) CP[3] = CP[0]; + + for(flag=0;flag<8;flag++){ + for(k=0;k<6;k++){ + if(S[tab1hex[4*k ]]->Num == CP[tab2[4*flag ]]->Num && + S[tab1hex[4*k+1]]->Num == CP[tab2[4*flag+1]]->Num && + S[tab1hex[4*k+2]]->Num == CP[tab2[4*flag+2]]->Num && + S[tab1hex[4*k+3]]->Num == CP[tab2[4*flag+3]]->Num ){ + G[k]=GG[i]; + F_flag[k]=flag; + NbFacesFound++; + /* + printf("TR3D: (k=%d) face trouvee %d (flag = %d) : nodes %d %d %d %d \n", + k,GG[i]->Num, flag, + S[tab1hex[4*k ]]->Num, + S[tab1hex[4*k+1]]->Num, + S[tab1hex[4*k+2]]->Num, + S[tab1hex[4*k+3]]->Num); + */ + } + } + } + } + + if(nbs == 6 && NbFacesFound != 6) { + Msg(WARNING, "Wrong definition of Hexahedric Transfinite Volume(%d)\n", + vol->Num); + return(0); + } + + if(nbs == 5 && NbFacesFound != 5) { + Msg(WARNING, "Wrong definition of Prismatic Transfinite Volume(%d). " + "Possibly because first and fourth points are not the degenerated ones\n", + vol->Num); + return(0); + } + + if(nbs == 6){ + for(i=0;i<6;i++){ + if(G[i] == NULL) { + Msg(WARNING, "Wrong definition of Hexahedric Transfinite Volume(%d)\n", + vol->Num); + return(0); + } + } + } + else if(nbs == 5){ + for(i=0;i<6;i++){ + if(i != 3) { + if(G[i] == NULL) { + Msg(WARNING, "Wrong definition of Prismatic Transfinite Volume(%d). " + "Possibly because first and fourth points are not the degenerated ones\n", + vol->Num); + return(0); + } + } + } + } + + + N1 = (F_flag[4] % 2 == 0) ? G[4]->Nu : G[4]->Nv ; + N2 = (F_flag[4] % 2 == 0) ? G[4]->Nv : G[4]->Nu ; + N3 = (F_flag[0] % 2 == 0) ? G[0]->Nv : G[0]->Nu ; + + /* + printf("N1(%d) N2(%d) N3(%d)\n", N1,N2,N3); + */ + + list = (Vertex**)Malloc(N1*N2*N3*sizeof(Vertex*)); + + for(i=0;i<N1;i++){ + + for(j=0;j<N2;j++){ + + List_Read(G[4]->TrsfVertices, index2d(F_flag[4],N1,N2, i, 0 ), &C[0]); + List_Read(G[4]->TrsfVertices, index2d(F_flag[4],N1,N2, N1-1, j ), &C[1]); + List_Read(G[4]->TrsfVertices, index2d(F_flag[4],N1,N2, i, N2-1), &C[2]); + List_Read(G[4]->TrsfVertices, index2d(F_flag[4],N1,N2, 0, j ), &C[3]); + List_Read(G[5]->TrsfVertices, index2d(F_flag[5],N1,N2, i, 0 ), &C[4]); + List_Read(G[5]->TrsfVertices, index2d(F_flag[5],N1,N2, N1-1, j ), &C[5]); + List_Read(G[5]->TrsfVertices, index2d(F_flag[5],N1,N2, i, N2-1), &C[6]); + List_Read(G[5]->TrsfVertices, index2d(F_flag[5],N1,N2, 0, j ), &C[7]); + + List_Read(G[4]->TrsfVertices, index2d(F_flag[4],N1,N2, i, j), &F[4]); + List_Read(G[5]->TrsfVertices, index2d(F_flag[5],N1,N2, i, j), &F[5]); + + index_uv(F_flag[4],F[4],&u,&v); + + for(k=0;k<N3;k++){ + + List_Read(G[0]->TrsfVertices, index2d(F_flag[0],N1,N3, 0, k), &C[8]); + List_Read(G[0]->TrsfVertices, index2d(F_flag[0],N1,N3, N1-1, k), &C[9]); + List_Read(G[2]->TrsfVertices, index2d(F_flag[2],N1,N3, N1-1, k), &C[10]); + List_Read(G[2]->TrsfVertices, index2d(F_flag[2],N1,N3, 0, k), &C[11]); + + List_Read(G[0]->TrsfVertices, index2d(F_flag[0],N1,N3, i, k), &F[0]); + List_Read(G[1]->TrsfVertices, index2d(F_flag[1],N2,N3, j, k), &F[1]); + List_Read(G[2]->TrsfVertices, index2d(F_flag[2],N1,N3, i, k), &F[2]); + if(nbs==6) + List_Read(G[3]->TrsfVertices, index2d(F_flag[3],N2,N3, j, k), &F[3]); + else if(nbs == 5) + F[3]=C[8]; + + index_uv(F_flag[0],F[0],&dum,&w); + + if(i && j && k && i != N1-1 && j != N2-1 && k != N3-1){ + V = TransfiniteHex(*F[0],*F[1],*F[2],*F[3],*F[4],*F[5], + *C[0],*C[1],*C[2],*C[3],*C[4],*C[5], + *C[6],*C[7],*C[8],*C[9],*C[10],*C[11], + *S[0],*S[1],*S[2],*S[3],*S[4],*S[5],*S[6],*S[7], + u,v,w); + list[i+N1*j+N1*N2*k] = Create_Vertex(++CurrentNodeNumber, + V.Pos.X,V.Pos.Y,V.Pos.Z,V.lc,0.0); + /* + printf(" NEW node : %f %f %f\n", list[i+N1*j+N1*N2*k]->Pos.X, + list[i+N1*j+N1*N2*k]->Pos.Y, list[i+N1*j+N1*N2*k]->Pos.Z); + */ + } + + else if(!i){ + list[i+N1*j+N1*N2*k] = F[3]; + } + else if(!j){ + list[i+N1*j+N1*N2*k] = F[0]; + } + else if(!k){ + list[i+N1*j+N1*N2*k] = F[4]; + } + else if(i == N1-1){ + list[i+N1*j+N1*N2*k] = F[1]; + } + else if(j == N2-1){ + list[i+N1*j+N1*N2*k] = F[2]; + } + else if(k == N3-1){ + list[i+N1*j+N1*N2*k] = F[5]; + } + + } + } + } + + for(i=0;i<N1;i++){ + for(j=0;j<N2;j++){ + for(k=0;k<N3;k++){ + Tree_Replace(THEM->Vertices,&list[i+N1*j+N1*N2*k]); + Tree_Replace(vol->Vertices,&list[i+N1*j+N1*N2*k]); + } + } + } + + if(nbs == 6){ + for(i=0;i<N1-1;i++){ + for(j=0;j<N2-1;j++){ + for(k=0;k<N3-1;k++){ + if(G[0]->Recombine && G[1]->Recombine && G[2]->Recombine && + G[3]->Recombine && G[4]->Recombine && G[5]->Recombine) { + hexa = CREATE_HEX; hexa->iEnt = vol->Num; Tree_Replace(vol->Hexahedra,&hexa); + + nbhex++; + } + else if (!G[0]->Recombine && G[1]->Recombine && !G[2]->Recombine && + G[3]->Recombine && G[4]->Recombine && G[5]->Recombine) { + prism = Create_Prism(list[(i) + N1*(j) + N1*N2*(k)], + list[(i+1) + N1*(j) + N1*N2*(k)], + list[(i) + N1*(j) + N1*N2*(k+1)], + list[(i) + N1*(j+1) + N1*N2*(k)], + list[(i+1) + N1*(j+1) + N1*N2*(k)], + list[(i) + N1*(j+1) + N1*N2*(k+1)]); + prism->iEnt = vol->Num; + Tree_Replace(vol->Prisms,&prism); + + prism = Create_Prism(list[(i+1) + N1*(j) + N1*N2*(k+1)], + list[(i) + N1*(j) + N1*N2*(k+1)], + list[(i+1) + N1*(j) + N1*N2*(k)], + list[(i+1) + N1*(j+1) + N1*N2*(k+1)], + list[(i) + N1*(j+1) + N1*N2*(k+1)], + list[(i+1) + N1*(j+1) + N1*N2*(k)]); + prism->iEnt = vol->Num; + Tree_Replace(vol->Prisms,&prism); + + nbpri +=2 ; + } + else if (G[0]->Recombine && !G[1]->Recombine && G[2]->Recombine && + !G[3]->Recombine && G[4]->Recombine && G[5]->Recombine) { + prism = Create_Prism(list[(i+1) + N1*(j) + N1*N2*(k)], + list[(i+1) + N1*(j+1) + N1*N2*(k)], + list[(i+1) + N1*(j) + N1*N2*(k+1)], + list[(i) + N1*(j) + N1*N2*(k)], + list[(i) + N1*(j+1) + N1*N2*(k)], + list[(i) + N1*(j) + N1*N2*(k+1)]); + prism->iEnt = vol->Num; + Tree_Replace(vol->Prisms,&prism); + + prism = Create_Prism(list[(i+1) + N1*(j+1) + N1*N2*(k+1)], + list[(i+1) + N1*(j) + N1*N2*(k+1)], + list[(i+1) + N1*(j+1) + N1*N2*(k)], + list[(i) + N1*(j+1) + N1*N2*(k+1)], + list[(i) + N1*(j) + N1*N2*(k+1)], + list[(i) + N1*(j+1) + N1*N2*(k)]); + prism->iEnt = vol->Num; + Tree_Replace(vol->Prisms,&prism); + + nbpri += 2 ; + } + else if (G[0]->Recombine && G[1]->Recombine && G[2]->Recombine && + G[3]->Recombine && !G[4]->Recombine && !G[5]->Recombine) { + prism = CREATE_PRISM_1; prism->iEnt = vol->Num; Tree_Replace(vol->Prisms,&prism); + prism = CREATE_PRISM_2; prism->iEnt = vol->Num; Tree_Replace(vol->Prisms,&prism); + + nbpri += 2; + } + else if (!G[0]->Recombine && !G[1]->Recombine && !G[2]->Recombine && + !G[3]->Recombine && !G[4]->Recombine && !G[5]->Recombine) { + simp = CREATE_SIM_1; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + simp = CREATE_SIM_2; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + simp = CREATE_SIM_3; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + simp = CREATE_SIM_4; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + simp = CREATE_SIM_5; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + simp = CREATE_SIM_6; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + + nbtet += 6; + } + else{ + Msg(WARNING, "Wrong Surface Recombining in Transfinite Volume(%d)\n", + vol->Num); + return(0); + } + } + } + } + } + else if (nbs == 5){ + for(j=0;j<N2-1;j++){ + for(k=0;k<N3-1;k++){ + if( ( G[0]->Recombine && G[1]->Recombine && G[2]->Recombine && + G[4]->Recombine && G[5]->Recombine) || + ( G[0]->Recombine && G[1]->Recombine && G[2]->Recombine && + !G[4]->Recombine && !G[5]->Recombine) ){ + prism = Create_Prism(list[ N1*(j) + N1*N2*(k)], + list[1 + N1*(j) + N1*N2*(k)], + list[1 + N1*(j+1) + N1*N2*(k)], + list[ N1*(j) + N1*N2*(k+1)], + list[1 + N1*(j) + N1*N2*(k+1)], + list[1 + N1*(j+1) + N1*N2*(k+1)]); + prism->iEnt = vol->Num; + Tree_Replace(vol->Prisms,&prism); + + nbpri++; + } + else if(!G[0]->Recombine && !G[1]->Recombine && !G[2]->Recombine && + !G[4]->Recombine && !G[5]->Recombine){ + simp = Create_Simplex(list[ + N1*(j) + N1*N2*(k)], + list[1 + N1*(j) + N1*N2*(k)], + list[1 + N1*(j+1) + N1*N2*(k)], + list[ + N1*(j) + N1*N2*(k+1)]); + simp->iEnt = vol->Num; + Tree_Replace(vol->Simplexes,&simp); + + simp = Create_Simplex(list[1 + N1*(j) + N1*N2*(k)], + list[1 + N1*(j+1) + N1*N2*(k)], + list[ + N1*(j) + N1*N2*(k+1)], + list[1 + N1*(j) + N1*N2*(k+1)]); + simp->iEnt = vol->Num; + Tree_Replace(vol->Simplexes,&simp); + + simp = Create_Simplex(list[ + N1*(j) + N1*N2*(k+1)], + list[1 + N1*(j+1) + N1*N2*(k+1)], + list[1 + N1*(j) + N1*N2*(k+1)], + list[1 + N1*(j+1) + N1*N2*(k)]); + simp->iEnt = vol->Num; + Tree_Replace(vol->Simplexes,&simp); + + nbtet += 2; + } + else{ + Msg(WARNING, "Wrong Surface Recombining in Transfinite Volume(%d)\n", + vol->Num); + return(0); + } + } + } + for(i=1;i<N1-1;i++){ + for(j=0;j<N2-1;j++){ + for(k=0;k<N3-1;k++){ + if(G[0]->Recombine && G[1]->Recombine && G[2]->Recombine && + G[4]->Recombine && G[5]->Recombine){ + hexa = CREATE_HEX; hexa->iEnt = vol->Num; Tree_Replace(vol->Hexahedra,&hexa); + + nbhex ++; + } + else if(G[0]->Recombine && G[1]->Recombine && G[2]->Recombine && + !G[4]->Recombine && !G[5]->Recombine){ + prism = CREATE_PRISM_1; prism->iEnt = vol->Num; Tree_Replace(vol->Prisms,&prism); + prism = CREATE_PRISM_2; prism->iEnt = vol->Num; Tree_Replace(vol->Prisms,&prism); + + nbpri += 2; + } + else if(!G[0]->Recombine && !G[1]->Recombine && !G[2]->Recombine && + !G[4]->Recombine && !G[5]->Recombine){ + simp = CREATE_SIM_1; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + simp = CREATE_SIM_2; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + simp = CREATE_SIM_3; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + simp = CREATE_SIM_4; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + simp = CREATE_SIM_5; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + simp = CREATE_SIM_6; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp); + + nbtet += 6; + } + else{ + Msg(WARNING, "Wrong Surface Recombining in Transfinite Volume(%d)\n", + vol->Num); + return(0); + } + } + } + } + } + + THEM->Statistics[6] += Tree_Nbr(vol->Vertices); + THEM->Statistics[9] += nbtet; + THEM->Statistics[10] += nbhex; + THEM->Statistics[11] += nbpri; + + return(1); + +} + diff --git a/Mesh/Create.cpp b/Mesh/Create.cpp new file mode 100644 index 0000000000000000000000000000000000000000..13173d35ee8a9ad78c04c810d926489c3f30f6b8 --- /dev/null +++ b/Mesh/Create.cpp @@ -0,0 +1,585 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "Mesh.h" +#include "Numeric.h" + +extern Mesh *THEM; +extern int Alerte_Point_Scabreux; +extern int CurrentSimplexNumber; + +//static double CIRC_GRAN = 2.2; + +int compareNXE (const void *a, const void *b){ + NXE *q, *w; + + q = (NXE *) a; + w = (NXE *) b; + return (compareVertex (&q->v, &w->v)); +} + +int compareFxE (const void *a, const void *b){ + FxE *q, *w; + + q = (FxE *) a; + w = (FxE *) b; + return (compareFace (&q->Sorted, &w->Sorted)); +} + +int compareHexahedron (const void *a, const void *b){ + Hexahedron **q, **w; + + q = (Hexahedron **) a; + w = (Hexahedron **) b; + return ((*q)->Num - (*w)->Num); +} + +int compareSurfaceLoop (const void *a, const void *b){ + SurfaceLoop **q, **w; + + q = (SurfaceLoop **) a; + w = (SurfaceLoop **) b; + return ((*q)->Num - (*w)->Num); +} + +int compareEdgeLoop (const void *a, const void *b){ + EdgeLoop **q, **w; + + q = (EdgeLoop **) a; + w = (EdgeLoop **) b; + return ((*q)->Num - (*w)->Num); +} + +int comparePrism (const void *a, const void *b){ + Prism **q, **w; + + q = (Prism **) a; + w = (Prism **) b; + return ((*q)->Num - (*w)->Num); +} + +int compareQuality (const void *a, const void *b){ + double d; + Simplex **q, **w; + + q = (Simplex **) a; + w = (Simplex **) b; + d = (*q)->Quality - (*w)->Quality; + + if (d > 0) + return (1); + if (d < 0) + return (-1); + return ((*q)->Num - (*w)->Num); +} + +int compareCurve (const void *a, const void *b){ + Curve **q, **w; + + q = (Curve **) a; + w = (Curve **) b; + return ((*q)->Num - (*w)->Num); +} + +int compareAttractor (const void *a, const void *b){ + Attractor **q, **w; + + q = (Attractor **) a; + w = (Attractor **) b; + return ((*q)->Num - (*w)->Num); +} + +int compareSurface (const void *a, const void *b){ + Surface **q, **w; + + q = (Surface **) a; + w = (Surface **) b; + return ((*q)->Num - (*w)->Num); +} + +int compareVolume (const void *a, const void *b){ + Volume **q, **w; + + q = (Volume **) a; + w = (Volume **) b; + return ((*q)->Num - (*w)->Num); +} + +int compareSxF (const void *a, const void *b){ + SxF *q, *w; + + q = (SxF *) a; + w = (SxF *) b; + return compareFace (&q->F, &w->F); +} + +Attractor * Create_Attractor (int Num, double lc1, double lc2, double Radius, + Vertex * v, Curve * c, Surface * s){ + Attractor *pA; + + pA = (Attractor *) Malloc (sizeof (Attractor)); + pA->v = v; + pA->c = c; + pA->s = s; + pA->lc1 = lc1; + pA->lc2 = lc2; + pA->Radius = Radius; + return pA; +} + +void Add_SurfaceLoop (int Num, List_T * intlist, Mesh * M){ + SurfaceLoop *pSL; + int i, j; + pSL = (SurfaceLoop *) Malloc (sizeof (SurfaceLoop)); + pSL->Surfaces = List_Create (List_Nbr (intlist), 1, sizeof (int)); + pSL->Num = Num; + for (i = 0; i < List_Nbr (intlist); i++){ + List_Read (intlist, i, &j); + List_Add (pSL->Surfaces, &j); + } + Tree_Add (M->SurfaceLoops, &pSL); +} + +void Add_PhysicalGroup (int Num, int typ, List_T * intlist, Mesh * M){ + PhysicalGroup *pSL; + int i, j; + pSL = (PhysicalGroup *) Malloc (sizeof (PhysicalGroup)); + pSL->Entities = List_Create (List_Nbr (intlist), 1, sizeof (int)); + pSL->Num = Num; + pSL->Typ = typ; + for (i = 0; i < List_Nbr (intlist); i++){ + List_Read (intlist, i, &j); + List_Add (pSL->Entities, &j); + } + List_Add (M->PhysicalGroups, &pSL); +} + +void Add_EdgeLoop (int Num, List_T * intlist, Mesh * M){ + EdgeLoop *pEL; + int i, j; + pEL = (EdgeLoop *) Malloc (sizeof (EdgeLoop)); + pEL->Curves = List_Create (List_Nbr (intlist), 1, sizeof (int)); + pEL->Num = Num; + for (i = 0; i < List_Nbr (intlist); i++){ + List_Read (intlist, i, &j); + List_Add (pEL->Curves, &j); + } + Tree_Add (M->EdgeLoops, &pEL); +} + +void End_Curve (Curve * c){ + double det, R2, mat[3][3], R, A3, A1, A4; + Vertex *v[5], v1, v3, v4; + double dd[3], qq[3], AX, f1, f2, DP, dir32[3], dir12[3], n[3], m[3], dir42[3]; + double rhs[2], sys[2][2], sol[2]; + int i; + Curve *Curve; + + if (c->Typ == MSH_SEGM_CIRC || + c->Typ == MSH_SEGM_CIRC_INV || + c->Typ == MSH_SEGM_ELLI || + c->Typ == MSH_SEGM_ELLI_INV){ + + Curve = c; + + if (List_Nbr (Curve->Control_Points) == 4) + List_Read (Curve->Control_Points, 2, &v[4]); + else + v[4] = NULL; + + if (Curve->Typ == MSH_SEGM_CIRC_INV || + Curve->Typ == MSH_SEGM_ELLI_INV){ + List_Read (Curve->Control_Points, 0, &v[3]); + List_Read (Curve->Control_Points, 1, &v[2]); + if (!v[4]) + List_Read (Curve->Control_Points, 2, &v[1]); + else + List_Read (Curve->Control_Points, 3, &v[1]); + } + else{ + List_Read (Curve->Control_Points, 0, &v[1]); + List_Read (Curve->Control_Points, 1, &v[2]); + if (!v[4]) + List_Read (Curve->Control_Points, 2, &v[3]); + else + List_Read (Curve->Control_Points, 3, &v[3]); + } + + direction (v[2], v[3], dir32); + direction (v[2], v[1], dir12); + if (v[4]) + direction (v[2], v[4], dir42); + + /* + norme(dir32); + norme(dir12); + norme(dir42); + */ + + //prodve(dir12,dir32,n); + dd[0] = dir12[0]; + dd[1] = dir12[1]; + dd[2] = dir12[2]; + qq[0] = dir32[0]; + qq[1] = dir32[1]; + qq[2] = dir32[2]; + norme (dd); + norme (qq); + prodve (dd, qq, n); + if (fabs (n[0]) < 1.e-5 && fabs (n[1]) < 1.e-5 && fabs (n[2]) < 1.e-5){ + n[0] = Curve->Circle.n[0]; + n[1] = Curve->Circle.n[1]; + n[2] = Curve->Circle.n[2]; + } + + /* BOF BOF BOF */ + prodve (n, dir12, m); + + v1.Pos.X = dir12[0]; + v1.Pos.Y = dir12[1]; + v1.Pos.Z = dir12[2]; + v3.Pos.X = dir32[0]; + v3.Pos.Y = dir32[1]; + v3.Pos.Z = dir32[2]; + if (v[4]){ + v4.Pos.X = dir42[0]; + v4.Pos.Y = dir42[1]; + v4.Pos.Z = dir42[2]; + } + norme (dir12); + norme (n); + norme (m); + + mat[2][0] = Curve->Circle.invmat[0][2] = n[0]; + mat[2][1] = Curve->Circle.invmat[1][2] = n[1]; + mat[2][2] = Curve->Circle.invmat[2][2] = n[2]; + mat[1][0] = Curve->Circle.invmat[0][1] = m[0]; + mat[1][1] = Curve->Circle.invmat[1][1] = m[1]; + mat[1][2] = Curve->Circle.invmat[2][1] = m[2]; + mat[0][0] = Curve->Circle.invmat[0][0] = dir12[0]; + mat[0][1] = Curve->Circle.invmat[1][0] = dir12[1]; + mat[0][2] = Curve->Circle.invmat[2][0] = dir12[2]; + + /* + if(n[0] == 0.0 && n[1] == 0.0){ + mat[2][0] = Curve->Circle.invmat[0][2] = 0; + mat[2][1] = Curve->Circle.invmat[1][2] = 0; + mat[2][2] = Curve->Circle.invmat[2][2] = 1; + mat[1][0] = Curve->Circle.invmat[0][1] = 0; + mat[1][1] = Curve->Circle.invmat[1][1] = 1; + mat[1][2] = Curve->Circle.invmat[2][1] = 0; + mat[0][0] = Curve->Circle.invmat[0][0] = 1; + mat[0][1] = Curve->Circle.invmat[1][0] = 0; + mat[0][2] = Curve->Circle.invmat[2][0] = 0; + } + */ + + Projette (&v1, mat); + Projette (&v3, mat); + if (v[4]) + Projette (&v4, mat); + + R = sqrt (v1.Pos.X * v1.Pos.X + v1.Pos.Y * v1.Pos.Y); + R2 = sqrt (v3.Pos.X * v3.Pos.X + v3.Pos.Y * v3.Pos.Y); + A3 = myatan2 (v3.Pos.Y, v3.Pos.X); + if (v[4]) + A4 = myatan2 (v4.Pos.Y, v4.Pos.X); + else + A4 = 0.0; + A1 = myatan2 (v1.Pos.Y, v1.Pos.X); + + DP = 2 * Pi; + + A3 = angle_02pi (A3); + A1 = angle_02pi (A1); + if (v[4]) + A4 = angle_02pi (A4); + if (A1 >= A3) + A3 += DP; + if (A4 > A1) + A4 -= DP; + + if (v[4]){ + AX = (A1 - A4); + sys[0][0] = cos (AX) * cos (A4); + sys[0][1] = -sin (AX) * sin (A4); + sys[1][0] = cos (AX) * sin (A4); + sys[1][1] = sin (AX) * cos (A4); + rhs[0] = v1.Pos.X; + rhs[1] = v1.Pos.Y; + det = sys[0][0] * sys[1][1] - sys[1][0] * sys[0][1]; + if (det < 1.e-12){ + AX = (A3 - A4); + sys[0][0] = cos (AX) * cos (A4); + sys[0][1] = -sin (AX) * sin (A4); + sys[1][0] = cos (AX) * sin (A4); + sys[1][1] = sin (AX) * cos (A4); + rhs[0] = v3.Pos.X; + rhs[1] = v3.Pos.Y; + det = sys[0][0] * sys[1][1] - sys[1][0] * sys[0][1]; + } + if (det < 1.e-12){ + f1 = DMAX (R, R2); + f2 = DMIN (R, R2); + } + else{ + sys2x2 (sys, rhs, sol); + f1 = sol[0]; + f2 = sol[1]; + } + } + else{ + f1 = f2 = R; + } + + Curve->Circle.t1 = A1; + Curve->Circle.t2 = A3; + Curve->Circle.f1 = f1; + Curve->Circle.f2 = f2; + Curve->Circle.incl = A4; + + for (i = 0; i < 4; i++) + Curve->Circle.v[i] = v[i]; + + if (!c->Circle.done){ + float proj[4][4]; + for (i = 0; i < 4; i++){ + for (int j = 0; j < 4; j++){ + if (i != 3 && j != 3) + proj[i][j] = Curve->Circle.f1 * Curve->Circle.invmat[i][j]; + else + proj[i][j] = 0.0; + } + } + proj[0][3] = Curve->Circle.v[2]->Pos.X; + proj[1][3] = Curve->Circle.v[2]->Pos.Y; + proj[2][3] = Curve->Circle.v[2]->Pos.Z; + proj[3][3] = 1.0; + c->Circle.done = 1; + } + // Un cercle a au moins 16 pts par pi radiants + + // c->beg->lc = DMIN (R*Pi/(fabs(c->Circle.t1-c->Circle.t2)*CIRC_GRAN),c->beg->lc); + // c->end->lc = DMIN (R*Pi/(fabs(c->Circle.t1-c->Circle.t2)*CIRC_GRAN),c->end->lc); + + } + c->cp = (float *) malloc (4 * List_Nbr (c->Control_Points) * sizeof (float)); + for (i = 0; i < List_Nbr (c->Control_Points); i++){ + List_Read (c->Control_Points, i, &v[0]); + c->cp[4 * i] = v[0]->Pos.X; + c->cp[4 * i + 1] = v[0]->Pos.Y; + c->cp[4 * i + 2] = v[0]->Pos.Z; + c->cp[4 * i + 3] = v[0]->w; + } + +} + +void End_Surface (Surface * s){ + int i; + Vertex *v; + + if (!s->Control_Points || !List_Nbr(s->Control_Points)) + return; + + s->cp = (float *) Malloc (4 * List_Nbr (s->Control_Points) * sizeof (float)); + for (i = 0; i < List_Nbr (s->Control_Points); i++){ + List_Read (s->Control_Points, i, &v); + s->cp[4 * i] = v->Pos.X; + s->cp[4 * i + 1] = v->Pos.Y; + s->cp[4 * i + 2] = v->Pos.Z; + s->cp[4 * i + 3] = v->w; + } + +} + + + +Curve *Create_Curve (int Num, int Typ, int Order, List_T * Liste, + List_T * Knots, int p1, int p2, double u1, double u2){ + Curve *pC; + Vertex *v; + int i, j, iPnt; + double d; + double matcr[4][4] = { {-0.5, 1.5, -1.5, 0.5}, + {1.0, -2.5, 2.0, -0.5}, + {-0.5, 0.0, 0.5, 0.0}, + {0.0, 1.0, 0.0, 0.0} }; + double matbs[4][4] = { {-1.0, 3, -3, 1}, + {3, -6, 3.0, 0}, + {-3, 0.0, 3, 0.0}, + {1, 4, 1, 0.0} }; + double matbez[4][4] = { {-1.0, 3, -3, 1}, + {3, -6, 3.0, 0}, + {-3, 3.0, 0, 0.0}, + {1, 0, 0, 0.0} }; + + pC = (Curve *) Malloc (sizeof (Curve)); + pC->Vertices = NULL; + pC->Typ = Typ; + pC->Num = Num; + pC->Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex); + pC->TrsfSimplexes = List_Create (1, 10, sizeof (Simplex *)); + pC->ConnectedSurfaces = NULL; + pC->Circle.done = 0; + pC->Method = LIBRE; + pC->degre = Order; + pC->Circle.n[0] = 1.0; + pC->Circle.n[1] = 0.0; + pC->Circle.n[2] = 0.0; + if (Typ == MSH_SEGM_SPLN){ + for (i = 0; i < 4; i++) + for (j = 0; j < 4; j++) + pC->mat[i][j] = matcr[i][j]; + + } + else if (Typ == MSH_SEGM_BSPLN){ + for (i = 0; i < 4; i++) + for (j = 0; j < 4; j++) + pC->mat[i][j] = matbs[i][j] / 6.0; + } + else if (Typ == MSH_SEGM_BEZIER){ + for (i = 0; i < 4; i++) + for (j = 0; j < 4; j++) + pC->mat[i][j] = matbez[i][j]; + } + + pC->ubeg = u1; + pC->uend = u2; + + if (Knots){ + pC->k = (float *) malloc (List_Nbr (Knots) * sizeof (float)); + double kmin = .0, kmax = 1.; + List_Read (Knots, 0, &kmin); + List_Read (Knots, List_Nbr (Knots) - 1, &kmax); + pC->ubeg = kmin; + pC->uend = kmax; + for (i = 0; i < List_Nbr (Knots); i++){ + List_Read (Knots, i, &d); + pC->k[i] = (float) d; + } + } + else + pC->k = NULL; + + if (Liste){ + pC->Control_Points = List_Create (List_Nbr (Liste), 1, sizeof (Vertex *)); + for (j = 0; j < List_Nbr (Liste); j++){ + List_Read (Liste, j, &iPnt); + if ((v = FindVertex (iPnt, THEM))) + List_Add (pC->Control_Points, &v); + else + Msg(ERROR, "Curve %d control point %d unknown", pC->Num, iPnt); + } + } + else { + //End_Curve(pC); + return pC; + } + + if (p1 < 0){ + List_Read (pC->Control_Points, 0, &pC->beg); + List_Read (pC->Control_Points, List_Nbr (pC->Control_Points) - 1, &pC->end); + } + else { + if ((v = FindVertex (p1, THEM))){ + pC->beg = v; + Msg(INFO, "Curve %d beg control point %d ", pC->Num, v->Num); + } + else{ + List_Read (pC->Control_Points, 0, &pC->beg); + Msg(ERROR, "Curve %d control point %d unknown", pC->Num, p1); + } + if ((v = FindVertex (p2, THEM))){ + pC->end = v; + Msg(INFO, "Curve %d end control point %d ", pC->Num, v->Num); + } + else{ + List_Read (pC->Control_Points, List_Nbr (pC->Control_Points) - 1, &pC->end); + Msg(ERROR, "Curve %d control point %d unknown", pC->Num, p2); + } + } + End_Curve (pC); + pC->Extrude = NULL; + return (pC); +} + +Surface * Create_Surface (int Num, int Typ, int Mat){ + Surface *pS; + + pS = (Surface *) Malloc (sizeof (Surface)); + pS->Num = Num; + pS->Typ = Typ; + pS->Mat = Mat; + pS->Method = LIBRE; + pS->Recombine = 0; + pS->RecombineAngle = 30; + pS->Simplexes = Tree_Create (sizeof (Simplex *), compareQuality); + pS->TrsfSimplexes = List_Create (1, 10, sizeof (Simplex *)); + pS->Vertices = Tree_Create (sizeof (Vertex *), compareVertex); + pS->TrsfVertices = List_Create (1, 10, sizeof (Vertex *)); + pS->Contours = List_Create (1, 1, sizeof (List_T *)); + pS->Orientations = NULL; + pS->Support = pS; + pS->Control_Points = List_Create (1, 10, sizeof (Vertex *)); + pS->Extrude = NULL; + pS->STL = NULL; + return (pS); +} + +Volume * Create_Volume (int Num, int Typ, int Mat){ + Volume *pV; + + pV = (Volume *) Malloc (sizeof (Volume)); + pV->Num = Num; + pV->Typ = Typ; + pV->Mat = Mat; + pV->Method = LIBRE; + pV->Surfaces = List_Create (1, 2, sizeof (Surface *)); + pV->Simplexes = Tree_Create (sizeof (Simplex *), compareQuality); + pV->Vertices = Tree_Create (sizeof (Vertex *), compareVertex); + pV->Hexahedra = Tree_Create (sizeof (Hexahedron *), compareHexahedron); + pV->Prisms = Tree_Create (sizeof (Prism *), comparePrism); + pV->Extrude = NULL; + return pV; +} + + +Hexahedron * Create_Hexahedron (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4, + Vertex * v5, Vertex * v6, Vertex * v7, Vertex * v8){ + Hexahedron *h; + + h = (Hexahedron *) Malloc (sizeof (Hexahedron)); + h->iEnt = -1; + h->Num = ++CurrentSimplexNumber; + h->V[0] = v1; + h->V[1] = v2; + h->V[2] = v3; + h->V[3] = v4; + h->V[4] = v5; + h->V[5] = v6; + h->V[6] = v7; + h->V[7] = v8; + h->VSUP = NULL; + + return (h); +} + +Prism * Create_Prism (Vertex * v1, Vertex * v2, Vertex * v3, + Vertex * v4, Vertex * v5, Vertex * v6){ + Prism *p; + + p = (Prism *) Malloc (sizeof (Prism)); + p->iEnt = -1; + p->Num = ++CurrentSimplexNumber; + p->V[0] = v1; + p->V[1] = v2; + p->V[2] = v3; + p->V[3] = v4; + p->V[4] = v5; + p->V[5] = v6; + p->VSUP = NULL; + + return (p); +} diff --git a/Mesh/Create.h b/Mesh/Create.h new file mode 100644 index 0000000000000000000000000000000000000000..83f718ecc37581bbf1e27a2f9a4b33b92f79c32c --- /dev/null +++ b/Mesh/Create.h @@ -0,0 +1,35 @@ +#ifndef _CREATE_H_ +#define _CREATE_H_ + +int compareNXE (const void *a, const void *b); +int compareFxE (const void *a, const void *b); +int compareHexahedron (const void *a, const void *b); +int compareSurfaceLoop (const void *a, const void *b); +int compareEdgeLoop (const void *a, const void *b); +int comparePrism (const void *a, const void *b); +int compareQuality (const void *a, const void *b); +int compareCurve (const void *a, const void *b); +int compareAttractor (const void *a, const void *b); +int compareSurface (const void *a, const void *b); +int compareVolume (const void *a, const void *b); +int compareSxF (const void *a, const void *b); + +Attractor * Create_Attractor (int Num, double lc1, double lc2, double Radius, + Vertex * v, Curve * c, Surface * s); +void Add_SurfaceLoop (int Num, List_T * intlist, Mesh * M); +void Add_PhysicalGroup (int Num, int typ, List_T * intlist, Mesh * M); +void Add_EdgeLoop (int Num, List_T * intlist, Mesh * M); + +void End_Curve (Curve * c); +void End_Surface (Surface * s); + +Curve *Create_Curve (int Num, int Typ, int Order, List_T * Liste, + List_T * Knots, int p1, int p2, double u1, double u2); +Surface * Create_Surface (int Num, int Typ, int Mat); +Volume * Create_Volume (int Num, int Typ, int Mat); +Hexahedron * Create_Hexahedron (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4, + Vertex * v5, Vertex * v6, Vertex * v7, Vertex * v8); +Prism * Create_Prism (Vertex * v1, Vertex * v2, Vertex * v3, + Vertex * v4, Vertex * v5, Vertex * v6); + +#endif diff --git a/Mesh/CrossData.cpp b/Mesh/CrossData.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a2e2ac88bfe26121b6a06e66b2d1c15186e38f5a --- /dev/null +++ b/Mesh/CrossData.cpp @@ -0,0 +1,34 @@ + + +#include "Gmsh.h" +#include "Mesh.h" + +Tree_T *TreeTemp; + +void AddTable (void *data, void *dummy){ + Simplex *s; + NXE nxe, *pnxe; + int i; + + s = *(Simplex **) data; + + for (i = 0; i < 4; i++){ + if (s->V[i]){ + nxe.v = s->V[i]; + if ((pnxe = (NXE *) Tree_PQuery (TreeTemp, &nxe))){ + List_Add (pnxe->Liste, &s); + } + else{ + nxe.Liste = List_Create (1, 1, sizeof (Simplex *)); + List_Add (nxe.Liste, &s); + Tree_Add (TreeTemp, &nxe); + } + } + } +} + +void create_NXE (Tree_T * TreeAllNod, Tree_T * TreeAllElg, + Tree_T * TreeAllNXE){ + TreeTemp = TreeAllNXE; + Tree_Action (TreeAllElg, AddTable); +} diff --git a/Mesh/Edge.cpp b/Mesh/Edge.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e3516b920019e292ec5be3b3e32e2c8428f9ac0d --- /dev/null +++ b/Mesh/Edge.cpp @@ -0,0 +1,186 @@ + +#include "Gmsh.h" +#include "Mesh.h" +#include "Const.h" +#include "Edge.h" +#include "Tools.h" + +static int edges_quad[4][2] = { {0, 1}, + {1, 2}, + {2, 3}, + {3, 0} }; +static int edges_tetra[6][2] = { {0, 1}, + {1, 2}, + {2, 0}, + {3, 0}, + {3, 2}, + {3, 1} }; +static int edges_non[3] = {2, 0, 1}; + +int compareedge (const void *a, const void *b){ + int i1, i2, j1, j2; + Edge *q, *w; + + q = (Edge *) a; + w = (Edge *) b; + i1 = IMAX (q->V[0]->Num, q->V[1]->Num); + i2 = IMAX (w->V[0]->Num, w->V[1]->Num); + j1 = IMIN (q->V[0]->Num, q->V[1]->Num); + j2 = IMIN (w->V[0]->Num, w->V[1]->Num); + + if (i1 < i2) + return (1); + if (i1 > i2) + return (-1); + if (j1 < j2) + return (1); + if (j1 > j2) + return (-1); + return 0; +} + +int compareedge_angle (const void *a, const void *b){ + Edge *q, *w; + + q = (Edge *) a; + w = (Edge *) b; + if (q->a >= w->a) + return (1); + return (-1); +} + +void EdgesContainer::AddEdges (Simplex * s, bool EdgesInVolume){ + int N, i, j; + Edge E, *pE; + int edges[6][2]; + + if (s->V[3] && EdgesInVolume){ + N = 6; + for (i = 0; i < N; i++) + for (j = 0; j < 2; j++) + edges[i][j] = edges_tetra[i][j]; + } + else if (s->V[3]){ + N = 4; + for (i = 0; i < N; i++) + for (j = 0; j < 2; j++) + edges[i][j] = edges_quad[i][j]; + } + else if (s->V[2]){ + N = 3; + for (i = 0; i < N; i++) + for (j = 0; j < 2; j++) + edges[i][j] = edges_tetra[i][j]; + } + else{ + N = 1; + for (i = 0; i < N; i++) + for (j = 0; j < 2; j++) + edges[i][j] = edges_tetra[i][j]; + } + + for (i = 0; i < N; i++){ + E.V[0] = s->V[edges[i][0]]; + E.V[1] = s->V[edges[i][1]]; + if ((pE = (Edge *) Tree_PQuery (AllEdges, &E))){ + List_Add (pE->Simplexes, &s); + if (N == 3) + pE->O[1] = s->V[edges_non[i]]; + } + else{ + E.Simplexes = List_Create (2, 1, sizeof (Simplex *)); + if (N == 3) + E.O[0] = s->V[edges_non[i]]; + if (N == 3) + E.O[1] = NULL; + List_Add (E.Simplexes, &s); + E.newv = NULL; + Tree_Replace (AllEdges, &E); + } + } +} + +EdgesContainer::EdgesContainer (Tree_T * Simplexes, bool EdgesInVolume){ + AllEdges = Tree_Create (sizeof (Edge), compareedge); + AddTree (Simplexes, EdgesInVolume); +} + +EdgesContainer::EdgesContainer (List_T * Surfaces){ + AllEdges = Tree_Create (sizeof (Edge), compareedge); + Surface *s; + for (int i = 0; i < List_Nbr (Surfaces); i++){ + List_Read (Surfaces, i, &s); + AddTree (s->Simplexes, false); + } +} + + +void EdgesContainer::AddTree (Tree_T * Simplexes, bool EdgesInVolume){ + Simplex *s; + List_T *temp = Tree2List (Simplexes); + for (int i = 0; i < List_Nbr (temp); i++){ + List_Read (temp, i, &s); + AddEdges (s, EdgesInVolume); + } + List_Delete (temp); +} + +EdgesContainer::~EdgesContainer (){ + Tree_Delete (AllEdges); +} +bool EdgesContainer::Search (Vertex * v1, Vertex * v2){ + Edge E; + E.V[0] = v1; + E.V[1] = v2; + if (!Tree_Search (AllEdges, &E)) + return false; + return true; +} + +void EdgesContainer::SwapEdge (Vertex * V[2]){ + Edge *e, E; + Simplex *s, *s1, *s2; + int i, j; + Vertex *p[2], *q[2]; + + E.V[0] = V[0]; + E.V[1] = V[1]; + e = (Edge *) Tree_PQuery (AllEdges, &E); + E = *e; + if (!e) + return; + List_Read (e->Simplexes, 0, &s1); + List_Read (e->Simplexes, 1, &s2); + + for (i = 0; i < 3; i++){ + if (s1->S[i] == s2){ + s1->ExtractOppositeEdges (i, p, q); + if (!s1->SwapEdge (i)) + return; + Tree_Suppress (AllEdges, &E); + E.V[0] = q[0]; + E.V[1] = q[1]; + Tree_Add (AllEdges, &E); + + E.V[0] = q[0]; + E.V[1] = p[0]; + e = (Edge *) Tree_PQuery (AllEdges, &E); + for (j = 0; j < 2; j++){ + List_Read (e->Simplexes, j, &s); + if (s == s2) + List_Write (e->Simplexes, j, &s1); + } + + E.V[0] = q[1]; + E.V[1] = p[1]; + e = (Edge *) Tree_PQuery (AllEdges, &E); + for (j = 0; j < 2; j++){ + List_Read (e->Simplexes, j, &s); + if (s == s1) + List_Write (e->Simplexes, j, &s2); + } + V[0] = q[0]; + V[1] = q[1]; + } + } +} diff --git a/Mesh/Edge.h b/Mesh/Edge.h new file mode 100644 index 0000000000000000000000000000000000000000..d856e4ae8762dd27f1484645f9a5b150ca3ec3c1 --- /dev/null +++ b/Mesh/Edge.h @@ -0,0 +1,35 @@ +#ifndef _EDGE_H_ +#define _EDGE_H_ + +#include "List.h" +#include "Tree.h" +#include "Vertex.h" +#include "Simplex.h" + +class Edge { +public : + Vertex *V[2]; + List_T *Simplexes; + Vertex *newv; + Vertex *O[2]; + double a; + List_T *Liste; +}; + +class EdgesContainer{ +public : + Tree_T * AllEdges; + EdgesContainer (Tree_T *Simplexes, bool i = false); + EdgesContainer (List_T *Surfaces); + ~EdgesContainer(); + void AddTree (Tree_T *Simplexes, bool EdgesInVolume); + void AddEdges(Simplex *s, bool i); + void RemoveEdge(Edge *e); + void SwapEdge (Vertex *v[2]); + bool Search(Vertex *v1, Vertex *v2); +}; + +int compareedge (const void *a, const void *b); +int compareedge_angle (const void *a, const void *b); + +#endif diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9bdaeed63a23c1db19c7c1b275075f6d1c2f2d3f --- /dev/null +++ b/Mesh/Generator.cpp @@ -0,0 +1,220 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "Create.h" +#include "Context.h" +#include "Main.h" + +extern Mesh *THEM; +extern Context_T CTX; +extern int TYPBGMESH,LocalNewPoint; +extern int Alerte_Point_Exterieur; +extern int CurrentNodeNumber, CurrentSimplexNumber; + +static List_T *Curves; + +void GetStatistics (double s[50]){ + int i; + THEM->Statistics[0] = Tree_Nbr (THEM->Points); + THEM->Statistics[1] = Tree_Nbr (THEM->Curves); + THEM->Statistics[2] = Tree_Nbr (THEM->Surfaces); + THEM->Statistics[3] = Tree_Nbr (THEM->Volumes); + for (i = 0; i < 50; i++) + s[i] = THEM->Statistics[i]; +} + +void Maillage_Dimension_0 (Mesh * M){ + for (int i = 0; i < 20; i++) + M->Statistics[i] = 0.0; + Create_BgMesh (TYPBGMESH, .2, M); +} + +void Maillage_Dimension_1 (Mesh * M){ + double t1, t2; + t1 = Cpu(); + Tree_Action (M->Curves, Maillage_Curve); + t2 = Cpu(); + M->Statistics[12] = t2 - t1; +} + +void Maillage_Dimension_2 (Mesh * M){ + int i; + Curve *c, *neew, C; + double t1, t2; + + t1 = Cpu(); + + /* maillage 1-D inverses */ + + Curves = Tree2List (M->Curves); + for (i = 0; i < List_Nbr (Curves); i++){ + List_Read (Curves, i, &c); + if (c->Num > 0){ + neew = &C; + neew->Num = -c->Num; + Tree_Query (M->Curves, &neew); + neew->Vertices = List_Create (List_Nbr (c->Vertices), 1, sizeof (Vertex *)); + List_Invert (c->Vertices, neew->Vertices); + } + } + List_Delete (Curves); + + Tree_Action (M->Surfaces, Maillage_Surface); + + t2 = Cpu(); + + M->Statistics[13] = t2 - t1; +} + +void Maillage_Dimension_3 (Mesh * M){ + Volume *v; + double t1, t2; + Volume *vol; + + t1 = Cpu(); + + v = Create_Volume (99999, 99999, 99999); + + List_T *list = Tree2List (M->Volumes); + for (int i = 0; i < List_Nbr (list); i++){ + List_Read (list, i, &vol); + if ((!vol->Extrude || !vol->Extrude->mesh.ExtrudeMesh) && + (vol->Method != TRANSFINI)){ + for (int j = 0; j < List_Nbr (vol->Surfaces); j++){ + List_Replace (v->Surfaces, List_Pointer (vol->Surfaces, j), compareSurface); + } + } + } + List_Delete (list); + Tree_Insert (M->Volumes, &v); + Tree_Action (M->Volumes, Maillage_Volume); + + t2 = Cpu(); + + M->Statistics[14] = t2 - t1; +} + +void Init_Mesh (Mesh * M, int all){ + THEM = M; + + if (M->Vertices){ + //Tree_Action (M->Vertices, Free_Vertex); + Tree_Delete (M->Vertices); + } + if (M->VertexEdges){ + //Tree_Action (M->VertexEdges, Free_Vertex); + Tree_Delete (M->VertexEdges); + } + if (M->Simplexes){ + //Tree_Action (M->Simplexes, Free_Simplex); + Tree_Delete (M->Simplexes); + } + if (M->Points){ + //Tree_Action (M->Points, Free_Vertex); + Tree_Delete (M->Points); + } + if (M->Curves){ + //Tree_Action (M->Vertices, Free_Curve); + Tree_Delete (M->Curves); + } + if (M->SurfaceLoops){ + //Tree_Action (M->Vertices, Free_SurfaceLoop); + Tree_Delete (M->SurfaceLoops); + } + if (M->EdgeLoops){ + //Tree_Action (M->Vertices, Free_EdgeLoop); + Tree_Delete (M->EdgeLoops); + } + if (M->Surfaces){ + //Tree_Action (M->Vertices, Free_Surface); + Tree_Delete (M->Surfaces); + } + if (M->Volumes){ + //Tree_Action (M->Vertices, Free_Volume); + Tree_Delete (M->Volumes); + } + if (M->PhysicalGroups){ + //Tree_Action (M->Vertices, Free_PhysicalGroup); + List_Delete (M->PhysicalGroups); + } + if (M->Metric){ + Free (M->Metric); + } + + M->Vertices = Tree_Create (sizeof (Vertex *), compareVertex); + M->VertexEdges = Tree_Create (sizeof (Vertex *), compareVertex); + M->Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex); + M->Points = Tree_Create (sizeof (Vertex *), compareVertex); + M->Curves = Tree_Create (sizeof (Curve *), compareCurve); + M->SurfaceLoops = Tree_Create (sizeof (SurfaceLoop *), compareSurfaceLoop); + M->EdgeLoops = Tree_Create (sizeof (EdgeLoop *), compareEdgeLoop); + M->Surfaces = Tree_Create (sizeof (Surface *), compareSurface); + M->Volumes = Tree_Create (sizeof (Volume *), compareVolume); + M->PhysicalGroups = List_Create (5, 5, sizeof (PhysicalGroup *)); + M->Metric = new GMSHMetric; + M->BGM.bgm = NULL; + + /* Dirt */ + + LocalNewPoint = CENTER_CIRCCIRC; + Alerte_Point_Exterieur = 0; + CurrentNodeNumber = 1; + CurrentSimplexNumber = 0; + + M->MeshParams.DelaunayAlgorithm = CTX.mesh.algo ; + M->MeshParams.NbSmoothing = CTX.mesh.nb_smoothing ; + M->status = 0; +} + +void mai3d (Mesh * M, int Asked){ + double t1, t2; + int oldstatus; + + oldstatus = M->status; + + /* initialisations - Maillage 0-D */ + + if ((Asked > oldstatus && Asked >= 0 && oldstatus < 0) || + (Asked < oldstatus)){ + OpenProblem (TheFileName); + M->status = 0; + } + + /* Maillage 1-D */ + + if ((Asked > oldstatus && Asked > 0 && oldstatus < 1) || + (Asked < oldstatus && Asked > 0)){ + Msg (INFO, "Mesh 1D..."); + t1 = Cpu(); + Maillage_Dimension_1 (M); + t2 = Cpu(); + Msg (INFO, "Mesh 1D complete (%f s)", t2 - t1); + M->status = 1; + } + + /* Maillage 2-D */ + + if ((Asked > oldstatus && Asked > 1 && oldstatus < 2) || + (Asked < oldstatus && Asked > 1)){ + Msg (INFO, "Mesh 2D..."); + t1 = Cpu(); + Maillage_Dimension_2 (M); + t2 = Cpu(); + Msg (INFO, "Mesh 2D complete (%f s)", t2 - t1); + M->status = 2; + } + + /* Maillage 3-D */ + + if ((Asked > oldstatus && Asked > 2 && oldstatus < 3) || + (Asked < oldstatus && Asked > 2)){ + Msg (INFO, "Mesh 3D..."); + t1 = Cpu(); + Maillage_Dimension_3 (M); + t2 = Cpu(); + Msg (INFO, "Mesh 3D complete (%f s)", t2 - t1); + M->status = 3; + } + +} diff --git a/Mesh/Interpolation.cpp b/Mesh/Interpolation.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e67919e3ba08a9c16548c4e3a84cf476b405aa9c --- /dev/null +++ b/Mesh/Interpolation.cpp @@ -0,0 +1,555 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "Mesh.h" +#include "Numeric.h" +#include "Interpolation.h" + +/* ------------------------------------------------------------------------ */ +/* I n t e r p o l a t e C u r v e */ +/* ------------------------------------------------------------------------ */ + +extern Mesh *THEM; + +Vertex InterpolateCurve (Curve * Curve, double u, int derivee){ + + int N, i, j; + Vertex D[2], V; + Vertex *v[5]; + double eps = 1.e-3, T[4], W, teta, t1, t2, t; + double vec[4]; + Vertex temp1, temp2; + + V.u = u; + + if (derivee){ + D[0] = InterpolateCurve (Curve, u, 0); + D[1] = InterpolateCurve (Curve, u + eps, 0); + V.Pos.X = (D[1].Pos.X - D[0].Pos.X) / eps; + V.Pos.Y = (D[1].Pos.Y - D[0].Pos.Y) / eps; + V.Pos.Z = (D[1].Pos.Z - D[0].Pos.Z) / eps; + return V; + } + + switch (Curve->Typ){ + + case MSH_SEGM_LINE: + + N = List_Nbr (Curve->Control_Points); + i = (int) ((double) (N - 1) * u); + while (i >= N - 1) + i--; + while (i < 0) + i++; + t1 = (double) (i) / (double) (N - 1); + t2 = (double) (i + 1) / (double) (N - 1); + t = (u - t1) / (t2 - t1); + List_Read (Curve->Control_Points, i, &v[1]); + List_Read (Curve->Control_Points, i + 1, &v[2]); + + V.lc = t * v[2]->lc + (1. - t) * v[1]->lc; + V.Pos.X = v[1]->Pos.X + t * (v[2]->Pos.X - v[1]->Pos.X); + V.Pos.Y = v[1]->Pos.Y + t * (v[2]->Pos.Y - v[1]->Pos.Y); + V.Pos.Z = v[1]->Pos.Z + t * (v[2]->Pos.Z - v[1]->Pos.Z); + V.w = v[1]->w + t * (v[2]->w - v[1]->w); + return V; + + case MSH_SEGM_PARAMETRIC: + V.Pos.X = evaluate_scalarfunction ("t", u, Curve->functu); + V.Pos.Y = evaluate_scalarfunction ("t", u, Curve->functv); + V.Pos.Z = evaluate_scalarfunction ("t", u, Curve->functw); + V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc); + V.w = (u * Curve->beg->w + (1. - u) * Curve->end->w); + return V; + + case MSH_SEGM_CIRC: + case MSH_SEGM_CIRC_INV: + case MSH_SEGM_ELLI: + case MSH_SEGM_ELLI_INV: + + if (Curve->Typ == MSH_SEGM_CIRC_INV || + Curve->Typ == MSH_SEGM_ELLI_INV){ + V.u = 1. - u; + u = V.u; + } + + teta = Curve->Circle.t1 - (Curve->Circle.t1 - Curve->Circle.t2) * u; + /* pour les ellipses */ + teta -= Curve->Circle.incl; + + V.Pos.X = Curve->Circle.f1 * cos (teta) * cos (Curve->Circle.incl) - + Curve->Circle.f2 * sin (teta) * sin (Curve->Circle.incl); + V.Pos.Y = Curve->Circle.f1 * cos (teta) * sin (Curve->Circle.incl) + + Curve->Circle.f2 * sin (teta) * cos (Curve->Circle.incl); + + V.Pos.Z = 0.0; + V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc); + Projette (&V, Curve->Circle.invmat); + V.Pos.X += Curve->Circle.v[2]->Pos.X; + V.Pos.Y += Curve->Circle.v[2]->Pos.Y; + V.Pos.Z += Curve->Circle.v[2]->Pos.Z; + V.w = (u * Curve->beg->w + (1. - u) * Curve->end->w); + V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc); + return V; + + case MSH_SEGM_BSPLN: + case MSH_SEGM_BEZIER: + V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc); + return InterpolateUBS (Curve, u, derivee); + + case MSH_SEGM_NURBS: + V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc); + return InterpolateNurbs (Curve, u, derivee); + + case MSH_SEGM_SPLN: + V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc); + N = List_Nbr (Curve->Control_Points); + + /* + 0 i P i+1 N-1 + vfirst*---------*---------*----X-----*----------*----------* vlast + 0 t1 absc t2 1 + 0 t 1 + + Splines uniformes -> Le point se trouve entre v[1] et v[2] + -> Calcul de l'abcisse curviligne locale t ( entre 0 et 1 ) + + 0 -> t1 + 1 -> t2 + u -> t + + Splines Lineiques -> Multilines + */ + + i = (int) ((double) (N - 1) * u); + if (i >= N - 1) + i = N - 2; + + t1 = (double) (i) / (double) (N - 1); + t2 = (double) (i + 1) / (double) (N - 1); + + t = (u - t1) / (t2 - t1); + + List_Read (Curve->Control_Points, i, &v[1]); + List_Read (Curve->Control_Points, i + 1, &v[2]); + + V.lc = t * v[1]->lc + (1. - t) * v[2]->lc; + + if (!i){ + v[0] = &temp1; + v[0]->Pos.X = 2. * v[1]->Pos.X - v[2]->Pos.X; + v[0]->Pos.Y = 2. * v[1]->Pos.Y - v[2]->Pos.Y; + v[0]->Pos.Z = 2. * v[1]->Pos.Z - v[2]->Pos.Z; + } + else{ + List_Read (Curve->Control_Points, i - 1, &v[0]); + } + + if (i == N - 2){ + v[3] = &temp2; + v[3]->Pos.X = 2. * v[2]->Pos.X - v[1]->Pos.X; + v[3]->Pos.Y = 2. * v[2]->Pos.Y - v[1]->Pos.Y; + v[3]->Pos.Z = 2. * v[2]->Pos.Z - v[1]->Pos.Z; + } + else{ + List_Read (Curve->Control_Points, i + 2, &v[3]); + } + + if (derivee){ + T[3] = 0.; + T[2] = 1.; + T[1] = 2. * t; + T[0] = 3. * t * t; + } + else{ + T[3] = 1.; + T[2] = t; + T[1] = t * t; + T[0] = t * t * t; + } + + V.Pos.X = V.Pos.Y = V.Pos.Z = W = 0.0; + for (i = 0; i < 4; i++){ + vec[i] = 0.0; + } + + /* X */ + for (i = 0; i < 4; i++){ + for (j = 0; j < 4; j++){ + vec[i] += Curve->mat[i][j] * v[j]->Pos.X; + } + } + + for (j = 0; j < 4; j++){ + V.Pos.X += T[j] * vec[j]; + vec[j] = 0.0; + } + + /* Y */ + for (i = 0; i < 4; i++){ + for (j = 0; j < 4; j++){ + vec[i] += Curve->mat[i][j] * v[j]->Pos.Y; + } + } + + for (j = 0; j < 4; j++){ + V.Pos.Y += T[j] * vec[j]; + vec[j] = 0.0; + } + + /* Z */ + for (i = 0; i < 4; i++){ + for (j = 0; j < 4; j++){ + vec[i] += Curve->mat[i][j] * v[j]->Pos.Z; + } + } + for (j = 0; j < 4; j++){ + V.Pos.Z += T[j] * vec[j]; + vec[j] = 0.0; + } + + /* W */ + for (i = 0; i < 4; i++){ + for (j = 0; j < 4; j++){ + vec[i] += Curve->mat[i][j] * v[j]->lc; + } + } + for (j = 0; j < 4; j++){ + W += T[j] * vec[j]; + } + + if (derivee){ + V.Pos.X /= ((t2 - t1)); + V.Pos.Y /= ((t2 - t1)); + V.Pos.Z /= ((t2 - t1)); + } + else{ + // V.Pos.X /= ((W)); + // V.Pos.Y /= ((W)); + // V.Pos.Z /= ((W)); + } + return V; + + default : + Msg(ERROR, "Unknown Curve Type in Interpolation"); + return V; + } + +} + +/* ------------------------------------------------------------------------ */ +/* I n t e r p o l a t e S u r f a c e */ +/* ------------------------------------------------------------------------ */ + +/* Interpolation transfinie sur un quadrangle : + f(u,v) = (1-u)c4(v) + u c2(v) + (1-v)c1(u) + v c3(u) + - [ (1-u)(1-v)s1 + u(1-v)s2 + uv s3 + (1-u)v s4 ] */ + +#define TRAN_QUA(c1,c2,c3,c4,s1,s2,s3,s4,u,v) \ + (1.-u)*c4+u*c2+(1.-v)*c1+v*c3-((1.-u)*(1.-v)*s1+u*(1.-v)*s2+u*v*s3+(1.-u)*v*s4) + +Vertex TransfiniteQua (Vertex c1, Vertex c2, Vertex c3, Vertex c4, + Vertex s1, Vertex s2, Vertex s3, Vertex s4, + double u, double v){ + Vertex V; + + V.lc = TRAN_QUA (c1.lc, c2.lc, c3.lc, c4.lc, + s1.lc, s2.lc, s3.lc, s4.lc, u, v); + V.w = TRAN_QUA (c1.w, c2.w, c3.w, c4.w, + s1.w, s2.w, s3.w, s4.w, u, v); + V.Pos.X = TRAN_QUA (c1.Pos.X, c2.Pos.X, c3.Pos.X, c4.Pos.X, + s1.Pos.X, s2.Pos.X, s3.Pos.X, s4.Pos.X, u, v); + V.Pos.Y = TRAN_QUA (c1.Pos.Y, c2.Pos.Y, c3.Pos.Y, c4.Pos.Y, + s1.Pos.Y, s2.Pos.Y, s3.Pos.Y, s4.Pos.Y, u, v); + V.Pos.Z = TRAN_QUA (c1.Pos.Z, c2.Pos.Z, c3.Pos.Z, c4.Pos.Z, + s1.Pos.Z, s2.Pos.Z, s3.Pos.Z, s4.Pos.Z, u, v); + return (V); +} + +/* Interpolation transfinie sur un triangle : TRAN_QUA avec s1=s4=c4 + f(u,v) = u c2 (v) + (1-v) c1(u) + v c3(u) - u(1-v) s2 - uv s3 */ + +#define TRAN_TRI(c1,c2,c3,s1,s2,s3,u,v) u*c2+(1.-v)*c1+v*c3-(u*(1.-v)*s2+u*v*s3); + +Vertex TransfiniteTri (Vertex c1, Vertex c2, Vertex c3, + Vertex s1, Vertex s2, Vertex s3, + double u, double v){ + Vertex V; + + V.lc = TRAN_TRI (c1.lc, c2.lc, c3.lc, s1.lc, s2.lc, s3.lc, u, v); + V.w = TRAN_TRI (c1.w, c2.w, c3.w, s1.w, s2.w, s3.w, u, v); + V.Pos.X = TRAN_TRI (c1.Pos.X, c2.Pos.X, c3.Pos.X, + s1.Pos.X, s2.Pos.X, s3.Pos.X, u, v); + V.Pos.Y = TRAN_TRI (c1.Pos.Y, c2.Pos.Y, c3.Pos.Y, + s1.Pos.Y, s2.Pos.Y, s3.Pos.Y, u, v); + V.Pos.Z = TRAN_TRI (c1.Pos.Z, c2.Pos.Z, c3.Pos.Z, + s1.Pos.Z, s2.Pos.Z, s3.Pos.Z, u, v); + return (V); +} + +void TransfiniteSph (Vertex S, Vertex center, Vertex * T){ + double r, s, dirx, diry, dirz; + + r = sqrt (DSQR (S.Pos.X - center.Pos.X) + DSQR (S.Pos.Y - center.Pos.Y) + + DSQR (S.Pos.Z - center.Pos.Z)); + + s = sqrt (DSQR (T->Pos.X - center.Pos.X) + DSQR (T->Pos.Y - center.Pos.Y) + + DSQR (T->Pos.Z - center.Pos.Z)); + + dirx = (T->Pos.X - center.Pos.X) / s; + diry = (T->Pos.Y - center.Pos.Y) / s; + dirz = (T->Pos.Z - center.Pos.Z) / s; + + T->Pos.X = center.Pos.X + r * dirx; + T->Pos.Y = center.Pos.Y + r * diry; + T->Pos.Z = center.Pos.Z + r * dirz; +} + +Vertex InterpolateSurface (Surface * s, double u, double v, + int derivee, int u_v){ + Vertex *c1, *c2, T, D[4], V[4], *S[4]; + Curve *C[4]; + int i, issphere; + double eps = 1.e-6; + + if (derivee){ + if (u_v == 1){ + if (u - eps < 0.0){ + D[0] = InterpolateSurface (s, u, v, 0, 0); + D[1] = InterpolateSurface (s, u + eps, v, 0, 0); + } + else{ + D[0] = InterpolateSurface (s, u - eps, v, 0, 0); + D[1] = InterpolateSurface (s, u, v, 0, 0); + } + } + else if (u_v == 2){ + if (v - eps < 0.0){ + D[0] = InterpolateSurface (s, u, v, 0, 0); + D[1] = InterpolateSurface (s, u, v + eps, 0, 0); + } + else{ + D[0] = InterpolateSurface (s, u, v - eps, 0, 0); + D[1] = InterpolateSurface (s, u, v, 0, 0); + } + } + else{ + Msg(WARNING, "Arbitrary InterpolateSurface for Derivative not Done"); + /* + double epsc = eps * cos (t); + double epss = eps * sin (t); + if (v - epss < 0.0 && u - epsc < 0.0){ + D[0] = InterpolateSurface (s, u, v, 0, 0); + D[1] = InterpolateSurface (s, u + epsc, v + epss, 0, 0); + } + else if (v - epss < 0.0){ + D[0] = InterpolateSurface (s, u - epsc, v, 0, 0); + D[1] = InterpolateSurface (s, u, v + epss, 0, 0); + } + else if (u - epsc < 0.0){ + D[0] = InterpolateSurface (s, u, v - epss, 0, 0); + D[1] = InterpolateSurface (s, u + epsc, v, 0, 0); + } + else{ + D[0] = InterpolateSurface (s, u - epsc, v - epss, 0, 0); + D[1] = InterpolateSurface (s, u, v, 0, 0); + } + */ + } + T.Pos.X = (D[1].Pos.X - D[0].Pos.X) / eps; + T.Pos.Y = (D[1].Pos.Y - D[0].Pos.Y) / eps; + T.Pos.Z = (D[1].Pos.Z - D[0].Pos.Z) / eps; + return T; + } + + Vertex x (u, v, .0); + Vertex *xx = &x, *dum; + + if (s->Extrude && s->Extrude->geo.Mode == EXTRUDED_ENTITY && + s->Typ != MSH_SURF_PLAN){ + Curve *c = FindCurve (s->Extrude->geo.Source, THEM); + Vertex v1 = InterpolateCurve (c, u, 0); + s->Extrude->Extrude (v, v1.Pos.X, v1.Pos.Y, v1.Pos.Z); + return v1; + } + + switch (s->Typ){ + + case MSH_SURF_PLAN: + + Calcule_Z_Plan (&xx, &dum); + //Projette_Inverse(&xx, &dum); + return x; + + case MSH_SURF_REGL: + issphere = 1; + for (i = 0; i < 4; i++){ + List_Read (s->s.Generatrices, i, &C[i]); + if (C[i]->Typ != MSH_SEGM_CIRC && C[i]->Typ != MSH_SEGM_CIRC_INV){ + issphere = 0; + } + else if (issphere){ + if (!i){ + List_Read (C[i]->Control_Points, 1, &c1); + } + else{ + List_Read (C[i]->Control_Points, 1, &c2); + if (compareVertex (&c1, &c2)) + issphere = 0; + } + } + } + + S[0] = C[0]->beg; + S[1] = C[1]->beg; + S[2] = C[2]->beg; + S[3] = C[3]->beg; + + /* + List_Read(C[0]->Control_Points, 0, &S[0]); + List_Read(C[1]->Control_Points, 0, &S[1]); + List_Read(C[2]->Control_Points, 0, &S[2]); + List_Read(C[3]->Control_Points, 0, &S[3]); + */ + + V[0] = InterpolateCurve (C[0], C[0]->ubeg + (C[0]->uend - C[0]->ubeg) * u, 0); + V[1] = InterpolateCurve (C[1], C[1]->ubeg + (C[1]->uend - C[1]->ubeg) * v, 0); + V[2] = InterpolateCurve (C[2], C[2]->ubeg + (C[2]->uend - C[2]->ubeg) * (1. - u), 0); + V[3] = InterpolateCurve (C[3], C[3]->ubeg + (C[3]->uend - C[3]->ubeg) * (1. - v), 0); + + T = TransfiniteQua (V[0], V[1], V[2], V[3], *S[0], *S[1], *S[2], *S[3], u, v); + if (issphere) TransfiniteSph (*S[0], *c1, &T); + + return (T); + + case MSH_SURF_NURBS: + return InterpolateNurbsSurface (s, u, v); + + case MSH_SURF_TRIC: + issphere = 1; + for (i = 0; i < 3; i++){ + List_Read (s->s.Generatrices, i, &C[i]); + if (C[i]->Typ != MSH_SEGM_CIRC && C[i]->Typ != MSH_SEGM_CIRC_INV){ + issphere = 0; + } + else if (issphere){ + if (!i){ + List_Read (C[i]->Control_Points, 1, &c1); + } + else{ + List_Read (C[i]->Control_Points, 1, &c2); + if (compareVertex (&c1, &c2)) + issphere = 0; + } + } + } + + List_Read (C[0]->Control_Points, 0, &S[0]); + List_Read (C[1]->Control_Points, 0, &S[1]); + List_Read (C[2]->Control_Points, 0, &S[2]); + + V[0] = InterpolateCurve (C[0], u, 0); + V[1] = InterpolateCurve (C[1], v, 0); + V[2] = InterpolateCurve (C[2], 1. - u, 0); + + T = TransfiniteTri (V[0], V[1], V[2], *S[0], *S[1], *S[2], u, v); + if (issphere) TransfiniteSph (*S[0], *c1, &T); + + return (T); + + default : + Msg(ERROR, "Unknown Surface Type in Interpolation"); + return T; + } + +} + + +/* ------------------------------------------------------------------------ */ +/* I n t e r p o l a t e V o l u m e */ +/* ------------------------------------------------------------------------ */ + +/* Interpolation transfinie sur un hexaedre + prisme (avec s1=s4=a4, s5=s8=a8, a9=a12=f4) + f(u,v) = (1-u) f4(v,w) + u f2(v,w) + + (1-v) f1(u,w) + v f3(u,w) + + (1-w) f5(u,v) + w f6(u,v) + - [ (1-u)(1-v) c9(w) + (1-u)v c12(w) + u(1-v) c10(w) + uv c11(w) ] + - [ (1-v)(1-w) c1(u) + (1-v)w c5(u) + v(1-w) c3(u) + vw c7(u) ] + - [ (1-u)(1-w) c4(v) + (1-w)u c2(v) + w(1-u) c8(v) + uw c6(v) ] + + [ (1-u)(1-v)(1-w) s1 + u(1-v)(1-w) s2 + uv(1-w) s3 + (1-u)v(1-w) s4 + + (1-u)(1-v)w s5 + u(1-v)w s6 + uvw s7 + (1-u)vw s8 ] + */ + +#define TRAN_HEX(f1,f2,f3,f4,f5,f6,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,s1,s2,s3,s4,s5,s6,s7,s8,u,v,w) (1-u)*f4+u*f2+(1-v)*f1+v*f3+(1-w)*f5+w*f6-((1-u)*(1-v)*c9+(1-u)*v*c12+u*(1-v)*c10+u*v*c11)-((1-v)*(1-w)*c1+(1-v)*w*c5+v*(1-w)*c3+v*w*c7)-((1-u)*(1-w)*c4+(1-w)*u*c2+w*(1-u)*c8+u*w*c6)+(1-u)*(1-v)*(1-w)*s1+u*(1-v)*(1-w)*s2+u*v*(1-w)*s3+(1-u)*v*(1-w)*s4+(1-u)*(1-v)*w*s5+u*(1-v)*w*s6+u*v*w*s7+(1-u)*v*w*s8 + +Vertex +TransfiniteHex (Vertex f1, Vertex f2, Vertex f3, Vertex f4, Vertex f5, Vertex f6, + Vertex c1, Vertex c2, Vertex c3, Vertex c4, Vertex c5, Vertex c6, + Vertex c7, Vertex c8, Vertex c9, Vertex c10, Vertex c11, Vertex c12, + Vertex s1, Vertex s2, Vertex s3, Vertex s4, + Vertex s5, Vertex s6, Vertex s7, Vertex s8, + double u, double v, double w) +{ + Vertex V; + + V.lc = TRAN_HEX (f1.lc, f2.lc, f3.lc, f4.lc, f5.lc, f6.lc, + c1.lc, c2.lc, c3.lc, c4.lc, c5.lc, c6.lc, + c7.lc, c8.lc, c9.lc, c10.lc, c11.lc, c12.lc, + s1.lc, s2.lc, s3.lc, s4.lc, s5.lc, s6.lc, s7.lc, s8.lc, + u, v, w); + + V.Pos.X = TRAN_HEX (f1.Pos.X, f2.Pos.X, f3.Pos.X, f4.Pos.X, f5.Pos.X, f6.Pos.X, + c1.Pos.X, c2.Pos.X, c3.Pos.X, c4.Pos.X, c5.Pos.X, c6.Pos.X, + c7.Pos.X, c8.Pos.X, c9.Pos.X, c10.Pos.X, c11.Pos.X, c12.Pos.X, + s1.Pos.X, s2.Pos.X, s3.Pos.X, s4.Pos.X, s5.Pos.X, s6.Pos.X, s7.Pos.X, s8.Pos.X, + u, v, w); + + V.Pos.Y = TRAN_HEX (f1.Pos.Y, f2.Pos.Y, f3.Pos.Y, f4.Pos.Y, f5.Pos.Y, f6.Pos.Y, + c1.Pos.Y, c2.Pos.Y, c3.Pos.Y, c4.Pos.Y, c5.Pos.Y, c6.Pos.Y, + c7.Pos.Y, c8.Pos.Y, c9.Pos.Y, c10.Pos.Y, c11.Pos.Y, c12.Pos.Y, + s1.Pos.Y, s2.Pos.Y, s3.Pos.Y, s4.Pos.Y, s5.Pos.Y, s6.Pos.Y, s7.Pos.Y, s8.Pos.Y, + u, v, w); + + V.Pos.Z = TRAN_HEX (f1.Pos.Z, f2.Pos.Z, f3.Pos.Z, f4.Pos.Z, f5.Pos.Z, f6.Pos.Z, + c1.Pos.Z, c2.Pos.Z, c3.Pos.Z, c4.Pos.Z, c5.Pos.Z, c6.Pos.Z, + c7.Pos.Z, c8.Pos.Z, c9.Pos.Z, c10.Pos.Z, c11.Pos.Z, c12.Pos.Z, + s1.Pos.Z, s2.Pos.Z, s3.Pos.Z, s4.Pos.Z, s5.Pos.Z, s6.Pos.Z, s7.Pos.Z, s8.Pos.Z, + u, v, w); + + return (V); +} + +void Normal2Surface (Surface * s, double u, double v, double n[3]){ + Vertex du, dv; + double t1[3], t2[3]; + du = InterpolateSurface (s, u, v, 1, 1); + dv = InterpolateSurface (s, u, v, 1, 2); + t1[0] = du.Pos.X; + t1[1] = du.Pos.Y; + t1[2] = du.Pos.Z; + t2[0] = dv.Pos.X; + t2[1] = dv.Pos.Y; + t2[2] = dv.Pos.Z; + prodve (t1, t2, n); + norme (n); +} + +void +HessianNormal2Surface (Surface * s, double u, double v, double n[3]) +{ + Vertex du, dv; + double t1[3], t2[3]; + du = InterpolateSurface (s, u, v, 1, 1); + dv = InterpolateSurface (s, u, v, 1, 2); + t1[0] = du.Pos.X; + t1[1] = du.Pos.Y; + t1[2] = du.Pos.Z; + t2[0] = dv.Pos.X; + t2[1] = dv.Pos.Y; + t2[2] = dv.Pos.Z; + prodve (t1, t2, n); + norme (n); +} diff --git a/Mesh/Interpolation.h b/Mesh/Interpolation.h new file mode 100644 index 0000000000000000000000000000000000000000..decb09a165696a585d11c9d564ebf28df4d0e58d --- /dev/null +++ b/Mesh/Interpolation.h @@ -0,0 +1,39 @@ +#ifndef _INTERPOLATION_H_ +#define _INTERPOLATION_H_ + +Vertex InterpolateCurve (Curve * Curve, double u, int derivee); + +Vertex InterpolateSurface (Surface * s, double u, double v, + int derivee, int u_v); + +Vertex TransfiniteQua (Vertex c1, Vertex c2, Vertex c3, Vertex c4, + Vertex s1, Vertex s2, Vertex s3, Vertex s4, + double u, double v); + +Vertex TransfiniteTri (Vertex c1, Vertex c2, Vertex c3, + Vertex s1, Vertex s2, Vertex s3, + double u, double v); + +Vertex TransfiniteHex + (Vertex f1, Vertex f2, Vertex f3, Vertex f4, Vertex f5, Vertex f6, + Vertex c1, Vertex c2, Vertex c3, Vertex c4, Vertex c5, Vertex c6, + Vertex c7, Vertex c8, Vertex c9, Vertex c10, Vertex c11, Vertex c12, + Vertex s1, Vertex s2, Vertex s3, Vertex s4, + Vertex s5, Vertex s6, Vertex s7, Vertex s8, + double u, double v, double w); + +void TransfiniteSph (Vertex S, Vertex center, Vertex * T); + +void Normal2Surface (Surface * s, double u, double v, double n[3]); + +Vertex InterpolateCubicSpline (Vertex * v[4], double t, double mat[4][4], + int derivee, double t1, double t2); +Vertex InterpolateUBS (Curve * Curve, double u, int derivee); + +Vertex InterpolateNurbs (Curve * Curve, double u, int derivee); + +Vertex InterpolateNurbsSurface (Surface * s, double u, double v); + +#endif + + diff --git a/Mesh/Makefile b/Mesh/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..666d53a16bdb961d172640053abbd40a7c7c04d6 --- /dev/null +++ b/Mesh/Makefile @@ -0,0 +1,272 @@ +# +# Makefile for "libMesh.a" +# + +.IGNORE: + +CC = c++ +C_FLAGS = -g -Wall + +OS_FLAGS = -D_UNIX + +RM = rm +RMFLAGS = -f +RANLIB = /usr/bin/ranlib + +LIB = ../lib/libMesh.a +INCLUDE = -I../Adapt -I../Common -I../DataStr -I../Geo -I../Mesh\ + -I../Graphics -I../Unix + +CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE) + +SRC = 1D_Mesh.cpp \ + 2D_Mesh.cpp \ + 2D_SMesh.cpp \ + 2D_Elliptic.cpp \ + 2D_BGMesh.cpp \ + 2D_Recombine.cpp \ + 2D_InitMesh.cpp \ + 2D_Bowyer.cpp \ + 2D_Bricks.cpp \ + 2D_DivAndConq.cpp \ + 2D_Util.cpp \ + 2D_Links.cpp \ + 2D_Tree.cpp \ + 2D_Cylindrical.cpp \ + 2D_Parametric.cpp \ + 2D_Mesh_Aniso.cpp \ + 3D_Mesh.cpp \ + 3D_SMesh.cpp \ + 3D_BGMesh.cpp \ + 3D_Extrude.cpp \ + 3D_Coherence.cpp \ + 3D_Divide.cpp \ + 3D_Bricks.cpp \ + MeshQuality.cpp \ + Create.cpp \ + Generator.cpp \ + Print_Mesh.cpp \ + Read_Mesh.cpp \ + STL.cpp \ + SwapEdge.cpp \ + Numeric.cpp \ + Metric.cpp \ + Nurbs.cpp \ + Interpolation.cpp \ + SecondOrder.cpp \ + Smoothing.cpp \ + CrossData.cpp \ + Vertex.cpp \ + Edge.cpp \ + Simplex.cpp + +OBJ = $(SRC:.cpp=.o) + +.SUFFIXES: .o .cpp + +$(LIB): $(OBJ) + ar rvs $(LIB) $(OBJ) + $(RANLIB) $(LIB) + +.cpp.o: + $(CC) $(CFLAGS) -c $< + +clean: + $(RM) $(RMFLAGS) *.o + +lint: + $(LINT) $(CFLAGS) $(SRC) + +depend: + (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ + $(CC) -MM $(CFLAGS) ${SRC} \ + ) >Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) $(RMFLAGS) Makefile.new + +# DO NOT DELETE THIS LINE +1D_Mesh.o: 1D_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + Mesh.h Vertex.h Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h \ + ../Common/Context.h Interpolation.h Numeric.h +2D_Mesh.o: 2D_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Create.h \ + 2D_Mesh.h Numeric.h ../Common/Context.h +2D_SMesh.o: 2D_SMesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h Numeric.h \ + Interpolation.h +2D_Elliptic.o: 2D_Elliptic.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h +2D_BGMesh.o: 2D_BGMesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h +2D_Recombine.o: 2D_Recombine.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h Create.h \ + Numeric.h +2D_InitMesh.o: 2D_InitMesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h Numeric.h +2D_Bowyer.o: 2D_Bowyer.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h +2D_Bricks.o: 2D_Bricks.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h +2D_DivAndConq.o: 2D_DivAndConq.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h +2D_Util.o: 2D_Util.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h +2D_Links.o: 2D_Links.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h +2D_Tree.o: 2D_Tree.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Simplex.h Edge.h \ + ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h +2D_Cylindrical.o: 2D_Cylindrical.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h ../Common/Context.h \ + Numeric.h +2D_Parametric.o: 2D_Parametric.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Interpolation.h \ + Mesh.h 2D_Mesh.h Create.h ../Common/Context.h Numeric.h +2D_Mesh_Aniso.o: 2D_Mesh_Aniso.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h \ + Interpolation.h Create.h ../Common/Context.h Numeric.h +3D_Mesh.o: 3D_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 3D_Mesh.h Create.h \ + Numeric.h ../Common/Context.h +3D_SMesh.o: 3D_SMesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Simplex.h Edge.h \ + ../Geo/ExtrudeParams.h Metric.h Interpolation.h Create.h +3D_BGMesh.o: 3D_BGMesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Simplex.h Edge.h \ + ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h 3D_Mesh.h ../Adapt/Adapt.h \ + ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h Numeric.h +3D_Extrude.o: 3D_Extrude.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h \ + ../Common/Context.h Create.h +3D_Coherence.o: 3D_Coherence.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + Mesh.h Vertex.h Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h \ + 3D_Mesh.h Create.h Numeric.h +3D_Divide.o: 3D_Divide.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h +3D_Bricks.o: 3D_Bricks.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h +MeshQuality.o: MeshQuality.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h Numeric.h +Create.o: Create.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Numeric.h +Generator.o: Generator.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h Create.h \ + ../Common/Context.h ../Unix/Main.h +Print_Mesh.o: Print_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Create.h +Read_Mesh.o: Read_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h Create.h \ + ../Geo/MinMax.h +STL.o: STL.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + Mesh.h Vertex.h Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h +SwapEdge.o: SwapEdge.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h SwapPatterns.h +Numeric.o: Numeric.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Numeric.h \ + Interpolation.h ../Adapt/nrutil.h +Metric.o: Metric.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Matrix.h \ + Interpolation.h +Nurbs.o: Nurbs.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Simplex.h Edge.h \ + ../Geo/ExtrudeParams.h Metric.h +Interpolation.o: Interpolation.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Numeric.h \ + Interpolation.h +SecondOrder.o: SecondOrder.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h Interpolation.h \ + Numeric.h +Smoothing.o: Smoothing.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \ + Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h +CrossData.o: CrossData.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Simplex.h Edge.h \ + ../Geo/ExtrudeParams.h Metric.h +Vertex.o: Vertex.cpp Vertex.h ../DataStr/List.h +Edge.o: Edge.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + Mesh.h Vertex.h Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h \ + ../Common/Const.h +Simplex.o: Simplex.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \ + Mesh.h Vertex.h Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h \ + Numeric.h diff --git a/Mesh/Matrix.h b/Mesh/Matrix.h new file mode 100644 index 0000000000000000000000000000000000000000..1a820ba2c32cd486a0b88507b384707f74b60787 --- /dev/null +++ b/Mesh/Matrix.h @@ -0,0 +1,195 @@ +#ifndef _MATRIX_H_ +#define _MATRIX_H_ + +#define _TAILLE_ 2 + +template <class T> class Matrix2x2{ + T mat[_TAILLE_][_TAILLE_]; + T zero; + +public: + + Matrix2x2 (const T& init){ + zero = init; + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + mat[i][j] = zero; + } + + Matrix2x2 (const T& init, T z[3][3]){ + zero = init; + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + mat[i][j] = z[i][j]; + } + + Matrix2x2<T>& operator = (const Matrix2x2<T> &autre){ + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + mat[i][j] = autre.mat[i][j]; + return *this; + } + + Matrix2x2<T> operator + (const Matrix2x2<T> &autre){ + Matrix2x2<T> m(0.); + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + m.mat[i][j] = mat[i][j] + autre.mat[i][j]; + return m; + } + + Matrix2x2<T> operator - (const Matrix2x2<T> &autre){ + Matrix2x2<T> m(0.); + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + m.mat[i][j] = mat[i][j] - autre.mat[i][j]; + return m; + } + + T* operator [] (int i){ + return mat[i]; + } + + Matrix2x2 Identity(T id){ + for(int i=0;i<_TAILLE_;i++) + mat[i][i] = id; + } + + Matrix2x2 copy(T m[3][3]){ + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + m[i][j] = mat[i][j]; + } + + Matrix2x2 operator * (const Matrix2x2<T> &autre){ + Matrix2x2 m(0.); + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++){ + m.mat[i][j] = zero; + for(int k=0;k<_TAILLE_;k++) + m.mat[i][j] += mat[i][k] * autre.mat[k][j]; + } + return m; + } + + bool invert (){ + T det = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]; + if(det == zero)return false; + mat[0][0] = mat[1][1] / det; + mat[1][1] = mat[0][0] / det; + mat[1][0] = -mat[1][0] / det; + mat[0][1] = -mat[0][1] / det; + } + + void transpose(){ + T temp; + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++){ + if(i!=j){ + temp = mat[i][j]; + mat[i][j] = mat[j][i]; + mat[j][i] = temp; + } + } + } +}; + +#undef _TAILLE_ +#define _TAILLE_ 3 + +template <class T> class Matrix3x3{ + T mat[_TAILLE_][_TAILLE_]; + T zero; + +public: + + Matrix3x3 (const T& init){ + zero = init; + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + mat[i][j] = zero; + } + + Matrix3x3 (const T& init, T z[3][3]){ + zero = init; + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + mat[i][j] = z[i][j]; + } + + Matrix3x3<T>& operator = (const Matrix3x3<T> &autre){ + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + mat[i][j] = autre.mat[i][j]; + return *this; + } + + Matrix3x3<T> operator + (const Matrix3x3<T> &autre){ + Matrix3x3<T> m(0.); + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + m.mat[i][j] = mat[i][j] + autre.mat[i][j]; + return m; + } + + Matrix3x3<T> operator - (const Matrix3x3<T> &autre){ + Matrix2x2<T> m(0.); + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + m.mat[i][j] = mat[i][j] - autre.mat[i][j]; + return m; + } + + T* operator [] (int i){ + return mat[i]; + } + + void Identity(T id){ + for(int i=0;i<_TAILLE_;i++) + mat[i][i] = id; + } + + void copy(T m[3][3]){ + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++) + m[i][j] = mat[i][j]; + } + + Matrix3x3 operator * (const Matrix3x3<T> &autre){ + Matrix3x3 m(0.); + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<_TAILLE_;j++){ + m.mat[i][j] = zero; + for(int k=0;k<_TAILLE_;k++) + m.mat[i][j] += mat[i][k] * autre.mat[k][j]; + } + return m; + } + + /* + bool invert (){ + T det = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]; + if(det == zero)return false; + mat[0][0] = mat[1][1] / det; + mat[1][1] = mat[0][0] / det; + mat[1][0] = -mat[1][0] / det; + mat[0][1] = -mat[0][1] / det; + } + */ + + void transpose(){ + T temp; + for(int i=0;i<_TAILLE_;i++) + for(int j=0;j<i;j++){ + if(i!=j){ + temp = mat[i][j]; + mat[i][j] = mat[j][i]; + mat[j][i] = temp; + } + } + } +}; + +#undef _TAILLE_ + +#endif diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h new file mode 100644 index 0000000000000000000000000000000000000000..54dbc528e149f5ea5289e344f93e6e8f06228d54 --- /dev/null +++ b/Mesh/Mesh.h @@ -0,0 +1,482 @@ +#ifndef _MESH_H_ +#define _MESH_H_ + +#include "Vertex.h" +#include "Simplex.h" +#include "Edge.h" +#include "ExtrudeParams.h" + +#define FORMAT_MSH 1 +#define FORMAT_UNV 2 +#define FORMAT_GREF 3 + +#define CONV_VALUE 0.8 + +#define GREEN_INTERPOLATION 1 +#define FEM_INTERPOLATION 2 + +#define NOTTOLINK 1 +#define TOLINK 2 + +#define BOF 1 +#define A_TOUT_PRIX 2 + +#define LossMemory 1 +#define BadLink2 2 +#define DegTriangle 3 +#define PtExterior 4 + +#define CENTER_CIRCCIRC 1 +#define VORONOI_INSERT 2 +#define BARYCENTER 3 +#define SQUARE_TRI 4 + +#define EXTERN 1 +#define INTERN 2 +#define ACTIF 3 +#define WAITING 4 +#define ACCEPTED 5 +#define NONACCEPTED 6 + +#define NONE 0 +#define CONSTANT 1 +#define ONFILE 2 +#define WITHPOINTS 3 +#define FUNCTION 4 +#define LINEAR 5 +#define QUADRATIC 6 +#define CUBIC 7 +#define LOGARITHMIC 8 +#define EXPONENTIAL 9 + +#define DROITE 1 +#define SPLINE 2 + +#define TRANSFINI 1 +#define LIBRE 2 +#define ELLIPTIC 3 + +#define REMOVE 1 +#define ADD 2 + +#define BOULE 1 +#define BOITE 2 + +#define HYPOTENU 1 +#define SMALLFACE 2 + +typedef struct _POINT PointRecord, *PointPeek; +typedef struct _CONTOUR ContourRecord, *ContourPeek; +typedef struct _DOC DocRecord, *DocPeek; +typedef struct _CDLIST DListRecord, *DListPeek; +typedef struct _MAILLAGE maillage, *maipeek; +typedef struct _MAICON maillage_c; +typedef struct _DELAUNAY Delaunay, *delpeek; +typedef int PointNumero; + +struct _DOC{ + PointRecord *points; /* points a trianguler */ + List_T *hotpoints; /* hotpoints */ + int numPoints; /* nombre de points */ + int numTriangles; /* nombre de triangles */ + Delaunay *delaunay; /* resultats 2D */ +}; + +typedef struct{ + double v; + double h; +}MPoint; + +struct _POINT{ + MPoint where; + DListPeek adjacent; + int initial, permu, info, info2, numcontour; + double quality, qualityy, angle; +}; + +typedef struct{ + int Num; + double t, lc, p; +}IntPoint; + +struct _CDLIST{ + PointNumero point_num; /* numero du point */ + DListPeek next, prev; +}; + +typedef struct{ + PointNumero search; + PointNumero already; +}demi_triangle; + +typedef struct{ + demi_triangle *info; + PointNumero *t; + int t_length, info_length; +}Striangle; + +typedef struct { + PointNumero from; + PointNumero to; + int num; + int seg; +}edge; + +typedef struct{ + PointNumero begin; + PointNumero end; +}DT; + +typedef struct{ + PointNumero from; + PointNumero to; +}Segment; + +typedef struct{ + PointNumero a, b, c; + double xc, yc; + double quality_value; + int position, info, info2; +}Triangle; + +typedef struct { + Delaunay *voisin1, *voisin2, *voisin3; +}Voronoi; + +struct _DELAUNAY{ + Triangle t; + Voronoi v; +}; + +struct _CONTOUR{ + PointRecord *oriented_points; + MPoint *perturbations; + int numpoints, numerocontour, numerozon, info; +}; + +struct _MAICON{ + PointRecord *points; + int numpoints, numcontour, numeroseg; +}; + +struct _MAILLAGE{ + PointRecord *points; + delpeek *listdel; + edge *listedges; + int numedges, numtriangles, numpoints; + int IncrAllocPoints, IncrAllocTri, IncrAllocEdges; + int NumAllocPoints, NumAllocTri, NumAllocEdges; + int zone; +}; + +typedef struct{ + Vertex *v; + List_T *Liste; +}NXE; + +typedef struct{ + int Num; /* Numero */ + int iEnt; /* Entite geometrique */ + Vertex *V[8]; /* 8 noeuds */ + Vertex **VSUP; /* noeuds supplem pour les elts de degre eleves */ +}Hexahedron; + +typedef struct{ + int Num; /* Numero */ + int iEnt; /* Entite geometrique */ + Vertex *V[6]; /* 6 noeuds */ + Vertex **VSUP; /* noeuds supplem pour les elts de degre eleves */ +}Prism; + +typedef struct{ + int N; + List_T *pT; +}Brick; + +typedef struct{ + int init; + List_T *Bricks; + Coord min, max; + int Nx, Ny, Nz; +}Grid_T; + +typedef struct{ + double zaxis[3]; + double radius1; + double radius2; + double xaxis[3]; + double center[3]; +}CylParam; + +class STL_Data{ + public: + Tree_T * Vertices; + Tree_T *Simplexes; + List_T *LVertices; + List_T *LSimplexes; + void Add_Facet (double x1, double y1, double z1, + double x2, double y2, double z2, + double x3, double y3, double z3); + int GetNbFacets (){ + return Tree_Nbr (Simplexes); + } + int GetNbVertices (){ + return Tree_Nbr (Vertices); + } + void GetFacet (int iFac, int &v1, int &v2, int &v3); + void GetVertex (int iVertex, double &x, double &y, double &z); + STL_Data (); + ~STL_Data (); +}; + +struct _Surf{ + int Num; + int Typ; + int Mat; + int Method; + int Recombine; + double RecombineAngle; + int ipar[4]; + int Nu, Nv; + union{ + List_T *Generatrices; /* Surface reglee */ + }s; + List_T *Control_Points; /* Patchs bicubiques */ + double plan[3][3]; + double invplan[3][3]; + double a, b, c, d; + List_T *Orientations; + List_T *Contours; + Tree_T *Simplexes; + List_T *TrsfSimplexes; + Tree_T *Vertices; + List_T *TrsfVertices; + Tree_T *Edges; + int OrderU, OrderV; + float *ku, *kv, *cp; + struct _Surf *Support; + CylParam Cyl; + Grid_T Grid; /* Grille de recherches rapides */ + ExtrudeParams *Extrude; + STL_Data *STL; +}; +typedef struct _Surf Surface; + +typedef struct{ + int Num; + List_T *Curves; +}EdgeLoop; + +typedef struct{ + int Num; + List_T *Surfaces; +}SurfaceLoop; + +typedef struct{ + int Num; + int Typ; + List_T *Entities; +}PhysicalGroup; + +typedef struct{ + Face F; + Face Sorted; + Simplex *S[2]; + int N; +}FxE; + +typedef struct { + int Num; + int Mat; + int Typ; + int Method; + int ipar[8]; + ExtrudeParams *Extrude; + List_T *Surfaces; + Tree_T *Vertices; + Tree_T *Edges; + Tree_T *Faces; + Tree_T *Simplexes; + Tree_T *Hexahedra; + Tree_T *Prisms; +}Volume; + +typedef struct { + Edge e1, e2; + int iFac; +}exf_T; + +/* Structure intersection arete - Simplexe */ + +typedef struct{ + int NbIntersect; /* nombre total d'intersections */ + Edge *e; /* arete */ + Simplex *s; /* simplexe */ + Face *f; /* face */ + int NbVertex; /* nombre de noeuds du simplexe que coupe l'arete */ + Vertex *V[12]; /* noeuds du simplexe que coupe l'arete */ + int iV[12]; /* noeuds du simplexe que coupe l'arete */ + int NbEdge; /* nombre d'intersections arete-arete */ + int E[12]; /* aretes */ + Vertex *VE[12]; /* noeuds d'intersection */ + int NbFace; /* nombre d'intersections face-arete */ + Face *F[12]; /* faces */ + int iF[12]; /* faces */ + Vertex *VF[12]; /* position des points d'intersections face-arete */ +}Intersection; + +typedef struct _Mesh Mesh; + +typedef struct{ + int Typ; + double lc; + struct _Mesh *m; + List_T *bgm; +}LcField; + +typedef struct{ + int done; + double t1, t2, f1, f2, incl; + Vertex *v[4]; + double invmat[3][3]; + double n[3]; +}CircParam; + +typedef struct{ + int Num; + int Typ; + int Method; + int ipar[4]; + double dpar[4]; + double l; + double mat[4][4]; + Vertex *beg, *end; + double ubeg, uend; + List_T *Control_Points; + List_T *Knots; + List_T *Vertices; + List_T *ConnectedSurfaces; + Tree_T *Simplexes; + List_T *TrsfSimplexes; + ExtrudeParams *Extrude; + float *k, *cp; + int degre; + CircParam Circle; + char functu[256], functv[256], functw[256]; +}Curve; + +typedef struct{ + int Num; + int Typ; + Vertex *v; + Curve *c; + Surface *s; + double lc1, lc2; + double Radius; +}Attractor; + +#include "Metric.h" + +#define QUALITY_EDGES_BASED 1 +#define QUALITY_SIMPLEX_BASED 2 +#define INSERTION_CENTROID 1 +#define INSERTION_EDGE 2 +#define DELAUNAY_OLDALGO 1 +#define DELAUNAY_NEWALGO 2 +#define DELAUNAY_KERISO 1 +#define DELAUNAY_KERANISO 2 + +class MeshParameters{ + public: + int NbSmoothing; + int DelaunayAlgorithm; + int DelaunayInsertionMethod; + int DelaunayQuality; + int DelaunayKernel; + bool InteractiveDelaunay; + MeshParameters (); +}; + +struct _Mesh{ + char name[256]; /* Nom du probleme */ + int status; /* Etat actuel du maillage */ + Tree_T *Points; /* Points de controle */ + Tree_T *Vertices; /* Noeuds du maillage */ + Tree_T *Simplexes; /* Simplexes */ + Tree_T *Curves; /* Courbes */ + Tree_T *Surfaces; /* Surfaces */ + Tree_T *Volumes; /* Volumes */ + Tree_T *SurfaceLoops; /* Surface Loops */ + Tree_T *EdgeLoops; /* Edge Loops */ + List_T *PhysicalGroups; /*Physical Groups */ + Tree_T *VertexEdges; /* 2nd order Vertices on edges */ + Grid_T Grid; /* Grille de recherches rapides */ + LcField BGM; /* Background mesh */ + double Statistics[50]; /* Statistiques pour le maillage */ + GMSHMetric *Metric; /* Metrique */ + MeshParameters MeshParams; +}; + +typedef struct { + Simplex *S; + Face F; + int NumFaceSimpl; +}SxF; + +struct Map{ + int Num; + List_T *List; +}; + + +/* public functions */ + +double Correction_LC_Attractors (double X, double Y, double Z, + double *u, Mesh * m, double metr[3][3]); +int Extrude_Mesh (Curve * c); +int Extrude_Mesh (Surface * s); +int Extrude_Mesh (Volume * v); + +int Calcule_Contours (Surface * s); + +void Link_Simplexes (List_T * Sim, Tree_T * Tim); +void Maillage_Curve (void *data, void *dummy); + +int AlgorithmeMaillage2DAnisotropeModeJF (Surface * s); +void Maillage_Automatique_VieuxCode (Surface * pS, Mesh * m, int ori); +void Maillage_Surface (void *data, void *dum); +void Maillage_Volume (void *data, void *dum); + +void mai3d (Mesh * M, int Asked); +void Init_Mesh (Mesh * M, int all); +void GetStatistics (double s[50]); +void Maillage_Dimension_0 (Mesh * M); +void Maillage_Dimension_1 (Mesh * M); +void Maillage_Dimension_2 (Mesh * M); +void Maillage_Dimension_3 (Mesh * M); +void mai3d (Mesh * M, int Asked); +void Create_BgMesh (int i, double d, Mesh * m); +void Print_Mesh (Mesh * M, char *c, int Type); +void Read_Mesh (Mesh * M, FILE * File_GEO, int Type); +void Degre2 (Tree_T * AllNodes, Tree_T * TreeNodes, Tree_T * TreeElm, + Curve * c, Surface * s); +double Lc_XYZ (double X, double Y, double Z, Mesh * m); +int MeshTransfiniteSurface (Surface *sur); +int MeshTransfiniteVolume (Volume *vol); +int MeshCylindricalSurface (Surface * s); +int MeshParametricSurface (Surface * s); +int MeshEllipticSurface (Surface * sur); +void ActionLiss (void *data, void *dummy); +void ActionLissSurf (void *data, void *dummy); +void Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a); + +void Calcule_Z (void *data, void *dum); +void Calcule_Z_Plan (void *data, void *dum); +void Projette_Plan_Moyen (void *a, void *b); +void Projette_Inverse (void *a, void *b); +void Freeze_Vertex (void *a, void *b); +void deFreeze_Vertex (void *a, void *b); +void crEdges (Tree_T * TreeElem, Tree_T * treeedges); + + +#endif diff --git a/Mesh/MeshQuality.cpp b/Mesh/MeshQuality.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b2b668e82639594b6a8924bd91205bdf271903ac --- /dev/null +++ b/Mesh/MeshQuality.cpp @@ -0,0 +1,83 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "Numeric.h" + +/* Fonctions calculant differents parametres donnant la qualite + d'un maillage (surtout 3-D) */ + +/* Fonction calculant le facteur gamma pour un element tetraedrique : + 12 rho(in) + gamma = -------- --------- + sqrt(6) max(lij) + */ + +double GAMMAMAX, GAMMAMIN, GAMMA; +int NbCalcGamma; + +void CalculateGamma (void *a, void *b){ + Simplex *s = *(Simplex **) a; + double gamma = s->GammaShapeMeasure (); + NbCalcGamma++; + GAMMAMAX = DMAX (GAMMAMAX, gamma); + GAMMA += gamma; + GAMMAMIN = DMIN (GAMMAMIN, gamma); +} + +void CalculateEta (void *a, void *b){ + Simplex *s = *(Simplex **) a; + double gamma = s->EtaShapeMeasure (); + NbCalcGamma++; + GAMMAMAX = DMAX (GAMMAMAX, gamma); + GAMMA += gamma; + GAMMAMIN = DMIN (GAMMAMIN, gamma); +} + +void CalculateR (void *a, void *b){ + Simplex *s = *(Simplex **) a; + double gamma = s->RhoShapeMeasure (); + NbCalcGamma++; + GAMMAMAX = DMAX (GAMMAMAX, gamma); + GAMMA += gamma; + GAMMAMIN = DMIN (GAMMAMIN, gamma); +} + +void Gamma_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin){ + GAMMA = 0.0; + GAMMAMAX = 0.0; + GAMMAMIN = 1.0; + NbCalcGamma = 0; + Tree_Action (v->Simplexes, CalculateGamma); + if (!NbCalcGamma) + NbCalcGamma = 1; + *gamma = GAMMA / (double) NbCalcGamma; + *gammamax = GAMMAMAX; + *gammamin = GAMMAMIN; +} + +void Eta_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin){ + GAMMA = 0.0; + GAMMAMAX = 0.0; + GAMMAMIN = 1.0; + NbCalcGamma = 0; + Tree_Action (v->Simplexes, CalculateEta); + if (!NbCalcGamma) + NbCalcGamma = 1; + *gamma = GAMMA / (double) NbCalcGamma; + *gammamax = GAMMAMAX; + *gammamin = GAMMAMIN; +} + +void R_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin){ + GAMMA = 0.0; + GAMMAMAX = 0.0; + GAMMAMIN = 1.0; + NbCalcGamma = 0; + Tree_Action (v->Simplexes, CalculateR); + if (!NbCalcGamma) + NbCalcGamma = 1; + *gamma = GAMMA / (double) NbCalcGamma; + *gammamax = GAMMAMAX; + *gammamin = GAMMAMIN; +} diff --git a/Mesh/Metric.cpp b/Mesh/Metric.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d766649adcefc0e167f098aaad3879c1a9d6438c --- /dev/null +++ b/Mesh/Metric.cpp @@ -0,0 +1,346 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "Mesh.h" +#include "Matrix.h" +#include "Interpolation.h" + +GMSHMetric::GMSHMetric (){ + Identity (); + Attractors = List_Create (2, 2, sizeof (Attractor *)); + apply_costest = true; + apply_disttest = true; + min_cos = 0.0095; + max_dist = 1.e-3; + limite_aniso = 3000.; + quality_measure = QUALITY_SIMPLEX_BASED; +} + +double GMSHMetric:: Local_Metric_Of_Attractors (double X, double Y, double Z, + double metric[3][3]){ + int i; + Attractor *a, *amin; + double u, x1, x2, d, dmin; + Vertex v1 (X, Y, Z), v2, der, metr; + + dmin = 1.e25; + amin = NULL; + + for (i = 0; i < List_Nbr (Attractors); i++){ + List_Read (Attractors, i, &a); + if (a->v){ + d = sqrt ((X - a->v->Pos.X) * (X - a->v->Pos.X) + + (Y - a->v->Pos.Y) * (Y - a->v->Pos.Y) + + (Z - a->v->Pos.Z) * (Z - a->v->Pos.Z)); + } + if (a->c){ + ProjectPointOnCurve (a->c, &v1, &v2, &der); + d = sqrt ((X - v2.Pos.X) * (X - v2.Pos.X) + + (Y - v2.Pos.Y) * (Y - v2.Pos.Y) + + (Z - v2.Pos.Z) * (Z - v2.Pos.Z)); + + } + /* + if(a->s){ + ProjectPointOnSurface (a->c, &v1, &v2,&der); + d = sqrt((X-v2.Pos.X)*(X-v2.Pos.X)+ + (Y-v2.Pos.Y)*(Y-v2.Pos.Y)+ + (Z-v2.Pos.Z)*(Z-v2.Pos.Z)); + + } + */ + if (d < dmin){ + dmin = d; + amin = a; + metr = der; + } + } + if (amin){ + double d1 = dmin * amin->Radius; + u = exp (-(d1 * d1)); + x1 = (1. - u) + u * amin->lc1; + x2 = (1. - u) + u * amin->lc2; + } + if (amin && amin->v){ + double q11 = 1. / (x1 * x1); + double q22 = 1. / (x2 * x2); + double q12 = 1. / (x1 * x2); + m[0][0] *= q11; + m[0][1] *= q12; + m[1][0] *= q12; + m[1][1] *= q22; + m[2][1] *= q11; + m[1][2] *= q12; + m[0][2] *= q12; + m[2][0] *= q12; + m[2][2] *= q11; + } + else if (amin && amin->c){ + Matrix3x3 < double >NewMetric (0.), Rot (0.), RotTranspose (0.), Id (0.); + double xx = 0.0, yy = 0.0, zz = 0.0; + + if (metr.Pos.Z == 0.0) + zz = 1.0; + else if (metr.Pos.Y == 0.0) + yy = 1.0; + else + xx = 1.0; + + Vertex z (xx, yy, zz); + Vertex d2 = metr % z; + metr.norme (); + d2.norme (); + Vertex d3 = metr % d2; + d3.norme (); + + Id.Identity (1.0); + Rot.Identity (1.0); + + Id[0][0] = 1. / (x1 * x1); + Id[1][1] = 1. / (x2 * x2); + Id[2][2] = 1. / (x2 * x2); + + Rot[0][0] = metr.Pos.X; + Rot[0][1] = metr.Pos.Y; + Rot[0][2] = metr.Pos.Z; + Rot[1][0] = d2.Pos.X; + Rot[1][1] = d2.Pos.Y; + Rot[1][2] = d2.Pos.Z; + Rot[2][0] = d3.Pos.X; + Rot[2][1] = d3.Pos.Y; + Rot[2][2] = d3.Pos.Z; + + RotTranspose = Rot; + RotTranspose.transpose (); + NewMetric = RotTranspose * (Id * Rot); + NewMetric.copy (m); + } + else + u = 0.0; + return u; +} + + +void GMSHMetric:: setMetric (double u,double v, Surface * s){ + double a, b, c; // ellipsis axx+byy+cxy=1 + double l1, l2; // 2 eigenvalues + + Identity (); + Vertex p = InterpolateSurface (s, u, v, 0, 0); + if (s->Typ != MSH_SURF_PLAN && s->Typ != MSH_SURF_REGL && s->Typ != MSH_SURF_TRIC){ + Vertex du = InterpolateSurface (s, u, v, 1, 1); + Vertex dv = InterpolateSurface (s, u, v, 1, 2); + + a = du * du; + b = dv * dv; + c = du * dv; + + m[0][0] = a; + m[1][1] = b; + m[0][1] = c; + m[1][0] = c; + + l1 = 0.5 * ((a + b) + sqrt ((a - b) * (a - b) + 4. * c * c)); + l2 = 0.5 * ((a + b) - sqrt ((a - b) * (a - b) + 4. * c * c)); + + if (l1 == 0.0 && l2 == 0.0) + Identity (); + + else if (sqrt (l1 / l2) > limite_aniso){ + // on limite les rapports de metrique a limite_ansio + double r = limite_aniso * limite_aniso * (l2 / l1); + m[0][0] = a / r; + m[1][1] = b * r; + m[0][1] = c; + m[1][0] = c; + } + } + Local_Metric_Of_Attractors (p.Pos.X, p.Pos.Y, p.Pos.Z, NULL); + +} + +void GMSHMetric:: setMetric (double x, double y, double z){ + Identity (); + Local_Metric_Of_Attractors (x, y, z, NULL); + return; +} + +void GMSHMetric:: setMetricMin (double u, double v, Surface * s){ + + Identity (); + if (s->Typ != MSH_SURF_PLAN && s->Typ != MSH_SURF_REGL && s->Typ != MSH_SURF_TRIC){ + Vertex du = InterpolateSurface (s, u, v, 1, 1); + Vertex dv = InterpolateSurface (s, u, v, 1, 2); + double d = (du * du > dv * dv) ? du * du : dv * dv; + m[0][0] = d; + m[1][1] = d; + } + +} + +double GMSHMetric:: getWorstEdge (Simplex * s, Surface * surf, Vertex * v[2]){ + double l1, l2, l3, q1, q2, q3; + v[0] = s->V[0]; + v[1] = s->V[1]; + l1 = EdgeLengthOnSurface (surf, v, 1); + v[0] = s->V[0]; + v[1] = s->V[2]; + l2 = EdgeLengthOnSurface (surf, v, 1); + v[0] = s->V[1]; + v[1] = s->V[2]; + l3 = EdgeLengthOnSurface (surf, v, 1); + + q1 = 2. * l1 / (s->V[0]->lc + s->V[1]->lc); + q2 = 2. * l2 / (s->V[0]->lc + s->V[2]->lc); + q3 = 2. * l3 / (s->V[1]->lc + s->V[2]->lc); + + if (q1 >= q2 && q1 >= q3){ + v[0] = s->V[0]; + v[1] = s->V[1]; + return l1; + } + else if (q2 >= q3){ + v[0] = s->V[0]; + v[1] = s->V[2]; + return l2; + } + return l3; +} + +void GMSHMetric:: setSimplexQuality (Simplex * s, Surface * surf){ + if (quality_measure == QUALITY_EDGES_BASED){ + Vertex *v[2], vv; + double l1, l2, l3, q1, q2, q3; + v[0] = s->V[0]; + v[1] = s->V[1]; + vv = (*v[1]) - (*v[0]); + l1 = LengthVector (&vv); + v[0] = s->V[0]; + v[1] = s->V[2]; + vv = (*v[1]) - (*v[0]); + l2 = LengthVector (&vv); + v[0] = s->V[1]; + v[1] = s->V[2]; + vv = (*v[1]) - (*v[0]); + l3 = LengthVector (&vv); + + q1 = 2. * l1 / (s->V[0]->lc + s->V[1]->lc); + q2 = 2. * l2 / (s->V[0]->lc + s->V[2]->lc); + q3 = 2. * l3 / (s->V[1]->lc + s->V[2]->lc); + + s->Quality = DMAX (DMAX (q1, q2), q3) / (RacineDeTrois); + } + else{ + s->Center_Ellipsum_2D (m); + s->Quality = 3. * s->Radius / (s->V[0]->lc + s->V[1]->lc + s->V[2]->lc); + } +} + +void GMSHMetric::setSimplexQuality (Simplex * s){ + if (quality_measure == QUALITY_EDGES_BASED){ + Vertex *v[2], vv; + double l1, l2, l3, l4, l5, l6, q1, q2, q3, q4, q5, q6; + v[0] = s->V[0]; + v[1] = s->V[1]; + vv = (*v[1]) - (*v[0]); + l1 = LengthVector (&vv); + v[0] = s->V[0]; + v[1] = s->V[2]; + vv = (*v[1]) - (*v[0]); + l2 = LengthVector (&vv); + v[0] = s->V[1]; + v[1] = s->V[2]; + vv = (*v[1]) - (*v[0]); + l3 = LengthVector (&vv); + v[0] = s->V[0]; + v[1] = s->V[3]; + vv = (*v[1]) - (*v[0]); + l4 = LengthVector (&vv); + v[0] = s->V[1]; + v[1] = s->V[3]; + vv = (*v[1]) - (*v[0]); + l5 = LengthVector (&vv); + v[0] = s->V[2]; + v[1] = s->V[3]; + vv = (*v[1]) - (*v[0]); + l6 = LengthVector (&vv); + + q1 = 2. * l1 / (s->V[0]->lc + s->V[1]->lc); + q2 = 2. * l2 / (s->V[0]->lc + s->V[2]->lc); + q3 = 2. * l3 / (s->V[1]->lc + s->V[2]->lc); + q4 = 2. * l4 / (s->V[0]->lc + s->V[3]->lc); + q5 = 2. * l5 / (s->V[1]->lc + s->V[3]->lc); + q6 = 2. * l6 / (s->V[2]->lc + s->V[3]->lc); + + //s->Quality = (0.5/6.)*(q1+q2+q3+q4+q5+q6); + + //double qmax = (DMAX (q1, DMAX (q2, DMAX (q3, DMAX (q4, DMAX (q5, q6)))))); + + s->Quality = (q1 + q2 + q3 + q4 + q5 + q6) / (6. * RacineDeDeux); + } + else{ + s->Center_Ellipsum_3D (m); + s->Quality = 4. * s->Radius / (s->V[0]->lc + s->V[1]->lc + s->V[2]->lc + s->V[3]->lc); + } +} + +double GMSHMetric::operator () (int i, int j){ + return m[i][j]; +} + +double *GMSHMetric::operator[] (int i){ + if (i < 0 || i > 3) + return m[0]; + return m[i]; +} + +void GMSHMetric::Identity (){ + m[0][0] = m[1][1] = m[2][2] = 1.0; + m[1][0] = m[1][2] = m[0][1] = 0.0; + m[2][0] = m[2][1] = m[0][2] = 0.0; +} + +void GMSHMetric::setMetric (double u, Curve * c){ + +} + +double GMSHMetric::getLc (double u, Curve * c){ + double l; + Identity (); + Vertex v = InterpolateCurve (c, u, 0); + Vertex du = InterpolateCurve (c, u, 1); + Local_Metric_Of_Attractors (v.Pos.X, v.Pos.Y, v.Pos.Z, NULL); + l = LengthVector (&du); + return l / v.lc; +} + +double GMSHMetric::LengthVector (Vertex * v){ + Vertex mult (v->Pos.X * m[0][0] + v->Pos.Y * m[0][1] + v->Pos.Z * m[0][2], + v->Pos.X * m[1][0] + v->Pos.Y * m[1][1] + v->Pos.Z * m[1][2], + v->Pos.X * m[2][0] + v->Pos.Y * m[2][1] + v->Pos.Z * m[2][2]); + return sqrt (mult * (*v)); +} + +double GMSHMetric::EdgeLengthOnSurface (Surface * s, Vertex * v[2], int cuts){ + Vertex dv; + + if (!s){ + dv = (*v[1]) - (*v[0]); + return LengthVector (&dv); + } + + dv.Pos.X = (v[1]->Pos.X - v[0]->Pos.X) / (double) cuts; + dv.Pos.Y = (v[1]->Pos.Y - v[0]->Pos.Y) / (double) cuts; + + double l = 0.0, posu, posv; + + for (int i = 0; i < cuts; i++){ + posu = v[0]->Pos.X + dv.Pos.X * ((double) (i) + 0.5); + posv = v[0]->Pos.Y + dv.Pos.Y * ((double) (i) + 0.5); + setMetric (posu, posv, s); + l += LengthVector (&dv); + } + return l; +} diff --git a/Mesh/Metric.h b/Mesh/Metric.h new file mode 100644 index 0000000000000000000000000000000000000000..b8df4367f0af1e74ed10319c4e9bcfad65137e7b --- /dev/null +++ b/Mesh/Metric.h @@ -0,0 +1,31 @@ +class GMSHMetric +{ + public: + double m[3][3]; + double min_cos; + double max_dist; + bool apply_costest; + bool apply_disttest; + double limite_aniso; + int quality_measure; + public: + List_T *Attractors; + GMSHMetric(); + void Identity (); + double EdgeLengthOnSurface (Surface *s , Vertex *v[2], int cuts); + double LengthVector (Vertex *v); + void setMetric (double u,double v ,Surface *s); + void setMetric (double x,double y ,double z); + void setMetricMin (double u,double v ,Surface *s); + void setSimplexQuality (Simplex *s, Surface *surf); + void setSimplexQuality (Simplex *s); + void setMetric (double u,Curve *c); + double getLc ( double u , Curve *c ); + double operator () (int i,int j); + double * operator [] (int i); + double Local_Metric_Of_Attractors ( + double X, double Y, double Z, + double metric[3][3]); + double getWorstEdge (Simplex *s, Surface *surf, Vertex *v[2]); +} ; + diff --git a/Mesh/Numeric.cpp b/Mesh/Numeric.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8d08f24d9907d204d5703e763e673fe735855ac5 --- /dev/null +++ b/Mesh/Numeric.cpp @@ -0,0 +1,487 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "Mesh.h" +#include "Numeric.h" +#include "Interpolation.h" +#include "nrutil.h" + +double myatan2 (double a, double b){ + if (a == 0.0 && b == 0) + return 0.0; + return atan2 (a, b); +} + +double myacos (double a){ + if (a == 0) + return Pi * 0.5; + if (a == 1) + return 0.0; + return acos (a); +} + +void prodve (double a[3], double b[3], double c[3]){ + c[2] = a[0] * b[1] - a[1] * b[0]; + c[1] = -a[0] * b[2] + a[2] * b[0]; + c[0] = a[1] * b[2] - a[2] * b[1]; +} + +void prosca (double a[3], double b[3], double *c){ + *c = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} + +void norme (double a[3]){ + double mod; + mod = sqrt (a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); + if (mod == 0.0) + return; + a[0] /= mod; + a[1] /= mod; + a[2] /= mod; +} + +void direction (Vertex * v1, Vertex * v2, double d[3]){ + d[0] = v2->Pos.X - v1->Pos.X; + d[1] = v2->Pos.Y - v1->Pos.Y; + d[2] = v2->Pos.Z - v1->Pos.Z; +} + +void Projette (Vertex * v, double mat[3][3]){ + double X, Y, Z; + + X = v->Pos.X * mat[0][0] + v->Pos.Y * mat[0][1] + v->Pos.Z * mat[0][2]; + Y = v->Pos.X * mat[1][0] + v->Pos.Y * mat[1][1] + v->Pos.Z * mat[1][2]; + Z = v->Pos.X * mat[2][0] + v->Pos.Y * mat[2][1] + v->Pos.Z * mat[2][2]; + v->Pos.X = X; + v->Pos.Y = Y; + v->Pos.Z = Z; +} + +int sys2x2 (double mat[2][2], double b[2], double res[2]){ + double det, ud, norm; + int i; + + norm = DSQR (mat[0][0]) + DSQR (mat[1][1]) + DSQR (mat[0][1]) + DSQR (mat[1][0]); + det = mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1]; + + if (norm == 0.0 || fabs (det) / norm < 1.e-07){ + res[0] = res[1] = 0.0 ; + return 0; + } + ud = 1. / det; + + res[0] = b[0] * mat[1][1] - mat[0][1] * b[1]; + res[1] = mat[0][0] * b[1] - mat[1][0] * b[0]; + + for (i = 0; i < 2; i++) + res[i] *= ud; + return (1); +} + +int sys3x3 (double mat[3][3], double b[3], double res[3], double *det){ + double ud; + int i; + + *det = mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) - + mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) + + mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]); + + if (*det == 0.0){ + res[0] = res[1] = res[2] = 0.0 ; + return (0); + } + + ud = 1. / (*det); + + res[0] = b[0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) - + mat[0][1] * (b[1] * mat[2][2] - mat[1][2] * b[2]) + + mat[0][2] * (b[1] * mat[2][1] - mat[1][1] * b[2]); + + res[1] = mat[0][0] * (b[1] * mat[2][2] - mat[1][2] * b[2]) - + b[0] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) + + mat[0][2] * (mat[1][0] * b[2] - b[1] * mat[2][0]); + + res[2] = mat[0][0] * (mat[1][1] * b[2] - b[1] * mat[2][1]) - + mat[0][1] * (mat[1][0] * b[2] - b[1] * mat[2][0]) + + b[0] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]); + + for (i = 0; i < 3; i++) + res[i] *= ud; + return (1); + +} + +int det3x3 (double mat[3][3], double *det){ + *det = mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) - + mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) + + mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]); + return 1; +} + +int inv3x3 (double mat[3][3], double inv[3][3], double *det){ + double ud; + + *det = mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) - + mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) + + mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]); + + if (*det == 0.0) + return (0); + + ud = 1. / (*det); + + inv[0][0] = ud * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]); + inv[0][1] = -ud * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]); + inv[0][2] = ud * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]); + inv[1][0] = -ud * (mat[0][1] * mat[2][2] - mat[0][2] * mat[2][1]); + inv[1][1] = ud * (mat[0][0] * mat[2][2] - mat[0][2] * mat[2][0]); + inv[1][2] = -ud * (mat[0][0] * mat[2][1] - mat[0][1] * mat[2][0]); + inv[2][0] = ud * (mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1]); + inv[2][1] = -ud * (mat[0][0] * mat[1][2] - mat[0][2] * mat[1][0]); + inv[2][2] = ud * (mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]); + return (1); + +} + + +#define Precision 1.e-10 +#define MaxIter 20 + +void find_bestuv (Surface * s, double X, double Y, + double *U, double *V, double *Z, int N){ + double d, mina, min, minu, minv, Unew, Vnew; + static int i, j; + Vertex P; + + d = 1. / (double) N; + + for (i = 0; i <= N; i++){ + for (j = 0; j <= N; j++){ + Unew = ((double) i) * d; + Vnew = ((double) j) * d; + P = InterpolateSurface (s, Unew, Vnew, 0, 0); + if (!i && !j){ + min = myhypot (X - P.Pos.X, Y - P.Pos.Y); + minu = Unew; + minv = Vnew; + *Z = P.Pos.Z; + } + else{ + if ((mina = myhypot (X - P.Pos.X, Y - P.Pos.Y)) < min){ + min = mina; + minu = Unew; + minv = Vnew; + *Z = P.Pos.Z; + } + } + } + } + *U = minu; + *V = minv; +} + +void invert_singular_matrix(double **M, int n, double **I); + +void XYZtoUV (Surface *s, double X, double Y, double Z, double *U, double *V) { + double Unew,Vnew,err; + int iter; + Vertex D_u,D_v,P; + double **mat, **jac ; + + mat = dmatrix(1,3,1,3); + jac = dmatrix(1,3,1,3); + + *U = *V = 0.487; + err = 1.0; + iter = 1; + + while ( err > Precision && iter < MaxIter ){ + P = InterpolateSurface(s, *U, *V, 0, 0); + D_u = InterpolateSurface(s, *U, *V, 1, 1); + D_v = InterpolateSurface(s, *U, *V, 1, 2); + + mat[1][1] = D_u.Pos.X; + mat[1][2] = D_u.Pos.Y; + mat[1][3] = D_u.Pos.Z; + mat[2][1] = D_v.Pos.X; + mat[2][2] = D_v.Pos.Y; + mat[2][3] = D_v.Pos.Z; + mat[3][1] = 0.; + mat[3][2] = 0.; + mat[3][3] = 0.; + invert_singular_matrix(mat,3,jac); + + Unew = *U + jac[1][1] * (X-P.Pos.X) + jac[2][1] * (Y-P.Pos.Y) + jac[3][1] * (Z-P.Pos.Z) ; + Vnew = *V + jac[1][2] * (X-P.Pos.X) + jac[2][2] * (Y-P.Pos.Y) + jac[3][2] * (Z-P.Pos.Z) ; + + err = DSQR(Unew - *U) + DSQR(Vnew - *V) ; + + iter++; + *U = Unew; + *V = Vnew; + } + + if(iter == MaxIter) Msg(WARNING, "Could not converge in XYZtoUV"); + + if(iter > 10) Msg(WARNING, "Many (%d) iterations in XYZtoUV\n", iter); + + free_dmatrix(mat,1,3,1,3); + free_dmatrix(jac,1,3,1,3); + +} + +void XYtoUV (Surface * s, double *X, double *Y, + double *U, double *V, double *Z){ + + double det, Unew, Vnew, err, mat[2][2], jac[2][2]; + int iter; + Vertex D_u, D_v, P; + double umin, umax, vmin, vmax; + + if (s->Typ == MSH_SURF_NURBS){ + umin = s->ku[0]; + umax = s->ku[s->OrderU + s->Nu]; + vmin = s->kv[0]; + vmax = s->kv[s->OrderV + s->Nv]; + } + else{ + umin = vmin = 0.0; + umax = vmax = 1.0; + } + + *U = *V = 0.487; + err = 1.0; + iter = 1; + + while (err > Precision && iter < MaxIter){ + P = InterpolateSurface (s, *U, *V, 0, 0); + D_u = InterpolateSurface (s, *U, *V, 1, 1); + D_v = InterpolateSurface (s, *U, *V, 1, 2); + mat[0][0] = D_u.Pos.X; + mat[0][1] = D_u.Pos.Y; + mat[1][0] = D_v.Pos.X; + mat[1][1] = D_v.Pos.Y; + det = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]; + + if (det == 0.0){ + iter = MaxIter; + break; + } + + jac[0][0] = mat[1][1] / det; + jac[0][1] = -mat[0][1] / det; + jac[1][0] = -mat[1][0] / det; + jac[1][1] = mat[0][0] / det; + + Unew = *U + 1.0 * (jac[0][0] * (*X - P.Pos.X) + jac[1][0] * (*Y - P.Pos.Y)); + Vnew = *V + 1.0 * (jac[0][1] * (*X - P.Pos.X) + jac[1][1] * (*Y - P.Pos.Y)); + + err = DSQR (Unew - *U) + DSQR (Vnew - *V); + + iter++; + *U = Unew; + *V = Vnew; + if (iter == MaxIter) + break; + + } + + *Z = P.Pos.Z; + + /* + if (iter == MaxIter || (fabs (Unew) >= umax || fabs (Vnew) >= vmax) || + Vnew < vmin || Unew < umin){ + find_bestuv (s, *X, *Y, U, V, Z, 30); + P = InterpolateSurface (s, *U, *V, 0, 0); + + *X = P.Pos.X; + *Y = P.Pos.Y; + *Z = P.Pos.Z; + } + */ +} + +int Oriente (List_T * cu, double n[3]){ + int N, i, a, b, c; + double cosa, sina, sum, v[3], w[3], u[3]; + Vertex *ver[3]; + + N = List_Nbr (cu); + + sum = 0.0; + for (i = 0; i < N; i++){ + if (i == N - 1){ + a = N - 1; + b = 1; + c = 2; + } + else if (i == N - 2){ + a = N - 2; + b = N - 1; + c = 1; + } + else{ + a = i; + b = i + 1; + c = i + 2; + } + List_Read (cu, a, &ver[0]); + List_Read (cu, b, &ver[1]); + List_Read (cu, c, &ver[2]); + + u[0] = ver[1]->Pos.X - ver[0]->Pos.X; + u[1] = ver[1]->Pos.Y - ver[0]->Pos.Y; + u[2] = ver[1]->Pos.Z - ver[0]->Pos.Z; + + v[0] = ver[2]->Pos.X - ver[1]->Pos.X; + v[1] = ver[2]->Pos.Y - ver[1]->Pos.Y; + v[2] = ver[2]->Pos.Z - ver[1]->Pos.Z; + norme (u); + norme (v); + prodve (u, v, w); + prosca (w, n, &sina); + prosca (u, v, &cosa); + sum += myatan2 (sina, cosa); + } + + if (sum < 0) + return (1); + else + return (0); +} + +double angle_02pi (double A3){ + double DP = 2 * Pi; + while (A3 > DP || A3 < 0.){ + if (A3 > 0) + A3 -= DP; + else + A3 += DP; + } + return A3; +} + +double angle_3p (Vertex * V, Vertex * P1, Vertex * P2){ + double PA[3], PB[3], angplan; + double cosc, sinc, c[3]; + + PA[0] = P1->Pos.X - V->Pos.X; + PA[1] = P1->Pos.Y - V->Pos.Y; + PA[2] = P1->Pos.Z - V->Pos.Z; + + PB[0] = P2->Pos.X - V->Pos.X; + PB[1] = P2->Pos.Y - V->Pos.Y; + PB[2] = P2->Pos.Z - V->Pos.Z; + + norme (PA); + norme (PB); + + prodve (PA, PB, c); + + prosca (PA, PB, &cosc); + sinc = sqrt (c[0] * c[0] + c[1] * c[1] + c[2] * c[2]); + + angplan = myatan2 (sinc, cosc); + + return angplan; +} + +double angle_plan (Vertex * V, Vertex * P1, Vertex * P2, double n[3]){ + double PA[3], PB[3], angplan; + double cosc, sinc, c[3]; + + PA[0] = P1->Pos.X - V->Pos.X; + PA[1] = P1->Pos.Y - V->Pos.Y; + PA[2] = P1->Pos.Z - V->Pos.Z; + + PB[0] = P2->Pos.X - V->Pos.X; + PB[1] = P2->Pos.Y - V->Pos.Y; + PB[2] = P2->Pos.Z - V->Pos.Z; + + norme (PA); + norme (PB); + + prodve (PA, PB, c); + + prosca (PA, PB, &cosc); + prosca (c, n, &sinc); + + angplan = myatan2 (sinc, cosc); + + return angplan; +} + +double angle_3pts (Vertex * a, Vertex * b, Vertex * c){ + double L, prosca, angle; + + L = myhypot ((a->Pos.X - b->Pos.X), (a->Pos.Y - b->Pos.Y)) * + myhypot ((b->Pos.X - c->Pos.X), (b->Pos.Y - c->Pos.Y)); + + prosca = ((a->Pos.X - b->Pos.X) * (c->Pos.X - b->Pos.X) + + (a->Pos.Y - b->Pos.Y) * (c->Pos.Y - b->Pos.Y)) / L; + + angle = acos (prosca) * 180. / (3.1415926); + return (angle); +} + +double trapeze (IntPoint * P1, IntPoint * P2){ + return (0.5 * (P1->lc + P2->lc) * (P2->t - P1->t)); +} + + +void RecursiveIntegration (IntPoint * from, IntPoint * to, double (*f) (double X), + List_T * pPoints, double Prec, int *depth){ + IntPoint P, p1; + double err, val1, val2, val3; + + (*depth)++; + + P.t = 0.5 * (from->t + to->t); + P.lc = f (P.t); + + val1 = trapeze (from, to); + val2 = trapeze (from, &P); + val3 = trapeze (&P, to); + + err = fabs (val1 - val2 - val3); + + if ((err < Prec) && (*depth > 1)){ + List_Read (pPoints, List_Nbr (pPoints) - 1, &p1); + P.p = p1.p + val2; + List_Add (pPoints, &P); + + List_Read (pPoints, List_Nbr (pPoints) - 1, &p1); + to->p = p1.p + val3; + List_Add (pPoints, to); + } + else{ + RecursiveIntegration (from, &P, f, pPoints, Prec, depth); + RecursiveIntegration (&P, to, f, pPoints, Prec, depth); + } + (*depth)--; +} + +double Integration (double t1, double t2, double (*f) (double X), + List_T * pPoints, double Prec){ + int depth, i; + IntPoint from, to; + + depth = 0; + from.t = t1; + from.lc = f (from.t); + from.p = 0.0; + + to.t = t2; + to.lc = f (to.t); + + List_Add (pPoints, &from); + RecursiveIntegration (&from, &to, f, pPoints, Prec, &depth); + for (i = 0; i < List_Nbr (pPoints); i++){ + List_Read (pPoints, i, &to); + } + + List_Read (pPoints, List_Nbr (pPoints) - 1, &to); + return (to.p); +} diff --git a/Mesh/Numeric.h b/Mesh/Numeric.h new file mode 100644 index 0000000000000000000000000000000000000000..e61ec8ee3e0e81b8d580bf7c203a5fa93bf972fe --- /dev/null +++ b/Mesh/Numeric.h @@ -0,0 +1,31 @@ +#ifndef _NUMERIC_H_ +#define _NUMERIC_H_ + +double myatan2 (double a, double b); +double myacos (double a); +void prodve (double a[3], double b[3], double c[3]); +void prosca (double a[3], double b[3], double *c); +void norme (double a[3]); +void direction (Vertex * v1, Vertex * v2, double d[3]); +void Projette (Vertex * v, double mat[3][3]); +int sys2x2 (double mat[2][2], double b[2], double res[2]); +int sys3x3 (double mat[3][3], double b[3], double res[3], double *det); +int det3x3 (double mat[3][3], double *det); +int inv3x3 (double mat[3][3], double inv[3][3], double *det); +void find_bestuv (Surface * s, double X, double Y, + double *U, double *V, double *Z, int N); +void XYtoUV (Surface * s, double *X, double *Y, + double *U, double *V, double *Z); +void XYZtoUV (Surface *s, double X, double Y, double Z, double *U, double *V); +int Oriente (List_T * cu, double n[3]); +double angle_02pi (double A3); +double angle_3p (Vertex * V, Vertex * P1, Vertex * P2); +double angle_plan (Vertex * V, Vertex * P1, Vertex * P2, double n[3]); +double angle_3pts (Vertex * a, Vertex * b, Vertex * c); +double trapeze (IntPoint * P1, IntPoint * P2); +void RecursiveIntegration (IntPoint * from, IntPoint * to, double (*f) (double X), + List_T * pPoints, double Prec, int *depth); +double Integration (double t1, double t2, double (*f) (double X), + List_T * pPoints, double Prec); + +#endif diff --git a/Mesh/Nurbs.cpp b/Mesh/Nurbs.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fd6a3b65702313ed67b5db7022f66d18934e1a06 --- /dev/null +++ b/Mesh/Nurbs.cpp @@ -0,0 +1,204 @@ + +#include "Gmsh.h" +#include "Mesh.h" + +Vertex InterpolateCubicSpline (Vertex * v[4], double t, double mat[4][4], + int derivee, double t1, double t2){ + Vertex V; + int i, j; + double vec[4], T[4]; + + V.Pos.X = V.Pos.Y = V.Pos.Z = 0.0; + V.lc = t * v[1]->lc + (1. - t) * v[2]->lc; + + if (derivee){ + T[3] = 0.; + T[2] = 1.; + T[1] = 2. * t; + T[0] = 3. * t * t; + } + else{ + T[3] = 1.; + T[2] = t; + T[1] = t * t; + T[0] = t * t * t; + } + + for (i = 0; i < 4; i++){ + vec[i] = 0.0; + } + + /* X */ + for (i = 0; i < 4; i++){ + for (j = 0; j < 4; j++){ + vec[i] += mat[i][j] * v[j]->Pos.X; + } + } + + for (j = 0; j < 4; j++){ + V.Pos.X += T[j] * vec[j]; + vec[j] = 0.0; + } + + /* Y */ + for (i = 0; i < 4; i++){ + for (j = 0; j < 4; j++){ + vec[i] += mat[i][j] * v[j]->Pos.Y; + } + } + + for (j = 0; j < 4; j++){ + V.Pos.Y += T[j] * vec[j]; + vec[j] = 0.0; + } + + /* Z */ + for (i = 0; i < 4; i++){ + for (j = 0; j < 4; j++){ + vec[i] += mat[i][j] * v[j]->Pos.Z; + } + } + for (j = 0; j < 4; j++){ + V.Pos.Z += T[j] * vec[j]; + vec[j] = 0.0; + } + + if (derivee){ + V.Pos.X /= ((t2 - t1)); + V.Pos.Y /= ((t2 - t1)); + V.Pos.Z /= ((t2 - t1)); + } + + return V; +} + +/* ------------------------------------------------------------------------ */ +/* I n t e r p o l a t e N u r b s */ +/* ------------------------------------------------------------------------ */ + +/* B S p l i n e s U n i f o r m e s */ + +Vertex InterpolateUBS (Curve * Curve, double u, int derivee){ + + int NbControlPoints, NbKnots, NbCurves, iCurve; + double t, t1, t2; + Vertex *v[4]; + + NbControlPoints = List_Nbr (Curve->Control_Points); + NbCurves = NbControlPoints - 3; + NbKnots = NbControlPoints - 2; + + iCurve = (int) (u * (double) NbCurves) + 1; + + if (iCurve > NbCurves) + iCurve = NbCurves; + + t1 = (double) (iCurve - 1) / (double) (NbCurves); + t2 = (double) (iCurve) / (double) (NbCurves); + + t = (u - t1) / (t2 - t1); + + List_Read (Curve->Control_Points, iCurve - 1, &v[0]); + List_Read (Curve->Control_Points, iCurve, &v[1]); + List_Read (Curve->Control_Points, iCurve + 1, &v[2]); + List_Read (Curve->Control_Points, iCurve + 2, &v[3]); + + return InterpolateCubicSpline (v, t, Curve->mat, derivee, t1, t2); +} + +/* B S p l i n e s N o n U n i f o r m e s */ + +int findSpan (double u, int deg, int n, float *U){ + if (u >= U[n]) + return n - 1; + if (u <= U[0]) + return deg; + + int low = deg; + int high = n + 1; + int mid = (low + high) / 2; + + while (u < U[mid] || u >= U[mid + 1]){ + if (u < U[mid]) + high = mid; + else + low = mid; + mid = (low + high) / 2; + } + return mid; +} + +void basisFuns (double u, int i, int deg, float *U, double *N){ + + double left[1000]; + double *right = &left[deg + 1]; + + double temp, saved; + + //N.resize(deg+1) ; + + N[0] = 1.0; + for (int j = 1; j <= deg; j++){ + left[j] = u - U[i + 1 - j]; + right[j] = U[i + j] - u; + saved = 0.0; + for (int r = 0; r < j; r++){ + temp = N[r] / (right[r + 1] + left[j - r]); + N[r] = saved + right[r + 1] * temp; + saved = left[j - r] * temp; + } + N[j] = saved; + } +} + +Vertex InterpolateNurbs (Curve * Curve, double u, int derivee){ + static double Nb[1000]; + int span = findSpan (u, Curve->degre, List_Nbr (Curve->Control_Points), Curve->k); + Vertex p, *v; + + basisFuns (u, span, Curve->degre, Curve->k, Nb); + p.Pos.X = p.Pos.Y = p.Pos.Z = p.w = p.lc = 0.0; + for (int i = Curve->degre; i >= 0; --i){ + List_Read (Curve->Control_Points, span - Curve->degre + i, &v); + p.Pos.X += Nb[i] * v->Pos.X; + p.Pos.Y += Nb[i] * v->Pos.Y; + p.Pos.Z += Nb[i] * v->Pos.Z; + p.w += Nb[i] * v->w; + p.lc += Nb[i] * v->lc; + } + return p; +} + +Vertex InterpolateNurbsSurface (Surface * s, double u, double v){ + int uspan = findSpan (u, s->OrderU, s->Nu, s->ku); + int vspan = findSpan (v, s->OrderV, s->Nv, s->kv); + double Nu[1000], Nv[1000]; + Vertex sp, temp[1000], *pv; + + basisFuns (u, uspan, s->OrderU, s->ku, Nu); + basisFuns (v, vspan, s->OrderV, s->kv, Nv); + + int l, ll, kk; + for (l = 0; l <= s->OrderV; l++){ + temp[l].Pos.X = temp[l].Pos.Y = temp[l].Pos.Z = temp[l].w = temp[l].lc = 0.0; + for (int k = 0; k <= s->OrderU; k++){ + kk = uspan - s->OrderU + k; + ll = vspan - s->OrderV + l; + List_Read (s->Control_Points, kk + s->Nu * ll, &pv); + temp[l].Pos.X += Nu[k] * pv->Pos.X; + temp[l].Pos.Y += Nu[k] * pv->Pos.Y; + temp[l].Pos.Z += Nu[k] * pv->Pos.Z; + temp[l].w += Nu[k] * pv->w; + temp[l].lc += Nu[k] * pv->lc; + } + } + sp.Pos.X = sp.Pos.Y = sp.Pos.Z = sp.w = sp.lc = 0.0; + for (l = 0; l <= s->OrderV; l++){ + sp.Pos.X += Nv[l] * temp[l].Pos.X; + sp.Pos.Y += Nv[l] * temp[l].Pos.Y; + sp.Pos.Z += Nv[l] * temp[l].Pos.Z; + sp.w += Nv[l] * temp[l].w; + sp.lc += Nv[l] * temp[l].lc; + } + return sp; +} diff --git a/Mesh/Print_Mesh.cpp b/Mesh/Print_Mesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0bf8f1b0436deeb019779d49fe6106267352a469 --- /dev/null +++ b/Mesh/Print_Mesh.cpp @@ -0,0 +1,1059 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "CAD.h" +#include "Mesh.h" +#include "Create.h" +#include "Tools.h" + +/* ------------------------------------------------------------------------ */ +/* M S H F O R M A T */ +/* ------------------------------------------------------------------------ */ + +#define LINE 1 +#define TRIANGLE 2 +#define QUADRANGLE 3 +#define TETRAHEDRON 4 +#define HEXAHEDRON 5 +#define PRISM 6 +#define PYRAMID 7 +#define LINE_2 8 +#define TRIANGLE_2 9 +#define QUADRANGLE_2 10 +#define TETRAHEDRON_2 11 +#define HEXAHEDRON_2 12 +#define PRISM_2 13 +#define PYRAMID_2 14 +#define POINT 15 + +static FILE *mshfile; +static int MSH_NODE_NUM; +static int MSH_VOL_NUM, MSH_ELEMENT_NUM, MSH_ADD; +static int MSH_PHYSICAL_NUM, MSH_PHYSICAL_ORI; + +void print_msh_node (void *a, void *b){ + Vertex **V; + + V = (Vertex **) a; + fprintf (mshfile, "%d %.16g %.16g %.16g\n", + (*V)->Num, (*V)->Pos.X, (*V)->Pos.Y, (*V)->Pos.Z); +} + +void process_msh_nodes (Mesh * M){ + MSH_NODE_NUM = Tree_Nbr (M->Vertices) + Tree_Nbr (M->VertexEdges); + + fprintf (mshfile, "$NOE\n"); + fprintf (mshfile, "%d\n", MSH_NODE_NUM); + Tree_Action (M->Vertices, print_msh_node); + Tree_Action (M->VertexEdges, print_msh_node); + fprintf (mshfile, "$ENDNOE\n"); +} + +void add_msh_simplex (void *a, void *b){ + Simplex **S; + int i, type, nbn, nbs = 0; + + S = (Simplex **) a; + + if (MSH_VOL_NUM && (MSH_VOL_NUM != (*S)->iEnt)) + return; + + if (!MSH_ADD){ + MSH_ELEMENT_NUM++; + return; + } + + if (!(*S)->V[2]){ + nbn = 2; + if ((*S)->VSUP){ + type = LINE_2; + nbs = 1; + } + else + type = LINE; + } + else if (!(*S)->V[3]){ + nbn = 3; + if ((*S)->VSUP){ + type = TRIANGLE_2; + nbs = 3; + } + else + type = TRIANGLE; + } + else{ + nbn = 4; + if (!MSH_VOL_NUM){ + if ((*S)->VSUP){ + type = QUADRANGLE_2; + nbs = 5; + } + else + type = QUADRANGLE; + } + else if ((*S)->VSUP){ + type = TETRAHEDRON_2; + nbs = 1; + } + else + type = TETRAHEDRON; + } + + fprintf (mshfile, "%d %d %d %d %d", + MSH_ELEMENT_NUM++, type,MSH_PHYSICAL_NUM,(*S)->iEnt, nbn + nbs); + + if (MSH_PHYSICAL_ORI > 0){ + for (i = 0; i < nbn; i++) + fprintf (mshfile, " %d", (*S)->V[i]->Num); + for (i = 0; i < nbs; i++) + fprintf (mshfile, " %d", (*S)->VSUP[i]->Num); + } + else{ + for (i = 0; i < nbn; i++) + fprintf (mshfile, " %d", (*S)->V[nbn - i - 1]->Num); + for (i = 0; i < nbs; i++) + fprintf (mshfile, " %d", (*S)->VSUP[nbs - i - 1]->Num); + } + + fprintf (mshfile, "\n"); +} + +void add_msh_hexahedron (void *a, void *b){ + Hexahedron **H; + int i, type, nbn, nbs = 0; + + H = (Hexahedron **) a; + + if (MSH_VOL_NUM && (MSH_VOL_NUM != (*H)->iEnt)) + return; + + if (!MSH_ADD){ + MSH_ELEMENT_NUM++; + return; + } + + nbn = 8; + if ((*H)->VSUP){ + type = HEXAHEDRON_2; + nbs = 19; + } + else + type = HEXAHEDRON; + + fprintf (mshfile, "%d %d %d %d %d", + MSH_ELEMENT_NUM++, type, MSH_PHYSICAL_NUM, (*H)->iEnt, nbn + nbs); + + for (i = 0; i < nbn; i++) + fprintf (mshfile, " %d", (*H)->V[i]->Num); + for (i = 0; i < nbs; i++) + fprintf (mshfile, " %d", (*H)->VSUP[i]->Num); + + fprintf (mshfile, "\n"); +} + +void add_msh_prism (void *a, void *b){ + Prism **P; + int i, type, nbn, nbs = 0; + + P = (Prism **) a; + + if (MSH_VOL_NUM && (MSH_VOL_NUM != (*P)->iEnt)) + return; + + if (!MSH_ADD){ + MSH_ELEMENT_NUM++; + return; + } + + nbn = 6; + if ((*P)->VSUP){ + type = PRISM_2; + nbs = 12; + } + else{ + type = PRISM; + } + + fprintf (mshfile, "%d %d %d %d %d", + MSH_ELEMENT_NUM++, type, MSH_PHYSICAL_NUM, (*P)->iEnt, nbn + nbs); + + for (i = 0; i < nbn; i++) + fprintf (mshfile, " %d", (*P)->V[i]->Num); + for (i = 0; i < nbs; i++) + fprintf (mshfile, " %d", (*P)->VSUP[i]->Num); + + fprintf (mshfile, "\n"); +} + +void add_msh_point (Vertex * V){ + + if (!MSH_ADD){ + MSH_ELEMENT_NUM++; + return; + } + + fprintf (mshfile, "%d %d %d %d 1 %d\n", + MSH_ELEMENT_NUM++, POINT, MSH_PHYSICAL_NUM, V->Num, V->Num); +} + +void add_msh_elements (Mesh * M){ + int i, j, k, Num; + + PhysicalGroup *p; + Volume *pV; + Surface *ps, s; + Curve *pc, c; + Vertex *pv, v; + + List_T *ListVolumes = Tree2List (M->Volumes); + + for (i = 0; i < List_Nbr (M->PhysicalGroups); i++){ + List_Read (M->PhysicalGroups, i, &p); + MSH_PHYSICAL_NUM = p->Num; + + switch (p->Typ){ + + case MSH_PHYSICAL_VOLUME: + for (k = 0; k < List_Nbr (ListVolumes); k++){ + List_Read (ListVolumes, k, &pV); + for (j = 0; j < List_Nbr (p->Entities); j++){ + List_Read (p->Entities, j, &Num); + MSH_VOL_NUM = abs (Num); + MSH_PHYSICAL_ORI = sign (Num); + Tree_Action (pV->Simplexes, add_msh_simplex); + Tree_Action (pV->Hexahedra, add_msh_hexahedron); + Tree_Action (pV->Prisms, add_msh_prism); + } + } + break; + + case MSH_PHYSICAL_SURFACE: + for (j = 0; j < List_Nbr (p->Entities); j++){ + ps = &s; + List_Read (p->Entities, j, &Num); + ps->Num = abs (Num); + MSH_PHYSICAL_ORI = sign (Num); + if (Tree_Query (M->Surfaces, &ps)) + Tree_Action (ps->Simplexes, add_msh_simplex); + } + break; + + case MSH_PHYSICAL_LINE: + for (j = 0; j < List_Nbr (p->Entities); j++){ + pc = &c; + List_Read (p->Entities, j, &Num); + pc->Num = abs (Num); + MSH_PHYSICAL_ORI = sign (Num); + if (Tree_Query (M->Curves, &pc)) + Tree_Action (pc->Simplexes, add_msh_simplex); + } + break; + + case MSH_PHYSICAL_POINT: + for (j = 0; j < List_Nbr (p->Entities); j++){ + pv = &v; + List_Read (p->Entities, j, &Num); + pv->Num = abs (Num); + MSH_PHYSICAL_ORI = sign (Num); + if (Tree_Query (M->Vertices, &pv)) + add_msh_point (pv); + } + break; + + } + } +} + +void process_msh_elements (Mesh * M){ + MSH_ADD = 0; + MSH_ELEMENT_NUM = 1; + add_msh_elements (M); + fprintf (mshfile, "$ELM\n"); + fprintf (mshfile, "%d\n", MSH_ELEMENT_NUM - 1); + + if (MSH_ELEMENT_NUM == 1) + Msg (WARNING, "No elements to save: did you forget to define Physical Entities?"); + + MSH_ADD = 1; + MSH_ELEMENT_NUM = 1; + add_msh_elements (M); + fprintf (mshfile, "$ENDELM\n"); +} + + +/* ------------------------------------------------------------------------ */ +/* U N V F O R M A T */ +/* ------------------------------------------------------------------------ */ + +/* Numeros des enregistrements IDEAS */ +#define HEADER 151 +#define UNITS 164 +#define NODES 2411 +#define ELEMENTS 2412 +#define RESNODE 55 +#define RESELEM 56 +#define RESVECT 57 +#define GROUPOFNODES 790 + +/* Numeros des elements IDEAS */ +#define BEAM 21 +#define BEAM2 24 +#define THINSHLL 91 +#define THINSHLL2 92 +#define QUAD 94 +#define QUAD2 95 /* Ca c'est une impro !!! */ +#define SOLIDFEM 111 +#define WEDGE 112 +#define BRICK 115 +#define SOLIDFEM2 118 + +void process_nodes (FILE * funv, Mesh * M){ + int nbnod; + double x, y, z; + int i, idnod; + Vertex *v; + + List_T *Nodes = Tree2List (M->Vertices); + + fprintf (funv, "%6d\n", -1); + fprintf (funv, "%6d\n", NODES); + nbnod = List_Nbr (Nodes); + + for (i = 0; i < nbnod; i++){ + List_Read (Nodes, i, &v); + idnod = v->Num; + x = v->Pos.X; + y = v->Pos.Y; + z = v->Pos.Z; + fprintf (funv, "%10d%10d%10d%10d\n", idnod, 1, 1, 11); + fprintf (funv, "%21.16fD+00 %21.16fD+00 %21.16fD+00\n", x, y, z); + } + + List_Delete (Nodes); + Nodes = Tree2List (M->VertexEdges); + nbnod = List_Nbr (Nodes); + + for (i = 0; i < nbnod; i++){ + List_Read (Nodes, i, &v); + idnod = v->Num; + x = v->Pos.X; + y = v->Pos.Y; + z = v->Pos.Z; + fprintf (funv, "%10d%10d%10d%10d\n", idnod, 1, 1, 11); + fprintf (funv, "%21.16fD+00 %21.16fD+00 %21.16fD+00\n", x, y, z); + } + + fprintf (funv, "%6d\n", -1); +} + +static int ELEMENT_ID; + +int process_2D_elements (FILE * funv, Mesh * m){ + List_T *ListSurfaces = Tree2List (m->Surfaces); + List_T *ListVolumes = Tree2List (m->Volumes); + List_T *Elements; + Volume *vol; + List_T *AllSurfaces = List_Create (2, 2, sizeof (Surface *)); + Simplex *sx; + Surface *s; + int nbtri = 0, i, j, nsup, n, ntot, k, geo, fetyp; + + for (i = 0; i < List_Nbr (ListVolumes); i++){ + List_Read (ListVolumes, i, &vol); + for (j = 0; j < List_Nbr (vol->Surfaces); j++){ + List_Read (vol->Surfaces, j, &s); + if (Tree_Nbr (s->Simplexes)) + List_Add (AllSurfaces, &s); + } + } + + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &s); + if (!List_Search (AllSurfaces, &s, compareSurface)){ + Elements = Tree2List (s->Simplexes); + for (j = 0; j < List_Nbr (Elements); j++){ + List_Read (Elements, j, &sx); + if (sx->V[3]){ + if (sx->VSUP){ + fetyp = QUAD; + n = 4; + nsup = 4; + } + else{ + fetyp = QUAD; + n = 4; + nsup = 0; + } + } + else{ + if (sx->VSUP){ + fetyp = THINSHLL; + n = 3; + nsup = 3; + } + else{ + fetyp = THINSHLL; + nsup = 0; + n = 3; + } + } + geo = s->Num; + fprintf (funv, "%10d%10d%10d%10d%10d%10d\n", + /*ELEMENT_ID++ */ sx->Num, fetyp, geo, geo, 7, n + nsup); + ntot = 0; + for (k = 0; k < n; k++){ + fprintf (funv, "%10d", sx->V[k]->Num); + if (ntot % 8 == 7) + fprintf (funv, "\n"); + ntot++; + } + for (k = 0; k < nsup; k++){ + fprintf (funv, "%10d", sx->VSUP[k]->Num); + if (ntot % 8 == 7) + fprintf (funv, "\n"); + ntot++; + } + if (ntot - 1 % 8 != 7) + fprintf (funv, "\n"); + } + List_Delete (Elements); + nbtri += Tree_Nbr (s->Simplexes); + } + } + List_Delete (ListSurfaces); + List_Delete (ListVolumes); + List_Delete (AllSurfaces); + return 0; +} + +int process_1D_elements (FILE * funv, Mesh * m){ + List_T *ListCurves = Tree2List (m->Curves); + List_T *AllCurves = List_Create (2, 2, sizeof (Surface *)); + List_T *ListSurfaces = Tree2List (m->Surfaces); + List_T *Elements; + Simplex *sx; + Curve *c; + Surface *surf; + int nblig = 0, k, ntot, i, j, geo, fetyp, n, nsup; + + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &surf); + for (j = 0; j < List_Nbr (surf->s.Generatrices); j++){ + List_Read (surf->s.Generatrices, j, &c); + if (Tree_Nbr (c->Simplexes)) + List_Add (AllCurves, &c); + c = FindCurve (-c->Num, m); + if (Tree_Nbr (c->Simplexes)) + List_Add (AllCurves, &c); + } + } + + for (i = 0; i < List_Nbr (ListCurves); i++){ + List_Read (ListCurves, i, &c); + if (!List_Search (AllCurves, &c, compareCurve)){ + Elements = Tree2List (c->Simplexes); + for (j = 0; j < List_Nbr (Elements); j++){ + nblig++; + List_Read (Elements, j, &sx); + if (sx->VSUP){ + fetyp = BEAM2; + n = 2; + nsup = 2; + } + else{ + fetyp = BEAM; + n = 2; + nsup = 0; + } + geo = c->Num; + fprintf (funv, "%10d%10d%10d%10d%10d%10d\n", + /*ELEMENT_ID++ */ sx->Num, fetyp, geo, geo, 7, n + nsup); + ntot = 0; + fprintf (funv, "%10d%10d%10d\n", 0, 0, 0); + for (k = 0; k < n; k++){ + fprintf (funv, "%10d", sx->V[k]->Num); + if (ntot % 8 == 7) + fprintf (funv, "\n"); + ntot++; + } + for (k = 0; k < nsup; k++){ + fprintf (funv, "%10d", sx->VSUP[k]->Num); + if (ntot % 8 == 7) + fprintf (funv, "\n"); + ntot++; + } + if (ntot - 1 % 8 != 7) + fprintf (funv, "\n"); + } + + List_Delete (Elements); + } + } + List_Delete (AllCurves); + List_Delete (ListSurfaces); + List_Delete (ListCurves); + return 0; +} + +int process_3D_elements (FILE * funv, Mesh * m){ + List_T *ListVolumes = Tree2List (m->Volumes); + List_T *Elements; + Simplex *sx; + Volume *v; + int nb = 0, i, j, nsup, n, ntot, k, geo, fetyp; + + for (i = 0; i < List_Nbr (ListVolumes); i++){ + List_Read (ListVolumes, i, &v); + // TETRAEDRON + Elements = Tree2List (v->Simplexes); + for (j = 0; j < List_Nbr (Elements); j++){ + List_Read (Elements, j, &sx); + if (sx->VSUP){ + fetyp = SOLIDFEM; + n = 4; + nsup = 6; + } + else{ + fetyp = SOLIDFEM; + nsup = 0; + n = 4; + } + if (sx->Volume_Simplexe () < 0){ + Vertex *temp; + temp = sx->V[0]; + sx->V[0] = sx->V[1]; + sx->V[1] = temp; + if (sx->Volume_Simplexe () < 0) + Msg(WARNING, "Argh... Negative Volume"); + } + geo = v->Num; + fprintf (funv, "%10d%10d%10d%10d%10d%10d\n", + ELEMENT_ID++, fetyp, geo, geo, 7, n + nsup); + ntot = 0; + for (k = 0; k < n; k++){ + fprintf (funv, "%10d", sx->V[k]->Num); + if (ntot % 8 == 7) + fprintf (funv, "\n"); + ntot++; + } + for (k = 0; k < nsup; k++){ + fprintf (funv, "%10d", sx->VSUP[k]->Num); + if (ntot % 8 == 7) + fprintf (funv, "\n"); + ntot++; + } + if (ntot - 1 % 8 != 7) + fprintf (funv, "\n"); + } + List_Delete (Elements); + nb += Tree_Nbr (v->Simplexes); + + // PRISMS + Elements = Tree2List (v->Prisms); + for (j = 0; j < List_Nbr (Elements); j++){ + List_Read (Elements, j, &sx); + if (sx->VSUP){ + fetyp = WEDGE; + n = 6; + nsup = 9; + } + else{ + fetyp = WEDGE; + nsup = 0; + n = 6; + } + + geo = v->Num; + fprintf (funv, "%10d%10d%10d%10d%10d%10d\n", + ELEMENT_ID++, fetyp, geo, geo, 7, n + nsup); + ntot = 0; + for (k = 0; k < n; k++){ + fprintf (funv, "%10d", sx->V[k]->Num); + if (ntot % 8 == 7) + fprintf (funv, "\n"); + ntot++; + } + for (k = 0; k < nsup; k++){ + fprintf (funv, "%10d", sx->VSUP[k]->Num); + if (ntot % 8 == 7) + fprintf (funv, "\n"); + ntot++; + } + if (ntot - 1 % 8 != 7) + fprintf (funv, "\n"); + } + List_Delete (Elements); + nb += Tree_Nbr (v->Prisms); + + // HEXAHEDRONS + Elements = Tree2List (v->Hexahedra); + for (j = 0; j < List_Nbr (Elements); j++){ + List_Read (Elements, j, &sx); + if (sx->VSUP){ + fetyp = BRICK; + n = 8; + nsup = 12; + } + else{ + fetyp = BRICK; + nsup = 0; + n = 8; + } + + geo = v->Num; + fprintf (funv, "%10d%10d%10d%10d%10d%10d\n", + ELEMENT_ID++, fetyp, geo, geo, 7, n + nsup); + ntot = 0; + for (k = 0; k < n; k++){ + fprintf (funv, "%10d", sx->V[k]->Num); + if (ntot % 8 == 7) + fprintf (funv, "\n"); + ntot++; + } + for (k = 0; k < nsup; k++){ + fprintf (funv, "%10d", sx->VSUP[k]->Num); + if (ntot % 8 == 7) + fprintf (funv, "\n"); + ntot++; + } + if (ntot - 1 % 8 != 7) + fprintf (funv, "\n"); + } + List_Delete (Elements); + nb += Tree_Nbr (v->Hexahedra); + } + List_Delete (ListVolumes); + return nb; +} + +FILE *unvfile; +Tree_T *tree; + +void AddVertex (void *a, void *b){ + Vertex *v; + v = *(Vertex **) a; + if (Tree_Search (tree, &v->Num)) + return; + Tree_Add (tree, &v->Num); + fprintf (unvfile, "%10d%10d%2d%2d%2d%2d%2d%2d\n", v->Num, 1, 0, 1, 0, 0, 0, 0); + fprintf (unvfile, "%21.16fD+00 %21.16fD+00 %21.16fD+00\n", 0., 1., 0.); + fprintf (unvfile, "%21.16fD+00 %21.16fD+00 %21.16fD+00\n", 0., 0., 0.); + fprintf (unvfile, "%10d%10d%10d%10d%10d%10d\n", 0, 0, 0, 0, 0, 0); +} + +void PrintGroups (Mesh * m){ + int nb, j, i, k; + Surface *ps, s; + Curve *pc, c; + Vertex *pv, v; + PhysicalGroup *p; + + for (i = 0; i < List_Nbr (m->PhysicalGroups); i++){ + + List_Read (m->PhysicalGroups, i, &p); + if (p->Typ == MSH_PHYSICAL_SURFACE){ + tree = Tree_Create (sizeof (int), fcmp_absint); + fprintf (unvfile, "%6d\n", -1); + fprintf (unvfile, "%6d\n", GROUPOFNODES); + fprintf (unvfile, "%10d%10d\n", p->Num, 1); + fprintf (unvfile, "LOAD SET %2d\n", 1); + nb = List_Nbr (p->Entities); + for (j = 0; j < nb; j++){ + ps = &s; + List_Read (p->Entities, j, &ps->Num); + if (Tree_Query (m->Surfaces, &ps)) + Tree_Action (ps->Vertices, AddVertex); + } + fprintf (unvfile, "%6d\n", -1); + //Tree_Delete(tree); + //free(tree); + } + if (p->Typ == MSH_PHYSICAL_LINE){ + tree = Tree_Create (sizeof (int), fcmp_absint); + fprintf (unvfile, "%6d\n", -1); + fprintf (unvfile, "%6d\n", GROUPOFNODES); + fprintf (unvfile, "%10d%10d\n", p->Num, 1); + fprintf (unvfile, "LOAD SET %2d\n", 1); + nb = List_Nbr (p->Entities); + for (j = 0; j < nb; j++){ + pc = &c; + List_Read (p->Entities, j, &pc->Num); + if (Tree_Query (m->Curves, &pc)) + for (k = 0; k < List_Nbr (pc->Vertices); k++) + AddVertex (List_Pointer (pc->Vertices, k), NULL); + } + fprintf (unvfile, "%6d\n", -1); + //Tree_Delete(tree); + } + if (p->Typ == MSH_PHYSICAL_POINT){ + tree = Tree_Create (sizeof (int), fcmp_absint); + fprintf (unvfile, "%6d\n", -1); + fprintf (unvfile, "%6d\n", GROUPOFNODES); + fprintf (unvfile, "%10d%10d\n", p->Num, 1); + fprintf (unvfile, "LOAD SET %2d\n", 1); + nb = List_Nbr (p->Entities); + for (j = 0; j < nb; j++){ + pv = &v; + List_Read (p->Entities, j, &pv->Num); + if (Tree_Query (m->Vertices, &pv)) + AddVertex (&pv, NULL); + } + fprintf (unvfile, "%6d\n", -1); + //Tree_Delete(tree); + } + } +} + +/* ------------------------------------------------------------------------ */ +/* G R E F F O R M A T */ +/* ------------------------------------------------------------------------ */ + +void ConsecutiveNodes (Mesh * M, Tree_T * ConstecutiveNTree, Tree_T * ConsecutiveETree); + +static int compareFrozen (const void *a, const void *b){ + Vertex *q, *w; + q = *(Vertex **) a; + w = *(Vertex **) b; + return w->Frozen - q->Frozen; +} + +int process_Gref_nodes (FILE * fGref, Mesh * M, + Tree_T * ConsecutiveNTree, Tree_T * ConsecutiveETree){ + int i, nbtri; + Vertex *v; + Surface *s; + Curve *c; + List_T *ListSurfaces, *ListCurves, *Nodes; + + ListCurves = Tree2List (M->Curves); + for (i = 0; i < List_Nbr (ListCurves); i++){ + List_Read (ListCurves, i, &c); + Degre2 (M->Vertices, M->VertexEdges, c->Simplexes, c, NULL); + } + List_Delete (ListCurves); + + ListSurfaces = Tree2List (M->Surfaces); + nbtri = 0; + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &s); + Degre2 (M->Vertices, M->VertexEdges, s->Simplexes, NULL, s); + nbtri += Tree_Nbr (s->Simplexes); + } + List_Delete (ListSurfaces); + + ConsecutiveNodes (M, ConsecutiveNTree, ConsecutiveETree); + + fprintf (fGref, "%d %d %d\n", nbtri, Tree_Nbr (ConsecutiveNTree), + Tree_Nbr (ConsecutiveNTree) + Tree_Nbr (ConsecutiveETree)); + + Nodes = Tree2List (ConsecutiveNTree); + for (i = 0; i < List_Nbr (Nodes); i++){ + List_Read (Nodes, i, &v); + fprintf (fGref, "%21.16e ", v->Pos.X); + if (i % 3 == 2) + fprintf (fGref, "\n"); + } + if ((List_Nbr (Nodes) - 1) % 3 != 2) + fprintf (fGref, "\n"); + for (i = 0; i < List_Nbr (Nodes); i++){ + List_Read (Nodes, i, &v); + fprintf (fGref, "%21.16e ", v->Pos.Y); + if (i % 3 == 2) + fprintf (fGref, "\n"); + } + if ((List_Nbr (Nodes) - 1) % 3 != 2) + fprintf (fGref, "\n"); + i = Tree_Nbr (ConsecutiveNTree); + List_Delete (Nodes); + return i; +} + +int find_physicalentity (Vertex * v, Mesh * m){ + PhysicalGroup *p; + Curve *c; + int i, j; + for (i = 0; i < List_Nbr (m->PhysicalGroups); i++){ + List_Read (m->PhysicalGroups, i, &p); + if (p->Typ == MSH_PHYSICAL_POINT){ + if (List_Search (p->Entities, &v->Num, fcmp_absint)){ + return p->Num; + } + } + } + + if (v->ListCurves){ + + for (i = 0; i < List_Nbr (m->PhysicalGroups); i++){ + List_Read (m->PhysicalGroups, i, &p); + if (p->Typ == MSH_PHYSICAL_LINE){ + for (j = 0; j < List_Nbr (v->ListCurves); j++){ + List_Read (v->ListCurves, j, &c); + if (List_Search (p->Entities, &c->Num, fcmp_absint)){ + return p->Num; + } + } + } + } + } + return 0; +} + +void process_Gref_poundarybonditions (FILE * fGref, Mesh * M, + Tree_T * TRN, Tree_T * TRE){ + int i, ent; + Vertex *v; + + List_T *Nodes = Tree2List (TRN); + for (i = 0; i < List_Nbr (Nodes); i++){ + List_Read (Nodes, i, &v); + ent = find_physicalentity (v, M); + fprintf (fGref, "%d %d ", ent, ent); + if (i % 3 == 2) + fprintf (fGref, "\n"); + } + if ((List_Nbr (Nodes) - 1) % 3 != 2) + fprintf (fGref, "\n"); + List_Delete (Nodes); + + Nodes = Tree2List (TRE); + for (i = 0; i < List_Nbr (Nodes); i++){ + List_Read (Nodes, i, &v); + ent = find_physicalentity (v, M); + fprintf (fGref, "%d %d ", ent, ent); + if (i % 3 == 2) + fprintf (fGref, "\n"); + } + if ((List_Nbr (Nodes) - 1) % 3 != 2) + fprintf (fGref, "\n"); + List_Delete (Nodes); +} + +void process_Gref_elements (FILE * fGref, Mesh * M, int nn){ + int i, j; + Simplex *sx; + Surface *s; + List_T *Triangles; + List_T *ListSurfaces; + + ListSurfaces = Tree2List (M->Surfaces); + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &s); + Triangles = Tree2List (s->Simplexes); + for (j = 0; j < List_Nbr (Triangles); j++){ + List_Read (Triangles, j, &sx); + if (!sx->V[3]) + fprintf (fGref, "%d %d %d\n", -sx->V[0]->Frozen, -sx->V[1]->Frozen, -sx->V[2]->Frozen); + else + fprintf (fGref, "%d %d %d %d\n", -sx->V[0]->Frozen, + -sx->V[1]->Frozen, + -sx->V[2]->Frozen, + -sx->V[3]->Frozen); + + } + List_Delete (Triangles); + } + + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &s); + Triangles = Tree2List (s->Simplexes); + for (j = 0; j < List_Nbr (Triangles); j++){ + List_Read (Triangles, j, &sx); + if (!sx->V[3]) + fprintf (fGref, "%d %d %d\n", -sx->VSUP[0]->Frozen - nn, + -sx->VSUP[1]->Frozen - nn, + -sx->VSUP[2]->Frozen - nn); + else + fprintf (fGref, "%d %d %d %d\n", -sx->VSUP[0]->Frozen - nn, + -sx->VSUP[1]->Frozen - nn, + -sx->VSUP[2]->Frozen - nn, + -sx->VSUP[3]->Frozen - nn); + } + List_Delete (Triangles); + } + // Degres de Liberte + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &s); + Triangles = Tree2List (s->Simplexes); + for (j = 0; j < List_Nbr (Triangles); j++){ + List_Read (Triangles, j, &sx); + if (!sx->V[3]) + fprintf (fGref, "%d %d %d %d %d %d %d %d %d %d %d %d\n", + -2 * sx->V[0]->Frozen - 1, + -2 * sx->V[0]->Frozen, + -2 * sx->VSUP[0]->Frozen - 1, + -2 * sx->VSUP[0]->Frozen, + -2 * sx->V[1]->Frozen - 1, + -2 * sx->V[1]->Frozen, + -2 * sx->VSUP[1]->Frozen - 1, + -2 * sx->VSUP[1]->Frozen, + -2 * sx->V[2]->Frozen - 1, + -2 * sx->V[2]->Frozen, + -2 * sx->VSUP[2]->Frozen - 1, + -2 * sx->VSUP[2]->Frozen); + else + fprintf (fGref, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", + -2 * sx->V[0]->Frozen - 1, + -2 * sx->V[0]->Frozen, + -2 * sx->VSUP[0]->Frozen - 1, + -2 * sx->VSUP[0]->Frozen, + -2 * sx->V[1]->Frozen - 1, + -2 * sx->V[1]->Frozen, + -2 * sx->VSUP[1]->Frozen - 1, + -2 * sx->VSUP[1]->Frozen, + -2 * sx->V[2]->Frozen - 1, + -2 * sx->V[2]->Frozen, + -2 * sx->VSUP[2]->Frozen - 1, + -2 * sx->VSUP[2]->Frozen, + -2 * sx->V[3]->Frozen - 1, + -2 * sx->V[3]->Frozen, + -2 * sx->VSUP[3]->Frozen - 1, + -2 * sx->VSUP[3]->Frozen); + } + List_Delete (Triangles); + } + List_Delete (ListSurfaces); +} + +FILE *Greffile; + +void ConsecutiveNodes (Mesh * M, Tree_T * ConsecutiveNTree, Tree_T * ConsecutiveETree){ + int i, j, k; + Simplex *sx; + Surface *s; + List_T *Triangles; + int nbnod, nbedges, nbdof; + List_T *ListSurfaces; + + int newnum = 0, N; + + ListSurfaces = Tree2List (M->Surfaces); + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &s); + Triangles = Tree2List (s->Simplexes); + for (j = 0; j < List_Nbr (Triangles); j++){ + List_Read (Triangles, j, &sx); + if (!sx->V[3]) + N = 3; + else + N = 4; + for (k = 0; k < N; k++){ + if (sx->V[k]->Frozen >= 0){ + sx->V[k]->Frozen = --newnum; + Tree_Insert (ConsecutiveNTree, &(sx->V[k])); + } + } + } + List_Delete (Triangles); + } + nbnod = -newnum; + ListSurfaces = Tree2List (M->Surfaces); + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &s); + Triangles = Tree2List (s->Simplexes); + for (j = 0; j < List_Nbr (Triangles); j++){ + List_Read (Triangles, j, &sx); + if (!sx->V[3]) + N = 3; + else + N = 4; + for (k = 0; k < N; k++){ + if (sx->VSUP[k]->Frozen >= 0){ + sx->VSUP[k]->Frozen = --newnum; + Tree_Insert (ConsecutiveETree, &(sx->VSUP[k])); + } + } + } + List_Delete (Triangles); + } + nbedges = -newnum - nbnod; + nbdof = nbnod + nbedges; +} + +void EndConsecutiveNodes (Mesh * M){ + int i, j, k; + Simplex *sx; + Surface *s; + List_T *Triangles; + List_T *ListSurfaces; + int N; + + ListSurfaces = Tree2List (M->Surfaces); + for (i = 0; i < List_Nbr (ListSurfaces); i++){ + List_Read (ListSurfaces, i, &s); + Triangles = Tree2List (s->Simplexes); + for (j = 0; j < List_Nbr (Triangles); j++){ + List_Read (Triangles, j, &sx); + if (!sx->V[3]) + N = 3; + else + N = 4; + for (k = 0; k < N; k++) + sx->V[k]->Frozen = 0; + for (k = 0; k < N; k++) + sx->VSUP[k]->Frozen = 0; + } + List_Delete (Triangles); + } + List_Delete (ListSurfaces); +} + +/* ------------------------------------------------------------------------ */ +/* P r i n t _ M e s h */ +/* ------------------------------------------------------------------------ */ + +void Print_Mesh (Mesh * M, char *c, int Type){ + char name[256]; + strcpy (name, M->name); + + if (Type == FORMAT_MSH){ + c ? strcpy (name, c) : strcat (name, ".msh"); + mshfile = fopen (name, "w"); + if (!mshfile){ + Msg(WARNING, "Unable to Open File '%s'", name); + return; + } + Msg (INFOS, "Writing file %s", name); + process_msh_nodes (M); + process_msh_elements (M); + Msg (INFOS, "Wrote %d Nodes, %d Elements", MSH_NODE_NUM, MSH_ELEMENT_NUM - 1); + fclose (mshfile); + } + else if (Type == FORMAT_UNV){ + c ? strcpy (name, c) : strcat (name, ".unv"); + unvfile = fopen (name, "w"); + if (!unvfile){ + Msg(WARNING, "Unable to Open File '%s'", name); + return; + } + Msg (INFOS, "Writing file %s", name); + process_nodes (unvfile, M); + fprintf (unvfile, "%6d\n", -1); + fprintf (unvfile, "%6d\n", ELEMENTS); + ELEMENT_ID = 1; + process_3D_elements (unvfile, M); + process_2D_elements (unvfile, M); + process_1D_elements (unvfile, M); + fprintf (unvfile, "%6d\n", -1); + PrintGroups (M); + fclose (unvfile); + } + else if (Type == FORMAT_GREF){ + c ? strcpy (name, c) : strcat (name, ".Gref"); + Tree_T *TRN = Tree_Create (sizeof (Vertex *), compareFrozen); + Tree_T *TRE = Tree_Create (sizeof (Vertex *), compareFrozen); + Greffile = fopen (name, "w"); + if (!Greffile){ + Msg(WARNING, "Unable to Open File '%s'", name); + return; + } + Msg (INFOS, "Writing file %s", name); + process_Gref_nodes (Greffile, M, TRN, TRE); + process_Gref_elements (Greffile, M, Tree_Nbr (TRN)); + process_Gref_poundarybonditions (Greffile, M, TRN, TRE); + fclose (Greffile); + Tree_Delete (TRN); + Tree_Delete (TRE); + EndConsecutiveNodes (M); + } +} diff --git a/Mesh/Read_Mesh.cpp b/Mesh/Read_Mesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..178c9daee6b28dfe088c2d4d87601c33b9c44af0 --- /dev/null +++ b/Mesh/Read_Mesh.cpp @@ -0,0 +1,226 @@ + +#include "Gmsh.h" +#include "Geo.h" +#include "Mesh.h" +#include "Create.h" +#include "MinMax.h" + +/* ------------------------------------------------------------------------ */ +/* M S H F O R M A T */ +/* ------------------------------------------------------------------------ */ + +#define LGN1 1 +#define TRI1 2 +#define QUA1 3 +#define TET1 4 +#define HEX1 5 +#define PRI1 6 +#define PYR1 7 +#define LGN2 8 +#define TRI2 9 +#define QUA2 10 +#define TET2 11 +#define HEX2 12 +#define PRI2 13 +#define PYR2 14 +#define PNT 15 + +#define NB_NOD_MAX_ELM 20 + +/* relecture maillage au format MSH */ + +void Read_Mesh_MSH (Mesh *M, FILE *File_GEO){ + + char String[256]; + int Nbr_Nodes, Nbr_Elements, i_Node, i_Element; + int Num, Type, Physical, Elementary, i, j; + double x , y , z, lc1, lc2 ; + Vertex *vert , verts[NB_NOD_MAX_ELM] ,*vertsp[NB_NOD_MAX_ELM] , **vertspp; + Simplex *simp ; + Hexahedron *hex ; + Prism *pri ; + Curve C , *c , **cc; + Surface S , *s , **ss; + Volume V , *v , **vv; + + while (1) { + do { + fgets(String,sizeof(String), File_GEO) ; + if (feof(File_GEO)) break ; + } while (String[0] != '$') ; + + if (feof(File_GEO)) break ; + + /* P T S */ + + if (!strncmp(&String[1], "PTS", 3)) { + + fscanf(File_GEO, "%d", &Nbr_Nodes) ; + Msg(INFOS, "%d Points", Nbr_Nodes); + + for (i_Node = 0 ; i_Node < Nbr_Nodes ; i_Node++) { + fscanf(File_GEO, "%d %lf %lf %lf %lf %lf", &Num, &x, &y, &z, &lc1, &lc2) ; + vert = Create_Vertex (Num, x, y, z, lc1 , lc2); + Tree_Replace(M->Points, &vert) ; + } + } + + /* N O E */ + + if (!strncmp(&String[1], "NO", 2)) { /* $NOE or $NOD */ + + fscanf(File_GEO, "%d", &Nbr_Nodes) ; + Msg(INFOS, "%d Nodes", Nbr_Nodes); + + for (i_Node = 0 ; i_Node < Nbr_Nodes ; i_Node++) { + fscanf(File_GEO, "%d %lf %lf %lf", &Num, &x, &y, &z) ; + vert = Create_Vertex (Num, x, y, z, 1.0 ,0.0); + Tree_Replace(M->Vertices, &vert) ; + } + } + + /* ELEMENTS */ + + else if (!strncmp(&String[1], "ELM", 3)) { + + fscanf(File_GEO, "%d", &Nbr_Elements) ; + Msg(INFOS, "%d Elements", Nbr_Elements); + + for (i_Element = 0 ; i_Element < Nbr_Elements ; i_Element++) { + + fscanf(File_GEO, "%d %d %d %d %d", + &Num, &Type, &Physical, &Elementary, &Nbr_Nodes) ; + + for (j = 0 ; j < Nbr_Nodes ; j++) + fscanf(File_GEO, "%d", &verts[j].Num) ; + + switch(Type){ + case LGN1: case LGN2: + c = &C; c->Num = Elementary; + if(!(cc = (Curve**)Tree_PQuery(M->Curves, &c))){ + c = Create_Curve(Elementary, MSH_SEGM_LINE, 0, NULL, + NULL, 0, 1, 0., 1.); + Tree_Add(M->Curves, &c); + } + else + c = *cc; + break; + case TRI1: case QUA1: case TRI2: case QUA2: + s = &S; s->Num = Elementary; + if(!(ss = (Surface**)Tree_PQuery(M->Surfaces, &s))){ + s = Create_Surface(Elementary, MSH_SURF_PLAN, Elementary); + Tree_Add(M->Surfaces, &s); + } + else + s = *ss; + break; + case TET1: case HEX1: case PRI1: case TET2: case HEX2: case PRI2: + v = &V; v->Num = Elementary; + if(!(vv = (Volume**)Tree_PQuery(M->Volumes, &v))){ + v = Create_Volume(Elementary, MSH_VOLUME, Elementary); + Tree_Add(M->Volumes, &v); + } + else + v = *vv; + break; + default : + break; + } + + for(i=0 ; i<Nbr_Nodes ; i++) { + vertsp[i] = &verts[i]; + if(!(vertspp = (Vertex**)Tree_PQuery(M->Vertices, &vertsp[i]))) + Msg(ERROR, "Unknown Vertex %d in Element %d", verts[i].Num, Num); + else + vertsp[i] = *vertspp; + } + + switch(Type){ + case LGN1: + simp = Create_Simplex(vertsp[0], vertsp[1], NULL , NULL); + simp->Num = Num ; + simp->iEnt = Elementary ; + Tree_Insert(c->Simplexes, &simp) ; + Tree_Insert(M->Simplexes, &simp) ; + break; + case TRI1: + simp = Create_Simplex(vertsp[0], vertsp[1], vertsp[2], NULL); + simp->Num = Num ; + simp->iEnt = Elementary ; + Tree_Insert(s->Simplexes, &simp) ; + Tree_Insert(M->Simplexes, &simp) ; + break; + case QUA1: + /* ! Fuck, fuck, fuck */ + simp = Create_Simplex(vertsp[0], vertsp[1], vertsp[2], NULL); + simp->V[3] = vertsp[3]; + simp->Num = Num ; + simp->iEnt = Elementary ; + Tree_Insert(s->Simplexes, &simp) ; + Tree_Insert(M->Simplexes, &simp) ; + break; + case TET1: + simp = Create_Simplex(vertsp[0], vertsp[1], vertsp[2], vertsp[3]); + simp->Num = Num ; + simp->iEnt = Elementary ; + Tree_Insert(v->Simplexes, &simp) ; + Tree_Insert(M->Simplexes, &simp) ; + break; + case HEX1: + hex = Create_Hexahedron(vertsp[0], vertsp[1], vertsp[2], vertsp[3], + vertsp[4], vertsp[5], vertsp[6], vertsp[7]); + hex->Num = Num ; + hex->iEnt = Elementary ; + Tree_Insert(v->Hexahedra, &hex) ; + break; + case PRI1: + pri = Create_Prism(vertsp[0], vertsp[1], vertsp[2], + vertsp[3], vertsp[4], vertsp[5]); + pri->Num = Num ; + pri->iEnt = Elementary ; + Tree_Insert(v->Prisms, &pri) ; + break; + case PNT: + break; + default : + Msg(WARNING, "Unknown Type of Element in Read_Mesh"); + break; + } + } + + } + + do { + fgets(String, 256, File_GEO) ; + if (feof(File_GEO)) Msg(ERROR, "Prematured End of Mesh File"); + } while (String[0] != '$') ; + + } + + if(Tree_Nbr(M->Volumes)) + M->status = 3 ; + else if(Tree_Nbr(M->Surfaces)) + M->status = 2 ; + else if(Tree_Nbr(M->Curves)) + M->status = 1 ; + else if(Tree_Nbr(M->Points)) + M->status = 0 ; + else + M->status = -1 ; + + CalculateMinMax(M->Points); + +} + +/* ------------------------------------------------------------------------ */ +/* R e a d _ M e s h */ +/* ------------------------------------------------------------------------ */ + +void Read_Mesh (Mesh *M, FILE *File_GEO, int type){ + + switch(type){ + case FORMAT_MSH : Read_Mesh_MSH(M,File_GEO); break; + default : Msg(WARNING, "Unkown Mesh File Format to Read"); break; + } + +} diff --git a/Mesh/STL.cpp b/Mesh/STL.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f2f34241cf21f922311163ad4567f9767c52391e --- /dev/null +++ b/Mesh/STL.cpp @@ -0,0 +1,73 @@ + +#include "Gmsh.h" +#include "Mesh.h" + +extern Mesh *THEM; + +STL_Data::STL_Data (){ + Vertices = Tree_Create (sizeof (Vertex *), comparePosition); + Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex); + LSimplexes = NULL; + LVertices = NULL; +} + +STL_Data::~STL_Data (){ +} + +void STL_Data::Add_Facet (double x1, double y1, double z1, + double x2, double y2, double z2, + double x3, double y3, double z3){ + Vertex **ppv; + Vertex *v1 = Create_Vertex (Tree_Nbr (Vertices) + 1, x1, y1, z1, 1, 0); + + if ((ppv = (Vertex **) Tree_PQuery (Vertices, &v1))){ + delete v1; + v1 = *ppv; + } + else{ + Tree_Add (Vertices, &v1); + Tree_Add (THEM->Points, &v1); + } + + Vertex *v2 = Create_Vertex (Tree_Nbr (Vertices) + 1, x2, y2, z2, 1, 0); + if ((ppv = (Vertex **) Tree_PQuery (Vertices, &v2))){ + delete v2; + v2 = *ppv; + } + else{ + Tree_Add (Vertices, &v2); + Tree_Add (THEM->Points, &v2); + } + + Vertex *v3 = Create_Vertex (Tree_Nbr (Vertices) + 1, x3, y3, z3, 1, 0); + if ((ppv = (Vertex **) Tree_PQuery (Vertices, &v3))){ + delete v3; + v3 = *ppv; + } + else{ + Tree_Add (Vertices, &v3); + Tree_Add (THEM->Points, &v3); + } + Simplex *s = Create_Simplex (v1, v2, v3, NULL); + Tree_Add (Simplexes, &s); +} + +void STL_Data::GetFacet (int ifac, int &v1, int &v2, int &v3){ + Simplex *s; + if (!LSimplexes) + LSimplexes = Tree2List (Simplexes); + List_Read (LSimplexes, ifac - 1, &s); + v1 = s->V[0]->Num; + v2 = s->V[1]->Num; + v3 = s->V[2]->Num; +} + +void STL_Data::GetVertex (int i, double &x, double &y, double &z){ + Vertex *v; + if (!LVertices) + LVertices = Tree2List (Vertices); + List_Read (LVertices, i - 1, &v); + x = v->Pos.X; + y = v->Pos.Y; + z = v->Pos.Z; +} diff --git a/Mesh/SecondOrder.cpp b/Mesh/SecondOrder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5d89409a2733a3467dce594453c7729ae3ad91f0 --- /dev/null +++ b/Mesh/SecondOrder.cpp @@ -0,0 +1,146 @@ + +#include "Gmsh.h" +#include "Geo.h" +#include "Mesh.h" +#include "Interpolation.h" +#include "Numeric.h" + +extern int CurrentNodeNumber; + +static Surface *THES; +static Curve *THEC; + +Vertex *middlecurve (Vertex * v1, Vertex * v2){ + Vertex v, *pv; + + if (!THEC) + return NULL; + + if ((v1->ListCurves && List_Nbr (v1->ListCurves) != 1) || + (v2->ListCurves && List_Nbr (v2->ListCurves) != 1)){ + v.Pos.X = (v1->Pos.X + v2->Pos.X) * 0.5; + v.Pos.Y = (v1->Pos.Y + v2->Pos.Y) * 0.5; + v.Pos.Z = (v1->Pos.Z + v2->Pos.Z) * 0.5; + } + else + v = InterpolateCurve (THEC, 0.5 * (v1->u + v2->u), 0); + + pv = Create_Vertex (++CurrentNodeNumber, v.Pos.X, v.Pos.Y, v.Pos.Z, v.lc, v.u); + + if (!pv->ListCurves){ + pv->ListCurves = List_Create (1, 1, sizeof (Curve *)); + } + List_Add (pv->ListCurves, &THEC); + return pv; +} + +Vertex *middleface (Vertex * v1, Vertex * v2){ + Vertex v, *pv; + double U, V, U1, U2, V1, V2; + + if (!THES) + return NULL; + if (THES->Typ == MSH_SURF_PLAN) + return NULL; + + XYZtoUV ( THES , v1->Pos.X , v1->Pos.Y , v1->Pos.Z, &U1 , &V1 ); + XYZtoUV ( THES , v2->Pos.X , v2->Pos.Y , v2->Pos.Z, &U2 , &V2 ); + + U = 0.5 *(U1+U2); + V = 0.5 *(V1+V2); + v = InterpolateSurface(THES,U,V,0,0); + pv = Create_Vertex(++CurrentNodeNumber,v.Pos.X,v.Pos.Y,v.Pos.Z,v.lc,v.u); + return pv; +} + +extern int edges_tetra[6][2]; +extern int edges_quad[4][2]; +static Tree_T *THET; +extern int EdgesInVolume; + +void PutMiddlePoint (void *a, void *b){ + Edge *ed; + Simplex *s; + Vertex *v; + int i, j, k, N, c; + int edges[6][2]; + + ed = (Edge *) a; + + if (ed->newv) + v = ed->newv; + else if ((v = middlecurve (ed->V[0], ed->V[1]))); + else if ((v = middleface (ed->V[0], ed->V[1]))); + else + v = Create_Vertex (++CurrentNodeNumber, + 0.5 * (ed->V[0]->Pos.X + ed->V[1]->Pos.X), + 0.5 * (ed->V[0]->Pos.Y + ed->V[1]->Pos.Y), + 0.5 * (ed->V[0]->Pos.Z + ed->V[1]->Pos.Z), + 0.5 * (ed->V[0]->lc + ed->V[1]->lc), + 0.5 * (ed->V[0]->u + ed->V[1]->u)); + ed->newv = v; + Tree_Insert (THET, &v); + for (i = 0; i < List_Nbr (ed->Simplexes); i++){ + List_Read (ed->Simplexes, i, &s); + if (s->V[3] && EdgesInVolume){ + if (!s->VSUP) + s->VSUP = (Vertex **) Malloc (6 * sizeof (Vertex *)); + N = 6; + for (k = 0; k < N; k++) + for (j = 0; j < 2; j++) + edges[k][j] = edges_tetra[k][j]; + } + else if (s->V[3]){ + if (!s->VSUP) + s->VSUP = (Vertex **) Malloc (4 * sizeof (Vertex *)); + N = 4; + for (k = 0; k < N; k++) + for (j = 0; j < 2; j++) + edges[k][j] = edges_quad[k][j]; + } + else if (s->V[2]){ + if (!s->VSUP) + s->VSUP = (Vertex **) Malloc (3 * sizeof (Vertex *)); + N = 3; + for (k = 0; k < N; k++) + for (j = 0; j < 2; j++) + edges[k][j] = edges_tetra[k][j]; + } + else{ + if (!s->VSUP) + s->VSUP = (Vertex **) Malloc (sizeof (Vertex *)); + N = 1; + for (k = 0; k < N; k++) + for (j = 0; j < 2; j++) + edges[k][j] = edges_tetra[k][j]; + } + c = 0; + for (j = 0; j < N; j++){ + if ((!compareVertex (&s->V[edges[j][0]], &ed->V[0]) && + !compareVertex (&s->V[edges[j][1]], &ed->V[1])) || + (!compareVertex (&s->V[edges[j][0]], &ed->V[1]) && + !compareVertex (&s->V[edges[j][1]], &ed->V[0]))){ + s->VSUP[j] = v; + } + } + } +} + +void Degre2 (Tree_T * AllNodes, Tree_T * TreeNodes, Tree_T * TreeElm, + Curve * c, Surface * s){ + static Tree_T *TreeEdges = NULL; + + THES = s; + THEC = c; + THET = TreeNodes; + + if (!TreeEdges) + TreeEdges = Tree_Create (sizeof (Edge), compareedge); + + if (THES || THEC) + EdgesInVolume = 0; + + crEdges (TreeElm, TreeEdges); + Tree_Action (TreeEdges, PutMiddlePoint); + EdgesInVolume = 1; +} diff --git a/Mesh/Simplex.cpp b/Mesh/Simplex.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c35f0c763c7003af04061172c2f89666734e0d1d --- /dev/null +++ b/Mesh/Simplex.cpp @@ -0,0 +1,763 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Geo.h" +#include "Mesh.h" +#include "Simplex.h" +#include "Numeric.h" + +int Simplex::TotalAllocated = 0; +int Simplex::TotalNumber = 0; + +extern Simplex MyNewBoundary; + +int FACE_DIMENSION = 2; + +Simplex::Simplex (){ + TotalAllocated++; + TotalNumber++; + VSUP = NULL; + V[0] = V[1] = V[2] = V[3] = NULL; + S[0] = S[1] = S[2] = S[3] = NULL; + iEnt = -1; + Quality = 0. ; + Num = TotalNumber; +} + +Simplex::Simplex (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4){ + TotalAllocated++; + TotalNumber++; + VSUP = NULL; + S[0] = S[1] = S[2] = S[3] = NULL; + Quality = 0. ; + Fourre_Simplexe (v1, v2, v3, v4); + Num = TotalNumber; + iEnt = -1; +} + +Simplex::~Simplex (){ + TotalAllocated--; +} + +int Simplex:: CircumCircle (double x1, double y1, + double x2, double y2, + double x3, double y3, + double *xc, double *yc){ + double d, a1, a2, a3; + + d = 2. * (double) (y1 * (x2 - x3) + y2 * (x3 - x1) + y3 * (x1 - x2)); + if (d == 0.0){ + *xc = *yc = -99999.; + Msg(WARNING, "Degenerated Simplex"); + return 0; + } + + a1 = x1 * x1 + y1 * y1; + a2 = x2 * x2 + y2 * y2; + a3 = x3 * x3 + y3 * y3; + *xc = (double) ((a1 * (y3 - y2) + a2 * (y1 - y3) + a3 * (y2 - y1)) / d); + *yc = (double) ((a1 * (x2 - x3) + a2 * (x3 - x1) + a3 * (x1 - x2)) / d); + + return 1; +} + +void Simplex::Center_Circum (){ + /* Calcul du centre de la boule circonscrite */ + int i, N; + double X[4], Y[4], Z[4]; + double res[3]; + + if (!V[3]) + N = 3; + else + N = 4; + + for (i = 0; i < N; i++){ + X[i] = V[i]->Pos.X; + Y[i] = V[i]->Pos.Y; + Z[i] = V[i]->Pos.Z; + } + + if (N == 3){ + CircumCircle (V[0]->Pos.X, V[0]->Pos.Y, + V[1]->Pos.X, V[1]->Pos.Y, + V[2]->Pos.X, V[2]->Pos.Y, + &Center.X, &Center.Y); + Center.Z = 0.0; + if (fabs (Center.X) > 1.e10) + Center.X = 1.e10; + if (fabs (Center.Y) > 1.e10) + Center.Y = 1.e10; + Radius = sqrt ((X[0] - Center.X) * (X[0] - Center.X) + + (Y[0] - Center.Y) * (Y[0] - Center.Y)); + } + else{ + center_tet (X, Y, Z, res); + + Center.X = res[0]; + Center.Y = res[1]; + Center.Z = res[2]; + Radius = sqrt ((X[0] - Center.X) * (X[0] - Center.X) + + (Y[0] - Center.Y) * (Y[0] - Center.Y) + + (Z[0] - Center.Z) * (Z[0] - Center.Z)); + } +} + +int Simplex::Pt_In_Ellipsis (Vertex * v, double Metric[3][3]){ + double eps, d1, d2, x[2]; + + Center_Ellipsum_2D (Metric); + + x[0] = Center.X - v->Pos.X; + x[1] = Center.Y - v->Pos.Y; + + d1 = Radius; + d2 = sqrt (x[0] * x[0] * Metric[0][0] + + x[1] * x[1] * Metric[1][1] + + 2. * x[0] * x[1] * Metric[0][1]); + + eps = fabs (d1 - d2) / (d1 + d2); + if (eps < 1.e-12) + { + return (1); + } + if (d2 < d1) + return 1; + return 0; + +} + +double Simplex::Volume_Simplexe2D (){ + return ((V[1]->Pos.X - V[0]->Pos.X) * + (V[2]->Pos.Y - V[1]->Pos.Y) - + (V[2]->Pos.X - V[1]->Pos.X) * + (V[1]->Pos.Y - V[0]->Pos.Y)); +} + +void Simplex::center_tet (double X[4], double Y[4], double Z[4], double res[3]){ + double mat[3][3], b[3], dum; + int i; + b[0] = X[1] * X[1] - X[0] * X[0] + + Y[1] * Y[1] - Y[0] * Y[0] + + Z[1] * Z[1] - Z[0] * Z[0]; + b[1] = X[2] * X[2] - X[1] * X[1] + + Y[2] * Y[2] - Y[1] * Y[1] + + Z[2] * Z[2] - Z[1] * Z[1]; + b[2] = X[3] * X[3] - X[2] * X[2] + + Y[3] * Y[3] - Y[2] * Y[2] + + Z[3] * Z[3] - Z[2] * Z[2]; + + for (i = 0; i < 3; i++) + b[i] *= 0.5; + + mat[0][0] = X[1] - X[0]; + mat[0][1] = Y[1] - Y[0]; + mat[0][2] = Z[1] - Z[0]; + mat[1][0] = X[2] - X[1]; + mat[1][1] = Y[2] - Y[1]; + mat[1][2] = Z[2] - Z[1]; + mat[2][0] = X[3] - X[2]; + mat[2][1] = Y[3] - Y[2]; + mat[2][2] = Z[3] - Z[2]; + + if (!sys3x3 (mat, b, res, &dum)) + { + res[0] = res[1] = res[2] = 10.0e10; + } + +} + +double Simplex::matsimpl (double mat[3][3]){ + mat[0][0] = V[1]->Pos.X - V[0]->Pos.X; + mat[0][1] = V[2]->Pos.X - V[0]->Pos.X; + mat[0][2] = V[3]->Pos.X - V[0]->Pos.X; + mat[1][0] = V[1]->Pos.Y - V[0]->Pos.Y; + mat[1][1] = V[2]->Pos.Y - V[0]->Pos.Y; + mat[1][2] = V[3]->Pos.Y - V[0]->Pos.Y; + mat[2][0] = V[1]->Pos.Z - V[0]->Pos.Z; + mat[2][1] = V[2]->Pos.Z - V[0]->Pos.Z; + mat[2][2] = V[3]->Pos.Z - V[0]->Pos.Z; + return (mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) - + mat[1][0] * (mat[0][1] * mat[2][2] - mat[2][1] * mat[0][2]) + + mat[2][0] * (mat[0][1] * mat[1][2] - mat[1][1] * mat[0][2])); +} + +double Simplex::rhoin (){ + double s1, s2, s3, s4; + if (V[3]){ + s1 = fabs (AireFace (F[0].V)); + s2 = fabs (AireFace (F[1].V)); + s3 = fabs (AireFace (F[2].V)); + s4 = fabs (AireFace (F[3].V)); + return 3. * fabs (Volume_Simplexe ()) / (s1 + s2 + s3 + s4); + } + else{ + return 1.0; + } +} + +double Simplex::lij (int i, int j){ + return sqrt (DSQR (V[i]->Pos.X - V[j]->Pos.X) + + DSQR (V[i]->Pos.Y - V[j]->Pos.Y) + + DSQR (V[i]->Pos.Z - V[j]->Pos.Z)); +} + +double Simplex::Volume_Simplexe (){ + double mat[3][3]; + + if (V[3]) + return (matsimpl (mat) / 6.); + else + return (surfsimpl ()); +} + +double Simplex::EtaShapeMeasure (){ + int i, j; + double lij2 = 0.0; + for (i = 0; i <= 3; i++){ + for (j = i + 1; j <= 3; j++){ + lij2 += DSQR (lij (i, j)); + } + } + return 12. * pow (9. * DSQR (fabs (Volume_Simplexe ())), 0.33333333) / (lij2); +} + +double Simplex::RhoShapeMeasure (){ + int i, j; + double minlij = 1.e25, maxlij = 0.0; + for (i = 0; i <= 3; i++){ + for (j = i + 1; j <= 3; j++){ + if (i != j){ + minlij = DMIN (minlij, fabs (lij (i, j))); + maxlij = DMAX (maxlij, fabs (lij (i, j))); + } + } + } + return minlij / maxlij; +} + +double Simplex::GammaShapeMeasure (){ + int i, j, N; + double maxlij = 0.0; + + if (V[3]) + N = 4; + else + N = 3; + + for (i = 0; i <= N - 1; i++){ + for (j = i + 1; j <= N - 1; j++){ + if (i != j) + maxlij = DMAX (maxlij, lij (i, j)); + } + } + return 12. * rhoin () / (sqrt (6.) * maxlij); +} + + +void Simplex::Fourre_Simplexe (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4){ + int i, N; + V[0] = v1; + V[1] = v2; + V[2] = v3; + V[3] = v4; + VSUP = NULL; + + if (!v3) { + F[0].V[0] = (v1->Num > v2->Num) ? v2 : v1; + F[0].V[1] = (v1->Num > v2->Num) ? v1 : v2; + F[0].V[2] = NULL; + return; + } + + F[0].V[0] = v1; + F[0].V[1] = v2; + F[0].V[2] = v3; + + F[1].V[0] = v1; + F[1].V[1] = v3; + F[1].V[2] = v4; + if (FACE_DIMENSION == 1){ + F[2].V[0] = v2; + F[2].V[1] = v3; + F[2].V[2] = v4; + + F[3].V[0] = v1; + F[3].V[1] = v2; + F[3].V[2] = v4; + } + else{ + F[2].V[0] = v1; + F[2].V[1] = v2; + F[2].V[2] = v4; + + F[3].V[0] = v2; + F[3].V[1] = v3; + F[3].V[2] = v4; + } + if (!v4){ + N = 3; + if (Volume_Simplexe2D () < 0.0){ + V[0] = v1; + V[1] = v3; + V[2] = v2; + } + if (FACE_DIMENSION == 1){ + //qsort(F[0].V,3,sizeof(Vertex*),compareVertex); + Center_Circum (); + Quality = (double) N *Radius / (V[0]->lc + V[1]->lc + V[2]->lc + + ((V[3]) ? V[3]->lc : 0.0)); + } + else{ + qsort (F[0].V, 3, sizeof (Vertex *), compareVertex); + return; + } + } + else{ + N = 4; + } + + Center_Circum (); + + Quality = (double) N *Radius / (V[0]->lc + V[1]->lc + V[2]->lc + + ((V[3]) ? V[3]->lc : 0.0)); + + /* + if(LOCAL != NULL){ + Quality = fabs(Radius) / Lc_XYZ(Center.X, Center.Y, Center.Z, LOCAL); + if(Quality < 0.) + Quality = N * Radius / (V[0]->lc + V[1]->lc + V[2]->lc + +((V[3])? V[3]->lc:0.0)); + } + */ + + for (i = 0; i < N; i++) + qsort (F[i].V, N - 1, sizeof (Vertex *), compareVertex); + + //qsort(F,N,sizeof(Face),compareFace); +} + +Simplex *Create_Simplex (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4){ + Simplex *s; + + s = new Simplex (v1, v2, v3, v4); + return s; +} + +Simplex *Create_Quadrangle (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4){ + Simplex *s; + /* pour eviter le reordonnement des noeuds */ + s = new Simplex (); + s->V[0] = v1 ; + s->V[1] = v2 ; + s->V[2] = v3 ; + s->V[3] = v4 ; + return s; +} + +int compareSimplex (const void *a, const void *b){ + Simplex **q, **w; + + /* Les simplexes sont definis une seule fois : + 1 pointeur par entite -> on compare les pointeurs */ + + q = (Simplex **) a; + w = (Simplex **) b; + //if((*q)->iEnt != (*w)->iEnt) return (*q)->iEnt - (*w)->iEnt; + return ((*q)->Num - (*w)->Num); +} + +int Simplex::Pt_In_Simplexe (Vertex * v, double uvw[3], double tol){ + double mat[3][3]; + double b[3], det, dum; + + det = matsimpl (mat); + b[0] = v->Pos.X - V[0]->Pos.X; + b[1] = v->Pos.Y - V[0]->Pos.Y; + b[2] = v->Pos.Z - V[0]->Pos.Z; + + sys3x3 (mat, b, uvw, &dum); + if (uvw[0] >= -tol && uvw[1] >= -tol && uvw[2] >= -tol && + uvw[0] <= 1. + tol && uvw[1] <= 1. + tol && uvw[2] <= 1. + tol && + 1. - uvw[0] - uvw[1] - uvw[2] > -tol) + { + return (1); + } + return (0); +} + +void Simplex::Center_Ellipsum_2D (double m[3][3]){ + double sys[2][2], x[2]; + double rhs[2], a, b, d; + double x1, y1, x2, y2, x3, y3; + + x1 = V[0]->Pos.X; + y1 = V[0]->Pos.Y; + x2 = V[1]->Pos.X; + y2 = V[1]->Pos.Y; + x3 = V[2]->Pos.X; + y3 = V[2]->Pos.Y; + + a = m[0][0]; + b = 0.5 * (m[0][1] + m[1][0]); + d = m[1][1]; + + sys[0][0] = 2. * a * (x1 - x2) + 2. * b * (y1 - y2); + sys[0][1] = 2. * d * (y1 - y2) + 2. * b * (x1 - x2); + sys[1][0] = 2. * a * (x1 - x3) + 2. * b * (y1 - y3); + sys[1][1] = 2. * d * (y1 - y3) + 2. * b * (x1 - x3); + + rhs[0] = a * (x1 * x1 - x2 * x2) + d * (y1 * y1 - y2 * y2) + 2. * b * (x1 * y1 - x2 * y2); + rhs[1] = a * (x1 * x1 - x3 * x3) + d * (y1 * y1 - y3 * y3) + 2. * b * (x1 * y1 - x3 * y3); + + sys2x2 (sys, rhs, x); + + Center.X = x[0]; + Center.Y = x[1]; + + Radius = sqrt ((x[0] - x1) * (x[0] - x1) * a + + (x[1] - y1) * (x[1] - y1) * d + + 2. * (x[0] - x1) * (x[1] - y1) * b); +} + +void Simplex::Center_Ellipsum_3D (double m[3][3]){ + double sys[3][3], x[3]; + double rhs[3], det; + double x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4; + + x1 = V[0]->Pos.X; + y1 = V[0]->Pos.Y; + z1 = V[0]->Pos.Z; + x2 = V[1]->Pos.X; + y2 = V[1]->Pos.Y; + z2 = V[1]->Pos.Z; + x3 = V[2]->Pos.X; + y3 = V[2]->Pos.Y; + z3 = V[2]->Pos.Z; + x4 = V[3]->Pos.X; + y4 = V[3]->Pos.Y; + z4 = V[3]->Pos.Z; + + sys[0][0] = 2. * m[0][0] * (x1 - x2) + 2. * m[1][0] * (y1 - y2) + 2. * m[2][0] * (z1 - z2); + sys[0][1] = 2. * m[0][1] * (x1 - x2) + 2. * m[1][1] * (y1 - y2) + 2. * m[2][1] * (z1 - z2); + sys[0][2] = 2. * m[0][2] * (x1 - x2) + 2. * m[1][2] * (y1 - y2) + 2. * m[2][2] * (z1 - z2); + + sys[1][0] = 2. * m[0][0] * (x1 - x3) + 2. * m[1][0] * (y1 - y3) + 2. * m[2][0] * (z1 - z3); + sys[1][1] = 2. * m[0][1] * (x1 - x3) + 2. * m[1][1] * (y1 - y3) + 2. * m[2][1] * (z1 - z3); + sys[1][2] = 2. * m[0][2] * (x1 - x3) + 2. * m[1][2] * (y1 - y3) + 2. * m[2][2] * (z1 - z3); + + sys[2][0] = 2. * m[0][0] * (x1 - x4) + 2. * m[1][0] * (y1 - y4) + 2. * m[2][0] * (z1 - z4); + sys[2][1] = 2. * m[0][1] * (x1 - x4) + 2. * m[1][1] * (y1 - y4) + 2. * m[2][1] * (z1 - z4); + sys[2][2] = 2. * m[0][2] * (x1 - x4) + 2. * m[1][2] * (y1 - y4) + 2. * m[2][2] * (z1 - z4); + + rhs[0] = m[0][0] * (x1 * x1 - x2 * x2) + + m[1][1] * (y1 * y1 - y2 * y2) + + m[2][2] * (z1 * z1 - z2 * z2) + + 2. * m[1][0] * (x1 * y1 - x2 * y2) + + 2. * m[2][0] * (x1 * z1 - x2 * z2) + + 2. * m[2][1] * (z1 * y1 - z2 * y2); + rhs[1] = m[0][0] * (x1 * x1 - x3 * x3) + + m[1][1] * (y1 * y1 - y3 * y3) + + m[2][2] * (z1 * z1 - z3 * z3) + + 2. * m[1][0] * (x1 * y1 - x3 * y3) + + 2. * m[2][0] * (x1 * z1 - x3 * z3) + + 2. * m[2][1] * (z1 * y1 - z3 * y3); + rhs[2] = m[0][0] * (x1 * x1 - x4 * x4) + + m[1][1] * (y1 * y1 - y4 * y4) + + m[2][2] * (z1 * z1 - z4 * z4) + + 2. * m[1][0] * (x1 * y1 - x4 * y4) + + 2. * m[2][0] * (x1 * z1 - x4 * z4) + + 2. * m[2][1] * (z1 * y1 - z4 * y4); + + sys3x3 (sys, rhs, x, &det); + + Center.X = x[0]; + Center.Y = x[1]; + Center.Z = x[2]; + + Radius = sqrt ((x[0] - x1) * (x[0] - x1) * m[0][0] + + (x[1] - y1) * (x[1] - y1) * m[1][1] + + (x[2] - z1) * (x[2] - z1) * m[2][2] + + 2. * (x[0] - x1) * (x[1] - y1) * m[0][1] + + 2. * (x[0] - x1) * (x[2] - z1) * m[0][2] + + 2. * (x[1] - y1) * (x[2] - z1) * m[1][2] + ); +} + + +int Simplex::Pt_In_Simplex_2D (Vertex * v){ + double Xmin, Xmax, Ymin, Ymax, Xtr[4], Ytr[4], A[2], B[2], X, Y, Signus[3]; + int i; + + X = v->Pos.X; + Y = v->Pos.Y; + Xtr[0] = Xmax = Xmin = V[0]->Pos.X; + Xtr[3] = V[0]->Pos.X; + Xtr[1] = V[1]->Pos.X; + Xtr[2] = V[2]->Pos.X; + Ytr[0] = Ymax = Ymin = V[0]->Pos.Y; + Ytr[3] = V[0]->Pos.Y; + Ytr[1] = V[1]->Pos.Y; + Ytr[2] = V[2]->Pos.Y; + + for (i = 1; i < 3; i++){ + Xmin = (Xtr[i] < Xmin) ? Xtr[i] : Xmin; + Xmax = (Xtr[i] > Xmax) ? Xtr[i] : Xmax; + Ymin = (Ytr[i] < Ymin) ? Ytr[i] : Ymin; + Ymax = (Ytr[i] > Ymax) ? Ytr[i] : Ymax; + } + + if (X > Xmax || X < Xmin || Y > Ymax || Y < Ymin) + return (0); + + for (i = 0; i < 3; i++){ + A[0] = Xtr[i + 1] - Xtr[i]; + A[1] = Ytr[i + 1] - Ytr[i]; + B[0] = X - Xtr[i]; + B[1] = Y - Ytr[i]; + Signus[i] = A[0] * B[1] - A[1] * B[0]; + } + for (i = 0; i < 2; i++){ + if ((Signus[i] * Signus[i + 1]) < 0) + return 0; + } + return 1; +} + +void Simplex::ExportLcField (FILE * f){ + if (!V[3]){ + fprintf (f, "ST(%f,%f,%f,%f,%f,%f,%f,%f,%f){%12.5E,%12.5E,%12.5E};\n" + ,V[0]->Pos.X, V[0]->Pos.Y, V[0]->Pos.Z + ,V[1]->Pos.X, V[1]->Pos.Y, V[1]->Pos.Z + ,V[2]->Pos.X, V[2]->Pos.Y, V[2]->Pos.Z + ,V[0]->lc, V[1]->lc, V[2]->lc); + } + else{ + fprintf (f, "SS(%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f){%12.5E,%12.5E,%12.5E,%12.5E};\n" + ,V[0]->Pos.X, V[0]->Pos.Y, V[0]->Pos.Z + ,V[1]->Pos.X, V[1]->Pos.Y, V[1]->Pos.Z + ,V[2]->Pos.X, V[2]->Pos.Y, V[2]->Pos.Z + ,V[3]->Pos.X, V[3]->Pos.Y, V[3]->Pos.Z + ,V[0]->lc, V[1]->lc, V[2]->lc, V[3]->lc); + } + +} + +double Simplex::AireFace (Vertex * V[3]){ + double a[3], b[3], c[3]; + + a[0] = V[2]->Pos.X - V[1]->Pos.X; + a[1] = V[2]->Pos.Y - V[1]->Pos.Y; + a[2] = V[2]->Pos.Z - V[1]->Pos.Z; + + b[0] = V[0]->Pos.X - V[1]->Pos.X; + b[1] = V[0]->Pos.Y - V[1]->Pos.Y; + b[2] = V[0]->Pos.Z - V[1]->Pos.Z; + + prodve (a, b, c); + return (0.5 * sqrt (c[0] * c[0] + c[1] * c[1] + c[2] * c[2])); +} + +double Simplex::surfsimpl (){ + return AireFace (V); +} + +bool Simplex::VertexIn (Vertex * v){ + if (!this || this == &MyNewBoundary) + return false; + int N = 4; + if (!V[3]) + N = 3; + for (int i = 0; i < N; i++) + if (!compareVertex (&V[i], &v)) + return true; + return false; +} + +bool Simplex::EdgeIn (Vertex * v1, Vertex * v2, Vertex * v[2]){ + if (!this || this == &MyNewBoundary) + return false; + int N = 4; + if (!V[3]) + N = 3; + int n = 0; + for (int i = 0; i < N; i++){ + if (compareVertex (&V[i], &v1) && compareVertex (&V[i], &v2)){ + v[n++] = V[i]; + if (n > 2) + return false; + } + } + return true; +} + +bool Simplex::ExtractOppositeEdges (int iFac, Vertex * p[2], Vertex * q[2]){ + Simplex *s1 = this; + if (!s1 || s1 == &MyNewBoundary || !s1->iEnt) + return false; + Simplex *s2 = s1->S[iFac]; + if (!s2 || s2 == &MyNewBoundary || !s2->iEnt) + return false; + int i, ip = 0, iq = 0; + + for (i = 0; i < 3; i++) + if (s1->VertexIn (s2->V[i])) + p[ip++] = s2->V[i]; + else + q[iq++] = s2->V[i]; + + for (i = 0; i < 3; i++) + if (!s2->VertexIn (s1->V[i])) + q[iq++] = s1->V[i]; + + if (ip != 2 || iq != 2){ + return false; + } + return true; +} + +bool Simplex::SwapEdge (int iFac){ + Simplex *s1 = NULL, *s2 = NULL, *s11 = NULL, *s21 = NULL; + Vertex *p[4] = {NULL, NULL, NULL, NULL}; + Vertex *q[4] = {NULL, NULL, NULL, NULL}; + int i, ip, iq; + + s1 = this; + if (!s1 || s1 == &MyNewBoundary || !s1->iEnt) + return false; + s2 = s1->S[iFac]; + if (!s2 || s2 == &MyNewBoundary || !s2->iEnt) + return false; + ip = iq = 0; + + for (i = 0; i < 3; i++) + if (s1->VertexIn (s2->V[i])) + p[ip++] = s2->V[i]; + else + q[iq++] = s2->V[i]; + + for (i = 0; i < 3; i++) + if (!s2->VertexIn (s1->V[i])) + q[iq++] = s1->V[i]; + + if (ip != 2 || iq != 2){ + return false; + } + + for (i = 0; i < 3; i++) + if (s1->S[i]->VertexIn (p[1]) && s1->S[i]->VertexIn (q[1])) + s11 = s1->S[i]; + + for (i = 0; i < 3; i++) + if (s2->S[i]->VertexIn (p[0]) && s2->S[i]->VertexIn (q[0])) + s21 = s2->S[i]; + + if (!s11 || !s21) + return false; + + double vol1 = s1->Volume_Simplexe () + s2->Volume_Simplexe (); + + s1->V[0] = p[0]; + s1->V[1] = q[0]; + s1->V[2] = q[1]; + s2->V[0] = p[1]; + s2->V[1] = q[0]; + s2->V[2] = q[1]; + + double vol2 = s1->Volume_Simplexe () + s2->Volume_Simplexe (); + + if (s1->Volume_Simplexe () == 0.0 || s2->Volume_Simplexe () == 0.0 || + fabs (fabs (vol1) - fabs (vol2)) > 1.e-5 * (fabs (vol1) + fabs (vol2))){ + s1->V[0] = p[0]; + s1->V[1] = p[1]; + s1->V[2] = q[1]; + s2->V[0] = p[0]; + s2->V[1] = p[1]; + s2->V[2] = q[0]; + return false; + } + + for (i = 0; i < 3; i++) + if (s1->S[i] == s11) + s1->S[i] = s21; + for (i = 0; i < 3; i++) + if (s2->S[i] == s21) + s2->S[i] = s11; + + if (s21 != &MyNewBoundary && s21 && s21->iEnt) + for (i = 0; i < 3; i++) + if (s21->S[i] == s2) + s21->S[i] = s1; + if (s11 != &MyNewBoundary && s11 && s11->iEnt) + for (i = 0; i < 3; i++) + if (s11->S[i] == s1) + s11->S[i] = s2; + return true; +} + + +bool Simplex::SwapFace (int iFac, List_T * newsimp, List_T * delsimp){ + Simplex *s = S[iFac], *s1, *s2, *s3; + Vertex *o[2]; + int i; + + if (!s || s == &MyNewBoundary || !s->iEnt) + return false; + if (!this || this == &MyNewBoundary || !this->iEnt) + return false; + + for (i = 0; i < 4; i++) + if (!VertexIn (s->V[i])) + o[0] = s->V[i]; + for (i = 0; i < 4; i++) + if (!s->VertexIn (V[i])) + o[1] = V[i]; + + s1 = Create_Simplex (s->F[iFac].V[0], s->F[iFac].V[1], o[0], o[1]); + s2 = Create_Simplex (s->F[iFac].V[1], s->F[iFac].V[2], o[0], o[1]); + s3 = Create_Simplex (s->F[iFac].V[2], s->F[iFac].V[0], o[0], o[1]); + + double vol1 = s->Volume_Simplexe () + Volume_Simplexe (); + double vol2 = s1->Volume_Simplexe () + s2->Volume_Simplexe () + s3->Volume_Simplexe (); + + if (fabs (fabs (vol1) - fabs (vol2)) > 1.e-5 * (fabs (vol1) + fabs (vol2))){ + delete s1; + delete s2; + delete s3; + return false; + } + + double gamma1 = GammaShapeMeasure (); + + if (s1->GammaShapeMeasure () < gamma1 || + s2->GammaShapeMeasure () < gamma1 || + s3->GammaShapeMeasure () < gamma1) + return false; + + return true; +} + +int compareFace (const void *a, const void *b){ + Face *q, *w; + + q = (Face *) a; + w = (Face *) b; + if (q->V[0]->Num > w->V[0]->Num) + return (1); + if (q->V[0]->Num < w->V[0]->Num) + return (-1); + + if (q->V[1]->Num > w->V[1]->Num) + return (1); + if (q->V[1]->Num < w->V[1]->Num) + return (-1); + + if (FACE_DIMENSION == 1 || !q->V[2] || !w->V[2]) + return 0; + + if (q->V[2]->Num > w->V[2]->Num) + return (1); + if (q->V[2]->Num < w->V[2]->Num) + return (-1); + return (0); +} diff --git a/Mesh/Simplex.h b/Mesh/Simplex.h new file mode 100644 index 0000000000000000000000000000000000000000..40bdf703c92726f40d01340281d2cfe705e325d0 --- /dev/null +++ b/Mesh/Simplex.h @@ -0,0 +1,63 @@ +#ifndef _SIMPLEX_GMSH_ +#define _SIMPLEX_GMSH_ +#include <stdio.h> +#include <iostream.h> +#include <stddef.h> +#include <math.h> +#include <stdlib.h> +#include "Vertex.h" + +typedef struct { + Vertex *V[3]; +}Face; + +class Simplex +{ + public: + int Num; /* Numero */ + int iEnt; /* Entite geometrique */ + Face F[4]; /* 4 faces */ + Vertex **VSUP; /* noeuds supplem pour les elts de degre eleves */ + Vertex *V[4]; /* 4 noeuds */ + double Quality; /* Qualite du simplexe */ + Coord Center; /* centre du CC */ + double Radius; /* Rayon du CC */ + Simplex *S[4]; /* 4 Voisins */ + static int TotalNumber; + static int TotalAllocated; + Simplex(); + ~Simplex(); + Simplex(Vertex *v1, Vertex *v2, Vertex *v3, Vertex *v4); + void Fourre_Simplexe(Vertex *v1, Vertex *v2, Vertex *v3, Vertex *v4); + int Pt_In_Simplexe (Vertex *v, double uvw[3], double tol); + int Pt_In_Simplex_2D(Vertex *v); + void Center_Circum(); + double Volume_Simplexe (); + double matsimpl(double mat[3][3]); + void center_tet(double X[4],double Y[4], double Z[4], double res[3]); + double AireFace (Vertex *V[3]); + double surfsimpl(); + int CircumCircle(double x1,double y1,double x2,double y2,double x3,double y3, + double *xc,double *yc); + double Volume_Simplexe2D(); + void Center_Ellipsum_2D (double m[3][3]); + int Pt_In_Ellipsis (Vertex *v,double m[3][3]); + bool VertexIn(Vertex *v); + bool EdgeIn(Vertex *v1, Vertex *v2, Vertex *v[2]); + bool SwapEdge (int iFac); + bool SwapFace (int iFac, List_T *newsimp, List_T *delsimp); + bool ExtractOppositeEdges ( int iFac, Vertex *p[2], Vertex *q[2]); + void ExportLcField (FILE *f); + void Center_Ellipsum_3D (double m[3][3]); + double GammaShapeMeasure (); + double RhoShapeMeasure (); + double EtaShapeMeasure (); + double lij (int i, int j); + double rhoin (); +}; +int compareSimplex(const void *a, const void *b); +Simplex *Create_Simplex (Vertex *v1, Vertex *v2, Vertex *v3, Vertex *v4); +Simplex *Create_Quadrangle (Vertex *v1, Vertex *v2, Vertex *v3, Vertex *v4); +int compareFace (const void *a, const void *b); + +#endif diff --git a/Mesh/Smoothing.cpp b/Mesh/Smoothing.cpp new file mode 100644 index 0000000000000000000000000000000000000000..14883f1e6d86c2d5ea3f06d2f4544d9d2448507a --- /dev/null +++ b/Mesh/Smoothing.cpp @@ -0,0 +1,168 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" + + +void AmelioreSurface_EliminationTripet (Surface * surf, Mesh * m, Tree_T * tnxe){ + int i, j, k; + List_T *lnxe = Tree2List (tnxe); + Vertex *v1, *v2, *v3; + List_T *ListNoeuds = List_Create (2, 1, sizeof (Vertex *)); + Simplex *s[3], *news; + NXE nxe; + bool ok; + + for (i = 0; i < List_Nbr (lnxe); i++){ + List_Read (lnxe, i, &nxe); + if (List_Nbr (nxe.Liste) == 3){ + ok = true; + if (nxe.v->ListCurves) + ok = false; + else{ + for (j = 0; j < 3; j++){ + List_Read (nxe.Liste, j, &s[j]); + if (!Tree_Search (surf->Simplexes, &s[j])) + ok = false; + for (k = 0; k < 3; k++) + if (compareVertex (&nxe.v, &s[j]->V[k])) + List_Insert (ListNoeuds, &s[j]->V[k], compareVertex); + } + } + if (ok){ + List_Read (ListNoeuds, 0, &v1); + List_Read (ListNoeuds, 1, &v2); + List_Read (ListNoeuds, 2, &v3); + news = Create_Simplex (v1, v2, v3, 0); + Tree_Suppress (surf->Simplexes, &s[0]); + Tree_Suppress (surf->Simplexes, &s[1]); + Tree_Suppress (surf->Simplexes, &s[2]); + Tree_Suppress (m->Vertices, &nxe.v); + Tree_Add (surf->Simplexes, &news); + } + List_Reset (ListNoeuds); + } + } + List_Delete (ListNoeuds); + List_Delete (lnxe); +} + + +void ActionLiss (void *data, void *dummy){ + static int deb = 1; + static List_T *nodes; + + NXE *pnxe; + Simplex *s; + double X, Y, Z, Sum; + int i, j; + + if (deb){ + deb = 0; + nodes = List_Create (2, 2, sizeof (Vertex *)); + } + List_Reset (nodes); + pnxe = (NXE *) data; + + /* On Ne Lisse Point Les Points sur les courbes (quelle horreur) */ + if (pnxe->v->ListCurves) + return; + + X = Y = Z = Sum = 0.0; + double volume_before = 0.0; + double min_quality_old = 1.0; + for (i = 0; i < List_Nbr (pnxe->Liste); i++){ + List_Read (pnxe->Liste, i, &s); + min_quality_old = DMIN (min_quality_old, s->GammaShapeMeasure ()); + volume_before += s->Volume_Simplexe (); + /* On Ne Lisse Point Les Points sur les surfaces quand les volumes sont mailles */ + if (s->V[3] && pnxe->v->ListSurf) + return; + for (j = 0; j < 4; j++){ + if (s->V[j] && compareVertex (&pnxe->v, &s->V[j])){ + Sum += 0.5; + X += s->V[j]->Pos.X * 0.5; + Y += s->V[j]->Pos.Y * 0.5; + Z += s->V[j]->Pos.Z * 0.5; + } + } + } + + double xold = pnxe->v->Pos.X; + double yold = pnxe->v->Pos.Y; + double zold = pnxe->v->Pos.Z; + double a = 0.5; + + if (Sum != 0.0){ + pnxe->v->Pos.X = a * (X / Sum) + (1. - a) * pnxe->v->Pos.X; + pnxe->v->Pos.Y = a * (Y / Sum) + (1. - a) * pnxe->v->Pos.Y; + pnxe->v->Pos.Z = a * (Z / Sum) + (1. - a) * pnxe->v->Pos.Z; + } + + double min_quality_new = 1.0; + for (i = 0; i < List_Nbr (pnxe->Liste); i++){ + List_Read (pnxe->Liste, i, &s); + min_quality_new = DMIN (min_quality_new, s->GammaShapeMeasure ()); + } + + double volume_after = 0.0; + for (i = 0; i < List_Nbr (pnxe->Liste); i++){ + List_Read (pnxe->Liste, i, &s); + volume_after += s->Volume_Simplexe (); + } + if (fabs (volume_after - volume_before) > 1.e-8 * fabs (volume_after + volume_before) + || min_quality_old > min_quality_new){ + pnxe->v->Pos.X = xold; + pnxe->v->Pos.Y = yold; + pnxe->v->Pos.Z = zold; + } + +} + + +void ActionLissSurf (void *data, void *dummy){ + NXE *pnxe; + Simplex *s; + double X, Y, Z, Sum; + int i, j; + + pnxe = (NXE *) data; + + /* + On Ne Lisse Point Les Points sur les courbes + */ + if (pnxe->v->ListCurves) + return; + + X = Y = Z = Sum = 0.0; + for (i = 0; i < List_Nbr (pnxe->Liste); i++){ + List_Read (pnxe->Liste, i, &s); + /* + On Ne Lisse Point Les Points sur les surfaces quand les + volumes sont mailles + */ + for (j = 0; j < 4; j++){ + if (s->V[j] && compareVertex (&pnxe->v, &s->V[j])){ + Sum += 0.5; + X += s->V[j]->Pos.X * 0.5; + Y += s->V[j]->Pos.Y * 0.5; + Z += s->V[j]->Pos.Z * 0.5; + } + } + } + if (Sum != 0.0){ + pnxe->v->Pos.X = X / Sum; + pnxe->v->Pos.Y = Y / Sum; + pnxe->v->Pos.Z = Z / Sum; + } +} + +void RandomSwapEdges (Surface * s){ + int i; + List_T *AllTrg = Tree2List (s->Simplexes); + Simplex *t; + for (i = 0; i < List_Nbr (AllTrg); i++){ + List_Read (AllTrg, i, &t); + t->SwapEdge (1); + } +} diff --git a/Mesh/SwapEdge.cpp b/Mesh/SwapEdge.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fdbe76273a0c69a80ffc5edde7e9717a71f67081 --- /dev/null +++ b/Mesh/SwapEdge.cpp @@ -0,0 +1,303 @@ + +#include "Gmsh.h" +#include "Const.h" +#include "Mesh.h" +#include "SwapPatterns.h" + +extern Simplex MyNewBoundary; +extern int edges_tetra[6][2]; + + +int TrouveCoquille (Simplex * s, Vertex * Ed[2], + List_T * Coquille, Tree_T * TreeSimpl, + Vertex * Contour[100]){ + Simplex *stack[256], *actual; + Vertex *other[2]; + int K, i, N = 0; + List_T *Edges = List_Create (12, 2, sizeof (Edge)); + Edge E; + + stack[N++] = s; + + while (N > 0){ + actual = stack[--N]; + if (!Tree_Search (TreeSimpl, &actual)){ + Tree_Add (TreeSimpl, &actual); + if (actual->EdgeIn (Ed[0], Ed[1], other)){ + List_Add (Coquille, &actual); + if (actual != s) + actual->Radius = -1.; + E.V[0] = other[0]; + E.V[1] = other[1]; + List_Add (Edges, &E); + for (i = 0; i < 4; i++){ + if (actual->S[i] && actual->S[i] != &MyNewBoundary) + stack[N++] = actual->S[i]; + else + return 0; + } + } + } + } + + List_Read (Edges, 0, &E); + N = 0; + Contour[N++] = E.V[0]; + Contour[N++] = E.V[1]; + List_Suppress (Edges, &E, compareedge); + K = 0; + + while (List_Nbr (Edges)){ + if (K++ > Tree_Nbr (TreeSimpl)) + return 0; + for (i = 0; i < List_Nbr (Edges); i++){ + List_Read (Edges, i, &E); + if (!compareVertex (&Contour[N - 1], &E.V[0]) && + compareVertex (&Contour[N - 2], &E.V[1])){ + Contour[N++] = E.V[1]; + List_Suppress (Edges, &E, compareedge); + break; + } + if (!compareVertex (&Contour[N - 1], &E.V[1]) && + compareVertex (&Contour[N - 2], &E.V[0])){ + Contour[N++] = E.V[0]; + List_Suppress (Edges, &E, compareedge); + break; + } + } + + } + if (!compareVertex (&Contour[0], &Contour[N - 1])) + return N - 1; + return 0; +} + +bool FindBestPattern (int N, Vertex * Contour[100], Vertex * Ed[2], + List_T * Coquille, List_T * Pattern){ + int i, j, k, kk, tri[3]; + Simplex *s, *Pat[100]; + double old_volume, new_volume; + double worst_tet_old, worst_tet_new; + bool stop = false; + SwapPattern *sp = NULL; + SwapPattern3 *x3; + SwapPattern4 *x4; + SwapPattern5 *x5; + SwapPattern6 *x6; + SwapPattern7 *x7; + SwapPatternN *xN; + switch (N){ + case 3: + x3 = new SwapPattern3; + sp = x3; + break; + case 4: + x4 = new SwapPattern4; + sp = x4; + break; + case 5: + if (stop) + return false; + x5 = new SwapPattern5; + sp = x5; + break; + case 6: + if (stop) + return false; + x6 = new SwapPattern6; + sp = x6; + break; + case 7: + if (stop) + return false; + x7 = new SwapPattern7; + sp = x7; + break; + default: + if (stop) + return false; + xN = new SwapPatternN (N); + sp = xN; + break; + } + + old_volume = 0.0; + worst_tet_old = 1.; + int IENT; + for (k = 0; k < List_Nbr (Coquille); k++){ + List_Read (Coquille, k, &s); + IENT = s->iEnt; + old_volume += fabs (s->Volume_Simplexe ()); + worst_tet_old = DMIN (worst_tet_old, s->GammaShapeMeasure ()); + } + + for (i = 0; i < sp->GetNbPatterns (); i++){ + for (j = 0; j < sp->GetNbRotations (i); j++){ + new_volume = 0.; + worst_tet_new = 1.; + kk = 0; + for (k = 0; k < sp->GetNbTriangles (); k++){ + sp->GetTriangle (i, k, tri); + s = Create_Simplex (Contour[tri[0]], + Contour[tri[1]], + Contour[tri[2]], + Ed[0]); + s->iEnt = IENT; + Pat[kk++] = s; + new_volume += fabs (s->Volume_Simplexe ()); + worst_tet_new = DMIN (worst_tet_new, s->GammaShapeMeasure ()); + s = Create_Simplex (Contour[tri[0]], + Contour[tri[1]], + Contour[tri[2]], + Ed[1]); + s->iEnt = IENT; + Pat[kk++] = s; + new_volume += fabs (s->Volume_Simplexe ()); + worst_tet_new = DMIN (worst_tet_new, s->GammaShapeMeasure ()); + } + if (fabs (new_volume - old_volume) > 1.e-5 * fabs (new_volume + old_volume)) + Msg(INFO, "Edge swapping failed"); + if (fabs (new_volume - old_volume) > 1.e-5 * fabs (new_volume + old_volume) + || worst_tet_new < worst_tet_old){ + for (k = 0; k < 2 * sp->GetNbTriangles (); k++){ + delete Pat[k]; + } + } + else{ + for (k = 0; k < List_Nbr (Pattern); k++){ + List_Read (Pattern, k, &s); + delete s; + } + List_Reset (Pattern); + for (k = 0; k < 2 * sp->GetNbTriangles (); k++){ + List_Add (Pattern, &Pat[k]); + } + worst_tet_old = worst_tet_new; + } + } + } + + delete sp; + return true ; +} + + +bool SwapEdge (Mesh * M, Volume * v, Simplex * s, int iEdge){ + int i; + Vertex *Contour[100]; + Vertex *Ed[2]; + Simplex *simp; + Tree_T *TreeSimpl = Tree_Create (sizeof (Simplex *), compareSimplex); + List_T *Coquille = List_Create (10, 10, sizeof (Simplex *)); + Ed[0] = s->V[edges_tetra[iEdge][0]]; + Ed[1] = s->V[edges_tetra[iEdge][1]]; + int N = TrouveCoquille (s, Ed, Coquille, TreeSimpl, Contour); + + List_T *Pattern = List_Create (2 * N - 4, 1, sizeof (Simplex *)); + + FindBestPattern (N, Contour, Ed, Coquille, Pattern); + + if (List_Nbr (Pattern)){ + for (i = 0; i < List_Nbr (Coquille); i++){ + List_Read (Coquille, i, &simp); + Tree_Suppress (v->Simplexes, &simp); + Tree_Suppress (TreeSimpl, &simp); + } + for (i = 0; i < List_Nbr (Pattern); i++){ + List_Read (Pattern, i, &simp); + Tree_Add (v->Simplexes, &simp); + Tree_Add (TreeSimpl, &simp); + } + Link_Simplexes (NULL, TreeSimpl /*v->Simplexes */ ); + } + Tree_Delete (TreeSimpl); + List_Delete (Coquille); + List_Delete (Pattern); + return true ; +} + +int GetWorstEdge (Simplex * s, EdgesContainer & ec, bool order){ + Vertex *v11, *v12; + Vertex *v21, *v22; + v11 = s->V[edges_tetra[0][0]]; + v12 = s->V[edges_tetra[0][1]]; + v21 = s->V[edges_tetra[4][0]]; + v22 = s->V[edges_tetra[4][1]]; + Vertex d11 = *(v12) - *(v11); + Vertex d12 = *(v22) - *(v21); + d12.norme (); + d11.norme (); + double prosc1 = fabs (d11 * d12); + + v11 = s->V[edges_tetra[1][0]]; + v12 = s->V[edges_tetra[1][1]]; + v21 = s->V[edges_tetra[3][0]]; + v22 = s->V[edges_tetra[3][1]]; + Vertex d21 = *(v12) - *(v11); + Vertex d22 = *(v22) - *(v21); + d22.norme (); + d21.norme (); + double prosc2 = fabs (d21 * d22); + + v11 = s->V[edges_tetra[2][0]]; + v12 = s->V[edges_tetra[2][1]]; + v21 = s->V[edges_tetra[5][0]]; + v22 = s->V[edges_tetra[5][1]]; + Vertex d31 = *(v12) - *(v11); + Vertex d32 = *(v22) - *(v21); + d32.norme (); + d31.norme (); + double prosc3 = fabs (d31 * d32); + + if (prosc1 < prosc2 && prosc1 < prosc3){ + if (!order && !ec.Search (s->V[edges_tetra[0][0]], s->V[edges_tetra[0][1]])) + return 0; + if (!ec.Search (s->V[edges_tetra[4][0]], s->V[edges_tetra[4][1]])) + return 4; + if (!ec.Search (s->V[edges_tetra[0][0]], s->V[edges_tetra[0][1]])) + return 0; + return -1; + } + if (prosc2 < prosc1 && prosc2 < prosc3){ + if (!order && !ec.Search (s->V[edges_tetra[1][0]], s->V[edges_tetra[1][1]])) + return 1; + if (!ec.Search (s->V[edges_tetra[3][0]], s->V[edges_tetra[3][1]])) + return 3; + if (!ec.Search (s->V[edges_tetra[1][0]], s->V[edges_tetra[1][1]])) + return 1; + return -1; + } + if (prosc3 < prosc2 && prosc3 < prosc1){ + if (!order && !ec.Search (s->V[edges_tetra[2][0]], s->V[edges_tetra[2][1]])) + return 2; + if (!ec.Search (s->V[edges_tetra[5][0]], s->V[edges_tetra[5][1]])) + return 5; + if (!ec.Search (s->V[edges_tetra[2][0]], s->V[edges_tetra[2][1]])) + return 2; + return -1; + } + return -1; +} + +void SwapEdges3D (Mesh * M, Volume * v, double GammaPrescribed, bool order){ + List_T *list = Tree2List (v->Simplexes); + List_T *srfs = Tree2List (M->Surfaces); + if (!List_Nbr (srfs)) + return; + EdgesContainer ec (srfs); + Simplex *s; + Progress (102); + for (int i = 0; i < List_Nbr (list); i++){ + if (i % 100 == 1) + Progress ((100 * i) / List_Nbr (list)); + List_Read (list, i, &s); + if (s->GammaShapeMeasure () < GammaPrescribed){ + int iEdge = GetWorstEdge (s, ec, order); + if (iEdge >= 0) + SwapEdge (M, v, s, iEdge); + } + } + Progress (-1); + List_Delete (srfs); + List_Delete (list); +} diff --git a/Mesh/SwapPatterns.h b/Mesh/SwapPatterns.h new file mode 100644 index 0000000000000000000000000000000000000000..db379bdf2b670add6bc229b8cc3342952d7f83b5 --- /dev/null +++ b/Mesh/SwapPatterns.h @@ -0,0 +1,203 @@ +#ifndef _SWAP_PATTERNS_H_ +#define _SWAP_PATTERNS_H_ + +int swap_patterns_3 [1][1][3] = { + { + {0,1,2} + } +}; + +int swap_patterns_4 [1][2][3] = { + { + {0,1,3}, + {1,2,3} + } +}; + +int swap_patterns_5 [1][3][3] = { + { + {0,1,2}, + {0,2,4}, + {2,3,4} + } +}; + +int swap_patterns_6 [4][4][3] = { + { + {0,1,2}, + {0,2,5}, + {5,2,4}, + {4,2,3} + }, + { + {0,1,2}, + {0,2,3}, + {5,2,3}, + {5,3,4} + }, + { + {0,1,5}, + {5,1,2}, + {5,2,4}, + {4,2,3} + }, + { + {0,1,2}, + {4,0,2}, + {4,2,3}, + {0,4,5} + } +}; + +int swap_patterns_7 [6][5][3] = { + { + {0,1,3}, + {1,2,3}, + {0,3,6}, + {6,3,5}, + {5,3,4} + }, + { + {0,1,3}, + {1,2,3}, + {0,3,4}, + {0,4,6}, + {6,4,5} + }, + { + {0,1,3}, + {1,2,3}, + {0,3,6}, + {6,3,4}, + {6,4,5} + }, + { + {0,1,2}, + {0,2,3}, + {0,3,6}, + {6,3,5}, + {5,3,4} + }, + { + {0,1,6}, + {1,2,3}, + {6,1,3}, + {6,3,5}, + {5,3,4} + }, + { + {0,1,3}, + {1,2,3}, + {0,3,5}, + {5,3,4}, + {0,5,6} + } +}; + + +class SwapPattern{ +protected : + int NbPatterns; + int NbNod; + int Rot; + virtual void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3])=0; +public : + SwapPattern(){Rot = 0;} + int GetNbPatterns() {return NbPatterns;} + virtual int GetNbRotations(int iPattern) = 0; + int GetNbTriangles(){return NbNod-2;} + void GetTriangle(int iPattern, int iTriangle,int tri[3]){ + GetTriangleWithoutRot(iPattern,iTriangle,tri); + for(int i=0;i<3;i++){ + tri[i] = (tri[i]+Rot)%NbNod; + } + } + void Rotate (){Rot++;}; +}; + +class SwapPattern3 : public SwapPattern{ + void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){ + tri[0] = swap_patterns_3[iPattern][iTriangle][0]; + tri[1] = swap_patterns_3[iPattern][iTriangle][1]; + tri[2] = swap_patterns_3[iPattern][iTriangle][2]; + } +public : + SwapPattern3(){NbPatterns = 1;NbNod = 3;} + int GetNbRotations (int iPattern){ + return 1; + }; +}; + +class SwapPattern4 : public SwapPattern{ + void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){ + tri[0] = swap_patterns_4[iPattern][iTriangle][0]; + tri[1] = swap_patterns_4[iPattern][iTriangle][1]; + tri[2] = swap_patterns_4[iPattern][iTriangle][2]; + } +public : + SwapPattern4(){NbPatterns = 1;NbNod = 4;} + int GetNbRotations (int iPattern){ + return 2; + }; +}; + +class SwapPattern5 : public SwapPattern{ + void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){ + tri[0] = swap_patterns_5[iPattern][iTriangle][0]; + tri[1] = swap_patterns_5[iPattern][iTriangle][1]; + tri[2] = swap_patterns_5[iPattern][iTriangle][2]; + } +public : + SwapPattern5(){NbPatterns = 1;NbNod = 5;} + int GetNbRotations (int iPattern){ + return 5; + }; +}; + +class SwapPattern6 : public SwapPattern{ + void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){ + tri[0] = swap_patterns_6[iPattern][iTriangle][0]; + tri[1] = swap_patterns_6[iPattern][iTriangle][1]; + tri[2] = swap_patterns_6[iPattern][iTriangle][2]; + } +public : + SwapPattern6(){NbPatterns = 4;NbNod = 6;} + int GetNbRotations (int iPattern){ + switch(iPattern){ + case 0:return 6; + case 1:return 3; + case 2:return 3; + case 3:return 2; + default: return 0; + } + } +}; + +class SwapPattern7 : public SwapPattern{ + void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){ + tri[0] = swap_patterns_7[iPattern][iTriangle][0]; + tri[1] = swap_patterns_7[iPattern][iTriangle][1]; + tri[2] = swap_patterns_7[iPattern][iTriangle][2]; + } +public : + SwapPattern7(){NbPatterns = 6;NbNod = 7;} + int GetNbRotations (int iPattern){ + return 7; + } +}; + +class SwapPatternN : public SwapPattern{ + void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){ + tri[0] = 0; + tri[1] = iTriangle+1; + tri[2] = iTriangle+2; + } +public : + SwapPatternN(int N){NbPatterns = 1;NbNod = N;} + int GetNbRotations (int iPattern){ + return 8; + } +}; + + +#endif diff --git a/Mesh/Vertex.cpp b/Mesh/Vertex.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e3a04a1abab0e86cc6696382447d87ff099a4fb8 --- /dev/null +++ b/Mesh/Vertex.cpp @@ -0,0 +1,120 @@ +#include "Vertex.h" +#include <stddef.h> +#include <stdlib.h> +#include <math.h> + +Vertex::Vertex (){ + Frozen = 0; + Pos.X = 0.0; + Pos.Y = 0.0; + Pos.Z = 0.0; + lc = 1.0; + Mov = NULL; + ListSurf = ListCurves = Extruded_Points = NULL; +} + +Vertex::Vertex (double X, double Y, double Z, double l, double W){ + Frozen = 0; + Pos.X = X; + Pos.Y = Y; + Pos.Z = Z; + w = W; + lc = l; + Mov = NULL; + ListSurf = ListCurves = Extruded_Points = NULL; +} + +void Vertex::norme (){ + double d = sqrt (Pos.X * Pos.X + Pos.Y * Pos.Y + Pos.Z * Pos.Z); + if (d == 0.0) + return; + Pos.X /= d; + Pos.Y /= d; + Pos.Z /= d; +} + + +Vertex Vertex::operator + (const Vertex & other){ + return Vertex (Pos.X + other.Pos.X, Pos.Y + + other.Pos.Y, Pos.Z + other.Pos.Z, lc, w); +} + +Vertex Vertex::operator - (const Vertex & other){ + return Vertex (Pos.X - other.Pos.X, Pos.Y - + other.Pos.Y, Pos.Z - other.Pos.Z, lc, w); +} + +Vertex Vertex::operator / (double d){ + return Vertex (Pos.X / d, Pos.Y / d, Pos.Z / d, lc, w); +} +Vertex Vertex::operator * (double d){ + return Vertex (Pos.X * d, Pos.Y * d, Pos.Z * d, lc, w); +} + +Vertex Vertex::operator % (Vertex & autre){ // cross product + return Vertex (Pos.Y * autre.Pos.Z - Pos.Z * autre.Pos.Y, + -(Pos.X * autre.Pos.Z - Pos.Z * autre.Pos.X), + Pos.X * autre.Pos.Y - Pos.Y * autre.Pos.X, lc, w); +} + +double Vertex::operator * (const Vertex & other){ + return Pos.X * other.Pos.X + Pos.Y * other.Pos.Y + Pos.Z * other.Pos.Z; +} + +Vertex *Create_Vertex (int Num, double X, double Y, double Z, double lc, double u){ + Vertex *pV; + + pV = new Vertex (X, Y, Z, lc); + pV->w = 1.0; + pV->Num = Num; + pV->u = u; + return pV; +} + +int compareVertex (const void *a, const void *b){ + int i, j; + Vertex **q, **w; + + q = (Vertex **) a; + w = (Vertex **) b; + i = abs ((*q)->Num); + j = abs ((*w)->Num); + + return (i - j); +} + +int comparePosition (const void *a, const void *b){ + int i, j; + Vertex **q, **w; + extern double LC; + double eps = 1.e-6 * LC; + + q = (Vertex **) a; + w = (Vertex **) b; + i = ((*q)->Num); + j = ((*w)->Num); + + if ((*q)->Pos.X - (*w)->Pos.X > eps) + return (1); + if ((*q)->Pos.X - (*w)->Pos.X < -eps) + return (-1); + if ((*q)->Pos.Y - (*w)->Pos.Y > eps) + return (1); + if ((*q)->Pos.Y - (*w)->Pos.Y < -eps) + return (-1); + if ((*q)->Pos.Z - (*w)->Pos.Z > eps) + return (1); + if ((*q)->Pos.Z - (*w)->Pos.Z < -eps) + return (-1); + + if (i != j){ + /* + *w = *q; + printf("Les points %d et %d sont a la meme position\n",i,j); + printf("%12.5E %12.5E %12.5E\n",(*w)->Pos.X,(*w)->Pos.Y,(*w)->Pos.Z); + printf("%12.5E %12.5E %12.5E\n",(*q)->Pos.X,(*q)->Pos.Y,(*q)->Pos.Z); + */ + } + return 0; + +} diff --git a/Mesh/Vertex.h b/Mesh/Vertex.h new file mode 100644 index 0000000000000000000000000000000000000000..831b16735b85c311832ab399cc05a877df313ea4 --- /dev/null +++ b/Mesh/Vertex.h @@ -0,0 +1,43 @@ +/* + Classe de Points (Vertex) + premiere classe de gmsh + pas d'encapsulation a priori + mais peut-etre dans la suite +*/ + +#ifndef _VERTEX_H_ +#define _VERTEX_H_ + +#include "List.h" + +typedef struct { + double X,Y,Z; +}Coord; + +class Vertex { + public : + int Num; + int Frozen; + double lc,u,us[3],w; + Coord Pos; + Coord *Mov; + Coord Freeze; + List_T *ListSurf; + List_T *ListCurves; + List_T *Extruded_Points; + Vertex (); + Vertex (double x,double y,double z =0.0, double lc = 1.0, double w = 1.0); + Vertex operator + ( const Vertex &other); + Vertex operator - ( const Vertex &other); + double operator * ( const Vertex &other); + Vertex operator * ( double d ); + Vertex operator / ( double d ); + Vertex operator % (Vertex &autre); // cross product + void norme(); +}; + +int compareVertex (const void *a, const void *b); +Vertex *Create_Vertex (int Num, double X, double Y, double Z, double lc, double u); +int comparePosition (const void *a, const void *b); + +#endif diff --git a/Parser/Gmsh.l b/Parser/Gmsh.l new file mode 100644 index 0000000000000000000000000000000000000000..222fb5b797f8bec0c20d33c6b9e7a0c4ae2df26a --- /dev/null +++ b/Parser/Gmsh.l @@ -0,0 +1,293 @@ +%{ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#include "Gmsh.h" +#include "Geo.h" +#include "CAD.h" +#include "Gmsh.tab.cpp.h" + +char TmpString[1024]; +int yywhere = INFILE; +int yylineno = 1; + +void parsestring(char endchar); +char *strsave(char *ptr); +void skipcomments(void); +void skipline(void); + +#define YY_ALWAYS_INTERACTIVE 1 + +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ){ \ + buf[n++] = (char) c; \ + yylineno++; \ + } \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); + +%} + +alpha [a-zA-Z\_] +dieze [\#] +special [\.] +digit [0-9] +exp [Ee][-+]?{digit}+ +string {alpha}({alpha}|{digit})* +stepid {dieze}({digit})* + +%e 2000 +%p 7000 +%n 2000 +%k 1500 +%a 7000 +%o 7000 + +%% + +[\ \t\n] /* none */ ; +[;] return tEND; + +"/*" skipcomments(); +"//" skipline(); +"\"" {parsestring('\"'); return tBIGSTR;} +"\'" {parsestring('\''); return tBIGSTR;} +"newreg" {yylval.d = NEWREG(); return tDOUBLE;} +"newp" {yylval.d = NEWPOINT(); return tDOUBLE;} +"=" return tAFFECT; +"..." return tDOTS; + + +ACos return tAcos ; +ArcCos return tAcos ; +Asin return tAsin; +ArcSin return tAsin; +Atan return tAtan ; +ArcTan return tAtan ; +Atan2 return tAtan2 ; +ArcTan2 return tAtan2 ; +Association return tAssociation; +Attractor return tAttractor; + +Bump return tBump; +BSpline return tBSpline; +Bounds return tBounds; + +Ceil return tCeil ; +Cosh return tCosh ; +Cos return tCos ; +Characteristic return tCharacteristic; +Circle return tCircle; +Coherence return tCoherence; +Complex return tComplex; +Color return tColor; +CatmullRom return tSpline; + +Delete return tDelete; +Dilate return tDilate; +Duplicata return tDuplicata; + +Exp return tExp ; +Ellipsis return tEllipsis; +Extrude return tExtrude; +Elliptic return tElliptic; +ELLIPSE return tELLIPSE; + +Fabs return tFabs ; +Floor return tFloor ; +Fmod return tFmod ; + +General return tGeneral; +Geometry return tGeometry; + +Hypot return tHypot ; + +Include return tInclude; + +Knots return tKnots; + +Length return tLength; +Line return tLine; +Loop return tLoop; +Log return tLog ; +Log10 return tLog10 ; +Layers return tLayers; + +Mesh return tMesh; +Modulo return tModulo ; + +Nurbs return tNurbs; + +Offset return tOffset; +Order return tOrder; + +Physical return tPhysical; +Pi return tPi; +Plane return tPlane; +Point return tPoint; +Power return tPower; +Progression return tProgression; +Parametric return tParametric; + +Recombine return tRecombine; +Rotate return tRotate; +Ruled return tRuled; + +Sqrt return tSqrt ; +Sin return tSin ; +Sinh return tSinh ; +Save return tPhysical; +Spline return tSpline; +Surface return tSurface; +Symetry return tSymetry; + +Transfinite return tTransfinite; +Translate return tTranslate; +Tanh return tTanh ; +Tan return tTan; +Trimmed return tTrimmed; + +Using return tUsing; + +View return tView; +Volume return tVolume; + +With return tWith; + + +SS return tScalarSimplex; +VS return tVectorSimplex; +TS return tTensorSimplex; +ST return tScalarTriangle; +VT return tVectorTriangle; +TT return tTensorTriangle; +SL return tScalarLine; +VL return tVectorLine; +TL return tTensorLine; +SP return tScalarPoint; +VP return tVectorPoint; +TP return tTensorPoint; + + +CARTESIAN_POINT return tCARTESIAN_POINT; +B_SPLINE_SURFACE_WITH_KNOTS return tB_SPLINE_SURFACE_WITH_KNOTS; +B_SPLINE_CURVE_WITH_KNOTS return tB_SPLINE_CURVE_WITH_KNOTS; +.UNSPECIFIED. return tUNSPECIFIED; +.CONTINUOUS. return tCONTINUOUS; +".F." return tFALSE; +".T." return tTRUE; +".U." return tU; +".V." return tV; +ORIENTED_EDGE return tORIENTED_EDGE; +EDGE_CURVE return tEDGE_CURVE; +EDGE_LOOP return tEDGE_LOOP; +VERTEX_POINT return tVERTEX_POINT; +FACE_OUTER_BOUND return tFACE_OUTER_BOUND; +FACE_BOUND return tFACE_BOUND; +ADVANCED_FACE return tADVANCED_FACE; +LINE return tLine; +VECTOR return tVECTOR; +DIRECTION return tDIRECTION; +AXIS2_PLACEMENT_3D return tAXIS2_PLACEMENT_3D; +PLANE return tPLANE; +HEADER return tHEADER; +DATA return tDATA; +FILE_SCHEMA return tFILE_SCHEMA; +FILE_NAME return tFILE_NAME; +FILE_DESCRIPTION return tFILE_DESCRIPTION; +"ISO-10303-21" return tISO; +"END-ISO-10303-21" return tENDISO; +ENDSEC return tENDSEC; +CLOSED_SHELL return tCLOSED_SHELL; +ADVANCED_BREP_SHAPE_REPRESENTATION return tADVANCED_BREP_SHAPE_REPRESENTATION; +MANIFOLD_SOLID_BREP return tMANIFOLD_SOLID_BREP; +CYLINDRICAL_SURFACE return tCYLINDRICAL_SURFACE; +CONICAL_SURFACE return tCONICAL_SURFACE; +TOROIDAL_SURFACE return tTOROIDAL_SURFACE; +CIRCLE return tCIRCLE; +TRIMMED_CURVE return tTRIMMED_CURVE; +GEOMETRIC_SET return tGEOMETRIC_SET; +COMPOSITE_CURVE_SEGMENT return tCOMPOSITE_CURVE_SEGMENT; +COMPOSITE_CURVE return tCOMPOSITE_CURVE; +PRODUCT_DEFINITION return tPRODUCT_DEFINITION; +PRODUCT_DEFINITION_SHAPE return tPRODUCT_DEFINITION_SHAPE; +SHAPE_DEFINITION_REPRESENTATION return tSHAPE_DEFINITION_REPRESENTATION; + +vertex return tVertex; +facet return tFacet; +normal return tNormal; +outer return tOuter; +loop return tLoopSTL; +endloop return tEndLoop; +endfacet return tEndFacet; +endsolid {skipline();return tEndSolid;} +solid {skipline();return tSolid;} + +{stepid} {yylval.d = (double)atoi((char*)(yytext+1)); return tDOUBLE;} + +{digit}+ | +{digit}+"."{digit}*({exp})? | +{digit}*"."{digit}+({exp})? | +{digit}+{exp} {yylval.d = atof((char *)yytext); return tDOUBLE;} + +{string} {yylval.c = strsave((char*)yytext); return tSTRING;} + +. return yytext[0]; + +%% + +#undef yywrap + +int yywrap() {return 1;} + +void skipcomments(void) { + int c; + + while (1) { + while ((c=yyinput()) != '*'){ + if(c == EOF) { + fprintf(stderr, "Error: End of File in Commented Region\n") ; + exit(1); + } + } + if ((c = yyinput()) == '/') + return; + unput(c); + } +} + +void parsestring(char endchar){ + int c, i; + + c = yyinput(); + i = 0; + while (c != endchar) { + TmpString[i++] = c; + c = yyinput(); + } + TmpString[i++] = '\0'; + yylval.c = strsave(TmpString); +} + +char *strsave(char *ptr){ + return((char*)strcpy((char*)malloc(strlen(ptr)+1),ptr)); +} + +void skipline(void) +{ + while (yyinput() != '\n') ; +} + diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6831e1452840358e79820ab9f0f6183e37c5dac6 --- /dev/null +++ b/Parser/Gmsh.tab.cpp @@ -0,0 +1,3702 @@ + +/* A Bison parser, made from Gmsh.y + by GNU Bison version 1.28 */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define tDOUBLE 257 +#define tSTRING 258 +#define tBIGSTR 259 +#define tEND 260 +#define tAFFECT 261 +#define tDOTS 262 +#define tPi 263 +#define tExp 264 +#define tLog 265 +#define tLog10 266 +#define tSqrt 267 +#define tSin 268 +#define tAsin 269 +#define tCos 270 +#define tAcos 271 +#define tTan 272 +#define tAtan 273 +#define tAtan2 274 +#define tSinh 275 +#define tCosh 276 +#define tTanh 277 +#define tFabs 278 +#define tFloor 279 +#define tCeil 280 +#define tFmod 281 +#define tModulo 282 +#define tHypot 283 +#define tPoint 284 +#define tCircle 285 +#define tEllipsis 286 +#define tLine 287 +#define tSurface 288 +#define tSpline 289 +#define tVolume 290 +#define tCharacteristic 291 +#define tLength 292 +#define tParametric 293 +#define tElliptic 294 +#define tPlane 295 +#define tRuled 296 +#define tTransfinite 297 +#define tComplex 298 +#define tPhysical 299 +#define tUsing 300 +#define tPower 301 +#define tBump 302 +#define tProgression 303 +#define tAssociation 304 +#define tRotate 305 +#define tTranslate 306 +#define tSymetry 307 +#define tDilate 308 +#define tExtrude 309 +#define tDuplicata 310 +#define tLoop 311 +#define tInclude 312 +#define tRecombine 313 +#define tDelete 314 +#define tCoherence 315 +#define tView 316 +#define tOffset 317 +#define tAttractor 318 +#define tLayers 319 +#define tScalarSimplex 320 +#define tVectorSimplex 321 +#define tTensorSimplex 322 +#define tScalarTriangle 323 +#define tVectorTriangle 324 +#define tTensorTriangle 325 +#define tScalarLine 326 +#define tVectorLine 327 +#define tTensorLine 328 +#define tScalarPoint 329 +#define tVectorPoint 330 +#define tTensorPoint 331 +#define tBSpline 332 +#define tNurbs 333 +#define tOrder 334 +#define tWith 335 +#define tBounds 336 +#define tKnots 337 +#define tColor 338 +#define tGeneral 339 +#define tGeometry 340 +#define tMesh 341 +#define tB_SPLINE_SURFACE_WITH_KNOTS 342 +#define tB_SPLINE_CURVE_WITH_KNOTS 343 +#define tCARTESIAN_POINT 344 +#define tTRUE 345 +#define tFALSE 346 +#define tUNSPECIFIED 347 +#define tU 348 +#define tV 349 +#define tEDGE_CURVE 350 +#define tVERTEX_POINT 351 +#define tORIENTED_EDGE 352 +#define tPLANE 353 +#define tFACE_OUTER_BOUND 354 +#define tEDGE_LOOP 355 +#define tADVANCED_FACE 356 +#define tVECTOR 357 +#define tDIRECTION 358 +#define tAXIS2_PLACEMENT_3D 359 +#define tISO 360 +#define tENDISO 361 +#define tENDSEC 362 +#define tDATA 363 +#define tHEADER 364 +#define tFILE_DESCRIPTION 365 +#define tFILE_SCHEMA 366 +#define tFILE_NAME 367 +#define tMANIFOLD_SOLID_BREP 368 +#define tCLOSED_SHELL 369 +#define tADVANCED_BREP_SHAPE_REPRESENTATION 370 +#define tFACE_BOUND 371 +#define tCYLINDRICAL_SURFACE 372 +#define tCONICAL_SURFACE 373 +#define tCIRCLE 374 +#define tTRIMMED_CURVE 375 +#define tGEOMETRIC_SET 376 +#define tCOMPOSITE_CURVE_SEGMENT 377 +#define tCONTINUOUS 378 +#define tCOMPOSITE_CURVE 379 +#define tTOROIDAL_SURFACE 380 +#define tPRODUCT_DEFINITION 381 +#define tPRODUCT_DEFINITION_SHAPE 382 +#define tSHAPE_DEFINITION_REPRESENTATION 383 +#define tELLIPSE 384 +#define tTrimmed 385 +#define tSolid 386 +#define tEndSolid 387 +#define tVertex 388 +#define tFacet 389 +#define tNormal 390 +#define tOuter 391 +#define tLoopSTL 392 +#define tEndLoop 393 +#define tEndFacet 394 +#define UMINUS 395 + +#line 1 "Gmsh.y" + +#include <stdarg.h> + +#include "Gmsh.h" +#include "Const.h" +#include "Context.h" +#include "Geo.h" +#include "CAD.h" +#include "DataBase.h" +#include "Mesh.h" +#include "Create.h" +#include "Views.h" +#include "StepGeomDatabase.h" +#include "Colors.h" +#include "Parser.h" + +extern Mesh *THEM; +extern char ThePathForIncludes[NAME_STR_L]; + +FILE *yyinTab[20]; +int yylinenoTab[20]; +char yynameTab[20][256]; +char tmpstring[256]; +Symbol TheSymbol; +Surface *STL_Surf; +Shape TheShape; +unsigned int *ptr ; +int i,j,k,flag,RecursionLevel=0,Loop[4]; +double d; +ExtrudeParams extr; +List_T *Symbol_L; +List_T *ListOfDouble_L,*ListOfDouble2_L; +List_T *ListOfListOfDouble_L; +StringXPointer *ColorField ; + +void yyerror (char *s); +void vyyerror (char *fmt, ...); +int Get_ColorForString(StringX4Int SX4I[], int alpha, + char * string, int * FlagError); +void Get_ColorPointerForString(StringXPointer SXP[], char * string, + int * FlagError, unsigned int **Pointer); + + +#line 45 "Gmsh.y" +typedef union { + char *c; + int i; + double d; + double v[5]; + Shape s; + List_T *l; +} YYSTYPE; +#include <stdio.h> + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 1273 +#define YYFLAG -32768 +#define YYNTBASE 157 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 395 ? yytranslate[x] : 213) + +static const short yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 147, 2, 2, 150, + 152, 145, 143, 151, 144, 2, 146, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 141, + 2, 142, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 155, 2, 156, 149, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 153, 2, 154, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 148 +}; + +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 2, 4, 6, 8, 30, 32, 33, 36, 38, + 40, 42, 45, 48, 51, 54, 57, 60, 68, 74, + 92, 102, 126, 158, 174, 186, 198, 214, 224, 238, + 248, 260, 274, 284, 294, 306, 316, 328, 338, 350, + 364, 378, 390, 404, 422, 432, 444, 456, 470, 482, + 492, 493, 496, 498, 500, 502, 504, 506, 508, 510, + 512, 514, 516, 518, 521, 528, 537, 538, 541, 544, + 547, 550, 553, 556, 559, 562, 565, 568, 571, 574, + 603, 632, 661, 684, 707, 730, 747, 764, 781, 792, + 803, 814, 819, 827, 836, 849, 856, 862, 870, 878, + 891, 899, 909, 927, 935, 944, 953, 959, 967, 979, + 988, 998, 1007, 1030, 1051, 1060, 1069, 1075, 1084, 1092, + 1101, 1109, 1121, 1129, 1139, 1141, 1143, 1145, 1146, 1149, + 1154, 1159, 1163, 1171, 1180, 1192, 1205, 1218, 1227, 1240, + 1249, 1261, 1277, 1279, 1282, 1292, 1299, 1309, 1319, 1329, + 1338, 1347, 1356, 1363, 1368, 1377, 1380, 1385, 1386, 1389, + 1390, 1396, 1397, 1403, 1404, 1410, 1411, 1414, 1419, 1428, + 1433, 1443, 1451, 1453, 1455, 1457, 1459, 1461, 1463, 1467, + 1471, 1475, 1479, 1483, 1487, 1490, 1493, 1498, 1503, 1508, + 1513, 1518, 1523, 1528, 1533, 1538, 1543, 1550, 1555, 1560, + 1565, 1570, 1575, 1580, 1587, 1594, 1601, 1603, 1605, 1607, + 1611, 1618, 1630, 1640, 1648, 1656, 1657, 1661, 1663, 1667, + 1668, 1672, 1676, 1678, 1682, 1683, 1685, 1689, 1691, 1693, + 1697 +}; + +static const short yyrhs[] = { 164, + 0, 159, 0, 158, 0, 132, 0, 135, 136, 3, + 3, 3, 137, 138, 134, 3, 3, 3, 134, 3, + 3, 3, 134, 3, 3, 3, 139, 140, 0, 133, + 0, 0, 159, 160, 0, 161, 0, 163, 0, 162, + 0, 1, 6, 0, 106, 6, 0, 107, 6, 0, + 109, 6, 0, 108, 6, 0, 110, 6, 0, 111, + 150, 207, 151, 5, 152, 6, 0, 112, 150, 207, + 152, 6, 0, 113, 150, 5, 151, 5, 151, 207, + 151, 207, 151, 5, 151, 5, 151, 5, 152, 6, + 0, 3, 7, 90, 150, 5, 151, 206, 152, 6, + 0, 3, 7, 89, 150, 5, 151, 203, 151, 211, + 151, 202, 151, 202, 151, 202, 151, 211, 151, 211, + 151, 202, 152, 6, 0, 3, 7, 88, 150, 5, + 151, 203, 151, 203, 151, 209, 151, 202, 151, 202, + 151, 202, 151, 202, 151, 211, 151, 211, 151, 211, + 151, 211, 151, 202, 152, 6, 0, 3, 7, 96, + 150, 5, 151, 3, 151, 3, 151, 3, 151, 202, + 152, 6, 0, 3, 7, 100, 150, 5, 151, 3, + 151, 202, 152, 6, 0, 3, 7, 117, 150, 5, + 151, 3, 151, 202, 152, 6, 0, 3, 7, 98, + 150, 5, 151, 145, 151, 145, 151, 203, 151, 202, + 152, 6, 0, 3, 7, 101, 150, 5, 151, 211, + 152, 6, 0, 3, 7, 102, 150, 5, 151, 211, + 151, 3, 151, 202, 152, 6, 0, 3, 7, 97, + 150, 5, 151, 3, 152, 6, 0, 3, 7, 103, + 150, 5, 151, 3, 151, 203, 152, 6, 0, 3, + 7, 105, 150, 5, 151, 3, 151, 3, 151, 3, + 152, 6, 0, 3, 7, 104, 150, 5, 151, 206, + 152, 6, 0, 3, 7, 99, 150, 5, 151, 3, + 152, 6, 0, 3, 7, 33, 150, 5, 151, 3, + 151, 3, 152, 6, 0, 3, 7, 115, 150, 5, + 151, 211, 152, 6, 0, 3, 7, 116, 150, 5, + 151, 211, 151, 3, 152, 6, 0, 3, 7, 114, + 150, 5, 151, 3, 152, 6, 0, 3, 7, 118, + 150, 5, 151, 3, 151, 203, 152, 6, 0, 3, + 7, 119, 150, 5, 151, 3, 151, 203, 151, 203, + 152, 6, 0, 3, 7, 126, 150, 5, 151, 3, + 151, 203, 151, 203, 152, 6, 0, 3, 7, 120, + 150, 5, 151, 3, 151, 203, 152, 6, 0, 3, + 7, 130, 150, 5, 151, 3, 151, 203, 151, 203, + 152, 6, 0, 3, 7, 121, 150, 5, 151, 3, + 151, 211, 151, 211, 151, 202, 151, 202, 152, 6, + 0, 3, 7, 122, 150, 5, 151, 211, 152, 6, + 0, 3, 7, 123, 150, 124, 151, 202, 151, 3, + 152, 6, 0, 3, 7, 125, 150, 5, 151, 211, + 151, 202, 152, 6, 0, 3, 7, 127, 150, 5, + 151, 5, 151, 3, 151, 3, 152, 6, 0, 3, + 7, 128, 150, 5, 151, 5, 151, 3, 152, 6, + 0, 3, 7, 129, 150, 3, 151, 3, 152, 6, + 0, 0, 164, 165, 0, 166, 0, 180, 0, 181, + 0, 182, 0, 185, 0, 186, 0, 188, 0, 191, + 0, 192, 0, 187, 0, 193, 0, 1, 6, 0, + 62, 5, 153, 167, 154, 6, 0, 62, 5, 63, + 206, 153, 167, 154, 6, 0, 0, 167, 168, 0, + 167, 169, 0, 167, 170, 0, 167, 171, 0, 167, + 172, 0, 167, 173, 0, 167, 174, 0, 167, 175, + 0, 167, 176, 0, 167, 177, 0, 167, 178, 0, + 167, 179, 0, 66, 150, 203, 151, 203, 151, 203, + 151, 203, 151, 203, 151, 203, 151, 203, 151, 203, + 151, 203, 151, 203, 151, 203, 151, 203, 152, 211, + 6, 0, 67, 150, 203, 151, 203, 151, 203, 151, + 203, 151, 203, 151, 203, 151, 203, 151, 203, 151, + 203, 151, 203, 151, 203, 151, 203, 152, 211, 6, + 0, 68, 150, 203, 151, 203, 151, 203, 151, 203, + 151, 203, 151, 203, 151, 203, 151, 203, 151, 203, + 151, 203, 151, 203, 151, 203, 152, 211, 6, 0, + 69, 150, 203, 151, 203, 151, 203, 151, 203, 151, + 203, 151, 203, 151, 203, 151, 203, 151, 203, 152, + 211, 6, 0, 70, 150, 203, 151, 203, 151, 203, + 151, 203, 151, 203, 151, 203, 151, 203, 151, 203, + 151, 203, 152, 211, 6, 0, 71, 150, 203, 151, + 203, 151, 203, 151, 203, 151, 203, 151, 203, 151, + 203, 151, 203, 151, 203, 152, 211, 6, 0, 72, + 150, 203, 151, 203, 151, 203, 151, 203, 151, 203, + 151, 203, 152, 211, 6, 0, 73, 150, 203, 151, + 203, 151, 203, 151, 203, 151, 203, 151, 203, 152, + 211, 6, 0, 74, 150, 203, 151, 203, 151, 203, + 151, 203, 151, 203, 151, 203, 152, 211, 6, 0, + 75, 150, 203, 151, 203, 151, 203, 152, 211, 6, + 0, 76, 150, 203, 151, 203, 151, 203, 152, 211, + 6, 0, 77, 150, 203, 151, 203, 151, 203, 152, + 211, 6, 0, 4, 7, 203, 6, 0, 30, 150, + 203, 152, 7, 206, 6, 0, 45, 30, 150, 203, + 152, 7, 211, 6, 0, 64, 30, 150, 203, 151, + 203, 151, 203, 152, 7, 211, 6, 0, 37, 38, + 211, 7, 203, 6, 0, 30, 150, 203, 152, 6, + 0, 33, 150, 203, 152, 7, 211, 6, 0, 35, + 150, 203, 152, 7, 211, 6, 0, 64, 33, 150, + 203, 151, 203, 151, 203, 152, 7, 211, 6, 0, + 31, 150, 203, 152, 7, 211, 6, 0, 31, 150, + 203, 152, 7, 211, 41, 206, 6, 0, 39, 150, + 203, 152, 7, 150, 203, 151, 203, 151, 5, 151, + 5, 151, 5, 152, 6, 0, 32, 150, 203, 152, + 7, 211, 6, 0, 45, 33, 150, 203, 152, 7, + 211, 6, 0, 33, 57, 150, 203, 152, 7, 211, + 6, 0, 33, 150, 203, 152, 6, 0, 78, 150, + 203, 152, 7, 211, 6, 0, 79, 150, 203, 152, + 7, 211, 83, 211, 80, 203, 6, 0, 41, 34, + 150, 203, 152, 7, 211, 6, 0, 131, 34, 150, + 203, 152, 7, 203, 211, 6, 0, 42, 34, 150, + 203, 152, 7, 211, 6, 0, 79, 34, 81, 82, + 150, 203, 152, 7, 209, 83, 153, 211, 151, 211, + 154, 80, 153, 203, 151, 203, 154, 6, 0, 79, + 34, 150, 203, 152, 7, 209, 83, 153, 211, 151, + 211, 154, 80, 153, 203, 151, 203, 154, 6, 0, + 45, 34, 150, 203, 152, 7, 211, 6, 0, 34, + 57, 150, 203, 152, 7, 211, 6, 0, 34, 150, + 203, 152, 6, 0, 44, 36, 150, 203, 152, 7, + 211, 6, 0, 36, 150, 203, 152, 7, 211, 6, + 0, 45, 36, 150, 203, 152, 7, 211, 6, 0, + 52, 150, 206, 152, 153, 183, 154, 0, 51, 150, + 206, 151, 206, 151, 203, 152, 153, 183, 154, 0, + 53, 150, 206, 152, 153, 183, 154, 0, 54, 150, + 206, 151, 203, 152, 153, 183, 154, 0, 185, 0, + 184, 0, 182, 0, 0, 184, 181, 0, 56, 153, + 184, 154, 0, 60, 153, 184, 154, 0, 58, 5, + 6, 0, 55, 150, 203, 151, 206, 152, 6, 0, + 55, 34, 150, 203, 151, 206, 152, 6, 0, 55, + 150, 203, 151, 206, 151, 206, 151, 203, 152, 6, + 0, 55, 34, 150, 203, 151, 206, 151, 206, 151, + 203, 152, 6, 0, 55, 30, 150, 203, 151, 206, + 151, 206, 151, 203, 152, 6, 0, 55, 30, 150, + 203, 151, 206, 152, 6, 0, 55, 33, 150, 203, + 151, 206, 151, 206, 151, 203, 152, 6, 0, 55, + 33, 150, 203, 151, 206, 152, 6, 0, 55, 34, + 150, 203, 151, 206, 152, 153, 189, 154, 6, 0, + 55, 34, 150, 203, 151, 206, 151, 206, 151, 203, + 152, 153, 189, 154, 6, 0, 190, 0, 189, 190, + 0, 65, 153, 211, 151, 211, 151, 211, 154, 6, + 0, 43, 33, 211, 7, 203, 6, 0, 43, 33, + 211, 7, 203, 46, 47, 203, 6, 0, 43, 33, + 211, 7, 203, 46, 48, 203, 6, 0, 43, 33, + 211, 7, 203, 46, 49, 203, 6, 0, 43, 34, + 153, 203, 154, 7, 211, 6, 0, 40, 34, 153, + 203, 154, 7, 211, 6, 0, 43, 36, 153, 203, + 154, 7, 211, 6, 0, 59, 34, 211, 7, 203, + 6, 0, 59, 34, 211, 6, 0, 45, 50, 150, + 203, 152, 7, 211, 6, 0, 61, 6, 0, 84, + 153, 194, 154, 0, 0, 194, 195, 0, 0, 85, + 196, 153, 199, 154, 0, 0, 86, 197, 153, 199, + 154, 0, 0, 87, 198, 153, 199, 154, 0, 0, + 200, 199, 0, 4, 7, 4, 6, 0, 4, 7, + 153, 4, 151, 203, 154, 6, 0, 4, 7, 201, + 6, 0, 153, 203, 151, 203, 151, 203, 151, 203, + 154, 0, 153, 203, 151, 203, 151, 203, 154, 0, + 91, 0, 92, 0, 93, 0, 94, 0, 95, 0, + 204, 0, 150, 203, 152, 0, 203, 144, 203, 0, + 203, 143, 203, 0, 203, 145, 203, 0, 203, 146, + 203, 0, 203, 149, 203, 0, 144, 203, 0, 143, + 203, 0, 10, 150, 203, 152, 0, 11, 150, 203, + 152, 0, 12, 150, 203, 152, 0, 13, 150, 203, + 152, 0, 14, 150, 203, 152, 0, 15, 150, 203, + 152, 0, 16, 150, 203, 152, 0, 17, 150, 203, + 152, 0, 18, 150, 203, 152, 0, 19, 150, 203, + 152, 0, 20, 150, 203, 151, 203, 152, 0, 21, + 150, 203, 152, 0, 22, 150, 203, 152, 0, 23, + 150, 203, 152, 0, 24, 150, 203, 152, 0, 25, + 150, 203, 152, 0, 26, 150, 203, 152, 0, 27, + 150, 203, 151, 203, 152, 0, 28, 150, 203, 151, + 203, 152, 0, 29, 150, 203, 151, 203, 152, 0, + 3, 0, 9, 0, 4, 0, 203, 8, 203, 0, + 203, 8, 155, 203, 156, 203, 0, 153, 203, 151, + 203, 151, 203, 151, 203, 151, 203, 154, 0, 153, + 203, 151, 203, 151, 203, 151, 203, 154, 0, 153, + 203, 151, 203, 151, 203, 154, 0, 150, 203, 151, + 203, 151, 203, 152, 0, 0, 150, 208, 152, 0, + 5, 0, 208, 151, 5, 0, 0, 153, 210, 154, + 0, 150, 210, 152, 0, 211, 0, 210, 151, 211, + 0, 0, 203, 0, 153, 212, 154, 0, 203, 0, + 205, 0, 212, 151, 203, 0, 212, 151, 205, 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 104, 106, 107, 114, 122, 136, 148, 150, 153, 155, + 156, 157, 160, 166, 171, 172, 173, 176, 180, 183, + 189, 194, 200, 208, 213, 217, 223, 228, 232, 237, + 241, 244, 249, 253, 257, 261, 266, 270, 273, 277, + 281, 285, 289, 293, 297, 300, 304, 307, 311, 314, + 323, 325, 331, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 350, 355, 361, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 380, + 390, 400, 410, 419, 428, 437, 445, 453, 461, 468, + 475, 486, 500, 511, 517, 536, 547, 555, 561, 567, + 586, 592, 608, 615, 621, 627, 633, 642, 648, 668, + 674, 693, 712, 720, 726, 732, 738, 750, 756, 762, + 774, 780, 785, 790, 797, 799, 800, 803, 808, 819, + 837, 852, 883, 888, 892, 896, 900, 906, 911, 915, + 919, 924, 932, 936, 941, 965, 983, 1000, 1017, 1034, + 1054, 1073, 1092, 1107, 1122, 1133, 1144, 1148, 1150, 1153, + 1156, 1157, 1159, 1160, 1162, 1165, 1167, 1170, 1181, 1191, + 1201, 1209, 1285, 1287, 1288, 1289, 1290, 1293, 1295, 1296, + 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, + 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, + 1317, 1318, 1319, 1320, 1321, 1322, 1325, 1327, 1328, 1339, + 1346, 1359, 1368, 1376, 1384, 1394, 1398, 1403, 1407, 1412, + 1416, 1420, 1426, 1432, 1438, 1442, 1448, 1461, 1467, 1476, + 1480 +}; +#endif + + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","tDOUBLE", +"tSTRING","tBIGSTR","tEND","tAFFECT","tDOTS","tPi","tExp","tLog","tLog10","tSqrt", +"tSin","tAsin","tCos","tAcos","tTan","tAtan","tAtan2","tSinh","tCosh","tTanh", +"tFabs","tFloor","tCeil","tFmod","tModulo","tHypot","tPoint","tCircle","tEllipsis", +"tLine","tSurface","tSpline","tVolume","tCharacteristic","tLength","tParametric", +"tElliptic","tPlane","tRuled","tTransfinite","tComplex","tPhysical","tUsing", +"tPower","tBump","tProgression","tAssociation","tRotate","tTranslate","tSymetry", +"tDilate","tExtrude","tDuplicata","tLoop","tInclude","tRecombine","tDelete", +"tCoherence","tView","tOffset","tAttractor","tLayers","tScalarSimplex","tVectorSimplex", +"tTensorSimplex","tScalarTriangle","tVectorTriangle","tTensorTriangle","tScalarLine", +"tVectorLine","tTensorLine","tScalarPoint","tVectorPoint","tTensorPoint","tBSpline", +"tNurbs","tOrder","tWith","tBounds","tKnots","tColor","tGeneral","tGeometry", +"tMesh","tB_SPLINE_SURFACE_WITH_KNOTS","tB_SPLINE_CURVE_WITH_KNOTS","tCARTESIAN_POINT", +"tTRUE","tFALSE","tUNSPECIFIED","tU","tV","tEDGE_CURVE","tVERTEX_POINT","tORIENTED_EDGE", +"tPLANE","tFACE_OUTER_BOUND","tEDGE_LOOP","tADVANCED_FACE","tVECTOR","tDIRECTION", +"tAXIS2_PLACEMENT_3D","tISO","tENDISO","tENDSEC","tDATA","tHEADER","tFILE_DESCRIPTION", +"tFILE_SCHEMA","tFILE_NAME","tMANIFOLD_SOLID_BREP","tCLOSED_SHELL","tADVANCED_BREP_SHAPE_REPRESENTATION", +"tFACE_BOUND","tCYLINDRICAL_SURFACE","tCONICAL_SURFACE","tCIRCLE","tTRIMMED_CURVE", +"tGEOMETRIC_SET","tCOMPOSITE_CURVE_SEGMENT","tCONTINUOUS","tCOMPOSITE_CURVE", +"tTOROIDAL_SURFACE","tPRODUCT_DEFINITION","tPRODUCT_DEFINITION_SHAPE","tSHAPE_DEFINITION_REPRESENTATION", +"tELLIPSE","tTrimmed","tSolid","tEndSolid","tVertex","tFacet","tNormal","tOuter", +"tLoopSTL","tEndLoop","tEndFacet","'<'","'>'","'+'","'-'","'*'","'/'","'%'", +"UMINUS","'^'","'('","','","')'","'{'","'}'","'['","']'","All","STLFormatItem", +"StepFormatItems","StepFormatItem","StepSpecial","StepHeaderItem","StepDataItem", +"GeomFormatList","GeomFormat","View","Views","ScalarSimplex","VectorSimplex", +"TensorSimplex","ScalarTriangle","VectorTriangle","TensorTriangle","ScalarLine", +"VectorLine","TensorLine","ScalarPoint","VectorPoint","TensorPoint","Affectation", +"Shape","Transform","MultipleShape","ListOfShapes","Duplicata","Delete","Macro", +"Extrude","ExtrudeParameters","ExtrudeParameter","Transfini","Coherence","Colors", +"ColorSections","ColorSection","@1","@2","@3","ColorAffects","ColorAffect","RGBAExpr", +"BoolExpr","FExpr","FExpr_Single","FExpr_Range","VExpr","ListOfStrings","RecursiveListOfStrings", +"ListOfListOfDouble","RecursiveListOfListOfDouble","ListOfDouble","RecursiveListOfDouble", NULL +}; +#endif + +static const short yyr1[] = { 0, + 157, 157, 157, 158, 158, 158, 159, 159, 160, 160, + 160, 160, 161, 161, 161, 161, 161, 162, 162, 162, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 164, 164, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 166, 166, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 182, 182, 182, 182, 183, 183, 183, 184, 184, 185, + 186, 187, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 189, 189, 190, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 192, 193, 194, 194, 196, + 195, 197, 195, 198, 195, 199, 199, 200, 200, 200, + 201, 201, 202, 202, 202, 202, 202, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 204, 204, 204, 205, + 205, 206, 206, 206, 206, 207, 207, 208, 208, 209, + 209, 209, 210, 210, 211, 211, 211, 212, 212, 212, + 212 +}; + +static const short yyr2[] = { 0, + 1, 1, 1, 1, 21, 1, 0, 2, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 7, 5, 17, + 9, 23, 31, 15, 11, 11, 15, 9, 13, 9, + 11, 13, 9, 9, 11, 9, 11, 9, 11, 13, + 13, 11, 13, 17, 9, 11, 11, 13, 11, 9, + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 6, 8, 0, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 28, + 28, 28, 22, 22, 22, 16, 16, 16, 10, 10, + 10, 4, 7, 8, 12, 6, 5, 7, 7, 12, + 7, 9, 17, 7, 8, 8, 5, 7, 11, 8, + 9, 8, 22, 20, 8, 8, 5, 8, 7, 8, + 7, 11, 7, 9, 1, 1, 1, 0, 2, 4, + 4, 3, 7, 8, 11, 12, 12, 8, 12, 8, + 11, 15, 1, 2, 9, 6, 9, 9, 9, 8, + 8, 8, 6, 4, 8, 2, 4, 0, 2, 0, + 5, 0, 5, 0, 5, 0, 2, 4, 8, 4, + 9, 7, 1, 1, 1, 1, 1, 1, 3, 3, + 3, 3, 3, 3, 2, 2, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, + 4, 4, 4, 6, 6, 6, 1, 1, 1, 3, + 6, 11, 9, 7, 7, 0, 3, 1, 3, 0, + 3, 3, 1, 3, 0, 1, 3, 1, 1, 3, + 3 +}; + +static const short yydefact[] = { 51, + 4, 6, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 9, 11, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 55, 56, 57, + 58, 62, 59, 60, 61, 63, 0, 12, 0, 13, + 14, 16, 15, 17, 216, 216, 0, 64, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, + 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 225, 128, 156, 0, 0, 0, 0, 0, + 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 207, 209, + 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 132, 0, 0, 0, 67, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 186, 185, 0, 92, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, + 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 130, 129, 154, + 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, + 160, 162, 164, 157, 159, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 181, 180, 182, 183, 184, 97, 0, + 225, 225, 0, 107, 225, 0, 117, 225, 225, 0, + 0, 227, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, + 128, 0, 0, 0, 0, 0, 0, 67, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 0, 0, 225, 0, 0, 225, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 225, 225, 0, 0, 0, 0, 225, + 225, 0, 0, 0, 0, 0, 225, 0, 225, 0, + 0, 0, 0, 0, 219, 0, 216, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 0, 198, 199, + 200, 201, 202, 203, 0, 0, 0, 0, 0, 0, + 225, 0, 225, 0, 0, 0, 210, 230, 231, 96, + 0, 225, 225, 225, 146, 0, 225, 225, 225, 225, + 225, 225, 225, 225, 0, 0, 0, 127, 0, 126, + 125, 0, 0, 0, 0, 0, 0, 0, 153, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 0, 0, 0, 0, 220, 0, 166, + 166, 166, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 173, 174, 175, + 176, 177, 0, 0, 0, 0, 0, 0, 0, 18, + 0, 0, 0, 0, 0, 93, 101, 0, 104, 0, + 98, 0, 99, 119, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 121, 123, 128, 0, 0, 0, 0, + 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, + 0, 225, 225, 0, 225, 0, 0, 166, 0, 0, + 225, 0, 0, 0, 225, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, + 0, 0, 216, 197, 204, 205, 206, 0, 106, 116, + 0, 0, 151, 110, 112, 0, 0, 0, 150, 152, + 118, 94, 105, 115, 120, 155, 0, 0, 0, 0, + 0, 138, 0, 140, 0, 134, 0, 0, 66, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 220, 0, 223, 0, 0, 0, 0, + 161, 167, 163, 165, 0, 0, 0, 0, 0, 0, + 0, 21, 0, 30, 0, 34, 0, 28, 0, 0, + 33, 0, 38, 36, 0, 0, 0, 0, 0, 0, + 45, 0, 0, 0, 0, 0, 50, 0, 0, 102, + 211, 0, 147, 148, 149, 215, 0, 214, 128, 124, + 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 225, 222, 221, 225, 0, 0, 0, 0, + 181, 180, 111, 0, 0, 220, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 225, 0, 144, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, + 0, 224, 0, 0, 168, 209, 0, 170, 0, 35, + 0, 0, 0, 0, 25, 0, 31, 0, 37, 26, + 39, 0, 42, 0, 46, 47, 0, 0, 49, 0, + 0, 0, 0, 213, 122, 0, 0, 0, 0, 141, + 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 225, 225, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 137, 139, 136, 0, 225, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, + 225, 225, 95, 100, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 32, 40, 0, 41, 48, 43, + 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 89, 90, 91, 0, 0, 169, 0, 0, 0, 0, + 24, 27, 0, 0, 0, 142, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, + 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 44, 20, 103, 145, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 171, 0, 0, + 225, 0, 0, 0, 0, 0, 0, 225, 225, 225, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 225, 0, 0, + 0, 0, 0, 0, 0, 86, 87, 88, 0, 114, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, + 0, 0, 0, 0, 0, 0, 0, 113, 0, 22, + 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, + 225, 225, 225, 0, 0, 0, 0, 0, 0, 0, + 225, 0, 0, 0, 83, 84, 85, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 225, 225, 225, 23, 0, 0, 0, 80, 81, 82, + 0, 0, 0 +}; + +static const short yydefgoto[] = { 1271, + 4, 5, 18, 19, 20, 21, 6, 55, 56, 344, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 57, 339, 578, 579, 580, 581, 61, 62, + 63, 865, 866, 64, 65, 66, 234, 355, 490, 491, + 492, 717, 718, 890, 643, 197, 186, 311, 214, 156, + 268, 714, 805, 806, 312 +}; + +static const short yypact[] = { 472, +-32768,-32768, -109,-32768, 525, 1180, 33, 67, 105, 73, + 108, 114, 208, 222, 85, 87, 94,-32768,-32768,-32768, +-32768, 224, 263, 110, 154, 182, -34, -31, 191, 199, + 243, 225, 340, 350, 351, 323, 355, 379, 242, 245, + 250, 251, -14, 233, 389, 370, 257, 405, 414, -1, + 270, -12, 268, 392,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 424,-32768, 1172,-32768, +-32768,-32768,-32768,-32768, 285, 285, 432,-32768, 40, 40, + 40, 40, 297, 40, 301, 40, 40, 40, 296, 40, + 305, 302, 304, 296, 311, 316, 306, 321, 324, 326, + 328, 329, 39, 39, 39, 39, 330, 331, 345, 40, +-32768, 491, 296,-32768,-32768, -38, 349, 374, 40, -40, + 40,-32768, 377, 526, 382, 385, 407, 412, 420, 422, + 423, 425, 426, 427, 436, 439, 440, 444, 445, 447, + 449, 451, 456, 458, 467, 469, 475, 476, 477, 478, + 489, 490, 492, 494, 560, 471, 495, 501,-32768,-32768, +-32768, 496, 503, 510, 511, 515, 516, 517, 518, 522, + 524, 528, 529, 530, 534, 535, 536, 537, 538, 539, + 548, 40, 40, 40, 42,-32768, 120, 657, 669, 40, + 680, 40, 694, 717, 727, 40, 885, 567, 737, 40, + 40, 40, 634, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 549, 523, 551, 555, 40, 40, 40, + 287, 303,-32768, 65, 579, 39,-32768, 40, 40, 761, + 594, 40, 773, -48, 40, 570, 703, 718, 720, 721, + 722, 723, 729, 740, 741, 748, 755, 762, 769, 771, + 772, 774, 776, 780, 785, 793, 800, 802, 806, 692, + 812, 814, 817, 822, 827, 826,-32768, -44, 829, 835, + 830, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 693, 693, 783,-32768, 40, 40, 40, 40, 40, + 236, 837, 838, 809, 282, 821, 841, 857, 858, 279, +-32768, 100, 40, 860, 586, 831, 869, 40, 598, 605, + 915, 927, 946, 956, 974, 996, 851, 1352, 39, 715, + 724, 40, 1553, 1685, 1694, 39, 44,-32768,-32768,-32768, + 40,-32768, 725, 417, 1703, 1712, 867, 734, 1009, 868, +-32768,-32768,-32768,-32768,-32768, 1042, 747, 736, 739, 742, + 746, 749, 750, 757, 758, 760, 763, 764, 779, 782, + 786, 787, 788, 789, 790, 805, 808, 811, 818, 820, + 836, 839, 847, 848, 850, 865, 866, 883,-32768, 784, +-32768, 871, 1057, 1102, 1160, 1170, 1181, 1191, 1201, 1218, + 1228, 1241, 1721, 1255, 1266, 1276, 1286, 1296, 1306, 1730, + 1739, 1748,-32768, 122, 122, 693, 693, 693,-32768, 39, + 296, 296, 884,-32768, 296, 891,-32768, 296, 296, 72, + 40,-32768, 103, 781, 905, 916, 917, 227, 944, 950, + 961, 965, 975, 979, 981, 982, 40, 40, 872, 409, + 409, 1316, 39, 39, 39, 3, 112,-32768, 870, 874, + 876, 882, 912, 913, 918, 919, 924, 925, 930, 931, + 886,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 40, 40, 296, 40, 1012, 296, 828, + 880, 929, 1028, 932, 1062, 40, 40, 39, 1090, 1091, + 951, 1094, 1100, 296, 296, 1101, 39, 1104, 1106, 296, + 296, 1107, 1118, 1119, 1121, 1122, 296, 53, 296, 1124, + 1123, 1125, 1126, 1128,-32768, 928, 285,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768, 40,-32768,-32768, +-32768,-32768,-32768,-32768, 40, 40, 40, 1137, 29, 1138, + 296, 1140, 296, 1141, 1150, 40, 885, 279,-32768,-32768, + 40, 296, 296, 296,-32768, -2, 296, 296, 296, 296, + 296, 296, 296, 296, 1757, 1766, 40,-32768, 978, 660, +-32768, 1003, 1006, 144, 151, 209, 39, 1154,-32768, 434, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40,-32768, 1775, 1784, 1156, 1329, 178, 1083, 1163, + 1163, 1163, 40, 1165, 1018, 1793, 1802, 1019, 1021, 1025, + 1022, 1026, 1031, 1027, 1032, 1039, 1040, 1045, 1041, 1046, + 1053, 1056, 1075, 1076, 1077, 1078, 1085,-32768,-32768,-32768, +-32768,-32768, 1079, 1092, 1098, 1099, 1105, 1103, 1112,-32768, + 1114, 1339, 1364, 1374, 1384,-32768,-32768, 39,-32768, 1164, +-32768, 1202,-32768,-32768, 80, 1811, 1246, 1247, 1251, 40, + 40, 40, 1260, 1261, 1272, 1273, 1274, 1275, 1277, 1278, + 40, 40, 1394,-32768,-32768, 409, 39, 1279, 39, 1290, + 39, 27, 1131,-32768, 1301, 1820, 1829, 1838, 1847, 1856, + 1865, 1874, 1883, 1892, 1901, 1910, 1919, 40, 40,-32768, + 1190, 296, 296, 1225, 296, 1303, 1166, 1163, 1167, 1169, + 148, 1314, 1315, 40, 296, 1322, 1326, 1325, 1187, 1332, + 53, 1333, 1338, 40, 1336, 1345, 1343, 1346, 1348, 53, + 40, 40, 40, 296, 1349, 1351, 53, 40, 1353, 1355, + 1359, 40, 285,-32768,-32768,-32768,-32768, 1360,-32768,-32768, + 40, 40,-32768,-32768,-32768, 131, 234, 244,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 1404, 299, 1206, 1214, + 1224,-32768, 1227,-32768, 1230,-32768, 1304, 40,-32768, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 1414, 1424, 178, 214,-32768, 192, 1223, 1299, 26, +-32768,-32768,-32768,-32768, 40, 40, 1376, 1385, 1237, 1928, + 1240,-32768, 1243,-32768, 1244,-32768, 1250,-32768, 1245, 1434, +-32768, 1252,-32768,-32768, 1253, 1254, 1444, 1937, 1455, 1257, +-32768, 1264, 1265, 1946, 1282, 1271,-32768, 1955, 1283,-32768, + 885, 1964,-32768,-32768,-32768,-32768, 40,-32768, 409,-32768, + 40, 40, 40, 1239, 77,-32768, 1465, 1973, 1982, 1991, + 2000, 2009, 2018, 2027, 2036, 2045, 2054, 2063, 2072, 1417, + 1419, 1344, 296,-32768,-32768, 296, 40, 1430, 527, 1431, + 133, 181,-32768, 1309, 1438, 178, 53, 1443, 40, 1441, + 53, 1447, 1451, 1450, 1457, 1458, 40, 1460, 296, 1461, + 1463, 40, 1454, 1470, 40, 1472, 1474, 415, 1335, 1475, + 1485, 1502, 296, 1480,-32768, 1481, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 296, 296, + 1327,-32768, 1341, 253,-32768, 1342, 2081,-32768, 1487,-32768, + 1361, 1363, 1370, 2090,-32768, 1347,-32768, 1350,-32768,-32768, +-32768, 1512,-32768, 1371,-32768,-32768, 1522, 1372,-32768, 1533, + 1380, 1381, 40,-32768,-32768, 1494, 1505, 28, 1383,-32768, +-32768, 2099, 2108, 2117, 2126, 2135, 2144, 2153, 2162, 2171, + 1543, 1565, 1575, 1509, 1519, 296, 296,-32768, 40, 40, + 1532, 53, 53, 53, 53, 1535, 1538, 1539, 53, 1545, + 1546, 1548, 1556, 1557, 612,-32768,-32768,-32768, 1304, 296, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 296, + 296, 296,-32768,-32768, 1413, 1411, 619, 2180, 1568, 1421, + 1423, 1429, 1432,-32768,-32768,-32768, 1440,-32768,-32768,-32768, + 1452, 1462,-32768, 78, 1464, 2189, 2198, 2207, 2216, 2225, + 2234, 2243, 2252, 2261, 1569, 1576, 1579, 296, 1514, 1586, + 40, 1468, 53, 53, 1589, 1599, 53, 1601, 1607, 1610, + 296, 40, 40, 40, 40, 40, 40, 40, 40, 40, +-32768,-32768,-32768, 1469, 1473,-32768, 505, 1619, 1482, 1488, +-32768,-32768, 1484, 1486, 1489,-32768, 1471, 2270, 2279, 2288, + 2297, 2306, 2315, 2324, 2333, 2342, 1552, 40, 40,-32768, + 1637, 53, 296, 1643, 1644, 1646, 1647, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 1506, 2351, 626, 1657, + 1518, 1521,-32768,-32768,-32768,-32768, 2360, 2369, 2378, 2387, + 2396, 2405, 1595, 1605, 1615, 40, 40,-32768, 1524, 53, + 296, 40, 40, 40, 40, 40, 40, 296, 296, 296, + 2414, 643, 1530, 1529, 1540, 2423, 2432, 2441, 2450, 2459, + 2468, 1667, 1669, 1677, 40, 1684,-32768, 296, 53, 40, + 40, 40, 40, 40, 40,-32768,-32768,-32768, 650,-32768, + 1542, 1551, 2477, 2486, 2495, 2504, 2513, 2522, 1688, 296, + 1706, 40, 40, 40, 40, 40, 40,-32768, 1549,-32768, + 2531, 2540, 2549, 1625, 1635, 1645, 296, 40, 40, 40, + 296, 296, 296, 1562, 2558, 2567, 2576, 1710, 1716, 1717, + 296, 40, 40, 40,-32768,-32768,-32768, 1574, 2585, 2594, + 2603, 53, 40, 40, 40, 1577, 1655, 1665, 1675, 1720, + 296, 296, 296,-32768, 1722, 1724, 1725,-32768,-32768,-32768, + 1681, 1732,-32768 +}; + +static const short yypgoto[] = {-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1284, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 1727, 1728, -445, 239, 1737,-32768,-32768, +-32768, 726, -841,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, -594,-32768,-32768, -719, -79,-32768, 1321, -91, -72, +-32768, -794, 1033, 474,-32768 +}; + + +#define YYLAST 2754 + + +static const short yytable[] = { 185, + 187, 188, 189, 157, 191, 582, 193, 194, 195, 882, + 199, 827, 215, 216, 217, 107, 719, 720, 108, 109, + 836, 120, 83, 925, 226, 85, 7, 843, 117, 888, + 221, 118, 786, 1018, 657, 67, 351, 352, 353, 230, + 231, 233, 159, 160, 670, 671, 672, 295, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 658, + 340, 341, 68, 98, 159, 160, 99, 100, 70, 101, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 951, 292, 293, 294, 354, 388, 389, 560, 232, + 304, 69, 306, 71, 227, 84, 310, 589, 86, 72, + 315, 316, 317, 812, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 343, 110, 853, 121, 333, 334, + 335, 864, 864, 638, 639, 640, 641, 642, 345, 346, + 159, 160, 349, 587, 588, 356, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 952, 889, 787, + 1019, 956, 182, 183, 296, 297, 298, 299, 212, 184, + 300, 213, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 925, 73, 182, 183, 414, 415, 416, 417, + 418, 184, 296, 297, 298, 299, 556, 74, 300, 78, + 924, 1080, 565, 433, 75, 761, 76, 449, 438, 854, + 780, 419, 420, 77, 456, 296, 297, 298, 299, 855, + 431, 300, 452, 432, 296, 297, 298, 299, 998, 80, + 300, 457, 296, 297, 298, 299, 298, 299, 300, 79, + 300, 301, 566, 296, 297, 298, 299, -186, -186, 300, + 89, 300, 1040, 1041, 1042, 1043, 430, 424, 425, 1047, + 815, 816, 298, 299, 687, 688, 300, 184, 159, 160, + 196, 689, 690, 81, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, -185, -185, 712, 548, 300, + 713, 82, 24, 25, 26, 27, 28, 29, 30, 31, + 87, 32, 883, 34, 35, 885, 37, 337, 88, 222, + 557, 558, 225, 1099, 1100, 94, 95, 1103, 96, 691, + 692, 584, 585, 586, 883, 884, 50, 575, 576, 296, + 297, 298, 299, 91, 90, 300, 296, 297, 298, 299, + 51, 52, 300, 92, 93, 111, 296, 297, 298, 299, + 97, 103, 300, 112, 104, 296, 297, 298, 299, 105, + 106, 300, 1141, 113, 604, 605, 618, 607, 98, 114, + 115, 99, 100, 919, 101, 627, 616, 617, 116, 119, + 122, 296, 297, 298, 299, 123, 124, 300, 102, 296, + 297, 298, 299, 54, 155, 300, 158, 336, 182, 183, + 1174, 296, 297, 298, 299, 184, 190, 300, 196, 857, + 192, 201, 858, 202, 651, 206, 338, 200, 652, 39, + 40, 41, 42, 204, 44, 653, 654, 655, 205, 1202, + 207, -7, -7, 208, -7, 209, 665, 210, 211, 218, + 219, 666, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 220, 693, 223, 683, 228, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 229, -2, 8, 235, 9, 236, 159, + 946, 237, 1256, 721, 238, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 239, 296, 297, 298, + 299, 240, 198, 300, 267, 973, 758, 203, 974, 241, + 471, 242, 243, 313, 244, 245, 246, -7, -7, -7, + -7, -7, -7, -7, -7, 247, 224, 695, 248, 249, + 766, 767, 768, 250, 251, 781, 252, 783, 253, 785, + 254, 777, 778, 1, 2, 255, 3, 256, 24, 25, + 26, 27, 28, 29, 30, 31, 257, 32, 258, 34, + 35, 269, 37, 337, 259, 260, 261, 262, 802, 803, + 10, 11, 12, 13, 14, 15, 16, 17, 263, 264, + 318, 265, 50, 266, 820, 272, 270, 296, 297, 298, + 299, 271, 273, 300, 830, 1119, 51, 52, 1120, 274, + 275, 837, 838, 839, 276, 277, 278, 279, 844, 182, + 183, 280, 848, 281, 330, 348, 184, 282, 283, 284, + 849, 851, 852, 285, 286, 287, 288, 289, 290, 24, + 25, 26, 27, 28, 29, 30, 31, 291, 32, 329, + 34, 35, 331, 37, 337, 332, 357, 358, 867, 54, + 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, + 878, 879, 359, 50, 360, 361, 362, 363, 296, 297, + 298, 299, 342, 364, 300, 891, 892, 51, 52, 435, + 296, 297, 298, 299, 365, 366, 300, 296, 297, 298, + 299, 439, 367, 300, 296, 297, 298, 299, 440, 368, + 300, 296, 297, 298, 299, 1053, 369, 300, 296, 297, + 298, 299, 1070, 370, 300, 371, 372, 918, 373, 1158, + 374, 920, 921, 922, 375, 296, 297, 298, 299, 376, + 54, 300, 296, 297, 298, 299, 1186, 377, 300, 296, + 297, 298, 299, 1209, 378, 300, 379, 944, 302, 947, + 380, 296, 297, 298, 299, 381, 382, 300, 383, 954, + 303, 384, 296, 297, 298, 299, 385, 962, 300, 386, + 387, 305, 967, 390, 392, 970, 296, 297, 298, 299, + 391, 300, 300, 421, 422, 307, 427, 982, 983, 984, + 985, 986, 987, 988, 989, 990, 991, 992, 993, 296, + 297, 298, 299, 428, 429, 300, 434, 450, 308, 296, + 297, 298, 299, 486, 489, 300, 451, 458, 309, 296, + 297, 298, 299, 487, 494, 300, 495, 525, 314, 496, + 551, 603, 497, 1015, 549, 550, 498, 553, 552, 499, + 500, 554, 555, 296, 297, 298, 299, 501, 502, 300, + 503, 562, 347, 504, 505, 296, 297, 298, 299, 1037, + 1038, 300, 563, 564, 350, 296, 297, 298, 299, 506, + 561, 300, 507, 650, 413, 526, 508, 509, 510, 511, + 512, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, + 567, 296, 297, 298, 299, 513, 568, 300, 514, 606, + 423, 515, 609, 296, 297, 298, 299, 569, 516, 300, + 517, 570, 426, 296, 297, 298, 299, 624, 625, 300, + 610, 571, 436, 630, 631, 572, 518, 573, 574, 519, + 637, 1097, 644, 296, 297, 298, 299, 520, 521, 300, + 522, 447, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, + 1116, 296, 297, 298, 299, 523, 524, 300, 608, 591, + 437, 527, 577, 592, 660, 593, 662, 296, 297, 298, + 299, 594, 611, 300, 613, 667, 668, 669, 1138, 1139, + 673, 674, 675, 676, 677, 678, 679, 680, 1147, 1148, + 1149, 1150, 1151, 1152, 1153, 1154, 1155, 296, 297, 298, + 299, 595, 596, 300, 615, 614, 441, 597, 598, 296, + 297, 298, 299, 599, 600, 300, 1171, 1172, 442, 601, + 602, 612, 1176, 1177, 1178, 1179, 1180, 1181, 296, 297, + 298, 299, 619, 620, 300, 621, 622, 443, 296, 297, + 298, 299, 623, 626, 300, 1199, 628, 444, 629, 632, + 1203, 1204, 1205, 1206, 1207, 1208, 296, 297, 298, 299, + 633, 634, 300, 635, 636, 445, 645, 646, 648, 647, + 649, 684, 1221, 1222, 1223, 1224, 1225, 1226, 296, 297, + 298, 299, 656, 659, 300, 661, 663, 446, 1235, 1236, + 1237, 296, 297, 298, 299, 664, 685, 300, 686, 694, + 488, 710, 1249, 1250, 1251, 715, 716, 722, 723, 759, + 726, 727, 729, 1257, 1258, 1259, 728, 730, 732, -1, + 22, 731, 733, 23, 296, 297, 298, 299, 809, 734, + 300, 735, 737, 493, 817, 736, 804, 738, 821, 296, + 297, 298, 299, 739, 125, 300, 740, 760, 528, 24, + 25, 26, 27, 28, 29, 30, 31, 840, 32, 33, + 34, 35, 36, 37, 38, 741, 742, 743, 744, 746, + 39, 40, 41, 42, 43, 44, 745, 45, 46, 47, + 48, 49, 747, 50, 296, 297, 298, 299, 748, 749, + 300, 763, 764, 529, 751, 750, 765, 51, 52, 126, + 127, 128, 752, 53, 753, 769, 770, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 771, 772, 773, + 774, 788, 775, 776, 782, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 784, 149, 150, 151, 152, + 153, 154, 296, 297, 298, 299, 789, 808, 300, 810, + 54, 530, 296, 297, 298, 299, 818, 819, 300, 811, + 813, 531, 814, 296, 297, 298, 299, 822, 823, 300, + 824, 825, 532, 296, 297, 298, 299, 826, 828, 300, + 829, 831, 533, 296, 297, 298, 299, 832, 833, 300, + 835, 834, 534, 842, 841, 845, 942, 846, 859, 943, + 296, 297, 298, 299, 847, 850, 300, 860, 864, 535, + 296, 297, 298, 299, 861, 886, 300, 862, 887, 536, + 863, 893, 964, 296, 297, 298, 299, 894, 895, 300, + 897, 923, 537, 898, 899, 901, 979, 296, 297, 298, + 299, 900, 903, 300, 904, 905, 539, 909, 296, 297, + 298, 299, 994, 995, 300, 910, 911, 540, 296, 297, + 298, 299, 914, 939, 300, 940, 941, 541, 296, 297, + 298, 299, 913, 916, 300, 945, 948, 542, 296, 297, + 298, 299, 949, 950, 300, 953, 955, 543, 296, 297, + 298, 299, 957, 958, 300, 959, 968, 544, 296, 297, + 298, 299, 960, 961, 300, 963, 965, 583, 966, 1035, + 1036, 296, 297, 298, 299, 969, 971, 300, 972, 996, + 711, 296, 297, 298, 299, 980, 981, 300, 975, 1001, + 754, 997, 999, 1055, 296, 297, 298, 299, 1006, 1016, + 300, 1007, 448, 1065, 1066, 1067, 296, 297, 298, 299, + 1017, 1002, 300, 1003, 1033, 755, 296, 297, 298, 299, + 1004, 1009, 300, 1011, 1034, 756, 296, 297, 298, 299, + 1013, 1014, 300, 1020, 1039, 757, 296, 297, 298, 299, + 1044, 1094, 300, 1045, 1046, 779, 296, 297, 298, 299, + 1048, 1049, 300, 1050, 1107, 856, 296, 297, 298, 299, + 1051, 1052, 300, 1068, 1069, 880, 296, 297, 298, 299, + 1072, 1073, 300, 1074, 1091, 881, 296, 297, 298, 299, + 1075, 1092, 300, 1076, 1093, 902, 296, 297, 298, 299, + 1077, 1096, 300, 1095, 1101, 906, 1142, 296, 297, 298, + 299, 1098, 1078, 300, 1102, 1104, 908, 296, 297, 298, + 299, 1105, 1079, 300, 1081, 1106, 926, 296, 297, 298, + 299, 1121, 1117, 300, 1127, 1118, 976, 296, 297, 298, + 299, 1137, 1122, 300, 1175, 1124, 977, 1125, 1123, 1140, + 1126, 1182, 1183, 1184, 296, 297, 298, 299, 1143, 1144, + 300, 1145, 1146, 978, 296, 297, 298, 299, 1156, 1159, + 300, 1201, 1173, 1008, 296, 297, 298, 299, 1160, 1187, + 300, 1161, 1196, 1010, 1197, 296, 297, 298, 299, 1188, + 1272, 300, 1198, 1219, 1012, 296, 297, 298, 299, 1200, + 1189, 300, 1210, 1218, 1030, 296, 297, 298, 299, 1227, + 1234, 300, 1211, 453, 1238, 1239, 1240, 296, 297, 298, + 299, 1220, 1241, 300, 1248, 1245, 1031, 296, 297, 298, + 299, 1246, 1247, 300, 1252, 1264, 1032, 1268, 1260, 1269, + 1270, 1273, 58, 59, 1265, 1266, 1267, 296, 297, 298, + 299, 590, 60, 300, 1054, 807, 1168, 296, 297, 298, + 299, 559, 0, 300, 0, 0, 1169, 296, 297, 298, + 299, 0, 0, 300, 0, 0, 1170, 296, 297, 298, + 299, 0, 0, 300, 0, 0, 1231, 296, 297, 298, + 299, 0, 0, 300, 0, 0, 1232, 296, 297, 298, + 299, 0, 0, 300, 0, 0, 1233, 296, 297, 298, + 299, 0, 0, 300, 0, 0, 1261, 296, 297, 298, + 299, 0, 0, 300, 0, 0, 1262, 296, 297, 298, + 299, 0, 0, 300, 0, 0, 1263, 296, 297, 298, + 299, 0, 0, 300, 0, 454, 296, 297, 298, 299, + 0, 0, 300, 0, 455, 296, 297, 298, 299, 0, + 0, 300, 0, 484, 296, 297, 298, 299, 0, 0, + 300, 0, 485, 296, 297, 298, 299, 0, 0, 300, + 0, 538, 296, 297, 298, 299, 0, 0, 300, 0, + 545, 296, 297, 298, 299, 0, 0, 300, 0, 546, + 296, 297, 298, 299, 0, 0, 300, 0, 547, 296, + 297, 298, 299, 0, 0, 300, 0, 681, 296, 297, + 298, 299, 0, 0, 300, 0, 682, 296, 297, 298, + 299, 0, 0, 300, 0, 708, 296, 297, 298, 299, + 0, 0, 300, 0, 709, 296, 297, 298, 299, 0, + 0, 300, 0, 724, 296, 297, 298, 299, 0, 0, + 300, 0, 725, 296, 297, 298, 299, 0, 0, 300, + 0, 762, 296, 297, 298, 299, 0, 0, 300, 0, + 790, 296, 297, 298, 299, 0, 0, 300, 0, 791, + 296, 297, 298, 299, 0, 0, 300, 0, 792, 296, + 297, 298, 299, 0, 0, 300, 0, 793, 296, 297, + 298, 299, 0, 0, 300, 0, 794, 296, 297, 298, + 299, 0, 0, 300, 0, 795, 296, 297, 298, 299, + 0, 0, 300, 0, 796, 296, 297, 298, 299, 0, + 0, 300, 0, 797, 296, 297, 298, 299, 0, 0, + 300, 0, 798, 296, 297, 298, 299, 0, 0, 300, + 0, 799, 296, 297, 298, 299, 0, 0, 300, 0, + 800, 296, 297, 298, 299, 0, 0, 300, 0, 801, + 296, 297, 298, 299, 0, 0, 300, 0, 896, 296, + 297, 298, 299, 0, 0, 300, 0, 907, 296, 297, + 298, 299, 0, 0, 300, 0, 912, 296, 297, 298, + 299, 0, 0, 300, 0, 915, 296, 297, 298, 299, + 0, 0, 300, 0, 917, 296, 297, 298, 299, 0, + 0, 300, 0, 927, 296, 297, 298, 299, 0, 0, + 300, 0, 928, 296, 297, 298, 299, 0, 0, 300, + 0, 929, 296, 297, 298, 299, 0, 0, 300, 0, + 930, 296, 297, 298, 299, 0, 0, 300, 0, 931, + 296, 297, 298, 299, 0, 0, 300, 0, 932, 296, + 297, 298, 299, 0, 0, 300, 0, 933, 296, 297, + 298, 299, 0, 0, 300, 0, 934, 296, 297, 298, + 299, 0, 0, 300, 0, 935, 296, 297, 298, 299, + 0, 0, 300, 0, 936, 296, 297, 298, 299, 0, + 0, 300, 0, 937, 296, 297, 298, 299, 0, 0, + 300, 0, 938, 296, 297, 298, 299, 0, 0, 300, + 0, 1000, 296, 297, 298, 299, 0, 0, 300, 0, + 1005, 296, 297, 298, 299, 0, 0, 300, 0, 1021, + 296, 297, 298, 299, 0, 0, 300, 0, 1022, 296, + 297, 298, 299, 0, 0, 300, 0, 1023, 296, 297, + 298, 299, 0, 0, 300, 0, 1024, 296, 297, 298, + 299, 0, 0, 300, 0, 1025, 296, 297, 298, 299, + 0, 0, 300, 0, 1026, 296, 297, 298, 299, 0, + 0, 300, 0, 1027, 296, 297, 298, 299, 0, 0, + 300, 0, 1028, 296, 297, 298, 299, 0, 0, 300, + 0, 1029, 296, 297, 298, 299, 0, 0, 300, 0, + 1071, 296, 297, 298, 299, 0, 0, 300, 0, 1082, + 296, 297, 298, 299, 0, 0, 300, 0, 1083, 296, + 297, 298, 299, 0, 0, 300, 0, 1084, 296, 297, + 298, 299, 0, 0, 300, 0, 1085, 296, 297, 298, + 299, 0, 0, 300, 0, 1086, 296, 297, 298, 299, + 0, 0, 300, 0, 1087, 296, 297, 298, 299, 0, + 0, 300, 0, 1088, 296, 297, 298, 299, 0, 0, + 300, 0, 1089, 296, 297, 298, 299, 0, 0, 300, + 0, 1090, 296, 297, 298, 299, 0, 0, 300, 0, + 1128, 296, 297, 298, 299, 0, 0, 300, 0, 1129, + 296, 297, 298, 299, 0, 0, 300, 0, 1130, 296, + 297, 298, 299, 0, 0, 300, 0, 1131, 296, 297, + 298, 299, 0, 0, 300, 0, 1132, 296, 297, 298, + 299, 0, 0, 300, 0, 1133, 296, 297, 298, 299, + 0, 0, 300, 0, 1134, 296, 297, 298, 299, 0, + 0, 300, 0, 1135, 296, 297, 298, 299, 0, 0, + 300, 0, 1136, 296, 297, 298, 299, 0, 0, 300, + 0, 1157, 296, 297, 298, 299, 0, 0, 300, 0, + 1162, 296, 297, 298, 299, 0, 0, 300, 0, 1163, + 296, 297, 298, 299, 0, 0, 300, 0, 1164, 296, + 297, 298, 299, 0, 0, 300, 0, 1165, 296, 297, + 298, 299, 0, 0, 300, 0, 1166, 296, 297, 298, + 299, 0, 0, 300, 0, 1167, 296, 297, 298, 299, + 0, 0, 300, 0, 1185, 296, 297, 298, 299, 0, + 0, 300, 0, 1190, 296, 297, 298, 299, 0, 0, + 300, 0, 1191, 296, 297, 298, 299, 0, 0, 300, + 0, 1192, 296, 297, 298, 299, 0, 0, 300, 0, + 1193, 296, 297, 298, 299, 0, 0, 300, 0, 1194, + 296, 297, 298, 299, 0, 0, 300, 0, 1195, 296, + 297, 298, 299, 0, 0, 300, 0, 1212, 296, 297, + 298, 299, 0, 0, 300, 0, 1213, 296, 297, 298, + 299, 0, 0, 300, 0, 1214, 296, 297, 298, 299, + 0, 0, 300, 0, 1215, 296, 297, 298, 299, 0, + 0, 300, 0, 1216, 296, 297, 298, 299, 0, 0, + 300, 0, 1217, 296, 297, 298, 299, 0, 0, 300, + 0, 1228, 296, 297, 298, 299, 0, 0, 300, 0, + 1229, 296, 297, 298, 299, 0, 0, 300, 0, 1230, + 296, 297, 298, 299, 0, 0, 300, 0, 1242, 296, + 297, 298, 299, 0, 0, 300, 0, 1243, 296, 297, + 298, 299, 0, 0, 300, 0, 1244, 296, 297, 298, + 299, 0, 0, 300, 0, 1253, 296, 297, 298, 299, + 0, 0, 300, 0, 1254, 296, 297, 298, 299, 0, + 0, 300, 0, 1255 +}; + +static const short yycheck[] = { 79, + 80, 81, 82, 76, 84, 451, 86, 87, 88, 804, + 90, 731, 104, 105, 106, 30, 611, 612, 33, 34, + 740, 34, 57, 865, 63, 57, 136, 747, 30, 4, + 110, 33, 6, 6, 6, 3, 85, 86, 87, 119, + 81, 121, 3, 4, 47, 48, 49, 6, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 41, + 6, 7, 6, 30, 3, 4, 33, 34, 6, 36, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 896, 182, 183, 184, 154, 151, 152, 6, 150, + 190, 7, 192, 6, 153, 150, 196, 6, 150, 6, + 200, 201, 202, 718, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 226, 150, 6, 150, 218, 219, + 220, 65, 65, 91, 92, 93, 94, 95, 228, 229, + 3, 4, 232, 151, 152, 235, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 897, 153, 153, + 153, 901, 143, 144, 143, 144, 145, 146, 150, 150, + 149, 153, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 1054, 6, 143, 144, 296, 297, 298, 299, + 300, 150, 143, 144, 145, 146, 155, 6, 149, 6, + 154, 154, 6, 313, 150, 156, 150, 329, 318, 6, + 686, 6, 7, 150, 336, 143, 144, 145, 146, 6, + 151, 149, 332, 154, 143, 144, 145, 146, 6, 150, + 149, 341, 143, 144, 145, 146, 145, 146, 149, 7, + 149, 152, 46, 143, 144, 145, 146, 145, 146, 149, + 38, 149, 1002, 1003, 1004, 1005, 8, 6, 7, 1009, + 143, 144, 145, 146, 151, 152, 149, 150, 3, 4, + 153, 151, 152, 150, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 145, 146, 150, 420, 149, + 153, 150, 30, 31, 32, 33, 34, 35, 36, 37, + 150, 39, 151, 41, 42, 154, 44, 45, 150, 111, + 430, 431, 114, 1073, 1074, 33, 34, 1077, 36, 151, + 152, 453, 454, 455, 151, 152, 64, 447, 448, 143, + 144, 145, 146, 34, 150, 149, 143, 144, 145, 146, + 78, 79, 149, 34, 34, 153, 143, 144, 145, 146, + 36, 150, 149, 5, 150, 143, 144, 145, 146, 150, + 150, 149, 1122, 34, 484, 485, 498, 487, 30, 153, + 6, 33, 34, 859, 36, 507, 496, 497, 5, 150, + 153, 143, 144, 145, 146, 34, 3, 149, 50, 143, + 144, 145, 146, 131, 150, 149, 5, 151, 143, 144, + 1160, 143, 144, 145, 146, 150, 150, 149, 153, 151, + 150, 150, 154, 150, 527, 150, 154, 153, 538, 51, + 52, 53, 54, 153, 56, 545, 546, 547, 153, 1189, + 150, 0, 1, 150, 3, 150, 556, 150, 150, 150, + 150, 561, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 150, 587, 6, 577, 150, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 150, 0, 1, 150, 3, 3, 3, + 4, 150, 1252, 613, 150, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 150, 143, 144, 145, + 146, 150, 89, 149, 5, 151, 658, 94, 154, 150, + 154, 150, 150, 7, 150, 150, 150, 106, 107, 108, + 109, 110, 111, 112, 113, 150, 113, 154, 150, 150, + 670, 671, 672, 150, 150, 687, 150, 689, 150, 691, + 150, 681, 682, 132, 133, 150, 135, 150, 30, 31, + 32, 33, 34, 35, 36, 37, 150, 39, 150, 41, + 42, 151, 44, 45, 150, 150, 150, 150, 708, 709, + 106, 107, 108, 109, 110, 111, 112, 113, 150, 150, + 7, 150, 64, 150, 724, 150, 152, 143, 144, 145, + 146, 151, 150, 149, 734, 151, 78, 79, 154, 150, + 150, 741, 742, 743, 150, 150, 150, 150, 748, 143, + 144, 150, 752, 150, 152, 82, 150, 150, 150, 150, + 753, 761, 762, 150, 150, 150, 150, 150, 150, 30, + 31, 32, 33, 34, 35, 36, 37, 150, 39, 151, + 41, 42, 152, 44, 45, 151, 137, 5, 788, 131, + 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, + 800, 801, 5, 64, 5, 5, 5, 5, 143, 144, + 145, 146, 154, 5, 149, 815, 816, 78, 79, 154, + 143, 144, 145, 146, 5, 5, 149, 143, 144, 145, + 146, 154, 5, 149, 143, 144, 145, 146, 154, 5, + 149, 143, 144, 145, 146, 154, 5, 149, 143, 144, + 145, 146, 154, 5, 149, 5, 5, 857, 5, 154, + 5, 861, 862, 863, 5, 143, 144, 145, 146, 5, + 131, 149, 143, 144, 145, 146, 154, 5, 149, 143, + 144, 145, 146, 154, 5, 149, 5, 887, 152, 889, + 5, 143, 144, 145, 146, 124, 5, 149, 5, 899, + 152, 5, 143, 144, 145, 146, 5, 907, 149, 3, + 5, 152, 912, 5, 5, 915, 143, 144, 145, 146, + 6, 149, 149, 7, 7, 152, 6, 927, 928, 929, + 930, 931, 932, 933, 934, 935, 936, 937, 938, 143, + 144, 145, 146, 7, 7, 149, 7, 153, 152, 143, + 144, 145, 146, 7, 7, 149, 153, 153, 152, 143, + 144, 145, 146, 150, 138, 149, 151, 5, 152, 151, + 7, 6, 151, 973, 421, 422, 151, 7, 425, 151, + 151, 428, 429, 143, 144, 145, 146, 151, 151, 149, + 151, 7, 152, 151, 151, 143, 144, 145, 146, 999, + 1000, 149, 7, 7, 152, 143, 144, 145, 146, 151, + 150, 149, 151, 6, 152, 152, 151, 151, 151, 151, + 151, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, + 7, 143, 144, 145, 146, 151, 7, 149, 151, 486, + 152, 151, 489, 143, 144, 145, 146, 7, 151, 149, + 151, 7, 152, 143, 144, 145, 146, 504, 505, 149, + 153, 7, 152, 510, 511, 7, 151, 7, 7, 151, + 517, 1071, 519, 143, 144, 145, 146, 151, 151, 149, + 151, 151, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, + 1090, 143, 144, 145, 146, 151, 151, 149, 7, 150, + 152, 151, 151, 150, 551, 150, 553, 143, 144, 145, + 146, 150, 153, 149, 7, 562, 563, 564, 1118, 1119, + 567, 568, 569, 570, 571, 572, 573, 574, 1128, 1129, + 1130, 1131, 1132, 1133, 1134, 1135, 1136, 143, 144, 145, + 146, 150, 150, 149, 3, 134, 152, 150, 150, 143, + 144, 145, 146, 150, 150, 149, 1156, 1157, 152, 150, + 150, 153, 1162, 1163, 1164, 1165, 1166, 1167, 143, 144, + 145, 146, 3, 3, 149, 145, 3, 152, 143, 144, + 145, 146, 3, 3, 149, 1185, 3, 152, 3, 3, + 1190, 1191, 1192, 1193, 1194, 1195, 143, 144, 145, 146, + 3, 3, 149, 3, 3, 152, 3, 5, 3, 5, + 3, 154, 1212, 1213, 1214, 1215, 1216, 1217, 143, 144, + 145, 146, 6, 6, 149, 6, 6, 152, 1228, 1229, + 1230, 143, 144, 145, 146, 6, 154, 149, 153, 6, + 152, 6, 1242, 1243, 1244, 83, 4, 3, 151, 6, + 152, 151, 151, 1253, 1254, 1255, 152, 152, 152, 0, + 1, 151, 151, 4, 143, 144, 145, 146, 715, 151, + 149, 152, 152, 152, 721, 151, 7, 152, 725, 143, + 144, 145, 146, 151, 33, 149, 151, 6, 152, 30, + 31, 32, 33, 34, 35, 36, 37, 744, 39, 40, + 41, 42, 43, 44, 45, 151, 151, 151, 151, 151, + 51, 52, 53, 54, 55, 56, 152, 58, 59, 60, + 61, 62, 151, 64, 143, 144, 145, 146, 151, 151, + 149, 6, 6, 152, 152, 151, 6, 78, 79, 88, + 89, 90, 151, 84, 151, 6, 6, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 6, 6, 6, + 6, 151, 6, 6, 6, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 6, 125, 126, 127, 128, + 129, 130, 143, 144, 145, 146, 6, 83, 149, 7, + 131, 152, 143, 144, 145, 146, 3, 3, 149, 154, + 154, 152, 154, 143, 144, 145, 146, 6, 3, 149, + 6, 145, 152, 143, 144, 145, 146, 6, 6, 149, + 3, 6, 152, 143, 144, 145, 146, 3, 6, 149, + 3, 6, 152, 3, 6, 3, 883, 3, 153, 886, + 143, 144, 145, 146, 6, 6, 149, 154, 65, 152, + 143, 144, 145, 146, 151, 153, 149, 151, 80, 152, + 151, 6, 909, 143, 144, 145, 146, 3, 152, 149, + 151, 153, 152, 151, 151, 151, 923, 143, 144, 145, + 146, 152, 151, 149, 152, 152, 152, 151, 143, 144, + 145, 146, 939, 940, 149, 152, 152, 152, 143, 144, + 145, 146, 152, 7, 149, 7, 83, 152, 143, 144, + 145, 146, 151, 151, 149, 6, 6, 152, 143, 144, + 145, 146, 134, 6, 149, 3, 6, 152, 143, 144, + 145, 146, 6, 3, 149, 6, 3, 152, 143, 144, + 145, 146, 6, 6, 149, 6, 6, 152, 6, 996, + 997, 143, 144, 145, 146, 6, 5, 149, 5, 153, + 152, 143, 144, 145, 146, 6, 6, 149, 154, 3, + 152, 151, 151, 1020, 143, 144, 145, 146, 152, 6, + 149, 152, 151, 1030, 1031, 1032, 143, 144, 145, 146, + 6, 151, 149, 151, 6, 152, 143, 144, 145, 146, + 151, 151, 149, 152, 6, 152, 143, 144, 145, 146, + 151, 151, 149, 151, 3, 152, 143, 144, 145, 146, + 6, 1068, 149, 6, 6, 152, 143, 144, 145, 146, + 6, 6, 149, 6, 1081, 152, 143, 144, 145, 146, + 5, 5, 149, 151, 154, 152, 143, 144, 145, 146, + 3, 151, 149, 151, 6, 152, 143, 144, 145, 146, + 152, 6, 149, 152, 6, 152, 143, 144, 145, 146, + 151, 6, 149, 80, 6, 152, 1123, 143, 144, 145, + 146, 134, 151, 149, 6, 5, 152, 143, 144, 145, + 146, 5, 151, 149, 151, 6, 152, 143, 144, 145, + 146, 3, 154, 149, 154, 153, 152, 143, 144, 145, + 146, 80, 151, 149, 1161, 152, 152, 152, 151, 3, + 152, 1168, 1169, 1170, 143, 144, 145, 146, 6, 6, + 149, 6, 6, 152, 143, 144, 145, 146, 153, 3, + 149, 1188, 139, 152, 143, 144, 145, 146, 151, 140, + 149, 151, 6, 152, 6, 143, 144, 145, 146, 151, + 0, 149, 6, 1210, 152, 143, 144, 145, 146, 6, + 151, 149, 151, 6, 152, 143, 144, 145, 146, 151, + 1227, 149, 152, 151, 1231, 1232, 1233, 143, 144, 145, + 146, 6, 151, 149, 1241, 6, 152, 143, 144, 145, + 146, 6, 6, 149, 151, 6, 152, 6, 152, 6, + 6, 0, 6, 6, 1261, 1262, 1263, 143, 144, 145, + 146, 458, 6, 149, 1019, 713, 152, 143, 144, 145, + 146, 431, -1, 149, -1, -1, 152, 143, 144, 145, + 146, -1, -1, 149, -1, -1, 152, 143, 144, 145, + 146, -1, -1, 149, -1, -1, 152, 143, 144, 145, + 146, -1, -1, 149, -1, -1, 152, 143, 144, 145, + 146, -1, -1, 149, -1, -1, 152, 143, 144, 145, + 146, -1, -1, 149, -1, -1, 152, 143, 144, 145, + 146, -1, -1, 149, -1, -1, 152, 143, 144, 145, + 146, -1, -1, 149, -1, -1, 152, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151, 143, 144, 145, 146, -1, -1, + 149, -1, 151, 143, 144, 145, 146, -1, -1, 149, + -1, 151, 143, 144, 145, 146, -1, -1, 149, -1, + 151, 143, 144, 145, 146, -1, -1, 149, -1, 151, + 143, 144, 145, 146, -1, -1, 149, -1, 151, 143, + 144, 145, 146, -1, -1, 149, -1, 151, 143, 144, + 145, 146, -1, -1, 149, -1, 151, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151, 143, 144, 145, 146, -1, -1, + 149, -1, 151, 143, 144, 145, 146, -1, -1, 149, + -1, 151, 143, 144, 145, 146, -1, -1, 149, -1, + 151, 143, 144, 145, 146, -1, -1, 149, -1, 151, + 143, 144, 145, 146, -1, -1, 149, -1, 151, 143, + 144, 145, 146, -1, -1, 149, -1, 151, 143, 144, + 145, 146, -1, -1, 149, -1, 151, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151, 143, 144, 145, 146, -1, -1, + 149, -1, 151, 143, 144, 145, 146, -1, -1, 149, + -1, 151, 143, 144, 145, 146, -1, -1, 149, -1, + 151, 143, 144, 145, 146, -1, -1, 149, -1, 151, + 143, 144, 145, 146, -1, -1, 149, -1, 151, 143, + 144, 145, 146, -1, -1, 149, -1, 151, 143, 144, + 145, 146, -1, -1, 149, -1, 151, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151, 143, 144, 145, 146, -1, -1, + 149, -1, 151, 143, 144, 145, 146, -1, -1, 149, + -1, 151, 143, 144, 145, 146, -1, -1, 149, -1, + 151, 143, 144, 145, 146, -1, -1, 149, -1, 151, + 143, 144, 145, 146, -1, -1, 149, -1, 151, 143, + 144, 145, 146, -1, -1, 149, -1, 151, 143, 144, + 145, 146, -1, -1, 149, -1, 151, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151, 143, 144, 145, 146, -1, -1, + 149, -1, 151, 143, 144, 145, 146, -1, -1, 149, + -1, 151, 143, 144, 145, 146, -1, -1, 149, -1, + 151, 143, 144, 145, 146, -1, -1, 149, -1, 151, + 143, 144, 145, 146, -1, -1, 149, -1, 151, 143, + 144, 145, 146, -1, -1, 149, -1, 151, 143, 144, + 145, 146, -1, -1, 149, -1, 151, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151, 143, 144, 145, 146, -1, -1, + 149, -1, 151, 143, 144, 145, 146, -1, -1, 149, + -1, 151, 143, 144, 145, 146, -1, -1, 149, -1, + 151, 143, 144, 145, 146, -1, -1, 149, -1, 151, + 143, 144, 145, 146, -1, -1, 149, -1, 151, 143, + 144, 145, 146, -1, -1, 149, -1, 151, 143, 144, + 145, 146, -1, -1, 149, -1, 151, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151, 143, 144, 145, 146, -1, -1, + 149, -1, 151, 143, 144, 145, 146, -1, -1, 149, + -1, 151, 143, 144, 145, 146, -1, -1, 149, -1, + 151, 143, 144, 145, 146, -1, -1, 149, -1, 151, + 143, 144, 145, 146, -1, -1, 149, -1, 151, 143, + 144, 145, 146, -1, -1, 149, -1, 151, 143, 144, + 145, 146, -1, -1, 149, -1, 151, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151, 143, 144, 145, 146, -1, -1, + 149, -1, 151, 143, 144, 145, 146, -1, -1, 149, + -1, 151, 143, 144, 145, 146, -1, -1, 149, -1, + 151, 143, 144, 145, 146, -1, -1, 149, -1, 151, + 143, 144, 145, 146, -1, -1, 149, -1, 151, 143, + 144, 145, 146, -1, -1, 149, -1, 151, 143, 144, + 145, 146, -1, -1, 149, -1, 151, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151, 143, 144, 145, 146, -1, -1, + 149, -1, 151, 143, 144, 145, 146, -1, -1, 149, + -1, 151, 143, 144, 145, 146, -1, -1, 149, -1, + 151, 143, 144, 145, 146, -1, -1, 149, -1, 151, + 143, 144, 145, 146, -1, -1, 149, -1, 151, 143, + 144, 145, 146, -1, -1, 149, -1, 151, 143, 144, + 145, 146, -1, -1, 149, -1, 151, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151, 143, 144, 145, 146, -1, -1, + 149, -1, 151, 143, 144, 145, 146, -1, -1, 149, + -1, 151, 143, 144, 145, 146, -1, -1, 149, -1, + 151, 143, 144, 145, 146, -1, -1, 149, -1, 151, + 143, 144, 145, 146, -1, -1, 149, -1, 151, 143, + 144, 145, 146, -1, -1, 149, -1, 151, 143, 144, + 145, 146, -1, -1, 149, -1, 151, 143, 144, 145, + 146, -1, -1, 149, -1, 151, 143, 144, 145, 146, + -1, -1, 149, -1, 151, 143, 144, 145, 146, -1, + -1, 149, -1, 151 +}; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/lib/bison.simple" +/* This file comes from bison-1.28. */ + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +#ifndef YYSTACK_USE_ALLOCA +#ifdef alloca +#define YYSTACK_USE_ALLOCA +#else /* alloca not defined */ +#ifdef __GNUC__ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) +#define YYSTACK_USE_ALLOCA +#include <alloca.h> +#else /* not sparc */ +/* We think this test detects Watcom and Microsoft C. */ +/* This used to test MSDOS, but that is a bad idea + since that symbol is in the user namespace. */ +#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) +#if 0 /* No need for malloc.h, which pollutes the namespace; + instead, just don't use alloca. */ +#include <malloc.h> +#endif +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +/* I don't know what this was needed for, but it pollutes the namespace. + So I turned it off. rms, 2 May 1997. */ +/* #include <malloc.h> */ + #pragma alloca +#define YYSTACK_USE_ALLOCA +#else /* not MSDOS, or __TURBOC__, or _AIX */ +#if 0 +#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, + and on HPUX 10. Eventually we can turn this on. */ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#endif /* __hpux */ +#endif +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc */ +#endif /* not GNU C */ +#endif /* alloca not defined */ +#endif /* YYSTACK_USE_ALLOCA not defined */ + +#ifdef YYSTACK_USE_ALLOCA +#define YYSTACK_ALLOC alloca +#else +#define YYSTACK_ALLOC malloc +#endif + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto yyerrlab +#define YYRECOVERING() (!!yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +/* Define __yy_memcpy. Note that the size argument + should be passed with type unsigned int, because that is what the non-GCC + definitions require. With GCC, __builtin_memcpy takes an arg + of type size_t, but it can handle unsigned int. */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (to, from, count) + char *to; + char *from; + unsigned int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *to, char *from, unsigned int count) +{ + register char *t = to; + register char *f = from; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + +#line 217 "/usr/lib/bison.simple" + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +#ifdef YYPARSE_PARAM +int yyparse (void *); +#else +int yyparse (void); +#endif +#endif + +int +yyparse(YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) +#endif + + int yystacksize = YYINITDEPTH; + int yyfree_stacks = 0; + +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss - 1; + yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + +#ifdef yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif +#else /* no yyoverflow */ + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 2; + } + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; +#ifndef YYSTACK_USE_ALLOCA + yyfree_stacks = 1; +#endif + yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, + size * (unsigned int) sizeof (*yyssp)); + yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, + size * (unsigned int) sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, + size * (unsigned int) sizeof (*yylsp)); +#endif +#endif /* no yyoverflow */ + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif + + goto yybackup; + yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + + + switch (yyn) { + +case 4: +#line 116 "Gmsh.y" +{ + Msg(PARSER_INFO,"STL File Format"); + STL_Surf = Create_Surface(1,MSH_SURF_STL,1); + STL_Surf->STL = new STL_Data; + return 1; + ; + break;} +case 5: +#line 130 "Gmsh.y" +{ + STL_Surf->STL->Add_Facet( yyvsp[-12].d, yyvsp[-11].d, yyvsp[-10].d, + yyvsp[-8].d, yyvsp[-7].d, yyvsp[-6].d, + yyvsp[-4].d, yyvsp[-3].d, yyvsp[-2].d); + return 1; + ; + break;} +case 6: +#line 137 "Gmsh.y" +{ + Msg(PARSER_INFO,"STL File Format Read"); + Tree_Add(THEM->Surfaces, &STL_Surf); + return 1; + ; + break;} +case 9: +#line 154 "Gmsh.y" +{ return 1; ; + break;} +case 10: +#line 155 "Gmsh.y" +{ return 1; ; + break;} +case 11: +#line 156 "Gmsh.y" +{ return 1; ; + break;} +case 12: +#line 157 "Gmsh.y" +{ yyerrok ; return 1; ; + break;} +case 13: +#line 162 "Gmsh.y" +{ + Msg(PARSER_INFO,"Step Iso-10303-21 File Format"); + Create_Step_Solid_BRep(); + ; + break;} +case 14: +#line 167 "Gmsh.y" +{ + Msg(PARSER_INFO,"Step Iso-10303-21 File Format Read"); + Resolve_BREP (); + ; + break;} +case 18: +#line 178 "Gmsh.y" +{ + ; + break;} +case 19: +#line 181 "Gmsh.y" +{ + ; + break;} +case 20: +#line 185 "Gmsh.y" +{ + ; + break;} +case 21: +#line 191 "Gmsh.y" +{ + Add_Cartesian_Point((int)yyvsp[-8].d,yyvsp[-4].c,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2]); + ; + break;} +case 22: +#line 197 "Gmsh.y" +{ + Add_BSpline_Curve_With_Knots ((int)yyvsp[-22].d, yyvsp[-18].c, (int) yyvsp[-16].d, yyvsp[-14].l, yyvsp[-6].l, yyvsp[-4].l, 0., 1.); + ; + break;} +case 23: +#line 204 "Gmsh.y" +{ + Add_BSpline_Surface_With_Knots ((int)yyvsp[-30].d, yyvsp[-26].c, (int) yyvsp[-24].d, (int) yyvsp[-22].d, yyvsp[-20].l, yyvsp[-10].l, + yyvsp[-8].l, yyvsp[-6].l, yyvsp[-4].l, 0., 1., 0., 1. ); + ; + break;} +case 24: +#line 210 "Gmsh.y" +{ + Add_Edge_Curve ((int)yyvsp[-14].d, yyvsp[-10].c , (int)yyvsp[-8].d , (int)yyvsp[-6].d, (int)yyvsp[-4].d); + ; + break;} +case 25: +#line 214 "Gmsh.y" +{ + Add_Face_Outer_Bound((int)yyvsp[-10].d,yyvsp[-6].c,(int)yyvsp[-4].d,yyvsp[-2].i,1); + ; + break;} +case 26: +#line 218 "Gmsh.y" +{ + /* La je dois voir la norme ! Face_Bound : trou externe a la surface ! */ + Msg(PARSER_INFO,"Found a Face Bound"); + Add_Face_Outer_Bound((int)yyvsp[-10].d,yyvsp[-6].c,(int)yyvsp[-4].d,yyvsp[-2].i,0); + ; + break;} +case 27: +#line 225 "Gmsh.y" +{ + Add_Oriented_Edge((int)yyvsp[-14].d,yyvsp[-10].c,(int)yyvsp[-4].d,yyvsp[-2].i); + ; + break;} +case 28: +#line 229 "Gmsh.y" +{ + Add_Edge_Loop((int)yyvsp[-8].d,yyvsp[-4].c,yyvsp[-2].l); + ; + break;} +case 29: +#line 234 "Gmsh.y" +{ + Add_Advanced_Face((int)yyvsp[-12].d,yyvsp[-8].c,yyvsp[-6].l,(int)yyvsp[-4].d,yyvsp[-2].i); + ; + break;} +case 30: +#line 238 "Gmsh.y" +{ + Add_Vertex_Point((int)yyvsp[-8].d,yyvsp[-4].c,(int)yyvsp[-2].d); + ; + break;} +case 31: +#line 242 "Gmsh.y" +{ + ; + break;} +case 32: +#line 246 "Gmsh.y" +{ + Add_Axis2_Placement3D ( (int)yyvsp[-12].d, (int)yyvsp[-4].d, (int)yyvsp[-2].d, (int)yyvsp[-6].d); + ; + break;} +case 33: +#line 250 "Gmsh.y" +{ + Add_Direction((int)yyvsp[-8].d , yyvsp[-4].c, yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2]); + ; + break;} +case 34: +#line 254 "Gmsh.y" +{ + Add_Plane((int)yyvsp[-8].d,yyvsp[-4].c,(int)yyvsp[-2].d); + ; + break;} +case 35: +#line 258 "Gmsh.y" +{ + Add_Line ((int)yyvsp[-10].d, yyvsp[-6].c , (int) yyvsp[-4].d, (int)yyvsp[-2].d); + ; + break;} +case 36: +#line 262 "Gmsh.y" +{ + Msg(PARSER_INFO,"Found a Closed shell"); + Add_Closed_Shell((int)yyvsp[-8].d, yyvsp[-4].c , yyvsp[-2].l); + ; + break;} +case 37: +#line 268 "Gmsh.y" +{ + ; + break;} +case 38: +#line 271 "Gmsh.y" +{ + ; + break;} +case 39: +#line 274 "Gmsh.y" +{ + Add_Cylinder ((int)yyvsp[-10].d, yyvsp[-6].c , (int)yyvsp[-4].d, yyvsp[-2].d); + ; + break;} +case 40: +#line 278 "Gmsh.y" +{ + Add_Cone ((int)yyvsp[-12].d, yyvsp[-8].c , (int)yyvsp[-6].d, yyvsp[-4].d,yyvsp[-2].d); + ; + break;} +case 41: +#line 282 "Gmsh.y" +{ + Add_Torus ((int)yyvsp[-12].d, yyvsp[-8].c , (int)yyvsp[-6].d, yyvsp[-4].d,yyvsp[-2].d); + ; + break;} +case 42: +#line 286 "Gmsh.y" +{ + Add_Circle((int) yyvsp[-10].d, yyvsp[-6].c, (int) yyvsp[-4].d, yyvsp[-2].d); + ; + break;} +case 43: +#line 290 "Gmsh.y" +{ + Add_Ellipsis((int) yyvsp[-12].d, yyvsp[-8].c, (int) yyvsp[-6].d, yyvsp[-4].d, yyvsp[-2].d); + ; + break;} +case 44: +#line 295 "Gmsh.y" +{ + ; + break;} +case 45: +#line 298 "Gmsh.y" +{ + ; + break;} +case 46: +#line 302 "Gmsh.y" +{ + ; + break;} +case 47: +#line 305 "Gmsh.y" +{ + ; + break;} +case 48: +#line 309 "Gmsh.y" +{ + ; + break;} +case 49: +#line 312 "Gmsh.y" +{ + ; + break;} +case 50: +#line 315 "Gmsh.y" +{ + ; + break;} +case 52: +#line 326 "Gmsh.y" +{ + Msg(PARSER_INFO,"Gmsh File Format Read"); + ; + break;} +case 53: +#line 332 "Gmsh.y" +{ return 1; ; + break;} +case 54: +#line 333 "Gmsh.y" +{ return 1; ; + break;} +case 55: +#line 334 "Gmsh.y" +{ return 1; ; + break;} +case 56: +#line 335 "Gmsh.y" +{ return 1; ; + break;} +case 57: +#line 336 "Gmsh.y" +{ return 1; ; + break;} +case 58: +#line 337 "Gmsh.y" +{ return 1; ; + break;} +case 59: +#line 338 "Gmsh.y" +{ return 1; ; + break;} +case 60: +#line 339 "Gmsh.y" +{ return 1; ; + break;} +case 61: +#line 340 "Gmsh.y" +{ return 1; ; + break;} +case 62: +#line 341 "Gmsh.y" +{ return 1; ; + break;} +case 63: +#line 342 "Gmsh.y" +{ return 1; ; + break;} +case 64: +#line 343 "Gmsh.y" +{ yyerrok; return 1;; + break;} +case 65: +#line 352 "Gmsh.y" +{ + EndView(yyvsp[-4].c,0.,0.,0.); + ; + break;} +case 66: +#line 356 "Gmsh.y" +{ + EndView(yyvsp[-6].c,yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2]); + ; + break;} +case 67: +#line 363 "Gmsh.y" +{ + BeginView(1); + ; + break;} +case 80: +#line 385 "Gmsh.y" +{ + AddView_ScalarSimplex(yyvsp[-25].d,yyvsp[-23].d,yyvsp[-21].d,yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 81: +#line 395 "Gmsh.y" +{ + AddView_VectorSimplex(yyvsp[-25].d,yyvsp[-23].d,yyvsp[-21].d,yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 82: +#line 405 "Gmsh.y" +{ + AddView_TensorSimplex(yyvsp[-25].d,yyvsp[-23].d,yyvsp[-21].d,yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 83: +#line 414 "Gmsh.y" +{ + AddView_ScalarTriangle(yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 84: +#line 423 "Gmsh.y" +{ + AddView_VectorTriangle(yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 85: +#line 432 "Gmsh.y" +{ + AddView_TensorTriangle(yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 86: +#line 440 "Gmsh.y" +{ + AddView_ScalarLine(yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 87: +#line 448 "Gmsh.y" +{ + AddView_VectorLine(yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 88: +#line 456 "Gmsh.y" +{ + AddView_TensorLine(yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 89: +#line 463 "Gmsh.y" +{ + AddView_ScalarPoint(yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 90: +#line 470 "Gmsh.y" +{ + AddView_VectorPoint(yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 91: +#line 477 "Gmsh.y" +{ + AddView_TensorPoint(yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l); + ; + break;} +case 92: +#line 488 "Gmsh.y" +{ + TheSymbol.Name = yyvsp[-3].c; + TheSymbol.val = yyvsp[-1].d; + List_Replace(Symbol_L,&TheSymbol,CompareSymbols); + ; + break;} +case 93: +#line 505 "Gmsh.y" +{ + Cdbpts101((int)yyvsp[-4].d,yyvsp[-1].v[0],yyvsp[-1].v[1],yyvsp[-1].v[2],yyvsp[-1].v[3],yyvsp[-1].v[4]); + yyval.s.Type = MSH_POINT; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 94: +#line 512 "Gmsh.y" +{ + Cdbz101((int)yyvsp[-4].d,MSH_PHYSICAL_POINT,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + yyval.s.Type = MSH_PHYSICAL_POINT; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 95: +#line 518 "Gmsh.y" +{ + Vertex *v; + Attractor *a; + double p; + int ip; + for(int i=0;i<List_Nbr(yyvsp[-1].l);i++){ + List_Read(yyvsp[-1].l,i,&p); + ip = (int)p; + v = FindVertex(ip,THEM); + if(!v) + vyyerror("Unkown Point %d", ip); + else{ + a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1, + yyvsp[-8].d,yyvsp[-6].d,yyvsp[-4].d,v,NULL,NULL); + List_Add(THEM->Metric->Attractors,&a); + } + } + ; + break;} +case 96: +#line 537 "Gmsh.y" +{ + for(i=0;i<List_Nbr(yyvsp[-3].l);i++){ + List_Read(yyvsp[-3].l,i,&d); + Vertex *v = FindVertex((int)d,THEM); + if(!v) + vyyerror("Unkown Point %d", (int)d); + else + v->lc = yyvsp[-1].d; + } + ; + break;} +case 97: +#line 548 "Gmsh.y" +{ + yyval.s.Type = MSH_POINT; + yyval.s.Num = (int)yyvsp[-2].d; + ; + break;} +case 98: +#line 556 "Gmsh.y" +{ + Cdbseg101((int)yyvsp[-4].d,MSH_SEGM_LINE,1,yyvsp[-1].l,NULL,-1,-1,0.,1.,NULL,NULL,NULL); + yyval.s.Type = MSH_SEGM_LINE; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 99: +#line 562 "Gmsh.y" +{ + Cdbseg101((int)yyvsp[-4].d,MSH_SEGM_SPLN,3,yyvsp[-1].l,NULL,-1,-1,0.,1.,NULL,NULL,NULL); + yyval.s.Type = MSH_SEGM_SPLN; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 100: +#line 568 "Gmsh.y" +{ + Curve *c; + Attractor *a; + double p; + int ip; + for(int i=0;i<List_Nbr(yyvsp[-1].l);i++){ + List_Read(yyvsp[-1].l,i,&p); + ip = (int)p; + c = FindCurve(ip,THEM); + if(!c) + vyyerror("Unkown Curve %d", ip); + else{ + a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1, + yyvsp[-8].d,yyvsp[-6].d,yyvsp[-4].d,NULL,c,NULL); + List_Add(THEM->Metric->Attractors,&a); + } + } + ; + break;} +case 101: +#line 587 "Gmsh.y" +{ + Cdbseg101((int)yyvsp[-4].d,MSH_SEGM_CIRC,2,yyvsp[-1].l,NULL,-1,-1,0.,1.,NULL,NULL,NULL); + yyval.s.Type = MSH_SEGM_CIRC ; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 102: +#line 593 "Gmsh.y" +{ + List_T *temp; + int i,j; + double d; + temp = List_Create(List_Nbr(yyvsp[-3].l),1,sizeof(int)); + for(i=0;i<List_Nbr(yyvsp[-3].l);i++){ + List_Read(yyvsp[-3].l,i,&d); + j = (int)d; + List_Add(temp,&j); + } + AddCircleInDataBase ((int) yyvsp[-6].d, MSH_SEGM_CIRC, temp, yyvsp[-1].v); + List_Delete(temp); + yyval.s.Type = MSH_SEGM_CIRC ; + yyval.s.Num = (int)yyvsp[-6].d; + ; + break;} +case 103: +#line 610 "Gmsh.y" +{ + Cdbseg101((int)yyvsp[-14].d,MSH_SEGM_PARAMETRIC,2,NULL,NULL,-1,-1,yyvsp[-10].d,yyvsp[-8].d,yyvsp[-6].c,yyvsp[-4].c,yyvsp[-2].c); + yyval.s.Type = MSH_SEGM_PARAMETRIC ; + yyval.s.Num = (int)yyvsp[-14].d; + ; + break;} +case 104: +#line 616 "Gmsh.y" +{ + Cdbseg101((int)yyvsp[-4].d,MSH_SEGM_ELLI,2,yyvsp[-1].l,NULL,-1,-1,0.,1.,NULL,NULL,NULL); + yyval.s.Type = MSH_SEGM_ELLI ; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 105: +#line 622 "Gmsh.y" +{ + Cdbz101((int)yyvsp[-4].d,MSH_PHYSICAL_LINE,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + yyval.s.Type = MSH_PHYSICAL_LINE; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 106: +#line 628 "Gmsh.y" +{ + yyval.s.Type = MSH_SEGM_LOOP; + Cdbz101((int)yyvsp[-4].d,yyval.s.Type,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 107: +#line 634 "Gmsh.y" +{ + yyval.s.Num = (int)yyvsp[-2].d; + Curve *c = FindCurve(yyval.s.Num,THEM); + if(!c) + vyyerror("Unkown Curve %d", yyval.s.Num); + else + yyval.s.Type = c->Typ; + ; + break;} +case 108: +#line 643 "Gmsh.y" +{ + Cdbseg101((int)yyvsp[-4].d,MSH_SEGM_BSPLN,2,yyvsp[-1].l,NULL,-1,-1,0.,1.,NULL,NULL,NULL); + yyval.s.Type = MSH_SEGM_BSPLN; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 109: +#line 649 "Gmsh.y" +{ + List_T *Temp; + int i; + double d; + if(List_Nbr(yyvsp[-5].l) + (int)yyvsp[-1].d + 1 != List_Nbr(yyvsp[-3].l)){ + yyerror("wrong nurbs curve definition (deg + 1 + nbpts != nbknots)"); + } + Temp = List_Create(List_Nbr(yyvsp[-5].l),1,sizeof(int)); + for(i=0;i<List_Nbr(yyvsp[-5].l);i++) { + List_Read(yyvsp[-5].l,i,&d); + j = (int)d; + List_Add(Temp,&j); + } + AddCurveInDataBase ((int)yyvsp[-8].d,MSH_SEGM_NURBS,(int)yyvsp[-1].d,Temp,yyvsp[-3].l,-1,-1,0.,1.); + List_Delete(Temp); + ; + break;} +case 110: +#line 669 "Gmsh.y" +{ + Cdbz101((int)yyvsp[-4].d,MSH_SURF_PLAN,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + yyval.s.Type = MSH_SURF_PLAN; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 111: +#line 675 "Gmsh.y" +{ + Surface *s,*support; + support = FindSurface((int)yyvsp[-2].d,THEM); + if(!support) + vyyerror("Unkown Surface %d", (int)yyvsp[-2].d); + else{ + Cdbz101((int)yyvsp[-5].d,MSH_SURF_PLAN,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + s = FindSurface((int)yyvsp[-5].d,THEM); + if(!s) + vyyerror("Unkown Surface %d", (int)yyvsp[-5].d); + else{ + s->Typ = MSH_SURF_TRIMMED; + s->Support = support; + yyval.s.Type = MSH_SURF_TRIMMED; + yyval.s.Num = (int)yyvsp[-5].d; + } + } + ; + break;} +case 112: +#line 694 "Gmsh.y" +{ + List_Read(yyvsp[-1].l,0,&d); + i = (int)d; + EdgeLoop *el = FindEdgeLoop(i,THEM); + if(!el) + vyyerror("Unkown Loop %d", i); + else{ + j = List_Nbr(el->Curves); + if(j==4) + yyval.s.Type = MSH_SURF_REGL; + else if(j==3) + yyval.s.Type = MSH_SURF_TRIC; + else + vyyerror("Ruled surface %d has not 3 or 4 borders", yyvsp[-4].d); + Cdbz101((int)yyvsp[-4].d,yyval.s.Type,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + yyval.s.Num = (int)yyvsp[-4].d; + } + ; + break;} +case 113: +#line 715 "Gmsh.y" +{ + CreateNurbsSurface ( (int) yyvsp[-16].d , (int)yyvsp[-4].d , (int)yyvsp[-2].d , yyvsp[-13].l, yyvsp[-10].l, yyvsp[-8].l); + yyval.s.Type = MSH_SURF_NURBS; + yyval.s.Num = (int)yyvsp[-16].d; + ; + break;} +case 114: +#line 723 "Gmsh.y" +{ + CreateNurbsSurfaceSupport ((int)yyvsp[-16].d, (int) yyvsp[-4].d , (int) yyvsp[-2].d , yyvsp[-13].l, yyvsp[-10].l, yyvsp[-8].l); + ; + break;} +case 115: +#line 727 "Gmsh.y" +{ + Cdbz101((int)yyvsp[-4].d,MSH_PHYSICAL_SURFACE,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + yyval.s.Type = MSH_PHYSICAL_SURFACE; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 116: +#line 733 "Gmsh.y" +{ + Cdbz101((int)yyvsp[-4].d,MSH_SURF_LOOP,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + yyval.s.Type = MSH_SURF_LOOP; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 117: +#line 739 "Gmsh.y" +{ + yyval.s.Num = (int)yyvsp[-2].d; + Surface *s = FindSurface(yyval.s.Num,THEM); + if(!s) + vyyerror("Unkown Surface %d", yyval.s.Num); + else + yyval.s.Type = s->Typ; + ; + break;} +case 118: +#line 751 "Gmsh.y" +{ + Cdbz101((int)yyvsp[-4].d,MSH_VOLUME,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + yyval.s.Type = MSH_VOLUME; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 119: +#line 757 "Gmsh.y" +{ + Cdbz101((int)yyvsp[-4].d,MSH_VOLUME,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + yyval.s.Type = MSH_VOLUME; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 120: +#line 763 "Gmsh.y" +{ + Cdbz101((int)yyvsp[-4].d,MSH_PHYSICAL_VOLUME,0,0,0,0,0,NULL,yyvsp[-1].l,NULL); + yyval.s.Type = MSH_PHYSICAL_VOLUME; + yyval.s.Num = (int)yyvsp[-4].d; + ; + break;} +case 121: +#line 776 "Gmsh.y" +{ + TranslateShapes (yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-1].l,1); + yyval.l = yyvsp[-1].l; + ; + break;} +case 122: +#line 781 "Gmsh.y" +{ + RotateShapes(yyvsp[-8].v[0],yyvsp[-8].v[1],yyvsp[-8].v[2],yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].d,yyvsp[-1].l); + yyval.l = yyvsp[-1].l; + ; + break;} +case 123: +#line 786 "Gmsh.y" +{ + SymetryShapes(yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-4].v[3],yyvsp[-1].l,1); + yyval.l = yyvsp[-1].l; + ; + break;} +case 124: +#line 791 "Gmsh.y" +{ + DilatShapes(yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].d,yyvsp[-1].l,1); + yyval.l = yyvsp[-1].l; + ; + break;} +case 125: +#line 798 "Gmsh.y" +{ yyval.l = yyvsp[0].l; ; + break;} +case 126: +#line 799 "Gmsh.y" +{ yyval.l = yyvsp[0].l; ; + break;} +case 127: +#line 800 "Gmsh.y" +{ yyval.l = yyvsp[0].l; ; + break;} +case 128: +#line 805 "Gmsh.y" +{ + yyval.l = List_Create(3,3,sizeof(Shape)); + ; + break;} +case 129: +#line 809 "Gmsh.y" +{ + List_Add(yyval.l,&yyvsp[0].s); + yyval.l = yyvsp[-1].l; + ; + break;} +case 130: +#line 821 "Gmsh.y" +{ + yyval.l = List_Create(3,3,sizeof(Shape)); + for(i=0;i<List_Nbr(yyvsp[-1].l);i++){ + List_Read (yyvsp[-1].l,i,&TheShape); + CopyShape(TheShape.Type,TheShape.Num,&j); + TheShape.Num = j; + List_Add(yyval.l,&TheShape); + } + ; + break;} +case 131: +#line 839 "Gmsh.y" +{ + for(i=0;i<List_Nbr(yyvsp[-1].l);i++){ + List_Read (yyvsp[-1].l,i,&TheShape); + DeleteShape(TheShape.Type,TheShape.Num); + } + ; + break;} +case 132: +#line 854 "Gmsh.y" +{ + yyinTab[RecursionLevel++] = yyin; + strcpy(tmpstring, ThePathForIncludes); + if((yyin = fopen(strcat(tmpstring,yyvsp[-1].c),"r"))){ + strcpy(yynameTab[RecursionLevel-1],yyname); + yylinenoTab[RecursionLevel-1]=yylineno; + yylineno=1; + strcpy(yyname,yyvsp[-1].c); + while(!feof(yyin)){ + yyparse(); + } + fclose(yyin); + yyin = yyinTab[--RecursionLevel]; + strcpy(yyname,yynameTab[RecursionLevel]); + yylineno = yylinenoTab[RecursionLevel]; + } + else{ + vyyerror("Unknown file: %s", yyvsp[-1].c) ; + yyin = yyinTab[--RecursionLevel]; + } + ; + break;} +case 133: +#line 885 "Gmsh.y" +{ + Extrude_ProtudeSurface(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,0,NULL); + ; + break;} +case 134: +#line 889 "Gmsh.y" +{ + Extrude_ProtudeSurface(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,0,NULL); + ; + break;} +case 135: +#line 893 "Gmsh.y" +{ + Extrude_ProtudeSurface(0,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,0,NULL); + ; + break;} +case 136: +#line 897 "Gmsh.y" +{ + Extrude_ProtudeSurface(0,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,0,NULL); + ; + break;} +case 137: +#line 901 "Gmsh.y" +{ + Curve *pc, *prc; + Extrude_ProtudePoint(0,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d, + &pc,&prc,NULL); + ; + break;} +case 138: +#line 907 "Gmsh.y" +{ + Curve *pc, *prc; + Extrude_ProtudePoint(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,&pc,&prc,NULL); + ; + break;} +case 139: +#line 912 "Gmsh.y" +{ + Extrude_ProtudeCurve(0,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,NULL); + ; + break;} +case 140: +#line 916 "Gmsh.y" +{ + Extrude_ProtudeCurve(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,NULL); + ; + break;} +case 141: +#line 920 "Gmsh.y" +{ + int vol = NEWREG(); + Extrude_ProtudeSurface(1,(int)yyvsp[-7].d,yyvsp[-5].v[0],yyvsp[-5].v[1],yyvsp[-5].v[2],0.,0.,0.,0.,vol,&extr); + ; + break;} +case 142: +#line 926 "Gmsh.y" +{ + int vol = NEWREG(); + Extrude_ProtudeSurface(0,(int)yyvsp[-11].d,yyvsp[-9].v[0],yyvsp[-9].v[1],yyvsp[-9].v[2],yyvsp[-7].v[0],yyvsp[-7].v[1],yyvsp[-7].v[2],yyvsp[-5].d,vol,&extr); + ; + break;} +case 143: +#line 934 "Gmsh.y" +{ + ; + break;} +case 144: +#line 937 "Gmsh.y" +{ + ; + break;} +case 145: +#line 943 "Gmsh.y" +{ + double d; + int j; + extr.mesh.NbLayer = List_Nbr(yyvsp[-6].l); + extr.mesh.ExtrudeMesh = true; + for(int i=0;i<List_Nbr(yyvsp[-6].l);i++){ + List_Read(yyvsp[-6].l,i,&d); + j = (int)d; + extr.mesh.NbElmLayer[i] = j; + List_Read(yyvsp[-4].l,i,&d); + j = (int)d; + extr.mesh.ZonLayer[i] = j; + List_Read(yyvsp[-2].l,i,&d); + extr.mesh.hLayer[i] = d; + } + ; + break;} +case 146: +#line 967 "Gmsh.y" +{ + Curve *c; + for(i=0;i<List_Nbr(yyvsp[-3].l);i++){ + List_Read(yyvsp[-3].l,i,&d); + j = (int)fabs(d); + c = FindCurve(j,THEM); + if(!c) + vyyerror("Unkown Curve %d", j); + else{ + c->Method = TRANSFINI; + c->ipar[0] = (int)yyvsp[-1].d; + c->ipar[1] = sign(d); + c->dpar[0] = 1.0; + } + } + ; + break;} +case 147: +#line 984 "Gmsh.y" +{ + Curve *c; + for(i=0;i<List_Nbr(yyvsp[-6].l);i++){ + List_Read(yyvsp[-6].l,i,&d); + j = (int)fabs(d); + c = FindCurve(j,THEM); + if(!c) + vyyerror("Unkown Curve %d", j); + else{ + c->Method = TRANSFINI; + c->ipar[0] = (int)yyvsp[-4].d; + c->ipar[1] = sign(d); /* Power : code 1 ou -1 */ + c->dpar[0] = yyvsp[-1].d; + } + } + ; + break;} +case 148: +#line 1001 "Gmsh.y" +{ + Curve *c; + for(i=0;i<List_Nbr(yyvsp[-6].l);i++){ + List_Read(yyvsp[-6].l,i,&d); + j = (int)fabs(d); + c = FindCurve(j,THEM); + if(!c) + vyyerror("Unkown Curve %d", j); + else{ + c->Method = TRANSFINI; + c->ipar[0] = (int)yyvsp[-4].d; + c->ipar[1] = 2*sign(d); /* Bump : code 2 ou -2 */ + c->dpar[0] = yyvsp[-1].d; + } + } + ; + break;} +case 149: +#line 1018 "Gmsh.y" +{ + Curve *c; + for(i=0;i<List_Nbr(yyvsp[-6].l);i++){ + List_Read(yyvsp[-6].l,i,&d); + j = (int)fabs(d); + c = FindCurve(j,THEM); + if(!c) + vyyerror("Unkown Curve %d", j); + else{ + c->Method = TRANSFINI; + c->ipar[0] = (int)yyvsp[-4].d; + c->ipar[1] = 3*sign(d); /* Progresion : code 3 ou -3 */ + c->dpar[0] = yyvsp[-1].d; + } + } + ; + break;} +case 150: +#line 1035 "Gmsh.y" +{ + Surface *s = FindSurface((int)yyvsp[-4].d,THEM); + if(!s) + vyyerror("Unkown Surface %d", (int)yyvsp[-4].d); + else{ + s->Method = TRANSFINI; + k = List_Nbr(yyvsp[-1].l); + if(k!=3 && k!=4){ + vyyerror("Bad Number of Points for Transfinite Surface %d", yyvsp[-4].d) ; + } + else{ + for(i=0;i<k;i++){ + List_Read(yyvsp[-1].l,i,&d); + j = (int)fabs(d); + s->ipar[i] = j; + } + } + } + ; + break;} +case 151: +#line 1055 "Gmsh.y" +{ + Surface *s = FindSurface((int)yyvsp[-4].d,THEM); + if(!s) + vyyerror("Unkown Surface %d", (int)yyvsp[-4].d); + else{ + s->Method = ELLIPTIC; + k = List_Nbr(yyvsp[-1].l); + if(k != 4) + vyyerror("Bad Number of Points for Elliptic Surface %d", yyvsp[-4].d) ; + else{ + for(i=0;i<k;i++){ + List_Read(yyvsp[-1].l,i,&d); + j = (int)fabs(d); + s->ipar[i] = j; + } + } + } + ; + break;} +case 152: +#line 1074 "Gmsh.y" +{ + Volume *v = FindVolume((int)yyvsp[-4].d,THEM); + if(!v) + vyyerror("Unkown Volume %d", (int)yyvsp[-4].d); + else{ + v->Method = TRANSFINI; + k = List_Nbr(yyvsp[-1].l); + if(k!=6 && k!=8) + vyyerror("Bad Number of Points for Transfinite Volume %d", yyvsp[-4].d) ; + else{ + for(i=0;i<k;i++){ + List_Read(yyvsp[-1].l,i,&d); + j = (int)fabs(d); + v->ipar[i] = j; + } + } + } + ; + break;} +case 153: +#line 1093 "Gmsh.y" +{ + Surface *s; + for(i=0;i<List_Nbr(yyvsp[-3].l);i++){ + List_Read(yyvsp[-3].l,i,&d); + j = (int)d; + s = FindSurface(j,THEM); + if(!s) + vyyerror("Unkown Surface %d", j); + else{ + s->Recombine = 1; + s->RecombineAngle = yyvsp[-1].d; + } + } + ; + break;} +case 154: +#line 1108 "Gmsh.y" +{ + Surface *s; + for(i=0;i<List_Nbr(yyvsp[-1].l);i++){ + List_Read(yyvsp[-1].l,i,&d); + j = (int)d; + s = FindSurface(j,THEM); + if(!s) + vyyerror("Unkown Surface %d", j); + else{ + s->Recombine = 1; + s->RecombineAngle = 30.; + } + } + ; + break;} +case 155: +#line 1123 "Gmsh.y" +{ + Msg(PARSER_ERROR, "Physical Associations do not exist anymore!"); + ; + break;} +case 156: +#line 1135 "Gmsh.y" +{ + Coherence_PS(); + ; + break;} +case 160: +#line 1155 "Gmsh.y" +{ ColorField = ColorGeneral; ; + break;} +case 162: +#line 1158 "Gmsh.y" +{ ColorField = ColorGeometry; ; + break;} +case 164: +#line 1161 "Gmsh.y" +{ ColorField = ColorMesh; ; + break;} +case 168: +#line 1172 "Gmsh.y" +{ + i = Get_ColorForString(ColorString, -1, yyvsp[-1].c, &flag); + if(flag) vyyerror("Unknown Color: %s", yyvsp[-1].c); + Get_ColorPointerForString(ColorField, yyvsp[-3].c, &flag, &ptr); + if(flag) + vyyerror("Unknown Color Field: %s", yyvsp[-3].c); + else + *ptr = i ; + ; + break;} +case 169: +#line 1182 "Gmsh.y" +{ + i = Get_ColorForString(ColorString, (int)yyvsp[-2].d, yyvsp[-4].c, &flag); + if(flag) vyyerror("Unknown Color: %s", yyvsp[-4].c); + Get_ColorPointerForString(ColorField, yyvsp[-7].c, &flag, &ptr); + if(flag) + vyyerror("Unknown Color Field: %s", yyvsp[-7].c); + else + *ptr = i ; + ; + break;} +case 170: +#line 1192 "Gmsh.y" +{ + Get_ColorPointerForString(ColorField, yyvsp[-3].c, &flag, &ptr); + if(flag) + vyyerror("Unknown Color Field: %s", yyvsp[-1].v); + else + *ptr = PACK_COLOR((int)yyvsp[-1].v[0], (int)yyvsp[-1].v[1], (int)yyvsp[-1].v[2], (int)yyvsp[-1].v[3]); + ; + break;} +case 171: +#line 1203 "Gmsh.y" +{ + yyval.v[0]=yyvsp[-7].d; + yyval.v[1]=yyvsp[-5].d; + yyval.v[2]=yyvsp[-3].d; + yyval.v[3]=yyvsp[-1].d; + ; + break;} +case 172: +#line 1210 "Gmsh.y" +{ + yyval.v[0]=yyvsp[-5].d; + yyval.v[1]=yyvsp[-3].d; + yyval.v[2]=yyvsp[-1].d; + yyval.v[3]=255.; + ; + break;} +case 173: +#line 1286 "Gmsh.y" +{yyval.i = 1;; + break;} +case 174: +#line 1287 "Gmsh.y" +{yyval.i = 0;; + break;} +case 175: +#line 1288 "Gmsh.y" +{yyval.i = -1;; + break;} +case 176: +#line 1289 "Gmsh.y" +{yyval.i = -1;; + break;} +case 177: +#line 1290 "Gmsh.y" +{yyval.i = -1;; + break;} +case 178: +#line 1294 "Gmsh.y" +{ yyval.d = yyvsp[0].d; ; + break;} +case 179: +#line 1295 "Gmsh.y" +{ yyval.d = yyvsp[-1].d; ; + break;} +case 180: +#line 1296 "Gmsh.y" +{ yyval.d = yyvsp[-2].d - yyvsp[0].d; ; + break;} +case 181: +#line 1297 "Gmsh.y" +{ yyval.d = yyvsp[-2].d + yyvsp[0].d; ; + break;} +case 182: +#line 1298 "Gmsh.y" +{ yyval.d = yyvsp[-2].d * yyvsp[0].d; ; + break;} +case 183: +#line 1299 "Gmsh.y" +{ yyval.d = yyvsp[-2].d / yyvsp[0].d; ; + break;} +case 184: +#line 1300 "Gmsh.y" +{ yyval.d = pow(yyvsp[-2].d, yyvsp[0].d); ; + break;} +case 185: +#line 1301 "Gmsh.y" +{ yyval.d = - yyvsp[0].d; ; + break;} +case 186: +#line 1302 "Gmsh.y" +{ yyval.d = yyvsp[0].d; ; + break;} +case 187: +#line 1303 "Gmsh.y" +{ yyval.d = exp(yyvsp[-1].d); ; + break;} +case 188: +#line 1304 "Gmsh.y" +{ yyval.d = log(yyvsp[-1].d); ; + break;} +case 189: +#line 1305 "Gmsh.y" +{ yyval.d = log10(yyvsp[-1].d); ; + break;} +case 190: +#line 1306 "Gmsh.y" +{ yyval.d = sqrt(yyvsp[-1].d); ; + break;} +case 191: +#line 1307 "Gmsh.y" +{ yyval.d = sin(yyvsp[-1].d); ; + break;} +case 192: +#line 1308 "Gmsh.y" +{ yyval.d = asin(yyvsp[-1].d); ; + break;} +case 193: +#line 1309 "Gmsh.y" +{ yyval.d = cos(yyvsp[-1].d); ; + break;} +case 194: +#line 1310 "Gmsh.y" +{ yyval.d = acos(yyvsp[-1].d); ; + break;} +case 195: +#line 1311 "Gmsh.y" +{ yyval.d = tan(yyvsp[-1].d); ; + break;} +case 196: +#line 1312 "Gmsh.y" +{ yyval.d = atan(yyvsp[-1].d); ; + break;} +case 197: +#line 1313 "Gmsh.y" +{ yyval.d = atan2(yyvsp[-3].d,yyvsp[-1].d); ; + break;} +case 198: +#line 1314 "Gmsh.y" +{ yyval.d = sinh(yyvsp[-1].d); ; + break;} +case 199: +#line 1315 "Gmsh.y" +{ yyval.d = cosh(yyvsp[-1].d); ; + break;} +case 200: +#line 1316 "Gmsh.y" +{ yyval.d = tanh(yyvsp[-1].d); ; + break;} +case 201: +#line 1317 "Gmsh.y" +{ yyval.d = fabs(yyvsp[-1].d); ; + break;} +case 202: +#line 1318 "Gmsh.y" +{ yyval.d = floor(yyvsp[-1].d); ; + break;} +case 203: +#line 1319 "Gmsh.y" +{ yyval.d = ceil(yyvsp[-1].d); ; + break;} +case 204: +#line 1320 "Gmsh.y" +{ yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d); ; + break;} +case 205: +#line 1321 "Gmsh.y" +{ yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d); ; + break;} +case 206: +#line 1322 "Gmsh.y" +{ yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ; + break;} +case 207: +#line 1326 "Gmsh.y" +{ yyval.d = yyvsp[0].d; ; + break;} +case 208: +#line 1327 "Gmsh.y" +{ yyval.d = 3.141592653589793; ; + break;} +case 209: +#line 1329 "Gmsh.y" +{ + TheSymbol.Name = yyvsp[0].c ; + if (!List_Query(Symbol_L, &TheSymbol, CompareSymbols)) { + vyyerror("Unknown variable: %s", yyvsp[0].c) ; yyval.d = 0. ; + } + else yyval.d = TheSymbol.val ; + Free(yyvsp[0].c); + ; + break;} +case 210: +#line 1341 "Gmsh.y" +{ + ListOfDouble2_L = List_Create(2,1,sizeof(double)) ; + for(d=yyvsp[-2].d ; (yyvsp[-2].d<yyvsp[0].d)?(d<=yyvsp[0].d):(d>=yyvsp[0].d) ; (yyvsp[-2].d<yyvsp[0].d)?(d+=1.):(d-=1.)) + List_Add(ListOfDouble2_L, &d) ; + ; + break;} +case 211: +#line 1347 "Gmsh.y" +{ + ListOfDouble2_L = List_Create(2,1,sizeof(double)) ; + if(!yyvsp[-2].d || (yyvsp[-5].d<yyvsp[0].d && yyvsp[-2].d<0) || (yyvsp[-5].d>yyvsp[0].d && yyvsp[-2].d>0)){ + vyyerror("Wrong Increment in '%g :[%g] %g'", yyvsp[-5].d, yyvsp[-2].d, yyvsp[0].d) ; + List_Add(ListOfDouble2_L, &(yyvsp[-5].d)) ; + } + else + for(d=yyvsp[-5].d ; (yyvsp[-2].d>0)?(d<=yyvsp[0].d):(d>=yyvsp[0].d) ; d+=yyvsp[-2].d) + List_Add(ListOfDouble2_L, &d) ; + ; + break;} +case 212: +#line 1361 "Gmsh.y" +{ + yyval.v[0]=yyvsp[-9].d; + yyval.v[1]=yyvsp[-7].d; + yyval.v[2]=yyvsp[-5].d; + yyval.v[3]=yyvsp[-3].d; + yyval.v[4]=yyvsp[-1].d; + ; + break;} +case 213: +#line 1369 "Gmsh.y" +{ + yyval.v[0]=yyvsp[-7].d; + yyval.v[1]=yyvsp[-5].d; + yyval.v[2]=yyvsp[-3].d; + yyval.v[3]=yyvsp[-1].d; + yyval.v[4]=1.0; + ; + break;} +case 214: +#line 1377 "Gmsh.y" +{ + yyval.v[0]=yyvsp[-5].d; + yyval.v[1]=yyvsp[-3].d; + yyval.v[2]=yyvsp[-1].d; + yyval.v[3]=0.0; + yyval.v[4]=1.0; + ; + break;} +case 215: +#line 1385 "Gmsh.y" +{ + yyval.v[0]=yyvsp[-5].d; + yyval.v[1]=yyvsp[-3].d; + yyval.v[2]=yyvsp[-1].d; + yyval.v[3]=0.0; + yyval.v[4]=1.0; + ; + break;} +case 216: +#line 1396 "Gmsh.y" +{ + ; + break;} +case 217: +#line 1399 "Gmsh.y" +{ + ; + break;} +case 218: +#line 1405 "Gmsh.y" +{ + ; + break;} +case 219: +#line 1408 "Gmsh.y" +{ + ; + break;} +case 220: +#line 1414 "Gmsh.y" +{ + ; + break;} +case 221: +#line 1417 "Gmsh.y" +{ + yyval.l=ListOfListOfDouble_L; + ; + break;} +case 222: +#line 1421 "Gmsh.y" +{ + yyval.l=ListOfListOfDouble_L; + ; + break;} +case 223: +#line 1428 "Gmsh.y" +{ + ListOfListOfDouble_L = List_Create(2,1,sizeof(List_T*)) ; + List_Add(ListOfListOfDouble_L, &(yyvsp[0].l)) ; + ; + break;} +case 224: +#line 1433 "Gmsh.y" +{ + List_Add(ListOfListOfDouble_L, &(yyvsp[0].l)) ; + ; + break;} +case 225: +#line 1440 "Gmsh.y" +{ + ; + break;} +case 226: +#line 1443 "Gmsh.y" +{ + ListOfDouble_L = List_Create(2,1,sizeof(double)) ; + List_Add(ListOfDouble_L, &(yyvsp[0].d)) ; + yyval.l=ListOfDouble_L; + ; + break;} +case 227: +#line 1449 "Gmsh.y" +{ + yyval.l=ListOfDouble_L; + ; + break;} +case 228: +#line 1463 "Gmsh.y" +{ + ListOfDouble_L = List_Create(2,1,sizeof(double)) ; + List_Add(ListOfDouble_L, &(yyvsp[0].d)) ; + ; + break;} +case 229: +#line 1468 "Gmsh.y" +{ + ListOfDouble_L = List_Create(2,1,sizeof(double)) ; + for(i=0 ; i<List_Nbr(ListOfDouble2_L) ; i++){ + List_Read(ListOfDouble2_L, i, &d) ; + List_Add(ListOfDouble_L, &d) ; + } + List_Delete(ListOfDouble2_L); + ; + break;} +case 230: +#line 1477 "Gmsh.y" +{ + List_Add(ListOfDouble_L, &(yyvsp[0].d)) ; + ; + break;} +case 231: +#line 1481 "Gmsh.y" +{ + for(i=0 ; i<List_Nbr(ListOfDouble2_L) ; i++){ + List_Read(ListOfDouble2_L, i, &d) ; + List_Add(ListOfDouble_L, &d) ; + } + List_Delete(ListOfDouble2_L); + ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 543 "/usr/lib/bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); + } + + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif + + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + + if (yyn == YYFINAL) + YYACCEPT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + yystate = yyn; + goto yynewstate; + + yyacceptlab: + /* YYACCEPT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 0; + + yyabortlab: + /* YYABORT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 1; +} +#line 1491 "Gmsh.y" + + +void InitSymbols(void){ + Symbol_L = List_Create(10,1,sizeof(Symbol)); +} + +void DeleteSymbols(void){ + List_Delete(Symbol_L); +} + +int CompareSymbols (const void *a, const void *b){ + return(strcmp(((Symbol*)a)->Name,((Symbol*)b)->Name)); +} + +void yyerror(char *s){ + Msg(PARSER_ERROR, "'%s', line %d : %s (%s)",yyname,yylineno-1,s,yytext); + yyerrorstate=1; +} + +void vyyerror (char *fmt, ...){ + va_list args; + char tmp[TEXT_BUFFER_SIZE]; + + va_start (args, fmt); + vsprintf (tmp, fmt, args); + va_end (args); + + Msg(PARSER_ERROR, "'%s', line %d : %s", yyname, yylineno-1, tmp); + yyerrorstate=1; +} + +int Get_ColorForString(StringX4Int SX4I[], int alpha, + char * string, int * FlagError) { + int i = 0 ; + while ((SX4I[i].string != NULL) && (strcmp(SX4I[i].string, string))) i++ ; + *FlagError = (SX4I[i].string == NULL)? 1 : 0 ; + if(alpha > 0) + return PACK_COLOR(SX4I[i].int1,SX4I[i].int2,SX4I[i].int3,alpha) ; + else + return PACK_COLOR(SX4I[i].int1,SX4I[i].int2,SX4I[i].int3,SX4I[i].int4) ; +} + +void Get_ColorPointerForString(StringXPointer SXP[], char * string, + int * FlagError, unsigned int **Pointer) { + int i = 0 ; + while ((SXP[i].string != NULL) && (strcmp(SXP[i].string, string))) i++ ; + *FlagError = (SXP[i].string == NULL)? 1 : 0 ; + *Pointer = (unsigned int *)SXP[i].Pointer ; +} + diff --git a/Parser/Gmsh.tab.cpp.h b/Parser/Gmsh.tab.cpp.h new file mode 100644 index 0000000000000000000000000000000000000000..50f123565a41e0740b22759660fa47a20efafebe --- /dev/null +++ b/Parser/Gmsh.tab.cpp.h @@ -0,0 +1,150 @@ +typedef union { + char *c; + int i; + double d; + double v[5]; + Shape s; + List_T *l; +} YYSTYPE; +#define tDOUBLE 257 +#define tSTRING 258 +#define tBIGSTR 259 +#define tEND 260 +#define tAFFECT 261 +#define tDOTS 262 +#define tPi 263 +#define tExp 264 +#define tLog 265 +#define tLog10 266 +#define tSqrt 267 +#define tSin 268 +#define tAsin 269 +#define tCos 270 +#define tAcos 271 +#define tTan 272 +#define tAtan 273 +#define tAtan2 274 +#define tSinh 275 +#define tCosh 276 +#define tTanh 277 +#define tFabs 278 +#define tFloor 279 +#define tCeil 280 +#define tFmod 281 +#define tModulo 282 +#define tHypot 283 +#define tPoint 284 +#define tCircle 285 +#define tEllipsis 286 +#define tLine 287 +#define tSurface 288 +#define tSpline 289 +#define tVolume 290 +#define tCharacteristic 291 +#define tLength 292 +#define tParametric 293 +#define tElliptic 294 +#define tPlane 295 +#define tRuled 296 +#define tTransfinite 297 +#define tComplex 298 +#define tPhysical 299 +#define tUsing 300 +#define tPower 301 +#define tBump 302 +#define tProgression 303 +#define tAssociation 304 +#define tRotate 305 +#define tTranslate 306 +#define tSymetry 307 +#define tDilate 308 +#define tExtrude 309 +#define tDuplicata 310 +#define tLoop 311 +#define tInclude 312 +#define tRecombine 313 +#define tDelete 314 +#define tCoherence 315 +#define tView 316 +#define tOffset 317 +#define tAttractor 318 +#define tLayers 319 +#define tScalarSimplex 320 +#define tVectorSimplex 321 +#define tTensorSimplex 322 +#define tScalarTriangle 323 +#define tVectorTriangle 324 +#define tTensorTriangle 325 +#define tScalarLine 326 +#define tVectorLine 327 +#define tTensorLine 328 +#define tScalarPoint 329 +#define tVectorPoint 330 +#define tTensorPoint 331 +#define tBSpline 332 +#define tNurbs 333 +#define tOrder 334 +#define tWith 335 +#define tBounds 336 +#define tKnots 337 +#define tColor 338 +#define tGeneral 339 +#define tGeometry 340 +#define tMesh 341 +#define tB_SPLINE_SURFACE_WITH_KNOTS 342 +#define tB_SPLINE_CURVE_WITH_KNOTS 343 +#define tCARTESIAN_POINT 344 +#define tTRUE 345 +#define tFALSE 346 +#define tUNSPECIFIED 347 +#define tU 348 +#define tV 349 +#define tEDGE_CURVE 350 +#define tVERTEX_POINT 351 +#define tORIENTED_EDGE 352 +#define tPLANE 353 +#define tFACE_OUTER_BOUND 354 +#define tEDGE_LOOP 355 +#define tADVANCED_FACE 356 +#define tVECTOR 357 +#define tDIRECTION 358 +#define tAXIS2_PLACEMENT_3D 359 +#define tISO 360 +#define tENDISO 361 +#define tENDSEC 362 +#define tDATA 363 +#define tHEADER 364 +#define tFILE_DESCRIPTION 365 +#define tFILE_SCHEMA 366 +#define tFILE_NAME 367 +#define tMANIFOLD_SOLID_BREP 368 +#define tCLOSED_SHELL 369 +#define tADVANCED_BREP_SHAPE_REPRESENTATION 370 +#define tFACE_BOUND 371 +#define tCYLINDRICAL_SURFACE 372 +#define tCONICAL_SURFACE 373 +#define tCIRCLE 374 +#define tTRIMMED_CURVE 375 +#define tGEOMETRIC_SET 376 +#define tCOMPOSITE_CURVE_SEGMENT 377 +#define tCONTINUOUS 378 +#define tCOMPOSITE_CURVE 379 +#define tTOROIDAL_SURFACE 380 +#define tPRODUCT_DEFINITION 381 +#define tPRODUCT_DEFINITION_SHAPE 382 +#define tSHAPE_DEFINITION_REPRESENTATION 383 +#define tELLIPSE 384 +#define tTrimmed 385 +#define tSolid 386 +#define tEndSolid 387 +#define tVertex 388 +#define tFacet 389 +#define tNormal 390 +#define tOuter 391 +#define tLoopSTL 392 +#define tEndLoop 393 +#define tEndFacet 394 +#define UMINUS 395 + + +extern YYSTYPE yylval; diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y new file mode 100644 index 0000000000000000000000000000000000000000..236e2dd8c6626e193694d4880e2d32ca7b851e5f --- /dev/null +++ b/Parser/Gmsh.y @@ -0,0 +1,1540 @@ +%{ +#include <stdarg.h> + +#include "Gmsh.h" +#include "Const.h" +#include "Context.h" +#include "Geo.h" +#include "CAD.h" +#include "DataBase.h" +#include "Mesh.h" +#include "Create.h" +#include "Views.h" +#include "StepGeomDatabase.h" +#include "Colors.h" +#include "Parser.h" + +extern Mesh *THEM; +extern char ThePathForIncludes[NAME_STR_L]; + +FILE *yyinTab[20]; +int yylinenoTab[20]; +char yynameTab[20][256]; +char tmpstring[256]; +Symbol TheSymbol; +Surface *STL_Surf; +Shape TheShape; +unsigned int *ptr ; +int i,j,k,flag,RecursionLevel=0,Loop[4]; +double d; +ExtrudeParams extr; +List_T *Symbol_L; +List_T *ListOfDouble_L,*ListOfDouble2_L; +List_T *ListOfListOfDouble_L; +StringXPointer *ColorField ; + +void yyerror (char *s); +void vyyerror (char *fmt, ...); +int Get_ColorForString(StringX4Int SX4I[], int alpha, + char * string, int * FlagError); +void Get_ColorPointerForString(StringXPointer SXP[], char * string, + int * FlagError, unsigned int **Pointer); + +%} + +%union { + char *c; + int i; + double d; + double v[5]; + Shape s; + List_T *l; +} + +%token <d> tDOUBLE +%token <c> tSTRING tBIGSTR + +%token tEND tAFFECT tDOTS tPi +%token tExp tLog tLog10 tSqrt tSin tAsin tCos tAcos tTan +%token tAtan tAtan2 tSinh tCosh tTanh tFabs tFloor tCeil +%token tFmod tModulo tHypot +%token tPoint tCircle tEllipsis tLine tSurface tSpline tVolume +%token tCharacteristic tLength tParametric tElliptic +%token tPlane tRuled tTransfinite tComplex tPhysical +%token tUsing tPower tBump tProgression tAssociation +%token tRotate tTranslate tSymetry tDilate tExtrude tDuplicata +%token tLoop tInclude tRecombine tDelete tCoherence +%token tView tOffset tAttractor tLayers +%token tScalarSimplex tVectorSimplex tTensorSimplex +%token tScalarTriangle tVectorTriangle tTensorTriangle +%token tScalarLine tVectorLine tTensorLine +%token tScalarPoint tVectorPoint tTensorPoint +%token tBSpline tNurbs tOrder tWith tBounds tKnots +%token tColor tGeneral tGeometry tMesh + +%token tB_SPLINE_SURFACE_WITH_KNOTS +%token tB_SPLINE_CURVE_WITH_KNOTS +%token tCARTESIAN_POINT +%token tTRUE tFALSE tUNSPECIFIED tU tV tEDGE_CURVE tVERTEX_POINT tORIENTED_EDGE tPLANE +%token tFACE_OUTER_BOUND tEDGE_LOOP tADVANCED_FACE tVECTOR tDIRECTION tAXIS2_PLACEMENT_3D +%token tISO tENDISO tENDSEC tDATA tHEADER tFILE_DESCRIPTION tFILE_SCHEMA tFILE_NAME +%token tMANIFOLD_SOLID_BREP tCLOSED_SHELL tADVANCED_BREP_SHAPE_REPRESENTATION +%token tFACE_BOUND tCYLINDRICAL_SURFACE tCONICAL_SURFACE tCIRCLE tTRIMMED_CURVE +%token tGEOMETRIC_SET tCOMPOSITE_CURVE_SEGMENT tCOMPOSITE_CURVE_SEGMENT tCONTINUOUS +%token tCOMPOSITE_CURVE tTOROIDAL_SURFACE tPRODUCT_DEFINITION tPRODUCT_DEFINITION_SHAPE +%token tSHAPE_DEFINITION_REPRESENTATION tELLIPSE tTrimmed + +%token tSolid tEndSolid tVertex tFacet tNormal tOuter tLoopSTL tEndLoop tEndFacet + +%type <d> FExpr FExpr_Single +%type <v> VExpr RGBAExpr +%type <l> ListOfDouble ListOfShapes Duplicata Transform MultipleShape ListOfListOfDouble +%type <l> ListOfStrings +%type <s> Shape +%type <i> BoolExpr + +%left '<' '>' +%left '+' '-' +%left '*' '/' '%' +%left UMINUS +%right '^' + +%% + +All : + GeomFormatList + | StepFormatItems + | STLFormatItem +; + +/* ---------------------------------------------------------------------- + S T E R E O L I T H O G R A P H Y ( S T L ) + ---------------------------------------------------------------------- */ + +STLFormatItem : + tSolid + { + Msg(PARSER_INFO,"STL File Format"); + STL_Surf = Create_Surface(1,MSH_SURF_STL,1); + STL_Surf->STL = new STL_Data; + return 1; + } + | tFacet + tNormal tDOUBLE tDOUBLE tDOUBLE + tOuter tLoopSTL + tVertex tDOUBLE tDOUBLE tDOUBLE + tVertex tDOUBLE tDOUBLE tDOUBLE + tVertex tDOUBLE tDOUBLE tDOUBLE + tEndLoop + tEndFacet + { + STL_Surf->STL->Add_Facet( $9, $10, $11, + $13, $14, $15, + $17, $18, $19); + return 1; + } + | tEndSolid + { + Msg(PARSER_INFO,"STL File Format Read"); + Tree_Add(THEM->Surfaces, &STL_Surf); + return 1; + } +; + +/* ---------------------------------------------------------------------- + S T E P I S O - 1 0 3 0 3 - 2 1 F I L E F O R M A T + ---------------------------------------------------------------------- */ + +StepFormatItems : + /* nothing */ + | StepFormatItems StepFormatItem +; + +StepFormatItem : + StepSpecial { return 1; } + | StepDataItem { return 1; } + | StepHeaderItem { return 1; } + | error tEND { yyerrok ; return 1; } +; + +StepSpecial : + tISO tEND + { + Msg(PARSER_INFO,"Step Iso-10303-21 File Format"); + Create_Step_Solid_BRep(); + } + | tENDISO tEND + { + Msg(PARSER_INFO,"Step Iso-10303-21 File Format Read"); + Resolve_BREP (); + } + | tDATA tEND + | tENDSEC tEND + | tHEADER tEND +; + +StepHeaderItem : + tFILE_DESCRIPTION '(' ListOfStrings ',' tBIGSTR ')' tEND + { + } + | tFILE_SCHEMA '(' ListOfStrings ')' tEND + { + } + | tFILE_NAME '(' tBIGSTR ',' tBIGSTR ',' ListOfStrings ',' + ListOfStrings ',' tBIGSTR ',' tBIGSTR ',' tBIGSTR ')' tEND + { + } +; + +StepDataItem : + tDOUBLE tAFFECT tCARTESIAN_POINT '(' tBIGSTR ',' VExpr ')' tEND + { + Add_Cartesian_Point((int)$1,$5,$7[0],$7[1],$7[2]); + } + | tDOUBLE tAFFECT tB_SPLINE_CURVE_WITH_KNOTS + '(' tBIGSTR ',' FExpr ',' ListOfDouble ',' BoolExpr ',' BoolExpr ',' + BoolExpr ',' ListOfDouble ',' ListOfDouble ',' BoolExpr ')' tEND + { + Add_BSpline_Curve_With_Knots ((int)$1, $5, (int) $7, $9, $17, $19, 0., 1.); + } + | tDOUBLE tAFFECT tB_SPLINE_SURFACE_WITH_KNOTS + '(' tBIGSTR ',' FExpr ',' FExpr ',' ListOfListOfDouble ',' BoolExpr ',' + BoolExpr ',' BoolExpr ',' BoolExpr ',' ListOfDouble ',' ListOfDouble ',' + ListOfDouble ',' ListOfDouble ',' BoolExpr ')' tEND + { + Add_BSpline_Surface_With_Knots ((int)$1, $5, (int) $7, (int) $9, $11, $21, + $23, $25, $27, 0., 1., 0., 1. ); + } + | tDOUBLE tAFFECT tEDGE_CURVE '(' tBIGSTR ',' tDOUBLE ',' tDOUBLE ',' + tDOUBLE ',' BoolExpr ')' tEND + { + Add_Edge_Curve ((int)$1, $5 , (int)$7 , (int)$9, (int)$11); + } + | tDOUBLE tAFFECT tFACE_OUTER_BOUND '(' tBIGSTR ',' tDOUBLE ',' BoolExpr ')' tEND + { + Add_Face_Outer_Bound((int)$1,$5,(int)$7,$9,1); + } + | tDOUBLE tAFFECT tFACE_BOUND '(' tBIGSTR ',' tDOUBLE ',' BoolExpr ')' tEND + { + /* La je dois voir la norme ! Face_Bound : trou externe a la surface ! */ + Msg(PARSER_INFO,"Found a Face Bound"); + Add_Face_Outer_Bound((int)$1,$5,(int)$7,$9,0); + } + | tDOUBLE tAFFECT tORIENTED_EDGE '(' tBIGSTR ',' '*' ',' '*' ',' FExpr ',' + BoolExpr ')' tEND + { + Add_Oriented_Edge((int)$1,$5,(int)$11,$13); + } + | tDOUBLE tAFFECT tEDGE_LOOP '(' tBIGSTR ',' ListOfDouble ')' tEND + { + Add_Edge_Loop((int)$1,$5,$7); + } + | tDOUBLE tAFFECT tADVANCED_FACE '(' tBIGSTR ',' ListOfDouble ',' + tDOUBLE ',' BoolExpr ')' tEND + { + Add_Advanced_Face((int)$1,$5,$7,(int)$9,$11); + } + | tDOUBLE tAFFECT tVERTEX_POINT '(' tBIGSTR ',' tDOUBLE ')' tEND + { + Add_Vertex_Point((int)$1,$5,(int)$7); + } + | tDOUBLE tAFFECT tVECTOR '(' tBIGSTR ',' tDOUBLE ',' FExpr ')' tEND + { + } + | tDOUBLE tAFFECT tAXIS2_PLACEMENT_3D '(' tBIGSTR ',' tDOUBLE ',' + tDOUBLE ',' tDOUBLE ')' tEND + { + Add_Axis2_Placement3D ( (int)$1, (int)$9, (int)$11, (int)$7); + } + | tDOUBLE tAFFECT tDIRECTION '(' tBIGSTR ',' VExpr ')' tEND + { + Add_Direction((int)$1 , $5, $7[0], $7[1], $7[2]); + } + | tDOUBLE tAFFECT tPLANE '(' tBIGSTR ',' tDOUBLE ')' tEND + { + Add_Plane((int)$1,$5,(int)$7); + } + | tDOUBLE tAFFECT tLine '(' tBIGSTR ',' tDOUBLE ',' tDOUBLE ')' tEND + { + Add_Line ((int)$1, $5 , (int) $7, (int)$9); + } + | tDOUBLE tAFFECT tCLOSED_SHELL '(' tBIGSTR ',' ListOfDouble ')' tEND + { + Msg(PARSER_INFO,"Found a Closed shell"); + Add_Closed_Shell((int)$1, $5 , $7); + } + | tDOUBLE tAFFECT tADVANCED_BREP_SHAPE_REPRESENTATION + '(' tBIGSTR ',' ListOfDouble ',' tDOUBLE')' tEND + { + } + | tDOUBLE tAFFECT tMANIFOLD_SOLID_BREP '(' tBIGSTR ',' tDOUBLE ')' tEND + { + } + | tDOUBLE tAFFECT tCYLINDRICAL_SURFACE '(' tBIGSTR ',' tDOUBLE ','FExpr ')' tEND + { + Add_Cylinder ((int)$1, $5 , (int)$7, $9); + } + | tDOUBLE tAFFECT tCONICAL_SURFACE '(' tBIGSTR ',' tDOUBLE ','FExpr ','FExpr ')' tEND + { + Add_Cone ((int)$1, $5 , (int)$7, $9,$11); + } + | tDOUBLE tAFFECT tTOROIDAL_SURFACE '(' tBIGSTR ',' tDOUBLE ','FExpr ','FExpr ')' tEND + { + Add_Torus ((int)$1, $5 , (int)$7, $9,$11); + } + | tDOUBLE tAFFECT tCIRCLE '(' tBIGSTR ',' tDOUBLE ','FExpr ')' tEND + { + Add_Circle((int) $1, $5, (int) $7, $9); + } + | tDOUBLE tAFFECT tELLIPSE '(' tBIGSTR ',' tDOUBLE ','FExpr ',' FExpr ')' tEND + { + Add_Ellipsis((int) $1, $5, (int) $7, $9, $11); + } + | tDOUBLE tAFFECT tTRIMMED_CURVE '(' tBIGSTR ',' tDOUBLE ',' + ListOfDouble ',' ListOfDouble ',' BoolExpr ',' BoolExpr ')' tEND + { + } + | tDOUBLE tAFFECT tGEOMETRIC_SET '(' tBIGSTR ',' ListOfDouble')' tEND + { + } + | tDOUBLE tAFFECT tCOMPOSITE_CURVE_SEGMENT + '(' tCONTINUOUS ',' BoolExpr ',' tDOUBLE ')' tEND + { + } + | tDOUBLE tAFFECT tCOMPOSITE_CURVE '(' tBIGSTR ',' ListOfDouble ',' BoolExpr ')' tEND + { + } + | tDOUBLE tAFFECT tPRODUCT_DEFINITION + '(' tBIGSTR ',' tBIGSTR ',' tDOUBLE',' tDOUBLE ')' tEND + { + } + | tDOUBLE tAFFECT tPRODUCT_DEFINITION_SHAPE '(' tBIGSTR ',' tBIGSTR ',' tDOUBLE ')' tEND + { + } + | tDOUBLE tAFFECT tSHAPE_DEFINITION_REPRESENTATION '(' tDOUBLE ',' tDOUBLE ')' tEND + { + } +; + +/* ---------------------------------------------------------------------- + G E O F I L E F O R M A T + ---------------------------------------------------------------------- */ + +GeomFormatList : + /* none*/ + | GeomFormatList GeomFormat + { + Msg(PARSER_INFO,"Gmsh File Format Read"); + } +; + +GeomFormat : + View { return 1; } + | Affectation { return 1; } + | Shape { return 1; } + | Transform { return 1; } + | Duplicata { return 1; } + | Delete { return 1; } + | Extrude { return 1; } + | Transfini { return 1; } + | Coherence { return 1; } + | Macro { return 1; } + | Colors { return 1; } + | error tEND { yyerrok; return 1;} +; + +/* ------------ + V I E W + ------------ */ + +View : + tView tBIGSTR '{' Views '}' tEND + { + EndView($2,0.,0.,0.); + } + | tView tBIGSTR tOffset VExpr '{' Views '}' tEND + { + EndView($2,$4[0],$4[1],$4[2]); + } +; + +Views : + /* none */ + { + BeginView(1); + } + | Views ScalarSimplex + | Views VectorSimplex + | Views TensorSimplex + | Views ScalarTriangle + | Views VectorTriangle + | Views TensorTriangle + | Views ScalarLine + | Views VectorLine + | Views TensorLine + | Views ScalarPoint + | Views VectorPoint + | Views TensorPoint +; + +ScalarSimplex : + tScalarSimplex '(' FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_ScalarSimplex($3,$5,$7,$9,$11,$13,$15,$17,$19,$21,$23,$25,$27); + } +; + +VectorSimplex : + tVectorSimplex '(' FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_VectorSimplex($3,$5,$7,$9,$11,$13,$15,$17,$19,$21,$23,$25,$27); + } +; + +TensorSimplex : + tTensorSimplex '(' FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_TensorSimplex($3,$5,$7,$9,$11,$13,$15,$17,$19,$21,$23,$25,$27); + } +; + +ScalarTriangle : + tScalarTriangle '(' FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_ScalarTriangle($3,$5,$7,$9,$11,$13,$15,$17,$19,$21); + } +; + +VectorTriangle : + tVectorTriangle '(' FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_VectorTriangle($3,$5,$7,$9,$11,$13,$15,$17,$19,$21); + } +; + +TensorTriangle : + tTensorTriangle '(' FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_TensorTriangle($3,$5,$7,$9,$11,$13,$15,$17,$19,$21); + } +; + +ScalarLine : + tScalarLine '(' FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_ScalarLine($3,$5,$7,$9,$11,$13,$15); + } +; + +VectorLine : + tVectorLine '(' FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_VectorLine($3,$5,$7,$9,$11,$13,$15); + } +; + +TensorLine : + tTensorLine '(' FExpr ',' FExpr ',' FExpr ',' + FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_TensorLine($3,$5,$7,$9,$11,$13,$15); + } +; + +ScalarPoint : + tScalarPoint '(' FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_ScalarPoint($3,$5,$7,$9); + } +; + +VectorPoint : + tVectorPoint '(' FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_VectorPoint($3,$5,$7,$9); + } +; + +TensorPoint : + tTensorPoint '(' FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND + { + AddView_TensorPoint($3,$5,$7,$9); + } +; + +/* ----------------------- + A F F E C T A T I O N + ----------------------- */ + +Affectation : + tSTRING tAFFECT FExpr tEND + { + TheSymbol.Name = $1; + TheSymbol.val = $3; + List_Replace(Symbol_L,&TheSymbol,CompareSymbols); + } +; + + +/* ----------- + S H A P E + ----------- */ + +Shape : + + /* -------- Points -------- */ + + tPoint '(' FExpr ')' tAFFECT VExpr tEND + { + Cdbpts101((int)$3,$6[0],$6[1],$6[2],$6[3],$6[4]); + $$.Type = MSH_POINT; + $$.Num = (int)$3; + } + + | tPhysical tPoint '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbz101((int)$4,MSH_PHYSICAL_POINT,0,0,0,0,0,NULL,$7,NULL); + $$.Type = MSH_PHYSICAL_POINT; + $$.Num = (int)$4; + } + | tAttractor tPoint '(' FExpr ',' FExpr ',' FExpr ')' tAFFECT ListOfDouble tEND + { + Vertex *v; + Attractor *a; + double p; + int ip; + for(int i=0;i<List_Nbr($11);i++){ + List_Read($11,i,&p); + ip = (int)p; + v = FindVertex(ip,THEM); + if(!v) + vyyerror("Unkown Point %d", ip); + else{ + a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1, + $4,$6,$8,v,NULL,NULL); + List_Add(THEM->Metric->Attractors,&a); + } + } + } + | tCharacteristic tLength ListOfDouble tAFFECT FExpr tEND + { + for(i=0;i<List_Nbr($3);i++){ + List_Read($3,i,&d); + Vertex *v = FindVertex((int)d,THEM); + if(!v) + vyyerror("Unkown Point %d", (int)d); + else + v->lc = $5; + } + } + | tPoint '(' FExpr ')' tEND + { + $$.Type = MSH_POINT; + $$.Num = (int)$3; + } + + /* -------- Lines -------- */ + + | tLine '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbseg101((int)$3,MSH_SEGM_LINE,1,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL); + $$.Type = MSH_SEGM_LINE; + $$.Num = (int)$3; + } + | tSpline '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbseg101((int)$3,MSH_SEGM_SPLN,3,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL); + $$.Type = MSH_SEGM_SPLN; + $$.Num = (int)$3; + } + | tAttractor tLine '(' FExpr ',' FExpr ',' FExpr ')' tAFFECT ListOfDouble tEND + { + Curve *c; + Attractor *a; + double p; + int ip; + for(int i=0;i<List_Nbr($11);i++){ + List_Read($11,i,&p); + ip = (int)p; + c = FindCurve(ip,THEM); + if(!c) + vyyerror("Unkown Curve %d", ip); + else{ + a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1, + $4,$6,$8,NULL,c,NULL); + List_Add(THEM->Metric->Attractors,&a); + } + } + } + | tCircle '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbseg101((int)$3,MSH_SEGM_CIRC,2,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL); + $$.Type = MSH_SEGM_CIRC ; + $$.Num = (int)$3; + } + | tCircle '(' FExpr ')' tAFFECT ListOfDouble tPlane VExpr tEND + { + List_T *temp; + int i,j; + double d; + temp = List_Create(List_Nbr($6),1,sizeof(int)); + for(i=0;i<List_Nbr($6);i++){ + List_Read($6,i,&d); + j = (int)d; + List_Add(temp,&j); + } + AddCircleInDataBase ((int) $3, MSH_SEGM_CIRC, temp, $8); + List_Delete(temp); + $$.Type = MSH_SEGM_CIRC ; + $$.Num = (int)$3; + } + | tParametric '(' FExpr ')' tAFFECT + '(' FExpr ',' FExpr ',' tBIGSTR ',' tBIGSTR ',' tBIGSTR ')' tEND + { + Cdbseg101((int)$3,MSH_SEGM_PARAMETRIC,2,NULL,NULL,-1,-1,$7,$9,$11,$13,$15); + $$.Type = MSH_SEGM_PARAMETRIC ; + $$.Num = (int)$3; + } + | tEllipsis '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbseg101((int)$3,MSH_SEGM_ELLI,2,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL); + $$.Type = MSH_SEGM_ELLI ; + $$.Num = (int)$3; + } + | tPhysical tLine '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbz101((int)$4,MSH_PHYSICAL_LINE,0,0,0,0,0,NULL,$7,NULL); + $$.Type = MSH_PHYSICAL_LINE; + $$.Num = (int)$4; + } + | tLine tLoop '(' FExpr ')' tAFFECT ListOfDouble tEND + { + $$.Type = MSH_SEGM_LOOP; + Cdbz101((int)$4,$$.Type,0,0,0,0,0,NULL,$7,NULL); + $$.Num = (int)$4; + } + | tLine '(' FExpr ')' tEND + { + $$.Num = (int)$3; + Curve *c = FindCurve($$.Num,THEM); + if(!c) + vyyerror("Unkown Curve %d", $$.Num); + else + $$.Type = c->Typ; + } + | tBSpline '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbseg101((int)$3,MSH_SEGM_BSPLN,2,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL); + $$.Type = MSH_SEGM_BSPLN; + $$.Num = (int)$3; + } + | tNurbs '(' FExpr ')' tAFFECT ListOfDouble tKnots ListOfDouble tOrder FExpr tEND + { + List_T *Temp; + int i; + double d; + if(List_Nbr($6) + (int)$10 + 1 != List_Nbr($8)){ + yyerror("wrong nurbs curve definition (deg + 1 + nbpts != nbknots)"); + } + Temp = List_Create(List_Nbr($6),1,sizeof(int)); + for(i=0;i<List_Nbr($6);i++) { + List_Read($6,i,&d); + j = (int)d; + List_Add(Temp,&j); + } + AddCurveInDataBase ((int)$3,MSH_SEGM_NURBS,(int)$10,Temp,$8,-1,-1,0.,1.); + List_Delete(Temp); + } + + /* -------- Surfaces -------- */ + + | tPlane tSurface '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbz101((int)$4,MSH_SURF_PLAN,0,0,0,0,0,NULL,$7,NULL); + $$.Type = MSH_SURF_PLAN; + $$.Num = (int)$4; + } + | tTrimmed tSurface '(' FExpr ')' tAFFECT FExpr ListOfDouble tEND + { + Surface *s,*support; + support = FindSurface((int)$7,THEM); + if(!support) + vyyerror("Unkown Surface %d", (int)$7); + else{ + Cdbz101((int)$4,MSH_SURF_PLAN,0,0,0,0,0,NULL,$8,NULL); + s = FindSurface((int)$4,THEM); + if(!s) + vyyerror("Unkown Surface %d", (int)$4); + else{ + s->Typ = MSH_SURF_TRIMMED; + s->Support = support; + $$.Type = MSH_SURF_TRIMMED; + $$.Num = (int)$4; + } + } + } + | tRuled tSurface '(' FExpr ')' tAFFECT ListOfDouble tEND + { + List_Read($7,0,&d); + i = (int)d; + EdgeLoop *el = FindEdgeLoop(i,THEM); + if(!el) + vyyerror("Unkown Loop %d", i); + else{ + j = List_Nbr(el->Curves); + if(j==4) + $$.Type = MSH_SURF_REGL; + else if(j==3) + $$.Type = MSH_SURF_TRIC; + else + vyyerror("Ruled surface %d has not 3 or 4 borders", $4); + Cdbz101((int)$4,$$.Type,0,0,0,0,0,NULL,$7,NULL); + $$.Num = (int)$4; + } + } + | tNurbs tSurface tWith tBounds '(' FExpr ')' tAFFECT + ListOfListOfDouble tKnots '{' ListOfDouble ',' ListOfDouble '}' + tOrder '{' FExpr ',' FExpr '}' tEND + { + CreateNurbsSurface ( (int) $6 , (int)$18 , (int)$20 , $9, $12, $14); + $$.Type = MSH_SURF_NURBS; + $$.Num = (int)$6; + } + | tNurbs tSurface '(' FExpr ')' tAFFECT + ListOfListOfDouble tKnots '{' ListOfDouble ',' ListOfDouble '}' + tOrder '{' FExpr ',' FExpr '}' tEND + { + CreateNurbsSurfaceSupport ((int)$4, (int) $16 , (int) $18 , $7, $10, $12); + } + | tPhysical tSurface '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbz101((int)$4,MSH_PHYSICAL_SURFACE,0,0,0,0,0,NULL,$7,NULL); + $$.Type = MSH_PHYSICAL_SURFACE; + $$.Num = (int)$4; + } + | tSurface tLoop '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbz101((int)$4,MSH_SURF_LOOP,0,0,0,0,0,NULL,$7,NULL); + $$.Type = MSH_SURF_LOOP; + $$.Num = (int)$4; + } + | tSurface '(' FExpr ')' tEND + { + $$.Num = (int)$3; + Surface *s = FindSurface($$.Num,THEM); + if(!s) + vyyerror("Unkown Surface %d", $$.Num); + else + $$.Type = s->Typ; + } + + /* -------- Volumes -------- */ + + | tComplex tVolume '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbz101((int)$4,MSH_VOLUME,0,0,0,0,0,NULL,$7,NULL); + $$.Type = MSH_VOLUME; + $$.Num = (int)$4; + } + | tVolume '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbz101((int)$3,MSH_VOLUME,0,0,0,0,0,NULL,$6,NULL); + $$.Type = MSH_VOLUME; + $$.Num = (int)$3; + } + | tPhysical tVolume '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Cdbz101((int)$4,MSH_PHYSICAL_VOLUME,0,0,0,0,0,NULL,$7,NULL); + $$.Type = MSH_PHYSICAL_VOLUME; + $$.Num = (int)$4; + } +; + +/* ------------------- + T R A N S F O R M + ------------------- */ + +Transform : + tTranslate '(' VExpr ')' '{' MultipleShape '}' + { + TranslateShapes ($3[0],$3[1],$3[2],$6,1); + $$ = $6; + } + | tRotate '(' VExpr ',' VExpr ',' FExpr ')' '{' MultipleShape '}' + { + RotateShapes($3[0],$3[1],$3[2],$5[0],$5[1],$5[2],$7,$10); + $$ = $10; + } + | tSymetry '(' VExpr ')' '{' MultipleShape '}' + { + SymetryShapes($3[0],$3[1],$3[2],$3[3],$6,1); + $$ = $6; + } + | tDilate '(' VExpr ',' FExpr ')' '{' MultipleShape '}' + { + DilatShapes($3[0],$3[1],$3[2],$5,$8,1); + $$ = $8; + } +; + +MultipleShape : + Duplicata { $$ = $1; } + | ListOfShapes { $$ = $1; } + | Transform { $$ = $1; } +; + +ListOfShapes : + /* none */ + { + $$ = List_Create(3,3,sizeof(Shape)); + } + | ListOfShapes Shape + { + List_Add($$,&$2); + $$ = $1; + } +; + +/* ------------------- + D U P L I C A T A + ------------------- */ + +Duplicata : + tDuplicata '{' ListOfShapes '}' + { + $$ = List_Create(3,3,sizeof(Shape)); + for(i=0;i<List_Nbr($3);i++){ + List_Read ($3,i,&TheShape); + CopyShape(TheShape.Type,TheShape.Num,&j); + TheShape.Num = j; + List_Add($$,&TheShape); + } + } +; + + +/* ------------- + D E L E T E + ------------- */ + +Delete : + tDelete '{' ListOfShapes '}' + { + for(i=0;i<List_Nbr($3);i++){ + List_Read ($3,i,&TheShape); + DeleteShape(TheShape.Type,TheShape.Num); + } + } +; + + +/* ----------- + M A C R O + ----------- */ + +Macro : + tInclude tBIGSTR tEND + { + yyinTab[RecursionLevel++] = yyin; + strcpy(tmpstring, ThePathForIncludes); + if((yyin = fopen(strcat(tmpstring,$2),"r"))){ + strcpy(yynameTab[RecursionLevel-1],yyname); + yylinenoTab[RecursionLevel-1]=yylineno; + yylineno=1; + strcpy(yyname,$2); + while(!feof(yyin)){ + yyparse(); + } + fclose(yyin); + yyin = yyinTab[--RecursionLevel]; + strcpy(yyname,yynameTab[RecursionLevel]); + yylineno = yylinenoTab[RecursionLevel]; + } + else{ + vyyerror("Unknown file: %s", $2) ; + yyin = yyinTab[--RecursionLevel]; + } + } + +; + + +/* --------------- + E X T R U D E + --------------- */ + +Extrude : + tExtrude '(' FExpr ',' VExpr ')' tEND + { + Extrude_ProtudeSurface(1,(int)$3,$5[0],$5[1],$5[2],0.,0.,0.,0.,0,NULL); + } + | tExtrude tSurface '(' FExpr ',' VExpr ')' tEND + { + Extrude_ProtudeSurface(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,0,NULL); + } + | tExtrude '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND + { + Extrude_ProtudeSurface(0,(int)$3,$5[0],$5[1],$5[2],$7[0],$7[1],$7[2],$9,0,NULL); + } + | tExtrude tSurface '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND + { + Extrude_ProtudeSurface(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,0,NULL); + } + | tExtrude tPoint '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND + { + Curve *pc, *prc; + Extrude_ProtudePoint(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10, + &pc,&prc,NULL); + } + | tExtrude tPoint '(' FExpr ',' VExpr ')' tEND + { + Curve *pc, *prc; + Extrude_ProtudePoint(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,&pc,&prc,NULL); + } + | tExtrude tLine'(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND + { + Extrude_ProtudeCurve(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,NULL); + } + | tExtrude tLine'(' FExpr ',' VExpr ')' tEND + { + Extrude_ProtudeCurve(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,NULL); + } + | tExtrude tSurface '(' FExpr ',' VExpr ')' '{' ExtrudeParameters '}' tEND + { + int vol = NEWREG(); + Extrude_ProtudeSurface(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,vol,&extr); + } + | tExtrude tSurface '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' + '{' ExtrudeParameters '}'tEND + { + int vol = NEWREG(); + Extrude_ProtudeSurface(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,vol,&extr); + } +; + +ExtrudeParameters : + ExtrudeParameter + { + } + | ExtrudeParameters ExtrudeParameter + { + } +; + +ExtrudeParameter : + tLayers '{' ListOfDouble ',' ListOfDouble ',' ListOfDouble '}' tEND + { + double d; + int j; + extr.mesh.NbLayer = List_Nbr($3); + extr.mesh.ExtrudeMesh = true; + for(int i=0;i<List_Nbr($3);i++){ + List_Read($3,i,&d); + j = (int)d; + extr.mesh.NbElmLayer[i] = j; + List_Read($5,i,&d); + j = (int)d; + extr.mesh.ZonLayer[i] = j; + List_Read($7,i,&d); + extr.mesh.hLayer[i] = d; + } + } +; + +/* ------------------- + T R A N S F I N I + ------------------- */ + +Transfini : + tTransfinite tLine ListOfDouble tAFFECT FExpr tEND + { + Curve *c; + for(i=0;i<List_Nbr($3);i++){ + List_Read($3,i,&d); + j = (int)fabs(d); + c = FindCurve(j,THEM); + if(!c) + vyyerror("Unkown Curve %d", j); + else{ + c->Method = TRANSFINI; + c->ipar[0] = (int)$5; + c->ipar[1] = sign(d); + c->dpar[0] = 1.0; + } + } + } + | tTransfinite tLine ListOfDouble tAFFECT FExpr tUsing tPower FExpr tEND + { + Curve *c; + for(i=0;i<List_Nbr($3);i++){ + List_Read($3,i,&d); + j = (int)fabs(d); + c = FindCurve(j,THEM); + if(!c) + vyyerror("Unkown Curve %d", j); + else{ + c->Method = TRANSFINI; + c->ipar[0] = (int)$5; + c->ipar[1] = sign(d); /* Power : code 1 ou -1 */ + c->dpar[0] = $8; + } + } + } + | tTransfinite tLine ListOfDouble tAFFECT FExpr tUsing tBump FExpr tEND + { + Curve *c; + for(i=0;i<List_Nbr($3);i++){ + List_Read($3,i,&d); + j = (int)fabs(d); + c = FindCurve(j,THEM); + if(!c) + vyyerror("Unkown Curve %d", j); + else{ + c->Method = TRANSFINI; + c->ipar[0] = (int)$5; + c->ipar[1] = 2*sign(d); /* Bump : code 2 ou -2 */ + c->dpar[0] = $8; + } + } + } + | tTransfinite tLine ListOfDouble tAFFECT FExpr tUsing tProgression FExpr tEND + { + Curve *c; + for(i=0;i<List_Nbr($3);i++){ + List_Read($3,i,&d); + j = (int)fabs(d); + c = FindCurve(j,THEM); + if(!c) + vyyerror("Unkown Curve %d", j); + else{ + c->Method = TRANSFINI; + c->ipar[0] = (int)$5; + c->ipar[1] = 3*sign(d); /* Progresion : code 3 ou -3 */ + c->dpar[0] = $8; + } + } + } + | tTransfinite tSurface '{' FExpr '}' tAFFECT ListOfDouble tEND + { + Surface *s = FindSurface((int)$4,THEM); + if(!s) + vyyerror("Unkown Surface %d", (int)$4); + else{ + s->Method = TRANSFINI; + k = List_Nbr($7); + if(k!=3 && k!=4){ + vyyerror("Bad Number of Points for Transfinite Surface %d", $4) ; + } + else{ + for(i=0;i<k;i++){ + List_Read($7,i,&d); + j = (int)fabs(d); + s->ipar[i] = j; + } + } + } + } + | tElliptic tSurface '{' FExpr '}' tAFFECT ListOfDouble tEND + { + Surface *s = FindSurface((int)$4,THEM); + if(!s) + vyyerror("Unkown Surface %d", (int)$4); + else{ + s->Method = ELLIPTIC; + k = List_Nbr($7); + if(k != 4) + vyyerror("Bad Number of Points for Elliptic Surface %d", $4) ; + else{ + for(i=0;i<k;i++){ + List_Read($7,i,&d); + j = (int)fabs(d); + s->ipar[i] = j; + } + } + } + } + | tTransfinite tVolume '{' FExpr '}' tAFFECT ListOfDouble tEND + { + Volume *v = FindVolume((int)$4,THEM); + if(!v) + vyyerror("Unkown Volume %d", (int)$4); + else{ + v->Method = TRANSFINI; + k = List_Nbr($7); + if(k!=6 && k!=8) + vyyerror("Bad Number of Points for Transfinite Volume %d", $4) ; + else{ + for(i=0;i<k;i++){ + List_Read($7,i,&d); + j = (int)fabs(d); + v->ipar[i] = j; + } + } + } + } + | tRecombine tSurface ListOfDouble tAFFECT FExpr tEND + { + Surface *s; + for(i=0;i<List_Nbr($3);i++){ + List_Read($3,i,&d); + j = (int)d; + s = FindSurface(j,THEM); + if(!s) + vyyerror("Unkown Surface %d", j); + else{ + s->Recombine = 1; + s->RecombineAngle = $5; + } + } + } + | tRecombine tSurface ListOfDouble tEND + { + Surface *s; + for(i=0;i<List_Nbr($3);i++){ + List_Read($3,i,&d); + j = (int)d; + s = FindSurface(j,THEM); + if(!s) + vyyerror("Unkown Surface %d", j); + else{ + s->Recombine = 1; + s->RecombineAngle = 30.; + } + } + } + | tPhysical tAssociation '(' FExpr ')' tAFFECT ListOfDouble tEND + { + Msg(PARSER_ERROR, "Physical Associations do not exist anymore!"); + } +; + + +/* ------------------- + C O H E R E N C E + ------------------- */ + +Coherence : + tCoherence tEND + { + Coherence_PS(); + } +; + +/* ------------- + C O L O R S + ------------- */ + +Colors : + tColor '{' ColorSections '}' +; + +ColorSections : + /* empty */ + | ColorSections ColorSection +; + +ColorSection : + tGeneral + { ColorField = ColorGeneral; } + '{' ColorAffects '}' + | tGeometry + { ColorField = ColorGeometry; } + '{' ColorAffects '}' + | tMesh + { ColorField = ColorMesh; } + '{' ColorAffects '}' +; + +ColorAffects : + /* empty */ + | ColorAffect ColorAffects +; + +ColorAffect : + tSTRING tAFFECT tSTRING tEND + { + i = Get_ColorForString(ColorString, -1, $3, &flag); + if(flag) vyyerror("Unknown Color: %s", $3); + Get_ColorPointerForString(ColorField, $1, &flag, &ptr); + if(flag) + vyyerror("Unknown Color Field: %s", $1); + else + *ptr = i ; + } + | tSTRING tAFFECT '{' tSTRING ',' FExpr '}' tEND + { + i = Get_ColorForString(ColorString, (int)$6, $4, &flag); + if(flag) vyyerror("Unknown Color: %s", $4); + Get_ColorPointerForString(ColorField, $1, &flag, &ptr); + if(flag) + vyyerror("Unknown Color Field: %s", $1); + else + *ptr = i ; + } + | tSTRING tAFFECT RGBAExpr tEND + { + Get_ColorPointerForString(ColorField, $1, &flag, &ptr); + if(flag) + vyyerror("Unknown Color Field: %s", $3); + else + *ptr = PACK_COLOR((int)$3[0], (int)$3[1], (int)$3[2], (int)$3[3]); + } +; + +RGBAExpr : + '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}' + { + $$[0]=$2; + $$[1]=$4; + $$[2]=$6; + $$[3]=$8; + } + | '{' FExpr ',' FExpr ',' FExpr '}' + { + $$[0]=$2; + $$[1]=$4; + $$[2]=$6; + $$[3]=255.; + } +; + +/* +Context{ + + General{ + Axes = 1 ; + SmallAxes = 1 ; + Orthographic = 1 ; + FastDraw = 1 ; + DisplayLists = 0 ; + Font = "fixed"; + ColorBarFont = "fixed"; + Light0 = {0,0,0}; + Shininess = 0; + Alpha = 0; + PrintFormat = EPS; + } + + Geometry{ + Points = 1 ; + Lines = 1 ; + Surfaces = 1 ; + Volumes = 1 ; + PointNumbers = 1 ; + LineNumbers = 1 ; + SurfaceNumbers = 1 ; + VolumeNumbers = 1 ; + Normals = 0.0 ; + Tangents = 0.0 ; + HiddenLines = 0 ; + Shading = 0 ; + } + + Mesh{ + Draw = 0 ; + Points = 1 ; + Lines = 1 ; + Surfaces = 1 ; + Volumes = 1 ; + PointNumbers = 1 ; + LineNumbers = 1 ; + SurfaceNumbers = 1 ; + VolumeNumbers = 1 ; + Normals = 0.0 ; + Tangents = 0.0 ; + HiddenLines = 0 ; + Shading = 0 ; + Format = MSH ; + Smoothing = 0 ; + Algorithm = 1 ; + Degree = 1 ; + Explode = 100 ; + } + + Post{ + Draw = 1 ; + Scales = 1 ; + LinkMode = 0 ; + } + +} +*/ + +/* --------------- + G E N E R A L + --------------- */ + + +BoolExpr : + tTRUE {$$ = 1;} + | tFALSE {$$ = 0;} + | tUNSPECIFIED {$$ = -1;} + | tU {$$ = -1;} + | tV {$$ = -1;} + ; + +FExpr : + FExpr_Single { $$ = $1; } + | '(' FExpr ')' { $$ = $2; } + | FExpr '-' FExpr { $$ = $1 - $3; } + | FExpr '+' FExpr { $$ = $1 + $3; } + | FExpr '*' FExpr { $$ = $1 * $3; } + | FExpr '/' FExpr { $$ = $1 / $3; } + | FExpr '^' FExpr { $$ = pow($1, $3); } + | '-' FExpr %prec UMINUS { $$ = - $2; } + | '+' FExpr %prec UMINUS { $$ = $2; } + | tExp '(' FExpr ')' { $$ = exp($3); } + | tLog '(' FExpr ')' { $$ = log($3); } + | tLog10 '(' FExpr ')' { $$ = log10($3); } + | tSqrt '(' FExpr ')' { $$ = sqrt($3); } + | tSin '(' FExpr ')' { $$ = sin($3); } + | tAsin '(' FExpr ')' { $$ = asin($3); } + | tCos '(' FExpr ')' { $$ = cos($3); } + | tAcos '(' FExpr ')' { $$ = acos($3); } + | tTan '(' FExpr ')' { $$ = tan($3); } + | tAtan '(' FExpr ')' { $$ = atan($3); } + | tAtan2 '(' FExpr ',' FExpr ')' { $$ = atan2($3,$5); } + | tSinh '(' FExpr ')' { $$ = sinh($3); } + | tCosh '(' FExpr ')' { $$ = cosh($3); } + | tTanh '(' FExpr ')' { $$ = tanh($3); } + | tFabs '(' FExpr ')' { $$ = fabs($3); } + | tFloor '(' FExpr ')' { $$ = floor($3); } + | tCeil '(' FExpr ')' { $$ = ceil($3); } + | tFmod '(' FExpr ',' FExpr ')' { $$ = fmod($3,$5); } + | tModulo '(' FExpr ',' FExpr ')' { $$ = fmod($3,$5); } + | tHypot '(' FExpr ',' FExpr ')' { $$ = sqrt($3*$3+$5*$5); } +; + +FExpr_Single : + tDOUBLE { $$ = $1; } + | tPi { $$ = 3.141592653589793; } + | tSTRING + { + TheSymbol.Name = $1 ; + if (!List_Query(Symbol_L, &TheSymbol, CompareSymbols)) { + vyyerror("Unknown variable: %s", $1) ; $$ = 0. ; + } + else $$ = TheSymbol.val ; + Free($1); + } +; + +FExpr_Range : + FExpr tDOTS FExpr + { + ListOfDouble2_L = List_Create(2,1,sizeof(double)) ; + for(d=$1 ; ($1<$3)?(d<=$3):(d>=$3) ; ($1<$3)?(d+=1.):(d-=1.)) + List_Add(ListOfDouble2_L, &d) ; + } + | FExpr tDOTS '[' FExpr ']' FExpr + { + ListOfDouble2_L = List_Create(2,1,sizeof(double)) ; + if(!$4 || ($1<$6 && $4<0) || ($1>$6 && $4>0)){ + vyyerror("Wrong Increment in '%g :[%g] %g'", $1, $4, $6) ; + List_Add(ListOfDouble2_L, &($1)) ; + } + else + for(d=$1 ; ($4>0)?(d<=$6):(d>=$6) ; d+=$4) + List_Add(ListOfDouble2_L, &d) ; + } + ; + +VExpr : + '{' FExpr ',' FExpr ',' FExpr ',' FExpr ',' FExpr '}' + { + $$[0]=$2; + $$[1]=$4; + $$[2]=$6; + $$[3]=$8; + $$[4]=$10; + } + | '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}' + { + $$[0]=$2; + $$[1]=$4; + $$[2]=$6; + $$[3]=$8; + $$[4]=1.0; + } + | '{' FExpr ',' FExpr ',' FExpr '}' + { + $$[0]=$2; + $$[1]=$4; + $$[2]=$6; + $$[3]=0.0; + $$[4]=1.0; + } + | '(' FExpr ',' FExpr ',' FExpr ')' + { + $$[0]=$2; + $$[1]=$4; + $$[2]=$6; + $$[3]=0.0; + $$[4]=1.0; + } +; + +ListOfStrings : + /* none */ + { + } + | '(' RecursiveListOfStrings ')' + { + } +; + +RecursiveListOfStrings : + tBIGSTR + { + } + | RecursiveListOfStrings ',' tBIGSTR + { + } +; + +ListOfListOfDouble : + /* none */ + { + } + | '{' RecursiveListOfListOfDouble '}' + { + $$=ListOfListOfDouble_L; + } + | '(' RecursiveListOfListOfDouble ')' + { + $$=ListOfListOfDouble_L; + } +; + +RecursiveListOfListOfDouble : + ListOfDouble + { + ListOfListOfDouble_L = List_Create(2,1,sizeof(List_T*)) ; + List_Add(ListOfListOfDouble_L, &($1)) ; + } + | RecursiveListOfListOfDouble ',' ListOfDouble + { + List_Add(ListOfListOfDouble_L, &($3)) ; + } +; + +ListOfDouble : + /* none */ + { + } + | FExpr + { + ListOfDouble_L = List_Create(2,1,sizeof(double)) ; + List_Add(ListOfDouble_L, &($1)) ; + $$=ListOfDouble_L; + } + | '{' RecursiveListOfDouble '}' + { + $$=ListOfDouble_L; + } +/* + | '(' RecursiveListOfDouble ')' + { + $$=ListOfDouble_L; + } +*/ +; + + +RecursiveListOfDouble : + FExpr + { + ListOfDouble_L = List_Create(2,1,sizeof(double)) ; + List_Add(ListOfDouble_L, &($1)) ; + } + | FExpr_Range + { + ListOfDouble_L = List_Create(2,1,sizeof(double)) ; + for(i=0 ; i<List_Nbr(ListOfDouble2_L) ; i++){ + List_Read(ListOfDouble2_L, i, &d) ; + List_Add(ListOfDouble_L, &d) ; + } + List_Delete(ListOfDouble2_L); + } + | RecursiveListOfDouble ',' FExpr + { + List_Add(ListOfDouble_L, &($3)) ; + } + | RecursiveListOfDouble ',' FExpr_Range + { + for(i=0 ; i<List_Nbr(ListOfDouble2_L) ; i++){ + List_Read(ListOfDouble2_L, i, &d) ; + List_Add(ListOfDouble_L, &d) ; + } + List_Delete(ListOfDouble2_L); + } +; + + +%% + +void InitSymbols(void){ + Symbol_L = List_Create(10,1,sizeof(Symbol)); +} + +void DeleteSymbols(void){ + List_Delete(Symbol_L); +} + +int CompareSymbols (const void *a, const void *b){ + return(strcmp(((Symbol*)a)->Name,((Symbol*)b)->Name)); +} + +void yyerror(char *s){ + Msg(PARSER_ERROR, "'%s', line %d : %s (%s)",yyname,yylineno-1,s,yytext); + yyerrorstate=1; +} + +void vyyerror (char *fmt, ...){ + va_list args; + char tmp[TEXT_BUFFER_SIZE]; + + va_start (args, fmt); + vsprintf (tmp, fmt, args); + va_end (args); + + Msg(PARSER_ERROR, "'%s', line %d : %s", yyname, yylineno-1, tmp); + yyerrorstate=1; +} + +int Get_ColorForString(StringX4Int SX4I[], int alpha, + char * string, int * FlagError) { + int i = 0 ; + while ((SX4I[i].string != NULL) && (strcmp(SX4I[i].string, string))) i++ ; + *FlagError = (SX4I[i].string == NULL)? 1 : 0 ; + if(alpha > 0) + return PACK_COLOR(SX4I[i].int1,SX4I[i].int2,SX4I[i].int3,alpha) ; + else + return PACK_COLOR(SX4I[i].int1,SX4I[i].int2,SX4I[i].int3,SX4I[i].int4) ; +} + +void Get_ColorPointerForString(StringXPointer SXP[], char * string, + int * FlagError, unsigned int **Pointer) { + int i = 0 ; + while ((SXP[i].string != NULL) && (strcmp(SXP[i].string, string))) i++ ; + *FlagError = (SXP[i].string == NULL)? 1 : 0 ; + *Pointer = (unsigned int *)SXP[i].Pointer ; +} + diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp new file mode 100644 index 0000000000000000000000000000000000000000..11248c6662222803b5f42a2be7bb509588b428a6 --- /dev/null +++ b/Parser/Gmsh.yy.cpp @@ -0,0 +1,2931 @@ +#line 2 "Gmsh.yy.cpp" +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include <stdio.h> + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include <stdlib.h> +#include <unistd.h> + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include <io.h> +#include <stdlib.h> +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 157 +#define YY_END_OF_BUFFER 158 +static yyconst short int yy_accept[941] = + { 0, + 0, 0, 158, 156, 1, 1, 5, 150, 6, 156, + 156, 151, 2, 9, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 0, 0, 150, 0, 153, 0, 0, + 0, 0, 3, 4, 152, 151, 0, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 61, 155, + 155, 155, 155, 155, 155, 155, 92, 95, 86, 89, + 155, 155, 155, 155, 155, 155, 94, 155, 97, 155, + 88, 91, 155, 155, 155, 155, 93, 96, 87, 90, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 0, 0, 10, 0, 103, 104, 105, 106, 152, + 0, 0, 154, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + + 26, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 36, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 52, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 71, 155, 155, 155, 155, 155, 155, 80, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 0, 0, 0, 153, 0, + 0, 152, 155, 11, 155, 155, 155, 155, 155, 155, + 13, 155, 15, 155, 155, 155, 155, 21, 155, 155, + + 155, 155, 155, 155, 155, 24, 155, 155, 155, 155, + 155, 25, 120, 155, 155, 155, 155, 155, 155, 0, + 155, 155, 155, 155, 155, 41, 155, 43, 155, 155, + 155, 155, 155, 0, 155, 155, 114, 155, 155, 50, + 155, 51, 155, 55, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 73, 72, 155, 70, 155, 155, 155, 155, 79, + 155, 155, 155, 155, 155, 83, 155, 85, 155, 155, + 155, 155, 145, 8, 155, 155, 155, 155, 155, 0, + 0, 0, 152, 155, 155, 155, 155, 155, 155, 155, + + 155, 17, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 31, 155, 155, 155, + 155, 155, 155, 155, 0, 155, 155, 155, 155, 155, + 42, 155, 155, 155, 155, 46, 0, 155, 48, 155, + 155, 53, 155, 155, 57, 155, 155, 59, 118, 155, + 155, 155, 62, 63, 64, 155, 155, 155, 69, 155, + 155, 155, 155, 155, 155, 155, 155, 82, 155, 155, + 155, 155, 155, 155, 142, 155, 155, 144, 149, 155, + 0, 0, 155, 155, 155, 155, 12, 14, 16, 155, + 155, 155, 155, 23, 155, 133, 155, 155, 155, 155, + + 155, 155, 28, 155, 155, 155, 33, 34, 155, 155, + 155, 155, 0, 126, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 119, 0, 155, 54, 49, + 155, 56, 155, 58, 155, 155, 155, 155, 155, 68, + 155, 74, 155, 155, 155, 155, 155, 155, 155, 115, + 155, 84, 155, 155, 155, 7, 143, 141, 0, 0, + 155, 155, 155, 155, 18, 155, 155, 22, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 30, 155, 155, + 155, 155, 40, 0, 155, 155, 38, 155, 155, 155, + 155, 155, 155, 44, 155, 0, 47, 155, 155, 155, + + 155, 155, 155, 155, 155, 75, 76, 155, 155, 155, + 155, 81, 155, 155, 146, 155, 0, 0, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 0, 37, 39, + 155, 155, 155, 155, 155, 155, 45, 0, 155, 155, + 155, 155, 60, 155, 155, 155, 155, 155, 155, 155, + 155, 147, 148, 0, 0, 155, 155, 155, 155, 155, + 20, 155, 155, 155, 155, 155, 155, 155, 155, 29, + 116, 35, 155, 109, 0, 155, 155, 155, 122, 155, + 155, 0, 155, 155, 155, 155, 155, 67, 155, 155, + + 155, 155, 78, 155, 0, 0, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 32, + 155, 108, 0, 112, 155, 155, 155, 155, 0, 155, + 155, 155, 66, 155, 155, 155, 155, 155, 155, 0, + 0, 155, 155, 155, 155, 155, 19, 155, 155, 155, + 155, 155, 155, 155, 155, 0, 155, 155, 121, 155, + 0, 155, 155, 155, 65, 155, 155, 155, 77, 155, + 102, 0, 102, 155, 155, 155, 155, 155, 155, 155, + 127, 155, 155, 155, 155, 0, 155, 155, 155, 124, + 155, 155, 155, 155, 155, 155, 110, 101, 155, 113, + + 101, 155, 155, 155, 155, 155, 155, 155, 155, 0, + 155, 155, 135, 155, 107, 155, 155, 155, 134, 155, + 155, 155, 155, 155, 155, 155, 155, 27, 0, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 98, + 137, 131, 155, 0, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 125, 111, 123, 155, + 155, 155, 132, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 117, 155, 155, 155, 155, 155, 138, + 155, 155, 155, 155, 155, 130, 129, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 136, 155, 155, 155, 155, 155, 139, 155, 155, 100, + 155, 155, 155, 155, 155, 155, 99, 155, 155, 155, + 155, 155, 155, 155, 155, 140, 155, 155, 128, 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 4, 5, 1, 1, 1, 6, 1, + 1, 7, 8, 1, 9, 10, 11, 12, 13, 14, + 15, 16, 16, 16, 16, 16, 16, 1, 17, 1, + 18, 1, 1, 1, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 28, 35, 36, 37, 38, 39, 40, 41, 42, 28, + 1, 1, 1, 1, 43, 1, 44, 45, 46, 47, + + 48, 49, 50, 51, 52, 28, 28, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 28, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[67] = + { 0, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 3, 3, 3, 3, 1, 1, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3 + } ; + +static yyconst short int yy_base[946] = + { 0, + 0, 0, 1168, 46, 47, 1169, 48, 58, 54, 87, + 69, 117, 56, 57, 98, 85, 147, 124, 131, 129, + 66, 167, 166, 60, 67, 179, 188, 72, 173, 224, + 172, 263, 309, 154, 235, 97, 116, 180, 191, 192, + 204, 222, 258, 1134, 1134, 237, 1155, 336, 1154, 1153, + 81, 1152, 1169, 1169, 342, 357, 296, 0, 182, 1122, + 1128, 1132, 1112, 57, 120, 1124, 1099, 1119, 1092, 1099, + 1117, 1116, 1117, 51, 1119, 1087, 1095, 1102, 1086, 210, + 1107, 1108, 1089, 1088, 1083, 1114, 1108, 1115, 1083, 55, + 1114, 1104, 1088, 1076, 1075, 1097, 123, 1110, 1071, 1094, + + 1080, 1069, 1092, 1057, 1067, 1066, 232, 1088, 1059, 1071, + 1058, 1089, 1066, 1067, 1094, 1079, 1052, 1044, 0, 1065, + 203, 1052, 1061, 1045, 1052, 1085, 0, 0, 0, 0, + 1040, 1047, 1048, 1041, 1040, 1044, 0, 1062, 0, 1069, + 0, 0, 1040, 242, 1042, 125, 0, 0, 0, 0, + 1045, 1039, 1030, 1043, 1043, 1032, 1023, 1027, 1024, 1031, + 1024, 1050, 1045, 1169, 319, 1169, 1169, 1169, 1169, 362, + 379, 348, 384, 1048, 1019, 1059, 1041, 1040, 277, 1020, + 1018, 1018, 1013, 1018, 1036, 1014, 1011, 1030, 1045, 1029, + 1030, 1036, 1035, 1007, 1007, 1000, 1012, 1009, 1000, 998, + + 1003, 1034, 1029, 1003, 1006, 996, 1025, 1020, 106, 994, + 0, 986, 1021, 1020, 982, 985, 993, 1008, 990, 983, + 1014, 979, 1025, 980, 971, 1008, 982, 979, 980, 1014, + 969, 998, 973, 961, 977, 998, 960, 971, 986, 995, + 972, 955, 959, 958, 964, 961, 954, 965, 960, 973, + 958, 954, 952, 942, 953, 953, 967, 968, 947, 942, + 942, 940, 957, 956, 928, 929, 939, 232, 941, 931, + 180, 933, 938, 933, 923, 946, 948, 399, 404, 413, + 418, 423, 944, 0, 948, 945, 964, 921, 924, 931, + 0, 928, 959, 928, 919, 940, 922, 0, 945, 937, + + 943, 932, 943, 931, 900, 0, 917, 907, 900, 899, + 904, 0, 0, 935, 894, 893, 901, 909, 917, 923, + 926, 891, 885, 903, 902, 0, 885, 0, 920, 883, + 893, 917, 878, 925, 875, 876, 0, 876, 873, 0, + 921, 0, 908, 0, 878, 870, 897, 880, 868, 903, + 887, 870, 871, 874, 860, 861, 860, 864, 856, 869, + 892, 0, 0, 859, 0, 869, 851, 884, 879, 0, + 849, 854, 857, 873, 882, 0, 850, 0, 859, 846, + 845, 839, 0, 0, 851, 854, 838, 849, 847, 867, + 870, 428, 433, 865, 870, 867, 846, 828, 832, 831, + + 833, 0, 838, 828, 855, 821, 844, 856, 856, 841, + 857, 853, 821, 827, 824, 823, 0, 822, 832, 820, + 819, 820, 296, 829, 828, 842, 242, 815, 303, 428, + 0, 824, 816, 798, 823, 0, 845, 809, 0, 795, + 803, 0, 820, 796, 0, 814, 789, 0, 0, 828, + 800, 801, 0, 0, 0, 798, 800, 796, 0, 800, + 794, 795, 781, 817, 815, 269, 789, 0, 801, 794, + 786, 787, 776, 778, 0, 780, 776, 0, 0, 763, + 795, 805, 793, 801, 802, 788, 0, 0, 807, 776, + 758, 770, 785, 0, 789, 0, 772, 787, 783, 777, + + 758, 749, 0, 754, 743, 780, 0, 0, 762, 767, + 771, 780, 769, 0, 749, 748, 751, 765, 759, 773, + 776, 773, 758, 739, 732, 0, 775, 741, 0, 0, + 758, 0, 764, 0, 749, 724, 740, 723, 730, 0, + 759, 0, 732, 713, 759, 755, 724, 731, 727, 0, + 730, 0, 724, 714, 718, 0, 0, 0, 731, 741, + 729, 744, 738, 734, 0, 702, 706, 0, 738, 741, + 723, 721, 714, 729, 720, 706, 707, 0, 719, 690, + 715, 716, 0, 739, 687, 700, 0, 707, 707, 707, + 711, 715, 713, 0, 673, 726, 0, 715, 714, 692, + + 675, 680, 672, 676, 707, 0, 0, 699, 685, 672, + 665, 0, 691, 663, 0, 676, 689, 697, 687, 676, + 694, 698, 664, 656, 671, 681, 686, 688, 674, 688, + 652, 648, 658, 673, 660, 664, 668, 688, 0, 0, + 668, 676, 677, 674, 673, 674, 0, 679, 650, 649, + 669, 638, 0, 637, 640, 663, 643, 664, 632, 635, + 649, 0, 0, 643, 653, 641, 317, 651, 656, 620, + 0, 345, 632, 651, 629, 631, 647, 609, 92, 0, + 0, 0, 147, 0, 185, 194, 184, 206, 0, 215, + 214, 265, 254, 272, 293, 273, 268, 0, 311, 304, + + 341, 321, 0, 356, 350, 366, 365, 367, 384, 381, + 383, 352, 370, 371, 389, 394, 430, 417, 423, 0, + 394, 0, 440, 0, 413, 430, 439, 423, 447, 429, + 441, 441, 0, 411, 435, 430, 434, 422, 439, 0, + 450, 472, 452, 463, 463, 455, 0, 452, 453, 458, + 462, 455, 470, 452, 435, 485, 478, 465, 0, 477, + 488, 472, 478, 477, 0, 478, 471, 468, 0, 471, + 1169, 0, 0, 475, 487, 510, 490, 483, 499, 497, + 0, 490, 507, 493, 478, 516, 499, 496, 497, 1169, + 508, 513, 505, 501, 515, 517, 0, 1169, 498, 0, + + 0, 510, 520, 525, 513, 507, 526, 510, 503, 541, + 513, 525, 0, 531, 0, 527, 528, 537, 0, 521, + 521, 516, 539, 524, 539, 540, 529, 0, 551, 534, + 534, 525, 532, 537, 550, 546, 530, 534, 552, 0, + 533, 0, 553, 565, 557, 548, 561, 555, 551, 561, + 566, 571, 560, 545, 553, 571, 1169, 0, 0, 556, + 559, 550, 0, 560, 573, 559, 557, 575, 578, 577, + 569, 567, 580, 0, 578, 578, 581, 584, 574, 566, + 587, 568, 569, 576, 583, 0, 0, 579, 582, 582, + 589, 593, 597, 595, 587, 600, 592, 582, 594, 608, + + 605, 595, 597, 602, 595, 599, 598, 600, 599, 605, + 0, 615, 616, 617, 605, 609, 0, 611, 608, 0, + 608, 609, 624, 612, 630, 618, 0, 614, 615, 626, + 635, 622, 619, 625, 631, 0, 626, 628, 0, 1169, + 658, 661, 664, 667, 670 + } ; + +static yyconst short int yy_def[946] = + { 0, + 940, 1, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 940, 940, 940, 940, 940, + 940, 940, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 940, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 940, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 940, + 940, 940, 940, 941, 941, 941, 941, 941, 941, 941, + + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 940, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 940, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 940, 940, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 940, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 940, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 940, 940, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 940, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 940, 941, 941, 941, 941, + + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 940, 940, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 940, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 940, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 940, 940, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 940, 941, 941, 941, 941, 941, + 941, 940, 941, 941, 941, 941, 941, 941, 941, 941, + + 941, 941, 941, 941, 940, 940, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 940, 941, 941, 941, 941, 941, 940, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 942, + 940, 943, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 940, 941, 941, 941, 941, + 940, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 940, 944, 941, 941, 941, 945, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 940, 941, 941, 941, 940, + 941, 941, 941, 941, 941, 941, 941, 940, 941, 941, + + 941, 941, 941, 941, 941, 941, 941, 941, 941, 940, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 940, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 940, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 940, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 941, 941, 941, 941, 0, + 940, 940, 940, 940, 940 + } ; + +static yyconst short int yy_nxt[1236] = + { 0, + 4, 5, 6, 7, 8, 9, 4, 4, 4, 10, + 11, 12, 12, 12, 12, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 24, 24, 24, 24, 24, 24, 24, 37, 38, 24, + 24, 24, 39, 24, 40, 41, 24, 24, 24, 42, + 24, 24, 43, 24, 24, 24, 44, 44, 44, 46, + 46, 46, 46, 46, 44, 53, 44, 44, 44, 54, + 66, 191, 192, 45, 45, 45, 66, 66, 96, 44, + 168, 45, 66, 45, 45, 45, 47, 61, 48, 48, + + 48, 48, 48, 61, 61, 66, 45, 44, 180, 61, + 49, 211, 163, 97, 320, 212, 181, 66, 59, 60, + 67, 102, 61, 50, 51, 52, 55, 68, 56, 56, + 56, 56, 56, 111, 61, 61, 66, 44, 62, 57, + 69, 321, 81, 721, 66, 263, 70, 91, 153, 66, + 82, 66, 86, 61, 45, 92, 63, 64, 65, 264, + 87, 61, 88, 182, 57, 71, 61, 66, 61, 722, + 154, 83, 93, 72, 66, 84, 73, 219, 220, 74, + 183, 94, 95, 89, 61, 85, 66, 66, 75, 98, + 76, 61, 66, 66, 77, 90, 723, 78, 79, 66, + + 66, 100, 80, 61, 61, 103, 108, 112, 66, 61, + 61, 66, 66, 145, 174, 724, 61, 61, 725, 123, + 101, 113, 104, 155, 66, 61, 105, 124, 61, 61, + 106, 114, 99, 125, 107, 109, 384, 175, 385, 157, + 726, 61, 66, 110, 66, 727, 156, 158, 46, 46, + 46, 46, 46, 115, 244, 66, 728, 146, 116, 61, + 198, 61, 199, 200, 147, 159, 245, 117, 148, 201, + 149, 150, 61, 729, 118, 119, 120, 160, 66, 121, + 379, 230, 122, 66, 380, 260, 151, 231, 126, 730, + 152, 381, 127, 261, 731, 61, 128, 288, 129, 130, + + 61, 515, 516, 172, 172, 161, 131, 173, 173, 173, + 173, 173, 289, 290, 132, 732, 510, 547, 733, 133, + 134, 548, 518, 734, 135, 511, 278, 278, 136, 66, + 279, 279, 279, 279, 279, 519, 708, 735, 137, 736, + 709, 138, 139, 140, 141, 142, 61, 48, 48, 48, + 48, 48, 143, 170, 170, 170, 170, 170, 165, 173, + 173, 173, 173, 173, 171, 713, 55, 144, 56, 56, + 56, 56, 56, 170, 170, 170, 170, 170, 737, 57, + 714, 738, 739, 165, 280, 740, 281, 281, 741, 171, + 282, 282, 282, 282, 282, 173, 173, 173, 173, 173, + + 742, 743, 744, 745, 57, 746, 747, 748, 749, 280, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 392, 392, 750, 751, 393, 393, 393, 393, 393, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 393, + 393, 393, 393, 393, 393, 393, 393, 393, 393, 520, + 752, 753, 754, 755, 756, 757, 758, 759, 760, 521, + 761, 762, 763, 522, 764, 765, 766, 767, 768, 769, + 770, 772, 771, 771, 774, 771, 771, 771, 771, 771, + 771, 771, 771, 775, 776, 777, 778, 779, 771, 771, + 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, + + 790, 791, 792, 793, 794, 795, 796, 797, 799, 800, + 798, 798, 802, 798, 798, 798, 798, 798, 798, 798, + 798, 803, 804, 805, 806, 807, 798, 798, 808, 809, + 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, + 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, + 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, + 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, + + 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, + 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, + 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, + 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, + 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, + 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, + 58, 771, 720, 771, 773, 719, 773, 798, 718, 798, + 801, 717, 801, 716, 715, 712, 711, 710, 707, 706, + 705, 704, 703, 702, 701, 700, 699, 698, 697, 696, + 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, + + 685, 684, 683, 682, 681, 680, 679, 678, 677, 676, + 675, 674, 673, 672, 671, 670, 669, 668, 667, 666, + 665, 664, 663, 662, 661, 660, 659, 658, 657, 656, + 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, + 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, + 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, + 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, + 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, + 605, 604, 603, 602, 601, 600, 599, 598, 597, 596, + 595, 594, 593, 592, 591, 590, 589, 588, 587, 586, + + 585, 584, 583, 582, 581, 580, 579, 578, 577, 576, + 575, 574, 573, 572, 571, 570, 569, 568, 567, 566, + 565, 564, 563, 562, 561, 560, 559, 558, 557, 556, + 555, 554, 553, 552, 551, 550, 549, 546, 545, 544, + 543, 542, 541, 540, 539, 538, 537, 536, 535, 534, + 533, 532, 531, 530, 529, 528, 527, 526, 525, 524, + 523, 517, 514, 513, 512, 509, 508, 507, 506, 505, + 504, 503, 502, 501, 500, 499, 498, 497, 496, 495, + 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, + 484, 483, 482, 481, 480, 479, 478, 477, 476, 475, + + 474, 473, 472, 471, 470, 469, 468, 467, 466, 465, + 464, 463, 462, 461, 460, 459, 458, 457, 456, 455, + 454, 453, 452, 451, 450, 449, 448, 447, 446, 445, + 444, 443, 442, 441, 440, 439, 438, 437, 436, 435, + 434, 433, 432, 431, 430, 429, 428, 427, 426, 425, + 424, 423, 422, 421, 420, 419, 418, 417, 416, 415, + 414, 413, 412, 411, 410, 409, 408, 407, 406, 405, + 404, 403, 402, 401, 400, 399, 398, 397, 396, 395, + 394, 391, 390, 389, 388, 387, 386, 383, 382, 378, + 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, + + 367, 366, 365, 364, 363, 362, 361, 360, 359, 358, + 357, 356, 355, 354, 353, 352, 351, 350, 349, 348, + 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, + 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, + 327, 326, 325, 324, 323, 322, 319, 318, 317, 316, + 315, 314, 313, 312, 311, 310, 309, 308, 307, 306, + 305, 304, 303, 302, 301, 300, 299, 298, 297, 296, + 295, 294, 293, 292, 291, 287, 286, 285, 284, 283, + 277, 276, 275, 274, 273, 272, 271, 270, 269, 268, + 267, 266, 265, 262, 259, 258, 257, 256, 255, 254, + + 253, 252, 251, 250, 249, 248, 247, 246, 243, 242, + 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, + 229, 228, 227, 226, 225, 224, 223, 222, 221, 218, + 217, 216, 215, 214, 213, 210, 209, 208, 207, 206, + 205, 204, 203, 202, 197, 196, 195, 194, 193, 190, + 189, 188, 187, 186, 185, 184, 174, 179, 178, 177, + 176, 169, 167, 166, 164, 163, 162, 940, 3, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940 + } ; + +static yyconst short int yy_chk[1236] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 4, 5, 7, 8, + 8, 8, 8, 8, 9, 11, 13, 14, 8, 11, + 24, 74, 74, 4, 5, 7, 21, 25, 21, 11, + 51, 9, 28, 13, 14, 8, 10, 24, 10, 10, + + 10, 10, 10, 21, 25, 16, 11, 10, 64, 28, + 10, 90, 51, 21, 209, 90, 64, 36, 15, 15, + 16, 25, 16, 10, 10, 10, 12, 16, 12, 12, + 12, 12, 12, 28, 36, 15, 37, 12, 15, 12, + 16, 209, 18, 679, 18, 146, 16, 20, 36, 20, + 18, 19, 19, 37, 12, 20, 15, 15, 15, 146, + 19, 18, 19, 65, 12, 17, 20, 17, 19, 683, + 37, 18, 20, 17, 34, 18, 17, 97, 97, 17, + 65, 20, 20, 19, 17, 18, 23, 22, 17, 22, + 17, 34, 31, 29, 17, 19, 685, 17, 17, 26, + + 38, 23, 17, 23, 22, 26, 27, 29, 27, 31, + 29, 39, 40, 34, 59, 686, 26, 38, 687, 31, + 23, 29, 26, 38, 41, 27, 26, 31, 39, 40, + 26, 29, 22, 31, 26, 27, 271, 59, 271, 40, + 688, 41, 42, 27, 30, 690, 39, 40, 46, 46, + 46, 46, 46, 30, 121, 35, 691, 35, 30, 42, + 80, 30, 80, 80, 35, 41, 121, 30, 35, 80, + 35, 35, 35, 692, 30, 30, 30, 42, 43, 30, + 268, 107, 30, 32, 268, 144, 35, 107, 32, 693, + 35, 268, 32, 144, 694, 43, 32, 179, 32, 32, + + 32, 427, 427, 57, 57, 43, 32, 57, 57, 57, + 57, 57, 179, 179, 32, 695, 423, 466, 696, 32, + 32, 466, 429, 697, 32, 423, 165, 165, 32, 33, + 165, 165, 165, 165, 165, 429, 667, 699, 33, 700, + 667, 33, 33, 33, 33, 33, 33, 48, 48, 48, + 48, 48, 33, 55, 55, 55, 55, 55, 48, 172, + 172, 172, 172, 172, 55, 672, 56, 33, 56, 56, + 56, 56, 56, 170, 170, 170, 170, 170, 701, 56, + 672, 702, 704, 48, 170, 705, 171, 171, 706, 55, + 171, 171, 171, 171, 171, 173, 173, 173, 173, 173, + + 707, 708, 709, 710, 56, 711, 712, 713, 714, 170, + 278, 278, 278, 278, 278, 279, 279, 279, 279, 279, + 280, 280, 715, 716, 280, 280, 280, 280, 280, 281, + 281, 281, 281, 281, 282, 282, 282, 282, 282, 392, + 392, 392, 392, 392, 393, 393, 393, 393, 393, 430, + 717, 718, 719, 721, 723, 725, 726, 727, 728, 430, + 729, 730, 731, 430, 732, 734, 735, 736, 737, 738, + 739, 741, 742, 742, 743, 742, 742, 742, 742, 742, + 742, 742, 742, 744, 745, 746, 748, 749, 742, 742, + 750, 751, 752, 753, 754, 755, 756, 757, 758, 760, + + 761, 762, 763, 764, 766, 767, 768, 770, 774, 775, + 776, 776, 777, 776, 776, 776, 776, 776, 776, 776, + 776, 778, 779, 780, 782, 783, 776, 776, 784, 785, + 786, 787, 788, 789, 791, 792, 793, 794, 795, 796, + 799, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 814, 816, 817, 818, 820, 821, 822, 823, + 824, 825, 826, 827, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 841, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, + 860, 861, 862, 864, 865, 866, 867, 868, 869, 870, + + 871, 872, 873, 875, 876, 877, 878, 879, 880, 881, + 882, 883, 884, 885, 888, 889, 890, 891, 892, 893, + 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, + 904, 905, 906, 907, 908, 909, 910, 912, 913, 914, + 915, 916, 918, 919, 921, 922, 923, 924, 925, 926, + 928, 929, 930, 931, 932, 933, 934, 935, 937, 938, + 941, 942, 678, 942, 943, 677, 943, 944, 676, 944, + 945, 675, 945, 674, 673, 670, 669, 668, 666, 665, + 664, 661, 660, 659, 658, 657, 656, 655, 654, 652, + 651, 650, 649, 648, 646, 645, 644, 643, 642, 641, + + 638, 637, 636, 635, 634, 633, 632, 631, 630, 629, + 628, 627, 626, 625, 624, 623, 622, 621, 620, 619, + 618, 617, 616, 614, 613, 611, 610, 609, 608, 605, + 604, 603, 602, 601, 600, 599, 598, 596, 595, 593, + 592, 591, 590, 589, 588, 586, 585, 584, 582, 581, + 580, 579, 577, 576, 575, 574, 573, 572, 571, 570, + 569, 567, 566, 564, 563, 562, 561, 560, 559, 555, + 554, 553, 551, 549, 548, 547, 546, 545, 544, 543, + 541, 539, 538, 537, 536, 535, 533, 531, 528, 527, + 525, 524, 523, 522, 521, 520, 519, 518, 517, 516, + + 515, 513, 512, 511, 510, 509, 506, 505, 504, 502, + 501, 500, 499, 498, 497, 495, 493, 492, 491, 490, + 489, 486, 485, 484, 483, 482, 481, 480, 477, 476, + 474, 473, 472, 471, 470, 469, 467, 465, 464, 463, + 462, 461, 460, 458, 457, 456, 452, 451, 450, 447, + 446, 444, 443, 441, 440, 438, 437, 435, 434, 433, + 432, 428, 426, 425, 424, 422, 421, 420, 419, 418, + 416, 415, 414, 413, 412, 411, 410, 409, 408, 407, + 406, 405, 404, 403, 401, 400, 399, 398, 397, 396, + 395, 394, 391, 390, 389, 388, 387, 386, 385, 382, + + 381, 380, 379, 377, 375, 374, 373, 372, 371, 369, + 368, 367, 366, 364, 361, 360, 359, 358, 357, 356, + 355, 354, 353, 352, 351, 350, 349, 348, 347, 346, + 345, 343, 341, 339, 338, 336, 335, 334, 333, 332, + 331, 330, 329, 327, 325, 324, 323, 322, 321, 320, + 319, 318, 317, 316, 315, 314, 311, 310, 309, 308, + 307, 305, 304, 303, 302, 301, 300, 299, 297, 296, + 295, 294, 293, 292, 290, 289, 288, 287, 286, 285, + 283, 277, 276, 275, 274, 273, 272, 270, 269, 267, + 266, 265, 264, 263, 262, 261, 260, 259, 258, 257, + + 256, 255, 254, 253, 252, 251, 250, 249, 248, 247, + 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, + 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, + 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, + 216, 215, 214, 213, 212, 210, 208, 207, 206, 205, + 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, + 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, + 184, 183, 182, 181, 180, 178, 177, 176, 175, 174, + 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, + 153, 152, 151, 145, 143, 140, 138, 136, 135, 134, + + 133, 132, 131, 126, 125, 124, 123, 122, 120, 118, + 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, + 106, 105, 104, 103, 102, 101, 100, 99, 98, 96, + 95, 94, 93, 92, 91, 89, 88, 87, 86, 85, + 84, 83, 82, 81, 79, 78, 77, 76, 75, 73, + 72, 71, 70, 69, 68, 67, 66, 63, 62, 61, + 60, 52, 50, 49, 47, 45, 44, 3, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "Gmsh.l" +#define INITIAL 0 +#line 2 "Gmsh.l" +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#include "Gmsh.h" +#include "Geo.h" +#include "CAD.h" +#include "Gmsh.tab.cpp.h" + +char TmpString[1024]; +int yywhere = INFILE; +int yylineno = 1; + +void parsestring(char endchar); +char *strsave(char *ptr); +void skipcomments(void); +void skipline(void); + +#define YY_ALWAYS_INTERACTIVE 1 + +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ){ \ + buf[n++] = (char) c; \ + yylineno++; \ + } \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); + +#line 989 "Gmsh.yy.cpp" + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include <stdlib.h> +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp = NULL, *yy_bp = NULL; + register int yy_act; + +#line 59 "Gmsh.l" + + +#line 1143 "Gmsh.yy.cpp" + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 941 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 1169 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 61 "Gmsh.l" +/* none */ ; + YY_BREAK +case 2: +YY_RULE_SETUP +#line 62 "Gmsh.l" +return tEND; + YY_BREAK +case 3: +YY_RULE_SETUP +#line 64 "Gmsh.l" +skipcomments(); + YY_BREAK +case 4: +YY_RULE_SETUP +#line 65 "Gmsh.l" +skipline(); + YY_BREAK +case 5: +YY_RULE_SETUP +#line 66 "Gmsh.l" +{parsestring('\"'); return tBIGSTR;} + YY_BREAK +case 6: +YY_RULE_SETUP +#line 67 "Gmsh.l" +{parsestring('\''); return tBIGSTR;} + YY_BREAK +case 7: +YY_RULE_SETUP +#line 68 "Gmsh.l" +{yylval.d = NEWREG(); return tDOUBLE;} + YY_BREAK +case 8: +YY_RULE_SETUP +#line 69 "Gmsh.l" +{yylval.d = NEWPOINT(); return tDOUBLE;} + YY_BREAK +case 9: +YY_RULE_SETUP +#line 70 "Gmsh.l" +return tAFFECT; + YY_BREAK +case 10: +YY_RULE_SETUP +#line 71 "Gmsh.l" +return tDOTS; + YY_BREAK +case 11: +YY_RULE_SETUP +#line 74 "Gmsh.l" +return tAcos ; + YY_BREAK +case 12: +YY_RULE_SETUP +#line 75 "Gmsh.l" +return tAcos ; + YY_BREAK +case 13: +YY_RULE_SETUP +#line 76 "Gmsh.l" +return tAsin; + YY_BREAK +case 14: +YY_RULE_SETUP +#line 77 "Gmsh.l" +return tAsin; + YY_BREAK +case 15: +YY_RULE_SETUP +#line 78 "Gmsh.l" +return tAtan ; + YY_BREAK +case 16: +YY_RULE_SETUP +#line 79 "Gmsh.l" +return tAtan ; + YY_BREAK +case 17: +YY_RULE_SETUP +#line 80 "Gmsh.l" +return tAtan2 ; + YY_BREAK +case 18: +YY_RULE_SETUP +#line 81 "Gmsh.l" +return tAtan2 ; + YY_BREAK +case 19: +YY_RULE_SETUP +#line 82 "Gmsh.l" +return tAssociation; + YY_BREAK +case 20: +YY_RULE_SETUP +#line 83 "Gmsh.l" +return tAttractor; + YY_BREAK +case 21: +YY_RULE_SETUP +#line 85 "Gmsh.l" +return tBump; + YY_BREAK +case 22: +YY_RULE_SETUP +#line 86 "Gmsh.l" +return tBSpline; + YY_BREAK +case 23: +YY_RULE_SETUP +#line 87 "Gmsh.l" +return tBounds; + YY_BREAK +case 24: +YY_RULE_SETUP +#line 89 "Gmsh.l" +return tCeil ; + YY_BREAK +case 25: +YY_RULE_SETUP +#line 90 "Gmsh.l" +return tCosh ; + YY_BREAK +case 26: +YY_RULE_SETUP +#line 91 "Gmsh.l" +return tCos ; + YY_BREAK +case 27: +YY_RULE_SETUP +#line 92 "Gmsh.l" +return tCharacteristic; + YY_BREAK +case 28: +YY_RULE_SETUP +#line 93 "Gmsh.l" +return tCircle; + YY_BREAK +case 29: +YY_RULE_SETUP +#line 94 "Gmsh.l" +return tCoherence; + YY_BREAK +case 30: +YY_RULE_SETUP +#line 95 "Gmsh.l" +return tComplex; + YY_BREAK +case 31: +YY_RULE_SETUP +#line 96 "Gmsh.l" +return tColor; + YY_BREAK +case 32: +YY_RULE_SETUP +#line 97 "Gmsh.l" +return tSpline; + YY_BREAK +case 33: +YY_RULE_SETUP +#line 99 "Gmsh.l" +return tDelete; + YY_BREAK +case 34: +YY_RULE_SETUP +#line 100 "Gmsh.l" +return tDilate; + YY_BREAK +case 35: +YY_RULE_SETUP +#line 101 "Gmsh.l" +return tDuplicata; + YY_BREAK +case 36: +YY_RULE_SETUP +#line 103 "Gmsh.l" +return tExp ; + YY_BREAK +case 37: +YY_RULE_SETUP +#line 104 "Gmsh.l" +return tEllipsis; + YY_BREAK +case 38: +YY_RULE_SETUP +#line 105 "Gmsh.l" +return tExtrude; + YY_BREAK +case 39: +YY_RULE_SETUP +#line 106 "Gmsh.l" +return tElliptic; + YY_BREAK +case 40: +YY_RULE_SETUP +#line 107 "Gmsh.l" +return tELLIPSE; + YY_BREAK +case 41: +YY_RULE_SETUP +#line 109 "Gmsh.l" +return tFabs ; + YY_BREAK +case 42: +YY_RULE_SETUP +#line 110 "Gmsh.l" +return tFloor ; + YY_BREAK +case 43: +YY_RULE_SETUP +#line 111 "Gmsh.l" +return tFmod ; + YY_BREAK +case 44: +YY_RULE_SETUP +#line 113 "Gmsh.l" +return tGeneral; + YY_BREAK +case 45: +YY_RULE_SETUP +#line 114 "Gmsh.l" +return tGeometry; + YY_BREAK +case 46: +YY_RULE_SETUP +#line 116 "Gmsh.l" +return tHypot ; + YY_BREAK +case 47: +YY_RULE_SETUP +#line 118 "Gmsh.l" +return tInclude; + YY_BREAK +case 48: +YY_RULE_SETUP +#line 120 "Gmsh.l" +return tKnots; + YY_BREAK +case 49: +YY_RULE_SETUP +#line 122 "Gmsh.l" +return tLength; + YY_BREAK +case 50: +YY_RULE_SETUP +#line 123 "Gmsh.l" +return tLine; + YY_BREAK +case 51: +YY_RULE_SETUP +#line 124 "Gmsh.l" +return tLoop; + YY_BREAK +case 52: +YY_RULE_SETUP +#line 125 "Gmsh.l" +return tLog ; + YY_BREAK +case 53: +YY_RULE_SETUP +#line 126 "Gmsh.l" +return tLog10 ; + YY_BREAK +case 54: +YY_RULE_SETUP +#line 127 "Gmsh.l" +return tLayers; + YY_BREAK +case 55: +YY_RULE_SETUP +#line 129 "Gmsh.l" +return tMesh; + YY_BREAK +case 56: +YY_RULE_SETUP +#line 130 "Gmsh.l" +return tModulo ; + YY_BREAK +case 57: +YY_RULE_SETUP +#line 132 "Gmsh.l" +return tNurbs; + YY_BREAK +case 58: +YY_RULE_SETUP +#line 134 "Gmsh.l" +return tOffset; + YY_BREAK +case 59: +YY_RULE_SETUP +#line 135 "Gmsh.l" +return tOrder; + YY_BREAK +case 60: +YY_RULE_SETUP +#line 137 "Gmsh.l" +return tPhysical; + YY_BREAK +case 61: +YY_RULE_SETUP +#line 138 "Gmsh.l" +return tPi; + YY_BREAK +case 62: +YY_RULE_SETUP +#line 139 "Gmsh.l" +return tPlane; + YY_BREAK +case 63: +YY_RULE_SETUP +#line 140 "Gmsh.l" +return tPoint; + YY_BREAK +case 64: +YY_RULE_SETUP +#line 141 "Gmsh.l" +return tPower; + YY_BREAK +case 65: +YY_RULE_SETUP +#line 142 "Gmsh.l" +return tProgression; + YY_BREAK +case 66: +YY_RULE_SETUP +#line 143 "Gmsh.l" +return tParametric; + YY_BREAK +case 67: +YY_RULE_SETUP +#line 145 "Gmsh.l" +return tRecombine; + YY_BREAK +case 68: +YY_RULE_SETUP +#line 146 "Gmsh.l" +return tRotate; + YY_BREAK +case 69: +YY_RULE_SETUP +#line 147 "Gmsh.l" +return tRuled; + YY_BREAK +case 70: +YY_RULE_SETUP +#line 149 "Gmsh.l" +return tSqrt ; + YY_BREAK +case 71: +YY_RULE_SETUP +#line 150 "Gmsh.l" +return tSin ; + YY_BREAK +case 72: +YY_RULE_SETUP +#line 151 "Gmsh.l" +return tSinh ; + YY_BREAK +case 73: +YY_RULE_SETUP +#line 152 "Gmsh.l" +return tPhysical; + YY_BREAK +case 74: +YY_RULE_SETUP +#line 153 "Gmsh.l" +return tSpline; + YY_BREAK +case 75: +YY_RULE_SETUP +#line 154 "Gmsh.l" +return tSurface; + YY_BREAK +case 76: +YY_RULE_SETUP +#line 155 "Gmsh.l" +return tSymetry; + YY_BREAK +case 77: +YY_RULE_SETUP +#line 157 "Gmsh.l" +return tTransfinite; + YY_BREAK +case 78: +YY_RULE_SETUP +#line 158 "Gmsh.l" +return tTranslate; + YY_BREAK +case 79: +YY_RULE_SETUP +#line 159 "Gmsh.l" +return tTanh ; + YY_BREAK +case 80: +YY_RULE_SETUP +#line 160 "Gmsh.l" +return tTan; + YY_BREAK +case 81: +YY_RULE_SETUP +#line 161 "Gmsh.l" +return tTrimmed; + YY_BREAK +case 82: +YY_RULE_SETUP +#line 163 "Gmsh.l" +return tUsing; + YY_BREAK +case 83: +YY_RULE_SETUP +#line 165 "Gmsh.l" +return tView; + YY_BREAK +case 84: +YY_RULE_SETUP +#line 166 "Gmsh.l" +return tVolume; + YY_BREAK +case 85: +YY_RULE_SETUP +#line 168 "Gmsh.l" +return tWith; + YY_BREAK +case 86: +YY_RULE_SETUP +#line 171 "Gmsh.l" +return tScalarSimplex; + YY_BREAK +case 87: +YY_RULE_SETUP +#line 172 "Gmsh.l" +return tVectorSimplex; + YY_BREAK +case 88: +YY_RULE_SETUP +#line 173 "Gmsh.l" +return tTensorSimplex; + YY_BREAK +case 89: +YY_RULE_SETUP +#line 174 "Gmsh.l" +return tScalarTriangle; + YY_BREAK +case 90: +YY_RULE_SETUP +#line 175 "Gmsh.l" +return tVectorTriangle; + YY_BREAK +case 91: +YY_RULE_SETUP +#line 176 "Gmsh.l" +return tTensorTriangle; + YY_BREAK +case 92: +YY_RULE_SETUP +#line 177 "Gmsh.l" +return tScalarLine; + YY_BREAK +case 93: +YY_RULE_SETUP +#line 178 "Gmsh.l" +return tVectorLine; + YY_BREAK +case 94: +YY_RULE_SETUP +#line 179 "Gmsh.l" +return tTensorLine; + YY_BREAK +case 95: +YY_RULE_SETUP +#line 180 "Gmsh.l" +return tScalarPoint; + YY_BREAK +case 96: +YY_RULE_SETUP +#line 181 "Gmsh.l" +return tVectorPoint; + YY_BREAK +case 97: +YY_RULE_SETUP +#line 182 "Gmsh.l" +return tTensorPoint; + YY_BREAK +case 98: +YY_RULE_SETUP +#line 185 "Gmsh.l" +return tCARTESIAN_POINT; + YY_BREAK +case 99: +YY_RULE_SETUP +#line 186 "Gmsh.l" +return tB_SPLINE_SURFACE_WITH_KNOTS; + YY_BREAK +case 100: +YY_RULE_SETUP +#line 187 "Gmsh.l" +return tB_SPLINE_CURVE_WITH_KNOTS; + YY_BREAK +case 101: +YY_RULE_SETUP +#line 188 "Gmsh.l" +return tUNSPECIFIED; + YY_BREAK +case 102: +YY_RULE_SETUP +#line 189 "Gmsh.l" +return tCONTINUOUS; + YY_BREAK +case 103: +YY_RULE_SETUP +#line 190 "Gmsh.l" +return tFALSE; + YY_BREAK +case 104: +YY_RULE_SETUP +#line 191 "Gmsh.l" +return tTRUE; + YY_BREAK +case 105: +YY_RULE_SETUP +#line 192 "Gmsh.l" +return tU; + YY_BREAK +case 106: +YY_RULE_SETUP +#line 193 "Gmsh.l" +return tV; + YY_BREAK +case 107: +YY_RULE_SETUP +#line 194 "Gmsh.l" +return tORIENTED_EDGE; + YY_BREAK +case 108: +YY_RULE_SETUP +#line 195 "Gmsh.l" +return tEDGE_CURVE; + YY_BREAK +case 109: +YY_RULE_SETUP +#line 196 "Gmsh.l" +return tEDGE_LOOP; + YY_BREAK +case 110: +YY_RULE_SETUP +#line 197 "Gmsh.l" +return tVERTEX_POINT; + YY_BREAK +case 111: +YY_RULE_SETUP +#line 198 "Gmsh.l" +return tFACE_OUTER_BOUND; + YY_BREAK +case 112: +YY_RULE_SETUP +#line 199 "Gmsh.l" +return tFACE_BOUND; + YY_BREAK +case 113: +YY_RULE_SETUP +#line 200 "Gmsh.l" +return tADVANCED_FACE; + YY_BREAK +case 114: +YY_RULE_SETUP +#line 201 "Gmsh.l" +return tLine; + YY_BREAK +case 115: +YY_RULE_SETUP +#line 202 "Gmsh.l" +return tVECTOR; + YY_BREAK +case 116: +YY_RULE_SETUP +#line 203 "Gmsh.l" +return tDIRECTION; + YY_BREAK +case 117: +YY_RULE_SETUP +#line 204 "Gmsh.l" +return tAXIS2_PLACEMENT_3D; + YY_BREAK +case 118: +YY_RULE_SETUP +#line 205 "Gmsh.l" +return tPLANE; + YY_BREAK +case 119: +YY_RULE_SETUP +#line 206 "Gmsh.l" +return tHEADER; + YY_BREAK +case 120: +YY_RULE_SETUP +#line 207 "Gmsh.l" +return tDATA; + YY_BREAK +case 121: +YY_RULE_SETUP +#line 208 "Gmsh.l" +return tFILE_SCHEMA; + YY_BREAK +case 122: +YY_RULE_SETUP +#line 209 "Gmsh.l" +return tFILE_NAME; + YY_BREAK +case 123: +YY_RULE_SETUP +#line 210 "Gmsh.l" +return tFILE_DESCRIPTION; + YY_BREAK +case 124: +YY_RULE_SETUP +#line 211 "Gmsh.l" +return tISO; + YY_BREAK +case 125: +YY_RULE_SETUP +#line 212 "Gmsh.l" +return tENDISO; + YY_BREAK +case 126: +YY_RULE_SETUP +#line 213 "Gmsh.l" +return tENDSEC; + YY_BREAK +case 127: +YY_RULE_SETUP +#line 214 "Gmsh.l" +return tCLOSED_SHELL; + YY_BREAK +case 128: +YY_RULE_SETUP +#line 215 "Gmsh.l" +return tADVANCED_BREP_SHAPE_REPRESENTATION; + YY_BREAK +case 129: +YY_RULE_SETUP +#line 216 "Gmsh.l" +return tMANIFOLD_SOLID_BREP; + YY_BREAK +case 130: +YY_RULE_SETUP +#line 217 "Gmsh.l" +return tCYLINDRICAL_SURFACE; + YY_BREAK +case 131: +YY_RULE_SETUP +#line 218 "Gmsh.l" +return tCONICAL_SURFACE; + YY_BREAK +case 132: +YY_RULE_SETUP +#line 219 "Gmsh.l" +return tTOROIDAL_SURFACE; + YY_BREAK +case 133: +YY_RULE_SETUP +#line 220 "Gmsh.l" +return tCIRCLE; + YY_BREAK +case 134: +YY_RULE_SETUP +#line 221 "Gmsh.l" +return tTRIMMED_CURVE; + YY_BREAK +case 135: +YY_RULE_SETUP +#line 222 "Gmsh.l" +return tGEOMETRIC_SET; + YY_BREAK +case 136: +YY_RULE_SETUP +#line 223 "Gmsh.l" +return tCOMPOSITE_CURVE_SEGMENT; + YY_BREAK +case 137: +YY_RULE_SETUP +#line 224 "Gmsh.l" +return tCOMPOSITE_CURVE; + YY_BREAK +case 138: +YY_RULE_SETUP +#line 225 "Gmsh.l" +return tPRODUCT_DEFINITION; + YY_BREAK +case 139: +YY_RULE_SETUP +#line 226 "Gmsh.l" +return tPRODUCT_DEFINITION_SHAPE; + YY_BREAK +case 140: +YY_RULE_SETUP +#line 227 "Gmsh.l" +return tSHAPE_DEFINITION_REPRESENTATION; + YY_BREAK +case 141: +YY_RULE_SETUP +#line 229 "Gmsh.l" +return tVertex; + YY_BREAK +case 142: +YY_RULE_SETUP +#line 230 "Gmsh.l" +return tFacet; + YY_BREAK +case 143: +YY_RULE_SETUP +#line 231 "Gmsh.l" +return tNormal; + YY_BREAK +case 144: +YY_RULE_SETUP +#line 232 "Gmsh.l" +return tOuter; + YY_BREAK +case 145: +YY_RULE_SETUP +#line 233 "Gmsh.l" +return tLoopSTL; + YY_BREAK +case 146: +YY_RULE_SETUP +#line 234 "Gmsh.l" +return tEndLoop; + YY_BREAK +case 147: +YY_RULE_SETUP +#line 235 "Gmsh.l" +return tEndFacet; + YY_BREAK +case 148: +YY_RULE_SETUP +#line 236 "Gmsh.l" +{skipline();return tEndSolid;} + YY_BREAK +case 149: +YY_RULE_SETUP +#line 237 "Gmsh.l" +{skipline();return tSolid;} + YY_BREAK +case 150: +YY_RULE_SETUP +#line 239 "Gmsh.l" +{yylval.d = (double)atoi((char*)(yytext+1)); return tDOUBLE;} + YY_BREAK +case 151: +#line 242 "Gmsh.l" +case 152: +#line 243 "Gmsh.l" +case 153: +#line 244 "Gmsh.l" +case 154: +YY_RULE_SETUP +#line 244 "Gmsh.l" +{yylval.d = atof((char *)yytext); return tDOUBLE;} + YY_BREAK +case 155: +YY_RULE_SETUP +#line 246 "Gmsh.l" +{yylval.c = strsave((char*)yytext); return tSTRING;} + YY_BREAK +case 156: +YY_RULE_SETUP +#line 248 "Gmsh.l" +return yytext[0]; + YY_BREAK +case 157: +YY_RULE_SETUP +#line 250 "Gmsh.l" +ECHO; + YY_BREAK +#line 2002 "Gmsh.yy.cpp" +case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 941 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 941 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 940); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 250 "Gmsh.l" + + +#undef yywrap + +int yywrap() {return 1;} + +void skipcomments(void) { + int c; + + while (1) { + while ((c=yyinput()) != '*'){ + if(c == EOF) { + fprintf(stderr, "Error: End of File in Commented Region\n") ; + exit(1); + } + } + if ((c = yyinput()) == '/') + return; + unput(c); + } +} + +void parsestring(char endchar){ + int c, i; + + c = yyinput(); + i = 0; + while (c != endchar) { + TmpString[i++] = c; + c = yyinput(); + } + TmpString[i++] = '\0'; + yylval.c = strsave(TmpString); +} + +char *strsave(char *ptr){ + return((char*)strcpy((char*)malloc(strlen(ptr)+1),ptr)); +} + +void skipline(void) +{ + while (yyinput() != '\n') ; +} + diff --git a/Parser/Makefile b/Parser/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d5ec0e3bb1322656589d84ab727c3bdb28a431c3 --- /dev/null +++ b/Parser/Makefile @@ -0,0 +1,70 @@ +# +# Makefile for "libParser.a" +# + +.IGNORE: + +CC = c++ +C_FLAGS = -g -Wall + +OS_FLAGS = -D_UNIX + +RANLIB = /usr/bin/ranlib +RM = rm +YACC = bison +LEX = flex + +RMFLAGS = -f + +LIB = ../lib/libParser.a +INCLUDE = -I../includes -I../Common -I../DataStr -I../Geo -I../Graphics\ + -I../Mesh -I../Unix + +CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE) + +SRC = Gmsh.yy.cpp \ + Gmsh.tab.cpp + +OBJ = $(SRC:.cpp=.o) + +.SUFFIXES: .o .cpp + +$(LIB): $(OBJ) + ar ruvs $(LIB) $(OBJ) + $(RANLIB) $(LIB) + +.cpp.o: + $(CC) $(CFLAGS) -c $< + +parser: + $(YACC) --output Gmsh.tab.cpp -d Gmsh.y + $(LEX) -oGmsh.yy.cpp Gmsh.l + +clean: + $(RM) $(RMFLAGS) *.o + +lint: + $(LINT) $(CFLAGS) $(SRC) + +depend: + (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ + $(CC) -MM $(CFLAGS) ${SRC} \ + ) >Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) $(RMFLAGS) Makefile.new + +# DO NOT DELETE THIS LINE +Gmsh.yy.o: Gmsh.yy.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h ../Geo/CAD.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h Gmsh.tab.cpp.h +Gmsh.tab.o: Gmsh.tab.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h \ + ../Common/Context.h ../Geo/Geo.h ../Geo/CAD.h ../Mesh/Mesh.h \ + ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Geo/DataBase.h \ + ../Mesh/Create.h ../Common/Views.h ../Graphics/ColorTable.h \ + ../Geo/StepGeomDatabase.h ../Common/Colors.h Parser.h diff --git a/Parser/Parser.h b/Parser/Parser.h new file mode 100644 index 0000000000000000000000000000000000000000..e571192aa6697824fe9b3c560c455d1258c04d1a --- /dev/null +++ b/Parser/Parser.h @@ -0,0 +1,25 @@ +#ifndef _PARSER_H_ +#define _PARSER_H_ + +typedef struct { + char *Name; + double val; +} Symbol; + +void InitSymbols (void); +void DeleteSymbols(void); +int CompareSymbols (const void *a, const void *b); + +extern List_T *Symbol_L; + +int yyparse (void); +int yylex (); + +extern FILE *yyin; +extern int yylineno; +extern char yyname[256]; +extern char *yytext; +extern int yyerrorstate; + + +#endif diff --git a/README b/README new file mode 100644 index 0000000000000000000000000000000000000000..43fa99c949165e88f70dd823152c7524353d5e26 --- /dev/null +++ b/README @@ -0,0 +1,7 @@ + +some rules to follow: + +- please!, enable full warnings with your compiler (e.g. gcc -Wall) +- use Msg() to print information/erros/etc. +- indent your files and suppress the tabs (untabify) + diff --git a/TODO b/TODO new file mode 100644 index 0000000000000000000000000000000000000000..e6c50d86dce4c8fd3e638e92c3100124bb57c1f9 --- /dev/null +++ b/TODO @@ -0,0 +1,3 @@ + +affichier un point de couleur au CG de chaque element indiquant sa +qualite. diff --git a/Unix/Bitmaps.h b/Unix/Bitmaps.h new file mode 100644 index 0000000000000000000000000000000000000000..a088563c1882bec639d6a656dab02076eaffa434 --- /dev/null +++ b/Unix/Bitmaps.h @@ -0,0 +1,144 @@ +#ifndef _BITMAPS_H_ +#define _BITMAPS_H_ + +#define g1_width 66 +#define g1_height 29 +static char g1_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xfc,0x00,0x00,0x00, + 0x00,0x00,0x00,0x80,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc, + 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, + 0xe0,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xfc,0x00,0x00,0x00, + 0x00,0x00,0x10,0x30,0x00,0xfc,0x00,0x08,0x00,0x00,0x00,0x18,0x18,0x00,0xfc, + 0x00,0x0c,0x00,0x04,0x00,0x3c,0x08,0x06,0xfc,0xc0,0x0f,0x04,0x8f,0x01,0x3e, + 0x04,0x0f,0xfc,0x30,0x0e,0x8e,0xcf,0x03,0x7b,0x84,0x0f,0xfc,0x18,0x0e,0xcf, + 0xe7,0x83,0x70,0x42,0x0f,0xfc,0x1c,0x8e,0x2f,0x97,0x43,0x70,0x22,0x0e,0xfd, + 0x1e,0xcd,0x1e,0x8f,0x23,0x21,0x17,0x8e,0xfc,0xfe,0x68,0x8e,0x87,0x97,0x31, + 0x0f,0x4e,0xfc,0x7e,0x38,0x87,0x83,0x8f,0x1b,0x07,0x2e,0xfc,0x1c,0x1c,0x83, + 0x01,0x03,0x07,0x02,0x1e,0xfc,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x0c,0xfc, + 0x00,0x07,0x00,0x00,0x00,0x04,0x01,0x00,0xfc,0x80,0x03,0x00,0x00,0x00,0x8c, + 0x01,0x00,0xfc,0xc0,0x03,0x00,0x00,0x00,0x8c,0x99,0x26,0xfd,0xe0,0x01,0x00, + 0x00,0x00,0x54,0xa5,0x29,0xfd,0xf0,0x01,0x00,0x00,0x00,0x54,0xbd,0x28,0xfd, + 0xf0,0x00,0x00,0x00,0x00,0x24,0x85,0x28,0xfd,0x78,0x00,0x00,0x00,0x00,0x24, + 0xa5,0x28,0xfd,0x30,0x00,0x00,0x00,0x00,0x24,0x99,0xc8,0xfd,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xfc}; + +#define g2_width 66 +#define g2_height 29 +static char g2_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xfc,0x00,0x00,0x00, + 0x00,0x00,0x00,0x80,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc, + 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, + 0xe0,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xfc,0x00,0x00,0x00, + 0x00,0x00,0x10,0x30,0x00,0xfc,0x00,0x08,0x00,0x00,0x00,0x18,0x18,0x00,0xfc, + 0x00,0x0c,0x00,0x04,0x00,0x3c,0x08,0x06,0xfc,0xc0,0x0f,0x04,0x8f,0x01,0x3e, + 0x04,0x0f,0xfc,0x30,0x0e,0x8e,0xcf,0x03,0x7b,0x84,0x0f,0xfc,0x18,0x0e,0xcf, + 0xe7,0x83,0x70,0x42,0x0f,0xfc,0x1c,0x8e,0x2f,0x97,0x43,0x70,0x22,0x0e,0xfd, + 0x1e,0xcd,0x1e,0x8f,0x23,0x21,0x17,0x8e,0xfc,0xfe,0x68,0x8e,0x87,0x97,0x31, + 0x0f,0x4e,0xfc,0x7e,0x38,0x87,0x83,0x8f,0x1b,0x07,0x2e,0xfc,0x1c,0x1c,0x83, + 0x01,0x03,0x07,0x02,0x1e,0xfc,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x0c,0xfc, + 0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x80,0x03,0x00,0x00,0x00,0x00, + 0x00,0x00,0xfc,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xe0,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0xfc,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, + 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x78,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xfc,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xfc}; + +#define g3_width 66 +#define g3_height 29 +static char g3_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xfc,0x00,0x00,0x00, + 0x00,0x00,0x00,0x80,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc, + 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, + 0xe0,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xfc,0x00,0x00,0x00, + 0x00,0x00,0x10,0x30,0x00,0xfc,0x00,0x08,0x00,0x00,0x00,0x18,0x18,0x00,0xfc, + 0x00,0x0c,0x00,0x04,0x00,0x3c,0x08,0x06,0xfc,0xc0,0x0f,0x04,0x8f,0x01,0x3e, + 0x04,0x0f,0xfc,0x30,0x0e,0x8e,0xcf,0x03,0x7b,0x84,0x0f,0xfc,0x18,0x0e,0xcf, + 0xe7,0x83,0x70,0x42,0x0f,0xfc,0x1c,0x8e,0x2f,0x97,0x43,0x70,0x22,0x0e,0xfd, + 0x1e,0xcd,0x1e,0x8f,0x23,0x21,0x17,0x8e,0xfc,0xfe,0x68,0x8e,0x87,0x97,0x31, + 0x0f,0x4e,0xfc,0x7e,0x38,0x87,0x83,0x8f,0x1b,0x07,0x2e,0xfc,0x1c,0x1c,0x83, + 0x01,0x03,0x07,0x02,0x1e,0xfc,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x0c,0xfc, + 0x00,0x07,0xe0,0x01,0x00,0x00,0x00,0x00,0xfd,0x80,0x03,0x10,0x02,0x00,0x00, + 0x00,0x00,0xfd,0xc0,0x03,0x10,0x70,0x6e,0x6e,0x4e,0x63,0xfd,0xe0,0x01,0x10, + 0x88,0x92,0x92,0xd0,0x94,0xfd,0xf0,0x01,0x10,0x88,0x92,0x92,0x5c,0x14,0xfd, + 0xf0,0x00,0x10,0x88,0x92,0x92,0x52,0x14,0xfd,0x78,0x00,0x10,0x8a,0x92,0x92, + 0x52,0x94,0xfd,0x30,0x00,0xe0,0x71,0x92,0x92,0x6c,0x64,0xfd,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xfc}; + +#define about_width 49 +#define about_height 111 +static char about_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00, + 0x00,0x00,0x08,0x00,0x00,0xfe,0x00,0x00,0x00,0x10,0x00,0x00,0xfe,0x00,0x00, + 0x00,0x20,0x00,0x00,0xfe,0x00,0x00,0x00,0x40,0x00,0x00,0xfe,0x00,0x00,0x00, + 0xc0,0x00,0x00,0xfe,0x00,0x00,0x00,0xc0,0x01,0x00,0xfe,0x00,0x00,0x00,0xc0, + 0x01,0x00,0xfe,0x00,0x00,0x00,0xff,0x03,0x00,0xfe,0x00,0x00,0xf0,0xff,0x03, + 0x00,0xfe,0x00,0x00,0xf0,0xff,0x03,0x00,0xfe,0x70,0x00,0xf0,0xff,0x03,0x00, + 0xfe,0xfc,0x03,0xe0,0xff,0x00,0x00,0xfe,0xf8,0x0f,0xc0,0x01,0x00,0x00,0xfe, + 0xf0,0x3f,0xc0,0x00,0x00,0x00,0xfe,0xe0,0x7f,0x00,0x01,0x00,0x00,0xfe,0x80, + 0xff,0x00,0x01,0x00,0x00,0xfe,0x00,0xfe,0x01,0x02,0x00,0x00,0xfe,0x00,0xf8, + 0x03,0x0c,0x00,0x00,0xfe,0x00,0xf0,0x07,0x08,0x00,0x00,0xfe,0x00,0xc0,0x0f, + 0x10,0x00,0x00,0xfe,0x00,0x00,0x1f,0x70,0x00,0x00,0xfe,0x00,0x00,0x7c,0xf8, + 0x00,0x00,0xfe,0x00,0x00,0xf0,0xff,0x00,0x00,0xfe,0x00,0x00,0xc0,0xff,0x01, + 0x00,0xfe,0x00,0x00,0x00,0xfe,0x01,0x00,0xfe,0x00,0x00,0x00,0xf8,0x00,0x00, + 0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfe, + 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00, + 0x00,0xe0,0x03,0x00,0x00,0xfe,0x00,0x00,0xf0,0x0f,0x00,0x00,0xfe,0x00,0x80, + 0xf8,0x1f,0x00,0x00,0xfe,0x00,0x00,0xff,0x21,0x00,0x00,0xfe,0x00,0x00,0xff, + 0x40,0x00,0x00,0xfe,0x00,0x00,0x7e,0x80,0x00,0x00,0xfe,0x00,0x00,0x3c,0x80, + 0x00,0x00,0xfe,0x00,0x00,0x38,0xc0,0x01,0x00,0xfe,0x00,0x00,0x20,0xf0,0x01, + 0x00,0xfe,0x00,0x00,0x40,0xf8,0x01,0x00,0xfe,0x00,0x00,0x80,0xf8,0x01,0x00, + 0xfe,0x00,0x00,0x00,0xf1,0x00,0x00,0xfe,0x00,0x00,0x00,0x04,0x00,0x00,0xfe, + 0x00,0x00,0x00,0x08,0x00,0x00,0xfe,0x00,0x00,0x00,0x08,0x00,0x00,0xfe,0x00, + 0x00,0x00,0x10,0x00,0x00,0xfe,0x00,0x00,0x00,0x30,0x00,0x00,0xfe,0x00,0x00, + 0x00,0x70,0x00,0x00,0xfe,0x00,0x00,0x00,0x70,0x00,0x00,0xfe,0x00,0x00,0x00, + 0xf8,0x00,0x00,0xfe,0x00,0x00,0xc0,0xff,0x01,0x00,0xfe,0x00,0x00,0xf0,0xff, + 0x01,0x00,0xfe,0x00,0x00,0xf0,0xff,0x01,0x00,0xfe,0x00,0x00,0xf0,0xff,0x00, + 0x00,0xfe,0x00,0x00,0xe0,0x1f,0x00,0x00,0xfe,0x00,0x00,0xc0,0x01,0x00,0x00, + 0xfe,0x00,0x00,0xc0,0x00,0x00,0x00,0xfe,0x00,0x00,0x80,0x00,0x00,0x00,0xfe, + 0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0x00,0x00,0x00,0x02,0x00,0x00,0xfe,0x00, + 0x00,0x00,0x04,0x00,0x00,0xfe,0x00,0x00,0x38,0x08,0x00,0x00,0xfe,0x00,0x00, + 0xf8,0x18,0x00,0x00,0xfe,0x00,0x00,0xf8,0x3f,0x00,0x00,0xfe,0x00,0x00,0xf8, + 0x7f,0x00,0x00,0xfe,0x00,0x00,0xf0,0xff,0x00,0x00,0xfe,0x00,0x00,0xf0,0xff, + 0x00,0x00,0xfe,0x00,0x00,0x60,0xfc,0x01,0x00,0xfe,0x00,0x00,0x40,0xf0,0x01, + 0x00,0xfe,0x00,0x00,0x80,0x00,0x00,0x00,0xfe,0x00,0x00,0x80,0x00,0x00,0x00, + 0xfe,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0x00,0x00,0x00,0x02,0x00,0x00,0xfe, + 0x00,0x00,0x0c,0x06,0x00,0x00,0xfe,0x00,0x00,0x3c,0x04,0x00,0x00,0xfe,0x00, + 0x00,0xf8,0x08,0x00,0x00,0xfe,0x00,0x00,0xf8,0x1f,0x00,0x00,0xfe,0x00,0x00, + 0xf0,0x3f,0x00,0x00,0xfe,0x00,0x00,0xe0,0x7f,0x00,0x00,0xfe,0x00,0x00,0xc0, + 0xff,0x00,0x00,0xfe,0x00,0x00,0x00,0xff,0x00,0x00,0xfe,0x00,0x00,0x00,0xfc, + 0x00,0x00,0xfe,0x00,0x00,0x00,0x0c,0x00,0x00,0xfe,0x00,0x00,0x00,0x10,0x00, + 0x00,0xfe,0x00,0x00,0x00,0x10,0x00,0x00,0xfe,0x00,0x00,0x00,0x20,0x00,0x00, + 0xfe,0x00,0x00,0x00,0x60,0x00,0x00,0xfe,0x00,0x00,0x00,0xcf,0x00,0x00,0xfe, + 0x00,0x00,0xde,0xbf,0x01,0x00,0xfe,0x00,0x00,0xfe,0xff,0x03,0x00,0xfe,0x00, + 0x00,0xfe,0x1f,0x0f,0x00,0xfe,0x00,0x00,0xf8,0x07,0x1e,0x00,0xfe,0x00,0x00, + 0xf0,0x03,0x7e,0x00,0xfe,0x00,0x00,0xd0,0x07,0xfc,0x00,0xfe,0x00,0x00,0x10, + 0x08,0xf8,0x03,0xfe,0x00,0x00,0x10,0x18,0xf0,0x07,0xfe,0x00,0x00,0x10,0x30, + 0xe0,0x0f,0xfe,0x00,0x00,0x10,0x30,0xc0,0x1f,0xfe,0x00,0x00,0x10,0x70,0x80, + 0x3f,0xfe,0x00,0x00,0x20,0xf8,0x00,0x7f,0xfe,0x00,0x00,0x60,0xfc,0x00,0xfe, + 0xfe,0x00,0x00,0xc0,0xff,0x01,0xfc,0xfe,0x00,0x00,0xc0,0xff,0x01,0x78,0xfe, + 0x00,0x00,0x80,0xff,0x01,0x00,0xfe,0x00,0x00,0x00,0xff,0x01,0x00,0xfe,0x00, + 0x00,0x00,0xfc,0x01,0x00,0xfe,0x00,0x00,0x00,0xf8,0x00,0x00,0xfe,0x00,0x00, + 0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfe}; + +#define abort_width 13 +#define abort_height 13 +static char abort_bits[] = { + 0x00,0xe0,0x40,0xe0,0x40,0xe0,0x50,0xe1,0x48,0xe2,0x44,0xe4,0x44,0xe4,0x44, + 0xe4,0x04,0xe4,0x04,0xe4,0x08,0xe2,0xf0,0xe1,0x00,0xe0}; + +#define start_width 9 +#define start_height 13 +static char start_bits[] = { + 0x00,0xfe,0x06,0xfe,0x0a,0xfe,0x12,0xfe,0x22,0xfe,0x42,0xfe,0x82,0xfe,0x42, + 0xfe,0x22,0xfe,0x12,0xfe,0x0a,0xfe,0x06,0xfe,0x00,0xfe}; + +#define stop_width 9 +#define stop_height 13 +static char stop_bits[] = { + 0x00,0xfe,0xee,0xfe,0xaa,0xfe,0xaa,0xfe,0xaa,0xfe,0xaa,0xfe,0xaa,0xfe,0xaa, + 0xfe,0xaa,0xfe,0xaa,0xfe,0xaa,0xfe,0xee,0xfe,0x00,0xfe}; + +#endif diff --git a/Unix/CbColorbar.cpp b/Unix/CbColorbar.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3f7731104892b81a61c278135508b16c6a245cd1 --- /dev/null +++ b/Unix/CbColorbar.cpp @@ -0,0 +1,652 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Const.h" +#include "XColors.h" +#include "Widgets.h" +#include "Register.h" +#include "Context.h" +#include "XContext.h" +#include "ColorTable.h" + +#include "CbColorbar.h" + +extern Context_T CTX ; +extern XContext_T XCTX ; +extern Widgets_T WID; + +/* RGB/HSV transformation */ + +#define RETURN_HSV(h,s,v) {*H=h; *S=s; *V=v; return;} +#define RETURN_RGB(r,g,b) {*R=r; *G=g; *B=b; return;} +#define UNDEFINED 0 +#define EPS 1.e-10 + +/* rgb on [0, 1], sv returned on [0, 1] and h on [0, 6]. + Exception: h is returned UNDEFINED if S==0. */ + +void RGB_to_HSV(double R, double G, double B, + double *H, double *S, double *V) { + double v, x, f; + int i; + + x = DMIN(DMIN(R, G), B); + v = DMAX(DMAX(R, G), B); + if(v == x) RETURN_HSV(UNDEFINED, 0, v); + f = (R == x) ? G - B : ((G == x) ? B - R : R - G); + i = (R == x) ? 3 : ((G == x) ? 5 : 1); + RETURN_HSV(i - f /(v - x), (v - x)/v, v); +} + +/* h given on [0, 6] or UNDEFINED. s and v given on [0, 1]. + rgb each returned on [0, 1]. */ + +void HSV_to_RGB(double H, double S, double V, + double *R, double *G, double *B) { + double m, n, f; + int i; + + if (H == UNDEFINED) RETURN_RGB(V, V, V); + i = (int)floor(H); + f = H - i; + if ( !(i&1) ) f = 1 - f; /* if i is even */ + m = V * (1 - S); + n = V * (1 - S * f); + + switch (i) { + case 6: + case 0: RETURN_RGB(V, n, m); + case 1: RETURN_RGB(n, V, m); + case 2: RETURN_RGB(m, V, n); + case 3: RETURN_RGB(m, n, V); + case 4: RETURN_RGB(n, m, V); + case 5: RETURN_RGB(V, m, n); + } +} + + +/* Convert window X coordinate to color table index */ + +static int x_to_index(ColorBar *cb, int x){ + int index; + index = (int) (x * (float) cb->ct->size / (float) cb->width ); + if (index<0) + index = 0; + else if (index>=cb->ct->size) + index = cb->ct->size-1; + return index; +} + +/* Convert color table index to window X coordinate */ + +static int index_to_x(ColorBar *cb, int index){ + int x; + x = (int) (index * (float) cb->width / (float)(cb->ct->size-1) ); + if (x>=cb->width) + x = cb->width - 1; + return x; +} + +/* Convert a color intensity to a window Y coordinate */ + +static int intensity_to_y(ColorBar *cb, int intensity){ + int y; + y = (int) (cb->wedge_y - intensity * (float) cb->wedge_y / 255.0 ); + if (y<0) + y = 0; + else if (y>=cb->wedge_y) + y = cb->wedge_y - 1; + return y; +} + +/* Convert a window Y coordinate to a color intensity */ + +static int y_to_intensity(ColorBar *cb, int y){ + int intensity; + intensity = (int) ((cb->wedge_y - y ) * 255.0 / (float) cb->wedge_y ); + if (intensity<0) + intensity = 0; + else if (intensity>255) + intensity = 255; + return intensity; +} + + +/* Redraw part of a Color Widget (between a and b) */ + +#define HELP_LINES 9 + +static void redraw_range(ColorBar *cb, int a, int b){ + Window win; + int i; + int x,y, px,py; + int x1, y1, x2, y2; + int intensity; + double H,S,V; + char rgb_str[] = "RGB", hsv_str[] = "HSV" ; + char help_str[HELP_LINES][100] = { + "h show this message", + "1 -> 6 choose predefined colormap", + "m switch color mode", + "s/l/c/p/r save/load/copy/paste/reset", + "mouse draw color or alpha", + "left/right move or rotate", + "up/down color or alpha curvature", + "i invert x or y range", + "b increase or decrease gamma" + }; + + win = cb->window; + + if (a<0) a = 0; + if (b>=cb->ct->size) b = cb->ct->size-1; + + /* calc region to update */ + x1 = index_to_x( cb, a ); + x2 = index_to_x( cb, b); + + y1 = intensity_to_y( cb, 255 ); + y2 = intensity_to_y( cb, 0 ); + + /* erase region */ + XFillRectangle( XCTX.display, win, XCTX.xgc.black, + x1,y1, x2-x1+1, y2-y1+1 ); + + /* redraw region of entries in interval [a,b] */ + if (a>0) a--; + if (b<cb->ct->size-1) b++; + + /* draw red or hue levels */ + for (i=a;i<=b;i++) { + x = index_to_x( cb, i ); + + if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB){ + intensity = UNPACK_RED(cb->ct->table[i]); + } + else if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_HSV){ + RGB_to_HSV(UNPACK_RED (cb->ct->table[i])/255., + UNPACK_GREEN(cb->ct->table[i])/255., + UNPACK_BLUE (cb->ct->table[i])/255., + &H,&S,&V); + intensity = (int) (H/6.*255.+EPS); + } + + y = intensity_to_y( cb, intensity ); + if (i!=a) + XDrawLine( XCTX.display, win, XCTX.xgc.red, px, py, x, y ); + px = x; py = y; + } + + /* draw green or saturation levels */ + for (i=a;i<=b;i++) { + x = index_to_x( cb, i ); + + if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB){ + intensity = UNPACK_GREEN(cb->ct->table[i]); + } + else if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_HSV){ + RGB_to_HSV(UNPACK_RED (cb->ct->table[i])/255., + UNPACK_GREEN(cb->ct->table[i])/255., + UNPACK_BLUE (cb->ct->table[i])/255., + &H,&S,&V); + intensity = (int) (S*255.); + } + + y = intensity_to_y( cb, intensity); + if (i!=a) + XDrawLine( XCTX.display, win, XCTX.xgc.green, px,py, x,y ); + px = x; py = y; + } + + /* draw blue or value levels */ + for (i=a;i<=b;i++) { + x = index_to_x( cb, i ); + + if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB){ + intensity = UNPACK_BLUE(cb->ct->table[i]); + } + else if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_HSV){ + RGB_to_HSV(UNPACK_RED (cb->ct->table[i])/255., + UNPACK_GREEN(cb->ct->table[i])/255., + UNPACK_BLUE (cb->ct->table[i])/255., + &H,&S,&V); + intensity = (int) (V*255.); + } + + y = intensity_to_y( cb, intensity ); + if (i!=a) + XDrawLine( XCTX.display, win, XCTX.xgc.blue, px,py, x,y ); + px = x; py = y; + } + + /* draw alpha levels */ + for (i=a;i<=b;i++) { + x = index_to_x( cb, i ); + y = intensity_to_y( cb, UNPACK_ALPHA(cb->ct->table[i]) ); + if (i!=a) + XDrawLine( XCTX.display, win, XCTX.xgc.white, px,py, x,y ); + px = x; py = y; + } + + /* draw the color bar */ + for (x=x1;x<=x2;x++) { + int r, g, b; + unsigned int color; + i = x_to_index( cb, x ); + color = cb->ct->table[i]; + r = UNPACK_RED( color ); + g = UNPACK_GREEN( color ); + b = UNPACK_BLUE( color ); + XSetForeground( XCTX.display, XCTX.xgc.xgc, AllocateColorInt(r,g,b) ); + XDrawLine( XCTX.display, win, XCTX.xgc.xgc, x, cb->wedge_y, + x, cb->wedge_y + WEDGE_HEIGHT-1 ); + } + + /* print colortable mode and help */ + + if (cb->helpflag) { + for (i=0;i<HELP_LINES;i++) { + XDrawString( XCTX.display, win, XCTX.xgc.white, + 10,10+(i+1)*XCTX.xfont.fixed_h, + help_str[i], strlen(help_str[i]) ); + } + } + else{ + if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB) + XDrawString( XCTX.display, win, XCTX.xgc.white, + 10, 10+XCTX.xfont.fixed_h, + rgb_str, strlen(rgb_str) ); + else if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_HSV) + XDrawString( XCTX.display, win, XCTX.xgc.white, + 10, 10+XCTX.xfont.fixed_h, + hsv_str, strlen(hsv_str) ); + } +} + + +/* Redraw the marker and the text */ + +static void redraw_marker(ColorBar *cb){ + Window win; + int x, y0, y1; + char str[50]; + int dir,ascent, descent; + XCharStruct overall; + int xpos; + float val; + + win = cb->window; + + y0 = cb->marker_y; + y1 = cb->height - 1; + XFillRectangle( XCTX.display, win, XCTX.xgc.black, + 0, y0, cb->width, y1-y0+1 ); + + /* draw marker below color wedge */ + x = index_to_x( cb, cb->markerpos ); + XDrawLine( XCTX.display, win, XCTX.xgc.white, + x, cb->marker_y, x, cb->marker_y+MARKER_HEIGHT ); + XDrawLine( XCTX.display, win, XCTX.xgc.white, + x, cb->marker_y, x-3, cb->marker_y+6 ); + XDrawLine( XCTX.display, win, XCTX.xgc.white, + x, cb->marker_y, x+3, cb->marker_y+6 ); + + /* draw min value */ + sprintf( str, "%.2g", cb->minval ); + XDrawString( XCTX.display, win, XCTX.xgc.white, + 2, cb->label_y, str, strlen(str) ); + + /* draw marker value */ + val = cb->minval + (cb->maxval-cb->minval) + * ( (float) cb->markerpos / (float) (cb->ct->size-1)); + sprintf(str,"(%.2g)", val ); + XTextExtents(XCTX.xfont.fixed, str, strlen(str), &dir,&ascent,&descent,&overall ); + xpos = (cb->width - overall.width) / 2; + XDrawString( XCTX.display, win, XCTX.xgc.white, + xpos, cb->label_y, str, strlen(str) ); + + /* draw max value */ + sprintf( str, "%.2g", cb->maxval ); + XTextExtents( XCTX.xfont.fixed, str, strlen(str), &dir,&ascent,&descent,&overall ); + xpos = cb->width - overall.width - 2; + XDrawString( XCTX.display, win, XCTX.xgc.white, + xpos, cb->label_y, str, strlen(str) ); + +} + + +static void set_size(ColorBar *cb, int width, int height){ + cb->width = width; + cb->height = height; + cb->label_y = cb->height - 5; + cb->marker_y = cb->label_y + 1 - MARKER_HEIGHT - XCTX.xfont.fixed_h; + cb->wedge_y = cb->marker_y - WEDGE_HEIGHT; +} + + + + +/* creation, manipulation and callbacks functions */ + +static ColorBar *TheCB=NULL ; +static ColorTable clip; + +void ColorBarCopy(ColorTable *ct){ + memcpy(clip.table, ct->table, ct->size * sizeof(unsigned int)); + memcpy(clip.ipar, ct->ipar, COLORTABLE_NBMAX_PARAM * sizeof(int)); + memcpy(clip.fpar, ct->fpar, COLORTABLE_NBMAX_PARAM * sizeof(float)); +} + +void ColorBarPaste(ColorTable *ct){ + memcpy(ct->table, clip.table, ct->size * sizeof(unsigned int)); + memcpy(ct->ipar, clip.ipar, COLORTABLE_NBMAX_PARAM * sizeof(int)); + memcpy(ct->fpar, clip.fpar, COLORTABLE_NBMAX_PARAM * sizeof(float)); +} + +void ColorBarCreate(Window win, int width, int height){ + static int first=1 ; + + if(!TheCB) TheCB = (ColorBar *) calloc(1, sizeof(ColorBar)); + TheCB->window = win; + set_size(TheCB, width, height); + + if(first){ + TheCB->helpflag = 1; + first=0; + } +} + +void ColorBarShow(void){ + XMapWindow(XCTX.display, TheCB->window); +} + +void ColorBarHide(void){ + XUnmapWindow(XCTX.display, TheCB->window); +} + +void ColorBarRedraw(void){ + if(!TheCB) return; + redraw_range(TheCB, 0, TheCB->ct->size-1); + redraw_marker(TheCB); +} + +void ColorBarChange(char *label, float min, float max, ColorTable *ct, int rgb){ + strncpy(TheCB->label, label, LABEL_STR_L); + TheCB->ct = ct; + TheCB->minval = min; + TheCB->maxval = max; + if (rgb) redraw_range(TheCB, 0, TheCB->ct->size-1); + redraw_marker(TheCB); +} + +void ColorBarResizeCb(Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *call_data){ + Dimension w1,h1; + + if(!TheCB) return; + + XtVaGetValues(WID.PD.colorDrawingArea, + XmNwidth, &w1, + XmNheight, &h1, + NULL); + + set_size(TheCB, (int)w1, (int)h1); + XResizeWindow(XCTX.display, TheCB->window, (int)w1, (int)h1); + ColorBarRedraw(); +} + +void ColorBarExposeCb(Widget w,XtPointer client_data, XmDrawingAreaCallbackStruct *call_data){ + ColorBarRedraw(); +} + +#define ANY_MODIFIER (ShiftMask|ControlMask|Mod1Mask) + +void ColorBarInputCb (Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *call_data){ + + XEvent *event; + static int p1=0, p2=0, p3=0, p4=0; /* red, green, blue, alpha */ + static int pentry, move_marker; + int i, modify, entry, compute; + char keybuf[50]; + KeySym key; + XComposeStatus compose; + + event = call_data->event; + modify = 0; + compute = 0; + + /* touche */ + + if (event->type==KeyPress) { + XLookupString(&event->xkey, keybuf, 50, &key, &compose); + + switch(key){ + case XK_1 : color_table_init_param(1, TheCB->ct, 1, 1); compute=1; break; + case XK_2 : color_table_init_param(2, TheCB->ct, 1, 1); compute=1; break; + case XK_3 : color_table_init_param(3, TheCB->ct, 1, 1); compute=1; break; + case XK_4 : color_table_init_param(4, TheCB->ct, 1, 1); compute=1; break; + case XK_5 : color_table_init_param(5, TheCB->ct, 1, 1); compute=1; break; + case XK_6 : color_table_init_param(6, TheCB->ct, 1, 1); compute=1; break; + case XK_7 : color_table_init_param(7, TheCB->ct, 1, 1); compute=1; break; + case XK_8 : color_table_init_param(8, TheCB->ct, 1, 1); compute=1; break; + case XK_9 : color_table_init_param(9, TheCB->ct, 1, 1); compute=1; break; + case XK_0 : color_table_init_param(0, TheCB->ct, 1, 1); compute=1; break; + + case XK_c : case XK_C : ColorBarCopy(TheCB->ct); break; + case XK_p : case XK_P : ColorBarPaste(TheCB->ct); ColorBarRedraw(); break; + case XK_s : case XK_S : ManageCb(NULL, (XtPointer)WID.FD.saveDialog, NULL); break; + case XK_l : case XK_L : ManageCb(NULL, (XtPointer)WID.FD.mergeDialog, NULL); return ; + case XK_h : case XK_H : TheCB->helpflag = !TheCB->helpflag; ColorBarRedraw(); break; + + case XK_r : + case XK_R : + color_table_init_param(TheCB->ct->ipar[COLORTABLE_NUMBER], + TheCB->ct, 1, 1); + compute=1; break; + + case XK_m : + case XK_M : + if(TheCB->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB) + TheCB->ct->ipar[COLORTABLE_MODE] = COLORTABLE_HSV; + else + TheCB->ct->ipar[COLORTABLE_MODE] = COLORTABLE_RGB; + ColorBarRedraw(); + break; + + case XK_i : + case XK_I : + if (event->xkey.state&ANY_MODIFIER) { + TheCB->ct->ipar[COLORTABLE_INVERT] = !TheCB->ct->ipar[COLORTABLE_INVERT]; + } + else{ + TheCB->ct->ipar[COLORTABLE_SWAP] = !TheCB->ct->ipar[COLORTABLE_SWAP]; + } + compute=1; break; + + case XK_b : + case XK_B : + if (event->xkey.state&ANY_MODIFIER) { + TheCB->ct->fpar[COLORTABLE_BETA] -= 0.05; + if(TheCB->ct->fpar[COLORTABLE_BETA]<-1.0) + TheCB->ct->fpar[COLORTABLE_BETA] = -1.0; + } + else{ + TheCB->ct->fpar[COLORTABLE_BETA] += 0.05; + if(TheCB->ct->fpar[COLORTABLE_BETA]>1.0) + TheCB->ct->fpar[COLORTABLE_BETA] = 1.0; + } + compute = 1; break; + + case XK_Left : + if (event->xkey.state&ANY_MODIFIER) { + TheCB->ct->ipar[COLORTABLE_ROTATE] += 5; + if(TheCB->ct->ipar[COLORTABLE_ROTATE] > TheCB->ct->size-1) + TheCB->ct->ipar[COLORTABLE_ROTATE] -= TheCB->ct->size-1; + } + else { + TheCB->ct->fpar[COLORTABLE_BIAS] -= 0.05; + } + compute = 1; break; + + case XK_Right : + if (event->xkey.state&ANY_MODIFIER) { + TheCB->ct->ipar[COLORTABLE_ROTATE] -= 5; + if(TheCB->ct->ipar[COLORTABLE_ROTATE]<-(TheCB->ct->size-1)) + TheCB->ct->ipar[COLORTABLE_ROTATE] += TheCB->ct->size-1; + } + else{ + TheCB->ct->fpar[COLORTABLE_BIAS] += 0.05; + } + compute = 1; break; + + case XK_Up : + if (event->xkey.state&ANY_MODIFIER) { + TheCB->ct->fpar[COLORTABLE_ALPHAPOW] -= 0.05; + if (TheCB->ct->fpar[COLORTABLE_ALPHAPOW]<0.0) + TheCB->ct->fpar[COLORTABLE_ALPHAPOW] = 0.0; + } + else { + TheCB->ct->fpar[COLORTABLE_CURVE] -= 0.05; + } + compute = 1; break; + + case XK_Down : + if (event->xkey.state&ANY_MODIFIER) + TheCB->ct->fpar[COLORTABLE_ALPHAPOW] += 0.05; + else + TheCB->ct->fpar[COLORTABLE_CURVE] += 0.05; + compute = 1; break; + + } + + if(compute){ + color_table_recompute(TheCB->ct, 1, 1); + ColorBarRedraw(); + } + + } + + /* souris enfoncee */ + + else if (event->type==ButtonPress) { + + if(TheCB->helpflag){ + TheCB->helpflag = 0; + ColorBarRedraw(); + } + + if (event->xbutton.y<TheCB->wedge_y) { + /* change color function */ + move_marker = 0; + } + else { + /* change marker position */ + move_marker = 1; + } + /* determine which curve to modify */ + if (event->xbutton.state&ANY_MODIFIER) { + p4 = 1; + } + else { + if (event->xbutton.button==Button1) p1 = 1; + if (event->xbutton.button==Button2) p2 = 1; + if (event->xbutton.button==Button3) p3 = 1; + } + pentry = x_to_index(TheCB, event->xbutton.x); + modify = 1; + } + + /* souris relachee */ + + else if (event->type==ButtonRelease) { + if (event->xbutton.button==Button1) p1 = 0; + if (event->xbutton.button==Button2) p2 = 0; + if (event->xbutton.button==Button3) p3 = 0; + p4 = 0; + } + + /* bouger */ + + else if (event->type==MotionNotify) { + /* Flush extra MotionNotify events */ + while (QLength(XCTX.display)>0) { + XEvent next; + XPeekEvent(XCTX.display, &next); + if (next.type!=MotionNotify) + break; + XNextEvent(XCTX.display, event); + } + modify = 1; + } + + /* Modify one or more of the color curves */ + + if (modify && (p1 || p2 || p3 || p4)) { + /* calculate which entry in color table to change */ + entry = x_to_index(TheCB, event->xbutton.x); + /* update */ + if (move_marker) { + /* changing marker position */ + TheCB->markerpos = entry; + redraw_marker(TheCB); + } + else { + /* changing color graph */ + int a, b, value; + + value = y_to_intensity(TheCB, event->xbutton.y); + + if (pentry<=entry) { + a = pentry; + b = entry; + } + else { + a = entry; + b = pentry; + } + + /* update entries from 'pentry' to 'entry' */ + for (i=a; i<=b; i++) { + int red, green, blue, alpha; + double R,G,B,H,S,V; + + red = UNPACK_RED (TheCB->ct->table[i]); + green = UNPACK_GREEN(TheCB->ct->table[i]); + blue = UNPACK_BLUE (TheCB->ct->table[i]); + alpha = UNPACK_ALPHA(TheCB->ct->table[i]); + + if(TheCB->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB){ + if (p1) { red = value; } + if (p2) { green = value; } + if (p3) { blue = value; } + if (p4) { alpha = value; } + } + else if(TheCB->ct->ipar[COLORTABLE_MODE]==COLORTABLE_HSV){ + RGB_to_HSV((double)red/255.,(double)green/255.,(double)blue/255., + &H,&S,&V); + if (p1) { H = 6.*(double)value/255.+EPS ; } + if (p2) { S = (double)value/255.; } + if (p3) { V = (double)value/255.; } + if (p4) { alpha = value; } + HSV_to_RGB(H, S, V, &R,&G,&B); + red = (int)(255 * R); + green = (int)(255 * G); + blue = (int)(255 * B); + } + + TheCB->ct->table[i] = PACK_COLOR(red,green,blue,alpha); + } + + /* redraw the color curves */ + if (pentry<entry) + redraw_range(TheCB, pentry-1, entry+1); + else + redraw_range(TheCB, entry-1, pentry+1); + + pentry = entry; + + } + } + + +} + diff --git a/Unix/CbColorbar.h b/Unix/CbColorbar.h new file mode 100644 index 0000000000000000000000000000000000000000..1bd5357ffbb70b826e0030c6d1db5136666eff8a --- /dev/null +++ b/Unix/CbColorbar.h @@ -0,0 +1,28 @@ +#ifndef _COLORBAR_H +#define _COLORBAR_H + +typedef struct _colorbar { + Window window; + int width, height; /* size */ + int wedge_y; /* top coord of color wedge */ + int marker_y; /* top coord of marker arrow */ + int label_y; /* y coord of text labels */ + char label[LABEL_STR_L]; /* text label at bottom */ + float minval, maxval; /* min and max data values */ + int markerpos; /* position of marker as index into table */ + int helpflag; /* if nonzero, print help messages */ + ColorTable *ct; /* pointer to color table (allocated in Post_View) */ +} ColorBar; + +#define WEDGE_HEIGHT 12 /* epaisseur de la colorbar */ +#define MARKER_HEIGHT 10 /* hauteur de la fleche */ + +void ColorBarCreate(Window win, int width, int height); +void ColorBarShow(void); +void ColorBarChange(char *label, float min, float max, ColorTable *ct, int rgb); +void ColorBarCopy(ColorTable *ct); +void ColorBarPaste(ColorTable *ct); +void ColorBarResizeCb(Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *call_data); +void ColorBarRedraw(void); + +#endif diff --git a/Unix/CbContext.cpp b/Unix/CbContext.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9eace8844f97e9809b917f675dea04196bbd3fe8 --- /dev/null +++ b/Unix/CbContext.cpp @@ -0,0 +1,651 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Views.h" +#include "Widgets.h" +#include "Context.h" +#include "XContext.h" +#include "CbContext.h" +#include "CbGeom.h" +#include "CbMesh.h" + +extern Context_T CTX; +extern XContext_T XCTX; +extern Widgets_T WID; +extern Mesh M; +extern List_T *Post_ViewList; + +static char *txt_new [] = + { "Parameter", "Point", "Line", "Spline", "Bezier", "BSpline", "Circle", "Ellipsis", + "Plane Surface", "Ruled Surface", "Nurbs Surface", "Volume", NULL }; + +static char *txt_translate_rotate_dilate_symetry_delete [] = + { "Point", "Line", "Surface", NULL }; + +static char *txt_add [] = + { "Create", "Translate", "Rotate", "Dilate", "Symmetry", NULL }; + +static char *txt_move [] = + { "Translate", "Rotate", "Dilate", "Symmetry", NULL }; + +static char *txt_elem [] = + { "Add", "Move", "Extrude", "Delete", "Coherence", NULL }; + +static char *txt_phys [] = + { "Add", "Delete", NULL }; + +static char *txt_phys_add [] = + { "Point", "Line", "Surface", "Volume", NULL }; + +static char *txt_geom [] = + { "Elementary", "Physical", "Reload", NULL }; + +static char *txt_mesh [] = + { "Define", "1D", "2D", "3D", NULL }; + +static char *txt_mesh_define [] = + { "Length", "Recombine", "Transfinite Line", "Transfinite Surface", + "Transfinite Volume", NULL }; + +static char *txt_post[NB_BUTT_MAX] = + {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + +static long int actual_context, actual_global_context; + +void UpdatePostButtons(void){ + Post_View *v; + int i; + + for(i = 0 ; i < NB_BUTT_MAX ; i++) { + + if(txt_post[i]){ + + v = (Post_View*)List_Pointer(Post_ViewList,i); + + /* defaultButt[i] */ + if(i==0 && XtIsManaged(WID.M.defaultButt)) XtUnmanageChild(WID.M.defaultButt); + + /* pushButt[i] */ + if(XtIsManaged(WID.M.pushButt[i])) XtUnmanageChild(WID.M.pushButt[i]); + + /* toggleButt[i] */ + XtVaSetValues(WID.M.toggleButt[i], + XmNlabelString, XmStringCreateSimple(txt_post[i]), + XmNset, v->Visible?True:False, + NULL); + XtManageChild(WID.M.toggleButt[i]); + + /* timeStepButt[i] */ + XtSetSensitive(WID.M.timeStepButt[i], (v->NbTimeStep>1)?1:0); + XtManageChild(WID.M.timeStepButt[i]); + + /* vectorButt[i] */ + XtSetSensitive(WID.M.vectorButt[i], v->ScalarOnly?0:1); + XtManageChild(WID.M.vectorButt[i]); + + /* exportBGMButt[i] */ + XtSetSensitive(WID.M.exportBGMButt[i], v->ScalarOnly?1:0); + XtManageChild(WID.M.exportBGMButt[i]); + + /* applyBGMButtXXX */ + XtSetSensitive(WID.M.applyBGMButt[i], v->ScalarOnly?1:0); + XtManageChild(WID.M.applyBGMButt[i]); + } + else{ + if(XtIsManaged(WID.M.pushButt[i])) XtUnmanageChild(WID.M.pushButt[i]); + if(XtIsManaged(WID.M.toggleButt[i])) XtUnmanageChild(WID.M.toggleButt[i]); + if(i==0) XtManageChild(WID.M.defaultButt); + } + } + +} + + +#define NB_HISTORY_MAX 100 + +void ActualizeContextCb (Widget w, XtPointer client_data, XtPointer call_data){ + char **ButtonText; + int i, last; + static int last_context[NB_HISTORY_MAX], numc = 0, numf = 0; + + if((long int)client_data == CONTEXT_BACKWARD){ + if(numc > 1){ + numc--; + numf++; + actual_context = last_context[numc-1]; + } + else return; + } + else if((long int)client_data == CONTEXT_FORWARD){ + if(numf > 0){ + numc++; + numf--; + actual_context = last_context[numc-1]; + } + else return; + } + else{ + actual_context = (long int)client_data; + if(last_context[numc-1] != actual_context){ + last_context[numc] = actual_context; + numc++; + } + numf = 0; + } + + if(numc > NB_HISTORY_MAX-1) numc = 1; /* Il faudrait faire un truc circulaire */ + + switch (actual_context){ + + case CONTEXT_GEOM : + actual_global_context = CONTEXT_GEOM; + XtVaSetValues(WID.M.modButt, XmNlabelString, XmStringCreateSimple("Geometry"), NULL); + CTX.geom.level = ELEMENTARY; + //if(M.status>0) mesh_event_handler(MESH_DELETE); + Msg(INFO, ""); + ButtonText = txt_geom; + break; + + case CONTEXT_GEOM_ELEM : + actual_global_context = CONTEXT_GEOM; + CTX.geom.level = ELEMENTARY; + Msg(INFO, "Elementary"); + ButtonText = txt_elem; + break; + + case CONTEXT_GEOM_ELEM_ADD : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Add"); + ButtonText = txt_add; + break; + + case CONTEXT_GEOM_ELEM_ADD_NEW : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Add Create"); + ButtonText = txt_new; + break; + + case CONTEXT_GEOM_ELEM_ADD_TRANSLATE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Add Translate"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_ADD_ROTATE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Add Rotate"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_ADD_DILATE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Add Dilate"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_ADD_SYMETRY : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Add Symetry"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_MOVE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Move"); + ButtonText = txt_move; + break; + + case CONTEXT_GEOM_ELEM_MOVE_TRANSLATE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Move Translate"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_MOVE_ROTATE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Move Rotate"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_MOVE_DILATE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Move Dilate"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_MOVE_SYMETRY : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Move Symetry"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_EXTRUDE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Extrude"); + ButtonText = txt_move; + break; + + case CONTEXT_GEOM_ELEM_EXTRUDE_TRANSLATE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Extrude Translate"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_EXTRUDE_ROTATE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Extrude Rotate"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_EXTRUDE_DILATE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Extrude Dilate"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_EXTRUDE_SYMETRY : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Extrude Symetry"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_ELEM_DELETE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Elementary Delete"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_GEOM_PHYS : + actual_global_context = CONTEXT_GEOM; + CTX.geom.level = PHYSICAL; + Msg(INFO, "Physical"); + ButtonText = txt_phys; + break; + + case CONTEXT_GEOM_PHYS_ADD : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Physical Add"); + ButtonText = txt_phys_add; + break; + + case CONTEXT_GEOM_PHYS_DELETE : + actual_global_context = CONTEXT_GEOM; + Msg(INFO, "Physical Delete"); + ButtonText = txt_translate_rotate_dilate_symetry_delete; + break; + + case CONTEXT_MESH : + actual_global_context = CONTEXT_MESH; + XtVaSetValues(WID.M.modButt, XmNlabelString, XmStringCreateSimple("Mesh"), NULL); + Msg(INFO,""); + ButtonText = txt_mesh; + break; + + case CONTEXT_MESH_DEFINE : + actual_global_context = CONTEXT_MESH; + Msg(INFO,"Define"); + ButtonText = txt_mesh_define; + break; + + case CONTEXT_POST : + actual_global_context = CONTEXT_POST; + XtVaSetValues(WID.M.modButt, XmNlabelString, XmStringCreateSimple("Post Processing"), NULL); + Msg(INFO,""); + UpdatePostButtons(); + return; + + default : + Msg(WARNING, "Unknown Event in ActualizeContextCb : %d", actual_context); + return; + + } + + last = 0; + + if(XtIsManaged(WID.M.defaultButt)) XtUnmanageChild(WID.M.defaultButt); + + for(i=0 ; i < NB_BUTT_MAX ; i++){ + + if(!last && ButtonText[i] != NULL){ + if(XtIsManaged(WID.M.toggleButt[i])) XtUnmanageChild(WID.M.toggleButt[i]); + XtVaSetValues(WID.M.pushButt[i], + XmNlabelString,XmStringCreateSimple(ButtonText[i]), + NULL); + XtManageChild(WID.M.pushButt[i]); + } + else { + last = 1 ; + if(XtIsManaged(WID.M.pushButt[i])) XtUnmanageChild(WID.M.pushButt[i]); + if(XtIsManaged(WID.M.toggleButt[i])) XtUnmanageChild(WID.M.toggleButt[i]); + } + } +} + +#undef NB_HISTORY_MAX + + +void PreviousContextCb (Widget w, XtPointer client_data, XtPointer call_data){ + ActualizeContextCb(w,client_data,call_data); +} + +void NextContextCb (Widget w, XtPointer client_data, XtPointer call_data){ + + switch(actual_context){ + + case CONTEXT_GEOM : + switch((long int)client_data){ + case 1: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM,call_data); break; + case 2: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_PHYS,call_data); break; + case 3: geom_event_handler(GEOM_PARSE); break; + } + break; + + case CONTEXT_GEOM_ELEM : + switch((long int)client_data){ + case 1: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD,call_data); break; + case 2: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_MOVE,call_data); break; + case 3: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_EXTRUDE,call_data); break; + case 4: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_DELETE,call_data); break; + case 5: geom_event_handler(GEOM_ELEM_SKETCH); break; + } + break; + + case CONTEXT_GEOM_ELEM_ADD : + switch((long int)client_data){ + case 1: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD_NEW,call_data); break; + case 2: + XtManageChild(WID.GD.tranDialog); + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD_TRANSLATE,call_data); + break; + case 3: + XtManageChild(WID.GD.rotDialog); + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD_ROTATE,call_data); + break; + case 4: + XtManageChild(WID.GD.dilatDialog); + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD_DILATE,call_data); + break; + case 5: + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD_SYMETRY,call_data); + break; + } + break; + + case CONTEXT_GEOM_ELEM_ADD_NEW : + switch((long int)client_data){ + case 1: XtManageChild(WID.GD.paramDialog); break ; + case 2: XtManageChild(WID.GD.pointDialog); break ; + case 3: geom_event_handler(GEOM_ELEM_ADD_NEW_LINE); break; + case 4: geom_event_handler(GEOM_ELEM_ADD_NEW_SPLINE); break; + case 5: geom_event_handler(GEOM_ELEM_ADD_NEW_BEZIER); break; + case 6: geom_event_handler(GEOM_ELEM_ADD_NEW_BSPLINE); break; + case 7: geom_event_handler(GEOM_ELEM_ADD_NEW_CIRCLE); break; + case 8: geom_event_handler(GEOM_ELEM_ADD_NEW_ELLIPSIS); break; + case 9: geom_event_handler(GEOM_ELEM_ADD_NEW_PLANE_SURF); break; + case 10:geom_event_handler(GEOM_ELEM_ADD_NEW_RULED_SURF); break; + case 11:geom_event_handler(GEOM_ELEM_ADD_NEW_NURBS_SURF); break; + case 12:geom_event_handler(GEOM_ELEM_ADD_NEW_VOLUME); break; + } + break; + + case CONTEXT_GEOM_ELEM_ADD_TRANSLATE : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_ELEM_ADD_TRANSLATE_POINT); break ; + case 2: geom_event_handler(GEOM_ELEM_ADD_TRANSLATE_LINE); break ; + case 3: geom_event_handler(GEOM_ELEM_ADD_TRANSLATE_SURF); break ; + } + break; + + case CONTEXT_GEOM_ELEM_ADD_ROTATE : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_ELEM_ADD_ROTATE_POINT); break ; + case 2: geom_event_handler(GEOM_ELEM_ADD_ROTATE_LINE); break ; + case 3: geom_event_handler(GEOM_ELEM_ADD_ROTATE_SURF); break ; + } + break; + + case CONTEXT_GEOM_ELEM_ADD_DILATE : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_ELEM_ADD_DILATE_POINT); break ; + case 2: geom_event_handler(GEOM_ELEM_ADD_DILATE_LINE); break ; + case 3: geom_event_handler(GEOM_ELEM_ADD_DILATE_SURF); break ; + case 4: break ; + } + break; + + case CONTEXT_GEOM_ELEM_ADD_SYMETRY : + Msg(WARNING, "CONTEXT_GEOM_ELEM_ADD_SYMETRY not done yet!"); + break; + + case CONTEXT_GEOM_ELEM_MOVE : + switch((long int)client_data){ + case 1: + XtManageChild(WID.GD.tranDialog); + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_MOVE_TRANSLATE,call_data); + break; + case 2: + XtManageChild(WID.GD.rotDialog); + ActualizeContextCb(w,(XtPointer) CONTEXT_GEOM_ELEM_MOVE_ROTATE,call_data); + break; + case 3: + XtManageChild(WID.GD.dilatDialog); + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_MOVE_DILATE,call_data); + break; + case 4: + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_MOVE_SYMETRY,call_data); + break; + } + break; + + case CONTEXT_GEOM_ELEM_MOVE_TRANSLATE : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_ELEM_MOVE_TRANSLATE_POINT); break ; + case 2: geom_event_handler(GEOM_ELEM_MOVE_TRANSLATE_LINE); break ; + case 3: geom_event_handler(GEOM_ELEM_MOVE_TRANSLATE_SURF); break ; + } + break; + + case CONTEXT_GEOM_ELEM_MOVE_ROTATE : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_ELEM_MOVE_ROTATE_POINT); break ; + case 2: geom_event_handler(GEOM_ELEM_MOVE_ROTATE_LINE); break ; + case 3: geom_event_handler(GEOM_ELEM_MOVE_ROTATE_SURF); break ; + } + break; + + case CONTEXT_GEOM_ELEM_MOVE_DILATE : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_ELEM_MOVE_DILATE_POINT); break ; + case 2: geom_event_handler(GEOM_ELEM_MOVE_DILATE_LINE); break ; + case 3: geom_event_handler(GEOM_ELEM_MOVE_DILATE_SURF); break ; + case 4: break ; + } + break; + + case CONTEXT_GEOM_ELEM_MOVE_SYMETRY : + Msg(WARNING, "CONTEXT_GEOM_ELEM_MOVE_SYMETRY not done yet!"); + break; + + case CONTEXT_GEOM_ELEM_EXTRUDE : + switch((long int)client_data){ + case 1: + XtManageChild(WID.GD.tranDialog); + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_EXTRUDE_TRANSLATE,call_data); + break; + case 2: + XtManageChild(WID.GD.rotDialog); + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_EXTRUDE_ROTATE,call_data); + break; + case 3: + XtManageChild(WID.GD.dilatDialog); + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_EXTRUDE_DILATE,call_data); + break; + case 4: + ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_EXTRUDE_SYMETRY,call_data); + break; + } + break; + + case CONTEXT_GEOM_ELEM_EXTRUDE_TRANSLATE : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_ELEM_EXTRUDE_TRANSLATE_POINT); break ; + case 2: geom_event_handler(GEOM_ELEM_EXTRUDE_TRANSLATE_LINE); break ; + case 3: geom_event_handler(GEOM_ELEM_EXTRUDE_TRANSLATE_SURF); break ; + } + break; + + case CONTEXT_GEOM_ELEM_EXTRUDE_ROTATE : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_ELEM_EXTRUDE_ROTATE_POINT); break ; + case 2: geom_event_handler(GEOM_ELEM_EXTRUDE_ROTATE_LINE); break ; + case 3: geom_event_handler(GEOM_ELEM_EXTRUDE_ROTATE_SURF); break ; + } + break; + + case CONTEXT_GEOM_ELEM_EXTRUDE_DILATE : + Msg(WARNING, "CONTEXT_GEOM_ELEM_EXTRUDE_DILATE not done yet!"); + break; + + case CONTEXT_GEOM_ELEM_EXTRUDE_SYMETRY : + Msg(WARNING, "CONTEXT_GEOM_ELEM_EXTRUDE_SYMETRY not done yet!"); + break; + + case CONTEXT_GEOM_ELEM_DELETE : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_ELEM_DELETE_POINT); break ; + case 2: geom_event_handler(GEOM_ELEM_DELETE_LINE); break ; + case 3: geom_event_handler(GEOM_ELEM_DELETE_SURF); break ; + } + break; + + case CONTEXT_GEOM_PHYS : + switch((long int)client_data){ + case 1: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_PHYS_ADD,call_data); break; + case 2: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_PHYS_DELETE,call_data); break; + } + break; + + case CONTEXT_GEOM_PHYS_ADD : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_PHYS_ADD_POINT); break ; + case 2: geom_event_handler(GEOM_PHYS_ADD_LINE); break ; + case 3: geom_event_handler(GEOM_PHYS_ADD_SURF); break ; + case 4: geom_event_handler(GEOM_PHYS_ADD_VOLUME); break ; + } + break; + + case CONTEXT_GEOM_PHYS_DELETE : + switch((long int)client_data){ + case 1: geom_event_handler(GEOM_PHYS_DELETE_POINT); break ; + case 2: geom_event_handler(GEOM_PHYS_DELETE_LINE); break ; + case 3: geom_event_handler(GEOM_PHYS_DELETE_SURF); break ; + case 4: geom_event_handler(GEOM_PHYS_DELETE_VOLUME); break ; + } + break; + + case CONTEXT_MESH : + + switch((long int)client_data){ + case 1: ActualizeContextCb(w,(XtPointer)CONTEXT_MESH_DEFINE,call_data); break; + case 2: mesh_event_handler(MESH_1D); break; + case 3: mesh_event_handler(MESH_2D); break; + case 4: mesh_event_handler(MESH_3D); break; + } + break; + + case CONTEXT_MESH_DEFINE : + switch((long int)client_data){ + case 1: + XtManageChild(WID.MD.charLengthDialog); + mesh_event_handler(MESH_DEFINE_CHAR_LENGTH); break; + case 2: + mesh_event_handler(MESH_DEFINE_RECOMBINE); break; + case 3: + XtManageChild(WID.MD.trsfLineDialog); + mesh_event_handler(MESH_DEFINE_TRSF_LINE); break; + case 4: + mesh_event_handler(MESH_DEFINE_TRSF_SURFACE); break; + case 5: + XtManageChild(WID.MD.trsfVolumeDialog); + mesh_event_handler(MESH_DEFINE_TRSF_VOLUME); break; + } + break; + + default : + Msg(WARNING, "Unknown Context in NextContextCb : %d", actual_global_context); + break; + + } +} + + +/* ------------------------------------------------------------------------ */ +/* PostProcessing specific context changes */ +/* ------------------------------------------------------------------------ */ + +static int fcmpPostView(const void *v1, const void *v2){ + return (((Post_View *)v1)->Num - ((Post_View *)v2)->Num); +} + +int AddView(int i, char *Name, int dummy){ + if(i > NB_BUTT_MAX -1) return 1; + + txt_post[i-1] = (char*)Malloc(NAME_STR_L*sizeof(char)); + strncpy(txt_post[i-1],Name,NAME_STR_L); + + if(actual_global_context == CONTEXT_POST) + ActualizeContextCb(NULL,(XtPointer)actual_global_context,NULL); + + return 0; +} + +void RemoveViewCb(Widget w, XtPointer client_data, XtPointer call_data){ + Post_View *v; + int i; + + i = (long int)client_data ; + + while(txt_post[i]){ + strncpy(txt_post[i-1], txt_post[i], NAME_STR_L); + i++; + } + txt_post[i-1] = NULL; + + v = (Post_View*)List_Pointer(Post_ViewList,(long int)client_data-1); + + if(v->Allocated){ + + for(i=0 ; i<List_Nbr(v->Simplices) ; i++) + Free(((Post_Simplex*)List_Pointer(v->Simplices, i))->V); + List_Delete(v->Simplices); + + for(i=0 ; i<List_Nbr(v->Triangles) ; i++) + Free(((Post_Triangle*)List_Pointer(v->Triangles, i))->V); + List_Delete(v->Triangles); + + for(i=0 ; i<List_Nbr(v->Lines) ; i++) + Free(((Post_Line*)List_Pointer(v->Lines, i))->V); + List_Delete(v->Lines); + + for(i=0 ; i<List_Nbr(v->Points) ; i++) + Free(((Post_Point*)List_Pointer(v->Points, i))->V); + List_Delete(v->Points); + + } + + List_Suppress(Post_ViewList, v, fcmpPostView); + + if(actual_global_context == CONTEXT_POST) + ActualizeContextCb(NULL,(XtPointer)actual_global_context,NULL); + + Init(); + Draw(); +} + diff --git a/Unix/CbContext.h b/Unix/CbContext.h new file mode 100644 index 0000000000000000000000000000000000000000..903049ce6bcfbcbb14a5d957252cbd7b99702ad1 --- /dev/null +++ b/Unix/CbContext.h @@ -0,0 +1,32 @@ +#ifndef _CB_CONTEXT_H_ +#define _CB_CONTEXT_H_ + +#define CONTEXT_GEOM 101 +#define CONTEXT_GEOM_ELEM 102 +#define CONTEXT_GEOM_ELEM_ADD 103 +#define CONTEXT_GEOM_ELEM_ADD_NEW 104 +#define CONTEXT_GEOM_ELEM_ADD_TRANSLATE 105 +#define CONTEXT_GEOM_ELEM_ADD_ROTATE 106 +#define CONTEXT_GEOM_ELEM_ADD_DILATE 107 +#define CONTEXT_GEOM_ELEM_ADD_SYMETRY 108 +#define CONTEXT_GEOM_ELEM_MOVE 109 +#define CONTEXT_GEOM_ELEM_MOVE_TRANSLATE 110 +#define CONTEXT_GEOM_ELEM_MOVE_ROTATE 111 +#define CONTEXT_GEOM_ELEM_MOVE_DILATE 112 +#define CONTEXT_GEOM_ELEM_MOVE_SYMETRY 113 +#define CONTEXT_GEOM_ELEM_EXTRUDE 114 +#define CONTEXT_GEOM_ELEM_EXTRUDE_TRANSLATE 115 +#define CONTEXT_GEOM_ELEM_EXTRUDE_ROTATE 116 +#define CONTEXT_GEOM_ELEM_EXTRUDE_DILATE 117 +#define CONTEXT_GEOM_ELEM_EXTRUDE_SYMETRY 118 +#define CONTEXT_GEOM_ELEM_DELETE 119 +#define CONTEXT_GEOM_PHYS 120 +#define CONTEXT_GEOM_PHYS_ADD 121 +#define CONTEXT_GEOM_PHYS_DELETE 122 +#define CONTEXT_MESH 123 +#define CONTEXT_MESH_DEFINE 124 +#define CONTEXT_POST 125 +#define CONTEXT_BACKWARD 126 +#define CONTEXT_FORWARD 127 + +#endif diff --git a/Unix/CbFile.cpp b/Unix/CbFile.cpp new file mode 100644 index 0000000000000000000000000000000000000000..64b2f51a3734d4cb090f0347953dbf36efc5d72b --- /dev/null +++ b/Unix/CbFile.cpp @@ -0,0 +1,157 @@ + +#include <unistd.h> + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Main.h" +#include "Mesh.h" +#include "Draw.h" +#include "Widgets.h" +#include "Context.h" +#include "ColorTable.h" +#include "XContext.h" + +#include "CbFile.h" +#include "CbColorbar.h" + +#include "XDump.h" +#include "gl2ps.h" +#include "gl2gif.h" + +extern Context_T CTX; +extern XContext_T XCTX; +extern Widgets_T WID; +extern Mesh M; +extern int WARNING_OVERRIDE; + +/* ------------------------------------------------------------------------ */ +/* C r e a t e I m a g e */ +/* ------------------------------------------------------------------------ */ + +static char KeepFileName[256]; + +void SaveToDisk (char *FileName, Widget warning, + void (*function)(FILE *file)){ + FILE *fp ; + + if(!WARNING_OVERRIDE){ + fp = fopen(FileName,"r"); + if(fp) { + XtManageChild(warning); + WARNING_OVERRIDE = 1; + strcpy(KeepFileName,FileName); + fclose(fp); + return; + } + else{ + strcpy(KeepFileName,FileName); + } + } + + if(!(fp = fopen(KeepFileName,"w"))) { + Msg(WARNING, "Unable to open file '%s'", KeepFileName); + WARNING_OVERRIDE = 0; + return; + } + + function(fp); + + fclose(fp); + + WARNING_OVERRIDE = 0; +} + +void CreateImage (FILE *fp) { + FILE *tmp; + GLint size3d; + char cmd[1000]; + char *tmpFileName="tmp.xwd"; + int res; + + switch(CTX.print.type){ + + case XDUMP : + switch(CTX.print.format){ + case FORMAT_XPM : + Window_Dump(XCTX.display, XCTX.scrnum, XtWindow(WID.G.glw), fp); + break; + case FORMAT_PS : + case FORMAT_EPS : + tmp = fopen(tmpFileName,"w"); + Window_Dump(XCTX.display, XCTX.scrnum, XtWindow(WID.G.glw), tmp); + fclose(tmp); + sprintf(cmd, "xpr -device ps -gray 4 %s >%s", tmpFileName, KeepFileName); + Msg(INFOS, "Executing: %s\n", cmd); + system(cmd); + unlink(tmpFileName); + break; + } + Msg(INFOS, "X image dump complete: '%s'", KeepFileName); + break ; + + case GIF : + create_gif(fp, CTX.viewport[2]-CTX.viewport[0], + CTX.viewport[3]-CTX.viewport[1]); + Msg(INFOS, "GIF dump complete: '%s'", KeepFileName); + break; + + case GLPRPAINTER : + case GLPRRECURSIVE : + size3d = 0 ; + res = GL2PS_OVERFLOW ; + while(res == GL2PS_OVERFLOW){ + size3d += 1024*1024 ; + gl2psBeginPage(TheBaseFileName, "Gmsh", + (CTX.print.type == GLPRPAINTER ? + GL2PS_SIMPLE_SORT : GL2PS_BSP_SORT), + GL2PS_SIMPLE_LINE_OFFSET | GL2PS_DRAW_BACKGROUND, + GL_RGBA, 0, NULL, size3d, fp); + CTX.stream = TO_FILE ; + Init(); + Draw(); + CTX.stream = TO_SCREEN ; + res = gl2psEndPage(); + } + Msg(INFOS, "GL2PS postscript output complete: '%s'", KeepFileName); + break; + + default : + Msg(WARNING, "Unknown print type"); + break; + } + +} + +/* ------------------------------------------------------------------------ */ +/* file */ +/* ------------------------------------------------------------------------ */ + +void SaveColorTable(FILE *fp); + +void FileCb(Widget w, XtPointer client_data, XtPointer call_data){ + char *c; + XmString xms; + + if((long int)client_data == FILE_SAVE_MESH){ + Print_Mesh(&M, NULL, CTX.mesh.format); + return; + } + + XtVaGetValues(w, XmNtextString, &xms, NULL); + XmStringGetLtoR(xms, XmSTRING_DEFAULT_CHARSET, &c); + XmStringFree(xms); + + switch ((long int)client_data) { + case FILE_LOAD_GEOM : OpenProblem(c); Init(); Draw(); break; + case FILE_LOAD_POST : MergeProblem(c); ColorBarRedraw(); Init(); Draw(); break; + case FILE_SAVE_MESH_AS : Print_Mesh(&M, c, CTX.mesh.format); break; + case FILE_SAVE_COLORTABLE_AS : SaveToDisk(c, WID.ED.saveDialog, SaveColorTable); break; + case FILE_CANCEL : WARNING_OVERRIDE = 0; break; + case FILE_PRINT : SaveToDisk(c, WID.ED.printDialog, CreateImage); Init(); Draw(); break; + default : + Msg(WARNING, "Unknown event in FileCb : %d", (long int)client_data); + break; + } + +} + diff --git a/Unix/CbFile.h b/Unix/CbFile.h new file mode 100644 index 0000000000000000000000000000000000000000..67f8eec775ed02f8c916fca3cd2ef7427ee2187c --- /dev/null +++ b/Unix/CbFile.h @@ -0,0 +1,12 @@ +#ifndef _CB_FILE_H_ +#define _CB_FILE_H_ + +#define FILE_LOAD_GEOM 301 +#define FILE_LOAD_POST 302 +#define FILE_SAVE_MESH 303 +#define FILE_SAVE_MESH_AS 304 +#define FILE_SAVE_COLORTABLE_AS 305 +#define FILE_PRINT 306 +#define FILE_CANCEL 308 + +#endif diff --git a/Unix/CbGeneral.cpp b/Unix/CbGeneral.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b4c3314d24b0d44cc1bd505c91c4776c614e4b53 --- /dev/null +++ b/Unix/CbGeneral.cpp @@ -0,0 +1,191 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Mesh.h" +#include "Draw.h" +#include "Views.h" +#include "Context.h" +#include "XContext.h" +#include "Widgets.h" + +extern Context_T CTX; +extern XContext_T XCTX; +extern Widgets_T WID; + +extern List_T *Post_ViewList; + +extern void GetStatistics(double s[50]); + +static char label[32]; + +/* ------------------------------------------------------------------------ + E x i t C b + ------------------------------------------------------------------------ */ + +void ExitCb(Widget w, XtPointer cd, XtPointer cb){ + exit(0); +} + +/* ------------------------------------------------------------------------ + M a n a g e C b + ------------------------------------------------------------------------ */ + +void ManageCb (Widget w, XtPointer client_data, XtPointer call_data){ + XtIsManaged((Widget)client_data) ? + XtUnmanageChild((Widget)client_data) : + XtManageChild((Widget)client_data) ; +} + + +/* ------------------------------------------------------------------------ + P o p u p H a n d l e r + ------------------------------------------------------------------------ */ + +void PopupHandler (Widget w, Widget pw, XEvent *event, Boolean *ctd ){ + if(((XButtonEvent *)event)->button != Button3) return; + + /* force the pointer to be slightly over the remove button */ + ((XButtonEvent *)event)->x_root -= 7 ; + ((XButtonEvent *)event)->y_root -= 7 ; + + XmMenuPosition(pw, (XButtonEvent *)event); + XtManageChild(pw); +} + + + +/* ------------------------------------------------------------------------ + CurrentInfoCb + ------------------------------------------------------------------------ */ + +void CurrentInfoCb (Widget w, XtPointer client_data, XtPointer call_data){ + double s[50]; + int i; + Post_View *v ; + + if((long int)client_data && XtIsManaged(WID.OD.infoDialog)){ + XtUnmanageChild(WID.OD.infoDialog); + } + else{ + GetStatistics(s); + +#define VLAB(caca) WID.OD.infoValueLabel[(caca)], XmNlabelString, \ + XmStringCreateSimple(label), NULL + + /* info geom */ + sprintf(label, "%g", s[0]); XtVaSetValues(VLAB(0)); + sprintf(label, "%g", s[1]/2); XtVaSetValues(VLAB(1)); + sprintf(label, "%g", s[2]); XtVaSetValues(VLAB(2)); + sprintf(label, "%g", s[3]); XtVaSetValues(VLAB(3)); + + /* info mesh */ + sprintf(label, "%g", s[4]); XtVaSetValues(VLAB(4)); + sprintf(label, "%g", s[5]); XtVaSetValues(VLAB(5)); + sprintf(label, "%g", s[6]); XtVaSetValues(VLAB(6)); + sprintf(label, "%g", s[7]); XtVaSetValues(VLAB(7)); + sprintf(label, "%g", s[8]); XtVaSetValues(VLAB(8)); + sprintf(label, "%g", s[9]); XtVaSetValues(VLAB(9)); + sprintf(label, "%g", s[10]); XtVaSetValues(VLAB(10)); + sprintf(label, "%g", s[11]); XtVaSetValues(VLAB(11)); + sprintf(label, "%g", s[12]); XtVaSetValues(VLAB(12)); + sprintf(label, "%g", s[13]); XtVaSetValues(VLAB(13)); + sprintf(label, "%g", s[14]); XtVaSetValues(VLAB(14)); + + sprintf(label, "%.4g (%.4g->%.4g)", s[17], s[19], s[18]); XtVaSetValues(VLAB(15)); + sprintf(label, "%.4g (%.4g->%.4g)", s[20], s[22], s[21]); XtVaSetValues(VLAB(16)); + sprintf(label, "%.4g (%.4g->%.4g)", s[23], s[25], s[24]); XtVaSetValues(VLAB(17)); + + /* info post */ + + s[15] = Post_ViewList ? List_Nbr(Post_ViewList) : 0 ; + sprintf(label, "%g", s[15]); XtVaSetValues(VLAB(18)); + + s[16] = s[17] = s[18] = s[19] = 0 ; + if(Post_ViewList){ + for(i=0 ; i<List_Nbr(Post_ViewList) ; i++){ + v = (Post_View*)List_Pointer(Post_ViewList, i); + if(v->Visible){ + s[16] += List_Nbr(v->Points); + s[17] += List_Nbr(v->Lines); + s[18] += List_Nbr(v->Triangles); + s[19] += List_Nbr(v->Simplices); + } + } + } + sprintf(label, "%g", s[16]); XtVaSetValues(VLAB(19)); + sprintf(label, "%g", s[17]); XtVaSetValues(VLAB(20)); + sprintf(label, "%g", s[18]); XtVaSetValues(VLAB(21)); + sprintf(label, "%g", s[19]); XtVaSetValues(VLAB(22)); + +#undef VLAB + + if((long int)client_data) + XtManageChild(WID.OD.infoDialog) ; + else + XmUpdateDisplay(WID.OD.infoDialog); + } + +} + +/* ------------------------------------------------------------------------ + set_XXX + ------------------------------------------------------------------------ */ + +void set_r(int i, double val){ + if(!CTX.rlock[i]){ + CTX.r[i] = val; + if(XtIsManaged(WID.OD.viewportDialog)){ + sprintf(label, "%.5g", CTX.r[i]); + XtVaSetValues(WID.OD.viewportText[0][i], XmNvalue, label, NULL); + XmUpdateDisplay(WID.OD.viewportText[0][i]); + } + } +} + +void set_t(int i, double val){ + if(!CTX.tlock[i]){ + CTX.t[i] = val; + if(XtIsManaged(WID.OD.viewportDialog)){ + sprintf(label, "%.5g", CTX.t[i]); + XtVaSetValues(WID.OD.viewportText[1][i], XmNvalue, label, NULL); + XmUpdateDisplay(WID.OD.viewportText[1][i]); + } + } +} + +void set_s(int i, double val){ + if(!CTX.slock[i]){ + CTX.s[i] = val; + if(XtIsManaged(WID.OD.viewportDialog)){ + sprintf(label, "%.5g", CTX.s[i]); + XtVaSetValues(WID.OD.viewportText[2][i], XmNvalue, label, NULL); + XmUpdateDisplay(WID.OD.viewportText[2][i]); + } + } +} + + +/* ------------------------------------------------------------------------ + CurrentViewportCb + ------------------------------------------------------------------------ */ + +void CurrentViewportCb (Widget w, XtPointer client_data, XtPointer call_data){ + int i; + + if(XtIsManaged(WID.OD.viewportDialog)){ + XtUnmanageChild(WID.OD.viewportDialog); + } + else{ + for(i=0 ; i<3 ; i++){ + sprintf(label, "%.5g", CTX.r[i]); + XtVaSetValues(WID.OD.viewportText[0][i], XmNvalue, label, NULL); + sprintf(label, "%.5g", CTX.t[i]); + XtVaSetValues(WID.OD.viewportText[1][i], XmNvalue, label, NULL); + sprintf(label, "%.5g", CTX.s[i]); + XtVaSetValues(WID.OD.viewportText[2][i], XmNvalue, label, NULL); + } + XtManageChild(WID.OD.viewportDialog) ; + } + +} + diff --git a/Unix/CbGeneral.h b/Unix/CbGeneral.h new file mode 100644 index 0000000000000000000000000000000000000000..d9854cb8778c0403ccc2a36b88849f260360f503 --- /dev/null +++ b/Unix/CbGeneral.h @@ -0,0 +1,8 @@ +#ifndef _CB_GENERAL_H_ +#define _CB_GENERAL_H_ + +void set_r(int i, double val); +void set_t(int i, double val); +void set_s(int i, double val); + +#endif diff --git a/Unix/CbGeom.cpp b/Unix/CbGeom.cpp new file mode 100644 index 0000000000000000000000000000000000000000..418f00dd257688dfe1471fc8ef86b978f65b3e49 --- /dev/null +++ b/Unix/CbGeom.cpp @@ -0,0 +1,576 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Widgets.h" +#include "Context.h" +#include "Verif.h" +#include "Main.h" + +#include "CbGeom.h" + +extern Context_T CTX; +extern Widgets_T WID; + +extern Mesh M; +extern char TheFileName[256]; + +extern char x_text[100], y_text[100], z_text[100], l_text[100]; +extern char tx_text[100], ty_text[100], tz_text[100]; +extern char px_text[100], py_text[100], pz_text[100], angle_text[100]; +extern char ax_text[100], ay_text[100], az_text[100], angle_text[100]; +extern char dx_text[100], dy_text[100], dz_text[100], df_text[100]; + +static char name_text[100], value_text[100]; + +int SelectContour (int type, int num, List_T *Liste1){ + int k,ip,i; + List_T *Liste2; + + Liste2 = List_Create(1,1,sizeof(int)); + + if(!List_Nbr(Liste1)){ + switch(type){ + case ENT_LINE : k = alledgeslinked (num, Liste1, (List_T*)NULL); break; + case ENT_SURFACE : k = allfaceslinked (num, Liste1, (List_T*)NULL); break; + } + } + else{ + List_Reset(Liste2); + for(i=0;i<List_Nbr(Liste1);i++) + List_Add(Liste2,List_Pointer(Liste1,i)); + List_Reset(Liste1); + switch(type){ + case ENT_LINE : k = alledgeslinked (num, Liste1, Liste2); break; + case ENT_SURFACE : k = allfaceslinked (num, Liste1, Liste2); break; + } + } + + for(i=0;i<List_Nbr(Liste1);i++){ + List_Read(Liste1,i,&ip); + switch(type){ + case ENT_LINE : highlight_entity_num(0,abs(ip),0,1); break ; + case ENT_SURFACE : highlight_entity_num(0,0,abs(ip),1); break ; + } + } + + List_Delete(Liste2); + return k; +} + + +/* ------------------------------------------------------------------------ */ +/* g e o m _ e v e n t _ h a n d l e r */ +/* ------------------------------------------------------------------------ */ + +void geom_event_handler (int event) { + Vertex *v; + Curve *c; + Surface *s; + static int n=0, p[100]; + + int ib,zone,type; + List_T *Liste1, *Liste2; + + if(CTX.threads_lock) return ; + + switch (event) { + + case GEOM_PARSE : + OpenProblem(TheFileName); + Init(); + Draw(); + break; + + case GEOM_ELEM_ADD_NEW_POINT : + add_point(TheFileName); + ZeroHighlight(&M); + Replot(); + break; + + case GEOM_ELEM_ADD_NEW_LINE : + case GEOM_ELEM_ADD_NEW_SPLINE : + case GEOM_ELEM_ADD_NEW_BEZIER : + case GEOM_ELEM_ADD_NEW_BSPLINE : + n=0; + while(1){ + Msg(STATUS,"Select Point: (e) to end, (q) to quit"); + ib = SelectEntity(ENT_POINT, &v,&c,&s); + if(ib == 1){ /* left mouse butt */ + p[n++] = v->Num; + } + if (ib == -1){ /* 'e' */ + if(n >= 2) { + switch(event){ + case GEOM_ELEM_ADD_NEW_LINE : add_multline(n,p,TheFileName); break; + case GEOM_ELEM_ADD_NEW_SPLINE : add_spline (n,p,TheFileName); break; + case GEOM_ELEM_ADD_NEW_BEZIER : add_bezier (n,p,TheFileName); break; + case GEOM_ELEM_ADD_NEW_BSPLINE: add_bspline (n,p,TheFileName); break; + } + } + n=0; + ZeroHighlight(&M); + Replot(); + } + if(ib == 0){ /* 'q' */ + n=0 ; + ZeroHighlight(&M); + Replot(); + break; + } + } + break; + + case GEOM_ELEM_ADD_NEW_CIRCLE : + n=0; + while(1){ + if(n == 0) Msg(STATUS,"Select Center: (q) to quit"); + if(n == 1) Msg(STATUS,"Select Starting Point: (q) to quit"); + if(n == 2) Msg(STATUS,"Select Ending Point: (q) to quit"); + ib = SelectEntity(ENT_POINT, &v,&c,&s); + if(ib == 1) { /* left mouse butt */ + p[n++] = v->Num; + } + if(ib == 0) { /* 'q' */ + n=0 ; + ZeroHighlight(&M); + Replot(); + break; + } + if(n == 3){ + add_circ(p[1],p[0],p[2],TheFileName); /* begin, center, end */ + ZeroHighlight(&M); + Replot(); + n=0; + } + } + break; + + case GEOM_ELEM_ADD_NEW_ELLIPSIS : + n = 0; + while(1){ + if(n == 0) Msg(STATUS,"Select Center: (q) to quit"); + if(n == 1) Msg(STATUS,"Select an Axis Point: (q) to quit"); + if(n == 2) Msg(STATUS,"Select Starting Point: (q) to quit"); + if(n == 3) Msg(STATUS,"Select Ending Point: (q) to quit"); + ib = SelectEntity(ENT_POINT, &v,&c,&s); + if(ib == 1) { /* left mouse butt */ + p[n++] = v->Num; + } + if(ib == 0){ /* 'q' */ + n=0 ; + ZeroHighlight(&M); + Replot(); + break; + } + if(n == 4){ + add_ell(p[3],p[2],p[0],p[1],TheFileName); + ZeroHighlight(&M); + Replot(); + n=0; + } + } + break; + + case GEOM_ELEM_ADD_NEW_PLANE_SURF : + case GEOM_ELEM_ADD_NEW_RULED_SURF : + case GEOM_ELEM_ADD_NEW_VOLUME : + Liste1 = List_Create(10,10,sizeof(int)); + Liste2 = List_Create(10,10,sizeof(int)); + + if(event == GEOM_ELEM_ADD_NEW_VOLUME) + type = ENT_SURFACE; + else + type = ENT_LINE; + + while(1){ + List_Reset(Liste1); + List_Reset(Liste2); + + while(1) { + Msg(STATUS,"Select Boundary: (q) to quit"); + ib = SelectEntity(type, &v,&c,&s); + if(ib <= 0){ + ZeroHighlight(&M); + Replot(); + goto stopall; + } + if(SelectContour (type, (type==ENT_LINE)?c->Num:s->Num, Liste1)){ + if(type==ENT_LINE) + add_loop(Liste1,TheFileName,&zone); + else + add_vol(Liste1,TheFileName,&zone); + List_Reset(Liste1); + List_Add(Liste2,&zone); + while(1){ + Msg(STATUS,"Select Holes: (q) to quit"); + ib = SelectEntity(type, &v,&c,&s); + if(ib <= 0){ + ZeroHighlight(&M); + Replot(); + break; + } + List_Reset(Liste1); + if(SelectContour (type, (type==ENT_LINE)?c->Num:s->Num, Liste1)){ + if(type==ENT_LINE) + add_loop(Liste1,TheFileName,&zone); + else + add_vol(Liste1,TheFileName,&zone); + List_Reset(Liste1); + List_Add(Liste2,&zone); + } + } + if(List_Nbr(Liste2)){ + switch(event){ + case GEOM_ELEM_ADD_NEW_RULED_SURF : add_surf(Liste2,TheFileName,0,1); break; + case GEOM_ELEM_ADD_NEW_PLANE_SURF : add_surf(Liste2,TheFileName,0,2); break; + case GEOM_ELEM_ADD_NEW_VOLUME : add_multvol(Liste2,TheFileName); break; + } + ZeroHighlight(&M); + Replot(); + break; + } + } + } + } + stopall : ; + List_Delete(Liste1); + List_Delete(Liste2); + break; + + + case GEOM_ELEM_ADD_TRANSLATE_POINT : + case GEOM_ELEM_MOVE_TRANSLATE_POINT : + while(1){ + Msg(STATUS,"Select Point: (q) to quit"); + if(!SelectEntity(ENT_POINT, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + translate_pt(event==GEOM_ELEM_ADD_TRANSLATE_POINT?1:0,v->Num,TheFileName); + ZeroHighlight(&M); + Replot(); + } + break; + case GEOM_ELEM_ADD_TRANSLATE_LINE : + case GEOM_ELEM_MOVE_TRANSLATE_LINE : + while(1){ + Msg(STATUS,"Select Line: (q) to quit"); + if(!SelectEntity(ENT_LINE, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + translate_seg(event==GEOM_ELEM_ADD_TRANSLATE_LINE?1:0,c->Num,TheFileName); + ZeroHighlight(&M); + Replot(); + } + break; + case GEOM_ELEM_ADD_TRANSLATE_SURF : + case GEOM_ELEM_MOVE_TRANSLATE_SURF : + while(1){ + Msg(STATUS,"Select Surface: (q) to quit"); + if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + translate_surf(event==GEOM_ELEM_ADD_TRANSLATE_SURF?1:0,s->Num,TheFileName); + ZeroHighlight(&M); + Replot(); + } + break; + + + case GEOM_ELEM_ADD_ROTATE_POINT : + case GEOM_ELEM_MOVE_ROTATE_POINT : + while(1){ + Msg(STATUS,"Select Point: (q) to quit"); + if(!SelectEntity(ENT_POINT, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + rotate(event==GEOM_ELEM_ADD_ROTATE_POINT?1:0,v->Num,TheFileName,"Point"); + ZeroHighlight(&M); + Replot(); + } + break; + case GEOM_ELEM_ADD_ROTATE_LINE : + case GEOM_ELEM_MOVE_ROTATE_LINE : + while(1){ + Msg(STATUS,"Select Line: (q) to quit"); + if(!SelectEntity(ENT_LINE, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + rotate(event==GEOM_ELEM_ADD_ROTATE_LINE?1:0,c->Num,TheFileName,"Line"); + ZeroHighlight(&M); + Replot(); + } + break; + case GEOM_ELEM_ADD_ROTATE_SURF : + case GEOM_ELEM_MOVE_ROTATE_SURF : + while(1){ + Msg(STATUS,"Select Surface: (q) to quit"); + if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + rotate(event==GEOM_ELEM_ADD_ROTATE_SURF?1:0,s->Num,TheFileName,"Surface"); + ZeroHighlight(&M); + Replot(); + } + break; + + + + case GEOM_ELEM_EXTRUDE_TRANSLATE_POINT : + case GEOM_ELEM_EXTRUDE_ROTATE_POINT : + while(1){ + Msg(STATUS,"Select Point: (q) to quit"); + if(!SelectEntity(ENT_POINT, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + event==GEOM_ELEM_EXTRUDE_TRANSLATE_POINT ? + extrude(v->Num,TheFileName, "Point") : + protude(v->Num,TheFileName, "Point") ; + ZeroHighlight(&M); + Replot(); + } + break; + case GEOM_ELEM_EXTRUDE_TRANSLATE_LINE : + case GEOM_ELEM_EXTRUDE_ROTATE_LINE : + while(1){ + Msg(STATUS,"Select Line: (q) to quit"); + if(!SelectEntity(ENT_LINE, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + event==GEOM_ELEM_EXTRUDE_TRANSLATE_LINE ? + extrude(c->Num,TheFileName, "Line") : + protude(c->Num,TheFileName, "Line") ; + ZeroHighlight(&M); + Replot(); + } + break; + case GEOM_ELEM_EXTRUDE_TRANSLATE_SURF : + case GEOM_ELEM_EXTRUDE_ROTATE_SURF : + while(1){ + Msg(STATUS,"Select Surface: (q) to quit"); + if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + event==GEOM_ELEM_EXTRUDE_TRANSLATE_SURF ? + extrude(s->Num,TheFileName, "Surface") : + protude(s->Num,TheFileName, "Surface") ; + ZeroHighlight(&M); + Replot(); + } + break; + + + case GEOM_ELEM_ADD_DILATE_POINT : + case GEOM_ELEM_MOVE_DILATE_POINT : + while(1){ + Msg(STATUS,"Select Point: (q) to quit"); + if(!SelectEntity(ENT_POINT, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + dilate(event==GEOM_ELEM_ADD_DILATE_POINT?1:0,v->Num,TheFileName,"Point"); + ZeroHighlight(&M); + Replot(); + } + break; + case GEOM_ELEM_ADD_DILATE_LINE : + case GEOM_ELEM_MOVE_DILATE_LINE : + while(1){ + Msg(STATUS,"Select Line: (q) to quit"); + if(!SelectEntity(ENT_LINE, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + dilate(event==GEOM_ELEM_ADD_DILATE_LINE?1:0,c->Num,TheFileName,"Line"); + ZeroHighlight(&M); + Replot(); + } + break; + case GEOM_ELEM_ADD_DILATE_SURF : + case GEOM_ELEM_MOVE_DILATE_SURF : + while(1){ + Msg(STATUS,"Select Surface: (q) to quit"); + if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + dilate(event==GEOM_ELEM_ADD_DILATE_SURF?1:0,s->Num,TheFileName,"Surface"); + ZeroHighlight(&M); + Replot(); + } + break; + + + + + case GEOM_ELEM_DELETE_POINT : + while(1){ + Msg(STATUS,"Select Point: (q) to quit"); + if(!SelectEntity(ENT_POINT, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + del_pnt(v->Num,TheFileName); + ZeroHighlight(&M); + Replot(); + } + break; + case GEOM_ELEM_DELETE_LINE : + while(1){ + Msg(STATUS,"Select Line: (q) to quit"); + if(!SelectEntity(ENT_LINE, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + del_seg(c->Num,TheFileName); + ZeroHighlight(&M); + Replot(); + } + break; + case GEOM_ELEM_DELETE_SURF : + while(1){ + Msg(STATUS,"Select Point: (q) to quit"); + if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){ + ZeroHighlight(&M); + Replot(); + break; + } + del_srf(s->Num,TheFileName); + ZeroHighlight(&M); + Replot(); + } + break; + + + case GEOM_ELEM_SKETCH : + Msg(STATUS,"Verifying Geometry"); + add_infile("Coherence;",TheFileName); + ZeroHighlight(&M); + Replot(); + break; + + case GEOM_PHYS_ADD_POINT: + case GEOM_PHYS_ADD_LINE: + case GEOM_PHYS_ADD_SURF: + Liste1 = List_Create(5,5,sizeof(int)); + while(1){ + switch(event){ + case GEOM_PHYS_ADD_POINT: + Msg(STATUS,"Select Point: (e) to end, (q) to quit"); + type = 0; + break; + case GEOM_PHYS_ADD_LINE: + Msg(STATUS,"Select Line: (e) to end, (q) to quit"); + type = 1; + break; + case GEOM_PHYS_ADD_SURF: + Msg(STATUS,"Select Surface: (e) to end, (q) to quit"); + type = 2; + break; + } + ib = SelectEntity(type, &v,&c,&s); + if(ib == 1){ /* left mouse */ + switch(event){ + case GEOM_PHYS_ADD_POINT: List_Add(Liste1, &v->Num); break; + case GEOM_PHYS_ADD_LINE: List_Add(Liste1, &c->Num); break; + case GEOM_PHYS_ADD_SURF: List_Add(Liste1, &s->Num); break; + } + } + if(ib == -1){ /* end */ + if(List_Nbr(Liste1)){ + add_physical_entity(Liste1,TheFileName,type,&zone); + List_Reset(Liste1); + ZeroHighlight(&M); + Replot(); + } + } + if(ib == 0){ + ZeroHighlight(&M); + Replot(); + break; + } + } + break; + + case GEOM_PHYS_ADD_VOLUME : + case GEOM_PHYS_DELETE_POINT : + case GEOM_PHYS_DELETE_LINE : + case GEOM_PHYS_DELETE_SURF : + case GEOM_PHYS_DELETE_VOLUME : + case GEOM_ELEM_ADD_NEW_NURBS_SURF : + Msg(WARNING, "Not done interactively yet. Sorry!"); + break; + + default : + Msg(WARNING, "Unknown event in geom_event_handler"); + break; + + } + + Msg(STATUS,"Ready"); +} + + +/* ------------------------------------------------------------------------ + G e o m C b + ------------------------------------------------------------------------ */ + +void GeomCb (Widget w, XtPointer client_data, XtPointer call_data){ + + switch((long int)client_data){ + + case GEOM_PARAMETER_ADD : add_param(name_text,value_text,TheFileName); break; + case GEOM_PARAMETER_NAME : strcpy(name_text,XmTextGetString(w)); break; + case GEOM_PARAMETER_VALUE : strcpy(value_text,XmTextGetString(w)); break; + case GEOM_POINT_ADD : geom_event_handler(GEOM_ELEM_ADD_NEW_POINT); Replot(); break; + case GEOM_POINT_X : strcpy(x_text,XmTextGetString(w)); break; + case GEOM_POINT_Y : strcpy(y_text,XmTextGetString(w)); break; + case GEOM_POINT_Z : strcpy(z_text,XmTextGetString(w)); break; + case GEOM_POINT_L : strcpy(l_text,XmTextGetString(w)); break; + case GEOM_TRAN_X : strcpy(tx_text,XmTextGetString(w)); break; + case GEOM_TRAN_Y : strcpy(ty_text,XmTextGetString(w)); break; + case GEOM_TRAN_Z : strcpy(tz_text,XmTextGetString(w)); break; + case GEOM_ROT_PX : strcpy(px_text,XmTextGetString(w)); break; + case GEOM_ROT_PY : strcpy(py_text,XmTextGetString(w)); break; + case GEOM_ROT_PZ : strcpy(pz_text,XmTextGetString(w)); break; + case GEOM_ROT_AX : strcpy(ax_text,XmTextGetString(w)); break; + case GEOM_ROT_AY : strcpy(ay_text,XmTextGetString(w)); break; + case GEOM_ROT_AZ : strcpy(az_text,XmTextGetString(w)); break; + case GEOM_ROT_ANGLE : strcpy(angle_text,XmTextGetString(w)); break; + case GEOM_DILAT_X : strcpy(dx_text,XmTextGetString(w)); break; + case GEOM_DILAT_Y : strcpy(dy_text,XmTextGetString(w)); break; + case GEOM_DILAT_Z : strcpy(dz_text,XmTextGetString(w)); break; + case GEOM_DILAT_F : strcpy(df_text,XmTextGetString(w)); break; + + default : + Msg(WARNING, "Unknown value in GeomCb : %d", (long int)client_data); + break; + + } +} + diff --git a/Unix/CbGeom.h b/Unix/CbGeom.h new file mode 100644 index 0000000000000000000000000000000000000000..ec4c7579e8e806474a8fdad14d0d7ec42c255132 --- /dev/null +++ b/Unix/CbGeom.h @@ -0,0 +1,83 @@ +#ifndef _CB_GEOM_H_ +#define _CB_GEOM_H_ + +/* geom event handler */ + +#define GEOM_ELEM_ADD_NEW_PARAMETER 1 +#define GEOM_ELEM_ADD_NEW_POINT 2 +#define GEOM_ELEM_ADD_NEW_LINE 3 +#define GEOM_ELEM_ADD_NEW_SPLINE 4 +#define GEOM_ELEM_ADD_NEW_BEZIER 5 +#define GEOM_ELEM_ADD_NEW_BSPLINE 6 +#define GEOM_ELEM_ADD_NEW_CIRCLE 7 +#define GEOM_ELEM_ADD_NEW_ELLIPSIS 8 +#define GEOM_ELEM_ADD_NEW_PLANE_SURF 9 +#define GEOM_ELEM_ADD_NEW_RULED_SURF 10 +#define GEOM_ELEM_ADD_NEW_NURBS_SURF 11 +#define GEOM_ELEM_ADD_NEW_VOLUME 12 +#define GEOM_ELEM_ADD_TRANSLATE_POINT 13 +#define GEOM_ELEM_ADD_TRANSLATE_LINE 14 +#define GEOM_ELEM_ADD_TRANSLATE_SURF 15 +#define GEOM_ELEM_ADD_ROTATE_POINT 16 +#define GEOM_ELEM_ADD_ROTATE_LINE 17 +#define GEOM_ELEM_ADD_ROTATE_SURF 18 +#define GEOM_ELEM_ADD_DILATE_POINT 19 +#define GEOM_ELEM_ADD_DILATE_LINE 20 +#define GEOM_ELEM_ADD_DILATE_SURF 21 +#define GEOM_ELEM_MOVE_TRANSLATE_POINT 22 +#define GEOM_ELEM_MOVE_TRANSLATE_LINE 23 +#define GEOM_ELEM_MOVE_TRANSLATE_SURF 24 +#define GEOM_ELEM_MOVE_ROTATE_POINT 25 +#define GEOM_ELEM_MOVE_ROTATE_LINE 26 +#define GEOM_ELEM_MOVE_ROTATE_SURF 27 +#define GEOM_ELEM_MOVE_DILATE_POINT 28 +#define GEOM_ELEM_MOVE_DILATE_LINE 29 +#define GEOM_ELEM_MOVE_DILATE_SURF 30 +#define GEOM_ELEM_EXTRUDE_TRANSLATE_POINT 31 +#define GEOM_ELEM_EXTRUDE_TRANSLATE_LINE 32 +#define GEOM_ELEM_EXTRUDE_TRANSLATE_SURF 33 +#define GEOM_ELEM_EXTRUDE_ROTATE_POINT 34 +#define GEOM_ELEM_EXTRUDE_ROTATE_LINE 35 +#define GEOM_ELEM_EXTRUDE_ROTATE_SURF 36 +#define GEOM_ELEM_DELETE_POINT 37 +#define GEOM_ELEM_DELETE_LINE 38 +#define GEOM_ELEM_DELETE_SURF 39 +#define GEOM_ELEM_SKETCH 40 +#define GEOM_PHYS_ADD_POINT 41 +#define GEOM_PHYS_ADD_LINE 42 +#define GEOM_PHYS_ADD_SURF 43 +#define GEOM_PHYS_ADD_VOLUME 44 +#define GEOM_PHYS_DELETE_POINT 45 +#define GEOM_PHYS_DELETE_LINE 46 +#define GEOM_PHYS_DELETE_SURF 47 +#define GEOM_PHYS_DELETE_VOLUME 48 +#define GEOM_PARSE 49 + +/* GeomCb */ + +#define GEOM_PARAMETER_ADD 1 +#define GEOM_PARAMETER_NAME 2 +#define GEOM_PARAMETER_VALUE 3 +#define GEOM_POINT_ADD 4 +#define GEOM_POINT_X 5 +#define GEOM_POINT_Y 6 +#define GEOM_POINT_Z 7 +#define GEOM_POINT_L 8 +#define GEOM_TRAN_X 9 +#define GEOM_TRAN_Y 10 +#define GEOM_TRAN_Z 11 +#define GEOM_ROT_PX 12 +#define GEOM_ROT_PY 13 +#define GEOM_ROT_PZ 14 +#define GEOM_ROT_AX 15 +#define GEOM_ROT_AY 16 +#define GEOM_ROT_AZ 17 +#define GEOM_ROT_ANGLE 18 +#define GEOM_DILAT_X 19 +#define GEOM_DILAT_Y 20 +#define GEOM_DILAT_Z 21 +#define GEOM_DILAT_F 22 + +void geom_event_handler (int event); + +#endif diff --git a/Unix/CbInput.cpp b/Unix/CbInput.cpp new file mode 100644 index 0000000000000000000000000000000000000000..46b14b9eaf33d65d0f2af86d5b71744808b97227 --- /dev/null +++ b/Unix/CbInput.cpp @@ -0,0 +1,697 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Mesh.h" +#include "Draw.h" +#include "Widgets.h" +#include "Context.h" +#include "XContext.h" +#include "Register.h" + +#include "CbContext.h" +#include "CbGeneral.h" +#include "CbGeom.h" +#include "CbPost.h" +#include "CbMesh.h" + +extern Context_T CTX ; +extern XContext_T XCTX ; +extern Widgets_T WID ; + +extern GLdouble vxmin, vxmax, vymin, vymax; +extern Mesh M; +extern double LC, MiddleLC; +extern double ClipPlane[4]; + +static int Modifier=0; + +void KeyboardAccel(XEvent *event){ + XComposeStatus stat; + KeySym keysym; + char buf[100]; + double delay ; + + XLookupString(&event->xkey, buf, sizeof(buf), &keysym, &stat); + + switch(Modifier){ + + /* ----------------------------------------------------- */ + /* No modifier or shift is pressed */ + /* ----------------------------------------------------- */ + + case 0 : + + /* modifier check and trash */ + switch (keysym) { + case XK_Control_L : case XK_Control_R : + Modifier = 1; + break; + case XK_Alt_L : case XK_Alt_R : + case XK_Meta_L : case XK_Meta_R : + Modifier = 2; + break; + + /* hacks */ + + /* + case XK_Up : + ClipPlane[2] = 1. ; + if(fabs(ClipPlane[3]-LC/20 <1.)) ClipPlane[3] -= LC/20. ; + Init(); Draw(); + break; + case XK_Down : + ClipPlane[2] = 1. ; + if(fabs(ClipPlane[3]+LC/20 <1.)) ClipPlane[3] += LC/20. ; + Init(); Draw(); + break; + */ + + /* mesh shortcuts */ + case XK_0 : case XK_KP_0 : + ActualizeContextCb (NULL,(XtPointer)CONTEXT_GEOM,NULL); + geom_event_handler(GEOM_PARSE); + break; + case XK_1 : case XK_KP_1 : + case XK_F1 : case XK_KP_F1 : + ActualizeContextCb (NULL,(XtPointer)CONTEXT_MESH,NULL); + mesh_event_handler(MESH_1D); + break; + case XK_2 : case XK_KP_2 : + case XK_F2 : case XK_KP_F2 : + ActualizeContextCb (NULL,(XtPointer)CONTEXT_MESH,NULL); + mesh_event_handler(MESH_2D); + break; + case XK_3 : case XK_KP_3 : + case XK_F3 : case XK_KP_F3 : + ActualizeContextCb (NULL,(XtPointer)CONTEXT_MESH,NULL); + mesh_event_handler(MESH_3D); + break; + + /* post shortcuts */ + case XK_s: + CTX.post.anim_delay += 100000 ; + delay = CTX.post.anim_delay / 1.e6 ; + XtVaSetValues(WID.OD.postAnimScale, XmNvalue, (int)(10*delay), NULL); + XmUpdateDisplay(WID.OD.postAnimScale); + break ; + case XK_S: + CTX.post.anim_delay -= 100000 ; + if(CTX.post.anim_delay < 0) CTX.post.anim_delay = 0 ; + delay = CTX.post.anim_delay / 1.e6 ; + XtVaSetValues(WID.OD.postAnimScale, XmNvalue, (int)(10*delay), NULL); + XmUpdateDisplay(WID.OD.postAnimScale); + break ; + + /* module shortcuts */ + case XK_g : + ActualizeContextCb (NULL,(XtPointer)CONTEXT_GEOM,NULL); + break; + case XK_m : + ActualizeContextCb (NULL,(XtPointer)CONTEXT_MESH,NULL); + break; + case XK_p : + ActualizeContextCb (NULL,(XtPointer)CONTEXT_POST,NULL); + break; + + /* options menu shortcuts */ + case XK_G : + ManageCb(NULL,(XtPointer)WID.OD.geomDialog,NULL); + break; + case XK_M : + ManageCb(NULL,(XtPointer)WID.OD.meshDialog,NULL); + break; + case XK_P : + ManageCb(NULL,(XtPointer)WID.OD.postDialog,NULL); + break; + case XK_O : + ManageCb(NULL,(XtPointer)WID.OD.miscDialog,NULL); + break; + case XK_I : + Modifier = 0 ; + CurrentInfoCb(NULL, (XtPointer)1, NULL); + break; + case XK_V : + Modifier = 0 ; + CurrentViewportCb (NULL, NULL, NULL); + break; + } + break; + + + /* ----------------------------------------------------- */ + /* Control is pressed */ + /* ----------------------------------------------------- */ + + case 1 : + + switch (keysym) { + + /* file menu shortcuts */ + case XK_q : case XK_Q : + exit(1); + case XK_a : case XK_A : + case XK_c : case XK_C : + CancelMeshThread(); + break; + case XK_s : + Print_Mesh(&M,NULL, CTX.mesh.format); + break; + case XK_S : + Modifier = 0 ; + ManageCb(NULL,(XtPointer)WID.FD.saveAsDialog,NULL); + break ; + case XK_o : case XK_O : + Modifier = 0 ; + ManageCb(NULL,(XtPointer)WID.FD.openDialog,NULL); + break; + case XK_m : case XK_M : + Modifier = 0 ; + ManageCb(NULL,(XtPointer)WID.FD.mergeDialog,NULL); + break; + case XK_p : case XK_P : + Modifier = 0 ; + ManageCb(NULL,(XtPointer)WID.FD.printDialog,NULL); + break; + } + break ; + + + /* ----------------------------------------------------- */ + /* Alt is pressed */ + /* ----------------------------------------------------- */ + + case 2 : + + /* everything that is not "cascade menu" */ + switch (keysym) { + case XK_f : case XK_F : + CTX.fast = !CTX.fast; + XtVaSetValues(WID.OD.miscMiscButt[2], XmNset, CTX.fast, NULL); + XmUpdateDisplay(WID.OD.miscMiscCheck); + break; + case XK_b : case XK_B : + CTX.post.scales = !CTX.post.scales; + Init(); Draw(); + break; + case XK_o : case XK_O : + CTX.ortho = !CTX.ortho; + XtVaSetValues(WID.OD.miscProjButt[0], XmNset, CTX.ortho, NULL); + XtVaSetValues(WID.OD.miscProjButt[1], XmNset, !CTX.ortho, NULL); + XmUpdateDisplay(WID.OD.miscProjCheck); + Init(); Draw(); + break; + case XK_h : case XK_H : + CTX.geom.highlight = !CTX.geom.highlight; + CTX.geom.highlight ? Msg(INFOS, "Highlight enabled") : + Msg(INFOS, "Highlight disabled"); + break; + case XK_c : case XK_C : + if(CTX.color.id==0) InitColors(&CTX.color,1); + else if(CTX.color.id==1) InitColors(&CTX.color,2); + else InitColors(&CTX.color,0); + XtVaSetValues(WID.OD.miscColorSchemeScale,XmNvalue, CTX.color.id, NULL); + XmUpdateDisplay(WID.OD.miscColorSchemeScale); + Init(); Draw(); + break; + case XK_d : case XK_D : + if(!CTX.mesh.hidden && !CTX.mesh.shade) + CTX.mesh.hidden = 1; + else if(CTX.mesh.hidden && !CTX.mesh.shade) + CTX.mesh.shade = 1; + else{ + CTX.mesh.hidden = 0; CTX.mesh.shade = 0; + } + XtVaSetValues(WID.OD.meshAspectButt[2],XmNset,CTX.mesh.hidden&&CTX.mesh.shade, NULL); + XtVaSetValues(WID.OD.meshAspectButt[1],XmNset,CTX.mesh.hidden&&!CTX.mesh.shade, NULL); + XtVaSetValues(WID.OD.meshAspectButt[0],XmNset,!CTX.mesh.hidden&&!CTX.mesh.shade, NULL); + XmUpdateDisplay(WID.OD.meshAspectCheck); + Init(); Draw(); + break; + case XK_x : case XK_X : + set_r(0,0.); set_r(1,90.);set_r(2,0.); Init(); Draw(); + break; + case XK_y : case XK_Y : + set_r(0,-90.);set_r(1,0.); set_r(2,0.); Init(); Draw(); + break; + case XK_z : case XK_Z : + set_r(0,0.); set_r(1,0.); set_r(2,0.); Init(); Draw(); + break; + case XK_a : + CTX.little_axes = !CTX.little_axes; + XtVaSetValues(WID.OD.miscMiscButt[1], XmNset, CTX.little_axes, NULL); + XmUpdateDisplay(WID.OD.miscMiscCheck); + Init(); Draw(); + break; + case XK_A : + CTX.axes = !CTX.axes; + XtVaSetValues(WID.OD.miscMiscButt[0], XmNset, CTX.axes, NULL); + XmUpdateDisplay(WID.OD.miscMiscCheck); + Init(); Draw(); + break; + case XK_p : + CTX.geom.points = !CTX.geom.points; + if(!CTX.geom.vis_type){ + XtVaSetValues(WID.OD.geomVisibleButt[0], XmNset, CTX.geom.points, NULL); + XmUpdateDisplay(WID.OD.geomVisibleButt[0]); + } + Init(); Draw(); + break; + case XK_P : + CTX.mesh.points = !CTX.mesh.points; + if(!CTX.mesh.vis_type){ + XtVaSetValues(WID.OD.meshVisibleButt[0], XmNset, CTX.mesh.points, NULL); + XmUpdateDisplay(WID.OD.meshVisibleButt[0]); + } + Init(); Draw(); + break; + case XK_l : + CTX.geom.lines = !CTX.geom.lines; + if(!CTX.geom.vis_type){ + XtVaSetValues(WID.OD.geomVisibleButt[1], XmNset, CTX.geom.lines, NULL); + XmUpdateDisplay(WID.OD.geomVisibleButt[1]); + } + Init(); Draw(); + break; + case XK_L : + CTX.mesh.lines = !CTX.mesh.lines; + if(!CTX.mesh.vis_type){ + XtVaSetValues(WID.OD.meshVisibleButt[1], XmNset, CTX.mesh.lines, NULL); + XmUpdateDisplay(WID.OD.meshVisibleButt[1]); + } + Init(); Draw(); + break; + case XK_s : + CTX.geom.surfaces = !CTX.geom.surfaces; + if(!CTX.geom.vis_type){ + XtVaSetValues(WID.OD.geomVisibleButt[2], XmNset, CTX.geom.surfaces, NULL); + XmUpdateDisplay(WID.OD.geomVisibleButt[2]); + } + Init(); Draw(); + break; + case XK_S : + CTX.mesh.surfaces = !CTX.mesh.surfaces; + if(!CTX.mesh.vis_type){ + XtVaSetValues(WID.OD.meshVisibleButt[2], XmNset, CTX.mesh.surfaces, NULL); + XmUpdateDisplay(WID.OD.meshVisibleButt[2]); + } + Init(); Draw(); + break; + case XK_v : + CTX.geom.volumes = !CTX.geom.volumes; + if(!CTX.geom.vis_type){ + XtVaSetValues(WID.OD.geomVisibleButt[3], XmNset, CTX.geom.volumes, NULL); + XmUpdateDisplay(WID.OD.geomVisibleButt[3]); + } + Init(); Draw(); + break; + case XK_V : + CTX.mesh.volumes = !CTX.mesh.volumes; + if(!CTX.mesh.vis_type){ + XtVaSetValues(WID.OD.meshVisibleButt[3], XmNset, CTX.mesh.volumes, NULL); + XmUpdateDisplay(WID.OD.meshVisibleButt[3]); + } + Init(); Draw(); + break; + case XK_m : case XK_M : + CTX.mesh.points = !CTX.mesh.points; + CTX.mesh.lines = !CTX.mesh.lines; + CTX.mesh.surfaces = !CTX.mesh.surfaces; + CTX.mesh.volumes = !CTX.mesh.volumes; + XtVaSetValues(WID.OD.meshVisibleButt[0], XmNset, CTX.mesh.points, NULL); + XtVaSetValues(WID.OD.meshVisibleButt[1], XmNset, CTX.mesh.lines, NULL); + XtVaSetValues(WID.OD.meshVisibleButt[2], XmNset, CTX.mesh.surfaces, NULL); + XtVaSetValues(WID.OD.meshVisibleButt[3], XmNset, CTX.mesh.volumes, NULL); + XmUpdateDisplay(WID.OD.meshVisibleCheck); + Init(); Draw(); + break; + case XK_t : case XK_T : + MarkAllViewsChanged(1); + Init(); Draw(); + break; + } + break ; + + } + +} + + +/* ------------------------------------------------------------------------ */ +/* I n p u t */ +/* ------------------------------------------------------------------------ */ + +void myZoom(GLdouble x1, GLdouble x2, GLdouble y1, GLdouble y2, + GLdouble xc1, GLdouble xc2, GLdouble yc1, GLdouble yc2); +void process_selection(int x, int y, int *n, GLuint *ii, GLuint *jj); +void filtre_selection(int n, GLuint *typ, GLuint *ient, Vertex **thev, + Curve **thec, Surface **thes, Mesh *m); + +void InputCb (Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *cb){ + XEvent *event; + XComposeStatus stat; + KeySym keysym; + GLuint ii[SELECTION_BUFFER_SIZE], jj[SELECTION_BUFFER_SIZE]; + char buf[100]; + int previous_mesh_draw, previous_post_draw ; + int width, height ; + + static int ibut, hits; + static int ButtonPressed=0, ZoomClick=0, FirstClick=0; + static int x, y, movx, movy; + static GLdouble xc1, yc1, xc2, yc2, xt1, yt1, xscale1, yscale1; + static GLdouble xb, yb, xc, yc, xe, ye, xz, yz; + static GLdouble movzx, movzy; + static Vertex *v=NULL, *ov; + static Curve *c=NULL, *oc; + static Surface *s=NULL, *os; + + width = CTX.viewport[2]-CTX.viewport[0] ; + height = CTX.viewport[3]-CTX.viewport[1] ; + + event = cb->event; + + switch(event->type){ + + /* ------------------------------------------------------------- + K e y s + ------------------------------------------------------------- */ + + case KeyPress : + KeyboardAccel(event); + break; + + case KeyRelease : + XLookupString(&event->xkey, buf, sizeof(buf), &keysym, &stat); + if(keysym == XK_Control_L || + keysym == XK_Control_R || + keysym == XK_Alt_L || + keysym == XK_Alt_R || + keysym == XK_Meta_L || + keysym == XK_Meta_R) + Modifier = 0; + break; + + /* ------------------------------------------------------------- + B u t t o n P r e s s + ------------------------------------------------------------- */ + + case ButtonPress : + ButtonPressed++; + FirstClick=1; + ibut = event->xbutton.button; + x = event->xbutton.x; + y = event->xbutton.y; + + switch(ibut){ + case 1: + if(!ZoomClick && Modifier){ + xb = vxmin + ((GLdouble) x / width) * (vxmax - vxmin); + yb = vymax - ((GLdouble) y / height) * (vymax - vymin); + xc1 = xb/CTX.s[0] - CTX.t[0]; + yc1 = yb/CTX.s[1] - CTX.t[1]; + ZoomClick=1; + movzx = movzy = 0; + Modifier = 0; + } + else if(ZoomClick){ + xe = vxmin + ((GLdouble) x / width) * (vxmax - vxmin); + ye = vymax - ((GLdouble) y / height) * (vymax - vymin); + xc2 = xe/CTX.s[0] - CTX.t[0]; + yc2 = ye/CTX.s[1] - CTX.t[1]; + ZoomClick=0; + if(CTX.overlay){ + glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context); + glClearIndex(0); + glClear(GL_COLOR_BUFFER_BIT); + glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context); + } + if(xb!=xe && yb!=ye) + myZoom(xb,xe,yb,ye,xc1,xc2,yc1,yc2); + } + break; + case 2: + if(Modifier && !ZoomClick){ + Modifier = 0; + set_s(1, CTX.s[0]); + set_s(2, CTX.s[0]); + Init(); + Draw(); + } + else{ + ZoomClick=0; + if(CTX.overlay){ + glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context); + glClearIndex(0); + glClear(GL_COLOR_BUFFER_BIT); + glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context); + } + } + break; + case 3: + if(Modifier && !ZoomClick){ + Modifier = 0; + set_r(0,0.); set_r(1,0.); set_r(2,0.); + set_t(0,0.); set_t(1,0.); set_t(2,0.); + set_s(0,1.); set_s(1,1.); set_s(2,1.); + Init(); + Draw(); + } + else{ + ZoomClick=0; + if(CTX.overlay){ + glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context); + glClearIndex(0); + glClear(GL_COLOR_BUFFER_BIT); + glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context); + } + } + break; + } + break; + + /* ------------------------------------------------------------- + B u t t o n R e l e a s e + ------------------------------------------------------------- */ + + case ButtonRelease : + if(ButtonPressed>0){ + ButtonPressed--; + ibut = event->xbutton.button; + x = event->xbutton.x; + y = event->xbutton.y; + } + if(!ZoomClick){ + Init(); + previous_mesh_draw = CTX.mesh.draw ; + previous_post_draw = CTX.post.draw ; + if(ButtonPressed>0){ + if(CTX.fast) CTX.mesh.draw = CTX.post.draw = 0; + } + Draw(); + CTX.mesh.draw = previous_mesh_draw ; + CTX.post.draw = previous_post_draw ; + } + break; + + /* ------------------------------------------------------------- + E n t e r / L e a v e N o t i f y + ------------------------------------------------------------- */ + + case EnterNotify : + case LeaveNotify : + ButtonPressed = 0; + Modifier = 0; + break; + + /* ------------------------------------------------------------- + M o t i o n N o t i f y + ------------------------------------------------------------- */ + + case MotionNotify : + movx = (event->xbutton.x-x); + movy = (event->xbutton.y-y); + + if(ZoomClick) { + + xz = vxmin + ((GLdouble) event->xbutton.x / width) * (vxmax - vxmin); + yz = vymax - ((GLdouble) event->xbutton.y / height) * (vymax - vymin) ; + if(CTX.overlay) { + movzx = xz - xb; movzy = yz - yb; + InitOv(); + glLineWidth(1.); + glClearIndex(0); + glClear(GL_COLOR_BUFFER_BIT); + glIndexi((CTX.color.bg<CTX.color.fg)?XCTX.xcolor.ovwhite:XCTX.xcolor.ovblack); + glBegin(GL_LINE_STRIP); + glVertex2d(xb,yb); + glVertex2d(xb+movzx,yb); + glVertex2d(xb+movzx,yb+movzy); + glVertex2d(xb,yb+movzy); + glVertex2d(xb,yb); + glEnd(); + + /* Dessine le plus gd rectangle possible si ortho */ + + /* + if(fabs((double)movzx/(double)movzy) > ((double)width/(double)height)){ + constry = movzy; + constrx = sign(movzx)*fabs(movzy)*((double)width/(double)height); + } + else{ + constrx = movzx; + constry = sign(movzy)*fabs(movzx)*((double)height/(double)width); + } + glIndexi(theRed); + glBegin(GL_LINE_STRIP); + glVertex2d(xb+constrx,yb); + glVertex2d(xb+constrx,yb+constry); + glVertex2d(xb,yb+constry); + glEnd(); + */ + + glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context); + } + else { + glPopMatrix(); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluOrtho2D(vxmin, vxmax, vymin, vymax); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + if(CTX.db) glDrawBuffer(GL_BACK); + + glDisable(GL_DEPTH_TEST); + /* c'est une maniere de contourner l'absence de XOR, mais ca ne marche + evidemment qu'avec un background tout noir ou tout blanc !*/ + glColor3f(1.,1.,1.); + glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); + glEnable(GL_BLEND); + + glBegin(GL_LINE_STRIP); + glVertex2d(xb,yb); + glVertex2d(xb+movzx,yb); + glVertex2d(xb+movzx,yb+movzy); + glVertex2d(xb,yb+movzy); + glVertex2d(xb,yb); + glEnd(); + movzx = xz - xb; movzy = yz - yb; + + glBegin(GL_LINE_STRIP); + glVertex2d(xb,yb); + glVertex2d(xb+movzx,yb); + glVertex2d(xb+movzx,yb+movzy); + glVertex2d(xb,yb+movzy); + glVertex2d(xb,yb); + glEnd(); + + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + if(CTX.db) + glXSwapBuffers(XCTX.display,XtWindow(WID.G.glw)); + else + glFlush(); + + } + } + else { + if(ButtonPressed){ + + if(CTX.overlay){ + glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context); + glClearIndex(0); + glClear(GL_COLOR_BUFFER_BIT); + glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context); + } + + if(FirstClick){ + xc1 = ( ((GLdouble) x / width) * (vxmax - vxmin) + vxmin )/CTX.s[0] - CTX.t[0]; + yc1 = ( vymax - ((GLdouble) y / height) * (vymax - vymin))/CTX.s[1] - CTX.t[1]; + xt1 = CTX.t[0]; + yt1 = CTX.t[1]; + xscale1 = CTX.s[0]; + yscale1 = CTX.s[1]; + FirstClick=0; + } + + switch(ibut){ + case 1: + set_r(1, CTX.r[1] + ((abs(movx) > abs(movy))?180*(float)movx/(float)width:0)); + set_r(0, CTX.r[0] + ((abs(movx) > abs(movy))?0:180*(float)movy/(float)height)); + break; + case 2: + set_r(2, CTX.r[2] + ((abs(movy) > abs(movx))?0:-180*(float)movx/(float)width)); + + set_s(0, CTX.s[0] * ( (abs(movy) > abs(movx)) ? + ( (movy>0) ? (float)(1.04*(abs(movy)+height))/(float)height + : (float)(height)/(float)(1.04*(abs(movy)+height)) ) + : 1.) ); + set_s(1, CTX.s[0]); + set_s(2, CTX.s[0]); + + if(abs(movy) > abs(movx)){ + set_t(0, xt1*(xscale1/CTX.s[0])-xc1*(1.-(xscale1/CTX.s[0]))); + set_t(1, yt1*(yscale1/CTX.s[1])-yc1*(1.-(yscale1/CTX.s[1]))); + } + break; + case 3: + xc = ( ((GLdouble) x / width) * (vxmax - vxmin) + vxmin ) / CTX.s[0]; + yc = ( vymax - ((GLdouble) y / height) * (vymax - vymin)) / CTX.s[1]; + set_t(0, xc-xc1); + set_t(1, yc-yc1); + set_t(2, 0.); + break; + } + Init(); + previous_mesh_draw = CTX.mesh.draw ; + previous_post_draw = CTX.post.draw ; + if(CTX.fast) CTX.mesh.draw = CTX.post.draw = 0; + Draw(); + CTX.mesh.draw = previous_mesh_draw ; + CTX.post.draw = previous_post_draw ; + } + else{ + process_selection(event->xbutton.x, event->xbutton.y, &hits, ii, jj); + ov = v; oc = c; os = s; + v = NULL; c = NULL; s = NULL; + filtre_selection(hits,ii,jj,&v,&c,&s,&M); + + if(CTX.overlay){ + glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context); + if(ov != v || oc != c || os != s) { + glClearIndex(0); + glClear(GL_COLOR_BUFFER_BIT); + glIndexi((CTX.color.bg<CTX.color.fg)?XCTX.xcolor.ovwhite:XCTX.xcolor.ovblack); + begin_highlight(); + highlight_entity(v,c,s,0); + end_highlight(0); + } + glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context); + } + else{ + if(ov != v || oc != c || os != s) { + if(CTX.geom.highlight){ + Init(); + Draw(); + } + begin_highlight(); + highlight_entity(v,c,s,0); + end_highlight(0); + } + } + } + x += movx; + y += movy; + } + break; + } +} diff --git a/Unix/CbMesh.cpp b/Unix/CbMesh.cpp new file mode 100644 index 0000000000000000000000000000000000000000..40952364ad2de3eac292b6ac23b5488a9da97288 --- /dev/null +++ b/Unix/CbMesh.cpp @@ -0,0 +1,297 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "CbMesh.h" +#include "Context.h" +#include "Widgets.h" + +extern Widgets_T WID; +extern Context_T CTX; +extern Mesh M; +extern char TheFileName[256]; + +extern char trsf_pts_text[100], trsf_type_text[100]; +extern char trsf_vol_text[100], char_length_text[100]; +extern char attrx_text[100], attry_text[100], attrz_text[100], attrdec_text[100]; + +/* ------------------------------------------------------------------------ */ +/* m e s h _ e v e n t _ h a n d l e r */ +/* ------------------------------------------------------------------------ */ + +#ifndef _NOTHREADS +#include <pthread.h> + +int MeshDim ; +pthread_t MeshThread ; +//pthread_mutex_t MeshMutex ; + +void* StartMeshThread(void * data){ + + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + // pthread_mutex_unlock(&MeshMutex); + + mai3d(&M,MeshDim); + Msg(STATUS,"Ready"); + CTX.mesh.draw = 1; + CTX.threads_lock = 0; + XtSetSensitive(WID.G.Butt[5], 0); + Init(); + Draw(); + pthread_exit(NULL); + return NULL ; +} + +void CancelMeshThread(void){ + if(CTX.threads){ + // pthread_mutex_lock(&MeshMutex); + // pthread_join(MeshThread,NULL); + // pthread_detach(MeshThread); + + pthread_cancel(MeshThread); + CTX.mesh.draw = 1; + CTX.threads_lock = 0; + XtSetSensitive(WID.G.Butt[5], 0); + Msg(INFO,"Mesh Aborted"); + mesh_event_handler(MESH_DELETE); + Msg(STATUS,"Ready"); + Init(); + Draw(); + } +} + +#else + +void CancelMeshThread(void){ + +} + +#endif + + + +void mesh_event_handler (int event) { + Vertex *v; + Curve *c; + Surface *s; + int ib; + static int n=0, p[100]; + + if(CTX.threads_lock) return ; + + switch (event) { + + case MESH_DELETE : + mai3d(&M, 0); + break; + + case MESH_1D : +#ifndef _NOTHREADS + if(CTX.threads){ + XtSetSensitive(WID.G.Butt[5], 1); + CTX.mesh.draw = 0; CTX.threads_lock = 1 ; MeshDim = 1 ; + // pthread_mutex_init(&MeshMutex,NULL); + // pthread_mutex_lock(&MeshMutex); + pthread_create(&MeshThread, NULL, StartMeshThread, NULL); + } + else +#endif + mai3d(&M, 1); + break; + + case MESH_2D : +#ifndef _NOTHREADS + if(CTX.threads){ + XtSetSensitive(WID.G.Butt[5], 1); + CTX.mesh.draw = 0; CTX.threads_lock = 1 ; MeshDim = 2 ; + // pthread_mutex_init(&MeshMutex,NULL); + // pthread_mutex_lock(&MeshMutex); + pthread_create(&MeshThread, NULL, StartMeshThread, NULL); + } + else +#endif + mai3d(&M, 2); + break; + + case MESH_3D : +#ifndef _NOTHREADS + if(CTX.threads){ + XtSetSensitive(WID.G.Butt[5], 1); + CTX.mesh.draw = 0; CTX.threads_lock = 1 ; MeshDim = 3 ; + // pthread_mutex_init(&MeshMutex,NULL); + // pthread_mutex_lock(&MeshMutex); + pthread_create(&MeshThread, NULL, StartMeshThread, NULL); + } + else +#endif + mai3d(&M, 3); + break; + + + case MESH_DEFINE_CHAR_LENGTH : + n=0; + while(1){ + Msg(STATUS,"Select Point: (e) to end, (q) to quit"); + ib = SelectEntity(ENT_POINT, &v,&c,&s); + if(ib == 1){ /* left mouse butt */ + p[n++] = v->Num; + } + if (ib == -1){ /* 'e' */ + if(n >= 1) { + add_charlength(n,p,TheFileName); break; + } + n=0; + ZeroHighlight(&M); + Replot(); + } + if(ib == 0){ /* 'q' */ + n=0 ; + ZeroHighlight(&M); + Replot(); + break; + } + } + break ; + + case MESH_DEFINE_RECOMBINE : + n=0; + while(1){ + Msg(STATUS,"Select Surface: (e) to end, (q) to quit"); + ib = SelectEntity(ENT_SURFACE, &v,&c,&s); + if(ib == 1){ /* left mouse butt */ + p[n++] = s->Num; + } + if (ib == -1){ /* 'e' */ + if(n >= 1) { + add_recosurf(n,p,TheFileName); break; + } + n=0; + ZeroHighlight(&M); + Replot(); + } + if(ib == 0){ /* 'q' */ + n=0 ; + ZeroHighlight(&M); + Replot(); + break; + } + } + break ; + + case MESH_DEFINE_TRSF_LINE : + case MESH_DEFINE_TRSF_SURFACE : + case MESH_DEFINE_TRSF_VOLUME : + n=0; + while(1){ + switch (event) { + case MESH_DEFINE_TRSF_LINE : + Msg(STATUS,"Select Line: (e) to end, (q) to quit"); + ib = SelectEntity(ENT_LINE, &v,&c,&s); + break ; + case MESH_DEFINE_TRSF_SURFACE : + Msg(STATUS,"Select Surface: (e) to end, (q) to quit"); + ib = SelectEntity(ENT_SURFACE, &v,&c,&s); + break; + case MESH_DEFINE_TRSF_VOLUME : + ib = 1; + break; + } + if(ib == 1){ /* left mouse butt */ + switch (event) { + case MESH_DEFINE_TRSF_LINE : p[n++] = c->Num ; break ; + case MESH_DEFINE_TRSF_SURFACE : p[n++] = s->Num; + case MESH_DEFINE_TRSF_VOLUME : + while(1){ + Msg(STATUS,"Select Point: (e) to end, (q) to quit"); + ib = SelectEntity(ENT_POINT, &v,&c,&s); + if(ib == 1){ /* left mouse butt */ + p[n++] = v->Num ; + } + if (ib == -1){ /* 'e' */ + switch (event) { + case MESH_DEFINE_TRSF_SURFACE : + if(n == 3+1 || n == 4+1) + add_trsfsurf(n,p,TheFileName); + else + Msg(INFO, "Wrong Number of Points for Transfinite Surface"); + break; + case MESH_DEFINE_TRSF_VOLUME : + if(n == 6 || n == 8) + add_trsfvol(n,p,TheFileName); + else + Msg(INFO, "Wrong Number of Points for Transfinite Volume"); + break; + } + n=0; + ZeroHighlight(&M); + Replot(); + break; + } + if(ib == 0){ /* 'q' */ + n=0 ; + ZeroHighlight(&M); + Replot(); + break; + } + } + break ; + } + } + if (ib == -1){ /* 'e' */ + if (event == MESH_DEFINE_TRSF_LINE){ + if(n >= 1) add_trsfline(n,p,TheFileName); + } + n=0; + ZeroHighlight(&M); + Replot(); + } + if(ib == 0){ /* 'q' */ + n=0 ; + ZeroHighlight(&M); + Replot(); + break; + } + } + break ; + + case MESH_DEFINE_ATTRACTOR_POINT : + case MESH_DEFINE_ATTRACTOR_LINE : + case MESH_DEFINE_ATTRACTOR_SURFACE : + Msg(WARNING, "Interactive Attractor Definition not Done..."); + break ; + + default : + Msg(WARNING, "Unkown event in mesh_event_handler"); + break; + } + + if(!CTX.threads){ + Msg(STATUS,"Ready"); + Init(); + Draw(); + } +} + +/* ------------------------------------------------------------------------ + M e s h C b + ------------------------------------------------------------------------ */ + +void MeshCb (Widget w, XtPointer client_data, XtPointer call_data){ + + switch((long int)client_data){ + + case MESH_TRSF_LINE_PTS : strcpy(trsf_pts_text,XmTextGetString(w)); break; + case MESH_TRSF_LINE_TYPE : strcpy(trsf_type_text,XmTextGetString(w)); break; + case MESH_TRSF_VOL_NUM : strcpy(trsf_vol_text,XmTextGetString(w)); break; + case MESH_CHAR_LENGTH : strcpy(char_length_text,XmTextGetString(w)); break; + case MESH_ATTRACTOR_X : strcpy(attrx_text,XmTextGetString(w)); break; + case MESH_ATTRACTOR_Y : strcpy(attry_text,XmTextGetString(w)); break; + case MESH_ATTRACTOR_Z : strcpy(attrz_text,XmTextGetString(w)); break; + default : + Msg(WARNING, "Unknown value in MeshCb : %d", (long int)client_data); + break; + + } +} diff --git a/Unix/CbMesh.h b/Unix/CbMesh.h new file mode 100644 index 0000000000000000000000000000000000000000..42599e572979fe343d2e8cdfb12bf65d3a93f218 --- /dev/null +++ b/Unix/CbMesh.h @@ -0,0 +1,32 @@ +#ifndef _CB_MESH_H_ +#define _CB_MESH_H_ + +/* mesh event handler */ + +#define MESH_DELETE 1 +#define MESH_1D 2 +#define MESH_2D 3 +#define MESH_3D 4 +#define MESH_DEFINE_CHAR_LENGTH 5 +#define MESH_DEFINE_TRSF_LINE 6 +#define MESH_DEFINE_TRSF_SURFACE 7 +#define MESH_DEFINE_TRSF_VOLUME 8 +#define MESH_DEFINE_RECOMBINE 9 +#define MESH_DEFINE_ATTRACTOR_POINT 10 +#define MESH_DEFINE_ATTRACTOR_LINE 11 +#define MESH_DEFINE_ATTRACTOR_SURFACE 12 + +/* MeshCb */ + +#define MESH_TRSF_LINE_PTS 100 +#define MESH_TRSF_LINE_TYPE 101 +#define MESH_TRSF_VOL_NUM 102 +#define MESH_CHAR_LENGTH 103 +#define MESH_ATTRACTOR_X 104 +#define MESH_ATTRACTOR_Y 105 +#define MESH_ATTRACTOR_Z 106 + +void CancelMeshThread(void); +void mesh_event_handler (int event); + +#endif diff --git a/Unix/CbOptions.cpp b/Unix/CbOptions.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ef771d3cfb7c8559d2e3f48a87ebdacdd983b14d --- /dev/null +++ b/Unix/CbOptions.cpp @@ -0,0 +1,313 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Verif.h" +#include "Mesh.h" +#include "Draw.h" +#include "Widgets.h" +#include "Pixmaps.h" +#include "Context.h" +#include "XContext.h" +#include "Register.h" + +#include "CbGeneral.h" +#include "CbOptions.h" +#include "CbGeom.h" +#include "CbMesh.h" +#include "CbPost.h" + +#include <sys/time.h> +#include <unistd.h> + +extern Context_T CTX; +extern XContext_T XCTX ; +extern Widgets_T WID; +extern Pixmaps_T PIX; +extern Mesh M; +extern Tree_T *EntitesVisibles; +extern double LC; +extern int ACTUAL_ENTITY, SHOW_ALL; + +static int stop_anim ; +static long anim_time ; + +/* ------------------------------------------------------------------------ + O p t i o n s C b + ------------------------------------------------------------------------ */ + +long Get_AnimTime(){ + struct timeval tp; + gettimeofday(&tp, (struct timezone *) 0); + return (long)tp.tv_sec * 1000000 + (long)tp.tv_usec; +} + +void OptionsCb (Widget w, XtPointer client_data, XtPointer call_data){ + int i, e; + char *c, label[32]; + XWindowAttributes xattrib; + XEvent event; + + switch((long int)client_data){ + + /* globales */ + + case OPTIONS_REPLOT : Init(); Draw(); break; + case OPTIONS_AXES : CTX.axes = !CTX.axes; break; + case OPTIONS_LITTLE_AXES : CTX.little_axes = !CTX.little_axes; break; + case OPTIONS_FAST_REDRAW : CTX.fast = !CTX.fast ; break ; + case OPTIONS_DISPLAY_LISTS : CTX.display_lists = !CTX.display_lists ; break ; + case OPTIONS_ALPHA_BLENDING: CTX.alpha = !CTX.alpha; break; + case OPTIONS_COLOR_SCHEME_SCALE: + XmScaleGetValue(WID.OD.miscColorSchemeScale, &e); InitColors(&CTX.color, e); + Init(); Draw(); + break ; + case OPTIONS_ORTHOGRAPHIC : CTX.ortho = 1; break; + case OPTIONS_PERSPECTIVE : CTX.ortho = 0; break; + case OPTIONS_LIGHT_X_SCALE : + XmScaleGetValue(WID.OD.miscLightScale[0], &e); CTX.light0[0] = 0.04*e ; + MarkAllViewsChanged (0); break ; + case OPTIONS_LIGHT_Y_SCALE : + XmScaleGetValue(WID.OD.miscLightScale[1], &e); CTX.light0[1] = 0.04*e ; + MarkAllViewsChanged (0); break ; + case OPTIONS_LIGHT_Z_SCALE : + XmScaleGetValue(WID.OD.miscLightScale[2], &e); CTX.light0[2] = 0.04*e ; + MarkAllViewsChanged (0);break ; + case OPTIONS_SHINE_SCALE : + XmScaleGetValue(WID.OD.miscShineScale, &e); CTX.shine = 0.04*e ; + MarkAllViewsChanged (0);break ; + case OPTIONS_SCALEX : CTX.s[0] = (GLdouble)atof(XmTextGetString(w)); break; + case OPTIONS_SCALEY : CTX.s[1] = (GLdouble)atof(XmTextGetString(w)); break; + case OPTIONS_SCALEZ : CTX.s[2] = (GLdouble)atof(XmTextGetString(w)); break; + case OPTIONS_TRANX : CTX.t[0] = (GLdouble)atof(XmTextGetString(w)); break; + case OPTIONS_TRANY : CTX.t[1] = (GLdouble)atof(XmTextGetString(w)); break; + case OPTIONS_TRANZ : CTX.t[2] = (GLdouble)atof(XmTextGetString(w)); break; + case OPTIONS_ROTX : CTX.r[0] = (GLdouble)atof(XmTextGetString(w)); break; + case OPTIONS_ROTY : CTX.r[1] = (GLdouble)atof(XmTextGetString(w)); break; + case OPTIONS_ROTZ : CTX.r[2] = (GLdouble)atof(XmTextGetString(w)); break; + case OPTIONS_ROTX_LOCKED : CTX.rlock[0] = !CTX.rlock[0]; break; + case OPTIONS_ROTY_LOCKED : CTX.rlock[1] = !CTX.rlock[1]; break; + case OPTIONS_ROTZ_LOCKED : CTX.rlock[2] = !CTX.rlock[2]; break; + case OPTIONS_TRANX_LOCKED : CTX.tlock[0] = !CTX.tlock[0]; break; + case OPTIONS_TRANY_LOCKED : CTX.tlock[1] = !CTX.tlock[1]; break; + case OPTIONS_TRANZ_LOCKED : CTX.tlock[2] = !CTX.tlock[2]; break; + case OPTIONS_SCALEX_LOCKED : CTX.slock[0] = !CTX.slock[0]; break; + case OPTIONS_SCALEY_LOCKED : CTX.slock[1] = !CTX.slock[1]; break; + case OPTIONS_SCALEZ_LOCKED : CTX.slock[2] = !CTX.slock[2]; break; + case OPTIONS_XVIEW : set_r(0,0.); set_r(1,90.);set_r(2,0.); Init(); Draw(); break; + case OPTIONS_YVIEW : set_r(0,-90.);set_r(1,0.); set_r(2,0.); Init(); Draw(); break; + case OPTIONS_ZVIEW : set_r(0,0.); set_r(1,0.); set_r(2,0.); Init(); Draw(); break; + case OPTIONS_CVIEW : set_t(0,0.); set_t(1,0.); set_t(2,0.); + set_s(0,1.); set_s(1,1.); set_s(2,1.); Init(); Draw(); break; + case OPTIONS_PVIEW : + XGetWindowAttributes(XtDisplay(WID.G.shell),XtWindow(WID.G.shell),&xattrib); + fprintf(stderr, "-geometry %dx%d -viewport %g %g %g %g %g %g %g %g %g\n", + xattrib.width, xattrib.height, + CTX.r[0],CTX.r[1],CTX.r[2], + CTX.t[0],CTX.t[1],CTX.t[2], + CTX.s[0],CTX.s[1],CTX.s[2]); + break ; + + /* print */ + + case OPTIONS_PRINT_XDUMP : CTX.print.type = XDUMP; CTX.print.format = FORMAT_XPM; break; + case OPTIONS_PRINT_GIF : CTX.print.type = GIF; CTX.print.format = FORMAT_GIF; break; + case OPTIONS_PRINT_GLPPAINTER : CTX.print.type = GLPPAINTER; CTX.print.format = FORMAT_EPS; break; + case OPTIONS_PRINT_GLPRECURSIVE : CTX.print.type = GLPRECURSIVE; CTX.print.format = FORMAT_EPS; break; + case OPTIONS_PRINT_GLPIMAGE : CTX.print.type = GLPIMAGE; CTX.print.format = FORMAT_EPS; break; + case OPTIONS_PRINT_GL2PS_SIMPLE : CTX.print.type = GLPRPAINTER; CTX.print.format = FORMAT_EPS;break; + case OPTIONS_PRINT_GL2PS_COMPLEX: CTX.print.type = GLPRRECURSIVE; CTX.print.format = FORMAT_EPS;break; + case OPTIONS_PRINT_GL2PS_IMAGE : CTX.print.type = XDUMP; CTX.print.format = FORMAT_EPS;break; + + /* geometrie */ + + case OPTIONS_GEOM_CHECK : /* Print_Geo(&M,filename); */ break; + case OPTIONS_GEOM_VISIBILITY_ENTITY : + CTX.geom.vis_type = 0; + XtVaSetValues(WID.OD.geomVisibleButt[0], XmNset, CTX.geom.points?True:False, NULL); + XtVaSetValues(WID.OD.geomVisibleButt[1], XmNset, CTX.geom.lines?True:False, NULL); + XtVaSetValues(WID.OD.geomVisibleButt[2], XmNset, CTX.geom.surfaces?True:False, NULL); + XtVaSetValues(WID.OD.geomVisibleButt[3], XmNset, CTX.geom.volumes?True:False, NULL); + for(i=0;i<4;i++)XmUpdateDisplay(WID.OD.geomVisibleButt[i]); + break; + case OPTIONS_GEOM_VISIBILITY_NUMBER : + CTX.geom.vis_type = 1; + XtVaSetValues(WID.OD.geomVisibleButt[0], XmNset, CTX.geom.points_num?True:False, NULL); + XtVaSetValues(WID.OD.geomVisibleButt[1], XmNset, CTX.geom.lines_num?True:False, NULL); + XtVaSetValues(WID.OD.geomVisibleButt[2], XmNset, CTX.geom.surfaces_num?True:False, NULL); + XtVaSetValues(WID.OD.geomVisibleButt[3], XmNset, CTX.geom.volumes_num?True:False, NULL); + for(i=0;i<4;i++)XmUpdateDisplay(WID.OD.geomVisibleButt[i]); + break; + case OPTIONS_GEOM_POINTS : + if(!CTX.geom.vis_type) CTX.geom.points = !CTX.geom.points; + else CTX.geom.points_num = !CTX.geom.points_num; break; + case OPTIONS_GEOM_LINES : + if(!CTX.geom.vis_type) CTX.geom.lines = !CTX.geom.lines; + else CTX.geom.lines_num = !CTX.geom.lines_num; break; + case OPTIONS_GEOM_SURFACES : + if(!CTX.geom.vis_type) CTX.geom.surfaces = !CTX.geom.surfaces; + else CTX.geom.surfaces_num = !CTX.geom.surfaces_num; break; + case OPTIONS_GEOM_VOLUMES : + if(!CTX.geom.vis_type) CTX.geom.volumes = !CTX.geom.volumes; + else CTX.geom.volumes_num = !CTX.geom.volumes_num; break; + case OPTIONS_GEOM_NORMALS_SCALE : + XmScaleGetValue(WID.OD.geomNormalsScale, &e); CTX.geom.normals = e ; + sprintf(label,"%g",CTX.geom.normals); + XtVaSetValues(WID.OD.geomNormalsText, XmNvalue, label, NULL); + XmUpdateDisplay(WID.OD.geomNormalsText); break; + case OPTIONS_GEOM_NORMALS_TEXT : + CTX.geom.normals = atof(XmTextGetString(w)); + XtVaSetValues(WID.OD.geomNormalsScale, XmNvalue, + THRESHOLD((int)CTX.geom.normals,0,100), NULL); + XmUpdateDisplay(WID.OD.geomNormalsScale); break; + case OPTIONS_GEOM_TANGENTS_SCALE : + XmScaleGetValue(WID.OD.geomTangentsScale, &e); CTX.geom.tangents = e ; + sprintf(label,"%g",CTX.geom.tangents); + XtVaSetValues(WID.OD.geomTangentsText, XmNvalue, label, NULL); + XmUpdateDisplay(WID.OD.geomTangentsText); break; + case OPTIONS_GEOM_TANGENTS_TEXT : + CTX.geom.tangents = atof(XmTextGetString(w)); + XtVaSetValues(WID.OD.geomTangentsScale, XmNvalue, + THRESHOLD((int)CTX.geom.tangents,0,100), NULL); + XmUpdateDisplay(WID.OD.geomTangentsScale); break; + + + /* mesh */ + + case OPTIONS_MESH_SHADING : CTX.mesh.hidden = 1; CTX.mesh.shade = 1; break; + case OPTIONS_MESH_HIDDEN_LINES : CTX.mesh.hidden = 1; CTX.mesh.shade = 0; break; + case OPTIONS_MESH_WIREFRAME : CTX.mesh.hidden = 0; CTX.mesh.shade = 0; break; + case OPTIONS_MESH_VISIBILITY_ENTITY : + CTX.mesh.vis_type = 0; + XtVaSetValues(WID.OD.meshVisibleButt[0], XmNset, CTX.mesh.points?True:False, NULL); + XtVaSetValues(WID.OD.meshVisibleButt[1], XmNset, CTX.mesh.lines?True:False, NULL); + XtVaSetValues(WID.OD.meshVisibleButt[2], XmNset, CTX.mesh.surfaces?True:False, NULL); + XtVaSetValues(WID.OD.meshVisibleButt[3], XmNset, CTX.mesh.volumes?True:False, NULL); + for(i=0;i<4;i++)XmUpdateDisplay(WID.OD.meshVisibleButt[i]); + break; + case OPTIONS_MESH_VISIBILITY_NUMBER : + CTX.mesh.vis_type = 1; + XtVaSetValues(WID.OD.meshVisibleButt[0], XmNset, CTX.mesh.points_num?True:False, NULL); + XtVaSetValues(WID.OD.meshVisibleButt[1], XmNset, CTX.mesh.lines_num?True:False, NULL); + XtVaSetValues(WID.OD.meshVisibleButt[2], XmNset, CTX.mesh.surfaces_num?True:False, NULL); + XtVaSetValues(WID.OD.meshVisibleButt[3], XmNset, CTX.mesh.volumes_num?True:False, NULL); + for(i=0;i<4;i++)XmUpdateDisplay(WID.OD.meshVisibleButt[i]); + break; + case OPTIONS_MESH_POINTS : + if(!CTX.mesh.vis_type) CTX.mesh.points = !CTX.mesh.points; + else CTX.mesh.points_num = !CTX.mesh.points_num; break; + case OPTIONS_MESH_LINES : + if(!CTX.mesh.vis_type) CTX.mesh.lines = !CTX.mesh.lines; + else CTX.mesh.lines_num = !CTX.mesh.lines_num; break; + case OPTIONS_MESH_SURFACES : + if(!CTX.mesh.vis_type) CTX.mesh.surfaces = !CTX.mesh.surfaces; + else CTX.mesh.surfaces_num = !CTX.mesh.surfaces_num; break; + case OPTIONS_MESH_VOLUMES : + if(!CTX.mesh.vis_type) CTX.mesh.volumes = !CTX.mesh.volumes; + else CTX.mesh.volumes_num = !CTX.mesh.volumes_num; break; + case OPTIONS_MESH_FORMAT_MSH : CTX.mesh.format = FORMAT_MSH ; break ; + case OPTIONS_MESH_FORMAT_UNV : CTX.mesh.format = FORMAT_UNV ; break ; + case OPTIONS_MESH_FORMAT_GREF : CTX.mesh.format = FORMAT_GREF ; break ; + case OPTIONS_MESH_DEGRE2 : + (CTX.mesh.degree==2) ? CTX.mesh.degree=1 : CTX.mesh.degree=2; break ; + case OPTIONS_MESH_ANISOTROPIC : + (CTX.mesh.algo==DELAUNAY_OLDALGO) ? + CTX.mesh.algo=DELAUNAY_NEWALGO : + CTX.mesh.algo=DELAUNAY_OLDALGO; break ; + case OPTIONS_MESH_SMOOTHING_SCALE : + XmScaleGetValue(WID.OD.meshSmoothingScale, &e); CTX.mesh.nb_smoothing = e ; + sprintf(label,"%d",CTX.mesh.nb_smoothing); + XtVaSetValues(WID.OD.meshSmoothingText, XmNvalue, label, NULL); + XmUpdateDisplay(WID.OD.meshSmoothingText); break; + case OPTIONS_MESH_SMOOTHING_TEXT : + CTX.mesh.nb_smoothing = atoi(XmTextGetString(w)); + XtVaSetValues(WID.OD.meshSmoothingScale, XmNvalue, + THRESHOLD(CTX.mesh.nb_smoothing,0,100), NULL); + XmUpdateDisplay(WID.OD.meshSmoothingScale); break; + case OPTIONS_MESH_EXPLODE_SCALE : + XmScaleGetValue(WID.OD.meshExplodeScale, &e); CTX.mesh.explode = 0.01*e ; + sprintf(label,"%g",CTX.mesh.explode); + XtVaSetValues(WID.OD.meshExplodeText, XmNvalue, label, NULL); + XmUpdateDisplay(WID.OD.meshExplodeText); break; + case OPTIONS_MESH_EXPLODE_TEXT : + CTX.mesh.explode = atof(XmTextGetString(w)); + XtVaSetValues(WID.OD.meshExplodeScale, XmNvalue, + THRESHOLD((int)(100*CTX.mesh.explode),0,100), NULL); + XmUpdateDisplay(WID.OD.meshExplodeScale); break; + case OPTIONS_MESH_NORMALS_SCALE : + XmScaleGetValue(WID.OD.meshNormalsScale, &e); CTX.mesh.normals = e ; + sprintf(label,"%g",CTX.mesh.normals); + XtVaSetValues(WID.OD.meshNormalsText, XmNvalue, label, NULL); + XmUpdateDisplay(WID.OD.meshNormalsText); break; + case OPTIONS_MESH_NORMALS_TEXT : + CTX.mesh.normals = atof(XmTextGetString(w)); + XtVaSetValues(WID.OD.meshNormalsScale, XmNvalue, + THRESHOLD((int)CTX.mesh.normals,0,100), NULL); + XmUpdateDisplay(WID.OD.meshNormalsScale); break; + case OPTIONS_MESH_ABORT : + CancelMeshThread(); + break; + + /* post */ + + case OPTIONS_POST_LINK_NONE : CTX.post.link = 0; break; + case OPTIONS_POST_LINK_VISIBLE : CTX.post.link = 1; break; + case OPTIONS_POST_LINK_ALL : CTX.post.link = 2; break; + case OPTIONS_POST_ANIM_START: + stop_anim = 0 ; + Set_AnimPixmap(&WID, &PIX, 0) ; + Set_AnimCallback(&WID, 0) ; + anim_time = Get_AnimTime(); + while(1){ + if(XtAppPending(XCTX.AppContext)){ + XtAppNextEvent(XCTX.AppContext,&event); + XtDispatchEvent(&event); + if(stop_anim) break ; + } + else{ + if(Get_AnimTime() - anim_time > CTX.post.anim_delay){ + anim_time = Get_AnimTime(); + MarkAllViewsChanged(2); + Init(); Draw(); + } + } + } + break ; + case OPTIONS_POST_ANIM_STOP: + stop_anim = 1; + Set_AnimPixmap(&WID, &PIX, 1) ; + Set_AnimCallback(&WID, 1) ; + break ; + case OPTIONS_POST_ANIM_DELAY: + XmScaleGetValue(WID.OD.postAnimScale, &e); + CTX.post.anim_delay = (long)(1.e5*e) ; + break ; + + /* mesh + geom : a changer...*/ + case OPTIONS_GEOM_HIDE_SHOW : + case OPTIONS_MESH_HIDE_SHOW : + c = XmTextGetString(w); + if (!strcmp(c,"all") || !strcmp(c,"*")){ + if(SHOW_ALL){ + RemplirEntitesVisibles(0); SHOW_ALL = 0; + } + else { + RemplirEntitesVisibles(1); SHOW_ALL = 1; + } + } + else{ + ACTUAL_ENTITY = atoi(c); + if(EntiteEstElleVisible(ACTUAL_ENTITY)) + ToutesLesEntitesRelatives(ACTUAL_ENTITY,EntitesVisibles,0); + else + ToutesLesEntitesRelatives(ACTUAL_ENTITY,EntitesVisibles,1); + } + break; + + default : + Msg(WARNING, "Unknown value in OptionsCb : %d", (long int)client_data); + break; + } + +} + diff --git a/Unix/CbOptions.h b/Unix/CbOptions.h new file mode 100644 index 0000000000000000000000000000000000000000..e30741453e3a4cafa5acc8d8a54dfa395050fce1 --- /dev/null +++ b/Unix/CbOptions.h @@ -0,0 +1,105 @@ +#ifndef _CB_OPTIONS_H_ +#define _CB_OPTIONS_H_ + +/* options globales */ + +#define OPTIONS_REPLOT 1 +#define OPTIONS_AXES 2 +#define OPTIONS_LITTLE_AXES 3 +#define OPTIONS_XVIEW 4 +#define OPTIONS_YVIEW 5 +#define OPTIONS_ZVIEW 6 +#define OPTIONS_CVIEW 7 +#define OPTIONS_PVIEW 8 +#define OPTIONS_SCALEX 9 +#define OPTIONS_SCALEY 10 +#define OPTIONS_SCALEZ 11 +#define OPTIONS_ROTX 12 +#define OPTIONS_ROTY 13 +#define OPTIONS_ROTZ 14 +#define OPTIONS_TRANX 15 +#define OPTIONS_TRANY 16 +#define OPTIONS_TRANZ 17 +#define OPTIONS_ROTX_LOCKED 18 +#define OPTIONS_ROTY_LOCKED 19 +#define OPTIONS_ROTZ_LOCKED 20 +#define OPTIONS_TRANX_LOCKED 21 +#define OPTIONS_TRANY_LOCKED 22 +#define OPTIONS_TRANZ_LOCKED 23 +#define OPTIONS_SCALEX_LOCKED 24 +#define OPTIONS_SCALEY_LOCKED 25 +#define OPTIONS_SCALEZ_LOCKED 26 +#define OPTIONS_ORTHOGRAPHIC 27 +#define OPTIONS_PERSPECTIVE 28 +#define OPTIONS_LIGHT_X_SCALE 29 +#define OPTIONS_LIGHT_Y_SCALE 30 +#define OPTIONS_LIGHT_Z_SCALE 31 +#define OPTIONS_SHINE_SCALE 32 +#define OPTIONS_ALPHA_BLENDING 33 +#define OPTIONS_DISPLAY_LISTS 34 +#define OPTIONS_FAST_REDRAW 35 +#define OPTIONS_COLOR_SCHEME_SCALE 36 + +/* options geometrie */ + +#define OPTIONS_GEOM_CHECK 100 +#define OPTIONS_GEOM_POINTS 101 +#define OPTIONS_GEOM_LINES 102 +#define OPTIONS_GEOM_SURFACES 103 +#define OPTIONS_GEOM_VOLUMES 104 +#define OPTIONS_GEOM_NORMALS_SCALE 105 +#define OPTIONS_GEOM_NORMALS_TEXT 106 +#define OPTIONS_GEOM_TANGENTS_SCALE 107 +#define OPTIONS_GEOM_TANGENTS_TEXT 108 +#define OPTIONS_GEOM_HIDE_SHOW 109 +#define OPTIONS_GEOM_VISIBILITY_ENTITY 110 +#define OPTIONS_GEOM_VISIBILITY_NUMBER 111 + +/* options mesh */ + +#define OPTIONS_MESH_POINTS 200 +#define OPTIONS_MESH_LINES 201 +#define OPTIONS_MESH_SURFACES 202 +#define OPTIONS_MESH_VOLUMES 203 +#define OPTIONS_MESH_HIDDEN_LINES 204 +#define OPTIONS_MESH_SHADING 205 +#define OPTIONS_MESH_WIREFRAME 206 +#define OPTIONS_MESH_NORMALS_SCALE 207 +#define OPTIONS_MESH_NORMALS_TEXT 208 +#define OPTIONS_MESH_TANGENTS_SCALE 209 +#define OPTIONS_MESH_TANGENTS_TEXT 210 +#define OPTIONS_MESH_EXPLODE_SCALE 211 +#define OPTIONS_MESH_EXPLODE_TEXT 212 +#define OPTIONS_MESH_FORMAT_MSH 213 +#define OPTIONS_MESH_FORMAT_UNV 214 +#define OPTIONS_MESH_FORMAT_GREF 215 +#define OPTIONS_MESH_HIDE_SHOW 216 +#define OPTIONS_MESH_ABORT 217 +#define OPTIONS_MESH_SMOOTHING_SCALE 218 +#define OPTIONS_MESH_SMOOTHING_TEXT 219 +#define OPTIONS_MESH_DEGRE2 220 +#define OPTIONS_MESH_ANISOTROPIC 221 +#define OPTIONS_MESH_VISIBILITY_ENTITY 222 +#define OPTIONS_MESH_VISIBILITY_NUMBER 223 + +/* options post */ + +#define OPTIONS_POST_LINK_NONE 300 +#define OPTIONS_POST_LINK_VISIBLE 301 +#define OPTIONS_POST_LINK_ALL 302 +#define OPTIONS_POST_ANIM_START 303 +#define OPTIONS_POST_ANIM_STOP 304 +#define OPTIONS_POST_ANIM_DELAY 305 + +/* options print */ + +#define OPTIONS_PRINT_XDUMP 400 +#define OPTIONS_PRINT_GLPPAINTER 401 +#define OPTIONS_PRINT_GLPRECURSIVE 402 +#define OPTIONS_PRINT_GLPIMAGE 403 +#define OPTIONS_PRINT_GL2PS_SIMPLE 404 +#define OPTIONS_PRINT_GL2PS_COMPLEX 405 +#define OPTIONS_PRINT_GL2PS_IMAGE 406 +#define OPTIONS_PRINT_GIF 407 + +#endif diff --git a/Unix/CbPost.cpp b/Unix/CbPost.cpp new file mode 100644 index 0000000000000000000000000000000000000000..67db8d958b99925680457a6ad459cc7d9de2f6e3 --- /dev/null +++ b/Unix/CbPost.cpp @@ -0,0 +1,669 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Mesh.h" +#include "Draw.h" +#include "Views.h" +#include "ColorTable.h" +#include "Widgets.h" +#include "Context.h" +#include "XContext.h" +#include "Main.h" + +#include "CbPost.h" +#include "CbGeom.h" +#include "CbMesh.h" +#include "CbColorbar.h" + + +extern Widgets_T WID ; +extern Context_T CTX ; +extern XContext_T XCTX ; +extern Mesh *THEM; +extern int TYPBGMESH; +extern int LC_ORDER; +extern List_T *Post_ViewList; + + +static double ADAPTATION_ERROR=10. ; +static int ADAPTATION_METHOD=3 ; +static int OFFSET_MODE = 0; +static Post_View *CurrentView = NULL; +static long int CurrentViewNumber = -1; +static Post_View *ViewForDialog[10]; + +/* ------------------------------------------------------------------------ + set view visible or not + ------------------------------------------------------------------------ */ + +void MarkAllViewsChanged (int action){ + int i; + char label[256]; + Post_View *v; + + for(i = 0 ; i< List_Nbr(Post_ViewList) ; i++){ + v = (Post_View*)List_Pointer(Post_ViewList, i); + switch(action){ + case 1: // toggle drawing mode + if(v->IntervalsType == DRAW_POST_ISO) + v->IntervalsType = DRAW_POST_DISCRETE ; + else if(v->IntervalsType == DRAW_POST_DISCRETE) + v->IntervalsType = DRAW_POST_CONTINUOUS ; + else + v->IntervalsType = DRAW_POST_ISO ; + break; + case 2: // time step++ + if(v->TimeStep < v->NbTimeStep-1) + v->TimeStep++ ; + else + v->TimeStep = 0 ; + sprintf(label, "%d", v->TimeStep); + XtVaSetValues(WID.PD.timeStepScale, XmNvalue, v->TimeStep, NULL); + XmUpdateDisplay(WID.PD.timeStepScale); + XtVaSetValues(WID.PD.timeStepText, XmNvalue, label, NULL); + XmUpdateDisplay(WID.PD.timeStepText); + break; + case 3: // time step-- + if(v->TimeStep > 0) + v->TimeStep-- ; + else + v->TimeStep = v->NbTimeStep-1 ; + sprintf(label, "%d", v->TimeStep); + XtVaSetValues(WID.PD.timeStepScale, XmNvalue, v->TimeStep, NULL); + XmUpdateDisplay(WID.PD.timeStepScale); + XtVaSetValues(WID.PD.timeStepText, XmNvalue, label, NULL); + XmUpdateDisplay(WID.PD.timeStepText); + break; + default : + break; + } + + v->Changed = 1 ; + } +} + +void SwapViewCb (Widget w, XtPointer client_data, XtPointer call_data){ + Post_View *v ; + + if(!Post_ViewList) return; + + v = (Post_View*)List_Pointer(Post_ViewList,(long int)client_data-1); + v->Visible = !v->Visible; + + Init(); + Draw(); +} + +void DuplicateViewCb (Widget w, XtPointer client_data, XtPointer call_data){ + Post_View *v1, *v2 ; + + if(!Post_ViewList) return; + + v1 = (Post_View*)List_Pointer(Post_ViewList,(long int)client_data-1); + + BeginView(0); + EndView(v1->Name, 0., 0., 0.); + + /* Trash: interdit de desallouer cette view-ci car il existe un duplicata qque part. + A changer : garder le num du duplicata et desallouer si ce duplicata n'existe plus, + etc, etc... */ + v1->Allocated = 0 ; + + v2 = (Post_View*)List_Pointer(Post_ViewList,List_Nbr(Post_ViewList)-1); + + v2->Simplices = v1->Simplices; + v2->Triangles = v1->Triangles; + v2->Lines = v1->Lines; + v2->Points = v1->Points; + v2->ScalarOnly = v1->ScalarOnly; + v2->Min = v1->Min; + v2->Max = v1->Max; + v2->NbTimeStep = v1->NbTimeStep; + v2->CustomMin = v1->CustomMin; + v2->CustomMax = v1->CustomMax; + + Init(); + Draw(); +} + +void SaveColorTable(FILE *fp){ + if(!CurrentView){ + Msg(WARNING, "No View to get Color Information from"); + } + else{ + save_color_table(fp, &CurrentView->CT); + } +} + +/* ------------------------------------------------------------------------ + create a post dialog + ------------------------------------------------------------------------ */ + +void CurrentViewCb (Widget w, XtPointer client_data, XtPointer call_data){ + CurrentViewNumber = (long int)client_data; + CurrentView = (Post_View*)List_Pointer(Post_ViewList, CurrentViewNumber-1); +} + +void PostDialogCb (Widget w, XtPointer client_data, XtPointer call_data){ + double d, sfact; + char label[256]; + int nb, i; + Post_View *v; + + v = CurrentView ; + + /* le slider (gradue en interne de -100 a 100) va de -LC a +LC */ + sfact = pow(10.,2.-LC_ORDER); + + sprintf(label, "\"%s\" (%ld)", v->Name, CurrentViewNumber); + + switch((long int)client_data){ + + /* Toggle Lightning */ + case POST_LIGHT: + v->Light = !v->Light; + v->Changed = 1; + Init() ; + Draw() ; + break; + + /* Toggle Show Elements */ + case POST_ELEMENT: + v->ShowElement = !v->ShowElement; + v->Changed = 1; + Init() ; + Draw() ; + break; + + /* Offset */ + case POST_OFFSET: + ViewForDialog[POST_OFFSET] = v; + XtVaSetValues(WID.PD.offsetDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL); + XtVaSetValues(WID.PD.offsetModeButt[0], XmNset, (OFFSET_MODE==0)?True:False, NULL); + XtVaSetValues(WID.PD.offsetModeButt[1], XmNset, (OFFSET_MODE==1)?True:False, NULL); + for(i=0 ; i<3 ; i++){ + d = (OFFSET_MODE==1)?v->Raise[i]:v->Offset[i] ; + sprintf(label, "%g", d); + XtVaSetValues(WID.PD.offsetText[i], XmNvalue, label, NULL); + XtVaSetValues(WID.PD.offsetScale[i], XmNvalue, THRESHOLD((int)(sfact*d),-100,100), NULL); + } + XtManageChild(WID.PD.offsetDialog); + break; + + /* Time Step */ + case POST_TIME_STEP: + ViewForDialog[POST_TIME_STEP] = v; + XtVaSetValues(WID.PD.timeStepDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL); + XtVaSetValues(WID.PD.timeStepScale, XmNmaximum, v->NbTimeStep-1, XmNvalue, v->TimeStep, NULL); + sprintf(label, "%d", v->TimeStep); + XtVaSetValues(WID.PD.timeStepText, XmNvalue, label, NULL); + XtManageChild(WID.PD.timeStepDialog); + break; + + /* Scale */ + case POST_SCALE: + ViewForDialog[POST_SCALE] = v; + XtVaSetValues(WID.PD.scaleDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL); + + XtVaSetValues(WID.PD.scaleShowButt, XmNset, v->ShowScale?True:False, NULL); + XtVaSetValues(WID.PD.scaleTransButt, XmNset, v->TransparentScale?True:False, NULL); + + XtVaSetValues(WID.PD.scaleText[0], XmNvalue, v->Format, NULL); + XtSetSensitive(WID.PD.scaleText[0], v->ShowScale?1:0); + XtVaSetValues(WID.PD.scaleText[1], XmNvalue, v->Name, NULL); + XtSetSensitive(WID.PD.scaleText[1], v->ShowScale?1:0); + + XtVaSetValues(WID.PD.scaleRangeButt, XmNset, (v->RangeType==DRAW_POST_CUSTOM)?True:False, NULL); + sprintf(label, v->Format, v->CustomMin); + XtVaSetValues(WID.PD.scaleRangeText[0], XmNvalue, label, NULL); + sprintf(label, v->Format, v->CustomMax); + XtVaSetValues(WID.PD.scaleRangeText[1], XmNvalue, label, NULL); + XtSetSensitive(WID.PD.scaleRangeText[0], (v->RangeType==DRAW_POST_CUSTOM)?1:0); + XtSetSensitive(WID.PD.scaleRangeText[1], (v->RangeType==DRAW_POST_CUSTOM)?1:0); + + XtVaSetValues(WID.PD.scaleTypeButt[0], XmNset,(v->ScaleType==DRAW_POST_LINEAR)?True:False, NULL); + XtVaSetValues(WID.PD.scaleTypeButt[1], XmNset,(v->ScaleType==DRAW_POST_LOGARITHMIC)?True:False, NULL); + + XtVaSetValues(WID.PD.scaleIntervalsButt[0], XmNset, + (v->IntervalsType==DRAW_POST_ISO)?True:False, NULL); + XtVaSetValues(WID.PD.scaleIntervalsButt[1], XmNset, + (v->IntervalsType==DRAW_POST_DISCRETE)?True:False, NULL); + XtVaSetValues(WID.PD.scaleIntervalsButt[2], XmNset, + (v->IntervalsType==DRAW_POST_CONTINUOUS)?True:False, NULL); + XtVaSetValues(WID.PD.scaleIntervalsButt[3], XmNset, + (v->IntervalsType==DRAW_POST_NUMERIC)?True:False, NULL); + XtVaSetValues(WID.PD.scaleIntervalsScale, XmNvalue, THRESHOLD((int)v->NbIso,1,100), NULL); + + sprintf(label, "%d", v->NbIso); + XtVaSetValues(WID.PD.scaleIntervalsText, XmNvalue, label, NULL); + + XtManageChild(WID.PD.scaleDialog); + break; + + /* Color */ + case POST_COLOR: + ViewForDialog[POST_COLOR] = v; + XtVaSetValues(WID.PD.colorDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL); + XtManageChild(WID.PD.colorDialog); + + XSelectInput(XCTX.display, XtWindow(WID.PD.colorDrawingArea), EV_MASK); + ColorBarCreate(XtWindow(WID.PD.colorDrawingArea),255,200); + ColorBarChange(v->Name, + (v->RangeType==DRAW_POST_CUSTOM)?v->CustomMin:v->Min, + (v->RangeType==DRAW_POST_CUSTOM)?v->CustomMax:v->Max, + &v->CT, 1); + ColorBarResizeCb((Widget)NULL, NULL, NULL); // Force resize + ColorBarShow(); + break; + + /* Vector */ + case POST_VECTOR: + ViewForDialog[POST_VECTOR] = v; + XtVaSetValues(WID.PD.vectorDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL); + XtVaSetValues(WID.PD.vectorTypeButt[0], XmNset, (v->ArrowType == DRAW_POST_SEGMENT)?True:False, NULL); + XtVaSetValues(WID.PD.vectorTypeButt[1], XmNset, (v->ArrowType == DRAW_POST_ARROW)?True:False, NULL); + XtVaSetValues(WID.PD.vectorTypeButt[2], XmNset, (v->ArrowType == DRAW_POST_PYRAMID)?True:False, NULL); + XtVaSetValues(WID.PD.vectorTypeButt[3], XmNset, (v->ArrowType == DRAW_POST_CONE)?True:False, NULL); + XtVaSetValues(WID.PD.vectorTypeButt[4], XmNset, + (v->ArrowType == DRAW_POST_DISPLACEMENT)?True:False, NULL); + sprintf(label, "%g", v->ArrowScale); + XtVaSetValues(WID.PD.vectorScaleText, XmNvalue, label, NULL); + XtVaSetValues(WID.PD.vectorScaleScale, XmNvalue, THRESHOLD((int)v->ArrowScale,0,200), NULL); + XtVaSetValues(WID.PD.vectorLocationButt[0], XmNset, + (v->ArrowLocation == DRAW_POST_LOCATE_COG)?True:False, NULL); + XtVaSetValues(WID.PD.vectorLocationButt[1], XmNset, + (v->ArrowLocation == DRAW_POST_LOCATE_VERTEX)?True:False, NULL); + XtSetSensitive(WID.PD.vectorLocationCheck, v->ArrowType==DRAW_POST_DISPLACEMENT?False:True); + XtManageChild(WID.PD.vectorDialog); + break; + + /* Export BGM */ + case POST_EXPORT_BGM: + ViewForDialog[POST_EXPORT_BGM] = v; + strcat(label, " : Export as Background Mesh"); + XtVaSetValues(WID.PD.exportBGMDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL); + d = ErrorInView(v,&nb) ; + sprintf(label, "Options (Current: %d elements, error=%g%%)", nb, d); + XtVaSetValues(WID.PD.exportBGMFrame[1], XmNlabelString, XmStringCreateSimple(label), NULL); + XtManageChild(WID.PD.exportBGMDialog); + break; + + + /* apply BGM */ + case POST_APPLY_BGM : + ViewForDialog[POST_APPLY_BGM] = v; + BGMWithView(v); + TYPBGMESH = ONFILE; + Create_BgMesh(TYPBGMESH,.2,THEM); + break; + + default: + Msg(WARNING, "Unknown event in PostDialogCb : %d", (long int)client_data); + break; + } +} + + +/* ------------------------------------------------------------------------ + functions in post dialogs + ------------------------------------------------------------------------ */ + +void ChangeViewParam (Post_View *v, XtPointer client_data, XtPointer call_data) ; + +void PostCb (Widget w, XtPointer client_data, XtPointer call_data){ + int j; + Post_View *v=NULL; + double d; + char *c; + XmString xms; + static int LastTimeStep = 0; + + switch((long int)client_data){ + + case POST_EXPORT_BGM_METHOD_H_ERROR : ADAPTATION_METHOD = 3; break; + case POST_EXPORT_BGM_METHOD_H_ELEMENTS : ADAPTATION_METHOD = 4; break; + case POST_EXPORT_BGM_METHOD_P_ERROR : ADAPTATION_METHOD = 1; break; + case POST_EXPORT_BGM_METHOD_P_ELEMENTS : ADAPTATION_METHOD = 2; break; + case POST_EXPORT_BGM_CONSTRAINT : + v = ViewForDialog[POST_EXPORT_BGM]; + ADAPTATION_ERROR = atof(XmTextGetString(w)); + return ; + case POST_EXPORT_BGM_CREATE : + v = ViewForDialog[POST_EXPORT_BGM]; + XtVaGetValues(w, XmNtextString, &xms, NULL); + XmStringGetLtoR(xms, XmSTRING_DEFAULT_CHARSET, &c); + XmStringFree(xms); + CreateBGM(v, ADAPTATION_METHOD, 1.0, ADAPTATION_ERROR, &d, c); + MergeProblem(c); + Init(); + Draw(); + return; + case POST_COLOR_REPLOT : + v = ViewForDialog[POST_COLOR]; + ColorBarChange(v->Name, + (v->RangeType==DRAW_POST_CUSTOM)?v->CustomMin:v->Min, + (v->RangeType==DRAW_POST_CUSTOM)?v->CustomMax:v->Max, + &v->CT, 0); + ColorBarShow(); + if(v->CT.ipar[COLORTABLE_CHANGED]){ + v->Changed = 1; + if(CTX.post.link){ + ColorBarCopy(&v->CT); + for(j=0 ; j< List_Nbr(Post_ViewList) ; j++){ + v = (Post_View*)List_Pointer(Post_ViewList, j); + if(v->Visible || CTX.post.link>1){ + ColorBarPaste(&v->CT); + v->Changed=1; + } + } + } + } + Init(); + Draw(); + return; + } + + if(CTX.post.link){ + for(j=0 ; j< List_Nbr(Post_ViewList) ; j++){ + v = (Post_View*)List_Pointer(Post_ViewList, j); + if(v->Visible || CTX.post.link>1) ChangeViewParam(v, client_data, call_data); + } + } + else{ + switch((long int)client_data){ + case POST_OFFSET_TRANSLATE: + case POST_OFFSET_RAISE: + case POST_OFFSET_X_TEXT: + case POST_OFFSET_Y_TEXT: + case POST_OFFSET_Z_TEXT: + case POST_OFFSET_X_SCALE: + case POST_OFFSET_Y_SCALE: + case POST_OFFSET_Z_SCALE: + v = ViewForDialog[POST_OFFSET]; + break; + case POST_TIME_STEP_TEXT: + case POST_TIME_STEP_SCALE: + v = ViewForDialog[POST_TIME_STEP]; + break; + case POST_SCALE_SHOW: + case POST_SCALE_TRANSPARENCY: + case POST_SCALE_FORMAT: + case POST_SCALE_LABEL: + case POST_SCALE_MIN: + case POST_SCALE_MAX: + case POST_SCALE_TYPE_LIN: + case POST_SCALE_TYPE_LOG: + case POST_SCALE_FORCE_RANGE: + case POST_SCALE_INTERVALS_TYPE_ISO : + case POST_SCALE_INTERVALS_TYPE_DISCRETE : + case POST_SCALE_INTERVALS_TYPE_CONTINUOUS: + case POST_SCALE_INTERVALS_TYPE_NUMERIC: + case POST_SCALE_INTERVALS_TEXT: + case POST_SCALE_INTERVALS_SCALE: + v = ViewForDialog[POST_SCALE]; + break; + case POST_VECTOR_TYPE_SEGMENT: + case POST_VECTOR_TYPE_ARROW: + case POST_VECTOR_TYPE_PYRAMID: + case POST_VECTOR_TYPE_CONE: + case POST_VECTOR_TYPE_DISPLACEMENT: + case POST_VECTOR_SCALE_TEXT: + case POST_VECTOR_SCALE_SCALE: + case POST_VECTOR_LOCATION_COG: + case POST_VECTOR_LOCATION_VERTEX: + v = ViewForDialog[POST_VECTOR]; + break; + default : + Msg(WARNING, "Unknown event in PostCb"); + break; + } + ChangeViewParam(v, client_data, call_data); + } + + + if((long int)client_data == POST_TIME_STEP_SCALE){ + if(LastTimeStep != v->TimeStep){ + LastTimeStep = v->TimeStep; + Init(); + Draw(); + } + } + +} + +void ChangeViewParam (Post_View *v, XtPointer client_data, XtPointer call_data){ + double d, sfact; + char *c, label[256]; + int i; + + /* le slider (gradue en interne de -100 a 100) va de -LC a +LC */ + sfact = pow(10.,2.-LC_ORDER); + + switch((long int)client_data){ + + /* Offset */ + case POST_OFFSET_TRANSLATE: + OFFSET_MODE = 0; + for(i=0 ; i<3 ; i++){ + sprintf(label, "%g", v->Offset[i]); + XtVaSetValues(WID.PD.offsetText[i], XmNvalue, label, NULL); + XtVaSetValues(WID.PD.offsetScale[i], XmNvalue, + THRESHOLD((int)(sfact*v->Offset[i]),-100,100), NULL); + XmUpdateDisplay(WID.PD.offsetText[i]); + XmUpdateDisplay(WID.PD.offsetScale[i]); + } + break; + case POST_OFFSET_RAISE: + OFFSET_MODE = 1; + for(i=0 ; i<3 ; i++){ + sprintf(label, "%g", v->Raise[i]); + XtVaSetValues(WID.PD.offsetText[i], XmNvalue, label, NULL); + XtVaSetValues(WID.PD.offsetScale[i], XmNvalue, + THRESHOLD((int)(sfact*v->Raise[i]),-100,100), NULL); + XmUpdateDisplay(WID.PD.offsetText[i]); + XmUpdateDisplay(WID.PD.offsetScale[i]); + } + break; + case POST_OFFSET_X_TEXT: + d = atof(XmTextGetString(WID.PD.offsetText[0])); + OFFSET_MODE ? (v->Raise[0] = d) : (v->Offset[0] = d); + XtVaSetValues(WID.PD.offsetScale[0], XmNvalue, THRESHOLD((int)(sfact*d),-100,100), NULL); + XmUpdateDisplay(WID.PD.offsetScale[0]); + v->Changed = 1; + break; + case POST_OFFSET_Y_TEXT: + d = atof(XmTextGetString(WID.PD.offsetText[1])); + OFFSET_MODE ? (v->Raise[1] = d) : (v->Offset[1] = d); + XtVaSetValues(WID.PD.offsetScale[1], XmNvalue, THRESHOLD((int)(sfact*d),-100,100), NULL); + XmUpdateDisplay(WID.PD.offsetScale[1]); + v->Changed = 1; + break; + case POST_OFFSET_Z_TEXT: + d = atof(XmTextGetString(WID.PD.offsetText[2])); + OFFSET_MODE ? (v->Raise[2] = d) : (v->Offset[2] = d); + XtVaSetValues(WID.PD.offsetScale[2], XmNvalue, THRESHOLD((int)(sfact*d),-100,100), NULL); + XmUpdateDisplay(WID.PD.offsetScale[2]); + v->Changed = 1; + break; + case POST_OFFSET_X_SCALE: + XmScaleGetValue (WID.PD.offsetScale[0], &i); + d = i/sfact ; + sprintf(label, "%g", d); + OFFSET_MODE ? (v->Raise[0] = d) : (v->Offset[0] = d); + XtVaSetValues(WID.PD.offsetText[0],XmNvalue, label, NULL); + XmUpdateDisplay(WID.PD.offsetText[0]); + v->Changed = 1; + break; + case POST_OFFSET_Y_SCALE: + XmScaleGetValue (WID.PD.offsetScale[1], &i); + d = i/sfact ; + sprintf(label, "%g",d); + OFFSET_MODE ? (v->Raise[1]) = d : (v->Offset[1] = d); + XtVaSetValues(WID.PD.offsetText[1],XmNvalue, label, NULL); + XmUpdateDisplay(WID.PD.offsetText[1]); + v->Changed = 1; + break; + case POST_OFFSET_Z_SCALE: + XmScaleGetValue (WID.PD.offsetScale[2], &i); + d = i/sfact ; + sprintf(label, "%g", d); + OFFSET_MODE ? (v->Raise[2] = d) : (v->Offset[2] = d); + XtVaSetValues(WID.PD.offsetText[2],XmNvalue, label, NULL); + XmUpdateDisplay(WID.PD.offsetText[2]); + v->Changed = 1; + break; + + /* Time Step */ + case POST_TIME_STEP_TEXT: + i = atoi(XmTextGetString(WID.PD.timeStepText)); + if(i < 0) + v->TimeStep = 0; + else if(i > v->NbTimeStep-1) + v->TimeStep = v->NbTimeStep-1; + else + v->TimeStep = i; + XtVaSetValues(WID.PD.timeStepScale, XmNvalue, v->TimeStep, NULL); + XmUpdateDisplay(WID.PD.timeStepScale); + v->Changed = 1; + break; + case POST_TIME_STEP_SCALE: + XmScaleGetValue (WID.PD.timeStepScale, &i); + if(i < 0) + v->TimeStep = 0; + else if(i > v->NbTimeStep-1) + v->TimeStep = v->NbTimeStep-1; + else + v->TimeStep = i; + sprintf(label, "%d", v->TimeStep); + XtVaSetValues(WID.PD.timeStepText, XmNvalue, label, NULL); + XmUpdateDisplay(WID.PD.timeStepText); + v->Changed = 1; + break; + + + /* Scale */ + case POST_SCALE_SHOW: + v->ShowScale = !v->ShowScale; + XtSetSensitive(WID.PD.scaleText[0], v->ShowScale?1:0); + XtSetSensitive(WID.PD.scaleText[1], v->ShowScale?1:0); + break; + case POST_SCALE_TRANSPARENCY: + v->TransparentScale = !v->TransparentScale; + break; + case POST_SCALE_FORMAT: + c = XmTextGetString(WID.PD.scaleText[0]); strcpy(v->Format,c); + break; + case POST_SCALE_LABEL: + c = XmTextGetString(WID.PD.scaleText[1]); strcpy(v->Name,c); + break; + case POST_SCALE_MIN: + v->CustomMin = atof(XmTextGetString(WID.PD.scaleRangeText[0])); + if(v->RangeType==DRAW_POST_CUSTOM) v->Changed = 1; + break; + case POST_SCALE_MAX: + v->CustomMax = atof(XmTextGetString(WID.PD.scaleRangeText[1])); + if(v->RangeType==DRAW_POST_CUSTOM) v->Changed = 1; + break; + case POST_SCALE_TYPE_LIN: + v->ScaleType = DRAW_POST_LINEAR; + v->Changed = 1; + break; + case POST_SCALE_TYPE_LOG: + v->ScaleType = DRAW_POST_LOGARITHMIC; + v->Changed = 1; + break; + case POST_SCALE_FORCE_RANGE: + (v->RangeType == DRAW_POST_DEFAULT) ? + (v->RangeType=DRAW_POST_CUSTOM) : (v->RangeType=DRAW_POST_DEFAULT); + XtSetSensitive(WID.PD.scaleRangeText[0], (v->RangeType==DRAW_POST_CUSTOM)?1:0); + XtSetSensitive(WID.PD.scaleRangeText[1], (v->RangeType==DRAW_POST_CUSTOM)?1:0); + v->Changed = 1; + break; + case POST_SCALE_INTERVALS_TYPE_ISO : + v->IntervalsType = DRAW_POST_ISO; + v->Changed = 1; + break; + case POST_SCALE_INTERVALS_TYPE_DISCRETE : + v->IntervalsType = DRAW_POST_DISCRETE; + v->Changed = 1; + break; + case POST_SCALE_INTERVALS_TYPE_CONTINUOUS: + v->IntervalsType = DRAW_POST_CONTINUOUS; + v->Changed = 1; + break; + case POST_SCALE_INTERVALS_TYPE_NUMERIC: + v->IntervalsType = DRAW_POST_NUMERIC; + v->Changed = 1; + break; + case POST_SCALE_INTERVALS_TEXT: + v->NbIso = atoi(XmTextGetString(WID.PD.scaleIntervalsText)); + XtVaSetValues(WID.PD.scaleIntervalsScale, XmNvalue, THRESHOLD((int)v->NbIso,1,100), NULL); + XmUpdateDisplay(WID.PD.scaleIntervalsScale); + v->Changed = 1; + break; + case POST_SCALE_INTERVALS_SCALE: + XmScaleGetValue(WID.PD.scaleIntervalsScale, &v->NbIso); + sprintf(label, "%d", v->NbIso); + XtVaSetValues(WID.PD.scaleIntervalsText, XmNvalue, label, NULL); + XmUpdateDisplay(WID.PD.scaleIntervalsText); + v->Changed = 1; + break; + + /* Vector */ + case POST_VECTOR_TYPE_SEGMENT: + v->ArrowType = DRAW_POST_SEGMENT; + XtSetSensitive(WID.PD.vectorLocationCheck, True); + v->Changed = 1; + break; + case POST_VECTOR_TYPE_ARROW: + v->ArrowType = DRAW_POST_ARROW; + XtSetSensitive(WID.PD.vectorLocationCheck, True); + v->Changed = 1; + break; + case POST_VECTOR_TYPE_PYRAMID: + v->ArrowType = DRAW_POST_PYRAMID; + XtSetSensitive(WID.PD.vectorLocationCheck, True); + v->Changed = 1; + break; + case POST_VECTOR_TYPE_CONE: + v->ArrowType = DRAW_POST_CONE; + XtSetSensitive(WID.PD.vectorLocationCheck, True); + v->Changed = 1; + break; + case POST_VECTOR_TYPE_DISPLACEMENT: + v->ArrowType = DRAW_POST_DISPLACEMENT; + XtSetSensitive(WID.PD.vectorLocationCheck, False); + v->Changed = 1; + break; + case POST_VECTOR_SCALE_TEXT: + v->ArrowScale = atof(XmTextGetString(WID.PD.vectorScaleText)); + XtVaSetValues(WID.PD.vectorScaleScale, XmNvalue, THRESHOLD((int)v->ArrowScale,0,200), NULL); + XmUpdateDisplay(WID.PD.vectorScaleScale); + v->Changed = 1; + break; + case POST_VECTOR_SCALE_SCALE: + XmScaleGetValue(WID.PD.vectorScaleScale, &i); + v->ArrowScale = (double)i; + sprintf(label, "%g", v->ArrowScale); + XtVaSetValues(WID.PD.vectorScaleText, XmNvalue, label, NULL); + XmUpdateDisplay(WID.PD.vectorScaleText); + v->Changed = 1; + break; + case POST_VECTOR_LOCATION_COG: + v->ArrowLocation = DRAW_POST_LOCATE_COG; + v->Changed = 1; + break; + case POST_VECTOR_LOCATION_VERTEX: + v->ArrowLocation = DRAW_POST_LOCATE_VERTEX; + v->Changed = 1; + break; + + default: + Msg(WARNING, "Unknown event in PostCb : %d", (long int)client_data); + break; + + } + +} + diff --git a/Unix/CbPost.h b/Unix/CbPost.h new file mode 100644 index 0000000000000000000000000000000000000000..98fd4a5aa85ea02b9ce6b875ae0aabd8109d6b57 --- /dev/null +++ b/Unix/CbPost.h @@ -0,0 +1,64 @@ +#ifndef _CB_POST_H_ +#define _CB_POST_H_ + +#define POST_LINK 1 +#define POST_OFFSET 2 +#define POST_TIME_STEP 3 +#define POST_SCALE 4 +#define POST_VECTOR 5 +#define POST_EXPORT_BGM 6 +#define POST_APPLY_BGM 7 +#define POST_LIGHT 8 +#define POST_COLOR 9 +#define POST_ELEMENT 10 + +#define POST_OFFSET_TRANSLATE 403 +#define POST_OFFSET_RAISE 404 +#define POST_OFFSET_X_TEXT 405 +#define POST_OFFSET_Y_TEXT 406 +#define POST_OFFSET_Z_TEXT 407 +#define POST_OFFSET_X_SCALE 408 +#define POST_OFFSET_Y_SCALE 409 +#define POST_OFFSET_Z_SCALE 410 + +#define POST_TIME_STEP_TEXT 417 +#define POST_TIME_STEP_SCALE 418 + +#define POST_SCALE_SHOW 421 +#define POST_SCALE_TRANSPARENCY 422 +#define POST_SCALE_FORMAT 423 +#define POST_SCALE_LABEL 424 +#define POST_SCALE_FORCE_RANGE 425 +#define POST_SCALE_MIN 426 +#define POST_SCALE_MAX 427 +#define POST_SCALE_TYPE_LIN 428 +#define POST_SCALE_TYPE_LOG 429 +#define POST_SCALE_INTERVALS_TYPE_ISO 430 +#define POST_SCALE_INTERVALS_TYPE_DISCRETE 431 +#define POST_SCALE_INTERVALS_TYPE_CONTINUOUS 432 +#define POST_SCALE_INTERVALS_TYPE_NUMERIC 433 +#define POST_SCALE_INTERVALS_SCALE 434 +#define POST_SCALE_INTERVALS_TEXT 435 + +#define POST_COLOR_REPLOT 440 + +#define POST_VECTOR_TYPE_SEGMENT 450 +#define POST_VECTOR_TYPE_ARROW 451 +#define POST_VECTOR_TYPE_PYRAMID 452 +#define POST_VECTOR_TYPE_CONE 453 +#define POST_VECTOR_TYPE_DISPLACEMENT 454 +#define POST_VECTOR_SCALE_TEXT 455 +#define POST_VECTOR_SCALE_SCALE 456 +#define POST_VECTOR_LOCATION_COG 457 +#define POST_VECTOR_LOCATION_VERTEX 458 + +#define POST_EXPORT_BGM_METHOD_H_ERROR 461 +#define POST_EXPORT_BGM_METHOD_H_ELEMENTS 462 +#define POST_EXPORT_BGM_METHOD_P_ERROR 463 +#define POST_EXPORT_BGM_METHOD_P_ELEMENTS 464 +#define POST_EXPORT_BGM_CONSTRAINT 465 +#define POST_EXPORT_BGM_CREATE 466 + +void MarkAllViewsChanged (int action); + +#endif diff --git a/Unix/Geometry.cpp b/Unix/Geometry.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4e31e85ef0c8bfcad7268d95676d4504ce237f54 --- /dev/null +++ b/Unix/Geometry.cpp @@ -0,0 +1,829 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Context.h" +#include "XContext.h" +#include "Widgets.h" + +extern Context_T CTX ; +extern XContext_T XCTX ; + +#define WINDOW_SHADOW 1 +#define SHADOW 2 +#define IN_FRAME_TYPE XmSHADOW_ETCHED_IN +#define IN_FRAME_SHADOW 2 +#define TITLE_SPACE 0 +#define TITLE_ALIGN XmALIGNMENT_WIDGET_TOP +#define DIALOG_W 6 +#define DIALOG_H 4 + + +/* + XmNchildVerticalAlignment : + CENTER, WIDGET_TOP, WIDGET_BOTTOM, BASELINE_BOTTOM, BASELINE_TOP + + XmNshadowType : + ETCHED_IN, ETCHED_OUT, IN, OUT +*/ + +/* ------------------------------------------------------------------------ + MENU WINDOW + ------------------------------------------------------------------------ */ + +void ForceGeometry_M (Widgets_T *w){ + int n; + + XtVaSetValues(w->M.containerWin, + XmNmenuBar, w->M.menuBar, + NULL); + + XtVaSetValues(w->M.menuBar, + XmNmenuHelpWidget, w->M.helpCascade, + NULL); + + XtVaSetValues(w->M.menuFrame, + XmNshadowType, XmSHADOW_OUT, + XmNshadowThickness, WINDOW_SHADOW, + NULL); + + XtVaSetValues(w->M.menuForm, + XmNfractionBase, 100, + XmNmarginWidth, 3, + XmNmarginHeight, 3, + NULL); + + XtVaSetValues(w->M.modButt, + XmNmarginHeight, 5, + XmNmarginWidth, 2, + XmNtopAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_WIDGET, + XmNleftWidget, w->M.navigButt[0], + XmNrightAttachment, XmATTACH_WIDGET, + XmNrightWidget, w->M.navigButt[1], + NULL); + + XtVaSetValues(w->M.navigButt[0], + XmNshadowThickness, 0, + XmNwidth, 20, + XmNleftAttachment, XmATTACH_FORM, + NULL); + + XtVaSetValues(w->M.navigButt[1], + XmNshadowThickness, 0, + XmNwidth, 20, + XmNrightAttachment, XmATTACH_FORM, + NULL); + + XtVaSetValues(w->M.defaultButt, + XmNmarginHeight, 5, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, w->M.modButt, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + NULL); + + XtVaSetValues(w->M.pushButt[0], + XmNshadowThickness, SHADOW, + XmNmarginHeight, 5, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, w->M.modButt, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + NULL); + + XtVaSetValues(w->M.toggleButt[0], + XmNshadowThickness, SHADOW, + XmNmarginHeight, 3, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, w->M.modButt, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + NULL); + + for(n=1 ; n<NB_BUTT_MAX ; n++){ + XtVaSetValues(w->M.pushButt[n], + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, w->M.pushButt[n-1], + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + XmNshadowThickness, SHADOW, + XmNmarginHeight, 5, + NULL); + + XtVaSetValues(w->M.toggleButt[n], + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, w->M.toggleButt[n-1], + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + XmNshadowThickness, SHADOW, + XmNmarginHeight, 3, + NULL); + } + +} + +/* ------------------------------------------------------------------------ + GRAPHIC WINDOW + ------------------------------------------------------------------------ */ + +void ForceGeometry_G (Widgets_T *w){ + int i; + + XtVaSetValues(w->G.glw, + XmNtopAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_WIDGET, + XmNbottomWidget, w->G.bottomForm, + NULL); + + if(CTX.overlay) + XtVaSetValues(w->G.glo, + XmNtopAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_WIDGET, + XmNbottomWidget, w->G.bottomForm, + NULL); + + XtVaSetValues(w->G.bottomForm, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + XmNmarginHeight, 2, + XmNmarginWidth, 1, + XmNshadowThickness, WINDOW_SHADOW, + XmNfractionBase, 100, + NULL); + + XtVaSetValues(w->G.Butt[0], + XmNtopAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_FORM, + XmNshadowThickness, 0, + XmNmarginHeight, 1, + NULL); + + for(i=1 ; i<7 ; i++) { + XtVaSetValues(w->G.Butt[i], + XmNtopAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_WIDGET, + XmNleftWidget, w->G.Butt[i-1], + XmNshadowThickness, 0, + XmNmarginHeight, 1, + NULL); + } + + XtVaSetValues(w->G.textForm, + XmNbottomAttachment, XmATTACH_FORM, + XmNtopAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_WIDGET, + XmNleftWidget, w->G.Butt[6], + XmNrightAttachment, XmATTACH_FORM, + XmNfractionBase, 300, + NULL); + + XtVaSetValues(w->G.selectLabel, + XmNtopAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_POSITION, + XmNleftPosition, 2, + XmNrightAttachment, XmATTACH_POSITION, + XmNrightPosition, 90, + XmNmarginHeight, 0, + NULL); + + XtVaSetValues(w->G.infoLabel, + XmNtopAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_POSITION, + XmNleftPosition, 92, + XmNrightAttachment, XmATTACH_POSITION, + XmNrightPosition, 180, + XmNmarginHeight, 0, + NULL); + + XtVaSetValues(w->G.statusLabel, + XmNtopAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_POSITION, + XmNleftPosition, 182, + XmNrightAttachment, XmATTACH_POSITION, + XmNrightPosition, 298, + XmNmarginHeight, 0, + NULL); + + +} + +/* ------------------------------------------------------------------------ + COMMAND WINDOW + ------------------------------------------------------------------------ */ + +void ForceGeometry_C (Widgets_T *w){ + + XtVaSetValues(w->C.command, + XmNshadowThickness, WINDOW_SHADOW, + XmNshadowType, XmSHADOW_OUT, + XmNmarginHeight, 2, + XmNmarginWidth, 2, + NULL); + + XtVaSetValues(w->C.commandList, + XmNshadowThickness, SHADOW, + XmNmarginHeight, 0, + NULL); + + XtVaSetValues(w->C.commandText, + XmNshadowThickness, SHADOW, + XmNmarginHeight, 4, + NULL); +} + +/* ------------------------------------------------------------------------ + DIALOGS + ------------------------------------------------------------------------ */ + +void ForceGeometry_ED (Widgets_T *w){ +} + +void ForceGeometry_FD (Widgets_T *w){ + + XtVaSetValues(w->FD.openDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->FD.mergeDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->FD.saveDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->FD.saveAsDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->FD.saveAsFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->FD.saveAsFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->FD.saveAsRowCol, + XmNmarginWidth, 0, + NULL); + + XtVaSetValues(w->FD.printDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->FD.printFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->FD.printFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->FD.printRowCol, + XmNmarginWidth, 0, + NULL); + +} + +void ForceGeometry_OD (Widgets_T *w){ + int i,j; + + XtVaSetValues(w->OD.geomDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->OD.geomVisibleFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.geomVisibleFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.geomVisibleByNumFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.geomVisibleByNumFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.geomNormalsFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.geomNormalsFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.geomTangentsFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.geomTangentsFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.meshDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->OD.meshAlgoFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.meshAlgoFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.meshSmoothingFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.meshSmoothingFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.meshVisibleFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.meshVisibleFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.meshVisibleByNumFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.meshVisibleByNumFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.meshAspectFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.meshAspectFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.meshExplodeFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.meshExplodeFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.meshNormalsFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.meshNormalsFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.postDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->OD.postLinkFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.postLinkFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.postAnimFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.postAnimFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.miscDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->OD.miscMiscFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.miscMiscFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.miscColorSchemeFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.miscColorSchemeFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.miscProjFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.miscProjFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.miscLightFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.miscLightFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.miscShineFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.miscShineFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->OD.viewportDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + for(i=0 ; i<3 ; i++){ + XtVaSetValues(w->OD.viewportFrame[0][i], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.viewportFrame[1][i], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + for(j=0 ; j<3 ; j++){ + XtVaSetValues(w->OD.viewportLockButt[j][i], + XmNmarginHeight, 0, + NULL); + } + } + + XtVaSetValues(w->OD.infoDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + for(i=0 ; i<3 ; i++){ + XtVaSetValues(w->OD.infoFrame[0][i], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->OD.infoFrame[1][i], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + } + +} + +void ForceGeometry_HD (Widgets_T *w){ + + XtVaSetValues(w->HD.keysDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); +} + +void ForceGeometry_GD (Widgets_T *w){ + int i; + + XtVaSetValues(w->GD.paramDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + for(i=0 ; i<2 ; i++){ + XtVaSetValues(w->GD.paramFrame[0][i], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->GD.paramFrame[1][i], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + } + + + XtVaSetValues(w->GD.pointDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + for(i=0 ; i<2 ; i++){ + XtVaSetValues(w->GD.pointFrame[0][i], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->GD.pointFrame[1][i], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + } + + XtVaSetValues(w->GD.rotDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + for(i=0 ; i<3 ; i++){ + XtVaSetValues(w->GD.rotFrame[0][i], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->GD.rotFrame[1][i], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + } + + XtVaSetValues(w->GD.tranDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->GD.tranFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->GD.tranFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->GD.dilatDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + for(i=0 ; i<2 ; i++){ + XtVaSetValues(w->GD.dilatFrame[0][i], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->GD.dilatFrame[1][i], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + } + +} + +void ForceGeometry_MD (Widgets_T *w){ + int i; + + XtVaSetValues(w->MD.charLengthDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->MD.charLengthFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->MD.charLengthFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->MD.trsfLineDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + for(i=0 ; i<2 ; i++){ + XtVaSetValues(w->MD.trsfLineFrame[0][i], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + XtVaSetValues(w->MD.trsfLineFrame[1][i], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + } + + XtVaSetValues(w->MD.trsfVolumeDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->MD.trsfVolumeFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->MD.trsfVolumeFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + +} + +void ForceGeometry_PD (Widgets_T *w){ + int i; + + + XtVaSetValues(w->PD.offsetDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + for(i=0 ; i<4 ; i++){ + XtVaSetValues(w->PD.offsetFrame[0][i], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + XtVaSetValues(w->PD.offsetFrame[1][i], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + } + + XtVaSetValues(w->PD.timeStepDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->PD.timeStepFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + XtVaSetValues(w->PD.timeStepFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->PD.scaleDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + for(i=0 ; i<3 ; i++){ + XtVaSetValues(w->PD.scaleFrame[0][i], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + XtVaSetValues(w->PD.scaleFrame[1][i], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + } + + + XtVaSetValues(w->PD.colorDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + XtVaSetValues(w->PD.colorFrame[0][0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + XtVaSetValues(w->PD.colorFrame[1][0], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + XtVaSetValues(w->PD.colorDrawingArea, + XmNtopAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + XmNwidth, 255, + XmNheight, 200, + NULL); + + + XtVaSetValues(w->PD.vectorDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + for(i=0 ; i<3 ; i++){ + XtVaSetValues(w->PD.vectorFrame[0][i], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + XtVaSetValues(w->PD.vectorFrame[1][i], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + } + + XtVaSetValues(w->PD.exportBGMDialog, + XmNmarginHeight, DIALOG_H, + XmNmarginWidth, DIALOG_W, + NULL); + + XtVaSetValues(w->PD.exportBGMFrame[0], + XmNshadowType, IN_FRAME_TYPE, + XmNshadowThickness, IN_FRAME_SHADOW, + NULL); + + XtVaSetValues(w->PD.exportBGMFrame[1], + XmNchildHorizontalSpacing, TITLE_SPACE, + XmNchildVerticalAlignment, TITLE_ALIGN, + NULL); + + XtVaSetValues(w->PD.exportBGMText, + XmNmarginHeight, 2, + NULL); + +} + + +/* ------------------------------------------------------------------------ + F o r c e G e o m e t r y + ------------------------------------------------------------------------ */ + +void ForceGeometry (Widgets_T *w){ + ForceGeometry_M(w) ; /* menu win */ + ForceGeometry_G(w) ; /* graphic win */ + if(CTX.command_win) ForceGeometry_C(w) ; /* command win */ + + ForceGeometry_ED(w); /* error dialogs */ + ForceGeometry_FD(w); /* file dialogs */ + ForceGeometry_OD(w); /* option dialogs */ + ForceGeometry_HD(w); /* help dialogs */ + ForceGeometry_GD(w); /* geometry dialogs */ + ForceGeometry_MD(w); /* mesh dialogs */ + ForceGeometry_PD(w); /* post dialogs */ +} + diff --git a/Unix/Geometry.h b/Unix/Geometry.h new file mode 100644 index 0000000000000000000000000000000000000000..9793884fc83258996240a4f5bb8d79c7683c22c3 --- /dev/null +++ b/Unix/Geometry.h @@ -0,0 +1,6 @@ +#ifndef _GEOMETRY_H_ +#define _GEOMETRY_H_ + +void ForceGeometry(Widgets_T *w); + +#endif diff --git a/Unix/Help.h b/Unix/Help.h new file mode 100644 index 0000000000000000000000000000000000000000..0676081aff0607a2a82c6898c39eca6ba9de1fe4 --- /dev/null +++ b/Unix/Help.h @@ -0,0 +1,90 @@ +#ifndef _HELP_H_ +#define _HELP_H_ + +static char txt_help[]= +"\n" +" (x) stands for \"press x\"\n" +" (x-y) stands for \"press x and, keeping it down, press y\"\n" +" C, M and S stand for Control, Meta (or Alt) and Shift\n" +"\n" +"MOUSE:\n" +"\n" +" move when passing over the entity, highlight it and\n" +" display its properties on the bottom line\n" +" size a rubber zoom started with (C-left)\n" +"\n" +" (left) apply Y rotation (horizontal move)\n" +" apply X rotation (vertical move)\n" +" accept a rubber zoom started by (C-left)\n" +" (middle) apply Z rotation (horizontal move)\n" +" zoom (vertical move)\n" +" cancel a rubber zoom\n" +" (right) pan X (horizontal move)\n" +" pan Y (vertical move)\n" +" cancel a rubber zoom\n" +" popup menu on module name\n" +" popup menu on post processor toggle buttons\n" +"\n" +" (C-left) start a rubber zoom\n" +" (C-middle) re-orthogonalise viewport\n" +" (C-right) reset viewport to default\n" +"\n" +"KEYBOARD:\n" +"\n" +"No modifier: basic module interaction\n" +"\n" +" (0) reparse file\n" +" (1),(f1) mesh lines\n" +" (2),(f2) mesh surfaces\n" +" (3),(f3) mesh volumes\n" +" (g) go to geometry module\n" +" (m) go to mesh module\n" +" (p) go to post processor module\n" +"\n" +"Control modifier: popup file menus\n" +"\n" +" (C-a),(C-c) abort mesh thread\n" +" (C-q) quit\n" +" (C-o) hide/show open file dialog\n" +" (C-p) hide/show print dialog\n" +" (C-m) hide/show merge file dialog\n" +" (C-s) quick mesh save\n" +" (C-S-s) hide/show save mesh dialog\n" +"\n" +"Shift modifier: popup option menus\n" +"\n" +" (S-g) hide/show geometry options\n" +" (S-i) hide/show info window\n" +" (S-m) hide/show mesh options\n" +" (S-o) hide/show miscellaneous options\n" +" (S-p) hide/show post processor general options\n" +" (S-v) hide/show viewport options\n" +"\n" +"Meta (Alt) modifier: quick shortcuts (no popup)\n" +"\n" +" (M-a) hide/show 2D axes\n" +" (M-S-a) hide/show 3D axes\n" +" (M-b) hide/show all post processing scales\n" +" (M-c) alternate between predefined color modes\n" +" (M-d) alternate between mesh wireframe, hidden lines and shading modes\n" +" (M-f) toggle redraw mode (fast/display all)\n" +" (M-h) toggle highlight mode\n" +" (M-l) hide/show geometry lines\n" +" (M-S-l) hide/show mesh lines\n" +" (M-m) toggle all mesh entities visibility\n" +" (M-o) change projection mode\n" +" (M-p) hide/show geometry points\n" +" (M-S-p) hide/show mesh points\n" +" (M-s) hide/show geometry surfaces\n" +" (M-S-s) hide/show mesh surfaces\n" +" (M-v) hide/show geometry volumes\n" +" (M-S-v) hide/show mesh volumes\n" +" (M-x) set X view\n" +" (M-y) set Y view\n" +" (M-z) set Z view\n" +" (M-t) alternate intervals mode in post-processing\n" +"\n" +; + + +#endif diff --git a/Unix/Info.h b/Unix/Info.h new file mode 100644 index 0000000000000000000000000000000000000000..6a15f32ee3cdd14ab7391f9b3b4885f8125ac0d2 --- /dev/null +++ b/Unix/Info.h @@ -0,0 +1,37 @@ +#ifndef _INFO_H_ +#define _INFO_H_ + +static char *txt_info [] = + { + /* Geometry */ + "Points", + "Curves", + "Surfaces", + "Volumes", + + /* Mesh */ + "Nodes on Curves", + "Nodes on Surfaces", + "Nodes in Volumes", + "Triangles", + "Quadrangles", + "Tetrahedra", + "Hexahedra", + "Prisms", + "Time for 1D Mesh", + "Time for 2D Mesh", + "Time for 3D Mesh", + + "Gamma", + "Eta", + "R", + + /* Post */ + "Views loaded", + "Visible Points", + "Visible Lines", + "Visible Triangles", + "Visible Tetrahedra" + } ; + +#endif diff --git a/Unix/Main.cpp b/Unix/Main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ad3b9ee75ff9420013500643310a39ce9eeb48b6 --- /dev/null +++ b/Unix/Main.cpp @@ -0,0 +1,759 @@ + +#include <signal.h> + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Geo.h" +#include "Verif.h" +#include "Mesh.h" +#include "Draw.h" +#include "Context.h" +#include "ColorTable.h" +#include "Parser.h" +#include "MinMax.h" + +#include "Widgets.h" +#include "Pixmaps.h" + +#include "XColors.h" +#include "XContext.h" +#include "XRessources.h" + +#include "CbContext.h" +#include "CbGeom.h" +#include "Register.h" +#include "Geometry.h" + +#include "Static.h" +#include "XStatic.h" + +/* ------------------------------------------------------------------------ */ +/* P a r s e */ +/* ------------------------------------------------------------------------ */ + +void ParseFile(char *f){ + char String[256]; + Post_View *v; + + strncpy(yyname,f,NAME_STR_L); + yyerrorstate=0; + yylineno=1; + + if(!(yyin = fopen(yyname,"r"))){ + Msg(INFO, "File '%s' dos not exist", f); + return; + } + + fgets(String, sizeof(String), yyin) ; + rewind(yyin); + + if(!strncmp(String, "$PTS", 4) || + !strncmp(String, "$NO", 3) || + !strncmp(String, "$ELM", 4)){ + if(THEM->status < 0) mai3d(THEM, 0); + Read_Mesh(THEM, yyin, FORMAT_MSH); + } + else if(!strncmp(String, "$COL", 4)){ + if(List_Nbr(Post_ViewList)){ + v = (Post_View*)List_Pointer(Post_ViewList, List_Nbr(Post_ViewList)-1); + load_color_table(yyin, &v->CT); + } + else{ + Msg(WARNING, "No Post-Processing View available to set Colors"); + } + } + else{ + while(!feof(yyin)) yyparse(); + } + fclose(yyin); +} + +void MergeProblem(char *name){ + Msg(INFOS, "Merging %s",name); + + ParseFile(name); + if (yyerrorstate) return; + + if (!EntitesVisibles) { + RemplirEntitesVisibles(1); + SHOW_ALL=1; + } +} + +void OpenProblem(char *name){ + char ext[6]; + + InitSymbols(); + Init_Mesh(&M, 1); + BD_EXISTS = 1; + + strncpy(TheFileName,name,NAME_STR_L); + strncpy(TheBaseFileName,name,NAME_STR_L); + + strcpy(ext,name+(strlen(name)-4)); + if(!strcmp(ext,".GEO") || + !strcmp(ext,".geo") || + !strcmp(ext,".msh") || + !strcmp(ext,".pos")){ + TheBaseFileName[strlen(name)-4] = '\0'; + } + else{ + strcat(TheFileName,".geo"); + } + + strncpy(THEM->name, TheBaseFileName,NAME_STR_L); + + if(!CTX.interactive) + XtVaSetValues(WID.G.shell, + XmNtitle, TheFileName, + XmNiconName, TheBaseFileName, + NULL); + + Msg(INFOS, "Opening %s", TheFileName); + + ParseFile(TheFileName); + + mai3d(THEM,0); + + Maillage_Dimension_0(&M); + ZeroHighlight(&M); + CalculateMinMax(THEM->Points); + if (!EntitesVisibles) { + RemplirEntitesVisibles(1); + SHOW_ALL=1; + } + +} + + +/* ------------------------------------------------------------------------ */ +/* G e t _ O p t i o n s */ +/* ------------------------------------------------------------------------ */ + +void Get_Options (int argc, char *argv[]) { + int i=1; + + strncpy(TheFileNameTab[0], "unnamed.geo",NAME_STR_L); + + while (i < argc) { + + if (argv[i][0] == '-') { + + if(!strcmp(argv[i]+1, "0")){ + CTX.interactive = -1; i++; + } + else if(!strcmp(argv[i]+1, "1")){ + CTX.interactive = 1; i++; + } + else if(!strcmp(argv[i]+1, "2")){ + CTX.interactive = 2; i++; + } + else if(!strcmp(argv[i]+1, "3")){ + CTX.interactive = 3; i++; + } + else if(!strcmp(argv[i]+1, "path")){ + i++; + if(argv[i] != NULL){ + strncpy(ThePathForIncludes,argv[i++],NAME_STR_L); + } + } + else if(!strcmp(argv[i]+1, "bgm")){ + i++; + if(argv[i] != NULL){ + strncpy(TheBgmFileName,argv[i++],NAME_STR_L); + INITIALBGMESH = ONFILE; + } + } + else if(!strcmp(argv[i]+1, "alpha")){ + CTX.alpha = 1; i++; + } + else if(!strcmp(argv[i]+1, "flash")){ + CTX.flash = 1; i++; + } + else if(!strcmp(argv[i]+1, "old")){ + FLAG_OLD_CIRCLE = 1; i++; + } + else if(!strcmp(argv[i]+1, "dual")){ + CTX.mesh.dual = 1; i++; + } + else if(!strcmp(argv[i]+1, "recombine")){ + CTX.mesh.reco_extrude = 1; i++; + } + else if(!strcmp(argv[i]+1, "samevisual")){ + CTX.same_visual = 1; i++; + } + else if(!strcmp(argv[i]+1, "factor")){ + i++; + FACTEUR_MULTIPLICATIF = atof(argv[i]); i++; + } + else if(!strcmp(argv[i]+1, "scale") || + !strcmp(argv[i]+1, "scaling")){ + i++; + GLOBALSCALINGFACTOR = atof(argv[i]); i++; + } + else if(!strcmp(argv[i]+1, "raw")){ + LISSAGE = 0; i++; + } + else if(!strcmp(argv[i]+1, "smooth")){ + i++; + LISSAGE = atoi(argv[i]); i++; + } + else if(!strcmp(argv[i]+1, "degree")){ + i++; + if(argv[i]!=NULL){ + CTX.mesh.degree = atoi(argv[i]); i++; + if(CTX.mesh.degree != 1 || CTX.mesh.degree != 2){ + fprintf(stderr, "Error: Wrong degree\n"); + exit(1); + } + } + else { + fprintf(stderr, "Error: Missing Number\n"); + exit(1); + } + } + else if(!strcmp(argv[i]+1, "format") || + !strcmp(argv[i]+1, "f")){ + i++; + if(argv[i]!=NULL){ + if(!strcmp(argv[i],"msh") || + !strcmp(argv[i],"MSH") || + !strcmp(argv[i],"gmsh")){ + CTX.mesh.format = FORMAT_MSH ; + } + else if(!strcmp(argv[i],"unv") || + !strcmp(argv[i],"UNV") || + !strcmp(argv[i],"ideas")){ + CTX.mesh.format = FORMAT_UNV ; + } + else if(!strcmp(argv[i],"gref") || + !strcmp(argv[i],"GREF") || + !strcmp(argv[i],"Gref")){ + CTX.mesh.format = FORMAT_GREF ; + } + else{ + fprintf(stderr, "Error: Unknown mesh format\n"); + exit(1); + } + i++; + } + else { + fprintf(stderr, "Error: Missing format\n"); + exit(1); + } + } + else if(!strcmp(argv[i]+1, "algo")){ + i++; + if(argv[i]!=NULL){ + if(!strcmp(argv[i],"iso")) + CTX.mesh.algo = DELAUNAT_OLDALGO ; + else if(!strcmp(argv[i],"aniso")) + CTX.mesh.algo = DELAUNAT_NEWALGO ; + else{ + fprintf(stderr, "Error: Unknown mesh algorithm\n"); + exit(1); + } + i++; + } + else { + fprintf(stderr, "Error: Missing algorithm\n"); + exit(1); + } + } + else if(!strcmp(argv[i]+1, "noview")){ + CTX.post.initial_visibility = 0 ; i++; + } + else if(!strcmp(argv[i]+1, "fill")){ + CTX.post.initial_intervals = DRAW_POST_DISCRETE ; i++; + } + else if(!strcmp(argv[i]+1, "nbiso")){ + i++ ; + CTX.post.initial_nbiso = atoi(argv[i]) ; i++ ; + } + else if(!strcmp(argv[i]+1, "command") || + !strcmp(argv[i]+1, "c")){ + CTX.command_win = 1; i++; + } + else if(!strcmp(argv[i]+1, "nocommand") || + !strcmp(argv[i]+1, "noc")){ + CTX.command_win = 0; i++; + } + else if(!strcmp(argv[i]+1, "overlay") || + !strcmp(argv[i]+1, "ov")){ + CTX.overlay = 1; i++; + } + else if(!strcmp(argv[i]+1, "nooverlay") || + !strcmp(argv[i]+1, "noov")){ + CTX.overlay = CTX.geom.highlight = 0; i++; + } + else if(!strcmp(argv[i]+1, "perspective") || + !strcmp(argv[i]+1, "p")){ + CTX.ortho = 0; i++; + } + else if(!strcmp(argv[i]+1, "ortho") || + !strcmp(argv[i]+1, "o")){ + CTX.ortho = 0; i++; + } + else if(!strcmp(argv[i]+1, "threads")){ + CTX.threads = 1; i++; + } + else if(!strcmp(argv[i]+1, "nothreads")){ + CTX.threads = 0; i++; + } + else if(!strcmp(argv[i]+1, "viewport")){ + i++ ; + CTX.r[0] = atof(argv[i]) ; i++ ; + CTX.r[1] = atof(argv[i]) ; i++ ; + CTX.r[2] = atof(argv[i]) ; i++ ; + CTX.t[0] = atof(argv[i]) ; i++ ; + CTX.t[1] = atof(argv[i]) ; i++ ; + CTX.t[2] = atof(argv[i]) ; i++ ; + CTX.s[0] = atof(argv[i]) ; i++ ; + CTX.s[1] = atof(argv[i]) ; i++ ; + CTX.s[2] = atof(argv[i]) ; i++ ; + } + else if(!strcmp(argv[i]+1, "db")){ + CTX.db = 1; i++; + } + else if(!strcmp(argv[i]+1, "nodb")){ + CTX.db = 0; CTX.geom.highlight = 0; i++; + } + else if(!strcmp(argv[i]+1, "dl")){ + CTX.display_lists = 1; i++; + } + else if(!strcmp(argv[i]+1, "nodl")){ + CTX.display_lists = 0; i++; + } + else if(!strcmp(argv[i]+1, "geometry") || + !strcmp(argv[i]+1, "iconic") || + !strcmp(argv[i]+1, "display") || + !strcmp(argv[i]+1, "fg") || + !strcmp(argv[i]+1, "bg")){ + i+=2; + } + else if(!strcmp(argv[i]+1, "version") || + !strcmp(argv[i]+1, "v") || + !strcmp(argv[i]+1, "-version") || + !strcmp(argv[i]+1, "-v")){ + Info(2,argv[0]); + } + else if(!strcmp(argv[i]+1, "info") || + !strcmp(argv[i]+1, "-info")){ + Info(1,argv[0]); + } + else if(!strcmp(argv[i]+1, "help") || + !strcmp(argv[i]+1, "h") || + !strcmp(argv[i]+1, "-help") || + !strcmp(argv[i]+1, "-h")){ + Info(0,argv[0]); + } + else{ + fprintf(stderr, "Warning: Unknown option '%s'\n", argv[i]); + Info(0,argv[0]); + } + } + + else { + if(NbFileName<MAX_OPEN_FILES){ + strncpy(TheFileNameTab[NbFileName++], argv[i++], NAME_STR_L); + } + else{ + fprintf(stderr, "Error: Too many input files\n"); + exit(1); + } + } + + } + + strncpy(TheFileName, TheFileNameTab[0], NAME_STR_L); + +} + +char* ShowVisualClass(int cls){ + if(cls==TrueColor) return "TrueColor"; + if(cls==DirectColor) return "DirectColor"; + if(cls==PseudoColor) return "PseudoColor"; + if(cls==StaticColor) return "StaticColor"; + if(cls==GrayScale) return "GrayScale"; + if(cls==StaticGray) return "StaticGray"; + return "Unknown"; +} + +/* ------------------------------------------------------------------------ */ +/* M a i n */ +/* ------------------------------------------------------------------------ */ + +int main(int argc, char *argv[]){ + int i; + XColor ov_color_def, ov_color_exact; + + /* Gmsh default context options */ + + InitContext(&CTX); + + /* Command line options */ + + Get_Options(argc, argv); + + /* Initialize the static Mesh */ + + M.Vertices = NULL ; + M.VertexEdges = NULL ; + M.Simplexes = NULL ; + M.Points = NULL ; + M.Curves = NULL ; + M.SurfaceLoops = NULL ; + M.EdgeLoops = NULL ; + M.Surfaces = NULL ; + M.Volumes = NULL ; + M.PhysicalGroups = NULL ; + M.Metric = NULL ; + + /* Signal handling */ + + signal(SIGINT, Signal); + signal(SIGSEGV, Signal); + signal(SIGFPE, Signal); + + /* Non-interactive Gmsh */ + + if(CTX.interactive){ + OpenProblem(TheFileName); + if(yyerrorstate) + exit(1); + else{ + if(NbFileName>1){ + for(i=1;i<NbFileName;i++) MergeProblem(TheFileNameTab[i]); + } + if(INITIALBGMESH == ONFILE){ + MergeProblem(TheBgmFileName); + if(List_Nbr(Post_ViewList)){ + BGMWithView((Post_View*)List_Pointer(Post_ViewList, List_Nbr(Post_ViewList)-1)); + TYPBGMESH = ONFILE; + Create_BgMesh(TYPBGMESH,.2,THEM); + } + else{ + Msg(ERROR, "Invalid background mesh (no view)"); + } + } + if(CTX.interactive > 0){ + mai3d(THEM, CTX.interactive); + Print_Mesh(THEM,NULL,CTX.mesh.format); + } + exit(1); + } + } + + + /* Interactive Gmsh */ + + CTX.interactive = -1 ; /* The GUI is not ready yet for interactivity */ + + /* Text for about window */ + + sprintf(TextAbout, "%s\n \n%s%g\n%s\n%s\n%s\n%s\n%s\n%s\n \n%s\n \n" + "Type 'gmsh -help' for command line options", + gmsh_progname, gmsh_version, GMSH_VERSION, + gmsh_os, gmsh_date, gmsh_host, gmsh_packager, + gmsh_email, gmsh_url, gmsh_copyright); + + /* Xlib Threads init */ + +#ifndef _NOTHREADS + if(CTX.threads){ + if(!XInitThreads()){ + Msg(WARNING, "Xlib is not thread safe: reverting to '-nothreads'"); + CTX.threads = 0; + } + } +#else + CTX.threads = 0; +#endif + + /* Xtoolkit init */ + + XtToolkitInitialize(); + +#ifndef _NOTHREADS + if(CTX.threads){ + if(!XtToolkitThreadInitialize()){ + Msg(WARNING, "Xtoolkit is not thread safe: reverting to '-nothreads'"); + CTX.threads = 0; + } + } +#endif + + XCTX.AppContext = XtCreateApplicationContext(); + + /* X/Motif default resources */ + + XtAppSetFallbackResources(XCTX.AppContext, FallbackResources); + + /* Open display */ + + XCTX.display = XtOpenDisplay(XCTX.AppContext, NULL, "gmshGW", ".gmshrc", + NULL, 0, &argc, argv); + + if(!XCTX.display) + Msg(ERROR, "Unable to open the specified display. Set the `DISPLAY'\n" + " environment variable properly or use the `xhost' command\n" + " to authorize access to the display"); + + /* Check for GLX extension; for Mesa, this is always OK */ + + if(!glXQueryExtension(XCTX.display,NULL,NULL)) + Msg(ERROR, "The specified display does not support the OpenGL extension (GLX).\n" + " You may consider using Mesa instead"); + + /* Init with default screen num and default depth */ + + XCTX.scrnum = DefaultScreen(XCTX.display); + XCTX.depth = DefaultDepth(XCTX.display, XCTX.scrnum); + + /* Init with default visual for the gui */ + + XCTX.gui.visual = DefaultVisual(XCTX.display,XCTX.scrnum); + + /* Find visual the regular way for glw */ + + if(CTX.db){ + if(!(XCTX.glw.visinfo = + glXChooseVisual(XCTX.display,XCTX.scrnum, glw_attrib_db))){ + Msg(WARNING,"GBA double buffured visual not available"); + CTX.db = 0; + } + } + + if(!CTX.db){ + if(!(XCTX.glw.visinfo = + glXChooseVisual(XCTX.display,XCTX.scrnum, glw_attrib_sb))) + Msg(ERROR, "RGBA single buffured visual not available"); + } + + Msg(INFOS,"Visual id=%lx depth=%d screen=%d bits/rgb=%d class=%s dblbuf=%d", + XCTX.glw.visinfo->visualid, XCTX.glw.visinfo->depth, + XCTX.glw.visinfo->screen, XCTX.glw.visinfo->bits_per_rgb, +#if defined(__cplusplus) || defined(c_plusplus) + ShowVisualClass(XCTX.glw.visinfo->c_class), +#else + ShowVisualClass(XCTX.glw.visinfo->class), +#endif + CTX.db); + + /* Find visual the regular way for glo */ + +#ifndef _NOOV + if(CTX.overlay){ + if(!(XCTX.glo.visinfo = glXChooseVisual(XCTX.display,XCTX.scrnum,glo_attrib))){ + Msg(INFOS, "Overlay visual not available (using blend function instead)"); + CTX.overlay = 0; + CTX.geom.highlight = 0; + } + } +#else + CTX.overlay = 0 ; + CTX.geom.highlight = 0; +#endif + + if(CTX.overlay){ + Msg(INFO,"Overlay Visual id=%lx depth=%d screen=%d bits/rgb=%d class=%s\n", + XCTX.glo.visinfo->visualid, XCTX.glo.visinfo->depth, + XCTX.glo.visinfo->screen, XCTX.glo.visinfo->bits_per_rgb, +#if defined(__cplusplus) || defined(c_plusplus) + ShowVisualClass(XCTX.glo.visinfo->c_class) +#else + ShowVisualClass(XCTX.glo.visinfo->class) +#endif + ); + } + + + /* Init with default colormaps */ + + XCTX.gui.colormap = DefaultColormap(XCTX.display,0); + XCTX.glw.colormap = DefaultColormap(XCTX.display,0); + XCTX.glo.colormap = DefaultColormap(XCTX.display,0); + + /* + If not using default visual (i.e. not using the gui visual), we need a colormap for + this visual. Yes, the GL widget can allocate one itself, but we want to make sure + the GUI and the 3D have the same one (if hardware does not allow more than one + simultaneously). This prevents nasty flashing when the window with the 3D widget + looses the focus. + */ + + if(!CTX.flash && (XCTX.glw.visinfo->visual != XCTX.gui.visual)){ + Msg(INFOS,"Making another colormap for graphic window"); + XCTX.glw.colormap = XCreateColormap(XCTX.display, RootWindow(XCTX.display,XCTX.scrnum), + XCTX.glw.visinfo->visual, AllocNone); + if(!XCTX.glw.colormap) + Msg(ERROR, "Unable to create colormap for graphic window: Try option '-flash'"); + } + + if(CTX.overlay){ + if(!CTX.flash && (XCTX.glo.visinfo->visual != XCTX.gui.visual)){ + Msg(INFOS, "Making another colormap for overlay window"); + XCTX.glo.colormap = XCreateColormap(XCTX.display, RootWindow(XCTX.display,XCTX.scrnum), + XCTX.glo.visinfo->visual, AllocNone); + if(!XCTX.glo.colormap) + Msg(ERROR, "Unable to create private colormap for overlay window:\n" + " Try '-noov' and/or '-flash' options"); + } + } + + /* Force to use common visual for GUI and GL? Maybe you can invoke + some hardware interrogation function and see if more than one + hardware map is supported. Here, we check for the -samevisual + flag */ + + if(CTX.same_visual){ + XCTX.gui.visual = XCTX.glw.visinfo->visual; + XCTX.gui.colormap = XCTX.glw.colormap; + } + + /* Create all the motif widgets */ + + CreateWidgets(&WID); + + /* create the OpenGL contexts */ + + XCTX.glw.context = glXCreateContext(XtDisplay(WID.G.glw),XCTX.glw.visinfo,NULL,GL_TRUE); + + if(CTX.overlay){ + XCTX.glo.context = glXCreateContext(XtDisplay(WID.G.glo), + XCTX.glo.visinfo,NULL,GL_TRUE); + + if (!XAllocNamedColor(XCTX.display, XCTX.glo.colormap, + "white", &ov_color_def, &ov_color_exact)) { + Msg(WARNING, "Couldn't allocate white for overlay window: Reverting to '-noov'"); + CTX.overlay = 0; + } + else + XCTX.xcolor.ovwhite = ov_color_def.pixel; + } + + if(CTX.overlay){ + if (!XAllocNamedColor(XCTX.display, XCTX.glo.colormap, + "black", &ov_color_def, &ov_color_exact)) { + Msg(WARNING, "Couldn't allocate black for overlay window: Reverting to '-noov'"); + CTX.overlay = 0; + } + else + XCTX.xcolor.ovblack = ov_color_def.pixel; + } + + /* X font initialisation */ + XCTX.xfont.helve = XLoadQueryFont(XCTX.display, CTX.font_string); + XCTX.xfont.fixed = XLoadQueryFont(XCTX.display, CTX.colorbar_font_string); + + if(XCTX.xfont.helve == NULL){ + Msg(WARNING, "Unable to load font %s", CTX.font_string); + XCTX.xfont.helve = XCTX.xfont.fixed ; + } + if(XCTX.xfont.fixed == NULL){ + Msg(ERROR, "Unable to load font %s", CTX.colorbar_font_string); + exit(1); + } + + XCTX.xfont.helve_h = XCTX.xfont.helve->max_bounds.ascent + + XCTX.xfont.helve->max_bounds.descent; + XCTX.xfont.helve_a = XCTX.xfont.helve->max_bounds.ascent; + XCTX.xfont.helve_w = XCTX.xfont.helve->max_bounds.width; + + XCTX.xfont.fixed_h = XCTX.xfont.fixed->max_bounds.ascent + + XCTX.xfont.fixed->max_bounds.descent; + XCTX.xfont.fixed_a = XCTX.xfont.fixed->max_bounds.ascent; + XCTX.xfont.fixed_w = XCTX.xfont.fixed->max_bounds.width; + + /* X color initialisation (set the pixel format and allocate some colors in XCTX) */ + + XColorInitialize(); + + /* Force widget geometry */ + + ForceGeometry(&WID); + + /* Register all the callbacks */ + + RegisterCallbacks(&WID); + + /* Realize widgets in the 3 windows (M=menu, G=graphics, C=command) */ + + XtRealizeWidget(WID.M.shell); + XtRealizeWidget(WID.G.shell); + if(CTX.command_win) XtRealizeWidget(WID.C.shell); + + /* Create the pixmaps */ + + CreatePixmaps(&WID, &PIX, XCTX.depth); + + /* Select input events for the graphic window and raise overlay window */ + + if(CTX.overlay){ + XRaiseWindow(XtDisplay(WID.G.glo), XtWindow(WID.G.glo)); + XSelectInput(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), EV_MASK); + } + else{ + XSelectInput(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), EV_MASK); + } + + /* OpenGL display list for the font */ + + if((CTX.font_base = glGenLists(XCTX.xfont.helve->max_char_or_byte2+1)) == 0) + Msg(ERROR, "Font out of OpenGL display lists"); + + glXUseXFont(XCTX.xfont.helve->fid, + XCTX.xfont.helve->min_char_or_byte2, + XCTX.xfont.helve->max_char_or_byte2-XCTX.xfont.helve->min_char_or_byte2+1, + CTX.font_base+XCTX.xfont.helve->min_char_or_byte2); + + /* The GUI is ready */ + CTX.interactive = 0 ; + + /* Say welcome! */ + + TextBuffer = (char*)Malloc(1024*sizeof(char)); + Msg(STATUS, "Ready"); + Msg(SELECT, "Gmsh %g", GMSH_VERSION); + + /* Open input file */ + + OpenProblem(TheFileName); + + /* Merge all Input Files if any, then init first context (geometry or post) */ + + if(NbFileName>1){ + for(i=1;i<NbFileName;i++) MergeProblem(TheFileNameTab[i]); + ActualizeContextCb (NULL,(XtPointer)CONTEXT_POST,NULL); + } + else { + ActualizeContextCb(NULL,(XtPointer)CONTEXT_GEOM,NULL); + } + + /* Read background mesh on disk if any */ + + if(INITIALBGMESH == ONFILE){ + MergeProblem(TheBgmFileName); + if(List_Nbr(Post_ViewList)){ + BGMWithView((Post_View*)List_Pointer(Post_ViewList, List_Nbr(Post_ViewList)-1)); + TYPBGMESH = ONFILE; + Create_BgMesh(TYPBGMESH,.2,THEM); + } + else{ + Msg(ERROR, "Invalid background mesh (no view)"); + } + } + + /* Compute viewport and Draw */ + EXPOSE = 1; + Init(); + Draw(); + + /* Loop until were done */ + + XtAppMainLoop(XCTX.AppContext); + + /* never here */ + +} + diff --git a/Unix/Main.h b/Unix/Main.h new file mode 100644 index 0000000000000000000000000000000000000000..fc72b7e065057375bf3054d2f26c10926dae51f5 --- /dev/null +++ b/Unix/Main.h @@ -0,0 +1,11 @@ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#include "Const.h" + +void OpenProblem(char *name); +void MergeProblem(char *name); + +extern char TheFileName[NAME_STR_L], TheBaseFileName[NAME_STR_L]; + +#endif diff --git a/Unix/Makefile b/Unix/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..01131100b588ad7721e1b07bc5f070d013aea3e9 --- /dev/null +++ b/Unix/Makefile @@ -0,0 +1,174 @@ +# +# Makefile for "libUnix.a" +# + +.IGNORE: + +CC = c++ +C_FLAGS = -g -Wall + +VERSION_FLAGS = -D_NOTHREADS +OS_FLAGS = -D_UNIX + +GL_INCLUDE = -I$(HOME)/SOURCES/Mesa-3.1/include\ + -I$(HOME)/SOURCES/Mesa-3.1/include/GL +MOTIF_INCLUDE = -I/usr/X11R6/LessTif/Motif1.2/include + +RM = rm +RMFLAGS = -f +RANLIB = ranlib + +LIB = ../lib/libUnix.a +INCLUDE = -I../Common -I../DataStr -I../Graphics -I../Geo\ + -I../Mesh -I../Parser -I../Unix + +CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(VERSION_FLAGS) $(INCLUDE)\ + $(MOTIF_INCLUDE) $(GL_INCLUDE) + +SRC = Main.cpp \ + Widgets.cpp \ + Geometry.cpp \ + Register.cpp \ + Pixmaps.cpp \ + XDump.cpp \ + XColors.cpp \ + Message.cpp \ + CbContext.cpp \ + CbPost.cpp \ + CbColorbar.cpp \ + CbGeom.cpp \ + CbMesh.cpp \ + CbOptions.cpp \ + CbFile.cpp \ + CbInput.cpp \ + CbGeneral.cpp + + +OBJ = $(SRC:.cpp=.o) + +.SUFFIXES: .o .cpp + +$(LIB): $(OBJ) + ar ruvs $(LIB) $(OBJ) + $(RANLIB) $(LIB) + +.cpp.o: + $(CC) $(CFLAGS) -c $< + +clean: + $(RM) $(RMFLAGS) *.o + +lint: + $(LINT) $(CFLAGS) $(SRC) + +depend: + (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ + $(CC) -MM $(CFLAGS) ${SRC} \ + ) >Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) $(RMFLAGS) Makefile.new + +# DO NOT DELETE THIS LINE +Main.o: Main.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \ + ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ + ../Common/GmshUI.h ../Geo/Geo.h ../Geo/Verif.h ../Mesh/Mesh.h \ + ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \ + ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h \ + ../Common/Context.h ../Parser/Parser.h ../Geo/MinMax.h Widgets.h \ + Pixmaps.h XColors.h XContext.h XRessources.h CbContext.h CbGeom.h \ + Register.h Geometry.h ../Common/Static.h ../Common/Version.h XStatic.h +Widgets.o: Widgets.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Mesh/Mesh.h \ + ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Common/Context.h XContext.h \ + Info.h Widgets.h Help.h +Geometry.o: Geometry.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h \ + ../Common/Context.h XContext.h Widgets.h +Register.o: Register.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h \ + ../Common/Context.h XContext.h Widgets.h Register.h CbOptions.h \ + CbContext.h CbFile.h CbGeom.h CbMesh.h CbPost.h +Pixmaps.o: Pixmaps.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h Widgets.h \ + ../Common/Context.h Pixmaps.h Bitmaps.h XColors.h +XDump.o: XDump.cpp +XColors.o: XColors.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h XContext.h +Message.o: Message.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h \ + ../Common/Version.h ../Common/Context.h Widgets.h +CbContext.o: CbContext.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \ + ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h Widgets.h \ + ../Common/Context.h XContext.h CbContext.h CbGeom.h CbMesh.h +CbPost.o: CbPost.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \ + ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h Widgets.h \ + ../Common/Context.h XContext.h Main.h CbPost.h CbGeom.h CbMesh.h \ + CbColorbar.h +CbColorbar.o: CbColorbar.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h \ + ../Common/Const.h XColors.h Widgets.h Register.h ../Common/Context.h \ + XContext.h ../Graphics/ColorTable.h CbColorbar.h +CbGeom.o: CbGeom.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \ + ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h Widgets.h \ + ../Common/Context.h ../Geo/Verif.h Main.h CbGeom.h +CbMesh.o: CbMesh.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \ + ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \ + ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h CbMesh.h \ + ../Common/Context.h Widgets.h +CbOptions.o: CbOptions.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \ + ../Geo/Verif.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h \ + ../Graphics/Draw.h ../Common/Views.h ../Common/Const.h \ + ../Graphics/ColorTable.h Widgets.h Pixmaps.h ../Common/Context.h \ + XContext.h Register.h CbGeneral.h CbOptions.h CbGeom.h CbMesh.h \ + CbPost.h +CbFile.o: CbFile.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h Main.h \ + ../Common/Const.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h \ + ../Graphics/Draw.h ../Common/Views.h ../Graphics/ColorTable.h Widgets.h \ + ../Common/Context.h XContext.h CbFile.h CbColorbar.h XDump.h \ + ../Graphics/gl2ps.h ../Graphics/gl2gif.h +CbInput.o: CbInput.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Mesh/Mesh.h \ + ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \ + ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h Widgets.h \ + ../Common/Context.h XContext.h Register.h CbContext.h CbGeneral.h \ + CbGeom.h CbPost.h CbMesh.h +CbGeneral.o: CbGeneral.cpp ../Common/Gmsh.h ../Common/Message.h \ + ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \ + ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Mesh/Mesh.h \ + ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \ + ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \ + ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h \ + ../Common/Context.h XContext.h Widgets.h diff --git a/Unix/Message.cpp b/Unix/Message.cpp new file mode 100644 index 0000000000000000000000000000000000000000..52543d16e9c05dcc8bbefdec9ee6c70eb0897adc --- /dev/null +++ b/Unix/Message.cpp @@ -0,0 +1,243 @@ + +#include <signal.h> +#include <sys/resource.h> + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Version.h" +#include "Context.h" +#include "Widgets.h" + +extern Context_T CTX; +extern Widgets_T WID; + +/* ------------------------------------------------------------------------ */ +/* I n f o */ +/* ------------------------------------------------------------------------ */ + +extern char gmsh_progname[], gmsh_version[], gmsh_os[], gmsh_date[]; +extern char gmsh_host[], gmsh_packager[], gmsh_email[], gmsh_url[]; +extern char gmsh_copyright[] ; + +char clargs[] = + "Usage: %s [options] [files]\n" + "Mesh options:\n" + " -0 parse input and exit\n" + " -1, -2, -3 batch 1-, 2- or 3-dimensional mesh\n" + " -format msh|unv mesh format (default: msh)\n" + " -algo iso|aniso mesh algorithm (default: iso)\n" + " -smooth int mesh smoothing (default: 3)\n" + " -degree int mesh degree (default: 1)\n" + " -scale float scaling factor (default: 1.0)\n" + " -bgm file load backround mesh from file\n" + " -recombine recombine extruded meshes\n" + "Post Processing options:\n" + " -dl enable display lists\n" + " -noview hide all views at startup\n" + "Display options:\n" + " -nodb no double buffer\n" + " -noov no overlay visual\n" + " -alpha enable alpha blending\n" + " -visinfo show visual information at startup\n" + " -geometry geom specify main window geometry\n" + " -viewport 9*float specify rotation, translation and scale\n" + " -display disp specify display\n" + " -perspective perspective instead of orthographic projection\n" + " -flash allow colormap flashing\n" + " -samevisual force same visual for OpenGL and GUI\n" + "Other options:\n" + " -threads enable threads\n" + " -path string path for included files\n" + " -version show version number\n" + " -info show detailed version information\n" + " -help show this message\n" + ; + +void Info (int level, char *arg0){ + switch(level){ + case 0 : + fprintf(stderr, "%s\n", gmsh_progname); + fprintf(stderr, "%s\n", gmsh_copyright); + fprintf(stderr, clargs, arg0); + exit(1); + case 1: + fprintf(stderr, "%s%g\n", gmsh_version, GMSH_VERSION); + fprintf(stderr, "%s\n", gmsh_os); + fprintf(stderr, "%s\n", gmsh_date); + fprintf(stderr, "%s\n", gmsh_host); + fprintf(stderr, "%s\n", gmsh_packager); + fprintf(stderr, "%s\n", gmsh_email); + fprintf(stderr, "%s\n", gmsh_url); + exit(1) ; + case 2 : + fprintf(stderr, "%g\n", GMSH_VERSION); + exit(1); + default : + break; + } +} + + +/* ------------------------------------------------------------------------ */ +/* S i g n a l */ +/* ------------------------------------------------------------------------ */ + + +void Signal (int sig_num){ + + switch (sig_num){ + case SIGSEGV : + Msg(ERROR, "Segmentation Violation (invalid memory reference)\n" + "----------------------------------------------------------------------\n" + "You have probably discovered a bug in Gmsh...\n" + "You may e-mail the context in which it occurred to one of the authors.\n" + "Type 'gmsh -version' to get feedback information."); + break; + case SIGFPE : Msg(ERROR, "Floating point exception (division by zero?)"); break; + case SIGINT : Msg(ERROR, "Interrupt (generated from terminal special char)"); break; + default : Msg(ERROR, "Unknown signal"); break; + } +} + + +/* ------------------------------------------------------------------------ */ +/* M s g */ +/* ------------------------------------------------------------------------ */ + +extern char *TextBuffer; + +#define PUT_IN_COMMAND_WIN \ + vsprintf(TextBuffer, fmt, args); \ + XmListAddItem(WID.C.commandList,XmStringCreateSimple(TextBuffer),0); \ + XtSetArg(arg[0], XmNitemCount, &nb); \ + XtSetArg(arg[1], XmNvisibleItemCount, &nbvis); \ + XtGetValues(WID.C.commandList, arg, 2); \ + XmListSetPos(WID.C.commandList,(nb>nbvis)?nb-nbvis+1:0); \ + XmUpdateDisplay(WID.C.commandList); + +void Msg(int level, char *fmt, ...){ + va_list args; + int abort=0; + Arg arg[2]; + int nb, nbvis; + + va_start (args, fmt); + + switch(level){ + + case PARSER_ERROR : + if(CTX.interactive || !CTX.command_win){ + fprintf(stderr, "Parse Error: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + } + else{ + PUT_IN_COMMAND_WIN ; + } + break ; + + case PARSER_INFO : + if(CTX.interactive || !CTX.command_win){ + fprintf(stderr, "Parse Info: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + } + else{ + PUT_IN_COMMAND_WIN ; + } + break ; + + case ERROR : + if(CTX.interactive || !CTX.command_win){ + fprintf(stderr, "Error: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + abort = 1; + } + else{ + PUT_IN_COMMAND_WIN ; + } + break ; + + case WARNING : + if(CTX.interactive || !CTX.command_win){ + fprintf(stderr, "Warning: "); vfprintf(stderr, fmt,args); fprintf(stderr, "\n"); + } + else { + PUT_IN_COMMAND_WIN ; + } + break; + + case INFOS : + if(CTX.interactive || !CTX.command_win){ + vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + } + else{ + PUT_IN_COMMAND_WIN ; + } + break; + + case INFO : + if(CTX.interactive){ + vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + } + else{ + vsprintf(TextBuffer, fmt, args); + XtVaSetValues(WID.G.infoLabel, XmNlabelString, XmStringCreateSimple(TextBuffer), NULL); + XmUpdateDisplay(WID.G.infoLabel); + } + break; + + case SELECT : + if(CTX.interactive){ + vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + } + else{ + vsprintf(TextBuffer, fmt, args); + XtVaSetValues(WID.G.selectLabel, XmNlabelString, XmStringCreateSimple(TextBuffer), NULL); + XmUpdateDisplay(WID.G.selectLabel); + } + break; + + case STATUS : + if(CTX.interactive){ + vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + } + else{ + vsprintf(TextBuffer, fmt, args); + XtVaSetValues(WID.G.statusLabel, XmNlabelString, XmStringCreateSimple(TextBuffer), NULL); + XmUpdateDisplay(WID.G.statusLabel); + } + break; + } + + va_end (args); + + if(abort) exit(1); + +} + + +/* ------------------------------------------------------------------------ */ +/* C p u */ +/* ------------------------------------------------------------------------ */ + +void GetResources(long *s, long *us, long *mem){ + static struct rusage r; + + getrusage(RUSAGE_SELF,&r); + *s = (long)r.ru_utime.tv_sec ; + *us = (long)r.ru_utime.tv_usec ; + *mem = (long)r.ru_maxrss ; +} + +void PrintResources(FILE *stream, char *fmt, long s, long us, long mem){ + fprintf(stream, "Resources: %scpu %ld.%ld s / mem %ld kb\n", fmt, s, us, mem); +} + +double Cpu(void){ + long s, us, mem; + GetResources(&s, &us, &mem); + return (double)s + (double)us/1.e6 ; +} + +/* ------------------------------------------------------------------------ */ +/* P r o g r e s s */ +/* ------------------------------------------------------------------------ */ + +void Progress(int i){ +} diff --git a/Unix/Pixmaps.cpp b/Unix/Pixmaps.cpp new file mode 100644 index 0000000000000000000000000000000000000000..41095f5fc4cadd53d1908625c4e4bfb4e193eb09 --- /dev/null +++ b/Unix/Pixmaps.cpp @@ -0,0 +1,128 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Widgets.h" +#include "Context.h" +#include "Pixmaps.h" +#include "Bitmaps.h" +#include "XColors.h" + +extern Widgets_T WID; +extern Context_T CTX; + +Pixmap bm_to_px(Widget w, void *bits, int width, int height, int depth, int mode){ + Display *display ; + Window window ; + int screen ; + Pixmap ret_pixmap; + Pixel fg, bg; + + display = XtDisplay(w); + window = XtScreen(WID.M.shell)->root; /* XtWindow(w); */ + screen = DefaultScreen(display); + + if (DisplayCells(display, screen) > 2 && depth > 1) { + + switch (mode) { + case BM_PX_BW: + fg = BlackPixel(display, screen); + bg = WhitePixel(display, screen); + break; + case BM_PX_BWREV: + fg = WhitePixel(display, screen); + bg = BlackPixel(display, screen); + break; + case BM_PX_WHITE: + fg = WhitePixel(display, screen); + XtVaGetValues(w,XmNbackground, &bg,NULL); + break; + case BM_PX_BLACK: + fg = BlackPixel(display, screen); + XtVaGetValues(w,XmNbackground, &bg,NULL); + break; + case BM_PX_RED: + fg = AllocateColorInt(255,0,0) ; + XtVaGetValues(w,XmNbackground, &bg,NULL); + break; + case BM_PX_HIGHLIGHT: + XtVaGetValues(w,XmNhighlightColor, &fg,XmNbackground, &bg,NULL); + break; + case BM_PX_NORMAL: + default: + XtVaGetValues(w,XmNforeground, &fg,XmNbackground, &bg,NULL ); + break; + } + } + else { + fg = BlackPixel(display, screen); + bg = WhitePixel(display, screen); + } + + ret_pixmap = + XCreatePixmapFromBitmapData(display, window, (char*)bits, width, height, fg, bg, depth); + + if (ret_pixmap == (Pixmap) NULL){ + Msg(WARNING, "Failing to create pixmap"); + return ((Pixmap) NULL); + } + + return (ret_pixmap); +} + + +void Set_AnimPixmap(Widgets_T *w, Pixmaps_T *p, int start){ + if(start) + XtVaSetValues(w->G.Butt[5], XmNlabelPixmap, p->G.start, NULL); + else + XtVaSetValues(w->G.Butt[5], XmNlabelPixmap, p->G.stop, NULL); +} + +void CreatePixmaps(Widgets_T *w, Pixmaps_T *p, int depth){ + + /* Icons for 3 main windows */ + + XtVaSetValues(w->M.shell, + XmNiconPixmap, + XCreateBitmapFromData(XtDisplay(w->M.shell),XtScreen(w->M.shell)->root, + (char*)g1_bits, g1_width, g1_height), + NULL); + + + XtVaSetValues(w->G.shell, + XmNiconPixmap, + XCreateBitmapFromData(XtDisplay(w->G.shell), XtScreen(w->G.shell)->root, + (char*)g2_bits, g2_width, g2_height), + NULL); + + if(CTX.command_win) + XtVaSetValues(w->C.shell, + XmNiconPixmap, + XCreateBitmapFromData(XtDisplay(w->C.shell), XtScreen(w->C.shell)->root, + (char*)g3_bits, g3_width, g3_height), + NULL); + + /* Graphic window */ + + p->G.abort = bm_to_px(w->G.Butt[6], abort_bits, + abort_width, abort_height, depth, BM_PX_RED); + XtVaSetValues(w->G.Butt[6], XmNlabelPixmap, p->G.abort, NULL); + + p->G.abort_insens = bm_to_px(w->G.Butt[6], abort_bits, + abort_width, abort_height, depth, BM_PX_NORMAL); + XtVaSetValues(w->G.Butt[6], XmNlabelInsensitivePixmap, p->G.abort_insens, NULL); + + p->G.start = bm_to_px(w->G.Butt[5], start_bits, + start_width, start_height, depth, BM_PX_NORMAL); + p->G.stop = bm_to_px(w->G.Butt[5], stop_bits, + stop_width, stop_height, depth, BM_PX_NORMAL); + Set_AnimPixmap(w, p, 1); + + /* About window */ + + p->HD.about = bm_to_px(w->HD.aboutDialog, about_bits, + about_width, about_height, depth, BM_PX_NORMAL); + XtVaSetValues(w->HD.aboutDialog, XmNsymbolPixmap, p->HD.about, NULL); + + +} + diff --git a/Unix/Pixmaps.h b/Unix/Pixmaps.h new file mode 100644 index 0000000000000000000000000000000000000000..88b301ef76f55c0d4cba456887d8b24caf8c2e3d --- /dev/null +++ b/Unix/Pixmaps.h @@ -0,0 +1,28 @@ +#ifndef _PIXMAPS_H_ +#define _PIXMAPS_H_ + +#define BM_PX_NORMAL 0 /* normal/normal */ +#define BM_PX_HIGHLIGHT 1 /* highlight/normal */ +#define BM_PX_WHITE 2 /* white/normal */ +#define BM_PX_BLACK 3 /* black/normal */ +#define BM_PX_BW 4 /* black/white */ +#define BM_PX_BWREV 5 /* white/black */ +#define BM_PX_RED 6 /* red/normal */ + +typedef struct { + + struct { + Pixmap abort, abort_insens, start, stop ; + } G ; + + struct { + Pixmap about ; + } HD ; + +} Pixmaps_T ; + +void CreatePixmaps(Widgets_T *w, Pixmaps_T *p, int depth); +void Set_AnimCallback(Widgets_T *w, int start) ; +void Set_AnimPixmap(Widgets_T *w, Pixmaps_T *p, int start) ; + +#endif diff --git a/Unix/Register.cpp b/Unix/Register.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a4bccb36ddaa6516860d580ea7877cea69c4eeca --- /dev/null +++ b/Unix/Register.cpp @@ -0,0 +1,401 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Context.h" +#include "XContext.h" +#include "Widgets.h" +#include "Register.h" +#include "CbOptions.h" +#include "CbContext.h" +#include "CbFile.h" +#include "CbGeom.h" +#include "CbMesh.h" +#include "CbPost.h" + +extern Context_T CTX ; +extern XContext_T XCTX ; + +void RegisterCallbacks_M(Widgets_T *w){ + long int n ; + XtPointer l[5] ; + + register_activate_cb (w->M.fileButt[0], ManageCb, w->FD.openDialog); + register_activate_cb (w->M.fileButt[1], ManageCb, w->FD.mergeDialog); + register_activate_cb (w->M.fileButt[2], FileCb, FILE_SAVE_MESH); + register_activate_cb (w->M.fileButt[3], ManageCb, w->FD.saveAsDialog); + register_activate_cb (w->M.fileButt[4], ManageCb, w->FD.printDialog); + register_activate_cb (w->M.fileButt[5], ExitCb, NULL); + + register_activate_cb (w->M.moduleButt[0], ActualizeContextCb, CONTEXT_GEOM); + register_activate_cb (w->M.moduleButt[1], ActualizeContextCb, CONTEXT_MESH); + register_activate_cb (w->M.moduleButt[2], ActualizeContextCb, CONTEXT_POST); + + register_activate_cb (w->M.optionButt[0], ManageCb, w->OD.geomDialog); + register_activate_cb (w->M.optionButt[1], ManageCb, w->OD.meshDialog); + register_activate_cb (w->M.optionButt[2], ManageCb, w->OD.postDialog); + register_activate_cb (w->M.optionButt[3], ManageCb, w->OD.miscDialog); + register_activate_cb (w->M.optionButt[4], CurrentViewportCb, NULL); + register_activate_cb (w->M.optionButt[5], CurrentInfoCb, 1); + + register_activate_cb (w->M.helpButt[0], ManageCb, w->HD.keysDialog); + register_activate_cb (w->M.helpButt[1], ManageCb, w->HD.aboutDialog); + + register_popup_ev (w->M.modButt, w->M.modPop); + register_activate_cb (w->M.geomButt, ActualizeContextCb, CONTEXT_GEOM); + register_activate_cb (w->M.meshButt, ActualizeContextCb, CONTEXT_MESH); + register_activate_cb (w->M.postButt, ActualizeContextCb, CONTEXT_POST); + + register_activate_cb (w->M.navigButt[0], PreviousContextCb, CONTEXT_BACKWARD); + register_activate_cb (w->M.navigButt[1], PreviousContextCb, CONTEXT_FORWARD); + + l[0] = (XtPointer)CurrentViewCb ; + l[2] = (XtPointer)PostDialogCb ; + + for(n=0 ; n<NB_BUTT_MAX ; n++){ + register_activate_cb (w->M.pushButt[n], NextContextCb, n+1); + register_valchg_cb (w->M.toggleButt[n], SwapViewCb, n+1); + register_popup_ev (w->M.toggleButt[n], w->M.popMenu[n]); + register_activate_cb (w->M.removeButt[n], RemoveViewCb, n+1); + register_activate_cb (w->M.duplicateButt[n], DuplicateViewCb, n+1); + + l[1] = (XtPointer)(n+1) ; + l[4] = NULL ; + l[3] = (XtPointer)POST_LIGHT; register_valchg_cb_list (w->M.lightButt[n],l); + l[3] = (XtPointer)POST_ELEMENT; register_valchg_cb_list (w->M.elementButt[n],l); + l[3] = (XtPointer)POST_OFFSET; register_activate_cb_list (w->M.offsetButt[n],l); + l[3] = (XtPointer)POST_TIME_STEP; register_activate_cb_list (w->M.timeStepButt[n],l); + l[3] = (XtPointer)POST_SCALE; register_activate_cb_list (w->M.scaleButt[n],l); + l[3] = (XtPointer)POST_COLOR; register_activate_cb_list (w->M.colorButt[n],l); + l[3] = (XtPointer)POST_VECTOR; register_activate_cb_list (w->M.vectorButt[n],l); + l[3] = (XtPointer)POST_TIME_STEP; register_activate_cb_list (w->M.timeStepButt[n],l); + l[3] = (XtPointer)POST_EXPORT_BGM; register_activate_cb_list (w->M.exportBGMButt[n],l); + l[3] = (XtPointer)POST_APPLY_BGM; register_activate_cb_list (w->M.applyBGMButt[n],l); + } + +} + + +void RegisterCallbacks_G(Widgets_T *w){ + + register_GLexpose_cb (w->G.glw, ExposeCb, NULL); + register_GLresize_cb (w->G.glw, ResizeCb, NULL); + register_GLinit_cb (w->G.glw, InitCb, NULL); + register_GLinput_cb (w->G.glw, InputCb, NULL); + + if(CTX.overlay){ + register_GLexpose_cb (w->G.glo, ExposeCb, NULL); + register_GLresize_cb (w->G.glo, ResizeCb, NULL); + register_GLinput_cb (w->G.glo, InputCb, NULL); + } + + register_activate_cb (w->G.Butt[0], OptionsCb, OPTIONS_XVIEW); + register_activate_cb (w->G.Butt[1], OptionsCb, OPTIONS_YVIEW); + register_activate_cb (w->G.Butt[2], OptionsCb, OPTIONS_ZVIEW); + register_activate_cb (w->G.Butt[3], OptionsCb, OPTIONS_CVIEW); + register_activate_cb (w->G.Butt[4], OptionsCb, OPTIONS_PVIEW); + register_activate_cb (w->G.Butt[5], OptionsCb, OPTIONS_POST_ANIM_START); + register_activate_cb (w->G.Butt[6], OptionsCb, OPTIONS_MESH_ABORT); + +} + +void Set_AnimCallback(Widgets_T *w, int start){ + if(start){ + register_remove_cb (w->G.Butt[5], OptionsCb, OPTIONS_POST_ANIM_STOP); + register_activate_cb (w->G.Butt[5], OptionsCb, OPTIONS_POST_ANIM_START); + } + else{ + register_remove_cb (w->G.Butt[5], OptionsCb, OPTIONS_POST_ANIM_START); + register_activate_cb (w->G.Butt[5], OptionsCb, OPTIONS_POST_ANIM_STOP); + } +} + + +void RegisterCallbacks_C(Widgets_T *w){ + +} + + +void RegisterCallbacks_ED(Widgets_T *w){ + + register_ok_cb (w->ED.printDialog, FileCb, FILE_PRINT); + register_cancel_cb (w->ED.printDialog, FileCb, FILE_CANCEL); + + register_ok_cb (w->ED.saveDialog, FileCb, FILE_SAVE_COLORTABLE_AS); + register_cancel_cb (w->ED.saveDialog, FileCb, FILE_CANCEL); + +} + + +void RegisterCallbacks_FD(Widgets_T *w){ + + register_ok_cb (w->FD.openDialog, FileCb, FILE_LOAD_GEOM); + register_cancel_cb (w->FD.openDialog, ManageCb, w->FD.openDialog); + + register_ok_cb (w->FD.mergeDialog, FileCb, FILE_LOAD_POST); + register_cancel_cb (w->FD.mergeDialog, ManageCb, w->FD.mergeDialog); + + register_ok_cb (w->FD.saveDialog, FileCb, FILE_SAVE_COLORTABLE_AS); + register_cancel_cb (w->FD.saveDialog, ManageCb, w->FD.saveDialog); + + register_ok_cb (w->FD.saveAsDialog, FileCb, FILE_SAVE_MESH_AS); + register_cancel_cb (w->FD.saveAsDialog, ManageCb, w->FD.saveAsDialog); + register_activate_cb (w->FD.saveAsButt[0], OptionsCb, OPTIONS_MESH_FORMAT_MSH); + register_activate_cb (w->FD.saveAsButt[1], OptionsCb, OPTIONS_MESH_FORMAT_UNV); + /* + register_activate_cb (w->FD.saveAsButt[2], OptionsCb, OPTIONS_MESH_FORMAT_GREF); + */ + + register_ok_cb (w->FD.printDialog, FileCb, FILE_PRINT); + register_cancel_cb (w->FD.printDialog, ManageCb, w->FD.printDialog); + register_activate_cb (w->FD.printButt[0], OptionsCb, OPTIONS_PRINT_GL2PS_SIMPLE); + register_activate_cb (w->FD.printButt[1], OptionsCb, OPTIONS_PRINT_GL2PS_COMPLEX); + register_activate_cb (w->FD.printButt[2], OptionsCb, OPTIONS_PRINT_XDUMP); + register_activate_cb (w->FD.printButt[3], OptionsCb, OPTIONS_PRINT_GIF); + register_activate_cb (w->FD.printButt[4], OptionsCb, OPTIONS_PRINT_GLPRECURSIVE); + register_activate_cb (w->FD.printButt[5], OptionsCb, OPTIONS_PRINT_GLPIMAGE); + /* + register_activate_cb (w->FD.printButt[6], OptionsCb, OPTIONS_PRINT_XPM); + register_activate_cb (w->FD.printButt[7], OptionsCb, OPTIONS_PRINT_PS); + register_activate_cb (w->FD.printButt[8], OptionsCb, OPTIONS_PRINT_EPS); + */ +} + +void RegisterCallbacks_OD(Widgets_T *w){ + + register_ok_cb (w->OD.geomDialog, OptionsCb, OPTIONS_REPLOT); + register_cancel_cb (w->OD.geomDialog, ManageCb, w->OD.geomDialog); + register_valchg_cb (w->OD.geomVisibleTypeButt[0], OptionsCb, OPTIONS_GEOM_VISIBILITY_ENTITY); + register_valchg_cb (w->OD.geomVisibleTypeButt[1], OptionsCb, OPTIONS_GEOM_VISIBILITY_NUMBER); + register_valchg_cb (w->OD.geomVisibleButt[0], OptionsCb, OPTIONS_GEOM_POINTS); + register_valchg_cb (w->OD.geomVisibleButt[1], OptionsCb, OPTIONS_GEOM_LINES); + register_valchg_cb (w->OD.geomVisibleButt[2], OptionsCb, OPTIONS_GEOM_SURFACES); + register_valchg_cb (w->OD.geomVisibleButt[3], OptionsCb, OPTIONS_GEOM_VOLUMES); + register_activate_cb(w->OD.geomVisibleByNumText, OptionsCb, OPTIONS_GEOM_HIDE_SHOW); + register_valchg_cb (w->OD.geomNormalsScale, OptionsCb, OPTIONS_GEOM_NORMALS_SCALE); + register_drag_cb (w->OD.geomNormalsScale, OptionsCb, OPTIONS_GEOM_NORMALS_SCALE); + register_activate_cb(w->OD.geomNormalsText, OptionsCb, OPTIONS_GEOM_NORMALS_TEXT); + register_valchg_cb (w->OD.geomTangentsScale, OptionsCb, OPTIONS_GEOM_TANGENTS_SCALE); + register_drag_cb (w->OD.geomTangentsScale, OptionsCb, OPTIONS_GEOM_TANGENTS_SCALE); + register_activate_cb(w->OD.geomTangentsText, OptionsCb, OPTIONS_GEOM_TANGENTS_TEXT); + + register_ok_cb (w->OD.meshDialog, OptionsCb, OPTIONS_REPLOT); + register_cancel_cb (w->OD.meshDialog, ManageCb, w->OD.meshDialog); + register_valchg_cb (w->OD.meshAlgoButt[0], OptionsCb, OPTIONS_MESH_DEGRE2); + register_valchg_cb (w->OD.meshAlgoButt[1], OptionsCb, OPTIONS_MESH_ANISOTROPIC); + register_valchg_cb (w->OD.meshSmoothingScale, OptionsCb, OPTIONS_MESH_SMOOTHING_SCALE); + register_drag_cb (w->OD.meshSmoothingScale, OptionsCb, OPTIONS_MESH_SMOOTHING_SCALE); + register_activate_cb(w->OD.meshSmoothingText, OptionsCb, OPTIONS_MESH_SMOOTHING_TEXT); + register_valchg_cb (w->OD.meshVisibleTypeButt[0], OptionsCb, OPTIONS_MESH_VISIBILITY_ENTITY); + register_valchg_cb (w->OD.meshVisibleTypeButt[1], OptionsCb, OPTIONS_MESH_VISIBILITY_NUMBER); + register_valchg_cb (w->OD.meshVisibleButt[0], OptionsCb, OPTIONS_MESH_POINTS); + register_valchg_cb (w->OD.meshVisibleButt[1], OptionsCb, OPTIONS_MESH_LINES); + register_valchg_cb (w->OD.meshVisibleButt[2], OptionsCb, OPTIONS_MESH_SURFACES); + register_valchg_cb (w->OD.meshVisibleButt[3], OptionsCb, OPTIONS_MESH_VOLUMES); + register_activate_cb(w->OD.meshVisibleByNumText, OptionsCb, OPTIONS_MESH_HIDE_SHOW); + register_valchg_cb (w->OD.meshAspectButt[0], OptionsCb, OPTIONS_MESH_WIREFRAME); + register_valchg_cb (w->OD.meshAspectButt[1], OptionsCb, OPTIONS_MESH_HIDDEN_LINES); + register_valchg_cb (w->OD.meshAspectButt[2], OptionsCb, OPTIONS_MESH_SHADING); + register_valchg_cb (w->OD.meshExplodeScale, OptionsCb, OPTIONS_MESH_EXPLODE_SCALE); + register_drag_cb (w->OD.meshExplodeScale, OptionsCb, OPTIONS_MESH_EXPLODE_SCALE); + register_activate_cb(w->OD.meshExplodeText, OptionsCb, OPTIONS_MESH_EXPLODE_TEXT); + register_valchg_cb (w->OD.meshNormalsScale, OptionsCb, OPTIONS_MESH_NORMALS_SCALE); + register_drag_cb (w->OD.meshNormalsScale, OptionsCb, OPTIONS_MESH_NORMALS_SCALE); + register_activate_cb(w->OD.meshNormalsText, OptionsCb, OPTIONS_MESH_NORMALS_TEXT); + + register_ok_cb (w->OD.postDialog, OptionsCb, OPTIONS_REPLOT); + register_cancel_cb (w->OD.postDialog, ManageCb, w->OD.postDialog); + register_valchg_cb (w->OD.postLinkButt[0], OptionsCb, OPTIONS_POST_LINK_NONE); + register_valchg_cb (w->OD.postLinkButt[1], OptionsCb, OPTIONS_POST_LINK_VISIBLE); + register_valchg_cb (w->OD.postLinkButt[2], OptionsCb, OPTIONS_POST_LINK_ALL); + register_valchg_cb (w->OD.postAnimScale, OptionsCb, OPTIONS_POST_ANIM_DELAY); + register_drag_cb (w->OD.postAnimScale, OptionsCb, OPTIONS_POST_ANIM_DELAY); + + register_ok_cb (w->OD.miscDialog, OptionsCb, OPTIONS_REPLOT); + register_cancel_cb (w->OD.miscDialog, ManageCb, w->OD.miscDialog); + register_valchg_cb (w->OD.miscMiscButt[0], OptionsCb, OPTIONS_AXES); + register_valchg_cb (w->OD.miscMiscButt[1], OptionsCb, OPTIONS_LITTLE_AXES); + register_valchg_cb (w->OD.miscMiscButt[2], OptionsCb, OPTIONS_FAST_REDRAW); + register_valchg_cb (w->OD.miscMiscButt[3], OptionsCb, OPTIONS_DISPLAY_LISTS); + register_valchg_cb (w->OD.miscMiscButt[4], OptionsCb, OPTIONS_ALPHA_BLENDING); + register_valchg_cb (w->OD.miscColorSchemeScale, OptionsCb, OPTIONS_COLOR_SCHEME_SCALE); + register_drag_cb (w->OD.miscColorSchemeScale, OptionsCb, OPTIONS_COLOR_SCHEME_SCALE); + register_valchg_cb (w->OD.miscProjButt[0], OptionsCb, OPTIONS_ORTHOGRAPHIC); + register_valchg_cb (w->OD.miscProjButt[1], OptionsCb, OPTIONS_PERSPECTIVE); + register_valchg_cb (w->OD.miscLightScale[0], OptionsCb, OPTIONS_LIGHT_X_SCALE); + register_drag_cb (w->OD.miscLightScale[0], OptionsCb, OPTIONS_LIGHT_X_SCALE); + register_valchg_cb (w->OD.miscLightScale[1], OptionsCb, OPTIONS_LIGHT_Y_SCALE); + register_drag_cb (w->OD.miscLightScale[1], OptionsCb, OPTIONS_LIGHT_Y_SCALE); + register_valchg_cb (w->OD.miscLightScale[2], OptionsCb, OPTIONS_LIGHT_Z_SCALE); + register_drag_cb (w->OD.miscLightScale[2], OptionsCb, OPTIONS_LIGHT_Z_SCALE); + register_valchg_cb (w->OD.miscShineScale, OptionsCb, OPTIONS_SHINE_SCALE); + register_drag_cb (w->OD.miscShineScale, OptionsCb, OPTIONS_SHINE_SCALE); + + register_ok_cb (w->OD.viewportDialog, OptionsCb, OPTIONS_REPLOT); + register_cancel_cb (w->OD.viewportDialog, ManageCb, w->OD.viewportDialog); + register_valchg_cb (w->OD.viewportText[0][0], OptionsCb, OPTIONS_ROTX); + register_valchg_cb (w->OD.viewportText[0][1], OptionsCb, OPTIONS_ROTY); + register_valchg_cb (w->OD.viewportText[0][2], OptionsCb, OPTIONS_ROTZ); + register_valchg_cb (w->OD.viewportText[1][0], OptionsCb, OPTIONS_TRANX); + register_valchg_cb (w->OD.viewportText[1][1], OptionsCb, OPTIONS_TRANY); + register_valchg_cb (w->OD.viewportText[1][2], OptionsCb, OPTIONS_TRANZ); + register_valchg_cb (w->OD.viewportText[2][0], OptionsCb, OPTIONS_SCALEX); + register_valchg_cb (w->OD.viewportText[2][1], OptionsCb, OPTIONS_SCALEY); + register_valchg_cb (w->OD.viewportText[2][2], OptionsCb, OPTIONS_SCALEZ); + register_valchg_cb (w->OD.viewportLockButt[0][0], OptionsCb, OPTIONS_ROTX_LOCKED); + register_valchg_cb (w->OD.viewportLockButt[0][1], OptionsCb, OPTIONS_ROTY_LOCKED); + register_valchg_cb (w->OD.viewportLockButt[0][2], OptionsCb, OPTIONS_ROTZ_LOCKED); + register_valchg_cb (w->OD.viewportLockButt[1][0], OptionsCb, OPTIONS_TRANX_LOCKED); + register_valchg_cb (w->OD.viewportLockButt[1][1], OptionsCb, OPTIONS_TRANY_LOCKED); + register_valchg_cb (w->OD.viewportLockButt[1][2], OptionsCb, OPTIONS_TRANZ_LOCKED); + register_valchg_cb (w->OD.viewportLockButt[2][0], OptionsCb, OPTIONS_SCALEX_LOCKED); + register_valchg_cb (w->OD.viewportLockButt[2][1], OptionsCb, OPTIONS_SCALEY_LOCKED); + register_valchg_cb (w->OD.viewportLockButt[2][2], OptionsCb, OPTIONS_SCALEZ_LOCKED); + + register_ok_cb (w->OD.infoDialog, CurrentInfoCb, 0); + register_cancel_cb (w->OD.infoDialog, ManageCb, w->OD.infoDialog); + +} + +void RegisterCallbacks_HD(Widgets_T *w){ + +} + +void RegisterCallbacks_GD(Widgets_T *w){ + + register_ok_cb (w->GD.paramDialog, GeomCb, GEOM_PARAMETER_ADD); + register_cancel_cb (w->GD.paramDialog, ManageCb, w->GD.paramDialog); + register_valchg_cb (w->GD.paramText[0], GeomCb, GEOM_PARAMETER_NAME); + register_valchg_cb (w->GD.paramText[1], GeomCb, GEOM_PARAMETER_VALUE); + + register_ok_cb (w->GD.pointDialog, GeomCb, GEOM_POINT_ADD); + register_cancel_cb (w->GD.pointDialog, ManageCb, w->GD.pointDialog); + register_valchg_cb (w->GD.pointText[0], GeomCb, GEOM_POINT_X); + register_valchg_cb (w->GD.pointText[1], GeomCb, GEOM_POINT_Y); + register_valchg_cb (w->GD.pointText[2], GeomCb, GEOM_POINT_Z); + register_valchg_cb (w->GD.pointText[3], GeomCb, GEOM_POINT_L); + + register_cancel_cb (w->GD.rotDialog, ManageCb, w->GD.rotDialog); + register_valchg_cb (w->GD.rotText[0], GeomCb, GEOM_ROT_PX); + register_valchg_cb (w->GD.rotText[1], GeomCb, GEOM_ROT_PY); + register_valchg_cb (w->GD.rotText[2], GeomCb, GEOM_ROT_PZ); + register_valchg_cb (w->GD.rotText[3], GeomCb, GEOM_ROT_AX); + register_valchg_cb (w->GD.rotText[4], GeomCb, GEOM_ROT_AY); + register_valchg_cb (w->GD.rotText[5], GeomCb, GEOM_ROT_AZ); + register_valchg_cb (w->GD.rotText[6], GeomCb, GEOM_ROT_ANGLE); + + register_cancel_cb (w->GD.tranDialog, ManageCb, w->GD.tranDialog); + register_valchg_cb (w->GD.tranText[0], GeomCb, GEOM_TRAN_X); + register_valchg_cb (w->GD.tranText[1], GeomCb, GEOM_TRAN_Y); + register_valchg_cb (w->GD.tranText[2], GeomCb, GEOM_TRAN_Z); + + register_cancel_cb (w->GD.dilatDialog, ManageCb, w->GD.dilatDialog); + register_valchg_cb (w->GD.dilatText[0], GeomCb, GEOM_DILAT_X); + register_valchg_cb (w->GD.dilatText[1], GeomCb, GEOM_DILAT_Y); + register_valchg_cb (w->GD.dilatText[2], GeomCb, GEOM_DILAT_Z); + register_valchg_cb (w->GD.dilatText[3], GeomCb, GEOM_DILAT_F); + +} + +void RegisterCallbacks_MD(Widgets_T *w){ + + register_cancel_cb (w->MD.charLengthDialog, ManageCb, w->MD.charLengthDialog); + register_valchg_cb (w->MD.charLengthText, MeshCb, MESH_CHAR_LENGTH); + + register_cancel_cb (w->MD.trsfLineDialog, ManageCb, w->MD.trsfLineDialog); + register_valchg_cb (w->MD.trsfLineText[0], MeshCb, MESH_TRSF_LINE_TYPE); + register_valchg_cb (w->MD.trsfLineText[1], MeshCb, MESH_TRSF_LINE_PTS); + + register_cancel_cb (w->MD.trsfVolumeDialog, ManageCb, w->MD.trsfVolumeDialog); + register_valchg_cb (w->MD.trsfVolumeText, MeshCb, MESH_TRSF_VOL_NUM); + +} + +void RegisterCallbacks_PD(Widgets_T *w){ + + register_ok_cb (w->PD.offsetDialog, OptionsCb, OPTIONS_REPLOT); + register_cancel_cb (w->PD.offsetDialog, ManageCb, w->PD.offsetDialog); + register_valchg_cb (w->PD.offsetModeButt[0], PostCb, POST_OFFSET_TRANSLATE); + register_valchg_cb (w->PD.offsetModeButt[1], PostCb, POST_OFFSET_RAISE); + register_valchg_cb (w->PD.offsetScale[0], PostCb, POST_OFFSET_X_SCALE); + register_drag_cb (w->PD.offsetScale[0], PostCb, POST_OFFSET_X_SCALE); + register_activate_cb (w->PD.offsetText[0], PostCb, POST_OFFSET_X_TEXT); + register_valchg_cb (w->PD.offsetScale[1], PostCb, POST_OFFSET_Y_SCALE); + register_drag_cb (w->PD.offsetScale[1], PostCb, POST_OFFSET_Y_SCALE); + register_activate_cb (w->PD.offsetText[1], PostCb, POST_OFFSET_Y_TEXT); + register_valchg_cb (w->PD.offsetScale[2], PostCb, POST_OFFSET_Z_SCALE); + register_drag_cb (w->PD.offsetScale[2], PostCb, POST_OFFSET_Z_SCALE); + register_activate_cb (w->PD.offsetText[2], PostCb, POST_OFFSET_Z_TEXT); + + register_ok_cb (w->PD.timeStepDialog, OptionsCb, OPTIONS_REPLOT); + register_cancel_cb (w->PD.timeStepDialog, ManageCb, w->PD.timeStepDialog); + register_valchg_cb (w->PD.timeStepScale, PostCb, POST_TIME_STEP_SCALE); + register_drag_cb (w->PD.timeStepScale, PostCb, POST_TIME_STEP_SCALE); + register_activate_cb (w->PD.timeStepText, PostCb, POST_TIME_STEP_TEXT); + + register_ok_cb (w->PD.scaleDialog, OptionsCb, OPTIONS_REPLOT); + register_cancel_cb (w->PD.scaleDialog, ManageCb, w->PD.scaleDialog); + register_valchg_cb (w->PD.scaleShowButt, PostCb, POST_SCALE_SHOW); + register_valchg_cb (w->PD.scaleTransButt, PostCb, POST_SCALE_TRANSPARENCY); + register_valchg_cb (w->PD.scaleText[0], PostCb, POST_SCALE_FORMAT); + register_valchg_cb (w->PD.scaleText[1], PostCb, POST_SCALE_LABEL); + register_valchg_cb (w->PD.scaleRangeButt, PostCb, POST_SCALE_FORCE_RANGE); + register_valchg_cb (w->PD.scaleRangeText[0], PostCb, POST_SCALE_MIN); + register_valchg_cb (w->PD.scaleRangeText[1], PostCb, POST_SCALE_MAX); + register_valchg_cb (w->PD.scaleTypeButt[0], PostCb, POST_SCALE_TYPE_LIN); + register_valchg_cb (w->PD.scaleTypeButt[1], PostCb, POST_SCALE_TYPE_LOG); + register_valchg_cb (w->PD.scaleIntervalsButt[0], PostCb, POST_SCALE_INTERVALS_TYPE_ISO); + register_valchg_cb (w->PD.scaleIntervalsButt[1], PostCb, POST_SCALE_INTERVALS_TYPE_DISCRETE); + register_valchg_cb (w->PD.scaleIntervalsButt[2], PostCb, POST_SCALE_INTERVALS_TYPE_CONTINUOUS); + register_valchg_cb (w->PD.scaleIntervalsButt[3], PostCb, POST_SCALE_INTERVALS_TYPE_NUMERIC); + register_valchg_cb (w->PD.scaleIntervalsScale, PostCb, POST_SCALE_INTERVALS_SCALE); + register_drag_cb (w->PD.scaleIntervalsScale, PostCb, POST_SCALE_INTERVALS_SCALE); + register_activate_cb (w->PD.scaleIntervalsText, PostCb, POST_SCALE_INTERVALS_TEXT); + + register_ok_cb (w->PD.colorDialog, PostCb, POST_COLOR_REPLOT); + register_cancel_cb (w->PD.colorDialog, ManageCb, w->PD.colorDialog); + register_expose_cb (w->PD.colorDrawingArea, ColorBarExposeCb, NULL); + register_resize_cb (w->PD.colorDrawingArea, ColorBarResizeCb, NULL); + register_input_cb (w->PD.colorDrawingArea, ColorBarInputCb, NULL); + + register_ok_cb (w->PD.vectorDialog, OptionsCb, OPTIONS_REPLOT); + register_cancel_cb (w->PD.vectorDialog, ManageCb, w->PD.vectorDialog); + register_valchg_cb (w->PD.vectorTypeButt[0], PostCb, POST_VECTOR_TYPE_SEGMENT); + register_valchg_cb (w->PD.vectorTypeButt[1], PostCb, POST_VECTOR_TYPE_ARROW); + register_valchg_cb (w->PD.vectorTypeButt[2], PostCb, POST_VECTOR_TYPE_PYRAMID); + register_valchg_cb (w->PD.vectorTypeButt[3], PostCb, POST_VECTOR_TYPE_CONE); + register_valchg_cb (w->PD.vectorTypeButt[4], PostCb, POST_VECTOR_TYPE_DISPLACEMENT); + register_valchg_cb (w->PD.vectorScaleScale, PostCb, POST_VECTOR_SCALE_SCALE); + register_drag_cb (w->PD.vectorScaleScale, PostCb, POST_VECTOR_SCALE_SCALE); + register_activate_cb (w->PD.vectorScaleText, PostCb, POST_VECTOR_SCALE_TEXT); + register_valchg_cb (w->PD.vectorLocationButt[0],PostCb, POST_VECTOR_LOCATION_COG); + register_valchg_cb (w->PD.vectorLocationButt[1],PostCb, POST_VECTOR_LOCATION_VERTEX); + + register_ok_cb (w->PD.exportBGMDialog, PostCb, POST_EXPORT_BGM_CREATE); + register_cancel_cb (w->PD.exportBGMDialog, ManageCb, w->PD.exportBGMDialog); + register_activate_cb (w->PD.exportBGMButt[0], PostCb, POST_EXPORT_BGM_METHOD_H_ERROR) ; + register_activate_cb (w->PD.exportBGMButt[1], PostCb, POST_EXPORT_BGM_METHOD_H_ELEMENTS) ; + register_activate_cb (w->PD.exportBGMButt[2], PostCb, POST_EXPORT_BGM_METHOD_P_ERROR) ; + register_activate_cb (w->PD.exportBGMButt[3], PostCb, POST_EXPORT_BGM_METHOD_P_ELEMENTS) ; + register_valchg_cb (w->PD.exportBGMText, PostCb, POST_EXPORT_BGM_CONSTRAINT) ; + +} + + + +void RegisterCallbacks(Widgets_T *w){ + + RegisterCallbacks_M(w); /* menu win */ + RegisterCallbacks_G(w); /* graphic win */ + if(CTX.command_win) RegisterCallbacks_C(w); /* command win */ + + RegisterCallbacks_ED(w); /* error dialogs */ + RegisterCallbacks_FD(w); /* file dialogs */ + RegisterCallbacks_OD(w); /* option dialogs */ + RegisterCallbacks_HD(w); /* help dialogs */ + RegisterCallbacks_GD(w); /* geometry dialogs */ + RegisterCallbacks_MD(w); /* mesh dialogs */ + RegisterCallbacks_PD(w); /* post dialogs */ + +} + + diff --git a/Unix/Register.h b/Unix/Register.h new file mode 100644 index 0000000000000000000000000000000000000000..c18456cfa724f5eecac5d7fbfed7b0202f348bdd --- /dev/null +++ b/Unix/Register.h @@ -0,0 +1,139 @@ +#ifndef _REGISTER_H_ +#define _REGISTER_H_ + +void InitCb(Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *cb); +void ResizeCb(Widget w,XtPointer client_data, GLwDrawingAreaCallbackStruct *cb); +void ExposeCb(Widget w,XtPointer client_data, GLwDrawingAreaCallbackStruct *cb); + +void RegisterCallbacks(Widgets_T *w); + +void ActualizeContextCb (Widget w, XtPointer client_data, XtPointer call_data); + +void ExposeCb(Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *call_data); +void InitCb (Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *call_data); +void InputCb (Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *call_data); +void ResizeCb(Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *call_data); + +void ColorBarResizeCb(Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *cb); +void ColorBarExposeCb(Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *cb); +void ColorBarInputCb (Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *cb); + +void ExitCb (Widget w, XtPointer client_data, XtPointer call_data); +void ManageCb (Widget w, XtPointer client_data, XtPointer call_data); +void PreviousContextCb (Widget w, XtPointer client_data, XtPointer call_data); +void NextContextCb (Widget w, XtPointer client_data, XtPointer call_data); +void ActualizeContextCb (Widget w, XtPointer client_data, XtPointer call_data); +void DrawAboutCb (Widget w, XtPointer client_data, XtPointer call_data); +void CurrentInfoCb (Widget w, XtPointer client_data, XtPointer call_data); +void CurrentViewportCb (Widget w, XtPointer client_data, XtPointer call_data); +void CurrentViewCb (Widget w, XtPointer client_data, XtPointer call_data); +void SwapViewCb (Widget w, XtPointer client_data, XtPointer call_data); +void RemoveViewCb (Widget w, XtPointer client_data, XtPointer call_data); +void DuplicateViewCb (Widget w, XtPointer client_data, XtPointer call_data); + +void OptionsCb (Widget w, XtPointer client_data, XtPointer call_data); +void FileCb (Widget w, XtPointer client_data, XtPointer call_data); +void GeomCb (Widget w, XtPointer client_data, XtPointer call_data); +void MeshCb (Widget w, XtPointer client_data, XtPointer call_data); +void PostDialogCb (Widget w, XtPointer client_data, XtPointer call_data); +void PostCb (Widget w, XtPointer client_data, XtPointer call_data); + +void PopupHandler (Widget w, Widget pw, XEvent *event, Boolean *ctd); + + +/* special GL callback registering */ + +#define register_GLexpose_cb(w, func, arg) \ + XtAddCallback((w), GLwNexposeCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_GLresize_cb(w, func, arg) \ + XtAddCallback((w), GLwNresizeCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_GLinput_cb(w, func, arg) \ + XtAddCallback((w), GLwNinputCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_GLinit_cb(w, func, arg) \ + XtAddCallback((w), GLwNginitCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +/* classic motif callback registering */ + +#define register_help_cb(w, func, arg) \ + XtAddCallback((w), XmNhelpCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_expose_cb(w, func, arg) \ + XtAddCallback((w), XmNexposeCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_resize_cb(w, func, arg) \ + XtAddCallback((w), XmNresizeCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_input_cb(w, func, arg) \ + XtAddCallback((w), XmNinputCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_activate_cb(w, func, arg) \ + XtAddCallback((w), XmNactivateCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_remove_cb(w, func, arg) \ + XtRemoveCallback((w), XmNactivateCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_activate_cb_list(w, list) \ + XtAddCallbacks((w), XmNactivateCallback, \ + (XtCallbackList)(list)) + +#define register_valchg_cb(w, func, arg) \ + XtAddCallback((w), XmNvalueChangedCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_valchg_cb_list(w, list) \ + XtAddCallbacks((w), XmNvalueChangedCallback, \ + (XtCallbackList)(list)) + +#define register_ok_cb(w, func, arg) \ + XtAddCallback((w), XmNokCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_cancel_cb(w, func, arg) \ + XtAddCallback((w), XmNcancelCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_apply_cb(w, func, arg) \ + XtAddCallback((w), XmNapplyCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +#define register_drag_cb(w, func, arg) \ + XtAddCallback((w), XmNdragCallback, \ + (XtCallbackProc) (func), \ + (XtPointer) (arg)) + +/* event loop */ + +#define register_popup_ev(parent, w) \ + XtAddEventHandler((parent), ButtonPressMask, \ + False, \ + (XtEventHandler)PopupHandler, \ + (XtPointer)(w)) + +#endif diff --git a/Unix/Widgets.cpp b/Unix/Widgets.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c2614bb008b3f36b67f9e65c9e892ab348129716 --- /dev/null +++ b/Unix/Widgets.cpp @@ -0,0 +1,2684 @@ + +#include "Gmsh.h" +#include "GmshUI.h" +#include "Mesh.h" +#include "Context.h" +#include "XContext.h" +#include "Info.h" +#include "Widgets.h" +#include "Help.h" + +extern Context_T CTX ; +extern XContext_T XCTX ; + +/* hardcoded this one, since it is required for the motion handling */ + +static char DrawingAreaTranslations[] = "#replace\n\ +~s ~m ~a <Key>Return:DrawingAreaInput() ManagerParentActivate()\n\ +<Key>Return:DrawingAreaInput() ManagerGadgetSelect()\n\ +<Key>osfActivate:DrawingAreaInput() ManagerParentActivate()\n\ +<Key>osfCancel:DrawingAreaInput() ManagerParentCancel()\n\ +<Key>osfHelp:DrawingAreaInput() ManagerGadgetHelp()\n\ +<Key>space:DrawingAreaInput() ManagerGadgetSelect()\n\ +<Key>osfSelect:DrawingAreaInput() ManagerGadgetSelect()\n\ +<KeyDown>:DrawingAreaInput() ManagerGadgetKeyInput()\n\ +<KeyUp>:DrawingAreaInput()\n\ +<BtnMotion>:DrawingAreaInput() ManagerGadgetButtonMotion()\n\ +<Motion>:DrawingAreaInput() ManagerGadgetButtonMotion()\n\ +<Btn1Down>:DrawingAreaInput() ManagerGadgetArm()\n\ +<Btn1Up>:DrawingAreaInput() ManagerGadgetActivate()\n\ +<Btn2Down>:DrawingAreaInput() ManagerGadgetDrag()\n\ +<BtnDown>:DrawingAreaInput()\n\ +<BtnUp>:DrawingAreaInput()"; + +/* ------------------------------------------------------------------------ + MENU WINDOW + ------------------------------------------------------------------------ */ + +void CreateWidgets_M(Widgets_T *w){ + int i, n ; + Arg arg[10] ; + + /* menu shell */ + w->M.shell = + XtVaAppCreateShell("Gmsh", "gmshMW", applicationShellWidgetClass, XCTX.display, + XmNvisual, XCTX.gui.visual, + XmNcolormap, XCTX.gui.colormap, + NULL); + + /* menu main window */ + i=0; + w->M.containerWin = XmCreateMainWindow(w->M.shell, "McontainerWin", arg, i); + XtManageChild(w->M.containerWin); + + /* menu bar */ + i=0; + w->M.menuBar = XmCreateMenuBar(w->M.containerWin, "MmenuBar", arg, i); + XtManageChild(w->M.menuBar); + + /* file menu */ + i=0; + w->M.filePane = XmCreatePulldownMenu(w->M.menuBar, "MfilePane", arg, i); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Open")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-o)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Ctrl<Key>o:"); i++; + w->M.fileButt[0] = XmCreatePushButton(w->M.filePane, "MfileButt0", arg, i); + XtManageChild(w->M.fileButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Merge")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-m)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Ctrl<Key>m:"); i++; + w->M.fileButt[1] = XmCreatePushButton(w->M.filePane, "MfileButt1", arg, i); + XtManageChild(w->M.fileButt[1]); + + i=0; + w->M.fileSep[0] = XmCreateSeparator(w->M.filePane, "MfileSep0", arg, i); + XtManageChild(w->M.fileSep[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Save")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-s)")); i++; + w->M.fileButt[2] = XmCreatePushButton(w->M.filePane, "MfileButt2", arg, i); + XtManageChild(w->M.fileButt[2]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Save as")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-S-s)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Ctrl<Key>s:"); i++; + w->M.fileButt[3] = XmCreatePushButton(w->M.filePane, "MfileButt3", arg, i); + XtManageChild(w->M.fileButt[3]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Print")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-p)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Ctrl<Key>p:"); i++; + w->M.fileButt[4] = XmCreatePushButton(w->M.filePane, "MfileButt4", arg, i); + XtManageChild(w->M.fileButt[4]); + + i=0; + w->M.fileSep[1] = XmCreateSeparator(w->M.filePane, "MfileSep1", arg, i); + XtManageChild(w->M.fileSep[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Quit")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-q)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Ctrl<Key>q:"); i++; + w->M.fileButt[5] = XmCreatePushButton(w->M.filePane, "MfileButt5", arg, i); + XtManageChild(w->M.fileButt[5]); + + i=0; + XtSetArg(arg[i], XmNsubMenuId, w->M.filePane); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("File")); i++; + w->M.fileCascade = XmCreateCascadeButton(w->M.menuBar, "MfileCascade", arg, i); + XtManageChild(w->M.fileCascade); + + /* module menu */ + i=0; + w->M.modulePane = XmCreatePulldownMenu(w->M.menuBar, "MmodulePane", arg, i); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Geometry")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(g)")); i++; + XtSetArg(arg[i], XmNaccelerator, "<Key>g:"); i++; + w->M.moduleButt[0] = XmCreatePushButton(w->M.modulePane, "MmoduleButt0", arg, i); + XtManageChild(w->M.moduleButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Mesh")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(m)")); i++; + XtSetArg(arg[i], XmNaccelerator, "<Key>m:"); i++; + w->M.moduleButt[1] = XmCreatePushButton(w->M.modulePane, "MmoduleButt1", arg, i); + XtManageChild(w->M.moduleButt[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Post Processing")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(p)")); i++; + XtSetArg(arg[i], XmNaccelerator, "<Key>p:"); i++; + w->M.moduleButt[2] = XmCreatePushButton(w->M.modulePane, "MmoduleButt2", arg, i); + XtManageChild(w->M.moduleButt[2]); + + i=0; + XtSetArg(arg[i], XmNsubMenuId, w->M.modulePane); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Module")); i++; + w->M.moduleCascade = XmCreateCascadeButton(w->M.menuBar, "MmoduleCascade", arg, i); + XtManageChild(w->M.moduleCascade); + + /* option menu */ + i=0; + w->M.optionPane = XmCreatePulldownMenu(w->M.menuBar, "MoptionPane", arg, i); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Geometry Options")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-g)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Shift<Key>g:"); i++; + w->M.optionButt[0] = XmCreatePushButton(w->M.optionPane, "MoptionButt0", arg, i); + XtManageChild(w->M.optionButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Mesh Options")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-m)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Shift<Key>m:"); i++; + w->M.optionButt[1] = XmCreatePushButton(w->M.optionPane, "MoptionButt1", arg, i); + XtManageChild(w->M.optionButt[1]); + + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Post Processing Options")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-p)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Shift<Key>p:"); i++; + w->M.optionButt[2] = XmCreatePushButton(w->M.optionPane, "MoptionButt2", arg, i); + XtManageChild(w->M.optionButt[2]); + + i=0; + w->M.optionSep[0] = XmCreateSeparator(w->M.optionPane, "MoptionSep0", arg, i); + XtManageChild(w->M.optionSep[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("General Options")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-o)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Shift<Key>o:"); i++; + w->M.optionButt[3] = XmCreatePushButton(w->M.optionPane, "MoptionButt3", arg, i); + XtManageChild(w->M.optionButt[3]); + + i=0; + w->M.optionSep[1] = XmCreateSeparator(w->M.optionPane, "MoptionSep1", arg, i); + XtManageChild(w->M.optionSep[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Viewport")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-v)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Shift<Key>v:"); i++; + w->M.optionButt[4] = XmCreatePushButton(w->M.optionPane, "MoptionButt4", arg, i); + XtManageChild(w->M.optionButt[4]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Current Info")); i++; + XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-i)")); i++; + XtSetArg(arg[i], XmNaccelerator, "Shift<Key>i:"); i++; + w->M.optionButt[5] = XmCreatePushButton(w->M.optionPane, "MoptionButt5", arg, i); + XtManageChild(w->M.optionButt[5]); + + i=0; + XtSetArg(arg[i], XmNsubMenuId, w->M.optionPane); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Options")); i++; + w->M.optionCascade = XmCreateCascadeButton(w->M.menuBar, "MoptionCascade", arg, i); + XtManageChild(w->M.optionCascade); + + /* help menu */ + i=0; + w->M.helpPane = XmCreatePulldownMenu(w->M.menuBar, "MhelpPane", arg, i); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Short Help")); i++; + w->M.helpButt[0] = XmCreatePushButton(w->M.helpPane, "MhelpButt0", arg, i); + XtManageChild(w->M.helpButt[0]); + + i=0; + w->M.helpSep[0] = XmCreateSeparator(w->M.helpPane, "MhelpSep0", arg, i); + XtManageChild(w->M.helpSep[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("About Gmsh...")); i++; + w->M.helpButt[1] = XmCreatePushButton(w->M.helpPane, "MhelpButt1", arg, i); + XtManageChild(w->M.helpButt[1]); + + i=0; + XtSetArg(arg[i], XmNsubMenuId, w->M.helpPane); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("?")); i++; + w->M.helpCascade = XmCreateCascadeButton(w->M.menuBar, "MhelpCascade", arg, i); + XtManageChild(w->M.helpCascade); + + /* menu frame */ + + i=0; + w->M.menuFrame = XmCreateFrame(w->M.containerWin, "MmenuFrame", arg, i); + XtManageChild(w->M.menuFrame); + + /* menu form */ + + i=0; + XtSetArg(arg[i], XmNresizable, False); i++; + XtSetArg(arg[i], XmNresizePolicy, XmRESIZE_NONE); i++; + /* pour eviter des redimensionnements intempestifs sous HP */ + w->M.menuForm = XmCreateForm(w->M.menuFrame, "MmenuForm", arg, i); + XtManageChild(w->M.menuForm); + + /* module butt */ + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(" ")); i++; + w->M.modButt = XmCreateLabel(w->M.menuForm, "MmodButt", arg, i); + XtManageChild(w->M.modButt); + + i=0; + w->M.modPop = XmCreatePopupMenu(w->M.modButt, "MmodPop", arg, i); + XtUnmanageChild(w->M.modPop); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Geometry")); i++; + w->M.geomButt = XmCreatePushButton(w->M.modPop, "MgeomButt", arg, i); + XtManageChild(w->M.geomButt); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Mesh")); i++; + w->M.meshButt = XmCreatePushButton(w->M.modPop, "MmeshButt", arg, i); + XtManageChild(w->M.meshButt); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Post Processing")); i++; + w->M.postButt = XmCreatePushButton(w->M.modPop, "MpostButt", arg, i); + XtManageChild(w->M.postButt); + + /* navigation arrows */ + + i=0; + XtSetArg(arg[i], XmNarrowDirection, XmARROW_LEFT); i++; + w->M.navigButt[0] = XmCreateArrowButton(w->M.menuForm, "MnavigButt0", arg, i); + XtManageChild(w->M.navigButt[0]); + + i=0; + XtSetArg(arg[i], XmNarrowDirection, XmARROW_RIGHT); i++; + w->M.navigButt[1] = XmCreateArrowButton(w->M.menuForm, "MnavigButt1", arg, i); + XtManageChild(w->M.navigButt[1]); + + /* default button */ + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("No View Loaded")); i++; + w->M.defaultButt = XmCreateLabel(w->M.menuForm, "MdefaultButt", arg, i); + XtUnmanageChild(w->M.defaultButt); + + /* buttons */ + + for(n=0 ; n<NB_BUTT_MAX ; n++){ + i=0; + w->M.pushButt[n] = XmCreatePushButton(w->M.menuForm, "MpushButtn", arg, i); + XtUnmanageChild(w->M.pushButt[n]); + + i=0; + w->M.toggleButt[n] = XmCreateToggleButton(w->M.menuForm, "MtoggleButtn", arg, i); + XtUnmanageChild(w->M.toggleButt[n]); + + i=0; + w->M.popMenu[n] = XmCreatePopupMenu(w->M.toggleButt[n], "MpopMenun", arg, i); + XtUnmanageChild(w->M.popMenu[n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Remove")); i++; + w->M.removeButt[n] = XmCreatePushButton(w->M.popMenu[n], "MremoveButtn", arg, i); + XtManageChild(w->M.removeButt[n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Duplicate")); i++; + w->M.duplicateButt[n] = XmCreatePushButton(w->M.popMenu[n], "MduplicateButtn", arg, i); + XtManageChild(w->M.duplicateButt[n]); + + i=0; + w->M.popSep[0][n] = XmCreateSeparator(w->M.popMenu[n], "MpopSep0n", arg, i); + XtManageChild(w->M.popSep[0][n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Lighting")); i++; + w->M.lightButt[n] = XmCreateToggleButton(w->M.popMenu[n], "MlightButtn", arg, i); + XtManageChild(w->M.lightButt[n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Show Elements")); i++; + w->M.elementButt[n] = XmCreateToggleButton(w->M.popMenu[n], "MelementButtn", arg, i); + XtManageChild(w->M.elementButt[n]); + + i=0; + w->M.popSep[1][n] = XmCreateSeparator(w->M.popMenu[n], "MpopSep1n", arg, i); + XtManageChild(w->M.popSep[1][n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Scale, Range and Intervals")); i++; + w->M.scaleButt[n] = XmCreatePushButton(w->M.popMenu[n], "MscaleButtn", arg, i); + XtManageChild(w->M.scaleButt[n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Colors")); i++; + w->M.colorButt[n] = XmCreatePushButton(w->M.popMenu[n], "McolorButtn", arg, i); + XtManageChild(w->M.colorButt[n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Offset")); i++; + w->M.offsetButt[n] = XmCreatePushButton(w->M.popMenu[n], "MoffsetButtn", arg, i); + XtManageChild(w->M.offsetButt[n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Vector Display")); i++; + w->M.vectorButt[n] = XmCreatePushButton(w->M.popMenu[n], "MvectorButtn", arg, i); + XtManageChild(w->M.vectorButt[n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Time Step")); i++; + w->M.timeStepButt[n] = XmCreatePushButton(w->M.popMenu[n], "MtimeStepButtn", arg, i); + XtManageChild(w->M.timeStepButt[n]); + + i=0; + w->M.popSep[2][n] = XmCreateSeparator(w->M.popMenu[n], "MpopSep2n", arg, i); + XtManageChild(w->M.popSep[2][n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Export as Background Mesh")); i++; + w->M.exportBGMButt[n] = XmCreatePushButton(w->M.popMenu[n], "MexportBGMButtn", arg, i); + XtManageChild(w->M.exportBGMButt[n]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Apply as Current Background Mesh")); i++; + w->M.applyBGMButt[n] = XmCreatePushButton(w->M.popMenu[n], "MapplyBGMButtn", arg, i); + XtManageChild(w->M.applyBGMButt[n]); + } + +} + + +/* ------------------------------------------------------------------------ + GRAPHIC WINDOW + ------------------------------------------------------------------------ */ + +void CreateWidgets_G(Widgets_T *w){ + int i; + Arg arg[10]; + + /* graphic shell */ + w->G.shell = + XtVaAppCreateShell("Gmsh graphics", "gmshGW", applicationShellWidgetClass, XCTX.display, + XmNvisual,XCTX.gui.visual, + XmNcolormap,XCTX.gui.colormap, + NULL); + + /* container form */ + i=0; + XtSetArg(arg[i], XmNresizable, False); i++; + XtSetArg(arg[i], XmNresizePolicy, XmRESIZE_NONE); i++; + w->G.containerForm = XmCreateForm(w->G.shell, "GcontainerForm", arg, i); + XtManageChild(w->G.containerForm); + + /* opengl drawing area */ + i=0; + XtSetArg(arg[i], XmNcolormap, XCTX.glw.colormap); i++; + XtSetArg(arg[i], GLwNvisualInfo, XCTX.glw.visinfo); i++; + XtSetArg(arg[i], GLwNinstallColormap, True); i++; + w->G.glw = GLwCreateMDrawingArea(w->G.containerForm, "glw", arg, i); + XtManageChild(w->G.glw); + + /* overlay opengl drawing area */ + if(CTX.overlay){ + i=0; + XtSetArg(arg[i], XmNcolormap, XCTX.glo.colormap); i++; + XtSetArg(arg[i], GLwNvisualInfo, XCTX.glo.visinfo); i++; + XtSetArg(arg[i], GLwNinstallColormap, True); i++; + w->G.glo = GLwCreateMDrawingArea(w->G.containerForm, "glo", arg, i); + XtManageChild(w->G.glo); + } + + /* bottom */ + + i=0; + XtSetArg(arg[i], XmNresizable, False); i++; + XtSetArg(arg[i], XmNresizePolicy, XmRESIZE_NONE); i++; + w->G.bottomForm = XmCreateForm(w->G.containerForm, "GbottomForm", arg, i); + XtManageChild(w->G.bottomForm); + + /* buttons de gauche: X Y Z 1 Geometry Abort Play Stop */ + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("X")); i++; + XtSetArg(arg[i], XmNtraversalOn, False); i++; + w->G.Butt[0] = XmCreatePushButton(w->G.bottomForm, "GButt0", arg, i); + XtManageChild(w->G.Butt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Y")); i++; + XtSetArg(arg[i], XmNtraversalOn, False); i++; + w->G.Butt[1] = XmCreatePushButton(w->G.bottomForm, "GButt1", arg, i); + XtManageChild(w->G.Butt[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Z")); i++; + XtSetArg(arg[i], XmNtraversalOn, False); i++; + w->G.Butt[2] = XmCreatePushButton(w->G.bottomForm, "GButt2", arg, i); + XtManageChild(w->G.Butt[2]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("1")); i++; + XtSetArg(arg[i], XmNtraversalOn, False); i++; + w->G.Butt[3] = XmCreatePushButton(w->G.bottomForm, "GButt3", arg, i); + XtManageChild(w->G.Butt[3]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("g")); i++; + XtSetArg(arg[i], XmNtraversalOn, False); i++; + w->G.Butt[4] = XmCreatePushButton(w->G.bottomForm, "GButt4", arg, i); + XtManageChild(w->G.Butt[4]); + + i=0; + XtSetArg(arg[i], XmNlabelType, XmPIXMAP); i++; + XtSetArg(arg[i], XmNtraversalOn, False); i++; + w->G.Butt[5] = XmCreatePushButton(w->G.bottomForm, "GButt5", arg, i); + XtManageChild(w->G.Butt[5]); + + i=0; + XtSetArg(arg[i], XmNlabelType, XmPIXMAP); i++; + XtSetArg(arg[i], XmNtraversalOn, False); i++; + w->G.Butt[6] = XmCreatePushButton(w->G.bottomForm, "GButt6", arg, i); + XtManageChild(w->G.Butt[6]); + XtSetSensitive(w->G.Butt[6],0); + + /* 3 textes au milieu */ + + i=0; + XtSetArg(arg[i], XmNresizable, False); i++; + XtSetArg(arg[i], XmNresizePolicy, XmRESIZE_NONE); i++; + w->G.textForm = XmCreateForm(w->G.bottomForm, "GtextForm", arg, i); + XtManageChild(w->G.textForm); + + i=0; + XtSetArg(arg[i], XmNalignment, XmALIGNMENT_BEGINNING); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(" ")); i++; + w->G.selectLabel = XmCreateLabel(w->G.textForm, "GselectLabel", arg, i); + XtManageChild(w->G.selectLabel); + + i=0; + XtSetArg(arg[i], XmNalignment, XmALIGNMENT_BEGINNING); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(" ")); i++; + w->G.infoLabel = XmCreateLabel(w->G.textForm, "GinfoLabel", arg, i); + XtManageChild(w->G.infoLabel); + + i=0; + XtSetArg(arg[i], XmNalignment, XmALIGNMENT_BEGINNING); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(" ")); i++; + w->G.statusLabel = XmCreateLabel(w->G.textForm, "GstatusLabel", arg, i); + XtManageChild(w->G.statusLabel); + +} + + +/* ------------------------------------------------------------------------ + COMMAND WINDOW + ------------------------------------------------------------------------ */ + +void CreateWidgets_C(Widgets_T *w){ + int i; + Arg arg[10]; + + w->C.shell = + XtVaAppCreateShell("Gmsh commands", "gmshCW", applicationShellWidgetClass, XCTX.display, + XmNvisual,XCTX.gui.visual, + XmNcolormap,XCTX.gui.colormap, + NULL); + + i=0; + XtSetArg(arg[i], XmNpromptString, XmStringCreateSimple("")); i++; + w->C.command = XmCreateCommand(w->C.shell, "Ccommand", arg, i); + XtManageChild(w->C.command); + + w->C.commandList = XmCommandGetChild(w->C.command, XmDIALOG_HISTORY_LIST); + w->C.commandText = XmCommandGetChild(w->C.command, XmDIALOG_COMMAND_TEXT); +} + + +/* ------------------------------------------------------------------------ + ERROR DIALOGS + ------------------------------------------------------------------------ */ + +void CreateWidgets_ED(Widgets_T *w){ + int i; + Arg arg[10]; + Widget tmp ; + + i=0 ; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Warning")); i++; + XtSetArg(arg[i], XmNmessageString, XmStringCreateSimple("File exists")); i++; + w->ED.printDialog = XmCreateWarningDialog(w->M.shell, "EDprintDialog", arg, i); + + i=0 ; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Warning")); i++; + XtSetArg(arg[i], XmNmessageString, XmStringCreateSimple("File exists")); i++; + w->ED.saveDialog = XmCreateWarningDialog(w->M.shell, "EDsaveDialog", arg, i); + + tmp = XmMessageBoxGetChild(w->ED.printDialog, XmDIALOG_HELP_BUTTON); + XtUnmanageChild(tmp); + tmp = XmMessageBoxGetChild(w->ED.saveDialog, XmDIALOG_HELP_BUTTON); + XtUnmanageChild(tmp); + +} + + +/* ------------------------------------------------------------------------ + FILE DIALOGS + ------------------------------------------------------------------------ */ + +void CreateWidgets_FD(Widgets_T *w){ + int i; + Arg arg[10]; + Widget tmp ; + + /* open */ + i=0 ; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Open")); i++; + XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++; + XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*.geo")); i++; + XtSetArg(arg[i], XmNautoUnmanage, True); i++; + w->FD.openDialog = XmCreateFileSelectionDialog(w->M.shell, "FDopenDialog", arg, i); + XtUnmanageChild(w->FD.openDialog); + + /* merge */ + i=0 ; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Merge")); i++; + XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++; + XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*.[pm][os][sh]")); i++; + XtSetArg(arg[i], XmNautoUnmanage, True); i++; + w->FD.mergeDialog = XmCreateFileSelectionDialog(w->M.shell, "FDmergeDialog", arg, i); + XtUnmanageChild(w->FD.mergeDialog); + + /* save */ + i=0 ; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Save")); i++; + XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++; + XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*")); i++; + XtSetArg(arg[i], XmNautoUnmanage, True); i++; + w->FD.saveDialog = XmCreateFileSelectionDialog(w->M.shell, "FDsaveDialog", arg, i); + XtUnmanageChild(w->FD.saveDialog); + + /* save as */ + i=0 ; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Save Mesh")); i++; + XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++; + XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*")); i++; + XtSetArg(arg[i], XmNautoUnmanage, True); i++; + w->FD.saveAsDialog = XmCreateFileSelectionDialog(w->M.shell, "FDsaveAsDialog", arg, i); + XtUnmanageChild(w->FD.saveAsDialog); + + i=0; + w->FD.saveAsFrame[0] = XmCreateFrame(w->FD.saveAsDialog, "FDsaveFrame0", arg, i); + XtManageChild(w->FD.saveAsFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Format")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->FD.saveAsFrame[1] = XmCreateLabel(w->FD.saveAsFrame[0], "FDsaveAsFrame1", arg, i); + XtManageChild(w->FD.saveAsFrame[1]); + + i=0 ; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + XtSetArg(arg[i], XmNspacing, 0); i++; + w->FD.saveAsRowCol = XmCreateRowColumn(w->FD.saveAsFrame[0], "FDsaveAsRowCol", arg, i); + XtManageChild(w->FD.saveAsRowCol); + + i=0; + w->FD.saveAsPane = XmCreatePulldownMenu(w->FD.saveAsRowCol, "FDsaveAsPane", arg, i); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Gmsh [.msh]")); i++; + w->FD.saveAsButt[0] = XmCreatePushButton(w->FD.saveAsPane, "MsaveAsButt0", arg, i); + XtManageChild(w->FD.saveAsButt[0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Ideas universal [.unv]")); i++; + w->FD.saveAsButt[1] = XmCreatePushButton(w->FD.saveAsPane, "MsaveAsButt1", arg, i); + XtManageChild(w->FD.saveAsButt[1]); + /* + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Gref [.gre]")); i++; + w->FD.saveAsButt[2] = XmCreatePushButton(w->FD.saveAsPane, "MsaveAsButt2", arg, i); + XtManageChild(w->FD.saveAsButt[2]); + */ + i=0; + XtSetArg(arg[i], XmNsubMenuId, w->FD.saveAsPane); i++; + XtSetArg(arg[i], XmNspacing, 0); i++; + w->FD.saveAsMenu = XmCreateOptionMenu(w->FD.saveAsRowCol, "FDsaveAsMenu", arg, i); + XtManageChild(w->FD.saveAsMenu); + + /* print */ + i=0 ; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Print Image to File")); i++; + XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++; + XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; /* + pratique qd on sauve des animations */ + w->FD.printDialog = XmCreateFileSelectionDialog(w->M.shell, "FDprintDialog", arg, i); + XtUnmanageChild(w->FD.printDialog); + + i=0; + w->FD.printFrame[0] = XmCreateFrame(w->FD.printDialog, "FDprintFrame0", arg, i); + XtManageChild(w->FD.printFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Format")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->FD.printFrame[1] = XmCreateLabel(w->FD.printFrame[0], "FDprintFrame1", arg, i); + XtManageChild(w->FD.printFrame[1]); + + i=0 ; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + XtSetArg(arg[i], XmNspacing, 0); i++; + w->FD.printRowCol = XmCreateRowColumn(w->FD.printFrame[0], "FDprintRowCol", arg, i); + XtManageChild(w->FD.printRowCol); + + /* print - type */ + i=0; + w->FD.printPane[0] = XmCreatePulldownMenu(w->FD.printRowCol, "FDprintPane0", arg, i); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS (fast)")); i++; + w->FD.printButt[0] = XmCreatePushButton(w->FD.printPane[0], "MprintButt0", arg, i); + XtManageChild(w->FD.printButt[0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS (accurate)")); i++; + w->FD.printButt[1] = XmCreatePushButton(w->FD.printPane[0], "MprintButt1", arg, i); + XtManageChild(w->FD.printButt[1]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("XPM")); i++; + w->FD.printButt[2] = XmCreatePushButton(w->FD.printPane[0], "MprintButt2", arg, i); + XtManageChild(w->FD.printButt[2]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("GIF")); i++; + w->FD.printButt[3] = XmCreatePushButton(w->FD.printPane[0], "MprintButt3", arg, i); + XtManageChild(w->FD.printButt[3]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS (GLPr)")); i++; + w->FD.printButt[4] = XmCreatePushButton(w->FD.printPane[0], "MprintButt4", arg, i); + XtManageChild(w->FD.printButt[4]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS Bitmap (GLPr)")); i++; + w->FD.printButt[5] = XmCreatePushButton(w->FD.printPane[0], "MprintButt5", arg, i); + XtManageChild(w->FD.printButt[5]); + i=0; + + XtSetArg(arg[i], XmNsubMenuId, w->FD.printPane[0]); i++; + XtSetArg(arg[i], XmNspacing, 0); i++; + w->FD.printMenu[0] = XmCreateOptionMenu(w->FD.printRowCol, "FDprintMenu0", arg, i); + XtManageChild(w->FD.printMenu[0]); + + /* print - format options + i=0; + w->FD.printPane[1] = XmCreatePulldownMenu(w->FD.printRowCol, "FDprintPane1", arg, i); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("xpm")); i++; + w->FD.printButt[6] = XmCreatePushButton(w->FD.printPane[1], "MprintButt6", arg, i); + XtManageChild(w->FD.printButt[6]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("ps")); i++; + w->FD.printButt[7] = XmCreatePushButton(w->FD.printPane[1], "MprintButt7", arg, i); + XtManageChild(w->FD.printButt[7]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("eps")); i++; + w->FD.printButt[8] = XmCreatePushButton(w->FD.printPane[1], "MprintButt8", arg, i); + XtManageChild(w->FD.printButt[8]); + + i=0; + XtSetArg(arg[i], XmNsubMenuId, w->FD.printPane[1]); i++; + XtSetArg(arg[i], XmNspacing, 0); i++; + w->FD.printMenu[1] = XmCreateOptionMenu(w->FD.printRowCol, "FDprintMenu1", arg, i); + XtManageChild(w->FD.printMenu[1]); + */ + +#ifndef _GL_PRINT + XtSetSensitive(w->FD.printButt[4], 0); + XtSetSensitive(w->FD.printButt[5], 0); +#endif + + tmp = XmFileSelectionBoxGetChild(w->FD.openDialog, XmDIALOG_HELP_BUTTON); + XtUnmanageChild(tmp); + tmp = XmFileSelectionBoxGetChild(w->FD.mergeDialog, XmDIALOG_HELP_BUTTON); + XtUnmanageChild(tmp); + tmp = XmFileSelectionBoxGetChild(w->FD.saveDialog, XmDIALOG_HELP_BUTTON); + XtUnmanageChild(tmp); + tmp = XmFileSelectionBoxGetChild(w->FD.saveAsDialog, XmDIALOG_HELP_BUTTON); + XtUnmanageChild(tmp); + tmp = XmFileSelectionBoxGetChild(w->FD.printDialog, XmDIALOG_HELP_BUTTON); + XtUnmanageChild(tmp); + +} + + +/* ------------------------------------------------------------------------ + OPTIONS DIALOGS + ------------------------------------------------------------------------ */ + +void CreateWidgets_OD(Widgets_T *w){ + int i, n; + Arg arg[10]; + char label[32]; + + /* Geometry */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Geometry Options")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->OD.geomDialog = XmCreateTemplateDialog(w->M.shell, "ODgeomDialog", arg, i); + XtUnmanageChild(w->OD.geomDialog); + + i=0; + w->OD.geomRowCol = XmCreateRowColumn(w->OD.geomDialog, "ODgeomRowCol", arg, i); + XtManageChild(w->OD.geomRowCol); + + /* Geometry - Visible */ + + i=0; + w->OD.geomVisibleFrame[0] = XmCreateFrame(w->OD.geomRowCol, "ODgeomVisibleFrame0", arg, i); + XtManageChild(w->OD.geomVisibleFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Visibility")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.geomVisibleFrame[1] = XmCreateLabel(w->OD.geomVisibleFrame[0], "ODgeomVisibleFrame1", arg, i); + XtManageChild(w->OD.geomVisibleFrame[1]); + + i=0; + w->OD.geomVisibleRowCol = XmCreateRowColumn(w->OD.geomVisibleFrame[0], "ODgeomVisibleRowCol", arg, i); + XtManageChild(w->OD.geomVisibleRowCol); + + i=0; + XtSetArg(arg[i], XmNnumColumns, 1); i++; + w->OD.geomVisibleTypeCheck = XmCreateRadioBox(w->OD.geomVisibleRowCol, "ODgeomVisibleTypeCheck", arg, i); + XtManageChild(w->OD.geomVisibleTypeCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Entity")); i++; + XtSetArg(arg[i], XmNset, True); i++; + w->OD.geomVisibleTypeButt[0] = XmCreateToggleButton(w->OD.geomVisibleTypeCheck, "ODgeomVisibleTypeButt0", arg, i); + XtManageChild(w->OD.geomVisibleTypeButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Label")); i++; + XtSetArg(arg[i], XmNset, False); i++; + w->OD.geomVisibleTypeButt[1] = XmCreateToggleButton(w->OD.geomVisibleTypeCheck, "ODgeomVisibleTypeButt1", arg, i); + XtManageChild(w->OD.geomVisibleTypeButt[1]); + + i=0; + XtSetArg(arg[i], XmNnumColumns, 2); i++; + w->OD.geomVisibleCheck = XmCreateSimpleCheckBox(w->OD.geomVisibleRowCol, "ODgeomVisibleCheck", arg, i); + XtManageChild(w->OD.geomVisibleCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Points")); i++; + XtSetArg(arg[i], XmNset, CTX.geom.points?True:False); i++; + w->OD.geomVisibleButt[0] = XmCreateToggleButton(w->OD.geomVisibleCheck, "ODgeomVisibleButt0", arg, i); + XtManageChild(w->OD.geomVisibleButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Lines")); i++; + XtSetArg(arg[i], XmNset, CTX.geom.lines?True:False); i++; + w->OD.geomVisibleButt[1] = XmCreateToggleButton(w->OD.geomVisibleCheck, "ODgeomVisibleButt1", arg, i); + XtManageChild(w->OD.geomVisibleButt[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Surfaces")); i++; + XtSetArg(arg[i], XmNset, CTX.geom.surfaces?True:False); i++; + w->OD.geomVisibleButt[2] = XmCreateToggleButton(w->OD.geomVisibleCheck, "ODgeomVisibleButt2", arg, i); + XtManageChild(w->OD.geomVisibleButt[2]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Volumes")); i++; + XtSetArg(arg[i], XmNset, CTX.geom.volumes?True:False); i++; + w->OD.geomVisibleButt[3] = XmCreateToggleButton(w->OD.geomVisibleCheck, "ODgeomVisibleButt3", arg, i); + XtManageChild(w->OD.geomVisibleButt[3]); + + /* Geometry - Visible by Number */ + + i=0; + w->OD.geomVisibleByNumFrame[0] = XmCreateFrame(w->OD.geomRowCol, "ODgeomVisibleByNumFrame0", arg, i); + XtManageChild(w->OD.geomVisibleByNumFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Visibility by Number")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.geomVisibleByNumFrame[1] = XmCreateLabel(w->OD.geomVisibleByNumFrame[0], "ODgeomVisibleByNumFrame1", arg, i); + XtManageChild(w->OD.geomVisibleByNumFrame[1]); + + i=0; + w->OD.geomVisibleByNumRowCol = XmCreateRowColumn(w->OD.geomVisibleByNumFrame[0], "ODgeomVisibleByNumRowCol", arg, i); + XtManageChild(w->OD.geomVisibleByNumRowCol); + + i=0; + XtSetArg(arg[i], XmNvalue, "*"); i++; + w->OD.geomVisibleByNumText = XmCreateTextField(w->OD.geomVisibleByNumRowCol, "ODgeomVisibleByNumText", arg, i); + XtManageChild(w->OD.geomVisibleByNumText); + + /* Geometry - normals */ + + i=0; + w->OD.geomNormalsFrame[0] = XmCreateFrame(w->OD.geomRowCol, "ODgeomNormalsFrame0", arg, i); + XtManageChild(w->OD.geomNormalsFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Normals")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.geomNormalsFrame[1] = XmCreateLabel(w->OD.geomNormalsFrame[0], "ODgeomNormalsFrame1", arg, i); + XtManageChild(w->OD.geomNormalsFrame[1]); + + i=0; + w->OD.geomNormalsRowCol = XmCreateRowColumn(w->OD.geomNormalsFrame[0], "ODgeomNormalsRowCol", arg, i); + XtManageChild(w->OD.geomNormalsRowCol); + + i=0; + XtSetArg(arg[i], XmNminimum, 0); i++; + XtSetArg(arg[i], XmNmaximum, 100); i++; + XtSetArg(arg[i], XmNdecimalPoints, 0); i++; + XtSetArg(arg[i], XmNvalue, CTX.geom.normals); i++; + XtSetArg(arg[i], XmNshowValue, False); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->OD.geomNormalsScale = XmCreateScale(w->OD.geomNormalsRowCol, "ODgeomNormalsScale", arg, i); + XtManageChild(w->OD.geomNormalsScale); + + i=0; + sprintf(label, "%g", CTX.geom.normals); + XtSetArg(arg[i], XmNvalue, label); i++; + w->OD.geomNormalsText = XmCreateTextField(w->OD.geomNormalsRowCol, "ODgeomNormalsText", arg, i); + XtManageChild(w->OD.geomNormalsText); + + /* Geometry - tangents */ + + i=0; + w->OD.geomTangentsFrame[0] = XmCreateFrame(w->OD.geomRowCol, "ODgeomTangentsFrame0", arg, i); + XtManageChild(w->OD.geomTangentsFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Tangents")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.geomTangentsFrame[1] = XmCreateLabel(w->OD.geomTangentsFrame[0], "ODgeomTangentsFrame1", arg, i); + XtManageChild(w->OD.geomTangentsFrame[1]); + + i=0; + w->OD.geomTangentsRowCol = XmCreateRowColumn(w->OD.geomTangentsFrame[0], "ODgeomTangentsRowCol", arg, i); + XtManageChild(w->OD.geomTangentsRowCol); + + i=0; + XtSetArg(arg[i], XmNminimum, 0); i++; + XtSetArg(arg[i], XmNmaximum, 100); i++; + XtSetArg(arg[i], XmNdecimalPoints, 0); i++; + XtSetArg(arg[i], XmNvalue, CTX.geom.tangents); i++; + XtSetArg(arg[i], XmNshowValue, False); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->OD.geomTangentsScale = XmCreateScale(w->OD.geomTangentsRowCol, "ODgeomTangentsScale", arg, i); + XtManageChild(w->OD.geomTangentsScale); + + i=0; + sprintf(label, "%g", CTX.geom.tangents); + XtSetArg(arg[i], XmNvalue, label); i++; + w->OD.geomTangentsText = XmCreateTextField(w->OD.geomTangentsRowCol, "ODgeomTangentsText", arg, i); + XtManageChild(w->OD.geomTangentsText); + + /* Mesh */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Mesh Options")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->OD.meshDialog = XmCreateTemplateDialog(w->M.shell, "ODmeshDialog", arg, i); + XtUnmanageChild(w->OD.meshDialog); + + i=0; + w->OD.meshRowCol = XmCreateRowColumn(w->OD.meshDialog, "ODmeshRowCol", arg, i); + XtManageChild(w->OD.meshRowCol); + + + /* Mesh - algo */ + + i=0; + w->OD.meshAlgoFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshAlgoFrame0", arg, i); + XtManageChild(w->OD.meshAlgoFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Algorithm")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.meshAlgoFrame[1] = XmCreateLabel(w->OD.meshAlgoFrame[0], "ODmeshAlgoFrame1", arg, i); + XtManageChild(w->OD.meshAlgoFrame[1]); + + i=0; + w->OD.meshAlgoRowCol = XmCreateRowColumn(w->OD.meshAlgoFrame[0], "ODmeshAlgoRowCol", arg, i); + XtManageChild(w->OD.meshAlgoRowCol); + + i=0; + XtSetArg(arg[i], XmNnumColumns, 2); i++; + w->OD.meshAlgoCheck = XmCreateSimpleCheckBox(w->OD.meshAlgoRowCol, "ODmeshAlgoCheck", arg, i); + XtManageChild(w->OD.meshAlgoCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Degree 2")); i++; + XtSetArg(arg[i], XmNset, (CTX.mesh.degree==2)?True:False); i++; + w->OD.meshAlgoButt[0] = XmCreateToggleButton(w->OD.meshAlgoCheck, "ODmeshAlgoButt0", arg, i); + XtManageChild(w->OD.meshAlgoButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Anisotropic")); i++; + XtSetArg(arg[i], XmNset, (CTX.mesh.algo==DELAUNAY_NEWALGO)?True:False); i++; + w->OD.meshAlgoButt[1] = XmCreateToggleButton(w->OD.meshAlgoCheck, "ODmeshAlgoButt1", arg, i); + XtManageChild(w->OD.meshAlgoButt[1]); + + /* Mesh - smoothing */ + + i=0; + w->OD.meshSmoothingFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshSmoothingFrame0", arg, i); + XtManageChild(w->OD.meshSmoothingFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Smoothing")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.meshSmoothingFrame[1] = XmCreateLabel(w->OD.meshSmoothingFrame[0], "ODmeshSmoothingFrame1", arg, i); + XtManageChild(w->OD.meshSmoothingFrame[1]); + + i=0; + w->OD.meshSmoothingRowCol = XmCreateRowColumn(w->OD.meshSmoothingFrame[0], "ODmeshSmoothingRowCol", arg, i); + XtManageChild(w->OD.meshSmoothingRowCol); + + i=0; + XtSetArg(arg[i], XmNminimum, 0); i++; + XtSetArg(arg[i], XmNmaximum, 100); i++; + XtSetArg(arg[i], XmNdecimalPoints, 2); i++; + XtSetArg(arg[i], XmNvalue, CTX.mesh.nb_smoothing); i++; + XtSetArg(arg[i], XmNshowValue, False); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->OD.meshSmoothingScale = XmCreateScale(w->OD.meshSmoothingRowCol, "ODmeshSmoothingScale", arg, i); + XtManageChild(w->OD.meshSmoothingScale); + + i=0; + sprintf(label, "%d", CTX.mesh.nb_smoothing); + XtSetArg(arg[i], XmNvalue, label); i++; + w->OD.meshSmoothingText = XmCreateTextField(w->OD.meshSmoothingRowCol, "ODmeshSmoothingText", arg, i); + XtManageChild(w->OD.meshSmoothingText); + + /* Mesh - Visible */ + + i=0; + w->OD.meshVisibleFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshVisibleFrame0", arg, i); + XtManageChild(w->OD.meshVisibleFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Visibility")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.meshVisibleFrame[1] = XmCreateLabel(w->OD.meshVisibleFrame[0], "ODmeshVisibleFrame1", arg, i); + XtManageChild(w->OD.meshVisibleFrame[1]); + + i=0; + w->OD.meshVisibleRowCol = XmCreateRowColumn(w->OD.meshVisibleFrame[0], "ODmeshVisibleRowCol", arg, i); + XtManageChild(w->OD.meshVisibleRowCol); + + i=0; + XtSetArg(arg[i], XmNnumColumns, 1); i++; + w->OD.meshVisibleTypeCheck = XmCreateRadioBox(w->OD.meshVisibleRowCol, "ODmeshVisibleTypeCheck", arg, i); + XtManageChild(w->OD.meshVisibleTypeCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Entity")); i++; + XtSetArg(arg[i], XmNset, True); i++; + w->OD.meshVisibleTypeButt[0] = XmCreateToggleButton(w->OD.meshVisibleTypeCheck, "ODmeshVisibleTypeButt0", arg, i); + XtManageChild(w->OD.meshVisibleTypeButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Label")); i++; + XtSetArg(arg[i], XmNset, False); i++; + w->OD.meshVisibleTypeButt[1] = XmCreateToggleButton(w->OD.meshVisibleTypeCheck, "ODmeshVisibleTypeButt1", arg, i); + XtManageChild(w->OD.meshVisibleTypeButt[1]); + + i=0; + XtSetArg(arg[i], XmNnumColumns, 2); i++; + w->OD.meshVisibleCheck = XmCreateSimpleCheckBox(w->OD.meshVisibleRowCol, "ODmeshVisibleCheck", arg, i); + XtManageChild(w->OD.meshVisibleCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Points")); i++; + XtSetArg(arg[i], XmNset, CTX.mesh.points?True:False); i++; + w->OD.meshVisibleButt[0] = XmCreateToggleButton(w->OD.meshVisibleCheck, "ODmeshVisibleButt0", arg, i); + XtManageChild(w->OD.meshVisibleButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Lines")); i++; + XtSetArg(arg[i], XmNset, CTX.mesh.lines?True:False); i++; + w->OD.meshVisibleButt[1] = XmCreateToggleButton(w->OD.meshVisibleCheck, "ODmeshVisibleButt1", arg, i); + XtManageChild(w->OD.meshVisibleButt[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Surfaces")); i++; + XtSetArg(arg[i], XmNset, CTX.mesh.surfaces?True:False); i++; + w->OD.meshVisibleButt[2] = XmCreateToggleButton(w->OD.meshVisibleCheck, "ODmeshVisibleButt2", arg, i); + XtManageChild(w->OD.meshVisibleButt[2]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Volumes")); i++; + XtSetArg(arg[i], XmNset, CTX.mesh.volumes?True:False); i++; + w->OD.meshVisibleButt[3] = XmCreateToggleButton(w->OD.meshVisibleCheck, "ODmeshVisibleButt3", arg, i); + XtManageChild(w->OD.meshVisibleButt[3]); + + /* Mesh - Visible by Number */ + + i=0; + w->OD.meshVisibleByNumFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshVisibleByNumFrame0", arg, i); + XtManageChild(w->OD.meshVisibleByNumFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Visibility by Number")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.meshVisibleByNumFrame[1] = XmCreateLabel(w->OD.meshVisibleByNumFrame[0], "ODmeshVisibleByNumFrame1", arg, i); + XtManageChild(w->OD.meshVisibleByNumFrame[1]); + + i=0; + w->OD.meshVisibleByNumRowCol = XmCreateRowColumn(w->OD.meshVisibleByNumFrame[0], "ODmeshVisibleByNumRowCol", arg, i); + XtManageChild(w->OD.meshVisibleByNumRowCol); + + i=0; + XtSetArg(arg[i], XmNvalue, "*"); i++; + w->OD.meshVisibleByNumText = XmCreateTextField(w->OD.meshVisibleByNumRowCol, "ODmeshVisibleByNumText", arg, i); + XtManageChild(w->OD.meshVisibleByNumText); + + /* Mesh - aspect */ + + i=0; + w->OD.meshAspectFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshAspectFrame0", arg, i); + XtManageChild(w->OD.meshAspectFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Aspect")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.meshAspectFrame[1] = XmCreateLabel(w->OD.meshAspectFrame[0], "ODmeshAspectFrame1", arg, i); + XtManageChild(w->OD.meshAspectFrame[1]); + + i=0; + w->OD.meshAspectCheck = XmCreateRadioBox(w->OD.meshAspectFrame[0], "ODmeshAspectCheck", arg, i); + XtManageChild(w->OD.meshAspectCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Wireframe")); i++; + XtSetArg(arg[i], XmNset, (!CTX.mesh.hidden)?True:False); i++; + w->OD.meshAspectButt[0] = XmCreateToggleButton(w->OD.meshAspectCheck, "ODmeshAspectButt0", arg, i); + XtManageChild(w->OD.meshAspectButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Hidden Lines")); i++; + XtSetArg(arg[i], XmNset, CTX.mesh.hidden?True:False); i++; + w->OD.meshAspectButt[1] = XmCreateToggleButton(w->OD.meshAspectCheck, "ODmeshAspectButt1", arg, i); + XtManageChild(w->OD.meshAspectButt[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Solid")); i++; + XtSetArg(arg[i], XmNset, CTX.mesh.shade?True:False); i++; + w->OD.meshAspectButt[2] = XmCreateToggleButton(w->OD.meshAspectCheck, "ODmeshAspectButt2", arg, i); + XtManageChild(w->OD.meshAspectButt[2]); + + /* Mesh - explode */ + + i=0; + w->OD.meshExplodeFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshExplodeFrame0", arg, i); + XtManageChild(w->OD.meshExplodeFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Explode")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.meshExplodeFrame[1] = XmCreateLabel(w->OD.meshExplodeFrame[0], "ODmeshExplodeFrame1", arg, i); + XtManageChild(w->OD.meshExplodeFrame[1]); + + i=0; + w->OD.meshExplodeRowCol = XmCreateRowColumn(w->OD.meshExplodeFrame[0], "ODmeshExplodeRowCol", arg, i); + XtManageChild(w->OD.meshExplodeRowCol); + + i=0; + XtSetArg(arg[i], XmNminimum, 0); i++; + XtSetArg(arg[i], XmNmaximum, 100); i++; + XtSetArg(arg[i], XmNdecimalPoints, 2); i++; + XtSetArg(arg[i], XmNvalue, (int)100*CTX.mesh.explode); i++; + XtSetArg(arg[i], XmNshowValue, False); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->OD.meshExplodeScale = XmCreateScale(w->OD.meshExplodeRowCol, "ODmeshExplodeScale", arg, i); + XtManageChild(w->OD.meshExplodeScale); + + i=0; + sprintf(label, "%g", CTX.mesh.explode); + XtSetArg(arg[i], XmNvalue, label); i++; + w->OD.meshExplodeText = XmCreateTextField(w->OD.meshExplodeRowCol, "ODmeshExplodeText", arg, i); + XtManageChild(w->OD.meshExplodeText); + + /* Mesh - normals */ + + i=0; + w->OD.meshNormalsFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshNormalsFrame0", arg, i); + XtManageChild(w->OD.meshNormalsFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Normals")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.meshNormalsFrame[1] = XmCreateLabel(w->OD.meshNormalsFrame[0], "ODmeshNormalsFrame1", arg, i); + XtManageChild(w->OD.meshNormalsFrame[1]); + + i=0; + w->OD.meshNormalsRowCol = XmCreateRowColumn(w->OD.meshNormalsFrame[0], "ODmeshNormalsRowCol", arg, i); + XtManageChild(w->OD.meshNormalsRowCol); + + i=0; + XtSetArg(arg[i], XmNminimum, 0); i++; + XtSetArg(arg[i], XmNmaximum, 100); i++; + XtSetArg(arg[i], XmNdecimalPoints, 0); i++; + XtSetArg(arg[i], XmNvalue, CTX.mesh.normals); i++; + XtSetArg(arg[i], XmNshowValue, False); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->OD.meshNormalsScale = XmCreateScale(w->OD.meshNormalsRowCol, "ODmeshNormalsScale", arg, i); + XtManageChild(w->OD.meshNormalsScale); + + i=0; + sprintf(label, "%g", CTX.mesh.normals); + XtSetArg(arg[i], XmNvalue, label); i++; + w->OD.meshNormalsText = XmCreateTextField(w->OD.meshNormalsRowCol, "ODmeshNormalsText", arg, i); + XtManageChild(w->OD.meshNormalsText); + + + /* Post */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Post Options")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->OD.postDialog = XmCreateTemplateDialog(w->M.shell, "ODpostDialog", arg, i); + XtUnmanageChild(w->OD.postDialog); + + i=0; + w->OD.postRowCol = XmCreateRowColumn(w->OD.postDialog, "ODpostRowCol", arg, i); + XtManageChild(w->OD.postRowCol); + + /* Post - link */ + + i=0; + w->OD.postLinkFrame[0] = XmCreateFrame(w->OD.postRowCol, "ODpostLinkFrame0", arg, i); + XtManageChild(w->OD.postLinkFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Links")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.postLinkFrame[1] = XmCreateLabel(w->OD.postLinkFrame[0], "ODpostLinkFrame1", arg, i); + XtManageChild(w->OD.postLinkFrame[1]); + + i=0; + w->OD.postLinkRowCol = XmCreateRowColumn(w->OD.postLinkFrame[0], "ODpostLinkRowCol", arg, i); + XtManageChild(w->OD.postLinkRowCol); + + i=0; + w->OD.postLinkCheck = XmCreateRadioBox(w->OD.postLinkRowCol, "ODpostLinkCheck", arg, i); + XtManageChild(w->OD.postLinkCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("No Links")); i++; + XtSetArg(arg[i], XmNset, CTX.post.link?False:True); i++; + w->OD.postLinkButt[0] = XmCreateToggleButton(w->OD.postLinkCheck, "ODpostLinkButt0", arg, i); + XtManageChild(w->OD.postLinkButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Link Visible Views")); i++; + XtSetArg(arg[i], XmNset, (CTX.post.link==1)?True:False); i++; + w->OD.postLinkButt[1] = XmCreateToggleButton(w->OD.postLinkCheck, "ODpostLinkButt1", arg, i); + XtManageChild(w->OD.postLinkButt[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Link All Views")); i++; + XtSetArg(arg[i], XmNset, (CTX.post.link==2)?True:False); i++; + w->OD.postLinkButt[2] = XmCreateToggleButton(w->OD.postLinkCheck, "ODpostLinkButt2", arg, i); + XtManageChild(w->OD.postLinkButt[2]); + + /* post - anim */ + i=0; + w->OD.postAnimFrame[0] = XmCreateFrame(w->OD.postRowCol, "ODpostAnimFrame0", arg, i); + XtManageChild(w->OD.postAnimFrame[0]); + + i=0; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Animation Delay")); i++; + w->OD.postAnimFrame[1] = XmCreateLabel(w->OD.postAnimFrame[0], "ODpostAnimFrame1", arg, i); + XtManageChild(w->OD.postAnimFrame[1]); + + i=0; + w->OD.postAnimFrameRowCol = XmCreateRowColumn(w->OD.postAnimFrame[0], "ODpostAnimFrameRowCol", arg, i); + XtManageChild(w->OD.postAnimFrameRowCol); + + i=0; + XtSetArg(arg[i], XmNminimum, 0); i++; + XtSetArg(arg[i], XmNmaximum, 100); i++; + XtSetArg(arg[i], XmNdecimalPoints, 1); i++; + XtSetArg(arg[i], XmNshowValue, true); i++; + XtSetArg(arg[i], XmNvalue, CTX.post.anim_delay/1.e5); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->OD.postAnimScale = XmCreateScale(w->OD.postAnimFrameRowCol, "ODpostAnimScale", arg, i); + XtManageChild(w->OD.postAnimScale); + + + /* Miscellaneous */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("General Options")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->OD.miscDialog = XmCreateTemplateDialog(w->M.shell, "ODmiscDialog", arg, i); + XtUnmanageChild(w->OD.miscDialog); + + i=0; + w->OD.miscRowCol = XmCreateRowColumn(w->OD.miscDialog, "ODmiscRowCol", arg, i); + XtManageChild(w->OD.miscRowCol); + + /* misc - Misc */ + + i=0; + w->OD.miscMiscFrame[0] = XmCreateFrame(w->OD.miscRowCol, "ODmiscMiscFrame0", arg, i); + XtManageChild(w->OD.miscMiscFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Miscellaneous")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.miscMiscFrame[1] = XmCreateLabel(w->OD.miscMiscFrame[0], "ODmiscMiscFrame1", arg, i); + XtManageChild(w->OD.miscMiscFrame[1]); + + i=0; + w->OD.miscMiscCheck = XmCreateSimpleCheckBox(w->OD.miscMiscFrame[0], "ODmiscMiscCheck", arg, i); + XtManageChild(w->OD.miscMiscCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Show Moving Axes")); i++; + XtSetArg(arg[i], XmNset, CTX.axes?True:False); i++; + w->OD.miscMiscButt[0] = XmCreateToggleButton(w->OD.miscMiscCheck, "ODmiscMiscButt0", arg, i); + XtManageChild(w->OD.miscMiscButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Show Small Axes")); i++; + XtSetArg(arg[i], XmNset, CTX.little_axes?True:False); i++; + w->OD.miscMiscButt[1] = XmCreateToggleButton(w->OD.miscMiscCheck, "ODmiscMiscButt1", arg, i); + XtManageChild(w->OD.miscMiscButt[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Enable Fast Redraw")); i++; + XtSetArg(arg[i], XmNset, CTX.fast?True:False); i++; + w->OD.miscMiscButt[2] = XmCreateToggleButton(w->OD.miscMiscCheck, "ODmiscMiscButt3", arg, i); + XtManageChild(w->OD.miscMiscButt[2]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Use Display Lists")); i++; + XtSetArg(arg[i], XmNset, CTX.display_lists?True:False); i++; + w->OD.miscMiscButt[3] = XmCreateToggleButton(w->OD.miscMiscCheck, "ODmiscMiscButt4", arg, i); + XtManageChild(w->OD.miscMiscButt[3]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Enable Alpha Blending")); i++; + XtSetArg(arg[i], XmNset, CTX.alpha?True:False); i++; + w->OD.miscMiscButt[4] = XmCreateToggleButton(w->OD.miscMiscCheck, "ODmiscMiscButt2", arg, i); + XtManageChild(w->OD.miscMiscButt[4]); + + + /* misc - colorscheme */ + + i=0; + w->OD.miscColorSchemeFrame[0] = XmCreateFrame(w->OD.miscRowCol, "ODmiscColorSchemeFrame0", arg, i); + XtManageChild(w->OD.miscColorSchemeFrame[0]); + + i=0; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Predefined Color Schemes")); i++; + w->OD.miscColorSchemeFrame[1] = XmCreateLabel(w->OD.miscColorSchemeFrame[0], "ODmiscColorSchemeFrame1", arg, i); + XtManageChild(w->OD.miscColorSchemeFrame[1]); + + i=0; + w->OD.miscColorSchemeFrameRowCol = XmCreateRowColumn(w->OD.miscColorSchemeFrame[0], "ODmiscColorSchemeFrameRowCol", arg, i); + XtManageChild(w->OD.miscColorSchemeFrameRowCol); + + i=0; + XtSetArg(arg[i], XmNminimum, 0); i++; + XtSetArg(arg[i], XmNmaximum, 2); i++; + XtSetArg(arg[i], XmNdecimalPoints, 0); i++; + XtSetArg(arg[i], XmNshowValue, true); i++; + XtSetArg(arg[i], XmNvalue, CTX.color.id); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->OD.miscColorSchemeScale = XmCreateScale(w->OD.miscColorSchemeFrameRowCol, "ODmiscColorSchemeScale", arg, i); + XtManageChild(w->OD.miscColorSchemeScale); + + /* misc - projection */ + + i=0; + w->OD.miscProjFrame[0] = XmCreateFrame(w->OD.miscRowCol, "ODmiscProjFrame0", arg, i); + XtManageChild(w->OD.miscProjFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Projection")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.miscProjFrame[1] = XmCreateLabel(w->OD.miscProjFrame[0], "ODmiscProjFrame1", arg, i); + XtManageChild(w->OD.miscProjFrame[1]); + + i=0; + w->OD.miscProjCheck = XmCreateRadioBox(w->OD.miscProjFrame[0], "ODmiscProjCheck", arg, i); + XtManageChild(w->OD.miscProjCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Orthographic")); i++; + XtSetArg(arg[i], XmNset, CTX.ortho?True:False); i++; + w->OD.miscProjButt[0] = XmCreateToggleButton(w->OD.miscProjCheck, "ODmiscProjButt0", arg, i); + XtManageChild(w->OD.miscProjButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Perspective")); i++; + XtSetArg(arg[i], XmNset, CTX.ortho?False:True); i++; + w->OD.miscProjButt[1] = XmCreateToggleButton(w->OD.miscProjCheck, "ODmiscProjButt1", arg, i); + XtManageChild(w->OD.miscProjButt[1]); + + + /* misc - light position */ + i=0; + w->OD.miscLightFrame[0] = XmCreateFrame(w->OD.miscRowCol, "ODmiscLightFrame0", arg, i); + XtManageChild(w->OD.miscLightFrame[0]); + + i=0; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Light Position")); i++; + w->OD.miscLightFrame[1] = XmCreateLabel(w->OD.miscLightFrame[0], "ODmiscLightFrame1", arg, i); + XtManageChild(w->OD.miscLightFrame[1]); + + i=0; + w->OD.miscLightFrameRowCol = XmCreateRowColumn(w->OD.miscLightFrame[0], "ODmiscLightFrameRowCol", arg, i); + XtManageChild(w->OD.miscLightFrameRowCol); + + for(n=0 ; n<3 ; n++){ + i=0; + XtSetArg(arg[i], XmNminimum, -25); i++; + XtSetArg(arg[i], XmNmaximum, 25); i++; + XtSetArg(arg[i], XmNdecimalPoints, 0); i++; + XtSetArg(arg[i], XmNshowValue, False); i++; + XtSetArg(arg[i], XmNvalue, (int)25*CTX.light0[n]); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->OD.miscLightScale[n] = XmCreateScale(w->OD.miscLightFrameRowCol, "ODmiscLightScalen", arg, i); + XtManageChild(w->OD.miscLightScale[n]); + } + + /* misc - shininess */ + i=0; + w->OD.miscShineFrame[0] = XmCreateFrame(w->OD.miscRowCol, "ODmiscShineFrame0", arg, i); + XtManageChild(w->OD.miscShineFrame[0]); + + i=0; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Shininess")); i++; + w->OD.miscShineFrame[1] = XmCreateLabel(w->OD.miscShineFrame[0], "ODmiscShineFrame1", arg, i); + XtManageChild(w->OD.miscShineFrame[1]); + + i=0; + w->OD.miscShineFrameRowCol = XmCreateRowColumn(w->OD.miscShineFrame[0], "ODmiscShineFrameRowCol", arg, i); + XtManageChild(w->OD.miscShineFrameRowCol); + + i=0; + XtSetArg(arg[i], XmNminimum, 0); i++; + XtSetArg(arg[i], XmNmaximum, 25); i++; + XtSetArg(arg[i], XmNdecimalPoints, 0); i++; + XtSetArg(arg[i], XmNshowValue, false); i++; + XtSetArg(arg[i], XmNvalue, (int)25*CTX.shine); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->OD.miscShineScale = XmCreateScale(w->OD.miscShineFrameRowCol, "ODmiscShineScale", arg, i); + XtManageChild(w->OD.miscShineScale); + + /* Viewport */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Viewport")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->OD.viewportDialog = XmCreateTemplateDialog(w->M.shell, "ODviewportDialog", arg, i); + XtUnmanageChild(w->OD.viewportDialog); + + i=0; + w->OD.viewportRowCol = XmCreateRowColumn(w->OD.viewportDialog, "ODviewportRowCol", arg, i); + XtManageChild(w->OD.viewportRowCol); + + /* viewport - rotate */ + + i=0; + w->OD.viewportFrame[0][0] = XmCreateFrame(w->OD.viewportRowCol, "ODviewportFrame00", arg, i); + XtManageChild(w->OD.viewportFrame[0][0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Rotation")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.viewportFrame[1][0] = XmCreateLabel(w->OD.viewportFrame[0][0], "ODviewportFrame10", arg, i); + XtManageChild(w->OD.viewportFrame[1][0]); + + i=0; + XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++; + XtSetArg(arg[i], XmNnumColumns, 3); i++; + w->OD.viewportFrameRowCol[0] = XmCreateRowColumn(w->OD.viewportFrame[0][0], "ODviewportFrameRowCol0", arg, i); + XtManageChild(w->OD.viewportFrameRowCol[0]); + + i=0; + sprintf(label, "%g", CTX.r[0]); + XtSetArg(arg[i], XmNvalue, label); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->OD.viewportText[0][0] = XmCreateTextField(w->OD.viewportFrameRowCol[0], "ODviewportText00", arg, i); + XtManageChild(w->OD.viewportText[0][0]); + i=0; + XtSetArg(arg[i], XmNset, CTX.rlock[0]); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("x-lock")); i++; + w->OD.viewportLockButt[0][0] = XmCreateToggleButton(w->OD.viewportFrameRowCol[0], "ODviewportLockButt00", arg, i); + XtManageChild(w->OD.viewportLockButt[0][0]); + + i=0; + sprintf(label, "%g", CTX.r[1]); + XtSetArg(arg[i], XmNvalue, label); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->OD.viewportText[0][1] = XmCreateTextField(w->OD.viewportFrameRowCol[0], "ODviewportText01", arg, i); + XtManageChild(w->OD.viewportText[0][1]); + i=0; + XtSetArg(arg[i], XmNset, CTX.rlock[1]); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("y-lock")); i++; + w->OD.viewportLockButt[0][1] = XmCreateToggleButton(w->OD.viewportFrameRowCol[0], "ODviewportLockButt00", arg, i); + XtManageChild(w->OD.viewportLockButt[0][1]); + + i=0; + sprintf(label, "%g", CTX.r[2]); + XtSetArg(arg[i], XmNvalue, label); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->OD.viewportText[0][2] = XmCreateTextField(w->OD.viewportFrameRowCol[0], "ODviewportText02", arg, i); + XtManageChild(w->OD.viewportText[0][2]); + i=0; + XtSetArg(arg[i], XmNset, CTX.rlock[2]); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("z-lock")); i++; + w->OD.viewportLockButt[0][2] = XmCreateToggleButton(w->OD.viewportFrameRowCol[0], "ODviewportLockButt02", arg, i); + XtManageChild(w->OD.viewportLockButt[0][2]); + + + /* viewport - translate */ + + i=0; + w->OD.viewportFrame[0][1] = XmCreateFrame(w->OD.viewportRowCol, "ODviewportFrame01", arg, i); + XtManageChild(w->OD.viewportFrame[0][1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Translation")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.viewportFrame[1][1] = XmCreateLabel(w->OD.viewportFrame[0][1], "ODviewportFrame11", arg, i); + XtManageChild(w->OD.viewportFrame[1][1]); + + i=0; + XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++; + XtSetArg(arg[i], XmNnumColumns, 3); i++; + w->OD.viewportFrameRowCol[1] = XmCreateRowColumn(w->OD.viewportFrame[0][1], "ODviewportFrameRowCol1", arg, i); + XtManageChild(w->OD.viewportFrameRowCol[1]); + + i=0; + sprintf(label, "%g", CTX.t[0]); + XtSetArg(arg[i], XmNvalue, label); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->OD.viewportText[1][0] = XmCreateTextField(w->OD.viewportFrameRowCol[1], "ODviewportText10", arg, i); + XtManageChild(w->OD.viewportText[1][0]); + i=0; + XtSetArg(arg[i], XmNset, CTX.tlock[0]); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("x-lock")); i++; + w->OD.viewportLockButt[1][0] = XmCreateToggleButton(w->OD.viewportFrameRowCol[1], "ODviewportLockButt10", arg, i); + XtManageChild(w->OD.viewportLockButt[1][0]); + + i=0; + sprintf(label, "%g", CTX.t[1]); + XtSetArg(arg[i], XmNvalue, label); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->OD.viewportText[1][1] = XmCreateTextField(w->OD.viewportFrameRowCol[1], "ODviewportText11", arg, i); + XtManageChild(w->OD.viewportText[1][1]); + i=0; + XtSetArg(arg[i], XmNset, CTX.tlock[1]); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("y-lock")); i++; + w->OD.viewportLockButt[1][1] = XmCreateToggleButton(w->OD.viewportFrameRowCol[1], "ODviewportLockButt00", arg, i); + XtManageChild(w->OD.viewportLockButt[1][1]); + + i=0; + sprintf(label, "%g", CTX.t[2]); + XtSetArg(arg[i], XmNvalue, label); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->OD.viewportText[1][2] = XmCreateTextField(w->OD.viewportFrameRowCol[1], "ODviewportText12", arg, i); + XtManageChild(w->OD.viewportText[1][2]); + i=0; + XtSetArg(arg[i], XmNset, CTX.tlock[2]); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("z-lock")); i++; + w->OD.viewportLockButt[1][2] = XmCreateToggleButton(w->OD.viewportFrameRowCol[1], "ODviewportLockButt12", arg, i); + XtManageChild(w->OD.viewportLockButt[1][2]); + + + /* viewport - scale */ + + i=0; + w->OD.viewportFrame[0][2] = XmCreateFrame(w->OD.viewportRowCol, "ODviewportFrame02", arg, i); + XtManageChild(w->OD.viewportFrame[0][2]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Scale")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.viewportFrame[1][2] = XmCreateLabel(w->OD.viewportFrame[0][2], "ODviewportFrame12", arg, i); + XtManageChild(w->OD.viewportFrame[1][2]); + + i=0; + XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++; + XtSetArg(arg[i], XmNnumColumns, 3); i++; + w->OD.viewportFrameRowCol[2] = XmCreateRowColumn(w->OD.viewportFrame[0][2], "ODviewportFrameRowCol2", arg, i); + XtManageChild(w->OD.viewportFrameRowCol[2]); + + i=0; + sprintf(label, "%g", CTX.s[0]); + XtSetArg(arg[i], XmNvalue, label); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->OD.viewportText[2][0] = XmCreateTextField(w->OD.viewportFrameRowCol[2], "ODviewportText20", arg, i); + XtManageChild(w->OD.viewportText[2][0]); + i=0; + XtSetArg(arg[i], XmNset, CTX.slock[0]); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("x-lock")); i++; + w->OD.viewportLockButt[2][0] = XmCreateToggleButton(w->OD.viewportFrameRowCol[2], "ODviewportLockButt20", arg, i); + XtManageChild(w->OD.viewportLockButt[2][0]); + + i=0; + sprintf(label, "%g", CTX.s[1]); + XtSetArg(arg[i], XmNvalue, label); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->OD.viewportText[2][1] = XmCreateTextField(w->OD.viewportFrameRowCol[2], "ODviewportText21", arg, i); + XtManageChild(w->OD.viewportText[2][1]); + i=0; + XtSetArg(arg[i], XmNset, CTX.slock[1]); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("y-lock")); i++; + w->OD.viewportLockButt[2][1] = XmCreateToggleButton(w->OD.viewportFrameRowCol[2], "ODviewportLockButt20", arg, i); + XtManageChild(w->OD.viewportLockButt[2][1]); + + i=0; + sprintf(label, "%g", CTX.s[2]); + XtSetArg(arg[i], XmNvalue, label); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->OD.viewportText[2][2] = XmCreateTextField(w->OD.viewportFrameRowCol[2], "ODviewportText22", arg, i); + XtManageChild(w->OD.viewportText[2][2]); + i=0; + XtSetArg(arg[i], XmNset, CTX.slock[2]); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("z-lock")); i++; + w->OD.viewportLockButt[2][2] = XmCreateToggleButton(w->OD.viewportFrameRowCol[2], "ODviewportLockButt22", arg, i); + XtManageChild(w->OD.viewportLockButt[2][2]); + + /* Info */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Info")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Update")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->OD.infoDialog = XmCreateTemplateDialog(w->M.shell, "ODinfoDialog", arg, i); + XtUnmanageChild(w->OD.infoDialog); + + i=0; + w->OD.infoRowCol = XmCreateRowColumn(w->OD.infoDialog, "ODinfoRowCol", arg, i); + XtManageChild(w->OD.infoRowCol); + + /* info - geom */ + + i=0; + w->OD.infoFrame[0][0] = XmCreateFrame(w->OD.infoRowCol, "ODinfoFrame00", arg, i); + XtManageChild(w->OD.infoFrame[0][0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Geometry")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.infoFrame[1][0] = XmCreateLabel(w->OD.infoFrame[0][0], "ODinfoFrame10", arg, i); + XtManageChild(w->OD.infoFrame[1][0]); + + i=0; + XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++; + XtSetArg(arg[i], XmNnumColumns, 2); i++; + w->OD.infoFrameRowCol[0] = XmCreateRowColumn(w->OD.infoFrame[0][0], "ODinfoFrameRowCol0", arg, i); + XtManageChild(w->OD.infoFrameRowCol[0]); + + for(n=0 ; n<NB_INFO_GEOM ; n++){ + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(txt_info[n])); i++; + w->OD.infoKeyLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[0], "ODinfoKeyLabel", arg, i); + XtManageChild(w->OD.infoKeyLabel[n]); + } + for(n=0 ; n<NB_INFO_GEOM ; n++){ + i=0; + w->OD.infoValueLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[0], "ODinfoValueLabel", arg, i); + XtManageChild(w->OD.infoValueLabel[n]); + } + + /* info - mesh */ + + i=0; + w->OD.infoFrame[0][1] = XmCreateFrame(w->OD.infoRowCol, "ODinfoFrame01", arg, i); + XtManageChild(w->OD.infoFrame[0][1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Mesh")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.infoFrame[1][1] = XmCreateLabel(w->OD.infoFrame[0][1], "ODinfoFrame11", arg, i); + XtManageChild(w->OD.infoFrame[1][1]); + + i=0; + XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++; + XtSetArg(arg[i], XmNnumColumns, 2); i++; + w->OD.infoFrameRowCol[1] = XmCreateRowColumn(w->OD.infoFrame[0][1], "ODinfoFrameRowCol1", arg, i); + XtManageChild(w->OD.infoFrameRowCol[1]); + + for(n=NB_INFO_GEOM ; n<NB_INFO_GEOM+NB_INFO_MESH ; n++){ + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(txt_info[n])); i++; + w->OD.infoKeyLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[1], "ODinfoKeyLabel", arg, i); + XtManageChild(w->OD.infoKeyLabel[n]); + } + for(n=NB_INFO_GEOM ; n<NB_INFO_GEOM+NB_INFO_MESH ; n++){ + i=0; + w->OD.infoValueLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[1], "ODinfoValueLabel", arg, i); + XtManageChild(w->OD.infoValueLabel[n]); + } + + /* info - post */ + + i=0; + w->OD.infoFrame[0][2] = XmCreateFrame(w->OD.infoRowCol, "ODinfoFrame02", arg, i); + XtManageChild(w->OD.infoFrame[0][2]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Post Processing")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->OD.infoFrame[1][2] = XmCreateLabel(w->OD.infoFrame[0][2], "ODinfoFrame12", arg, i); + XtManageChild(w->OD.infoFrame[1][2]); + + i=0; + XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++; + XtSetArg(arg[i], XmNnumColumns, 2); i++; + w->OD.infoFrameRowCol[2] = XmCreateRowColumn(w->OD.infoFrame[0][2], "ODinfoFrameRowCol2", arg, i); + XtManageChild(w->OD.infoFrameRowCol[2]); + + for(n=NB_INFO_GEOM+NB_INFO_MESH ; n<NB_INFO_MAX ; n++){ + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(txt_info[n])); i++; + w->OD.infoKeyLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[2], "ODinfoKeyLabel", arg, i); + XtManageChild(w->OD.infoKeyLabel[n]); + } + for(n=NB_INFO_GEOM+NB_INFO_MESH ; n<NB_INFO_MAX ; n++){ + i=0; + w->OD.infoValueLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[2], "ODinfoValueLabel", arg, i); + XtManageChild(w->OD.infoValueLabel[n]); + } + +} + + +/* ------------------------------------------------------------------------ + HELP DIALOGS + ------------------------------------------------------------------------ */ + +extern char TextAbout[1024]; + +void CreateWidgets_HD(Widgets_T *w){ + int i; + Arg arg[10]; + Widget tmp ; + + /* keys */ + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Short Help")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, True); i++; + w->HD.keysDialog = XmCreateTemplateDialog(w->M.shell, "HDkeysDialog", arg, i); + XtUnmanageChild(w->HD.keysDialog); + + i=0; + XtSetArg(arg[i], XmNeditable, False); i++; + XtSetArg(arg[i], XmNeditMode, XmMULTI_LINE_EDIT); i++; + XtSetArg(arg[i], XmNcolumns, 66); i++; + XtSetArg(arg[i], XmNrows, 25); i++; + XtSetArg(arg[i], XmNvalue, txt_help); i++; + w->HD.keysText = XmCreateScrolledText(w->HD.keysDialog, "HDkeysText", arg, i); + XtManageChild(w->HD.keysText); + + + /* about */ + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("About Gmsh...")); i++; + XtSetArg(arg[i], XmNautoUnmanage, True); i++; + XtSetArg(arg[i], XmNmessageString, XmStringCreateLtoR(TextAbout,XmFONTLIST_DEFAULT_TAG)); i++; + w->HD.aboutDialog = XmCreateInformationDialog(w->M.shell, "HDaboutDialog", arg, i); + XtUnmanageChild(w->HD.aboutDialog); + + tmp = XmMessageBoxGetChild(w->HD.aboutDialog, XmDIALOG_HELP_BUTTON); + XtUnmanageChild(tmp); + tmp = XmMessageBoxGetChild(w->HD.aboutDialog, XmDIALOG_CANCEL_BUTTON); + XtUnmanageChild(tmp); + +} + +/* ------------------------------------------------------------------------ + GEOMETRY DIALOGS + ------------------------------------------------------------------------ */ + +void CreateWidgets_GD(Widgets_T *w){ + int i; + Arg arg[10]; + + /* Parameter */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Add Parameter")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Add")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->GD.paramDialog = XmCreateTemplateDialog(w->M.shell, "GDparamDialog", arg, i); + XtUnmanageChild(w->GD.paramDialog); + + i=0; + w->GD.paramRowCol = XmCreateRowColumn(w->GD.paramDialog, "ODparamRowCol", arg, i); + XtManageChild(w->GD.paramRowCol); + + /* param - name */ + + i=0; + w->GD.paramFrame[0][0] = XmCreateFrame(w->GD.paramRowCol, "GDparamFrame00", arg, i); + XtManageChild(w->GD.paramFrame[0][0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Name")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->GD.paramFrame[1][0] = XmCreateLabel(w->GD.paramFrame[0][0], "GDparamFrame10", arg, i); + XtManageChild(w->GD.paramFrame[1][0]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->GD.paramFrameRowCol[0] = XmCreateRowColumn(w->GD.paramFrame[0][0], "ODparamFrameRowCol0", arg, i); + XtManageChild(w->GD.paramFrameRowCol[0]); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + w->GD.paramText[0] = XmCreateTextField(w->GD.paramFrameRowCol[0], "GDparamText0", arg, i); + XtManageChild(w->GD.paramText[0]); + + /* param - value */ + + i=0; + w->GD.paramFrame[0][1] = XmCreateFrame(w->GD.paramRowCol, "GDparamFrame01", arg, i); + XtManageChild(w->GD.paramFrame[0][1]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Value")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->GD.paramFrame[1][1] = XmCreateLabel(w->GD.paramFrame[0][1], "GDparamFrame11", arg, i); + XtManageChild(w->GD.paramFrame[1][1]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->GD.paramFrameRowCol[1] = XmCreateRowColumn(w->GD.paramFrame[0][1], "ODparamFrameRowCol1", arg, i); + XtManageChild(w->GD.paramFrameRowCol[1]); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + w->GD.paramText[1] = XmCreateTextField(w->GD.paramFrameRowCol[1], "GDparamText1", arg, i); + XtManageChild(w->GD.paramText[1]); + + + /* Point */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Add Point")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Add")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->GD.pointDialog = XmCreateTemplateDialog(w->M.shell, "GDpointDialog", arg, i); + XtUnmanageChild(w->GD.pointDialog); + + i=0; + w->GD.pointRowCol = XmCreateRowColumn(w->GD.pointDialog, "ODpointRowCol", arg, i); + XtManageChild(w->GD.pointRowCol); + + /* point - coords */ + + i=0; + w->GD.pointFrame[0][0] = XmCreateFrame(w->GD.pointRowCol, "GDpointFrame00", arg, i); + XtManageChild(w->GD.pointFrame[0][0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Coordinates")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->GD.pointFrame[1][0] = XmCreateLabel(w->GD.pointFrame[0][0], "GDpointFrame10", arg, i); + XtManageChild(w->GD.pointFrame[1][0]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->GD.pointFrameRowCol[0] = XmCreateRowColumn(w->GD.pointFrame[0][0], "ODpointFrameRowCol0", arg, i); + XtManageChild(w->GD.pointFrameRowCol[0]); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.pointText[0] = XmCreateTextField(w->GD.pointFrameRowCol[0], "GDpointText0", arg, i); + XtManageChild(w->GD.pointText[0]); + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.pointText[1] = XmCreateTextField(w->GD.pointFrameRowCol[0], "GDpointText1", arg, i); + XtManageChild(w->GD.pointText[1]); + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.pointText[2] = XmCreateTextField(w->GD.pointFrameRowCol[0], "GDpointText2", arg, i); + XtManageChild(w->GD.pointText[2]); + + /* point - char length */ + + i=0; + w->GD.pointFrame[0][1] = XmCreateFrame(w->GD.pointRowCol, "GDpointFrame01", arg, i); + XtManageChild(w->GD.pointFrame[0][1]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Characteristc Length")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->GD.pointFrame[1][1] = XmCreateLabel(w->GD.pointFrame[0][1], "GDpointFrame11", arg, i); + XtManageChild(w->GD.pointFrame[1][1]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->GD.pointFrameRowCol[1] = XmCreateRowColumn(w->GD.pointFrame[0][1], "ODpointFrameRowCol1", arg, i); + XtManageChild(w->GD.pointFrameRowCol[1]); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.pointText[3] = XmCreateTextField(w->GD.pointFrameRowCol[1], "GDpointText3", arg, i); + XtManageChild(w->GD.pointText[3]); + + + /* Rotation */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Current Rotation")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->GD.rotDialog = XmCreateTemplateDialog(w->M.shell, "GDrotDialog", arg, i); + XtUnmanageChild(w->GD.rotDialog); + + i=0; + w->GD.rotRowCol = XmCreateRowColumn(w->GD.rotDialog, "ODrotRowCol", arg, i); + XtManageChild(w->GD.rotRowCol); + + /* rot - axis point */ + + i=0; + w->GD.rotFrame[0][0] = XmCreateFrame(w->GD.rotRowCol, "GDrotFrame00", arg, i); + XtManageChild(w->GD.rotFrame[0][0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Axis Point")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->GD.rotFrame[1][0] = XmCreateLabel(w->GD.rotFrame[0][0], "GDrotFrame10", arg, i); + XtManageChild(w->GD.rotFrame[1][0]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->GD.rotFrameRowCol[0] = XmCreateRowColumn(w->GD.rotFrame[0][0], "ODrotFrameRowCol0", arg, i); + XtManageChild(w->GD.rotFrameRowCol[0]); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.rotText[0] = XmCreateTextField(w->GD.rotFrameRowCol[0], "GDrotText0", arg, i); + XtManageChild(w->GD.rotText[0]); + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.rotText[1] = XmCreateTextField(w->GD.rotFrameRowCol[0], "GDrotText1", arg, i); + XtManageChild(w->GD.rotText[1]); + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.rotText[2] = XmCreateTextField(w->GD.rotFrameRowCol[0], "GDrotText2", arg, i); + XtManageChild(w->GD.rotText[2]); + + /* rot - direction */ + + i=0; + w->GD.rotFrame[0][1] = XmCreateFrame(w->GD.rotRowCol, "GDrotFrame01", arg, i); + XtManageChild(w->GD.rotFrame[0][1]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Direction")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->GD.rotFrame[1][1] = XmCreateLabel(w->GD.rotFrame[0][1], "GDrotFrame11", arg, i); + XtManageChild(w->GD.rotFrame[1][1]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->GD.rotFrameRowCol[1] = XmCreateRowColumn(w->GD.rotFrame[0][1], "ODrotFrameRowCol1", arg, i); + XtManageChild(w->GD.rotFrameRowCol[1]); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.rotText[3] = XmCreateTextField(w->GD.rotFrameRowCol[1], "GDrotText3", arg, i); + XtManageChild(w->GD.rotText[3]); + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.rotText[4] = XmCreateTextField(w->GD.rotFrameRowCol[1], "GDrotText4", arg, i); + XtManageChild(w->GD.rotText[4]); + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.rotText[5] = XmCreateTextField(w->GD.rotFrameRowCol[1], "GDrotText5", arg, i); + XtManageChild(w->GD.rotText[5]); + + /* rot - angle */ + + i=0; + w->GD.rotFrame[0][2] = XmCreateFrame(w->GD.rotRowCol, "GDrotFrame02", arg, i); + XtManageChild(w->GD.rotFrame[0][2]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Angle")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->GD.rotFrame[1][2] = XmCreateLabel(w->GD.rotFrame[0][2], "GDrotFrame12", arg, i); + XtManageChild(w->GD.rotFrame[1][2]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->GD.rotFrameRowCol[2] = XmCreateRowColumn(w->GD.rotFrame[0][2], "ODrotFrameRowCol2", arg, i); + XtManageChild(w->GD.rotFrameRowCol[2]); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.rotText[6] = XmCreateTextField(w->GD.rotFrameRowCol[2], "GDrotText6", arg, i); + XtManageChild(w->GD.rotText[6]); + + + /* Translation */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("CurrentTranslation")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->GD.tranDialog = XmCreateTemplateDialog(w->M.shell, "GDtranDialog", arg, i); + XtUnmanageChild(w->GD.tranDialog); + + i=0; + w->GD.tranFrame[0] = XmCreateFrame(w->GD.tranDialog, "GDtranFrame0", arg, i); + XtManageChild(w->GD.tranFrame[0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Vector")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->GD.tranFrame[1] = XmCreateLabel(w->GD.tranFrame[0], "GDtranFrame1", arg, i); + XtManageChild(w->GD.tranFrame[1]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->GD.tranFrameRowCol = XmCreateRowColumn(w->GD.tranFrame[0], "ODtranFrameRowCol", arg, i); + XtManageChild(w->GD.tranFrameRowCol); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.tranText[0] = XmCreateTextField(w->GD.tranFrameRowCol, "GDtranText0", arg, i); + XtManageChild(w->GD.tranText[0]); + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.tranText[1] = XmCreateTextField(w->GD.tranFrameRowCol, "GDtranText1", arg, i); + XtManageChild(w->GD.tranText[1]); + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.tranText[2] = XmCreateTextField(w->GD.tranFrameRowCol, "GDtranText2", arg, i); + XtManageChild(w->GD.tranText[2]); + + + /* Dilatation */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Current Dilatation")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->GD.dilatDialog = XmCreateTemplateDialog(w->M.shell, "GDdilatDialog", arg, i); + XtUnmanageChild(w->GD.dilatDialog); + + i=0; + w->GD.dilatRowCol = XmCreateRowColumn(w->GD.dilatDialog, "ODdilatRowCol", arg, i); + XtManageChild(w->GD.dilatRowCol); + + /* dilat - coords */ + + i=0; + w->GD.dilatFrame[0][0] = XmCreateFrame(w->GD.dilatRowCol, "GDdilatFrame00", arg, i); + XtManageChild(w->GD.dilatFrame[0][0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Vector")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->GD.dilatFrame[1][0] = XmCreateLabel(w->GD.dilatFrame[0][0], "GDdilatFrame10", arg, i); + XtManageChild(w->GD.dilatFrame[1][0]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->GD.dilatFrameRowCol[0] = XmCreateRowColumn(w->GD.dilatFrame[0][0], "ODdilatFrameRowCol0", arg, i); + XtManageChild(w->GD.dilatFrameRowCol[0]); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.dilatText[0] = XmCreateTextField(w->GD.dilatFrameRowCol[0], "GDdilatText0", arg, i); + XtManageChild(w->GD.dilatText[0]); + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.dilatText[1] = XmCreateTextField(w->GD.dilatFrameRowCol[0], "GDdilatText1", arg, i); + XtManageChild(w->GD.dilatText[1]); + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.dilatText[2] = XmCreateTextField(w->GD.dilatFrameRowCol[0], "GDdilatText2", arg, i); + XtManageChild(w->GD.dilatText[2]); + + /* dilat - char length */ + + i=0; + w->GD.dilatFrame[0][1] = XmCreateFrame(w->GD.dilatRowCol, "GDdilatFrame01", arg, i); + XtManageChild(w->GD.dilatFrame[0][1]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Factor")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->GD.dilatFrame[1][1] = XmCreateLabel(w->GD.dilatFrame[0][1], "GDdilatFrame11", arg, i); + XtManageChild(w->GD.dilatFrame[1][1]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->GD.dilatFrameRowCol[1] = XmCreateRowColumn(w->GD.dilatFrame[0][1], "ODdilatFrameRowCol1", arg, i); + XtManageChild(w->GD.dilatFrameRowCol[1]); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + XtSetArg(arg[i], XmNcolumns, 10); i++; + w->GD.dilatText[3] = XmCreateTextField(w->GD.dilatFrameRowCol[1], "GDdilatText3", arg, i); + XtManageChild(w->GD.dilatText[3]); + +} + +/* ------------------------------------------------------------------------ + MESH DIALOGS + ------------------------------------------------------------------------ */ + +void CreateWidgets_MD(Widgets_T *w){ + int i; + Arg arg[10]; + + /* Characteristic length */ + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Characteristic Length")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->MD.charLengthDialog = XmCreateTemplateDialog(w->M.shell, "MDcharLengthDialog", arg, i); + XtUnmanageChild(w->MD.charLengthDialog); + + i=0; + w->MD.charLengthFrame[0] = XmCreateFrame(w->MD.charLengthDialog, "MDcharLengthFrame0", arg, i); + XtManageChild(w->MD.charLengthFrame[0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Value")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->MD.charLengthFrame[1] = XmCreateLabel(w->MD.charLengthFrame[0], "MDcharLengthFrame1", arg, i); + XtManageChild(w->MD.charLengthFrame[1]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->MD.charLengthFrameRowCol = XmCreateRowColumn(w->MD.charLengthFrame[0], "MDcharLengthFrameRowCol", arg, i); + XtManageChild(w->MD.charLengthFrameRowCol); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + w->MD.charLengthText = XmCreateTextField(w->MD.charLengthFrameRowCol, "MDcharLengthText", arg, i); + XtManageChild(w->MD.charLengthText); + + /* Transfinite Line */ + + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Transfinite Line")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->MD.trsfLineDialog = XmCreateTemplateDialog(w->M.shell, "MDtrsfLineDialog", arg, i); + XtUnmanageChild(w->MD.trsfLineDialog); + + i=0; + w->MD.trsfLineRowCol = XmCreateRowColumn(w->MD.trsfLineDialog, "MDtrsfLineRowCol", arg, i); + XtManageChild(w->MD.trsfLineRowCol); + + /* trsf line - type */ + + i=0; + w->MD.trsfLineFrame[0][0] = XmCreateFrame(w->MD.trsfLineRowCol, "MDtrsfLineFrame00", arg, i); + XtManageChild(w->MD.trsfLineFrame[0][0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Type")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->MD.trsfLineFrame[1][0] = XmCreateLabel(w->MD.trsfLineFrame[0][0], "MDtrsfLineFrame10", arg, i); + XtManageChild(w->MD.trsfLineFrame[1][0]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->MD.trsfLineFrameRowCol[0] = XmCreateRowColumn(w->MD.trsfLineFrame[0][0], "MDtrsfLineFrameRowCol0", arg, i); + XtManageChild(w->MD.trsfLineFrameRowCol[0]); + + i=0; + XtSetArg(arg[i], XmNvalue, "Power 1.0"); i++; + w->MD.trsfLineText[0] = XmCreateTextField(w->MD.trsfLineFrameRowCol[0], "MDtrsfLineText0", arg, i); + XtManageChild(w->MD.trsfLineText[0]); + + /* trsf line - nb pts */ + + i=0; + w->MD.trsfLineFrame[0][1] = XmCreateFrame(w->MD.trsfLineRowCol, "MDtrsfLineFrame01", arg, i); + XtManageChild(w->MD.trsfLineFrame[0][1]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Number of Points")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->MD.trsfLineFrame[1][1] = XmCreateLabel(w->MD.trsfLineFrame[0][1], "MDtrsfLineFrame11", arg, i); + XtManageChild(w->MD.trsfLineFrame[1][1]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->MD.trsfLineFrameRowCol[1] = XmCreateRowColumn(w->MD.trsfLineFrame[0][1], "MDtrsfLineFrameRowCol1", arg, i); + XtManageChild(w->MD.trsfLineFrameRowCol[1]); + + i=0; + XtSetArg(arg[i], XmNvalue, "2"); i++; + w->MD.trsfLineText[1] = XmCreateTextField(w->MD.trsfLineFrameRowCol[1], "MDtrsfLineText1", arg, i); + XtManageChild(w->MD.trsfLineText[1]); + + /* Transfinite Volume */ + i=0; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Transfinite Volume")); i++; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->MD.trsfVolumeDialog = XmCreateTemplateDialog(w->M.shell, "MDtrsfVolumeDialog", arg, i); + XtUnmanageChild(w->MD.trsfVolumeDialog); + + i=0; + w->MD.trsfVolumeFrame[0] = XmCreateFrame(w->MD.trsfVolumeDialog, "MDtrsfVolumeFrame0", arg, i); + XtManageChild(w->MD.trsfVolumeFrame[0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Number")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->MD.trsfVolumeFrame[1] = XmCreateLabel(w->MD.trsfVolumeFrame[0], "MDtrsfVolumeFrame1", arg, i); + XtManageChild(w->MD.trsfVolumeFrame[1]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->MD.trsfVolumeFrameRowCol = XmCreateRowColumn(w->MD.trsfVolumeFrame[0], "MDtrsfVolumeFrameRowCol", arg, i); + XtManageChild(w->MD.trsfVolumeFrameRowCol); + + i=0; + XtSetArg(arg[i], XmNvalue, ""); i++; + w->MD.trsfVolumeText = XmCreateTextField(w->MD.trsfVolumeFrameRowCol, "MDtrsfVolumeText", arg, i); + XtManageChild(w->MD.trsfVolumeText); + +} + +/* ------------------------------------------------------------------------ + POST PROCESSING DIALOGS + ------------------------------------------------------------------------ */ + +void CreateWidgets_PD(Widgets_T *w){ + int i, n; + Arg arg[10]; + Widget tmp; + + /* Offset */ + i=0; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->PD.offsetDialog = XmCreateTemplateDialog(w->M.shell, "PDoffsetDialog", arg, i); + XtUnmanageChild(w->PD.offsetDialog); + + i=0; + w->PD.offsetRowCol = XmCreateRowColumn(w->PD.offsetDialog, "PDoffsetRowCol", arg, i); + XtManageChild(w->PD.offsetRowCol); + + + /* Offset mode */ + i=0; + w->PD.offsetFrame[0][0] = XmCreateFrame(w->PD.offsetRowCol, "ODoffsetFrame00", arg, i); + XtManageChild(w->PD.offsetFrame[0][0]); + + i=0; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Offset Mode")); i++; + w->PD.offsetFrame[1][0] = XmCreateLabel(w->PD.offsetFrame[0][0], "PDoffsetFrame10", arg, i); + XtManageChild(w->PD.offsetFrame[1][0]); + + i=0; + w->PD.offsetFrameRowCol[0] = XmCreateRowColumn(w->PD.offsetFrame[0][0], "PDoffsetFrameRowCol0", arg, i); + XtManageChild(w->PD.offsetFrameRowCol[0]); + + i=0; + XtSetArg(arg[i], XmNnumColumns, 2); i++; + w->PD.offsetModeCheck = XmCreateRadioBox(w->PD.offsetFrameRowCol[0], "PDoffsetModeCheck", arg, i); + XtManageChild(w->PD.offsetModeCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Translation")); i++; + w->PD.offsetModeButt[0] = XmCreateToggleButton(w->PD.offsetModeCheck, "PDoffsetModeButt0", arg, i); + XtManageChild(w->PD.offsetModeButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Raise")); i++; + w->PD.offsetModeButt[1] = XmCreateToggleButton(w->PD.offsetModeCheck, "PDoffsetModeButt1", arg, i); + XtManageChild(w->PD.offsetModeButt[1]); + + /* Offset sliders and text fields */ + + for(n=1 ; n<4 ; n++){ + i=0; + w->PD.offsetFrame[0][n] = XmCreateFrame(w->PD.offsetRowCol, "ODoffsetFrame0n", arg, i); + XtManageChild(w->PD.offsetFrame[0][n]); + + i=0; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->PD.offsetFrame[1][n] = XmCreateLabel(w->PD.offsetFrame[0][n], "PDoffsetFrame1n", arg, i); + XtManageChild(w->PD.offsetFrame[1][n]); + + i=0; + w->PD.offsetFrameRowCol[n] = XmCreateRowColumn(w->PD.offsetFrame[0][n], "PDoffsetFrameRowColn", arg, i); + XtManageChild(w->PD.offsetFrameRowCol[n]); + + i=0; + XtSetArg(arg[i], XmNminimum, -100); i++; + XtSetArg(arg[i], XmNmaximum, 100); i++; + XtSetArg(arg[i], XmNdecimalPoints, 2); i++; + XtSetArg(arg[i], XmNshowValue, False); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->PD.offsetScale[n-1] = XmCreateScale(w->PD.offsetFrameRowCol[n], "PDoffsetScalen", arg, i); + XtManageChild(w->PD.offsetScale[n-1]); + + i=0; + w->PD.offsetText[n-1] = XmCreateTextField(w->PD.offsetFrameRowCol[n], "PDoffsetTextn", arg, i); + XtManageChild(w->PD.offsetText[n-1]); + } + + XtVaSetValues(w->PD.offsetFrame[1][1], XmNlabelString, XmStringCreateSimple("X"), NULL); + XtVaSetValues(w->PD.offsetFrame[1][2], XmNlabelString, XmStringCreateSimple("Y"), NULL); + XtVaSetValues(w->PD.offsetFrame[1][3], XmNlabelString, XmStringCreateSimple("Z"), NULL); + + + /* TimeStep */ + i=0; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->PD.timeStepDialog = XmCreateTemplateDialog(w->M.shell, "PDtimeStepDialog", arg, i); + XtUnmanageChild(w->PD.timeStepDialog); + + i=0; + w->PD.timeStepFrame[0] = XmCreateFrame(w->PD.timeStepDialog, "ODtimeStepFrame0", arg, i); + XtManageChild(w->PD.timeStepFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Time Step")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->PD.timeStepFrame[1] = XmCreateLabel(w->PD.timeStepFrame[0], "PDtimeStepFrame1", arg, i); + XtManageChild(w->PD.timeStepFrame[1]); + + i=0; + w->PD.timeStepFrameRowCol = XmCreateRowColumn(w->PD.timeStepFrame[0], "PDtimeStepRowCol", arg, i); + XtManageChild(w->PD.timeStepFrameRowCol); + + i=0; + XtSetArg(arg[i], XmNshowValue, False); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->PD.timeStepScale = XmCreateScale(w->PD.timeStepFrameRowCol, "PDtimeStepScale", arg, i); + XtManageChild(w->PD.timeStepScale); + + i=0; + w->PD.timeStepText = XmCreateTextField(w->PD.timeStepFrameRowCol, "PDtimeStepText", arg, i); + XtManageChild(w->PD.timeStepText); + + /* Scale */ + i=0; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->PD.scaleDialog = XmCreateTemplateDialog(w->M.shell, "PDscaleDialog", arg, i); + XtUnmanageChild(w->PD.scaleDialog); + + i=0; + w->PD.scaleRowCol = XmCreateRowColumn(w->PD.scaleDialog, "PDscaleRowCol", arg, i); + XtManageChild(w->PD.scaleRowCol); + + /* Scale - bar */ + i=0; + w->PD.scaleFrame[0][0] = XmCreateFrame(w->PD.scaleRowCol, "ODscaleFrame00", arg, i); + XtManageChild(w->PD.scaleFrame[0][0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Scale Bar")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->PD.scaleFrame[1][0] = XmCreateLabel(w->PD.scaleFrame[0][0], "PDscaleFrame10", arg, i); + XtManageChild(w->PD.scaleFrame[1][0]); + + i=0; + w->PD.scaleFrameRowCol[0] = XmCreateRowColumn(w->PD.scaleFrame[0][0], "PDscaleFrameRowCol0", arg, i); + XtManageChild(w->PD.scaleFrameRowCol[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Visibility")); i++; + w->PD.scaleShowButt = XmCreateToggleButton(w->PD.scaleFrameRowCol[0], "PDscaleShowButt", arg, i); + XtManageChild(w->PD.scaleShowButt); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Transparency")); i++; + w->PD.scaleTransButt = XmCreateToggleButton(w->PD.scaleFrameRowCol[0], "PDscaleTransButt", arg, i); + XtManageChild(w->PD.scaleTransButt); + + for(n=0 ; n<2 ; n++){ + i=0; + XtSetArg(arg[i], XmNvalue, "0.00000000000000000001e-1"); i++; /* lesstif bug */ + w->PD.scaleText[n] = XmCreateTextField(w->PD.scaleFrameRowCol[0], "PDscaleTextn", arg, i); + XtManageChild(w->PD.scaleText[n]); + } + + /* Scale - range */ + i=0; + w->PD.scaleFrame[0][1] = XmCreateFrame(w->PD.scaleRowCol, "ODscaleFrame01", arg, i); + XtManageChild(w->PD.scaleFrame[0][1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Value Range")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->PD.scaleFrame[1][1] = XmCreateLabel(w->PD.scaleFrame[0][1], "PDscaleFrame11", arg, i); + XtManageChild(w->PD.scaleFrame[1][1]); + + i=0; + w->PD.scaleFrameRowCol[1] = XmCreateRowColumn(w->PD.scaleFrame[0][1], "PDscaleFrameRowCol1", arg, i); + XtManageChild(w->PD.scaleFrameRowCol[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Custom")); i++; + w->PD.scaleRangeButt = XmCreateToggleButton(w->PD.scaleFrameRowCol[1], "PDscaleRangeButt", arg, i); + XtManageChild(w->PD.scaleRangeButt); + + for(n=0 ; n<2 ; n++){ + i=0; + XtSetArg(arg[i], XmNvalue, "0.00000000000000000001e-1"); i++; /* lesstif bug */ + w->PD.scaleRangeText[n] = XmCreateTextField(w->PD.scaleFrameRowCol[1], "PDscaleRangeTextn", arg, i); + XtManageChild(w->PD.scaleRangeText[n]); + } + + i=0; + w->PD.scaleTypeCheck = XmCreateRadioBox(w->PD.scaleFrameRowCol[1], "PDscaleTypeCheck", arg, i); + XtManageChild(w->PD.scaleTypeCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Linear")); i++; + w->PD.scaleTypeButt[0] = XmCreateToggleButton(w->PD.scaleTypeCheck, "PDscaleTypeButt0", arg, i); + XtManageChild(w->PD.scaleTypeButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Logarithmic")); i++; + w->PD.scaleTypeButt[1] = XmCreateToggleButton(w->PD.scaleTypeCheck, "PDscaleTypeButt1", arg, i); + XtManageChild(w->PD.scaleTypeButt[1]); + + + /* Scale - intervals */ + i=0; + w->PD.scaleFrame[0][2] = XmCreateFrame(w->PD.scaleRowCol, "ODscaleFrame02", arg, i); + XtManageChild(w->PD.scaleFrame[0][2]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Intervals")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->PD.scaleFrame[1][2] = XmCreateLabel(w->PD.scaleFrame[0][2], "PDscaleFrame12", arg, i); + XtManageChild(w->PD.scaleFrame[1][2]); + + i=0; + w->PD.scaleFrameRowCol[2] = XmCreateRowColumn(w->PD.scaleFrame[0][2], "PDscaleFrameRowCol2", arg, i); + XtManageChild(w->PD.scaleFrameRowCol[2]); + + i=0; + XtSetArg(arg[i], XmNminimum, 1); i++; + XtSetArg(arg[i], XmNmaximum, 100); i++; + XtSetArg(arg[i], XmNvalue, 15); i++; + XtSetArg(arg[i], XmNshowValue, False); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->PD.scaleIntervalsScale = XmCreateScale(w->PD.scaleFrameRowCol[2], "PDscaleIntervalsScale", arg, i); + XtManageChild(w->PD.scaleIntervalsScale); + + i=0; + w->PD.scaleIntervalsText = XmCreateTextField(w->PD.scaleFrameRowCol[2], "PDscaleIntervalsText", arg, i); + XtManageChild(w->PD.scaleIntervalsText); + + i=0; + XtSetArg(arg[i], XmNnumColumns, 2); i++; + w->PD.scaleIntervalsCheck = XmCreateRadioBox(w->PD.scaleFrameRowCol[2], "PDscaleIntervalsCheck", arg, i); + XtManageChild(w->PD.scaleIntervalsCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Iso")); i++; + w->PD.scaleIntervalsButt[0] = XmCreateToggleButton(w->PD.scaleIntervalsCheck, "PDscaleIntervalsButt0", arg, i); + XtManageChild(w->PD.scaleIntervalsButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Filled Iso")); i++; + w->PD.scaleIntervalsButt[1] = XmCreateToggleButton(w->PD.scaleIntervalsCheck, "PDscaleIntervalsButt1", arg, i); + XtManageChild(w->PD.scaleIntervalsButt[1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Continous")); i++; + w->PD.scaleIntervalsButt[2] = XmCreateToggleButton(w->PD.scaleIntervalsCheck, "PDscaleIntervalsButt2", arg, i); + XtManageChild(w->PD.scaleIntervalsButt[2]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Numeric")); i++; + w->PD.scaleIntervalsButt[3] = XmCreateToggleButton(w->PD.scaleIntervalsCheck, "PDscaleIntervalsButt3", arg, i); + XtManageChild(w->PD.scaleIntervalsButt[3]); + + /* Color */ + i=0; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->PD.colorDialog = XmCreateTemplateDialog(w->M.shell, "PDcolorDialog", arg, i); + XtUnmanageChild(w->PD.colorDialog); + + i=0; + w->PD.colorFrame[0][0] = XmCreateFrame(w->PD.colorDialog, "ODcolorFrame00", arg, i); + XtManageChild(w->PD.colorFrame[0][0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Colors")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->PD.colorFrame[1][0] = XmCreateLabel(w->PD.colorFrame[0][0], "PDcolorFrame10", arg, i); + XtManageChild(w->PD.colorFrame[1][0]); + + i=0; + /* hardcoded this one, since its is required for the motion handling */ + XtSetArg(arg[i], XmNtranslations, XtParseTranslationTable(DrawingAreaTranslations)); i++; + w->PD.colorDrawingArea = XmCreateDrawingArea(w->PD.colorFrame[0][0], "PDcolorDrawingArea", arg, i); + XtManageChild(w->PD.colorDrawingArea); + + + /* Vectors */ + i=0; + XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++; + XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++; + XtSetArg(arg[i], XmNautoUnmanage, False); i++; + w->PD.vectorDialog = XmCreateTemplateDialog(w->M.shell, "PDvectorDialog", arg, i); + XtUnmanageChild(w->PD.vectorDialog); + + i=0; + w->PD.vectorRowCol = XmCreateRowColumn(w->PD.vectorDialog, "PDvectorRowCol", arg, i); + XtManageChild(w->PD.vectorRowCol); + + /* vector - type */ + + i=0; + w->PD.vectorFrame[0][0] = XmCreateFrame(w->PD.vectorRowCol, "ODvectorFrame00", arg, i); + XtManageChild(w->PD.vectorFrame[0][0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Vector Display Type")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->PD.vectorFrame[1][0] = XmCreateLabel(w->PD.vectorFrame[0][0], "PDvectorFrame10", arg, i); + XtManageChild(w->PD.vectorFrame[1][0]); + + i=0; + w->PD.vectorTypeCheck = XmCreateRadioBox(w->PD.vectorFrame[0][0], "PDvectorTypeCheck", arg, i); + XtManageChild(w->PD.vectorTypeCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Line")); i++; + w->PD.vectorTypeButt[0] = XmCreateToggleButton(w->PD.vectorTypeCheck, "PDvectorTypeButt0", arg, i); + XtManageChild(w->PD.vectorTypeButt[0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Arrow")); i++; + w->PD.vectorTypeButt[1] = XmCreateToggleButton(w->PD.vectorTypeCheck, "PDvectorTypeButt1", arg, i); + XtManageChild(w->PD.vectorTypeButt[1]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Pyramid")); i++; + w->PD.vectorTypeButt[2] = XmCreateToggleButton(w->PD.vectorTypeCheck, "PDvectorTypeButt2", arg, i); + XtManageChild(w->PD.vectorTypeButt[2]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Cone")); i++; + w->PD.vectorTypeButt[3] = XmCreateToggleButton(w->PD.vectorTypeCheck, "PDvectorTypeButt3", arg, i); + XtManageChild(w->PD.vectorTypeButt[3]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Displacement")); i++; + w->PD.vectorTypeButt[4] = XmCreateToggleButton(w->PD.vectorTypeCheck, "PDvectorTypeButt4", arg, i); + XtManageChild(w->PD.vectorTypeButt[4]); + + /* vector - scale */ + + i=0; + w->PD.vectorFrame[0][1] = XmCreateFrame(w->PD.vectorRowCol, "ODvectorFrame01", arg, i); + XtManageChild(w->PD.vectorFrame[0][1]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Scale")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->PD.vectorFrame[1][1] = XmCreateLabel(w->PD.vectorFrame[0][1], "PDvectorFrame11", arg, i); + XtManageChild(w->PD.vectorFrame[1][1]); + + i=0; + w->PD.vectorScaleRowCol = XmCreateRowColumn(w->PD.vectorFrame[0][1], "PDvectorFrameRowCol1", arg, i); + XtManageChild(w->PD.vectorScaleRowCol); + + i=0; + XtSetArg(arg[i], XmNminimum, 0); i++; + XtSetArg(arg[i], XmNmaximum, 200); i++; + XtSetArg(arg[i], XmNdecimalPoints, 2); i++; + XtSetArg(arg[i], XmNshowValue, False); i++; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->PD.vectorScaleScale = XmCreateScale(w->PD.vectorScaleRowCol, "PDvectorScaleScale", arg, i); + XtManageChild(w->PD.vectorScaleScale); + + i=0; + w->PD.vectorScaleText = XmCreateTextField(w->PD.vectorScaleRowCol, "PDvectorScaleText", arg, i); + XtManageChild(w->PD.vectorScaleText); + + /* vector - location */ + + i=0; + w->PD.vectorFrame[0][2] = XmCreateFrame(w->PD.vectorRowCol, "ODvectorFrame02", arg, i); + XtManageChild(w->PD.vectorFrame[0][2]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Location")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->PD.vectorFrame[1][2] = XmCreateLabel(w->PD.vectorFrame[0][2], "PDvectorFrame12", arg, i); + XtManageChild(w->PD.vectorFrame[1][2]); + + i=0; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + w->PD.vectorLocationCheck = XmCreateRadioBox(w->PD.vectorFrame[0][2], "PDvectorLocationCheck", arg, i); + XtManageChild(w->PD.vectorLocationCheck); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("COG")); i++; + w->PD.vectorLocationButt[0] = XmCreateToggleButton(w->PD.vectorLocationCheck, "PDvectorLocationButt0", arg, i); + XtManageChild(w->PD.vectorLocationButt[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Vertex")); i++; + w->PD.vectorLocationButt[1] = XmCreateToggleButton(w->PD.vectorLocationCheck, "PDvectorLocationButt1", arg, i); + XtManageChild(w->PD.vectorLocationButt[1]); + + + /* export BGM */ + i=0 ; + XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Export BGM")); i++; + XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++; + XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*")); i++; + XtSetArg(arg[i], XmNautoUnmanage, True); i++; + w->PD.exportBGMDialog = XmCreateFileSelectionDialog(w->M.shell, "FDexportBGMDialog", arg, i); + XtUnmanageChild(w->PD.exportBGMDialog); + + tmp = XmFileSelectionBoxGetChild(w->PD.exportBGMDialog, XmDIALOG_HELP_BUTTON); + XtUnmanageChild(tmp); + + i=0; + w->PD.exportBGMFrame[0] = XmCreateFrame(w->PD.exportBGMDialog, "FDexportBGMFrame0", arg, i); + XtManageChild(w->PD.exportBGMFrame[0]); + + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Options")); i++; + XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++; + w->PD.exportBGMFrame[1] = XmCreateLabel(w->PD.exportBGMFrame[0], "FDexportBGMFrame1", arg, i); + XtManageChild(w->PD.exportBGMFrame[1]); + + i=0 ; + XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++; + XtSetArg(arg[i], XmNspacing, 0); i++; + w->PD.exportBGMRowCol = XmCreateRowColumn(w->PD.exportBGMFrame[0], "FDexportBGMRowCol", arg, i); + XtManageChild(w->PD.exportBGMRowCol); + + /* export BGM - method */ + i=0; + w->PD.exportBGMPane = XmCreatePulldownMenu(w->PD.exportBGMRowCol, "FDexportBGMPane", arg, i); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("h: error (%)")); i++; + w->PD.exportBGMButt[0] = XmCreatePushButton(w->PD.exportBGMPane, "MexportBGMButt0", arg, i); + XtManageChild(w->PD.exportBGMButt[0]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("h: elements")); i++; + w->PD.exportBGMButt[1] = XmCreatePushButton(w->PD.exportBGMPane, "MexportBGMButt1", arg, i); + XtManageChild(w->PD.exportBGMButt[1]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("p: error (%)")); i++; + w->PD.exportBGMButt[2] = XmCreatePushButton(w->PD.exportBGMPane, "MexportBGMButt2", arg, i); + XtManageChild(w->PD.exportBGMButt[2]); + i=0; + XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("p: elements")); i++; + w->PD.exportBGMButt[3] = XmCreatePushButton(w->PD.exportBGMPane, "MexportBGMButt3", arg, i); + XtManageChild(w->PD.exportBGMButt[3]); + i=0; + XtSetArg(arg[i], XmNsubMenuId, w->PD.exportBGMPane); i++; + XtSetArg(arg[i], XmNspacing, 0); i++; + w->PD.exportBGMMenu = XmCreateOptionMenu(w->PD.exportBGMRowCol, "FDexportBGMMenu", arg, i); + XtManageChild(w->PD.exportBGMMenu); + + /* export BGM - constraint */ + i=0; + w->PD.exportBGMText = XmCreateTextField(w->PD.exportBGMRowCol, "FDexportBGMText", arg, i); + XtManageChild(w->PD.exportBGMText); + + +} + + + +/* ------------------------------------------------------------------------ + C r e a t e W i d g e t s + ------------------------------------------------------------------------ */ + +void CreateWidgets (Widgets_T *w){ + CreateWidgets_M(w); /* menu win */ + CreateWidgets_G(w); /* graphic win */ + if(CTX.command_win) CreateWidgets_C(w); /* command win */ + + CreateWidgets_ED(w); /* error dialogs */ + CreateWidgets_FD(w); /* file dialogs */ + CreateWidgets_OD(w); /* option dialogs */ + CreateWidgets_HD(w); /* help dialogs */ + CreateWidgets_GD(w); /* geometry dialogs */ + CreateWidgets_MD(w); /* mesh dialogs */ + CreateWidgets_PD(w); /* post dialogs */ +} + + diff --git a/Unix/Widgets.h b/Unix/Widgets.h new file mode 100644 index 0000000000000000000000000000000000000000..20c923ff0de2210c4b8538c86579ebe01c8666ea --- /dev/null +++ b/Unix/Widgets.h @@ -0,0 +1,236 @@ +#ifndef _WIDGETS_H_ +#define _WIDGETS_H_ + +#define NB_BUTT_MAX 50 + +/* check Info.h */ +#define NB_INFO_GEOM 4 +#define NB_INFO_MESH 14 +#define NB_INFO_POST 5 +#define NB_INFO_MAX 23 + +/* Holder for all Widgets */ + +typedef struct { + + /* menu window */ + + struct { + Widget shell, containerWin ; + Widget menuBar ; + Widget fileCascade, filePane, fileButt[6], fileSep[2] ; + Widget moduleCascade, modulePane, moduleButt[3] ; + Widget optionCascade, optionPane, optionButt[6], optionSep[2] ; + Widget helpCascade, helpPane, helpButt[2], helpSep[1] ; + Widget menuFrame, menuForm ; + Widget modButt, modPop, geomButt, meshButt, postButt ; + Widget navigButt[2]; + Widget defaultButt ; + Widget pushButt [NB_BUTT_MAX] ; + Widget toggleButt [NB_BUTT_MAX] ; + Widget popMenu [NB_BUTT_MAX] ; + Widget popSep [3][NB_BUTT_MAX] ; + Widget lightButt [NB_BUTT_MAX] ; + Widget elementButt [NB_BUTT_MAX] ; + Widget offsetButt [NB_BUTT_MAX] ; + Widget timeStepButt [NB_BUTT_MAX] ; + Widget scaleButt [NB_BUTT_MAX] ; + Widget colorButt [NB_BUTT_MAX] ; + Widget vectorButt [NB_BUTT_MAX] ; + Widget exportBGMButt[NB_BUTT_MAX] ; + Widget applyBGMButt [NB_BUTT_MAX] ; + Widget removeButt [NB_BUTT_MAX] ; + Widget duplicateButt[NB_BUTT_MAX] ; + } M; + + /* graphic window */ + + struct { + Widget shell, containerForm ; + Widget drawForm ; + Widget glw, glo ; + Widget bottomForm ; + Widget Butt[7] ; + Widget textForm, infoLabel, selectLabel, statusLabel ; + } G; + + /* command window */ + + struct { + Widget shell ; + Widget command, commandList, commandText ; + } C; + + + /* error dialogs */ + + struct { + Widget printDialog, saveDialog ; + } ED; + + /* file dialogs */ + + struct { + Widget openDialog ; + Widget mergeDialog ; + Widget saveDialog ; + Widget saveAsDialog ; + Widget saveAsFrame[2], saveAsRowCol ; + Widget saveAsPane, saveAsButt[3], saveAsMenu ; + Widget printDialog ; + Widget printFrame[2], printRowCol ; + Widget printPane[3], printButt[13], printMenu[3] ; + } FD; + + /* options dialogs */ + + struct { + Widget geomDialog, geomRowCol ; + Widget geomVisibleFrame[2], geomVisibleRowCol ; + Widget geomVisibleTypeCheck, geomVisibleTypeButt[2] ; + Widget geomVisibleCheck, geomVisibleButt[4] ; + Widget geomVisibleByNumFrame[2], geomVisibleByNumRowCol ; + Widget geomVisibleByNumText ; + Widget geomNormalsFrame[2], geomNormalsRowCol ; + Widget geomNormalsScale, geomNormalsText ; + Widget geomTangentsFrame[2], geomTangentsRowCol ; + Widget geomTangentsScale, geomTangentsText ; + + Widget meshDialog, meshRowCol; + Widget meshAlgoFrame[2], meshAlgoRowCol ; + Widget meshAlgoCheck, meshAlgoButt[4] ; + Widget meshSmoothingFrame[2], meshSmoothingRowCol ; + Widget meshSmoothingScale, meshSmoothingText ; + Widget meshVisibleFrame[2], meshVisibleRowCol ; + Widget meshVisibleTypeCheck, meshVisibleTypeButt[2] ; + Widget meshVisibleCheck, meshVisibleButt[4] ; + Widget meshVisibleByNumFrame[2], meshVisibleByNumRowCol ; + Widget meshVisibleByNumText ; + Widget meshAspectFrame[2] ; + Widget meshAspectCheck, meshAspectButt[3] ; + Widget meshExplodeFrame[2], meshExplodeRowCol ; + Widget meshExplodeScale, meshExplodeText ; + Widget meshNormalsFrame[2], meshNormalsRowCol ; + Widget meshNormalsScale, meshNormalsText ; + + Widget postDialog, postRowCol; + Widget postLinkFrame[2], postLinkRowCol ; + Widget postLinkCheck, postLinkButt[3] ; + Widget postAnimFrame[2] ; + Widget postAnimFrameRowCol, postAnimScale ; + + Widget miscDialog, miscRowCol ; + Widget miscMiscFrame[2] ; + Widget miscMiscCheck, miscMiscButt[5] ; + Widget miscColorSchemeFrame[2] ; + Widget miscColorSchemeFrameRowCol, miscColorSchemeScale ; + Widget miscProjFrame[2] ; + Widget miscProjCheck, miscProjButt[2] ; + Widget miscLightFrame[2] ; + Widget miscLightFrameRowCol, miscLightScale[3] ; + Widget miscShineFrame[2] ; + Widget miscShineFrameRowCol, miscShineScale ; + + Widget viewportDialog, viewportRowCol ; + Widget viewportFrame[2][3], viewportFrameRowCol[3] ; + Widget viewportText[3][3], viewportLockButt[3][3] ; + + Widget infoDialog, infoRowCol ; + Widget infoFrame[2][3], infoFrameRowCol[3] ; + Widget infoKeyLabel[NB_INFO_MAX], infoValueLabel[NB_INFO_MAX] ; + + } OD; + + /* help dialogs */ + + struct { + Widget keysDialog, keysText ; + + Widget aboutDialog ; + } HD; + + /* geometry dialogs */ + + struct { + Widget paramDialog, paramRowCol ; + Widget paramFrame[2][2], paramFrameRowCol[2], paramText[2] ; + + Widget pointDialog, pointRowCol ; + Widget pointFrame[2][2], pointFrameRowCol[2], pointText[4] ; + + Widget rotDialog, rotRowCol ; + Widget rotFrame[2][3], rotFrameRowCol[3], rotText[7] ; + + Widget tranDialog ; + Widget tranFrame[2], tranFrameRowCol, tranText[3] ; + + Widget dilatDialog, dilatRowCol ; + Widget dilatFrame[2][2], dilatFrameRowCol[2], dilatText[4] ; + } GD; + + /* mesh dialogs */ + + struct { + Widget charLengthDialog ; + Widget charLengthFrame[2], charLengthFrameRowCol, charLengthText ; + + Widget trsfLineDialog, trsfLineRowCol ; + Widget trsfLineFrame[2][2], trsfLineFrameRowCol[2], trsfLineText[2] ; + + Widget trsfVolumeDialog ; + Widget trsfVolumeFrame[2], trsfVolumeFrameRowCol, trsfVolumeText ; + } MD; + + /* post dialogs */ + + struct { + Widget offsetDialog, offsetRowCol ; + Widget offsetFrame[2][4], offsetFrameRowCol[4] ; + Widget /* 1 */ offsetModeCheck, offsetModeButt[2] ; + Widget /* 2 */ offsetText[3], offsetScale[3] ; + + Widget timeStepDialog ; + Widget timeStepFrame[2], timeStepFrameRowCol ; + Widget timeStepText, timeStepScale ; + + Widget scaleDialog, scaleRowCol ; + Widget scaleFrame[2][4], scaleFrameRowCol[4] ; + Widget /* 1 */ scaleShowButt, scaleTransButt, scaleText[2] ; + Widget /* 2 */ scaleRangeButt, scaleRangeText[2], scaleTypeCheck, + scaleTypeButt[2] ; + Widget /* 3 */ scaleIntervalsCheck, scaleIntervalsButt[4], + scaleIntervalsScale, scaleIntervalsText ; + + Widget colorDialog, colorRowCol ; + Widget colorFrame[2][4] ; + Widget /* 1 */ colorDrawingArea ; + + Widget vectorDialog, vectorRowCol ; + Widget vectorFrame[2][3]; + Widget /* 1 */ vectorTypeCheck, vectorTypeButt[5]; + Widget /* 2 */ vectorScaleRowCol, vectorScaleScale, vectorScaleText ; + Widget /* 3 */ vectorLocationCheck, vectorLocationButt[2]; + + Widget exportBGMDialog ; + Widget exportBGMFrame[2], exportBGMRowCol ; + Widget exportBGMPane, exportBGMButt[4], exportBGMMenu ; + Widget exportBGMText ; + } PD; + + + /* tooltips */ + + struct { + Widget shell; + Widget tooltip_lbl; + } tooltip; + + +} Widgets_T; + + + +void CreateWidgets(Widgets_T *w); + +#endif + diff --git a/Unix/XColors.cpp b/Unix/XColors.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b87d295238743c61f2ea6d0fdb14e5e55a2d3278 --- /dev/null +++ b/Unix/XColors.cpp @@ -0,0 +1,244 @@ +/* + Attention. Toutes les couleurs sont crees a partir de la colormap de + l'interface : XCTX.gui.colormap +*/ + +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include "Gmsh.h" +#include "GmshUI.h" +#include "XContext.h" + +extern XContext_T XCTX ; + +#define PF_TRUECOLOR 0 +#define PF_XALLOC 1 +#define PF_8BIT 2 + +static int pixelformat; +static unsigned long ctable8[5][9][5]; /* Only for PF_8BIT */ +static unsigned long rtable[256], gtable[256], btable[256]; /* PF_TRUECOLOR */ + +/* + * Replacement for XAllocColor. This function should never fail + * to allocate a color. When XAllocColor fails we return the nearest + * matching color. + */ + +#define DISTANCE(r1,g1,b1,r2,g2,b2) ( ((r2)-(r1)) * ((r2)-(r1)) + \ + ((g2)-(g1)) * ((g2)-(g1)) + ((b2)-(b1)) * ((b2)-(b1)) ) + +Status New_XAllocColor( Display *dpy, Colormap cmap, int cmap_size, + XColor *color ) +{ + int p, bestmatch; + double dist, mindist; /* 3*2^16^2 exceeds long int precision */ + static XColor *allcolors = NULL; + XColor *acptr; + + if (!XAllocColor(dpy, cmap, color)) { + /* query whole colormap if not yet done */ + if (!allcolors) { + allcolors = (XColor *) malloc( cmap_size * sizeof(XColor) ); + for (p = 0; p < cmap_size; p++) + allcolors[p].pixel = p; + XQueryColors (dpy, cmap, allcolors, cmap_size); + } + + /* find best match */ + bestmatch = -1; + mindist = 0.0; + p = cmap_size; + while (p--) { + acptr = allcolors + p; + dist = DISTANCE( (double)color->red, (double)color->green, + (double)color->blue, (double)acptr->red, + (double)acptr->green, (double)acptr->blue); + if (bestmatch < 0 || dist < mindist) + mindist = dist, bestmatch = p; + } + color->red = allcolors[bestmatch].red; + color->green = allcolors[bestmatch].green; + color->blue = allcolors[bestmatch].blue; + if (!XAllocColor( dpy, cmap, color )) { + /* this is a real hack but should be good enough */ + color->pixel = bestmatch; + /*printf("code problem in lui.c\n");*/ + } + } + return 1; +} + +#undef DISTANCE + + + + +/* + * Given an RGB color, return the corresponding pixel value. + * Input; r, g, b - red, green, and blue in [0,255] + * Return: a pixel value + */ +unsigned long AllocateColorInt( int r, int g, int b ) +{ + XColor xcol; + + switch (pixelformat) { + case PF_TRUECOLOR: + return rtable[r] | gtable[g] | btable[b]; + case PF_8BIT: + return ctable8[r/52][g/31][b/52]; + case PF_XALLOC: + xcol.red = r << 8; + xcol.green = g << 8; + xcol.blue = b << 8; + New_XAllocColor( XCTX.display, XCTX.gui.colormap, XCTX.gui.visual->map_entries, + &xcol ); + return xcol.pixel; + default: + printf("Error in AllocateColorInt %d\n", pixelformat); + exit(0); + } + return 0; +} + + + + +/* + * Allocate a color specified by red, green, and blue and return a pixel + * value. If the color allocation fails, the white pixel will be returned. + * Input: red, green, blue - values in [0,1] + * Return: a pixel value + */ +unsigned long AllocateColor( float red, float green, float blue ) +{ + return AllocateColorInt( (int) (red*255.0), (int) (green*255.0), + (int) (blue*255.0) ); +} + + +void XColorInitialize(void) { + XSetWindowAttributes attr; + XGCValues gcv; + unsigned long gc_mask; + static int initialized = 0; + static Window DummyWindow; + + if (initialized) + return; + else + initialized = 1; + +#if defined(__cplusplus) || defined(c_plusplus) + if (XCTX.gui.visual->c_class==TrueColor || XCTX.gui.visual->c_class==DirectColor) { +#else + if (XCTX.gui.visual->class==TrueColor || XCTX.gui.visual->class==DirectColor) { +#endif + + XColor xcol; + int i; + xcol.green = 0; + xcol.blue = 0; + for (i=0;i<256;i++) { + xcol.red = i * 0xffff / 0xff; + XAllocColor( XCTX.display, XCTX.gui.colormap, &xcol ); + rtable[i] = xcol.pixel; + } + xcol.red = 0; + xcol.blue = 0; + for (i=0;i<256;i++) { + xcol.green = i * 0xffff / 0xff; + XAllocColor( XCTX.display, XCTX.gui.colormap, &xcol ); + gtable[i] = xcol.pixel; + } + xcol.red = 0; + xcol.green = 0; + for (i=0;i<256;i++) { + xcol.blue = i * 0xffff / 0xff; + XAllocColor( XCTX.display, XCTX.gui.colormap, &xcol ); + btable[i] = xcol.pixel; + } + pixelformat = PF_TRUECOLOR; + } + +#if defined(__cplusplus) || defined(c_plusplus) + else if (XCTX.gui.visual->c_class==PseudoColor) { +#else + else if (XCTX.gui.visual->class==PseudoColor) { +#endif + /* Note: the color allocation scheme must be the same as what's used */ + /* in Mesa to allow colormap sharing! */ + int r, g, b; + for (r=0;r<5;r++) { + for (g=0;g<9;g++) { + for (b=0;b<5;b++) { + XColor xcol; + xcol.red = r * 65535 / 4; + xcol.green = g * 65535 / 8; + xcol.blue = b * 65535 / 4; + New_XAllocColor( XCTX.display, XCTX.gui.colormap, + XCTX.gui.visual->map_entries, &xcol ); + ctable8[r][g][b] = xcol.pixel; + } + } + } + pixelformat = PF_8BIT; + } + + else { + pixelformat = PF_XALLOC; + } + + + /* Create a dummy window. This is needed because XCreateGC needs a + drawable of the type which we'll be using in LUI. Unfortunately, + the RootWindow may not have the visual we want. For example, + on the SGI PI, the default root window is pseudo color but we want + LUI to use TrueColor if it's available. In this case using RootWindow + in XCreateGC will make a GC of the wrong type. */ + attr.border_pixel = 0; + attr.background_pixel = 255; + attr.colormap = XCTX.gui.colormap; + DummyWindow = XCreateWindow( XCTX.display, DefaultRootWindow(XCTX.display), + 0, 0, 10, 10, 1, + XCTX.depth, InputOutput, XCTX.gui.visual, + CWBorderPixel | CWBackPixel | CWColormap, + &attr ); + + /*** The basic GC ***/ + gc_mask = GCForeground | GCBackground | GCFont | GCArcMode; + gcv.font = XCTX.xfont.fixed->fid; + gcv.arc_mode = ArcChord; + XCTX.xgc.xgc = XCreateGC(XCTX.display, DummyWindow, gc_mask, &gcv); + + /*** Black ***/ + XCTX.xcolor.black = AllocateColor( 0.0, 0.0, 0.0 ); + gcv.foreground = XCTX.xcolor.black; + XCTX.xgc.black = XCreateGC(XCTX.display, DummyWindow, gc_mask, &gcv); + + /*** White ***/ + XCTX.xcolor.white = AllocateColor( 1.0, 1.0, 1.0 ); + gcv.foreground = XCTX.xcolor.white; + XCTX.xgc.white = XCreateGC(XCTX.display, DummyWindow, gc_mask, &gcv); + + /*** Red (black on monochrome) ***/ + XCTX.xcolor.red = AllocateColor( 1.0, 0.0, 0.0 ); + if (XCTX.xcolor.red == XCTX.xcolor.white) { + XCTX.xcolor.red = XCTX.xcolor.black; + } + gcv.foreground = XCTX.xcolor.red; + XCTX.xgc.red = XCreateGC(XCTX.display, DummyWindow, gc_mask, &gcv); + + /*** Green ***/ + XCTX.xcolor.green = AllocateColor( 0.0, 1.0, 0.0 ); + gcv.foreground = XCTX.xcolor.green; + XCTX.xgc.green = XCreateGC( XCTX.display, DummyWindow, gc_mask, &gcv ); + + /*** Blue ***/ + XCTX.xcolor.blue = AllocateColor( 0.0, 0.5, 1.0 ); + gcv.foreground = XCTX.xcolor.blue; + XCTX.xgc.blue = XCreateGC( XCTX.display, DummyWindow, gc_mask, &gcv ); + +} + diff --git a/Unix/XColors.h b/Unix/XColors.h new file mode 100644 index 0000000000000000000000000000000000000000..2a8088dd489eac01fc35595778d51ef58431e4f4 --- /dev/null +++ b/Unix/XColors.h @@ -0,0 +1,9 @@ +#ifndef _XCOLORS_H_ +#define _XCOLORS_H_ + +void XColorInitialize(void); +unsigned long AllocateColorInt( int r, int g, int b ); +unsigned long AllocateColor( float red, float green, float blue ); + +#endif + diff --git a/Unix/XContext.h b/Unix/XContext.h new file mode 100644 index 0000000000000000000000000000000000000000..b5b82c681734a5412682724b4385e801d1497871 --- /dev/null +++ b/Unix/XContext.h @@ -0,0 +1,56 @@ +#ifndef _XCONTEXT_H_ +#define _XCONTEXT_H_ + +/* + X/GLX context +*/ + +typedef struct { + Display *display; /* the X display */ + int scrnum, depth; /* the X screen number and depth */ + XtAppContext AppContext; + + struct { + XVisualInfo *visinfo ; + GLXContext context ; + Colormap colormap ; + } glw ; + + struct { + XVisualInfo *visinfo ; + GLXContext context ; + Colormap colormap ; + } glo ; + + struct { + Visual *visual ; + Colormap colormap ; + } gui ; + + struct { + XFontStruct *helve, *fixed ; + int helve_h, helve_a, helve_w ; + int fixed_h, fixed_a, fixed_w ; + } xfont ; + + struct { + unsigned long black, white ; + unsigned long red, green, blue ; + unsigned long ovblack, ovwhite ; + } xcolor ; + + struct { + GC xgc; + GC black, white ; + GC red, green, blue ; + } xgc ; + +} XContext_T ; + +#define EV_MASK KeyPressMask|KeyReleaseMask|\ + ButtonPressMask|ButtonReleaseMask|ButtonMotionMask|\ + PointerMotionMask|ExposureMask|ResizeRedirectMask|\ + EnterWindowMask|LeaveWindowMask|ShiftMask|ControlMask|Mod1Mask + + +#endif diff --git a/Unix/XCursor.cpp b/Unix/XCursor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dfbc445d605f19752c506e31f6f125ecb76c7f39 --- /dev/null +++ b/Unix/XCursor.cpp @@ -0,0 +1,44 @@ + +#include <X11/cursorfont.h> + +#include "xcontext.h" + +extern XContext_T XCTX ; + +#define MAIN_CURSOR 0 +#define DIAL_CURSOR 1 +#define DIAL_CW_CURSOR 2 +#define DIAL_CCW_CURSOR 3 +#define DIAL_RES_CURSOR 4 +#define QUESTION_CURSOR 5 +#define DOWN_CURSOR 6 +#define UP_CURSOR 7 +#define UP_DOWN_CURSOR 8 +#define CLOCK_CURSOR 9 +#define PENCIL_CURSOR 10 +#define ARROW_HAND_CURSOR 11 + +static Cursor CursorTable[32]; + +void SetCursor(Window window, int cursor){ + static int init = 0; + + if (!init) { + init = 1; + CursorTable[MAIN_CURSOR] = XCreateFontCursor(XCTX.display,XC_top_left_arrow); + CursorTable[DIAL_CURSOR] = XCreateFontCursor(XCTX.display,XC_draft_small); + CursorTable[DIAL_CW_CURSOR] = XCreateFontCursor(XCTX.display,XC_exchange); + CursorTable[DIAL_CCW_CURSOR] = XCreateFontCursor(XCTX.display,XC_exchange); + CursorTable[DIAL_RES_CURSOR] = XCreateFontCursor(XCTX.display,XC_circle); + CursorTable[QUESTION_CURSOR] = XCreateFontCursor(XCTX.display,XC_question_arrow); + CursorTable[DOWN_CURSOR] = XCreateFontCursor(XCTX.display,XC_sb_down_arrow); + CursorTable[UP_CURSOR] = XCreateFontCursor(XCTX.display,XC_sb_up_arrow); + CursorTable[UP_DOWN_CURSOR] = XCreateFontCursor(XCTX.display,XC_sb_v_double_arrow); + CursorTable[CLOCK_CURSOR] = XCreateFontCursor(XCTX.display,XC_watch); + CursorTable[PENCIL_CURSOR] = XCreateFontCursor(XCTX.display,XC_pencil); + CursorTable[ARROW_HAND_CURSOR]= XCreateFontCursor(XCTX.display,XC_draft_large); + } + + XDefineCursor(XCTX.display, window, CursorTable[cursor]); +} + diff --git a/Unix/XDump.cpp b/Unix/XDump.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e144621773431b0de5bba52b931a4021d7b004fb --- /dev/null +++ b/Unix/XDump.cpp @@ -0,0 +1,450 @@ + +/* This is a modified version for Gmsh (mainly for c++ compliance) */ + +/* Dump the image in an X xindow to a .xwd file. + * This code was extracted by Brian Paul from the xwd program which is + * included with X11. The OMIT preprocessor identifier denotes regions + * of code I've had to omit. + */ + +/* from xwd.c: */ + +/* $XConsortium: xwd.c,v 1.56 91/07/25 18:00:15 rws Exp $ */ + +/* Copyright 1987 Massachusetts Institute of Technology */ + +/* + * xwd.c MIT Project Athena, X Window system window raster image dumper. + * + * This program will dump a raster image of the contents of a window into a + * file for output on graphics printers or for other uses. + * + * Author: Tony Della Fera, DEC + * 17-Jun-85 + * + * Modification history: + * + * 11/14/86 Bill Wyatt, Smithsonian Astrophysical Observatory + * - Removed Z format option, changing it to an XY option. Monochrome + * windows will always dump in XY format. Color windows will dump + * in Z format by default, but can be dumped in XY format with the + * -xy option. + * + * 11/18/86 Bill Wyatt + * - VERSION 6 is same as version 5 for monchrome. For colors, the + * appropriate number of Color structs are dumped after the header, + * which has the number of colors (=0 for monochrome) in place of the + * V5 padding at the end. Up to 16-bit displays are supported. I + * don't yet know how 24- to 32-bit displays will be handled under + * the Version 11 protocol. + * + * 6/15/87 David Krikorian, MIT Project Athena + * - VERSION 7 runs under the X Version 11 servers, while the previous + * versions of xwd were are for X Version 10. This version is based + * on xwd version 6, and should eventually have the same color + * abilities. (Xwd V7 has yet to be tested on a color machine, so + * all color-related code is commented out until color support + * becomes practical.) + */ + + +/* + * The following XCOLOR struct is to be used in place of X's XColor + * struct because on 32-bit systems, sizeof(XColor)=12 while on 64-bit + * systems, sizeof(XColor)=16. We MUST have an XColor struct of size + * 12 so a correct file is written. BEP July-21-95 + */ +typedef struct { + unsigned int /*long*/ pixel; + unsigned short red, green, blue; + char flags; /* do_red, do_green, do_blue */ + char pad; +} XCOLOR; + + +#include <assert.h> +#include <X11/Xlib.h> +#include <X11/Xmd.h> +#include <X11/Xutil.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <X11/XWDFile.h> + +static Bool debug = False; +static Bool nobdrs = False; +static Bool on_root = False; +static Bool use_installed = False; +static long add_pixel_value = 0; +static int format = ZPixmap; + +static Display *dpy; +static char *program_name = "xdump"; +static int screen; + +typedef unsigned long Pixel; + + + +/* + * outl: a debugging routine. Flushes stdout then prints a message on stderr + * and flushes stderr. Used to print messages when past certain points + * in code so we can tell where we are. Outl may be invoked like + * printf with up to 7 arguments. + */ +/* VARARGS1 */ +static void outl( char *msg ) +{ + fflush(stdout); + fprintf(stderr, "%s\n", msg ); + fflush(stderr); +} + + +/* + * Standard fatal error routine - call like printf but maximum of 7 arguments. + * Does not require dpy or screen defined. + */ +/* VARARGS1 */ +static void Fatal_Error( char *msg ) +{ + fflush(stdout); + fflush(stderr); + fprintf(stderr, "%s: error: %s\n", program_name, msg); + exit(1); +} + + +/* + * Determine the pixmap size. + */ + +static int Image_Size( XImage *image ) +{ + if (image->format != ZPixmap) + return(image->bytes_per_line * image->height * image->depth); + + return(image->bytes_per_line * image->height); +} + + + +#define lowbit(x) ((x) & (~(x) + 1)) + +/* + * Get the XColors of all pixels in image - returns # of colors + */ +static int Get_XColors( XWindowAttributes *win_info, XColor **colors ) +{ + int i, ncolors; + Colormap cmap = win_info->colormap; + + if (use_installed) + /* assume the visual will be OK ... */ + cmap = XListInstalledColormaps(dpy, win_info->root, &i)[0]; + if (!cmap) + return(0); + + ncolors = win_info->visual->map_entries; + if (!(*colors = (XColor *) malloc (sizeof(XColor) * ncolors))) + Fatal_Error("Out of memory!"); + +#if defined(__cplusplus) || defined(c_plusplus) + if (win_info->visual->c_class == DirectColor || + win_info->visual->c_class == TrueColor) { +#else + if (win_info->visual->class == DirectColor || + win_info->visual->class == TrueColor) { +#endif + + Pixel red, green, blue, red1, green1, blue1; + + red = green = blue = 0; + red1 = lowbit(win_info->visual->red_mask); + green1 = lowbit(win_info->visual->green_mask); + blue1 = lowbit(win_info->visual->blue_mask); + for (i=0; i<ncolors; i++) { + (*colors)[i].pixel = red|green|blue; + (*colors)[i].pad = 0; + red += red1; + if (red > win_info->visual->red_mask) + red = 0; + green += green1; + if (green > win_info->visual->green_mask) + green = 0; + blue += blue1; + if (blue > win_info->visual->blue_mask) + blue = 0; + } + } else { + for (i=0; i<ncolors; i++) { + (*colors)[i].pixel = i; + (*colors)[i].pad = 0; + } + } + + XQueryColors(dpy, cmap, *colors, ncolors); + + return(ncolors); +} + + + +static void _swapshort( char *bp, unsigned n ) +{ + register char c; + register char *ep = bp + n; + + while (bp < ep) { + c = *bp; + *bp = *(bp + 1); + bp++; + *bp++ = c; + } +} + +static void _swaplong ( char *bp, unsigned n ) +{ + register char c; + register char *ep = bp + n; + register char *sp; + + while (bp < ep) { + sp = bp + 3; + c = *sp; + *sp = *bp; + *bp++ = c; + sp = bp + 1; + c = *sp; + *sp = *bp; + *bp++ = c; + bp += 2; + } +} + + + + + + +/* + * Window_Dump: dump a window to a file which must already be open for + * writting. + */ + + +void Window_Dump(Display *display, int scr, Window window, FILE *out){ + unsigned long swaptest = 1; + XColor *colors; + unsigned buffer_size; + int win_name_size; + int header_size; + int ncolors, i; + char *win_name; + Bool got_win_name; + XWindowAttributes win_info; + XImage *image; + int absx, absy, x, y; + int width, height; /* unsigned */ + int dwidth, dheight; + int bw; + Window dummywin; + XWDFileHeader header; + + dpy = display; + screen = scr; + + /* + * Inform the user not to alter the screen. + */ +#ifdef OMIT + Beep(); +#endif + + /* + * Get the parameters of the window being dumped. + */ + if (debug) outl("xwd: Getting target window information.\n"); + if(!XGetWindowAttributes(dpy, window, &win_info)) + Fatal_Error("Can't get target window attributes."); + + /* handle any frame window */ + if (!XTranslateCoordinates (dpy, window, RootWindow (dpy, screen), 0, 0, + &absx, &absy, &dummywin)) { + fprintf (stderr, + "%s: unable to translate window coordinates (%d,%d)\n", + program_name, absx, absy); + exit (1); + } + win_info.x = absx; + win_info.y = absy; + width = win_info.width; + height = win_info.height; + bw = 0; + + if (!nobdrs) { + absx -= win_info.border_width; + absy -= win_info.border_width; + bw = win_info.border_width; + width += (2 * bw); + height += (2 * bw); + } + dwidth = DisplayWidth (dpy, screen); + dheight = DisplayHeight (dpy, screen); + + + /* clip to window */ + if (absx < 0) width += absx, absx = 0; + if (absy < 0) height += absy, absy = 0; + if (absx + width > dwidth) width = dwidth - absx; + if (absy + height > dheight) height = dheight - absy; + + XFetchName(dpy, window, &win_name); + if (!win_name || !win_name[0]) { + win_name = "xwdump"; + got_win_name = False; + } else { + got_win_name = True; + } + + /* sizeof(char) is included for the null string terminator. */ + win_name_size = strlen(win_name) + sizeof(char); + + /* + * Snarf the pixmap with XGetImage. + */ + + x = absx - win_info.x; + y = absy - win_info.y; + if (on_root) + image = XGetImage (dpy, RootWindow(dpy, screen), absx, absy, width, height, AllPlanes, format); + else + image = XGetImage (dpy, window, x, y, width, height, AllPlanes, format); + if (!image) { + fprintf (stderr, "%s: unable to get image at %dx%d+%d+%d\n", + program_name, width, height, x, y); + exit (1); + } + + if (add_pixel_value != 0) XAddPixel (image, add_pixel_value); + + /* + * Determine the pixmap size. + */ + buffer_size = Image_Size(image); + + if (debug) outl("xwd: Getting Colors.\n"); + + ncolors = Get_XColors(&win_info, &colors); + + /* + * Inform the user that the image has been retrieved. + */ +#ifdef OMIT + XBell(dpy, FEEP_VOLUME); + XBell(dpy, FEEP_VOLUME); +#endif + XFlush(dpy); + + /* + * Calculate header size. + */ + if (debug) outl("xwd: Calculating header size.\n"); + header_size = sizeof(header) + win_name_size; + + /* + * Write out header information. + */ + if (debug) outl("xwd: Constructing and dumping file header.\n"); + header.header_size = (CARD32) header_size; + header.file_version = (CARD32) XWD_FILE_VERSION; + header.pixmap_format = (CARD32) format; + header.pixmap_depth = (CARD32) image->depth; + header.pixmap_width = (CARD32) image->width; + header.pixmap_height = (CARD32) image->height; + header.xoffset = (CARD32) image->xoffset; + header.byte_order = (CARD32) image->byte_order; + header.bitmap_unit = (CARD32) image->bitmap_unit; + header.bitmap_bit_order = (CARD32) image->bitmap_bit_order; + header.bitmap_pad = (CARD32) image->bitmap_pad; + header.bits_per_pixel = (CARD32) image->bits_per_pixel; + header.bytes_per_line = (CARD32) image->bytes_per_line; +#if defined(__cplusplus) || defined(c_plusplus) + header.visual_class = (CARD32) win_info.visual->c_class; +#else + header.visual_class = (CARD32) win_info.visual->class; +#endif + header.red_mask = (CARD32) win_info.visual->red_mask; + header.green_mask = (CARD32) win_info.visual->green_mask; + header.blue_mask = (CARD32) win_info.visual->blue_mask; + header.bits_per_rgb = (CARD32) win_info.visual->bits_per_rgb; + header.colormap_entries = (CARD32) win_info.visual->map_entries; + header.ncolors = ncolors; + header.window_width = (CARD32) win_info.width; + header.window_height = (CARD32) win_info.height; + header.window_x = absx; + header.window_y = absy; + header.window_bdrwidth = (CARD32) win_info.border_width; + + if (*(char *) &swaptest) { + _swaplong((char *) &header, sizeof(header)); + for (i = 0; i < ncolors; i++) { + _swaplong((char *) &colors[i].pixel, sizeof(long)); + _swapshort((char *) &colors[i].red, 3 * sizeof(short)); + } + } + + (void) fwrite((char *)&header, sizeof(header), 1, out); + (void) fwrite(win_name, win_name_size, 1, out); + + /* + * Write out the color maps, if any + */ + + /*if (debug) outl("xwd: Dumping %d colors.\n", ncolors);*/ + for (i=0;i<ncolors;i++) { + XCOLOR xc; + assert( sizeof(xc)==12 ); + xc.pixel = colors[i].pixel; + xc.red = colors[i].red; + xc.green = colors[i].green; + xc.blue = colors[i].blue; + xc.flags = colors[i].flags; + xc.pad = colors[i].pad; + (void) fwrite( (char *) &xc, sizeof(XCOLOR), 1, out ); + } +/* OLD: + (void) fwrite((char *) colors, sizeof(XColor), ncolors, out); +*/ + + /* + * Write out the buffer. + */ + /*if (debug) outl("xwd: Dumping pixmap. bufsize=%d\n",buffer_size);*/ + + /* + * This copying of the bit stream (data) to a file is to be replaced + * by an Xlib call which hasn't been written yet. It is not clear + * what other functions of xwd will be taken over by this (as yet) + * non-existant X function. + */ + (void) fwrite(image->data, (int) buffer_size, 1, out); + + /* + * free the color buffer. + */ + + if(debug && ncolors > 0) outl("xwd: Freeing colors.\n"); + if(ncolors > 0) free(colors); + + /* + * Free window name string. + */ + if (debug) outl("xwd: Freeing window name string.\n"); + if (got_win_name) XFree(win_name); + + /* + * Free image + */ + XDestroyImage(image); +} diff --git a/Unix/XDump.h b/Unix/XDump.h new file mode 100644 index 0000000000000000000000000000000000000000..981d0be2b0da033f15a9b0ed528f686526b1336c --- /dev/null +++ b/Unix/XDump.h @@ -0,0 +1,6 @@ +#ifndef _XDUMP_H_ +#define _XDUMP_H_ + +void Window_Dump(Display *display, int scr, Window window, FILE *out); + +#endif diff --git a/Unix/XRessources.h b/Unix/XRessources.h new file mode 100644 index 0000000000000000000000000000000000000000..bb692d739d40f9bf67d62670066c71cff43896b2 --- /dev/null +++ b/Unix/XRessources.h @@ -0,0 +1,80 @@ + +/* + Les resources ci-dessous sont prises en compte par defaut. Toutre + resource definie dans ~/.gmshrc ou dans APP_DEFAULTS/.gmshrc est + prioritaire + + Palette I-DEAS R G B + background 42 71 94 + foreground 255 232 148 + highlight 42 71 95 + topshadow 84 127 158 + bottomshadow 8 12 28 + + Palette netscape + background gray70 + foreground black + highlightColor gray71 + XmTextField*background MistyRose3 + XmList*background MistyRose3 + ArrowBack*foreground MistyRose3 +*/ + +String FallbackResources[] = { + + /* couleurs */ + "gmshGW*background: Grey75", + "gmshGW*borderColor: Grey75", + "gmshGW*foreground: Black", + "gmshGW*highlightColor: Grey76", + + "gmshMW*background: Grey75", + "gmshMW*borderColor: Grey75", + "gmshMW*foreground: Black", + "gmshMW*XmText*background: White", + "gmshMW*XmText*foreground: Black", + "gmshMW*XmTextField*background: White", + "gmshMW*XmList*background: White", + "gmshMW*selectColor: Yellow", + "gmshMW*highlightColor: DarkOrchid", + + "gmshCW*background: Grey75", + "gmshCW*foreground: Black", + "gmshCW*borderColor: Gray75", + "gmshCW*XmTextField*background: Gray75", + "gmshCW*XmList*background: Gray75", + "gmshCW*highlightColor: Grey76", + + /* fontes */ + "*fontList: -*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*", + "*XmTextField*fontList: -*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*", + "*XmList*fontList: -*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*", + "gmshMW*HDkeysText*fontList: fixed", + "gmshMW*HDkeysText*XmPushButton*fontList: -*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*", + "gmshMW*HDaboutDialog*fontList: fixed", + + /* geometrie */ + "gmshGW*geometry: 700x525+20+30", + "gmshMW*geometry: x405+800+90", + "gmshCW*geometry: 440x130+30+570", + + /* sizes -> compact layout */ + + "*XmCascadeButton*marginWidth: 2", + + NULL }; + +/* + *toolbar*XmPushButton.baseTranslations: #override\n\ + : CustomShadows(on) Arm()\n\ + : CustomShadows(on) Enter()\n\ + : CustomShadows(off) Leave()\n\ + : MapCheck() + + *toolbar*XmToggleButton.baseTranslations: #override\n\ + : CustomShadows(on) Arm()\n\ + : Select() Disarm() CustomShadows(check)\n\ + : CustomShadows(on) Enter()\n\ + : CustomShadows(off) Leave()\n\ + : MapCheck() + */ diff --git a/Unix/XStatic.h b/Unix/XStatic.h new file mode 100644 index 0000000000000000000000000000000000000000..d6845b39237feee43a0c70d17f7c4af00fc54473 --- /dev/null +++ b/Unix/XStatic.h @@ -0,0 +1,37 @@ +#ifndef _XSTATIC_H_ +#define _XSTATIC_H_ + +/* Fenetre OpenGL principale : visual RGBA, simple ou double buffer */ + +int glw_attrib_sb[] = { + GLX_RGBA, + GLX_DEPTH_SIZE, 16, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + None }; + +int glw_attrib_db[] = { + GLX_RGBA, + GLX_DOUBLEBUFFER, + GLX_DEPTH_SIZE, 16, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + None }; + +/* Fenetre OpenGL overlay : visual INDEXE, simple buffer */ + +int glo_attrib[] = { GLX_LEVEL, 1, None }; + +/* variables globales */ + +XContext_T XCTX ; +Widgets_T WID ; +Pixmaps_T PIX ; + +GLdouble vxmin, vxmax, vymin, vymax; + +double ClipPlane[4] = {0.0, 0.0, 0.0, 0.0}; + +#endif diff --git a/archives/Makefile b/archives/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..418e1ce085b89a2e137aa6668e8bfa83293ed64e --- /dev/null +++ b/archives/Makefile @@ -0,0 +1,4 @@ + +purge: + $(RM) $(RMFLAGS) *~ + diff --git a/benchmarks/1d/ligne.geo b/benchmarks/1d/ligne.geo new file mode 100644 index 0000000000000000000000000000000000000000..a3f4b3bc95db336b61cc751152228925eac2a4e8 --- /dev/null +++ b/benchmarks/1d/ligne.geo @@ -0,0 +1,3 @@ +Point(1) = {0.0,0.0,0.0,.1}; +Point(2) = {1,0.0,0.0,.1}; +Line(1) = {1,2}; diff --git a/benchmarks/2d/Square-01.geo b/benchmarks/2d/Square-01.geo new file mode 100644 index 0000000000000000000000000000000000000000..f480020abebfa68dff488b163d3d59b42019fee4 --- /dev/null +++ b/benchmarks/2d/Square-01.geo @@ -0,0 +1,15 @@ +/****************************** +Square uniformly meshed +******************************/ +lc = .49999; +Point(1) = {0.0,0.0,0,lc}; +Point(2) = {1,0.0,0,lc}; +Point(3) = {1,1,0,lc}; +Point(4) = {0,1,0,lc}; +Line(1) = {3,2}; +Line(2) = {2,1}; +Line(3) = {1,4}; +Line(4) = {4,3}; +Line Loop(5) = {1,2,3,4}; +Plane Surface(6) = {5}; +Attractor Point(0.05,0.05,2) = {2}; diff --git a/benchmarks/2d/Square-02.geo b/benchmarks/2d/Square-02.geo new file mode 100644 index 0000000000000000000000000000000000000000..d1b5976cd62d242edd90ac51429d77eaa67ebda9 --- /dev/null +++ b/benchmarks/2d/Square-02.geo @@ -0,0 +1,15 @@ +/****************************** +Square non uniformly +meshed +******************************/ +lc = .1; +Point(1) = {0.0,0.0,0,lc*.1}; +Point(2) = {1,0.0,0,lc}; +Point(3) = {1,1,0,lc}; +Point(4) = {0,1,0,lc}; +Line(1) = {3,2}; +Line(2) = {2,1}; +Line(3) = {1,4}; +Line(4) = {4,3}; +Line Loop(5) = {1,2,3,4}; +Plane Surface(6) = {5}; diff --git a/benchmarks/2d/Square-03.geo b/benchmarks/2d/Square-03.geo new file mode 100644 index 0000000000000000000000000000000000000000..b303fff71b5032ba2f4dfbfbb591ec18f1e7ef78 --- /dev/null +++ b/benchmarks/2d/Square-03.geo @@ -0,0 +1,16 @@ +/****************************** +Square uniformly meshed +******************************/ +lc = .49999; +Point(1) = {0.0,0.0,0,lc}; +Point(2) = {1,0.0,0,lc}; +Point(3) = {1,1,0,lc}; +Point(4) = {0,1,0,lc}; +Point(5) = {0,2,0,lc}; +Line(1) = {3,2}; +Line(2) = {2,1}; +Line(3) = {1,4}; +Line(4) = {4,3}; +Line Loop(5) = {1,2,3,4}; +Plane Surface(6) = {5}; +Line(7) = {4,5}; diff --git a/benchmarks/2d/Square-Attr1.geo b/benchmarks/2d/Square-Attr1.geo new file mode 100644 index 0000000000000000000000000000000000000000..06f930f13f60441a1e658ad517a4b095c8a0f77d --- /dev/null +++ b/benchmarks/2d/Square-Attr1.geo @@ -0,0 +1,18 @@ +/****************************** +Square uniformly meshed +******************************/ +lc = .1; +Point(1) = {0.0,0.0,0,lc}; +Point(2) = {1,0.0,0,lc}; +Point(3) = {1,1,0,lc}; +Point(4) = {0,1,0,lc}; +Line(1) = {3,2}; +Line(2) = {2,1}; +Line(3) = {1,4}; +Line(4) = {4,3}; +Line Loop(5) = {1,2,3,4}; +Plane Surface(6) = {5}; +Point(11) = {0.5,0.5,-1,lc}; +Point(22) = {0.5,0.5,1,lc}; +Line(5) = {11,22}; +Attractor Line(1,0.1,7) = {5}; diff --git a/benchmarks/2d/Square-Attr2.geo b/benchmarks/2d/Square-Attr2.geo new file mode 100644 index 0000000000000000000000000000000000000000..1367babc94cc1a7521704c4acd93f2c4817edf69 --- /dev/null +++ b/benchmarks/2d/Square-Attr2.geo @@ -0,0 +1,35 @@ +/****************************** +Square uniformly meshed +******************************/ +lc = .1; +Point(1) = {0.0,0.0,0,lc}; +Point(2) = {1,0.0,0,lc}; +Point(3) = {1,1,0,lc}; +Point(4) = {0,1,0,lc}; +Line(1) = {3,2}; +Line(2) = {2,1}; +Line(3) = {1,4}; +Line(4) = {4,3}; +Line Loop(5) = {1,2,3,4}; +Plane Surface(6) = {5}; +e = .03; +Point(11) = {-.2,.5,0,lc}; +Point(12) = {.2,.5,0,lc}; +Point(13) = {.5,.8-e,0,lc}; +Point(14) = { (.8)-(2*e),.5,0,lc}; +Point(15) = { .5,(.2)+(3*e),0,lc}; +Point(16) = {.2+(4*e),.5,0,lc}; +Point(17) = {.5,.8-(5*e),0,lc}; +Point(18) = { .8-(6*e),.5,0,lc}; +Point(19) = { .5,.2+(7*e),0,lc}; +Point(20) = {.2+(8*e),.5,0,lc}; +Line(7) = {11,12}; +Line(8) = {12,13}; +Line(9) = {13,14}; +Line(10) = {14,15}; +Line(11) = {15,16}; +Line(12) = {16,17}; +Line(13) = {17,18}; +Line(14) = {18,19}; +Line(15) = {19,20}; +Attractor Line(.1,0.01,10) = {7,8,9,10,11,12,13,14,15}; diff --git a/benchmarks/2d/Square-Attr3.geo b/benchmarks/2d/Square-Attr3.geo new file mode 100644 index 0000000000000000000000000000000000000000..a46321004f8214c0f109a2fb0419e14dc9931797 --- /dev/null +++ b/benchmarks/2d/Square-Attr3.geo @@ -0,0 +1,16 @@ +/****************************** +Square uniformly meshed +******************************/ +lc = .1; +Point(1) = {0.0,0.0,0,lc}; +Point(2) = {1,0.0,0,lc}; +Point(3) = {1,1,0,lc}; +Point(4) = {0,1,0,lc}; +Line(1) = {3,2}; +Line(2) = {2,1}; +Line(3) = {1,4}; +Line(4) = {4,3}; +Line Loop(5) = {1,2,3,4}; +Plane Surface(6) = {5}; +Line(5) = {3,1}; +Attractor Line(1,0.01,3) = {5}; diff --git a/benchmarks/2d/Square-Attr4.geo b/benchmarks/2d/Square-Attr4.geo new file mode 100644 index 0000000000000000000000000000000000000000..b12f1e06fd40c3d6cb5fa5817cbebecc3ea35c98 --- /dev/null +++ b/benchmarks/2d/Square-Attr4.geo @@ -0,0 +1,16 @@ +/****************************** +Square uniformly meshed +******************************/ +lc = .149999; +Point(1) = {0.0,0.0,0,lc}; +Point(2) = {1,0.0,0,lc}; +Point(3) = {1,1,0,lc}; +Point(4) = {0,1,0,lc}; +Line(1) = {3,2}; +Line(2) = {2,1}; +Line(3) = {1,4}; +Line(4) = {4,3}; +Point(55) = {0.2,.5,0,lc}; +Line Loop(5) = {1,2,3,4}; +Plane Surface(6) = {5}; +Attractor Point (.01,.1,3.0) = {55}; diff --git a/benchmarks/2d/conge.geo b/benchmarks/2d/conge.geo new file mode 100644 index 0000000000000000000000000000000000000000..b7cb6024f36a6b422c713ffc6f31abac2ceb52ac --- /dev/null +++ b/benchmarks/2d/conge.geo @@ -0,0 +1,80 @@ +unit = 1.0e-02 ; + +e1 = 4.5 * unit ; +e2 = 6.0 * unit / 2.0 ; +e3 = 5.0 * unit / 2.0 ; +h1 = 5.0 * unit ; +h2 = 10.0 * unit ; +h3 = 5.0 * unit ; +h4 = 2.0 * unit ; +h5 = 4.5 * unit ; +R1 = 1.0 * unit ; +R2 = 1.5 * unit ; +r = 1.0 * unit ; +ccos = (-h5*R1+e2* (h5*h5+e2*e2-R1*R1)^0.5) / (h5*h5+e2*e2) ; +ssin = ( 1.0 - ccos*ccos )^0.5 ; + +Lc1 = 0.01 ; +Lc2 = 0.003 ; + +Point(1) = { -e1-e2, 0.0 , 0.0 , Lc1}; +Point(2) = { -e1-e2, h1 , 0.0 , Lc1}; +Point(3) = { -e3-r , h1 , 0.0 , Lc2}; +Point(4) = { -e3-r , h1+r , 0.0 , Lc2}; +Point(5) = { -e3 , h1+r , 0.0 , Lc2}; +Point(6) = { -e3 , h1+h2, 0.0 , Lc1}; +Point(7) = { e3 , h1+h2, 0.0 , Lc1}; +Point(8) = { e3 , h1+r , 0.0 , Lc2}; +Point(9) = { e3+r , h1+r , 0.0 , Lc2}; +Point(10)= { e3+r , h1 , 0.0 , Lc2}; +Point(11)= { e1+e2, h1 , 0.0 , Lc1}; +Point(12)= { e1+e2, 0.0 , 0.0 , Lc1}; +Point(13)= { e2 , 0.0 , 0.0 , Lc1}; + +Point(14)= { R1 / ssin , h5+R1*ccos, 0.0 , Lc2}; +Point(15)= { 0.0 , h5 , 0.0 , Lc2}; +Point(16)= { -R1 / ssin , h5+R1*ccos, 0.0 , Lc2}; +Point(17)= { -e2 , 0.0 , 0.0 , Lc1}; + +Point(18)= { -R2 , h1+h3 , 0.0 , Lc2}; +Point(19)= { -R2 , h1+h3+h4, 0.0 , Lc2}; +Point(20)= { 0.0 , h1+h3+h4, 0.0 , Lc2}; +Point(21)= { R2 , h1+h3+h4, 0.0 , Lc2}; +Point(22)= { R2 , h1+h3 , 0.0 , Lc2}; +Point(23)= { 0.0 , h1+h3 , 0.0 , Lc2}; + +Point(24)= { 0 , h1+h3+h4+R2, 0.0 , Lc2}; +Point(25)= { 0 , h1+h3-R2, 0.0 , Lc2}; + +Line(1) = {1 ,17}; /* ux=uy=0 */ +Line(2) = {17,16}; +Circle(3) = {14,15,16}; +Line(4) = {14,13}; +Line(5) = {13,12}; /* ux=uy=0 */ +Line(6) = {12,11}; +Line(7) = {11,10}; +Circle(8) = { 8, 9,10}; +Line(9) = { 8, 7}; +Line(10) = { 7, 6}; /* T=10000 N */ +Line(11) = { 6, 5}; +Circle(12) = { 3, 4, 5}; +Line(13) = { 3, 2}; +Line(14) = { 2, 1}; + +Line(15) = {18,19}; +Circle(16) = {21,20,24}; +Circle(17) = {24,20,19}; +Circle(18) = {18,23,25}; +Circle(19) = {25,23,22}; +Line(20) = {21,22}; + +Line Loop(21) = {17,-15,18,19,-20,16}; +Plane Surface(22) = {21}; +Line Loop(23) = {11,-12,13,14,1,2,-3,4,5,6,7,-8,9,10}; +Plane Surface(24) = {23,21}; + + + + + + diff --git a/benchmarks/2d/francois.geo b/benchmarks/2d/francois.geo new file mode 100644 index 0000000000000000000000000000000000000000..569fde384229d2d6ceeae16d3c7f6057991e81c3 --- /dev/null +++ b/benchmarks/2d/francois.geo @@ -0,0 +1,33 @@ +r = 2.24; +Point(1) = {0.0,0.0,0.0,.2}; +Point(2) = {r,.0,0.0,.2}; +Point(3) = {-r,0.0,0.0,.2}; +Point(4) = {0,r,0.0,.2}; +Point(5) = {0,-r,0.0,.2}; +Circle(1) = {2,1,4}; +Circle(2) = {4,1,3}; +Circle(3) = {3,1,5}; +Circle(4) = {5,1,2}; +Point(6) = {10,10,0.0,1}; +Point(7) = {-10,10,0.0,1}; +Point(8) = {-10,-10,0.0,1}; +Point(9) = {10,-10,0.0,1}; +Line(5) = {8,7}; +Line(6) = {7,6}; +Line(7) = {6,9}; +Line(8) = {9,8}; +Line Loop(9) = {6,7,8,5}; +Line Loop(10) = {4,1,2,3}; +Plane Surface(11) = {9,10}; +Extrude Surface (11, {0,0.0,2.0}) +{ + Layers { {2,1,2} , {100,200,100} , {.05,.95,1.} } ; +}; +Coherence; +Physical Surface(54) = {53}; +Physical Surface(55) = {11}; +Physical Surface(56) = {40,44,48,52}; +Physical Surface(57) = {53}; + +Surface Loop(58) = {53,24,11,28,32,36,40,44,48,52}; +Complex Volume(59) = {58}; diff --git a/benchmarks/2d/gmsh.tmp b/benchmarks/2d/gmsh.tmp new file mode 100644 index 0000000000000000000000000000000000000000..0b7c980569bfc58e08726a5c083429e72478f7f2 --- /dev/null +++ b/benchmarks/2d/gmsh.tmp @@ -0,0 +1 @@ +Complex Volume(59) = {58}; diff --git a/benchmarks/2d/runner_simple_2d.geo b/benchmarks/2d/runner_simple_2d.geo new file mode 100644 index 0000000000000000000000000000000000000000..4eaf6f51b1eb8685fe4fbcf37c5d0d7a005559d6 --- /dev/null +++ b/benchmarks/2d/runner_simple_2d.geo @@ -0,0 +1,119 @@ +/*simple runner for 3d-studies; 07.07.1999/hm*/ + + +/*variables*/ +r=0.004; +a=0.005; +b=0.005; +m=0.010; +mh=0.020; + +h1=0.005; +h2=0.005; +h3=0.005; +h4=0.005; +hl = 0.012; +f =0.015; +l =0.040; + +lc1 = 0.001; + +/*points*/ + +Point(1) = {-r,0.0,0.0,lc1}; + +Point(2) = {0,0.0,0.0,lc1}; + +Point(3) = {+r,0.0,0.0,lc1}; +Point(4) = {r+a,0.0,0.0,lc1}; +Point(5) = {r+a+b,0.0,0.0,lc1}; +Point(6) = {r+a+b,-h4,0.0,lc1}; + +Point(11) = {-r,h1,0.0,lc1}; + +Point(13) = {+r,h1,0.0,lc1}; +Point(14) = {r+a,h2,0.0,lc1}; +Point(15) = {r+a+b,h3,0.0,lc1}; + +/*flange*/ + +Point(25) = {r+a+b+f,0,0.0,lc1}; +Point(26) = {r+a+b+f,h3,0.0,lc1}; +Point(27) = {r+a+b+f,-h4,0.0,lc1}; +Point(28) = {r+a+b+f,-hl,0.0,lc1}; + +/*laminate*/ + +Point(30) = {r+a+b+f+l,0.0,0.0,lc1}; +Point(31) = {r+a+b+f+l,h3,0.0,lc1}; +Point(32) = {r+a+b+f+l,-h4,0.0,lc1}; +Point(33) = {r+a+b+f+l,-hl,0.0,lc1}; + +/*lines*/ + +Circle(100) = {1,2,3}; + +Line(101) = {1,11}; +Line(102) = {11,13}; +Line(103) = {13,14}; +Line(104) = {14,15}; +Line(105) = {3,13}; +Line(106) = {3,4}; +Line(107) = {4,14}; +Line(108) = {4,5}; +Line(109) = {5,15}; + + + +Line(110) = {15,26}; +Line(111) = {5,25}; +Line(112) = {6,27}; +Line(113) = {5,6}; +Line(114) = {26,25}; +Line(115) = {25,27}; +Line(116) = {26,31}; +Line(117) = {25,30}; +Line(118) = {27,32}; +Line(119) = {31,30}; +Line(120) = {30,32}; + +Line(121) = {27,28}; +Line(122) = {28,33}; +Line(123) = {32,33}; + +Line Loop(300) = {-102,-101,100,105}; +Plane Surface(301) = {300}; +Line Loop(400) = {107,-103,-105,106}; +Plane Surface(401) = {400}; +Line Loop(402) = {109,-104,-107,108}; +Plane Surface(403) = {402}; + + +Line Loop(404) = {-114,-110,-109,111}; +Plane Surface(405) = {404}; +Line Loop(406) = {-112,-113,111,115}; +Plane Surface(407) = {406}; +Line Loop(408) = {117,-119,-116,114}; +Plane Surface(409) = {408}; +Line Loop(410) = {118,-120,-117,115}; +Plane Surface(411) = {410}; +Line Loop(412) = {118,123,-122,-121}; +Plane Surface(413) = {412}; + +/*mould*/ + +Point(511) = {-m,h1,0.0,lc1}; +Point(512) = {-m,h1-mh,0.0,lc1}; +Point(533) = {r+a+b+f+l,h1-mh,0.0,lc1}; + +Line(614) = {511,512}; +Line(615) = {511,11}; +Line(616) = {512,533}; +Line(617) = {533,33}; +/* +Line Loop(618) = {-617,-616,-614,615,-101,100,106,108,113,112,121,122,-617,-616,-614,615,-101,100,106,108,113,112};*/ + +Line Loop(618) = {-617,-616,-614,615,-101,100,106,108,113,112,121,122}; +Plane Surface(619) = {618}; + + diff --git a/benchmarks/3d/Cube-01-ExtrMesh.geo b/benchmarks/3d/Cube-01-ExtrMesh.geo new file mode 100644 index 0000000000000000000000000000000000000000..167d77eed86f903e6e50e5c8442de606849da0b4 --- /dev/null +++ b/benchmarks/3d/Cube-01-ExtrMesh.geo @@ -0,0 +1,19 @@ +/***************************** +cube meshed uniformly +*****************************/ +x = .0; +Point(1) = {0.0,0.0,0.0,.2+x}; +Point(2) = {1,0.0,0.0,.2+x}; +Point(3) = {1,1,0.0,.2+x}; +Point(4) = {0,1,0.0,.002+x}; +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Line Loop(5) = {2,3,4,1}; +Plane Surface(6) = {5}; +Extrude Surface (6, {0,0.0,1}) +{ + Layers {{10,5,10},{100,200,300},{.1,.9,1.}}; +} ; + diff --git a/benchmarks/3d/Cube-02-ExtrMesh.geo b/benchmarks/3d/Cube-02-ExtrMesh.geo new file mode 100644 index 0000000000000000000000000000000000000000..e0dbda6c8971805d5b5421cf7780601200085a08 --- /dev/null +++ b/benchmarks/3d/Cube-02-ExtrMesh.geo @@ -0,0 +1,30 @@ +/***************************** +cube meshed uniformly +*****************************/ +x = .0; +Point(1) = {0.0,0.,0.0,.2+x}; +Point(2) = {1,0.,0.0,.2+x}; +Point(3) = {1,1,0.0,.2+x}; +Point(4) = {0,1,0.0,.2+x}; +Point(5) = {1,2,0.0,.2+x}; +Point(6) = {0,2,0.0,.2+x}; +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Line Loop(5) = {2,3,4,1}; +Plane Surface(6) = {5}; +Extrude Surface (6, {0,0.0,1}) +{ + Layers {120}{1.}{1}; +} ; + +Line(29) = {4,6}; +Line(30) = {6,5}; +Line(31) = {5,3}; +Line Loop(32) = {-31,-30,-29,1}; +Plane Surface(33) = {32}; +Extrude Surface (33, {0,0.0,1}); +Coherence; +Surface Loop(56) = {54,33,42,46,50,55}; +Complex Volume(57) = {56}; diff --git a/benchmarks/3d/Cube-02.geo b/benchmarks/3d/Cube-02.geo new file mode 100644 index 0000000000000000000000000000000000000000..56888f64042701663aa76d577696a5991d01fdfe --- /dev/null +++ b/benchmarks/3d/Cube-02.geo @@ -0,0 +1,18 @@ +/***************************** +cube meshed +non uniformly +*****************************/ +Point(1) = {0.0,0.0,0.0,.04}; +Point(2) = {1,0.0,0.0,.2}; +Point(3) = {1,1,0.0,.1}; +Point(4) = {0,1,0.0,.2}; +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Line Loop(5) = {2,3,4,1}; +Plane Surface(6) = {5}; +Extrude Surface (6, {0,0.0,1}); + +Surface Loop(29) = {23,6,15,19,28,27}; +Complex Volume(30) = {29}; diff --git a/benchmarks/3d/Cube-03.geo b/benchmarks/3d/Cube-03.geo new file mode 100644 index 0000000000000000000000000000000000000000..8fbdd49467635e19eb9939a3b3c13f3769fc0fd6 --- /dev/null +++ b/benchmarks/3d/Cube-03.geo @@ -0,0 +1,10 @@ +/***************************** +Another Way to generate +a cube +*****************************/ +Point(1) = {0.0,0.0,0.0,.2}; +Extrude Point (1, {1,0.0,0}); +Extrude Line (1, {0.0,0.0,1}); +Extrude Surface (5, {0,1,0}); +Surface Loop(28) = {26,5,14,18,22,27}; +Complex Volume(29) = {28}; diff --git a/benchmarks/3d/Cube-04.geo b/benchmarks/3d/Cube-04.geo new file mode 100644 index 0000000000000000000000000000000000000000..692558731428da2249a2c87f6fb2603c3098f732 --- /dev/null +++ b/benchmarks/3d/Cube-04.geo @@ -0,0 +1,20 @@ +/***************************** +A cube with a hole +*****************************/ + +Point(1) = {0.0,0.0,0.0,.1}; +Extrude Point (1, {1,0.0,0}); +Extrude Line (1, {0.0,0.0,1}); +Extrude Surface (5, {0,1,0}); + +Point(100) = {0.3,0.3,0.3,.02}; +Extrude Point (100, {.4,0.0,0}); +Extrude Line (28, {0,0.4,0}); +Coherence; +Extrude Surface (32, {0,0.,0.4}); +Coherence; + +Surface Loop(55) = {26,5,14,18,22,27}; +Surface Loop(56) = {41,32,45,49,53,54}; +Complex Volume(57) = {55,56}; + diff --git a/benchmarks/3d/Cube-05-ExtrMesh.geo b/benchmarks/3d/Cube-05-ExtrMesh.geo new file mode 100644 index 0000000000000000000000000000000000000000..9777a3a115fa1f8725ad455481899aaadb9fe97c --- /dev/null +++ b/benchmarks/3d/Cube-05-ExtrMesh.geo @@ -0,0 +1,35 @@ +/***************************** +cube with a hole +*****************************/ +lv = .1; +lc = .04; +Point(1) = {0.0,0.0,0.0,lv}; +Point(2) = {1,0.0,0.0,lv}; +Point(3) = {1,1,0.0,lv}; +Point(4) = {0,1,0.0,lv}; +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Point(11) = {0.5,0.5,0.0,lc}; +Point(12) = {0.5,0.7,0.0,lc}; +Point(13) = {0.5,0.3,0.0,lc}; +Point(14) = {0.3,0.5,0.0,lc}; +Point(15) = {0.7,0.5,0.0,lc}; +Circle(5) = {15,11,12}; +Circle(6) = {12,11,14}; +Circle(7) = {14,11,13}; +Circle(8) = {13,11,15}; +Line Loop(9) = {1,2,3,4}; +Line Loop(10) = {7,8,5,6}; +Plane Surface(11) = {9,10}; + +Extrude Surface(11, {0.0,1,0}, {-.5,0.0,0.0}, 3.14159/4) +{ + Layers {5,15,5}{10,20,10}{.1,.9,1.}; +} ; +Coherence; +Extrude Surface(24, {0.0,.3,0}); +Coherence; +Surface Loop(76) = {24,62,66,70,74,75}; +Complex Volume(77) = {76}; diff --git a/benchmarks/3d/Cube-05.geo b/benchmarks/3d/Cube-05.geo new file mode 100644 index 0000000000000000000000000000000000000000..07dc09de0242d780501c3a5c978b00bdbc51ec44 --- /dev/null +++ b/benchmarks/3d/Cube-05.geo @@ -0,0 +1,30 @@ +/***************************** +cube with a hole +*****************************/ +lv = .1; +lc = .04; +Point(1) = {0.0,0.0,0.0,lv}; +Point(2) = {1,0.0,0.0,lv}; +Point(3) = {1,1,0.0,lv}; +Point(4) = {0,1,0.0,lv}; +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Point(11) = {0.5,0.5,0.0,lc}; +Point(12) = {0.5,0.7,0.0,lc}; +Point(13) = {0.5,0.3,0.0,lc}; +Point(14) = {0.3,0.5,0.0,lc}; +Point(15) = {0.7,0.5,0.0,lc}; +Circle(5) = {15,11,12}; +Circle(6) = {12,11,14}; +Circle(7) = {14,11,13}; +Circle(8) = {13,11,15}; +Line Loop(9) = {1,2,3,4}; +Line Loop(10) = {7,8,5,6}; +Plane Surface(11) = {9,10}; + +Extrude Surface(11, {0.0,1,0}, {-.5,0.0,0.0}, 3.14159/4) ; +Coherence; +Surface Loop(54) = {36,11,24,28,32,53,40,44,48,52}; +Complex Volume(55) = {54}; diff --git a/benchmarks/3d/Cube-06-ExtrMesh.geo b/benchmarks/3d/Cube-06-ExtrMesh.geo new file mode 100644 index 0000000000000000000000000000000000000000..d11eaaa0c43e794f18c91f0b539b7a3bd9f1c4bd --- /dev/null +++ b/benchmarks/3d/Cube-06-ExtrMesh.geo @@ -0,0 +1,30 @@ +/***************************** +cube with a hole +*****************************/ +lv = .1; +lc = .04; +Point(1) = {0.0,0.0,0.0,lv}; +Point(2) = {2.5,0.0,0.0,lv}; +Point(3) = {2.5,1,0.0,lv}; +Point(4) = {0,1,0.0,lv}; +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Point(11) = {0.5,0.5,0.0,lc}; +Point(12) = {0.5,0.7,0.0,lc}; +Point(13) = {0.5,0.3,0.0,lc}; +Point(14) = {0.3,0.5,0.0,lc}; +Point(15) = {0.7,0.5,0.0,lc}; +Circle(5) = {15,11,12}; +Circle(6) = {12,11,14}; +Circle(7) = {14,11,13}; +Circle(8) = {13,11,15}; +Line Loop(9) = {1,2,3,4}; +Line Loop(10) = {7,8,5,6}; +Plane Surface(11) = {9,10}; +Extrude Surface (11, {.0,0.0,.1}) +{ + Layers {2,3,2}{44,55,44}{.1,.9,1.}; +}; +Coherence; diff --git a/benchmarks/3d/Cube-06.geo b/benchmarks/3d/Cube-06.geo new file mode 100644 index 0000000000000000000000000000000000000000..b7a591ca0ab3766a4052d01b1bf7a37ddcd9a3aa --- /dev/null +++ b/benchmarks/3d/Cube-06.geo @@ -0,0 +1,29 @@ +/***************************** +cube with a hole +*****************************/ +lv = .1; +lc = .04; +Point(1) = {0.0,0.0,0.0,lv}; +Point(2) = {1,0.0,0.0,lv}; +Point(3) = {1,1,0.0,lv}; +Point(4) = {0,1,0.0,lv}; +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Point(11) = {0.5,0.5,0.0,lc}; +Point(12) = {0.5,0.7,0.0,lc}; +Point(13) = {0.5,0.3,0.0,lc}; +Point(14) = {0.3,0.5,0.0,lc}; +Point(15) = {0.7,0.5,0.0,lc}; +Circle(5) = {15,11,12}; +Circle(6) = {12,11,14}; +Circle(7) = {14,11,13}; +Circle(8) = {13,11,15}; +Line Loop(9) = {1,2,3,4}; +Line Loop(10) = {7,8,5,6}; +Plane Surface(11) = {9,10}; +Extrude Surface (11, {.0,0.0,.5}); +Coherence; +Surface Loop(54) = {24,11,28,32,36,53,40,44,48,52}; +Complex Volume(55) = {54}; diff --git a/benchmarks/3d/Cube-07.geo b/benchmarks/3d/Cube-07.geo new file mode 100644 index 0000000000000000000000000000000000000000..e515fb1a0ef09a319648a560da6bc92ffdc172db --- /dev/null +++ b/benchmarks/3d/Cube-07.geo @@ -0,0 +1,12 @@ +Point(1) = {0.0,0.0,0.0,.1}; +Point(2) = {0.0,0.0,1,.1}; +Point(3) = {0.0,1,1,.1}; +Point(4) = {0.0,1,0,.1}; +Line(1) = {1,2}; +Line(2) = {2,3}; +Line(3) = {3,4}; +Line(4) = {4,1}; +Line Loop(5) = {1,2,3,4}; +Plane Surface(6) = {5}; +Extrude Surface (6, {1.0,0.0,0.0}); +Coherence; diff --git a/benchmarks/3d/Cube-Attr-01.geo b/benchmarks/3d/Cube-Attr-01.geo new file mode 100644 index 0000000000000000000000000000000000000000..ee891bbc6c30f3cb28390687766cccb42303461b --- /dev/null +++ b/benchmarks/3d/Cube-Attr-01.geo @@ -0,0 +1,32 @@ +/***************************** +cube meshed uniformly +*****************************/ +Point(1) = {0.0,0.0,0.0,.2}; +Point(2) = {1,0.0,0.0,.2}; +Point(3) = {1,1,0.0,.2}; +Point(4) = {0,1,0.0,.2}; +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Line Loop(5) = {2,3,4,1}; +Plane Surface(6) = {5}; +Extrude Surface (6, {0,0.0,1}); + +Surface Loop(29) = {23,6,15,19,28,27}; +Complex Volume(30) = {29}; + +Attractor Point(0.05,0.05,2) = {1,4,5,6,10,14}; +/* +Point(15) = {0,.5,.5,1.0}; +Attractor Point(0.05,0.05,2) = {15}; +*/ +Point(16) = {-.5,.5,.5,1.0}; +Point(17) = {1.5,.5,.8,1.0}; +Line(30) = {16,17}; +Attractor Line(0.1,0.1,2) = {30}; + +Point(18) = {-.2,.7,1.3,1.0}; +Point(19) = {1.22,.1,-.8,1.0}; +Line(31) = {18,19}; +Attractor Line(0.01,0.01,2) = {31}; diff --git a/benchmarks/3d/Cube-Attr-02.geo b/benchmarks/3d/Cube-Attr-02.geo new file mode 100644 index 0000000000000000000000000000000000000000..1c92c4278594773c14721dd67d86a3d194ee850f --- /dev/null +++ b/benchmarks/3d/Cube-Attr-02.geo @@ -0,0 +1,19 @@ +/***************************** +cube meshed uniformly +*****************************/ +Point(1) = {0.0,0.0,0.0,.3}; +Point(2) = {1,0.0,0.0,.3}; +Point(3) = {1,1,0.0,.3}; +Point(4) = {0,1,0.0,.3}; +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Line Loop(5) = {2,3,4,1}; +Plane Surface(6) = {5}; +Extrude Surface (6, {0,0.0,1}); + +Surface Loop(29) = {23,6,15,19,28,27}; +Complex Volume(30) = {29}; + +Attractor Point(0.1,0.1,2) = {1}; diff --git a/benchmarks/3d/Revolve.geo b/benchmarks/3d/Revolve.geo new file mode 100644 index 0000000000000000000000000000000000000000..897b4bc1d6ffb2078f85c37110a5f615324387e4 --- /dev/null +++ b/benchmarks/3d/Revolve.geo @@ -0,0 +1,17 @@ +lc = .1; +Point(1) = {2.0,0.0,0.0,lc}; +Point(2) = {2.0,1,0.0,lc}; +Point(3) = {1,0,0.0,lc}; +Point(4) = {3,0,0.0,lc}; +Point(5) = {2,-1,0.0,lc}; +Line(1) = {4,2}; + +Line(2) = {2,3}; +Line(3) = {3,5}; +Line(4) = {5,4}; +Line Loop(5) = {4,1,2,3}; +Plane Surface(6) = {5}; + +Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0}, 3.14159/4); + +Coherence; diff --git a/benchmarks/3d/Revolve2-Attr.geo b/benchmarks/3d/Revolve2-Attr.geo new file mode 100644 index 0000000000000000000000000000000000000000..4ab2f181bb7256aa6655983deaf3832a02c5766c --- /dev/null +++ b/benchmarks/3d/Revolve2-Attr.geo @@ -0,0 +1,17 @@ +lc = .3; +Point(2) = {3.0,-1.0,0.0,lc}; +Point(3) = {1,-1,0.0,lc}; +Point(4) = {3,1,0.0,lc}; +Point(5) = {1,1,0.0,lc}; +Line(1) = {4,2}; +Line(2) = {2,3}; +Line(3) = {3,5}; +Line(4) = {5,4}; +Line Loop(5) = {4,1,2,3}; +Plane Surface(6) = {5}; + +Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0}, 3.14159/2); + +Coherence; + +Attractor Line (.1,.1,1.0) = {14}; diff --git a/benchmarks/3d/Revolve2.geo b/benchmarks/3d/Revolve2.geo new file mode 100644 index 0000000000000000000000000000000000000000..0c7fb52965b8136750ef8be9c9e6ebd17320adea --- /dev/null +++ b/benchmarks/3d/Revolve2.geo @@ -0,0 +1,30 @@ +lc = .3; +Point(2) = {3.0,-1.0,0.0,lc}; +Point(3) = {1,-1,0.0,lc}; +Point(4) = {3,1,0.0,lc}; +Point(5) = {1,1,0.0,lc}; +Line(1) = {4,2}; +Line(2) = {2,3}; +Line(3) = {3,5}; +Line(4) = {5,4}; +Line Loop(5) = {4,1,2,3}; +Plane Surface(6) = {5}; + +Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0}, 3.14159/2); + +Coherence; +Delete { + Surface(6); +} +Delete { + Surface(15); +} +Delete { + Surface(28); +} +Delete { + Surface(23); +} +Delete { + Surface(27); +} diff --git a/benchmarks/3d/Revolve3.geo b/benchmarks/3d/Revolve3.geo new file mode 100644 index 0000000000000000000000000000000000000000..2e3d6dafe4889402b836eb1aa849eb27c504243c --- /dev/null +++ b/benchmarks/3d/Revolve3.geo @@ -0,0 +1,8 @@ +Point(1) = {0.0,0.0,0.0,.2}; +Point(2) = {1,1,0.0,.2}; +Point(3) = {2,1.2,0.0,.2}; +Point(4) = {3,0,0.0,.2}; +Point(5) = {4,1,0.0,.2}; +CatmullRom(1) = {1,2,3,4,5}; +Extrude Line(1, {0.0,1,0}, {-1,0.0,0.0}, 3.14159/2); +Coherence; diff --git a/benchmarks/3d/Splere.geo b/benchmarks/3d/Splere.geo new file mode 100644 index 0000000000000000000000000000000000000000..ad2efdc8fae7fc9a5ded1b1baf4237f33d2afb9e --- /dev/null +++ b/benchmarks/3d/Splere.geo @@ -0,0 +1,38 @@ +lc = .1; +Point(1) = {0.0,0.0,0.0,lc}; +Point(2) = {1,0.0,0.0,lc}; +Point(3) = {0,1,0.0,lc}; +Circle(1) = {2,1,3}; +Point(4) = {-1,0,0.0,lc}; +Point(5) = {0,-1,0.0,lc}; +Circle(2) = {3,1,4}; +Circle(3) = {4,1,5}; +Circle(4) = {5,1,2}; +Point(6) = {0,0,-1,lc}; +Point(7) = {0,0,1,lc}; +Circle(5) = {3,1,6}; +Circle(6) = {6,1,5}; +Circle(7) = {5,1,7}; +Circle(8) = {7,1,3}; +Circle(9) = {2,1,7}; +Circle(10) = {7,1,4}; +Circle(11) = {4,1,6}; +Circle(12) = {6,1,2}; +Line Loop(13) = {-2,-8,10}; +Ruled Surface(14) = {13}; +Line Loop(15) = {10,3,7}; +Ruled Surface(16) = {15}; +Line Loop(17) = {-8,-9,1}; +Ruled Surface(18) = {17}; +Line Loop(19) = {-11,-2,5}; +Ruled Surface(20) = {19}; +Line Loop(21) = {5,12,1}; +Ruled Surface(22) = {21}; +Line Loop(23) = {-3,11,6}; +Ruled Surface(24) = {23}; +Line Loop(25) = {-7,4,9}; +Ruled Surface(26) = {25}; +Line Loop(27) = {4,-12,6}; +Ruled Surface(28) = {27}; +Surface Loop(29) = {28,26,16,14,20,24,22,18}; +Complex Volume(30) = {29}; diff --git a/benchmarks/3d/Torus-Attr.geo b/benchmarks/3d/Torus-Attr.geo new file mode 100644 index 0000000000000000000000000000000000000000..38ef03dd482d97e171adfe22f5db49320ffa68db --- /dev/null +++ b/benchmarks/3d/Torus-Attr.geo @@ -0,0 +1,18 @@ +lc = .2; +Point(1) = {2.0,0.0,0.0,lc}; +Point(2) = {2.0,1,0.0,lc}; +Point(3) = {1,0,0.0,lc}; +Point(4) = {3,0,0.0,lc}; +Point(5) = {2,-1,0.0,lc}; +Circle(1) = {4,1,2}; + +Circle(2) = {2,1,3}; +Circle(3) = {3,1,5}; +Circle(4) = {5,1,4}; +Line Loop(5) = {4,1,2,3}; +Plane Surface(6) = {5}; + +Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0}, 1.5*3.14159/2); + +Coherence; +Attractor Line (1,.1,2.0) = {22}; diff --git a/benchmarks/3d/Torus-ExtrMesh.geo b/benchmarks/3d/Torus-ExtrMesh.geo new file mode 100644 index 0000000000000000000000000000000000000000..5db300b7a0e1bd9f7fe180e374b79a0ec402d07d --- /dev/null +++ b/benchmarks/3d/Torus-ExtrMesh.geo @@ -0,0 +1,28 @@ +lc = .2; +Point(1) = {2.0,0.0,0.0,lc}; +Point(2) = {2.0,1,0.0,lc}; +Point(3) = {1,0,0.0,lc}; +Point(4) = {3,0,0.0,lc}; +Point(5) = {2,-1,0.0,lc}; +Circle(1) = {4,1,2}; + +Circle(2) = {2,1,3}; +Circle(3) = {3,1,5}; +Circle(4) = {5,1,4}; +Line Loop(5) = {4,1,2,3}; +Plane Surface(6) = {5}; + +Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0}, 3.14159/2) +{ + Layers {{10,25,10},{11,22,11},{.1,.9,1.}} ; +} ; + +Coherence; +Extrude Surface (6, {0,0.0,2}) ; +Surface Loop(51) = {6,37,41,45,49,50}; +Complex Volume(52) = {51}; +Extrude Surface (45, {0,2,0.0}) +{ + Layers {{10,25,10},{111,222,111},{.1,.9,1.}}; +} ; +Coherence; diff --git a/benchmarks/3d/Torus.geo b/benchmarks/3d/Torus.geo new file mode 100644 index 0000000000000000000000000000000000000000..a2c5e9fbabb9b2f90f978e3224f4a4b46b76556b --- /dev/null +++ b/benchmarks/3d/Torus.geo @@ -0,0 +1,17 @@ +lc = .2; +Point(1) = {2.0,0.0,0.0,lc}; +Point(2) = {2.0,1,0.0,lc}; +Point(3) = {1,0,0.0,lc}; +Point(4) = {3,0,0.0,lc}; +Point(5) = {2,-1,0.0,lc}; +Circle(1) = {4,1,2}; + +Circle(2) = {2,1,3}; +Circle(3) = {3,1,5}; +Circle(4) = {5,1,4}; +Line Loop(5) = {4,1,2,3}; +Plane Surface(6) = {5}; + +Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0}, 1*3.14159/2); + +Coherence; diff --git a/benchmarks/3d/aa b/benchmarks/3d/aa new file mode 100644 index 0000000000000000000000000000000000000000..46f3fc19f0aa2599dec07b5a6e19605e280f878c --- /dev/null +++ b/benchmarks/3d/aa @@ -0,0 +1,1711 @@ +%!PS-Adobe-3.0 +%%LanguageLevel: 1 +%%Title: Cube-01 +%%Creator: Gmsh +%%Pages: (atend) +%%EndComments +%%BeginProlog +% RGB color command - r g b C +/C { setrgbcolor } bind def +% Font choose - size fontname FC +/FC { findfont exch scalefont setfont } bind def +% String primitive - (string) x y r g b size fontname S +/S { FC C moveto show } bind def +% Point primitive - x y r g b P +/P { C newpath 0.5 0.0 360.0 arc closepath fill } bind def +% Flat-shaded line - x2 y2 x1 y1 r g b L +/L { C newpath moveto lineto stroke } bind def +% Smooth-shaded line - x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 SL +/SL { +/b1 exch def +/g1 exch def +/r1 exch def +/y1 exch def +/x1 exch def +/b2 exch def +/g2 exch def +/r2 exch def +/y2 exch def +/x2 exch def +b2 b1 sub abs 0.01 gt +g2 g1 sub abs 0.005 gt +r2 r1 sub abs 0.008 gt +or or { +/bm b1 b2 add 0.5 mul def +/gm g1 g2 add 0.5 mul def +/rm r1 r2 add 0.5 mul def +/ym y1 y2 add 0.5 mul def +/xm x1 x2 add 0.5 mul def +x1 y1 r1 g1 b1 xm ym rm gm bm SL +xm ym rm gm bm x2 y2 r2 g2 b2 SL +} { +x1 y1 x2 y2 r1 g1 b1 L +} ifelse +} bind def +% Flat-shaded triangle - x3 y3 x2 y2 x1 y1 r g b T +/T { C newpath moveto lineto lineto closepath fill } bind def +% Smooth-shaded triangle - x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST +/ST { +/b1 exch def +/g1 exch def +/r1 exch def +/y1 exch def +/x1 exch def +/b2 exch def +/g2 exch def +/r2 exch def +/y2 exch def +/x2 exch def +/b3 exch def +/g3 exch def +/r3 exch def +/y3 exch def +/x3 exch def +b2 b1 sub abs 0.05 gt +g2 g1 sub abs 0.017 gt +r2 r1 sub abs 0.032 gt +b3 b1 sub abs 0.05 gt +g3 g1 sub abs 0.017 gt +r3 r1 sub abs 0.032 gt +b2 b3 sub abs 0.05 gt +g2 g3 sub abs 0.017 gt +r2 r3 sub abs 0.032 gt +or or or or or or or or { +/b12 b1 b2 add 0.5 mul def +/g12 g1 g2 add 0.5 mul def +/r12 r1 r2 add 0.5 mul def +/y12 y1 y2 add 0.5 mul def +/x12 x1 x2 add 0.5 mul def +/b13 b1 b3 add 0.5 mul def +/g13 g1 g3 add 0.5 mul def +/r13 r1 r3 add 0.5 mul def +/y13 y1 y3 add 0.5 mul def +/x13 x1 x3 add 0.5 mul def +/b32 b3 b2 add 0.5 mul def +/g32 g3 g2 add 0.5 mul def +/r32 r3 r2 add 0.5 mul def +/y32 y3 y2 add 0.5 mul def +/x32 x3 x2 add 0.5 mul def +x1 y1 r1 g1 b1 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13 +x2 y2 r2 g2 b2 x12 y12 r12 g12 b12 x32 y32 r32 g32 b32 +x3 y3 r3 g3 b3 x32 y32 r32 g32 b32 x13 y13 r13 g13 b13 +x32 y32 r32 g32 b32 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13 +ST ST ST ST +} { +x1 y1 x2 y2 x3 y3 r1 g1 b1 T +} ifelse +} bind def +%%EndProlog +%%Page: 1 +%%PageBoundingBox: 0 0 800 579 +gsave +674.644 103.364 549.299 200.303 0 0 1 L +225.3 162.8 549.299 200.303 0 0 1 L +549.299 200.303 549.299 531.789 0 0 1 L +549.299 200.303 0.698039 0.713726 0.505882 P +549.299 200.303 0 0.482353 0.231373 P +549.299 200.303 0 0.482353 0.231373 P +580.635 176.068 549.299 200.303 0 1 0 L +549.299 200.303 517.225 178.596 0 1 0 L +580.635 176.068 549.299 200.303 517.225 178.596 1 0 0 T +517.225 178.596 549.299 200.303 0 1 0 L +549.299 200.303 468.299 190.927 0 1 0 L +549.299 200.303 468.299 190.927 517.225 178.596 1 0 0 T +580.635 176.068 549.299 200.303 0 1 0 L +549.299 200.303 569.537 238.173 0 1 0 L +580.635 176.068 549.299 200.303 569.537 238.173 1 0 0 T +569.537 238.173 549.299 200.303 0 1 0 L +549.299 200.303 549.299 283.174 0 1 0 L +549.299 200.303 549.299 283.174 569.537 238.173 1 0 0 T +496.986 247.769 549.299 200.303 0 1 0 L +549.299 200.303 468.299 190.927 0 1 0 L +549.299 200.303 468.299 190.927 496.986 247.769 1 0 0 T +549.299 283.174 549.299 200.303 0 1 0 L +549.299 200.303 496.986 247.769 0 1 0 L +549.299 283.174 549.299 200.303 496.986 247.769 1 0 0 T +549.299 283.174 0 0.482353 0.231373 P +549.299 283.174 0 0.482353 0.231373 P +569.537 238.173 549.299 283.174 0 1 0 L +549.299 283.174 566.089 304.665 0 1 0 L +569.537 238.173 549.299 283.174 566.089 304.665 1 0 0 T +566.089 304.665 549.299 283.174 0 1 0 L +549.299 283.174 549.299 366.046 0 1 0 L +549.299 283.174 549.299 366.046 566.089 304.665 1 0 0 T +549.299 283.174 569.537 238.173 0 1 0 L +505.899 312.627 549.299 283.174 0 1 0 L +549.299 283.174 496.986 247.769 0 1 0 L +549.299 283.174 496.986 247.769 505.899 312.627 1 0 0 T +549.299 366.046 549.299 283.174 0 1 0 L +549.299 283.174 505.899 312.627 0 1 0 L +549.299 366.046 549.299 283.174 505.899 312.627 1 0 0 T +496.986 247.769 549.299 283.174 0 1 0 L +468.299 190.927 0 0.482353 0.231373 P +468.299 190.927 0 0.482353 0.231373 P +517.225 178.596 468.299 190.927 0 1 0 L +468.299 190.927 451.392 174.042 0 1 0 L +517.225 178.596 468.299 190.927 451.392 174.042 1 0 0 T +451.392 174.042 468.299 190.927 0 1 0 L +468.299 190.927 387.299 181.551 0 1 0 L +468.299 190.927 387.299 181.551 451.392 174.042 1 0 0 T +468.299 190.927 517.225 178.596 0 1 0 L +496.986 247.769 468.299 190.927 0 1 0 L +468.299 190.927 434.602 231.43 0 1 0 L +496.986 247.769 468.299 190.927 434.602 231.43 1 0 0 T +434.602 231.43 468.299 190.927 0 1 0 L +468.299 190.927 387.299 181.551 0 1 0 L +468.299 190.927 387.299 181.551 434.602 231.43 1 0 0 T +468.299 190.927 496.986 247.769 0 1 0 L +496.986 247.769 0 0.482353 0.231373 P +505.899 312.627 496.986 247.769 0 1 0 L +496.986 247.769 454.799 286.048 0 1 0 L +496.986 247.769 454.799 286.048 505.899 312.627 1 0 0 T +496.986 247.769 505.899 312.627 0 1 0 L +454.799 286.048 496.986 247.769 0 1 0 L +496.986 247.769 434.602 231.43 0 1 0 L +454.799 286.048 496.986 247.769 434.602 231.43 1 0 0 T +434.602 231.43 496.986 247.769 0 1 0 L +549.299 366.046 0 0.482353 0.231373 P +549.299 366.046 0 0.482353 0.231373 P +566.089 304.665 549.299 366.046 0 1 0 L +549.299 366.046 576.905 344.696 0 1 0 L +549.299 366.046 576.905 344.696 566.089 304.665 1 0 0 T +549.299 366.046 566.089 304.665 0 1 0 L +576.905 344.696 549.299 366.046 0 1 0 L +549.299 366.046 566.089 401.456 0 1 0 L +576.905 344.696 549.299 366.046 566.089 401.456 1 0 0 T +566.089 401.456 549.299 366.046 0 1 0 L +549.299 366.046 549.299 448.918 0 1 0 L +549.299 366.046 549.299 448.918 566.089 401.456 1 0 0 T +477.942 357.786 549.299 366.046 0 1 0 L +549.299 366.046 505.899 312.627 0 1 0 L +477.942 357.786 549.299 366.046 505.899 312.627 1 0 0 T +505.899 312.627 549.299 366.046 0 1 0 L +505.899 409.418 549.299 366.046 0 1 0 L +549.299 366.046 477.942 357.786 0 1 0 L +549.299 366.046 477.942 357.786 505.899 409.418 1 0 0 T +549.299 448.918 549.299 366.046 0 1 0 L +549.299 366.046 505.899 409.418 0 1 0 L +549.299 448.918 549.299 366.046 505.899 409.418 1 0 0 T +505.899 312.627 0 0.482353 0.231373 P +454.799 286.048 505.899 312.627 0 1 0 L +505.899 312.627 454.799 286.048 0 1 0 L +477.942 357.786 505.899 312.627 0 1 0 L +454.799 286.048 477.942 357.786 505.899 312.627 1 0 0 T +505.899 312.627 477.942 357.786 0 1 0 L +434.602 231.43 0 0.482353 0.231373 P +434.602 231.43 454.799 286.048 0 1 0 L +434.602 231.43 387.299 254.557 0 1 0 L +454.799 286.048 434.602 231.43 0 1 0 L +387.299 254.557 454.799 286.048 434.602 231.43 1 0 0 T +434.602 231.43 387.299 181.551 0 1 0 L +387.299 254.557 434.602 231.43 0 1 0 L +387.299 181.551 387.299 254.557 434.602 231.43 1 0 0 T +387.299 181.551 434.602 231.43 0 1 0 L +387.299 181.551 0 0.482353 0.231373 P +387.299 181.551 0 0.482353 0.231373 P +414.905 160.202 387.299 181.551 0 1 0 L +387.299 181.551 356.787 163.091 0 1 0 L +414.905 160.202 387.299 181.551 356.787 163.091 1 0 0 T +356.787 163.091 387.299 181.551 0 1 0 L +387.299 181.551 306.3 172.176 0 1 0 L +387.299 181.551 306.3 172.176 356.787 163.091 1 0 0 T +451.392 174.042 387.299 181.551 0 1 0 L +387.299 181.551 414.905 160.202 0 1 0 L +387.299 181.551 414.905 160.202 451.392 174.042 1 0 0 T +387.299 181.551 451.392 174.042 0 1 0 L +387.299 254.557 387.299 181.551 0 1 0 L +387.299 181.551 339.997 220.479 0 1 0 L +387.299 254.557 387.299 181.551 339.997 220.479 1 0 0 T +339.997 220.479 387.299 181.551 0 1 0 L +387.299 181.551 306.3 172.176 0 1 0 L +387.299 181.551 306.3 172.176 339.997 220.479 1 0 0 T +387.299 181.551 387.299 254.557 0 1 0 L +454.799 286.048 0 0.482353 0.231373 P +454.799 286.048 477.942 357.786 0 1 0 L +387.299 254.557 454.799 286.048 0 1 0 L +387.299 347.295 454.799 286.048 0 1 0 L +454.799 286.048 387.299 254.557 0 1 0 L +387.299 347.295 454.799 286.048 387.299 254.557 1 0 0 T +477.942 357.786 454.799 286.048 0 1 0 L +454.799 286.048 387.299 347.295 0 1 0 L +454.799 286.048 387.299 347.295 477.942 357.786 1 0 0 T +569.537 238.173 0 0.482353 0.231373 P +585.858 268.712 569.537 238.173 0 1 0 L +569.537 238.173 566.089 304.665 0 1 0 L +585.858 268.712 569.537 238.173 566.089 304.665 1 0 0 T +566.089 304.665 569.537 238.173 0 1 0 L +593.672 210.389 569.537 238.173 0 1 0 L +569.537 238.173 585.858 268.712 0 1 0 L +569.537 238.173 585.858 268.712 593.672 210.389 1 0 0 T +580.635 176.068 569.537 238.173 0 1 0 L +569.537 238.173 593.672 210.389 0 1 0 L +580.635 176.068 569.537 238.173 593.672 210.389 1 0 0 T +569.537 238.173 580.635 176.068 0 1 0 L +517.225 178.596 0 0.482353 0.231373 P +550.272 160.962 517.225 178.596 0 1 0 L +517.225 178.596 491.358 161.091 0 1 0 L +517.225 178.596 491.358 161.091 550.272 160.962 1 0 0 T +580.635 176.068 517.225 178.596 0 1 0 L +517.225 178.596 550.272 160.962 0 1 0 L +580.635 176.068 517.225 178.596 550.272 160.962 1 0 0 T +491.358 161.091 517.225 178.596 0 1 0 L +517.225 178.596 451.392 174.042 0 1 0 L +491.358 161.091 517.225 178.596 451.392 174.042 1 0 0 T +451.392 174.042 517.225 178.596 0 1 0 L +517.225 178.596 580.635 176.068 0 1 0 L +333.273 167.011 317.073 181.71 1 1 0 L +580.635 176.068 0 0.482353 0.231373 P +580.635 176.068 0 0.482353 0.231373 P +550.272 160.962 580.635 176.068 0 1 0 L +611.972 151.833 580.635 176.068 0 1 0 L +580.635 176.068 550.272 160.962 0 1 0 L +611.972 151.833 580.635 176.068 550.272 160.962 1 0 0 T +593.672 210.389 580.635 176.068 0 1 0 L +611.972 151.833 580.635 176.068 0 1 0 L +580.635 176.068 593.672 210.389 0 1 0 L +611.972 151.833 580.635 176.068 593.672 210.389 1 0 0 T +322.039 185.071 328.306 163.65 1 1 0 L +549.299 448.918 0 0.482353 0.231373 P +549.299 448.918 0 0.482353 0.231373 P +566.089 401.456 549.299 448.918 0 1 0 L +549.299 448.918 569.537 462.616 0 1 0 L +549.299 448.918 569.537 462.616 566.089 401.456 1 0 0 T +549.299 448.918 566.089 401.456 0 1 0 L +569.537 462.616 549.299 448.918 0 1 0 L +549.299 448.918 549.299 531.789 0 1 0 L +549.299 448.918 549.299 531.789 569.537 462.616 1 0 0 T +496.986 472.213 549.299 448.918 0 1 0 L +549.299 448.918 505.899 409.418 0 1 0 L +496.986 472.213 549.299 448.918 505.899 409.418 1 0 0 T +505.899 409.418 549.299 448.918 0 1 0 L +549.299 531.789 549.299 448.918 0 1 0 L +549.299 448.918 496.986 472.213 0 1 0 L +549.299 531.789 549.299 448.918 496.986 472.213 1 0 0 T +566.089 304.665 0 0.482353 0.231373 P +566.089 304.665 585.858 268.712 0 1 0 L +566.089 304.665 576.905 344.696 0 1 0 L +585.858 268.712 566.089 304.665 0 1 0 L +576.905 344.696 585.858 268.712 566.089 304.665 1 0 0 T +576.905 344.696 566.089 304.665 0 1 0 L +477.942 357.786 0 0.482353 0.231373 P +505.899 409.418 477.942 357.786 0 1 0 L +477.942 357.786 454.799 424.167 0 1 0 L +477.942 357.786 454.799 424.167 505.899 409.418 1 0 0 T +477.942 357.786 505.899 409.418 0 1 0 L +477.942 357.786 387.299 347.295 0 1 0 L +454.799 424.167 477.942 357.786 0 1 0 L +387.299 347.295 454.799 424.167 477.942 357.786 1 0 0 T +387.299 347.295 477.942 357.786 0 1 0 L +387.299 254.557 0 0.482353 0.231373 P +319.8 270.422 387.299 254.557 0 1 0 L +387.299 254.557 339.997 220.479 0 1 0 L +319.8 270.422 387.299 254.557 339.997 220.479 1 0 0 T +339.997 220.479 387.299 254.557 0 1 0 L +387.299 254.557 387.299 347.295 0 1 0 L +387.299 254.557 319.8 270.422 0 1 0 L +387.299 347.295 387.299 254.557 0 1 0 L +319.8 270.422 387.299 347.295 387.299 254.557 1 0 0 T +505.899 409.418 0 0.482353 0.231373 P +505.899 409.418 454.799 424.167 0 1 0 L +496.986 472.213 505.899 409.418 0 1 0 L +454.799 424.167 496.986 472.213 505.899 409.418 1 0 0 T +454.799 424.167 505.899 409.418 0 1 0 L +505.899 409.418 496.986 472.213 0 1 0 L +451.392 174.042 0 0.482353 0.231373 P +451.392 174.042 491.358 161.091 0 1 0 L +451.392 174.042 414.905 160.202 0 1 0 L +491.358 161.091 451.392 174.042 0 1 0 L +414.905 160.202 491.358 161.091 451.392 174.042 1 0 0 T +414.905 160.202 451.392 174.042 0 1 0 L +306.3 172.176 225.3 162.8 1 1 0 L +306.3 172.176 0 0.482353 0.231373 P +306.3 172.176 0 0.482353 0.231373 P +356.787 163.091 306.3 172.176 0 1 0 L +306.3 172.176 297.85 153.204 0 1 0 L +306.3 172.176 297.85 153.204 356.787 163.091 1 0 0 T +306.3 172.176 356.787 163.091 0 1 0 L +297.85 153.204 306.3 172.176 0 1 0 L +306.3 172.176 225.3 162.8 0 1 0 L +306.3 172.176 225.3 162.8 297.85 153.204 1 0 0 T +339.997 220.479 306.3 172.176 0 1 0 L +306.3 172.176 277.612 222.376 0 1 0 L +306.3 172.176 277.612 222.376 339.997 220.479 1 0 0 T +306.3 172.176 339.997 220.479 0 1 0 L +277.612 222.376 306.3 172.176 0 1 0 L +306.3 172.176 225.3 162.8 0 1 0 L +306.3 172.176 225.3 162.8 277.612 222.376 1 0 0 T +339.997 220.479 0 0.482353 0.231373 P +339.997 220.479 277.612 222.376 0 1 0 L +319.8 270.422 339.997 220.479 0 1 0 L +277.612 222.376 319.8 270.422 339.997 220.479 1 0 0 T +339.997 220.479 319.8 270.422 0 1 0 L +277.612 222.376 339.997 220.479 0 1 0 L +279.246 169.044 279.246 224.237 1 1 0 L +300.116 152.904 279.246 169.044 1 1 0 L +674.644 434.85 549.299 531.789 0 0 1 L +549.299 531.789 225.3 494.286 0 0 1 L +549.299 531.789 0.698039 0.713726 0.505882 P +549.299 531.789 0 0.482353 0.231373 P +549.299 531.789 0 0.482353 0.231373 P +580.635 507.554 549.299 531.789 0 1 0 L +549.299 531.789 517.225 510.082 0 1 0 L +580.635 507.554 549.299 531.789 517.225 510.082 1 0 0 T +517.225 510.082 549.299 531.789 0 1 0 L +549.299 531.789 468.299 522.413 0 1 0 L +549.299 531.789 468.299 522.413 517.225 510.082 1 0 0 T +569.537 462.616 549.299 531.789 0 1 0 L +549.299 531.789 580.635 507.554 0 1 0 L +549.299 531.789 580.635 507.554 569.537 462.616 1 0 0 T +549.299 531.789 569.537 462.616 0 1 0 L +496.986 472.213 549.299 531.789 0 1 0 L +468.299 522.413 549.299 531.789 0 1 0 L +549.299 531.789 496.986 472.213 0 1 0 L +468.299 522.413 549.299 531.789 496.986 472.213 1 0 0 T +496.986 472.213 0 0.482353 0.231373 P +434.602 474.11 496.986 472.213 0 1 0 L +496.986 472.213 454.799 424.167 0 1 0 L +496.986 472.213 454.799 424.167 434.602 474.11 1 0 0 T +468.299 522.413 496.986 472.213 0 1 0 L +496.986 472.213 434.602 474.11 0 1 0 L +468.299 522.413 496.986 472.213 434.602 474.11 1 0 0 T +454.799 424.167 496.986 472.213 0 1 0 L +496.986 472.213 468.299 522.413 0 1 0 L +454.799 424.167 0 0.482353 0.231373 P +454.799 424.167 434.602 474.11 0 1 0 L +434.602 474.11 454.799 424.167 0 1 0 L +454.799 424.167 387.299 440.032 0 1 0 L +454.799 424.167 387.299 440.032 434.602 474.11 1 0 0 T +387.299 440.032 454.799 424.167 0 1 0 L +454.799 424.167 387.299 347.295 0 1 0 L +454.799 424.167 387.299 347.295 387.299 440.032 1 0 0 T +387.299 347.295 454.799 424.167 0 1 0 L +566.089 401.456 0 0.482353 0.231373 P +566.089 401.456 569.537 462.616 0 1 0 L +585.858 406.832 566.089 401.456 0 1 0 L +569.537 462.616 585.858 406.832 566.089 401.456 1 0 0 T +566.089 401.456 585.858 406.832 0 1 0 L +576.905 344.696 566.089 401.456 0 1 0 L +585.858 406.832 576.905 344.696 566.089 401.456 1 0 0 T +566.089 401.456 576.905 344.696 0 1 0 L +569.537 462.616 566.089 401.456 0 1 0 L +387.299 347.295 0 0.482353 0.231373 P +387.299 347.295 387.299 440.032 0 1 0 L +387.299 440.032 387.299 347.295 0 1 0 L +387.299 347.295 319.8 408.541 0 1 0 L +387.299 347.295 319.8 408.541 387.299 440.032 1 0 0 T +296.657 336.803 387.299 347.295 0 1 0 L +387.299 347.295 319.8 270.422 0 1 0 L +387.299 347.295 319.8 270.422 296.657 336.803 1 0 0 T +319.8 408.541 387.299 347.295 0 1 0 L +387.299 347.295 296.657 336.803 0 1 0 L +319.8 408.541 387.299 347.295 296.657 336.803 1 0 0 T +319.8 270.422 387.299 347.295 0 1 0 L +319.8 270.422 0 0.482353 0.231373 P +277.612 222.376 319.8 270.422 0 1 0 L +268.7 285.171 319.8 270.422 0 1 0 L +319.8 270.422 277.612 222.376 0 1 0 L +319.8 270.422 277.612 222.376 268.7 285.171 1 0 0 T +296.657 336.803 319.8 270.422 0 1 0 L +319.8 270.422 268.7 285.171 0 1 0 L +296.657 336.803 319.8 270.422 268.7 285.171 1 0 0 T +319.8 270.422 296.657 336.803 0 1 0 L +279.246 224.237 225.3 217.992 1 1 0 L +277.612 222.376 0 0.482353 0.231373 P +277.612 222.376 268.7 285.171 0 1 0 L +268.7 285.171 277.612 222.376 0 1 0 L +277.612 222.376 225.3 245.672 0 1 0 L +277.612 222.376 225.3 245.672 268.7 285.171 1 0 0 T +277.612 222.376 225.3 162.8 0 1 0 L +225.3 245.672 277.612 222.376 0 1 0 L +225.3 162.8 225.3 245.672 277.612 222.376 1 0 0 T +225.3 162.8 277.612 222.376 0 1 0 L +356.787 163.091 0 0.482353 0.231373 P +356.787 163.091 297.85 153.204 0 1 0 L +356.359 145.464 356.787 163.091 0 1 0 L +297.85 153.204 356.359 145.464 356.787 163.091 1 0 0 T +356.787 163.091 356.359 145.464 0 1 0 L +414.905 160.202 356.787 163.091 0 1 0 L +356.359 145.464 414.905 160.202 356.787 163.091 1 0 0 T +297.85 153.204 356.787 163.091 0 1 0 L +356.787 163.091 414.905 160.202 0 1 0 L +765.824 26.6287 755 35 1 1 1 L +755 63.6257 755 35 1 1 1 L +782.979 38.2386 755 35 1 1 1 L +(Z) 767.824 28.6287 1 1 1 9 /Helvetica S +(Y) 757 65.6258 1 1 1 9 /Helvetica S +(X) 784.979 40.2386 1 1 1 9 /Helvetica S +256.636 138.565 225.3 162.8 1 1 0 L +225.3 245.672 225.3 162.8 1 1 0 L +350.646 65.8608 225.3 162.8 0 0 1 L +225.3 494.286 225.3 162.8 0 0 1 L +225.3 162.8 0.698039 0.713726 0.505882 P +225.3 162.8 0 0.482353 0.231373 P +225.3 162.8 0 0.482353 0.231373 P +256.636 138.565 225.3 162.8 0 1 0 L +225.3 162.8 245.538 200.67 0 1 0 L +256.636 138.565 225.3 162.8 245.538 200.67 1 0 0 T +245.538 200.67 225.3 162.8 0 1 0 L +225.3 162.8 225.3 245.672 0 1 0 L +225.3 162.8 225.3 245.672 245.538 200.67 1 0 0 T +297.85 153.204 225.3 162.8 0 1 0 L +225.3 162.8 256.636 138.565 0 1 0 L +225.3 162.8 256.636 138.565 297.85 153.204 1 0 0 T +225.3 162.8 297.85 153.204 0 1 0 L +225.3 162.8 225.3 245.672 0 1 0 L +576.905 344.696 0 0.482353 0.231373 P +576.905 344.696 585.858 268.712 0 1 0 L +585.858 406.832 576.905 344.696 0 1 0 L +576.905 344.696 611.972 317.576 0 1 0 L +585.858 268.712 576.905 344.696 0 1 0 L +611.972 317.576 585.858 268.712 576.905 344.696 1 0 0 T +576.905 344.696 585.858 406.832 0 1 0 L +611.972 317.576 576.905 344.696 0 1 0 L +585.858 406.832 611.972 317.576 576.905 344.696 1 0 0 T +585.858 268.712 0 0.482353 0.231373 P +585.858 268.712 593.672 210.389 0 1 0 L +593.672 210.389 585.858 268.712 0 1 0 L +585.858 268.712 611.972 224.839 0 1 0 L +585.858 268.712 611.972 224.839 593.672 210.389 1 0 0 T +611.972 224.839 585.858 268.712 0 1 0 L +585.858 268.712 611.972 317.576 0 1 0 L +585.858 268.712 611.972 317.576 611.972 224.839 1 0 0 T +611.972 317.576 585.858 268.712 0 1 0 L +593.672 210.389 0 0.482353 0.231373 P +611.972 224.839 593.672 210.389 0 1 0 L +593.672 210.389 611.972 224.839 0 1 0 L +611.972 151.833 593.672 210.389 0 1 0 L +611.972 224.839 611.972 151.833 593.672 210.389 1 0 0 T +593.672 210.389 611.972 151.833 0 1 0 L +491.358 161.091 0 0.482353 0.231373 P +491.358 161.091 550.272 160.962 0 1 0 L +550.272 160.962 491.358 161.091 0 1 0 L +491.358 161.091 540.615 143.574 0 1 0 L +491.358 161.091 540.615 143.574 550.272 160.962 1 0 0 T +414.905 160.202 491.358 161.091 0 1 0 L +540.615 143.574 491.358 161.091 0 1 0 L +491.358 161.091 449.972 133.082 0 1 0 L +491.358 161.091 449.972 133.082 540.615 143.574 1 0 0 T +449.972 133.082 491.358 161.091 0 1 0 L +491.358 161.091 414.905 160.202 0 1 0 L +449.972 133.082 491.358 161.091 414.905 160.202 1 0 0 T +550.272 160.962 0 0.482353 0.231373 P +540.615 143.574 550.272 160.962 0 1 0 L +550.272 160.962 540.615 143.574 0 1 0 L +611.972 151.833 550.272 160.962 0 1 0 L +540.615 143.574 611.972 151.833 550.272 160.962 1 0 0 T +550.272 160.962 611.972 151.833 0 1 0 L +414.905 160.202 0 0.482353 0.231373 P +356.359 145.464 414.905 160.202 0 1 0 L +414.905 160.202 356.359 145.464 0 1 0 L +449.972 133.082 414.905 160.202 0 1 0 L +356.359 145.464 449.972 133.082 414.905 160.202 1 0 0 T +414.905 160.202 449.972 133.082 0 1 0 L +434.602 474.11 0 0.482353 0.231373 P +387.299 440.032 434.602 474.11 0 1 0 L +434.602 474.11 468.299 522.413 0 1 0 L +434.602 474.11 387.299 440.032 0 1 0 L +387.299 513.038 434.602 474.11 0 1 0 L +387.299 440.032 387.299 513.038 434.602 474.11 1 0 0 T +434.602 474.11 387.299 513.038 0 1 0 L +468.299 522.413 434.602 474.11 0 1 0 L +387.299 513.038 468.299 522.413 434.602 474.11 1 0 0 T +468.299 522.413 0 0.482353 0.231373 P +468.299 522.413 0 0.482353 0.231373 P +517.225 510.082 468.299 522.413 0 1 0 L +468.299 522.413 451.392 505.528 0 1 0 L +517.225 510.082 468.299 522.413 451.392 505.528 1 0 0 T +451.392 505.528 468.299 522.413 0 1 0 L +468.299 522.413 387.299 513.038 0 1 0 L +468.299 522.413 387.299 513.038 451.392 505.528 1 0 0 T +468.299 522.413 517.225 510.082 0 1 0 L +387.299 513.038 468.299 522.413 0 1 0 L +225.3 217.992 246.17 201.852 1 1 0 L +569.537 462.616 0 0.482353 0.231373 P +585.858 406.832 569.537 462.616 0 1 0 L +569.537 462.616 593.672 453.069 0 1 0 L +585.858 406.832 569.537 462.616 593.672 453.069 1 0 0 T +593.672 453.069 569.537 462.616 0 1 0 L +569.537 462.616 580.635 507.554 0 1 0 L +569.537 462.616 580.635 507.554 593.672 453.069 1 0 0 T +569.537 462.616 585.858 406.832 0 1 0 L +580.635 507.554 569.537 462.616 0 1 0 L +268.7 285.171 0 0.482353 0.231373 P +268.7 285.171 296.657 336.803 0 1 0 L +268.7 285.171 225.3 328.543 0 1 0 L +296.657 336.803 268.7 285.171 0 1 0 L +225.3 328.543 296.657 336.803 268.7 285.171 1 0 0 T +225.3 245.672 268.7 285.171 0 1 0 L +268.7 285.171 225.3 245.672 0 1 0 L +225.3 328.543 268.7 285.171 0 1 0 L +225.3 245.672 225.3 328.543 268.7 285.171 1 0 0 T +387.299 440.032 0 0.482353 0.231373 P +387.299 440.032 387.299 513.038 0 1 0 L +339.997 463.159 387.299 440.032 0 1 0 L +387.299 440.032 319.8 408.541 0 1 0 L +387.299 440.032 319.8 408.541 339.997 463.159 1 0 0 T +387.299 513.038 387.299 440.032 0 1 0 L +387.299 440.032 339.997 463.159 0 1 0 L +387.299 513.038 387.299 440.032 339.997 463.159 1 0 0 T +319.8 408.541 387.299 440.032 0 1 0 L +296.657 336.803 0 0.482353 0.231373 P +319.8 408.541 296.657 336.803 0 1 0 L +296.657 336.803 268.7 381.962 0 1 0 L +319.8 408.541 296.657 336.803 268.7 381.962 1 0 0 T +268.7 381.962 296.657 336.803 0 1 0 L +296.657 336.803 225.3 328.543 0 1 0 L +296.657 336.803 225.3 328.543 268.7 381.962 1 0 0 T +225.3 328.543 296.657 336.803 0 1 0 L +296.657 336.803 319.8 408.541 0 1 0 L +225.3 245.672 0 0.482353 0.231373 P +225.3 245.672 0 0.482353 0.231373 P +245.538 200.67 225.3 245.672 0 1 0 L +225.3 245.672 242.09 267.162 0 1 0 L +245.538 200.67 225.3 245.672 242.09 267.162 1 0 0 T +242.09 267.162 225.3 245.672 0 1 0 L +225.3 245.672 225.3 328.543 0 1 0 L +225.3 245.672 225.3 328.543 242.09 267.162 1 0 0 T +225.3 245.672 245.538 200.67 0 1 0 L +225.3 245.672 225.3 328.543 0 1 0 L +222.166 275.691 225.3 264.981 1 1 0 L +297.85 153.204 0 0.482353 0.231373 P +297.85 153.204 356.359 145.464 0 1 0 L +356.359 145.464 297.85 153.204 0 1 0 L +297.85 153.204 313.073 133.507 0 1 0 L +356.359 145.464 297.85 153.204 313.073 133.507 1 0 0 T +313.073 133.507 297.85 153.204 0 1 0 L +297.85 153.204 256.636 138.565 0 1 0 L +297.85 153.204 256.636 138.565 313.073 133.507 1 0 0 T +256.636 138.565 297.85 153.204 0 1 0 L +246.17 146.66 300.116 152.904 1 1 0 L +230.917 255.951 225.3 264.981 1 1 0 L +225.3 264.981 217.2 272.33 1 1 0 L +611.972 151.833 0 0.482353 0.231373 P +611.972 151.833 0 0.482353 0.231373 P +586.871 132.657 611.972 151.833 0 1 0 L +611.972 151.833 540.615 143.574 0 1 0 L +611.972 151.833 540.615 143.574 586.871 132.657 1 0 0 T +643.308 127.599 611.972 151.833 0 1 0 L +611.972 151.833 586.871 132.657 0 1 0 L +643.308 127.599 611.972 151.833 586.871 132.657 1 0 0 T +540.615 143.574 611.972 151.833 0 1 0 L +630.272 182.084 611.972 151.833 0 1 0 L +611.972 151.833 611.972 224.839 0 1 0 L +611.972 151.833 611.972 224.839 630.272 182.084 1 0 0 T +643.308 127.599 611.972 151.833 0 1 0 L +611.972 151.833 630.272 182.084 0 1 0 L +643.308 127.599 611.972 151.833 630.272 182.084 1 0 0 T +611.972 224.839 611.972 151.833 0 1 0 L +319.8 408.541 0 0.482353 0.231373 P +277.612 446.82 319.8 408.541 0 1 0 L +319.8 408.541 268.7 381.962 0 1 0 L +277.612 446.82 319.8 408.541 268.7 381.962 1 0 0 T +268.7 381.962 319.8 408.541 0 1 0 L +339.997 463.159 319.8 408.541 0 1 0 L +319.8 408.541 277.612 446.82 0 1 0 L +319.8 408.541 277.612 446.82 339.997 463.159 1 0 0 T +319.8 408.541 339.997 463.159 0 1 0 L +387.299 513.038 0 0.482353 0.231373 P +387.299 513.038 0 0.482353 0.231373 P +451.392 505.528 387.299 513.038 0 1 0 L +387.299 513.038 414.905 491.688 0 1 0 L +387.299 513.038 414.905 491.688 451.392 505.528 1 0 0 T +387.299 513.038 451.392 505.528 0 1 0 L +414.905 491.688 387.299 513.038 0 1 0 L +387.299 513.038 356.787 494.577 0 1 0 L +414.905 491.688 387.299 513.038 356.787 494.577 1 0 0 T +356.787 494.577 387.299 513.038 0 1 0 L +387.299 513.038 306.3 503.662 0 1 0 L +387.299 513.038 306.3 503.662 356.787 494.577 1 0 0 T +339.997 463.159 387.299 513.038 0 1 0 L +306.3 503.662 387.299 513.038 0 1 0 L +387.299 513.038 339.997 463.159 0 1 0 L +306.3 503.662 387.299 513.038 339.997 463.159 1 0 0 T +585.858 406.832 0 0.482353 0.231373 P +593.672 453.069 585.858 406.832 0 1 0 L +611.972 410.314 585.858 406.832 0 1 0 L +585.858 406.832 593.672 453.069 0 1 0 L +611.972 410.314 585.858 406.832 593.672 453.069 1 0 0 T +611.972 317.576 585.858 406.832 0 1 0 L +585.858 406.832 611.972 410.314 0 1 0 L +611.972 317.576 585.858 406.832 611.972 410.314 1 0 0 T +585.858 406.832 611.972 317.576 0 1 0 L +339.997 463.159 0 0.482353 0.231373 P +277.612 446.82 339.997 463.159 0 1 0 L +339.997 463.159 277.612 446.82 0 1 0 L +306.3 503.662 339.997 463.159 0 1 0 L +277.612 446.82 306.3 503.662 339.997 463.159 1 0 0 T +339.997 463.159 306.3 503.662 0 1 0 L +268.7 381.962 0 0.482353 0.231373 P +268.7 381.962 277.612 446.82 0 1 0 L +268.7 381.962 225.3 411.415 0 1 0 L +277.612 446.82 268.7 381.962 0 1 0 L +225.3 411.415 277.612 446.82 268.7 381.962 1 0 0 T +225.3 328.543 268.7 381.962 0 1 0 L +268.7 381.962 225.3 328.543 0 1 0 L +225.3 411.415 268.7 381.962 0 1 0 L +225.3 328.543 225.3 411.415 268.7 381.962 1 0 0 T +246.17 201.852 246.17 146.66 1 1 0 L +225.3 328.543 0 0.482353 0.231373 P +225.3 328.543 0 0.482353 0.231373 P +252.906 307.193 225.3 328.543 0 1 0 L +225.3 328.543 242.09 363.953 0 1 0 L +252.906 307.193 225.3 328.543 242.09 363.953 1 0 0 T +242.09 363.953 225.3 328.543 0 1 0 L +225.3 328.543 225.3 411.415 0 1 0 L +225.3 328.543 225.3 411.415 242.09 363.953 1 0 0 T +242.09 267.162 225.3 328.543 0 1 0 L +225.3 328.543 252.906 307.193 0 1 0 L +225.3 328.543 252.906 307.193 242.09 267.162 1 0 0 T +225.3 328.543 242.09 267.162 0 1 0 L +225.3 328.543 225.3 411.415 0 1 0 L +517.225 510.082 0 0.482353 0.231373 P +491.358 492.577 517.225 510.082 0 1 0 L +517.225 510.082 451.392 505.528 0 1 0 L +491.358 492.577 517.225 510.082 451.392 505.528 1 0 0 T +451.392 505.528 517.225 510.082 0 1 0 L +550.272 492.449 517.225 510.082 0 1 0 L +517.225 510.082 491.358 492.577 0 1 0 L +517.225 510.082 491.358 492.577 550.272 492.449 1 0 0 T +580.635 507.554 517.225 510.082 0 1 0 L +517.225 510.082 550.272 492.449 0 1 0 L +580.635 507.554 517.225 510.082 550.272 492.449 1 0 0 T +517.225 510.082 580.635 507.554 0 1 0 L +356.359 145.464 0 0.482353 0.231373 P +313.073 133.507 356.359 145.464 0 1 0 L +359.33 122.59 356.359 145.464 0 1 0 L +356.359 145.464 313.073 133.507 0 1 0 L +359.33 122.59 356.359 145.464 313.073 133.507 1 0 0 T +449.972 133.082 356.359 145.464 0 1 0 L +356.359 145.464 359.33 122.59 0 1 0 L +449.972 133.082 356.359 145.464 359.33 122.59 1 0 0 T +356.359 145.464 449.972 133.082 0 1 0 L +611.972 224.839 0 0.482353 0.231373 P +630.272 182.084 611.972 224.839 0 1 0 L +611.972 224.839 638.085 228.321 0 1 0 L +611.972 224.839 638.085 228.321 630.272 182.084 1 0 0 T +611.972 224.839 630.272 182.084 0 1 0 L +611.972 224.839 611.972 317.576 0 1 0 L +638.085 228.321 611.972 224.839 0 1 0 L +611.972 317.576 638.085 228.321 611.972 224.839 1 0 0 T +611.972 317.576 611.972 224.839 0 1 0 L +540.615 143.574 0 0.482353 0.231373 P +586.871 132.657 540.615 143.574 0 1 0 L +540.615 143.574 543.586 120.699 0 1 0 L +540.615 143.574 543.586 120.699 586.871 132.657 1 0 0 T +540.615 143.574 586.871 132.657 0 1 0 L +540.615 143.574 449.972 133.082 0 1 0 L +543.586 120.699 540.615 143.574 0 1 0 L +449.972 133.082 543.586 120.699 540.615 143.574 1 0 0 T +449.972 133.082 540.615 143.574 0 1 0 L +580.635 507.554 0 0.482353 0.231373 P +580.635 507.554 0 0.482353 0.231373 P +550.272 492.449 580.635 507.554 0 1 0 L +611.972 483.32 580.635 507.554 0 1 0 L +580.635 507.554 550.272 492.449 0 1 0 L +611.972 483.32 580.635 507.554 550.272 492.449 1 0 0 T +580.635 507.554 593.672 453.069 0 1 0 L +593.672 453.069 580.635 507.554 0 1 0 L +580.635 507.554 611.972 483.32 0 1 0 L +580.635 507.554 611.972 483.32 593.672 453.069 1 0 0 T +245.538 200.67 0 0.482353 0.231373 P +261.859 231.21 245.538 200.67 0 1 0 L +245.538 200.67 242.09 267.162 0 1 0 L +261.859 231.21 245.538 200.67 242.09 267.162 1 0 0 T +242.09 267.162 245.538 200.67 0 1 0 L +269.673 172.886 245.538 200.67 0 1 0 L +245.538 200.67 261.859 231.21 0 1 0 L +245.538 200.67 261.859 231.21 269.673 172.886 1 0 0 T +256.636 138.565 245.538 200.67 0 1 0 L +245.538 200.67 269.673 172.886 0 1 0 L +256.636 138.565 245.538 200.67 269.673 172.886 1 0 0 T +245.538 200.67 256.636 138.565 0 1 0 L +277.612 446.82 0 0.482353 0.231373 P +225.3 411.415 277.612 446.82 0 1 0 L +277.612 446.82 306.3 503.662 0 1 0 L +277.612 446.82 225.3 411.415 0 1 0 L +225.3 494.286 277.612 446.82 0 1 0 L +225.3 411.415 225.3 494.286 277.612 446.82 1 0 0 T +277.612 446.82 225.3 494.286 0 1 0 L +306.3 503.662 277.612 446.82 0 1 0 L +225.3 494.286 306.3 503.662 277.612 446.82 1 0 0 T +451.392 505.528 0 0.482353 0.231373 P +451.392 505.528 491.358 492.577 0 1 0 L +451.392 505.528 414.905 491.688 0 1 0 L +491.358 492.577 451.392 505.528 0 1 0 L +414.905 491.688 491.358 492.577 451.392 505.528 1 0 0 T +414.905 491.688 451.392 505.528 0 1 0 L +306.3 503.662 0 0.482353 0.231373 P +306.3 503.662 0 0.482353 0.231373 P +356.787 494.577 306.3 503.662 0 1 0 L +306.3 503.662 297.85 484.69 0 1 0 L +306.3 503.662 297.85 484.69 356.787 494.577 1 0 0 T +306.3 503.662 356.787 494.577 0 1 0 L +297.85 484.69 306.3 503.662 0 1 0 L +306.3 503.662 225.3 494.286 0 1 0 L +306.3 503.662 225.3 494.286 297.85 484.69 1 0 0 T +225.3 494.286 306.3 503.662 0 1 0 L +256.636 138.565 0 0.482353 0.231373 P +256.636 138.565 0 0.482353 0.231373 P +269.673 172.886 256.636 138.565 0 1 0 L +287.973 114.33 256.636 138.565 0 1 0 L +256.636 138.565 269.673 172.886 0 1 0 L +287.973 114.33 256.636 138.565 269.673 172.886 1 0 0 T +256.636 138.565 313.073 133.507 0 1 0 L +313.073 133.507 256.636 138.565 0 1 0 L +256.636 138.565 287.973 114.33 0 1 0 L +256.636 138.565 287.973 114.33 313.073 133.507 1 0 0 T +225.3 411.415 0 0.482353 0.231373 P +225.3 411.415 0 0.482353 0.231373 P +242.09 363.953 225.3 411.415 0 1 0 L +225.3 411.415 245.538 425.113 0 1 0 L +225.3 411.415 245.538 425.113 242.09 363.953 1 0 0 T +225.3 411.415 242.09 363.953 0 1 0 L +245.538 425.113 225.3 411.415 0 1 0 L +225.3 411.415 225.3 494.286 0 1 0 L +225.3 411.415 225.3 494.286 245.538 425.113 1 0 0 T +225.3 411.415 225.3 494.286 0 1 0 L +242.09 267.162 0 0.482353 0.231373 P +242.09 267.162 261.859 231.21 0 1 0 L +242.09 267.162 252.906 307.193 0 1 0 L +261.859 231.21 242.09 267.162 0 1 0 L +252.906 307.193 261.859 231.21 242.09 267.162 1 0 0 T +252.906 307.193 242.09 267.162 0 1 0 L +593.672 453.069 0 0.482353 0.231373 P +593.672 453.069 611.972 410.314 0 1 0 L +593.672 453.069 611.972 483.32 0 1 0 L +611.972 410.314 593.672 453.069 0 1 0 L +611.972 483.32 611.972 410.314 593.672 453.069 1 0 0 T +611.972 483.32 593.672 453.069 0 1 0 L +611.972 317.576 0 0.482353 0.231373 P +611.972 317.576 638.085 228.321 0 1 0 L +638.085 228.321 611.972 317.576 0 1 0 L +611.972 317.576 647.039 290.457 0 1 0 L +638.085 228.321 611.972 317.576 647.039 290.457 1 0 0 T +647.039 290.457 611.972 317.576 0 1 0 L +611.972 317.576 638.085 366.44 0 1 0 L +611.972 317.576 638.085 366.44 647.039 290.457 1 0 0 T +638.085 366.44 611.972 317.576 0 1 0 L +611.972 317.576 611.972 410.314 0 1 0 L +638.085 366.44 611.972 317.576 611.972 410.314 1 0 0 T +611.972 410.314 611.972 317.576 0 1 0 L +272.038 125.569 267.071 122.208 1 1 0 L +267.071 122.208 260.804 143.629 1 1 0 L +260.804 143.629 255.838 140.268 1 1 0 L +313.073 133.507 0 0.482353 0.231373 P +313.073 133.507 359.33 122.59 0 1 0 L +313.073 133.507 287.973 114.33 0 1 0 L +359.33 122.59 313.073 133.507 0 1 0 L +287.973 114.33 359.33 122.59 313.073 133.507 1 0 0 T +287.973 114.33 313.073 133.507 0 1 0 L +630.272 182.084 0 0.482353 0.231373 P +630.272 182.084 638.085 228.321 0 1 0 L +654.406 172.537 630.272 182.084 0 1 0 L +638.085 228.321 654.406 172.537 630.272 182.084 1 0 0 T +638.085 228.321 630.272 182.084 0 1 0 L +630.272 182.084 654.406 172.537 0 1 0 L +643.308 127.599 630.272 182.084 0 1 0 L +654.406 172.537 643.308 127.599 630.272 182.084 1 0 0 T +630.272 182.084 643.308 127.599 0 1 0 L +449.972 133.082 0 0.482353 0.231373 P +408.586 105.073 449.972 133.082 0 1 0 L +449.972 133.082 359.33 122.59 0 1 0 L +408.586 105.073 449.972 133.082 359.33 122.59 1 0 0 T +359.33 122.59 449.972 133.082 0 1 0 L +485.039 105.962 449.972 133.082 0 1 0 L +449.972 133.082 408.586 105.073 0 1 0 L +449.972 133.082 408.586 105.073 485.039 105.962 1 0 0 T +543.586 120.699 449.972 133.082 0 1 0 L +449.972 133.082 485.039 105.962 0 1 0 L +543.586 120.699 449.972 133.082 485.039 105.962 1 0 0 T +449.972 133.082 543.586 120.699 0 1 0 L +586.871 132.657 0 0.482353 0.231373 P +586.871 132.657 543.586 120.699 0 1 0 L +602.094 112.96 586.871 132.657 0 1 0 L +543.586 120.699 602.094 112.96 586.871 132.657 1 0 0 T +543.586 120.699 586.871 132.657 0 1 0 L +586.871 132.657 602.094 112.96 0 1 0 L +643.308 127.599 586.871 132.657 0 1 0 L +602.094 112.96 643.308 127.599 586.871 132.657 1 0 0 T +586.871 132.657 643.308 127.599 0 1 0 L +356.787 494.577 0 0.482353 0.231373 P +356.787 494.577 297.85 484.69 0 1 0 L +356.359 476.951 356.787 494.577 0 1 0 L +297.85 484.69 356.359 476.951 356.787 494.577 1 0 0 T +356.787 494.577 356.359 476.951 0 1 0 L +414.905 491.688 356.787 494.577 0 1 0 L +356.359 476.951 414.905 491.688 356.787 494.577 1 0 0 T +356.787 494.577 414.905 491.688 0 1 0 L +297.85 484.69 356.787 494.577 0 1 0 L +350.646 397.347 225.3 494.286 0 0 1 L +225.3 494.286 0.698039 0.713726 0.505882 P +225.3 494.286 0 0.482353 0.231373 P +225.3 494.286 0 0.482353 0.231373 P +297.85 484.69 225.3 494.286 0 1 0 L +225.3 494.286 256.636 470.051 0 1 0 L +225.3 494.286 256.636 470.051 297.85 484.69 1 0 0 T +225.3 494.286 297.85 484.69 0 1 0 L +245.538 425.113 225.3 494.286 0 1 0 L +225.3 494.286 256.636 470.051 0 1 0 L +225.3 494.286 256.636 470.051 245.538 425.113 1 0 0 T +225.3 494.286 245.538 425.113 0 1 0 L +242.09 363.953 0 0.482353 0.231373 P +242.09 363.953 245.538 425.113 0 1 0 L +261.859 369.329 242.09 363.953 0 1 0 L +245.538 425.113 261.859 369.329 242.09 363.953 1 0 0 T +242.09 363.953 261.859 369.329 0 1 0 L +252.906 307.193 242.09 363.953 0 1 0 L +261.859 369.329 252.906 307.193 242.09 363.953 1 0 0 T +245.538 425.113 242.09 363.953 0 1 0 L +242.09 363.953 252.906 307.193 0 1 0 L +491.358 492.577 0 0.482353 0.231373 P +414.905 491.688 491.358 492.577 0 1 0 L +491.358 492.577 550.272 492.449 0 1 0 L +550.272 492.449 491.358 492.577 0 1 0 L +491.358 492.577 540.615 475.06 0 1 0 L +491.358 492.577 540.615 475.06 550.272 492.449 1 0 0 T +540.615 475.06 491.358 492.577 0 1 0 L +491.358 492.577 449.972 464.568 0 1 0 L +491.358 492.577 449.972 464.568 540.615 475.06 1 0 0 T +449.972 464.568 491.358 492.577 0 1 0 L +491.358 492.577 414.905 491.688 0 1 0 L +449.972 464.568 491.358 492.577 414.905 491.688 1 0 0 T +550.272 492.449 0 0.482353 0.231373 P +540.615 475.06 550.272 492.449 0 1 0 L +550.272 492.449 540.615 475.06 0 1 0 L +611.972 483.32 550.272 492.449 0 1 0 L +540.615 475.06 611.972 483.32 550.272 492.449 1 0 0 T +550.272 492.449 611.972 483.32 0 1 0 L +414.905 491.688 0 0.482353 0.231373 P +356.359 476.951 414.905 491.688 0 1 0 L +414.905 491.688 449.972 464.568 0 1 0 L +414.905 491.688 356.359 476.951 0 1 0 L +449.972 464.568 414.905 491.688 0 1 0 L +356.359 476.951 449.972 464.568 414.905 491.688 1 0 0 T +643.308 127.599 0 0.482353 0.231373 P +643.308 127.599 0 0.482353 0.231373 P +602.094 112.96 643.308 127.599 0 1 0 L +674.644 103.364 643.308 127.599 0 1 0 L +643.308 127.599 602.094 112.96 0 1 0 L +674.644 103.364 643.308 127.599 602.094 112.96 1 0 0 T +654.406 172.537 643.308 127.599 0 1 0 L +674.644 103.364 643.308 127.599 0 1 0 L +643.308 127.599 654.406 172.537 0 1 0 L +674.644 103.364 643.308 127.599 654.406 172.537 1 0 0 T +611.972 410.314 0 0.482353 0.231373 P +638.085 366.44 611.972 410.314 0 1 0 L +611.972 410.314 630.272 424.764 0 1 0 L +638.085 366.44 611.972 410.314 630.272 424.764 1 0 0 T +630.272 424.764 611.972 410.314 0 1 0 L +611.972 410.314 611.972 483.32 0 1 0 L +611.972 410.314 611.972 483.32 630.272 424.764 1 0 0 T +611.972 483.32 611.972 410.314 0 1 0 L +611.972 410.314 638.085 366.44 0 1 0 L +252.906 307.193 0 0.482353 0.231373 P +261.859 369.329 252.906 307.193 0 1 0 L +252.906 307.193 261.859 231.21 0 1 0 L +252.906 307.193 261.859 369.329 0 1 0 L +287.973 280.073 252.906 307.193 0 1 0 L +261.859 369.329 287.973 280.073 252.906 307.193 1 0 0 T +252.906 307.193 287.973 280.073 0 1 0 L +261.859 231.21 252.906 307.193 0 1 0 L +287.973 280.073 261.859 231.21 252.906 307.193 1 0 0 T +261.859 231.21 0 0.482353 0.231373 P +261.859 231.21 269.673 172.886 0 1 0 L +269.673 172.886 261.859 231.21 0 1 0 L +261.859 231.21 287.973 187.336 0 1 0 L +261.859 231.21 287.973 187.336 269.673 172.886 1 0 0 T +287.973 187.336 261.859 231.21 0 1 0 L +261.859 231.21 287.973 280.073 0 1 0 L +261.859 231.21 287.973 280.073 287.973 187.336 1 0 0 T +287.973 280.073 261.859 231.21 0 1 0 L +269.673 172.886 0 0.482353 0.231373 P +287.973 187.336 269.673 172.886 0 1 0 L +269.673 172.886 287.973 187.336 0 1 0 L +287.973 114.33 269.673 172.886 0 1 0 L +287.973 187.336 287.973 114.33 269.673 172.886 1 0 0 T +269.673 172.886 287.973 114.33 0 1 0 L +359.33 122.59 0 0.482353 0.231373 P +408.586 105.073 359.33 122.59 0 1 0 L +359.33 122.59 349.673 105.201 0 1 0 L +408.586 105.073 359.33 122.59 349.673 105.201 1 0 0 T +349.673 105.201 359.33 122.59 0 1 0 L +359.33 122.59 287.973 114.33 0 1 0 L +359.33 122.59 287.973 114.33 349.673 105.201 1 0 0 T +287.973 114.33 359.33 122.59 0 1 0 L +359.33 122.59 408.586 105.073 0 1 0 L +638.085 228.321 0 0.482353 0.231373 P +638.085 228.321 654.406 172.537 0 1 0 L +654.406 172.537 638.085 228.321 0 1 0 L +638.085 228.321 657.854 233.697 0 1 0 L +654.406 172.537 638.085 228.321 657.854 233.697 1 0 0 T +657.854 233.697 638.085 228.321 0 1 0 L +638.085 228.321 647.039 290.457 0 1 0 L +638.085 228.321 647.039 290.457 657.854 233.697 1 0 0 T +647.039 290.457 638.085 228.321 0 1 0 L +543.586 120.699 0 0.482353 0.231373 P +543.586 120.699 602.094 112.96 0 1 0 L +602.094 112.96 543.586 120.699 0 1 0 L +543.586 120.699 543.157 103.073 0 1 0 L +602.094 112.96 543.586 120.699 543.157 103.073 1 0 0 T +543.157 103.073 543.586 120.699 0 1 0 L +543.586 120.699 485.039 105.962 0 1 0 L +543.586 120.699 485.039 105.962 543.157 103.073 1 0 0 T +485.039 105.962 543.586 120.699 0 1 0 L +297.85 484.69 0 0.482353 0.231373 P +297.85 484.69 356.359 476.951 0 1 0 L +356.359 476.951 297.85 484.69 0 1 0 L +297.85 484.69 313.073 464.993 0 1 0 L +356.359 476.951 297.85 484.69 313.073 464.993 1 0 0 T +313.073 464.993 297.85 484.69 0 1 0 L +297.85 484.69 256.636 470.051 0 1 0 L +297.85 484.69 256.636 470.051 313.073 464.993 1 0 0 T +256.636 470.051 297.85 484.69 0 1 0 L +245.538 425.113 0 0.482353 0.231373 P +245.538 425.113 261.859 369.329 0 1 0 L +261.859 369.329 245.538 425.113 0 1 0 L +245.538 425.113 269.673 415.566 0 1 0 L +261.859 369.329 245.538 425.113 269.673 415.566 1 0 0 T +269.673 415.566 245.538 425.113 0 1 0 L +245.538 425.113 256.636 470.051 0 1 0 L +245.538 425.113 256.636 470.051 269.673 415.566 1 0 0 T +256.636 470.051 245.538 425.113 0 1 0 L +611.972 483.32 0 0.482353 0.231373 P +611.972 483.32 0 0.482353 0.231373 P +586.871 464.143 611.972 483.32 0 1 0 L +611.972 483.32 540.615 475.06 0 1 0 L +611.972 483.32 540.615 475.06 586.871 464.143 1 0 0 T +643.308 459.085 611.972 483.32 0 1 0 L +611.972 483.32 586.871 464.143 0 1 0 L +643.308 459.085 611.972 483.32 586.871 464.143 1 0 0 T +540.615 475.06 611.972 483.32 0 1 0 L +611.972 483.32 630.272 424.764 0 1 0 L +630.272 424.764 611.972 483.32 0 1 0 L +611.972 483.32 643.308 459.085 0 1 0 L +611.972 483.32 643.308 459.085 630.272 424.764 1 0 0 T +287.973 114.33 0 0.482353 0.231373 P +287.973 114.33 0 0.482353 0.231373 P +306.273 144.581 287.973 114.33 0 1 0 L +287.973 114.33 287.973 187.336 0 1 0 L +287.973 114.33 287.973 187.336 306.273 144.581 1 0 0 T +319.309 90.0956 287.973 114.33 0 1 0 L +287.973 114.33 306.273 144.581 0 1 0 L +319.309 90.0956 287.973 114.33 306.273 144.581 1 0 0 T +287.973 187.336 287.973 114.33 0 1 0 L +287.973 114.33 349.673 105.201 0 1 0 L +349.673 105.201 287.973 114.33 0 1 0 L +287.973 114.33 319.309 90.0956 0 1 0 L +287.973 114.33 319.309 90.0956 349.673 105.201 1 0 0 T +654.406 172.537 0 0.482353 0.231373 P +657.854 233.697 654.406 172.537 0 1 0 L +674.644 186.235 654.406 172.537 0 1 0 L +654.406 172.537 657.854 233.697 0 1 0 L +674.644 186.235 654.406 172.537 657.854 233.697 1 0 0 T +654.406 172.537 674.644 103.364 0 1 0 L +654.406 172.537 674.644 186.235 0 1 0 L +674.644 103.364 654.406 172.537 0 1 0 L +674.644 186.235 674.644 103.364 654.406 172.537 1 0 0 T +602.094 112.96 0 0.482353 0.231373 P +543.157 103.073 602.094 112.96 0 1 0 L +593.645 93.988 602.094 112.96 0 1 0 L +602.094 112.96 543.157 103.073 0 1 0 L +593.645 93.988 602.094 112.96 543.157 103.073 1 0 0 T +602.094 112.96 674.644 103.364 0 1 0 L +602.094 112.96 593.645 93.988 0 1 0 L +674.644 103.364 602.094 112.96 0 1 0 L +593.645 93.988 674.644 103.364 602.094 112.96 1 0 0 T +356.359 476.951 0 0.482353 0.231373 P +313.073 464.993 356.359 476.951 0 1 0 L +359.33 454.076 356.359 476.951 0 1 0 L +356.359 476.951 313.073 464.993 0 1 0 L +359.33 454.076 356.359 476.951 313.073 464.993 1 0 0 T +449.972 464.568 356.359 476.951 0 1 0 L +356.359 476.951 359.33 454.076 0 1 0 L +449.972 464.568 356.359 476.951 359.33 454.076 1 0 0 T +356.359 476.951 449.972 464.568 0 1 0 L +261.859 369.329 0 0.482353 0.231373 P +269.673 415.566 261.859 369.329 0 1 0 L +287.973 372.811 261.859 369.329 0 1 0 L +261.859 369.329 269.673 415.566 0 1 0 L +287.973 372.811 261.859 369.329 269.673 415.566 1 0 0 T +287.973 280.073 261.859 369.329 0 1 0 L +261.859 369.329 287.973 372.811 0 1 0 L +287.973 280.073 261.859 369.329 287.973 372.811 1 0 0 T +261.859 369.329 287.973 280.073 0 1 0 L +540.615 475.06 0 0.482353 0.231373 P +586.871 464.143 540.615 475.06 0 1 0 L +540.615 475.06 543.586 452.185 0 1 0 L +540.615 475.06 543.586 452.185 586.871 464.143 1 0 0 T +540.615 475.06 586.871 464.143 0 1 0 L +540.615 475.06 449.972 464.568 0 1 0 L +543.586 452.185 540.615 475.06 0 1 0 L +449.972 464.568 543.586 452.185 540.615 475.06 1 0 0 T +449.972 464.568 540.615 475.06 0 1 0 L +630.272 424.764 0 0.482353 0.231373 P +630.272 424.764 654.406 396.98 0 1 0 L +638.085 366.44 630.272 424.764 0 1 0 L +654.406 396.98 638.085 366.44 630.272 424.764 1 0 0 T +630.272 424.764 638.085 366.44 0 1 0 L +630.272 424.764 643.308 459.085 0 1 0 L +654.406 396.98 630.272 424.764 0 1 0 L +643.308 459.085 654.406 396.98 630.272 424.764 1 0 0 T +643.308 459.085 630.272 424.764 0 1 0 L +638.085 366.44 0 0.482353 0.231373 P +654.406 396.98 638.085 366.44 0 1 0 L +657.854 330.487 638.085 366.44 0 1 0 L +638.085 366.44 654.406 396.98 0 1 0 L +638.085 366.44 654.406 396.98 657.854 330.487 1 0 0 T +647.039 290.457 638.085 366.44 0 1 0 L +638.085 366.44 657.854 330.487 0 1 0 L +647.039 290.457 638.085 366.44 657.854 330.487 1 0 0 T +638.085 366.44 647.039 290.457 0 1 0 L +647.039 290.457 0 0.482353 0.231373 P +647.039 290.457 657.854 233.697 0 1 0 L +657.854 233.697 647.039 290.457 0 1 0 L +647.039 290.457 674.644 269.107 0 1 0 L +647.039 290.457 674.644 269.107 657.854 233.697 1 0 0 T +657.854 330.487 647.039 290.457 0 1 0 L +674.644 269.107 647.039 290.457 0 1 0 L +647.039 290.457 657.854 330.487 0 1 0 L +674.644 269.107 647.039 290.457 657.854 330.487 1 0 0 T +287.973 187.336 0 0.482353 0.231373 P +306.273 144.581 287.973 187.336 0 1 0 L +287.973 187.336 314.087 190.818 0 1 0 L +287.973 187.336 314.087 190.818 306.273 144.581 1 0 0 T +287.973 187.336 306.273 144.581 0 1 0 L +287.973 187.336 287.973 280.073 0 1 0 L +314.087 190.818 287.973 187.336 0 1 0 L +287.973 280.073 314.087 190.818 287.973 187.336 1 0 0 T +287.973 280.073 287.973 187.336 0 1 0 L +256.636 470.051 0 0.482353 0.231373 P +256.636 470.051 0 0.482353 0.231373 P +256.636 470.051 313.073 464.993 0 1 0 L +313.073 464.993 256.636 470.051 0 1 0 L +256.636 470.051 287.973 445.817 0 1 0 L +256.636 470.051 287.973 445.817 313.073 464.993 1 0 0 T +256.636 470.051 269.673 415.566 0 1 0 L +269.673 415.566 256.636 470.051 0 1 0 L +256.636 470.051 287.973 445.817 0 1 0 L +256.636 470.051 287.973 445.817 269.673 415.566 1 0 0 T +485.039 105.962 0 0.482353 0.231373 P +448.552 92.1222 485.039 105.962 0 1 0 L +485.039 105.962 408.586 105.073 0 1 0 L +485.039 105.962 408.586 105.073 448.552 92.1222 1 0 0 T +512.645 84.6123 485.039 105.962 0 1 0 L +485.039 105.962 448.552 92.1222 0 1 0 L +512.645 84.6123 485.039 105.962 448.552 92.1222 1 0 0 T +485.039 105.962 543.157 103.073 0 1 0 L +543.157 103.073 485.039 105.962 0 1 0 L +485.039 105.962 512.645 84.6123 0 1 0 L +485.039 105.962 512.645 84.6123 543.157 103.073 1 0 0 T +408.586 105.073 485.039 105.962 0 1 0 L +349.673 105.201 0 0.482353 0.231373 P +349.673 105.201 382.72 87.5676 0 1 0 L +408.586 105.073 349.673 105.201 0 1 0 L +382.72 87.5676 408.586 105.073 349.673 105.201 1 0 0 T +349.673 105.201 408.586 105.073 0 1 0 L +349.673 105.201 319.309 90.0956 0 1 0 L +382.72 87.5676 349.673 105.201 0 1 0 L +319.309 90.0956 382.72 87.5676 349.673 105.201 1 0 0 T +319.309 90.0956 349.673 105.201 0 1 0 L +408.586 105.073 0 0.482353 0.231373 P +382.72 87.5676 408.586 105.073 0 1 0 L +448.552 92.1222 408.586 105.073 0 1 0 L +408.586 105.073 382.72 87.5676 0 1 0 L +408.586 105.073 382.72 87.5676 448.552 92.1222 1 0 0 T +408.586 105.073 448.552 92.1222 0 1 0 L +657.854 233.697 0 0.482353 0.231373 P +657.854 233.697 674.644 186.235 0 1 0 L +674.644 269.107 657.854 233.697 0 1 0 L +657.854 233.697 674.644 269.107 0 1 0 L +674.644 186.235 657.854 233.697 0 1 0 L +674.644 269.107 674.644 186.235 657.854 233.697 1 0 0 T +350.646 65.8608 674.644 103.364 0 0 1 L +674.644 103.364 674.644 434.85 0 0 1 L +674.644 103.364 0.698039 0.713726 0.505882 P +674.644 103.364 0 0.482353 0.231373 P +674.644 103.364 0 0.482353 0.231373 P +674.644 103.364 0 0.482353 0.231373 P +622.332 150.83 674.644 103.364 0 1 0 L +674.644 103.364 593.645 93.988 0 1 0 L +674.644 103.364 593.645 93.988 622.332 150.83 1 0 0 T +674.644 186.235 674.644 103.364 0 1 0 L +674.644 103.364 622.332 150.83 0 1 0 L +674.644 186.235 674.644 103.364 622.332 150.83 1 0 0 T +593.645 93.988 674.644 103.364 0 1 0 L +674.644 186.235 674.644 103.364 0 1 0 L +543.157 103.073 0 0.482353 0.231373 P +512.645 84.6123 543.157 103.073 0 1 0 L +543.157 103.073 593.645 93.988 0 1 0 L +543.157 103.073 512.645 84.6123 0 1 0 L +593.645 93.988 543.157 103.073 0 1 0 L +512.645 84.6123 593.645 93.988 543.157 103.073 1 0 0 T +313.073 464.993 0 0.482353 0.231373 P +313.073 464.993 359.33 454.076 0 1 0 L +313.073 464.993 287.973 445.817 0 1 0 L +359.33 454.076 313.073 464.993 0 1 0 L +287.973 445.817 359.33 454.076 313.073 464.993 1 0 0 T +287.973 445.817 313.073 464.993 0 1 0 L +449.972 464.568 0 0.482353 0.231373 P +543.586 452.185 449.972 464.568 0 1 0 L +449.972 464.568 485.039 437.448 0 1 0 L +543.586 452.185 449.972 464.568 485.039 437.448 1 0 0 T +485.039 437.448 449.972 464.568 0 1 0 L +449.972 464.568 408.586 436.559 0 1 0 L +449.972 464.568 408.586 436.559 485.039 437.448 1 0 0 T +449.972 464.568 543.586 452.185 0 1 0 L +408.586 436.559 449.972 464.568 0 1 0 L +449.972 464.568 359.33 454.076 0 1 0 L +408.586 436.559 449.972 464.568 359.33 454.076 1 0 0 T +359.33 454.076 449.972 464.568 0 1 0 L +269.673 415.566 0 0.482353 0.231373 P +269.673 415.566 287.973 372.811 0 1 0 L +269.673 415.566 287.973 445.817 0 1 0 L +287.973 372.811 269.673 415.566 0 1 0 L +287.973 445.817 287.973 372.811 269.673 415.566 1 0 0 T +287.973 445.817 269.673 415.566 0 1 0 L +586.871 464.143 0 0.482353 0.231373 P +586.871 464.143 543.586 452.185 0 1 0 L +602.094 444.446 586.871 464.143 0 1 0 L +543.586 452.185 602.094 444.446 586.871 464.143 1 0 0 T +543.586 452.185 586.871 464.143 0 1 0 L +586.871 464.143 602.094 444.446 0 1 0 L +643.308 459.085 586.871 464.143 0 1 0 L +602.094 444.446 643.308 459.085 586.871 464.143 1 0 0 T +586.871 464.143 643.308 459.085 0 1 0 L +287.973 280.073 0 0.482353 0.231373 P +323.04 252.954 287.973 280.073 0 1 0 L +287.973 280.073 314.087 328.937 0 1 0 L +287.973 280.073 314.087 328.937 323.04 252.954 1 0 0 T +314.087 190.818 287.973 280.073 0 1 0 L +287.973 280.073 323.04 252.954 0 1 0 L +314.087 190.818 287.973 280.073 323.04 252.954 1 0 0 T +314.087 328.937 287.973 280.073 0 1 0 L +287.973 280.073 287.973 372.811 0 1 0 L +314.087 328.937 287.973 280.073 287.973 372.811 1 0 0 T +287.973 372.811 287.973 280.073 0 1 0 L +287.973 280.073 314.087 190.818 0 1 0 L +306.273 144.581 0 0.482353 0.231373 P +306.273 144.581 314.087 190.818 0 1 0 L +330.408 135.034 306.273 144.581 0 1 0 L +314.087 190.818 330.408 135.034 306.273 144.581 1 0 0 T +314.087 190.818 306.273 144.581 0 1 0 L +306.273 144.581 330.408 135.034 0 1 0 L +319.309 90.0956 306.273 144.581 0 1 0 L +330.408 135.034 319.309 90.0956 306.273 144.581 1 0 0 T +306.273 144.581 319.309 90.0956 0 1 0 L +657.854 330.487 0 0.482353 0.231373 P +654.406 396.98 657.854 330.487 0 1 0 L +657.854 330.487 674.644 269.107 0 1 0 L +657.854 330.487 654.406 396.98 0 1 0 L +674.644 351.978 657.854 330.487 0 1 0 L +654.406 396.98 674.644 351.978 657.854 330.487 1 0 0 T +657.854 330.487 674.644 351.978 0 1 0 L +674.644 269.107 657.854 330.487 0 1 0 L +674.644 351.978 674.644 269.107 657.854 330.487 1 0 0 T +674.644 186.235 0 0.482353 0.231373 P +674.644 186.235 0 0.482353 0.231373 P +631.244 215.688 674.644 186.235 0 1 0 L +674.644 186.235 622.332 150.83 0 1 0 L +674.644 186.235 622.332 150.83 631.244 215.688 1 0 0 T +674.644 269.107 674.644 186.235 0 1 0 L +674.644 186.235 631.244 215.688 0 1 0 L +674.644 269.107 674.644 186.235 631.244 215.688 1 0 0 T +622.332 150.83 674.644 186.235 0 1 0 L +674.644 269.107 674.644 186.235 0 1 0 L +643.308 459.085 0 0.482353 0.231373 P +643.308 459.085 0 0.482353 0.231373 P +602.094 444.446 643.308 459.085 0 1 0 L +674.644 434.85 643.308 459.085 0 1 0 L +643.308 459.085 602.094 444.446 0 1 0 L +674.644 434.85 643.308 459.085 602.094 444.446 1 0 0 T +643.308 459.085 654.406 396.98 0 1 0 L +654.406 396.98 643.308 459.085 0 1 0 L +643.308 459.085 674.644 434.85 0 1 0 L +643.308 459.085 674.644 434.85 654.406 396.98 1 0 0 T +593.645 93.988 0 0.482353 0.231373 P +593.645 93.988 0 0.482353 0.231373 P +622.332 150.83 593.645 93.988 0 1 0 L +593.645 93.988 559.947 134.491 0 1 0 L +622.332 150.83 593.645 93.988 559.947 134.491 1 0 0 T +559.947 134.491 593.645 93.988 0 1 0 L +593.645 93.988 512.645 84.6123 0 1 0 L +593.645 93.988 512.645 84.6123 559.947 134.491 1 0 0 T +593.645 93.988 622.332 150.83 0 1 0 L +512.645 84.6123 593.645 93.988 0 1 0 L +448.552 92.1222 0 0.482353 0.231373 P +382.72 87.5676 448.552 92.1222 0 1 0 L +448.552 92.1222 382.72 87.5676 0 1 0 L +431.645 75.2365 448.552 92.1222 0 1 0 L +382.72 87.5676 431.645 75.2365 448.552 92.1222 1 0 0 T +448.552 92.1222 512.645 84.6123 0 1 0 L +448.552 92.1222 431.645 75.2365 0 1 0 L +512.645 84.6123 448.552 92.1222 0 1 0 L +431.645 75.2365 512.645 84.6123 448.552 92.1222 1 0 0 T +622.332 150.83 0 0.482353 0.231373 P +631.244 215.688 622.332 150.83 0 1 0 L +622.332 150.83 580.145 189.109 0 1 0 L +622.332 150.83 580.145 189.109 631.244 215.688 1 0 0 T +622.332 150.83 631.244 215.688 0 1 0 L +580.145 189.109 622.332 150.83 0 1 0 L +622.332 150.83 559.947 134.491 0 1 0 L +580.145 189.109 622.332 150.83 559.947 134.491 1 0 0 T +559.947 134.491 622.332 150.83 0 1 0 L +654.406 396.98 0 0.482353 0.231373 P +654.406 396.98 674.644 351.978 0 1 0 L +674.644 434.85 654.406 396.98 0 1 0 L +654.406 396.98 674.644 434.85 0 1 0 L +674.644 351.978 654.406 396.98 0 1 0 L +674.644 434.85 674.644 351.978 654.406 396.98 1 0 0 T +319.309 90.0956 0 0.482353 0.231373 P +319.309 90.0956 0 0.482353 0.231373 P +330.408 135.034 319.309 90.0956 0 1 0 L +350.646 65.8608 319.309 90.0956 0 1 0 L +319.309 90.0956 330.408 135.034 0 1 0 L +350.646 65.8608 319.309 90.0956 330.408 135.034 1 0 0 T +319.309 90.0956 382.72 87.5676 0 1 0 L +382.72 87.5676 319.309 90.0956 0 1 0 L +319.309 90.0956 350.646 65.8608 0 1 0 L +319.309 90.0956 350.646 65.8608 382.72 87.5676 1 0 0 T +359.33 454.076 0 0.482353 0.231373 P +408.586 436.559 359.33 454.076 0 1 0 L +359.33 454.076 349.673 436.688 0 1 0 L +408.586 436.559 359.33 454.076 349.673 436.688 1 0 0 T +349.673 436.688 359.33 454.076 0 1 0 L +359.33 454.076 287.973 445.817 0 1 0 L +359.33 454.076 287.973 445.817 349.673 436.688 1 0 0 T +287.973 445.817 359.33 454.076 0 1 0 L +359.33 454.076 408.586 436.559 0 1 0 L +287.973 372.811 0 0.482353 0.231373 P +314.087 328.937 287.973 372.811 0 1 0 L +287.973 372.811 306.273 387.261 0 1 0 L +314.087 328.937 287.973 372.811 306.273 387.261 1 0 0 T +306.273 387.261 287.973 372.811 0 1 0 L +287.973 372.811 287.973 445.817 0 1 0 L +287.973 372.811 287.973 445.817 306.273 387.261 1 0 0 T +287.973 445.817 287.973 372.811 0 1 0 L +287.973 372.811 314.087 328.937 0 1 0 L +543.586 452.185 0 0.482353 0.231373 P +543.586 452.185 602.094 444.446 0 1 0 L +602.094 444.446 543.586 452.185 0 1 0 L +543.586 452.185 543.157 434.559 0 1 0 L +602.094 444.446 543.586 452.185 543.157 434.559 1 0 0 T +543.157 434.559 543.586 452.185 0 1 0 L +543.586 452.185 485.039 437.448 0 1 0 L +543.586 452.185 485.039 437.448 543.157 434.559 1 0 0 T +485.039 437.448 543.586 452.185 0 1 0 L +382.72 87.5676 0 0.482353 0.231373 P +382.72 87.5676 431.645 75.2365 0 1 0 L +350.646 65.8608 382.72 87.5676 0 1 0 L +382.72 87.5676 350.646 65.8608 0 1 0 L +431.645 75.2365 382.72 87.5676 0 1 0 L +350.646 65.8608 431.645 75.2365 382.72 87.5676 1 0 0 T +674.644 269.107 0 0.482353 0.231373 P +674.644 269.107 0 0.482353 0.231373 P +603.288 260.847 674.644 269.107 0 1 0 L +674.644 269.107 631.244 215.688 0 1 0 L +603.288 260.847 674.644 269.107 631.244 215.688 1 0 0 T +631.244 215.688 674.644 269.107 0 1 0 L +631.244 312.479 674.644 269.107 0 1 0 L +674.644 269.107 603.288 260.847 0 1 0 L +674.644 269.107 603.288 260.847 631.244 312.479 1 0 0 T +674.644 351.978 674.644 269.107 0 1 0 L +674.644 269.107 631.244 312.479 0 1 0 L +674.644 351.978 674.644 269.107 631.244 312.479 1 0 0 T +674.644 351.978 674.644 269.107 0 1 0 L +631.244 215.688 0 0.482353 0.231373 P +580.145 189.109 631.244 215.688 0 1 0 L +631.244 215.688 580.145 189.109 0 1 0 L +603.288 260.847 631.244 215.688 0 1 0 L +580.145 189.109 603.288 260.847 631.244 215.688 1 0 0 T +631.244 215.688 603.288 260.847 0 1 0 L +559.947 134.491 0 0.482353 0.231373 P +559.947 134.491 580.145 189.109 0 1 0 L +559.947 134.491 512.645 157.618 0 1 0 L +580.145 189.109 559.947 134.491 0 1 0 L +512.645 157.618 580.145 189.109 559.947 134.491 1 0 0 T +559.947 134.491 512.645 84.6123 0 1 0 L +512.645 157.618 559.947 134.491 0 1 0 L +512.645 84.6123 512.645 157.618 559.947 134.491 1 0 0 T +512.645 84.6123 559.947 134.491 0 1 0 L +314.087 190.818 0 0.482353 0.231373 P +314.087 190.818 330.408 135.034 0 1 0 L +330.408 135.034 314.087 190.818 0 1 0 L +314.087 190.818 333.855 196.194 0 1 0 L +330.408 135.034 314.087 190.818 333.855 196.194 1 0 0 T +333.855 196.194 314.087 190.818 0 1 0 L +314.087 190.818 323.04 252.954 0 1 0 L +314.087 190.818 323.04 252.954 333.855 196.194 1 0 0 T +323.04 252.954 314.087 190.818 0 1 0 L +512.645 84.6123 0 0.482353 0.231373 P +512.645 84.6123 0 0.482353 0.231373 P +512.645 157.618 512.645 84.6123 0 1 0 L +512.645 84.6123 465.343 123.54 0 1 0 L +512.645 157.618 512.645 84.6123 465.343 123.54 1 0 0 T +465.343 123.54 512.645 84.6123 0 1 0 L +512.645 84.6123 431.645 75.2365 0 1 0 L +512.645 84.6123 431.645 75.2365 465.343 123.54 1 0 0 T +512.645 84.6123 512.645 157.618 0 1 0 L +431.645 75.2365 512.645 84.6123 0 1 0 L +580.145 189.109 0 0.482353 0.231373 P +580.145 189.109 603.288 260.847 0 1 0 L +512.645 157.618 580.145 189.109 0 1 0 L +512.645 250.355 580.145 189.109 0 1 0 L +580.145 189.109 512.645 157.618 0 1 0 L +512.645 250.355 580.145 189.109 512.645 157.618 1 0 0 T +603.288 260.847 580.145 189.109 0 1 0 L +580.145 189.109 512.645 250.355 0 1 0 L +580.145 189.109 512.645 250.355 603.288 260.847 1 0 0 T +287.973 445.817 0 0.482353 0.231373 P +287.973 445.817 0 0.482353 0.231373 P +287.973 445.817 349.673 436.688 0 1 0 L +349.673 436.688 287.973 445.817 0 1 0 L +287.973 445.817 319.309 421.582 0 1 0 L +287.973 445.817 319.309 421.582 349.673 436.688 1 0 0 T +287.973 445.817 306.273 387.261 0 1 0 L +306.273 387.261 287.973 445.817 0 1 0 L +287.973 445.817 319.309 421.582 0 1 0 L +287.973 445.817 319.309 421.582 306.273 387.261 1 0 0 T +602.094 444.446 0 0.482353 0.231373 P +543.157 434.559 602.094 444.446 0 1 0 L +593.645 425.474 602.094 444.446 0 1 0 L +602.094 444.446 543.157 434.559 0 1 0 L +593.645 425.474 602.094 444.446 543.157 434.559 1 0 0 T +602.094 444.446 674.644 434.85 0 1 0 L +602.094 444.446 593.645 425.474 0 1 0 L +674.644 434.85 602.094 444.446 0 1 0 L +593.645 425.474 674.644 434.85 602.094 444.446 1 0 0 T +674.644 351.978 0 0.482353 0.231373 P +674.644 351.978 0 0.482353 0.231373 P +622.332 375.274 674.644 351.978 0 1 0 L +674.644 351.978 631.244 312.479 0 1 0 L +622.332 375.274 674.644 351.978 631.244 312.479 1 0 0 T +631.244 312.479 674.644 351.978 0 1 0 L +674.644 434.85 674.644 351.978 0 1 0 L +674.644 351.978 622.332 375.274 0 1 0 L +674.644 434.85 674.644 351.978 622.332 375.274 1 0 0 T +674.644 434.85 674.644 351.978 0 1 0 L +603.288 260.847 0 0.482353 0.231373 P +631.244 312.479 603.288 260.847 0 1 0 L +603.288 260.847 580.145 327.228 0 1 0 L +603.288 260.847 580.145 327.228 631.244 312.479 1 0 0 T +603.288 260.847 631.244 312.479 0 1 0 L +603.288 260.847 512.645 250.355 0 1 0 L +580.145 327.228 603.288 260.847 0 1 0 L +512.645 250.355 580.145 327.228 603.288 260.847 1 0 0 T +512.645 250.355 603.288 260.847 0 1 0 L +512.645 157.618 0 0.482353 0.231373 P +445.145 173.483 512.645 157.618 0 1 0 L +512.645 157.618 465.343 123.54 0 1 0 L +445.145 173.483 512.645 157.618 465.343 123.54 1 0 0 T +465.343 123.54 512.645 157.618 0 1 0 L +512.645 157.618 512.645 250.355 0 1 0 L +512.645 157.618 445.145 173.483 0 1 0 L +512.645 250.355 512.645 157.618 0 1 0 L +445.145 173.483 512.645 250.355 512.645 157.618 1 0 0 T +631.244 312.479 0 0.482353 0.231373 P +631.244 312.479 580.145 327.228 0 1 0 L +622.332 375.274 631.244 312.479 0 1 0 L +580.145 327.228 622.332 375.274 631.244 312.479 1 0 0 T +580.145 327.228 631.244 312.479 0 1 0 L +631.244 312.479 622.332 375.274 0 1 0 L +330.408 135.034 0 0.482353 0.231373 P +333.855 196.194 330.408 135.034 0 1 0 L +350.646 148.732 330.408 135.034 0 1 0 L +330.408 135.034 333.855 196.194 0 1 0 L +350.646 148.732 330.408 135.034 333.855 196.194 1 0 0 T +330.408 135.034 350.646 65.8608 0 1 0 L +330.408 135.034 350.646 148.732 0 1 0 L +350.646 65.8608 330.408 135.034 0 1 0 L +350.646 148.732 350.646 65.8608 330.408 135.034 1 0 0 T +431.645 75.2365 0 0.482353 0.231373 P +431.645 75.2365 0 0.482353 0.231373 P +465.343 123.54 431.645 75.2365 0 1 0 L +431.645 75.2365 402.958 125.437 0 1 0 L +431.645 75.2365 402.958 125.437 465.343 123.54 1 0 0 T +431.645 75.2365 465.343 123.54 0 1 0 L +402.958 125.437 431.645 75.2365 0 1 0 L +431.645 75.2365 350.646 65.8608 0 1 0 L +431.645 75.2365 350.646 65.8608 402.958 125.437 1 0 0 T +350.646 65.8608 431.645 75.2365 0 1 0 L +465.343 123.54 0 0.482353 0.231373 P +465.343 123.54 402.958 125.437 0 1 0 L +445.145 173.483 465.343 123.54 0 1 0 L +402.958 125.437 445.145 173.483 465.343 123.54 1 0 0 T +465.343 123.54 445.145 173.483 0 1 0 L +402.958 125.437 465.343 123.54 0 1 0 L +485.039 437.448 0 0.482353 0.231373 P +485.039 437.448 543.157 434.559 0 1 0 L +543.157 434.559 485.039 437.448 0 1 0 L +485.039 437.448 512.645 416.098 0 1 0 L +485.039 437.448 512.645 416.098 543.157 434.559 1 0 0 T +448.552 423.608 485.039 437.448 0 1 0 L +485.039 437.448 408.586 436.559 0 1 0 L +485.039 437.448 408.586 436.559 448.552 423.608 1 0 0 T +512.645 416.098 485.039 437.448 0 1 0 L +485.039 437.448 448.552 423.608 0 1 0 L +512.645 416.098 485.039 437.448 448.552 423.608 1 0 0 T +408.586 436.559 485.039 437.448 0 1 0 L +349.673 436.688 0 0.482353 0.231373 P +349.673 436.688 382.72 419.054 0 1 0 L +408.586 436.559 349.673 436.688 0 1 0 L +382.72 419.054 408.586 436.559 349.673 436.688 1 0 0 T +349.673 436.688 408.586 436.559 0 1 0 L +349.673 436.688 319.309 421.582 0 1 0 L +382.72 419.054 349.673 436.688 0 1 0 L +319.309 421.582 382.72 419.054 349.673 436.688 1 0 0 T +319.309 421.582 349.673 436.688 0 1 0 L +408.586 436.559 0 0.482353 0.231373 P +382.72 419.054 408.586 436.559 0 1 0 L +448.552 423.608 408.586 436.559 0 1 0 L +408.586 436.559 382.72 419.054 0 1 0 L +408.586 436.559 382.72 419.054 448.552 423.608 1 0 0 T +408.586 436.559 448.552 423.608 0 1 0 L +306.273 387.261 0 0.482353 0.231373 P +306.273 387.261 330.408 359.477 0 1 0 L +314.087 328.937 306.273 387.261 0 1 0 L +330.408 359.477 314.087 328.937 306.273 387.261 1 0 0 T +306.273 387.261 314.087 328.937 0 1 0 L +306.273 387.261 319.309 421.582 0 1 0 L +330.408 359.477 306.273 387.261 0 1 0 L +319.309 421.582 330.408 359.477 306.273 387.261 1 0 0 T +319.309 421.582 306.273 387.261 0 1 0 L +314.087 328.937 0 0.482353 0.231373 P +330.408 359.477 314.087 328.937 0 1 0 L +333.855 292.985 314.087 328.937 0 1 0 L +314.087 328.937 330.408 359.477 0 1 0 L +314.087 328.937 330.408 359.477 333.855 292.985 1 0 0 T +323.04 252.954 314.087 328.937 0 1 0 L +314.087 328.937 333.855 292.985 0 1 0 L +323.04 252.954 314.087 328.937 333.855 292.985 1 0 0 T +314.087 328.937 323.04 252.954 0 1 0 L +323.04 252.954 0 0.482353 0.231373 P +333.855 292.985 323.04 252.954 0 1 0 L +350.646 231.604 323.04 252.954 0 1 0 L +323.04 252.954 333.855 292.985 0 1 0 L +350.646 231.604 323.04 252.954 333.855 292.985 1 0 0 T +323.04 252.954 333.855 196.194 0 1 0 L +333.855 196.194 323.04 252.954 0 1 0 L +323.04 252.954 350.646 231.604 0 1 0 L +323.04 252.954 350.646 231.604 333.855 196.194 1 0 0 T +674.644 434.85 350.646 397.347 0 0 1 L +674.644 434.85 0.698039 0.713726 0.505882 P +674.644 434.85 0 0.482353 0.231373 P +674.644 434.85 0 0.482353 0.231373 P +674.644 434.85 0 0.482353 0.231373 P +593.645 425.474 674.644 434.85 0 1 0 L +674.644 434.85 622.332 375.274 0 1 0 L +593.645 425.474 674.644 434.85 622.332 375.274 1 0 0 T +622.332 375.274 674.644 434.85 0 1 0 L +593.645 425.474 674.644 434.85 0 1 0 L +543.157 434.559 0 0.482353 0.231373 P +543.157 434.559 593.645 425.474 0 1 0 L +512.645 416.098 543.157 434.559 0 1 0 L +543.157 434.559 512.645 416.098 0 1 0 L +593.645 425.474 543.157 434.559 0 1 0 L +512.645 416.098 593.645 425.474 543.157 434.559 1 0 0 T +622.332 375.274 0 0.482353 0.231373 P +559.947 377.171 622.332 375.274 0 1 0 L +622.332 375.274 580.145 327.228 0 1 0 L +622.332 375.274 580.145 327.228 559.947 377.171 1 0 0 T +593.645 425.474 622.332 375.274 0 1 0 L +622.332 375.274 559.947 377.171 0 1 0 L +593.645 425.474 622.332 375.274 559.947 377.171 1 0 0 T +580.145 327.228 622.332 375.274 0 1 0 L +622.332 375.274 593.645 425.474 0 1 0 L +580.145 327.228 0 0.482353 0.231373 P +580.145 327.228 559.947 377.171 0 1 0 L +559.947 377.171 580.145 327.228 0 1 0 L +580.145 327.228 512.645 343.093 0 1 0 L +580.145 327.228 512.645 343.093 559.947 377.171 1 0 0 T +512.645 343.093 580.145 327.228 0 1 0 L +580.145 327.228 512.645 250.355 0 1 0 L +580.145 327.228 512.645 250.355 512.645 343.093 1 0 0 T +512.645 250.355 580.145 327.228 0 1 0 L +512.645 250.355 0 0.482353 0.231373 P +512.645 250.355 512.645 343.093 0 1 0 L +512.645 343.093 512.645 250.355 0 1 0 L +512.645 250.355 445.145 311.602 0 1 0 L +512.645 250.355 445.145 311.602 512.645 343.093 1 0 0 T +422.003 239.863 512.645 250.355 0 1 0 L +512.645 250.355 445.145 173.483 0 1 0 L +512.645 250.355 445.145 173.483 422.003 239.863 1 0 0 T +445.145 311.602 512.645 250.355 0 1 0 L +512.645 250.355 422.003 239.863 0 1 0 L +445.145 311.602 512.645 250.355 422.003 239.863 1 0 0 T +445.145 173.483 512.645 250.355 0 1 0 L +333.855 196.194 0 0.482353 0.231373 P +350.646 231.604 333.855 196.194 0 1 0 L +333.855 196.194 350.646 148.732 0 1 0 L +333.855 196.194 350.646 231.604 0 1 0 L +350.646 148.732 333.855 196.194 0 1 0 L +350.646 231.604 350.646 148.732 333.855 196.194 1 0 0 T +445.145 173.483 0 0.482353 0.231373 P +402.958 125.437 445.145 173.483 0 1 0 L +394.046 188.232 445.145 173.483 0 1 0 L +445.145 173.483 402.958 125.437 0 1 0 L +445.145 173.483 402.958 125.437 394.046 188.232 1 0 0 T +422.003 239.863 445.145 173.483 0 1 0 L +445.145 173.483 394.046 188.232 0 1 0 L +422.003 239.863 445.145 173.483 394.046 188.232 1 0 0 T +445.145 173.483 422.003 239.863 0 1 0 L +402.958 125.437 0 0.482353 0.231373 P +402.958 125.437 394.046 188.232 0 1 0 L +394.046 188.232 402.958 125.437 0 1 0 L +402.958 125.437 350.646 148.732 0 1 0 L +402.958 125.437 350.646 148.732 394.046 188.232 1 0 0 T +402.958 125.437 350.646 65.8608 0 1 0 L +350.646 148.732 402.958 125.437 0 1 0 L +350.646 65.8608 350.646 148.732 402.958 125.437 1 0 0 T +350.646 65.8608 402.958 125.437 0 1 0 L +350.646 397.347 350.646 65.8608 0 0 1 L +350.646 65.8608 0.698039 0.713726 0.505882 P +350.646 65.8608 0 0.482353 0.231373 P +350.646 65.8608 0 0.482353 0.231373 P +350.646 65.8608 0 0.482353 0.231373 P +350.646 65.8608 350.646 148.732 0 1 0 L +350.646 148.732 350.646 65.8608 0 1 0 L +559.947 377.171 0 0.482353 0.231373 P +512.645 343.093 559.947 377.171 0 1 0 L +559.947 377.171 593.645 425.474 0 1 0 L +559.947 377.171 512.645 343.093 0 1 0 L +512.645 416.098 559.947 377.171 0 1 0 L +512.645 343.093 512.645 416.098 559.947 377.171 1 0 0 T +559.947 377.171 512.645 416.098 0 1 0 L +593.645 425.474 559.947 377.171 0 1 0 L +512.645 416.098 593.645 425.474 559.947 377.171 1 0 0 T +593.645 425.474 0 0.482353 0.231373 P +593.645 425.474 0 0.482353 0.231373 P +512.645 416.098 593.645 425.474 0 1 0 L +512.645 416.098 593.645 425.474 0 1 0 L +448.552 423.608 0 0.482353 0.231373 P +382.72 419.054 448.552 423.608 0 1 0 L +448.552 423.608 512.645 416.098 0 1 0 L +448.552 423.608 382.72 419.054 0 1 0 L +431.645 406.723 448.552 423.608 0 1 0 L +382.72 419.054 431.645 406.723 448.552 423.608 1 0 0 T +448.552 423.608 431.645 406.723 0 1 0 L +512.645 416.098 448.552 423.608 0 1 0 L +431.645 406.723 512.645 416.098 448.552 423.608 1 0 0 T +394.046 188.232 0 0.482353 0.231373 P +394.046 188.232 422.003 239.863 0 1 0 L +394.046 188.232 350.646 231.604 0 1 0 L +422.003 239.863 394.046 188.232 0 1 0 L +350.646 231.604 422.003 239.863 394.046 188.232 1 0 0 T +350.646 148.732 394.046 188.232 0 1 0 L +394.046 188.232 350.646 148.732 0 1 0 L +350.646 231.604 394.046 188.232 0 1 0 L +350.646 148.732 350.646 231.604 394.046 188.232 1 0 0 T +512.645 343.093 0 0.482353 0.231373 P +512.645 343.093 512.645 416.098 0 1 0 L +465.343 366.22 512.645 343.093 0 1 0 L +512.645 343.093 445.145 311.602 0 1 0 L +512.645 343.093 445.145 311.602 465.343 366.22 1 0 0 T +512.645 416.098 512.645 343.093 0 1 0 L +512.645 343.093 465.343 366.22 0 1 0 L +512.645 416.098 512.645 343.093 465.343 366.22 1 0 0 T +445.145 311.602 512.645 343.093 0 1 0 L +422.003 239.863 0 0.482353 0.231373 P +445.145 311.602 422.003 239.863 0 1 0 L +422.003 239.863 394.046 285.023 0 1 0 L +445.145 311.602 422.003 239.863 394.046 285.023 1 0 0 T +394.046 285.023 422.003 239.863 0 1 0 L +422.003 239.863 350.646 231.604 0 1 0 L +422.003 239.863 350.646 231.604 394.046 285.023 1 0 0 T +350.646 231.604 422.003 239.863 0 1 0 L +422.003 239.863 445.145 311.602 0 1 0 L +333.855 292.985 0 0.482353 0.231373 P +330.408 359.477 333.855 292.985 0 1 0 L +333.855 292.985 330.408 359.477 0 1 0 L +350.646 314.475 333.855 292.985 0 1 0 L +330.408 359.477 350.646 314.475 333.855 292.985 1 0 0 T +333.855 292.985 350.646 231.604 0 1 0 L +333.855 292.985 350.646 314.475 0 1 0 L +350.646 231.604 333.855 292.985 0 1 0 L +350.646 314.475 350.646 231.604 333.855 292.985 1 0 0 T +350.646 148.732 0 0.482353 0.231373 P +350.646 148.732 0 0.482353 0.231373 P +350.646 148.732 350.646 231.604 0 1 0 L +350.646 231.604 350.646 148.732 0 1 0 L +319.309 421.582 0 0.482353 0.231373 P +319.309 421.582 0 0.482353 0.231373 P +319.309 421.582 382.72 419.054 0 1 0 L +382.72 419.054 319.309 421.582 0 1 0 L +319.309 421.582 350.646 397.347 0 1 0 L +319.309 421.582 350.646 397.347 382.72 419.054 1 0 0 T +319.309 421.582 330.408 359.477 0 1 0 L +330.408 359.477 319.309 421.582 0 1 0 L +319.309 421.582 350.646 397.347 0 1 0 L +319.309 421.582 350.646 397.347 330.408 359.477 1 0 0 T +382.72 419.054 0 0.482353 0.231373 P +382.72 419.054 431.645 406.723 0 1 0 L +350.646 397.347 382.72 419.054 0 1 0 L +382.72 419.054 350.646 397.347 0 1 0 L +431.645 406.723 382.72 419.054 0 1 0 L +350.646 397.347 431.645 406.723 382.72 419.054 1 0 0 T +330.408 359.477 0 0.482353 0.231373 P +330.408 359.477 350.646 314.475 0 1 0 L +350.646 397.347 330.408 359.477 0 1 0 L +330.408 359.477 350.646 397.347 0 1 0 L +350.646 314.475 330.408 359.477 0 1 0 L +350.646 397.347 350.646 314.475 330.408 359.477 1 0 0 T +445.145 311.602 0 0.482353 0.231373 P +402.958 349.881 445.145 311.602 0 1 0 L +445.145 311.602 394.046 285.023 0 1 0 L +402.958 349.881 445.145 311.602 394.046 285.023 1 0 0 T +394.046 285.023 445.145 311.602 0 1 0 L +465.343 366.22 445.145 311.602 0 1 0 L +445.145 311.602 402.958 349.881 0 1 0 L +445.145 311.602 402.958 349.881 465.343 366.22 1 0 0 T +445.145 311.602 465.343 366.22 0 1 0 L +512.645 416.098 0 0.482353 0.231373 P +512.645 416.098 0 0.482353 0.231373 P +465.343 366.22 512.645 416.098 0 1 0 L +431.645 406.723 512.645 416.098 0 1 0 L +512.645 416.098 465.343 366.22 0 1 0 L +431.645 406.723 512.645 416.098 465.343 366.22 1 0 0 T +431.645 406.723 512.645 416.098 0 1 0 L +465.343 366.22 0 0.482353 0.231373 P +402.958 349.881 465.343 366.22 0 1 0 L +465.343 366.22 402.958 349.881 0 1 0 L +431.645 406.723 465.343 366.22 0 1 0 L +402.958 349.881 431.645 406.723 465.343 366.22 1 0 0 T +465.343 366.22 431.645 406.723 0 1 0 L +394.046 285.023 0 0.482353 0.231373 P +394.046 285.023 402.958 349.881 0 1 0 L +394.046 285.023 350.646 314.475 0 1 0 L +402.958 349.881 394.046 285.023 0 1 0 L +350.646 314.475 402.958 349.881 394.046 285.023 1 0 0 T +350.646 231.604 394.046 285.023 0 1 0 L +394.046 285.023 350.646 231.604 0 1 0 L +350.646 314.475 394.046 285.023 0 1 0 L +350.646 231.604 350.646 314.475 394.046 285.023 1 0 0 T +350.646 231.604 0 0.482353 0.231373 P +350.646 231.604 0 0.482353 0.231373 P +350.646 231.604 350.646 314.475 0 1 0 L +350.646 314.475 350.646 231.604 0 1 0 L +402.958 349.881 0 0.482353 0.231373 P +350.646 314.475 402.958 349.881 0 1 0 L +402.958 349.881 431.645 406.723 0 1 0 L +402.958 349.881 350.646 397.347 0 1 0 L +431.645 406.723 402.958 349.881 0 1 0 L +350.646 397.347 431.645 406.723 402.958 349.881 1 0 0 T +402.958 349.881 350.646 314.475 0 1 0 L +350.646 397.347 402.958 349.881 0 1 0 L +350.646 314.475 350.646 397.347 402.958 349.881 1 0 0 T +431.645 406.723 0 0.482353 0.231373 P +431.645 406.723 0 0.482353 0.231373 P +350.646 397.347 431.645 406.723 0 1 0 L +350.646 397.347 431.645 406.723 0 1 0 L +350.646 314.475 0 0.482353 0.231373 P +350.646 314.475 0 0.482353 0.231373 P +350.646 314.475 350.646 397.347 0 1 0 L +350.646 397.347 350.646 314.475 0 1 0 L +350.646 397.347 0.698039 0.713726 0.505882 P +350.646 397.347 0 0.482353 0.231373 P +350.646 397.347 0 0.482353 0.231373 P +350.646 397.347 0 0.482353 0.231373 P +grestore +showpage +%%EndPage +%%Pages: 1 +%%EOF diff --git a/benchmarks/3d/bug_prot.geo b/benchmarks/3d/bug_prot.geo new file mode 100644 index 0000000000000000000000000000000000000000..b62051e06bf89109131c7ba0ad7cbfad50f43c75 --- /dev/null +++ b/benchmarks/3d/bug_prot.geo @@ -0,0 +1,6 @@ +c45 = 0.5 * (2^0.5); +Point(1) = {0.0,0.0,0.0,1.0}; +Point(2) = {-c45,c45,0.0,1.0}; +Line(1) = {1,2}; +Extrude Line(1, {-c45,c45,0}, {1,0.0,0}, 3.14159/2); +Coherence; diff --git a/benchmarks/3d/calbute.geo b/benchmarks/3d/calbute.geo new file mode 100644 index 0000000000000000000000000000000000000000..8206c032d51e27914bdc11a24cdc2145410b6505 --- /dev/null +++ b/benchmarks/3d/calbute.geo @@ -0,0 +1,26 @@ +Point(2) = {-1.96039E+00,-1.28719E+00, 2.12132E+00,lc}; +Point(3) = {-5.60111E-01,-1.08916E+00, 7.07107E-01,lc}; +Point(4) = {-2.24045E+00, 6.93103E-01, 2.12132E+00,lc}; +Point(5) = {-8.40168E-01, 8.91133E-01, 7.07107E-01,lc}; +Point(6) = { 5.60111E-01, 1.08916E+00, 7.07107E-01,lc}; +Point(7) = { 1.96039E+00, 1.28719E+00, 2.12132E+00,lc}; +Point(11) = { 2.24045E+00,-6.93103E-01, 2.12132E+00,lc}; +Point(15) = { 8.40168E-01,-8.91133E-01, 7.07107E-01,lc}; +Point(27) = {-1.40028E-01, 9.90148E-01, 1.20739E-15,lc}; +Point(37) = { 1.40028E-01,-9.90148E-01,-1.20739E-15,lc}; +Line (1) = {4,2}; +Line (2) = {2,3}; +Line (3) = {3,5}; +Line (4) = {5,4}; +Line (8) = {6,7}; +Line (9) = {7,11}; +Line (10) = {11,15}; +Line (11) = {15,6}; +Circle (13) = {5,27,6} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (14) = {4,27,7} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (18) = {2,37,11} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (22) = {3,37,15} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Line Loop (1000019) = { 1, 18, -9,-14}; +Ruled Surface (19) = {1000019}; +Extrude Line(1, {-0.,1,0}, {0.0,0.0,0.0}, -3.14159/2); +Coherence; diff --git a/benchmarks/3d/cas_pb.geo b/benchmarks/3d/cas_pb.geo new file mode 100644 index 0000000000000000000000000000000000000000..a1fec065a6b828da46f5021897ef9e108a68756d --- /dev/null +++ b/benchmarks/3d/cas_pb.geo @@ -0,0 +1,33 @@ + +Point(1) = {0,0,0,10}; +Point(2) = {10,10,0,1}; +Point(3) = {10,0,0,1}; +Point(4) = {0,10,0,1}; +Line(1) = {1,4}; +Line(2) = {4,2}; +Line(3) = {2,3}; +Line(4) = {3,1}; +Line Loop(5) = {4,1,2,3}; +Plane Surface(6) = {5}; +Extrude Surface (6, {0,0,1}); +Coherence; + +Point(111) = {5,5,-.1,.2}; +Point(15) = {4,4,-.1,.2}; +Point(16) = {4,6,-.1,.2}; +Point(17) = {6,4,-.1,.2}; +Point(18) = {6,6,-.1,.2}; +Arc(29) = {15,111,16}; +Arc(30) = {16,111,18}; +Arc(31) = {18,111,17}; +Arc(32) = {17,111,15}; +Line Loop(33) = {30,31,32,29}; +Plane Surface(34) = {33}; +Extrude Surface (34, {0,0,-1}); +Coherence; +Surface Loop(57) = {56,43,34,47,51,55}; +Complex Volume(58) = {57}; +/* +Surface Loop(58) = {28,15,6,19,23,27}; +Complex Volume(59) = {58}; +*/ diff --git a/benchmarks/3d/cube.geo b/benchmarks/3d/cube.geo new file mode 100644 index 0000000000000000000000000000000000000000..12938ec43bd9df04194a2f05e521c3a9079f5e76 --- /dev/null +++ b/benchmarks/3d/cube.geo @@ -0,0 +1,17 @@ +/**************************** +cube meshed uniformly +****************************/ +Point(1) = {0.0,0.0,0.0,.025}; +Point(2) = {1,0.0,0.0,.025}; +Point(3) = {1,1,0.0,.4}; +Point(4) = {0,1,0.0,.4}; +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Line Loop(5) = {2,3,4,1}; +Plane Surface(6) = {5}; +Extrude Surface (6, {0,0.0,1}); + +Surface Loop(29) = {23,6,15,19,28,27}; +Complex Volume(30) = {29}; diff --git a/benchmarks/3d/naca12.geo b/benchmarks/3d/naca12.geo new file mode 100644 index 0000000000000000000000000000000000000000..207fd53e7b42c3bd62dc9fc9ab432f6c7008a5da --- /dev/null +++ b/benchmarks/3d/naca12.geo @@ -0,0 +1,475 @@ +lc = 0.1; +Point(1) = {1.000000e+00,0.000000e+00,0.000000e+00,lc}; +Point(2) = {9.997533e-01,0.000000e+00,-3.498543e-05,lc}; +Point(3) = {9.990134e-01,0.000000e+00,-1.398841e-04,1.003943e-01}; +Point(4) = {9.977810e-01,0.000000e+00,-3.143904e-04,1.008856e-01}; +Point(5) = {9.960575e-01,0.000000e+00,-5.579769e-04,1.015708e-01}; +Point(6) = {9.938442e-01,0.000000e+00,-8.699747e-04,1.024472e-01}; +Point(7) = {9.911436e-01,0.000000e+00,-1.249551e-03,1.035112e-01}; +Point(8) = {9.879584e-01,0.000000e+00,-1.695579e-03,1.047586e-01}; +Point(9) = {9.842916e-01,0.000000e+00,-2.206860e-03,1.061847e-01}; +Point(10) = {9.801469e-01,0.000000e+00,-2.781989e-03,1.077836e-01}; +Point(11) = {9.755284e-01,0.000000e+00,-3.419365e-03,1.095491e-01}; +Point(12) = {9.704404e-01,0.000000e+00,-4.117359e-03,1.114743e-01}; +Point(13) = {9.648883e-01,0.000000e+00,-4.874101e-03,1.135515e-01}; +Point(14) = {9.588774e-01,0.000000e+00,-5.687566e-03,1.157726e-01}; +Point(15) = {9.524136e-01,0.000000e+00,-6.555737e-03,1.181288e-01}; +Point(16) = {9.455034e-01,0.000000e+00,-7.476377e-03,1.206107e-01}; +Point(17) = {9.381535e-01,0.000000e+00,-8.447210e-03,1.232086e-01}; +Point(18) = {9.303712e-01,0.000000e+00,-9.465891e-03,1.259123e-01}; +Point(19) = {9.221641e-01,0.000000e+00,-1.052998e-02,1.287110e-01}; +Point(20) = {9.135405e-01,0.000000e+00,-1.163695e-02,1.315937e-01}; +Point(21) = {9.045087e-01,0.000000e+00,-1.278429e-02,1.345491e-01}; +Point(22) = {8.950777e-01,0.000000e+00,-1.396934e-02,1.375654e-01}; +Point(23) = {8.852569e-01,0.000000e+00,-1.518951e-02,1.406308e-01}; +Point(24) = {8.750558e-01,0.000000e+00,-1.644214e-02,1.437333e-01}; +Point(25) = {8.644845e-01,0.000000e+00,-1.772453e-02,1.468604e-01}; +Point(26) = {8.535537e-01,0.000000e+00,-1.903398e-02,1.499999e-01}; +Point(27) = {8.422739e-01,0.000000e+00,-2.036772e-02,1.531394e-01}; +Point(28) = {8.306563e-01,0.000000e+00,-2.172309e-02,1.562666e-01}; +Point(29) = {8.187124e-01,0.000000e+00,-2.309725e-02,1.593690e-01}; +Point(30) = {8.064539e-01,0.000000e+00,-2.448751e-02,1.624344e-01}; +Point(31) = {7.938930e-01,0.000000e+00,-2.589105e-02,1.654508e-01}; +Point(32) = {7.810421e-01,0.000000e+00,-2.730503e-02,1.684061e-01}; +Point(33) = {7.679139e-01,0.000000e+00,-2.872668e-02,1.712889e-01}; +Point(34) = {7.545212e-01,0.000000e+00,-3.015313e-02,1.740876e-01}; +Point(35) = {7.408773e-01,0.000000e+00,-3.158154e-02,1.767913e-01}; +Point(36) = {7.269957e-01,0.000000e+00,-3.300894e-02,1.793892e-01}; +Point(37) = {7.128901e-01,0.000000e+00,-3.443245e-02,1.818711e-01}; +Point(38) = {6.985745e-01,0.000000e+00,-3.584905e-02,1.842273e-01}; +Point(39) = {6.840628e-01,0.000000e+00,-3.725576e-02,1.864484e-01}; +Point(40) = {6.693696e-01,0.000000e+00,-3.864942e-02,1.885256e-01}; +Point(41) = {6.545091e-01,0.000000e+00,-4.002701e-02,1.904508e-01}; +Point(42) = {6.394961e-01,0.000000e+00,-4.138529e-02,1.922163e-01}; +Point(43) = {6.243456e-01,0.000000e+00,-4.272101e-02,1.938153e-01}; +Point(44) = {6.090723e-01,0.000000e+00,-4.403092e-02,1.952413e-01}; +Point(45) = {5.936913e-01,0.000000e+00,-4.531165e-02,1.964888e-01}; +Point(46) = {5.782179e-01,0.000000e+00,-4.655984e-02,1.975528e-01}; +Point(47) = {5.626673e-01,0.000000e+00,-4.777199e-02,1.984291e-01}; +Point(48) = {5.470549e-01,0.000000e+00,-4.894463e-02,1.991143e-01}; +Point(49) = {5.313960e-01,0.000000e+00,-5.007425e-02,lc}; +Point(50) = {5.157061e-01,0.000000e+00,-5.115728e-02,1.999013e-01}; +Point(51) = {5.000008e-01,0.000000e+00,-5.219014e-02,2.000000e-01}; +Point(52) = {4.842954e-01,0.000000e+00,-5.316926e-02,1.999013e-01}; +Point(53) = {4.686055e-01,0.000000e+00,-5.409108e-02,1.996058e-01}; +Point(54) = {4.529467e-01,0.000000e+00,-5.495201e-02,1.991144e-01}; +Point(55) = {4.373342e-01,0.000000e+00,-5.574857e-02,1.984292e-01}; +Point(56) = {4.217836e-01,0.000000e+00,-5.647729e-02,1.975529e-01}; +Point(57) = {4.063102e-01,0.000000e+00,-5.713477e-02,1.964889e-01}; +Point(58) = {3.909292e-01,0.000000e+00,-5.771770e-02,1.952414e-01}; +Point(59) = {3.756559e-01,0.000000e+00,-5.822293e-02,1.938154e-01}; +Point(60) = {3.605053e-01,0.000000e+00,-5.864737e-02,1.922165e-01}; +Point(61) = {3.454924e-01,0.000000e+00,-5.898812e-02,1.904510e-01}; +Point(62) = {3.306319e-01,0.000000e+00,-5.924247e-02,1.885258e-01}; +Point(63) = {3.159386e-01,0.000000e+00,-5.940786e-02,1.864486e-01}; +Point(64) = {3.014269e-01,0.000000e+00,-5.948193e-02,1.842275e-01}; +Point(65) = {2.871112e-01,0.000000e+00,-5.946260e-02,1.818713e-01}; +Point(66) = {2.730056e-01,0.000000e+00,-5.934800e-02,1.793894e-01}; +Point(67) = {2.591240e-01,0.000000e+00,-5.913650e-02,1.767915e-01}; +Point(68) = {2.454802e-01,0.000000e+00,-5.882679e-02,1.740879e-01}; +Point(69) = {2.320875e-01,0.000000e+00,-5.841779e-02,1.712892e-01}; +Point(70) = {2.189592e-01,0.000000e+00,-5.790876e-02,1.684064e-01}; +Point(71) = {2.061082e-01,0.000000e+00,-5.729925e-02,1.654510e-01}; +Point(72) = {1.935473e-01,0.000000e+00,-5.658907e-02,1.624347e-01}; +Point(73) = {1.812888e-01,0.000000e+00,-5.577839e-02,1.593693e-01}; +Point(74) = {1.693449e-01,0.000000e+00,-5.486767e-02,1.562669e-01}; +Point(75) = {1.577273e-01,0.000000e+00,-5.385765e-02,1.531398e-01}; +Point(76) = {1.464474e-01,0.000000e+00,-5.274938e-02,1.500002e-01}; +Point(77) = {1.355165e-01,0.000000e+00,-5.154420e-02,1.468607e-01}; +Point(78) = {1.249452e-01,0.000000e+00,-5.024372e-02,1.437336e-01}; +Point(79) = {1.147441e-01,0.000000e+00,-4.884978e-02,1.406312e-01}; +Point(80) = {1.049232e-01,0.000000e+00,-4.736451e-02,1.375657e-01}; +Point(81) = {9.549212e-02,0.000000e+00,-4.579021e-02,1.345494e-01}; +Point(82) = {8.646032e-02,0.000000e+00,-4.412942e-02,1.315940e-01}; +Point(83) = {7.783660e-02,0.000000e+00,-4.238483e-02,1.287112e-01}; +Point(84) = {6.962952e-02,0.000000e+00,-4.055926e-02,1.259125e-01}; +Point(85) = {6.184718e-02,0.000000e+00,-3.865567e-02,1.232088e-01}; +Point(86) = {5.449721e-02,0.000000e+00,-3.667711e-02,1.206109e-01}; +Point(87) = {4.758692e-02,0.000000e+00,-3.462668e-02,1.181290e-01}; +Point(88) = {4.112309e-02,0.000000e+00,-3.250752e-02,1.157728e-01}; +Point(89) = {3.511214e-02,0.000000e+00,-3.032277e-02,1.135517e-01}; +Point(90) = {2.955997e-02,0.000000e+00,-2.807550e-02,1.114745e-01}; +Point(91) = {2.447206e-02,0.000000e+00,-2.576878e-02,1.095493e-01}; +Point(92) = {1.985344e-02,0.000000e+00,-2.340553e-02,1.077837e-01}; +Point(93) = {1.570869e-02,0.000000e+00,-2.098859e-02,1.061848e-01}; +Point(94) = {1.204184e-02,0.000000e+00,-1.852062e-02,1.047587e-01}; +Point(95) = {8.856565e-03,0.000000e+00,-1.600414e-02,1.035113e-01}; +Point(96) = {6.155997e-03,0.000000e+00,-1.344148e-02,1.024472e-01}; +Point(97) = {3.942788e-03,0.000000e+00,-1.083471e-02,1.015709e-01}; +Point(98) = {2.219111e-03,0.000000e+00,-8.185687e-03,1.008857e-01}; +Point(99) = {9.866953e-04,0.000000e+00,-5.496060e-03,1.003943e-01}; +Point(100) = {2.467632e-04,0.000000e+00,-2.767267e-03,lc}; +Point(101) = {0.000000e+00,0.000000e+00,1.911503e-39,1.000000e-01}; +Point(102) = {2.467632e-04,0.000000e+00,2.767267e-03,1.000987e-01}; +Point(103) = {9.866953e-04,0.000000e+00,5.496060e-03,1.003943e-01}; +Point(104) = {2.219111e-03,0.000000e+00,8.185687e-03,1.008857e-01}; +Point(105) = {3.942788e-03,0.000000e+00,1.083471e-02,1.015709e-01}; +Point(106) = {6.155997e-03,0.000000e+00,1.344148e-02,1.024472e-01}; +Point(107) = {8.856565e-03,0.000000e+00,1.600414e-02,1.035113e-01}; +Point(108) = {1.204184e-02,0.000000e+00,1.852062e-02,1.047587e-01}; +Point(109) = {1.570869e-02,0.000000e+00,2.098859e-02,1.061848e-01}; +Point(110) = {1.985344e-02,0.000000e+00,2.340553e-02,1.077837e-01}; +Point(111) = {2.447206e-02,0.000000e+00,2.576878e-02,1.095493e-01}; +Point(112) = {2.955997e-02,0.000000e+00,2.807550e-02,1.114745e-01}; +Point(113) = {3.511214e-02,0.000000e+00,3.032277e-02,1.135517e-01}; +Point(114) = {4.112309e-02,0.000000e+00,3.250752e-02,1.157728e-01}; +Point(115) = {4.758692e-02,0.000000e+00,3.462668e-02,1.181290e-01}; +Point(116) = {5.449721e-02,0.000000e+00,3.667711e-02,1.206109e-01}; +Point(117) = {6.184718e-02,0.000000e+00,3.865567e-02,1.232088e-01}; +Point(118) = {6.962952e-02,0.000000e+00,4.055926e-02,1.259125e-01}; +Point(119) = {7.783660e-02,0.000000e+00,4.238483e-02,1.287112e-01}; +Point(120) = {8.646032e-02,0.000000e+00,4.412942e-02,1.315940e-01}; +Point(121) = {9.549212e-02,0.000000e+00,4.579021e-02,1.345494e-01}; +Point(122) = {1.049232e-01,0.000000e+00,4.736451e-02,1.375657e-01}; +Point(123) = {1.147441e-01,0.000000e+00,4.884978e-02,1.406312e-01}; +Point(124) = {1.249452e-01,0.000000e+00,5.024372e-02,1.437336e-01}; +Point(125) = {1.355165e-01,0.000000e+00,5.154420e-02,1.468607e-01}; +Point(126) = {1.464474e-01,0.000000e+00,5.274938e-02,1.500002e-01}; +Point(127) = {1.577273e-01,0.000000e+00,5.385765e-02,1.531398e-01}; +Point(128) = {1.693449e-01,0.000000e+00,5.486767e-02,1.562669e-01}; +Point(129) = {1.812888e-01,0.000000e+00,5.577839e-02,1.593693e-01}; +Point(130) = {1.935473e-01,0.000000e+00,5.658907e-02,1.624347e-01}; +Point(131) = {2.061082e-01,0.000000e+00,5.729925e-02,1.654510e-01}; +Point(132) = {2.189592e-01,0.000000e+00,5.790876e-02,1.684064e-01}; +Point(133) = {2.320875e-01,0.000000e+00,5.841779e-02,1.712892e-01}; +Point(134) = {2.454802e-01,0.000000e+00,5.882679e-02,1.740879e-01}; +Point(135) = {2.591240e-01,0.000000e+00,5.913650e-02,1.767915e-01}; +Point(136) = {2.730056e-01,0.000000e+00,5.934800e-02,1.793894e-01}; +Point(137) = {2.871112e-01,0.000000e+00,5.946260e-02,1.818713e-01}; +Point(138) = {3.014269e-01,0.000000e+00,5.948193e-02,1.842275e-01}; +Point(139) = {3.159386e-01,0.000000e+00,5.940786e-02,1.864486e-01}; +Point(140) = {3.306319e-01,0.000000e+00,5.924247e-02,1.885258e-01}; +Point(141) = {3.454924e-01,0.000000e+00,5.898812e-02,1.904510e-01}; +Point(142) = {3.605053e-01,0.000000e+00,5.864737e-02,1.922165e-01}; +Point(143) = {3.756559e-01,0.000000e+00,5.822293e-02,1.938154e-01}; +Point(144) = {3.909292e-01,0.000000e+00,5.771770e-02,1.952414e-01}; +Point(145) = {4.063102e-01,0.000000e+00,5.713477e-02,1.964889e-01}; +Point(146) = {4.217836e-01,0.000000e+00,5.647729e-02,1.975529e-01}; +Point(147) = {4.373342e-01,0.000000e+00,5.574857e-02,1.984292e-01}; +Point(148) = {4.529467e-01,0.000000e+00,5.495201e-02,1.991144e-01}; +Point(149) = {4.686055e-01,0.000000e+00,5.409108e-02,1.996058e-01}; +Point(150) = {4.842954e-01,0.000000e+00,5.316926e-02,lc}; +Point(151) = {5.000008e-01,0.000000e+00,5.219014e-02,2.000000e-01}; +Point(152) = {5.157061e-01,0.000000e+00,5.115728e-02,1.999013e-01}; +Point(153) = {5.313960e-01,0.000000e+00,5.007425e-02,1.996057e-01}; +Point(154) = {5.470549e-01,0.000000e+00,4.894463e-02,1.991143e-01}; +Point(155) = {5.626673e-01,0.000000e+00,4.777199e-02,1.984291e-01}; +Point(156) = {5.782179e-01,0.000000e+00,4.655984e-02,1.975528e-01}; +Point(157) = {5.936913e-01,0.000000e+00,4.531165e-02,1.964888e-01}; +Point(158) = {6.090723e-01,0.000000e+00,4.403092e-02,1.952413e-01}; +Point(159) = {6.243456e-01,0.000000e+00,4.272101e-02,1.938153e-01}; +Point(160) = {6.394961e-01,0.000000e+00,4.138529e-02,1.922163e-01}; +Point(161) = {6.545091e-01,0.000000e+00,4.002701e-02,1.904508e-01}; +Point(162) = {6.693696e-01,0.000000e+00,3.864942e-02,1.885256e-01}; +Point(163) = {6.840628e-01,0.000000e+00,3.725576e-02,1.864484e-01}; +Point(164) = {6.985745e-01,0.000000e+00,3.584905e-02,1.842273e-01}; +Point(165) = {7.128901e-01,0.000000e+00,3.443245e-02,1.818711e-01}; +Point(166) = {7.269957e-01,0.000000e+00,3.300894e-02,1.793892e-01}; +Point(167) = {7.408773e-01,0.000000e+00,3.158154e-02,1.767913e-01}; +Point(168) = {7.545212e-01,0.000000e+00,3.015313e-02,1.740876e-01}; +Point(169) = {7.679139e-01,0.000000e+00,2.872668e-02,1.712889e-01}; +Point(170) = {7.810421e-01,0.000000e+00,2.730503e-02,1.684061e-01}; +Point(171) = {7.938930e-01,0.000000e+00,2.589105e-02,1.654508e-01}; +Point(172) = {8.064539e-01,0.000000e+00,2.448751e-02,1.624344e-01}; +Point(173) = {8.187124e-01,0.000000e+00,2.309725e-02,1.593690e-01}; +Point(174) = {8.306563e-01,0.000000e+00,2.172309e-02,1.562666e-01}; +Point(175) = {8.422739e-01,0.000000e+00,2.036772e-02,1.531394e-01}; +Point(176) = {8.535537e-01,0.000000e+00,1.903398e-02,1.499999e-01}; +Point(177) = {8.644845e-01,0.000000e+00,1.772453e-02,1.468604e-01}; +Point(178) = {8.750558e-01,0.000000e+00,1.644214e-02,1.437333e-01}; +Point(179) = {8.852569e-01,0.000000e+00,1.518951e-02,1.406308e-01}; +Point(180) = {8.950777e-01,0.000000e+00,1.396934e-02,1.375654e-01}; +Point(181) = {9.045087e-01,0.000000e+00,1.278429e-02,1.345491e-01}; +Point(182) = {9.135405e-01,0.000000e+00,1.163695e-02,1.315937e-01}; +Point(183) = {9.221641e-01,0.000000e+00,1.052998e-02,1.287110e-01}; +Point(184) = {9.303712e-01,0.000000e+00,9.465891e-03,1.259123e-01}; +Point(185) = {9.381535e-01,0.000000e+00,8.447210e-03,1.232086e-01}; +Point(186) = {9.455034e-01,0.000000e+00,7.476377e-03,1.206107e-01}; +Point(187) = {9.524136e-01,0.000000e+00,6.555737e-03,1.181288e-01}; +Point(188) = {9.588774e-01,0.000000e+00,5.687566e-03,1.157726e-01}; +Point(189) = {9.648883e-01,0.000000e+00,4.874101e-03,1.135515e-01}; +Point(190) = {9.704404e-01,0.000000e+00,4.117359e-03,1.114743e-01}; +Point(191) = {9.755284e-01,0.000000e+00,3.419365e-03,1.095491e-01}; +Point(192) = {9.801469e-01,0.000000e+00,2.781989e-03,1.077836e-01}; +Point(193) = {9.842916e-01,0.000000e+00,2.206860e-03,1.061847e-01}; +Point(194) = {9.879584e-01,0.000000e+00,1.695579e-03,1.047586e-01}; +Point(195) = {9.911436e-01,0.000000e+00,1.249551e-03,1.035112e-01}; +Point(196) = {9.938442e-01,0.000000e+00,8.699747e-04,1.024472e-01}; +Point(197) = {9.960575e-01,0.000000e+00,5.579769e-04,1.015708e-01}; +Point(198) = {9.977810e-01,0.000000e+00,3.143904e-04,1.008856e-01}; +Point(199) = {9.990134e-01,0.000000e+00,1.398841e-04,1.003943e-01}; +Point(200) = {9.997533e-01,0.000000e+00,3.498543e-05,lc}; +Point(201) = {1.000000e+00,1.000000e+00,0.000000e+00,lc}; +Point(202) = {9.997533e-01,1.000000e+00,-3.498543e-05,1.000987e-01}; +Point(203) = {9.990134e-01,1.000000e+00,-1.398841e-04,1.003943e-01}; +Point(204) = {9.977810e-01,1.000000e+00,-3.143904e-04,1.008856e-01}; +Point(205) = {9.960575e-01,1.000000e+00,-5.579769e-04,1.015708e-01}; +Point(206) = {9.938442e-01,1.000000e+00,-8.699747e-04,1.024472e-01}; +Point(207) = {9.911436e-01,1.000000e+00,-1.249551e-03,1.035112e-01}; +Point(208) = {9.879584e-01,1.000000e+00,-1.695579e-03,1.047586e-01}; +Point(209) = {9.842916e-01,1.000000e+00,-2.206860e-03,1.061847e-01}; +Point(210) = {9.801469e-01,1.000000e+00,-2.781989e-03,1.077836e-01}; +Point(211) = {9.755284e-01,1.000000e+00,-3.419365e-03,1.095491e-01}; +Point(212) = {9.704404e-01,1.000000e+00,-4.117359e-03,1.114743e-01}; +Point(213) = {9.648883e-01,1.000000e+00,-4.874101e-03,1.135515e-01}; +Point(214) = {9.588774e-01,1.000000e+00,-5.687566e-03,1.157726e-01}; +Point(215) = {9.524136e-01,1.000000e+00,-6.555737e-03,1.181288e-01}; +Point(216) = {9.455034e-01,1.000000e+00,-7.476377e-03,1.206107e-01}; +Point(217) = {9.381535e-01,1.000000e+00,-8.447210e-03,1.232086e-01}; +Point(218) = {9.303712e-01,1.000000e+00,-9.465891e-03,1.259123e-01}; +Point(219) = {9.221641e-01,1.000000e+00,-1.052998e-02,1.287110e-01}; +Point(220) = {9.135405e-01,1.000000e+00,-1.163695e-02,1.315937e-01}; +Point(221) = {9.045087e-01,1.000000e+00,-1.278429e-02,1.345491e-01}; +Point(222) = {8.950777e-01,1.000000e+00,-1.396934e-02,1.375654e-01}; +Point(223) = {8.852569e-01,1.000000e+00,-1.518951e-02,1.406308e-01}; +Point(224) = {8.750558e-01,1.000000e+00,-1.644214e-02,1.437333e-01}; +Point(225) = {8.644845e-01,1.000000e+00,-1.772453e-02,1.468604e-01}; +Point(226) = {8.535537e-01,1.000000e+00,-1.903398e-02,1.499999e-01}; +Point(227) = {8.422739e-01,1.000000e+00,-2.036772e-02,1.531394e-01}; +Point(228) = {8.306563e-01,1.000000e+00,-2.172309e-02,1.562666e-01}; +Point(229) = {8.187124e-01,1.000000e+00,-2.309725e-02,1.593690e-01}; +Point(230) = {8.064539e-01,1.000000e+00,-2.448751e-02,1.624344e-01}; +Point(231) = {7.938930e-01,1.000000e+00,-2.589105e-02,1.654508e-01}; +Point(232) = {7.810421e-01,1.000000e+00,-2.730503e-02,1.684061e-01}; +Point(233) = {7.679139e-01,1.000000e+00,-2.872668e-02,1.712889e-01}; +Point(234) = {7.545212e-01,1.000000e+00,-3.015313e-02,1.740876e-01}; +Point(235) = {7.408773e-01,1.000000e+00,-3.158154e-02,1.767913e-01}; +Point(236) = {7.269957e-01,1.000000e+00,-3.300894e-02,1.793892e-01}; +Point(237) = {7.128901e-01,1.000000e+00,-3.443245e-02,1.818711e-01}; +Point(238) = {6.985745e-01,1.000000e+00,-3.584905e-02,1.842273e-01}; +Point(239) = {6.840628e-01,1.000000e+00,-3.725576e-02,1.864484e-01}; +Point(240) = {6.693696e-01,1.000000e+00,-3.864942e-02,1.885256e-01}; +Point(241) = {6.545091e-01,1.000000e+00,-4.002701e-02,1.904508e-01}; +Point(242) = {6.394961e-01,1.000000e+00,-4.138529e-02,1.922163e-01}; +Point(243) = {6.243456e-01,1.000000e+00,-4.272101e-02,1.938153e-01}; +Point(244) = {6.090723e-01,1.000000e+00,-4.403092e-02,1.952413e-01}; +Point(245) = {5.936913e-01,1.000000e+00,-4.531165e-02,1.964888e-01}; +Point(246) = {5.782179e-01,1.000000e+00,-4.655984e-02,1.975528e-01}; +Point(247) = {5.626673e-01,1.000000e+00,-4.777199e-02,1.984291e-01}; +Point(248) = {5.470549e-01,1.000000e+00,-4.894463e-02,1.991143e-01}; +Point(249) = {5.313960e-01,1.000000e+00,-5.007425e-02,1.996057e-01}; +Point(250) = {5.157061e-01,1.000000e+00,-5.115728e-02,lc}; +Point(251) = {5.000008e-01,1.000000e+00,-5.219014e-02,2.000000e-01}; +Point(252) = {4.842954e-01,1.000000e+00,-5.316926e-02,1.999013e-01}; +Point(253) = {4.686055e-01,1.000000e+00,-5.409108e-02,1.996058e-01}; +Point(254) = {4.529467e-01,1.000000e+00,-5.495201e-02,1.991144e-01}; +Point(255) = {4.373342e-01,1.000000e+00,-5.574857e-02,1.984292e-01}; +Point(256) = {4.217836e-01,1.000000e+00,-5.647729e-02,1.975529e-01}; +Point(257) = {4.063102e-01,1.000000e+00,-5.713477e-02,1.964889e-01}; +Point(258) = {3.909292e-01,1.000000e+00,-5.771770e-02,1.952414e-01}; +Point(259) = {3.756559e-01,1.000000e+00,-5.822293e-02,1.938154e-01}; +Point(260) = {3.605053e-01,1.000000e+00,-5.864737e-02,1.922165e-01}; +Point(261) = {3.454924e-01,1.000000e+00,-5.898812e-02,1.904510e-01}; +Point(262) = {3.306319e-01,1.000000e+00,-5.924247e-02,1.885258e-01}; +Point(263) = {3.159386e-01,1.000000e+00,-5.940786e-02,1.864486e-01}; +Point(264) = {3.014269e-01,1.000000e+00,-5.948193e-02,1.842275e-01}; +Point(265) = {2.871112e-01,1.000000e+00,-5.946260e-02,1.818713e-01}; +Point(266) = {2.730056e-01,1.000000e+00,-5.934800e-02,1.793894e-01}; +Point(267) = {2.591240e-01,1.000000e+00,-5.913650e-02,1.767915e-01}; +Point(268) = {2.454802e-01,1.000000e+00,-5.882679e-02,1.740879e-01}; +Point(269) = {2.320875e-01,1.000000e+00,-5.841779e-02,1.712892e-01}; +Point(270) = {2.189592e-01,1.000000e+00,-5.790876e-02,1.684064e-01}; +Point(271) = {2.061082e-01,1.000000e+00,-5.729925e-02,1.654510e-01}; +Point(272) = {1.935473e-01,1.000000e+00,-5.658907e-02,1.624347e-01}; +Point(273) = {1.812888e-01,1.000000e+00,-5.577839e-02,1.593693e-01}; +Point(274) = {1.693449e-01,1.000000e+00,-5.486767e-02,1.562669e-01}; +Point(275) = {1.577273e-01,1.000000e+00,-5.385765e-02,1.531398e-01}; +Point(276) = {1.464474e-01,1.000000e+00,-5.274938e-02,1.500002e-01}; +Point(277) = {1.355165e-01,1.000000e+00,-5.154420e-02,1.468607e-01}; +Point(278) = {1.249452e-01,1.000000e+00,-5.024372e-02,1.437336e-01}; +Point(279) = {1.147441e-01,1.000000e+00,-4.884978e-02,1.406312e-01}; +Point(280) = {1.049232e-01,1.000000e+00,-4.736451e-02,1.375657e-01}; +Point(281) = {9.549212e-02,1.000000e+00,-4.579021e-02,1.345494e-01}; +Point(282) = {8.646032e-02,1.000000e+00,-4.412942e-02,1.315940e-01}; +Point(283) = {7.783660e-02,1.000000e+00,-4.238483e-02,1.287112e-01}; +Point(284) = {6.962952e-02,1.000000e+00,-4.055926e-02,1.259125e-01}; +Point(285) = {6.184718e-02,1.000000e+00,-3.865567e-02,1.232088e-01}; +Point(286) = {5.449721e-02,1.000000e+00,-3.667711e-02,1.206109e-01}; +Point(287) = {4.758692e-02,1.000000e+00,-3.462668e-02,1.181290e-01}; +Point(288) = {4.112309e-02,1.000000e+00,-3.250752e-02,1.157728e-01}; +Point(289) = {3.511214e-02,1.000000e+00,-3.032277e-02,1.135517e-01}; +Point(290) = {2.955997e-02,1.000000e+00,-2.807550e-02,1.114745e-01}; +Point(291) = {2.447206e-02,1.000000e+00,-2.576878e-02,1.095493e-01}; +Point(292) = {1.985344e-02,1.000000e+00,-2.340553e-02,1.077837e-01}; +Point(293) = {1.570869e-02,1.000000e+00,-2.098859e-02,1.061848e-01}; +Point(294) = {1.204184e-02,1.000000e+00,-1.852062e-02,1.047587e-01}; +Point(295) = {8.856565e-03,1.000000e+00,-1.600414e-02,1.035113e-01}; +Point(296) = {6.155997e-03,1.000000e+00,-1.344148e-02,1.024472e-01}; +Point(297) = {3.942788e-03,1.000000e+00,-1.083471e-02,1.015709e-01}; +Point(298) = {2.219111e-03,1.000000e+00,-8.185687e-03,1.008857e-01}; +Point(299) = {9.866953e-04,1.000000e+00,-5.496060e-03,1.003943e-01}; +Point(300) = {2.467632e-04,1.000000e+00,-2.767267e-03,lc}; +Point(301) = {0.000000e+00,1.000000e+00,1.911503e-39,lc}; +Point(302) = {2.467632e-04,1.000000e+00,2.767267e-03,1.000987e-01}; +Point(303) = {9.866953e-04,1.000000e+00,5.496060e-03,1.003943e-01}; +Point(304) = {2.219111e-03,1.000000e+00,8.185687e-03,1.008857e-01}; +Point(305) = {3.942788e-03,1.000000e+00,1.083471e-02,1.015709e-01}; +Point(306) = {6.155997e-03,1.000000e+00,1.344148e-02,1.024472e-01}; +Point(307) = {8.856565e-03,1.000000e+00,1.600414e-02,1.035113e-01}; +Point(308) = {1.204184e-02,1.000000e+00,1.852062e-02,1.047587e-01}; +Point(309) = {1.570869e-02,1.000000e+00,2.098859e-02,1.061848e-01}; +Point(310) = {1.985344e-02,1.000000e+00,2.340553e-02,1.077837e-01}; +Point(311) = {2.447206e-02,1.000000e+00,2.576878e-02,1.095493e-01}; +Point(312) = {2.955997e-02,1.000000e+00,2.807550e-02,1.114745e-01}; +Point(313) = {3.511214e-02,1.000000e+00,3.032277e-02,1.135517e-01}; +Point(314) = {4.112309e-02,1.000000e+00,3.250752e-02,1.157728e-01}; +Point(315) = {4.758692e-02,1.000000e+00,3.462668e-02,1.181290e-01}; +Point(316) = {5.449721e-02,1.000000e+00,3.667711e-02,1.206109e-01}; +Point(317) = {6.184718e-02,1.000000e+00,3.865567e-02,1.232088e-01}; +Point(318) = {6.962952e-02,1.000000e+00,4.055926e-02,1.259125e-01}; +Point(319) = {7.783660e-02,1.000000e+00,4.238483e-02,1.287112e-01}; +Point(320) = {8.646032e-02,1.000000e+00,4.412942e-02,1.315940e-01}; +Point(321) = {9.549212e-02,1.000000e+00,4.579021e-02,1.345494e-01}; +Point(322) = {1.049232e-01,1.000000e+00,4.736451e-02,1.375657e-01}; +Point(323) = {1.147441e-01,1.000000e+00,4.884978e-02,1.406312e-01}; +Point(324) = {1.249452e-01,1.000000e+00,5.024372e-02,1.437336e-01}; +Point(325) = {1.355165e-01,1.000000e+00,5.154420e-02,1.468607e-01}; +Point(326) = {1.464474e-01,1.000000e+00,5.274938e-02,1.500002e-01}; +Point(327) = {1.577273e-01,1.000000e+00,5.385765e-02,1.531398e-01}; +Point(328) = {1.693449e-01,1.000000e+00,5.486767e-02,1.562669e-01}; +Point(329) = {1.812888e-01,1.000000e+00,5.577839e-02,1.593693e-01}; +Point(330) = {1.935473e-01,1.000000e+00,5.658907e-02,1.624347e-01}; +Point(331) = {2.061082e-01,1.000000e+00,5.729925e-02,1.654510e-01}; +Point(332) = {2.189592e-01,1.000000e+00,5.790876e-02,1.684064e-01}; +Point(333) = {2.320875e-01,1.000000e+00,5.841779e-02,1.712892e-01}; +Point(334) = {2.454802e-01,1.000000e+00,5.882679e-02,1.740879e-01}; +Point(335) = {2.591240e-01,1.000000e+00,5.913650e-02,1.767915e-01}; +Point(336) = {2.730056e-01,1.000000e+00,5.934800e-02,1.793894e-01}; +Point(337) = {2.871112e-01,1.000000e+00,5.946260e-02,1.818713e-01}; +Point(338) = {3.014269e-01,1.000000e+00,5.948193e-02,1.842275e-01}; +Point(339) = {3.159386e-01,1.000000e+00,5.940786e-02,1.864486e-01}; +Point(340) = {3.306319e-01,1.000000e+00,5.924247e-02,1.885258e-01}; +Point(341) = {3.454924e-01,1.000000e+00,5.898812e-02,1.904510e-01}; +Point(342) = {3.605053e-01,1.000000e+00,5.864737e-02,1.922165e-01}; +Point(343) = {3.756559e-01,1.000000e+00,5.822293e-02,1.938154e-01}; +Point(344) = {3.909292e-01,1.000000e+00,5.771770e-02,1.952414e-01}; +Point(345) = {4.063102e-01,1.000000e+00,5.713477e-02,1.964889e-01}; +Point(346) = {4.217836e-01,1.000000e+00,5.647729e-02,1.975529e-01}; +Point(347) = {4.373342e-01,1.000000e+00,5.574857e-02,1.984292e-01}; +Point(348) = {4.529467e-01,1.000000e+00,5.495201e-02,1.991144e-01}; +Point(349) = {4.686055e-01,1.000000e+00,5.409108e-02,1.996058e-01}; +Point(350) = {4.842954e-01,1.000000e+00,5.316926e-02,lc}; +Point(351) = {5.000008e-01,1.000000e+00,5.219014e-02,2.000000e-01}; +Point(352) = {5.157061e-01,1.000000e+00,5.115728e-02,1.999013e-01}; +Point(353) = {5.313960e-01,1.000000e+00,5.007425e-02,1.996057e-01}; +Point(354) = {5.470549e-01,1.000000e+00,4.894463e-02,1.991143e-01}; +Point(355) = {5.626673e-01,1.000000e+00,4.777199e-02,1.984291e-01}; +Point(356) = {5.782179e-01,1.000000e+00,4.655984e-02,1.975528e-01}; +Point(357) = {5.936913e-01,1.000000e+00,4.531165e-02,1.964888e-01}; +Point(358) = {6.090723e-01,1.000000e+00,4.403092e-02,1.952413e-01}; +Point(359) = {6.243456e-01,1.000000e+00,4.272101e-02,1.938153e-01}; +Point(360) = {6.394961e-01,1.000000e+00,4.138529e-02,1.922163e-01}; +Point(361) = {6.545091e-01,1.000000e+00,4.002701e-02,1.904508e-01}; +Point(362) = {6.693696e-01,1.000000e+00,3.864942e-02,1.885256e-01}; +Point(363) = {6.840628e-01,1.000000e+00,3.725576e-02,1.864484e-01}; +Point(364) = {6.985745e-01,1.000000e+00,3.584905e-02,1.842273e-01}; +Point(365) = {7.128901e-01,1.000000e+00,3.443245e-02,1.818711e-01}; +Point(366) = {7.269957e-01,1.000000e+00,3.300894e-02,1.793892e-01}; +Point(367) = {7.408773e-01,1.000000e+00,3.158154e-02,1.767913e-01}; +Point(368) = {7.545212e-01,1.000000e+00,3.015313e-02,1.740876e-01}; +Point(369) = {7.679139e-01,1.000000e+00,2.872668e-02,1.712889e-01}; +Point(370) = {7.810421e-01,1.000000e+00,2.730503e-02,1.684061e-01}; +Point(371) = {7.938930e-01,1.000000e+00,2.589105e-02,1.654508e-01}; +Point(372) = {8.064539e-01,1.000000e+00,2.448751e-02,1.624344e-01}; +Point(373) = {8.187124e-01,1.000000e+00,2.309725e-02,1.593690e-01}; +Point(374) = {8.306563e-01,1.000000e+00,2.172309e-02,1.562666e-01}; +Point(375) = {8.422739e-01,1.000000e+00,2.036772e-02,1.531394e-01}; +Point(376) = {8.535537e-01,1.000000e+00,1.903398e-02,1.499999e-01}; +Point(377) = {8.644845e-01,1.000000e+00,1.772453e-02,1.468604e-01}; +Point(378) = {8.750558e-01,1.000000e+00,1.644214e-02,1.437333e-01}; +Point(379) = {8.852569e-01,1.000000e+00,1.518951e-02,1.406308e-01}; +Point(380) = {8.950777e-01,1.000000e+00,1.396934e-02,1.375654e-01}; +Point(381) = {9.045087e-01,1.000000e+00,1.278429e-02,1.345491e-01}; +Point(382) = {9.135405e-01,1.000000e+00,1.163695e-02,1.315937e-01}; +Point(383) = {9.221641e-01,1.000000e+00,1.052998e-02,1.287110e-01}; +Point(384) = {9.303712e-01,1.000000e+00,9.465891e-03,1.259123e-01}; +Point(385) = {9.381535e-01,1.000000e+00,8.447210e-03,1.232086e-01}; +Point(386) = {9.455034e-01,1.000000e+00,7.476377e-03,1.206107e-01}; +Point(387) = {9.524136e-01,1.000000e+00,6.555737e-03,1.181288e-01}; +Point(388) = {9.588774e-01,1.000000e+00,5.687566e-03,1.157726e-01}; +Point(389) = {9.648883e-01,1.000000e+00,4.874101e-03,1.135515e-01}; +Point(390) = {9.704404e-01,1.000000e+00,4.117359e-03,1.114743e-01}; +Point(391) = {9.755284e-01,1.000000e+00,3.419365e-03,1.095491e-01}; +Point(392) = {9.801469e-01,1.000000e+00,2.781989e-03,1.077836e-01}; +Point(393) = {9.842916e-01,1.000000e+00,2.206860e-03,1.061847e-01}; +Point(394) = {9.879584e-01,1.000000e+00,1.695579e-03,1.047586e-01}; +Point(395) = {9.911436e-01,1.000000e+00,1.249551e-03,1.035112e-01}; +Point(396) = {9.938442e-01,1.000000e+00,8.699747e-04,1.024472e-01}; +Point(397) = {9.960575e-01,1.000000e+00,5.579769e-04,1.015708e-01}; +Point(398) = {9.977810e-01,1.000000e+00,3.143904e-04,1.008856e-01}; +Point(399) = {9.990134e-01,1.000000e+00,1.398841e-04,1.003943e-01}; +Point(400) = {9.997533e-01,1.000000e+00,3.498543e-05,lc}; +Line(1) = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, +50}; +Line(2) = { 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100}; +Line(3) = { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, +134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150}; +Line(4) = { 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, +184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 1}; +Line(5) = { 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, +235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250}; +Line(6) = { 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, +284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300}; +Line(7) = { 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, +334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350}; +Line(8) = { 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, +384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 201}; +Line(9) = { 1, 201}; +Line(10) = { 100, 300}; +Line Loop(13) = {5,6,7,8}; +Plane Surface(14) = {13}; +Line(15) = { 50, 250}; +Line(16) = { 150, 350}; +Line Loop(17) = {1,15,-5,-9}; +Ruled Surface(18) = {17}; +Line Loop(19) = {2,10,-6,-15}; +Ruled Surface(20) = {19}; +Line Loop(21) = {-3,10,7,-16}; +Ruled Surface(22) = {21}; +Line Loop(23) = {8,-9,-4,16}; +Ruled Surface(24) = {23}; +Point (1001) = {-10.,0., 10.,3.}; +Point (1002) = { 10.,0., 10.,3.}; +Point (1003) = { 10.,0., -10.,3.}; +Point (1004) = {-10.,0., -10.,3.}; +Point (1010) = { 10.,0., 0.,3.}; +Point (1011) = {-10.,0., 0.,3.}; +Point (1005) = {-10., 10., 10.,3.}; +Point (1006) = { 10., 10., 10.,3.}; +Point (1007) = { 10., 10.,-10.,3.}; +Point (1008) = {-10., 10.,-10.,3.}; +Line(1001) = {1001,1002}; +Line(1003) = {1004,1003}; +Line(1005) = {1005,1006}; +Line(1006) = {1006,1007}; +Line(1007) = {1008,1007}; +Line(1008) = {1005,1008}; +Line(1009) = {1001,1005}; +Line(1010) = {1002,1006}; +Line(1011) = {1003,1007}; +Line(1012) = {1004,1008}; +Line(1013) = {1010,1}; +Line(1014) = {1011,100}; +Line(1015) = {1002,1010}; +Line(1016) = {1001,1011}; +Line(1017) = {1011,1004}; +Line(1018) = {1010,1003}; +Line Loop(1000)= {1001,1015,1013,-4,-3,-1014,-1016}; +Plane Surface(1100) = {1000}; +Line Loop(1001)= {1014,-2,-1,-1013,1018,-1003,-1017}; +Plane Surface(1101) = {1001}; +Line Loop(1002)= {1005,1006,-1007,-1008}; +Plane Surface(1102 ) = {1002}; +Line Loop(1003)= {1009,1008,-1012,-1017,-1016}; +Plane Surface(1103 ) = {1003}; +Line Loop(1004)= {1006,-1011,-1018,-1015,1010}; +Plane Surface(1104 ) = {1004}; +Line Loop(1005)= {1009, 1005,-1010,-1001}; +Plane Surface(1105 ) = {1005}; +Line Loop(1006)= {1012,1007,-1011,-1003}; +Plane Surface(1106 ) = {1006}; +Surface Loop(1107) = {1101,1100,1105,-1103,-1102,1104,-1106,-24,14,18,20,-22}; +Complex Volume(1108) = {1107}; + +Physical Volume(1110) = {1108}; diff --git a/benchmarks/3d/p19.geo b/benchmarks/3d/p19.geo new file mode 100644 index 0000000000000000000000000000000000000000..07bd6fc8db790542f85f11f5983f15fa2e2f5f3a --- /dev/null +++ b/benchmarks/3d/p19.geo @@ -0,0 +1,129 @@ +fact = 0.4 ; +rondelle = fact * 0.01; +iris = fact * 0.004; +size = fact * 0.01; + +larg = 86.36e-3 / 2.0 ; +long = 45.0e-3 ; +l = 16.e-3 / 2.0 ; +re = 90.e-3 / 2.0 ; +re2 = re + 3.e-3 ; +ri = 8.e-3 / 2.0 ; +ll = 60.0e-3 / 2.0; +a = larg - ll; +c45 = 0.5^0.5 ; + +hg = 21.59e-3 ; +hcav = 42.5e-3 ; + +x2 = long; +y1 = ri * c45; +y2 = ri ; +y3 = l ; +ss1 = l / re ; +xtemp = re * ( ( 1.0 - ss1 * ss1 ) ^ 0.5 ) ; +ss2 = ( 1.0 - ( xtemp / re2 ) * ( xtemp / re2 ) ) ^ 0.5 ; +y4 = ss2 * xtemp ; +ss3 = ll / re2; +xtemp2 = re2 * ( ( 1.0 - ss3 * ss3 ) ^ 0.5 ) ; +x1 = long - ( xtemp - xtemp2 ) ; +x6 = x1 + xtemp ; +x3 = x6 - re * c45 ; +x4 = x6 - ri ; +x5 = x6 - ri * c45 ; +x7 = x6 + ri * c45 ; +x8 = x6 + ri ; +x9 = x6 + re * c45 ; +x10 = x6 + re ; +y5 = ll ; +y6 = re * c45 ; +y7 = re ; +y8 = larg ; + + +Point(1) = {0.0,0.0,0.0,size}; +Point(2) = {0.0,y8,0.0,size}; +Point(3) = {x2,y8,0.0,size}; +Point(4) = {x2,y5,0.0,size}; +Point(5) = {x1,y4,0.0,size}; +Point(6) = {x1,y3,0.0,iris}; +Point(7) = {x1,0.0,0.0,iris}; +Point(8) = {x3,y6,0.0,size}; +Point(9) = {x6,y7,0.0,size}; +Point(10) = {x9,y6,0.0,size}; +Point(11) = {x10,0.0,0.0,size}; +Point(12) = {x8,0.0,0.0,rondelle}; +Point(13) = {x6,0.0,0.0,rondelle}; +Point(14) = {x4,0.0,0.0,rondelle}; +Point(15) = {x7,y1,0.0,rondelle}; +Point(16) = {x6,y2,0.0,rondelle}; +Point(17) = {x5,y1,0.0,rondelle}; + +Line(1) = {1,2}; +Line(2) = {2,3}; +Line(3) = {3,4}; +Line(4) = {5,6}; +Line(5) = {1,7}; +Line(6) = {7,14}; +Line(10) = {6,7}; +Line(11) = {14,13}; +Line(12) = {13,12}; +Circle(16) = {11,13,10}; +Circle(17) = {10,13,9}; +Circle(18) = {9,13,8}; +Circle(19) = {8,13,6}; +Circle(20) = {4,13,5}; +Line(21) = {11,12}; +Circle(22) = {17,13,14}; +Circle(23) = {16,13,17}; +Circle(24) = {15,13,16}; +Circle(25) = {12,13,15}; + +Loop(26) = {-5,1,2,3,20,4,10}; +Plane Surface(27) = {26}; + +Loop(28) = {-6,-10,-19,-18,-17,-16,21,25,24,23,22}; +Plane Surface(29) = {28}; + +Loop(30) = {11,12,25,24,23,22}; +Plane Surface(31) = {30}; + +Extrude(27, {0,0,hg} ); +Coherence; + +Extrude(29, {0,0,hg} ); +Coherence; + +Extrude(31, {0,0,hg} ); +Coherence; + +Volume(127) = {60,-27,-43,61,46,49,52,55,58}; +Volume Complexe(128) = {127}; + +Extrude (105, {0,0,hcav-hg} ); +Coherence; + +Extrude (126, {0,0,hcav-hg} ); +Coherence; + +Characteristic Length {58,71} = 0.01; + +Volume(196) = {31,-115,-117,-96,-99,-102,-104,-173,-184,-186,-165,-168,-171,-195}; +Complex Volume(197) = {196}; + +Volume(198) = {93,-29,-76,104,173,-144,174,-147,-60,-81,-150,-153,-84,-87,-156,-159,-90,162,165,96,99,102,171,168}; + +Complex Volume(199) = {198}; + +GO = 1 ; +CAV = 2 ; +DIS = 3 ; +CLDSRC = 4 ; +CLD = 5 ; + +Physical Volume (GO) = 128; +Physical Volume (CAV) = 199; +Physical Volume (DIS) = 197; +Physical Volume (CLDSRC) = 46; +Physical Volume (CLD) = {61,49,27,52,55,58,81,150,147,84,153,87,156,90,159,29,31,174,195}; +Point(85) = {0.0,0.0,0.0,1.0}; diff --git a/benchmarks/3d/p20.geo b/benchmarks/3d/p20.geo new file mode 100644 index 0000000000000000000000000000000000000000..c58c10a2e055fb4cc98c4f4584f3d7609d2e3d98 --- /dev/null +++ b/benchmarks/3d/p20.geo @@ -0,0 +1,225 @@ +/* + c8 + +---------------------+ c7 + | c4 | + | +-------------+ | + | | c3 +---+ + +---+ c5 c6 + c1 c2 + +*/ + +/* Base inferieure du fer */ +D1 = .05; +/* Base inferieure du fer */ +D2 = .15; +D3 = .01; +D4 = .03; +D5 = .05; +D6 = .025; + +ax = 3.2; +ay = 3.2; +az = 3.2; +Dy = ax * D1; +Dz = ay * D2; +Dx = az * D5; + +e = 2*.001; + +l = .008; +lbox = 2.*ax*l; + +c1=newp; +Point(c1) = {0,0,0,l}; +c2=newp; +Point(c2) = {0,D1,0,l}; +c3=newp; +Point(c3) = {0,D1,D2,l}; +c4=newp; +Point(c4) = {0,D3,D2,l}; +c5=newp; +Point(c5) = {0,D3,D2-D4,l}; +c6=newp; +Point(c6) = {0,D1-D4,D2-D4,l}; +c7=newp; +Point(c7) = {0,D1-D4,D4,l}; +c8=newp; +Point(c8) = {0,0,D4,l}; + +d1 = newreg; +Line (d1) = Liste[c1,c2]; +d2 = newreg; +Line (d2) = Liste[c2,c3]; +d3 = newreg; +Line (d3) = Liste[c3,c4]; +d4 = newreg; +Line (d4) = Liste[c4,c5]; +d5 = newreg; +Line (d5) = Liste[c5,c6]; +d6 = newreg; +Line (d6) = Liste[c6,c7]; +d7 = newreg; +Line (d7) = Liste[c7,c8]; +d8 = newreg; +Line (d8) = Liste[c8,c1]; + +e1 = newreg; +Boucle (newreg) = Liste[d1,d2,d3,d4,d5,d6,d7,d8]; +f1 = newreg; +Zone (f1) = Liste[e1]; +Extrude ( f1, {D5,0.00000E+00, 0.00000E+00} ); + +box1 = newp; +Point(box1) = {Dx,Dy,Dz,lbox}; +box2 = newp; +Point(box2) = {Dx,Dy,-Dz/6,lbox}; +box3 = newp; +Point(box3) = {Dx,0,-Dz/6,lbox}; +box4 = newp; +Point(box4) = {Dx,0,Dz,lbox}; +box5 = newp; +Point(box5) = {0,Dy,-Dz/6,lbox}; +box6 = newp; +Point(box6) = {0,Dy,Dz,lbox}; +box7 = newp; +Point(box7) = {0,0,Dz,lbox}; +box8 = newp; +Point(box8) = {0,0,-Dz/6,lbox}; + +lbox1 = newreg; +Line(lbox1) = Liste[box7,box6]; +lbox2 = newreg; +Line(lbox2) = Liste[box6,box1]; +lbox3 = newreg; +Line(lbox3) = Liste[box1,box4]; +lbox4 = newreg; +Line(lbox4) = Liste[box4,box7]; +lbox5 = newreg; +Line(lbox5) = Liste[box8,box5]; +lbox6 = newreg; +Line(lbox6) = Liste[box5,box2]; +lbox7 = newreg; +Line(lbox7) = Liste[box2,box3]; +lbox8 = newreg; +Line(lbox8) = Liste[box3,box8]; +lbox9 = newreg; +Line(lbox9) = Liste[box5,box6]; +lbox10 = newreg; +Line(lbox10) = Liste[box2,box1]; +lbox11 = newreg; +Line(lbox11) = Liste[box3,box4]; + + + +s1 = newp; +Point(s1) = {0,0,D4+e,l}; +s2 = newp; +Point(s2) = {0,0,D2-D4-e,l}; +s3 = newp; +Point(s3) = {0,D3-e,D2-D4-e,l}; +s4 = newp; +Point(s4) = {0,D3-e,D4+e,l}; + +q1 = newreg; +Line(q1) = Liste[s1,s2]; +q2 = newreg; +Line(q2) = Liste[s2,s3]; +q3 = newreg; +Line(q3) = Liste[s3,s4]; +q4 = newreg; +Line(q4) = Liste[s4,s1]; + +v1 = newreg; +Line(v1) = Liste[box8,c1]; +v2 = newreg; +Line(v2) = Liste[s2,box7]; +v3 = newreg; +Line(v3) = Liste[s1,c8]; + +e2 = newreg; +Boucle (newreg) = Liste[q1,q2,q3,q4]; +f2 = newreg; +Reglee (f2) = Liste[e2]; +Extrude ( f2, {D6,0.00000E+00, 0.00000E+00} ); + +DxInducteur = .005; +DyInducteur = .01; +DzInducteur = .06; +Rinducteur = .001; +Xinducteur = .028; +Yinducteur = .00; +Zinducteur = .04; +LcInducteur = .006; + +r1 = newp; +Point(r1) = {Xinducteur,Yinducteur,Zinducteur,LcInducteur}; +r2 = newp; +Point(r2) = {Xinducteur+DxInducteur,Yinducteur,Zinducteur,LcInducteur}; +r3 = newp; +Point(r3) = {Xinducteur+DxInducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur}; +r4 = newp; +Point(r4) = {Xinducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur}; +cc = newp; +Point(cc) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur}; +r5 = newp; +Point(r5) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur}; +r6 = newp; +Point(r6) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur+DxInducteur+Rinducteur,Zinducteur,LcInducteur}; +r7 = newp; +Point(r7) = {0,Yinducteur+DxInducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur}; +r8 = newp; +Point(r8) = {0,Yinducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur}; + +ll1 = newreg; +Line(ll1) = Liste[r2,r1]; +ll2 = newreg; +Line(ll2) = Liste[r1,r4]; +ll3 = newreg; +Arc Trigonometrique (ll3) = Liste[r4,cc,r5]; +ll4 = newreg; +Line(ll4) = Liste[r5,r8]; +ll5 = newreg; +Line(ll5) = Liste[r8,r7]; +ll6 = newreg; +Line(ll6) = Liste[r7,r6]; +ll7 = newreg; +Arc Trigonometrique(ll7) = Liste[r3,cc,r6]; +ll8 = newreg; +Line(ll8) = Liste[r3,r2]; + +BFondDeLInducteur = newreg; +Boucle(BFondDeLInducteur) = Liste[ll1,ll2,ll3,ll4,ll5,ll6,-ll7,ll8]; +FondDeLInducteur = newreg; +Zone(FondDeLInducteur) = Liste[BFondDeLInducteur]; +Extrude ( FondDeLInducteur, {0,0,DzInducteur} ); + +Boucle(127) = Liste[2,3,4,5,6,7,-62,-59,-58,-57,61,45,-53,-49,60,1]; +Zone(128) = Liste[127,116]; +Boucle(129) = Liste[39,18,-20,-60,-52,55,48,-61,71,-65,-70,62]; +Zone(130) = Liste[129,104]; +Boucle(131) = Liste[50,51,52,49]; +Reglee(132) = Liste[131]; +Boucle(133) = Liste[-55,-51,54,47]; +Reglee(134) = Liste[133]; +Boucle(135) = Liste[46,47,48,45]; +Reglee(136) = Liste[135]; +Boucle(137) = Liste[54,-46,-53,50]; +Reglee(138) = Liste[137]; +Volume(139) = Liste[117,-92,105,108,111,114,126,120,-123,125]; +Volume Complexe(140) = Liste[139]; +Volume(141) = Liste[73,-64,76,79,81,82]; +Volume Complexe(142) = Liste[141]; +Volume(143) = Liste[-43,10,-23,-26,-29,-32,-35,-38,-41,-44]; +Volume Complexe(144) = Liste[143]; +Volume(145) = Liste[26,-128,29,32,35,38,41,-130,44,23,-132,138,-134,136,-76,-79,-81,-82,92,-108,-111,-114,-126,-120,123,-125]; +Volume Complexe(146) = Liste[145]; +Physical Surface (11111) = Liste [117]; +Physical Surface (22222) = Liste [92,123,120,126,114,108,125,111]; +Physical Surface (33333) = Liste [10,43,64,73,105,117,128,130,132,134,136,138]; +Physical Volume (44444) = Liste [140]; +Physical Volume (55555) = Liste [142,144]; +Physical Volume (66666) = Liste [146]; + + + diff --git a/benchmarks/3d/p7-ExtrMesh.geo b/benchmarks/3d/p7-ExtrMesh.geo new file mode 100644 index 0000000000000000000000000000000000000000..8e8f13f00f2135efc18f75f4d40a04a12825705e --- /dev/null +++ b/benchmarks/3d/p7-ExtrMesh.geo @@ -0,0 +1,133 @@ +lcp = 10; +lci = 10; + +/* Plaque */ + +Point(1) = {0,0,0,lcp}; +Point(2) = {294,0,0,lcp}; +Point(3) = {294,294,0,lcp}; +Point(4) = {0,294,0,lcp}; +Point(5) = {0,294,19,lcp}; +Point(6) = {294,294,19,lcp}; +Point(7) = {294,0,19,lcp}; +Point(8) = {0,0,19,lcp}; +Point(9) = {18,18,19,lcp}; +Point(10) = {18,18,0,lcp}; +Point(11) = {126,18,0,lcp}; +Point(12) = {126,18,19,lcp}; +Point(13) = {126,126,19,lcp}; +Point(14) = {126,126,0,lcp}; +Point(15) = {18,126,0,lcp}; +Point(16) = {18,126,19,lcp}; + +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Line(9) = {15,14}; +Line(10) = {14,11}; +Line(11) = {11,10}; +Line(12) = {10,15}; + + +Line Loop(33) = {1,2,3,4}; +Line Loop(34) = {9,10,11,12}; +Plane Surface(35) = {33,34}; + +/* Inducteur */ + +Point(17) = {94,50,49,lci}; +Point(18) = {94,150,49,lci}; + +Point(19) = {119,50,49,lci}; +Point(20) = {119,150,49,lci}; + +Point(21) = {144,0,49,lci}; +Point(22) = {144,25,49,lci}; +Point(23) = {144,50,49,lci}; +Point(24) = {144,150,49,lci}; +Point(25) = {144,175,49,lci}; +Point(26) = {144,200,49,lci}; + +Point(27) = {244,0,49,lci}; +Point(28) = {244,25,49,lci}; +Point(29) = {244,50,49,lci}; +Point(30) = {244,150,49,lci}; +Point(31) = {244,175,49,lci}; +Point(32) = {244,200,49,lci}; + +Point(33) = {269,50,49,lci}; +Point(34) = {269,150,49,lci}; + +Point(35) = {294,50,49,lci}; +Point(36) = {294,150,49,lci}; + + +Circle(39) = {25,24,20}; +Circle(40) = {26,24,18}; +Circle(41) = {19,23,22}; +Circle(42) = {17,23,21}; +Circle(43) = {28,29,33}; +Circle(44) = {27,29,35}; +Circle(45) = {34,30,31}; +Circle(46) = {36,30,32}; +Line(47) = {31,32}; +Line(48) = {32,26}; +Line(49) = {26,25}; +Line(50) = {25,31}; +Line(51) = {20,18}; +Line(52) = {18,17}; +Line(53) = {17,19}; +Line(54) = {19,20}; +Line(55) = {22,21}; +Line(56) = {21,27}; +Line(57) = {27,28}; +Line(58) = {28,22}; +Line(59) = {33,35}; +Line(60) = {35,36}; +Line(61) = {36,34}; +Line(62) = {34,33}; + +Line Loop(63) = {48,49,50,47}; +Plane Surface(64) = {63}; +Line Loop(65) = {-47,-45,-61,46}; +Plane Surface(66) = {65}; +Line Loop(67) = {61,62,59,60}; +Plane Surface(68) = {67}; +Line Loop(69) = {-59,-43,-57,44}; +Plane Surface(70) = {69}; +Line Loop(71) = {58,55,56,57}; +Plane Surface(72) = {71}; +Line Loop(73) = {-42,53,41,55}; +Plane Surface(74) = {73}; +Line Loop(75) = {52,53,54,51}; +Plane Surface(76) = {75}; +Line Loop(77) = {-51,-39,-49,40}; +Plane Surface(78) = {77}; + +Extrude(64, {0,0,100}); +Coherence; +Extrude(78, {0,0,100}); +Coherence; +Extrude(76, {0,0,100}); +Coherence; +Extrude(74, {0,0,100}); +Coherence; +Extrude(72, {0,0,100}); +Coherence; +Extrude(70, {0,0,100}); +Coherence; +Extrude(68, {0,0,100}); +Coherence; +Extrude(66, {0,0,100}); +Coherence; + +Extrude Surface (35, {0,0.0,19}) +{ +Layers {3,3,3}{100,200,300}{.1,.9,1.}; +}; + +Coherence; + +Surface Loop(297) = {144,131,76,74,153,166,161,175,72,183,209,70,68,66,64,87,121,78,113,95,245,223,201,210,232,254,100,122,253,231,188,139}; +Complex Volume(298) = {297}; diff --git a/benchmarks/3d/p7.geo b/benchmarks/3d/p7.geo new file mode 100644 index 0000000000000000000000000000000000000000..6eab2b0f41a4b65902bf7a310eb14800461f376a --- /dev/null +++ b/benchmarks/3d/p7.geo @@ -0,0 +1,177 @@ +lcp = 10; +lci = 10; + +/* Plaque */ + +Point(1) = {0,0,0,lcp}; +Point(2) = {294,0,0,lcp}; +Point(3) = {294,294,0,lcp}; +Point(4) = {0,294,0,lcp}; +Point(5) = {0,294,19,lcp}; +Point(6) = {294,294,19,lcp}; +Point(7) = {294,0,19,lcp}; +Point(8) = {0,0,19,lcp}; +Point(9) = {18,18,19,lcp}; +Point(10) = {18,18,0,lcp}; +Point(11) = {126,18,0,lcp}; +Point(12) = {126,18,19,lcp}; +Point(13) = {126,126,19,lcp}; +Point(14) = {126,126,0,lcp}; +Point(15) = {18,126,0,lcp}; +Point(16) = {18,126,19,lcp}; + +Line(1) = {4,3}; +Line(2) = {3,2}; +Line(3) = {2,1}; +Line(4) = {1,4}; +Line(5) = {5,6}; +Line(6) = {6,7}; +Line(7) = {7,8}; +Line(8) = {8,5}; +Line(9) = {15,14}; +Line(10) = {14,11}; +Line(11) = {11,10}; +Line(12) = {10,15}; +Line(13) = {16,13}; +Line(14) = {13,12}; +Line(15) = {12,9}; +Line(16) = {9,16}; +Line(17) = {4,5}; +Line(18) = {3,6}; +Line(19) = {2,7}; +Line(20) = {1,8}; +Line(21) = {10,9}; +Line(22) = {15,16}; +Line(23) = {14,13}; +Line(24) = {11,12}; + +Line Loop(25) = {5,-18,-1,17}; +Plane Surface(26) = {25}; +Line Loop(27) = {-17,-4,20,8}; +Plane Surface(28) = {27}; +Line Loop(29) = {20,-7,-19,3}; +Plane Surface(30) = {29}; +Line Loop(31) = {6,-19,-2,18}; +Plane Surface(32) = {31}; +Line Loop(33) = {1,2,3,4}; +Line Loop(34) = {9,10,11,12}; +Plane Surface(35) = {33,34}; +Line Loop(36) = {5,6,7,8}; +Line Loop(37) = {13,14,15,16}; +Plane Surface(38) = {36,37}; + +/* Inducteur */ + +Point(17) = {94,50,49,lci}; +Point(18) = {94,150,49,lci}; + +Point(19) = {119,50,49,lci}; +Point(20) = {119,150,49,lci}; + +Point(21) = {144,0,49,lci}; +Point(22) = {144,25,49,lci}; +Point(23) = {144,50,49,lci}; +Point(24) = {144,150,49,lci}; +Point(25) = {144,175,49,lci}; +Point(26) = {144,200,49,lci}; + +Point(27) = {244,0,49,lci}; +Point(28) = {244,25,49,lci}; +Point(29) = {244,50,49,lci}; +Point(30) = {244,150,49,lci}; +Point(31) = {244,175,49,lci}; +Point(32) = {244,200,49,lci}; + +Point(33) = {269,50,49,lci}; +Point(34) = {269,150,49,lci}; + +Point(35) = {294,50,49,lci}; +Point(36) = {294,150,49,lci}; + + +Circle(39) = {25,24,20}; +Circle(40) = {26,24,18}; +Circle(41) = {19,23,22}; +Circle(42) = {17,23,21}; +Circle(43) = {28,29,33}; +Circle(44) = {27,29,35}; +Circle(45) = {34,30,31}; +Circle(46) = {36,30,32}; +Line(47) = {31,32}; +Line(48) = {32,26}; +Line(49) = {26,25}; +Line(50) = {25,31}; +Line(51) = {20,18}; +Line(52) = {18,17}; +Line(53) = {17,19}; +Line(54) = {19,20}; +Line(55) = {22,21}; +Line(56) = {21,27}; +Line(57) = {27,28}; +Line(58) = {28,22}; +Line(59) = {33,35}; +Line(60) = {35,36}; +Line(61) = {36,34}; +Line(62) = {34,33}; + +Line Loop(63) = {48,49,50,47}; +Plane Surface(64) = {63}; +Line Loop(65) = {-47,-45,-61,46}; +Plane Surface(66) = {65}; +Line Loop(67) = {61,62,59,60}; +Plane Surface(68) = {67}; +Line Loop(69) = {-59,-43,-57,44}; +Plane Surface(70) = {69}; +Line Loop(71) = {58,55,56,57}; +Plane Surface(72) = {71}; +Line Loop(73) = {-42,53,41,55}; +Plane Surface(74) = {73}; +Line Loop(75) = {52,53,54,51}; +Plane Surface(76) = {75}; +Line Loop(77) = {-51,-39,-49,40}; +Plane Surface(78) = {77}; + +Extrude(64, {0,0,100}); +Coherence; +Extrude(78, {0,0,100}); +Coherence; +Extrude(76, {0,0,100}); +Coherence; +Extrude(74, {0,0,100}); +Coherence; +Extrude(72, {0,0,100}); +Coherence; +Extrude(70, {0,0,100}); +Coherence; +Extrude(68, {0,0,100}); +Coherence; +Extrude(66, {0,0,100}); +Coherence; + +Line Loop(207) = {-13,-22,9,23}; +Plane Surface(208) = {207}; +Line Loop(209) = {-22,-12,21,16}; +Plane Surface(210) = {209}; +Line Loop(211) = {15,-21,-11,24}; +Plane Surface(212) = {211}; +Line Loop(213) = {24,-14,-23,10}; +Plane Surface(214) = {213}; + +Delete { + Surface(117); +} +Delete { + Surface(143); +} +Delete { + Surface(179); +} +Delete { + Surface(205); +} +Delete { + Surface(227); +} +Delete { + Surface(249); +} diff --git a/benchmarks/3d/piece1.geo b/benchmarks/3d/piece1.geo new file mode 100644 index 0000000000000000000000000000000000000000..9222120b929d6ed27759d2c129b1fbbb43251543 --- /dev/null +++ b/benchmarks/3d/piece1.geo @@ -0,0 +1,149 @@ + +r1 = .1; +l1 = 1.; +l2 = .8; +l3 = .1; +r2 = 1.1; +lc = .1; +lc2 = .04; +rint = .2; +rext = .3; +Point(1) = {0.0,0.0,0.0,lc}; +Point(2) = {l1,0.0,0.0,lc2}; +Point(3) = {l1-r1,0.0,0.0,lc2}; +Point(4) = {l1,r1,0.0,lc2}; +Point(5) = {l1,-r1,0.0,lc2}; +Point(6) = {l1+l2,r1,0.0,lc}; +Point(7) = {l1+l2,-r1,0.0,lc}; +Point(8) = {l1+l2,-r1-l3,0.0,lc}; +Point(9) = {l1+l2,r1+l3,0.0,lc}; + +Line(1) = {4,6}; +Line(2) = {6,9}; +Line(3) = {7,8}; +Line(4) = {5,7}; +Circle(5) = {4,2,3}; +Circle(6) = {3,2,5}; +r = 2*3.14159/5; +Point(10) = { (l1 + r2) * Cos(r/2) , (l1 + r2) * Sin(r/2), 0.0, lc}; +Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},r) { + Duplicata { + Line(1); + Line(2); + Line(3); + Line(4); + Line(5); + Line(6); +Point(10); + } +} +Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},2*r) { + Duplicata { + Line(1); + Line(2); + Line(3); + Line(4); + Line(5); + Line(6); + Point(10); + } +} +Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},3*r) { + Duplicata { + Line(1); + Line(2); + Line(3); + Line(4); + Line(5); + Line(6); + Point(10); + } +} +Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},4*r) { + Duplicata { + Line(1); + Line(2); + Line(3); + Line(4); + Line(5); + Line(6); + Point(10); + } +} +Coherence; +Point(newp) = {rint,0,0,lc}; +Point(newp) = {rext,0,0,lc}; +Point(newp) = {-rint,0,0,lc}; +Point(newp) = {-rext,0,0,lc}; +Point(newp) = {0,rint,0,lc}; +Point(newp) = {0,rext,0,lc}; +Point(newp) = {0,-rint,0,lc}; +Point(newp) = {0,-rext,0,lc}; +Circle(31) = {43,64,74}; +Circle(32) = {16,37,47}; +Circle(33) = {9,10,20}; +Circle(34) = {97,118,8}; +Circle(35) = {101,91,70}; +Circle(36) = {119,1,123}; +Circle(37) = {123,1,121}; +Circle(38) = {121,1,125}; +Circle(39) = {125,1,119}; +Circle(40) = {120,1,124}; +Circle(41) = {124,1,122}; +Circle(42) = {122,1,126}; +Circle(43) = {126,1,120}; +Line Loop(44) = {-21,-22,-24,-23,19,20,-35,-27,-28,-30,-29,25,26,34,-3,-4,-6,-5,1,2,33,-9,-10,-12,-11,7,8,32,-15,-16,-18,-17,13,14,31}; +Line Loop(45) = {43,40,41,42}; +Plane Surface(46) = {44,45}; +Line Loop(47) = {38,39,36,37}; +Plane Surface(48) = {45,47}; +Extrude Surface (46, {0.0,0.0,0.2}); +Coherence; +Extrude Surface (48, {0.0,0.0,0.2}); +Coherence; +Extrude Surface (287, {0.0,0.0,0.2}); +Coherence; +/* +Delete { + Surface(287); +} +Delete { + Surface(266); +} +Delete { + Surface(262); +} +Delete { + Surface(270); +} +Delete { + Surface(236); +} +Delete { + Surface(258); +} +Delete { + Surface(232); +} +Delete { + Surface(244); +} +Delete { + Surface(240); +} +Delete { + Line(239); +} +Delete { + Line(230); +} +Delete { + Line(231); +} +Delete { + Line(235); +} +Coherence; +*/ +Surface Loop(330) = {245,92,46,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,48,274,278,282,286,328,316,320,324,329,300,304,308,312}; +Complex Volume(331) = {330}; diff --git a/benchmarks/3d/qq b/benchmarks/3d/qq new file mode 100644 index 0000000000000000000000000000000000000000..b57b28da0df0a9f74281c4e47ee32b89e310754a --- /dev/null +++ b/benchmarks/3d/qq @@ -0,0 +1,86 @@ +%!PS-Adobe-3.0 +%%LanguageLevel: 1 +%%Title: Cube-01 +%%Creator: Gmsh +%%Pages: (atend) +%%EndComments +%%BeginProlog +% RGB color command - r g b C +/C { setrgbcolor } bind def +% Font choose - size fontname FC +/FC { findfont exch scalefont setfont } bind def +% String primitive - (string) x y r g b size fontname S +/S { FC C moveto show } bind def +% Point primitive - x y r g b P +/P { C newpath 0.5 0.0 360.0 arc closepath fill } bind def +% Flat-shaded line - x2 y2 x1 y1 r g b L +/L { C newpath moveto lineto stroke } bind def +% Smooth-shaded line - x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 SL +/SL { +/b1 exch def /g1 exch def /r1 exch def +/y1 exch def /x1 exch def +/b2 exch def /g2 exch def /r2 exch def +/y2 exch def /x2 exch def +b2 b1 sub abs 0.01 gt +g2 g1 sub abs 0.005 gt +r2 r1 sub abs 0.008 gt +or or { +/bm b1 b2 add 0.5 mul def +/gm g1 g2 add 0.5 mul def +/rm r1 r2 add 0.5 mul def +/ym y1 y2 add 0.5 mul def +/xm x1 x2 add 0.5 mul def +x1 y1 r1 g1 b1 xm ym rm gm bm SL +xm ym rm gm bm x2 y2 r2 g2 b2 SL +} { +x1 y1 x2 y2 r1 g1 b1 L +} ifelse +} bind def +% Flat-shaded triangle - x3 y3 x2 y2 x1 y1 r g b T +/T { C newpath moveto lineto lineto closepath fill } bind def +% Smooth-shaded triangle - x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST +/ST { +/b1 exch def /g1 exch def /r1 exch def +/y1 exch def /x1 exch def +/b2 exch def /g2 exch def /r2 exch def +/y2 exch def /x2 exch def +/b3 exch def /g3 exch def /r3 exch def +/y3 exch def /x3 exch def +b2 b1 sub abs 0.05 gt +g2 g1 sub abs 0.017 gt +r2 r1 sub abs 0.032 gt +b3 b1 sub abs 0.05 gt +g3 g1 sub abs 0.017 gt +r3 r1 sub abs 0.032 gt +b2 b3 sub abs 0.05 gt +g2 g3 sub abs 0.017 gt +r2 r3 sub abs 0.032 gt +or or or or or or or or { +/b12 b1 b2 add 0.5 mul def +/g12 g1 g2 add 0.5 mul def +/r12 r1 r2 add 0.5 mul def +/y12 y1 y2 add 0.5 mul def +/x12 x1 x2 add 0.5 mul def +/b13 b1 b3 add 0.5 mul def +/g13 g1 g3 add 0.5 mul def +/r13 r1 r3 add 0.5 mul def +/y13 y1 y3 add 0.5 mul def +/x13 x1 x3 add 0.5 mul def +/b32 b3 b2 add 0.5 mul def +/g32 g3 g2 add 0.5 mul def +/r32 r3 r2 add 0.5 mul def +/y32 y3 y2 add 0.5 mul def +/x32 x3 x2 add 0.5 mul def +x1 y1 r1 g1 b1 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13 +x2 y2 r2 g2 b2 x12 y12 r12 g12 b12 x32 y32 r32 g32 b32 +x3 y3 r3 g3 b3 x32 y32 r32 g32 b32 x13 y13 r13 g13 b13 +x32 y32 r32 g32 b32 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13 +ST ST ST ST +} { +x1 y1 x2 y2 x3 y3 r1 g1 b1 T +} ifelse +} bind def +%%EndProlog +%%Page: 1 +%%PageBoundingBox: 0 0 800 579 +gsave diff --git a/benchmarks/3d/runner_simple_3d.geo b/benchmarks/3d/runner_simple_3d.geo new file mode 100644 index 0000000000000000000000000000000000000000..c3fbab83f64213d11d9a79f4b16256cece36e42f --- /dev/null +++ b/benchmarks/3d/runner_simple_3d.geo @@ -0,0 +1,141 @@ +/*simple runner for 3d-studies; 07.07.1999/hm*/ + + +/*variables*/ +r=0.004; +a=0.005; +b=0.005; +m=0.010; +mh=0.020; + +h1=0.005; +h2=0.005; +h3=0.005; +h4=0.005; +hl = 0.012; +f =0.015; +l =0.040; + +lc1 = 0.004; + +/*points*/ + +Point(1) = {-r,0.0,0.0,lc1}; + +Point(2) = {0,0.0,0.0,lc1}; + +Point(3) = {+r,0.0,0.0,lc1}; +Point(4) = {r+a,0.0,0.0,lc1}; +Point(5) = {r+a+b,0.0,0.0,lc1}; +Point(6) = {r+a+b,-h4,0.0,lc1}; + +Point(11) = {-r,h1,0.0,lc1}; + +Point(13) = {+r,h1,0.0,lc1}; +Point(14) = {r+a,h2,0.0,lc1}; +Point(15) = {r+a+b,h3,0.0,lc1}; + +/*flange*/ + +Point(25) = {r+a+b+f,0,0.0,lc1}; +Point(26) = {r+a+b+f,h3,0.0,lc1}; +Point(27) = {r+a+b+f,-h4,0.0,lc1}; +Point(28) = {r+a+b+f,-hl,0.0,lc1}; + +/*laminate*/ + +Point(30) = {r+a+b+f+l,0.0,0.0,lc1}; +Point(31) = {r+a+b+f+l,h3,0.0,lc1}; +Point(32) = {r+a+b+f+l,-h4,0.0,lc1}; +Point(33) = {r+a+b+f+l,-hl,0.0,lc1}; + +/*lines*/ + +Circle(100) = {1,2,3}; + +Line(101) = {1,11}; +Line(102) = {11,13}; +Line(103) = {13,14}; +Line(104) = {14,15}; +Line(105) = {3,13}; +Line(106) = {3,4}; +Line(107) = {4,14}; +Line(108) = {4,5}; +Line(109) = {5,15}; + + + +Line(110) = {15,26}; +Line(111) = {5,25}; +Line(112) = {6,27}; +Line(113) = {5,6}; +Line(114) = {26,25}; +Line(115) = {25,27}; +Line(116) = {26,31}; +Line(117) = {25,30}; +Line(118) = {27,32}; +Line(119) = {31,30}; +Line(120) = {30,32}; + +Line(121) = {27,28}; +Line(122) = {28,33}; +Line(123) = {32,33}; + +Line Loop(300) = {-102,-101,100,105}; +Plane Surface(301) = {300}; +Line Loop(400) = {107,-103,-105,106}; +Plane Surface(401) = {400}; +Line Loop(402) = {109,-104,-107,108}; +Plane Surface(403) = {402}; + + +Line Loop(404) = {-114,-110,-109,111}; +Plane Surface(405) = {404}; +Line Loop(406) = {-112,-113,111,115}; +Plane Surface(407) = {406}; +Line Loop(408) = {117,-119,-116,114}; +Plane Surface(409) = {408}; +Line Loop(410) = {118,-120,-117,115}; +Plane Surface(411) = {410}; +Line Loop(412) = {118,123,-122,-121}; +Plane Surface(413) = {412}; + +/*mould*/ + +Point(511) = {-m,h1,0.0,lc1}; +Point(512) = {-m,h1-mh,0.0,lc1}; +Point(533) = {r+a+b+f+l,h1-mh,0.0,lc1}; + +Line(614) = {511,512}; +Line(615) = {511,11}; +Line(616) = {512,533}; +Line(617) = {533,33}; +/* +Line Loop(618) = {-617,-616,-614,615,-101,100,106,108,113,112,121,122,-617,-616,-614,615,- +101,100,106,108,113,112};*/ + +Line Loop(618) = {-617,-616,-614,615,-101,100,106,108,113,112,121,122}; +Plane Surface(619) = {618}; + +ex = .05; + +Extrude(619, {0.0,0.0,ex}); +Coherence; +Extrude(301, {0.0,0.0,ex}); +Coherence; +Extrude(401, {0.0,0.0,ex}); +Coherence; +Extrude(403, {0.0,0.0,ex}); +Coherence; +Extrude(405, {0.0,0.0,ex}); +Coherence; +Extrude(407, {0.0,0.0,ex}); +Coherence; +Extrude(409, {0.0,0.0,ex}); +Coherence; +Extrude(411, {0.0,0.0,ex}); +Coherence; +Extrude(413, {0.0,0.0,ex}); +Coherence; + + diff --git a/benchmarks/3d/ss b/benchmarks/3d/ss new file mode 100644 index 0000000000000000000000000000000000000000..b57b28da0df0a9f74281c4e47ee32b89e310754a --- /dev/null +++ b/benchmarks/3d/ss @@ -0,0 +1,86 @@ +%!PS-Adobe-3.0 +%%LanguageLevel: 1 +%%Title: Cube-01 +%%Creator: Gmsh +%%Pages: (atend) +%%EndComments +%%BeginProlog +% RGB color command - r g b C +/C { setrgbcolor } bind def +% Font choose - size fontname FC +/FC { findfont exch scalefont setfont } bind def +% String primitive - (string) x y r g b size fontname S +/S { FC C moveto show } bind def +% Point primitive - x y r g b P +/P { C newpath 0.5 0.0 360.0 arc closepath fill } bind def +% Flat-shaded line - x2 y2 x1 y1 r g b L +/L { C newpath moveto lineto stroke } bind def +% Smooth-shaded line - x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 SL +/SL { +/b1 exch def /g1 exch def /r1 exch def +/y1 exch def /x1 exch def +/b2 exch def /g2 exch def /r2 exch def +/y2 exch def /x2 exch def +b2 b1 sub abs 0.01 gt +g2 g1 sub abs 0.005 gt +r2 r1 sub abs 0.008 gt +or or { +/bm b1 b2 add 0.5 mul def +/gm g1 g2 add 0.5 mul def +/rm r1 r2 add 0.5 mul def +/ym y1 y2 add 0.5 mul def +/xm x1 x2 add 0.5 mul def +x1 y1 r1 g1 b1 xm ym rm gm bm SL +xm ym rm gm bm x2 y2 r2 g2 b2 SL +} { +x1 y1 x2 y2 r1 g1 b1 L +} ifelse +} bind def +% Flat-shaded triangle - x3 y3 x2 y2 x1 y1 r g b T +/T { C newpath moveto lineto lineto closepath fill } bind def +% Smooth-shaded triangle - x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST +/ST { +/b1 exch def /g1 exch def /r1 exch def +/y1 exch def /x1 exch def +/b2 exch def /g2 exch def /r2 exch def +/y2 exch def /x2 exch def +/b3 exch def /g3 exch def /r3 exch def +/y3 exch def /x3 exch def +b2 b1 sub abs 0.05 gt +g2 g1 sub abs 0.017 gt +r2 r1 sub abs 0.032 gt +b3 b1 sub abs 0.05 gt +g3 g1 sub abs 0.017 gt +r3 r1 sub abs 0.032 gt +b2 b3 sub abs 0.05 gt +g2 g3 sub abs 0.017 gt +r2 r3 sub abs 0.032 gt +or or or or or or or or { +/b12 b1 b2 add 0.5 mul def +/g12 g1 g2 add 0.5 mul def +/r12 r1 r2 add 0.5 mul def +/y12 y1 y2 add 0.5 mul def +/x12 x1 x2 add 0.5 mul def +/b13 b1 b3 add 0.5 mul def +/g13 g1 g3 add 0.5 mul def +/r13 r1 r3 add 0.5 mul def +/y13 y1 y3 add 0.5 mul def +/x13 x1 x3 add 0.5 mul def +/b32 b3 b2 add 0.5 mul def +/g32 g3 g2 add 0.5 mul def +/r32 r3 r2 add 0.5 mul def +/y32 y3 y2 add 0.5 mul def +/x32 x3 x2 add 0.5 mul def +x1 y1 r1 g1 b1 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13 +x2 y2 r2 g2 b2 x12 y12 r12 g12 b12 x32 y32 r32 g32 b32 +x3 y3 r3 g3 b3 x32 y32 r32 g32 b32 x13 y13 r13 g13 b13 +x32 y32 r32 g32 b32 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13 +ST ST ST ST +} { +x1 y1 x2 y2 x3 y3 r1 g1 b1 T +} ifelse +} bind def +%%EndProlog +%%Page: 1 +%%PageBoundingBox: 0 0 800 579 +gsave diff --git a/benchmarks/3d/surface3113.geo b/benchmarks/3d/surface3113.geo new file mode 100644 index 0000000000000000000000000000000000000000..e57c0588d5a9c82407606530772053ee430a7476 --- /dev/null +++ b/benchmarks/3d/surface3113.geo @@ -0,0 +1,112 @@ +lc = 5.00000E+01; +Point(2) = {-2.70000E-02,-2.40000E-02, 1.00000E-02, 1.00000E-02}; +Point(4) = {-2.70000E-02,-4.00000E-03, 1.00000E-02, 3.33333E-03}; +Point(10) = { 1.79430E+00,-4.00000E-02, 1.00000E-02, 2.00000E-02}; +Point(12) = { 1.79430E+00,-2.00000E-02, 1.00000E-02, 2.00000E-02}; +Point(211) = { 1.18995E-02,-1.01059E-02, 1.00000E-02, 1.00000E-02}; +Point(212) = { 1.58995E-02,-1.01059E-02, 1.00000E-02, 1.00000E-02}; +Point(213) = { 1.18995E-02,-6.10592E-03, 1.00000E-02, 1.00000E-02}; +Point(214) = { 7.89953E-03,-1.01059E-02, 1.00000E-02, 1.00000E-02}; +Point(215) = { 1.18995E-02,-1.41059E-02, 1.00000E-02, 1.00000E-02}; +Point(411) = { 4.17983E-02,-1.03721E-02, 1.00000E-02, 1.00000E-02}; +Point(412) = { 4.57983E-02,-1.03721E-02, 1.00000E-02, 1.00000E-02}; +Point(413) = { 4.17983E-02,-6.37207E-03, 1.00000E-02, 1.00000E-02}; +Point(414) = { 3.77983E-02,-1.03721E-02, 1.00000E-02, 1.00000E-02}; +Point(415) = { 4.17983E-02,-1.43721E-02, 1.00000E-02, 1.00000E-02}; +Point(611) = { 8.24967E-02,-1.17343E-02, 1.00000E-02, 1.00000E-02}; +Point(612) = { 8.74967E-02,-1.17343E-02, 1.00000E-02, 1.00000E-02}; +Point(613) = { 8.24967E-02,-6.73435E-03, 1.00000E-02, 1.00000E-02}; +Point(614) = { 7.74967E-02,-1.17343E-02, 1.00000E-02, 1.00000E-02}; +Point(615) = { 8.24967E-02,-1.67343E-02, 1.00000E-02, 1.00000E-02}; +Point(811) = { 1.38495E-01,-1.32328E-02, 1.00000E-02, 1.00000E-02}; +Point(812) = { 1.44495E-01,-1.32328E-02, 1.00000E-02, 1.00000E-02}; +Point(813) = { 1.38495E-01,-7.23281E-03, 1.00000E-02, 1.00000E-02}; +Point(814) = { 1.32495E-01,-1.32328E-02, 1.00000E-02, 1.00000E-02}; +Point(815) = { 1.38495E-01,-1.92328E-02, 1.00000E-02, 1.00000E-02}; +Point(1011) = { 2.11992E-01,-1.38870E-02, 1.00000E-02, 1.00000E-02}; +Point(1012) = { 2.17992E-01,-1.38870E-02, 1.00000E-02, 1.00000E-02}; +Point(1013) = { 2.11992E-01,-7.88705E-03, 1.00000E-02, 1.00000E-02}; +Point(1014) = { 2.05992E-01,-1.38870E-02, 1.00000E-02, 1.00000E-02}; +Point(1015) = { 2.11992E-01,-1.98870E-02, 1.00000E-02, 1.00000E-02}; +Point(1211) = { 3.12488E-01,-1.47816E-02, 1.00000E-02, 1.00000E-02}; +Point(1212) = { 3.18488E-01,-1.47816E-02, 1.00000E-02, 1.00000E-02}; +Point(1213) = { 3.12488E-01,-8.78162E-03, 1.00000E-02, 1.00000E-02}; +Point(1214) = { 3.06488E-01,-1.47816E-02, 1.00000E-02, 1.00000E-02}; +Point(1215) = { 3.12488E-01,-2.07816E-02, 1.00000E-02, 1.00000E-02}; +Point(1411) = { 4.48482E-01,-1.59922E-02, 1.00000E-02, 1.00000E-02}; +Point(1412) = { 4.54482E-01,-1.59922E-02, 1.00000E-02, 1.00000E-02}; +Point(1413) = { 4.48482E-01,-9.99218E-03, 1.00000E-02, 1.00000E-02}; +Point(1414) = { 4.42482E-01,-1.59922E-02, 1.00000E-02, 1.00000E-02}; +Point(1415) = { 4.48482E-01,-2.19922E-02, 1.00000E-02, 1.00000E-02}; +Point(1611) = { 6.32475E-01,-1.76300E-02, 1.00000E-02, 1.10000E-02}; +Point(1612) = { 6.38475E-01,-1.76300E-02, 1.00000E-02, 1.10000E-02}; +Point(1613) = { 6.32475E-01,-1.16300E-02, 1.00000E-02, 1.10000E-02}; +Point(1614) = { 6.26475E-01,-1.76300E-02, 1.00000E-02, 1.10000E-02}; +Point(1615) = { 6.32475E-01,-2.36300E-02, 1.00000E-02, 1.10000E-02}; +Point(1811) = { 8.87965E-01,-1.99042E-02, 1.00000E-02, 1.60000E-02}; +Point(1812) = { 8.93965E-01,-1.99042E-02, 1.00000E-02, 1.60000E-02}; +Point(1813) = { 8.87965E-01,-1.39042E-02, 1.00000E-02, 1.60000E-02}; +Point(1814) = { 8.81965E-01,-1.99042E-02, 1.00000E-02, 1.60000E-02}; +Point(1815) = { 8.87965E-01,-2.59042E-02, 1.00000E-02, 1.60000E-02}; +Point(2011) = { 1.24165E+00,-2.30526E-02, 1.00000E-02, 2.00000E-02}; +Point(2012) = { 1.24765E+00,-2.30526E-02, 1.00000E-02, 2.00000E-02}; +Point(2013) = { 1.24165E+00,-1.70526E-02, 1.00000E-02, 2.00000E-02}; +Point(2014) = { 1.23565E+00,-2.30526E-02, 1.00000E-02, 2.00000E-02}; +Point(2015) = { 1.24165E+00,-2.90526E-02, 1.00000E-02, 2.00000E-02}; +Point(2211) = { 1.73423E+00,-2.74373E-02, 1.00000E-02, 2.40000E-02}; +Point(2212) = { 1.74023E+00,-2.74373E-02, 1.00000E-02, 2.40000E-02}; +Point(2213) = { 1.73423E+00,-2.14373E-02, 1.00000E-02, 2.40000E-02}; +Point(2214) = { 1.72823E+00,-2.74373E-02, 1.00000E-02, 2.40000E-02}; +Point(2215) = { 1.73423E+00,-3.34373E-02, 1.00000E-02, 2.40000E-02}; +Line (26) = {4,12}; +Line (6) = {2,4}; +Line (25) = {2,10}; +Line (16) = {10,12}; +Circle (216) = {215,211,212} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (213) = {212,211,213} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (214) = {213,211,214} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (215) = {214,211,215} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (416) = {415,411,412} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (413) = {412,411,413} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (414) = {413,411,414} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (415) = {414,411,415} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (616) = {615,611,612} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (613) = {612,611,613} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (614) = {613,611,614} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (615) = {614,611,615} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (816) = {815,811,812} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (813) = {812,811,813} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (814) = {813,811,814} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (815) = {814,811,815} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1016) = {1015,1011,1012} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1013) = {1012,1011,1013} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1014) = {1013,1011,1014} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1015) = {1014,1011,1015} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1216) = {1215,1211,1212} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1213) = {1212,1211,1213} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1214) = {1213,1211,1214} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1215) = {1214,1211,1215} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1416) = {1415,1411,1412} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1413) = {1412,1411,1413} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1414) = {1413,1411,1414} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1415) = {1414,1411,1415} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1616) = {1615,1611,1612} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1613) = {1612,1611,1613} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1614) = {1613,1611,1614} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1615) = {1614,1611,1615} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1816) = {1815,1811,1812} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1813) = {1812,1811,1813} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1814) = {1813,1811,1814} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (1815) = {1814,1811,1815} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (2016) = {2015,2011,2012} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (2013) = {2012,2011,2013} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (2014) = {2013,2011,2014} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (2015) = {2014,2011,2015} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (2216) = {2215,2211,2212} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (2213) = {2212,2211,2213} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (2214) = {2213,2211,2214} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Circle (2215) = {2214,2211,2215} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; +Line Loop (1003113) = {-26, -6, 25, 16,216,213,214,215,416,413,414,415,616,613,614,615,816,813,814,815,1016,1013,1014,1015,1216,1213,1214,1215,1416,1413,1414,1415,1616,1613,1614,1615,1816,1813,1814,1815,2016,2013,2014,2015,2216,2213,2214,2215}; +Plane Surface (3113) = {1003113}; +Line Loop (1003113) = {-26, -6, 25, 16,216,213,214,215,416,413,414,415,616,613,614,615,816,813,814,815,1016,1013,1014,1015,1216,1213,1214,1215,1416,1413,1414,1415,1616,1613,1614,1615,1816,1813,1814,1815,2016,2013,2014,2015,2216,2213,2214,2215}; +Plane Surface (3113) = {1003113}; diff --git a/benchmarks/3d/vulp5.geo b/benchmarks/3d/vulp5.geo new file mode 100644 index 0000000000000000000000000000000000000000..98564699af185a8a800799b20637f4954df256bd --- /dev/null +++ b/benchmarks/3d/vulp5.geo @@ -0,0 +1,1153 @@ +/* Antenne VULP 9118-E */ + +Frequence = 235.e6 ; +Lambda = 2.99792458e8/Frequence ; +LambdaDemi = Lambda/2 ; + +f1 = 10.e-3 ; + +si = 50.e-3 ; +si1= 20.e-3 ; +si2= 100.e-3 ; +se = 300.e-3 ; + +/* 2 longerons */ + +xmin =-27.e-3 ; +LL = 1821.3e-3 ; +ll = 20.e-3 ; +hh = 20.e-3 ; +dc = 8.e-3 ; +em = 8.e-3/2 ; +eM = 40.e-3/2 ; +t = ArcTan(eM/2-em/2/LL) ; + +/* 22 barreaux */ +/* longueur ; rayon ; dist % barreau 1 ; dist%y=0 */ + l1 = 77.e-3/2-ll/2 ; r1 = 8.e-3/2 ; d1 = 0 ; e1 = em+dc+d1*Sin(t)-2.e-3 ; + l2 = 91.e-3/2-ll/2 ; r2 = 8.e-3/2 ; d2 = 11.9e-3*Cos(t) ; e2 = em+dc+d2*Sin(t)-2.e-3 ; + l3 = 105.e-3/2-ll/2 ; r3 = 8.e-3/2 ; d3 = 25.8e-3*Cos(t) ; e3 = em+dc+d3*Sin(t)-2.e-3 ; + l4 = 122.e-3/2-ll/2 ; r4 = 8.e-3/2 ; d4 = 41.8e-3*Cos(t) ; e4 = em+dc+d4*Sin(t)-2.e-3 ; + l5 = 142.e-3/2-ll/2 ; r5 = 10.e-3/2 ; d5 = 60.5e-3*Cos(t) ; e5 = em+dc+d5*Sin(t)-1.e-3 ; + l6 = 164.e-3/2-ll/2 ; r6 = 10.e-3/2 ; d6 = 82.5e-3*Cos(t) ; e6 = em+dc+d6*Sin(t)-1.e-3 ; + l7 = 192.e-3/2-ll/2 ; r7 = 12.e-3/2 ; d7 = 107.0e-3*Cos(t) ; e7 = em+dc+d7*Sin(t) ; + l8 = 224.e-3/2-ll/2 ; r8 = 12.e-3/2 ; d8 = 138.5e-3*Cos(t) ; e8 = em+dc+d8*Sin(t) ; + l9 = 260.e-3/2-ll/2 ; r9 = 12.e-3/2 ; d9 = 172.0e-3*Cos(t) ; e9 = em+dc+d9*Sin(t) ; +l10 = 303.e-3/2-ll/2 ; r10 = 12.e-3/2 ; d10 = 212.0e-3*Cos(t) ; e10 = em+dc+d10*Sin(t) ; +l11 = 353.e-3/2-ll/2 ; r11 = 12.e-3/2 ; d11 = 258.5e-3*Cos(t) ; e11 = em+dc+d11*Sin(t) ; +l12 = 410.e-3/2-ll/2 ; r12 = 12.e-3/2 ; d12 = 312.5e-3*Cos(t) ; e12 = em+dc+d12*Sin(t) ; +l13 = 477.e-3/2-ll/2 ; r13 = 12.e-3/2 ; d13 = 375.0e-3*Cos(t) ; e13 = em+dc+d13*Sin(t) ; +l14 = 554.e-3/2-ll/2 ; r14 = 12.e-3/2 ; d14 = 448.5e-3*Cos(t) ; e14 = em+dc+d14*Sin(t) ; +l15 = 645.e-3/2-ll/2 ; r15 = 12.e-3/2 ; d15 = 533.0e-3*Cos(t) ; e15 = em+dc+d15*Sin(t) ; +l16 = 749.e-3/2-ll/2 ; r16 = 12.e-3/2 ; d16 = 632.5e-3*Cos(t) ; e16 = em+dc+d16*Sin(t) ; +l17 = 877.e-3/2-ll/2 ; r17 = 12.e-3/2 ; d17 = 750.5e-3*Cos(t) ; e17 = em+dc+d17*Sin(t) ; +l18 = 1023.e-3/2-ll/2 ; r18 = 12.e-3/2 ; d18 = 888.0e-3*Cos(t) ; e18 = em+dc+d18*Sin(t) ; +l19 = 1196.e-3/2-ll/2 ; r19 = 12.e-3/2 ; d19 = 1050.3e-3*Cos(t) ; e19 = em+dc+d19*Sin(t) ; +l20 = 1404.e-3/2-ll/2 ; r20 = 12.e-3/2 ; d20 = 1241.7e-3*Cos(t) ; e20 = em+dc+d20*Sin(t) ; +l21 = 1648.e-3/2-ll/2 ; r21 = 12.e-3/2 ; d21 = 1467.7e-3*Cos(t) ; e21 = em+dc+d21*Sin(t) ; +l22 = 1934.e-3/2-ll/2 ; r22 = 12.e-3/2 ; d22 = 1734.3e-3*Cos(t) ; e22 = em+dc+d22*Sin(t) ; + +/* long caract */ + s1 = f1 ; s1l = f1 ; + s2 = f1 ; s2l = f1 ; + s3 = f1 ; s3l = f1 ; + s4 = f1 ; s4l = f1 ; + s5 = f1 ; s5l = f1 ; + s6 = f1 ; s6l = f1 ; + s7 = f1 ; s7l = f1 ; + s8 = f1 ; s8l = f1 ; + s9 = f1 ; s9l = f1 ; +s10 = f1 ; s10l = f1 ; +s11 = f1 ; s11l = f1 ; +s12 = f1 ; s12l = f1 ; +s13 = f1 ; s13l = f1 ; +s14 = f1 ; s14l = 1.3*f1 ; +s15 = f1 ; s15l = 1.6*f1 ; +s16 = 1.1*f1 ; s16l = 2*f1 ; +s17 = 1.4*f1 ; s17l = 2.3*f1 ; +s18 = 1.6*f1 ; s18l = 2.6*f1 ; +s19 = 1.8*f1 ; s19l = 3*f1 ; +s20 = 2.0*f1 ; s20l = 3.3*f1 ; +s21 = 2.2*f1 ; s21l = 3.6*f1 ; +s22 = 2.4*f1 ; s22l = 4*f1 ; + +Point(9998) = {d11, 0, -l15, 1} ; + +/* boite */ + +abs = LambdaDemi ; +bem = 2*si ; + +bxM = -200.e-3 ; bxm = bxM+bem ; bxP = 2000.e-3 ; bxp = bxP-bem ; +byM = -150.e-3 ; bym = byM+bem ; byP = 150.e-3 ; byp = byP-bem ; +bzM = -1200.e-3 ; bzm = bzM+bem ; bzP = 1200.e-3 ; bzp = bzP-bem ; + +bxM2 = bxM-abs ; bxP2 = bxP+abs ; +byM2 = byM-abs ; byP2 = byP+abs ; +bzM2 = bzM-abs ; bzP2 = bzP+abs ; + +/* longerons */ + +Point(1) = {xmin, -em-hh, -ll/2, f1} ; Point(5) = {xmin, em, -ll/2, f1/3} ; +Point(2) = {xmin, -em-hh, ll/2, f1} ; Point(6) = {xmin, em, ll/2, f1/3} ; +Point(3) = {xmin, -em, -ll/2, f1/3} ; Point(7) = {xmin, em+hh, -ll/2, f1} ; +Point(4) = {xmin, -em, ll/2, f1/3} ; Point(8) = {xmin, em+hh, ll/2, f1} ; + +f3 = s22/1.2 ; + +Point(9) = {xmin+LL, -eM-hh, -ll/2, f3} ; Point(13) = {xmin+LL, eM, -ll/2, f3} ; +Point(10) = {xmin+LL, -eM-hh, ll/2, f3} ; Point(14) = {xmin+LL, eM, ll/2, f3} ; +Point(11) = {xmin+LL, -eM, -ll/2, f3} ; Point(15) = {xmin+LL, eM+hh, -ll/2, f3} ; +Point(12) = {xmin+LL, -eM, ll/2, f3} ; Point(16) = {xmin+LL, eM+hh, ll/2, f3} ; + +Line(1) = {5,6}; Line(11) = {13,14}; +Line(2) = {6,8}; Line(12) = {14,16}; +Line(3) = {8,7}; Line(13) = {16,15}; +Line(4) = {7,5}; Line(14) = {15,13}; +Line(5) = {1,2}; Line(15) = {9,10}; +Line(6) = {2,4}; Line(16) = {10,12}; +Line(7) = {4,3}; Line(17) = {12,11}; +Line(8) = {3,1}; Line(18) = {11,9}; +Line(9) = {4,6}; Line(19) = {12,14}; +Line(10) = {3,5}; Line(20) = {11,13}; + +Line(21) = {8,16}; Line(25) = {2,10}; +Line(22) = {7,15}; Line(26) = {4,12}; +Line(23) = {6,14}; Line(27) = {3,11}; +Line(24) = {5,13}; Line(28) = {1,9}; + +/* boite */ + +Point(51) = {bxm, bym, bzm, si1}; Point(61) = {bxM, byM, bzM, si2}; +Point(52) = {bxm, bym, bzp, si1}; Point(62) = {bxM, byM, bzP, si2}; +Point(53) = {bxm, byp, bzm, si1}; Point(63) = {bxM, byP, bzM, si2}; +Point(54) = {bxm, byp, bzp, si1}; Point(64) = {bxM, byP, bzP, si2}; +Point(55) = {bxp, bym, bzm, si}; Point(65) = {bxP, byM, bzM, si2}; +Point(56) = {bxp, bym, bzp, si}; Point(66) = {bxP, byM, bzP, si2}; +Point(57) = {bxp, byp, bzm, si}; Point(67) = {bxP, byP, bzM, si2}; +Point(58) = {bxp, byp, bzp, si}; Point(68) = {bxP, byP, bzP, si2}; + +Line(51) = {51,52}; Line(59) = {52,54}; Line(67) = {54,53}; Line(75) = {53,51}; +Line(52) = {52,56}; Line(60) = {56,58}; Line(68) = {58,54}; Line(76) = {51,55}; +Line(53) = {55,57}; Line(61) = {57,53}; Line(69) = {55,56}; Line(77) = {58,57}; +Line(54) = {53,63}; Line(62) = {51,61}; Line(70) = {54,64}; Line(78) = {52,62}; +Line(55) = {62,61}; Line(63) = {61,63}; Line(71) = {63,64}; Line(79) = {64,62}; +Line(56) = {57,67}; Line(64) = {55,65}; Line(72) = {65,67}; Line(80) = {67,63}; +Line(57) = {61,65}; Line(65) = {58,68}; Line(73) = {56,66}; Line(81) = {66,65}; +Line(58) = {68,67}; Line(66) = {68,66}; Line(74) = {66,62}; Line(82) = {64,68}; + +Point(70) = {bxM2, byM2, bzM2, se}; Point(71) = {bxM2, byM2, bzP2, se}; +Point(72) = {bxM2, byP2, bzM2, se}; Point(73) = {bxM2, byP2, bzP2, se}; +Point(74) = {bxP2, byM2, bzM2, se}; Point(75) = {bxP2, byM2, bzP2, se}; +Point(76) = {bxP2, byP2, bzM2, se}; Point(77) = {bxP2, byP2, bzP2, se}; + +Line(7001) = {70,71}; Line(7002) = {71,73}; Line(7003) = {73,72}; Line(7004) = {72,70}; +Line(7005) = {71,75}; Line(7006) = {75,77}; Line(7007) = {77,73}; Line(7008) = {74,75}; +Line(7009) = {74,76}; Line(7010) = {76,77}; Line(7011) = {76,72}; Line(7012) = {74,70}; +Line(7013) = {63,72}; Line(7014) = {61,70}; Line(7015) = {62,71}; Line(7016) = {64,73}; +Line(7017) = {68,77}; Line(7018) = {66,75}; Line(7019) = {67,76}; Line(7020) = {65,74}; + +/* barreau 1 et 1' (le + a gauche, i.e. en x==0) */ + +Point(101) = {d1, -e1, -ll/2, s1}; Point(111) = {d1, e1, ll/2, s1}; +Point(102) = {d1+r1, -e1, -ll/2, s1}; Point(112) = {d1+r1, e1, ll/2, s1}; +Point(103) = {d1, -e1+r1, -ll/2, s1}; Point(113) = {d1, e1+r1, ll/2, s1}; +Point(104) = {d1-r1, -e1, -ll/2, s1}; Point(114) = {d1-r1, e1, ll/2, s1}; +Point(105) = {d1, -e1-r1, -ll/2, s1}; Point(115) = {d1, e1-r1, ll/2, s1}; +Point(106) = {d1, -e1, -ll/2-l1, s1l}; Point(116) = {d1, e1, ll/2+l1, s1l}; +Point(107) = {d1+r1, -e1, -ll/2-l1, s1l}; Point(117) = {d1+r1, e1, ll/2+l1, s1l}; +Point(108) = {d1, -e1+r1, -ll/2-l1, s1l}; Point(118) = {d1, e1+r1, ll/2+l1, s1l}; +Point(109) = {d1-r1, -e1, -ll/2-l1, s1l}; Point(119) = {d1-r1, e1, ll/2+l1, s1l}; +Point(110) = {d1, -e1-r1, -ll/2-l1, s1l}; Point(120) = {d1, e1-r1, ll/2+l1, s1l}; + +Circle(101) = {102,101,103}; Circle(105) = {107,106,108}; Line(109) = {102,107}; +Circle(102) = {103,101,104}; Circle(106) = {108,106,109}; Line(110) = {103,108}; +Circle(103) = {104,101,105}; Circle(107) = {109,106,110}; Line(111) = {104,109}; +Circle(104) = {105,101,102}; Circle(108) = {110,106,107}; Line(112) = {105,110}; + +Circle(113) = {112,111,113}; Circle(117) = {117,116,118}; Line(121) = {112,117}; +Circle(114) = {113,111,114}; Circle(118) = {118,116,119}; Line(122) = {113,118}; +Circle(115) = {114,111,115}; Circle(119) = {119,116,120}; Line(123) = {114,119}; +Circle(116) = {115,111,112}; Circle(120) = {120,116,117}; Line(124) = {115,120}; + +Line Loop(101) = {102,103,104,101}; Plane Surface(121) = {101}; +Line Loop(102) = {107,108,105,106}; Plane Surface(122) = {102}; +Line Loop(103) = {116,113,114,115}; Plane Surface(123) = {103}; +Line Loop(104) = {120,117,118,119}; Plane Surface(124) = {104}; +Line Loop(105) = {108,-109,-104,112}; Ruled Surface(125) = {105}; +Line Loop(106) = {112,-107,-111,103}; Ruled Surface(126) = {106}; +Line Loop(107) = {-111,-102,110,106}; Ruled Surface(127) = {107}; +Line Loop(108) = {-110,-101,109,105}; Ruled Surface(128) = {108}; +Line Loop(109) = {121,-120,-124,116}; Ruled Surface(129) = {109}; +Line Loop(110) = {-124,-115,123,119}; Ruled Surface(130) = {110}; +Line Loop(111) = {123,-118,-122,114}; Ruled Surface(131) = {111}; +Line Loop(112) = {122,-117,-121,113}; Ruled Surface(132) = {112}; + +/* barreau 2 et 2' */ + +Point(201) = {d2, e2, -ll/2, s2}; Point(211) = {d2, -e2, ll/2, s2}; +Point(202) = {d2+r2, e2, -ll/2, s2}; Point(212) = {d2+r2, -e2, ll/2, s2}; +Point(203) = {d2, e2+r2, -ll/2, s2}; Point(213) = {d2, -e2+r2, ll/2, s2}; +Point(204) = {d2-r2, e2, -ll/2, s2}; Point(214) = {d2-r2, -e2, ll/2, s2}; +Point(205) = {d2, e2-r2, -ll/2, s2}; Point(215) = {d2, -e2-r2, ll/2, s2}; +Point(206) = {d2, e2, -ll/2-l2, s2l}; Point(216) = {d2, -e2, ll/2+l2, s2l}; +Point(207) = {d2+r2, e2, -ll/2-l2, s2l}; Point(217) = {d2+r2, -e2, ll/2+l2, s2l}; +Point(208) = {d2, e2+r2, -ll/2-l2, s2l}; Point(218) = {d2, -e2+r2, ll/2+l2, s2l}; +Point(209) = {d2-r2, e2, -ll/2-l2, s2l}; Point(219) = {d2-r2, -e2, ll/2+l2, s2l}; +Point(210) = {d2, e2-r2, -ll/2-l2, s2l}; Point(220) = {d2, -e2-r2, ll/2+l2, s2l}; + +Circle(201) = {202,201,203}; Circle(205) = {207,206,208}; Line(209) = {202,207}; +Circle(202) = {203,201,204}; Circle(206) = {208,206,209}; Line(210) = {203,208}; +Circle(203) = {204,201,205}; Circle(207) = {209,206,210}; Line(211) = {204,209}; +Circle(204) = {205,201,202}; Circle(208) = {210,206,207}; Line(212) = {205,210}; + +Circle(213) = {212,211,213}; Circle(217) = {217,216,218}; Line(221) = {212,217}; +Circle(214) = {213,211,214}; Circle(218) = {218,216,219}; Line(222) = {213,218}; +Circle(215) = {214,211,215}; Circle(219) = {219,216,220}; Line(223) = {214,219}; +Circle(216) = {215,211,212}; Circle(220) = {220,216,217}; Line(224) = {215,220}; + +Line Loop(201) = {202,203,204,201}; Plane Surface(221) = {201}; +Line Loop(202) = {207,208,205,206}; Plane Surface(222) = {202}; +Line Loop(203) = {216,213,214,215}; Plane Surface(223) = {203}; +Line Loop(204) = {220,217,218,219}; Plane Surface(224) = {204}; +Line Loop(205) = {208,-209,-204,212}; Ruled Surface(225) = {205}; +Line Loop(206) = {212,-207,-211,203}; Ruled Surface(226) = {206}; +Line Loop(207) = {-211,-202,210,206}; Ruled Surface(227) = {207}; +Line Loop(208) = {-210,-201,209,205}; Ruled Surface(228) = {208}; +Line Loop(209) = {221,-220,-224,216}; Ruled Surface(229) = {209}; +Line Loop(210) = {-224,-215,223,219}; Ruled Surface(230) = {210}; +Line Loop(211) = {223,-218,-222,214}; Ruled Surface(231) = {211}; +Line Loop(212) = {222,-217,-221,213}; Ruled Surface(232) = {212}; + +/* barreau 3 et 3' */ + +Point(301) = {d3, -e3, -ll/2, s3}; Point(311) = {d3, e3, ll/2, s3}; +Point(302) = {d3+r3, -e3, -ll/2, s3}; Point(312) = {d3+r3, e3, ll/2, s3}; +Point(303) = {d3, -e3+r3, -ll/2, s3}; Point(313) = {d3, e3+r3, ll/2, s3}; +Point(304) = {d3-r3, -e3, -ll/2, s3}; Point(314) = {d3-r3, e3, ll/2, s3}; +Point(305) = {d3, -e3-r3, -ll/2, s3}; Point(315) = {d3, e3-r3, ll/2, s3}; +Point(306) = {d3, -e3, -ll/2-l3, s3l}; Point(316) = {d3, e3, ll/2+l3, s3l}; +Point(307) = {d3+r3, -e3, -ll/2-l3, s3l}; Point(317) = {d3+r3, e3, ll/2+l3, s3l}; +Point(308) = {d3, -e3+r3, -ll/2-l3, s3l}; Point(318) = {d3, e3+r3, ll/2+l3, s3l}; +Point(309) = {d3-r3, -e3, -ll/2-l3, s3l}; Point(319) = {d3-r3, e3, ll/2+l3, s3l}; +Point(310) = {d3, -e3-r3, -ll/2-l3, s3l}; Point(320) = {d3, e3-r3, ll/2+l3, s3l}; + +Circle(301) = {302,301,303}; Circle(305) = {307,306,308}; Line(309) = {302,307}; +Circle(302) = {303,301,304}; Circle(306) = {308,306,309}; Line(310) = {303,308}; +Circle(303) = {304,301,305}; Circle(307) = {309,306,310}; Line(311) = {304,309}; +Circle(304) = {305,301,302}; Circle(308) = {310,306,307}; Line(312) = {305,310}; + +Circle(313) = {312,311,313}; Circle(317) = {317,316,318}; Line(321) = {312,317}; +Circle(314) = {313,311,314}; Circle(318) = {318,316,319}; Line(322) = {313,318}; +Circle(315) = {314,311,315}; Circle(319) = {319,316,320}; Line(323) = {314,319}; +Circle(316) = {315,311,312}; Circle(320) = {320,316,317}; Line(324) = {315,320}; + +Line Loop(301) = {302,303,304,301}; Plane Surface(321) = {301}; +Line Loop(302) = {307,308,305,306}; Plane Surface(322) = {302}; +Line Loop(303) = {316,313,314,315}; Plane Surface(323) = {303}; +Line Loop(304) = {320,317,318,319}; Plane Surface(324) = {304}; +Line Loop(305) = {308,-309,-304,312}; Ruled Surface(325) = {305}; +Line Loop(306) = {312,-307,-311,303}; Ruled Surface(326) = {306}; +Line Loop(307) = {-311,-302,310,306}; Ruled Surface(327) = {307}; +Line Loop(308) = {-310,-301,309,305}; Ruled Surface(328) = {308}; +Line Loop(309) = {321,-320,-324,316}; Ruled Surface(329) = {309}; +Line Loop(310) = {-324,-315,323,319}; Ruled Surface(330) = {310}; +Line Loop(311) = {323,-318,-322,314}; Ruled Surface(331) = {311}; +Line Loop(312) = {322,-317,-321,313}; Ruled Surface(332) = {312}; + +/* barreau 4 et 4' */ + +Point(401) = {d4, e4, -ll/2, s4}; Point(411) = {d4, -e4, ll/2, s4}; +Point(402) = {d4+r4, e4, -ll/2, s4}; Point(412) = {d4+r4, -e4, ll/2, s4}; +Point(403) = {d4, e4+r4, -ll/2, s4}; Point(413) = {d4, -e4+r4, ll/2, s4}; +Point(404) = {d4-r4, e4, -ll/2, s4}; Point(414) = {d4-r4, -e4, ll/2, s4}; +Point(405) = {d4, e4-r4, -ll/2, s4}; Point(415) = {d4, -e4-r4, ll/2, s4}; +Point(406) = {d4, e4, -ll/2-l4, s4l}; Point(416) = {d4, -e4, ll/2+l4, s4l}; +Point(407) = {d4+r4, e4, -ll/2-l4, s4l}; Point(417) = {d4+r4, -e4, ll/2+l4, s4l}; +Point(408) = {d4, e4+r4, -ll/2-l4, s4l}; Point(418) = {d4, -e4+r4, ll/2+l4, s4l}; +Point(409) = {d4-r4, e4, -ll/2-l4, s4l}; Point(419) = {d4-r4, -e4, ll/2+l4, s4l}; +Point(410) = {d4, e4-r4, -ll/2-l4, s4l}; Point(420) = {d4, -e4-r4, ll/2+l4, s4l}; + +Circle(401) = {402,401,403}; Circle(405) = {407,406,408}; Line(409) = {402,407}; +Circle(402) = {403,401,404}; Circle(406) = {408,406,409}; Line(410) = {403,408}; +Circle(403) = {404,401,405}; Circle(407) = {409,406,410}; Line(411) = {404,409}; +Circle(404) = {405,401,402}; Circle(408) = {410,406,407}; Line(412) = {405,410}; + +Circle(413) = {412,411,413}; Circle(417) = {417,416,418}; Line(421) = {412,417}; +Circle(414) = {413,411,414}; Circle(418) = {418,416,419}; Line(422) = {413,418}; +Circle(415) = {414,411,415}; Circle(419) = {419,416,420}; Line(423) = {414,419}; +Circle(416) = {415,411,412}; Circle(420) = {420,416,417}; Line(424) = {415,420}; + +Line Loop(401) = {402,403,404,401}; Plane Surface(421) = {401}; +Line Loop(402) = {407,408,405,406}; Plane Surface(422) = {402}; +Line Loop(403) = {416,413,414,415}; Plane Surface(423) = {403}; +Line Loop(404) = {420,417,418,419}; Plane Surface(424) = {404}; +Line Loop(405) = {408,-409,-404,412}; Ruled Surface(425) = {405}; +Line Loop(406) = {412,-407,-411,403}; Ruled Surface(426) = {406}; +Line Loop(407) = {-411,-402,410,406}; Ruled Surface(427) = {407}; +Line Loop(408) = {-410,-401,409,405}; Ruled Surface(428) = {408}; +Line Loop(409) = {421,-420,-424,416}; Ruled Surface(429) = {409}; +Line Loop(410) = {-424,-415,423,419}; Ruled Surface(430) = {410}; +Line Loop(411) = {423,-418,-422,414}; Ruled Surface(431) = {411}; +Line Loop(412) = {422,-417,-421,413}; Ruled Surface(432) = {412}; + +/* barreau 5 et 5' */ + +Point(501) = {d5, -e5, -ll/2, s5}; Point(511) = {d5, e5, ll/2, s5}; +Point(502) = {d5+r5, -e5, -ll/2, s5}; Point(512) = {d5+r5, e5, ll/2, s5}; +Point(503) = {d5, -e5+r5, -ll/2, s5}; Point(513) = {d5, e5+r5, ll/2, s5}; +Point(504) = {d5-r5, -e5, -ll/2, s5}; Point(514) = {d5-r5, e5, ll/2, s5}; +Point(505) = {d5, -e5-r5, -ll/2, s5}; Point(515) = {d5, e5-r5, ll/2, s5}; +Point(506) = {d5, -e5, -ll/2-l5, s5l}; Point(516) = {d5, e5, ll/2+l5, s5l}; +Point(507) = {d5+r5, -e5, -ll/2-l5, s5l}; Point(517) = {d5+r5, e5, ll/2+l5, s5l}; +Point(508) = {d5, -e5+r5, -ll/2-l5, s5l}; Point(518) = {d5, e5+r5, ll/2+l5, s5l}; +Point(509) = {d5-r5, -e5, -ll/2-l5, s5l}; Point(519) = {d5-r5, e5, ll/2+l5, s5l}; +Point(510) = {d5, -e5-r5, -ll/2-l5, s5l}; Point(520) = {d5, e5-r5, ll/2+l5, s5l}; + +Circle(501) = {502,501,503}; Circle(505) = {507,506,508}; Line(509) = {502,507}; +Circle(502) = {503,501,504}; Circle(506) = {508,506,509}; Line(510) = {503,508}; +Circle(503) = {504,501,505}; Circle(507) = {509,506,510}; Line(511) = {504,509}; +Circle(504) = {505,501,502}; Circle(508) = {510,506,507}; Line(512) = {505,510}; + +Circle(513) = {512,511,513}; Circle(517) = {517,516,518}; Line(521) = {512,517}; +Circle(514) = {513,511,514}; Circle(518) = {518,516,519}; Line(522) = {513,518}; +Circle(515) = {514,511,515}; Circle(519) = {519,516,520}; Line(523) = {514,519}; +Circle(516) = {515,511,512}; Circle(520) = {520,516,517}; Line(524) = {515,520}; + +Line Loop(501) = {502,503,504,501}; Plane Surface(521) = {501}; +Line Loop(502) = {507,508,505,506}; Plane Surface(522) = {502}; +Line Loop(503) = {516,513,514,515}; Plane Surface(523) = {503}; +Line Loop(504) = {520,517,518,519}; Plane Surface(524) = {504}; +Line Loop(505) = {508,-509,-504,512}; Ruled Surface(525) = {505}; +Line Loop(506) = {512,-507,-511,503}; Ruled Surface(526) = {506}; +Line Loop(507) = {-511,-502,510,506}; Ruled Surface(527) = {507}; +Line Loop(508) = {-510,-501,509,505}; Ruled Surface(528) = {508}; +Line Loop(509) = {521,-520,-524,516}; Ruled Surface(529) = {509}; +Line Loop(510) = {-524,-515,523,519}; Ruled Surface(530) = {510}; +Line Loop(511) = {523,-518,-522,514}; Ruled Surface(531) = {511}; +Line Loop(512) = {522,-517,-521,513}; Ruled Surface(532) = {512}; + +/* barreau 6 et 6' */ + +Point(601) = {d6, e6, -ll/2, s6}; Point(611) = {d6, -e6, ll/2, s6}; +Point(602) = {d6+r6, e6, -ll/2, s6}; Point(612) = {d6+r6, -e6, ll/2, s6}; +Point(603) = {d6, e6+r6, -ll/2, s6}; Point(613) = {d6, -e6+r6, ll/2, s6}; +Point(604) = {d6-r6, e6, -ll/2, s6}; Point(614) = {d6-r6, -e6, ll/2, s6}; +Point(605) = {d6, e6-r6, -ll/2, s6}; Point(615) = {d6, -e6-r6, ll/2, s6}; +Point(606) = {d6, e6, -ll/2-l6, s6l}; Point(616) = {d6, -e6, ll/2+l6, s6l}; +Point(607) = {d6+r6, e6, -ll/2-l6, s6l}; Point(617) = {d6+r6, -e6, ll/2+l6, s6l}; +Point(608) = {d6, e6+r6, -ll/2-l6, s6l}; Point(618) = {d6, -e6+r6, ll/2+l6, s6l}; +Point(609) = {d6-r6, e6, -ll/2-l6, s6l}; Point(619) = {d6-r6, -e6, ll/2+l6, s6l}; +Point(610) = {d6, e6-r6, -ll/2-l6, s6l}; Point(620) = {d6, -e6-r6, ll/2+l6, s6l}; + +Circle(601) = {602,601,603}; Circle(605) = {607,606,608}; Line(609) = {602,607}; +Circle(602) = {603,601,604}; Circle(606) = {608,606,609}; Line(610) = {603,608}; +Circle(603) = {604,601,605}; Circle(607) = {609,606,610}; Line(611) = {604,609}; +Circle(604) = {605,601,602}; Circle(608) = {610,606,607}; Line(612) = {605,610}; + +Circle(613) = {612,611,613}; Circle(617) = {617,616,618}; Line(621) = {612,617}; +Circle(614) = {613,611,614}; Circle(618) = {618,616,619}; Line(622) = {613,618}; +Circle(615) = {614,611,615}; Circle(619) = {619,616,620}; Line(623) = {614,619}; +Circle(616) = {615,611,612}; Circle(620) = {620,616,617}; Line(624) = {615,620}; + +Line Loop(601) = {602,603,604,601}; Plane Surface(621) = {601}; +Line Loop(602) = {607,608,605,606}; Plane Surface(622) = {602}; +Line Loop(603) = {616,613,614,615}; Plane Surface(623) = {603}; +Line Loop(604) = {620,617,618,619}; Plane Surface(624) = {604}; +Line Loop(605) = {608,-609,-604,612}; Ruled Surface(625) = {605}; +Line Loop(606) = {612,-607,-611,603}; Ruled Surface(626) = {606}; +Line Loop(607) = {-611,-602,610,606}; Ruled Surface(627) = {607}; +Line Loop(608) = {-610,-601,609,605}; Ruled Surface(628) = {608}; +Line Loop(609) = {621,-620,-624,616}; Ruled Surface(629) = {609}; +Line Loop(610) = {-624,-615,623,619}; Ruled Surface(630) = {610}; +Line Loop(611) = {623,-618,-622,614}; Ruled Surface(631) = {611}; +Line Loop(612) = {622,-617,-621,613}; Ruled Surface(632) = {612}; + +/* barreau 7 et 7' */ + +Point(701) = {d7, -e7, -ll/2, s7}; Point(711) = {d7, e7, ll/2, s7}; +Point(702) = {d7+r7, -e7, -ll/2, s7}; Point(712) = {d7+r7, e7, ll/2, s7}; +Point(703) = {d7, -e7+r7, -ll/2, s7}; Point(713) = {d7, e7+r7, ll/2, s7}; +Point(704) = {d7-r7, -e7, -ll/2, s7}; Point(714) = {d7-r7, e7, ll/2, s7}; +Point(705) = {d7, -e7-r7, -ll/2, s7}; Point(715) = {d7, e7-r7, ll/2, s7}; +Point(706) = {d7, -e7, -ll/2-l7, s7l}; Point(716) = {d7, e7, ll/2+l7, s7l}; +Point(707) = {d7+r7, -e7, -ll/2-l7, s7l}; Point(717) = {d7+r7, e7, ll/2+l7, s7l}; +Point(708) = {d7, -e7+r7, -ll/2-l7, s7l}; Point(718) = {d7, e7+r7, ll/2+l7, s7l}; +Point(709) = {d7-r7, -e7, -ll/2-l7, s7l}; Point(719) = {d7-r7, e7, ll/2+l7, s7l}; +Point(710) = {d7, -e7-r7, -ll/2-l7, s7l}; Point(720) = {d7, e7-r7, ll/2+l7, s7l}; + +Circle(701) = {702,701,703}; Circle(705) = {707,706,708}; Line(709) = {702,707}; +Circle(702) = {703,701,704}; Circle(706) = {708,706,709}; Line(710) = {703,708}; +Circle(703) = {704,701,705}; Circle(707) = {709,706,710}; Line(711) = {704,709}; +Circle(704) = {705,701,702}; Circle(708) = {710,706,707}; Line(712) = {705,710}; + +Circle(713) = {712,711,713}; Circle(717) = {717,716,718}; Line(721) = {712,717}; +Circle(714) = {713,711,714}; Circle(718) = {718,716,719}; Line(722) = {713,718}; +Circle(715) = {714,711,715}; Circle(719) = {719,716,720}; Line(723) = {714,719}; +Circle(716) = {715,711,712}; Circle(720) = {720,716,717}; Line(724) = {715,720}; + +Line Loop(701) = {702,703,704,701}; Plane Surface(721) = {701}; +Line Loop(702) = {707,708,705,706}; Plane Surface(722) = {702}; +Line Loop(703) = {716,713,714,715}; Plane Surface(723) = {703}; +Line Loop(704) = {720,717,718,719}; Plane Surface(724) = {704}; +Line Loop(705) = {708,-709,-704,712}; Ruled Surface(725) = {705}; +Line Loop(706) = {712,-707,-711,703}; Ruled Surface(726) = {706}; +Line Loop(707) = {-711,-702,710,706}; Ruled Surface(727) = {707}; +Line Loop(708) = {-710,-701,709,705}; Ruled Surface(728) = {708}; +Line Loop(709) = {721,-720,-724,716}; Ruled Surface(729) = {709}; +Line Loop(710) = {-724,-715,723,719}; Ruled Surface(730) = {710}; +Line Loop(711) = {723,-718,-722,714}; Ruled Surface(731) = {711}; +Line Loop(712) = {722,-717,-721,713}; Ruled Surface(732) = {712}; + +/* barreau 8 et 8' */ + +Point(801) = {d8, e8, -ll/2, s8}; Point(811) = {d8, -e8, ll/2, s8}; +Point(802) = {d8+r8, e8, -ll/2, s8}; Point(812) = {d8+r8, -e8, ll/2, s8}; +Point(803) = {d8, e8+r8, -ll/2, s8}; Point(813) = {d8, -e8+r8, ll/2, s8}; +Point(804) = {d8-r8, e8, -ll/2, s8}; Point(814) = {d8-r8, -e8, ll/2, s8}; +Point(805) = {d8, e8-r8, -ll/2, s8}; Point(815) = {d8, -e8-r8, ll/2, s8}; +Point(806) = {d8, e8, -ll/2-l8, s8l}; Point(816) = {d8, -e8, ll/2+l8, s8l}; +Point(807) = {d8+r8, e8, -ll/2-l8, s8l}; Point(817) = {d8+r8, -e8, ll/2+l8, s8l}; +Point(808) = {d8, e8+r8, -ll/2-l8, s8l}; Point(818) = {d8, -e8+r8, ll/2+l8, s8l}; +Point(809) = {d8-r8, e8, -ll/2-l8, s8l}; Point(819) = {d8-r8, -e8, ll/2+l8, s8l}; +Point(810) = {d8, e8-r8, -ll/2-l8, s8l}; Point(820) = {d8, -e8-r8, ll/2+l8, s8l}; + +Circle(801) = {802,801,803}; Circle(805) = {807,806,808}; Line(809) = {802,807}; +Circle(802) = {803,801,804}; Circle(806) = {808,806,809}; Line(810) = {803,808}; +Circle(803) = {804,801,805}; Circle(807) = {809,806,810}; Line(811) = {804,809}; +Circle(804) = {805,801,802}; Circle(808) = {810,806,807}; Line(812) = {805,810}; + +Circle(813) = {812,811,813}; Circle(817) = {817,816,818}; Line(821) = {812,817}; +Circle(814) = {813,811,814}; Circle(818) = {818,816,819}; Line(822) = {813,818}; +Circle(815) = {814,811,815}; Circle(819) = {819,816,820}; Line(823) = {814,819}; +Circle(816) = {815,811,812}; Circle(820) = {820,816,817}; Line(824) = {815,820}; + +Line Loop(801) = {802,803,804,801}; Plane Surface(821) = {801}; +Line Loop(802) = {807,808,805,806}; Plane Surface(822) = {802}; +Line Loop(803) = {816,813,814,815}; Plane Surface(823) = {803}; +Line Loop(804) = {820,817,818,819}; Plane Surface(824) = {804}; +Line Loop(805) = {808,-809,-804,812}; Ruled Surface(825) = {805}; +Line Loop(806) = {812,-807,-811,803}; Ruled Surface(826) = {806}; +Line Loop(807) = {-811,-802,810,806}; Ruled Surface(827) = {807}; +Line Loop(808) = {-810,-801,809,805}; Ruled Surface(828) = {808}; +Line Loop(809) = {821,-820,-824,816}; Ruled Surface(829) = {809}; +Line Loop(810) = {-824,-815,823,819}; Ruled Surface(830) = {810}; +Line Loop(811) = {823,-818,-822,814}; Ruled Surface(831) = {811}; +Line Loop(812) = {822,-817,-821,813}; Ruled Surface(832) = {812}; + +/* barreau 9 et 9' */ + +Point(901) = {d9, -e9, -ll/2, s9}; Point(911) = {d9, e9, ll/2, s9}; +Point(902) = {d9+r9, -e9, -ll/2, s9}; Point(912) = {d9+r9, e9, ll/2, s9}; +Point(903) = {d9, -e9+r9, -ll/2, s9}; Point(913) = {d9, e9+r9, ll/2, s9}; +Point(904) = {d9-r9, -e9, -ll/2, s9}; Point(914) = {d9-r9, e9, ll/2, s9}; +Point(905) = {d9, -e9-r9, -ll/2, s9}; Point(915) = {d9, e9-r9, ll/2, s9}; +Point(906) = {d9, -e9, -ll/2-l9, s9l}; Point(916) = {d9, e9, ll/2+l9, s9l}; +Point(907) = {d9+r9, -e9, -ll/2-l9, s9l}; Point(917) = {d9+r9, e9, ll/2+l9, s9l}; +Point(908) = {d9, -e9+r9, -ll/2-l9, s9l}; Point(918) = {d9, e9+r9, ll/2+l9, s9l}; +Point(909) = {d9-r9, -e9, -ll/2-l9, s9l}; Point(919) = {d9-r9, e9, ll/2+l9, s9l}; +Point(910) = {d9, -e9-r9, -ll/2-l9, s9l}; Point(920) = {d9, e9-r9, ll/2+l9, s9l}; + +Circle(901) = {902,901,903}; Circle(905) = {907,906,908}; Line(909) = {902,907}; +Circle(902) = {903,901,904}; Circle(906) = {908,906,909}; Line(910) = {903,908}; +Circle(903) = {904,901,905}; Circle(907) = {909,906,910}; Line(911) = {904,909}; +Circle(904) = {905,901,902}; Circle(908) = {910,906,907}; Line(912) = {905,910}; + +Circle(913) = {912,911,913}; Circle(917) = {917,916,918}; Line(921) = {912,917}; +Circle(914) = {913,911,914}; Circle(918) = {918,916,919}; Line(922) = {913,918}; +Circle(915) = {914,911,915}; Circle(919) = {919,916,920}; Line(923) = {914,919}; +Circle(916) = {915,911,912}; Circle(920) = {920,916,917}; Line(924) = {915,920}; + +Line Loop(901) = {902,903,904,901}; Plane Surface(921) = {901}; +Line Loop(902) = {907,908,905,906}; Plane Surface(922) = {902}; +Line Loop(903) = {916,913,914,915}; Plane Surface(923) = {903}; +Line Loop(904) = {920,917,918,919}; Plane Surface(924) = {904}; +Line Loop(905) = {908,-909,-904,912}; Ruled Surface(925) = {905}; +Line Loop(906) = {912,-907,-911,903}; Ruled Surface(926) = {906}; +Line Loop(907) = {-911,-902,910,906}; Ruled Surface(927) = {907}; +Line Loop(908) = {-910,-901,909,905}; Ruled Surface(928) = {908}; +Line Loop(909) = {921,-920,-924,916}; Ruled Surface(929) = {909}; +Line Loop(910) = {-924,-915,923,919}; Ruled Surface(930) = {910}; +Line Loop(911) = {923,-918,-922,914}; Ruled Surface(931) = {911}; +Line Loop(912) = {922,-917,-921,913}; Ruled Surface(932) = {912}; + +/* barreau 10 et 10' */ + +Point(1001) = {d10, e10, -ll/2, s10}; Point(1011) = {d10, -e10, ll/2, s10}; +Point(1002) = {d10+r10, e10, -ll/2, s10}; Point(1012) = {d10+r10, -e10, ll/2, s10}; +Point(1003) = {d10, e10+r10, -ll/2, s10}; Point(1013) = {d10, -e10+r10, ll/2, s10}; +Point(1004) = {d10-r10, e10, -ll/2, s10}; Point(1014) = {d10-r10, -e10, ll/2, s10}; +Point(1005) = {d10, e10-r10, -ll/2, s10}; Point(1015) = {d10, -e10-r10, ll/2, s10}; +Point(1006) = {d10, e10, -ll/2-l10, s10l}; Point(1016) = {d10, -e10, ll/2+l10, s10l}; +Point(1007) = {d10+r10, e10, -ll/2-l10, s10l}; Point(1017) = {d10+r10, -e10, ll/2+l10, s10l}; +Point(1008) = {d10, e10+r10, -ll/2-l10, s10l}; Point(1018) = {d10, -e10+r10, ll/2+l10, s10l}; +Point(1009) = {d10-r10, e10, -ll/2-l10, s10l}; Point(1019) = {d10-r10, -e10, ll/2+l10, s10l}; +Point(1010) = {d10, e10-r10, -ll/2-l10, s10l}; Point(1020) = {d10, -e10-r10, ll/2+l10, s10l}; + +Circle(1001) = {1002,1001,1003}; Circle(1005) = {1007,1006,1008}; Line(1009) = {1002,1007}; +Circle(1002) = {1003,1001,1004}; Circle(1006) = {1008,1006,1009}; Line(1010) = {1003,1008}; +Circle(1003) = {1004,1001,1005}; Circle(1007) = {1009,1006,1010}; Line(1011) = {1004,1009}; +Circle(1004) = {1005,1001,1002}; Circle(1008) = {1010,1006,1007}; Line(1012) = {1005,1010}; + +Circle(1013) = {1012,1011,1013}; Circle(1017) = {1017,1016,1018}; Line(1021) = {1012,1017}; +Circle(1014) = {1013,1011,1014}; Circle(1018) = {1018,1016,1019}; Line(1022) = {1013,1018}; +Circle(1015) = {1014,1011,1015}; Circle(1019) = {1019,1016,1020}; Line(1023) = {1014,1019}; +Circle(1016) = {1015,1011,1012}; Circle(1020) = {1020,1016,1017}; Line(1024) = {1015,1020}; + +Line Loop(1001) = {1002,1003,1004,1001}; Plane Surface(1021) = {1001}; +Line Loop(1002) = {1007,1008,1005,1006}; Plane Surface(1022) = {1002}; +Line Loop(1003) = {1016,1013,1014,1015}; Plane Surface(1023) = {1003}; +Line Loop(1004) = {1020,1017,1018,1019}; Plane Surface(1024) = {1004}; +Line Loop(1005) = {1008,-1009,-1004,1012}; Ruled Surface(1025) = {1005}; +Line Loop(1006) = {1012,-1007,-1011,1003}; Ruled Surface(1026) = {1006}; +Line Loop(1007) = {-1011,-1002,1010,1006}; Ruled Surface(1027) = {1007}; +Line Loop(1008) = {-1010,-1001,1009,1005}; Ruled Surface(1028) = {1008}; +Line Loop(1009) = {1021,-1020,-1024,1016}; Ruled Surface(1029) = {1009}; +Line Loop(1010) = {-1024,-1015,1023,1019}; Ruled Surface(1030) = {1010}; +Line Loop(1011) = {1023,-1018,-1022,1014}; Ruled Surface(1031) = {1011}; +Line Loop(1012) = {1022,-1017,-1021,1013}; Ruled Surface(1032) = {1012}; + +/* barreau 11 et 11' */ + +Point(1101) = {d11, -e11, -ll/2, s11}; Point(1111) = {d11, e11, ll/2, s11}; +Point(1102) = {d11+r11, -e11, -ll/2, s11}; Point(1112) = {d11+r11, e11, ll/2, s11}; +Point(1103) = {d11, -e11+r11, -ll/2, s11}; Point(1113) = {d11, e11+r11, ll/2, s11}; +Point(1104) = {d11-r11, -e11, -ll/2, s11}; Point(1114) = {d11-r11, e11, ll/2, s11}; +Point(1105) = {d11, -e11-r11, -ll/2, s11}; Point(1115) = {d11, e11-r11, ll/2, s11}; +Point(1106) = {d11, -e11, -ll/2-l11, s11l}; Point(1116) = {d11, e11, ll/2+l11, s11l}; +Point(1107) = {d11+r11, -e11, -ll/2-l11, s11l}; Point(1117) = {d11+r11, e11, ll/2+l11, s11l}; +Point(1108) = {d11, -e11+r11, -ll/2-l11, s11l}; Point(1118) = {d11, e11+r11, ll/2+l11, s11l}; +Point(1109) = {d11-r11, -e11, -ll/2-l11, s11l}; Point(1119) = {d11-r11, e11, ll/2+l11, s11l}; +Point(1110) = {d11, -e11-r11, -ll/2-l11, s11l}; Point(1120) = {d11, e11-r11, ll/2+l11, s11l}; + +Circle(1101) = {1102,1101,1103}; Circle(1105) = {1107,1106,1108}; Line(1109) = {1102,1107}; +Circle(1102) = {1103,1101,1104}; Circle(1106) = {1108,1106,1109}; Line(1110) = {1103,1108}; +Circle(1103) = {1104,1101,1105}; Circle(1107) = {1109,1106,1110}; Line(1111) = {1104,1109}; +Circle(1104) = {1105,1101,1102}; Circle(1108) = {1110,1106,1107}; Line(1112) = {1105,1110}; + +Circle(1113) = {1112,1111,1113}; Circle(1117) = {1117,1116,1118}; Line(1121) = {1112,1117}; +Circle(1114) = {1113,1111,1114}; Circle(1118) = {1118,1116,1119}; Line(1122) = {1113,1118}; +Circle(1115) = {1114,1111,1115}; Circle(1119) = {1119,1116,1120}; Line(1123) = {1114,1119}; +Circle(1116) = {1115,1111,1112}; Circle(1120) = {1120,1116,1117}; Line(1124) = {1115,1120}; + +Line Loop(1101) = {1102,1103,1104,1101}; Plane Surface(1121) = {1101}; +Line Loop(1102) = {1107,1108,1105,1106}; Plane Surface(1122) = {1102}; +Line Loop(1103) = {1116,1113,1114,1115}; Plane Surface(1123) = {1103}; +Line Loop(1104) = {1120,1117,1118,1119}; Plane Surface(1124) = {1104}; +Line Loop(1105) = {1108,-1109,-1104,1112}; Ruled Surface(1125) = {1105}; +Line Loop(1106) = {1112,-1107,-1111,1103}; Ruled Surface(1126) = {1106}; +Line Loop(1107) = {-1111,-1102,1110,1106}; Ruled Surface(1127) = {1107}; +Line Loop(1108) = {-1110,-1101,1109,1105}; Ruled Surface(1128) = {1108}; +Line Loop(1109) = {1121,-1120,-1124,1116}; Ruled Surface(1129) = {1109}; +Line Loop(1110) = {-1124,-1115,1123,1119}; Ruled Surface(1130) = {1110}; +Line Loop(1111) = {1123,-1118,-1122,1114}; Ruled Surface(1131) = {1111}; +Line Loop(1112) = {1122,-1117,-1121,1113}; Ruled Surface(1132) = {1112}; + +/* barreau 12 et 12' */ + +Point(1201) = {d12, e12, -ll/2, s12}; Point(1211) = {d12, -e12, ll/2, s12}; +Point(1202) = {d12+r12, e12, -ll/2, s12}; Point(1212) = {d12+r12, -e12, ll/2, s12}; +Point(1203) = {d12, e12+r12, -ll/2, s12}; Point(1213) = {d12, -e12+r12, ll/2, s12}; +Point(1204) = {d12-r12, e12, -ll/2, s12}; Point(1214) = {d12-r12, -e12, ll/2, s12}; +Point(1205) = {d12, e12-r12, -ll/2, s12}; Point(1215) = {d12, -e12-r12, ll/2, s12}; +Point(1206) = {d12, e12, -ll/2-l12, s12l}; Point(1216) = {d12, -e12, ll/2+l12, s12l}; +Point(1207) = {d12+r12, e12, -ll/2-l12, s12l}; Point(1217) = {d12+r12, -e12, ll/2+l12, s12l}; +Point(1208) = {d12, e12+r12, -ll/2-l12, s12l}; Point(1218) = {d12, -e12+r12, ll/2+l12, s12l}; +Point(1209) = {d12-r12, e12, -ll/2-l12, s12l}; Point(1219) = {d12-r12, -e12, ll/2+l12, s12l}; +Point(1210) = {d12, e12-r12, -ll/2-l12, s12l}; Point(1220) = {d12, -e12-r12, ll/2+l12, s12l}; + +Circle(1201) = {1202,1201,1203}; Circle(1205) = {1207,1206,1208}; Line(1209) = {1202,1207}; +Circle(1202) = {1203,1201,1204}; Circle(1206) = {1208,1206,1209}; Line(1210) = {1203,1208}; +Circle(1203) = {1204,1201,1205}; Circle(1207) = {1209,1206,1210}; Line(1211) = {1204,1209}; +Circle(1204) = {1205,1201,1202}; Circle(1208) = {1210,1206,1207}; Line(1212) = {1205,1210}; + +Circle(1213) = {1212,1211,1213}; Circle(1217) = {1217,1216,1218}; Line(1221) = {1212,1217}; +Circle(1214) = {1213,1211,1214}; Circle(1218) = {1218,1216,1219}; Line(1222) = {1213,1218}; +Circle(1215) = {1214,1211,1215}; Circle(1219) = {1219,1216,1220}; Line(1223) = {1214,1219}; +Circle(1216) = {1215,1211,1212}; Circle(1220) = {1220,1216,1217}; Line(1224) = {1215,1220}; + +Line Loop(1201) = {1202,1203,1204,1201}; Plane Surface(1221) = {1201}; +Line Loop(1202) = {1207,1208,1205,1206}; Plane Surface(1222) = {1202}; +Line Loop(1203) = {1216,1213,1214,1215}; Plane Surface(1223) = {1203}; +Line Loop(1204) = {1220,1217,1218,1219}; Plane Surface(1224) = {1204}; +Line Loop(1205) = {1208,-1209,-1204,1212}; Ruled Surface(1225) = {1205}; +Line Loop(1206) = {1212,-1207,-1211,1203}; Ruled Surface(1226) = {1206}; +Line Loop(1207) = {-1211,-1202,1210,1206}; Ruled Surface(1227) = {1207}; +Line Loop(1208) = {-1210,-1201,1209,1205}; Ruled Surface(1228) = {1208}; +Line Loop(1209) = {1221,-1220,-1224,1216}; Ruled Surface(1229) = {1209}; +Line Loop(1210) = {-1224,-1215,1223,1219}; Ruled Surface(1230) = {1210}; +Line Loop(1211) = {1223,-1218,-1222,1214}; Ruled Surface(1231) = {1211}; +Line Loop(1212) = {1222,-1217,-1221,1213}; Ruled Surface(1232) = {1212}; + +/* barreau 13 et 13' */ + +Point(1301) = {d13, -e13, -ll/2, s13}; Point(1311) = {d13, e13, ll/2, s13}; +Point(1302) = {d13+r13, -e13, -ll/2, s13}; Point(1312) = {d13+r13, e13, ll/2, s13}; +Point(1303) = {d13, -e13+r13, -ll/2, s13}; Point(1313) = {d13, e13+r13, ll/2, s13}; +Point(1304) = {d13-r13, -e13, -ll/2, s13}; Point(1314) = {d13-r13, e13, ll/2, s13}; +Point(1305) = {d13, -e13-r13, -ll/2, s13}; Point(1315) = {d13, e13-r13, ll/2, s13}; +Point(1306) = {d13, -e13, -ll/2-l13, s13l}; Point(1316) = {d13, e13, ll/2+l13, s13l}; +Point(1307) = {d13+r13, -e13, -ll/2-l13, s13l}; Point(1317) = {d13+r13, e13, ll/2+l13, s13l}; +Point(1308) = {d13, -e13+r13, -ll/2-l13, s13l}; Point(1318) = {d13, e13+r13, ll/2+l13, s13l}; +Point(1309) = {d13-r13, -e13, -ll/2-l13, s13l}; Point(1319) = {d13-r13, e13, ll/2+l13, s13l}; +Point(1310) = {d13, -e13-r13, -ll/2-l13, s13l}; Point(1320) = {d13, e13-r13, ll/2+l13, s13l}; + +Circle(1301) = {1302,1301,1303}; Circle(1305) = {1307,1306,1308}; Line(1309) = {1302,1307}; +Circle(1302) = {1303,1301,1304}; Circle(1306) = {1308,1306,1309}; Line(1310) = {1303,1308}; +Circle(1303) = {1304,1301,1305}; Circle(1307) = {1309,1306,1310}; Line(1311) = {1304,1309}; +Circle(1304) = {1305,1301,1302}; Circle(1308) = {1310,1306,1307}; Line(1312) = {1305,1310}; + +Circle(1313) = {1312,1311,1313}; Circle(1317) = {1317,1316,1318}; Line(1321) = {1312,1317}; +Circle(1314) = {1313,1311,1314}; Circle(1318) = {1318,1316,1319}; Line(1322) = {1313,1318}; +Circle(1315) = {1314,1311,1315}; Circle(1319) = {1319,1316,1320}; Line(1323) = {1314,1319}; +Circle(1316) = {1315,1311,1312}; Circle(1320) = {1320,1316,1317}; Line(1324) = {1315,1320}; + +Line Loop(1301) = {1302,1303,1304,1301}; Plane Surface(1321) = {1301}; +Line Loop(1302) = {1307,1308,1305,1306}; Plane Surface(1322) = {1302}; +Line Loop(1303) = {1316,1313,1314,1315}; Plane Surface(1323) = {1303}; +Line Loop(1304) = {1320,1317,1318,1319}; Plane Surface(1324) = {1304}; +Line Loop(1305) = {1308,-1309,-1304,1312}; Ruled Surface(1325) = {1305}; +Line Loop(1306) = {1312,-1307,-1311,1303}; Ruled Surface(1326) = {1306}; +Line Loop(1307) = {-1311,-1302,1310,1306}; Ruled Surface(1327) = {1307}; +Line Loop(1308) = {-1310,-1301,1309,1305}; Ruled Surface(1328) = {1308}; +Line Loop(1309) = {1321,-1320,-1324,1316}; Ruled Surface(1329) = {1309}; +Line Loop(1310) = {-1324,-1315,1323,1319}; Ruled Surface(1330) = {1310}; +Line Loop(1311) = {1323,-1318,-1322,1314}; Ruled Surface(1331) = {1311}; +Line Loop(1312) = {1322,-1317,-1321,1313}; Ruled Surface(1332) = {1312}; + +/* barreau 14 et 14' */ + +Point(1401) = {d14, e14, -ll/2, s14}; Point(1411) = {d14, -e14, ll/2, s14}; +Point(1402) = {d14+r14, e14, -ll/2, s14}; Point(1412) = {d14+r14, -e14, ll/2, s14}; +Point(1403) = {d14, e14+r14, -ll/2, s14}; Point(1413) = {d14, -e14+r14, ll/2, s14}; +Point(1404) = {d14-r14, e14, -ll/2, s14}; Point(1414) = {d14-r14, -e14, ll/2, s14}; +Point(1405) = {d14, e14-r14, -ll/2, s14}; Point(1415) = {d14, -e14-r14, ll/2, s14}; +Point(1406) = {d14, e14, -ll/2-l14, s14l}; Point(1416) = {d14, -e14, ll/2+l14, s14l}; +Point(1407) = {d14+r14, e14, -ll/2-l14, s14l}; Point(1417) = {d14+r14, -e14, ll/2+l14, s14l}; +Point(1408) = {d14, e14+r14, -ll/2-l14, s14l}; Point(1418) = {d14, -e14+r14, ll/2+l14, s14l}; +Point(1409) = {d14-r14, e14, -ll/2-l14, s14l}; Point(1419) = {d14-r14, -e14, ll/2+l14, s14l}; +Point(1410) = {d14, e14-r14, -ll/2-l14, s14l}; Point(1420) = {d14, -e14-r14, ll/2+l14, s14l}; + +Circle(1401) = {1402,1401,1403}; Circle(1405) = {1407,1406,1408}; Line(1409) = {1402,1407}; +Circle(1402) = {1403,1401,1404}; Circle(1406) = {1408,1406,1409}; Line(1410) = {1403,1408}; +Circle(1403) = {1404,1401,1405}; Circle(1407) = {1409,1406,1410}; Line(1411) = {1404,1409}; +Circle(1404) = {1405,1401,1402}; Circle(1408) = {1410,1406,1407}; Line(1412) = {1405,1410}; + +Circle(1413) = {1412,1411,1413}; Circle(1417) = {1417,1416,1418}; Line(1421) = {1412,1417}; +Circle(1414) = {1413,1411,1414}; Circle(1418) = {1418,1416,1419}; Line(1422) = {1413,1418}; +Circle(1415) = {1414,1411,1415}; Circle(1419) = {1419,1416,1420}; Line(1423) = {1414,1419}; +Circle(1416) = {1415,1411,1412}; Circle(1420) = {1420,1416,1417}; Line(1424) = {1415,1420}; + +Line Loop(1401) = {1402,1403,1404,1401}; Plane Surface(1421) = {1401}; +Line Loop(1402) = {1407,1408,1405,1406}; Plane Surface(1422) = {1402}; +Line Loop(1403) = {1416,1413,1414,1415}; Plane Surface(1423) = {1403}; +Line Loop(1404) = {1420,1417,1418,1419}; Plane Surface(1424) = {1404}; +Line Loop(1405) = {1408,-1409,-1404,1412}; Ruled Surface(1425) = {1405}; +Line Loop(1406) = {1412,-1407,-1411,1403}; Ruled Surface(1426) = {1406}; +Line Loop(1407) = {-1411,-1402,1410,1406}; Ruled Surface(1427) = {1407}; +Line Loop(1408) = {-1410,-1401,1409,1405}; Ruled Surface(1428) = {1408}; +Line Loop(1409) = {1421,-1420,-1424,1416}; Ruled Surface(1429) = {1409}; +Line Loop(1410) = {-1424,-1415,1423,1419}; Ruled Surface(1430) = {1410}; +Line Loop(1411) = {1423,-1418,-1422,1414}; Ruled Surface(1431) = {1411}; +Line Loop(1412) = {1422,-1417,-1421,1413}; Ruled Surface(1432) = {1412}; + +/* barreau 15 et 15' */ + +Point(1501) = {d15, -e15, -ll/2, s15}; Point(1511) = {d15, e15, ll/2, s15}; +Point(1502) = {d15+r15, -e15, -ll/2, s15}; Point(1512) = {d15+r15, e15, ll/2, s15}; +Point(1503) = {d15, -e15+r15, -ll/2, s15}; Point(1513) = {d15, e15+r15, ll/2, s15}; +Point(1504) = {d15-r15, -e15, -ll/2, s15}; Point(1514) = {d15-r15, e15, ll/2, s15}; +Point(1505) = {d15, -e15-r15, -ll/2, s15}; Point(1515) = {d15, e15-r15, ll/2, s15}; +Point(1506) = {d15, -e15, -ll/2-l15, s15l}; Point(1516) = {d15, e15, ll/2+l15, s15l}; +Point(1507) = {d15+r15, -e15, -ll/2-l15, s15l}; Point(1517) = {d15+r15, e15, ll/2+l15, s15l}; +Point(1508) = {d15, -e15+r15, -ll/2-l15, s15l}; Point(1518) = {d15, e15+r15, ll/2+l15, s15l}; +Point(1509) = {d15-r15, -e15, -ll/2-l15, s15l}; Point(1519) = {d15-r15, e15, ll/2+l15, s15l}; +Point(1510) = {d15, -e15-r15, -ll/2-l15, s15l}; Point(1520) = {d15, e15-r15, ll/2+l15, s15l}; + +Circle(1501) = {1502,1501,1503}; Circle(1505) = {1507,1506,1508}; Line(1509) = {1502,1507}; +Circle(1502) = {1503,1501,1504}; Circle(1506) = {1508,1506,1509}; Line(1510) = {1503,1508}; +Circle(1503) = {1504,1501,1505}; Circle(1507) = {1509,1506,1510}; Line(1511) = {1504,1509}; +Circle(1504) = {1505,1501,1502}; Circle(1508) = {1510,1506,1507}; Line(1512) = {1505,1510}; + +Circle(1513) = {1512,1511,1513}; Circle(1517) = {1517,1516,1518}; Line(1521) = {1512,1517}; +Circle(1514) = {1513,1511,1514}; Circle(1518) = {1518,1516,1519}; Line(1522) = {1513,1518}; +Circle(1515) = {1514,1511,1515}; Circle(1519) = {1519,1516,1520}; Line(1523) = {1514,1519}; +Circle(1516) = {1515,1511,1512}; Circle(1520) = {1520,1516,1517}; Line(1524) = {1515,1520}; + +Line Loop(1501) = {1502,1503,1504,1501}; Plane Surface(1521) = {1501}; +Line Loop(1502) = {1507,1508,1505,1506}; Plane Surface(1522) = {1502}; +Line Loop(1503) = {1516,1513,1514,1515}; Plane Surface(1523) = {1503}; +Line Loop(1504) = {1520,1517,1518,1519}; Plane Surface(1524) = {1504}; +Line Loop(1505) = {1508,-1509,-1504,1512}; Ruled Surface(1525) = {1505}; +Line Loop(1506) = {1512,-1507,-1511,1503}; Ruled Surface(1526) = {1506}; +Line Loop(1507) = {-1511,-1502,1510,1506}; Ruled Surface(1527) = {1507}; +Line Loop(1508) = {-1510,-1501,1509,1505}; Ruled Surface(1528) = {1508}; +Line Loop(1509) = {1521,-1520,-1524,1516}; Ruled Surface(1529) = {1509}; +Line Loop(1510) = {-1524,-1515,1523,1519}; Ruled Surface(1530) = {1510}; +Line Loop(1511) = {1523,-1518,-1522,1514}; Ruled Surface(1531) = {1511}; +Line Loop(1512) = {1522,-1517,-1521,1513}; Ruled Surface(1532) = {1512}; + +/* barreau 16 et 16' */ + +Point(1601) = {d16, e16, -ll/2, s16}; Point(1611) = {d16, -e16, ll/2, s16}; +Point(1602) = {d16+r16, e16, -ll/2, s16}; Point(1612) = {d16+r16, -e16, ll/2, s16}; +Point(1603) = {d16, e16+r16, -ll/2, s16}; Point(1613) = {d16, -e16+r16, ll/2, s16}; +Point(1604) = {d16-r16, e16, -ll/2, s16}; Point(1614) = {d16-r16, -e16, ll/2, s16}; +Point(1605) = {d16, e16-r16, -ll/2, s16}; Point(1615) = {d16, -e16-r16, ll/2, s16}; +Point(1606) = {d16, e16, -ll/2-l16, s16l}; Point(1616) = {d16, -e16, ll/2+l16, s16l}; +Point(1607) = {d16+r16, e16, -ll/2-l16, s16l}; Point(1617) = {d16+r16, -e16, ll/2+l16, s16l}; +Point(1608) = {d16, e16+r16, -ll/2-l16, s16l}; Point(1618) = {d16, -e16+r16, ll/2+l16, s16l}; +Point(1609) = {d16-r16, e16, -ll/2-l16, s16l}; Point(1619) = {d16-r16, -e16, ll/2+l16, s16l}; +Point(1610) = {d16, e16-r16, -ll/2-l16, s16l}; Point(1620) = {d16, -e16-r16, ll/2+l16, s16l}; + +Circle(1601) = {1602,1601,1603}; Circle(1605) = {1607,1606,1608}; Line(1609) = {1602,1607}; +Circle(1602) = {1603,1601,1604}; Circle(1606) = {1608,1606,1609}; Line(1610) = {1603,1608}; +Circle(1603) = {1604,1601,1605}; Circle(1607) = {1609,1606,1610}; Line(1611) = {1604,1609}; +Circle(1604) = {1605,1601,1602}; Circle(1608) = {1610,1606,1607}; Line(1612) = {1605,1610}; + +Circle(1613) = {1612,1611,1613}; Circle(1617) = {1617,1616,1618}; Line(1621) = {1612,1617}; +Circle(1614) = {1613,1611,1614}; Circle(1618) = {1618,1616,1619}; Line(1622) = {1613,1618}; +Circle(1615) = {1614,1611,1615}; Circle(1619) = {1619,1616,1620}; Line(1623) = {1614,1619}; +Circle(1616) = {1615,1611,1612}; Circle(1620) = {1620,1616,1617}; Line(1624) = {1615,1620}; + +Line Loop(1601) = {1602,1603,1604,1601}; Plane Surface(1621) = {1601}; +Line Loop(1602) = {1607,1608,1605,1606}; Plane Surface(1622) = {1602}; +Line Loop(1603) = {1616,1613,1614,1615}; Plane Surface(1623) = {1603}; +Line Loop(1604) = {1620,1617,1618,1619}; Plane Surface(1624) = {1604}; +Line Loop(1605) = {1608,-1609,-1604,1612}; Ruled Surface(1625) = {1605}; +Line Loop(1606) = {1612,-1607,-1611,1603}; Ruled Surface(1626) = {1606}; +Line Loop(1607) = {-1611,-1602,1610,1606}; Ruled Surface(1627) = {1607}; +Line Loop(1608) = {-1610,-1601,1609,1605}; Ruled Surface(1628) = {1608}; +Line Loop(1609) = {1621,-1620,-1624,1616}; Ruled Surface(1629) = {1609}; +Line Loop(1610) = {-1624,-1615,1623,1619}; Ruled Surface(1630) = {1610}; +Line Loop(1611) = {1623,-1618,-1622,1614}; Ruled Surface(1631) = {1611}; +Line Loop(1612) = {1622,-1617,-1621,1613}; Ruled Surface(1632) = {1612}; + +/* barreau 17 et 17' */ + +Point(1701) = {d17, -e17, -ll/2, s17}; Point(1711) = {d17, e17, ll/2, s17}; +Point(1702) = {d17+r17, -e17, -ll/2, s17}; Point(1712) = {d17+r17, e17, ll/2, s17}; +Point(1703) = {d17, -e17+r17, -ll/2, s17}; Point(1713) = {d17, e17+r17, ll/2, s17}; +Point(1704) = {d17-r17, -e17, -ll/2, s17}; Point(1714) = {d17-r17, e17, ll/2, s17}; +Point(1705) = {d17, -e17-r17, -ll/2, s17}; Point(1715) = {d17, e17-r17, ll/2, s17}; +Point(1706) = {d17, -e17, -ll/2-l17, s17l}; Point(1716) = {d17, e17, ll/2+l17, s17l}; +Point(1707) = {d17+r17, -e17, -ll/2-l17, s17l}; Point(1717) = {d17+r17, e17, ll/2+l17, s17l}; +Point(1708) = {d17, -e17+r17, -ll/2-l17, s17l}; Point(1718) = {d17, e17+r17, ll/2+l17, s17l}; +Point(1709) = {d17-r17, -e17, -ll/2-l17, s17l}; Point(1719) = {d17-r17, e17, ll/2+l17, s17l}; +Point(1710) = {d17, -e17-r17, -ll/2-l17, s17l}; Point(1720) = {d17, e17-r17, ll/2+l17, s17l}; + +Circle(1701) = {1702,1701,1703}; Circle(1705) = {1707,1706,1708}; Line(1709) = {1702,1707}; +Circle(1702) = {1703,1701,1704}; Circle(1706) = {1708,1706,1709}; Line(1710) = {1703,1708}; +Circle(1703) = {1704,1701,1705}; Circle(1707) = {1709,1706,1710}; Line(1711) = {1704,1709}; +Circle(1704) = {1705,1701,1702}; Circle(1708) = {1710,1706,1707}; Line(1712) = {1705,1710}; + +Circle(1713) = {1712,1711,1713}; Circle(1717) = {1717,1716,1718}; Line(1721) = {1712,1717}; +Circle(1714) = {1713,1711,1714}; Circle(1718) = {1718,1716,1719}; Line(1722) = {1713,1718}; +Circle(1715) = {1714,1711,1715}; Circle(1719) = {1719,1716,1720}; Line(1723) = {1714,1719}; +Circle(1716) = {1715,1711,1712}; Circle(1720) = {1720,1716,1717}; Line(1724) = {1715,1720}; + +Line Loop(1701) = {1702,1703,1704,1701}; Plane Surface(1721) = {1701}; +Line Loop(1702) = {1707,1708,1705,1706}; Plane Surface(1722) = {1702}; +Line Loop(1703) = {1716,1713,1714,1715}; Plane Surface(1723) = {1703}; +Line Loop(1704) = {1720,1717,1718,1719}; Plane Surface(1724) = {1704}; +Line Loop(1705) = {1708,-1709,-1704,1712}; Ruled Surface(1725) = {1705}; +Line Loop(1706) = {1712,-1707,-1711,1703}; Ruled Surface(1726) = {1706}; +Line Loop(1707) = {-1711,-1702,1710,1706}; Ruled Surface(1727) = {1707}; +Line Loop(1708) = {-1710,-1701,1709,1705}; Ruled Surface(1728) = {1708}; +Line Loop(1709) = {1721,-1720,-1724,1716}; Ruled Surface(1729) = {1709}; +Line Loop(1710) = {-1724,-1715,1723,1719}; Ruled Surface(1730) = {1710}; +Line Loop(1711) = {1723,-1718,-1722,1714}; Ruled Surface(1731) = {1711}; +Line Loop(1712) = {1722,-1717,-1721,1713}; Ruled Surface(1732) = {1712}; + +/* barreau 18 et 18' */ + +Point(1801) = {d18, e18, -ll/2, s18}; Point(1811) = {d18, -e18, ll/2, s18}; +Point(1802) = {d18+r18, e18, -ll/2, s18}; Point(1812) = {d18+r18, -e18, ll/2, s18}; +Point(1803) = {d18, e18+r18, -ll/2, s18}; Point(1813) = {d18, -e18+r18, ll/2, s18}; +Point(1804) = {d18-r18, e18, -ll/2, s18}; Point(1814) = {d18-r18, -e18, ll/2, s18}; +Point(1805) = {d18, e18-r18, -ll/2, s18}; Point(1815) = {d18, -e18-r18, ll/2, s18}; +Point(1806) = {d18, e18, -ll/2-l18, s18l}; Point(1816) = {d18, -e18, ll/2+l18, s18l}; +Point(1807) = {d18+r18, e18, -ll/2-l18, s18l}; Point(1817) = {d18+r18, -e18, ll/2+l18, s18l}; +Point(1808) = {d18, e18+r18, -ll/2-l18, s18l}; Point(1818) = {d18, -e18+r18, ll/2+l18, s18l}; +Point(1809) = {d18-r18, e18, -ll/2-l18, s18l}; Point(1819) = {d18-r18, -e18, ll/2+l18, s18l}; +Point(1810) = {d18, e18-r18, -ll/2-l18, s18l}; Point(1820) = {d18, -e18-r18, ll/2+l18, s18l}; + +Circle(1801) = {1802,1801,1803}; Circle(1805) = {1807,1806,1808}; Line(1809) = {1802,1807}; +Circle(1802) = {1803,1801,1804}; Circle(1806) = {1808,1806,1809}; Line(1810) = {1803,1808}; +Circle(1803) = {1804,1801,1805}; Circle(1807) = {1809,1806,1810}; Line(1811) = {1804,1809}; +Circle(1804) = {1805,1801,1802}; Circle(1808) = {1810,1806,1807}; Line(1812) = {1805,1810}; + +Circle(1813) = {1812,1811,1813}; Circle(1817) = {1817,1816,1818}; Line(1821) = {1812,1817}; +Circle(1814) = {1813,1811,1814}; Circle(1818) = {1818,1816,1819}; Line(1822) = {1813,1818}; +Circle(1815) = {1814,1811,1815}; Circle(1819) = {1819,1816,1820}; Line(1823) = {1814,1819}; +Circle(1816) = {1815,1811,1812}; Circle(1820) = {1820,1816,1817}; Line(1824) = {1815,1820}; + +Line Loop(1801) = {1802,1803,1804,1801}; Plane Surface(1821) = {1801}; +Line Loop(1802) = {1807,1808,1805,1806}; Plane Surface(1822) = {1802}; +Line Loop(1803) = {1816,1813,1814,1815}; Plane Surface(1823) = {1803}; +Line Loop(1804) = {1820,1817,1818,1819}; Plane Surface(1824) = {1804}; +Line Loop(1805) = {1808,-1809,-1804,1812}; Ruled Surface(1825) = {1805}; +Line Loop(1806) = {1812,-1807,-1811,1803}; Ruled Surface(1826) = {1806}; +Line Loop(1807) = {-1811,-1802,1810,1806}; Ruled Surface(1827) = {1807}; +Line Loop(1808) = {-1810,-1801,1809,1805}; Ruled Surface(1828) = {1808}; +Line Loop(1809) = {1821,-1820,-1824,1816}; Ruled Surface(1829) = {1809}; +Line Loop(1810) = {-1824,-1815,1823,1819}; Ruled Surface(1830) = {1810}; +Line Loop(1811) = {1823,-1818,-1822,1814}; Ruled Surface(1831) = {1811}; +Line Loop(1812) = {1822,-1817,-1821,1813}; Ruled Surface(1832) = {1812}; + +/* barreau 19 et 19' */ + +Point(1901) = {d19, -e19, -ll/2, s19}; Point(1911) = {d19, e19, ll/2, s19}; +Point(1902) = {d19+r19, -e19, -ll/2, s19}; Point(1912) = {d19+r19, e19, ll/2, s19}; +Point(1903) = {d19, -e19+r19, -ll/2, s19}; Point(1913) = {d19, e19+r19, ll/2, s19}; +Point(1904) = {d19-r19, -e19, -ll/2, s19}; Point(1914) = {d19-r19, e19, ll/2, s19}; +Point(1905) = {d19, -e19-r19, -ll/2, s19}; Point(1915) = {d19, e19-r19, ll/2, s19}; +Point(1906) = {d19, -e19, -ll/2-l19, s19l}; Point(1916) = {d19, e19, ll/2+l19, s19l}; +Point(1907) = {d19+r19, -e19, -ll/2-l19, s19l}; Point(1917) = {d19+r19, e19, ll/2+l19, s19l}; +Point(1908) = {d19, -e19+r19, -ll/2-l19, s19l}; Point(1918) = {d19, e19+r19, ll/2+l19, s19l}; +Point(1909) = {d19-r19, -e19, -ll/2-l19, s19l}; Point(1919) = {d19-r19, e19, ll/2+l19, s19l}; +Point(1910) = {d19, -e19-r19, -ll/2-l19, s19l}; Point(1920) = {d19, e19-r19, ll/2+l19, s19l}; + +Circle(1901) = {1902,1901,1903}; Circle(1905) = {1907,1906,1908}; Line(1909) = {1902,1907}; +Circle(1902) = {1903,1901,1904}; Circle(1906) = {1908,1906,1909}; Line(1910) = {1903,1908}; +Circle(1903) = {1904,1901,1905}; Circle(1907) = {1909,1906,1910}; Line(1911) = {1904,1909}; +Circle(1904) = {1905,1901,1902}; Circle(1908) = {1910,1906,1907}; Line(1912) = {1905,1910}; + +Circle(1913) = {1912,1911,1913}; Circle(1917) = {1917,1916,1918}; Line(1921) = {1912,1917}; +Circle(1914) = {1913,1911,1914}; Circle(1918) = {1918,1916,1919}; Line(1922) = {1913,1918}; +Circle(1915) = {1914,1911,1915}; Circle(1919) = {1919,1916,1920}; Line(1923) = {1914,1919}; +Circle(1916) = {1915,1911,1912}; Circle(1920) = {1920,1916,1917}; Line(1924) = {1915,1920}; + +Line Loop(1901) = {1902,1903,1904,1901}; Plane Surface(1921) = {1901}; +Line Loop(1902) = {1907,1908,1905,1906}; Plane Surface(1922) = {1902}; +Line Loop(1903) = {1916,1913,1914,1915}; Plane Surface(1923) = {1903}; +Line Loop(1904) = {1920,1917,1918,1919}; Plane Surface(1924) = {1904}; +Line Loop(1905) = {1908,-1909,-1904,1912}; Ruled Surface(1925) = {1905}; +Line Loop(1906) = {1912,-1907,-1911,1903}; Ruled Surface(1926) = {1906}; +Line Loop(1907) = {-1911,-1902,1910,1906}; Ruled Surface(1927) = {1907}; +Line Loop(1908) = {-1910,-1901,1909,1905}; Ruled Surface(1928) = {1908}; +Line Loop(1909) = {1921,-1920,-1924,1916}; Ruled Surface(1929) = {1909}; +Line Loop(1910) = {-1924,-1915,1923,1919}; Ruled Surface(1930) = {1910}; +Line Loop(1911) = {1923,-1918,-1922,1914}; Ruled Surface(1931) = {1911}; +Line Loop(1912) = {1922,-1917,-1921,1913}; Ruled Surface(1932) = {1912}; + +/* barreau 20 et 20' */ + +Point(2001) = {d20, e20, -ll/2, s20}; Point(2011) = {d20, -e20, ll/2, s20}; +Point(2002) = {d20+r20, e20, -ll/2, s20}; Point(2012) = {d20+r20, -e20, ll/2, s20}; +Point(2003) = {d20, e20+r20, -ll/2, s20}; Point(2013) = {d20, -e20+r20, ll/2, s20}; +Point(2004) = {d20-r20, e20, -ll/2, s20}; Point(2014) = {d20-r20, -e20, ll/2, s20}; +Point(2005) = {d20, e20-r20, -ll/2, s20}; Point(2015) = {d20, -e20-r20, ll/2, s20}; +Point(2006) = {d20, e20, -ll/2-l20, s20l}; Point(2016) = {d20, -e20, ll/2+l20, s20l}; +Point(2007) = {d20+r20, e20, -ll/2-l20, s20l}; Point(2017) = {d20+r20, -e20, ll/2+l20, s20l}; +Point(2008) = {d20, e20+r20, -ll/2-l20, s20l}; Point(2018) = {d20, -e20+r20, ll/2+l20, s20l}; +Point(2009) = {d20-r20, e20, -ll/2-l20, s20l}; Point(2019) = {d20-r20, -e20, ll/2+l20, s20l}; +Point(2010) = {d20, e20-r20, -ll/2-l20, s20l}; Point(2020) = {d20, -e20-r20, ll/2+l20, s20l}; + +Circle(2001) = {2002,2001,2003}; Circle(2005) = {2007,2006,2008}; Line(2009) = {2002,2007}; +Circle(2002) = {2003,2001,2004}; Circle(2006) = {2008,2006,2009}; Line(2010) = {2003,2008}; +Circle(2003) = {2004,2001,2005}; Circle(2007) = {2009,2006,2010}; Line(2011) = {2004,2009}; +Circle(2004) = {2005,2001,2002}; Circle(2008) = {2010,2006,2007}; Line(2012) = {2005,2010}; + +Circle(2013) = {2012,2011,2013}; Circle(2017) = {2017,2016,2018}; Line(2021) = {2012,2017}; +Circle(2014) = {2013,2011,2014}; Circle(2018) = {2018,2016,2019}; Line(2022) = {2013,2018}; +Circle(2015) = {2014,2011,2015}; Circle(2019) = {2019,2016,2020}; Line(2023) = {2014,2019}; +Circle(2016) = {2015,2011,2012}; Circle(2020) = {2020,2016,2017}; Line(2024) = {2015,2020}; + +Line Loop(2001) = {2002,2003,2004,2001}; Plane Surface(2021) = {2001}; +Line Loop(2002) = {2007,2008,2005,2006}; Plane Surface(2022) = {2002}; +Line Loop(2003) = {2016,2013,2014,2015}; Plane Surface(2023) = {2003}; +Line Loop(2004) = {2020,2017,2018,2019}; Plane Surface(2024) = {2004}; +Line Loop(2005) = {2008,-2009,-2004,2012}; Ruled Surface(2025) = {2005}; +Line Loop(2006) = {2012,-2007,-2011,2003}; Ruled Surface(2026) = {2006}; +Line Loop(2007) = {-2011,-2002,2010,2006}; Ruled Surface(2027) = {2007}; +Line Loop(2008) = {-2010,-2001,2009,2005}; Ruled Surface(2028) = {2008}; +Line Loop(2009) = {2021,-2020,-2024,2016}; Ruled Surface(2029) = {2009}; +Line Loop(2010) = {-2024,-2015,2023,2019}; Ruled Surface(2030) = {2010}; +Line Loop(2011) = {2023,-2018,-2022,2014}; Ruled Surface(2031) = {2011}; +Line Loop(2012) = {2022,-2017,-2021,2013}; Ruled Surface(2032) = {2012}; + +/* barreau 21 et 21' */ + +Point(2101) = {d21, -e21, -ll/2, s21}; Point(2111) = {d21, e21, ll/2, s21}; +Point(2102) = {d21+r21, -e21, -ll/2, s21}; Point(2112) = {d21+r21, e21, ll/2, s21}; +Point(2103) = {d21, -e21+r21, -ll/2, s21}; Point(2113) = {d21, e21+r21, ll/2, s21}; +Point(2104) = {d21-r21, -e21, -ll/2, s21}; Point(2114) = {d21-r21, e21, ll/2, s21}; +Point(2105) = {d21, -e21-r21, -ll/2, s21}; Point(2115) = {d21, e21-r21, ll/2, s21}; +Point(2106) = {d21, -e21, -ll/2-l21, s21l}; Point(2116) = {d21, e21, ll/2+l21, s21l}; +Point(2107) = {d21+r21, -e21, -ll/2-l21, s21l}; Point(2117) = {d21+r21, e21, ll/2+l21, s21l}; +Point(2108) = {d21, -e21+r21, -ll/2-l21, s21l}; Point(2118) = {d21, e21+r21, ll/2+l21, s21l}; +Point(2109) = {d21-r21, -e21, -ll/2-l21, s21l}; Point(2119) = {d21-r21, e21, ll/2+l21, s21l}; +Point(2110) = {d21, -e21-r21, -ll/2-l21, s21l}; Point(2120) = {d21, e21-r21, ll/2+l21, s21l}; + +Circle(2101) = {2102,2101,2103}; Circle(2105) = {2107,2106,2108}; Line(2109) = {2102,2107}; +Circle(2102) = {2103,2101,2104}; Circle(2106) = {2108,2106,2109}; Line(2110) = {2103,2108}; +Circle(2103) = {2104,2101,2105}; Circle(2107) = {2109,2106,2110}; Line(2111) = {2104,2109}; +Circle(2104) = {2105,2101,2102}; Circle(2108) = {2110,2106,2107}; Line(2112) = {2105,2110}; + +Circle(2113) = {2112,2111,2113}; Circle(2117) = {2117,2116,2118}; Line(2121) = {2112,2117}; +Circle(2114) = {2113,2111,2114}; Circle(2118) = {2118,2116,2119}; Line(2122) = {2113,2118}; +Circle(2115) = {2114,2111,2115}; Circle(2119) = {2119,2116,2120}; Line(2123) = {2114,2119}; +Circle(2116) = {2115,2111,2112}; Circle(2120) = {2120,2116,2117}; Line(2124) = {2115,2120}; + +Line Loop(2101) = {2102,2103,2104,2101}; Plane Surface(2121) = {2101}; +Line Loop(2102) = {2107,2108,2105,2106}; Plane Surface(2122) = {2102}; +Line Loop(2103) = {2116,2113,2114,2115}; Plane Surface(2123) = {2103}; +Line Loop(2104) = {2120,2117,2118,2119}; Plane Surface(2124) = {2104}; +Line Loop(2105) = {2108,-2109,-2104,2112}; Ruled Surface(2125) = {2105}; +Line Loop(2106) = {2112,-2107,-2111,2103}; Ruled Surface(2126) = {2106}; +Line Loop(2107) = {-2111,-2102,2110,2106}; Ruled Surface(2127) = {2107}; +Line Loop(2108) = {-2110,-2101,2109,2105}; Ruled Surface(2128) = {2108}; +Line Loop(2109) = {2121,-2120,-2124,2116}; Ruled Surface(2129) = {2109}; +Line Loop(2110) = {-2124,-2115,2123,2119}; Ruled Surface(2130) = {2110}; +Line Loop(2111) = {2123,-2118,-2122,2114}; Ruled Surface(2131) = {2111}; +Line Loop(2112) = {2122,-2117,-2121,2113}; Ruled Surface(2132) = {2112}; + +/* barreau 22 et 22' */ + +Point(2201) = {d22, e22, -ll/2, s22}; Point(2211) = {d22, -e22, ll/2, s22}; +Point(2202) = {d22+r22, e22, -ll/2, s22}; Point(2212) = {d22+r22, -e22, ll/2, s22}; +Point(2203) = {d22, e22+r22, -ll/2, s22}; Point(2213) = {d22, -e22+r22, ll/2, s22}; +Point(2204) = {d22-r22, e22, -ll/2, s22}; Point(2214) = {d22-r22, -e22, ll/2, s22}; +Point(2205) = {d22, e22-r22, -ll/2, s22}; Point(2215) = {d22, -e22-r22, ll/2, s22}; +Point(2206) = {d22, e22, -ll/2-l22, s22l}; Point(2216) = {d22, -e22, ll/2+l22, s22l}; +Point(2207) = {d22+r22, e22, -ll/2-l22, s22l}; Point(2217) = {d22+r22, -e22, ll/2+l22, s22l}; +Point(2208) = {d22, e22+r22, -ll/2-l22, s22l}; Point(2218) = {d22, -e22+r22, ll/2+l22, s22l}; +Point(2209) = {d22-r22, e22, -ll/2-l22, s22l}; Point(2219) = {d22-r22, -e22, ll/2+l22, s22l}; +Point(2210) = {d22, e22-r22, -ll/2-l22, s22l}; Point(2220) = {d22, -e22-r22, ll/2+l22, s22l}; + +Circle(2201) = {2202,2201,2203}; Circle(2205) = {2207,2206,2208}; Line(2209) = {2202,2207}; +Circle(2202) = {2203,2201,2204}; Circle(2206) = {2208,2206,2209}; Line(2210) = {2203,2208}; +Circle(2203) = {2204,2201,2205}; Circle(2207) = {2209,2206,2210}; Line(2211) = {2204,2209}; +Circle(2204) = {2205,2201,2202}; Circle(2208) = {2210,2206,2207}; Line(2212) = {2205,2210}; + +Circle(2213) = {2212,2211,2213}; Circle(2217) = {2217,2216,2218}; Line(2221) = {2212,2217}; +Circle(2214) = {2213,2211,2214}; Circle(2218) = {2218,2216,2219}; Line(2222) = {2213,2218}; +Circle(2215) = {2214,2211,2215}; Circle(2219) = {2219,2216,2220}; Line(2223) = {2214,2219}; +Circle(2216) = {2215,2211,2212}; Circle(2220) = {2220,2216,2217}; Line(2224) = {2215,2220}; + +Line Loop(2201) = {2202,2203,2204,2201}; Plane Surface(2221) = {2201}; +Line Loop(2202) = {2207,2208,2205,2206}; Plane Surface(2222) = {2202}; +Line Loop(2203) = {2216,2213,2214,2215}; Plane Surface(2223) = {2203}; +Line Loop(2204) = {2220,2217,2218,2219}; Plane Surface(2224) = {2204}; +Line Loop(2205) = {2208,-2209,-2204,2212}; Ruled Surface(2225) = {2205}; +Line Loop(2206) = {2212,-2207,-2211,2203}; Ruled Surface(2226) = {2206}; +Line Loop(2207) = {-2211,-2202,2210,2206}; Ruled Surface(2227) = {2207}; +Line Loop(2208) = {-2210,-2201,2209,2205}; Ruled Surface(2228) = {2208}; +Line Loop(2209) = {2221,-2220,-2224,2216}; Ruled Surface(2229) = {2209}; +Line Loop(2210) = {-2224,-2215,2223,2219}; Ruled Surface(2230) = {2210}; +Line Loop(2211) = {2223,-2218,-2222,2214}; Ruled Surface(2231) = {2211}; +Line Loop(2212) = {2222,-2217,-2221,2213}; Ruled Surface(2232) = {2212}; + +/* barreau x et x' */ +/* +Point(x01) = {dx, -e, -ll/2, sx}; Point(x11) = {dx, e, ll/2, sx}; +Point(x02) = {dx+rx, -e, -ll/2, sx}; Point(x12) = {dx+rx, e, ll/2, sx}; +Point(x03) = {dx, -e+rx, -ll/2, sx}; Point(x13) = {dx, e+rx, ll/2, sx}; +Point(x04) = {dx-rx, -e, -ll/2, sx}; Point(x14) = {dx-rx, e, ll/2, sx}; +Point(x05) = {dx, -e-rx, -ll/2, sx}; Point(x15) = {dx, e-rx, ll/2, sx}; +Point(x06) = {dx, -e, -ll/2-lx, sx}; Point(x16) = {dx, e, ll/2+lx, sx}; +Point(x07) = {dx+rx, -e, -ll/2-lx, sx}; Point(x17) = {dx+rx, e, ll/2+lx, sx}; +Point(x08) = {dx, -e+rx, -ll/2-lx, sx}; Point(x18) = {dx, e+rx, ll/2+lx, sx}; +Point(x09) = {dx-rx, -e, -ll/2-lx, sx}; Point(x19) = {dx-rx, e, ll/2+lx, sx}; +Point(x10) = {dx, -e-rx, -ll/2-lx, sx}; Point(x20) = {dx, e-rx, ll/2+lx, sx}; + +Circle(x01) = {x02,x01,x03}; Circle(x05) = {x07,x06,x08}; Line(x09) = {x02,x07}; +Circle(x02) = {x03,x01,x04}; Circle(x06) = {x08,x06,x09}; Line(x10) = {x03,x08}; +Circle(x03) = {x04,x01,x05}; Circle(x07) = {x09,x06,x10}; Line(x11) = {x04,x09}; +Circle(x04) = {x05,x01,x02}; Circle(x08) = {x10,x06,x07}; Line(x12) = {x05,x10}; + +Circle(x13) = {x12,x11,x13}; Circle(x17) = {x17,x16,x18}; Line(x21) = {x12,x17}; +Circle(x14) = {x13,x11,x14}; Circle(x18) = {x18,x16,x19}; Line(x22) = {x13,x18}; +Circle(x15) = {x14,x11,x15}; Circle(x19) = {x19,x16,x20}; Line(x23) = {x14,x19}; +Circle(x16) = {x15,x11,x12}; Circle(x20) = {x20,x16,x17}; Line(x24) = {x15,x20}; + +Line Loop(x01) = {x02,x03,x04,x01}; Plane Surface(x21) = {x01}; +Line Loop(x02) = {x07,x08,x05,x06}; Plane Surface(x22) = {x02}; +Line Loop(x03) = {x16,x13,x14,x15}; Plane Surface(x23) = {x03}; +Line Loop(x04) = {x20,x17,x18,x19}; Plane Surface(x24) = {x04}; +Line Loop(x05) = {x08,-x09,-x04,x12}; Ruled Surface(x25) = {x05}; +Line Loop(x06) = {x12,-x07,-x11,x03}; Ruled Surface(x26) = {x06}; +Line Loop(x07) = {-x11,-x02,x10,x06}; Ruled Surface(x27) = {x07}; +Line Loop(x08) = {-x10,-x01,x09,x05}; Ruled Surface(x28) = {x08}; +Line Loop(x09) = {x21,-x20,-x24,x16}; Ruled Surface(x29) = {x09}; +Line Loop(x10) = {-x24,-x15,x23,x19}; Ruled Surface(x30) = {x10}; +Line Loop(x11) = {x23,-x18,-x22,x14}; Ruled Surface(x31) = {x11}; +Line Loop(x12) = {x22,-x17,-x21,x13}; Ruled Surface(x32) = {x12}; +*/ + +/* surface longerons */ +Line Loop(3001) = {-13,-21,3,22}; Plane Surface(3101) = {3001}; /* ymax */ +Line Loop(3002) = {23,-11,-24,1}; Plane Surface(3102) = {3002}; /* ymax - eps */ +Line Loop(3003) = {-27,-7,26,17}; Plane Surface(3103) = {3003}; /* ymin + eps*/ +Line Loop(3004) = {25,-15,-28,5}; Plane Surface(3104) = {3004}; /* ymin */ +Line Loop(3005) = {3,4,1,2}; Plane Surface(3105) = {3005}; /* gauche haut */ +Line Loop(3006) = {7,8,5,6}; Plane Surface(3106) = {3006}; /* gauche bas */ +Line Loop(3007) = {11,12,13,14}; Plane Surface(3107) = {3007}; /* droite haut */ +Line Loop(3008) = {18,15,16,17}; Plane Surface(3108) = {3008}; /* droite bas */ + +Line Loop(3009) = {-23,-9,26,19}; Plane Surface(3109) = {3009}; /* bouchon proche */ +Line Loop(3010) = {24,-20,-27,10}; Plane Surface(3110) = {3010}; /* bouchon loin */ + +Line Loop(3011) = {-9,7,10,1}; Plane Surface(3111) = {3011}; /* input */ +Line Loop(3012) = {-11,-20,-17,19};Plane Surface(3112) = {3012}; /* output */ + +Line Loop(3013) = {-26,-6,25,16}; +Line Loop(3014) = {-28,-8,27,18}; +Line Loop(3015) = {-21,-2,23,12}; +Line Loop(3016) = {-24,-4,22,14}; +Plane Surface(3113) = {3013,203,403,603,803,1003,1203,1403,1603,1803,2003,2203} ; +Plane Surface(3114) = {3014,101,301,501,701,901,1101,1301,1501,1701,1901,2101}; +Plane Surface(3115) = {3015,103,303,503,703,903,1103,1303,1503,1703,1903,2103}; +Plane Surface(3116) = {3016,201,401,601,801,1001,1201,1401,1601,1801,2001,2201}; + +/* surface boite interne */ +Line Loop(4001) = {61,75,76,53}; Plane Surface(4101) = {4001}; +Line Loop(4002) = {-54,-61,56,80}; Plane Surface(4102) = {4002}; +Line Loop(4003) = {62,63,-54,75}; Plane Surface(4103) = {4003}; +Line Loop(4004) = {-57,-62,76,64}; Plane Surface(4104) = {4004}; +Line Loop(4005) = {-72,-64,53,56}; Plane Surface(4105) = {4005}; +Line Loop(4006) = {80,-63,57,72}; Plane Surface(4106) = {4006}; +Line Loop(4007) = {-52,-51,76,69}; Plane Surface(4107) = {4007}; +Line Loop(4008) = {55,-62,51,78}; Plane Surface(4108) = {4008}; +Line Loop(4009) = {74,-78,52,73}; Plane Surface(4109) = {4009}; +Line Loop(4010) = {-81,-73,-69,64};Plane Surface(4110) = {4010}; +Line Loop(4011) = {-57,-55,-74,81};Plane Surface(4111) = {4011}; +Line Loop(4012) = {67,75,51,59}; Plane Surface(4112) = {4012}; +Line Loop(4013) = {-71,-54,-67,70};Plane Surface(4113) = {4013}; +Line Loop(4014) = {70,79,-78,59}; Plane Surface(4114) = {4014}; +Line Loop(4015) = {55,63,71,79}; Plane Surface(4115) = {4015}; +Line Loop(4016) = {61,-67,-68,77}; Plane Surface(4116) = {4016}; +Line Loop(4017) = {70,82,-65,68}; Plane Surface(4117) = {4017}; +Line Loop(4018) = {-58,-65,77,56}; Plane Surface(4118) = {4018}; +Line Loop(4019) = {80,71,82,58}; Plane Surface(4119) = {4019}; +Line Loop(4020) = {68,-59,52,60}; Plane Surface(4120) = {4020}; +Line Loop(4021) = {66,-73,60,65}; Plane Surface(4121) = {4021}; +Line Loop(4022) = {74,-79,82,66}; Plane Surface(4122) = {4022}; +Line Loop(4023) = {-77,-60,-69,53};Plane Surface(4123) = {4023}; +Line Loop(4024) = {-72,-81,-66,58};Plane Surface(4124) = {4024}; + +/* volume bouchon */ + +Surface Loop(4125) = {3103,-3110,-3102,-3109,3111,3112}; +Complex Volume(4126) = {4125}; + +/* volume air */ + +Surface Loop(4127) = {4123,4116,-4101,4112,4107,4120}; +Surface Loop(4128) = {2229,2232,2231,-2230,-3113,-3109,-3115,3101,3107,3112,-3110,-3116,-3105,3111,-3106,-3114,3104,3108,-127,126,-125,122,-128,-327,326,-325,322,-328,-527,526,-525,522,-528,-727,726,-725,722,-728,-927,926,-925,922,-928,-1127,1126,-1125,1122,-1128,-1327,1326,-1325,1322,-1328,-1527,1526,-1525,1522,-1528,-1727,1726,-1725,1722,-1728,-1927,1926,-1925,1922,-1928,-2127,2126,-2125,2122,-2128,-227,226,-225,222,-228,-427,426,-425,422,-428,-627,626,-625,622,-628,-827,826,-825,822,-828,-1027,1026,-1025,1022,-1028,-1227,1226,-1225,1222,-1228,-1427,1426,-1425,1422,-1428,-1627,1626,-1625,1622,-1628,-1827,1826,-1825,1822,-1828,-2027,2026,-2025,2022,-2028,-2227,2226,-2225,2222,-2228,129,132,131,-130,124,329,332,331,-330,324,529,532,531,-530,524,729,732,731,-730,724,929,932,931,-930,924,1129,1132,1131,-1130,1124,1329,1332,1331,-1330,1324,1529,1532,1531,-1530,1524,1729,1732,1731,-1730,1724,1929,1932,1931,-1930,1924,2129,2132,2131,-2130,2124,229,232,231,-230,224,429,432,431,-430,424,629,632,631,-630,624,829,832,831,-830,824,1029,1032,1031,-1030,1024,1229,1232,1231,-1230,1224,1429,1432,1431,-1430,1424,1629,1632,1631,-1630,1624,1829,1832,1831,-1830,1824,2029,2032,2031,-2030,2024,2224}; +Complex Volume(4129) = {4127,4128}; + +/* volumes boite */ + +Surface Loop(4130) = {4101,4102,-4103,-4104,-4106,-4105}; Complex Volume(4131) = {4130}; /* Zm */ +Surface Loop(4132) = {4113,4115,-4108,-4103,4112,-4114}; Complex Volume(4133) = {4132}; /* Xm */ +Surface Loop(4134) = {4110,4111,-4104,4108,4107,4109}; Complex Volume(4135) = {4134}; /* Ym */ +Surface Loop(4136) = {4118,4119,-4102,4113,-4116,-4117}; Complex Volume(4137) = {4136}; /* Yp */ +Surface Loop(4138) = {4105,-4124,4110,-4121,-4123,-4118}; Complex Volume(4139) = {4138}; /* Xp */ +Surface Loop(4140) = {4121,-4122,4109,-4114,4117,-4120}; Complex Volume(4141) = {4140}; /* Zp */ + +/* Surface et volume boite externe */ + +Line Loop(7021) = {-7013,-80,7019,7011};Plane Surface(7022) = {7021}; +Line Loop(7023) = {-7014,63,7013,7004};Plane Surface(7024) = {7023}; +Line Loop(7025) = {7020,7012,-7014,57};Plane Surface(7026) = {7025}; +Line Loop(7027) = {-7009,-7020,72,7019};Plane Surface(7028) = {7027}; +Line Loop(7029) = {-7012,7009,7011,7004};Plane Surface(7030) = {7029}; +Line Loop(7031) = {-7015,55,7014,7001};Plane Surface(7032) = {7031}; +Line Loop(7033) = {-7016,79,7015,7002};Plane Surface(7034) = {7033}; +Line Loop(7035) = {-7013,71,7016,7003};Plane Surface(7036) = {7035}; +Line Loop(7037) = {7003,7004,7001,7002};Plane Surface(7038) = {7037}; +Line Loop(7039) = {-7018,81,7020,7008};Plane Surface(7040) = {7039}; +Line Loop(7041) = {-7017,66,7018,7006};Plane Surface(7042) = {7041}; +Line Loop(7043) = {-7017,58,7019,7010};Plane Surface(7044) = {7043}; +Line Loop(7045) = {-7010,-7009,7008,7006};Plane Surface(7046) = {7045}; +Line Loop(7047) = {7007,-7016,82,7017};Plane Surface(7048) = {7047}; +Line Loop(7049) = {-7011,7010,7007,7003};Plane Surface(7050) = {7049}; +Line Loop(7051) = {7015,7005,-7018,74};Plane Surface(7052) = {7051}; +Line Loop(7053) = {7005,-7008,7012,7001};Plane Surface(7054) = {7053}; +Line Loop(7055) = {7007,-7002,7005,7006};Plane Surface(7056) = {7055}; + +Surface Loop(7057) = {7036,7024,7032,7034,-4115,-7038}; Complex Volume(7058) = {7057}; /* XM */ +Surface Loop(7059) = {7046,7044,-7042,-4124,-7028,-7040}; Complex Volume(7060) = {7059}; /* XP */ +Surface Loop(7061) = {7054,-7052,-7032,-4111,-7026,7040}; Complex Volume(7062) = {7061}; /* YM */ +Surface Loop(7063) = {7036,-7022,-4119,7048,-7050,7044}; Complex Volume(7064) = {7063}; /* YP */ +Surface Loop(7065) = {4106,7022,7024,-7026,-7028,-7030}; Complex Volume(7066) = {7065}; /* ZM */ +Surface Loop(7067) = {4122,-7052,7034,-7048,7056,-7042}; Complex Volume(7068) = {7067}; /* ZP */ + +/* physical entities */ + +AIR = 8001 ; +XM = 8002 ; +XP = 8003 ; +YM = 8004 ; +YP = 8005 ; +ZM = 8006 ; +ZP = 8007 ; + +CLINPUT = 9001 ; +CLBOX = 9002 ; +CLLONG = 9003 ; +CLBARREAU = 9004 ; +CLBEM = 9005 ; + +Physical Volume (AIR) = {4126,4129, 4131,4133,4135,4137,4139,4141}; +Physical Volume (XM) = {7058}; +Physical Volume (XP) = {7060}; +Physical Volume (YM) = {7062}; +Physical Volume (YP) = {7064}; +Physical Volume (ZM) = {7066}; +Physical Volume (ZP) = {7068}; + +Physical Surface(CLINPUT) = {3111}; +Physical Surface(CLBEM) = {4119,4106,4115,4111,4122,4124}; +Physical Surface(CLBOX) = {7050,7030,7038,7054,7056,7046}; +Physical Surface(CLLONG) = {3102,3115,3101,3116,3105,3107,3103,3114,3104,3113,3108,3106}; +Physical Surface(CLBARREAU) = +{ + 122,125,126,127,128, + 124,129,130,131,132, + 222,225,226,227,228, + 224,229,230,231,232, + 322,325,326,327,328, + 324,329,330,331,332, + 422,425,426,427,428, + 424,429,430,431,432, + 522,525,526,527,528, + 524,529,530,531,532, + 622,625,626,627,628, + 624,629,630,631,632, + 722,725,726,727,728, + 724,729,730,731,732, + 822,825,826,827,828, + 824,829,830,831,832, + 922,925,926,927,928, + 924,929,930,931,932, + 1022,1025,1026,1027,1028, + 1024,1029,1030,1031,1032, + 1122,1125,1126,1127,1128, + 1124,1129,1130,1131,1132, + 1222,1225,1226,1227,1228, + 1224,1229,1230,1231,1232, + 1322,1325,1326,1327,1328, + 1324,1329,1330,1331,1332, + 1422,1425,1426,1427,1428, + 1424,1429,1430,1431,1432, + 1522,1525,1526,1527,1528, + 1524,1529,1530,1531,1532, + 1622,1625,1626,1627,1628, + 1624,1629,1630,1631,1632, + 1722,1725,1726,1727,1728, + 1724,1729,1730,1731,1732, + 1822,1825,1826,1827,1828, + 1824,1829,1830,1831,1832, + 1922,1925,1926,1927,1928, + 1924,1929,1930,1931,1932, + 2022,2025,2026,2027,2028, + 2024,2029,2030,2031,2032, + 2122,2125,2126,2127,2128, + 2124,2129,2130,2131,2132, + 2222,2225,2226,2227,2228, + 2224,2229,2230,2231,2232 + }; + diff --git a/benchmarks/bugs/p4a.geo b/benchmarks/bugs/p4a.geo new file mode 100644 index 0000000000000000000000000000000000000000..4a2367a39702954582960f4f8f596b15f045fe16 --- /dev/null +++ b/benchmarks/bugs/p4a.geo @@ -0,0 +1,166 @@ +epecr = 4.e-3 ; + +c = 0.0 ; +lspire = 0.135 ; +pspire = 0.4 ; +lecr = 0.3 ; +pecr = 0.5 ; +hecr = 0.2 - epecr/2. ; + +far = 2. ; +infty = 2.5 ; + +lc1 = 0.1; +lc2 = 0.1; +lc4 = 0.8; + +lc1 = 0.01; +lc2 = 0.05; +lc3 = 0.1; +lc4 = 0.5; + + + +Point(1) = {c, c, c, lc2}; +Point(2) = {c+lspire, c, c, lc2}; +Point(3) = {c, c+pspire, c, lc2}; +Point(4) = {c+lspire, c+pspire, c, lc2}; + +Point(5) = {c+lecr, c, c, lc2}; +Point(6) = {c, c+pecr, c, lc2}; +Point(7) = {c+lecr, c+pecr, c, lc2}; + +Point(8) = {c, c, c+hecr, lc2}; +Point(9) = {c+lecr, c, c+hecr, lc1}; +Point(10)= {c, c+pecr, c+hecr, lc1}; +Point(11)= {c+lecr, c+pecr, c+hecr, lc1}; + +Point(12)= {c+far, c, c, lc4}; +Point(13)= {c, c+far, c, lc4}; +Point(14)= {c, c, c+far, lc3}; +Point(15)= {c, c, c-far, lc4}; + +Point(16)= {c+infty, c, c, lc4}; +Point(17)= {c, c+infty, c, lc4}; +Point(18)= {c, c, c+infty, lc4}; +Point(19)= {c, c, c-infty, lc4}; + +Line(1) = {2,4}; +Line(2) = {4,3}; +Line(3) = {1,2}; +Line(4) = {1,3}; +Line(5) = {2,5}; +Line(6) = {5,7}; +Line(7) = {7,6}; +Line(8) = {6,13}; +Line(9) = {5,12}; +Line(10) = {6,10}; +Line(11) = {10,11}; +Line(12) = {11,7}; +Line(13) = {10,8}; +Line(14) = {8,9}; +Line(15) = {9,11}; +Line(16) = {9,5}; +Line(17) = {1,8}; +Line(18) = {8,14}; +Line(19) = {14,18}; +Line(20) = {13,17}; +Line(21) = {12,16}; +Circle(22) = {12,1,13}; +Circle(23) = {16,1,17}; +Circle(24) = {12,1,14}; +Circle(25) = {16,1,18}; +Circle(26) = {13,1,14}; +Circle(27) = {17,1,18}; +Circle(28) = {15,1,13}; +Circle(29) = {19,1,17}; +Circle(30) = {12,1,15}; +Circle(31) = {16,1,19}; +Line(32) = {1,15}; +Line(33) = {15,19}; +Line(34) = {3,6}; + +Line Loop(35) = {-2,-1,-3,4}; +Plane Surface(36) = {35}; +Line Loop(37) = {-7,-6,-5,1,2,34}; +Plane Surface(38) = {37}; +Line Loop(39) = {7,10,11,12}; +Plane Surface(40) = {39}; +Line Loop(41) = {12,-6,-16,15}; +Plane Surface(42) = {41}; +Line Loop(43) = {14,15,-11,13}; +Plane Surface(44) = {43}; +Line Loop(45) = {5,-16,-14,-17,3}; +Plane Surface(46) = {45}; +Line Loop(47) = {-17,4,34,10,13}; +Plane Surface(48) = {47}; +Line Loop(49) = {7,8,-22,-9,6}; +Plane Surface(50) = {49}; +Line Loop(51) = {20,-23,-21,22}; +Plane Surface(52) = {51}; +Line Loop(53) = {-8,-34,-4,32,28}; +Plane Surface(54) = {53}; +Line Loop(55) = {-20,-28,33,29}; +Plane Surface(56) = {55}; +Line Loop(57) = {5,9,30,-32,3}; +Plane Surface(58) = {57}; +Line Loop(59) = {19,-25,-21,24}; +Plane Surface(60) = {59}; +Line Loop(61) = {9,24,-18,14,16}; +Plane Surface(62) = {61}; +Line Loop(63) = {-18,-13,-10,8,26}; +Plane Surface(64) = {63}; +Line Loop(65) = {19,-27,-20,26}; +Plane Surface(66) = {65}; +Line Loop(67) = {33,-31,-21,30}; +Plane Surface(68) = {67}; +Line Loop(69) = {-28,-30,22}; +Ruled Surface(70) = {69}; +Line Loop(71) = {-29,-31,23}; +Ruled Surface(72) = {71}; +Line Loop(73) = {-24,22,26}; +Ruled Surface(74) = {73}; +Line Loop(75) = {-25,23,27}; +Ruled Surface(76) = {75}; + +Surface Loop(77) = {48,-46,-38,-40,-44,42,-36}; +Complex Volume(78) = {77}; +Surface Loop(79) = {64,-62,-50,40,44,-42,-74}; +Complex Volume(80) = {79}; +Surface Loop(81) = {36,38,50,54,58,70}; +Complex Volume(82) = {81}; +Surface Loop(83) = {70,-56,-52,-72,68}; +Complex Volume(84) = {83}; +Surface Loop(85) = {52,66,-60,76,-74}; +Complex Volume(86) = {85}; + + + +AirInterieur = 1111 ; +AirBas = 1112 ; +AirHaut = 1113 ; +AirInfini = 1114 ; + +Spire = 2222 ; +Ecran = 3333 ; +dEcran = 3334 ; + +CLInf = 1100 ; + + + +Physical Line(dEcran) = {11,12,6, 14,16,13} ; + +Physical Surface(Spire) = 36 ; +Physical Surface(Ecran) = {42,44} ; + +Physical Surface(CLInf) = {76,72} ; + +Physical Volume(AirInterieur) = 78; +Physical Volume(AirBas) = 80; +Physical Volume(AirHaut) = 82; + +Physical Volume(AirInfini) = {84,86}; + + + diff --git a/bin/dbx_gmsh b/bin/dbx_gmsh new file mode 100644 index 0000000000000000000000000000000000000000..e8918b33bccb4b0ee2f02da36419e1763ae20ebb --- /dev/null +++ b/bin/dbx_gmsh @@ -0,0 +1,8 @@ +dbx /usr/users53/geuzaine/SOURCES/gmsh-nl/bin/gmsh \ + -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshUnix \ + -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshMesh \ + -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshGeo \ + -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshDataStr \ + -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshAdapt \ + -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshParser \ + -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshGL diff --git a/bin/dxf2geo b/bin/dxf2geo new file mode 100644 index 0000000000000000000000000000000000000000..575800852f2c8f325d694e49aa1f7627f21a5a58 Binary files /dev/null and b/bin/dxf2geo differ diff --git a/bin/gdb_gmsh b/bin/gdb_gmsh new file mode 100644 index 0000000000000000000000000000000000000000..bd665ca2273b089aad6c9977e62fd24cd09e8b35 --- /dev/null +++ b/bin/gdb_gmsh @@ -0,0 +1,8 @@ +gdb /usr/users53/geuzaine/SOURCES/gmsh-nl/bin/gmsh \ + -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshUnix \ + -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshMesh \ + -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshGeo \ + -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshDataStr \ + -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshAdapt \ + -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshParser \ + -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshGL diff --git a/bin/gdb_gmshm b/bin/gdb_gmshm new file mode 100644 index 0000000000000000000000000000000000000000..f971c6781f778f244f8df9eb5711dd3065b631ac --- /dev/null +++ b/bin/gdb_gmshm @@ -0,0 +1,9 @@ + +gdb /home/geuzaine/SOURCES/gmsh-nl/bin/gmshm \ + --directory /home/geuzaine/SOURCES/gmsh-nl/GmshUnix \ + --directory /home/geuzaine/SOURCES/gmsh-nl/GmshMesh \ + --directory /home/geuzaine/SOURCES/gmsh-nl/GmshGeo \ + --directory /home/geuzaine/SOURCES/gmsh-nl/GmshDataStr \ + --directory /home/geuzaine/SOURCES/gmsh-nl/GmshAdapt \ + --directory /home/geuzaine/SOURCES/gmsh-nl/GmshParser \ + --directory /home/geuzaine/SOURCES/gmsh-nl/GmshGL diff --git a/demos/ex01.geo b/demos/ex01.geo new file mode 100644 index 0000000000000000000000000000000000000000..4b69763ac7fac0fd7f4b34eece902bcfe597df78 --- /dev/null +++ b/demos/ex01.geo @@ -0,0 +1,141 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + Trivial 2D example + + All important comments are marked with "README" +*/ + + +/* README: This defines a variable called lc. Note that you can use C + or C++ style comments in all Gmsh files. */ + +lc = 0.007; + +/* README: This defines the point '1', located at x=0, y=0, z=0, with + an associated characteristic length 'lc'. The characteristic length + sets the target mesh size at the point. */ + +Point(1) = {0, 0, 0, lc}; + +// Other points + +Point(2) = {.1, 0, 0, lc}; +Point(3) = {.1, .3, 0, lc}; +Point(4) = {0, .3, 0, lc}; + +/* README: To define lines, simply give a pair of point numbers */ + +Line(1) = {1,2}; +Line(2) = {2,3}; +Line(3) = {3,4}; +Line(4) = {4,1}; + +/* README: A line loop is defined as a list of lines (with signs) */ + +Line Loop(5) = {4,1,2,3}; + +/* README: A plane surface is defined as a list of line loops (only + one here) */ + +Plane Surface(6) = {5}; + +/* README: Now that all elementary entities are defined, we define the + physical entities, i.e. the composed entities whose meshes will be + saved in the output file */ + +Physical Line(1111) = {1}; +Physical Line(2222) = {3}; +Physical Line(3333) = {2,4}; +Physical Surface(9999) = {6}; + +/* README: You can also specify options in the file. For example, this + redefines the color of geometry points. See ex03.geo for a more + complete example. */ + +Color{ + Geometry{ + Points = Orange; + } +} + +/* README: You can merge files with File->Merge. This is most useful + for post-processing purposes. Try for example to merge view1.pos + together with this file. Post-processing options are available by + right-clicking on the view button. You can also directly launch + Gmsh with several files as arguments on the command line. The first + will be 'opened', the others will be 'merged'. + + For example, try 'gmsh ex01.geo view01.pos view02.pos'. Two view + buttons will appear in the post-processing menu, respectively + labeled "a scalar map" and "a vector map". A left mouse click will + toggle the visibility of the particular view. A right mouse click + will give you access to the view's options: + + - Remove: removes the view + - Duplicate: makes a formal copy of the view + - Lighting: activates/deactivates lighting for the view + - Scale: gives access to the scale menu (range definition, iso-value + choice, ...) + - Color: defines the colormap for the view + - Offset: permits to move the view around, and to make elevation + maps + - Vector display: change vector attributes + - Time step: select the displayed time step + - Export as background mesh: exports the map, considered as an + error map, as a background mesh, i.e. as a characteristic length map + - Apply as current bg mesh: applies the view as the current background + mesh. + + If you want modifications made to one view to affect also all + other views, select the appropriate option in Options->Post-Processing +*/ + + +/* README: The 'msh' file format is the native output file format for + Gmsh. The file is divided in several sections (enclosed in $KEY and + $ENDKEY pairs). Two fields are important: $NOD/$ENDNOD defines the + nodes and $ELM/$ENDELM defines the elements. + + The syntax is as follows: + + $NOD + number-of-nodes + node-number x-coord y-coord z-coord + ... + $ENDNOD + + $ELM + number-of-elements + elm-number elm-type elm-region unused number-of-nodes node-numbers + ... + $ENDELM + + All the syntactic variables stand for integers except x-coord, + y-coord and z-coord which stand for floating point values. The + elm-type value defines the geometrical type for the element: + + elm-type: + + 1 Line (2 nodes, 1 edge). + 2 Triangle (3 nodes, 3 edges). + 3 Quadrangle (4 nodes, 4 edges). + 4 Tetrahedron (4 nodes, 6 edges, 4 facets). + 5 Hexahedron (8 nodes, 12 edges, 6 facets). + 6 Prism (6 nodes, 9 edges, 5 facets). + 7 Pyramid (5 nodes, 8 edges, 5 facets). + 15 Point (1 node). + + The elm-region value is the number of the physical entity to which + the element belongs. + + The 'unv' is the universal file format standard. +*/ + +/* README: The format of post-processing views is detailled in 'view01.pos' */ + + + + + + diff --git a/demos/ex02.geo b/demos/ex02.geo new file mode 100644 index 0000000000000000000000000000000000000000..bf88a91f98aee0ea9b84a418e16fee0ff28f669b --- /dev/null +++ b/demos/ex02.geo @@ -0,0 +1,77 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + Trivial 3D example + + All important comments are marked with "README" +*/ + +lcar1 = .1; +lcar2 = .0005; + +Point(1) = {0.5,0.5,0.5,lcar2}; +Point(2) = {0.5,0.5,0,lcar1}; +Point(3) = {0,0.5,0.5,lcar1}; +Point(4) = {0,0,0.5,lcar1}; +Point(5) = {0.5,0,0.5,lcar1}; +Point(6) = {0.5,0,0,lcar1}; +Point(7) = {0,0.5,0,lcar1}; +Point(8) = {0,1,0,lcar1}; +Point(9) = {1,1,0,lcar1}; +Point(10) = {0,0,1,lcar1}; +Point(11) = {0,1,1,lcar1}; +Point(12) = {1,1,1,lcar1}; +Point(13) = {1,0,1,lcar1}; +Point(14) = {1,0,0,lcar1}; + +Line(1) = {8,9}; +Line(2) = {9,12}; +Line(3) = {12,11}; +Line(4) = {11,8}; +Line(5) = {9,14}; +Line(6) = {14,13}; +Line(7) = {13,12}; +Line(8) = {11,10}; +Line(9) = {10,13}; +Line(10) = {10,4}; +Line(11) = {4,5}; +Line(12) = {5,6}; +Line(13) = {6,2}; +Line(14) = {2,1}; +Line(15) = {1,3}; +Line(16) = {3,7}; +Line(17) = {7,2}; +Line(18) = {3,4}; +Line(19) = {5,1}; +Line(20) = {7,8}; +Line(21) = {6,14}; + +Line Loop(22) = {11,19,15,18}; Plane Surface(23) = {22}; +Line Loop(24) = {16,17,14,15}; Plane Surface(25) = {24}; +Line Loop(26) = {-17,20,1,5,-21,13}; Plane Surface(27) = {26}; +Line Loop(28) = {4,1,2,3}; Plane Surface(29) = {28}; +Line Loop(30) = {7,-2,5,6}; Plane Surface(31) = {30}; +Line Loop(32) = {6,-9,10,11,12,21}; Plane Surface(33) = {32}; +Line Loop(34) = {7,3,8,9}; Plane Surface(35) = {34}; +Line Loop(36) = {10,-18,16,20,-4,8}; Plane Surface(37) = {36}; +Line Loop(38) = {-14,-13,-12,19}; Plane Surface(39) = {38}; + +/* README: In the same way one defines line loops to build surfaces, + one must define surface loops to build volumes. The following + volume is very simple, without holes (only one surface loop) */ + +Surface Loop(40) = {35,31,29,37,33,23,39,25,27}; +Complex Volume(41) = {40}; + +// Save volumic elements in region 1000 + +Physical Volume (1000) = {41} ; + +// Save parts of the surface mesh in regions 2000 and 2001, e.g. to +// impose boundary conditions + +Physical Surface (2000) = {23,25,39} ; +Physical Surface (2001) = {29,31,35} ; + + + diff --git a/demos/ex03.geo b/demos/ex03.geo new file mode 100644 index 0000000000000000000000000000000000000000..29fb8d8e3cafdf5cf75974a5dfa1dd5d3cf69e67 --- /dev/null +++ b/demos/ex03.geo @@ -0,0 +1,224 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + Simple 3D example + + All important comments are marked with "README" +*/ + +// Definition of some variables + +dxCore = 50.e-3 ; +dyCore = 50.e-3 ; +dzCore = 100.e-3 ; +dxGap = 25.e-3 ; + +xInd = 75.e-3 ; +dxInd = 25.e-3 ; +dzInd = 50.e-3 ; + +xBox = 200.e-3 ; + +s = 2. ; +p0 = 12.e-3 *s; +pCorex = 6.e-3 *s; +pCorez0 = 10.e-3 *s; +pCorez = 6.e-3 *s; +pInd0 = 6.e-3 *s; +pInd1 = 5.e-3 *s; +pBox = xBox/6. *s; + +sqr2 = 2.^0.5 ; + +// Definition of points + +Point(1) = { 0, 0, 0, p0} ; +Point(2) = { dxCore, 0, 0, pCorex} ; +Point(3) = { xInd, 0, 0, pInd0} ; +Point(4) = { xInd+dxInd, 0, 0, pInd0} ; +Point(5) = { xBox, 0, 0, pBox} ; + +Point(6) = { dxCore, dyCore, 0, pCorex} ; +Point(7) = { dxCore+dxGap/sqr2, dxCore+dxGap/sqr2, 0, pInd0} ; +Point(8) = { dxCore+(dxGap+dxInd)/sqr2, dxCore+(dxGap+dxInd)/sqr2, 0, pInd0} ; +Point(9) = { xBox, xBox, 0, pBox} ; + +Point(10) = { xInd, dyCore, 0, pInd0} ; +Point(11) = { xInd+dxInd, dyCore, 0, pInd0} ; + + +Point(101) = { 0, 0, dzCore, pCorez0} ; +Point(102) = { dxCore, 0, dzCore, pCorez} ; +Point(106) = { dxCore, dyCore, dzCore, pCorez} ; + +Point(103) = { xInd, 0, dzInd, pInd1} ; +Point(104) = { xInd+dxInd, 0, dzInd, pInd1} ; +Point(107) = { dxCore+dxGap/sqr2, dxCore+dxGap/sqr2, dzInd, pInd1} ; +Point(108) = { dxCore+(dxGap+dxInd)/sqr2, dxCore+(dxGap+dxInd)/sqr2, dzInd, pInd1} ; +Point(110) = { xInd, dyCore, dzInd, pInd1} ; +Point(111) = { xInd+dxInd, dyCore, dzInd, pInd1} ; + +Point(116) = { dxCore, dyCore, dzInd, p0} ; + +Point(201) = { 0, 0, xBox, pBox} ; +Point(205) = { xBox, 0, xBox, pBox} ; +Point(209) = { xBox, xBox, xBox, pBox} ; + +// Definition of lines + +Line(1) = {1,2}; Line(2) = {2,3}; Line(3) = {3,4}; +Line(4) = {4,5}; Line(5) = {5,9}; Line(6) = {1,6}; +Line(7) = {6,7}; Line(8) = {7,8}; Line(9) = {8,9}; +Line(10) = {2,6}; Line(11) = {3,10}; Line(12) = {4,11}; + +/* README: A circle is always defined counter-clockwise (i.e. + trigonometric), and specified by 3 points: starting, + center and end point. Note that these 3 points can not be + aligned and that the interior angle should be less than 180 + degrees. */ + +Circle(13) = {10,6,7}; Circle(14) = {11,6,8}; + +// Some more lines and circles + +Line(15) = {101,102}; Line(16) = {102,106}; Line(17) = {101,106}; +Line(18) = {1,101}; Line(19) = {101,201}; Line(20) = {201,205}; +Line(21) = {201,209}; Line(22) = {205,209}; Line(23) = {103,104}; +Line(24) = {103,110}; Line(25) = {104,111}; Line(26) = {107,108}; + +Circle(27) = {110,116,107}; +Circle(28) = {111,116,108}; + +Line(29) = {2,102}; Line(30) = {6,106}; Line(31) = {3,103}; +Line(32) = {4,104}; Line(33) = {10,110}; Line(34) = {11,111}; +Line(35) = {7,107}; Line(36) = {8,108}; Line(37) = {5,205}; +Line(38) = {9,209}; + +/* README: Definition of lines loops and plane surfaces. Note that + there are no internal loops in these surfaces (only one line loop + per surface) */ + +Line Loop(39) = {-22,-37,5,38}; Plane Surface(40) = {39}; +Line Loop(41) = {-22,-20,21}; Plane Surface(42) = {41}; +Line Loop(43) = {-10,-1,6}; Plane Surface(44) = {43}; +Line Loop(45) = {7,-13,-11,-2,10}; Plane Surface(46) = {45}; +Line Loop(47) = {23,-32,-3,31}; Plane Surface(48) = {47}; +Line Loop(49) = {13,8,-14,-12,-3,11}; Plane Surface(50) = {49}; +Line Loop(51) = {14,9,-5,-4,12}; Plane Surface(52) = {51}; +Line Loop(53) = {-29,-1,18,15}; Plane Surface(54) = {53}; +Line Loop(55) = {17,-30,-6,18}; Plane Surface(56) = {55}; +Line Loop(57) = {-16,-29,10,30}; Plane Surface(58) = {57}; +Line Loop(59) = {-16,-15,17}; Plane Surface(60) = {59}; +Line Loop(61) = {-24,-31,11,33}; Plane Surface(62) = {61}; +Line Loop(63) = {-25,-32,12,34}; Plane Surface(64) = {63}; +Line Loop(65) = {26,-36,-8,35}; Plane Surface(66) = {65}; +Line Loop(67) = {27,26,-28,-25,-23,24}; Plane Surface(68) = {67}; +Line Loop(69) = {-23,-31,-2,29,-15,19,20,-37,-4,32}; + Plane Surface(70) = {69}; +Line Loop(71) = {-26,-35,-7,30,-17,19,21,-38,-9,36}; + Plane Surface(72) = {71}; + +/* README: Definition of ruled surfaces. Ruled surfaces must have 3 or + 4 borders (not more, not less). */ + +Line Loop(73) = {-27,-33,13,35}; +Ruled Surface(74) = {73}; + +Line Loop(75) = {-28,-34,14,36}; +Ruled Surface(76) = {75}; + +// Definition of volumes + +Surface Loop(77) = {60,-58,54,-44,-56}; +Complex Volume(78) = {77}; + +Surface Loop(79) = {64,-68,-74,-62,-48,50,66,76}; +Complex Volume(80) = {79}; + +Surface Loop(81) = {64,-68,-74,-62,70,-46,-72,58,-60,42,-40,-52,76}; +Complex Volume(82) = {81}; + +// Some definitions for saving the mesh + +Physical Volume (500) = {82} ; +Physical Volume (501) = {78} ; +Physical Volume (502) = {80} ; + +Physical Surface (1000) = {40,42} ; +Physical Surface (1001) = {44,46,50,52} ; +Physical Surface (1002) = {70,72,54,56,48,66} ; + +Physical Surface (602) = {68,74,62,76,64} ; +Physical Surface (700) = {44,46} ; + +Physical Surface (710) = {48} ; +Physical Surface (711) = {66} ; + +/* README: most visual parameters can be redefined. Post-processing + color definitions are made interactively (or loaded at startup in + an appropriate file, see the interactive help of the color + widget). GUI colors and fonts can be changed in a standard X + resource file (.gmshrc in your home directory). */ + +Color{ + General{ + Background = {39, 64, 139} ; + Axes = OrangeRed1; // Color names are the classical X11 names + SmallAxes = LightGray; + Text = Gray88 ; + } + Geometry{ + Points = Yellow; + Lines = {255, 255, 255, 128} ; // semi-transparent white + Surfaces = {Orange, 60} ; // almost transparent orange + Volumes = Green ; + PointsSelect = White ; + LinesSelect = White ; + SurfacesSelect = White ; + } + Mesh{ + Points = Black; + PointsSupp = Orchid; + Lines = Black; + // Color cycle for volume mesh + One = Gray10 ; + Two = Gray20 ; + Three = Gray30 ; + Four = Gray40 ; + Five = Gray50 ; + Six = Gray60 ; + Seven = Gray70 ; + Eight = Gray80 ; + Nine = Gray90 ; + Ten = Black ; + } + +} + +/* README: X resources can be specified in a '.gmshrc' in your home + directory or app-defaults directory, or in your .Xdefaults file. + Here are some default values for the 2 main windows: + + ! Graphic window + gmshGW*geometry: 700x525+20+30 + gmshGW*fontList: fixed + gmshGW*background: Grey65 + gmshGW*borderColor: Grey65 + gmshGW*foreground: Black + gmshGW*highlightColor: Grey66 + + ! Menu window + gmshMW*geometry: x525+800+30 + gmshMW*fontList: fixed + gmshMW*background: Grey65 + gmshMW*borderColor: Grey65 + gmshMW*foreground: Black + gmshMW*XmText*background: Grey75 + gmshMW*XmText*foreground: Black + gmshMW*XmTextField*background: Grey75 + gmshMW*XmList*background: Grey75 + gmshMW*selectColor: Yellow + gmshMW*highlightColor: DarkOrchid + + Use 'editres' to get the full widget tree and associated resources. +*/ diff --git a/demos/ex04.geo b/demos/ex04.geo new file mode 100644 index 0000000000000000000000000000000000000000..fba0659be30a44a57ab6a28c6de9b6bef8318c2f --- /dev/null +++ b/demos/ex04.geo @@ -0,0 +1,116 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + 2D example with hole + + All important comments are marked with "README" +*/ + +unit = 1.0e-02 ; + +e1 = 4.5 * unit ; +e2 = 6.0 * unit / 2.0 ; +e3 = 5.0 * unit / 2.0 ; +h1 = 5.0 * unit ; +h2 = 10.0 * unit ; +h3 = 5.0 * unit ; +h4 = 2.0 * unit ; +h5 = 4.5 * unit ; +R1 = 1.0 * unit ; +R2 = 1.5 * unit ; +r = 1.0 * unit ; +ccos = (-h5*R1+e2* (h5*h5+e2*e2-R1*R1)^0.5) / (h5*h5+e2*e2) ; +ssin = ( 1.0 - ccos*ccos )^0.5 ; + +Lc1 = 0.01 ; +Lc2 = 0.003 ; + +Point(1) = { -e1-e2, 0.0 , 0.0 , Lc1}; +Point(2) = { -e1-e2, h1 , 0.0 , Lc1}; +Point(3) = { -e3-r , h1 , 0.0 , Lc2}; +Point(4) = { -e3-r , h1+r , 0.0 , Lc2}; +Point(5) = { -e3 , h1+r , 0.0 , Lc2}; +Point(6) = { -e3 , h1+h2, 0.0 , Lc1}; +Point(7) = { e3 , h1+h2, 0.0 , Lc1}; +Point(8) = { e3 , h1+r , 0.0 , Lc2}; +Point(9) = { e3+r , h1+r , 0.0 , Lc2}; +Point(10)= { e3+r , h1 , 0.0 , Lc2}; +Point(11)= { e1+e2, h1 , 0.0 , Lc1}; +Point(12)= { e1+e2, 0.0 , 0.0 , Lc1}; +Point(13)= { e2 , 0.0 , 0.0 , Lc1}; + +Point(14)= { R1 / ssin , h5+R1*ccos, 0.0 , Lc2}; +Point(15)= { 0.0 , h5 , 0.0 , Lc2}; +Point(16)= { -R1 / ssin , h5+R1*ccos, 0.0 , Lc2}; +Point(17)= { -e2 , 0.0 , 0.0 , Lc1}; + +Point(18)= { -R2 , h1+h3 , 0.0 , Lc2}; +Point(19)= { -R2 , h1+h3+h4, 0.0 , Lc2}; +Point(20)= { 0.0 , h1+h3+h4, 0.0 , Lc2}; +Point(21)= { R2 , h1+h3+h4, 0.0 , Lc2}; +Point(22)= { R2 , h1+h3 , 0.0 , Lc2}; +Point(23)= { 0.0 , h1+h3 , 0.0 , Lc2}; + +Point(24)= { 0 , h1+h3+h4+R2, 0.0 , Lc2}; +Point(25)= { 0 , h1+h3-R2, 0.0 , Lc2}; + +Line(1) = {1 ,17}; /* ux=uy=0 */ +Line(2) = {17,16}; +Circle(3) = {14,15,16}; +Line(4) = {14,13}; +Line(5) = {13,12}; /* ux=uy=0 */ +Line(6) = {12,11}; +Line(7) = {11,10}; +Circle(8) = { 8, 9,10}; +Line(9) = { 8, 7}; +Line(10) = { 7, 6}; /* T=10000 N */ +Line(11) = { 6, 5}; +Circle(12) = { 3, 4, 5}; +Line(13) = { 3, 2}; +Line(14) = { 2, 1}; + +Line(15) = {18,19}; +Circle(16) = {21,20,24}; +Circle(17) = {24,20,19}; +Circle(18) = {18,23,25}; +Circle(19) = {25,23,22}; +Line(20) = {21,22}; + +Line Loop(21) = {17,-15,18,19,-20,16}; +Plane Surface(22) = {21}; + +/* README: This surface is made of two line loops, i.e. has one hole */ + +Line Loop(23) = {11,-12,13,14,1,2,-3,4,5,6,7,-8,9,10}; +Plane Surface(24) = {23,21}; + +/* README: As a basic rule in Gmsh, everything that is defined is + meshed. So, if you don't want surface 22 to be meshed, just remove + its definition from this file. Note that the line loop 21 must be + left intact, since the surface 24 uses it. + + Now, much more flexibility can be achieved using the "Physical + entities", which specify which parts of the mesh will be saved, and + which numbers will be associated with the corresponding groups of + elements. For example, if you want only the elements in surface 22 + to be output in the mesh file, you only define a physical surface + that contains surface 22 : "Physical Surface (1000) = {22}". In + this case, even if both surfaces 22 and 24 are meshed, only + elements belonging to surface 22 will be saved in the mesh file. + + Note that physical entities can do much more. They permit to + combine different elementary entities in one region : to affect the + same region number, let's say 2000, to all elements in surfaces 22 + and 24, you could define "Physical Surface{2000} = {22,24}". They + also enable the definition of element orientations: to reverse the + orientation of the elements in 22 and 24, just define "Physical + Surface{2000} = {-22,-24}". +*/ + +/* README: To define physical surfaces interactively, you have to + select elementary surfaces by clicking on the dashed cross + representing them (the surfaces must be visible: select this option + in the Opt->Geometry->Visibility->Surfaces dialog box). You can of + course also define the physical surfaces directly in the 'geo' + file, which is often more efficient in 2D cases. +*/ diff --git a/demos/ex05.geo b/demos/ex05.geo new file mode 100644 index 0000000000000000000000000000000000000000..4e70ea3c6f2651a698e058e2f4e6848fddbe9960 --- /dev/null +++ b/demos/ex05.geo @@ -0,0 +1,198 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + More complex 2D example + + All important comments are marked with "README" +*/ + +// All dimensions in meters and rads + +Lc = 0.0004 ; // Base char length +Z = 0.0 ; // Z-coord + +// Stator data + +nbs = 36 ; // Num. of poles +dths = 2 * Pi / nbs ; // Ang. shift between 2 poles. + +// README: Pi is the only constant predefined in Gmsh + +th0s = dths / 2 ; // Angular pos. +des = 0.1529 ; // Ext. diam. +res = des / 2 ; +dis = 0.09208 ; // Int. diam. +ris = dis / 2 ; + +hs = 0.0153 ; // Pole height +h1s = 0.000762 ; // Dist. intersection rec.-int. circle +d1s = 0.00636 ; // Diam. sup. circle +r1s = d1s / 2 ; +rc1s = 0.00084 ; // Radius convex rec. +rc2s = 0.000508 ; // Radius concave rec. +e1s = 0.0025 ; // Dist. between 2 sides at int diam +e2s = 0.00424 ; // Dist. between 2 sides at 1st rec. + +// Rotor data + +nbr = 32 ; // Num. of poles +dthr = 2 * Pi / nbr ; // Angular shift betw. 2 poles + +th0r = dths / 2 ; // Ang. pos. rotor +gap = 0.00080 ; // Air gap width +espa = 0.0015 ; // Dist. stator-pole top +der = 0.09208 ; // Ext. diam rotor +rer = der / 2 ; +dir = 0.03175 ; // Diam. int. +rir = dir / 2 ; + +hr = 0.01425 ; // Pole height +d1r = 0.00426 ; // Diam. sup circle +r1r = d1r / 2 ; +d2r = 0.00213 ; // Diam. inf. circle +r2r = d2r / 2 ; + +dist = rer - espa ; // Radial dist. of intersect. point + +/* README: 'newp' is a meta variable defining a new point number for + you. This is mostly useful with included files. There is also + 'newreg' which defines a new region number (that is, everything + that is not a point). */ + +pAxe = newp ; Point(pAxe) = { 0. , 0. , 0., 15*Lc} ; + +// axis + +p1 = newp ; Point(p1) = { rir, 0. , 0., 15*Lc} ; +p2 = newp ; Point(p2) = { 0. , rir, 0., 15*Lc} ; + +lin1 = newreg ; Line(lin1) = {pAxe,p1} ; +arc1 = newreg ; Circle(arc1) = {p1,pAxe,p2} ; +lin2 = newreg ; Line(lin2) = {p2, pAxe} ; + +reg1 = newreg ; Line Loop(reg1) = {lin1,arc1,lin2} ; +reg2 = newreg ; Plane Surface(reg2) = {reg1} ; + +// Rotor lateral sides + +p3 = newp ; Point(p3) = { rer-gap, 0. , 0., Lc} ; +p4 = newp ; Point(p4) = { 0. , rer-gap, 0., Lc} ; + +lin3 = newreg ; Line(lin3) = {p1, p3} ; +arc2 = newreg ; Circle(arc2) = {p3,pAxe,p4} ; +lin4 = newreg ; Line(lin4) = {p4, p2} ; + +// Air gap + +p5 = newp ; Point(p5) = { ris, 0. , 0., Lc} ; +p6 = newp ; Point(p6) = { 0. , ris, 0., Lc} ; + +lin5 = newreg ; Line(lin5) = {p3, p5} ; +lin6 = newreg ; Line(lin6) = {p6, p4} ; + +// Stator exterior + +p7 = newp ; Point(p7) = { res, 0. , 0. , 15*Lc } ; +p8 = newp ; Point(p8) = { 0. , res, 0. , 15*Lc } ; + +lin7 = newreg ; Line(lin7) = {p5, p7} ; +arc4 = newreg ; Circle(arc4) = {p7,pAxe,p8} ; +lin8 = newreg ; Line(lin8) = {p8, p6} ; + +PP1 = p5 ; PPB = p6 ; + +// 8 rotor poles + +D1 = dist ; +H = hr ; +R1 = r1r ; +R2 = r2r ; + +/* README: You can include files with the 'Include' command. Note that + *ALL* variables in Gmsh are global. Including a file is similar to + paste its content where the include command is located. */ + +i = 1 ; th = th0r + (i - 1) * dthr ; +Include "ex05.i1" ; +i = 2 ; th = th0r + (i - 1) * dthr ; +Include "ex05.i1" ; +i = 3 ; th = th0r + (i - 1) * dthr ; +Include "ex05.i1" ; +i = 4 ; th = th0r + (i - 1) * dthr ; +Include "ex05.i1" ; +i = 5 ; th = th0r + (i - 1) * dthr ; +Include "ex05.i1" ; +i = 6 ; th = th0r + (i - 1) * dthr ; +Include "ex05.i1" ; +i = 7 ; th = th0r + (i - 1) * dthr ; +Include "ex05.i1" ; +i = 8 ; th = th0r + (i - 1) * dthr ; +Include "ex05.i1" ; + +// 9 stator poles + +dth = dths ; +D2 = ris ; +H = hs ; +R1 = r1s ; +R2 = rc1s ; +R3 = rc2s ; +E1 = e1s ; +E2 = e2s ; +H1 = h1s ; + +i = 1 ; th = th0s + (i - 1) * dths ; +Include "ex05.i2" ; +PP2 = p1 ; PP3 = p9 ; +i = 2 ; th = th0s + (i - 1) * dths ; +Include "ex05.i2" ; +PP4 = p1 ; PP5 = p9 ; +i = 3 ; th = th0s + (i - 1) * dths ; +Include "ex05.i2" ; +PP6 = p1 ; PP7 = p9 ; +i = 4 ; th = th0s + (i - 1) * dths ; +Include "ex05.i2" ; +PP8 = p1 ; PP9 = p9 ; +i = 5 ; th = th0s + (i - 1) * dths ; +Include "ex05.i2" ; +PP10 = p1 ; PP11 = p9 ; +i = 6 ; th = th0s + (i - 1) * dths ; +Include "ex05.i2" ; +PP12 = p1 ; PP13 = p9 ; +i = 7 ; th = th0s + (i - 1) * dths ; +Include "ex05.i2" ; +PP14 = p1 ; PP15 = p9 ; +i = 8 ; th = th0s + (i - 1) * dths ; +Include "ex05.i2" ; +PP16 = p1 ; PP17 = p9 ; +i = 9 ; th = th0s + (i - 1) * dths ; +Include "ex05.i2" ; +PP18 = p1 ; PP19 = p9 ; + +lin1 = newreg ; Line(lin1) = {PP1 , PP2 } ; +lin1 = newreg ; Line(lin1) = {PP3 , PP4 } ; +lin1 = newreg ; Line(lin1) = {PP5 , PP6 } ; +lin1 = newreg ; Line(lin1) = {PP7 , PP8 } ; +lin1 = newreg ; Line(lin1) = {PP9 , PP10} ; +lin1 = newreg ; Line(lin1) = {PP11, PP12} ; +lin1 = newreg ; Line(lin1) = {PP13, PP14} ; +lin1 = newreg ; Line(lin1) = {PP15, PP16} ; +lin1 = newreg ; Line(lin1) = {PP17, PP18} ; +lin1 = newreg ; Line(lin1) = {PP19, PPB } ; + + +Line Loop(145) = {8,-2,6,7}; +Plane Surface(146) = {145,68,61,54,47,40,33,26,19}; + +Line Loop(147) = {-7,9,133,-74,134,-81,135,-88,136,-95,137,-102,138,-109,139,-116,140,-123,141,-130,142,10}; +Plane Surface(148) = {147}; + +Line Loop(149) = {70,71,72,73,134,77,78,79,80,135,84,85,86,87,136,91,92,93,94,137,98,99,100,101,138,105,106,107,108,139,112,113,114,115,140,119,120,121,122,141,126,127,128,129,142,-13,-12,-11,133}; +Plane Surface(150) = {149}; + +/* README: One should define physical regions to specify what to + save. Otherwise, only mesh points will be output in the mesh + file. */ + +/* Physical Surface(1000) = {.......} */ + diff --git a/demos/ex05.i1 b/demos/ex05.i1 new file mode 100644 index 0000000000000000000000000000000000000000..8b872ec5d67ecd336482d57e19484f67f2a8e58c --- /dev/null +++ b/demos/ex05.i1 @@ -0,0 +1,60 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + Rotor pole definition. Included by ex05.geo. + + All important comments are marked with "README" +*/ + +/* README: Variables that must be defined when including this file: + th,D1,H,R1,R2,Lc */ + +/* README: Besides the classical '-', '+', '*', '/' and '^' (power) + operators, Gmsh provides the following math functions: 'Sqrt', + 'Sin', 'Cos','Tan', 'ArcSin', 'ArcCos', 'ArcTan', 'Log' */ + + +XC1 = (D1 - R1) * Cos(th) ; // Sup. circle center +YC1 = (D1 - R1) * Sin(th) ; +XC2 = (D1 - H + R2) * Cos(th) ; // Inf. circle center +YC2 = (D1 - H + R2) * Sin(th) ; + +XS1 = (D1) * Cos(th) ; // Sup. circle top +YS1 = (D1) * Sin(th) ; + +dth = Pi - ArcCos((R1 - R2) / (H - R1 - R2)) ; + +XA1 = XC1 + R1 * Cos(th - dth) ; // Sup. right tangency point +YA1 = YC1 + R1 * Sin(th - dth) ; +XA2 = XC2 + R2 * Cos(th - dth) ; // Inf. right tangency point +YA2 = YC2 + R2 * Sin(th - dth) ; +XB1 = XC1 + R1 * Cos(th + dth) ; // Sup. left tangency point +YB1 = YC1 + R1 * Sin(th + dth) ; +XB2 = XC2 + R2 * Cos(th + dth) ; // Inf. left tangency point +YB2 = YC2 + R2 * Sin(th + dth) ; + +// Pole + +/* README: 'newp' is a meta variable defining a new point number for + you. This is mostly useful with included files. There is also + 'newreg' which defines a new region number (that is, everything + that is not a point). */ + +p1 = newp ; Point(p1) = { XA2 , YA2, 0., 3*Lc} ; +p2 = newp ; Point(p2) = { XA1 , YA1, 0., Lc} ; +p3 = newp ; Point(p3) = { XC1 , YC1, 0., Lc} ; +p4 = newp ; Point(p4) = { XB1 , YB1, 0., Lc} ; +p5 = newp ; Point(p5) = { XB2 , YB2, 0., 3*Lc} ; +p6 = newp ; Point(p6) = { XC2 , YC2, 0., 3*Lc} ; + +p7 = newp ; Point(p7) = { XS1 , YS1, 0., Lc} ; + +lin1 = newreg ; Line(lin1) = {p1,p2} ; +arc1 = newreg ; Circle (arc1) = {p2,p3,p7} ; +arc2 = newreg ; Circle (arc2) = {p7,p3,p4} ; +lin2 = newreg ; Line(lin2) = {p4,p5} ; +arc3 = newreg ; Circle(arc3) = {p5,p6,p1} ; + +reg1 = newreg ; Line Loop(reg1) = {lin1,arc1,arc2,lin2,arc3}; +reg2 = newreg ; Plane Surface(reg2) = {reg1}; + diff --git a/demos/ex05.i2 b/demos/ex05.i2 new file mode 100644 index 0000000000000000000000000000000000000000..9d2f68fc2f82829da4631d94b71ae2bdbf688a68 --- /dev/null +++ b/demos/ex05.i2 @@ -0,0 +1,46 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + Stator pole definition. Included by ex05.geo. + + All important comments are marked with "README" +*/ + +/* README: Variables that must be defined when including this file: + th,D2,H,R1,E1 */ + +dtH = ArcSin(E1/2./D2) ; +XH6 = D2 * Cos(th + dtH ) ; // Slab opening +YH6 = D2 * Sin(th + dtH ) ; +XH7 = D2 * Cos(th - dtH ) ; +YH7 = D2 * Sin(th - dtH ) ; + +D1 = D2 + H ; +XH2 = (D1 - R1) * Cos(th) ; // Circle center +YH2 = (D1 - R1) * Sin(th) ; + +XS1 = (D1) * Cos(th) ; // Circle top +YS1 = (D1) * Sin(th) ; + +XT1 = XH2 + R1 * Cos(th + Pi / 2.) ; +YT1 = YH2 + R1 * Sin(th + Pi / 2.) ; +XT2 = XH2 + R1 * Cos(th - Pi / 2.) ; +YT2 = YH2 + R1 * Sin(th - Pi / 2.) ; + +p1 = newp ; Point(p1) = { XH7 , YH7, 0., Lc} ; +p4 = newp ; Point(p4) = { XT2 , YT2, 0., 3*Lc} ; +p5 = newp ; Point(p5) = { XH2 , YH2, 0., 3*Lc} ; +p6 = newp ; Point(p6) = { XT1 , YT1, 0., 3*Lc} ; +p9 = newp ; Point(p9) = { XH6 , YH6, 0., Lc} ; + +p10 = newp ; Point(p10) = { XS1 , YS1, 0., 3*Lc} ; + +lin1 = newreg ; Line(lin1) = {p1, p4} ; +arc1 = newreg ; Circle(arc1) = {p4, p5, p10} ; +arc2 = newreg ; Circle(arc2) = {p10, p5, p6} ; +lin6 = newreg ; Line(lin6) = {p6, p9} ; + +lin7 = newreg ; Line(lin7) = {p9, p1} ; + +reg1 = newreg ; Line Loop(reg1) = {lin1,arc1,arc2,lin6,lin7} ; +reg2 = newreg ; Plane Surface(reg2) = {reg1} ; diff --git a/demos/ex06.geo b/demos/ex06.geo new file mode 100644 index 0000000000000000000000000000000000000000..49a8feac3c4663f5884b85c8b3de327c8ed847a0 --- /dev/null +++ b/demos/ex06.geo @@ -0,0 +1,235 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + 2D and 3D transfinite meshes + + All important comments are marked with "README" +*/ + +r_int = 0.05 ; +r_ext = 0.051 ; +r_far = 0.125 ; +r_inf = 0.4 ; +phi1 = 30. * (Pi/180.) ; +angl = 45. * (Pi/180.) ; + + +nbpt_phi = 5 ; nbpt_int = 20 ; +nbpt_arc1 = 10 ; nbpt_arc2 = 10 ; +nbpt_shell = 10 ; nbpt_far = 25 ; nbpt_inf = 15 ; + +lc0 = 0.1 ; lc1 = 0.1 ; lc2 = 0.3 ; + +Point(1) = {0, 0, 0, lc0} ; +Point(2) = {r_int, 0, 0, lc0} ; +Point(3) = {r_ext, 0, 0, lc1} ; +Point(4) = {r_far, 0, 0, lc2} ; +Point(5) = {r_inf, 0, 0, lc2} ; +Point(6) = {0, 0, r_int, lc0} ; +Point(7) = {0, 0, r_ext, lc1} ; +Point(8) = {0, 0, r_far, lc2} ; +Point(9) = {0, 0, r_inf, lc2} ; + +Point(10) = {r_int*Cos(phi1), r_int*Sin(phi1), 0, lc0} ; +Point(11) = {r_ext*Cos(phi1), r_ext*Sin(phi1), 0, lc1} ; +Point(12) = {r_far*Cos(phi1), r_far*Sin(phi1), 0, lc2} ; +Point(13) = {r_inf*Cos(phi1), r_inf*Sin(phi1), 0, lc2} ; + +Point(14) = {r_int/2, 0, 0, lc2} ; +Point(15) = {r_int/2*Cos(phi1), r_int/2*Sin(phi1), 0, lc2} ; +Point(16) = {r_int/2, 0, r_int/2, lc2} ; +Point(17) = {r_int/2*Cos(phi1), r_int/2*Sin(phi1), r_int/2, lc2} ; +Point(18) = {0, 0, r_int/2, lc2} ; +Point(19) = {r_int*Cos(angl), 0, r_int*Sin(angl), lc2} ; +Point(20) = {r_int*Cos(angl)*Cos(phi1), r_int*Cos(angl)*Sin(phi1), r_int*Sin(angl), lc2} ; +Point(21) = {r_ext*Cos(angl), 0, r_ext*Sin(angl), lc2} ; +Point(22) = {r_ext*Cos(angl)*Cos(phi1), r_ext*Cos(angl)*Sin(phi1), r_ext*Sin(angl), lc2} ; +Point(23) = {r_far*Cos(angl), 0, r_far*Sin(angl), lc2} ; +Point(24) = {r_far*Cos(angl)*Cos(phi1), r_far*Cos(angl)*Sin(phi1), r_far*Sin(angl), lc2} ; +Point(25) = {r_inf, 0, r_inf, lc2} ; +Point(26) = {r_inf*Cos(phi1), r_inf*Sin(phi1), r_inf, lc2} ; + +Circle(1) = {2,1,19}; Circle(2) = {19,1,6}; Circle(3) = {3,1,21}; Circle(4) = {21,1,7}; +Circle(5) = {4,1,23}; Circle(6) = {23,1,8}; Line(7) = {5,25}; Line(8) = {25,9}; +Circle(9) = {10,1,20}; Circle(10) = {20,1,6}; Circle(11) = {11,1,22}; Circle(12) = {22,1,7}; +Circle(13) = {12,1,24}; Circle(14) = {24,1,8}; Line(15) = {13,26}; Line(16) = {26,9}; +Circle(17) = {19,1,20}; Circle(18) = {21,1,22}; Circle(19) = {23,1,24}; Circle(20) = {25,1,26}; +Circle(21) = {2,1,10}; Circle(22) = {3,1,11}; Circle(23) = {4,1,12}; Circle(24) = {5,1,13}; + +Line(25) = {1,14}; Line(26) = {14,2}; Line(27) = {2,3}; Line(28) = {3,4}; +Line(29) = {4,5}; Line(30) = {1,15}; Line(31) = {15,10}; Line(32) = {10,11}; +Line(33) = {11,12}; Line(34) = {12,13}; Line(35) = {14,15}; Line(36) = {14,16}; +Line(37) = {15,17}; Line(38) = {16,17}; Line(39) = {18,16}; Line(40) = {18,17}; +Line(41) = {1,18}; Line(42) = {18,6}; Line(43) = {6,7}; Line(44) = {16,19}; +Line(45) = {19,21}; Line(46) = {21,23}; Line(47) = {23,25}; Line(48) = {17,20}; +Line(49) = {20,22}; Line(50) = {22,24}; Line(51) = {24,26}; Line(52) = {7,8}; +Line(53) = {8,9}; + +Line Loop(54) = {39,-36,-25,41}; Ruled Surface(55) = {54}; +Line Loop(56) = {44,-1,-26,36}; Ruled Surface(57) = {56}; +Line Loop(58) = {3,-45,-1,27}; Ruled Surface(59) = {58}; +Line Loop(60) = {5,-46,-3,28}; Ruled Surface(61) = {60}; +Line Loop(62) = {7,-47,-5,29}; Ruled Surface(63) = {62}; +Line Loop(64) = {-2,-44,-39,42}; Ruled Surface(65) = {64}; +Line Loop(66) = {-4,-45,2,43}; Ruled Surface(67) = {66}; +Line Loop(68) = {-6,-46,4,52}; Ruled Surface(69) = {68}; +Line Loop(70) = {-8,-47,6,53}; Ruled Surface(71) = {70}; +Line Loop(72) = {-40,-41,30,37}; Ruled Surface(73) = {72}; +Line Loop(74) = {48,-9,-31,37}; Ruled Surface(75) = {74}; +Line Loop(76) = {49,-11,-32,9}; Ruled Surface(77) = {76}; +Line Loop(78) = {-50,-11,33,13}; Ruled Surface(79) = {78}; +Line Loop(80) = {-51,-13,34,15}; Ruled Surface(81) = {80}; +Line Loop(82) = {10,-42,40,48}; Ruled Surface(83) = {82}; +Line Loop(84) = {12,-43,-10,49}; Ruled Surface(85) = {84}; +Line Loop(86) = {14,-52,-12,50}; Ruled Surface(87) = {86}; +Line Loop(88) = {16,-53,-14,51}; Ruled Surface(89) = {88}; +Line Loop(90) = {-30,25,35}; Ruled Surface(91) = {90}; +Line Loop(92) = {-40,39,38}; Ruled Surface(93) = {92}; +Line Loop(94) = {37,-38,-36,35}; Ruled Surface(95) = {94}; +Line Loop(96) = {-48,-38,44,17}; Ruled Surface(97) = {96}; +Line Loop(98) = {18,-49,-17,45}; Ruled Surface(99) = {98}; +Line Loop(100) = {19,-50,-18,46};Ruled Surface(101) = {100}; +Line Loop(102) = {20,-51,-19,47};Ruled Surface(103) = {102}; +Line Loop(104) = {-2,17,10}; Ruled Surface(105) = {104}; +Line Loop(106) = {-9,-21,1,17}; Ruled Surface(107) = {106}; +Line Loop(108) = {-4,18,12}; Ruled Surface(109) = {108}; +Line Loop(110) = {-11,-22,3,18}; Ruled Surface(111) = {110}; +Line Loop(112) = {-13,-23,5,19}; Ruled Surface(113) = {112}; +Line Loop(114) = {-6,19,14}; Ruled Surface(115) = {114}; +Line Loop(116) = {-15,-24,7,20}; Ruled Surface(117) = {116}; +Line Loop(118) = {-8,20,16}; Ruled Surface(119) = {118}; +Line Loop(120) = {-31,-35,26,21};Ruled Surface(121) = {120}; +Line Loop(122) = {32,-22,-27,21};Ruled Surface(123) = {122}; +Line Loop(124) = {33,-23,-28,22};Ruled Surface(125) = {124}; +Line Loop(126) = {34,-24,-29,23};Ruled Surface(127) = {126}; + +Surface Loop(128) = {93,-73,-55,95,-91}; Complex Volume(129) = {128}; /* int */ +Surface Loop(130) = {107,-75,-97,95,57,121}; Complex Volume(131) = {130}; /* int b */ +Surface Loop(132) = {105,-65,-97,-83,-93}; Complex Volume(133) = {132}; /* int h */ +Surface Loop(134) = {99,-111,77,123,59,107}; Complex Volume(135) = {134}; /* shell b */ +Surface Loop(136) = {99,-109,67,105,85}; Complex Volume(137) = {136}; /* shell h */ +Surface Loop(138) = {113,79,-101,-111,-125,-61};Complex Volume(139) = {138}; /* ext b */ +Surface Loop(140) = {115,-69,-101,-87,-109}; Complex Volume(141) = {140}; /* ext h */ +Surface Loop(142) = {103,-117,-81,113,127,63}; Complex Volume(143) = {142}; /* inf b */ +Surface Loop(144) = {89,-119,71,103,115}; Complex Volume(145) = {144}; /* inf h */ + +/* README: Tranfinite line commands explicitly specify the number of + points and their repartition. A minus sign in the argument list of + the transfinite command will produce the reversed mesh. */ + +Transfinite Line{35,21,22,23,24,38,17,18,19,20} = nbpt_phi Using Power 1.0; +Transfinite Line{31,26,48,44,42} = nbpt_int Using Progression 0.95; +Transfinite Line{41,37,36,9,11,1,3,13,5,15,7} = nbpt_arc1 Using Power 1.0; +Transfinite Line{30,25,40,39,10,2,12,4,14,6,16,8} = nbpt_arc2 Using Power 1.0; +Transfinite Line{32,27,49,45,43} = nbpt_shell Using Power 1.0; +Transfinite Line{33,28,46,50,52} = nbpt_far Using Progression 1.05 ; +Transfinite Line{34,29,51,47,53} = nbpt_inf Using Progression 1.2; + +/* README: *All* 2D and 3D transfinite entities are defined in respect + to points. The ordering of the points defines the ordering of the + mesh elements. */ + +Transfinite Surface{55} = {1,14,16,18}; +Transfinite Surface{57} = {14,2,19,16}; +Transfinite Surface{59} = {2,3,21,19}; +Transfinite Surface{61} = {3,4,23,21}; +Transfinite Surface{63} = {4,5,25,23}; +Transfinite Surface{73} = {1,15,17,18}; +Transfinite Surface{75} = {15,10,20,17}; +Transfinite Surface{77} = {10,11,22,20}; +Transfinite Surface{79} = {11,12,24,22}; +Transfinite Surface{81} = {12,13,26,24}; +Transfinite Surface{65} = {18,16,19,6}; +Transfinite Surface{67} = {6,19,21,7}; +Transfinite Surface{69} = {7,21,23,8}; +Transfinite Surface{71} = {8,23,25,9}; +Transfinite Surface{83} = {17,18,6,20}; +Transfinite Surface{85} = {20,6,7,22}; +Transfinite Surface{87} = {22,7,8,24}; +Transfinite Surface{89} = {24,8,9,26}; +Transfinite Surface{91} = {1,14,15}; +Transfinite Surface{95} = {15,14,16,17}; +Transfinite Surface{93} = {18,16,17}; +Transfinite Surface{121} = {15,14,2,10}; +Transfinite Surface{97} = {17,16,19,20}; +Transfinite Surface{123} = {10,2,3,11}; +Transfinite Surface{99} = {20,19,21,22}; +Transfinite Surface{107} = {10,2,19,20}; +Transfinite Surface{105} = {6,20,19}; +Transfinite Surface{109} = {7,22,21}; +Transfinite Surface{111} = {11,3,21,22}; +Transfinite Surface{101} = {22,21,23,24}; +Transfinite Surface{125} = {11,3,4,12}; +Transfinite Surface{115} = {8,24,23}; +Transfinite Surface{113} = {24,12,4,23}; +Transfinite Surface{127} = {12,13,5,4}; +Transfinite Surface{103} = {24,23,25,26}; +Transfinite Surface{119} = {9,26,25}; +Transfinite Surface{117} = {13,5,25,26}; + +/* README: Recombine simplexes into quadrangles when possible */ + +Recombine Surface {55 ... 127}; + +/* README: *All* 2D and 3D transfinite entities are defined in respect + to points. The ordering of the points defines the ordering of the + mesh elements. */ + +Transfinite Volume{129} = {1,14,15,18,16,17}; +Transfinite Volume{131} = {17,16,14,15,20,19,2,10}; +Transfinite Volume{133} = {18,17,16,6,20,19}; +Transfinite Volume{135} = {10,2,19,20,11,3,21,22}; +Transfinite Volume{137} = {6,20,19,7,22,21}; +Transfinite Volume{139} = {11,3,4,12,22,21,23,24}; +Transfinite Volume{141} = {7,22,21,8,24,23}; +Transfinite Volume{143} = {12,4,5,13,24,23,25,26}; +Transfinite Volume{145} = {8,24,23,9,26,25}; + +VolInt = 1000 ; +SurfIntPhi0 = 1001 ; +SurfIntPhi1 = 1002 ; +SurfIntZ0 = 1003 ; + +VolShell = 2000 ; +SurfShellInt = 2001 ; +SurfShellExt = 2002 ; +SurfShellPhi0 = 2003 ; +SurfShellPhi1 = 2004 ; +SurfShellZ0 = 2005 ; +LineShellIntPhi0 = 2006 ; +LineShellIntPhi1 = 2007 ; +LineShellIntZ0 = 2008 ; +PointShellInt = 2009 ; + +VolExt = 3000 ; +VolInf = 3001 ; +SurfInf = 3002 ; +SurfExtInfPhi0 = 3003 ; +SurfExtInfPhi1 = 3004 ; +SurfExtInfZ0 = 3005 ; +SurfInfRight = 3006 ; +SurfInfTop = 3007 ; + +Physical Volume (VolInt) = {129,131,133} ; +Physical Surface (SurfIntPhi0) = {55,57,65} ; +Physical Surface (SurfIntPhi1) = {73,75,83} ; +Physical Surface (SurfIntZ0) = {91,121} ; + +Physical Volume (VolShell) = {135,137} ; +Physical Surface (SurfShellInt) = {105,107} ; +Physical Surface (SurfShellExt) = {109,111} ; +Physical Surface (SurfShellPhi0) = {59,67} ; +Physical Surface (SurfShellPhi1) = {77,85} ; +Physical Surface (SurfShellZ0) = {123} ; +Physical Line (LineShellIntPhi0) = {1,2} ; +Physical Line (LineShellIntPhi1) = {9,10} ; +Physical Line (LineShellIntZ0) = 21 ; +Physical Point (PointShellInt) = 6 ; + +Physical Volume (VolExt) = {139,141} ; +Physical Volume (VolInf) = {143,145} ; +Physical Surface (SurfExtInfPhi0) = {61,63,69,71} ; +Physical Surface (SurfExtInfPhi1) = {79,87,81,89} ; +Physical Surface (SurfExtInfZ0) = {125,127} ; +Physical Surface (SurfInfRight) = {117} ; +Physical Surface (SurfInfTop) = {119} ; diff --git a/demos/ex07.geo b/demos/ex07.geo new file mode 100644 index 0000000000000000000000000000000000000000..0c06b0c7fdd30deab644db80d5cd5576a69339aa --- /dev/null +++ b/demos/ex07.geo @@ -0,0 +1,485 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + 3D example with (too) large characteristic lengths + + All important comments are marked with "README" +*/ + +ech = 0.001 ; +a = 8.0 ; +b = 20.45 ; +c = 45.55 ; +d = 58.0 ; +e = 66.0 ; +f = 23.0 ; +g = 20.0 ; +h = 2.8 ; +i = 8.0 ; +k = 5.0 ; +in = 1.0 ; +did = 4.0 ; +ded = 11.7 ; +dame = 1.25 ; +dtef = 4.0 ; + +sizereson = 1.5 ; +sizeresoni = 1. ; +sizebig = 4.0 ; +sizeame = 1.0 ; +sizetef = 1.0 ; + +a = a* ech ; +b = b* ech ; +c = c* ech ; +d = d* ech ; +e = e* ech ; +f = f* ech ; +g = g* ech ; +h = h* ech ; +i = i* ech ; +k = k* ech ; +j = f/2 ; +in = in * ech ; +did = did* ech ; +ded = ded* ech ; +dame = dame* ech ; +dtef = dtef* ech ; + +rid = did/2.0 ; +red = ded/2.0 ; +rame=dame/2 ; +rtef=dtef/2 ; + + +sizereson = sizereson * ech ; +sizeresoni = sizeresoni * ech ; +sizebig = sizebig * ech ; +sizeame = sizeame * ech ; +sizetef = sizetef * ech ; + +/* box */ + +Point(1) = {0,0,0,sizebig} ; +Point(2) = {e,0,0,sizebig} ; +Point(3) = {e,f,0,sizebig} ; +Point(4) = {0,f,0,sizebig} ; +Point(5) = {0,0,i,sizebig} ; +Point(6) = {e,0,i,sizebig} ; +Point(7) = {e,f,i,sizebig} ; +Point(8) = {0,f,i,sizebig} ; +Point(81) = {e/2,0,0,sizebig}; + +/* left reson */ + +Point(9) = {b,j,0,sizeresoni} ; +Point(10) = {b+rid,j,0,sizeresoni} ; +Point(11) = {b,j+rid,0,sizeresoni} ; +Point(12) = {b-rid,j,0,sizeresoni} ; +Point(13) = {b,j-rid,0,sizeresoni} ; +Point(14) = {b+red,j,0,sizereson} ; +Point(15) = {b,j+red,0,sizereson} ; +Point(16) = {b-red,j,0,sizereson} ; +Point(17) = {b,j-red,0,sizereson} ; + +Point(18) = {b,j,h,sizeresoni} ; +Point(19) = {b+rid,j,h,sizeresoni} ; +Point(20) = {b,j+rid,h,sizeresoni} ; +Point(21) = {b-rid,j,h,sizeresoni} ; +Point(22) = {b,j-rid,h,sizeresoni} ; +Point(23) = {b+red,j,h,sizereson} ; +Point(24) = {b,j+red,h,sizereson} ; +Point(25) = {b-red,j,h,sizereson} ; +Point(26) = {b,j-red,h,sizereson} ; + +/* right reson */ + +Point(27) = {c,j,0,sizeresoni} ; +Point(28) = {c+rid,j,0,sizeresoni} ; +Point(29) = {c,j+rid,0,sizeresoni} ; +Point(30) = {c-rid,j,0,sizeresoni} ; +Point(31) = {c,j-rid,0,sizeresoni} ; +Point(32) = {c+red,j,0,sizereson} ; +Point(33) = {c,j+red,0,sizereson} ; +Point(34) = {c-red,j,0,sizereson} ; +Point(35) = {c,j-red,0,sizereson} ; + +Point(36) = {c,j,h,sizeresoni} ; +Point(37) = {c+rid,j,h,sizeresoni} ; +Point(38) = {c,j+rid,h,sizeresoni} ; +Point(39) = {c-rid,j,h,sizeresoni} ; +Point(40) = {c,j-rid,h,sizeresoni} ; +Point(41) = {c+red,j,h,sizereson} ; +Point(42) = {c,j+red,h,sizereson} ; +Point(43) = {c-red,j,h,sizereson} ; +Point(44) = {c,j-red,h,sizereson} ; + +/* left cab */ + +Point(45) = {a,0,0,sizeame} ; +Point(46) = {a,0,rame,sizeame} ; +Point(47) = {a-rame,0,0,sizeame} ; +Point(48) = {a+rame,0,0,sizeame} ; + +Point(49) = {a,-k,0,sizeame} ; +Point(50) = {a,-k,rame,sizeame} ; +Point(51) = {a-rame,-k,0,sizeame} ; +Point(52) = {a+rame,-k,0,sizeame} ; + +Point(53) = {a,g,0,sizeame} ; +Point(54) = {a,g,rame,sizeame} ; +Point(55) = {a-rame,g,0,sizeame} ; +Point(56) = {a+rame,g,0,sizeame} ; + +/* right cab */ + +Point(57) = {d,0,0,sizeame} ; +Point(58) = {d,0,rame,sizeame} ; +Point(59) = {d-rame,0,0,sizeame} ; +Point(60) = {d+rame,0,0,sizeame} ; + +Point(61) = {d,-k,0,sizeame} ; +Point(62) = {d,-k,rame,sizeame} ; +Point(63) = {d-rame,-k,0,sizeame} ; +Point(64) = {d+rame,-k,0,sizeame} ; + +Point(65) = {d,g,0,sizeame} ; +Point(66) = {d,g,rame,sizeame} ; +Point(67) = {d-rame,g,0,sizeame} ; +Point(68) = {d+rame,g,0,sizeame} ; + +/* left teflon */ + +Point(69) = {a,0,rtef,sizetef} ; +Point(70) = {a-rtef,0,0,sizetef} ; +Point(71) = {a+rtef,0,0,sizetef} ; + +Point(72) = {a,-k,rtef,sizetef} ; +Point(73) = {a-rtef,-k,0,sizetef} ; +Point(74) = {a+rtef,-k,0,sizetef} ; + + +/* right teflon */ + +Point(75) = {d,0,rtef,sizetef} ; +Point(76) = {d-rtef,0,0,sizetef} ; +Point(77) = {d+rtef,0,0,sizetef} ; + +Point(78) = {d,-k,rtef,sizetef} ; +Point(79) = {d-rtef,-k,0,sizetef} ; +Point(80) = {d+rtef,-k,0,sizetef} ; + +/* in */ + + +Point(82) = {d,-k-in,rtef,sizetef} ; +Point(83) = {d-rtef,-k-in,0,sizetef} ; +Point(84) = {d+rtef,-k-in,0,sizetef} ; + + +Point(85) = {d,-k-in,0,sizeame} ; +Point(86) = {d,-k-in,rame,sizeame} ; +Point(87) = {d-rame,-k-in,0,sizeame} ; +Point(88) = {d+rame,-k-in,0,sizeame} ; + + +/* eps teflon = 2.03 + eps res = 38 */ + +Circle(1) = {20,18,21}; +Circle(2) = {21,18,22}; +Circle(3) = {22,18,19}; +Circle(4) = {19,18,20}; +Circle(5) = {11,9,12}; +Circle(6) = {12,9,13}; +Circle(7) = {13,9,10}; +Circle(8) = {10,9,11}; +Circle(9) = {24,18,25}; +Circle(10) = {25,18,26}; +Circle(11) = {26,18,23}; +Circle(12) = {23,18,24}; +Circle(13) = {15,9,16}; +Circle(14) = {16,9,17}; +Circle(15) = {17,9,14}; +Circle(16) = {14,9,15}; +Circle(17) = {38,36,39}; +Circle(18) = {39,36,40}; +Circle(19) = {40,36,37}; +Circle(20) = {37,36,38}; +Circle(21) = {42,36,43}; +Circle(22) = {43,36,44}; +Circle(23) = {44,36,41}; +Circle(24) = {41,36,42}; +Circle(25) = {29,27,30}; +Circle(26) = {30,27,31}; +Circle(27) = {31,27,28}; +Circle(28) = {28,27,29}; +Circle(29) = {33,27,34}; +Circle(30) = {34,27,35}; +Circle(31) = {35,27,32}; +Circle(32) = {32,27,33}; +Line(33) = {8,7}; +Line(34) = {7,3}; +Line(35) = {8,4}; +Line(36) = {5,1}; +Line(37) = {6,2}; +Line(38) = {6,7}; +Line(39) = {5,8}; +Line(40) = {2,3}; +Line(41) = {1,4}; +Line(42) = {3,4}; +Line(43) = {6,5}; +Circle(44) = {66,65,67}; +Circle(45) = {68,65,66}; +Circle(46) = {54,53,55}; +Circle(47) = {56,53,54}; +Circle(48) = {50,49,51}; +Circle(49) = {52,49,50}; +Circle(50) = {72,49,73}; +Circle(51) = {74,49,72}; +Circle(52) = {48,45,46}; +Circle(53) = {46,45,47}; +Circle(54) = {69,45,70}; +Circle(55) = {71,45,69}; +Circle(56) = {62,61,63}; +Circle(57) = {64,61,62}; +Circle(58) = {80,61,78}; +Circle(59) = {78,61,79}; +Circle(60) = {60,57,58}; +Circle(61) = {58,57,59}; +Circle(62) = {77,57,75}; +Circle(63) = {75,57,76}; +Line(64) = {2,77}; +Line(65) = {77,60}; +Line(66) = {60,57}; +Line(67) = {57,59}; +Line(68) = {59,76}; +Line(70) = {71,48}; +Line(71) = {48,45}; +Line(72) = {45,47}; +Line(73) = {47,70}; +Line(74) = {70,1}; +Line(75) = {70,73}; +Line(76) = {47,51}; +Line(77) = {48,52}; +Line(78) = {71,74}; +Line(79) = {74,52}; +Line(80) = {52,49}; +Line(81) = {49,51}; +Line(82) = {51,73}; +Line(83) = {76,79}; +Line(84) = {59,63}; +Line(85) = {60,64}; +Line(86) = {77,80}; +Line(87) = {79,63}; +Line(88) = {63,61}; +Line(89) = {61,64}; +Line(90) = {64,80}; +Line(91) = {59,67}; +Line(92) = {60,68}; +Line(93) = {67,65}; +Line(94) = {65,68}; +Line(95) = {48,56}; +Line(96) = {47,55}; +Line(97) = {55,53}; +Line(98) = {53,56}; +Line Loop(99) = {11,12,9,10}; +Line Loop(100) = {4,1,2,3}; +Plane Surface(101) = {99,100}; +Line Loop(102) = {15,16,13,14}; +Line Loop(103) = {7,8,5,6}; +Plane Surface(104) = {102,103}; +Plane Surface(105) = {103}; +Plane Surface(106) = {100}; +Line Loop(107) = {31,32,29,30}; +Line Loop(108) = {27,28,25,26}; +Plane Surface(109) = {107,108}; +Line Loop(110) = {23,24,21,22}; +Line Loop(111) = {19,20,17,18}; +Plane Surface(112) = {110,111}; +Plane Surface(113) = {111}; +Plane Surface(114) = {108}; +Line(115) = {16,25}; +Line(116) = {15,24}; +Line(117) = {14,23}; +Line(118) = {17,26}; +Line(119) = {12,21}; +Line(120) = {11,20}; +Line(121) = {19,10}; +Line(122) = {22,13}; +Line(123) = {44,35}; +Line(124) = {41,32}; +Line(125) = {43,34}; +Line(126) = {42,33}; +Line(127) = {40,31}; +Line(128) = {37,28}; +Line(129) = {38,29}; +Line(130) = {39,30}; + +Line Loop(131) = {31,-124,-23,123}; +Ruled Surface(132) = {131}; +Line Loop(133) = {30,-123,-22,125}; +Ruled Surface(134) = {133}; +Line Loop(135) = {29,-125,-21,126}; +Ruled Surface(136) = {135}; +Line Loop(137) = {32,-126,-24,124}; +Ruled Surface(138) = {137}; +Line Loop(139) = {11,-117,-15,118}; +Ruled Surface(140) = {139}; +Line Loop(141) = {10,-118,-14,115}; +Ruled Surface(142) = {141}; +Line Loop(143) = {9,-115,-13,116}; +Ruled Surface(144) = {143}; +Line Loop(145) = {-116,-16,117,12}; +Ruled Surface(146) = {145}; +Line Loop(147) = {-1,-120,5,119}; +Ruled Surface(148) = {147}; +Line Loop(149) = {-6,119,2,122}; +Ruled Surface(150) = {149}; +Line Loop(151) = {-7,-122,3,121}; +Ruled Surface(152) = {151}; +Line Loop(153) = {120,-4,121,8}; +Ruled Surface(154) = {153}; +Line Loop(155) = {27,-128,-19,127}; +Ruled Surface(156) = {155}; +Line Loop(157) = {-127,-18,130,26}; +Ruled Surface(158) = {157}; +Line Loop(159) = {130,-25,-129,17}; +Ruled Surface(160) = {159}; +Line Loop(161) = {28,-129,-20,128}; +Ruled Surface(162) = {161}; +Line(167) = {78,75}; +Line(168) = {62,58}; +Line(169) = {75,66}; +Line(170) = {58,66}; +Line Loop(171) = {-167,-58,-86,62}; +Ruled Surface(172) = {171}; +Line Loop(173) = {63,83,-59,167}; +Ruled Surface(174) = {173}; +Line Loop(175) = {84,-56,168,61}; +Ruled Surface(176) = {175}; +Line Loop(177) = {-168,-57,-85,60}; +Ruled Surface(178) = {177}; +Line Loop(179) = {-91,-61,170,44}; +Ruled Surface(180) = {179}; +Line Loop(181) = {170,-45,-92,60}; +Ruled Surface(182) = {181}; +Line Loop(183) = {-87,-59,-58,-90,57,56}; +Plane Surface(184) = {183}; +Line Loop(185) = {68,-63,-62,65,60,61}; +Plane Surface(186) = {185}; +Line Loop(187) = {93,94,45,44}; +Plane Surface(188) = {187}; +Line Loop(189) = {-87,-83,-68,84}; +Plane Surface(190) = {189}; +Line Loop(191) = {-90,-85,-65,86}; +Plane Surface(192) = {191}; +Line(195) = {72,69}; +Line(196) = {50,46}; +Line(197) = {46,54}; +Line Loop(198) = {96,-46,-197,53}; +Ruled Surface(199) = {198}; +Line Loop(200) = {197,-47,-95,52}; +Ruled Surface(201) = {200}; +Line Loop(202) = {75,-50,195,54}; +Ruled Surface(203) = {202}; +Line Loop(204) = {-195,-51,-78,55}; +Ruled Surface(205) = {204}; +Line Loop(206) = {49,196,-52,77}; +Ruled Surface(207) = {206}; +Line Loop(208) = {76,-48,196,53}; +Ruled Surface(209) = {208}; +Line Loop(210) = {48,82,-50,-51,79,49}; +Plane Surface(211) = {210}; +Line Loop(212) = {73,-54,-55,70,52,53}; +Plane Surface(213) = {212}; +Line Loop(214) = {-79,-78,70,77}; +Plane Surface(215) = {214}; +Line Loop(216) = {82,-75,-73,76}; +Plane Surface(217) = {216}; +Line Loop(218) = {97,98,47,46}; +Plane Surface(219) = {218}; +Line Loop(226) = {39,33,-38,43}; +Plane Surface(227) = {226}; +Line Loop(228) = {-35,33,34,42}; +Plane Surface(229) = {228}; +Line Loop(230) = {41,-35,-39,36}; +Plane Surface(231) = {230}; +Line Loop(232) = {-34,-38,37,40}; +Plane Surface(233) = {232}; +Line(234) = {76,81}; +Line(235) = {81,71}; +Line Loop(236) = {234,235,55,54,74,-36,-43,37,64,62,63}; +Plane Surface(237) = {236}; +Line Loop(238) = {92,-94,-93,-91,68,234,235,70,95,-98,-97,-96,73,74,41,-42,-40,64,65}; +Plane Surface(239) = {238,107,102}; + + + +Surface Loop(601) = {152,104,140,-101,146,144,142,-154,-148,150}; +Complex Volume(602) = {601}; +Surface Loop(603) = {160,-158,-156,109,-132,-138,-136,-134,-112,-162}; +Complex Volume(604) = {603}; +Surface Loop(605) = {213,217,-211,-209,207,-215,205,203}; +Complex Volume(606) = {605}; +Surface Loop(607) = {186,190,-184,174,172,192,-178,-176}; +Complex Volume(608) = {607}; + + +Surface Loop(6001) = {213,-239,-182,180,186,237,231,-229,227,-233,-188,-201,-199,-219,132,138,136,134,112,156,-114,162,-160,158,-140,101,-146,-144,-142,154,148,-105,-152,-150}; +Complex Volume(6002) = {6001}; + +Delete { Line(169); } + +Line(6003) = {83,87}; +Line(6004) = {87,85}; +Line(6005) = {85,88}; +Line(6006) = {88,84}; +Circle(6007) = {84,85,82}; +Circle(6008) = {82,85,83}; +Circle(6009) = {88,85,86}; +Circle(6010) = {86,85,87}; +Line(6011) = {83,79}; +Line(6012) = {87,63}; +Line(6013) = {88,64}; +Line(6014) = {84,80}; +Line(6015) = {82,78}; +Line(6016) = {86,62}; +Line Loop(6017) = {90,-6014,-6006,6013}; +Plane Surface(6018) = {6017}; +Line Loop(6019) = {87,-6012,-6003,6011}; +Plane Surface(6020) = {6019}; +Line Loop(6021) = {6010,-6003,-6008,-6007,-6006,6009}; +Plane Surface(6022) = {6021}; +Line Loop(6023) = {-58,-6014,6007,6015}; +Ruled Surface(6024) = {6023}; +Line Loop(6025) = {6011,-59,-6015,6008}; +Ruled Surface(6026) = {6025}; +Line Loop(6027) = {-57,-6013,6009,6016}; +Ruled Surface(6028) = {6027}; +Line Loop(6029) = {-56,-6016,6010,6012}; +Ruled Surface(6030) = {6029}; +Surface Loop(6031) = {184,6020,6030,6028,6018,-6024,-6022,-6026}; +Complex Volume(6032) = {6031}; + + +AIR = 10000 ; +R1 = 20000 ; +R2 = 30000 ; +T1 = 40000 ; +T2 = 50000 ; +CLD0 = 60000 ; +SOU = 70000 ; +CLTEM = 80000 ; + +Physical Volume (AIR) = 6002; + +Physical Volume (T1) = 606; +Physical Volume (T2) = 608; +Physical Volume (R1) = 602; +Physical Volume (R2) = 604; +Physical Volume (SOU) = 6032; + +Physical Surface (CLD0) = {231,229,223,237,227, 199,201,219,209,207,203,205, 180,182,188,176,178,174,172 , 6026,6024,6028,6030}; +Physical Surface (CLTEM) = {211,6022}; + diff --git a/demos/ex08.geo b/demos/ex08.geo new file mode 100644 index 0000000000000000000000000000000000000000..3d9bfe8e550a9839ccbaed33e1cef5f665215980 --- /dev/null +++ b/demos/ex08.geo @@ -0,0 +1,95 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + 3D with extrusion + + All important comments are marked with "README" +*/ + +lcp = 10; +lci = 10; + +/* Plate */ + +Point(1) = {0,0,0,lcp}; +Point(2) = {294,0,0,lcp}; +Point(3) = {294,294,0,lcp}; +Point(4) = {0,294,0,lcp}; +Point(5) = {18,18,0,lcp}; +Point(6) = {126,18,0,lcp}; +Point(7) = {126,126,0,lcp}; +Point(8) = {18,126,0,lcp}; + +/* Inductor */ + +Point(10) = {94,50,49,lci}; +Point(11) = {94,150,49,lci}; +Point(12) = {119,50,49,lci}; +Point(13) = {119,150,49,lci}; +Point(14) = {144,0,49,lci}; +Point(15) = {144,25,49,lci}; +Point(16) = {144,50,49,lci}; +Point(17) = {144,150,49,lci}; +Point(18) = {144,175,49,lci}; +Point(19) = {144,200,49,lci}; +Point(20) = {244,0,49,lci}; +Point(21) = {244,25,49,lci}; +Point(22) = {244,50,49,lci}; +Point(23) = {244,150,49,lci}; +Point(24) = {244,175,49,lci}; +Point(25) = {244,200,49,lci}; +Point(26) = {269,50,49,lci}; +Point(27) = {269,150,49,lci}; +Point(28) = {294,50,49,lci}; +Point(29) = {294,150,49,lci}; + +Line(1) = {1,2}; +Line(2) = {2,3}; +Line(3) = {3,4}; +Line(4) = {4,1}; +Line(5) = {5,6}; +Line(6) = {6,7}; +Line(7) = {7,8}; +Line(8) = {8,5}; +Line(9) = {14,20}; +Line(10) = {28,29}; +Line(11) = {25,19}; +Line(12) = {11,10}; +Line(13) = {15,21}; +Line(14) = {26,27}; +Line(15) = {24,18}; +Line(16) = {13,12}; + +Circle(17) = {21,22,26} ; +Circle(18) = {27,23,24} ; +Circle(19) = {18,17,13} ; +Circle(20) = {12,16,15} ; +Circle(21) = {20,22,28} ; +Circle(22) = {29,23,25} ; +Circle(23) = {19,17,11} ; +Circle(24) = {10,16,14} ; + +Line Loop(25) = {4,1,2,3}; +Line Loop(26) = {8,5,6,7}; +Plane Surface(27) = {25,26}; +Line Loop(28) = {23,12,24,9,21,10,22,11}; +Line Loop(29) = {19,16,20,13,17,14,18,15}; +Plane Surface(30) = {28,29}; + +Extrude(27, {0,0,10}); +Coherence; +Extrude(30, {0,0,100}); +Coherence; + +Surface Loop(133) = {65,39,-27,42,45,47,56,59,62,64}; +Complex Volume(134) = {133}; +Surface Loop(135) = {132,78,-30,81,84,87,90,93,96,98,111,114,117,120,123,126,129,131}; +Complex Volume(136) = {135}; + + + + + + + + diff --git a/demos/ex09.geo b/demos/ex09.geo new file mode 100644 index 0000000000000000000000000000000000000000..fd16e9f8e275297e7b4191fd74afa94441fd9cfb --- /dev/null +++ b/demos/ex09.geo @@ -0,0 +1,130 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + More complex 3D with geometric transformations and extrusion + + All important comments are marked with "README" +*/ + +r1 = .1; +l1 = 1.; +l2 = .8; +l3 = .1; +r2 = 1.1; +lc = .08; +lc2 = .05; +rint = .2; +rext = .3; +Point(1) = {0.0,0.0,0.0,lc}; +Point(2) = {l1,0.0,0.0,lc2}; +Point(3) = {l1-r1,0.0,0.0,lc2}; +Point(4) = {l1,r1,0.0,lc2}; +Point(5) = {l1,-r1,0.0,lc2}; +Point(6) = {l1+l2,r1,0.0,lc}; +Point(7) = {l1+l2,-r1,0.0,lc}; +Point(8) = {l1+l2,-r1-l3,0.0,lc}; +Point(9) = {l1+l2,r1+l3,0.0,lc}; + +Line(1) = {4,6}; +Line(2) = {6,9}; +Line(3) = {7,8}; +Line(4) = {5,7}; +Circle(5) = {4,2,3}; +Circle(6) = {3,2,5}; + +r = 2*3.14159/5; +Point(10) = { (l1 + r2) * Cos(r/2) , (l1 + r2) * Sin(r/2), 0.0, lc}; + +Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},r) { + Duplicata { + Line(1); + Line(2); + Line(3); + Line(4); + Line(5); + Line(6); + Point(10); + } +} + +Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},2*r) { + Duplicata { + Line(1); + Line(2); + Line(3); + Line(4); + Line(5); + Line(6); + Point(10); + } +} + +Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},3*r) { + Duplicata { + Line(1); + Line(2); + Line(3); + Line(4); + Line(5); + Line(6); + Point(10); + } +} + + +Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},4*r) { + Duplicata { + Line(1); + Line(2); + Line(3); + Line(4); + Line(5); + Line(6); + Point(10); + } +} + +Coherence; + +Circle(31) = {16,10,9}; +Circle(32) = {31,25,14}; +Circle(33) = {46,40,29}; +Circle(34) = {61,55,44}; +Circle(35) = {8,70,59}; +Point(newp) = {rint,0,0,lc}; +Point(newp) = {rext,0,0,lc}; +Point(newp) = {-rint,0,0,lc}; +Point(newp) = {-rext,0,0,lc}; +Point(newp) = {0,rint,0,lc}; +Point(newp) = {0,rext,0,lc}; +Point(newp) = {0,-rint,0,lc}; +Point(newp) = {0,-rext,0,lc}; +Circle(36) = {75,1,73}; +Circle(37) = {73,1,77}; +Circle(38) = {77,1,71}; +Circle(39) = {71,1,75}; +Circle(40) = {76,1,74}; +Circle(41) = {74,1,78}; +Circle(42) = {78,1,72}; +Circle(43) = {72,1,76}; + +Line Loop(44) = {-8,-7,11,12,10,9,31,-2,-1,5,6,4,3,35,-26,-25,29,30,28,27,34,-20,-19,23,24,22,21,33,-14,-13,17,18,16,15,32}; +Line Loop(45) = {40,41,42,43}; +Plane Surface(46) = {44,45}; +Line Loop(47) = {36,37,38,39}; +Plane Surface(48) = {45,47}; + +Extrude(46, {0,0,.2}); +Coherence; +Extrude(48, {0,0,.2}); +Coherence; +Extrude(238, {0,0,.2}); +Coherence; + +Surface Loop(274) = {235,-48,46,88,-189,-207,91,-94,-97,-100,-103,-106,109,112,-115,-118,-121,-124,-127,130,133,-136,-139,-142,-145,-148,151,154,-157,-160,-163,-166,-169,172,175,-178,-181,-184,-187,247,250,253,255,273,264,229,232,267,270,272,237}; +Complex Volume(275) = {274}; + +Physical Volume(1000) = 275; + + + diff --git a/demos/ex10.geo b/demos/ex10.geo new file mode 100644 index 0000000000000000000000000000000000000000..fd65390d5df3d3abc22e6df16bd400ed26f21eba --- /dev/null +++ b/demos/ex10.geo @@ -0,0 +1,139 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + 3D with extrusion + + All important comments are marked with "README" +*/ + +fact = 0.4 ; +rondelle = fact * 0.01; +iris = fact * 0.004; +size = fact * 0.01; + +larg = 86.36e-3 / 2.0 ; +long = 45.0e-3 ; +l = 16.e-3 / 2.0 ; +re = 90.e-3 / 2.0 ; +re2 = re + 3.e-3 ; +ri = 8.e-3 / 2.0 ; +ll = 60.0e-3 / 2.0; +a = larg - ll; +c45 = 0.5^0.5 ; + +hg = 21.59e-3 ; +hcav = 42.5e-3 ; + +x2 = long; +y1 = ri * c45; +y2 = ri ; +y3 = l ; +ss1 = l / re ; +xtemp = re * ( ( 1.0 - ss1 * ss1 ) ^ 0.5 ) ; +ss2 = ( 1.0 - ( xtemp / re2 ) * ( xtemp / re2 ) ) ^ 0.5 ; +y4 = ss2 * xtemp ; +ss3 = ll / re2; +xtemp2 = re2 * ( ( 1.0 - ss3 * ss3 ) ^ 0.5 ) ; +x1 = long - ( xtemp - xtemp2 ) ; +x6 = x1 + xtemp ; +x3 = x6 - re * c45 ; +x4 = x6 - ri ; +x5 = x6 - ri * c45 ; +x7 = x6 + ri * c45 ; +x8 = x6 + ri ; +x9 = x6 + re * c45 ; +x10 = x6 + re ; +y5 = ll ; +y6 = re * c45 ; +y7 = re ; +y8 = larg ; + + +Point(1) = {0.0,0.0,0.0,size}; +Point(2) = {0.0,y8,0.0,size}; +Point(3) = {x2,y8,0.0,size}; +Point(4) = {x2,y5,0.0,size}; +Point(5) = {x1,y4,0.0,size}; +Point(6) = {x1,y3,0.0,iris}; +Point(7) = {x1,0.0,0.0,iris}; +Point(8) = {x3,y6,0.0,size}; +Point(9) = {x6,y7,0.0,size}; +Point(10) = {x9,y6,0.0,size}; +Point(11) = {x10,0.0,0.0,size}; +Point(12) = {x8,0.0,0.0,rondelle}; +Point(13) = {x6,0.0,0.0,rondelle}; +Point(14) = {x4,0.0,0.0,rondelle}; +Point(15) = {x7,y1,0.0,rondelle}; +Point(16) = {x6,y2,0.0,rondelle}; +Point(17) = {x5,y1,0.0,rondelle}; + +Line(1) = {1,2}; +Line(2) = {2,3}; +Line(3) = {3,4}; +Line(4) = {5,6}; +Line(5) = {1,7}; +Line(6) = {7,14}; +Line(10) = {6,7}; +Line(11) = {14,13}; +Line(12) = {13,12}; +Circle(16) = {11,13,10}; +Circle(17) = {10,13,9}; +Circle(18) = {9,13,8}; +Circle(19) = {8,13,6}; +Circle(20) = {4,13,5}; +Line(21) = {11,12}; +Circle(22) = {17,13,14}; +Circle(23) = {16,13,17}; +Circle(24) = {15,13,16}; +Circle(25) = {12,13,15}; + +Line Loop(26) = {-5,1,2,3,20,4,10}; +Plane Surface(27) = {26}; + +Line Loop(28) = {-6,-10,-19,-18,-17,-16,21,25,24,23,22}; +Plane Surface(29) = {28}; + +Line Loop(30) = {11,12,25,24,23,22}; +Plane Surface(31) = {30}; + +Extrude(27, {0,0,hg} ); +Coherence; + +Extrude(29, {0,0,hg} ); +Coherence; + +Extrude(31, {0,0,hg} ); +Coherence; + +Surface Loop(127) = {60,-27,-43,61,46,49,52,55,58}; +Complex Volume(128) = {127}; + +Extrude (105, {0,0,hcav-hg} ); +Coherence; + +Extrude (126, {0,0,hcav-hg} ); +Coherence; + +Characteristic Length {58,71} = 0.01; + +Surface Loop(196) = {31,-115,-117,-96,-99,-102,-104,-173,-184,-186,-165,-168,-171,-195}; +Complex Volume(197) = {196}; + +Surface Loop(198) = {93,-29,-76,104,173,-144,174,-147,-60,-81,-150,-153,-84,-87,-156,-159,-90,162,165,96,99,102,171,168}; + +Complex Volume(199) = {198}; + +GO = 1 ; +CAV = 2 ; +DIS = 3 ; +CLDSRC = 4 ; +CLD = 5 ; + +Physical Volume (GO) = 128; +Physical Volume (CAV) = 199; +Physical Volume (DIS) = 197; +Physical Volume (CLDSRC) = 46; +Physical Volume (CLD) = {61,49,27,52,55,58,81,150,147,84,153,87,156,90,159,29,31,174,195}; + + +Point(85) = {0.0,0.0,0.0,1.0}; diff --git a/demos/ex11.geo b/demos/ex11.geo new file mode 100644 index 0000000000000000000000000000000000000000..a8a4829524989ea806d7082983728dec68ec8d95 --- /dev/null +++ b/demos/ex11.geo @@ -0,0 +1,257 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + 3D with extrusion + + All important comments are marked with "README" +*/ + +/* + c8 + +---------------------+ c7 + | c4 | + | +-------------+ | + | | c3 +---+ + +---+ c5 c6 + c1 c2 + +*/ + +D1 = .05; +D2 = .15; +D3 = .01; +D4 = .03; +D5 = .05; +D6 = .025; + +ax = 3.2; +ay = 3.2; +az = 3.2; +Dy = ax * D1; +Dz = ay * D2; +Dx = az * D5; + +e = 2*.001; + +l = .008; +lbox = 2.*ax*l; + +c1=newp; +Point(c1) = {0,0,0,l}; +c2=newp; +Point(c2) = {0,D1,0,l}; +c3=newp; +Point(c3) = {0,D1,D2,l}; +c4=newp; +Point(c4) = {0,D3,D2,l}; +c5=newp; +Point(c5) = {0,D3,D2-D4,l}; +c6=newp; +Point(c6) = {0,D1-D4,D2-D4,l}; +c7=newp; +Point(c7) = {0,D1-D4,D4,l}; +c8=newp; +Point(c8) = {0,0,D4,l}; + +d1 = newreg; +Line (d1) = {c1,c2}; +d2 = newreg; +Line (d2) = {c2,c3}; +d3 = newreg; +Line (d3) = {c3,c4}; +d4 = newreg; +Line (d4) = {c4,c5}; +d5 = newreg; +Line (d5) = {c5,c6}; +d6 = newreg; +Line (d6) = {c6,c7}; +d7 = newreg; +Line (d7) = {c7,c8}; +d8 = newreg; +Line (d8) = {c8,c1}; + +e1 = newreg; +Line Loop (newreg) = {d1,d2,d3,d4,d5,d6,d7,d8}; +f1 = newreg; +Plane Surface (f1) = {e1}; +Extrude ( f1, {D5,0.00000E+00, 0.00000E+00} ); + +box1 = newp; +Point(box1) = {Dx,Dy,Dz,lbox}; +box2 = newp; +Point(box2) = {Dx,Dy,-Dz/6,lbox}; +box3 = newp; +Point(box3) = {Dx,0,-Dz/6,lbox}; +box4 = newp; +Point(box4) = {Dx,0,Dz,lbox}; +box5 = newp; +Point(box5) = {0,Dy,-Dz/6,lbox}; +box6 = newp; +Point(box6) = {0,Dy,Dz,lbox}; +box7 = newp; +Point(box7) = {0,0,Dz,lbox}; +box8 = newp; +Point(box8) = {0,0,-Dz/6,lbox}; + +lbox1 = newreg; +Line(lbox1) = {box7,box6}; +lbox2 = newreg; +Line(lbox2) = {box6,box1}; +lbox3 = newreg; +Line(lbox3) = {box1,box4}; +lbox4 = newreg; +Line(lbox4) = {box4,box7}; +lbox5 = newreg; +Line(lbox5) = {box8,box5}; +lbox6 = newreg; +Line(lbox6) = {box5,box2}; +lbox7 = newreg; +Line(lbox7) = {box2,box3}; +lbox8 = newreg; +Line(lbox8) = {box3,box8}; +lbox9 = newreg; +Line(lbox9) = {box5,box6}; +lbox10 = newreg; +Line(lbox10) = {box2,box1}; +lbox11 = newreg; +Line(lbox11) = {box3,box4}; + + + +s1 = newp; +Point(s1) = {0,0,D4+e,l}; +s2 = newp; +Point(s2) = {0,0,D2-D4-e,l}; +s3 = newp; +Point(s3) = {0,D3-e,D2-D4-e,l}; +s4 = newp; +Point(s4) = {0,D3-e,D4+e,l}; + +q1 = newreg; +Line(q1) = {s1,s2}; +q2 = newreg; +Line(q2) = {s2,s3}; +q3 = newreg; +Line(q3) = {s3,s4}; +q4 = newreg; +Line(q4) = {s4,s1}; + +v1 = newreg; +Line(v1) = {box8,c1}; +v2 = newreg; +Line(v2) = {s2,box7}; +v3 = newreg; +Line(v3) = {s1,c8}; + +e2 = newreg; +Line Loop (newreg) = {q1,q2,q3,q4}; +f2 = newreg; +Ruled Surface (f2) = {e2}; +Extrude ( f2, {D6,0.00000E+00, 0.00000E+00} ); + +DxInducteur = .005; +DyInducteur = .01; +DzInducteur = .06; +Rinducteur = .001; +Xinducteur = .028; +Yinducteur = .00; +Zinducteur = .04; +LcInducteur = .006; + +r1 = newp; +Point(r1) = {Xinducteur,Yinducteur,Zinducteur,LcInducteur}; +r2 = newp; +Point(r2) = {Xinducteur+DxInducteur,Yinducteur,Zinducteur,LcInducteur}; +r3 = newp; +Point(r3) = {Xinducteur+DxInducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur}; +r4 = newp; +Point(r4) = {Xinducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur}; +cc = newp; +Point(cc) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur}; +r5 = newp; +Point(r5) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur}; +r6 = newp; +Point(r6) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur+DxInducteur+Rinducteur,Zinducteur,LcInducteur}; +r7 = newp; +Point(r7) = {0,Yinducteur+DxInducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur}; +r8 = newp; +Point(r8) = {0,Yinducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur}; + +ll1 = newreg; +Line(ll1) = {r2,r1}; +ll2 = newreg; +Line(ll2) = {r1,r4}; +ll3 = newreg; +Circle (ll3) = {r4,cc,r5}; +ll4 = newreg; +Line(ll4) = {r5,r8}; +ll5 = newreg; +Line(ll5) = {r8,r7}; +ll6 = newreg; +Line(ll6) = {r7,r6}; +ll7 = newreg; +Circle(ll7) = {r3,cc,r6}; +ll8 = newreg; +Line(ll8) = {r3,r2}; + +BFondDeLInducteur = newreg; +Line Loop(BFondDeLInducteur) = {ll1,ll2,ll3,ll4,ll5,ll6,-ll7,ll8}; +FondDeLInducteur = newreg; +Plane Surface(FondDeLInducteur) = {BFondDeLInducteur}; +Extrude ( FondDeLInducteur, {0,0,DzInducteur} ); + + +/* ---------- */ + + +Line Loop(127) = {2,3,4,5,6,7,-62,-59,-58,-57,61,45,-53,-49,60,1}; +Plane Surface(128) = {127,116}; +Line Loop(129) = {39,18,-20,-60,-52,55,48,-61,71,-65,-70,62}; +Plane Surface(130) = {129,104}; +Line Loop(131) = {50,51,52,49}; +Ruled Surface(132) = {131}; +Line Loop(133) = {-55,-51,54,47}; +Ruled Surface(134) = {133}; +Line Loop(135) = {46,47,48,45}; +Ruled Surface(136) = {135}; +Line Loop(137) = {54,-46,-53,50}; +Ruled Surface(138) = {137}; + +Surface Loop(139) = {117,-92,105,108,111,114,126,120,-123,125}; +Complex Volume(140) = {139}; +Surface Loop(141) = {73,-64,76,79,81,82}; +Complex Volume(142) = {141}; +Surface Loop(143) = {-43,10,-23,-26,-29,-32,-35,-38,-41,-44}; +Complex Volume(144) = {143}; +Surface Loop(145) = {26,-128,29,32,35,38,41,-130,44,23,-132,138,-134,136,-76,-79,-81,-82,92,-108,-111,-114,-126,-120,123,-125}; +Complex Volume(146) = {145}; + +Physical Surface (11111) = {117}; +Physical Surface (22222) = {92,123,120,126,114,108,125,111}; +Physical Surface (33333) = {10,43,64,73,105,117,128,130,132,134,136,138}; +Physical Volume (44444) = {140}; +Physical Volume (55555) = {142,144}; +Physical Volume (66666) = {146}; + +Color{ + General{ + Background = White ; + Axes = OrangeRed1; + SmallAxes = LightGray; + Text = Gray50 ; + } + Geometry{ + Points = Yellow; + Lines = {210, 210, 210} ; + Surfaces = {Orange, 60} ; // almost transparent orange + PointsSelect = Orange ; + LinesSelect = {180,180,180} ; + SurfacesSelect = Orange ; + } + Mesh{ + Points = Black; + PointsSupp = Orchid; + Lines = Gray; + } + +} diff --git a/demos/ex12.b b/demos/ex12.b new file mode 100644 index 0000000000000000000000000000000000000000..fb3c4ae5da0ad18b5a8b80c9a0223ecc5f3e29e2 --- /dev/null +++ b/demos/ex12.b @@ -0,0 +1,175 @@ +/* + * Sample Gmsh demo file + * + * Copyright (C) 2000 C. Geuzaine, J.-F. Remacle + * + */ + +h = 19.6 ; hSol = 1. ; +L = 150. ; + +xg = 0. ; yg = 30.023 + h ; +x1a = -6.782 ; y1a = 19.355 + h ; +x1b = -9.83 ; y1b = 8.839 + h ; +x1c = -8.001 ; y1c = 0. + h ; + +x2a = 6.782 ; y2a = 19.355 + h ; +x2b = 9.83 ; y2b = 8.839 + h ; +x2c = 8.001 ; y2c = 0. + h ; + + +/* ------------ */ +/* T o w e r */ +/* ------------ */ + +ho = -0.288 ; + + +c0 = 9.144 /2. ; h0 = 0.10 ; +c1 = 7.422 /2. ; h1 = 6.139 + ho ; +c2 = 5.639 /2. ; h2 = 12.497 + ho ; +c3 = 3.657 /2. ; h3 = 25.527 + ho ; b3 = 8.001 ; +c4 = 3.457 /2. ; h4 = h3 + 1.900 ; +c5 = 2.743 /2. ; h5 = h3 + 8.839 ; b5 = 9.830 ; +c6 = 2.631 /2. ; h6 = h5 + 2.320 ; +c7 = 2.118 /2. ; h7 = h5 + 10.516 ; b7 = 6.782 ; +c8 = 2.100 /2. ; h8 = h7 + 1.680 ; +c9 = 1.050 /2. ; h9 = h7 + 5.029 ; + + +pt0 = 1. ; pt1 = 1. ; pt2 = 1. ; pt3 = 1. ; pt4 = 1. ; pt5 = 1. ; +pt6 = 1. ; pt7 = 1. ; pt8 = 1. ; pt9 = 1. ; + +ci = c0 ; hi = h0 ; pti = pt0 ; i_p = 0 ; +Include "ex12.d" ; + +ci = c1 ; hi = h1 ; pti = pt1 ; i_p = 10 ; +Include "ex12.d" ; +Include "ex12.e" ; + +ci = c2 ; hi = h2 ; pti = pt2 ; i_p = 20 ; +Include "ex12.d" ; +Include "ex12.e" ; + +ci = c3 ; hi = h3 ; pti = pt3 ; i_p = 30 ; +Include "ex12.d" ; + +ci = c4 ; hi = h4 ; pti = pt4 ; i_p = 40 ; +Include "ex12.d" ; + +ci = c5 ; hi = h5 ; pti = pt5 ; i_p = 50 ; +Include "ex12.d" ; + +ci = c6 ; hi = h6 ; pti = pt6 ; i_p = 60 ; +Include "ex12.d" ; + +ci = c7 ; hi = h7 ; pti = pt7 ; i_p = 70 ; +Include "ex12.d" ; + +ci = c8 ; hi = h8 ; pti = pt8 ; i_p = 80 ; +Include "ex12.d" ; + +ci = c9 ; hi = h9 ; pti = pt9 ; i_p = 90 ; +Point(91) = { ci , hi , 0. , pti } ; +Point(92) = { -ci , hi , 0. , pti } ; + + +Point(38) = { b3 , h3 , 0. , pt3 } ; +Point(39) = { -b3 , h3 , 0. , pt3 } ; + +Point(58) = { b5 , h5 , 0. , pt5 } ; +Point(59) = { -b5 , h5 , 0. , pt5 } ; + +Point(78) = { b7 , h7 , 0. , pt7 } ; +Point(79) = { -b7 , h7 , 0. , pt7 } ; + + + +Line(201) = { 1 , 11 } ; Line(202) = { 2 , 12 } ; +Line(203) = { 3 , 13 } ; Line(204) = { 4 , 14 } ; + +Line(211) = { 11 , 21 } ; Line(212) = { 12 , 22 } ; +Line(213) = { 13 , 23 } ; Line(214) = { 14 , 24 } ; + +Line(221) = { 21 , 31 } ; Line(222) = { 22 , 32 } ; +Line(223) = { 23 , 33 } ; Line(224) = { 24 , 34 } ; + +Line(231) = { 31 , 41 } ; Line(232) = { 32 , 42 } ; +Line(233) = { 33 , 43 } ; Line(234) = { 34 , 44 } ; + +Line(241) = { 41 , 51 } ; Line(242) = { 42 , 52 } ; +Line(243) = { 43 , 53 } ; Line(244) = { 44 , 54 } ; + +Line(251) = { 51 , 61 } ; Line(252) = { 52 , 62 } ; +Line(253) = { 53 , 63 } ; Line(254) = { 54 , 64 } ; + +Line(261) = { 61 , 71 } ; Line(262) = { 62 , 72 } ; +Line(263) = { 63 , 73 } ; Line(264) = { 64 , 74 } ; + +Line(271) = { 71 , 81 } ; Line(272) = { 72 , 82 } ; +Line(273) = { 73 , 83 } ; Line(274) = { 74 , 84 } ; + +Line(281) = { 81 , 92 } ; Line(282) = { 82 , 91 } ; +Line(283) = { 83 , 91 } ; Line(284) = { 84 , 92 } ; + + + + +Line(301) = { 1 , 17 } ; Line(302) = { 2 , 17 } ; +Line(303) = { 2 , 16 } ; Line(304) = { 3 , 16 } ; +Line(305) = { 3 , 15 } ; Line(306) = { 4 , 15 } ; +Line(307) = { 4 , 18 } ; Line(308) = { 1 , 18 } ; + +Line(311) = { 11 , 27 } ; Line(312) = { 12 , 27 } ; +Line(313) = { 12 , 26 } ; Line(314) = { 13 , 26 } ; +Line(315) = { 13 , 25 } ; Line(316) = { 14 , 25 } ; +Line(317) = { 14 , 28 } ; Line(318) = { 11 , 28 } ; + +Line(321) = { 11 , 17 } ; Line(322) = { 12 , 17 } ; +Line(323) = { 12 , 16 } ; Line(324) = { 13 , 16 } ; +Line(325) = { 13 , 15 } ; Line(326) = { 14 , 15 } ; +Line(327) = { 14 , 18 } ; Line(328) = { 11 , 18 } ; + +Line(331) = { 21 , 27 } ; Line(332) = { 22 , 27 } ; +Line(333) = { 22 , 26 } ; Line(334) = { 23 , 26 } ; +Line(335) = { 23 , 25 } ; Line(336) = { 24 , 25 } ; +Line(337) = { 24 , 28 } ; Line(338) = { 21 , 28 } ; + + + +Line(401) = { 31 , 32 } ; Line(402) = { 32 , 33 } ; +Line(403) = { 33 , 34 } ; Line(404) = { 34 , 31 } ; + +Line(411) = { 41 , 42 } ; Line(412) = { 42 , 43 } ; +Line(413) = { 43 , 44 } ; Line(414) = { 44 , 41 } ; + +Line(421) = { 51 , 52 } ; Line(422) = { 52 , 53 } ; +Line(423) = { 53 , 54 } ; Line(424) = { 54 , 51 } ; + +Line(431) = { 61 , 62 } ; Line(432) = { 62 , 63 } ; +Line(433) = { 63 , 64 } ; Line(434) = { 64 , 61 } ; + +Line(441) = { 71 , 72 } ; Line(442) = { 72 , 73 } ; +Line(443) = { 73 , 74 } ; Line(444) = { 74 , 71 } ; + +Line(451) = { 81 , 82 } ; Line(452) = { 82 , 83 } ; +Line(453) = { 83 , 84 } ; Line(454) = { 84 , 81 } ; + + + + +Line(501) = { 31 , 39 } ; Line(502) = { 41 , 39 } ; +Line(503) = { 34 , 39 } ; Line(504) = { 44 , 39 } ; +Line(511) = { 32 , 38 } ; Line(512) = { 42 , 38 } ; +Line(513) = { 33 , 38 } ; Line(514) = { 43 , 38 } ; + +Line(521) = { 51 , 59 } ; Line(522) = { 61 , 59 } ; +Line(523) = { 54 , 59 } ; Line(524) = { 64 , 59 } ; +Line(531) = { 52 , 58 } ; Line(532) = { 62 , 58 } ; +Line(533) = { 53 , 58 } ; Line(534) = { 63 , 58 } ; + +Line(541) = { 71 , 79 } ; Line(542) = { 81 , 79 } ; +Line(543) = { 74 , 79 } ; Line(544) = { 84 , 79 } ; +Line(551) = { 72 , 78 } ; Line(552) = { 82 , 78 } ; +Line(553) = { 73 , 78 } ; Line(554) = { 83 , 78 } ; + diff --git a/demos/ex12.c b/demos/ex12.c new file mode 100644 index 0000000000000000000000000000000000000000..d82461b66c2c310d3a32fd0f3934228b8aac45d7 --- /dev/null +++ b/demos/ex12.c @@ -0,0 +1,47 @@ +/* + * Sample Gmsh demo file + * + * Copyright (C) 2000 C. Geuzaine, J.-F. Remacle + * + */ + +/* INPUT : + i_p + i_l +*/ + +Point(i_p + 0) = { x, y-dy0, z8+z0, p0} ; +Point(i_p + 1) = { x, y-dy1, z8+z1, p0} ; +Point(i_p + 2) = { x, y-dy2, z8+z2, p0} ; +Point(i_p + 3) = { x, y-dy3, z8+z3, p0} ; +Point(i_p + 4) = { x, y-dy4, z8+z4, p0} ; +Point(i_p + 5) = { x, y-dy5, z8+z5, p0} ; +Point(i_p + 6) = { x, y-dy6, z8+z6, p0} ; +Point(i_p + 7) = { x, y-dy7, z8+z7, p0} ; +Point(i_p + 8) = { x, y-dy8, z8+z8, p1} ; + +Point(i_p + 11) = { x, y-dy1,z8-z1, p0} ; +Point(i_p + 12) = { x, y-dy2,z8-z2, p0} ; +Point(i_p + 13) = { x, y-dy3,z8-z3, p0} ; +Point(i_p + 14) = { x, y-dy4,z8-z4, p0} ; +Point(i_p + 15) = { x, y-dy5,z8-z5, p0} ; +Point(i_p + 16) = { x, y-dy6,z8-z6, p0} ; +Point(i_p + 17) = { x, y-dy7,z8-z7, p0} ; +Point(i_p + 18) = { x, y-dy8,z8-z8, p1} ; + + +Point(i_p + 20) = { x, y-dy0, -z8+z0, p0} ; +Point(i_p + 21) = { x, y-dy1, -z8+z1, p0} ; +Point(i_p + 22) = { x, y-dy2, -z8+z2, p0} ; +Point(i_p + 23) = { x, y-dy3, -z8+z3, p0} ; +Point(i_p + 24) = { x, y-dy4, -z8+z4, p0} ; +Point(i_p + 25) = { x, y-dy5, -z8+z5, p0} ; +Point(i_p + 26) = { x, y-dy6, -z8+z6, p0} ; +Point(i_p + 27) = { x, y-dy7, -z8+z7, p0} ; + + +Spline(i_l + 0) = {i_p + 0,i_p + 1,i_p + 2,i_p + 3,i_p + 4,i_p + 5,i_p + 6,i_p + 7,i_p + 8}; +Spline(i_l + 1) = {i_p + 0,i_p + 11,i_p + 12,i_p + 13,i_p + 14,i_p + 15,i_p + 16,i_p + 17,i_p + 18}; + +Spline(i_l + 2) = {i_p + 20,i_p + 21,i_p + 22,i_p + 23,i_p + 24,i_p + 25,i_p + 26,i_p + 27,i_p + 18}; + diff --git a/demos/ex12.d b/demos/ex12.d new file mode 100644 index 0000000000000000000000000000000000000000..f4964b4f955b19bab7b6ef6a27ea00e2171a8ded --- /dev/null +++ b/demos/ex12.d @@ -0,0 +1,11 @@ +/* + * Sample Gmsh demo file + * + * Copyright (C) 2000 C. Geuzaine, J.-F. Remacle + * + */ + +Point((i_p) + 1) = { -ci , hi , -ci , pti } ; +Point((i_p) + 2) = { ci , hi , -ci , pti } ; +Point((i_p) + 3) = { ci , hi , ci , pti } ; +Point((i_p) + 4) = { -ci , hi , ci , pti } ; diff --git a/demos/ex12.e b/demos/ex12.e new file mode 100644 index 0000000000000000000000000000000000000000..59bf0ee1a258ee3d3ad6b4bce9a9ee12cccfed7f --- /dev/null +++ b/demos/ex12.e @@ -0,0 +1,11 @@ +/* + * Sample Gmsh demo file + * + * Copyright (C) 2000 C. Geuzaine, J.-F. Remacle + * + */ + +Point(i_p + 5) = { 0. , hi , ci , pti } ; +Point(i_p + 6) = { ci , hi , 0. , pti } ; +Point(i_p + 7) = { 0. , hi , -ci , pti } ; +Point(i_p + 8) = { -ci , hi , 0. , pti } ; diff --git a/demos/ex12.geo b/demos/ex12.geo new file mode 100644 index 0000000000000000000000000000000000000000..8eb3aef8fa26940eac8545583353b4e2f657c24e --- /dev/null +++ b/demos/ex12.geo @@ -0,0 +1,59 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + 3D with splines and includes + + All important comments are marked with "README" +*/ + +Include "ex12.a" ; + +/* Post-Processing meshes */ + +xBox = 30. ; +yBox = y1a * 1.5 ; +pBox = 20. ; + +Point(1002) = { xBox, yBox, 0, pBox} ; +Point(1003) = {-xBox, yBox, 0, pBox} ; +Point(1004) = {-xBox, 0, 0, pBox} ; +Point(1005) = { xBox, 0, 0, pBox} ; + +Line(2301) = {1004,1005}; +Line(2302) = {1005,1002}; +Line(2303) = {1002,1003}; +Line(2305) = {1003,1004}; + +Line Loop(2307) = {2303,2305,2301,2302}; +Plane Surface(2308) = {2307}; + +Transfinite Line {2301,2303} = 61 ; +Transfinite Line {2302,-2305} = 61 ; +Transfinite Surface {2308} = {1003,1002,1005,1004} ; +Recombine Surface {2308} ; + +Physical Surface (1201) = {2308} ; + +xBox = 30. ; +zBox = 150. ; +pBox = 20. ; + +Point(1006) = { xBox, 1, zBox, pBox} ; +Point(1007) = {-xBox, 1, zBox, pBox} ; +Point(1008) = {-xBox, 1, 0, pBox} ; +Point(1009) = { xBox, 1, 0, pBox} ; + +Line(2306) = {1008,1009}; +Line(2307) = {1009,1006}; +Line(2308) = {1006,1007}; +Line(2309) = {1007,1008}; + +Line Loop(2310) = {2307,2308,2309,2306}; +Plane Surface(2311) = {2310}; + +Transfinite Line {2306,2308} = 61 ; +Transfinite Line {2307,-2309} = 61 ; +Transfinite Surface {2311} = {1007,1006,1009,1008} ; +Recombine Surface {2311} ; + +Physical Surface (1202) = {2311} ; diff --git a/demos/ex13.bar b/demos/ex13.bar new file mode 100644 index 0000000000000000000000000000000000000000..cc9af8183845465f89c5a44b1c427479df02de5d --- /dev/null +++ b/demos/ex13.bar @@ -0,0 +1,42 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + Included by ex13.geo + + All important comments are marked with "README" +*/ + +Point(x+01) = {dx, -e, -ll/2, sx}; Point(x+11) = {dx, e, ll/2, sx}; +Point(x+02) = {dx+rx, -e, -ll/2, sx}; Point(x+12) = {dx+rx, e, ll/2, sx}; +Point(x+03) = {dx, -e+rx, -ll/2, sx}; Point(x+13) = {dx, e+rx, ll/2, sx}; +Point(x+04) = {dx-rx, -e, -ll/2, sx}; Point(x+14) = {dx-rx, e, ll/2, sx}; +Point(x+05) = {dx, -e-rx, -ll/2, sx}; Point(x+15) = {dx, e-rx, ll/2, sx}; +Point(x+06) = {dx, -e, -ll/2-lx, sx}; Point(x+16) = {dx, e, ll/2+lx, sx}; +Point(x+07) = {dx+rx, -e, -ll/2-lx, sx}; Point(x+17) = {dx+rx, e, ll/2+lx, sx}; +Point(x+08) = {dx, -e+rx, -ll/2-lx, sx}; Point(x+18) = {dx, e+rx, ll/2+lx, sx}; +Point(x+09) = {dx-rx, -e, -ll/2-lx, sx}; Point(x+19) = {dx-rx, e, ll/2+lx, sx}; +Point(x+10) = {dx, -e-rx, -ll/2-lx, sx}; Point(x+20) = {dx, e-rx, ll/2+lx, sx}; + +Circle(x+01) = {x+02,x+01,x+03}; Circle(x+05) = {x+07,x+06,x+08}; Line(x+09) = {x+02,x+07}; +Circle(x+02) = {x+03,x+01,x+04}; Circle(x+06) = {x+08,x+06,x+09}; Line(x+10) = {x+03,x+08}; +Circle(x+03) = {x+04,x+01,x+05}; Circle(x+07) = {x+09,x+06,x+10}; Line(x+11) = {x+04,x+09}; +Circle(x+04) = {x+05,x+01,x+02}; Circle(x+08) = {x+10,x+06,x+07}; Line(x+12) = {x+05,x+10}; + +Circle(x+13) = {x+12,x+11,x+13}; Circle(x+17) = {x+17,x+16,x+18}; Line(x+21) = {x+12,x+17}; +Circle(x+14) = {x+13,x+11,x+14}; Circle(x+18) = {x+18,x+16,x+19}; Line(x+22) = {x+13,x+18}; +Circle(x+15) = {x+14,x+11,x+15}; Circle(x+19) = {x+19,x+16,x+20}; Line(x+23) = {x+14,x+19}; +Circle(x+16) = {x+15,x+11,x+12}; Circle(x+20) = {x+20,x+16,x+17}; Line(x+24) = {x+15,x+20}; + +Line Loop(x+01) = {x+02,x+03,x+04,x+01}; Plane Surface(x+21) = {x+01}; +Line Loop(x+02) = {x+07,x+08,x+05,x+06}; Plane Surface(x+22) = {x+02}; +Line Loop(x+03) = {x+16,x+13,x+14,x+15}; Plane Surface(x+23) = {x+03}; +Line Loop(x+04) = {x+20,x+17,x+18,x+19}; Plane Surface(x+24) = {x+04}; +Line Loop(x+05) = {x+08,-(x+09),-(x+04),x+12}; Ruled Surface(x+25) = {x+05}; +Line Loop(x+06) = {x+12,-(x+07),-(x+11),x+03}; Ruled Surface(x+26) = {x+06}; +Line Loop(x+07) = {-(x+11),-(x+02),x+10,x+06}; Ruled Surface(x+27) = {x+07}; +Line Loop(x+08) = {-(x+10),-(x+01),x+09,x+05}; Ruled Surface(x+28) = {x+08}; +Line Loop(x+09) = {x+21,-(x+20),-(x+24),x+16}; Ruled Surface(x+29) = {x+09}; +Line Loop(x+10) = {-(x+24),-(x+15),x+23,x+19}; Ruled Surface(x+30) = {x+10}; +Line Loop(x+11) = {x+23,-(x+18),-(x+22),x+14}; Ruled Surface(x+31) = {x+11}; +Line Loop(x+12) = {x+22,-(x+17),-(x+21),x+13}; Ruled Surface(x+32) = {x+12}; + diff --git a/demos/ex13.geo b/demos/ex13.geo new file mode 100644 index 0000000000000000000000000000000000000000..142a51cbe28beec810c19c4f5521cb9899b7bb41 --- /dev/null +++ b/demos/ex13.geo @@ -0,0 +1,198 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + More complex 3D example. Test for 2nd order elts. + + All important comments are marked with "README" +*/ + +/* + The two longitudinal bars +*/ + +f4 = 0.6 ; +f5 = 1.33 ; + +xmin =-27.e-3 ; +LL = 1821.3e-3 ; +ll = 20.e-3 ; +hh = 20.e-3 ; +dc = 8.e-3 ; +em = 8.e-3/2 ; +eM = 40.e-3/2 ; +t = ArcTan(eM/2-em/2/LL) ; + +Point(1) = {xmin, -em-hh, -ll/2, f4*ll/2} ; Point(5) = {xmin, em, -ll/2, f4*ll/2} ; +Point(2) = {xmin, -em-hh, ll/2, f4*ll/2} ; Point(6) = {xmin, em, ll/2, f4*ll/2} ; +Point(3) = {xmin, -em, -ll/2, f4*ll/2} ; Point(7) = {xmin, em+hh, -ll/2, f4*ll/2} ; +Point(4) = {xmin, -em, ll/2, f4*ll/2} ; Point(8) = {xmin, em+hh, ll/2, f4*ll/2} ; + +Point(9) = {xmin+LL, -eM-hh, -ll/2, f5*ll/2} ; Point(13) = {xmin+LL, eM, -ll/2, f5*ll/2} ; +Point(10) = {xmin+LL, -eM-hh, ll/2, f5*ll/2} ; Point(14) = {xmin+LL, eM, ll/2, f5*ll/2} ; +Point(11) = {xmin+LL, -eM, -ll/2, f5*ll/2} ; Point(15) = {xmin+LL, eM+hh, -ll/2, f5*ll/2} ; +Point(12) = {xmin+LL, -eM, ll/2, f5*ll/2} ; Point(16) = {xmin+LL, eM+hh, ll/2, f5*ll/2} ; + +Line(1) = {5,6}; Line(11) = {13,14}; +Line(2) = {6,8}; Line(12) = {14,16}; +Line(3) = {8,7}; Line(13) = {16,15}; +Line(4) = {7,5}; Line(14) = {15,13}; +Line(5) = {1,2}; Line(15) = {9,10}; +Line(6) = {2,4}; Line(16) = {10,12}; +Line(7) = {4,3}; Line(17) = {12,11}; +Line(8) = {3,1}; Line(18) = {11,9}; +Line(9) = {4,6}; Line(19) = {12,14}; +Line(10) = {3,5}; Line(20) = {11,13}; + +Line(21) = {8,16}; Line(25) = {2,10}; +Line(22) = {7,15}; Line(26) = {4,12}; +Line(23) = {6,14}; Line(27) = {3,11}; +Line(24) = {5,13}; Line(28) = {1,9}; + +/* + The 22 resonators +*/ + +f1 = 2 ; f2 = 3.5 ; f3 = 5 ; + +// length ; radius ; dist % 1st bar ; dist % y=0 ; charact. length + l1 = 77.e-3/2-ll/2 ; r1 = 8.e-3/2 ; d1 = 0 ; e1 = em+dc+d1*Sin(t)-2.e-3 ; s1 = f1*r1 ; + l2 = 91.e-3/2-ll/2 ; r2 = 8.e-3/2 ; d2 = 11.9e-3 ; e2 = em+dc+d2*Sin(t)-2.e-3 ; s2 = f1*r2 ; + l3 = 105.e-3/2-ll/2 ; r3 = 8.e-3/2 ; d3 = 25.8e-3 ; e3 = em+dc+d3*Sin(t)-2.e-3 ; s3 = f1*r3 ; + l4 = 122.e-3/2-ll/2 ; r4 = 8.e-3/2 ; d4 = 41.8e-3 ; e4 = em+dc+d4*Sin(t)-2.e-3 ; s4 = f1*r4 ; + l5 = 142.e-3/2-ll/2 ; r5 = 10.e-3/2 ; d5 = 60.5e-3 ; e5 = em+dc+d5*Sin(t)-1.e-3 ; s5 = f1*r5 ; + l6 = 164.e-3/2-ll/2 ; r6 = 10.e-3/2 ; d6 = 82.5e-3 ; e6 = em+dc+d6*Sin(t)-1.e-3 ; s6 = f1*r6 ; + l7 = 192.e-3/2-ll/2 ; r7 = 12.e-3/2 ; d7 = 107.0e-3 ; e7 = em+dc+d7*Sin(t) ; s7 = f1*r7 ; + l8 = 224.e-3/2-ll/2 ; r8 = 12.e-3/2 ; d8 = 138.5e-3 ; e8 = em+dc+d8*Sin(t) ; s8 = f1*r8 ; + l9 = 260.e-3/2-ll/2 ; r9 = 12.e-3/2 ; d9 = 172.0e-3 ; e9 = em+dc+d9*Sin(t) ; s9 = f1*r9 ; +l10 = 303.e-3/2-ll/2 ; r10 = 12.e-3/2 ; d10 = 212.0e-3 ; e10 = em+dc+d10*Sin(t) ; s10 = f1*r10 ; +l11 = 353.e-3/2-ll/2 ; r11 = 12.e-3/2 ; d11 = 258.5e-3 ; e11 = em+dc+d11*Sin(t) ; s11 = f1*r11 ; +l12 = 410.e-3/2-ll/2 ; r12 = 12.e-3/2 ; d12 = 312.5e-3 ; e12 = em+dc+d12*Sin(t) ; s12 = f1*r12 ; +l13 = 477.e-3/2-ll/2 ; r13 = 12.e-3/2 ; d13 = 375.0e-3 ; e13 = em+dc+d13*Sin(t) ; s13 = f1*r13 ; +l14 = 554.e-3/2-ll/2 ; r14 = 12.e-3/2 ; d14 = 448.5e-3 ; e14 = em+dc+d14*Sin(t) ; s14 = f1*r14 ; +l15 = 645.e-3/2-ll/2 ; r15 = 12.e-3/2 ; d15 = 533.0e-3 ; e15 = em+dc+d15*Sin(t) ; s15 = f1*r15 ; +l16 = 749.e-3/2-ll/2 ; r16 = 12.e-3/2 ; d16 = 632.5e-3 ; e16 = em+dc+d16*Sin(t) ; s16 = f1*r16 ; +l17 = 877.e-3/2-ll/2 ; r17 = 12.e-3/2 ; d17 = 750.5e-3 ; e17 = em+dc+d17*Sin(t) ; s17 = f2*r17 ; +l18 = 1023.e-3/2-ll/2 ; r18 = 12.e-3/2 ; d18 = 888.0e-3 ; e18 = em+dc+d18*Sin(t) ; s18 = f2*r18 ; +l19 = 1196.e-3/2-ll/2 ; r19 = 12.e-3/2 ; d19 = 1050.3e-3 ; e19 = em+dc+d19*Sin(t) ; s19 = f3*r19 ; +l20 = 1404.e-3/2-ll/2 ; r20 = 12.e-3/2 ; d20 = 1241.7e-3 ; e20 = em+dc+d20*Sin(t) ; s20 = f3*r20 ; +l21 = 1648.e-3/2-ll/2 ; r21 = 12.e-3/2 ; d21 = 1467.7e-3 ; e21 = em+dc+d21*Sin(t) ; s21 = f3*r21 ; +l22 = 1934.e-3/2-ll/2 ; r22 = 12.e-3/2 ; d22 = 1734.3e-3 ; e22 = em+dc+d22*Sin(t) ; s22 = f3*r22 ; + +dx = d1 ; rx = r1 ; sx = s1 ; lx = l1 ; e = e1 ; x = 100; Include "ex13.bar" ; +dx = d2 ; rx = r2 ; sx = s2 ; lx = l2 ; e =-e2 ; x = 200; Include "ex13.bar" ; +dx = d3 ; rx = r3 ; sx = s3 ; lx = l3 ; e = e3 ; x = 300; Include "ex13.bar" ; +dx = d4 ; rx = r4 ; sx = s4 ; lx = l4 ; e =-e4 ; x = 400; Include "ex13.bar" ; +dx = d5 ; rx = r5 ; sx = s5 ; lx = l5 ; e = e5 ; x = 500; Include "ex13.bar" ; +dx = d6 ; rx = r6 ; sx = s6 ; lx = l6 ; e =-e6 ; x = 600; Include "ex13.bar" ; +dx = d7 ; rx = r7 ; sx = s7 ; lx = l7 ; e = e7 ; x = 700; Include "ex13.bar" ; +dx = d8 ; rx = r8 ; sx = s8 ; lx = l8 ; e =-e8 ; x = 800; Include "ex13.bar" ; +dx = d9 ; rx = r9 ; sx = s9 ; lx = l9 ; e = e9 ; x = 900; Include "ex13.bar" ; +dx = d10; rx = r10; sx = s10; lx = l10; e =-e10; x =1000; Include "ex13.bar" ; +dx = d11; rx = r11; sx = s11; lx = l11; e = e11; x =1100; Include "ex13.bar" ; +dx = d12; rx = r12; sx = s12; lx = l12; e =-e12; x =1200; Include "ex13.bar" ; +dx = d13; rx = r13; sx = s13; lx = l13; e = e13; x =1300; Include "ex13.bar" ; +dx = d14; rx = r14; sx = s14; lx = l14; e =-e14; x =1400; Include "ex13.bar" ; +dx = d15; rx = r15; sx = s15; lx = l15; e = e15; x =1500; Include "ex13.bar" ; +dx = d16; rx = r16; sx = s16; lx = l16; e =-e16; x =1600; Include "ex13.bar" ; +dx = d17; rx = r17; sx = s17; lx = l17; e = e17; x =1700; Include "ex13.bar" ; +dx = d18; rx = r18; sx = s18; lx = l18; e =-e18; x =1800; Include "ex13.bar" ; +dx = d19; rx = r19; sx = s19; lx = l19; e = e19; x =1900; Include "ex13.bar" ; +dx = d20; rx = r20; sx = s20; lx = l20; e =-e20; x =2000; Include "ex13.bar" ; +dx = d21; rx = r21; sx = s21; lx = l21; e = e21; x =2100; Include "ex13.bar" ; +dx = d22; rx = r22; sx = s22; lx = l22; e =-e22; x =2200; Include "ex13.bar" ; + + +/* + Surfaces for longitudinal bars +*/ + +Line Loop(3001) = {-13,-21,3,22}; Plane Surface(3101) = {3001}; // ymax +Line Loop(3002) = {23,-11,-24,1}; Plane Surface(3102) = {3002}; // ymax - eps +Line Loop(3003) = {-27,-7,26,17}; Plane Surface(3103) = {3003}; // ymin + eps +Line Loop(3004) = {25,-15,-28,5}; Plane Surface(3104) = {3004}; // ymin +Line Loop(3005) = {3,4,1,2}; Plane Surface(3105) = {3005}; // left top +Line Loop(3006) = {7,8,5,6}; Plane Surface(3106) = {3006}; // left bottom +Line Loop(3007) = {11,12,13,14}; Plane Surface(3107) = {3007}; // right top +Line Loop(3008) = {18,15,16,17}; Plane Surface(3108) = {3008}; // right bottom + +Line Loop(3011) = {-9,7,10,1}; Plane Surface(3111) = {3011}; // input +Line Loop(3012) = {-11,-20,-17,19};Plane Surface(3112) = {3012}; // output + +Line Loop(3013) = {-26,-6,25,16}; +Line Loop(3014) = {-28,-8,27,18}; +Line Loop(3015) = {-21,-2,23,12}; +Line Loop(3016) = {-24,-4,22,14}; +Plane Surface(3113) = {3013,203,403,603,803,1003,1203,1403,1603,1803,2003,2203} ; +Plane Surface(3114) = {3014,101,301,501,701,901,1101,1301,1501,1701,1901,2101}; +Plane Surface(3115) = {3015,103,303,503,703,903,1103,1303,1503,1703,1903,2103}; +Plane Surface(3116) = {3016,201,401,601,801,1001,1201,1401,1601,1801,2001,2201}; + +/* + The physical entities +*/ + +AIR = 8001 ; +XM = 8002 ; +XP = 8003 ; +YM = 8004 ; +YP = 8005 ; +ZM = 8006 ; +ZP = 8007 ; + +CLINPUT = 9001 ; +CLBOX = 9002 ; +CLLONG = 9003 ; +CLBAR = 9004 ; +CLBEM = 9005 ; + +Physical Surface(CLINPUT) = {3111}; +Physical Surface(CLBEM) = {4119,4106,4115,4111,4122,4124}; +Physical Surface(CLLONG) = {3102,3115,3101,3116,3105,3107,3103,3114,3104,3113,3108,3106}; +Physical Surface(CLBAR) = +{ + 122,125,126,127,128, + 124,129,130,131,132, + 222,225,226,227,228, + 224,229,230,231,232, + 322,325,326,327,328, + 324,329,330,331,332, + 422,425,426,427,428, + 424,429,430,431,432, + 522,525,526,527,528, + 524,529,530,531,532, + 622,625,626,627,628, + 624,629,630,631,632, + 722,725,726,727,728, + 724,729,730,731,732, + 822,825,826,827,828, + 824,829,830,831,832, + 922,925,926,927,928, + 924,929,930,931,932, + 1022,1025,1026,1027,1028, + 1024,1029,1030,1031,1032, + 1122,1125,1126,1127,1128, + 1124,1129,1130,1131,1132, + 1222,1225,1226,1227,1228, + 1224,1229,1230,1231,1232, + 1322,1325,1326,1327,1328, + 1324,1329,1330,1331,1332, + 1422,1425,1426,1427,1428, + 1424,1429,1430,1431,1432, + 1522,1525,1526,1527,1528, + 1524,1529,1530,1531,1532, + 1622,1625,1626,1627,1628, + 1624,1629,1630,1631,1632, + 1722,1725,1726,1727,1728, + 1724,1729,1730,1731,1732, + 1822,1825,1826,1827,1828, + 1824,1829,1830,1831,1832, + 1922,1925,1926,1927,1928, + 1924,1929,1930,1931,1932, + 2022,2025,2026,2027,2028, + 2024,2029,2030,2031,2032, + 2122,2125,2126,2127,2128, + 2124,2129,2130,2131,2132, + 2222,2225,2226,2227,2228, + 2224,2229,2230,2231,2232 + }; + diff --git a/demos/view01.pos b/demos/view01.pos new file mode 100644 index 0000000000000000000000000000000000000000..8181fcc14ecbff73b4d52d26eb51238cb4a6ac79 --- /dev/null +++ b/demos/view01.pos @@ -0,0 +1,1327 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + 2D Scalar map + + All important comments are marked with "README" +*/ + +/* README: A post-processing file contains one or more 'Views', whose + syntax is + + View "name" { + type of element (list of coordinates) {list of values} ; + ... + } + + 12 base objects can be displayed: + + type of element list of coordinates list of values + -------------------------------------------------------------------------------- + scalar point SP 3 1 * nb time steps + vector point VP 3 3 * nb time steps + tensor point TP 3 9 * nb time steps + scalar line SL 6 2 * nb time steps + vector line VL 6 6 * nb time steps + tensor line TL 6 18 * nb time steps + scalar triangle ST 9 3 * nb time steps + vector triangle VT 9 9 * nb time steps + tensor triangle TT 9 27 * nb time steps + scalar tetrahedron SS 12 4 * nb time steps + vector tetrahedron VS 12 12 * nb time steps + tensor tetrahedron TS 12 36 * nb time steps + + + The coordinates are given "by node", that is (x,y,z) for a point, (x1,y1,z1,x2,y2,z2) + for a line, (x1,y1,z1,x2,y2,z2,x3,y3,z3) for a triangle, ... + + The values are given by timestep, by node and by component. That is, for a vector line, + {valxnode1time1,valynode1time1,valznode1time1, valxnode2time1,valynode2time1,valznode2time1, + valxnode1time2,valynode1time2,valznode1time2, valxnode2time2,valynode2time2,valznode2time2, ...} + + A post-processing view is loaded in Gmsh with File->Merge. Up to 20 views can be loaded + simultaneously. All post-processing options are accessed by clicking on the right mouse + button on the view button (in post-processing mode: Mod->Post-Processing). + +*/ + + +// In this view, there are only scalar triangles. +// There are 5 time steps -> 3*5 = 15 values for each triangle. + +View "a scalar map" { +ST(0.079090117,0.19794942,0,0.06966854,0.20076802,0,0.071449289,0.19423207,0){1206859.6,1570520.4,1594804.6,-2368529.7,-3162888.4,-3019964.8,1073015.3,1636334.6,1103926.4,1335740.9,1503948.1,2033518.7,-2359414.1,-3161601.9,-2921575.1}; +ST(0.056317057,0.058022103,0,0.045416206,0.061541227,0,0.048663579,0.053435419,0){3630316.8,3642820.9,3726394.8,2330872.5,2181474.8,2589713.3,197001.66,-155055.51,663071.82,-2007682.1,-2429600.5,-1465861.1,-3494460.7,-3730025.8,-3147918.6}; +ST(0.052494391,0.065958781,0,0.045416206,0.061541227,0,0.056317057,0.058022103,0){3640248,3642820.9,3630316.8,1971511.2,2181474.8,2330872.5,-601016.65,-155055.51,197001.66,-2898090,-2429600.5,-2007682.1,-3866942,-3730025.8,-3494460.7}; +ST(0.089437553,0.21298247,0,0.093706234,0.20596864,0,0.1,0.21428571,0){556322.48,360320.46,0,-1238115.4,-758974.46,0,961021.23,479351.87,0,60411.18,228803.73,0,-1035404.3,-732939.79,0}; +ST(0,0.021428571,0,0.0084994266,0.025462386,0,0,0.028571429,0){0,1014895.2,0,0,943121.65,0,0,804669.5,0,0,609367.99,0,0,370926.59,0}; +ST(0,0.27142857,0,0.0087746229,0.27470702,0,0,0.27857143,0){0,139476.7,0,0,-408686.72,0,0,649356.33,0,0,-844695.79,0,0,980930.37,0}; +ST(0.064352171,0.083117586,0,0.058212185,0.089881183,0,0.054828578,0.081464579,0){3167194.8,3344291.6,3492382.6,915483.69,593905.21,1101278.5,-1987167.2,-2645013.4,-2043909.2,-3477240.4,-3708817.1,-3789901.6,-2495770,-1722713.3,-2941538.5}; +ST(0.043491003,0.26677795,0,0.04563604,0.25694979,0,0.0528723,0.26429657,0){657627.62,859240.08,718299.05,-1894105.9,-2406042.8,-2055661.9,2903724.9,3472131.8,3109067.1,-3565612.1,-3844488.4,-3733060,3800401.2,3448330.3,3841282.5}; +ST(0.0528723,0.26429657,0,0.04563604,0.25694979,0,0.054010827,0.25507988,0){718299.05,859240.08,897184.36,-2055661.9,-2406042.8,-2496661.6,3109067.1,3472131.8,3553831.7,-3733060,-3844488.4,-3839088.9,3841282.5,3448330.3,3290330.5}; +ST(0.052748817,0.036292023,0,0.046341114,0.044942776,0,0.043838979,0.034579424,0){3796611.1,3748809.1,3745913.7,3254886.9,2933624.2,3260141.4,2248728.5,1480431.3,2351583.2,921690.78,-294933.53,1138042.7,-537197.11,-2006921.6,-223347.31}; +ST(0.054794838,0.043915046,0,0.046341114,0.044942776,0,0.052748817,0.036292023,0){3735662.6,3748809.1,3796611.1,2959425,2933624.2,3254886.9,1568238.5,1480431.3,2248728.5,-148813.91,-294933.53,921690.78,-1835117.4,-2006921.6,-537197.11}; +ST(0.064795861,0.023107998,0,0.057612168,0.01845715,0,0.064075209,0.013493001,0){3443592.1,3752599.8,3498581.2,3242943.8,3612875.5,3428890.3,2853338,3338613.5,3290906.4,2297494.4,2940029.2,3087427.7,1607540.9,2431782.4,2822154}; +ST(0.08812606,0.087328167,0,0.091953893,0.078440357,0,0.1,0.085714286,0){1269155.7,889726.23,0,279658.57,322434.75,0,-927894.68,-450550.32,0,-1412053.3,-936443.15,0,-795447.99,-825354.72,0}; +ST(0.1,0.21428571,0,0.091864029,0.22106993,0,0.089437553,0.21298247,0){0,394005.54,556322.48,0,-927852.61,-1238115.4,0,863120.02,961021.23,0,-241435.16,60411.18,0,-536498.87,-1035404.3}; +ST(0.091758141,0.11296708,0,0.08466046,0.11619385,0,0.082583958,0.10907049,0){824791.32,1475783,1698614.9,-201020.76,-452604.25,-286603.09,-976886.6,-1789662.1,-1936849,-537824.26,-788262.21,-1323464.6,570097.26,1243195.1,836522.31}; +ST(0.046341114,0.044942776,0,0.053426379,0.049768916,0,0.048663579,0.053435419,0){3748809.1,3727873.1,3726394.8,2933624.2,2738031.5,2589713.3,1480431.3,1021148,663071.82,-294933.53,-966926.63,-1465861.1,-2006921.6,-2698501,-3147918.6}; +ST(0.08596482,0.28314521,0,0.082516133,0.27647665,0,0.089232651,0.27618677,0){145967.81,248899.48,160151.6,-433371.98,-731674.12,-470555.02,707326.96,1170289.2,751874.95,-959333.22,-1538273.3,-986723.61,1181452.3,1813237.5,1160401.4}; +ST(0.089183466,0.023798504,0,0.082332164,0.023444943,0,0.085905658,0.016824409,0){1283383.3,2029600,1656238,1204105.7,1907886.4,1604967.9,1050439.6,1671751.1,1504009.2,831874.08,1335359.8,1356492.3,561630.79,918760.81,1166855}; +ST(0.051013063,0.11801667,0,0.052058531,0.12554764,0,0.045375723,0.12284566,0){3161388.4,3065498.6,3072436,-1083065.4,-1512626.5,-1348503.3,-3873486.3,-3831818,-3829159.4,-1463412.7,-428428.64,-800055.99,2911579,3614977.4,3380414.3}; +ST(0.076938259,0.060604721,0,0.080938662,0.054906318,0,0.08415119,0.061061125,0){2443533.2,2097661.4,1759442.9,1491930.8,1423084,1064240.3,-40674.57,290856.94,-51487.645,-1557435.8,-934922.56,-1146904.2,-2468002.6,-1860365.1,-1789550.6}; +ST(0.027903545,0.087518505,0,0.025411973,0.082310594,0,0.032911969,0.081185013,0){2674848,2525130.6,3037931.3,580994.77,762374.09,971274.35,-1967676.8,-1532614.6,-1756226.8,-2976106,-2757779.1,-3289165.4,-1655065.1,-2058136.4,-2584916.3}; +ST(0.045116599,0.21481108,0,0.053910411,0.21448753,0,0.049797208,0.2214244,0){1654487.5,1667429.4,1551864.2,-3731787.4,-3752161.8,-3662861.4,3030991.5,3023771,3430735.4,-73694.316,-28239.212,-1003918.8,-2938909.4,-2988983.1,-2065424.5}; +ST(0.064795861,0.023107998,0,0.057707972,0.025075094,0,0.057612168,0.01845715,0){3443592.1,3734947.8,3752599.8,3242943.8,3478918.2,3612875.5,2853338,2984396.6,3338613.5,2297494.4,2285289.9,2940029.2,1607540.9,1429238.8,2431782.4}; +ST(0.0093450955,0.28843768,0,0.0045473776,0.2936365,0,0,0.28571429,0){67949.514,18406.211,0,-202850.84,-55138.333,0,334776.34,91630.552,0,-461793.67,-127724.83,0,581935.08,162961.08,0}; +ST(0.1,0.13571429,0,0.093938974,0.13899,0,0.0910478,0.13167545,0){0,548364.78,831136.87,0,-422206.84,-514132.23,0,-645591.08,-1027305.8,0,273728.87,122313.64,0,708600.91,1073956.7}; +ST(0,0.014285714,0,0.0045481906,0.0063920675,0,0.0093389246,0.011691623,0){0,552257.15,1120186.5,0,549810.55,1103410.3,0,544927.47,1070108.3,0,537633.65,1020788.4,0,527798.54,956114.18}; +ST(0.085905658,0.016824409,0,0.093571257,0.018380777,0,0.089183466,0.023798504,0){1656238,774815.13,1283383.3,1604967.9,746204.54,1204105.7,1504009.2,690036.86,1050439.6,1356492.3,608388.09,831874.08,1166855,504051.02,561630.79}; +ST(0.089232651,0.27618677,0,0.093593186,0.28160993,0,0.08596482,0.28314521,0){160151.6,74588.283,145967.81,-470555.02,-221009.65,-433371.98,751874.95,359269.18,707326.96,-986723.61,-484261.41,-959333.22,1160401.4,591230.88,1181452.3}; +ST(0.015416139,0.018002698,0,0.006650898,0.018174199,0,0.0093389246,0.011691623,0){1798828.3,801243.34,1120186.5,1735136,772347.91,1103410.3,1609995.5,715593.27,1070108.3,1427830.3,633022.27,1020788.4,1194733.1,527557,956114.18}; +ST(0.0093450955,0.28843768,0,0.0067236406,0.28198319,0,0.015498485,0.28248556,0){67949.514,76627.274,166274.63,-202850.84,-227172.13,-493262.57,334776.34,369685.4,803759.61,-461793.67,-499127.77,-1087394.1,581935.08,610772.43,1334475.8}; +ST(0.048076401,0.17082416,0,0.048811039,0.17808485,0,0.041643161,0.17482395,0){2424680.5,2310715.6,2284160.6,-3473815.1,-3650410,-3458410.7,-921629.25,-194330.82,-506290.81,3872759.5,3763231.4,3718851.8,-754316.94,-1987755.8,-1405815.9}; +ST(0.041643161,0.17482395,0,0.048811039,0.17808485,0,0.043573225,0.18196099,0){2284160.6,2310715.6,2202933.2,-3458410.7,-3650410,-3650165.7,-506290.81,-194330.82,195066.32,3718851.8,3763231.4,3522129.2,-1405815.9,-1987755.8,-2509350}; +ST(0.020973714,0.16688371,0,0.021502186,0.15931359,0,0.029380008,0.16405835,0){1525118.3,1630158.4,2021292.5,-2061659.5,-1947614.2,-2614335.2,-799875.51,-1250943.8,-1254306.4,2343184.8,2191316.6,2982541.3,-24581.749,824223.66,378860.61}; +ST(0.075422073,0.20645372,0,0.06966854,0.20076802,0,0.079090117,0.19794942,0){1273700.5,1570520.4,1206859.6,-2693470,-3162888.4,-2368529.7,1728669,1636334.6,1073015.3,766631.5,1503948.1,1335740.9,-2583646.6,-3161601.9,-2359414.1}; +ST(0.077619244,0.18028791,0,0.077140734,0.17217741,0,0.085369203,0.17624497,0){1471797.4,1584233.7,1039089.6,-2389894.4,-2313491.7,-1603144.1,18944.546,-519338.58,-168940.91,2378251.6,2552719.3,1695116.9,-1502642.9,-655929.75,-751642.95}; +ST(0.0084994266,0.025462386,0,0.006650898,0.018174199,0,0.015416139,0.018002698,0){1014895.2,801243.34,1798828.3,943121.65,772347.91,1735136,804669.5,715593.27,1609995.5,609367.99,633022.27,1427830.3,370926.59,527557,1194733.1}; +ST(0.015498485,0.28248556,0,0.0067236406,0.28198319,0,0.0087746229,0.27470702,0){166274.63,76627.274,139476.7,-493262.57,-227172.13,-408686.72,803759.61,369685.4,649356.33,-1087394.1,-499127.77,-844695.79,1334475.8,610772.43,980930.37}; +ST(0.029380008,0.16405835,0,0.021502186,0.15931359,0,0.027609688,0.15620978,0){2021292.5,1630158.4,2023546.1,-2614335.2,-1947614.2,-2286520.9,-1254306.4,-1250943.8,-1726415,2982541.3,2191316.6,2510934.9,378860.61,824223.66,1400022.9}; +ST(0.0087746229,0.27470702,0,0.018422519,0.27450763,0,0.015498485,0.28248556,0){139476.7,282501.19,166274.63,-408686.72,-827496.14,-493262.57,649356.33,1313896,803759.61,-844695.79,-1707268.8,-1087394.1,980930.37,1979556.1,1334475.8}; +ST(0.014305262,0.26641769,0,0.018422519,0.27450763,0,0.0087746229,0.27470702,0){294901.31,282501.19,139476.7,-848621.76,-827496.14,-408686.72,1298521.9,1313896,649356.33,-1589572.3,-1707268.8,-844695.79,1686004.5,1979556.1,980930.37}; +ST(0.0084994266,0.025462386,0,0.016759526,0.025876157,0,0.014137494,0.034012185,0){1014895.2,1932221.9,1641076.4,943121.65,1791225.7,1435142,804669.5,1519509.7,1049094.4,609367.99,1136895.1,531342.12,370926.59,671081.1,-53364.585}; +ST(0.015416139,0.018002698,0,0.016759526,0.025876157,0,0.0084994266,0.025462386,0){1798828.3,1932221.9,1014895.2,1735136,1791225.7,943121.65,1609995.5,1519509.7,804669.5,1427830.3,1136895.1,609367.99,1194733.1,671081.1,370926.59}; +ST(0.025770754,0.10718168,0,0.032036001,0.10024616,0,0.034786476,0.1076516,0){2378738.7,2837469.6,2912738.3,-316264.13,-12660.65,-413135.58,-2653040.8,-2850146.6,-3267374.9,-1984140.6,-2824890.6,-2390915.6,932667.69,37524.098,1215377.6}; +ST(0.024938414,0.098415267,0,0.032036001,0.10024616,0,0.025770754,0.10718168,0){2383058.5,2837469.6,2378738.7,68195.72,-12660.65,-316264.13,-2312962.3,-2850146.6,-2653040.8,-2447461.4,-2824890.6,-1984140.6,-204726.33,37524.098,932667.69}; +ST(0.049797208,0.2214244,0,0.053910411,0.21448753,0,0.05718895,0.22161738,0){1551864.2,1667429.4,1508977,-3662861.4,-3752161.8,-3566099.1,3430735.4,3023771,3352547.9,-1003918.8,-28239.212,-1004251.2,-2065424.5,-2988983.1,-1983866.6}; +ST(0.1,0.21428571,0,0.093706234,0.20596864,0,0.1,0.20714286,0){0,360320.46,0,0,-758974.46,0,0,479351.87,0,0,228803.73,0,0,-732939.79,0}; +ST(0.066012722,0.055502179,0,0.064832361,0.062804408,0,0.056317057,0.058022103,0){3257272.9,3281120.4,3630316.8,2187557.2,1912310.8,2330872.5,399401.17,-254314.65,197001.66,-1519988.7,-2314932.7,-2007682.1,-2940625.1,-3410309.6,-3494460.7}; +ST(0.063265205,0.21633109,0,0.066992124,0.20847551,0,0.073708403,0.21517194,0){1505335.5,1540360.8,1225969.3,-3432481.9,-3311175.4,-2772471.1,2888962.8,2266191.6,2271379.1,-265885.87,706070.36,-92677.622,-2549234.8,-3078419.5,-2155133.8}; +ST(0.073708403,0.21517194,0,0.066992124,0.20847551,0,0.075422073,0.20645372,0){1225969.3,1540360.8,1273700.5,-2772471.1,-3311175.4,-2693470,2271379.1,2266191.6,1728669,-92677.622,706070.36,766631.5,-2155133.8,-3078419.5,-2583646.6}; +ST(0.015498485,0.28248556,0,0.017990672,0.29207379,0,0.0093450955,0.28843768,0){166274.63,86228.122,67949.514,-493262.57,-258100.45,-202850.84,803759.61,428229.3,334776.34,-1087394.1,-595472.42,-461793.67,1334475.8,758576.15,581935.08}; +ST(0.0093389246,0.011691623,0,0.01808004,0.0081573173,0,0.015416139,0.018002698,0){1120186.5,2085729.2,1798828.3,1103410.3,2070583.9,1735136,1070108.3,2040406.9,1609995.5,1020788.4,1995444.2,1427830.3,956114.18,1935913.6,1194733.1}; +ST(0.089949388,0.2453858,0,0.092168655,0.23668616,0,0.1,0.24285714,0){339950.36,307607.26,0,-911669.73,-792496.69,0,1193275.4,941630.33,0,-1095139.7,-691810.02,0,648419.14,148523.72,0}; +ST(0.077013163,0.11736903,0,0.074105201,0.11070107,0,0.082583958,0.10907049,0){2095773.2,2359475.3,1698614.9,-691227.47,-471755.94,-286603.09,-2559181.5,-2736894.8,-1936849,-1023961.4,-1717960.7,-1323464.6,1873161.8,1362139.4,836522.31}; +ST(0.1,0.13571429,0,0.0910478,0.13167545,0,0.1,0.12857143,0){0,831136.87,0,0,-514132.23,0,0,-1027305.8,0,0,122313.64,0,0,1073956.7,0}; +ST(0.087331535,0.0958472,0,0.081743274,0.092625466,0,0.08812606,0.087328167,0){1318484.3,1862860,1269155.7,98077.228,243386.47,279658.57,-1213131.9,-1587731,-927894.68,-1401481.2,-2038652.4,-1412053.3,-292629.72,-717394.49,-795447.99}; +ST(0.091053567,0.10618538,0,0.091758141,0.11296708,0,0.082583958,0.10907049,0){914271.31,824791.32,1698614.9,-104388.15,-201020.76,-286603.09,-1006721.9,-976886.6,-1936849,-787386.88,-537824.26,-1323464.6,309052.61,570097.26,836522.31}; +ST(0.092857143,0.3,0,0.091323117,0.29067423,0,0.1,0.29285714,0){0,51002.156,0,0,-152526.43,0,0,252617.29,0,0,-350336.87,0,0,444691.33,0}; +ST(0.1,0.0071428571,0,0.091308694,0.0093164623,0,0.092857143,0,0){0,1045151,863626.15,0,1035216.9,863662.39,0,1015442.8,863732,0,986027.05,863838.35,0,947106.05,863813.95}; +ST(0.011573719,0.041901165,0,0.0063343033,0.038958017,0,0.014137494,0.034012185,0){1347025.1,751213.74,1641076.4,1091815.8,627892.11,1435142,629744.45,401490.67,1049094.4,48353.226,109174.99,531342.12,-542301.86,-201236.23,-53364.585}; +ST(0.019499739,0.079597209,0,0.01882241,0.070374011,0,0.026270926,0.075674812,0){2040354.6,2018056.9,2630439.6,702945.71,970762.8,1063205.3,-1095289.5,-580354.6,-1137545.6,-2175701.2,-1830388.5,-2660659.2,-1830384.7,-2130853.3,-2599027.8}; +ST(0.011268327,0.1984065,0,0.015977634,0.20443356,0,0.007303543,0.20469543,0){682302.12,895779.15,422375.13,-1344805.9,-1862602.8,-880191.16,623458.07,1114548.4,531663.92,739532.85,659707.69,303952.91,-1341727.7,-1827076.9,-861341.37}; +ST(0.057323957,0.1204315,0,0.052058531,0.12554764,0,0.051013063,0.11801667,0){3051716.5,3065498.6,3161388.4,-1191883,-1512626.5,-1083065.4,-3778168.4,-3831818,-3873486.3,-1110713.1,-428428.64,-1463412.7,3101303,3614977.4,2911579}; +ST(0.089858368,0.18421461,0,0.091593501,0.1915477,0,0.084368038,0.19048099,0){692603.24,544831.72,992852.93,-1178349.1,-1004107.1,-1809621.2,133849.22,301623.68,495817.1,1084450.2,749822.54,1401810.9,-894447.98,-933881.71,-1649308.4}; +ST(0.015758122,0.23699049,0,0.0069516057,0.23320895,0,0.011838853,0.2301677,0){597291.98,288078.49,504229.49,-1541119.1,-728952.19,-1254859.2,1837947.1,827497.2,1363834.1,-1363109.4,-537397.4,-775392.51,315646.37,-5267.3055,-209768.04}; +ST(0.054794838,0.043915046,0,0.053426379,0.049768916,0,0.046341114,0.044942776,0){3735662.6,3727873.1,3748809.1,2959425,2738031.5,2933624.2,1568238.5,1021148,1480431.3,-148813.91,-966926.63,-294933.53,-1835117.4,-2698501,-2006921.6}; +ST(0,0.28571429,0,0.0067236406,0.28198319,0,0.0093450955,0.28843768,0){0,76627.274,67949.514,0,-227172.13,-202850.84,0,369685.4,334776.34,0,-499127.77,-461793.67,0,610772.43,581935.08}; +ST(0.0093389246,0.011691623,0,0.006650898,0.018174199,0,0,0.014285714,0){1120186.5,801243.34,0,1103410.3,772347.91,0,1070108.3,715593.27,0,1020788.4,633022.27,0,956114.18,527557,0}; +ST(0,0.078571429,0,0.0064539684,0.081629255,0,0,0.085714286,0){0,711139.06,0,0,222377.16,0,0,-419239.47,0,0,-772749.89,0,0,-595288.06,0}; +ST(0.085714286,0.3,0,0.081165886,0.29137431,0,0.091323117,0.29067423,0){0,97729.953,51002.156,0,-292395.17,-152526.43,0,484687.71,252617.29,0,-673055.06,-350336.87,0,855744.16,444691.33}; +ST(0.054876921,0.07294965,0,0.060416267,0.076932239,0,0.054828578,0.081464579,0){3558755.8,3380545.3,3492382.6,1580988.4,1302521.2,1101278.5,-1275447.3,-1576156.6,-2043909.2,-3423192.1,-3485992.8,-3789901.6,-3669097.1,-3253298.6,-2941538.5}; +ST(0.091308694,0.0093164623,0,0.081119523,0.0085521597,0,0.085714286,0,0){1045151,2167108.8,1683752,1035216.9,2149779.2,1683802.7,1015442.8,2115263.6,1683911.1,986027.05,2063869.7,1684108.7,947106.05,1995657.9,1684003.7}; +ST(0.044666369,0.11545829,0,0.042557423,0.10832344,0,0.050721192,0.10961634,0){3148096.1,3183930.6,3257974.6,-920013.3,-492142.06,-583831.78,-3799301.5,-3600076,-3737290.3,-1769018.1,-2551523.2,-2483878.9,2547335.8,1442840.6,1698581.7}; +ST(0.076498673,0.26519709,0,0.083190767,0.25723975,0,0.085115353,0.26563346,0){473307.48,434158.6,313056.52,-1357765.2,-1216864.4,-899063.8,2063933,1759626.8,1369900.4,-2499100.3,-1955417.3,-1665255.4,2605934.6,1765235.2,1747205.8}; +ST(0.084917502,0.034253561,0,0.082493405,0.042375289,0,0.075978544,0.034466341,0){1742331.8,1978611.8,2615244.9,1520580.8,1595319.9,2278283.7,1105294,902966.17,1647758.2,549324.68,35643.43,804880.96,-76880.401,-838916.97,-142067.87}; +ST(0.061244461,0.14481879,0,0.068478919,0.13862632,0,0.069467767,0.146519,0){2643484.5,2426951.1,2287173.5,-2356788.3,-1850187.5,-2120501.9,-2899198.4,-2866745.3,-2441744.6,2042509.4,1169007.7,1942651.5,3121060.9,3144665.9,2583122}; +ST(0.030075176,0.23324008,0,0.022740693,0.23189018,0,0.026971271,0.22659033,0){1077047.3,887604.04,1090633.5,-2725827,-2230116.3,-2658504.1,3095770.8,2485475.6,2731189,-2013325.9,-1529145.6,-1267784.1,-13872.597,-172982.46,-909068.56}; +ST(0.071449289,0.19423207,0,0.076430303,0.18837043,0,0.079090117,0.19794942,0){1594804.6,1444535.6,1206859.6,-3019964.8,-2574453.4,-2368529.7,1103926.4,569102.25,1073015.3,2033518.7,2129625.3,1335740.9,-2921575.1,-2235391.7,-2359414.1}; +ST(0.01062282,0.18656765,0,0.0066871595,0.19241823,0,0,0.18571429,0){711483.53,432113.5,0,-1243147.4,-803518.34,0,217509.34,258472.73,0,1080570.1,581490.34,0,-1025407.6,-758588.26,0}; +ST(0.028699663,0.054481756,0,0.032659307,0.059686042,0,0.025221599,0.062165695,0){2920693,3158137.1,2618029.3,1995520.8,1964024.3,1547191.2,438210.61,27282.242,-156575.4,-1257984.1,-1919818.3,-1796512.5,-2556170.3,-3141270.1,-2702051.5}; +ST(0.032911969,0.081185013,0,0.033761495,0.088496681,0,0.027903545,0.087518505,0){3037931.3,3029395.9,2674848,971274.35,608605.12,580994.77,-1756226.8,-2298547.5,-1967676.8,-3289165.4,-3368980,-2976106,-2584916.3,-1747439.7,-1655065.1}; +ST(0.0084994266,0.025462386,0,0.0058133292,0.032528446,0,0,0.028571429,0){1014895.2,694559.72,0,943121.65,614750.96,0,804669.5,464300.7,0,609367.99,260495.38,0,370926.59,26512.55,0}; +ST(0,0.27142857,0,0.0060732531,0.2674669,0,0.0087746229,0.27470702,0){0,124750.88,139476.7,0,-359918.85,-408686.72,0,553735.12,649356.33,0,-683931.42,-844695.79,0,735399.5,980930.37}; +ST(0.007303543,0.20469543,0,0.015977634,0.20443356,0,0.013229009,0.21171696,0){422375.13,895779.15,698716.07,-880191.16,-1862602.8,-1540332.8,531663.92,1114548.4,1156621.3,303952.91,659707.69,147278.69,-861341.37,-1827076.9,-1334554.8}; +ST(0.036912897,0.21765752,0,0.045116599,0.21481108,0,0.042541479,0.22296234,0){1486590.9,1654487.5,1481591,-3421295.1,-3731787.4,-3531706.6,2965983.4,3030991.5,3405357.4,-438566.7,-73694.316,-1180392.3,-2395869.1,-2938909.4,-1772446.7}; +ST(0.038009007,0.015147577,0,0.029163144,0.015558324,0,0.031710863,0.0075461758,0){3597209.6,3068207,3254919.5,3506943.3,2986953.6,3234618.2,3328697.3,2826596.5,3194153.7,3067010.9,2591406.1,3133832.1,2728518.9,2287504.7,3053845.3}; +ST(0.077069107,0.15686929,0,0.070175425,0.16144206,0,0.070477538,0.15360968,0){1743907.9,2074683.8,2153625.7,-1994600,-2570674.4,-2316413.6,-1457243.4,-1460177,-1978592.7,2204191.1,2919916.2,2466066.8,1140253.2,762077.82,1792310.4}; +ST(0.077393474,0.16425214,0,0.070175425,0.16144206,0,0.077069107,0.15686929,0){1650679.7,2074683.8,1743907.9,-2141613.9,-2570674.4,-1994600,-1013799.5,-1460177,-1457243.4,2443278.1,2919916.2,2204191.1,287063.28,762077.82,1140253.2}; +ST(0.060825265,0.17090728,0,0.054395265,0.16699477,0,0.061476805,0.16269562,0){2288734.2,2465605.5,2391378.9,-3282960.5,-3338618.7,-3025373.1,-862639.89,-1283530.8,-1589341.3,3657845.3,3793219.5,3446908.2,-726586.11,-59660.123,675366.83}; +ST(0.08415119,0.061061125,0,0.079822506,0.065677674,0,0.076938259,0.060604721,0){1759442.9,2163855.5,2443533.2,1064240.3,1180001.4,1491930.8,-51487.645,-340376.77,-40674.57,-1146904.2,-1706002.2,-1557435.8,-1789550.6,-2296197.5,-2468002.6}; +ST(0.038843793,0.21103197,0,0.045116599,0.21481108,0,0.036912897,0.21765752,0){1637090.1,1654487.5,1486590.9,-3590120.4,-3731787.4,-3421295.1,2645890.8,3030991.5,2965983.4,433646.44,-73694.316,-438566.7,-3163532.2,-2938909.4,-2395869.1}; +ST(0.049165273,0.076760106,0,0.054876921,0.07294965,0,0.054828578,0.081464579,0){3570137.5,3558755.8,3492382.6,1384898,1580988.4,1101278.5,-1648055.9,-1275447.3,-2043909.2,-3672308.6,-3423192.1,-3789901.6,-3449021.3,-3669097.1,-2941538.5}; +ST(0.016927821,0.11108648,0,0.017861336,0.10270337,0,0.025770754,0.10718168,0){1644246.3,1773538.4,2378738.7,-340994.5,-87655.931,-316264.13,-1914445.6,-1856823.6,-2653040.8,-1176430.8,-1677437.3,-1984140.6,981584.41,261812.45,932667.69}; +ST(0.028699663,0.054481756,0,0.025221599,0.062165695,0,0.021658338,0.054940441,0){2920693,2618029.3,2341024.9,1995520.8,1547191.2,1587273.2,438210.61,-156575.4,322446.89,-1257984.1,-1796512.5,-1046241,-2556170.3,-2702051.5,-2078353.5}; +ST(0.050721192,0.10961634,0,0.054240748,0.10280037,0,0.059543685,0.10776494,0){3257974.6,3302360.6,3132791.5,-583831.78,-169115.68,-451048.14,-3737290.3,-3462856.5,-3519016.9,-2483878.9,-3116478.2,-2561357.9,1698581.7,505791.56,1326599.2}; +ST(0.059543685,0.10776494,0,0.054240748,0.10280037,0,0.061027247,0.098743066,0){3132791.5,3302360.6,3173016.6,-451048.14,-169115.68,72008.811,-3519016.9,-3462856.5,-3099474,-2561357.9,-3116478.2,-3241975.4,1326599.2,505791.56,-216202.29}; +ST(0.026971271,0.22659033,0,0.034969012,0.22634925,0,0.030075176,0.23324008,0){1090633.5,1299939.6,1077047.3,-2658504.1,-3164156.1,-2725827,2731189,3237729.2,3095770.8,-1267784.1,-1478956,-2013325.9,-909068.56,-1117524.9,-13872.597}; +ST(0.060432552,0.20227914,0,0.066992124,0.20847551,0,0.059551151,0.20970619,0){1798951.1,1540360.8,1688112.8,-3671781.8,-3311175.4,-3664209.4,2023610.8,2266191.6,2601193.1,1565241.8,706070.36,619333.89,-3653837,-3078419.5,-3326584.6}; +ST(0.066799394,0.09162077,0,0.058212185,0.089881183,0,0.064352171,0.083117586,0){2974160.1,3344291.6,3167194.8,440022.16,593905.21,915483.69,-2469083.6,-2645013.4,-1987167.2,-3274492.4,-3708817.1,-3477240.4,-1290097.2,-1722713.3,-2495770}; +ST(0.082942949,0.21818591,0,0.081656406,0.2108727,0,0.089437553,0.21298247,0){823054.75,951384.03,556322.48,-1901094.8,-2083808.1,-1238115.4,1667014.3,1528962.6,961021.23,-282341.7,263916.4,60411.18,-1297502.9,-1843401,-1035404.3}; +ST(0.072126291,0.10515927,0,0.069968451,0.098831219,0,0.079063451,0.10043005,0){2539730.3,2730411,2051820.1,-241283.81,57648.531,-16056.497,-2758172.2,-2671597.7,-2067914.3,-2254933.2,-2785714.6,-2035845.1,717337.89,-173126.8,48244.512}; +ST(0.1,0.014285714,0,0.093571257,0.018380777,0,0.091308694,0.0093164623,0){0,774815.13,1045151,0,746204.54,1035216.9,0,690036.86,1015442.8,0,608388.09,986027.05,0,504051.02,947106.05}; +ST(0.091323117,0.29067423,0,0.093593186,0.28160993,0,0.1,0.28571429,0){51002.156,74588.283,0,-152526.43,-221009.65,0,252617.29,359269.18,0,-350336.87,-484261.41,0,444691.33,591230.88,0}; +ST(0.027746664,0.13122119,0,0.030046638,0.13690443,0,0.021167753,0.13548502,0){2296333.1,2369378.2,1816935.7,-1399007.9,-1721516.8,-1266652.3,-2843055.5,-2840145.3,-2200669.4,288094.78,944948.24,600161.11,2955532.6,3098367.4,2382629.9}; +ST(0.044666369,0.11545829,0,0.051013063,0.11801667,0,0.045375723,0.12284566,0){3148096.1,3161388.4,3072436,-920013.3,-1083065.4,-1348503.3,-3799301.5,-3873486.3,-3829159.4,-1769018.1,-1463412.7,-800055.99,2547335.8,2911579,3380414.3}; +ST(0.1,0.085714286,0,0.093922759,0.092262381,0,0.08812606,0.087328167,0){0,652083.63,1269155.7,0,89312.894,279658.57,0,-550573,-927894.68,0,-715327.2,-1412053.3,0,-262838.8,-795447.99}; +ST(0.056766116,0.23329497,0,0.053624899,0.22742186,0,0.059957308,0.22757204,0){1298096.4,1430137,1366903.5,-3286228.7,-3503302.1,-3351367.9,3735031.6,3648370.9,3498598.8,-2434254.7,-1785483,-1727811.3,-7070.0355,-1060301.4,-990620.01}; +ST(0.032911969,0.081185013,0,0.025411973,0.082310594,0,0.026270926,0.075674812,0){3037931.3,2525130.6,2630439.6,971274.35,762374.09,1063205.3,-1756226.8,-1532614.6,-1137545.6,-3289165.4,-2757779.1,-2660659.2,-2584916.3,-2058136.4,-2599027.8}; +ST(0.1,0.057142857,0,0.09230899,0.063522919,0,0.08944657,0.05485846,0){0,877619.52,1211526.2,0,503392.8,822600.19,0,-85524.836,169573.91,0,-638068.15,-537958.1,0,-918939.46,-1073022.7}; +ST(0.034969012,0.22634925,0,0.037546984,0.23452457,0,0.030075176,0.23324008,0){1299939.6,1205921.7,1077047.3,-3164156.1,-3072707.6,-2725827,3237729.2,3550700.1,3095770.8,-1478956,-2423829.8,-2013325.9,-1117524.9,201013.93,-13872.597}; +ST(0.073708403,0.21517194,0,0.081656406,0.2108727,0,0.082942949,0.21818591,0){1225969.3,951384.03,823054.75,-2772471.1,-2083808.1,-1901094.8,2271379.1,1528962.6,1667014.3,-92677.622,263916.4,-282341.7,-2155133.8,-1843401,-1297502.9}; +ST(0.038464606,0.12667013,0,0.033010101,0.13109378,0,0.030575169,0.1246812,0){2859316.3,2584208,2526238.7,-1476046.2,-1567613,-1202245.8,-3573486.5,-3200932.4,-3156412.2,-252868.56,308418.11,-451924.48,3451249.3,3322264.5,2919641.1}; +ST(0.031264826,0.29263185,0,0.028198926,0.28535727,0,0.036602132,0.28491153,0){124484.17,230200.16,279518.56,-372709.78,-685197.76,-831596.18,618717.86,1124120.6,1362985.6,-861054.65,-1536674.3,-1860498.2,1098239.8,1912913.1,2311728.5}; +ST(0.030575169,0.1246812,0,0.033010101,0.13109378,0,0.027746664,0.13122119,0){2526238.7,2584208,2296333.1,-1202245.8,-1567613,-1399007.9,-3156412.2,-3200932.4,-2843055.5,-451924.48,308418.11,288094.78,2919641.1,3322264.5,2955532.6}; +ST(0.077013163,0.11736903,0,0.070840483,0.12204614,0,0.069025318,0.11622387,0){2095773.2,2470738.2,2631986.5,-691227.47,-1044803.2,-808686.45,-2559181.5,-3073782.1,-3192250.9,-1023961.4,-729197.53,-1402768.4,1873161.8,2652961,2220554.1}; +ST(0.037705658,0.25939989,0,0.034582704,0.26623209,0,0.030217898,0.25971254,0){758443.36,604041.77,660621.26,-2140288.6,-1737386.1,-1866014.4,3141072.6,2655775,2744196,-3582615.2,-3245580.1,-3141188.1,3385872.9,3433603.3,2987009.7}; +ST(0.084604507,0.15255901,0,0.08264437,0.14444108,0,0.09156348,0.14589395,0){1258841.2,1463951.5,734092.88,-1326319,-1293607.4,-670961.7,-1187789.9,-1614532.1,-791796.8,1390056.3,1105781,602866.55,1113216.6,1743195.6,843431.47}; +ST(0.09156348,0.14589395,0,0.08264437,0.14444108,0,0.087083587,0.13880919,0){734092.88,1463951.5,1144744.3,-670961.7,-1293607.4,-877072.07,-791796.8,-1614532.1,-1349889.8,602866.55,1105781,561444.4,843431.47,1743195.6,1481228.8}; +ST(0.034582704,0.26623209,0,0.027951851,0.26533243,0,0.030217898,0.25971254,0){604041.77,539100.43,660621.26,-1737386.1,-1547025.6,-1866014.4,2655775,2353298.6,2744196,-3245580.1,-2852826.8,-3141188.1,3433603.3,2980285,2987009.7}; +ST(0.043573225,0.18196099,0,0.038433858,0.18005903,0,0.041643161,0.17482395,0){2202933.2,2131117.1,2284160.6,-3650165.7,-3450732.6,-3458410.7,195066.32,5612.0128,-506290.81,3522129.2,3447337.8,3718851.8,-2509350,-2140463.9,-1405815.9}; +ST(0.019247887,0.048569646,0,0.014691551,0.054118398,0,0.013132659,0.04767246,0){2135187.8,1659245.8,1507774.2,1594654.5,1140472.1,1139737.5,650408.09,265092.56,493500.09,-458538.7,-693242.8,-273193.01,-1451674.1,-1435183.5,-973395.4}; +ST(0.021167753,0.13548502,0,0.023379755,0.12686903,0,0.027746664,0.13122119,0){1816935.7,2047772.9,2296333.1,-1266652.3,-1065433.1,-1399007.9,-2200669.4,-2558991,-2843055.5,600161.11,-162203.53,288094.78,2382629.9,2481221.5,2955532.6}; +ST(0.044666369,0.11545829,0,0.038084092,0.1145524,0,0.042557423,0.10832344,0){3148096.1,2981407.2,3183930.6,-920013.3,-818508.93,-492142.06,-3799301.5,-3575257.7,-3600076,-1769018.1,-1775238,-2551523.2,2547335.8,2287308.3,1442840.6}; +ST(0.021658338,0.054940441,0,0.014691551,0.054118398,0,0.019247887,0.048569646,0){2341024.9,1659245.8,2135187.8,1587273.2,1140472.1,1594654.5,322446.89,265092.56,650408.09,-1046241,-693242.8,-458538.7,-2078353.5,-1435183.5,-1451674.1}; +ST(0.061027247,0.098743066,0,0.065931692,0.10408722,0,0.059543685,0.10776494,0){3173016.6,2911358.9,3132791.5,72008.811,-218409.17,-451048.14,-3099474,-3113407,-3519016.9,-3241975.4,-2661455,-2561357.9,-216202.29,651464.78,1326599.2}; +ST(0,0.22142857,0,0.0051799073,0.21317882,0,0.010546892,0.2198034,0){0,276031.48,514716.79,0,-615227.88,-1201974.2,0,479976.29,1090194.6,0,25450.705,-253690.09,0,-511551.59,-751659.26}; +ST(0,0.12857143,0,0.0072553778,0.13224921,0,0,0.13571429,0){0,674958.82,0,0,-425463.67,0,0,-832230.25,0,0,117822.57,0,0,875622.71,0}; +ST(0.059543685,0.10776494,0,0.05615957,0.1141762,0,0.050721192,0.10961634,0){3132791.5,3147681.4,3257974.6,-451048.14,-840990.83,-583831.78,-3519016.9,-3764018.8,-3737290.3,-2561357.9,-1917372.9,-2483878.9,1326599.2,2358868.4,1698581.7}; +ST(0.043491003,0.26677795,0,0.045592054,0.27439642,0,0.037999827,0.27482627,0){657627.62,513714.39,474219.19,-1894105.9,-1504437.2,-1389905,2903724.9,2387679.2,2209621.2,-3565612.1,-3100344.3,-2876809.4,3800401.2,3591305.7,3345267.4}; +ST(0.075422073,0.20645372,0,0.081656406,0.2108727,0,0.073708403,0.21517194,0){1273700.5,951384.03,1225969.3,-2693470,-2083808.1,-2772471.1,1728669,1528962.6,2271379.1,766631.5,263916.4,-92677.622,-2583646.6,-1843401,-2155133.8}; +ST(0.048663579,0.053435419,0,0.042113175,0.053290167,0,0.046341114,0.044942776,0){3726394.8,3616583.4,3748809.1,2589713.3,2519252.9,2933624.2,663071.82,657513.67,1480431.3,-1465861.1,-1403801.4,-294933.53,-3147918.6,-3039615.4,-2006921.6}; +ST(0.074105201,0.11070107,0,0.076969725,0.10634022,0,0.082583958,0.10907049,0){2359475.3,2181001.1,1698614.9,-471755.94,-255488.75,-286603.09,-2736894.8,-2406546.5,-1936849,-1717960.7,-1869163.7,-1323464.6,1362139.4,756176.24,836522.31}; +ST(0.08812606,0.087328167,0,0.081743274,0.092625466,0,0.079265602,0.086677581,0){1269155.7,1862860,2114636.1,279658.57,243386.47,488789.06,-927894.68,-1587731,-1512904.7,-1412053.3,-2038652.4,-2351470.6,-795447.99,-717394.49,-1382326.1}; +ST(0.079090117,0.19794942,0,0.076430303,0.18837043,0,0.084368038,0.19048099,0){1206859.6,1444535.6,992852.93,-2368529.7,-2574453.4,-1809621.2,1073015.3,569102.25,495817.1,1335740.9,2129625.3,1401810.9,-2359414.1,-2235391.7,-1649308.4}; +ST(0.0071147476,0.24137211,0,0.0069516057,0.23320895,0,0.015758122,0.23699049,0){259907.57,288078.49,597291.98,-684802.64,-728952.19,-1541119.1,859611.54,827497.2,1837947.1,-720499.62,-537397.4,-1363109.4,317972.39,-5267.3055,315646.37}; +ST(0.075872285,0.081656016,0,0.074756101,0.075901522,0,0.082390534,0.079333541,0){2427639,2549479.1,1865676.5,758134.07,1021825.1,650380.91,-1432759.9,-1118145.3,-988603.29,-2638364.3,-2588166.7,-1983689.6,-2029677.1,-2507455.8,-1686881.4}; +ST(0,0.078571429,0,0.0060853536,0.074713803,0,0.0064539684,0.081629255,0){0,681675.12,711139.06,0,285253.65,222377.16,0,-277070.48,-419239.47,0,-678306.76,-772749.89,0,-685312.86,-595288.06}; +ST(0.050960377,0.23252058,0,0.053624899,0.22742186,0,0.056766116,0.23329497,0){1342135.9,1430137,1298096.4,-3383651.2,-3503302.1,-3286228.7,3804738.6,3648370.9,3735031.6,-2403721.7,-1785483,-2434254.7,-148681.88,-1060301.4,-7070.0355}; +ST(0.085714286,0.3,0,0.091323117,0.29067423,0,0.092857143,0.3,0){0,51002.156,0,0,-152526.43,0,0,252617.29,0,0,-350336.87,0,0,444691.33,0}; +ST(0.1,0.014285714,0,0.091308694,0.0093164623,0,0.1,0.0071428571,0){0,1045151,0,0,1035216.9,0,0,1015442.8,0,0,986027.05,0,0,947106.05,0}; +ST(0.056317057,0.058022103,0,0.061015306,0.048529238,0,0.066012722,0.055502179,0){3630316.8,3533367.8,3257272.9,2330872.5,2640342.3,2187557.2,197001.66,1080012.2,399401.17,-2007682.1,-753291.7,-1519988.7,-3494460.7,-2396723.8,-2940625.1}; +ST(0.092857143,0,0,0.091308694,0.0093164623,0,0.085714286,0,0){863626.15,1045151,1683752,863662.39,1035216.9,1683802.7,863732,1015442.8,1683911.1,863838.35,986027.05,1684108.7,863813.95,947106.05,1684003.7}; +ST(0.1,0.29285714,0,0.091323117,0.29067423,0,0.1,0.28571429,0){0,51002.156,0,0,-152526.43,0,0,252617.29,0,0,-350336.87,0,0,444691.33,0}; +ST(0.03928574,0.29335694,0,0.031264826,0.29263185,0,0.036602132,0.28491153,0){127378.94,124484.17,279518.56,-381522.06,-372709.78,-831596.18,633829.06,618717.86,1362985.6,-883092.25,-861054.65,-1860498.2,1127859.7,1098239.8,2311728.5}; +ST(0.038009007,0.015147577,0,0.031710863,0.0075461758,0,0.039686874,0.0066116125,0){3597209.6,3254919.5,3676489.9,3506943.3,3234618.2,3658909.3,3328697.3,3194153.7,3623831.1,3067010.9,3133832.1,3571457.2,2728518.9,3053845.3,3501797.4}; +ST(0.066803853,0.25459223,0,0.071915087,0.24816524,0,0.074279052,0.25633166,0){789541.66,803363.84,635900.39,-2193455.3,-2179152.4,-1777029.4,3110738.9,2928525.2,2553015.8,-3337877,-2836050.6,-2804423.5,2824240.3,1927975,2479429.3}; +ST(0.0071908097,0.26035264,0,0.013885016,0.25805955,0,0.014305262,0.26641769,0){179155.76,357160.64,294901.31,-507033.49,-1003688.5,-848621.76,748779.14,1459712.7,1298521.9,-863311.12,-1638678.7,-1589572.3,830950.48,1506406.6,1686004.5}; +ST(0,0.28571429,0,0.0045473776,0.2936365,0,0,0.29285714,0){0,18406.211,0,0,-55138.333,0,0,91630.552,0,0,-127724.83,0,0,162961.08,0}; +ST(0,0.0071428571,0,0.0045481906,0.0063920675,0,0,0.014285714,0){0,552257.15,0,0,549810.55,0,0,544927.47,0,0,537633.65,0,0,527798.54,0}; +ST(0.084604507,0.15255901,0,0.076625322,0.14929356,0,0.08264437,0.14444108,0){1258841.2,1845555.4,1463951.5,-1326319,-1818255.1,-1293607.4,-1187789.9,-1872475.3,-1614532.1,1390056.3,1790618.2,1105781,1113216.6,1898765.5,1743195.6}; +ST(0.041803352,0.076750149,0,0.047307891,0.081963043,0,0.041002292,0.08644635,0){3453761.9,3516083,3351345,1340279.2,1080946.4,787437.3,-1593440.1,-2102837.3,-2379027.1,-3552303.7,-3830300,-3725698.5,-3337911.6,-2905310.5,-2222336.9}; +ST(0,0.21428571,0,0.0051799073,0.21317882,0,0,0.22142857,0){0,276031.48,0,0,-615227.88,0,0,479976.29,0,0,25450.705,0,0,-511551.59,0}; +ST(0.082390534,0.079333541,0,0.074756101,0.075901522,0,0.080160084,0.071577727,0){1865676.5,2549479.1,2107851.9,650380.91,1021825.1,977984.82,-988603.29,-1118145.3,-676141.96,-1983689.6,-2588166.7,-1967920.1,-1686881.4,-2507455.8,-2205119.3}; +ST(0.065478411,0.24860928,0,0.071915087,0.24816524,0,0.066803853,0.25459223,0){912058.17,803363.84,789541.66,-2478342.9,-2179152.4,-2193455.3,3344041.2,2928525.2,3110738.9,-3264436.9,-2836050.6,-3337877,2261773.6,1927975,2824240.3}; +ST(0.08812606,0.087328167,0,0.079265602,0.086677581,0,0.082390534,0.079333541,0){1269155.7,2114636.1,1865676.5,279658.57,488789.06,650380.91,-927894.68,-1512904.7,-988603.29,-1412053.3,-2351470.6,-1983689.6,-795447.99,-1382326.1,-1686881.4}; +ST(0.064832361,0.062804408,0,0.059054943,0.066788508,0,0.056317057,0.058022103,0){3281120.4,3499189.3,3630316.8,1912310.8,1856149.2,2330872.5,-254314.65,-658492.2,197001.66,-2314932.7,-2864039.1,-2007682.1,-3410309.6,-3725081.1,-3494460.7}; +ST(0.045416206,0.061541227,0,0.047469022,0.070467195,0,0.041057987,0.068843254,0){3642820.9,3608010.8,3488848.8,2181474.8,1730907.5,1752771.3,-155055.51,-1046792,-855539,-2429600.5,-3280034.9,-3038218.5,-3730025.8,-3807136.9,-3709409.4}; +ST(0.081119523,0.0085521597,0,0.078020383,0.017034313,0,0.073684623,0.0112317,0){2167108.8,2461848.1,2850123.3,2149779.2,2383750.6,2810738.2,2115263.6,2230032.5,2732509.2,2063869.7,2005590.6,2616540.6,1995657.9,1717239.5,2464223.2}; +ST(0.073754091,0.28851618,0,0.078222118,0.28277283,0,0.081165886,0.29137431,0){171229.59,220930.92,97729.953,-511212.67,-655625.13,-292395.17,843808.82,1069057.6,484687.71,-1164215.8,-1447830.3,-673055.06,1467609.3,1779434.3,855744.16}; +ST(0.029124573,0.24658198,0,0.025641665,0.25311603,0,0.02133326,0.24577003,0){849052.23,680173.91,675269.21,-2288340.2,-1879847.5,-1813848.4,3030093.5,2635470.4,2383092.9,-2848204.4,-2768550.2,-2204305.3,1797881.3,2247361.6,1333319.6}; +ST(0.02133326,0.24577003,0,0.025641665,0.25311603,0,0.018179834,0.25267212,0){675269.21,680173.91,514543.14,-1813848.4,-1879847.5,-1419813.2,2383092.9,2635470.4,1983439.5,-2204305.3,-2768550.2,-2069793.3,1333319.6,2247361.6,1657747.8}; +ST(0.036912897,0.21765752,0,0.030490983,0.2108424,0,0.038843793,0.21103197,0){1486590.9,1428644.1,1637090.1,-3421295.1,-3128471,-3590120.4,2965983.4,2293671,2645890.8,-438566.7,399562.24,433646.44,-2395869.1,-2769801.9,-3163532.2}; +ST(0.089437553,0.21298247,0,0.091864029,0.22106993,0,0.082942949,0.21818591,0){556322.48,394005.54,823054.75,-1238115.4,-927852.61,-1901094.8,961021.23,863120.02,1667014.3,60411.18,-241435.16,-282341.7,-1035404.3,-536498.87,-1297502.9}; +ST(0.0060732531,0.2674669,0,0.0071908097,0.26035264,0,0.014305262,0.26641769,0){124750.88,179155.76,294901.31,-359918.85,-507033.49,-848621.76,553735.12,748779.14,1298521.9,-683931.42,-863311.12,-1589572.3,735399.5,830950.48,1686004.5}; +ST(0.082583958,0.10907049,0,0.08466046,0.11619385,0,0.077013163,0.11736903,0){1698614.9,1475783,2095773.2,-286603.09,-452604.25,-691227.47,-1936849,-1789662.1,-2559181.5,-1323464.6,-788262.21,-1023961.4,836522.31,1243195.1,1873161.8}; +ST(0.060672554,0.13561545,0,0.068478919,0.13862632,0,0.061244461,0.14481879,0){2778852.8,2426951.1,2643484.5,-1944873,-1850187.5,-2356788.3,-3362653.4,-2866745.3,-2899198.4,935707.85,1169007.7,2042509.4,3643681.7,3144665.9,3121060.9}; +ST(0.037999827,0.27482627,0,0.045044357,0.28188841,0,0.036602132,0.28491153,0){474219.19,362990.51,279518.56,-1389905,-1075960.6,-831596.18,2209621.2,1750378.7,1362985.6,-2876809.4,-2362097.1,-1860498.2,3345267.4,2889034,2311728.5}; +ST(0.014137494,0.034012185,0,0.0063343033,0.038958017,0,0.0058133292,0.032528446,0){1641076.4,751213.74,694559.72,1435142,627892.11,614750.96,1049094.4,401490.67,464300.7,531342.12,109174.99,260495.38,-53364.585,-201236.23,26512.55}; +ST(0.070865224,0.080352924,0,0.072044079,0.08604506,0,0.064352171,0.083117586,0){2808030.6,2688599.4,3167194.8,934415.1,649473.83,915483.69,-1562677.5,-1882262.6,-1987167.2,-3017110.1,-2986497.2,-3477240.4,-2458745.5,-1825996.4,-2495770}; +ST(0.061476805,0.16269562,0,0.067098511,0.16826118,0,0.060825265,0.17090728,0){2391378.9,2121688.2,2288734.2,-3025373.1,-2928224.5,-3282960.5,-1589341.3,-1008555.7,-862639.89,3446908.2,3311710.7,3657845.3,675366.83,-250662.47,-726586.11}; +ST(0.052494391,0.065958781,0,0.047469022,0.070467195,0,0.045416206,0.061541227,0){3640248,3608010.8,3642820.9,1971511.2,1730907.5,2181474.8,-601016.65,-1046792,-155055.51,-2898090,-3280034.9,-2429600.5,-3866942,-3807136.9,-3730025.8}; +ST(0.034786476,0.1076516,0,0.030466665,0.11568191,0,0.025770754,0.10718168,0){2912738.3,2608170,2378738.7,-413135.58,-773675.45,-316264.13,-3267374.9,-3152461.4,-2653040.8,-2390915.6,-1443702.3,-1984140.6,1215377.6,2136967.4,932667.69}; +ST(0.054828578,0.081464579,0,0.058212185,0.089881183,0,0.049739958,0.088394034,0){3492382.6,3344291.6,3472240.4,1101278.5,593905.21,703521.31,-2043909.2,-2645013.4,-2626240.1,-3789901.6,-3708817.1,-3862017.3,-2941538.5,-1722713.3,-2018648.2}; +ST(0.079063451,0.10043005,0,0.069968451,0.098831219,0,0.07492972,0.092844339,0){2051820.1,2730411,2431427.6,-16056.497,57648.531,308451.38,-2067914.3,-2671597.7,-2083891.4,-2035845.1,-2785714.6,-2656803.1,48244.512,-173126.8,-910298.79}; +ST(0.013878694,0.17880836,0,0.020636298,0.17424253,0,0.021251228,0.18136297,0){971566.52,1433869.3,1398279.8,-1548960.4,-2154082.5,-2300353.4,-51095.574,-351921.61,85724.805,1579530,2330929.4,2245163.6,-887966.26,-819073.82,-1534338.6}; +ST(0.085905658,0.016824409,0,0.078020383,0.017034313,0,0.081119523,0.0085521597,0){1656238,2461848.1,2167108.8,1604967.9,2383750.6,2149779.2,1504009.2,2230032.5,2115263.6,1356492.3,2005590.6,2063869.7,1166855,1717239.5,1995657.9}; +ST(0.081165886,0.29137431,0,0.078222118,0.28277283,0,0.08596482,0.28314521,0){97729.953,220930.92,145967.81,-292395.17,-655625.13,-433371.98,484687.71,1069057.6,707326.96,-673055.06,-1447830.3,-959333.22,855744.16,1779434.3,1181452.3}; +ST(0.021167753,0.13548502,0,0.017312959,0.14496605,0,0.012304267,0.13852123,0){1816935.7,1456929,1094693.2,-1266652.3,-1303417.8,-832176.34,-2200669.4,-1594293.7,-1294374.3,600161.11,1135517.7,521821.54,2382629.9,1713822.2,1419655.5}; +ST(0.026018946,0.14387862,0,0.017312959,0.14496605,0,0.021167753,0.13548502,0){2064539,1456929,1816935.7,-1800072.3,-1303417.8,-1266652.3,-2295230.1,-1594293.7,-2200669.4,1506177.8,1135517.7,600161.11,2488196.2,1713822.2,2382629.9}; +ST(0.014137494,0.034012185,0,0.0058133292,0.032528446,0,0.0084994266,0.025462386,0){1641076.4,694559.72,1014895.2,1435142,614750.96,943121.65,1049094.4,464300.7,804669.5,531342.12,260495.38,609367.99,-53364.585,26512.55,370926.59}; +ST(0.0087746229,0.27470702,0,0.0060732531,0.2674669,0,0.014305262,0.26641769,0){139476.7,124750.88,294901.31,-408686.72,-359918.85,-848621.76,649356.33,553735.12,1298521.9,-844695.79,-683931.42,-1589572.3,980930.37,735399.5,1686004.5}; +ST(0.045375723,0.12284566,0,0.040442009,0.11996282,0,0.044666369,0.11545829,0){3072436,2999410,3148096.1,-1348503.3,-1143461.2,-920013.3,-3829159.4,-3706983.7,-3799301.5,-800055.99,-1150363.3,-1769018.1,3380414.3,2995190.5,2547335.8}; +ST(0,0.18571429,0,0.0066871595,0.19241823,0,0,0.19285714,0){0,432113.5,0,0,-803518.34,0,0,258472.73,0,0,581490.34,0,0,-758588.26,0}; +ST(0.038464606,0.12667013,0,0.030575169,0.1246812,0,0.035619257,0.12028764,0){2859316.3,2526238.7,2821397.9,-1476046.2,-1202245.8,-1093830.4,-3573486.5,-3156412.2,-3491178.8,-252868.56,-451924.48,-1043884.2,3451249.3,2919641.1,2851838.9}; +ST(0.025770754,0.10718168,0,0.017861336,0.10270337,0,0.024938414,0.098415267,0){2378738.7,1773538.4,2383058.5,-316264.13,-87655.931,68195.72,-2653040.8,-1856823.6,-2312962.3,-1984140.6,-1677437.3,-2447461.4,932667.69,261812.45,-204726.33}; +ST(0.022740693,0.23189018,0,0.025350652,0.23917347,0,0.015758122,0.23699049,0){887604.04,868665.73,597291.98,-2230116.3,-2265304,-1541119.1,2485475.6,2773502.3,1837947.1,-1529145.6,-2193941.8,-1363109.4,-172982.46,753574.67,315646.37}; +ST(0.032911969,0.081185013,0,0.041803352,0.076750149,0,0.041002292,0.08644635,0){3037931.3,3453761.9,3351345,971274.35,1340279.2,787437.3,-1756226.8,-1593440.1,-2379027.1,-3289165.4,-3552303.7,-3725698.5,-2584916.3,-3337911.6,-2222336.9}; +ST(0.0087746229,0.27470702,0,0.0067236406,0.28198319,0,0,0.27857143,0){139476.7,76627.274,0,-408686.72,-227172.13,0,649356.33,369685.4,0,-844695.79,-499127.77,0,980930.37,610772.43,0}; +ST(0,0.021428571,0,0.006650898,0.018174199,0,0.0084994266,0.025462386,0){0,801243.34,1014895.2,0,772347.91,943121.65,0,715593.27,804669.5,0,633022.27,609367.99,0,527557,370926.59}; +ST(0.013229009,0.21171696,0,0.018343869,0.21720619,0,0.010546892,0.2198034,0){698716.07,888277.19,514716.79,-1540332.8,-2037897.4,-1201974.2,1156621.3,1749211,1090194.6,147278.69,-225952.88,-253690.09,-1334554.8,-1457259.1,-751659.26}; +ST(0.010546892,0.2198034,0,0.018343869,0.21720619,0,0.017207343,0.22323305,0){514716.79,888277.19,781289.63,-1201974.2,-2037897.4,-1865590.4,1090194.6,1749211,1807835.2,-253690.09,-225952.88,-643322.1,-751659.26,-1457259.1,-915362.92}; +ST(0.060432552,0.20227914,0,0.06966854,0.20076802,0,0.066992124,0.20847551,0){1798951.1,1570520.4,1540360.8,-3671781.8,-3162888.4,-3311175.4,2023610.8,1636334.6,2266191.6,1565241.8,1503948.1,706070.36,-3653837,-3161601.9,-3078419.5}; +ST(0.066012722,0.055502179,0,0.073604017,0.054819307,0,0.070754378,0.060222618,0){3257272.9,2744584.6,2932444.5,2187557.2,1864679.8,1804303.3,399401.17,386939.94,-17984.254,-1519988.7,-1214908.7,-1833384.6,-2940625.1,-2427603.9,-2943704.7}; +ST(0.025770754,0.10718168,0,0.023213665,0.1150537,0,0.016927821,0.11108648,0){2378738.7,2130593.3,1644246.3,-316264.13,-605772.32,-340994.5,-2653040.8,-2564157.8,-1914445.6,-1984140.6,-1229375.9,-1176430.8,932667.69,1684092.7,981584.41}; +ST(0.024008584,0.022367291,0,0.016759526,0.025876157,0,0.015416139,0.018002698,0){2639060.6,1932221.9,1798828.3,2494948.4,1791225.7,1735136,2214593.6,1519509.7,1609995.5,1813324.4,1136895.1,1427830.3,1312931.3,671081.1,1194733.1}; +ST(0.076938259,0.060604721,0,0.079822506,0.065677674,0,0.072323403,0.067507008,0){2443533.2,2163855.5,2781512.1,1491930.8,1180001.4,1448400.9,-40674.57,-340376.77,-578922.09,-1557435.8,-1706002.2,-2328912.3,-2468002.6,-2296197.5,-2963263.7}; +ST(0.015498485,0.28248556,0,0.018422519,0.27450763,0,0.023483408,0.28013687,0){166274.63,282501.19,270985.88,-493262.57,-827496.14,-801278.39,803759.61,1313896,1297043.7,-1087394.1,-1707268.8,-1736920.8,1334475.8,1979556.1,2101746.5}; +ST(0.047556344,0.24377674,0,0.043027686,0.24899973,0,0.040431855,0.24188745,0){1122639.4,999522.33,1110505,-2989881.7,-2720190.5,-2932804,3850350.4,3683283.3,3702149.5,-3414324.1,-3620573.8,-3142324.5,1828478.4,2549278.8,1453973.2}; +ST(0.092295863,0.26000779,0,0.083190767,0.25723975,0,0.090077759,0.25268961,0){193329.27,434158.6,291813.61,-546576.12,-1216864.4,-805257.31,805368.84,1759626.8,1125037.4,-924990.4,-1955417.3,-1174248.1,884724.5,1765235.2,940920.06}; +ST(0.085115353,0.26563346,0,0.083190767,0.25723975,0,0.092295863,0.26000779,0){313056.52,434158.6,193329.27,-899063.8,-1216864.4,-546576.12,1369900.4,1759626.8,805368.84,-1665255.4,-1955417.3,-924990.4,1747205.8,1765235.2,884724.5}; +ST(0.08974924,0.047235181,0,0.082493405,0.042375289,0,0.092141527,0.03991184,0){1190814.4,1978611.8,927649.93,905328.07,1595319.9,767955.56,402804.56,902966.17,476054.53,-196265.4,35643.43,102192.68,-748421.11,-838916.97,-289378.9}; +ST(0.092141527,0.03991184,0,0.082493405,0.042375289,0,0.084917502,0.034253561,0){927649.93,1978611.8,1742331.8,767955.56,1595319.9,1520580.8,476054.53,902966.17,1105294,102192.68,35643.43,549324.68,-289378.9,-838916.97,-76880.401}; +ST(0.04704595,0.16277363,0,0.042155309,0.15589067,0,0.050010485,0.1548865,0){2543508.6,2577776.2,2672912.2,-3221973.5,-2895603.6,-2946373.7,-1684138.2,-2220826.4,-2371553.9,3671419.3,3169529.7,3189127.5,704902.67,1830012,2045305.7}; +ST(0.04704595,0.16277363,0,0.054395265,0.16699477,0,0.048076401,0.17082416,0){2543508.6,2465605.5,2424680.5,-3221973.5,-3338618.7,-3473815.1,-1684138.2,-1283530.8,-921629.25,3671419.3,3793219.5,3872759.5,704902.67,-59660.123,-754316.94}; +ST(0.046341114,0.044942776,0,0.03663522,0.040674234,0,0.043838979,0.034579424,0){3748809.1,3463485.9,3745913.7,2933624.2,2844620.6,3260141.4,1480431.3,1717431.6,2351583.2,-294933.53,283267.24,1138042.7,-2006921.6,-1201989.6,-223347.31}; +ST(0.038515413,0.047952704,0,0.03663522,0.040674234,0,0.046341114,0.044942776,0){3516906.1,3463485.9,3748809.1,2648581.9,2844620.6,2933624.2,1126309.3,1717431.6,1480431.3,-674068.75,283267.24,-294933.53,-2308227.3,-1201989.6,-2006921.6}; +ST(0.043491003,0.26677795,0,0.037705658,0.25939989,0,0.04563604,0.25694979,0){657627.62,758443.36,859240.08,-1894105.9,-2140288.6,-2406042.8,2903724.9,3141072.6,3472131.8,-3565612.1,-3582615.2,-3844488.4,3800401.2,3385872.9,3448330.3}; +ST(0.04563604,0.25694979,0,0.037705658,0.25939989,0,0.039157325,0.25334591,0){859240.08,758443.36,884627.38,-2406042.8,-2140288.6,-2446896,3472131.8,3141072.6,3436661.2,-3844488.4,-3582615.2,-3622356.9,3448330.3,3385872.9,2960330.2}; +ST(0.077069107,0.15686929,0,0.076625322,0.14929356,0,0.084604507,0.15255901,0){1743907.9,1845555.4,1258841.2,-1994600,-1818255.1,-1326319,-1457243.4,-1872475.3,-1187789.9,2204191.1,1790618.2,1390056.3,1140253.2,1898765.5,1113216.6}; +ST(0.07180958,0.22984275,0,0.076796159,0.2234596,0,0.078984823,0.22953004,0){1079159.6,1008421.8,858343.29,-2680718.2,-2411357.4,-2128428.8,2899261.6,2346331.8,2291087.1,-1622013.4,-852928.84,-1261656.1,-492395.98,-1160000.7,-424553.92}; +ST(0.048076401,0.17082416,0,0.042242048,0.16806859,0,0.04704595,0.16277363,0){2424680.5,2399442.3,2543508.6,-3473815.1,-3302042.1,-3221973.5,-921629.25,-1157324.9,-1684138.2,3872759.5,3737475.6,3671419.3,-754316.94,-248746.29,704902.67}; +ST(0.043027686,0.24899973,0,0.036308441,0.24745658,0,0.040431855,0.24188745,0){999522.33,958174.94,1110505,-2720190.5,-2591684.5,-2932804,3683283.3,3460190.4,3702149.5,-3620573.8,-3307339.6,-3142324.5,2549278.8,2177878.8,1453973.2}; +ST(0.026270926,0.075674812,0,0.025411973,0.082310594,0,0.019499739,0.079597209,0){2630439.6,2525130.6,2040354.6,1063205.3,762374.09,702945.71,-1137545.6,-1532614.6,-1095289.5,-2660659.2,-2757779.1,-2175701.2,-2599027.8,-2058136.4,-1830384.7}; +ST(0.073708403,0.21517194,0,0.069002793,0.22246209,0,0.063265205,0.21633109,0){1225969.3,1267491.2,1505335.5,-2772471.1,-3011719.2,-3432481.9,2271379.1,2877058.6,2888962.8,-92677.622,-947533.34,-265885.87,-2155133.8,-1573376.1,-2549234.8}; +ST(0.082390534,0.079333541,0,0.091953893,0.078440357,0,0.08812606,0.087328167,0){1865676.5,889726.23,1269155.7,650380.91,322434.75,279658.57,-988603.29,-450550.32,-927894.68,-1983689.6,-936443.15,-1412053.3,-1686881.4,-825354.72,-795447.99}; +ST(0.1,0.085714286,0,0.091953893,0.078440357,0,0.1,0.078571429,0){0,889726.23,0,0,322434.75,0,0,-450550.32,0,0,-936443.15,0,0,-825354.72,0}; +ST(0.061631884,0.26868773,0,0.06660802,0.27624666,0,0.059078636,0.27701937,0){591535.29,417349.44,447007.97,-1711593.4,-1226359.7,-1315269.1,2649353.2,1959900.4,2107766.2,-3304968.8,-2572844.1,-2778864.5,3608394.3,3027289.2,3289755.3}; +ST(0.014137494,0.034012185,0,0.017433092,0.042090914,0,0.011573719,0.041901165,0){1641076.4,1971771.3,1347025.1,1435142,1594855,1091815.8,1049094.4,913057.13,629744.45,531342.12,56690.05,48353.226,-53364.585,-810753.02,-542301.86}; +ST(0.1,0.24285714,0,0.092168655,0.23668616,0,0.1,0.23571429,0){0,307607.26,0,0,-792496.69,0,0,941630.33,0,0,-691810.02,0,0,148523.72,0}; +ST(0.0072553778,0.13224921,0,0.0054758376,0.13911323,0,0,0.13571429,0){674958.82,495708.7,0,-425463.67,-382921.42,0,-832230.25,-582869.54,0,117822.57,250325.59,0,875622.71,639819.51,0}; +ST(0.015758122,0.23699049,0,0.025350652,0.23917347,0,0.02133326,0.24577003,0){597291.98,868665.73,675269.21,-1541119.1,-2265304,-1813848.4,1837947.1,2773502.3,2383092.9,-1363109.4,-2193941.8,-2204305.3,315646.37,753574.67,1333319.6}; +ST(0.039157325,0.25334591,0,0.036308441,0.24745658,0,0.043027686,0.24899973,0){884627.38,958174.94,999522.33,-2446896,-2591684.5,-2720190.5,3436661.2,3460190.4,3683283.3,-3622356.9,-3307339.6,-3620573.8,2960330.2,2177878.8,2549278.8}; +ST(0.076158908,0.12549637,0,0.070840483,0.12204614,0,0.077013163,0.11736903,0){2092101.1,2470738.2,2095773.2,-1030118.9,-1044803.2,-691227.47,-2615047.7,-3073782.1,-2559181.5,-297340.89,-729197.53,-1023961.4,2464056,2652961,1873161.8}; +ST(0.041402067,0.22952626,0,0.037546984,0.23452457,0,0.034969012,0.22634925,0){1348916.4,1205921.7,1299939.6,-3344816,-3072707.6,-3164156.1,3600200.4,3550700.1,3237729.2,-1982154,-2423829.8,-1478956,-667743.82,201013.93,-1117524.9}; +ST(0.017207343,0.22323305,0,0.012706169,0.22573828,0,0.010546892,0.2198034,0){781289.63,571782.3,514716.79,-1865590.4,-1386624.6,-1201974.2,1807835.2,1404300.2,1090194.6,-643322.1,-614658.98,-253690.09,-915362.92,-528535.98,-751659.26}; +ST(0.01788586,0.12850833,0,0.023379755,0.12686903,0,0.021167753,0.13548502,0){1616906.9,2047772.9,1816935.7,-895214.81,-1065433.1,-1266652.3,-2016472.2,-2558991,-2200669.4,-4802.2192,-162203.53,600161.11,2014144.7,2481221.5,2382629.9}; +ST(0.042433189,0.024814669,0,0.048866761,0.029559705,0,0.043838979,0.034579424,0){3739739.8,3831772.8,3745913.7,3488658.7,3467532.3,3260141.4,3003356.3,2773676.3,2351583.2,2316430.4,1816186,1138042.7,1473602,685852.4,-223347.31}; +ST(0.051167355,0.022914381,0,0.048866761,0.029559705,0,0.042433189,0.024814669,0){3850137.8,3831772.8,3739739.8,3629520.4,3467532.3,3488658.7,3200919.1,2773676.3,3003356.3,2588908.3,1816186,2316430.4,1828396.4,685852.4,1473602}; +ST(0.092195724,0.16853594,0,0.093710586,0.16080643,0,0.1,0.16428571,0){598378.34,507346.27,0,-829189.07,-621948.04,0,-278570.16,-366919.85,0,936666.51,704920.6,0,-82641.6,207593.47,0}; +ST(0.040431855,0.24188745,0,0.045331711,0.23557633,0,0.047556344,0.24377674,0){1110505,1270563.3,1122639.4,-2932804,-3255008.9,-2989881.7,3702149.5,3813331,3850350.4,-3142324.5,-2700862,-3414324.1,1453973.2,404484.48,1828478.4}; +ST(0.01180171,0.25230222,0,0.013821768,0.24617185,0,0.018179834,0.25267212,0){347512.04,454053.45,514543.14,-957611.77,-1221678.8,-1419813.2,1333704.3,1611329.8,1983439.5,-1383899.6,-1502439.1,-2069793.3,1095718.6,928515.88,1657747.8}; +ST(0.073234584,0.04253025,0,0.067616069,0.037109229,0,0.075978544,0.034466341,0){2820532.7,3239242.7,2615244.9,2270240.9,2756202.5,2278283.7,1277003.9,1862139.4,1647758.2,34586.382,690369.93,804880.96,-1214797.7,-584563.48,-142067.87}; +ST(0.076498673,0.26519709,0,0.068237016,0.26229006,0,0.074279052,0.25633166,0){473307.48,639705.29,635900.39,-1357765.2,-1820649,-1777029.4,2063933,2721368.6,2553015.8,-2499100.3,-3203243.1,-2804423.5,2605934.6,3191912.1,2479429.3}; +ST(0.072323403,0.067507008,0,0.070754378,0.060222618,0,0.076938259,0.060604721,0){2781512.1,2932444.5,2443533.2,1448400.9,1804303.3,1491930.8,-578922.09,-17984.254,-40674.57,-2328912.3,-1833384.6,-1557435.8,-2963263.7,-2943704.7,-2468002.6}; +ST(0.021167753,0.13548502,0,0.030046638,0.13690443,0,0.026018946,0.14387862,0){1816935.7,2369378.2,2064539,-1266652.3,-1721516.8,-1800072.3,-2200669.4,-2840145.3,-2295230.1,600161.11,944948.24,1506177.8,2382629.9,3098367.4,2488196.2}; +ST(0.049721881,0.27094787,0,0.045592054,0.27439642,0,0.043491003,0.26677795,0){588018.61,513714.39,657627.62,-1710042.9,-1504437.2,-1894105.9,2675009.8,2387679.2,2903724.9,-3394309,-3100344.3,-3565612.1,3801713.7,3591305.7,3800401.2}; +ST(0.076271482,0.13373081,0,0.076158908,0.12549637,0,0.082709707,0.12855445,0){2012844.4,2092101.1,1568327.1,-1330317.6,-1030118.9,-869760.99,-2463975.8,-2615047.7,-1955764.1,494859.01,-297340.89,-1353.9511,2631758.9,2464056,1955094.7}; +ST(0.090077759,0.25268961,0,0.085145188,0.25032735,0,0.089949388,0.2453858,0){291813.61,448997.25,339950.36,-805257.31,-1228228.7,-911669.73,1125037.4,1682589.8,1193275.4,-1174248.1,-1691886.1,-1095139.7,940920.06,1253443,648419.14}; +ST(0.08944657,0.05485846,0,0.083998423,0.049627851,0,0.08974924,0.047235181,0){1211526.2,1806853.8,1190814.4,822600.19,1329741.5,905328.07,169573.91,501474.01,402804.56,-537958.1,-459273.5,-196265.4,-1073022.7,-1299103.8,-748421.11}; +ST(0.041643161,0.17482395,0,0.042242048,0.16806859,0,0.048076401,0.17082416,0){2284160.6,2399442.3,2424680.5,-3458410.7,-3302042.1,-3473815.1,-506290.81,-1157324.9,-921629.25,3718851.8,3737475.6,3872759.5,-1405815.9,-248746.29,-754316.94}; +ST(0.038009007,0.015147577,0,0.046063037,0.016810165,0,0.042433189,0.024814669,0){3597209.6,3836060.2,3739739.8,3506943.3,3717529.2,3488658.7,3328697.3,3484126.2,3003356.3,3067010.9,3143090.2,2316430.4,2728518.9,2704667.4,1473602}; +ST(0.037999827,0.27482627,0,0.030312881,0.27848596,0,0.029991713,0.27132489,0){474219.19,355416.48,469504.82,-1389905,-1048284.8,-1366503,2209621.2,1688178.9,2141236.7,-2876809.4,-2242771,-2724385.3,3345267.4,2683885.3,3063642.3}; +ST(0.074931673,0.27468874,0,0.069536278,0.26943087,0,0.076498673,0.26519709,0){363389.18,505602.11,473307.48,-1064791.9,-1465439,-1357765.2,1691857.9,2276404,2063933,-2200836.4,-2856108.7,-2499100.3,2556129.1,3145421.5,2605934.6}; +ST(0.075978544,0.034466341,0,0.068707287,0.030314019,0,0.074388951,0.025102472,0){2615244.9,3188897.7,2772012.4,2278283.7,2870259.7,2581574.2,1647758.2,2264806.3,2213781,804880.96,1433032.7,1693914.7,-142067.87,457746.25,1057277.9}; +ST(0.021251228,0.18136297,0,0.016878531,0.18478654,0,0.013878694,0.17880836,0){1398279.8,1113458.1,971566.52,-2300353.4,-1906862.4,-1548960.4,85724.805,245299.96,-51095.574,2245163.6,1732097.5,1579530,-1534338.6,-1479759.2,-887966.26}; +ST(0.076498673,0.26519709,0,0.081004963,0.27070547,0,0.074931673,0.27468874,0){473307.48,333174.81,363389.18,-1357765.2,-968418.7,-1064791.9,2063933,1513258.3,1691857.9,-2499100.3,-1916833.2,-2200836.4,2605934.6,2141327.9,2556129.1}; +ST(0.085115353,0.26563346,0,0.081004963,0.27070547,0,0.076498673,0.26519709,0){313056.52,333174.81,473307.48,-899063.8,-968418.7,-1357765.2,1369900.4,1513258.3,2063933,-1665255.4,-1916833.2,-2499100.3,1747205.8,2141327.9,2605934.6}; +ST(0.075978544,0.034466341,0,0.080699945,0.029142305,0,0.084917502,0.034253561,0){2615244.9,2185639.9,1742331.8,2278283.7,1983669.2,1520580.8,1647758.2,1598386.1,1105294,804880.96,1065401.8,549324.68,-142067.87,433818.71,-76880.401}; +ST(0.074388951,0.025102472,0,0.080699945,0.029142305,0,0.075978544,0.034466341,0){2772012.4,2185639.9,2615244.9,2581574.2,1983669.2,2278283.7,2213781,1598386.1,1647758.2,1693914.7,1065401.8,804880.96,1057277.9,433818.71,-142067.87}; +ST(0.058552205,0.15400025,0,0.05288218,0.14757716,0,0.061244461,0.14481879,0){2589572.8,2767228.4,2643484.5,-2806487.5,-2626819.9,-2356788.3,-2354581.2,-2900596.1,-2899198.4,3003966,2479722.6,2042509.4,2103059.1,3026446,3121060.9}; +ST(0.050010485,0.1548865,0,0.05288218,0.14757716,0,0.058552205,0.15400025,0){2672912.2,2767228.4,2589572.8,-2946373.7,-2626819.9,-2806487.5,-2371553.9,-2900596.1,-2354581.2,3189127.5,2479722.6,3003966,2045305.7,3026446,2103059.1}; +ST(0.089230742,0.11966768,0,0.08466046,0.11619385,0,0.091758141,0.11296708,0){1043332.5,1475783,824791.32,-391602.7,-452604.25,-201020.76,-1287980.7,-1789662.1,-976886.6,-412950.99,-788262.21,-537824.26,1030099.2,1243195.1,570097.26}; +ST(0.0078195435,0.14622426,0,0.017312959,0.14496605,0,0.013794295,0.15422926,0){680366.1,1456929,1126466.2,-626541.18,-1303417.8,-1226232.2,-729870.69,-1594293.7,-1017954.8,568744.13,1135517.7,1316565.7,774663.29,1713822.2,901352.54}; +ST(0.012304267,0.13852123,0,0.017312959,0.14496605,0,0.0078195435,0.14622426,0){1094693.2,1456929,680366.1,-832176.34,-1303417.8,-626541.18,-1294374.3,-1594293.7,-729870.69,521821.54,1135517.7,568744.13,1419655.5,1713822.2,774663.29}; +ST(0.066401409,0.0434645,0,0.067616069,0.037109229,0,0.073234584,0.04253025,0){3289675.8,3239242.7,2820532.7,2619840.6,2756202.5,2270240.9,1416557.6,1862139.4,1277003.9,-75156.319,690369.93,34586.382,-1551772,-584563.48,-1214797.7}; +ST(0.074279052,0.25633166,0,0.068237016,0.26229006,0,0.066803853,0.25459223,0){635900.39,639705.29,789541.66,-1777029.4,-1820649,-2193455.3,2553015.8,2721368.6,3110738.9,-2804423.5,-3203243.1,-3337877,2479429.3,3191912.1,2824240.3}; +ST(0.064352171,0.083117586,0,0.066925078,0.074981916,0,0.070865224,0.080352924,0){3167194.8,3090390.8,2808030.6,915483.69,1280900.5,934415.1,-1987167.2,-1278621.5,-1562677.5,-3477240.4,-3089611.2,-3017110.1,-2495770,-3091904.4,-2458745.5}; +ST(0.069536278,0.26943087,0,0.06660802,0.27624666,0,0.061631884,0.26868773,0){505602.11,417349.44,591535.29,-1465439,-1226359.7,-1711593.4,2276404,1959900.4,2649353.2,-2856108.7,-2572844.1,-3304968.8,3145421.5,3027289.2,3608394.3}; +ST(0.056317057,0.058022103,0,0.053426379,0.049768916,0,0.061015306,0.048529238,0){3630316.8,3727873.1,3533367.8,2330872.5,2738031.5,2640342.3,197001.66,1021148,1080012.2,-2007682.1,-966926.63,-753291.7,-3494460.7,-2698501,-2396723.8}; +ST(0.064276416,0.12183086,0,0.059246105,0.12763558,0,0.057323957,0.1204315,0){2809128.6,2918223.5,3051716.5,-1175750.5,-1563762.3,-1191883,-3492840.6,-3644117.3,-3778168.4,-855220.15,-127593.52,-1110713.1,2995580.4,3585046,3101303}; +ST(0.011838853,0.2301677,0,0.016939848,0.22904958,0,0.015758122,0.23699049,0){504229.49,714788.59,597291.98,-1254859.2,-1767596.2,-1541119.1,1363834.1,1888698.3,1837947.1,-775392.51,-1014237.8,-1363109.4,-209768.04,-395054.79,315646.37}; +ST(0.046341114,0.044942776,0,0.042113175,0.053290167,0,0.038515413,0.047952704,0){3748809.1,3616583.4,3516906.1,2933624.2,2519252.9,2648581.9,1480431.3,657513.67,1126309.3,-294933.53,-1403801.4,-674068.75,-2006921.6,-3039615.4,-2308227.3}; +ST(0.042433189,0.024814669,0,0.033039341,0.023173825,0,0.038009007,0.015147577,0){3739739.8,3318087.9,3597209.6,3488658.7,3123656.1,3506943.3,3003356.3,2746181,3328697.3,2316430.4,2207795.9,3067010.9,1473602,1539940.3,2728518.9}; +ST(0.050010485,0.1548865,0,0.054296142,0.16027015,0,0.04704595,0.16277363,0){2672912.2,2568973.7,2543508.6,-2946373.7,-3120486,-3221973.5,-2371553.9,-1899085.7,-1684138.2,3189127.5,3528266.9,3671419.3,2045305.7,1141594.9,704902.67}; +ST(0.089949388,0.2453858,0,0.085145188,0.25032735,0,0.083292987,0.24598228,0){339950.36,448997.25,542685.82,-911669.73,-1228228.7,-1458992.1,1193275.4,1682589.8,1920780.7,-1095139.7,-1691886.1,-1784182,648419.14,1253443,1091638.2}; +ST(0.080938662,0.054906318,0,0.083998423,0.049627851,0,0.08944657,0.05485846,0){2097661.4,1806853.8,1211526.2,1423084,1329741.5,822600.19,290856.94,501474.01,169573.91,-934922.56,-459273.5,-537958.1,-1860365.1,-1299103.8,-1073022.7}; +ST(0.021957304,0.26060316,0,0.025641665,0.25311603,0,0.030217898,0.25971254,0){505833.44,680173.91,660621.26,-1432636.8,-1879847.5,-1866014.4,2119105.6,2635470.4,2744196,-2450095.8,-2768550.2,-3141188.1,2369995.8,2247361.6,2987009.7}; +ST(0.018179834,0.25267212,0,0.025641665,0.25311603,0,0.021957304,0.26060316,0){514543.14,680173.91,505833.44,-1419813.2,-1879847.5,-1432636.8,1983439.5,2635470.4,2119105.6,-2069793.3,-2768550.2,-2450095.8,1657747.8,2247361.6,2369995.8}; +ST(0.080160084,0.071577727,0,0.086276325,0.073599227,0,0.082390534,0.079333541,0){2107851.9,1502743.3,1865676.5,977984.82,653401.45,650380.91,-676141.96,-565297.67,-988603.29,-1967920.1,-1464602.7,-1983689.6,-2205119.3,-1536324.4,-1686881.4}; +ST(0.059246105,0.12763558,0,0.052058531,0.12554764,0,0.057323957,0.1204315,0){2918223.5,3065498.6,3051716.5,-1563762.3,-1512626.5,-1191883,-3644117.3,-3831818,-3778168.4,-127593.52,-428428.64,-1110713.1,3585046,3614977.4,3101303}; +ST(0.0910478,0.13167545,0,0.093938974,0.13899,0,0.087083587,0.13880919,0){831136.87,548364.78,1144744.3,-514132.23,-422206.84,-877072.07,-1027305.8,-645591.08,-1349889.8,122313.64,273728.87,561444.4,1073956.7,708600.91,1481228.8}; +ST(0.026270926,0.075674812,0,0.033874053,0.071548869,0,0.032911969,0.081185013,0){2630439.6,3157862.8,3037931.3,1063205.3,1466537.3,971274.35,-1137545.6,-1010259.7,-1756226.8,-2660659.2,-2946084.6,-3289165.4,-2599027.8,-3304540.6,-2584916.3}; +ST(0.033874053,0.071548869,0,0.027058874,0.069011929,0,0.031105381,0.06529626,0){3157862.8,2727323.5,3030579.1,1466537.3,1363815.9,1667989.8,-1010259.7,-681543.48,-444570.51,-2946084.6,-2386220.5,-2357289.6,-3304540.6,-2898415.6,-3210321.2}; +ST(0.1,0.17142857,0,0.092195724,0.16853594,0,0.1,0.16428571,0){0,598378.34,0,0,-829189.07,0,0,-278570.16,0,0,936666.51,0,0,-82641.6,0}; +ST(0.016927821,0.11108648,0,0.023213665,0.1150537,0,0.017763535,0.12074209,0){1644246.3,2130593.3,1657769.5,-340994.5,-605772.32,-657738.05,-1914445.6,-2564157.8,-2054600.3,-1176430.8,-1229375.9,-581651.26,981584.41,1684092.7,1703675.4}; +ST(0.085369203,0.17624497,0,0.082729031,0.18391978,0,0.077619244,0.18028791,0){1039089.6,1144258.1,1471797.4,-1603144.1,-1940160.8,-2389894.4,-168940.91,205244.05,18944.546,1695116.9,1797438.3,2378251.6,-751642.95,-1455642.1,-1502642.9}; +ST(0.060825265,0.17090728,0,0.054692531,0.17439284,0,0.054395265,0.16699477,0){2288734.2,2346407.8,2465605.5,-3282960.5,-3532168.6,-3338618.7,-862639.89,-561454.61,-1283530.8,3657845.3,3816051.1,3793219.5,-726586.11,-1367177.6,-59660.123}; +ST(0.047385855,0.10193045,0,0.054240748,0.10280037,0,0.050721192,0.10961634,0){3329666.7,3302360.6,3257974.6,-117239.93,-169115.68,-583831.78,-3442848.4,-3462856.5,-3737290.3,-3204510.9,-3116478.2,-2483878.9,350991.89,505791.56,1698581.7}; +ST(0.018179834,0.25267212,0,0.013821768,0.24617185,0,0.02133326,0.24577003,0){514543.14,454053.45,675269.21,-1419813.2,-1221678.8,-1813848.4,1983439.5,1611329.8,2383092.9,-2069793.3,-1502439.1,-2204305.3,1657747.8,928515.88,1333319.6}; +ST(0.1,0.22142857,0,0.091864029,0.22106993,0,0.1,0.21428571,0){0,394005.54,0,0,-927852.61,0,0,863120.02,0,0,-241435.16,0,0,-536498.87,0}; +ST(0.038427921,0.16264679,0,0.042155309,0.15589067,0,0.04704595,0.16277363,0){2389351.9,2577776.2,2543508.6,-3020403.6,-2895603.6,-3221973.5,-1591681.4,-2220826.4,-1684138.2,3440909.6,3169529.7,3671419.3,682723.32,1830012,704902.67}; +ST(0.091323117,0.29067423,0,0.081165886,0.29137431,0,0.08596482,0.28314521,0){51002.156,97729.953,145967.81,-152526.43,-292395.17,-433371.98,252617.29,484687.71,707326.96,-350336.87,-673055.06,-959333.22,444691.33,855744.16,1181452.3}; +ST(0.085905658,0.016824409,0,0.081119523,0.0085521597,0,0.091308694,0.0093164623,0){1656238,2167108.8,1045151,1604967.9,2149779.2,1035216.9,1504009.2,2115263.6,1015442.8,1356492.3,2063869.7,986027.05,1166855,1995657.9,947106.05}; +ST(0.069025318,0.11622387,0,0.074105201,0.11070107,0,0.077013163,0.11736903,0){2631986.5,2359475.3,2095773.2,-808686.45,-471755.94,-691227.47,-3192250.9,-2736894.8,-2559181.5,-1402768.4,-1717960.7,-1023961.4,2220554.1,1362139.4,1873161.8}; +ST(0.043569257,0.19619451,0,0.036160627,0.1953007,0,0.039366597,0.19088868,0){1966078.6,1834250.2,1982365.2,-3794921.6,-3509998.2,-3628592.6,1563901,1372423.7,1030950.1,2340412.7,2256297.6,2772526.5,-3741435.4,-3434247.7,-3333638.5}; +ST(0.048791783,0.28884593,0,0.051519181,0.28417908,0,0.055764419,0.28986395,0){226341.07,320732.11,202473.1,-675936.71,-953415.16,-605163.67,1116322.7,1560004.1,1001119.7,-1541505,-2123899.5,-1385941.2,1945474.1,2629434.9,1755276.4}; +ST(0.1,0.092857143,0,0.093922759,0.092262381,0,0.1,0.085714286,0){0,652083.63,0,0,89312.894,0,0,-550573,0,0,-715327.2,0,0,-262838.8,0}; +ST(0.049232245,0.21047418,0,0.053910411,0.21448753,0,0.045116599,0.21481108,0){1752658.6,1667429.4,1654487.5,-3827070.5,-3752161.8,-3731787.4,2777012.8,3023771,3030991.5,540242.46,-28239.212,-73694.316,-3416565.4,-2988983.1,-2938909.4}; +ST(0.082493405,0.042375289,0,0.073234584,0.04253025,0,0.075978544,0.034466341,0){1978611.8,2820532.7,2615244.9,1595319.9,2270240.9,2278283.7,902966.17,1277003.9,1647758.2,35643.43,34586.382,804880.96,-838916.97,-1214797.7,-142067.87}; +ST(0.076498673,0.26519709,0,0.074279052,0.25633166,0,0.083190767,0.25723975,0){473307.48,635900.39,434158.6,-1357765.2,-1777029.4,-1216864.4,2063933,2553015.8,1759626.8,-2499100.3,-2804423.5,-1955417.3,2605934.6,2479429.3,1765235.2}; +ST(0.056199026,0.010061392,0,0.06203594,0.0060944193,0,0.064075209,0.013493001,0){3801979,3604620.2,3498581.2,3759859.9,3589956.2,3428890.3,3676084,3560685.5,3290906.4,3551608.2,3516960.1,3087427.7,3387596.5,3458793.9,2822154}; +ST(0.061476805,0.16269562,0,0.054296142,0.16027015,0,0.058552205,0.15400025,0){2391378.9,2568973.7,2589572.8,-3025373.1,-3120486,-2806487.5,-1589341.3,-1899085.7,-2354581.2,3446908.2,3528266.9,3003966,675366.83,1141594.9,2103059.1}; +ST(0.063469548,0.28521738,0,0.061805884,0.29356168,0,0.055764419,0.28986395,0){273598.49,121923.05,202473.1,-814255.31,-365207.83,-605163.67,1335465.2,606815.62,1001119.7,-1824812,-845641.09,-1385941.2,2270429.1,1080583.1,1755276.4}; +ST(0.08812606,0.087328167,0,0.093922759,0.092262381,0,0.087331535,0.0958472,0){1269155.7,652083.63,1318484.3,279658.57,89312.894,98077.228,-927894.68,-550573,-1213131.9,-1412053.3,-715327.2,-1401481.2,-795447.99,-262838.8,-292629.72}; +ST(0.06961584,0.048915995,0,0.073604017,0.054819307,0,0.066012722,0.055502179,0){3063466,2744584.6,3257272.9,2277085.6,1864679.8,2187557.2,906160.93,386939.94,399401.17,-697426.19,-1214908.7,-1519988.7,-2122325.6,-2427603.9,-2940625.1}; +ST(0.082942949,0.21818591,0,0.076796159,0.2234596,0,0.073708403,0.21517194,0){823054.75,1008421.8,1225969.3,-1901094.8,-2411357.4,-2772471.1,1667014.3,2346331.8,2271379.1,-282341.7,-852928.84,-92677.622,-1297502.9,-1160000.7,-2155133.8}; +ST(0.1,0.064285714,0,0.09230899,0.063522919,0,0.1,0.057142857,0){0,877619.52,0,0,503392.8,0,0,-85524.836,0,0,-638068.15,0,0,-918939.46,0}; +ST(0.067728608,0.12931058,0,0.076158908,0.12549637,0,0.076271482,0.13373081,0){2567539,2092101.1,2012844.4,-1463631.5,-1030118.9,-1330317.6,-3196956.5,-2615047.7,-2463975.8,89062.443,-297340.89,494859.01,3235608.2,2464056,2631758.9}; +ST(0.037999827,0.27482627,0,0.034582704,0.26623209,0,0.043491003,0.26677795,0){474219.19,604041.77,657627.62,-1389905,-1737386.1,-1894105.9,2209621.2,2655775,2903724.9,-2876809.4,-3245580.1,-3565612.1,3345267.4,3433603.3,3800401.2}; +ST(0.029991713,0.27132489,0,0.034582704,0.26623209,0,0.037999827,0.27482627,0){469504.82,604041.77,474219.19,-1366503,-1737386.1,-1389905,2141236.7,2655775,2209621.2,-2724385.3,-3245580.1,-2876809.4,3063642.3,3433603.3,3345267.4}; +ST(0.082516133,0.27647665,0,0.078222118,0.28277283,0,0.074931673,0.27468874,0){248899.48,220930.92,363389.18,-731674.12,-655625.13,-1064791.9,1170289.2,1069057.6,1691857.9,-1538273.3,-1447830.3,-2200836.4,1813237.5,1779434.3,2556129.1}; +ST(0.074388951,0.025102472,0,0.078020383,0.017034313,0,0.082332164,0.023444943,0){2772012.4,2461848.1,2029600,2581574.2,2383750.6,1907886.4,2213781,2230032.5,1671751.1,1693914.7,2005590.6,1335359.8,1057277.9,1717239.5,918760.81}; +ST(0.050721192,0.10961634,0,0.042557423,0.10832344,0,0.047385855,0.10193045,0){3257974.6,3183930.6,3329666.7,-583831.78,-492142.06,-117239.93,-3737290.3,-3600076,-3442848.4,-2483878.9,-2551523.2,-3204510.9,1698581.7,1442840.6,350991.89}; +ST(0.015416139,0.018002698,0,0.022427218,0.014872357,0,0.024008584,0.022367291,0){1798828.3,2505875.7,2639060.6,1735136,2445229.8,2494948.4,1609995.5,2325397.7,2214593.6,1427830.3,2149288.4,1813324.4,1194733.1,1920956.8,1312931.3}; +ST(0.023483408,0.28013687,0,0.0220603,0.28602893,0,0.015498485,0.28248556,0){270985.88,181204.07,166274.63,-801278.39,-539738.59,-493262.57,1297043.7,886739.53,803759.61,-1736920.8,-1214791.9,-1087394.1,2101746.5,1516611.7,1334475.8}; +ST(0.059957308,0.22757204,0,0.053624899,0.22742186,0,0.05718895,0.22161738,0){1366903.5,1430137,1508977,-3351367.9,-3503302.1,-3566099.1,3498598.8,3648370.9,3352547.9,-1727811.3,-1785483,-1004251.2,-990620.01,-1060301.4,-1983866.6}; +ST(0.042433189,0.024814669,0,0.046063037,0.016810165,0,0.051167355,0.022914381,0){3739739.8,3836060.2,3850137.8,3488658.7,3717529.2,3629520.4,3003356.3,3484126.2,3200919.1,2316430.4,3143090.2,2588908.3,1473602,2704667.4,1828396.4}; +ST(0.077619244,0.18028791,0,0.071841704,0.17726974,0,0.077140734,0.17217741,0){1471797.4,1799263.7,1584233.7,-2389894.4,-2812994.5,-2313491.7,18944.546,-214389.53,-519338.58,2378251.6,2933842.6,2552719.3,-1502642.9,-1438939.3,-655929.75}; +ST(0.1,0.29285714,0,0.1,0.3,0,0.092857143,0.3,0){0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +ST(0.043838979,0.034579424,0,0.035858843,0.031497608,0,0.042433189,0.024814669,0){3745913.7,3456371.8,3739739.8,3260141.4,3083741.5,3488658.7,2351583.2,2378649.5,3003356.3,1138042.7,1417116.3,2316430.4,-223347.31,302618.73,1473602}; +ST(0.074931673,0.27468874,0,0.078222118,0.28277283,0,0.071000103,0.28243589,0){363389.18,220930.92,281581.81,-1064791.9,-655625.13,-835250.62,1691857.9,1069057.6,1360764.9,-2200836.4,-1447830.3,-1840418.5,2556129.1,1779434.3,2257916.8}; +ST(0.1,0,0,0.1,0.0071428571,0,0.092857143,0,0){0,0,863626.15,0,0,863662.39,0,0,863732,0,0,863838.35,0,0,863813.95}; +ST(0.070691378,0.017050195,0,0.078020383,0.017034313,0,0.074388951,0.025102472,0){3076870.7,2461848.1,2772012.4,2979073.3,2383750.6,2581574.2,2786592,2230032.5,2213781,2505581.5,2005590.6,1693914.7,2144710.8,1717239.5,1057277.9}; +ST(0.038597539,0.20095921,0,0.036160627,0.1953007,0,0.043569257,0.19619451,0){1801301.7,1834250.2,1966078.6,-3633864.6,-3509998.2,-3794921.6,1895634,1372423.7,1563901,1705394,2256297.6,2340412.7,-3630918.1,-3434247.7,-3741435.4}; +ST(0.059078636,0.27701937,0,0.06660802,0.27624666,0,0.063469548,0.28521738,0){447007.97,417349.44,273598.49,-1315269.1,-1226359.7,-814255.31,2107766.2,1959900.4,1335465.2,-2778864.5,-2572844.1,-1824812,3289755.3,3027289.2,2270429.1}; +ST(0.036602132,0.28491153,0,0.030312881,0.27848596,0,0.037999827,0.27482627,0){279518.56,355416.48,474219.19,-831596.18,-1048284.8,-1389905,1362985.6,1688178.9,2209621.2,-1860498.2,-2242771,-2876809.4,2311728.5,2683885.3,3345267.4}; +ST(0.091053567,0.10618538,0,0.09416017,0.099511923,0,0.1,0.10714286,0){914271.31,613994.66,0,-104388.15,5422.3845,0,-1006721.9,-608645.22,0,-787386.88,-619557.01,0,309052.61,-16415.987,0}; +ST(0.076938259,0.060604721,0,0.073604017,0.054819307,0,0.080938662,0.054906318,0){2443533.2,2744584.6,2097661.4,1491930.8,1864679.8,1423084,-40674.57,386939.94,290856.94,-1557435.8,-1214908.7,-934922.56,-2468002.6,-2427603.9,-1860365.1}; +ST(0.0064539684,0.081629255,0,0.0067127961,0.088875219,0,0,0.085714286,0){711139.06,725937.81,0,222377.16,141227.93,0,-419239.47,-557260.38,0,-772749.89,-806944.34,0,-595288.06,-406936.37,0}; +ST(0.070865224,0.080352924,0,0.074756101,0.075901522,0,0.075872285,0.081656016,0){2808030.6,2549479.1,2427639,934415.1,1021825.1,758134.07,-1562677.5,-1118145.3,-1432759.9,-3017110.1,-2588166.7,-2638364.3,-2458745.5,-2507455.8,-2029677.1}; +ST(0.024044461,0.20382537,0,0.03163445,0.20120488,0,0.030490983,0.2108424,0){1283805.9,1608414.7,1428644.1,-2655634.7,-3251875.6,-3128471,1553893.8,1714266.6,2293671,995311.88,1500504,399562.24,-2617892.2,-3248047,-2769801.9}; +ST(0.071915087,0.24816524,0,0.078142774,0.24370973,0,0.07921504,0.25033934,0){803363.84,714639.7,606155.6,-2179152.4,-1902709.3,-1658203,2928525.2,2448578.4,2271843.6,-2836050.6,-2167997.3,-2284831,1927975,1155455.3,1693484.6}; +ST(0.091308694,0.0093164623,0,0.093571257,0.018380777,0,0.085905658,0.016824409,0){1045151,774815.13,1656238,1035216.9,746204.54,1604967.9,1015442.8,690036.86,1504009.2,986027.05,608388.09,1356492.3,947106.05,504051.02,1166855}; +ST(0.08596482,0.28314521,0,0.093593186,0.28160993,0,0.091323117,0.29067423,0){145967.81,74588.283,51002.156,-433371.98,-221009.65,-152526.43,707326.96,359269.18,252617.29,-959333.22,-484261.41,-350336.87,1181452.3,591230.88,444691.33}; +ST(0.069002793,0.22246209,0,0.076796159,0.2234596,0,0.07180958,0.22984275,0){1267491.2,1008421.8,1079159.6,-3011719.2,-2411357.4,-2680718.2,2877058.6,2346331.8,2899261.6,-947533.34,-852928.84,-1622013.4,-1573376.1,-1160000.7,-492395.98}; +ST(0.04704595,0.16277363,0,0.042242048,0.16806859,0,0.038427921,0.16264679,0){2543508.6,2399442.3,2389351.9,-3221973.5,-3302042.1,-3020403.6,-1684138.2,-1157324.9,-1591681.4,3671419.3,3737475.6,3440909.6,704902.67,-248746.29,682723.32}; +ST(0.030466665,0.11568191,0,0.030575169,0.1246812,0,0.025139549,0.12057635,0){2608170,2526238.7,2224740.3,-773675.45,-1202245.8,-875333.98,-3152461.4,-3156412.2,-2755721.9,-1443702.3,-451924.48,-796179.51,2136967.4,2919641.1,2272644.8}; +ST(0.035619257,0.12028764,0,0.030575169,0.1246812,0,0.030466665,0.11568191,0){2821397.9,2526238.7,2608170,-1093830.4,-1202245.8,-773675.45,-3491178.8,-3156412.2,-3152461.4,-1043884.2,-451924.48,-1443702.3,2851838.9,2919641.1,2136967.4}; +ST(0.016927821,0.11108648,0,0.013465065,0.10662372,0,0.017861336,0.10270337,0){1644246.3,1351132.7,1773538.4,-340994.5,-165451.82,-87655.931,-1914445.6,-1496410,-1856823.6,-1176430.8,-1147793.4,-1677437.3,981584.41,489093.12,261812.45}; +ST(0.055764419,0.28986395,0,0.051519181,0.28417908,0,0.056292141,0.2827555,0){202473.1,320732.11,343081.75,-605163.67,-953415.16,-1018093.3,1001119.7,1560004.1,1660020.8,-1385941.2,-2123899.5,-2248005.1,1755276.4,2629434.9,2762903.8}; +ST(0.0068768393,0.16098373,0,0.0046637588,0.16745308,0,0,0.16428571,0){553409.29,362371.83,0,-680450.71,-494096.85,0,-397156.36,-182769.85,0,771605.48,560561.48,0,219690.78,-21256.565,0}; +ST(0.042541479,0.22296234,0,0.045116599,0.21481108,0,0.049797208,0.2214244,0){1481591,1654487.5,1551864.2,-3531706.6,-3731787.4,-3662861.4,3405357.4,3030991.5,3430735.4,-1180392.3,-73694.316,-1003918.8,-1772446.7,-2938909.4,-2065424.5}; +ST(0.07921504,0.25033934,0,0.078142774,0.24370973,0,0.083292987,0.24598228,0){606155.6,714639.7,542685.82,-1658203,-1902709.3,-1458992.1,2271843.6,2448578.4,1920780.7,-2284831,-2167997.3,-1784182,1693484.6,1155455.3,1091638.2}; +ST(0.042557423,0.10832344,0,0.038084092,0.1145524,0,0.034786476,0.1076516,0){3183930.6,2981407.2,2912738.3,-492142.06,-818508.93,-413135.58,-3600076,-3575257.7,-3267374.9,-2551523.2,-1775238,-2390915.6,1442840.6,2287308.3,1215377.6}; +ST(0.026270926,0.075674812,0,0.027058874,0.069011929,0,0.033874053,0.071548869,0){2630439.6,2727323.5,3157862.8,1063205.3,1363815.9,1466537.3,-1137545.6,-681543.48,-1010259.7,-2660659.2,-2386220.5,-2946084.6,-2599027.8,-2898415.6,-3304540.6}; +ST(0.070754378,0.060222618,0,0.073604017,0.054819307,0,0.076938259,0.060604721,0){2932444.5,2744584.6,2443533.2,1804303.3,1864679.8,1491930.8,-17984.254,386939.94,-40674.57,-1833384.6,-1214908.7,-1557435.8,-2943704.7,-2427603.9,-2468002.6}; +ST(0.061098586,0.072147464,0,0.060416267,0.076932239,0,0.054876921,0.07294965,0){3389933,3380545.3,3558755.8,1545196.6,1302521.2,1580988.4,-1140417.3,-1576156.6,-1275447.3,-3205469.9,-3485992.8,-3423192.1,-3526423.9,-3253298.6,-3669097.1}; +ST(0.061027247,0.098743066,0,0.058212185,0.089881183,0,0.066799394,0.09162077,0){3173016.6,3344291.6,2974160.1,72008.811,593905.21,440022.16,-3099474,-2645013.4,-2469083.6,-3241975.4,-3708817.1,-3274492.4,-216202.29,-1722713.3,-1290097.2}; +ST(0.05718895,0.22161738,0,0.053910411,0.21448753,0,0.063265205,0.21633109,0){1508977,1667429.4,1505335.5,-3566099.1,-3752161.8,-3432481.9,3352547.9,3023771,2888962.8,-1004251.2,-28239.212,-265885.87,-1983866.6,-2988983.1,-2549234.8}; +ST(0.076158908,0.12549637,0,0.082946441,0.12207685,0,0.082709707,0.12855445,0){2092101.1,1589878.9,1568327.1,-1030118.9,-673263.29,-869760.99,-2615047.7,-1978038.1,-1955764.1,-297340.89,-467139.5,-1353.9511,2464056,1708498.9,1955094.7}; +ST(0.052748817,0.036292023,0,0.060555575,0.040182349,0,0.054794838,0.043915046,0){3796611.1,3588260.7,3735662.6,3254886.9,2962222.2,2959425,2248728.5,1819353,1568238.5,921690.78,359025.67,-148813.91,-537197.11,-1164330.1,-1835117.4}; +ST(0.060819012,0.031697917,0,0.060555575,0.040182349,0,0.052748817,0.036292023,0){3608360,3588260.7,3796611.1,3214477.8,2962222.2,3254886.9,2469695.4,1819353,2248728.5,1455299.1,359025.67,921690.78,281702.17,-1164330.1,-537197.11}; +ST(0.054010827,0.25507988,0,0.060672356,0.25950081,0,0.0528723,0.26429657,0){897184.36,771273.27,718299.05,-2496661.6,-2177172.3,-2055661.9,3553831.7,3197356.1,3109067.1,-3839088.9,-3651078,-3733060,3290330.5,3457676.3,3841282.5}; +ST(0.0528723,0.26429657,0,0.060672356,0.25950081,0,0.061631884,0.26868773,0){718299.05,771273.27,591535.29,-2055661.9,-2177172.3,-1711593.4,3109067.1,3197356.1,2649353.2,-3733060,-3651078,-3304968.8,3841282.5,3457676.3,3608394.3}; +ST(0.064075209,0.013493001,0,0.06203594,0.0060944193,0,0.068476894,0.0069177029,0){3498581.2,3604620.2,3242851.4,3428890.3,3589956.2,3225849.8,3290906.4,3560685.5,3191931.3,3087427.7,3516960.1,3141298.2,2822154,3458793.9,3073847.6}; +ST(0.068366879,0.29272708,0,0.061805884,0.29356168,0,0.063469548,0.28521738,0){123803.43,121923.05,273598.49,-370697.46,-365207.83,-814255.31,615462.12,606815.62,1335465.2,-856697.17,-845641.09,-1824812,1092834.3,1080583.1,2270429.1}; +ST(0.036912897,0.21765752,0,0.029518097,0.21985532,0,0.030490983,0.2108424,0){1486590.9,1264894.2,1428644.1,-3421295.1,-2954793.2,-3128471,2965983.4,2682751.8,2293671,-438566.7,-629411.95,399562.24,-2395869.1,-1842177.8,-2769801.9}; +ST(0.012304267,0.13852123,0,0.0054758376,0.13911323,0,0.0072553778,0.13224921,0){1094693.2,495708.7,674958.82,-832176.34,-382921.42,-425463.67,-1294374.3,-582869.54,-832230.25,521821.54,250325.59,117822.57,1419655.5,639819.51,875622.71}; +ST(0.07492972,0.092844339,0,0.072044079,0.08604506,0,0.079265602,0.086677581,0){2431427.6,2688599.4,2114636.1,308451.38,649473.83,488789.06,-2083891.4,-1882262.6,-1512904.7,-2656803.1,-2986497.2,-2351470.6,-910298.79,-1825996.4,-1382326.1}; +ST(0.017373248,0.19021363,0,0.012931293,0.19295437,0,0.01062282,0.18656765,0){1095255.9,815194.79,711483.53,-1990705.9,-1524077.7,-1243147.4,532263.7,510133.92,217509.34,1555631.8,1080471.8,1080570.1,-1804413.6,-1450076.4,-1025407.6}; +ST(0.074388951,0.025102472,0,0.068707287,0.030314019,0,0.064795861,0.023107998,0){2772012.4,3188897.7,3443592.1,2581574.2,2870259.7,3242943.8,2213781,2264806.3,2853338,1693914.7,1433032.7,2297494.4,1057277.9,457746.25,1607540.9}; +ST(0.064795861,0.023107998,0,0.068707287,0.030314019,0,0.060819012,0.031697917,0){3443592.1,3188897.7,3608360,3242943.8,2870259.7,3214477.8,2853338,2264806.3,2469695.4,2297494.4,1433032.7,1455299.1,1607540.9,457746.25,281702.17}; +ST(0.084206466,0.24009781,0,0.092168655,0.23668616,0,0.089949388,0.2453858,0){569988.38,307607.26,339950.36,-1492933.9,-792496.69,-911669.73,1847439,941630.33,1193275.4,-1498530.8,-691810.02,-1095139.7,578923.58,148523.72,648419.14}; +ST(0.056199026,0.010061392,0,0.052049192,0.01582547,0,0.049204373,0.010884263,0){3801979,3859264.8,3873084,3759859.9,3753529.9,3822842.7,3676084,3544947.6,3723003.5,3551608.2,3239251.6,3574883.8,3387596.5,2844641.6,3380124.5}; +ST(0.025221599,0.062165695,0,0.032659307,0.059686042,0,0.031105381,0.06529626,0){2618029.3,3158137.1,3030579.1,1547191.2,1964024.3,1667989.8,-156575.4,27282.242,-444570.51,-1796512.5,-1919818.3,-2357289.6,-2702051.5,-3141270.1,-3210321.2}; +ST(0.031105381,0.06529626,0,0.037071258,0.0642048,0,0.033874053,0.071548869,0){3030579.1,3365311.2,3157862.8,1667989.8,1900443.5,1466537.3,-444570.51,-391679.98,-1010259.7,-2357289.6,-2513388.8,-2946084.6,-3210321.2,-3541461.8,-3304540.6}; +ST(0.064795861,0.023107998,0,0.070691378,0.017050195,0,0.074388951,0.025102472,0){3443592.1,3076870.7,2772012.4,3242943.8,2979073.3,2581574.2,2853338,2786592,2213781,2297494.4,2505581.5,1693914.7,1607540.9,2144710.8,1057277.9}; +ST(0.064075209,0.013493001,0,0.070691378,0.017050195,0,0.064795861,0.023107998,0){3498581.2,3076870.7,3443592.1,3428890.3,2979073.3,3242943.8,3290906.4,2786592,2853338,3087427.7,2505581.5,2297494.4,2822154,2144710.8,1607540.9}; +ST(0.024008584,0.022367291,0,0.033039341,0.023173825,0,0.028359285,0.029784535,0){2639060.6,3318087.9,2981166.2,2494948.4,3123656.1,2693525.9,2214593.6,2746181,2145980.7,1813324.4,2207795.9,1391347.7,1312931.3,1539940.3,502245.34}; +ST(0.075488644,0.14176328,0,0.068478919,0.13862632,0,0.076271482,0.13373081,0){1990888.2,2426951.1,2012844.4,-1647841.2,-1850187.5,-1330317.6,-2274843.7,-2866745.3,-2463975.8,1255935.2,1169007.7,494859.01,2491166.6,3144665.9,2631758.9}; +ST(0.076271482,0.13373081,0,0.068478919,0.13862632,0,0.067728608,0.12931058,0){2012844.4,2426951.1,2567539,-1330317.6,-1850187.5,-1463631.5,-2463975.8,-2866745.3,-3196956.5,494859.01,1169007.7,89062.443,2631758.9,3144665.9,3235608.2}; +ST(0.060432552,0.20227914,0,0.053221516,0.20704838,0,0.051624576,0.1997036,0){1798951.1,1805672.4,1943020.7,-3671781.8,-3837129.3,-3875569.2,2023610.8,2511247.5,1911651.5,1565241.8,1011998.4,1974364.4,-3653837,-3650194.7,-3875892.9}; +ST(0.079063451,0.10043005,0,0.076969725,0.10634022,0,0.072126291,0.10515927,0){2051820.1,2181001.1,2539730.3,-16056.497,-255488.75,-241283.81,-2067914.3,-2406546.5,-2758172.2,-2035845.1,-1869163.7,-2254933.2,48244.512,756176.24,717337.89}; +ST(0.063265205,0.21633109,0,0.053910411,0.21448753,0,0.059551151,0.20970619,0){1505335.5,1667429.4,1688112.8,-3432481.9,-3752161.8,-3664209.4,2888962.8,3023771,2601193.1,-265885.87,-28239.212,619333.89,-2549234.8,-2988983.1,-3326584.6}; +ST(0.059551151,0.20970619,0,0.066992124,0.20847551,0,0.063265205,0.21633109,0){1688112.8,1540360.8,1505335.5,-3664209.4,-3311175.4,-3432481.9,2601193.1,2266191.6,2888962.8,619333.89,706070.36,-265885.87,-3326584.6,-3078419.5,-2549234.8}; +ST(0.1,0.10714286,0,0.09416017,0.099511923,0,0.1,0.1,0){0,613994.66,0,0,5422.3845,0,0,-608645.22,0,0,-619557.01,0,0,-16415.987,0}; +ST(0,0.15714286,0,0.0068768393,0.16098373,0,0,0.16428571,0){0,553409.29,0,0,-680450.71,0,0,-397156.36,0,0,771605.48,0,0,219690.78,0}; +ST(0.031710863,0.0075461758,0,0.029163144,0.015558324,0,0.025468185,0.010276157,0){3254919.5,3068207,2780034,3234618.2,2986953.6,2747892,3194153.7,2826596.5,2683968.5,3133832.1,2591406.1,2589008.8,3053845.3,2287504.7,2463902.9}; +ST(0.072323403,0.067507008,0,0.079822506,0.065677674,0,0.080160084,0.071577727,0){2781512.1,2163855.5,2107851.9,1448400.9,1180001.4,977984.82,-578922.09,-340376.77,-676141.96,-2328912.3,-1706002.2,-1967920.1,-2963263.7,-2296197.5,-2205119.3}; +ST(0.085369203,0.17624497,0,0.093873231,0.17693503,0,0.089858368,0.18421461,0){1039089.6,445896.9,692603.24,-1603144.1,-694096.79,-1178349.1,-168940.91,-59504.029,133849.22,1695116.9,727141.13,1084450.2,-751642.95,-345394.37,-894447.98}; +ST(0.064352171,0.083117586,0,0.072044079,0.08604506,0,0.066799394,0.09162077,0){3167194.8,2688599.4,2974160.1,915483.69,649473.83,440022.16,-1987167.2,-1882262.6,-2469083.6,-3477240.4,-2986497.2,-3274492.4,-2495770,-1825996.4,-1290097.2}; +ST(0.0098751756,0.25600949,0,0.013885016,0.25805955,0,0.0071908097,0.26035264,0){270470.11,357160.64,179155.76,-755004.71,-1003688.5,-507033.49,1082095.4,1459712.7,748779.14,-1183544.7,-1638678.7,-863311.12,1038261.4,1506406.6,830950.48}; +ST(0.016759526,0.025876157,0,0.021348697,0.029751655,0,0.014137494,0.034012185,0){1932221.9,2382657.5,1641076.4,1791225.7,2153252.9,1435142,1519509.7,1716520.5,1049094.4,1136895.1,1114508.8,531342.12,671081.1,404958.41,-53364.585}; +ST(0.019499739,0.079597209,0,0.012549176,0.077039569,0,0.01882241,0.070374011,0){2040354.6,1370920.5,2018056.9,702945.71,525978.15,970762.8,-1095289.5,-643140.23,-580354.6,-2175701.2,-1415881.7,-1830388.5,-1830384.7,-1316306.1,-2130853.3}; +ST(0.0910478,0.13167545,0,0.083559522,0.13424014,0,0.082709707,0.12855445,0){831136.87,1462145.4,1568327.1,-514132.23,-981746.52,-869760.99,-1027305.8,-1784737.2,-1955764.1,122313.64,395362.65,-1353.9511,1073956.7,1914407.3,1955094.7}; +ST(0.087083587,0.13880919,0,0.083559522,0.13424014,0,0.0910478,0.13167545,0){1144744.3,1462145.4,831136.87,-877072.07,-981746.52,-514132.23,-1349889.8,-1784737.2,-1027305.8,561444.4,395362.65,122313.64,1481228.8,1914407.3,1073956.7}; +ST(0.018704911,0.19716585,0,0.015977634,0.20443356,0,0.011268327,0.1984065,0){1103230.1,895779.15,682302.12,-2149261.2,-1862602.8,-1344805.9,934589.13,1114548.4,623458.07,1263201.6,659707.69,739532.85,-2132672.2,-1827076.9,-1341727.7}; +ST(0.01882241,0.070374011,0,0.012549176,0.077039569,0,0.011197941,0.071439681,0){2018056.9,1370920.5,1244724.5,970762.8,525978.15,579995.21,-580354.6,-643140.23,-394493.66,-1830388.5,-1415881.7,-1158343.6,-2130853.3,-1316306.1,-1303869.8}; +ST(0.077013163,0.11736903,0,0.082946441,0.12207685,0,0.076158908,0.12549637,0){2095773.2,1589878.9,2092101.1,-691227.47,-673263.29,-1030118.9,-2559181.5,-1978038.1,-2615047.7,-1023961.4,-467139.5,-297340.89,1873161.8,1708498.9,2464056}; +ST(0.061244461,0.14481879,0,0.064971856,0.15110456,0,0.058552205,0.15400025,0){2643484.5,2431817,2589572.8,-2356788.3,-2488096.1,-2806487.5,-2899198.4,-2374265.3,-2354581.2,2042509.4,2543085,3003966,3121060.9,2315361.9,2103059.1}; +ST(0.0094805882,0.16707285,0,0.014405512,0.17061143,0,0.0069613667,0.17349451,0){730151.01,1063653,517779.21,-989834.58,-1519257.6,-769992.03,-378084.11,-412907.51,-142713.64,1124284.7,1696192.6,839532.94,-22095.939,-313907.63,-266340.1}; +ST(0.017763535,0.12074209,0,0.01198914,0.11616091,0,0.016927821,0.11108648,0){1657769.5,1171325.2,1644246.3,-657738.05,-358450.6,-340994.5,-2054600.3,-1420119.3,-1914445.6,-581651.26,-627101.02,-1176430.8,1703675.4,984768,981584.41}; +ST(0.051624576,0.1997036,0,0.043569257,0.19619451,0,0.050398693,0.1921099,0){1943020.7,1966078.6,2077292.2,-3875569.2,-3794921.6,-3850553.1,1911651.5,1563901,1209682,1974364.4,2340412.7,2818064.5,-3875892.9,-3741435.4,-3615771.1}; +ST(0.051624576,0.1997036,0,0.057391395,0.19462543,0,0.060432552,0.20227914,0){1943020.7,1979510.6,1798951.1,-3875569.2,-3763012.6,-3671781.8,1911651.5,1410875.8,2023610.8,1974364.4,2491970.2,1565241.8,-3875892.9,-3656419.8,-3653837}; +ST(0.03663522,0.040674234,0,0.032229878,0.047894836,0,0.028678488,0.042143634,0){3463485.9,3188476.9,2968313.4,2844620.6,2403076.1,2399521.8,1717431.6,1025710.6,1370917.4,283267.24,-604377.64,79587.615,-1201989.6,-2086050.7,-1227272.3}; +ST(0.038515413,0.047952704,0,0.032229878,0.047894836,0,0.03663522,0.040674234,0){3516906.1,3188476.9,3463485.9,2648581.9,2403076.1,2844620.6,1126309.3,1025710.6,1717431.6,-674068.75,-604377.64,283267.24,-2308227.3,-2086050.7,-1201989.6}; +ST(0.014137494,0.034012185,0,0.021348697,0.029751655,0,0.023478597,0.036718106,0){1641076.4,2382657.5,2561783.8,1435142,2153252.9,2187675.4,1049094.4,1716520.5,1494080.3,531342.12,1114508.8,582277.59,-53364.585,404958.41,-414804.14}; +ST(0.058552205,0.15400025,0,0.065117308,0.15657509,0,0.061476805,0.16269562,0){2589572.8,2354870.2,2391378.9,-2806487.5,-2678881.2,-3025373.1,-2354581.2,-1986291.9,-1589341.3,3003966,2952219.2,3446908.2,2103059.1,1580034,675366.83}; +ST(0.021957304,0.26060316,0,0.013885016,0.25805955,0,0.018179834,0.25267212,0){505833.44,357160.64,514543.14,-1432636.8,-1003688.5,-1419813.2,2119105.6,1459712.7,1983439.5,-2450095.8,-1638678.7,-2069793.3,2369995.8,1506406.6,1657747.8}; +ST(0.018179834,0.25267212,0,0.013885016,0.25805955,0,0.01180171,0.25230222,0){514543.14,357160.64,347512.04,-1419813.2,-1003688.5,-957611.77,1983439.5,1459712.7,1333704.3,-2069793.3,-1638678.7,-1383899.6,1657747.8,1506406.6,1095718.6}; +ST(0.078984823,0.22953004,0,0.077318805,0.23627719,0,0.07180958,0.22984275,0){858343.29,830868.27,1079159.6,-2128428.8,-2136157.9,-2680718.2,2291087.1,2525048.7,2899261.6,-1261656.1,-1830714.2,-1622013.4,-424553.92,350702.19,-492395.98}; +ST(0.1,0.15,0,0.09308158,0.15403623,0,0.09156348,0.14589395,0){0,579061.91,734092.88,0,-628036.95,-670961.7,0,-525997.02,-791796.8,0,672596.25,602866.55,0,469080.04,843431.47}; +ST(0.063469548,0.28521738,0,0.06660802,0.27624666,0,0.071000103,0.28243589,0){273598.49,417349.44,281581.81,-814255.31,-1226359.7,-835250.62,1335465.2,1959900.4,1360764.9,-1824812,-2572844.1,-1840418.5,2270429.1,3027289.2,2257916.8}; +ST(0.056317057,0.058022103,0,0.059054943,0.066788508,0,0.052494391,0.065958781,0){3630316.8,3499189.3,3640248,2330872.5,1856149.2,1971511.2,197001.66,-658492.2,-601016.65,-2007682.1,-2864039.1,-2898090,-3494460.7,-3725081.1,-3866942}; +ST(0.028359285,0.029784535,0,0.021348697,0.029751655,0,0.024008584,0.022367291,0){2981166.2,2382657.5,2639060.6,2693525.9,2153252.9,2494948.4,2145980.7,1716520.5,2214593.6,1391347.7,1114508.8,1813324.4,502245.34,404958.41,1312931.3}; +ST(0.054395265,0.16699477,0,0.054692531,0.17439284,0,0.048076401,0.17082416,0){2465605.5,2346407.8,2424680.5,-3338618.7,-3532168.6,-3473815.1,-1283530.8,-561454.61,-921629.25,3793219.5,3816051.1,3872759.5,-59660.123,-1367177.6,-754316.94}; +ST(0.088381846,0.16289419,0,0.093710586,0.16080643,0,0.092195724,0.16853594,0){911153.68,507346.27,598378.34,-1156470.7,-621948.04,-829189.07,-599768.12,-366919.85,-278570.16,1317920.1,704920.6,936666.51,244888.24,207593.47,-82641.6}; +ST(0.08944657,0.05485846,0,0.09230899,0.063522919,0,0.08415119,0.061061125,0){1211526.2,877619.52,1759442.9,822600.19,503392.8,1064240.3,169573.91,-85524.836,-51487.645,-537958.1,-638068.15,-1146904.2,-1073022.7,-918939.46,-1789550.6}; +ST(0.1,0.19285714,0,0.093164956,0.1980516,0,0.091593501,0.1915477,0){0,420734.09,544831.72,0,-826537.04,-1004107.1,0,376428.12,301623.68,0,463603.83,749822.54,0,-823893.15,-933881.71}; +ST(0,0.042857143,0,0.0063343033,0.038958017,0,0.0064812773,0.046734878,0){0,751213.74,761350.4,0,627892.11,582610.88,0,401490.67,267082.8,0,109174.99,-111174.21,0,-201236.23,-463416.67}; +ST(0.014285714,0.3,0,0.017990672,0.29207379,0,0.021428571,0.3,0){0,86228.122,0,0,-258100.45,0,0,428229.3,0,0,-595472.42,0,0,758576.15,0}; +ST(0.021428571,0,0,0.01808004,0.0081573173,0,0.014285714,0,0){2419501.9,2085729.2,1683701.5,2419561.9,2070583.9,1683671.3,2419679.8,2040406.9,1683611.9,2419876.4,1995444.2,1683542.6,2419989.4,1935913.6,1683226}; +ST(0.080160084,0.071577727,0,0.074756101,0.075901522,0,0.072323403,0.067507008,0){2107851.9,2549479.1,2781512.1,977984.82,1021825.1,1448400.9,-676141.96,-1118145.3,-578922.09,-1967920.1,-2588166.7,-2328912.3,-2205119.3,-2507455.8,-2963263.7}; +ST(0.050398693,0.1921099,0,0.057391395,0.19462543,0,0.051624576,0.1997036,0){2077292.2,1979510.6,1943020.7,-3850553.1,-3763012.6,-3875569.2,1209682,1410875.8,1911651.5,2818064.5,2491970.2,1974364.4,-3615771.1,-3656419.8,-3875892.9}; +ST(0.0062494098,0.068021592,0,0.0060853536,0.074713803,0,0,0.071428571,0){709501.16,681675.12,0,364477.97,285253.65,0,-157824.6,-277070.48,0,-603457.47,-678306.76,0,-756039.79,-685312.86,0}; +ST(0.045331711,0.23557633,0,0.052478219,0.23860916,0,0.047556344,0.24377674,0){1270563.3,1222305.6,1122639.4,-3255008.9,-3178913.4,-2989881.7,3813331,3866354.4,3850350.4,-2700862,-3010118,-3414324.1,404484.48,951644.63,1828478.4}; +ST(0.050960377,0.23252058,0,0.052478219,0.23860916,0,0.045331711,0.23557633,0){1342135.9,1222305.6,1270563.3,-3383651.2,-3178913.4,-3255008.9,3804738.6,3866354.4,3813331,-2403721.7,-3010118,-2700862,-148681.88,951644.63,404484.48}; +ST(0.089949388,0.2453858,0,0.083292987,0.24598228,0,0.084206466,0.24009781,0){339950.36,542685.82,569988.38,-911669.73,-1458992.1,-1492933.9,1193275.4,1920780.7,1847439,-1095139.7,-1784182,-1498530.8,648419.14,1091638.2,578923.58}; +ST(0.08415119,0.061061125,0,0.080938662,0.054906318,0,0.08944657,0.05485846,0){1759442.9,2097661.4,1211526.2,1064240.3,1423084,822600.19,-51487.645,290856.94,169573.91,-1146904.2,-934922.56,-537958.1,-1789550.6,-1860365.1,-1073022.7}; +ST(0.014285714,0.3,0,0.010662343,0.29482959,0,0.017990672,0.29207379,0){0,34537.041,86228.122,0,-103506.64,-258100.45,0,172164.12,428229.3,0,-240303.04,-595472.42,0,307518.14,758576.15}; +ST(0.08944657,0.05485846,0,0.094913401,0.051076335,0,0.1,0.057142857,0){1211526.2,595503.05,0,822600.19,429138.45,0,169573.91,142901.48,0,-537958.1,-183223.65,0,-1073022.7,-458373.75,0}; +ST(0.1,0.24285714,0,0.095090425,0.2489538,0,0.089949388,0.2453858,0){0,157454.16,339950.36,0,-428416.46,-911669.73,0,579817.55,1193275.4,0,-569427.53,-1095139.7,0,400020.01,648419.14}; +ST(0.01808004,0.0081573173,0,0.010679145,0.0052482016,0,0.014285714,0,0){2085729.2,1277155.8,1683701.5,2070583.9,1273289.3,1683671.3,2040406.9,1265566.3,1683611.9,1995444.2,1254019.7,1683542.6,1935913.6,1238493.9,1683226}; +ST(0.045375723,0.12284566,0,0.052058531,0.12554764,0,0.045894811,0.13135905,0){3072436,3065498.6,2973475.7,-1348503.3,-1512626.5,-1819976.4,-3829159.4,-3831818,-3679581.9,-800055.99,-428428.64,392676.16,3380414.3,3614977.4,3832095.1}; +ST(0.045894811,0.13135905,0,0.052058531,0.12554764,0,0.053497526,0.1329974,0){2973475.7,3065498.6,2959143.9,-1819976.4,-1512626.5,-1911000.9,-3679581.9,-3831818,-3636096,392676.16,-428428.64,623103.97,3832095.1,3614977.4,3857035.6}; +ST(0.03163445,0.20120488,0,0.036840853,0.20596239,0,0.030490983,0.2108424,0){1608414.7,1679916.9,1428644.1,-3251875.6,-3538121.9,-3128471,1714266.6,2233718.4,2293671,1500504,1067350,399562.24,-3248047,-3414669.4,-2769801.9}; +ST(0.089858368,0.18421461,0,0.082729031,0.18391978,0,0.085369203,0.17624497,0){692603.24,1144258.1,1039089.6,-1178349.1,-1940160.8,-1603144.1,133849.22,205244.05,-168940.91,1084450.2,1797438.3,1695116.9,-894447.98,-1455642.1,-751642.95}; +ST(0.02463475,0.21609565,0,0.021120118,0.21068669,0,0.030490983,0.2108424,0){1153636.1,1077357.5,1428644.1,-2626116.1,-2356401.7,-3128471,2198315,1720167.1,2293671,-179791.92,314292.11,399562.24,-1969098.8,-2093742.8,-2769801.9}; +ST(0.030490983,0.2108424,0,0.021120118,0.21068669,0,0.024044461,0.20382537,0){1428644.1,1077357.5,1283805.9,-3128471,-2356401.7,-2655634.7,2293671,1720167.1,1553893.8,399562.24,314292.11,995311.88,-2769801.9,-2093742.8,-2617892.2}; +ST(0.047385855,0.10193045,0,0.039702853,0.10111678,0,0.044548934,0.094607351,0){3329666.7,3175586.8,3364209.6,-117239.93,-64516.934,323528.56,-3442848.4,-3238866.3,-3009655.6,-3204510.9,-3108635.2,-3622750.1,350991.89,193445.51,-961698.97}; +ST(0.050721192,0.10961634,0,0.051013063,0.11801667,0,0.044666369,0.11545829,0){3257974.6,3161388.4,3148096.1,-583831.78,-1083065.4,-920013.3,-3737290.3,-3873486.3,-3799301.5,-2483878.9,-1463412.7,-1769018.1,1698581.7,2911579,2547335.8}; +ST(0.055764419,0.28986395,0,0.056292141,0.2827555,0,0.063469548,0.28521738,0){202473.1,343081.75,273598.49,-605163.67,-1018093.3,-814255.31,1001119.7,1660020.8,1335465.2,-1385941.2,-2248005.1,-1824812,1755276.4,2762903.8,2270429.1}; +ST(0.058552205,0.15400025,0,0.054296142,0.16027015,0,0.050010485,0.1548865,0){2589572.8,2568973.7,2672912.2,-2806487.5,-3120486,-2946373.7,-2354581.2,-1899085.7,-2371553.9,3003966,3528266.9,3189127.5,2103059.1,1141594.9,2045305.7}; +ST(0.01062282,0.18656765,0,0.0062925762,0.18063125,0,0.013878694,0.17880836,0){711483.53,445914.92,971566.52,-1243147.4,-727143.63,-1548960.4,217509.34,12632.594,-51095.574,1080570.1,719304.1,1579530,-1025407.6,-466469.22,-887966.26}; +ST(0.030490983,0.2108424,0,0.029518097,0.21985532,0,0.02463475,0.21609565,0){1428644.1,1264894.2,1153636.1,-3128471,-2954793.2,-2626116.1,2293671,2682751.8,2198315,399562.24,-629411.95,-179791.92,-2769801.9,-1842177.8,-1969098.8}; +ST(0.030312881,0.27848596,0,0.025044032,0.27464897,0,0.029991713,0.27132489,0){355416.48,363665.57,469504.82,-1048284.8,-1065519.5,-1366503,1688178.9,1692735.8,2141236.7,-2242771,-2201379.5,-2724385.3,2683885.3,2555652.6,3063642.3}; +ST(0.1,0.15,0,0.09156348,0.14589395,0,0.1,0.14285714,0){0,734092.88,0,0,-670961.7,0,0,-791796.8,0,0,602866.55,0,0,843431.47,0}; +ST(0.054957014,0.24657048,0,0.052478219,0.23860916,0,0.059437672,0.2400817,0){1058545,1222305.6,1145348.7,-2852831,-3178913.4,-2999714,3777171.8,3866354.4,3711340.5,-3549694.2,-3010118,-3009146,2239441.1,951644.63,1160252.2}; +ST(0.047556344,0.24377674,0,0.052478219,0.23860916,0,0.054957014,0.24657048,0){1122639.4,1222305.6,1058545,-2989881.7,-3178913.4,-2852831,3850350.4,3866354.4,3777171.8,-3414324.1,-3010118,-3549694.2,1828478.4,951644.63,2239441.1}; +ST(0.016702178,0.061420197,0,0.025221599,0.062165695,0,0.01882241,0.070374011,0){1844408.3,2618029.3,2018056.9,1107331.1,1547191.2,970762.8,-72241.295,-156575.4,-580354.6,-1222910.6,-1796512.5,-1830388.5,-1885264.1,-2702051.5,-2130853.3}; +ST(0.029380008,0.16405835,0,0.034314476,0.15645926,0,0.038427921,0.16264679,0){2021292.5,2334400.9,2389351.9,-2614335.2,-2649968.2,-3020403.6,-1254306.4,-1976247.7,-1591681.4,2982541.3,2917237.1,3440909.6,378860.61,1581967.4,682723.32}; +ST(0.027609688,0.15620978,0,0.034314476,0.15645926,0,0.029380008,0.16405835,0){2023546.1,2334400.9,2021292.5,-2286520.9,-2649968.2,-2614335.2,-1726415,-1976247.7,-1254306.4,2510934.9,2917237.1,2982541.3,1400022.9,1581967.4,378860.61}; +ST(0.041057987,0.068843254,0,0.037071258,0.0642048,0,0.045416206,0.061541227,0){3488848.8,3365311.2,3642820.9,1752771.3,1900443.5,2181474.8,-855539,-391679.98,-155055.51,-3038218.5,-2513388.8,-2429600.5,-3709409.4,-3541461.8,-3730025.8}; +ST(0.084368038,0.19048099,0,0.082729031,0.18391978,0,0.089858368,0.18421461,0){992852.93,1144258.1,692603.24,-1809621.2,-1940160.8,-1178349.1,495817.1,205244.05,133849.22,1401810.9,1797438.3,1084450.2,-1649308.4,-1455642.1,-894447.98}; +ST(0.020973714,0.16688371,0,0.014405512,0.17061143,0,0.014502412,0.16316663,0){1525118.3,1063653,1121335,-2061659.5,-1519257.6,-1429592.9,-799875.51,-412907.51,-728363.13,2343184.8,1696192.6,1629901.1,-24581.749,-313907.63,280110.31}; +ST(0.03663522,0.040674234,0,0.035858843,0.031497608,0,0.043838979,0.034579424,0){3463485.9,3456371.8,3745913.7,2844620.6,3083741.5,3260141.4,1717431.6,2378649.5,2351583.2,283267.24,1417116.3,1138042.7,-1201989.6,302618.73,-223347.31}; +ST(0.064075209,0.013493001,0,0.057612168,0.01845715,0,0.056199026,0.010061392,0){3498581.2,3752599.8,3801979,3428890.3,3612875.5,3759859.9,3290906.4,3338613.5,3676084,3087427.7,2940029.2,3551608.2,2822154,2431782.4,3387596.5}; +ST(0.025130011,0.29009115,0,0.028198926,0.28535727,0,0.031264826,0.29263185,0){142877.47,230200.16,124484.17,-427099.39,-685197.76,-372709.78,706741.94,1124120.6,618717.86,-978805.55,-1536674.3,-861054.65,1240164.3,1912913.1,1098239.8}; +ST(0.066799394,0.09162077,0,0.069968451,0.098831219,0,0.061027247,0.098743066,0){2974160.1,2730411,3173016.6,440022.16,57648.531,72008.811,-2469083.6,-2671597.7,-3099474,-3274492.4,-2785714.6,-3241975.4,-1290097.2,-173126.8,-216202.29}; +ST(0.063469548,0.28521738,0,0.056292141,0.2827555,0,0.059078636,0.27701937,0){273598.49,343081.75,447007.97,-814255.31,-1018093.3,-1315269.1,1335465.2,1660020.8,2107766.2,-1824812,-2248005.1,-2778864.5,2270429.1,2762903.8,3289755.3}; +ST(0.05718895,0.22161738,0,0.062992669,0.22303634,0,0.059957308,0.22757204,0){1508977,1396775.9,1366903.5,-3566099.1,-3331109.7,-3351367.9,3352547.9,3216330,3498598.8,-1004251.2,-1122974.8,-1727811.3,-1983866.6,-1661551.4,-990620.01}; +ST(0.063265205,0.21633109,0,0.062992669,0.22303634,0,0.05718895,0.22161738,0){1505335.5,1396775.9,1508977,-3432481.9,-3331109.7,-3566099.1,2888962.8,3216330,3352547.9,-265885.87,-1122974.8,-1004251.2,-2549234.8,-1661551.4,-1983866.6}; +ST(0.044637502,0.20577347,0,0.045116599,0.21481108,0,0.038843793,0.21103197,0){1811821.2,1654487.5,1637090.1,-3810004,-3731787.4,-3590120.4,2390091.8,3030991.5,2645890.8,1174216.7,-73694.316,433646.44,-3685779.4,-2938909.4,-3163532.2}; +ST(0.061631884,0.26868773,0,0.055001581,0.27169863,0,0.0528723,0.26429657,0){591535.29,565900.8,718299.05,-1711593.4,-1648356.5,-2055661.9,2649353.2,2587095.5,3109067.1,-3304968.8,-3300283.2,-3733060,3608394.3,3725567.5,3841282.5}; +ST(0.049232245,0.21047418,0,0.045116599,0.21481108,0,0.044637502,0.20577347,0){1752658.6,1654487.5,1811821.2,-3827070.5,-3731787.4,-3810004,2777012.8,3030991.5,2390091.8,540242.46,-73694.316,1174216.7,-3416565.4,-2938909.4,-3685779.4}; +ST(0.1,0.17142857,0,0.093873231,0.17693503,0,0.092195724,0.16853594,0){0,445896.9,598378.34,0,-694096.79,-829189.07,0,-59504.029,-278570.16,0,727141.13,936666.51,0,-345394.37,-82641.6}; +ST(0.0060491453,0.25298129,0,0.0071908097,0.26035264,0,0,0.25714286,0){178654.23,179155.76,0,-493529.07,-507033.49,0,691183.17,748779.14,0,-724662.05,-863311.12,0,585970.08,830950.48,0}; +ST(0.0072553778,0.13224921,0,0.014210915,0.13228117,0,0.012304267,0.13852123,0){674958.82,1289449.4,1094693.2,-425463.67,-813665.75,-832176.34,-832230.25,-1589638.3,-1294374.3,117822.57,227067.92,521821.54,875622.71,1673024.3,1419655.5}; +ST(0.028359285,0.029784535,0,0.030602087,0.036163623,0,0.023478597,0.036718106,0){2981166.2,3125169.1,2561783.8,2693525.9,2682310.4,2187675.4,2145980.7,1859340.6,1494080.3,1391347.7,772883.67,582277.59,502245.34,-423255.99,-414804.14}; +ST(0.023478597,0.036718106,0,0.030602087,0.036163623,0,0.028678488,0.042143634,0){2561783.8,3125169.1,2968313.4,2187675.4,2682310.4,2399521.8,1494080.3,1859340.6,1370917.4,582277.59,772883.67,79587.615,-414804.14,-423255.99,-1227272.3}; +ST(0.0069613667,0.17349451,0,0.014405512,0.17061143,0,0.013878694,0.17880836,0){517779.21,1063653,971566.52,-769992.03,-1519257.6,-1548960.4,-142713.64,-412907.51,-51095.574,839532.94,1696192.6,1579530,-266340.1,-313907.63,-887966.26}; +ST(0.069467767,0.146519,0,0.068478919,0.13862632,0,0.075488644,0.14176328,0){2287173.5,2426951.1,1990888.2,-2120501.9,-1850187.5,-1647841.2,-2441744.6,-2866745.3,-2274843.7,1942651.5,1169007.7,1255935.2,2583122,3144665.9,2491166.6}; +ST(0.043838979,0.034579424,0,0.048866761,0.029559705,0,0.052748817,0.036292023,0){3745913.7,3831772.8,3796611.1,3260141.4,3467532.3,3254886.9,2351583.2,2773676.3,2248728.5,1138042.7,1816186,921690.78,-223347.31,685852.4,-537197.11}; +ST(0.0528723,0.26429657,0,0.049721881,0.27094787,0,0.043491003,0.26677795,0){718299.05,588018.61,657627.62,-2055661.9,-1710042.9,-1894105.9,3109067.1,2675009.8,2903724.9,-3733060,-3394309,-3565612.1,3841282.5,3801713.7,3800401.2}; +ST(0.044548934,0.094607351,0,0.039702853,0.10111678,0,0.03690243,0.09394169,0){3364209.6,3175586.8,3135041.5,323528.56,-64516.934,337961.95,-3009655.6,-3238866.3,-2760700,-3622750.1,-3108635.2,-3396384.7,-961698.97,193445.51,-1002139.6}; +ST(0.089858368,0.18421461,0,0.095453592,0.18738967,0,0.091593501,0.1915477,0){692603.24,307137.29,544831.72,-1178349.1,-541566.85,-1004107.1,133849.22,106216.39,301623.68,1084450.2,460538.95,749822.54,-894447.98,-458087.35,-933881.71}; +ST(0,0.12857143,0,0.0061411468,0.1246533,0,0.0072553778,0.13224921,0){0,591118.91,674958.82,0,-280990.71,-425463.67,0,-738586.84,-832230.25,0,-106527.54,117822.57,0,682629.18,875622.71}; +ST(0.057612168,0.01845715,0,0.052049192,0.01582547,0,0.056199026,0.010061392,0){3752599.8,3859264.8,3801979,3612875.5,3753529.9,3759859.9,3338613.5,3544947.6,3676084,2940029.2,3239251.6,3551608.2,2431782.4,2844641.6,3387596.5}; +ST(0.015977634,0.20443356,0,0.021120118,0.21068669,0,0.013229009,0.21171696,0){895779.15,1077357.5,698716.07,-1862602.8,-2356401.7,-1540332.8,1114548.4,1720167.1,1156621.3,659707.69,314292.11,147278.69,-1827076.9,-2093742.8,-1334554.8}; +ST(0.0064812773,0.046734878,0,0.0063343033,0.038958017,0,0.011573719,0.041901165,0){761350.4,751213.74,1347025.1,582610.88,627892.11,1091815.8,267082.8,401490.67,629744.45,-111174.21,109174.99,48353.226,-463416.67,-201236.23,-542301.86}; +ST(0.054395265,0.16699477,0,0.054296142,0.16027015,0,0.061476805,0.16269562,0){2465605.5,2568973.7,2391378.9,-3338618.7,-3120486,-3025373.1,-1283530.8,-1899085.7,-1589341.3,3793219.5,3528266.9,3446908.2,-59660.123,1141594.9,675366.83}; +ST(0.0094805882,0.16707285,0,0.0046637588,0.16745308,0,0.0068768393,0.16098373,0){730151.01,362371.83,553409.29,-989834.58,-494096.85,-680450.71,-378084.11,-182769.85,-397156.36,1124284.7,560561.48,771605.48,-22095.939,-21256.565,219690.78}; +ST(0.017763535,0.12074209,0,0.023213665,0.1150537,0,0.025139549,0.12057635,0){1657769.5,2130593.3,2224740.3,-657738.05,-605772.32,-875333.98,-2054600.3,-2564157.8,-2755721.9,-581651.26,-1229375.9,-796179.51,1703675.4,1684092.7,2272644.8}; +ST(0,0.14285714,0,0.0078195435,0.14622426,0,0,0.15,0){0,680366.1,0,0,-626541.18,0,0,-729870.69,0,0,568744.13,0,0,774663.29,0}; +ST(0,0.10714286,0,0.0081152275,0.10988635,0,0,0.11428571,0){0,821145.89,0,0,-151361.79,0,0,-944689.8,0,0,-619246.83,0,0,439508.43,0}; +ST(0.023483408,0.28013687,0,0.025044032,0.27464897,0,0.030312881,0.27848596,0){270985.88,363665.57,355416.48,-801278.39,-1065519.5,-1048284.8,1297043.7,1692735.8,1688178.9,-1736920.8,-2201379.5,-2242771,2101746.5,2555652.6,2683885.3}; +ST(0.085369203,0.17624497,0,0.083969261,0.16737329,0,0.092195724,0.16853594,0){1039089.6,1198489.7,598378.34,-1603144.1,-1632158.2,-829189.07,-168940.91,-607916.58,-278570.16,1695116.9,1852187.2,936666.51,-751642.95,-62490.334,-82641.6}; +ST(0.0910478,0.13167545,0,0.093823791,0.12410599,0,0.1,0.12857143,0){831136.87,595735.92,0,-514132.23,-276601.23,0,-1027305.8,-743959.63,0,122313.64,-121937.8,0,1073956.7,678759.2,0}; +ST(0.1,0.10714286,0,0.091758141,0.11296708,0,0.091053567,0.10618538,0){0,824791.32,914271.31,0,-201020.76,-104388.15,0,-976886.6,-1006721.9,0,-537824.26,-787386.88,0,570097.26,309052.61}; +ST(0.01808004,0.0081573173,0,0.022427218,0.014872357,0,0.015416139,0.018002698,0){2085729.2,2505875.7,1798828.3,2070583.9,2445229.8,1735136,2040406.9,2325397.7,1609995.5,1995444.2,2149288.4,1427830.3,1935913.6,1920956.8,1194733.1}; +ST(0.015498485,0.28248556,0,0.0220603,0.28602893,0,0.017990672,0.29207379,0){166274.63,181204.07,86228.122,-493262.57,-539738.59,-258100.45,803759.61,886739.53,428229.3,-1087394.1,-1214791.9,-595472.42,1334475.8,1516611.7,758576.15}; +ST(0.013229009,0.21171696,0,0.021120118,0.21068669,0,0.018343869,0.21720619,0){698716.07,1077357.5,888277.19,-1540332.8,-2356401.7,-2037897.4,1156621.3,1720167.1,1749211,147278.69,314292.11,-225952.88,-1334554.8,-2093742.8,-1457259.1}; +ST(0.061015306,0.048529238,0,0.060555575,0.040182349,0,0.066401409,0.0434645,0){3533367.8,3588260.7,3289675.8,2640342.3,2962222.2,2619840.6,1080012.2,1819353,1416557.6,-753291.7,359025.67,-75156.319,-2396723.8,-1164330.1,-1551772}; +ST(0.054794838,0.043915046,0,0.060555575,0.040182349,0,0.061015306,0.048529238,0){3735662.6,3588260.7,3533367.8,2959425,2962222.2,2640342.3,1568238.5,1819353,1080012.2,-148813.91,359025.67,-753291.7,-1835117.4,-1164330.1,-2396723.8}; +ST(0.01062282,0.18656765,0,0.012931293,0.19295437,0,0.0066871595,0.19241823,0){711483.53,815194.79,432113.5,-1243147.4,-1524077.7,-803518.34,217509.34,510133.92,258472.73,1080570.1,1080471.8,581490.34,-1025407.6,-1450076.4,-758588.26}; +ST(0.010546892,0.2198034,0,0.0069979116,0.22643766,0,0,0.22142857,0){514716.79,317964.48,0,-1201974.2,-774386.26,0,1090194.6,793599.18,0,-253690.09,-364658.79,0,-751659.26,-270536.88,0}; +ST(0.04704595,0.16277363,0,0.054296142,0.16027015,0,0.054395265,0.16699477,0){2543508.6,2568973.7,2465605.5,-3221973.5,-3120486,-3338618.7,-1684138.2,-1899085.7,-1283530.8,3671419.3,3528266.9,3793219.5,704902.67,1141594.9,-59660.123}; +ST(0.015758122,0.23699049,0,0.016939848,0.22904958,0,0.022740693,0.23189018,0){597291.98,714788.59,887604.04,-1541119.1,-1767596.2,-2230116.3,1837947.1,1888698.3,2485475.6,-1363109.4,-1014237.8,-1529145.6,315646.37,-395054.79,-172982.46}; +ST(0.076430303,0.18837043,0,0.082729031,0.18391978,0,0.084368038,0.19048099,0){1444535.6,1144258.1,992852.93,-2574453.4,-1940160.8,-1809621.2,569102.25,205244.05,495817.1,2129625.3,1797438.3,1401810.9,-2235391.7,-1455642.1,-1649308.4}; +ST(0.077619244,0.18028791,0,0.082729031,0.18391978,0,0.076430303,0.18837043,0){1471797.4,1144258.1,1444535.6,-2389894.4,-1940160.8,-2574453.4,18944.546,205244.05,569102.25,2378251.6,1797438.3,2129625.3,-1502642.9,-1455642.1,-2235391.7}; +ST(0.059078636,0.27701937,0,0.056292141,0.2827555,0,0.051703203,0.27754162,0){447007.97,343081.75,454636.43,-1315269.1,-1018093.3,-1338881.7,2107766.2,1660020.8,2149437.1,-2778864.5,-2248005.1,-2841702,3289755.3,2762903.8,3377384.9}; +ST(0.010546892,0.2198034,0,0.0051799073,0.21317882,0,0.013229009,0.21171696,0){514716.79,276031.48,698716.07,-1201974.2,-615227.88,-1540332.8,1090194.6,479976.29,1156621.3,-253690.09,25450.705,147278.69,-751659.26,-511551.59,-1334554.8}; +ST(0.061027247,0.098743066,0,0.052532368,0.096036702,0,0.058212185,0.089881183,0){3173016.6,3389506.1,3344291.6,72008.811,240670.51,593905.21,-3099474,-3131818.5,-2645013.4,-3241975.4,-3594959.1,-3708817.1,-216202.29,-718569.73,-1722713.3}; +ST(0.09156348,0.14589395,0,0.09308158,0.15403623,0,0.084604507,0.15255901,0){734092.88,579061.91,1258841.2,-670961.7,-628036.95,-1326319,-791796.8,-525997.02,-1187789.9,602866.55,672596.25,1390056.3,843431.47,469080.04,1113216.6}; +ST(0,0.2,0,0.007303543,0.20469543,0,0,0.20714286,0){0,422375.13,0,0,-880191.16,0,0,531663.92,0,0,303952.91,0,0,-861341.37,0}; +ST(0.052478219,0.23860916,0,0.056766116,0.23329497,0,0.059437672,0.2400817,0){1222305.6,1298096.4,1145348.7,-3178913.4,-3286228.7,-2999714,3866354.4,3735031.6,3711340.5,-3010118,-2434254.7,-3009146,951644.63,-7070.0355,1160252.2}; +ST(0.045331711,0.23557633,0,0.04727629,0.22823863,0,0.050960377,0.23252058,0){1270563.3,1418822.2,1342135.9,-3255008.9,-3492237.2,-3383651.2,3813331,3684627.2,3804738.6,-2700862,-1892328,-2403721.7,404484.48,-919608.01,-148681.88}; +ST(0.072044079,0.08604506,0,0.075872285,0.081656016,0,0.079265602,0.086677581,0){2688599.4,2427639,2114636.1,649473.83,758134.07,488789.06,-1882262.6,-1432759.9,-1512904.7,-2986497.2,-2638364.3,-2351470.6,-1825996.4,-2029677.1,-1382326.1}; +ST(0.084917502,0.034253561,0,0.092450683,0.030760689,0,0.092141527,0.03991184,0){1742331.8,900007.85,927649.93,1520580.8,807431.66,767955.56,1105294,631804.95,476054.53,549324.68,391202.83,102192.68,-76880.401,110124.82,-289378.9}; +ST(0.092295863,0.26000779,0,0.092520768,0.26920591,0,0.085115353,0.26563346,0){193329.27,145042.72,313056.52,-546576.12,-420173.4,-899063.8,805368.84,651988.34,1369900.4,-924990.4,-816598.86,-1665255.4,884724.5,896908.09,1747205.8}; +ST(0.059437672,0.2400817,0,0.056766116,0.23329497,0,0.064373335,0.2338171,0){1145348.7,1298096.4,1185902.3,-2999714,-3286228.7,-3010536.1,3711340.5,3735031.6,3446119.8,-3009146,-2434254.7,-2291596.2,1160252.2,-7070.0355,79206.699}; +ST(0.075978544,0.034466341,0,0.067616069,0.037109229,0,0.068707287,0.030314019,0){2615244.9,3239242.7,3188897.7,2278283.7,2756202.5,2870259.7,1647758.2,1862139.4,2264806.3,804880.96,690369.93,1433032.7,-142067.87,-584563.48,457746.25}; +ST(0.01062282,0.18656765,0,0.016878531,0.18478654,0,0.017373248,0.19021363,0){711483.53,1113458.1,1095255.9,-1243147.4,-1906862.4,-1990705.9,217509.34,245299.96,532263.7,1080570.1,1732097.5,1555631.8,-1025407.6,-1479759.2,-1804413.6}; +ST(0.013878694,0.17880836,0,0.016878531,0.18478654,0,0.01062282,0.18656765,0){971566.52,1113458.1,711483.53,-1548960.4,-1906862.4,-1243147.4,-51095.574,245299.96,217509.34,1579530,1732097.5,1080570.1,-887966.26,-1479759.2,-1025407.6}; +ST(0.069536278,0.26943087,0,0.068237016,0.26229006,0,0.076498673,0.26519709,0){505602.11,639705.29,473307.48,-1465439,-1820649,-1357765.2,2276404,2721368.6,2063933,-2856108.7,-3203243.1,-2499100.3,3145421.5,3191912.1,2605934.6}; +ST(0.059551151,0.20970619,0,0.053221516,0.20704838,0,0.060432552,0.20227914,0){1688112.8,1805672.4,1798951.1,-3664209.4,-3837129.3,-3671781.8,2601193.1,2511247.5,2023610.8,619333.89,1011998.4,1565241.8,-3326584.6,-3650194.7,-3653837}; +ST(0.066799394,0.09162077,0,0.072044079,0.08604506,0,0.07492972,0.092844339,0){2974160.1,2688599.4,2431427.6,440022.16,649473.83,308451.38,-2469083.6,-1882262.6,-2083891.4,-3274492.4,-2986497.2,-2656803.1,-1290097.2,-1825996.4,-910298.79}; +ST(0.0098751756,0.25600949,0,0.0071908097,0.26035264,0,0.0060491453,0.25298129,0){270470.11,179155.76,178654.23,-755004.71,-507033.49,-493529.07,1082095.4,748779.14,691183.17,-1183544.7,-863311.12,-724662.05,1038261.4,830950.48,585970.08}; +ST(0.077140734,0.17217741,0,0.083969261,0.16737329,0,0.085369203,0.17624497,0){1584233.7,1198489.7,1039089.6,-2313491.7,-1632158.2,-1603144.1,-519338.58,-607916.58,-168940.91,2552719.3,1852187.2,1695116.9,-655929.75,-62490.334,-751642.95}; +ST(0.041402067,0.22952626,0,0.04727629,0.22823863,0,0.045331711,0.23557633,0){1348916.4,1418822.2,1270563.3,-3344816,-3492237.2,-3255008.9,3600200.4,3684627.2,3813331,-1982154,-1892328,-2700862,-667743.82,-919608.01,404484.48}; +ST(0.0071147476,0.24137211,0,0.013821768,0.24617185,0,0.0087429334,0.24792416,0){259907.57,454053.45,283453.34,-684802.64,-1221678.8,-768118.62,859611.54,1611329.8,1029935.2,-720499.62,-1502439.1,-992967.39,317972.39,928515.88,667809.3}; +ST(0.007303543,0.20469543,0,0.0051799073,0.21317882,0,0,0.20714286,0){422375.13,276031.48,0,-880191.16,-615227.88,0,531663.92,479976.29,0,303952.91,25450.705,0,-861341.37,-511551.59,0}; +ST(0.052748817,0.036292023,0,0.054261983,0.029107824,0,0.060819012,0.031697917,0){3796611.1,3801269,3608360,3254886.9,3450822.2,3214477.8,2248728.5,2782228.4,2469695.4,921690.78,1857139.4,1455299.1,-537197.11,760852.59,281702.17}; +ST(0.064832361,0.062804408,0,0.070754378,0.060222618,0,0.072323403,0.067507008,0){3281120.4,2932444.5,2781512.1,1912310.8,1804303.3,1448400.9,-254314.65,-17984.254,-578922.09,-2314932.7,-1833384.6,-2328912.3,-3410309.6,-2943704.7,-2963263.7}; +ST(0.011197941,0.071439681,0,0.0060853536,0.074713803,0,0.0062494098,0.068021592,0){1244724.5,681675.12,709501.16,579995.21,285253.65,364477.97,-394493.66,-277070.48,-157824.6,-1158343.6,-678306.76,-603457.47,-1303869.8,-685312.86,-756039.79}; +ST(0.05288218,0.14757716,0,0.045364072,0.14896511,0,0.047918899,0.14257657,0){2767228.4,2729630.7,2842478.3,-2626819.9,-2670475.8,-2400971.6,-2900596.1,-2787568.3,-3215455,2479722.6,2610132.2,1901551.7,3026446,2844182.1,3510918.5}; +ST(0,0.18571429,0,0.0062925762,0.18063125,0,0.01062282,0.18656765,0){0,445914.92,711483.53,0,-727143.63,-1243147.4,0,12632.594,217509.34,0,719304.1,1080570.1,0,-466469.22,-1025407.6}; +ST(0.077140734,0.17217741,0,0.071841704,0.17726974,0,0.071059851,0.17209017,0){1584233.7,1799263.7,1900690.4,-2313491.7,-2812994.5,-2772233.4,-519338.58,-214389.53,-629520.98,2552719.3,2933842.6,3060958.1,-655929.75,-1438939.3,-774142.34}; +ST(0.066992124,0.20847551,0,0.06966854,0.20076802,0,0.075422073,0.20645372,0){1540360.8,1570520.4,1273700.5,-3311175.4,-3162888.4,-2693470,2266191.6,1636334.6,1728669,706070.36,1503948.1,766631.5,-3078419.5,-3161601.9,-2583646.6}; +ST(0.039157325,0.25334591,0,0.043027686,0.24899973,0,0.04563604,0.25694979,0){884627.38,999522.33,859240.08,-2446896,-2720190.5,-2406042.8,3436661.2,3683283.3,3472131.8,-3622356.9,-3620573.8,-3844488.4,2960330.2,2549278.8,3448330.3}; +ST(0.070175425,0.16144206,0,0.072573599,0.16764459,0,0.067098511,0.16826118,0){2074683.8,1881427.5,2121688.2,-2570674.4,-2572760.4,-2928224.5,-1460177,-936075.04,-1008555.7,2919916.2,2916777.1,3311710.7,762077.82,-135849.37,-250662.47}; +ST(0.014502412,0.16316663,0,0.014405512,0.17061143,0,0.0094805882,0.16707285,0){1121335,1063653,730151.01,-1429592.9,-1519257.6,-989834.58,-728363.13,-412907.51,-378084.11,1629901.1,1696192.6,1124284.7,280110.31,-313907.63,-22095.939}; +ST(0.060819012,0.031697917,0,0.057707972,0.025075094,0,0.064795861,0.023107998,0){3608360,3734947.8,3443592.1,3214477.8,3478918.2,3242943.8,2469695.4,2984396.6,2853338,1455299.1,2285289.9,2297494.4,281702.17,1429238.8,1607540.9}; +ST(0.01882241,0.070374011,0,0.012193394,0.066188359,0,0.016702178,0.061420197,0){2018056.9,1364188,1844408.3,970762.8,734639.92,1107331.1,-580354.6,-233939.49,-72241.295,-1830388.5,-1094586.7,-1222910.6,-2130853.3,-1450385,-1885264.1}; +ST(0.011197941,0.071439681,0,0.012193394,0.066188359,0,0.01882241,0.070374011,0){1244724.5,1364188,2018056.9,579995.21,734639.92,970762.8,-394493.66,-233939.49,-580354.6,-1158343.6,-1094586.7,-1830388.5,-1303869.8,-1450385,-2130853.3}; +ST(0.013132659,0.04767246,0,0.014691551,0.054118398,0,0.0094132111,0.052421332,0){1507774.2,1659245.8,1088603.4,1139737.5,1140472.1,768702.62,493500.09,265092.56,222919.17,-273193.01,-693242.8,-388347.22,-973395.4,-1435183.5,-885762.83}; +ST(0,0.14285714,0,0.0054758376,0.13911323,0,0.0078195435,0.14622426,0){0,495708.7,680366.1,0,-382921.42,-626541.18,0,-582869.54,-729870.69,0,250325.59,568744.13,0,639819.51,774663.29}; +ST(0.09071018,0.22887426,0,0.084319616,0.22565969,0,0.091864029,0.22106993,0){406264.77,696453.76,394005.54,-1003622.2,-1688204.7,-927852.61,1069446.3,1707540.6,863120.02,-568907.82,-743250.94,-241435.16,-233040.27,-649719.93,-536498.87}; +ST(0.033874053,0.071548869,0,0.037071258,0.0642048,0,0.041057987,0.068843254,0){3157862.8,3365311.2,3488848.8,1466537.3,1900443.5,1752771.3,-1010259.7,-391679.98,-855539,-2946084.6,-2513388.8,-3038218.5,-3304540.6,-3541461.8,-3709409.4}; +ST(0.07492972,0.092844339,0,0.069968451,0.098831219,0,0.066799394,0.09162077,0){2431427.6,2730411,2974160.1,308451.38,57648.531,440022.16,-2083891.4,-2671597.7,-2469083.6,-2656803.1,-2785714.6,-3274492.4,-910298.79,-173126.8,-1290097.2}; +ST(0,0.2,0,0.005051806,0.19767546,0,0.007303543,0.20469543,0){0,313084.45,422375.13,0,-612892.85,-880191.16,0,273796.53,531663.92,0,350786.74,303952.91,0,-609909.8,-861341.37}; +ST(0.04563604,0.25694979,0,0.049037582,0.25027532,0,0.054010827,0.25507988,0){859240.08,998508.07,897184.36,-2406042.8,-2730849.8,-2496661.6,3472131.8,3739350.2,3553831.7,-3844488.4,-3756698.7,-3839088.9,3448330.3,2778087.3,3290330.5}; +ST(0.084604507,0.15255901,0,0.083337094,0.16031526,0,0.077069107,0.15686929,0){1258841.2,1295652.6,1743907.9,-1326319,-1575018.8,-1994600,-1187789.9,-956036.82,-1457243.4,1390056.3,1781183.7,2204191.1,1113216.6,571788.58,1140253.2}; +ST(0.082709707,0.12855445,0,0.083559522,0.13424014,0,0.076271482,0.13373081,0){1568327.1,1462145.4,2012844.4,-869760.99,-981746.52,-1330317.6,-1955764.1,-1784737.2,-2463975.8,-1353.9511,395362.65,494859.01,1955094.7,1914407.3,2631758.9}; +ST(0.025468185,0.010276157,0,0.022427218,0.014872357,0,0.01808004,0.0081573173,0){2780034,2505875.7,2085729.2,2747892,2445229.8,2070583.9,2683968.5,2325397.7,2040406.9,2589008.8,2149288.4,1995444.2,2463902.9,1920956.8,1935913.6}; +ST(0.017990672,0.29207379,0,0.0220603,0.28602893,0,0.025130011,0.29009115,0){86228.122,181204.07,142877.47,-258100.45,-539738.59,-427099.39,428229.3,886739.53,706741.94,-595472.42,-1214791.9,-978805.55,758576.15,1516611.7,1240164.3}; +ST(0.076271482,0.13373081,0,0.081009521,0.1385969,0,0.075488644,0.14176328,0){2012844.4,1630909.4,1990888.2,-1330317.6,-1242340.3,-1647841.2,-2463975.8,-1926924,-2274843.7,494859.01,783271.16,1255935.2,2631758.9,2113542.9,2491166.6}; +ST(0.024008584,0.022367291,0,0.021348697,0.029751655,0,0.016759526,0.025876157,0){2639060.6,2382657.5,1932221.9,2494948.4,2153252.9,1791225.7,2214593.6,1716520.5,1519509.7,1813324.4,1114508.8,1136895.1,1312931.3,404958.41,671081.1}; +ST(0.020473685,0.087577432,0,0.025411973,0.082310594,0,0.027903545,0.087518505,0){2087024.2,2525130.6,2674848,451292.51,762374.09,580994.77,-1538224.3,-1532614.6,-1967676.8,-2322280.1,-2757779.1,-2976106,-1286407.6,-2058136.4,-1655065.1}; +ST(0.019499739,0.079597209,0,0.025411973,0.082310594,0,0.020473685,0.087577432,0){2040354.6,2525130.6,2087024.2,702945.71,762374.09,451292.51,-1095289.5,-1532614.6,-1538224.3,-2175701.2,-2757779.1,-2322280.1,-1830384.7,-2058136.4,-1286407.6}; +ST(0.039366597,0.19088868,0,0.044234359,0.18859393,0,0.043569257,0.19619451,0){1982365.2,2102462.5,1966078.6,-3628592.6,-3756018.8,-3794921.6,1030950.1,851571.98,1563901,2772526.5,3086402.5,2340412.7,-3333638.5,-3279385.1,-3741435.4}; +ST(0.042857143,0,0,0.039686874,0.0066116125,0,0.035714286,0,0){3783299.5,3676489.9,3496308.9,3783327.5,3658909.3,3496337.7,3783379.6,3623831.1,3496399.5,3783486.4,3571457.2,3496538.6,3783576.5,3501797.4,3496562.8}; +ST(0.035714286,0.3,0,0.03928574,0.29335694,0,0.042857143,0.3,0){0,127378.94,0,0,-381522.06,0,0,633829.06,0,0,-883092.25,0,0,1127859.7,0}; +ST(0.049165273,0.076760106,0,0.047307891,0.081963043,0,0.041803352,0.076750149,0){3570137.5,3516083,3453761.9,1384898,1080946.4,1340279.2,-1648055.9,-2102837.3,-1593440.1,-3672308.6,-3830300,-3552303.7,-3449021.3,-2905310.5,-3337911.6}; +ST(0.1,0.057142857,0,0.094913401,0.051076335,0,0.1,0.05,0){0,595503.05,0,0,429138.45,0,0,142901.48,0,0,-183223.65,0,0,-458373.75,0}; +ST(0.1,0.25,0,0.095090425,0.2489538,0,0.1,0.24285714,0){0,157454.16,0,0,-428416.46,0,0,579817.55,0,0,-569427.53,0,0,400020.01,0}; +ST(0.071428571,0,0,0.068476894,0.0069177029,0,0.064285714,0,0){3033974.4,3242851.4,3496327.6,3033978.9,3225849.8,3496358.5,3033982.8,3191931.3,3496415,3034008.5,3141298.2,3496523.2,3033714,3073847.6,3496472.9}; +ST(0.064285714,0.3,0,0.068366879,0.29272708,0,0.071428571,0.3,0){0,123803.43,0,0,-370697.46,0,0,615462.12,0,0,-856697.17,0,0,1092834.3,0}; +ST(0.057612168,0.01845715,0,0.057707972,0.025075094,0,0.051167355,0.022914381,0){3752599.8,3734947.8,3850137.8,3612875.5,3478918.2,3629520.4,3338613.5,2984396.6,3200919.1,2940029.2,2285289.9,2588908.3,2431782.4,1429238.8,1828396.4}; +ST(0.021658338,0.054940441,0,0.025221599,0.062165695,0,0.016702178,0.061420197,0){2341024.9,2618029.3,1844408.3,1587273.2,1547191.2,1107331.1,322446.89,-156575.4,-72241.295,-1046241,-1796512.5,-1222910.6,-2078353.5,-2702051.5,-1885264.1}; +ST(0.03663522,0.040674234,0,0.030602087,0.036163623,0,0.035858843,0.031497608,0){3463485.9,3125169.1,3456371.8,2844620.6,2682310.4,3083741.5,1717431.6,1859340.6,2378649.5,283267.24,772883.67,1417116.3,-1201989.6,-423255.99,302618.73}; +ST(0.054240748,0.10280037,0,0.052532368,0.096036702,0,0.061027247,0.098743066,0){3302360.6,3389506.1,3173016.6,-169115.68,240670.51,72008.811,-3462856.5,-3131818.5,-3099474,-3116478.2,-3594959.1,-3241975.4,505791.56,-718569.73,-216202.29}; +ST(0.030046638,0.13690443,0,0.033990129,0.14330646,0,0.026018946,0.14387862,0){2369378.2,2486957.5,2064539,-1721516.8,-2138608.5,-1800072.3,-2840145.3,-2786553.8,-2295230.1,944948.24,1748365.6,1506177.8,3098367.4,3031412.6,2488196.2}; +ST(0.054957014,0.24657048,0,0.060567191,0.25172758,0,0.054010827,0.25507988,0){1058545,917440.34,897184.36,-2852831,-2522838.3,-2496661.6,3777171.8,3497206.6,3553831.7,-3549694.2,-3596815.5,-3839088.9,2239441.1,2796536,3290330.5}; +ST(0.014305262,0.26641769,0,0.023009638,0.26878949,0,0.018422519,0.27450763,0){294901.31,417665.14,282501.19,-848621.76,-1208783.5,-827496.14,1298521.9,1871958.7,1313896,-1589572.3,-2337004.8,-1707268.8,1686004.5,2554445.3,1979556.1}; +ST(0.1,0.2,0,0.093164956,0.1980516,0,0.1,0.19285714,0){0,420734.09,0,0,-826537.04,0,0,376428.12,0,0,463603.83,0,0,-823893.15,0}; +ST(0.049204373,0.010884263,0,0.051745598,0.0053231545,0,0.056199026,0.010061392,0){3873084,3873250.9,3801979,3822842.7,3861228.9,3759859.9,3723003.5,3837214.6,3676084,3574883.8,3801308.2,3551608.2,3380124.5,3753417.7,3387596.5}; +ST(0.050010485,0.1548865,0,0.045364072,0.14896511,0,0.05288218,0.14757716,0){2672912.2,2729630.7,2767228.4,-2946373.7,-2670475.8,-2626819.9,-2371553.9,-2787568.3,-2900596.1,3189127.5,2610132.2,2479722.6,2045305.7,2844182.1,3026446}; +ST(0.055764419,0.28986395,0,0.051526128,0.29458598,0,0.048791783,0.28884593,0){202473.1,109871.78,226341.07,-605163.67,-329256.34,-675936.71,1001119.7,547568.39,1116322.7,-1385941.2,-764098.34,-1541505,1755276.4,977975.34,1945474.1}; +ST(0.083190767,0.25723975,0,0.074279052,0.25633166,0,0.07921504,0.25033934,0){434158.6,635900.39,606155.6,-1216864.4,-1777029.4,-1658203,1759626.8,2553015.8,2271843.6,-1955417.3,-2804423.5,-2284831,1765235.2,2479429.3,1693484.6}; +ST(0.077364239,0.048764008,0,0.073234584,0.04253025,0,0.082493405,0.042375289,0){2450679,2820532.7,1978611.8,1825420.5,2270240.9,1595319.9,734405.59,1277003.9,902966.17,-544039.45,34586.382,35643.43,-1683943.8,-1214797.7,-838916.97}; +ST(0.091953893,0.078440357,0,0.086276325,0.073599227,0,0.09123018,0.070922096,0){889726.23,1502743.3,983713.53,322434.75,653401.45,465586.72,-450550.32,-565297.67,-297764.17,-936443.15,-1464602.7,-904277.98,-825354.72,-1536324.4,-1034644.8}; +ST(0.041002292,0.08644635,0,0.033761495,0.088496681,0,0.032911969,0.081185013,0){3351345,3029395.9,3037931.3,787437.3,608605.12,971274.35,-2379027.1,-2298547.5,-1756226.8,-3725698.5,-3368980,-3289165.4,-2222336.9,-1747439.7,-2584916.3}; +ST(0.038843793,0.21103197,0,0.036840853,0.20596239,0,0.044637502,0.20577347,0){1637090.1,1679916.9,1811821.2,-3590120.4,-3538121.9,-3810004,2645890.8,2233718.4,2390091.8,433646.44,1067350,1174216.7,-3163532.2,-3414669.4,-3685779.4}; +ST(0.013794295,0.15422926,0,0.014502412,0.16316663,0,0.0068768393,0.16098373,0){1126466.2,1121335,553409.29,-1226232.2,-1429592.9,-680450.71,-1017954.8,-728363.13,-397156.36,1316565.7,1629901.1,771605.48,901352.54,280110.31,219690.78}; +ST(0.044637502,0.20577347,0,0.036840853,0.20596239,0,0.038597539,0.20095921,0){1811821.2,1679916.9,1801301.7,-3810004,-3538121.9,-3633864.6,2390091.8,2233718.4,1895634,1174216.7,1067350,1705394,-3685779.4,-3414669.4,-3630918.1}; +ST(0.056199026,0.010061392,0,0.051745598,0.0053231545,0,0.057142857,0,0){3801979,3873250.9,3783317.5,3759859.9,3861228.9,3783357,3676084,3837214.6,3783457.6,3551608.2,3801308.2,3783701.2,3387596.5,3753417.7,3783873.9}; +ST(0.057142857,0,0,0.06203594,0.0060944193,0,0.056199026,0.010061392,0){3783317.5,3604620.2,3801979,3783357,3589956.2,3759859.9,3783457.6,3560685.5,3676084,3783701.2,3516960.1,3551608.2,3783873.9,3458793.9,3387596.5}; +ST(0.049739958,0.088394034,0,0.047307891,0.081963043,0,0.054828578,0.081464579,0){3472240.4,3516083,3492382.6,703521.31,1080946.4,1101278.5,-2626240.1,-2102837.3,-2043909.2,-3862017.3,-3830300,-3789901.6,-2018648.2,-2905310.5,-2941538.5}; +ST(0.054828578,0.081464579,0,0.047307891,0.081963043,0,0.049165273,0.076760106,0){3492382.6,3516083,3570137.5,1101278.5,1080946.4,1384898,-2043909.2,-2102837.3,-1648055.9,-3789901.6,-3830300,-3672308.6,-2941538.5,-2905310.5,-3449021.3}; +ST(0.057142857,0.3,0,0.051526128,0.29458598,0,0.055764419,0.28986395,0){0,109871.78,202473.1,0,-329256.34,-605163.67,0,547568.39,1001119.7,0,-764098.34,-1385941.2,0,977975.34,1755276.4}; +ST(0.055764419,0.28986395,0,0.061805884,0.29356168,0,0.057142857,0.3,0){202473.1,121923.05,0,-605163.67,-365207.83,0,1001119.7,606815.62,0,-1385941.2,-845641.09,0,1755276.4,1080583.1,0}; +ST(0.089949388,0.2453858,0,0.095090425,0.2489538,0,0.090077759,0.25268961,0){339950.36,157454.16,291813.61,-911669.73,-428416.46,-805257.31,1193275.4,579817.55,1125037.4,-1095139.7,-569427.53,-1174248.1,648419.14,400020.01,940920.06}; +ST(0.08974924,0.047235181,0,0.094913401,0.051076335,0,0.08944657,0.05485846,0){1190814.4,595503.05,1211526.2,905328.07,429138.45,822600.19,402804.56,142901.48,169573.91,-196265.4,-183223.65,-537958.1,-748421.11,-458373.75,-1073022.7}; +ST(0.012304267,0.13852123,0,0.014210915,0.13228117,0,0.021167753,0.13548502,0){1094693.2,1289449.4,1816935.7,-832176.34,-813665.75,-1266652.3,-1294374.3,-1589638.3,-2200669.4,521821.54,227067.92,600161.11,1419655.5,1673024.3,2382629.9}; +ST(0.021167753,0.13548502,0,0.014210915,0.13228117,0,0.01788586,0.12850833,0){1816935.7,1289449.4,1616906.9,-1266652.3,-813665.75,-895214.81,-2200669.4,-1589638.3,-2016472.2,600161.11,227067.92,-4802.2192,2382629.9,1673024.3,2014144.7}; +ST(0.045375723,0.12284566,0,0.045894811,0.13135905,0,0.038464606,0.12667013,0){3072436,2973475.7,2859316.3,-1348503.3,-1819976.4,-1476046.2,-3829159.4,-3679581.9,-3573486.5,-800055.99,392676.16,-252868.56,3380414.3,3832095.1,3451249.3}; +ST(0.038464606,0.12667013,0,0.045894811,0.13135905,0,0.038217426,0.13599196,0){2859316.3,2973475.7,2738753.8,-1476046.2,-1819976.4,-1938161,-3573486.5,-3679581.9,-3305386.1,-252868.56,392676.16,972060.89,3451249.3,3832095.1,3589652.3}; +ST(0.0087429334,0.24792416,0,0.013821768,0.24617185,0,0.01180171,0.25230222,0){283453.34,454053.45,347512.04,-768118.62,-1221678.8,-957611.77,1029935.2,1611329.8,1333704.3,-992967.39,-1502439.1,-1383899.6,667809.3,928515.88,1095718.6}; +ST(0.025139549,0.12057635,0,0.023379755,0.12686903,0,0.017763535,0.12074209,0){2224740.3,2047772.9,1657769.5,-875333.98,-1065433.1,-657738.05,-2755721.9,-2558991,-2054600.3,-796179.51,-162203.53,-581651.26,2272644.8,2481221.5,1703675.4}; +ST(0.1,0.1,0,0.09416017,0.099511923,0,0.1,0.092857143,0){0,613994.66,0,0,5422.3845,0,0,-608645.22,0,0,-619557.01,0,0,-16415.987,0}; +ST(0.061015306,0.048529238,0,0.06961584,0.048915995,0,0.066012722,0.055502179,0){3533367.8,3063466,3257272.9,2640342.3,2277085.6,2187557.2,1080012.2,906160.93,399401.17,-753291.7,-697426.19,-1519988.7,-2396723.8,-2122325.6,-2940625.1}; +ST(0.066401409,0.0434645,0,0.06961584,0.048915995,0,0.061015306,0.048529238,0){3289675.8,3063466,3533367.8,2619840.6,2277085.6,2640342.3,1416557.6,906160.93,1080012.2,-75156.319,-697426.19,-753291.7,-1551772,-2122325.6,-2396723.8}; +ST(0.051703203,0.27754162,0,0.055001581,0.27169863,0,0.059078636,0.27701937,0){454636.43,565900.8,447007.97,-1338881.7,-1648356.5,-1315269.1,2149437.1,2587095.5,2107766.2,-2841702,-3300283.2,-2778864.5,3377384.9,3725567.5,3289755.3}; +ST(0.036308441,0.24745658,0,0.033025927,0.25326882,0,0.029124573,0.24658198,0){958174.94,809560.38,849052.23,-2591684.5,-2238649.8,-2288340.2,3460190.4,3142273.3,3030093.5,-3307339.6,-3308331.9,-2848204.4,2177878.8,2697705.3,1797881.3}; +ST(0.020636298,0.17424253,0,0.025851591,0.17077962,0,0.027644767,0.17736901,0){1433869.3,1763476.8,1774040.3,-2154082.5,-2524912.6,-2777088.7,-351921.61,-673288.62,-203929.31,2330929.4,2815714.9,2892544.7,-819073.82,-542697.73,-1431643.3}; +ST(0.1,0.092857143,0,0.09416017,0.099511923,0,0.093922759,0.092262381,0){0,613994.66,652083.63,0,5422.3845,89312.894,0,-608645.22,-550573,0,-619557.01,-715327.2,0,-16415.987,-262838.8}; +ST(0.084604507,0.15255901,0,0.088623123,0.15812222,0,0.083337094,0.16031526,0){1258841.2,918302.92,1295652.6,-1326319,-1074338,-1575018.8,-1187789.9,-735787.48,-956036.82,1390056.3,1199414.9,1781183.7,1113216.6,531983.03,571788.58}; +ST(0.017312959,0.14496605,0,0.022775714,0.15147437,0,0.013794295,0.15422926,0){1456929,1786181.8,1126466.2,-1303417.8,-1841345.2,-1226232.2,-1594293.7,-1729359.8,-1017954.8,1135517.7,1894858,1316565.7,1713822.2,1670732.8,901352.54}; +ST(0.057391395,0.19462543,0,0.064671223,0.19505087,0,0.060432552,0.20227914,0){1979510.6,1815232.4,1798951.1,-3763012.6,-3465163,-3671781.8,1410875.8,1334352.3,2023610.8,2491970.2,2252470.6,1565241.8,-3656419.8,-3382100.5,-3653837}; +ST(0,0.057142857,0,0.0079950318,0.059686314,0,0,0.064285714,0){0,917766.47,0,0,570756.35,0,0,7912.4367,0,0,-557994.72,0,0,-913265.38,0}; +ST(0.1,0.20714286,0,0.093706234,0.20596864,0,0.1,0.2,0){0,360320.46,0,0,-758974.46,0,0,479351.87,0,0,228803.73,0,0,-732939.79,0}; +ST(0.1,0.021428571,0,0.093571257,0.018380777,0,0.1,0.014285714,0){0,774815.13,0,0,746204.54,0,0,690036.86,0,0,608388.09,0,0,504051.02,0}; +ST(0.1,0.28571429,0,0.093593186,0.28160993,0,0.1,0.27857143,0){0,74588.283,0,0,-221009.65,0,0,359269.18,0,0,-484261.41,0,0,591230.88,0}; +ST(0.042155309,0.15589067,0,0.045364072,0.14896511,0,0.050010485,0.1548865,0){2577776.2,2729630.7,2672912.2,-2895603.6,-2670475.8,-2946373.7,-2220826.4,-2787568.3,-2371553.9,3169529.7,2610132.2,3189127.5,1830012,2844182.1,2045305.7}; +ST(0.059078636,0.27701937,0,0.055001581,0.27169863,0,0.061631884,0.26868773,0){447007.97,565900.8,591535.29,-1315269.1,-1648356.5,-1711593.4,2107766.2,2587095.5,2649353.2,-2778864.5,-3300283.2,-3304968.8,3289755.3,3725567.5,3608394.3}; +ST(0.024044461,0.20382537,0,0.015977634,0.20443356,0,0.018704911,0.19716585,0){1283805.9,895779.15,1103230.1,-2655634.7,-1862602.8,-2149261.2,1553893.8,1114548.4,934589.13,995311.88,659707.69,1263201.6,-2617892.2,-1827076.9,-2132672.2}; +ST(0.045416206,0.061541227,0,0.037071258,0.0642048,0,0.038435934,0.058364632,0){3642820.9,3365311.2,3459248.5,2181474.8,1900443.5,2206750.4,-155055.51,-391679.98,155241.86,-2429600.5,-2513388.8,-1952496,-3730025.8,-3541461.8,-3353689.4}; +ST(0.092195724,0.16853594,0,0.083969261,0.16737329,0,0.088381846,0.16289419,0){598378.34,1198489.7,911153.68,-829189.07,-1632158.2,-1156470.7,-278570.16,-607916.58,-599768.12,936666.51,1852187.2,1317920.1,-82641.6,-62490.334,244888.24}; +ST(0.067098511,0.16826118,0,0.072573599,0.16764459,0,0.071059851,0.17209017,0){2121688.2,1881427.5,1900690.4,-2928224.5,-2572760.4,-2772233.4,-1008555.7,-936075.04,-629520.98,3311710.7,2916777.1,3060958.1,-250662.47,-135849.37,-774142.34}; +ST(0.05718895,0.22161738,0,0.053624899,0.22742186,0,0.049797208,0.2214244,0){1508977,1430137,1551864.2,-3566099.1,-3503302.1,-3662861.4,3352547.9,3648370.9,3430735.4,-1004251.2,-1785483,-1003918.8,-1983866.6,-1060301.4,-2065424.5}; +ST(0.085714286,0,0,0.081119523,0.0085521597,0,0.078571429,0,0){1683752,2167108.8,2419478.6,1683802.7,2149779.2,2419535.2,1683911.1,2115263.6,2419645.1,1684108.7,2063869.7,2419827.2,1684003.7,1995657.9,2420024.4}; +ST(0.078571429,0.3,0,0.081165886,0.29137431,0,0.085714286,0.3,0){0,97729.953,0,0,-292395.17,0,0,484687.71,0,0,-673055.06,0,0,855744.16,0}; +ST(0.082709707,0.12855445,0,0.087905667,0.12517971,0,0.0910478,0.13167545,0){1568327.1,1140990.9,831136.87,-869760.99,-554517.87,-514132.23,-1955764.1,-1425990.8,-1027305.8,-1353.9511,-178453.87,122313.64,1955094.7,1334087.8,1073956.7}; +ST(0,0.20714286,0,0.0051799073,0.21317882,0,0,0.21428571,0){0,276031.48,0,0,-615227.88,0,0,479976.29,0,0,25450.705,0,0,-511551.59,0}; +ST(0.018704911,0.19716585,0,0.012931293,0.19295437,0,0.017373248,0.19021363,0){1103230.1,815194.79,1095255.9,-2149261.2,-1524077.7,-1990705.9,934589.13,510133.92,532263.7,1263201.6,1080471.8,1555631.8,-2132672.2,-1450076.4,-1804413.6}; +ST(0.011268327,0.1984065,0,0.012931293,0.19295437,0,0.018704911,0.19716585,0){682302.12,815194.79,1103230.1,-1344805.9,-1524077.7,-2149261.2,623458.07,510133.92,934589.13,739532.85,1080471.8,1263201.6,-1341727.7,-1450076.4,-2132672.2}; +ST(0.1,0.26428571,0,0.092295863,0.26000779,0,0.1,0.25714286,0){0,193329.27,0,0,-546576.12,0,0,805368.84,0,0,-924990.4,0,0,884724.5,0}; +ST(0.1,0.042857143,0,0.092141527,0.03991184,0,0.1,0.035714286,0){0,927649.93,0,0,767955.56,0,0,476054.53,0,0,102192.68,0,0,-289378.9,0}; +ST(0.1,0.17857143,0,0.093873231,0.17693503,0,0.1,0.17142857,0){0,445896.9,0,0,-694096.79,0,0,-59504.029,0,0,727141.13,0,0,-345394.37,0}; +ST(0.069002793,0.22246209,0,0.065627137,0.22734606,0,0.062992669,0.22303634,0){1267491.2,1270705.1,1396775.9,-3011719.2,-3111357.1,-3331109.7,2877058.6,3236198.8,3216330,-947533.34,-1576358.2,-1122974.8,-1573376.1,-953054.66,-1661551.4}; +ST(0.03690243,0.09394169,0,0.033761495,0.088496681,0,0.041002292,0.08644635,0){3135041.5,3029395.9,3351345,337961.95,608605.12,787437.3,-2760700,-2298547.5,-2379027.1,-3396384.7,-3368980,-3725698.5,-1002139.6,-1747439.7,-2222336.9}; +ST(0.021957304,0.26060316,0,0.023009638,0.26878949,0,0.014305262,0.26641769,0){505833.44,417665.14,294901.31,-1432636.8,-1208783.5,-848621.76,2119105.6,1871958.7,1298521.9,-2450095.8,-2337004.8,-1589572.3,2369995.8,2554445.3,1686004.5}; +ST(0.071428571,0,0,0.074656208,0.0053403125,0,0.068476894,0.0069177029,0){3033974.4,2772385.5,3242851.4,3033978.9,2763721.5,3225849.8,3033982.8,2746414.1,3191931.3,3034008.5,2720533.7,3141298.2,3033714,2685936.9,3073847.6}; +ST(0.042433189,0.024814669,0,0.035858843,0.031497608,0,0.033039341,0.023173825,0){3739739.8,3456371.8,3318087.9,3488658.7,3083741.5,3123656.1,3003356.3,2378649.5,2746181,2316430.4,1417116.3,2207795.9,1473602,302618.73,1539940.3}; +ST(0.033039341,0.023173825,0,0.035858843,0.031497608,0,0.028359285,0.029784535,0){3318087.9,3456371.8,2981166.2,3123656.1,3083741.5,2693525.9,2746181,2378649.5,2145980.7,2207795.9,1417116.3,1391347.7,1539940.3,302618.73,502245.34}; +ST(0.069002793,0.22246209,0,0.062992669,0.22303634,0,0.063265205,0.21633109,0){1267491.2,1396775.9,1505335.5,-3011719.2,-3331109.7,-3432481.9,2877058.6,3216330,2888962.8,-947533.34,-1122974.8,-265885.87,-1573376.1,-1661551.4,-2549234.8}; +ST(0.068366879,0.29272708,0,0.074657371,0.29452352,0,0.071428571,0.3,0){123803.43,79525.554,0,-370697.46,-238312.39,0,615462.12,396309.36,0,-856697.17,-552992.95,0,1092834.3,707611.71,0}; +ST(0.029124573,0.24658198,0,0.033025927,0.25326882,0,0.025641665,0.25311603,0){849052.23,809560.38,680173.91,-2288340.2,-2238649.8,-1879847.5,3030093.5,3142273.3,2635470.4,-2848204.4,-3308331.9,-2768550.2,1797881.3,2697705.3,2247361.6}; +ST(0.091593501,0.1915477,0,0.095453592,0.18738967,0,0.1,0.19285714,0){544831.72,307137.29,0,-1004107.1,-541566.85,0,301623.68,106216.39,0,749822.54,460538.95,0,-933881.71,-458087.35,0}; +ST(0.091593501,0.1915477,0,0.087008075,0.19596841,0,0.084368038,0.19048099,0){544831.72,798107.94,992852.93,-1004107.1,-1537171.7,-1809621.2,301623.68,625323.3,495817.1,749822.54,958187.81,1401810.9,-933881.71,-1512909.8,-1649308.4}; +ST(0.021251228,0.18136297,0,0.027644767,0.17736901,0,0.027249449,0.18607819,0){1398279.8,1774040.3,1646413.8,-2300353.4,-2777088.7,-2861109.6,85724.805,-203929.31,464444.42,2245163.6,2892544.7,2518610.9,-1534338.6,-1431643.3,-2323177.4}; +ST(0.027249449,0.18607819,0,0.027644767,0.17736901,0,0.03345202,0.18222482,0){1646413.8,1774040.3,1947746.5,-2861109.6,-2777088.7,-3237509.5,464444.42,-203929.31,196057.01,2518610.9,2892544.7,3107788.7,-2323177.4,-1431643.3,-2254322.8}; +ST(0.030466665,0.11568191,0,0.023213665,0.1150537,0,0.025770754,0.10718168,0){2608170,2130593.3,2378738.7,-773675.45,-605772.32,-316264.13,-3152461.4,-2564157.8,-2653040.8,-1443702.3,-1229375.9,-1984140.6,2136967.4,1684092.7,932667.69}; +ST(0.028678488,0.042143634,0,0.025565101,0.048609543,0,0.022876349,0.043626948,0){2968313.4,2702312,2488553.5,2399521.8,2017092.5,1978130.3,1370917.4,820389.33,1061959.9,79587.615,-584372.75,-72059.632,-1227272.3,-1841258.2,-1191549.5}; +ST(0.032229878,0.047894836,0,0.025565101,0.048609543,0,0.028678488,0.042143634,0){3188476.9,2702312,2968313.4,2403076.1,2017092.5,2399521.8,1025710.6,820389.33,1370917.4,-604377.64,-584372.75,79587.615,-2086050.7,-1841258.2,-1227272.3}; +ST(0.091864029,0.22106993,0,0.084319616,0.22565969,0,0.082942949,0.21818591,0){394005.54,696453.76,823054.75,-927852.61,-1688204.7,-1901094.8,863120.02,1707540.6,1667014.3,-241435.16,-743250.94,-282341.7,-536498.87,-649719.93,-1297502.9}; +ST(0.023478597,0.036718106,0,0.017433092,0.042090914,0,0.014137494,0.034012185,0){2561783.8,1971771.3,1641076.4,2187675.4,1594855,1435142,1494080.3,913057.13,1049094.4,582277.59,56690.05,531342.12,-414804.14,-810753.02,-53364.585}; +ST(0.013794295,0.15422926,0,0.022775714,0.15147437,0,0.021502186,0.15931359,0){1126466.2,1786181.8,1630158.4,-1226232.2,-1841345.2,-1947614.2,-1017954.8,-1729359.8,-1250943.8,1316565.7,1894858,2191316.6,901352.54,1670732.8,824223.66}; +ST(0.020473685,0.087577432,0,0.019165757,0.095107709,0,0.013428016,0.091778472,0){2087024.2,1930971.9,1408980.1,451292.51,168744.63,204626.15,-1538224.3,-1747493.7,-1174648.8,-2322280.1,-2069009.1,-1549888.7,-1286407.6,-502664.26,-600683.83}; +ST(0.06137482,0.19024807,0,0.064671223,0.19505087,0,0.057391395,0.19462543,0){1976038.9,1815232.4,1979510.6,-3592882,-3465163,-3763012.6,963745.22,1334352.3,1410875.8,2804392.5,2252470.6,2491970.2,-3258719.1,-3382100.5,-3656419.8}; +ST(0.038217426,0.13599196,0,0.033990129,0.14330646,0,0.030046638,0.13690443,0){2738753.8,2486957.5,2369378.2,-1938161,-2138608.5,-1721516.8,-3305386.1,-2786553.8,-2840145.3,972060.89,1748365.6,944948.24,3589652.3,3031412.6,3098367.4}; +ST(0,0.12142857,0,0.0062042788,0.11791514,0,0.0061411468,0.1246533,0){0,612847.32,591118.91,0,-208741.13,-280990.71,0,-750565.55,-738586.84,0,-286207.66,-106527.54,0,561848.67,682629.18}; +ST(0.0078195435,0.14622426,0,0.0054758376,0.13911323,0,0.012304267,0.13852123,0){680366.1,495708.7,1094693.2,-626541.18,-382921.42,-832176.34,-729870.69,-582869.54,-1294374.3,568744.13,250325.59,521821.54,774663.29,639819.51,1419655.5}; +ST(0.082390534,0.079333541,0,0.086276325,0.073599227,0,0.091953893,0.078440357,0){1865676.5,1502743.3,889726.23,650380.91,653401.45,322434.75,-988603.29,-565297.67,-450550.32,-1983689.6,-1464602.7,-936443.15,-1686881.4,-1536324.4,-825354.72}; +ST(0.038084092,0.1145524,0,0.040442009,0.11996282,0,0.035619257,0.12028764,0){2981407.2,2999410,2821397.9,-818508.93,-1143461.2,-1093830.4,-3575257.7,-3706983.7,-3491178.8,-1775238,-1150363.3,-1043884.2,2287308.3,2995190.5,2851838.9}; +ST(0.027644767,0.17736901,0,0.025851591,0.17077962,0,0.030623168,0.1713445,0){1774040.3,1763476.8,1985985.4,-2777088.7,-2524912.6,-2866418.8,-203929.31,-673288.62,-715248.18,2892544.7,2815714.9,3183566.3,-1431643.3,-542697.73,-696442.05}; +ST(0.025139549,0.12057635,0,0.023213665,0.1150537,0,0.030466665,0.11568191,0){2224740.3,2130593.3,2608170,-875333.98,-605772.32,-773675.45,-2755721.9,-2564157.8,-3152461.4,-796179.51,-1229375.9,-1443702.3,2272644.8,1684092.7,2136967.4}; +ST(0.08682376,0.20181233,0,0.087008075,0.19596841,0,0.093164956,0.1980516,0){767576.83,798107.94,420734.09,-1560255.4,-1537171.7,-826537.04,843726.65,625323.3,376428.12,688912.23,958187.81,463603.83,-1555436.8,-1512909.8,-823893.15}; +ST(0.093164956,0.1980516,0,0.087008075,0.19596841,0,0.091593501,0.1915477,0){420734.09,798107.94,544831.72,-826537.04,-1537171.7,-1004107.1,376428.12,625323.3,301623.68,463603.83,958187.81,749822.54,-823893.15,-1512909.8,-933881.71}; +ST(0.1,0.26428571,0,0.092520768,0.26920591,0,0.092295863,0.26000779,0){0,145042.72,193329.27,0,-420173.4,-546576.12,0,651988.34,805368.84,0,-816598.86,-924990.4,0,896908.09,884724.5}; +ST(0.092141527,0.03991184,0,0.092450683,0.030760689,0,0.1,0.035714286,0){927649.93,900007.85,0,767955.56,807431.66,0,476054.53,631804.95,0,102192.68,391202.83,0,-289378.9,110124.82,0}; +ST(0.015758122,0.23699049,0,0.013821768,0.24617185,0,0.0071147476,0.24137211,0){597291.98,454053.45,259907.57,-1541119.1,-1221678.8,-684802.64,1837947.1,1611329.8,859611.54,-1363109.4,-1502439.1,-720499.62,315646.37,928515.88,317972.39}; +ST(0.08264437,0.14444108,0,0.076625322,0.14929356,0,0.075488644,0.14176328,0){1463951.5,1845555.4,1990888.2,-1293607.4,-1818255.1,-1647841.2,-1614532.1,-1872475.3,-2274843.7,1105781,1790618.2,1255935.2,1743195.6,1898765.5,2491166.6}; +ST(0.093706234,0.20596864,0,0.093164956,0.1980516,0,0.1,0.2,0){360320.46,420734.09,0,-758974.46,-826537.04,0,479351.87,376428.12,0,228803.73,463603.83,0,-732939.79,-823893.15,0}; +ST(0.048663579,0.053435419,0,0.053426379,0.049768916,0,0.056317057,0.058022103,0){3726394.8,3727873.1,3630316.8,2589713.3,2738031.5,2330872.5,663071.82,1021148,197001.66,-1465861.1,-966926.63,-2007682.1,-3147918.6,-2698501,-3494460.7}; +ST(0.052532368,0.096036702,0,0.044548934,0.094607351,0,0.049739958,0.088394034,0){3389506.1,3364209.6,3472240.4,240670.51,323528.56,703521.31,-3131818.5,-3009655.6,-2626240.1,-3594959.1,-3622750.1,-3862017.3,-718569.73,-961698.97,-2018648.2}; +ST(0.070175425,0.16144206,0,0.067098511,0.16826118,0,0.061476805,0.16269562,0){2074683.8,2121688.2,2391378.9,-2570674.4,-2928224.5,-3025373.1,-1460177,-1008555.7,-1589341.3,2919916.2,3311710.7,3446908.2,762077.82,-250662.47,675366.83}; +ST(0.0087429334,0.24792416,0,0.0043813653,0.24702694,0,0.0071147476,0.24137211,0){283453.34,145794.38,259907.57,-768118.62,-393661.32,-684802.64,1029935.2,523477.05,859611.54,-992967.39,-496310.62,-720499.62,667809.3,320224.07,317972.39}; +ST(0.092195724,0.16853594,0,0.093873231,0.17693503,0,0.085369203,0.17624497,0){598378.34,445896.9,1039089.6,-829189.07,-694096.79,-1603144.1,-278570.16,-59504.029,-168940.91,936666.51,727141.13,1695116.9,-82641.6,-345394.37,-751642.95}; +ST(0.082583958,0.10907049,0,0.086838536,0.10220901,0,0.091053567,0.10618538,0){1698614.9,1341203.8,914271.31,-286603.09,-54099.381,-104388.15,-1936849,-1393108.8,-1006721.9,-1323464.6,-1282822.5,-787386.88,836522.31,161880.97,309052.61}; +ST(0.044637502,0.20577347,0,0.053221516,0.20704838,0,0.049232245,0.21047418,0){1811821.2,1805672.4,1752658.6,-3810004,-3837129.3,-3827070.5,2390091.8,2511247.5,2777012.8,1174216.7,1011998.4,540242.46,-3685779.4,-3650194.7,-3416565.4}; +ST(0.051624576,0.1997036,0,0.053221516,0.20704838,0,0.044637502,0.20577347,0){1943020.7,1805672.4,1811821.2,-3875569.2,-3837129.3,-3810004,1911651.5,2511247.5,2390091.8,1974364.4,1011998.4,1174216.7,-3875892.9,-3650194.7,-3685779.4}; +ST(0.013794295,0.15422926,0,0.0056981356,0.15371602,0,0.0078195435,0.14622426,0){1126466.2,478995.44,680366.1,-1226232.2,-516269.88,-626541.18,-1017954.8,-438816.38,-729870.69,1316565.7,550400.04,568744.13,901352.54,395913.98,774663.29}; +ST(0.013878694,0.17880836,0,0.0062925762,0.18063125,0,0.0069613667,0.17349451,0){971566.52,445914.92,517779.21,-1548960.4,-727143.63,-769992.03,-51095.574,12632.594,-142713.64,1579530,719304.1,839532.94,-887966.26,-466469.22,-266340.1}; +ST(0,0.23571429,0,0.0071147476,0.24137211,0,0,0.24285714,0){0,259907.57,0,0,-684802.64,0,0,859611.54,0,0,-720499.62,0,0,317972.39,0}; +ST(0.021502186,0.15931359,0,0.014502412,0.16316663,0,0.013794295,0.15422926,0){1630158.4,1121335,1126466.2,-1947614.2,-1429592.9,-1226232.2,-1250943.8,-728363.13,-1017954.8,2191316.6,1629901.1,1316565.7,824223.66,280110.31,901352.54}; +ST(0.01882241,0.070374011,0,0.027058874,0.069011929,0,0.026270926,0.075674812,0){2018056.9,2727323.5,2630439.6,970762.8,1363815.9,1063205.3,-580354.6,-681543.48,-1137545.6,-1830388.5,-2386220.5,-2660659.2,-2130853.3,-2898415.6,-2599027.8}; +ST(0.072323403,0.067507008,0,0.074756101,0.075901522,0,0.066925078,0.074981916,0){2781512.1,2549479.1,3090390.8,1448400.9,1021825.1,1280900.5,-578922.09,-1118145.3,-1278621.5,-2328912.3,-2588166.7,-3089611.2,-2963263.7,-2507455.8,-3091904.4}; +ST(0.010955873,0.10281868,0,0.013465065,0.10662372,0,0.0081152275,0.10988635,0){1124212.8,1351132.7,821145.89,-57954.543,-165451.82,-151361.79,-1179275.3,-1496410,-944689.8,-1060620.9,-1147793.4,-619246.83,173274.75,489093.12,439508.43}; +ST(0.069968451,0.098831219,0,0.065931692,0.10408722,0,0.061027247,0.098743066,0){2730411,2911358.9,3173016.6,57648.531,-218409.17,72008.811,-2671597.7,-3113407,-3099474,-2785714.6,-2661455,-3241975.4,-173126.8,651464.78,-216202.29}; +ST(0.018704911,0.19716585,0,0.025476801,0.19755762,0,0.024044461,0.20382537,0){1103230.1,1423125.8,1283805.9,-2149261.2,-2782737.9,-2655634.7,934589.13,1235431.1,1553893.8,1263201.6,1602470.1,995311.88,-2132672.2,-2766638.2,-2617892.2}; +ST(0,0.27857143,0,0.0067236406,0.28198319,0,0,0.28571429,0){0,76627.274,0,0,-227172.13,0,0,369685.4,0,0,-499127.77,0,0,610772.43,0}; +ST(0.026018946,0.14387862,0,0.033990129,0.14330646,0,0.030440206,0.150204,0){2064539,2486957.5,2239650.6,-1800072.3,-2138608.5,-2249230.7,-2295230.1,-2786553.8,-2230054.7,1506177.8,1748365.6,2258843.4,2488196.2,3031412.6,2220211.9}; +ST(0,0.014285714,0,0.006650898,0.018174199,0,0,0.021428571,0){0,801243.34,0,0,772347.91,0,0,715593.27,0,0,633022.27,0,0,527557,0}; +ST(0.022740693,0.23189018,0,0.021374843,0.22646669,0,0.026971271,0.22659033,0){887604.04,906782.43,1090633.5,-2230116.3,-2208721,-2658504.1,2485475.6,2264460.9,2731189,-1529145.6,-1042528.4,-1267784.1,-172982.46,-767856.24,-909068.56}; +ST(0.030075176,0.23324008,0,0.025350652,0.23917347,0,0.022740693,0.23189018,0){1077047.3,868665.73,887604.04,-2725827,-2265304,-2230116.3,3095770.8,2773502.3,2485475.6,-2013325.9,-2193941.8,-1529145.6,-13872.597,753574.67,-172982.46}; +ST(0.054957014,0.24657048,0,0.061408089,0.24582042,0,0.060567191,0.25172758,0){1058545,1017142.7,917440.34,-2852831,-2732695.2,-2522838.3,3777171.8,3591948.1,3497206.6,-3549694.2,-3325647.6,-3596815.5,2239441.1,2017029.8,2796536}; +ST(0.047385855,0.10193045,0,0.044548934,0.094607351,0,0.052532368,0.096036702,0){3329666.7,3364209.6,3389506.1,-117239.93,323528.56,240670.51,-3442848.4,-3009655.6,-3131818.5,-3204510.9,-3622750.1,-3594959.1,350991.89,-961698.97,-718569.73}; +ST(0.069467767,0.146519,0,0.064971856,0.15110456,0,0.061244461,0.14481879,0){2287173.5,2431817,2643484.5,-2120501.9,-2488096.1,-2356788.3,-2441744.6,-2374265.3,-2899198.4,1942651.5,2543085,2042509.4,2583122,2315361.9,3121060.9}; +ST(0.0081152275,0.10988635,0,0.0052460498,0.10332732,0,0.010955873,0.10281868,0){821145.89,545715.18,1124212.8,-151361.79,-33256.292,-57954.543,-944689.8,-576983.54,-1179275.3,-619246.83,-508602.25,-1060620.9,439508.43,99155.047,173274.75}; +ST(0.030466665,0.11568191,0,0.038084092,0.1145524,0,0.035619257,0.12028764,0){2608170,2981407.2,2821397.9,-773675.45,-818508.93,-1093830.4,-3152461.4,-3575257.7,-3491178.8,-1443702.3,-1775238,-1043884.2,2136967.4,2287308.3,2851838.9}; +ST(0.0094132111,0.052421332,0,0.014691551,0.054118398,0,0.0079950318,0.059686314,0){1088603.4,1659245.8,917766.47,768702.62,1140472.1,570756.35,222919.17,265092.56,7912.4367,-388347.22,-693242.8,-557994.72,-885762.83,-1435183.5,-913265.38}; +ST(0.020636298,0.17424253,0,0.027644767,0.17736901,0,0.021251228,0.18136297,0){1433869.3,1774040.3,1398279.8,-2154082.5,-2777088.7,-2300353.4,-351921.61,-203929.31,85724.805,2330929.4,2892544.7,2245163.6,-819073.82,-1431643.3,-1534338.6}; +ST(0.0081152275,0.10988635,0,0.013465065,0.10662372,0,0.016927821,0.11108648,0){821145.89,1351132.7,1644246.3,-151361.79,-165451.82,-340994.5,-944689.8,-1496410,-1914445.6,-619246.83,-1147793.4,-1176430.8,439508.43,489093.12,981584.41}; +ST(0.054828578,0.081464579,0,0.060416267,0.076932239,0,0.064352171,0.083117586,0){3492382.6,3380545.3,3167194.8,1101278.5,1302521.2,915483.69,-2043909.2,-1576156.6,-1987167.2,-3789901.6,-3485992.8,-3477240.4,-2941538.5,-3253298.6,-2495770}; +ST(0.0069979116,0.22643766,0,0.0069516057,0.23320895,0,0,0.22857143,0){317964.48,288078.49,0,-774386.26,-728952.19,0,793599.18,827497.2,0,-364658.79,-537397.4,0,-270536.88,-5267.3055,0}; +ST(0.0068768393,0.16098373,0,0.0056981356,0.15371602,0,0.013794295,0.15422926,0){553409.29,478995.44,1126466.2,-680450.71,-516269.88,-1226232.2,-397156.36,-438816.38,-1017954.8,771605.48,550400.04,1316565.7,219690.78,395913.98,901352.54}; +ST(0.08264437,0.14444108,0,0.081009521,0.1385969,0,0.087083587,0.13880919,0){1463951.5,1630909.4,1144744.3,-1293607.4,-1242340.3,-877072.07,-1614532.1,-1926924,-1349889.8,1105781,783271.16,561444.4,1743195.6,2113542.9,1481228.8}; +ST(0.064373335,0.2338171,0,0.066600159,0.24211306,0,0.059437672,0.2400817,0){1185902.3,1004296.2,1145348.7,-3010536.1,-2655015,-2999714,3446119.8,3359675.2,3711340.5,-2291596.2,-2867211.3,-3009146,79206.699,1352854.8,1160252.2}; +ST(0.061015306,0.048529238,0,0.053426379,0.049768916,0,0.054794838,0.043915046,0){3533367.8,3727873.1,3735662.6,2640342.3,2738031.5,2959425,1080012.2,1021148,1568238.5,-753291.7,-966926.63,-148813.91,-2396723.8,-2698501,-1835117.4}; +ST(0.074931673,0.27468874,0,0.081004963,0.27070547,0,0.082516133,0.27647665,0){363389.18,333174.81,248899.48,-1064791.9,-968418.7,-731674.12,1691857.9,1513258.3,1170289.2,-2200836.4,-1916833.2,-1538273.3,2556129.1,2141327.9,1813237.5}; +ST(0.082332164,0.023444943,0,0.080699945,0.029142305,0,0.074388951,0.025102472,0){2029600,2185639.9,2772012.4,1907886.4,1983669.2,2581574.2,1671751.1,1598386.1,2213781,1335359.8,1065401.8,1693914.7,918760.81,433818.71,1057277.9}; +ST(0,0.10714286,0,0.0052460498,0.10332732,0,0.0081152275,0.10988635,0){0,545715.18,821145.89,0,-33256.292,-151361.79,0,-576983.54,-944689.8,0,-508602.25,-619246.83,0,99155.047,439508.43}; +ST(0.019499739,0.079597209,0,0.01318623,0.084416193,0,0.012549176,0.077039569,0){2040354.6,1411871.7,1370920.5,702945.71,378554.62,525978.15,-1095289.5,-931831.12,-643140.23,-2175701.2,-1560266,-1415881.7,-1830384.7,-1046999.7,-1316306.1}; +ST(0.084917502,0.034253561,0,0.085916752,0.02828,0,0.092450683,0.030760689,0){1742331.8,1643257.2,900007.85,1520580.8,1500211.7,807431.66,1105294,1226559.7,631804.95,549324.68,846114.35,391202.83,-76880.401,391827.49,110124.82}; +ST(0.092520768,0.26920591,0,0.086077973,0.27164165,0,0.085115353,0.26563346,0){145042.72,243157.03,313056.52,-420173.4,-708191.99,-899063.8,651988.34,1111255.9,1369900.4,-816598.86,-1417072.6,-1665255.4,896908.09,1598582.9,1747205.8}; +ST(0.037999827,0.27482627,0,0.045592054,0.27439642,0,0.045044357,0.28188841,0){474219.19,513714.39,362990.51,-1389905,-1504437.2,-1075960.6,2209621.2,2387679.2,1750378.7,-2876809.4,-3100344.3,-2362097.1,3345267.4,3591305.7,2889034}; +ST(0.077393474,0.16425214,0,0.083969261,0.16737329,0,0.077140734,0.17217741,0){1650679.7,1198489.7,1584233.7,-2141613.9,-1632158.2,-2313491.7,-1013799.5,-607916.58,-519338.58,2443278.1,1852187.2,2552719.3,287063.28,-62490.334,-655929.75}; +ST(0.066925078,0.074981916,0,0.074756101,0.075901522,0,0.070865224,0.080352924,0){3090390.8,2549479.1,2808030.6,1280900.5,1021825.1,934415.1,-1278621.5,-1118145.3,-1562677.5,-3089611.2,-2588166.7,-3017110.1,-3091904.4,-2507455.8,-2458745.5}; +ST(0.017373248,0.19021363,0,0.023309936,0.19197185,0,0.018704911,0.19716585,0){1095255.9,1390526.6,1103230.1,-1990705.9,-2573914.4,-2149261.2,532263.7,799964.88,934589.13,1555631.8,1893175.4,1263201.6,-1804413.6,-2411477.9,-2132672.2}; +ST(0.079090117,0.19794942,0,0.081922129,0.20489902,0,0.075422073,0.20645372,0){1206859.6,996952.98,1273700.5,-2368529.7,-2081157.6,-2693470,1073015.3,1266338.6,1728669,1335740.9,704044.3,766631.5,-2359414.1,-2032271.3,-2583646.6}; +ST(0.08682376,0.20181233,0,0.081922129,0.20489902,0,0.079090117,0.19794942,0){767576.83,996952.98,1206859.6,-1560255.4,-2081157.6,-2368529.7,843726.65,1266338.6,1073015.3,688912.23,704044.3,1335740.9,-1555436.8,-2032271.3,-2359414.1}; +ST(0.039686874,0.0066116125,0,0.031710863,0.0075461758,0,0.035714286,0,0){3676489.9,3254919.5,3496308.9,3658909.3,3234618.2,3496337.7,3623831.1,3194153.7,3496399.5,3571457.2,3133832.1,3496538.6,3501797.4,3053845.3,3496562.8}; +ST(0.035714286,0.3,0,0.031264826,0.29263185,0,0.03928574,0.29335694,0){0,124484.17,127378.94,0,-372709.78,-381522.06,0,618717.86,633829.06,0,-861054.65,-883092.25,0,1098239.8,1127859.7}; +ST(0.022775714,0.15147437,0,0.030440206,0.150204,0,0.027609688,0.15620978,0){1786181.8,2239650.6,2023546.1,-1841345.2,-2249230.7,-2286520.9,-1729359.8,-2230054.7,-1726415,1894858,2258843.4,2510934.9,1670732.8,2220211.9,1400022.9}; +ST(0.0079950318,0.059686314,0,0.014691551,0.054118398,0,0.016702178,0.061420197,0){917766.47,1659245.8,1844408.3,570756.35,1140472.1,1107331.1,7912.4367,265092.56,-72241.295,-557994.72,-693242.8,-1222910.6,-913265.38,-1435183.5,-1885264.1}; +ST(0,0.028571429,0,0.0058133292,0.032528446,0,0,0.035714286,0){0,694559.72,0,0,614750.96,0,0,464300.7,0,0,260495.38,0,0,26512.55,0}; +ST(0.067728608,0.12931058,0,0.068478919,0.13862632,0,0.060672554,0.13561545,0){2567539,2426951.1,2778852.8,-1463631.5,-1850187.5,-1944873,-3196956.5,-2866745.3,-3362653.4,89062.443,1169007.7,935707.85,3235608.2,3144665.9,3643681.7}; +ST(0,0.26428571,0,0.0060732531,0.2674669,0,0,0.27142857,0){0,124750.88,0,0,-359918.85,0,0,553735.12,0,0,-683931.42,0,0,735399.5,0}; +ST(0.072323403,0.067507008,0,0.064846874,0.068845861,0,0.064832361,0.062804408,0){2781512.1,3243292.3,3281120.4,1448400.9,1629296.1,1912310.8,-578922.09,-795531.06,-254314.65,-2328912.3,-2824516.6,-2314932.7,-2963263.7,-3448034.5,-3410309.6}; +ST(0.1,0.15714286,0,0.09308158,0.15403623,0,0.1,0.15,0){0,579061.91,0,0,-628036.95,0,0,-525997.02,0,0,672596.25,0,0,469080.04,0}; +ST(0.040431855,0.24188745,0,0.037546984,0.23452457,0,0.045331711,0.23557633,0){1110505,1205921.7,1270563.3,-2932804,-3072707.6,-3255008.9,3702149.5,3550700.1,3813331,-3142324.5,-2423829.8,-2700862,1453973.2,201013.93,404484.48}; +ST(0.067728608,0.12931058,0,0.070840483,0.12204614,0,0.076158908,0.12549637,0){2567539,2470738.2,2092101.1,-1463631.5,-1044803.2,-1030118.9,-3196956.5,-3073782.1,-2615047.7,89062.443,-729197.53,-297340.89,3235608.2,2652961,2464056}; +ST(0.046181733,0.0056701177,0,0.043829005,0.011024747,0,0.039686874,0.0066116125,0){3851009.3,3801549.1,3676489.9,3837454.5,3750937.1,3658909.3,3810385,3650381.9,3623831.1,3769920.5,3501249.8,3571457.2,3715901.2,3305260.3,3501797.4}; +ST(0.066803853,0.25459223,0,0.060567191,0.25172758,0,0.065478411,0.24860928,0){789541.66,917440.34,912058.17,-2193455.3,-2522838.3,-2478342.9,3110738.9,3497206.6,3344041.2,-3337877,-3596815.5,-3264436.9,2824240.3,2796536,2261773.6}; +ST(0.03928574,0.29335694,0,0.043131118,0.28864457,0,0.045931579,0.29422002,0){127378.94,225252.57,116468.36,-381522.06,-672574.82,-348980.73,633829.06,1110400.5,580225.36,-883092.25,-1532552.2,-809364.6,1127859.7,1932837.8,1035478}; +ST(0.038597539,0.20095921,0,0.043569257,0.19619451,0,0.044637502,0.20577347,0){1801301.7,1966078.6,1811821.2,-3633864.6,-3794921.6,-3810004,1895634,1563901,2390091.8,1705394,2340412.7,1174216.7,-3630918.1,-3741435.4,-3685779.4}; +ST(0.044637502,0.20577347,0,0.043569257,0.19619451,0,0.051624576,0.1997036,0){1811821.2,1966078.6,1943020.7,-3810004,-3794921.6,-3875569.2,2390091.8,1563901,1911651.5,1174216.7,2340412.7,1974364.4,-3685779.4,-3741435.4,-3875892.9}; +ST(0,0.092857143,0,0.0071591483,0.096788703,0,0,0.1,0){0,756711.76,0,0,43634.951,0,0,-710572.63,0,0,-795194.2,0,0,-130859.45,0}; +ST(0.017990672,0.29207379,0,0.010662343,0.29482959,0,0.0093450955,0.28843768,0){86228.122,34537.041,67949.514,-258100.45,-103506.64,-202850.84,428229.3,172164.12,334776.34,-595472.42,-240303.04,-461793.67,758576.15,307518.14,581935.08}; +ST(0.0093389246,0.011691623,0,0.010679145,0.0052482016,0,0.01808004,0.0081573173,0){1120186.5,1277155.8,2085729.2,1103410.3,1273289.3,2070583.9,1070108.3,1265566.3,2040406.9,1020788.4,1254019.7,1995444.2,956114.18,1238493.9,1935913.6}; +ST(0.060672554,0.13561545,0,0.054237851,0.14012792,0,0.053497526,0.1329974,0){2778852.8,2856617.8,2959143.9,-1944873,-2267029,-1911000.9,-3362653.4,-3324577.4,-3636096,935707.85,1580891.3,623103.97,3643681.7,3650971.5,3857035.6}; +ST(0.074279052,0.25633166,0,0.071915087,0.24816524,0,0.07921504,0.25033934,0){635900.39,803363.84,606155.6,-1777029.4,-2179152.4,-1658203,2553015.8,2928525.2,2271843.6,-2804423.5,-2836050.6,-2284831,2479429.3,1927975,1693484.6}; +ST(0.091864029,0.22106993,0,0.095652827,0.22622146,0,0.09071018,0.22887426,0){394005.54,199039.37,406264.77,-927852.61,-484109.58,-1003622.2,863120.02,494313.66,1069446.3,-241435.16,-223837.82,-568907.82,-536498.87,-173819.74,-233040.27}; +ST(0.021658338,0.054940441,0,0.025565101,0.048609543,0,0.028699663,0.054481756,0){2341024.9,2702312,2920693,1587273.2,2017092.5,1995520.8,322446.89,820389.33,438210.61,-1046241,-584372.75,-1257984.1,-2078353.5,-1841258.2,-2556170.3}; +ST(0.019247887,0.048569646,0,0.025565101,0.048609543,0,0.021658338,0.054940441,0){2135187.8,2702312,2341024.9,1594654.5,2017092.5,1587273.2,650408.09,820389.33,322446.89,-458538.7,-584372.75,-1046241,-1451674.1,-1841258.2,-2078353.5}; +ST(0.084368038,0.19048099,0,0.087008075,0.19596841,0,0.079090117,0.19794942,0){992852.93,798107.94,1206859.6,-1809621.2,-1537171.7,-2368529.7,495817.1,625323.3,1073015.3,1401810.9,958187.81,1335740.9,-1649308.4,-1512909.8,-2359414.1}; +ST(0.029991713,0.27132489,0,0.027951851,0.26533243,0,0.034582704,0.26623209,0){469504.82,539100.43,604041.77,-1366503,-1547025.6,-1737386.1,2141236.7,2353298.6,2655775,-2724385.3,-2852826.8,-3245580.1,3063642.3,2980285,3433603.3}; +ST(0.043569257,0.19619451,0,0.044234359,0.18859393,0,0.050398693,0.1921099,0){1966078.6,2102462.5,2077292.2,-3794921.6,-3756018.8,-3850553.1,1563901,851571.98,1209682,2340412.7,3086402.5,2818064.5,-3741435.4,-3279385.1,-3615771.1}; +ST(0.0069613667,0.17349451,0,0.0046637588,0.16745308,0,0.0094805882,0.16707285,0){517779.21,362371.83,730151.01,-769992.03,-494096.85,-989834.58,-142713.64,-182769.85,-378084.11,839532.94,560561.48,1124284.7,-266340.1,-21256.565,-22095.939}; +ST(0.074931673,0.27468874,0,0.06660802,0.27624666,0,0.069536278,0.26943087,0){363389.18,417349.44,505602.11,-1064791.9,-1226359.7,-1465439,1691857.9,1959900.4,2276404,-2200836.4,-2572844.1,-2856108.7,2556129.1,3027289.2,3145421.5}; +ST(0.068476894,0.0069177029,0,0.074656208,0.0053403125,0,0.073684623,0.0112317,0){3242851.4,2772385.5,2850123.3,3225849.8,2763721.5,2810738.2,3191931.3,2746414.1,2732509.2,3141298.2,2720533.7,2616540.6,3073847.6,2685936.9,2464223.2}; +ST(0.073754091,0.28851618,0,0.074657371,0.29452352,0,0.068366879,0.29272708,0){171229.59,79525.554,123803.43,-511212.67,-238312.39,-370697.46,843808.82,396309.36,615462.12,-1164215.8,-552992.95,-856697.17,1467609.3,707611.71,1092834.3}; +ST(0.025130011,0.29009115,0,0.024877102,0.29495936,0,0.017990672,0.29207379,0){142877.47,72135.52,86228.122,-427099.39,-216205.93,-258100.45,706741.94,359676.71,428229.3,-978805.55,-502149.61,-595472.42,1240164.3,642973.44,758576.15}; +ST(0.017990672,0.29207379,0,0.024877102,0.29495936,0,0.021428571,0.3,0){86228.122,72135.52,0,-258100.45,-216205.93,0,428229.3,359676.71,0,-595472.42,-502149.61,0,758576.15,642973.44,0}; +ST(0.021428571,0,0,0.025051818,0.0051959301,0,0.01808004,0.0081573173,0){2419501.9,2747435.6,2085729.2,2419561.9,2739316.7,2070583.9,2419679.8,2723095.2,2040406.9,2419876.4,2698832.3,1995444.2,2419989.4,2666496.7,1935913.6}; +ST(0.01808004,0.0081573173,0,0.025051818,0.0051959301,0,0.025468185,0.010276157,0){2085729.2,2747435.6,2780034,2070583.9,2739316.7,2747892,2040406.9,2723095.2,2683968.5,1995444.2,2698832.3,2589008.8,1935913.6,2666496.7,2463902.9}; +ST(0.061244461,0.14481879,0,0.054237851,0.14012792,0,0.060672554,0.13561545,0){2643484.5,2856617.8,2778852.8,-2356788.3,-2267029,-1944873,-2899198.4,-3324577.4,-3362653.4,2042509.4,1580891.3,935707.85,3121060.9,3650971.5,3643681.7}; +ST(0.079090117,0.19794942,0,0.087008075,0.19596841,0,0.08682376,0.20181233,0){1206859.6,798107.94,767576.83,-2368529.7,-1537171.7,-1560255.4,1073015.3,625323.3,843726.65,1335740.9,958187.81,688912.23,-2359414.1,-1512909.8,-1555436.8}; +ST(0.093710586,0.16080643,0,0.088623123,0.15812222,0,0.09308158,0.15403623,0){507346.27,918302.92,579061.91,-621948.04,-1074338,-628036.95,-366919.85,-735787.48,-525997.02,704920.6,1199414.9,672596.25,207593.47,531983.03,469080.04}; +ST(0.088381846,0.16289419,0,0.088623123,0.15812222,0,0.093710586,0.16080643,0){911153.68,918302.92,507346.27,-1156470.7,-1074338,-621948.04,-599768.12,-735787.48,-366919.85,1317920.1,1199414.9,704920.6,244888.24,531983.03,207593.47}; +ST(0.060672554,0.13561545,0,0.059246105,0.12763558,0,0.067728608,0.12931058,0){2778852.8,2918223.5,2567539,-1944873,-1563762.3,-1463631.5,-3362653.4,-3644117.3,-3196956.5,935707.85,-127593.52,89062.443,3643681.7,3585046,3235608.2}; +ST(0.02133326,0.24577003,0,0.025350652,0.23917347,0,0.029124573,0.24658198,0){675269.21,868665.73,849052.23,-1813848.4,-2265304,-2288340.2,2383092.9,2773502.3,3030093.5,-2204305.3,-2193941.8,-2848204.4,1333319.6,753574.67,1797881.3}; +ST(0.037897724,0.149701,0,0.045364072,0.14896511,0,0.042155309,0.15589067,0){2552043.8,2729630.7,2577776.2,-2536068.8,-2670475.8,-2895603.6,-2567975.2,-2787568.3,-2220826.4,2520076,2610132.2,3169529.7,2583694.6,2844182.1,1830012}; +ST(0.071449289,0.19423207,0,0.06771074,0.1881525,0,0.076430303,0.18837043,0){1594804.6,1821405.7,1444535.6,-3019964.8,-3238423,-2574453.4,1103926.4,698008.36,569102.25,2033518.7,2695511.5,2129625.3,-2921575.1,-2795478.4,-2235391.7}; +ST(0.078984823,0.22953004,0,0.084619556,0.23283838,0,0.077318805,0.23627719,0){858343.29,621044.17,830868.27,-2128428.8,-1568398.7,-2136157.9,2291087.1,1771426.2,2525048.7,-1261656.1,-1133733.9,-1830714.2,-424553.92,-42283.716,350702.19}; +ST(0.077318805,0.23627719,0,0.084619556,0.23283838,0,0.084206466,0.24009781,0){830868.27,621044.17,569988.38,-2136157.9,-1568398.7,-1492933.9,2525048.7,1771426.2,1847439,-1830714.2,-1133733.9,-1498530.8,350702.19,-42283.716,578923.58}; +ST(0.026018946,0.14387862,0,0.030440206,0.150204,0,0.022775714,0.15147437,0){2064539,2239650.6,1786181.8,-1800072.3,-2249230.7,-1841345.2,-2295230.1,-2230054.7,-1729359.8,1506177.8,2258843.4,1894858,2488196.2,2220211.9,1670732.8}; +ST(0.07492972,0.092844339,0,0.081743274,0.092625466,0,0.079063451,0.10043005,0){2431427.6,1862860,2051820.1,308451.38,243386.47,-16056.497,-2083891.4,-1587731,-2067914.3,-2656803.1,-2038652.4,-2035845.1,-910298.79,-717394.49,48244.512}; +ST(0.079063451,0.10043005,0,0.081743274,0.092625466,0,0.087331535,0.0958472,0){2051820.1,1862860,1318484.3,-16056.497,243386.47,98077.228,-2067914.3,-1587731,-1213131.9,-2035845.1,-2038652.4,-1401481.2,48244.512,-717394.49,-292629.72}; +ST(0.066012722,0.055502179,0,0.070754378,0.060222618,0,0.064832361,0.062804408,0){3257272.9,2932444.5,3281120.4,2187557.2,1804303.3,1912310.8,399401.17,-17984.254,-254314.65,-1519988.7,-1833384.6,-2314932.7,-2940625.1,-2943704.7,-3410309.6}; +ST(0.069467767,0.146519,0,0.076625322,0.14929356,0,0.070477538,0.15360968,0){2287173.5,1845555.4,2153625.7,-2120501.9,-1818255.1,-2316413.6,-2441744.6,-1872475.3,-1978592.7,1942651.5,1790618.2,2466066.8,2583122,1898765.5,1792310.4}; +ST(0.075488644,0.14176328,0,0.076625322,0.14929356,0,0.069467767,0.146519,0){1990888.2,1845555.4,2287173.5,-1647841.2,-1818255.1,-2120501.9,-2274843.7,-1872475.3,-2441744.6,1255935.2,1790618.2,1942651.5,2491166.6,1898765.5,2583122}; +ST(0.070607657,0.23670872,0,0.066600159,0.24211306,0,0.064373335,0.2338171,0){1007105.3,1004296.2,1185902.3,-2594870.8,-2655015,-3010536.1,3083897.2,3359675.2,3446119.8,-2267120.1,-2867211.3,-2291596.2,490193.02,1352854.8,79206.699}; +ST(0.1,0.11428571,0,0.091758141,0.11296708,0,0.1,0.10714286,0){0,824791.32,0,0,-201020.76,0,0,-976886.6,0,0,-537824.26,0,0,570097.26,0}; +ST(0.017763535,0.12074209,0,0.023379755,0.12686903,0,0.01788586,0.12850833,0){1657769.5,2047772.9,1616906.9,-657738.05,-1065433.1,-895214.81,-2054600.3,-2558991,-2016472.2,-581651.26,-162203.53,-4802.2192,1703675.4,2481221.5,2014144.7}; +ST(0.016927821,0.11108648,0,0.01198914,0.11616091,0,0.0081152275,0.10988635,0){1644246.3,1171325.2,821145.89,-340994.5,-358450.6,-151361.79,-1914445.6,-1420119.3,-944689.8,-1176430.8,-627101.02,-619246.83,981584.41,984768,439508.43}; +ST(0.1,0.021428571,0,0.095041081,0.024587994,0,0.093571257,0.018380777,0){0,597113.29,774815.13,0,557751.32,746204.54,0,481620.22,690036.86,0,373740.48,608388.09,0,241099.33,504051.02}; +ST(0.093593186,0.28160993,0,0.095069321,0.27540052,0,0.1,0.27857143,0){74588.283,76899.446,0,-221009.65,-225624.71,0,359269.18,359465.9,0,-484261.41,-469594.27,0,591230.88,548580.83,0}; +ST(0.0071591483,0.096788703,0,0.0052460498,0.10332732,0,0,0.1,0){756711.76,545715.18,0,43634.951,-33256.292,0,-710572.63,-576983.54,0,-795194.2,-508602.25,0,-130859.45,99155.047,0}; +ST(0.09416017,0.099511923,0,0.086838536,0.10220901,0,0.087331535,0.0958472,0){613994.66,1341203.8,1318484.3,5422.3845,-54099.381,98077.228,-608645.22,-1393108.8,-1213131.9,-619557.01,-1282822.5,-1401481.2,-16415.987,161880.97,-292629.72}; +ST(0.049204373,0.010884263,0,0.043829005,0.011024747,0,0.046181733,0.0056701177,0){3873084,3801549.1,3851009.3,3822842.7,3750937.1,3837454.5,3723003.5,3650381.9,3810385,3574883.8,3501249.8,3769920.5,3380124.5,3305260.3,3715901.2}; +ST(0.045931579,0.29422002,0,0.043131118,0.28864457,0,0.048791783,0.28884593,0){116468.36,225252.57,226341.07,-348980.73,-672574.82,-675936.71,580225.36,1110400.5,1116322.7,-809364.6,-1532552.2,-1541505,1035478,1932837.8,1945474.1}; +ST(0.020473685,0.087577432,0,0.024499807,0.092422798,0,0.019165757,0.095107709,0){2087024.2,2390452.1,1930971.9,451292.51,320672.29,168744.63,-1538224.3,-2026771.7,-1747493.7,-2322280.1,-2619357.9,-2069009.1,-1286407.6,-944222.72,-502664.26}; +ST(0.041002292,0.08644635,0,0.044548934,0.094607351,0,0.03690243,0.09394169,0){3351345,3364209.6,3135041.5,787437.3,323528.56,337961.95,-2379027.1,-3009655.6,-2760700,-3725698.5,-3622750.1,-3396384.7,-2222336.9,-961698.97,-1002139.6}; +ST(0.049739958,0.088394034,0,0.044548934,0.094607351,0,0.041002292,0.08644635,0){3472240.4,3364209.6,3351345,703521.31,323528.56,787437.3,-2626240.1,-3009655.6,-2379027.1,-3862017.3,-3622750.1,-3725698.5,-2018648.2,-961698.97,-2222336.9}; +ST(0.041319833,0.14315875,0,0.033990129,0.14330646,0,0.038217426,0.13599196,0){2735557.7,2486957.5,2738753.8,-2343944,-2138608.5,-1938161,-3071175.4,-2786553.8,-3305386.1,1904337.3,1748365.6,972060.89,3343927.4,3031412.6,3589652.3}; +ST(0.042857143,0,0,0.046181733,0.0056701177,0,0.039686874,0.0066116125,0){3783299.5,3851009.3,3676489.9,3783327.5,3837454.5,3658909.3,3783379.6,3810385,3623831.1,3783486.4,3769920.5,3571457.2,3783576.5,3715901.2,3501797.4}; +ST(0.03928574,0.29335694,0,0.045931579,0.29422002,0,0.042857143,0.3,0){127378.94,116468.36,0,-381522.06,-348980.73,0,633829.06,580225.36,0,-883092.25,-809364.6,0,1127859.7,1035478,0}; +ST(0.030217898,0.25971254,0,0.027951851,0.26533243,0,0.021957304,0.26060316,0){660621.26,539100.43,505833.44,-1866014.4,-1547025.6,-1432636.8,2744196,2353298.6,2119105.6,-3141188.1,-2852826.8,-2450095.8,2987009.7,2980285,2369995.8}; +ST(0.091053567,0.10618538,0,0.086838536,0.10220901,0,0.09416017,0.099511923,0){914271.31,1341203.8,613994.66,-104388.15,-54099.381,5422.3845,-1006721.9,-1393108.8,-608645.22,-787386.88,-1282822.5,-619557.01,309052.61,161880.97,-16415.987}; +ST(0.0045473776,0.2936365,0,0.010662343,0.29482959,0,0.0071428571,0.3,0){18406.211,34537.041,0,-55138.333,-103506.64,0,91630.552,172164.12,0,-127724.83,-240303.04,0,162961.08,307518.14,0}; +ST(0.01093484,0.12117452,0,0.01198914,0.11616091,0,0.017763535,0.12074209,0){1052666.9,1171325.2,1657769.5,-426753.37,-358450.6,-657738.05,-1306415.4,-1420119.3,-2054600.3,-350052.21,-627101.02,-581651.26,1098212.1,984768,1703675.4}; +ST(0.043491003,0.26677795,0,0.034582704,0.26623209,0,0.037705658,0.25939989,0){657627.62,604041.77,758443.36,-1894105.9,-1737386.1,-2140288.6,2903724.9,2655775,3141072.6,-3565612.1,-3245580.1,-3582615.2,3800401.2,3433603.3,3385872.9}; +ST(0.0071428571,0,0,0.010679145,0.0052482016,0,0.0045481906,0.0063920675,0){863498.79,1277155.8,552257.15,863505.11,1273289.3,549810.55,863516.31,1265566.3,544927.47,863538.53,1254019.7,537633.65,863596.62,1238493.9,527798.54}; +ST(0.020636298,0.17424253,0,0.014405512,0.17061143,0,0.020973714,0.16688371,0){1433869.3,1063653,1525118.3,-2154082.5,-1519257.6,-2061659.5,-351921.61,-412907.51,-799875.51,2330929.4,1696192.6,2343184.8,-819073.82,-313907.63,-24581.749}; +ST(0.018422519,0.27450763,0,0.025044032,0.27464897,0,0.023483408,0.28013687,0){282501.19,363665.57,270985.88,-827496.14,-1065519.5,-801278.39,1313896,1692735.8,1297043.7,-1707268.8,-2201379.5,-1736920.8,1979556.1,2555652.6,2101746.5}; +ST(0.0061411468,0.1246533,0,0.0062042788,0.11791514,0,0.01093484,0.12117452,0){591118.91,612847.32,1052666.9,-280990.71,-208741.13,-426753.37,-738586.84,-750565.55,-1306415.4,-106527.54,-286207.66,-350052.21,682629.18,561848.67,1098212.1}; +ST(0.042557423,0.10832344,0,0.039702853,0.10111678,0,0.047385855,0.10193045,0){3183930.6,3175586.8,3329666.7,-492142.06,-64516.934,-117239.93,-3600076,-3238866.3,-3442848.4,-2551523.2,-3108635.2,-3204510.9,1442840.6,193445.51,350991.89}; +ST(0.0081152275,0.10988635,0,0.0062042788,0.11791514,0,0,0.11428571,0){821145.89,612847.32,0,-151361.79,-208741.13,0,-944689.8,-750565.55,0,-619246.83,-286207.66,0,439508.43,561848.67,0}; +ST(0.067728608,0.12931058,0,0.059246105,0.12763558,0,0.064276416,0.12183086,0){2567539,2918223.5,2809128.6,-1463631.5,-1563762.3,-1175750.5,-3196956.5,-3644117.3,-3492840.6,89062.443,-127593.52,-855220.15,3235608.2,3585046,2995580.4}; +ST(0.0079950318,0.059686314,0,0.004777904,0.053197076,0,0.0094132111,0.052421332,0){917766.47,557925.04,1088603.4,570756.35,389224.92,768702.62,7912.4367,102822.82,222919.17,-557994.72,-214698.3,-388347.22,-913265.38,-467537.22,-885762.83}; +ST(0.064276416,0.12183086,0,0.062195955,0.11505156,0,0.069025318,0.11622387,0){2809128.6,2965673.8,2631986.5,-1175750.5,-843057.19,-808686.45,-3492840.6,-3569130.8,-3192250.9,-855220.15,-1711501.2,-1402768.4,2995580.4,2344130.4,2220554.1}; +ST(0.057323957,0.1204315,0,0.062195955,0.11505156,0,0.064276416,0.12183086,0){3051716.5,2965673.8,2809128.6,-1191883,-843057.19,-1175750.5,-3778168.4,-3569130.8,-3492840.6,-1110713.1,-1711501.2,-855220.15,3101303,2344130.4,2995580.4}; +ST(0.073684623,0.0112317,0,0.074656208,0.0053403125,0,0.081119523,0.0085521597,0){2850123.3,2772385.5,2167108.8,2810738.2,2763721.5,2149779.2,2732509.2,2746414.1,2115263.6,2616540.6,2720533.7,2063869.7,2464223.2,2685936.9,1995657.9}; +ST(0.081165886,0.29137431,0,0.074657371,0.29452352,0,0.073754091,0.28851618,0){97729.953,79525.554,171229.59,-292395.17,-238312.39,-511212.67,484687.71,396309.36,843808.82,-673055.06,-552992.95,-1164215.8,855744.16,707611.71,1467609.3}; +ST(0.064276416,0.12183086,0,0.070840483,0.12204614,0,0.067728608,0.12931058,0){2809128.6,2470738.2,2567539,-1175750.5,-1044803.2,-1463631.5,-3492840.6,-3073782.1,-3196956.5,-855220.15,-729197.53,89062.443,2995580.4,2652961,3235608.2}; +ST(0.058212185,0.089881183,0,0.052532368,0.096036702,0,0.049739958,0.088394034,0){3344291.6,3389506.1,3472240.4,593905.21,240670.51,703521.31,-2645013.4,-3131818.5,-2626240.1,-3708817.1,-3594959.1,-3862017.3,-1722713.3,-718569.73,-2018648.2}; +ST(0.017433092,0.042090914,0,0.013132659,0.04767246,0,0.011573719,0.041901165,0){1971771.3,1507774.2,1347025.1,1594855,1139737.5,1091815.8,913057.13,493500.09,629744.45,56690.05,-273193.01,48353.226,-810753.02,-973395.4,-542301.86}; +ST(0.042155309,0.15589067,0,0.034314476,0.15645926,0,0.037897724,0.149701,0){2577776.2,2334400.9,2552043.8,-2895603.6,-2649968.2,-2536068.8,-2220826.4,-1976247.7,-2567975.2,3169529.7,2917237.1,2520076,1830012,1581967.4,2583694.6}; +ST(0.038427921,0.16264679,0,0.034314476,0.15645926,0,0.042155309,0.15589067,0){2389351.9,2334400.9,2577776.2,-3020403.6,-2649968.2,-2895603.6,-1591681.4,-1976247.7,-2220826.4,3440909.6,2917237.1,3169529.7,682723.32,1581967.4,1830012}; +ST(0.044666369,0.11545829,0,0.040442009,0.11996282,0,0.038084092,0.1145524,0){3148096.1,2999410,2981407.2,-920013.3,-1143461.2,-818508.93,-3799301.5,-3706983.7,-3575257.7,-1769018.1,-1150363.3,-1775238,2547335.8,2995190.5,2287308.3}; +ST(0.041002292,0.08644635,0,0.047307891,0.081963043,0,0.049739958,0.088394034,0){3351345,3516083,3472240.4,787437.3,1080946.4,703521.31,-2379027.1,-2102837.3,-2626240.1,-3725698.5,-3830300,-3862017.3,-2222336.9,-2905310.5,-2018648.2}; +ST(0.09156348,0.14589395,0,0.093938974,0.13899,0,0.1,0.14285714,0){734092.88,548364.78,0,-670961.7,-422206.84,0,-791796.8,-645591.08,0,602866.55,273728.87,0,843431.47,708600.91,0}; +ST(0.1,0.12857143,0,0.093823791,0.12410599,0,0.1,0.12142857,0){0,595735.92,0,0,-276601.23,0,0,-743959.63,0,0,-121937.8,0,0,678759.2,0}; +ST(0.080938662,0.054906318,0,0.073604017,0.054819307,0,0.077364239,0.048764008,0){2097661.4,2744584.6,2450679,1423084,1864679.8,1825420.5,290856.94,386939.94,734405.59,-934922.56,-1214908.7,-544039.45,-1860365.1,-2427603.9,-1683943.8}; +ST(0.082942949,0.21818591,0,0.084319616,0.22565969,0,0.076796159,0.2234596,0){823054.75,696453.76,1008421.8,-1901094.8,-1688204.7,-2411357.4,1667014.3,1707540.6,2346331.8,-282341.7,-743250.94,-852928.84,-1297502.9,-649719.93,-1160000.7}; +ST(0.1,0.27142857,0,0.092520768,0.26920591,0,0.1,0.26428571,0){0,145042.72,0,0,-420173.4,0,0,651988.34,0,0,-816598.86,0,0,896908.09,0}; +ST(0.1,0.035714286,0,0.092450683,0.030760689,0,0.1,0.028571429,0){0,900007.85,0,0,807431.66,0,0,631804.95,0,0,391202.83,0,0,110124.82,0}; +ST(0.045416206,0.061541227,0,0.042113175,0.053290167,0,0.048663579,0.053435419,0){3642820.9,3616583.4,3726394.8,2181474.8,2519252.9,2589713.3,-155055.51,657513.67,663071.82,-2429600.5,-1403801.4,-1465861.1,-3730025.8,-3039615.4,-3147918.6}; +ST(0.038435934,0.058364632,0,0.042113175,0.053290167,0,0.045416206,0.061541227,0){3459248.5,3616583.4,3642820.9,2206750.4,2519252.9,2181474.8,155241.86,657513.67,-155055.51,-1952496,-1403801.4,-2429600.5,-3353689.4,-3039615.4,-3730025.8}; +ST(0.0528723,0.26429657,0,0.055001581,0.27169863,0,0.049721881,0.27094787,0){718299.05,565900.8,588018.61,-2055661.9,-1648356.5,-1710042.9,3109067.1,2587095.5,2675009.8,-3733060,-3300283.2,-3394309,3841282.5,3725567.5,3801713.7}; +ST(0.082516133,0.27647665,0,0.086077973,0.27164165,0,0.089232651,0.27618677,0){248899.48,243157.03,160151.6,-731674.12,-708191.99,-470555.02,1170289.2,1111255.9,751874.95,-1538273.3,-1417072.6,-986723.61,1813237.5,1598582.9,1160401.4}; +ST(0.089183466,0.023798504,0,0.085916752,0.02828,0,0.082332164,0.023444943,0){1283383.3,1643257.2,2029600,1204105.7,1500211.7,1907886.4,1050439.6,1226559.7,1671751.1,831874.08,846114.35,1335359.8,561630.79,391827.49,918760.81}; +ST(0.079063451,0.10043005,0,0.086838536,0.10220901,0,0.082583958,0.10907049,0){2051820.1,1341203.8,1698614.9,-16056.497,-54099.381,-286603.09,-2067914.3,-1393108.8,-1936849,-2035845.1,-1282822.5,-1323464.6,48244.512,161880.97,836522.31}; +ST(0.059543685,0.10776494,0,0.06715469,0.10983132,0,0.062195955,0.11505156,0){3132791.5,2794834,2965673.8,-451048.14,-512277.78,-843057.19,-3519016.9,-3213264.7,-3569130.8,-2561357.9,-2112070.8,-1711501.2,1326599.2,1488257.3,2344130.4}; +ST(0.011838853,0.2301677,0,0.0069516057,0.23320895,0,0.0069979116,0.22643766,0){504229.49,288078.49,317964.48,-1254859.2,-728952.19,-774386.26,1363834.1,827497.2,793599.18,-775392.51,-537397.4,-364658.79,-209768.04,-5267.3055,-270536.88}; +ST(0.070477538,0.15360968,0,0.076625322,0.14929356,0,0.077069107,0.15686929,0){2153625.7,1845555.4,1743907.9,-2316413.6,-1818255.1,-1994600,-1978592.7,-1872475.3,-1457243.4,2466066.8,1790618.2,2204191.1,1792310.4,1898765.5,1140253.2}; +ST(0.09123018,0.070922096,0,0.095795895,0.073622969,0,0.091953893,0.078440357,0){983713.53,473503.74,889726.23,465586.72,205720.2,322434.75,-297764.17,-178405.32,-450550.32,-904277.98,-461642.03,-936443.15,-1034644.8,-483922.03,-825354.72}; +ST(0.041057987,0.068843254,0,0.041803352,0.076750149,0,0.033874053,0.071548869,0){3488848.8,3453761.9,3157862.8,1752771.3,1340279.2,1466537.3,-855539,-1593440.1,-1010259.7,-3038218.5,-3552303.7,-2946084.6,-3709409.4,-3337911.6,-3304540.6}; +ST(0.075422073,0.20645372,0,0.081922129,0.20489902,0,0.081656406,0.2108727,0){1273700.5,996952.98,951384.03,-2693470,-2081157.6,-2083808.1,1728669,1266338.6,1528962.6,766631.5,704044.3,263916.4,-2583646.6,-2032271.3,-1843401}; +ST(0.084206466,0.24009781,0,0.084619556,0.23283838,0,0.092168655,0.23668616,0){569988.38,621044.17,307607.26,-1492933.9,-1568398.7,-792496.69,1847439,1771426.2,941630.33,-1498530.8,-1133733.9,-691810.02,578923.58,-42283.716,148523.72}; +ST(0.092168655,0.23668616,0,0.084619556,0.23283838,0,0.09071018,0.22887426,0){307607.26,621044.17,406264.77,-792496.69,-1568398.7,-1003622.2,941630.33,1771426.2,1069446.3,-691810.02,-1133733.9,-568907.82,148523.72,-42283.716,-233040.27}; +ST(0.071000103,0.28243589,0,0.078222118,0.28277283,0,0.073754091,0.28851618,0){281581.81,220930.92,171229.59,-835250.62,-655625.13,-511212.67,1360764.9,1069057.6,843808.82,-1840418.5,-1447830.3,-1164215.8,2257916.8,1779434.3,1467609.3}; +ST(0.073684623,0.0112317,0,0.078020383,0.017034313,0,0.070691378,0.017050195,0){2850123.3,2461848.1,3076870.7,2810738.2,2383750.6,2979073.3,2732509.2,2230032.5,2786592,2616540.6,2005590.6,2505581.5,2464223.2,1717239.5,2144710.8}; +ST(0.028678488,0.042143634,0,0.022876349,0.043626948,0,0.023478597,0.036718106,0){2968313.4,2488553.5,2561783.8,2399521.8,1978130.3,2187675.4,1370917.4,1061959.9,1494080.3,79587.615,-72059.632,582277.59,-1227272.3,-1191549.5,-414804.14}; +ST(0.053497526,0.1329974,0,0.059246105,0.12763558,0,0.060672554,0.13561545,0){2959143.9,2918223.5,2778852.8,-1911000.9,-1563762.3,-1944873,-3636096,-3644117.3,-3362653.4,623103.97,-127593.52,935707.85,3857035.6,3585046,3643681.7}; +ST(0.087083587,0.13880919,0,0.093938974,0.13899,0,0.09156348,0.14589395,0){1144744.3,548364.78,734092.88,-877072.07,-422206.84,-670961.7,-1349889.8,-645591.08,-791796.8,561444.4,273728.87,602866.55,1481228.8,708600.91,843431.47}; +ST(0.054957014,0.24657048,0,0.049037582,0.25027532,0,0.047556344,0.24377674,0){1058545,998508.07,1122639.4,-2852831,-2730849.8,-2989881.7,3777171.8,3739350.2,3850350.4,-3549694.2,-3756698.7,-3414324.1,2239441.1,2778087.3,1828478.4}; +ST(0.06771074,0.1881525,0,0.07206248,0.1830344,0,0.076430303,0.18837043,0){1821405.7,1716055.3,1444535.6,-3238423,-2879815.5,-2574453.4,698008.36,236909.5,569102.25,2695511.5,2719220.1,2129625.3,-2795478.4,-2081132.3,-2235391.7}; +ST(0.093571257,0.018380777,0,0.095041081,0.024587994,0,0.089183466,0.023798504,0){774815.13,597113.29,1283383.3,746204.54,557751.32,1204105.7,690036.86,481620.22,1050439.6,608388.09,373740.48,831874.08,504051.02,241099.33,561630.79}; +ST(0.089232651,0.27618677,0,0.095069321,0.27540052,0,0.093593186,0.28160993,0){160151.6,76899.446,74588.283,-470555.02,-225624.71,-221009.65,751874.95,359465.9,359269.18,-986723.61,-469594.27,-484261.41,1160401.4,548580.83,591230.88}; +ST(0.017861336,0.10270337,0,0.019165757,0.095107709,0,0.024938414,0.098415267,0){1773538.4,1930971.9,2383058.5,-87655.931,168744.63,68195.72,-1856823.6,-1747493.7,-2312962.3,-1677437.3,-2069009.1,-2447461.4,261812.45,-502664.26,-204726.33}; +ST(0.082583958,0.10907049,0,0.076969725,0.10634022,0,0.079063451,0.10043005,0){1698614.9,2181001.1,2051820.1,-286603.09,-255488.75,-16056.497,-1936849,-2406546.5,-2067914.3,-1323464.6,-1869163.7,-2035845.1,836522.31,756176.24,48244.512}; +ST(0.020473685,0.087577432,0,0.01318623,0.084416193,0,0.019499739,0.079597209,0){2087024.2,1411871.7,2040354.6,451292.51,378554.62,702945.71,-1538224.3,-931831.12,-1095289.5,-2322280.1,-1560266,-2175701.2,-1286407.6,-1046999.7,-1830384.7}; +ST(0.087331535,0.0958472,0,0.086838536,0.10220901,0,0.079063451,0.10043005,0){1318484.3,1341203.8,2051820.1,98077.228,-54099.381,-16056.497,-1213131.9,-1393108.8,-2067914.3,-1401481.2,-1282822.5,-2035845.1,-292629.72,161880.97,48244.512}; +ST(0.019247887,0.048569646,0,0.013132659,0.04767246,0,0.017433092,0.042090914,0){2135187.8,1507774.2,1971771.3,1594654.5,1139737.5,1594855,650408.09,493500.09,913057.13,-458538.7,-273193.01,56690.05,-1451674.1,-973395.4,-810753.02}; +ST(0.071000103,0.28243589,0,0.06660802,0.27624666,0,0.074931673,0.27468874,0){281581.81,417349.44,363389.18,-835250.62,-1226359.7,-1064791.9,1360764.9,1959900.4,1691857.9,-1840418.5,-2572844.1,-2200836.4,2257916.8,3027289.2,2556129.1}; +ST(0.076796159,0.2234596,0,0.084319616,0.22565969,0,0.078984823,0.22953004,0){1008421.8,696453.76,858343.29,-2411357.4,-1688204.7,-2128428.8,2346331.8,1707540.6,2291087.1,-852928.84,-743250.94,-1261656.1,-1160000.7,-649719.93,-424553.92}; +ST(0.087083587,0.13880919,0,0.081009521,0.1385969,0,0.083559522,0.13424014,0){1144744.3,1630909.4,1462145.4,-877072.07,-1242340.3,-981746.52,-1349889.8,-1926924,-1784737.2,561444.4,783271.16,395362.65,1481228.8,2113542.9,1914407.3}; +ST(0,0.057142857,0,0.004777904,0.053197076,0,0.0079950318,0.059686314,0){0,557925.04,917766.47,0,389224.92,570756.35,0,102822.82,7912.4367,0,-214698.3,-557994.72,0,-467537.22,-913265.38}; +ST(0.0079950318,0.059686314,0,0.0062494098,0.068021592,0,0,0.064285714,0){917766.47,709501.16,0,570756.35,364477.97,0,7912.4367,-157824.6,0,-557994.72,-603457.47,0,-913265.38,-756039.79,0}; +ST(0.041057987,0.068843254,0,0.047469022,0.070467195,0,0.041803352,0.076750149,0){3488848.8,3608010.8,3453761.9,1752771.3,1730907.5,1340279.2,-855539,-1046792,-1593440.1,-3038218.5,-3280034.9,-3552303.7,-3709409.4,-3807136.9,-3337911.6}; +ST(0.0071591483,0.096788703,0,0.0067127961,0.088875219,0,0.013428016,0.091778472,0){756711.76,725937.81,1408980.1,43634.951,141227.93,204626.15,-710572.63,-557260.38,-1174648.8,-795194.2,-806944.34,-1549888.7,-130859.45,-406936.37,-600683.83}; +ST(0.081119523,0.0085521597,0,0.074656208,0.0053403125,0,0.078571429,0,0){2167108.8,2772385.5,2419478.6,2149779.2,2763721.5,2419535.2,2115263.6,2746414.1,2419645.1,2063869.7,2720533.7,2419827.2,1995657.9,2685936.9,2420024.4}; +ST(0.078571429,0.3,0,0.074657371,0.29452352,0,0.081165886,0.29137431,0){0,79525.554,97729.953,0,-238312.39,-292395.17,0,396309.36,484687.71,0,-552992.95,-673055.06,0,707611.71,855744.16}; +ST(0.082332164,0.023444943,0,0.078020383,0.017034313,0,0.085905658,0.016824409,0){2029600,2461848.1,1656238,1907886.4,2383750.6,1604967.9,1671751.1,2230032.5,1504009.2,1335359.8,2005590.6,1356492.3,918760.81,1717239.5,1166855}; +ST(0.08596482,0.28314521,0,0.078222118,0.28277283,0,0.082516133,0.27647665,0){145967.81,220930.92,248899.48,-433371.98,-655625.13,-731674.12,707326.96,1069057.6,1170289.2,-959333.22,-1447830.3,-1538273.3,1181452.3,1779434.3,1813237.5}; +ST(0.072908259,0.24139656,0,0.078142774,0.24370973,0,0.071915087,0.24816524,0){881474.92,714639.7,803363.84,-2322734,-1902709.3,-2179152.4,2916335.3,2448578.4,2928525.2,-2445637.4,-2167997.3,-2836050.6,1082242,1155455.3,1927975}; +ST(0.010955873,0.10281868,0,0.013714026,0.097839388,0,0.017861336,0.10270337,0){1124212.8,1412613.2,1773538.4,-57954.543,55008.627,-87655.931,-1179275.3,-1355500.2,-1856823.6,-1060620.9,-1463354,-1677437.3,173274.75,-165174.7,261812.45}; +ST(0,0.092857143,0,0.0067127961,0.088875219,0,0.0071591483,0.096788703,0){0,725937.81,756711.76,0,141227.93,43634.951,0,-557260.38,-710572.63,0,-806944.34,-795194.2,0,-406936.37,-130859.45}; +ST(0.081656406,0.2108727,0,0.086709216,0.20730703,0,0.089437553,0.21298247,0){951384.03,734117.03,556322.48,-2083808.1,-1563285.8,-1238115.4,1528962.6,1031586.7,961021.23,263916.4,398134,60411.18,-1843401,-1481512.9,-1035404.3}; +ST(0.033761495,0.088496681,0,0.030017634,0.093495078,0,0.027903545,0.087518505,0){3029395.9,2771844.6,2674848,608605.12,320378.42,580994.77,-2298547.5,-2414486.4,-1967676.8,-3368980,-3014031.4,-2976106,-1747439.7,-948223.96,-1655065.1}; +ST(0.073708403,0.21517194,0,0.076796159,0.2234596,0,0.069002793,0.22246209,0){1225969.3,1008421.8,1267491.2,-2772471.1,-2411357.4,-3011719.2,2271379.1,2346331.8,2877058.6,-92677.622,-852928.84,-947533.34,-2155133.8,-1160000.7,-1573376.1}; +ST(0.072126291,0.10515927,0,0.065931692,0.10408722,0,0.069968451,0.098831219,0){2539730.3,2911358.9,2730411,-241283.81,-218409.17,57648.531,-2758172.2,-3113407,-2671597.7,-2254933.2,-2661455,-2785714.6,717337.89,651464.78,-173126.8}; +ST(0.066401409,0.0434645,0,0.073234584,0.04253025,0,0.06961584,0.048915995,0){3289675.8,2820532.7,3063466,2619840.6,2270240.9,2277085.6,1416557.6,1277003.9,906160.93,-75156.319,34586.382,-697426.19,-1551772,-1214797.7,-2122325.6}; +ST(0.06961584,0.048915995,0,0.073234584,0.04253025,0,0.077364239,0.048764008,0){3063466,2820532.7,2450679,2277085.6,2270240.9,1825420.5,906160.93,1277003.9,734405.59,-697426.19,34586.382,-544039.45,-2122325.6,-1214797.7,-1683943.8}; +ST(0.030017634,0.093495078,0,0.024499807,0.092422798,0,0.027903545,0.087518505,0){2771844.6,2390452.1,2674848,320378.42,320672.29,580994.77,-2414486.4,-2026771.7,-1967676.8,-3014031.4,-2619357.9,-2976106,-948223.96,-944222.72,-1655065.1}; +ST(0.079265602,0.086677581,0,0.081743274,0.092625466,0,0.07492972,0.092844339,0){2114636.1,1862860,2431427.6,488789.06,243386.47,308451.38,-1512904.7,-1587731,-2083891.4,-2351470.6,-2038652.4,-2656803.1,-1382326.1,-717394.49,-910298.79}; +ST(0.083969261,0.16737329,0,0.083337094,0.16031526,0,0.088381846,0.16289419,0){1198489.7,1295652.6,911153.68,-1632158.2,-1575018.8,-1156470.7,-607916.58,-956036.82,-599768.12,1852187.2,1781183.7,1317920.1,-62490.334,571788.58,244888.24}; +ST(0,0.071428571,0,0.0060853536,0.074713803,0,0,0.078571429,0){0,681675.12,0,0,285253.65,0,0,-277070.48,0,0,-678306.76,0,0,-685312.86,0}; +ST(0.0068768393,0.16098373,0,0.014502412,0.16316663,0,0.0094805882,0.16707285,0){553409.29,1121335,730151.01,-680450.71,-1429592.9,-989834.58,-397156.36,-728363.13,-378084.11,771605.48,1629901.1,1124284.7,219690.78,280110.31,-22095.939}; +ST(0.09123018,0.070922096,0,0.085646934,0.067722415,0,0.09230899,0.063522919,0){983713.53,1585902.9,877619.52,465586.72,821166.94,503392.8,-297764.17,-339583.13,-85524.836,-904277.98,-1336670.3,-638068.15,-1034644.8,-1689538.4,-918939.46}; +ST(0.09230899,0.063522919,0,0.085646934,0.067722415,0,0.08415119,0.061061125,0){877619.52,1585902.9,1759442.9,503392.8,821166.94,1064240.3,-85524.836,-339583.13,-51487.645,-638068.15,-1336670.3,-1146904.2,-918939.46,-1689538.4,-1789550.6}; +ST(0.035619257,0.12028764,0,0.040442009,0.11996282,0,0.038464606,0.12667013,0){2821397.9,2999410,2859316.3,-1093830.4,-1143461.2,-1476046.2,-3491178.8,-3706983.7,-3573486.5,-1043884.2,-1150363.3,-252868.56,2851838.9,2995190.5,3451249.3}; +ST(0.038464606,0.12667013,0,0.040442009,0.11996282,0,0.045375723,0.12284566,0){2859316.3,2999410,3072436,-1476046.2,-1143461.2,-1348503.3,-3573486.5,-3706983.7,-3829159.4,-252868.56,-1150363.3,-800055.99,3451249.3,2995190.5,3380414.3}; +ST(0.051167355,0.022914381,0,0.054261983,0.029107824,0,0.048866761,0.029559705,0){3850137.8,3801269,3831772.8,3629520.4,3450822.2,3467532.3,3200919.1,2782228.4,2773676.3,2588908.3,1857139.4,1816186,1828396.4,760852.59,685852.4}; +ST(0,0.15714286,0,0.0056981356,0.15371602,0,0.0068768393,0.16098373,0){0,478995.44,553409.29,0,-516269.88,-680450.71,0,-438816.38,-397156.36,0,550400.04,771605.48,0,395913.98,219690.78}; +ST(0.029380008,0.16405835,0,0.036146522,0.16944297,0,0.030623168,0.1713445,0){2021292.5,2222447.1,1985985.4,-2614335.2,-3121229.8,-2866418.8,-1254306.4,-960241.74,-715248.18,2982541.3,3509731.4,3183566.3,378860.61,-459324.98,-696442.05}; +ST(0.038427921,0.16264679,0,0.036146522,0.16944297,0,0.029380008,0.16405835,0){2389351.9,2222447.1,2021292.5,-3020403.6,-3121229.8,-2614335.2,-1591681.4,-960241.74,-1254306.4,3440909.6,3509731.4,2982541.3,682723.32,-459324.98,378860.61}; +ST(0.057707972,0.025075094,0,0.054261983,0.029107824,0,0.051167355,0.022914381,0){3734947.8,3801269,3850137.8,3478918.2,3450822.2,3629520.4,2984396.6,2782228.4,3200919.1,2285289.9,1857139.4,2588908.3,1429238.8,760852.59,1828396.4}; +ST(0.033039341,0.023173825,0,0.029163144,0.015558324,0,0.038009007,0.015147577,0){3318087.9,3068207,3597209.6,3123656.1,2986953.6,3506943.3,2746181,2826596.5,3328697.3,2207795.9,2591406.1,3067010.9,1539940.3,2287504.7,2728518.9}; +ST(0.0071428571,0.3,0,0.010662343,0.29482959,0,0.014285714,0.3,0){0,34537.041,0,0,-103506.64,0,0,172164.12,0,0,-240303.04,0,0,307518.14,0}; +ST(0.014285714,0,0,0.010679145,0.0052482016,0,0.0071428571,0,0){1683701.5,1277155.8,863498.79,1683671.3,1273289.3,863505.11,1683611.9,1265566.3,863516.31,1683542.6,1254019.7,863538.53,1683226,1238493.9,863596.62}; +ST(0.0078195435,0.14622426,0,0.0056981356,0.15371602,0,0,0.15,0){680366.1,478995.44,0,-626541.18,-516269.88,0,-729870.69,-438816.38,0,568744.13,550400.04,0,774663.29,395913.98,0}; +ST(0.062195955,0.11505156,0,0.06715469,0.10983132,0,0.069025318,0.11622387,0){2965673.8,2794834,2631986.5,-843057.19,-512277.78,-808686.45,-3569130.8,-3213264.7,-3192250.9,-1711501.2,-2112070.8,-1402768.4,2344130.4,1488257.3,2220554.1}; +ST(0.010955873,0.10281868,0,0.0052460498,0.10332732,0,0.0071591483,0.096788703,0){1124212.8,545715.18,756711.76,-57954.543,-33256.292,43634.951,-1179275.3,-576983.54,-710572.63,-1060620.9,-508602.25,-795194.2,173274.75,99155.047,-130859.45}; +ST(0.059054943,0.066788508,0,0.064846874,0.068845861,0,0.061098586,0.072147464,0){3499189.3,3243292.3,3389933,1856149.2,1629296.1,1545196.6,-658492.2,-795531.06,-1140417.3,-2864039.1,-2824516.6,-3205469.9,-3725081.1,-3448034.5,-3526423.9}; +ST(0.064832361,0.062804408,0,0.064846874,0.068845861,0,0.059054943,0.066788508,0){3281120.4,3243292.3,3499189.3,1912310.8,1629296.1,1856149.2,-254314.65,-795531.06,-658492.2,-2314932.7,-2824516.6,-2864039.1,-3410309.6,-3448034.5,-3725081.1}; +ST(0.016702178,0.061420197,0,0.012193394,0.066188359,0,0.0079950318,0.059686314,0){1844408.3,1364188,917766.47,1107331.1,734639.92,570756.35,-72241.295,-233939.49,7912.4367,-1222910.6,-1094586.7,-557994.72,-1885264.1,-1450385,-913265.38}; +ST(0.029380008,0.16405835,0,0.025851591,0.17077962,0,0.020973714,0.16688371,0){2021292.5,1763476.8,1525118.3,-2614335.2,-2524912.6,-2061659.5,-1254306.4,-673288.62,-799875.51,2982541.3,2815714.9,2343184.8,378860.61,-542697.73,-24581.749}; +ST(0.045331711,0.23557633,0,0.037546984,0.23452457,0,0.041402067,0.22952626,0){1270563.3,1205921.7,1348916.4,-3255008.9,-3072707.6,-3344816,3813331,3550700.1,3600200.4,-2700862,-2423829.8,-1982154,404484.48,201013.93,-667743.82}; +ST(0.018343869,0.21720619,0,0.02301506,0.22157032,0,0.017207343,0.22323305,0){888277.19,1025043.6,781289.63,-2037897.4,-2421684.9,-1865590.4,1749211,2274566.1,1807835.2,-225952.88,-677461.35,-643322.1,-1457259.1,-1351813.7,-915362.92}; +ST(0.02463475,0.21609565,0,0.02301506,0.22157032,0,0.018343869,0.21720619,0){1153636.1,1025043.6,888277.19,-2626116.1,-2421684.9,-2037897.4,2198315,2274566.1,1749211,-179791.92,-677461.35,-225952.88,-1969098.8,-1351813.7,-1457259.1}; +ST(0.077318805,0.23627719,0,0.070607657,0.23670872,0,0.07180958,0.22984275,0){830868.27,1007105.3,1079159.6,-2136157.9,-2594870.8,-2680718.2,2525048.7,3083897.2,2899261.6,-1830714.2,-2267120.1,-1622013.4,350702.19,490193.02,-492395.98}; +ST(0.0071147476,0.24137211,0,0.0043813653,0.24702694,0,0,0.24285714,0){259907.57,145794.38,0,-684802.64,-393661.32,0,859611.54,523477.05,0,-720499.62,-496310.62,0,317972.39,320224.07,0}; +ST(0.079265602,0.086677581,0,0.075872285,0.081656016,0,0.082390534,0.079333541,0){2114636.1,2427639,1865676.5,488789.06,758134.07,650380.91,-1512904.7,-1432759.9,-988603.29,-2351470.6,-2638364.3,-1983689.6,-1382326.1,-2029677.1,-1686881.4}; +ST(0,0.17142857,0,0.0069613667,0.17349451,0,0,0.17857143,0){0,517779.21,0,0,-769992.03,0,0,-142713.64,0,0,839532.94,0,0,-266340.1,0}; +ST(0.038009007,0.015147577,0,0.043829005,0.011024747,0,0.046063037,0.016810165,0){3597209.6,3801549.1,3836060.2,3506943.3,3750937.1,3717529.2,3328697.3,3650381.9,3484126.2,3067010.9,3501249.8,3143090.2,2728518.9,3305260.3,2704667.4}; +ST(0.025221599,0.062165695,0,0.027058874,0.069011929,0,0.01882241,0.070374011,0){2618029.3,2727323.5,2018056.9,1547191.2,1363815.9,970762.8,-156575.4,-681543.48,-580354.6,-1796512.5,-2386220.5,-1830388.5,-2702051.5,-2898415.6,-2130853.3}; +ST(0.077393474,0.16425214,0,0.083337094,0.16031526,0,0.083969261,0.16737329,0){1650679.7,1295652.6,1198489.7,-2141613.9,-1575018.8,-1632158.2,-1013799.5,-956036.82,-607916.58,2443278.1,1781183.7,1852187.2,287063.28,571788.58,-62490.334}; +ST(0.05288218,0.14757716,0,0.054237851,0.14012792,0,0.061244461,0.14481879,0){2767228.4,2856617.8,2643484.5,-2626819.9,-2267029,-2356788.3,-2900596.1,-3324577.4,-2899198.4,2479722.6,1580891.3,2042509.4,3026446,3650971.5,3121060.9}; +ST(0.047918899,0.14257657,0,0.054237851,0.14012792,0,0.05288218,0.14757716,0){2842478.3,2856617.8,2767228.4,-2400971.6,-2267029,-2626819.9,-3215455,-3324577.4,-2900596.1,1901551.7,1580891.3,2479722.6,3510918.5,3650971.5,3026446}; +ST(0.026018946,0.14387862,0,0.022775714,0.15147437,0,0.017312959,0.14496605,0){2064539,1786181.8,1456929,-1800072.3,-1841345.2,-1303417.8,-2295230.1,-1729359.8,-1594293.7,1506177.8,1894858,1135517.7,2488196.2,1670732.8,1713822.2}; +ST(0,0.042857143,0,0.0064812773,0.046734878,0,0,0.05,0){0,761350.4,0,0,582610.88,0,0,267082.8,0,0,-111174.21,0,0,-463416.67,0}; +ST(0.024008584,0.022367291,0,0.029163144,0.015558324,0,0.033039341,0.023173825,0){2639060.6,3068207,3318087.9,2494948.4,2986953.6,3123656.1,2214593.6,2826596.5,2746181,1813324.4,2591406.1,2207795.9,1312931.3,2287504.7,1539940.3}; +ST(0.053497526,0.1329974,0,0.052058531,0.12554764,0,0.059246105,0.12763558,0){2959143.9,3065498.6,2918223.5,-1911000.9,-1512626.5,-1563762.3,-3636096,-3831818,-3644117.3,623103.97,-428428.64,-127593.52,3857035.6,3614977.4,3585046}; +ST(0.020973714,0.16688371,0,0.014502412,0.16316663,0,0.021502186,0.15931359,0){1525118.3,1121335,1630158.4,-2061659.5,-1429592.9,-1947614.2,-799875.51,-728363.13,-1250943.8,2343184.8,1629901.1,2191316.6,-24581.749,280110.31,824223.66}; +ST(0.083292987,0.24598228,0,0.078142774,0.24370973,0,0.084206466,0.24009781,0){542685.82,714639.7,569988.38,-1458992.1,-1902709.3,-1492933.9,1920780.7,2448578.4,1847439,-1784182,-2167997.3,-1498530.8,1091638.2,1155455.3,578923.58}; +ST(0.039686874,0.0066116125,0,0.043829005,0.011024747,0,0.038009007,0.015147577,0){3676489.9,3801549.1,3597209.6,3658909.3,3750937.1,3506943.3,3623831.1,3650381.9,3328697.3,3571457.2,3501249.8,3067010.9,3501797.4,3305260.3,2728518.9}; +ST(0,0.085714286,0,0.0067127961,0.088875219,0,0,0.092857143,0){0,725937.81,0,0,141227.93,0,0,-557260.38,0,0,-806944.34,0,0,-406936.37,0}; +ST(0.036602132,0.28491153,0,0.043131118,0.28864457,0,0.03928574,0.29335694,0){279518.56,225252.57,127378.94,-831596.18,-672574.82,-381522.06,1362985.6,1110400.5,633829.06,-1860498.2,-1532552.2,-883092.25,2311728.5,1932837.8,1127859.7}; +ST(0.023478597,0.036718106,0,0.021348697,0.029751655,0,0.028359285,0.029784535,0){2561783.8,2382657.5,2981166.2,2187675.4,2153252.9,2693525.9,1494080.3,1716520.5,2145980.7,582277.59,1114508.8,1391347.7,-414804.14,404958.41,502245.34}; +ST(0.014305262,0.26641769,0,0.013885016,0.25805955,0,0.021957304,0.26060316,0){294901.31,357160.64,505833.44,-848621.76,-1003688.5,-1432636.8,1298521.9,1459712.7,2119105.6,-1589572.3,-1638678.7,-2450095.8,1686004.5,1506406.6,2369995.8}; +ST(0.050960377,0.23252058,0,0.056766116,0.23329497,0,0.052478219,0.23860916,0){1342135.9,1298096.4,1222305.6,-3383651.2,-3286228.7,-3178913.4,3804738.6,3735031.6,3866354.4,-2403721.7,-2434254.7,-3010118,-148681.88,-7070.0355,951644.63}; +ST(0.027746664,0.13122119,0,0.033010101,0.13109378,0,0.030046638,0.13690443,0){2296333.1,2584208,2369378.2,-1399007.9,-1567613,-1721516.8,-2843055.5,-3200932.4,-2840145.3,288094.78,308418.11,944948.24,2955532.6,3322264.5,3098367.4}; +ST(0.030046638,0.13690443,0,0.033010101,0.13109378,0,0.038217426,0.13599196,0){2369378.2,2584208,2738753.8,-1721516.8,-1567613,-1938161,-2840145.3,-3200932.4,-3305386.1,944948.24,308418.11,972060.89,3098367.4,3322264.5,3589652.3}; +ST(0.077140734,0.17217741,0,0.072573599,0.16764459,0,0.077393474,0.16425214,0){1584233.7,1881427.5,1650679.7,-2313491.7,-2572760.4,-2141613.9,-519338.58,-936075.04,-1013799.5,2552719.3,2916777.1,2443278.1,-655929.75,-135849.37,287063.28}; +ST(0.071059851,0.17209017,0,0.072573599,0.16764459,0,0.077140734,0.17217741,0){1900690.4,1881427.5,1584233.7,-2772233.4,-2572760.4,-2313491.7,-629520.98,-936075.04,-519338.58,3060958.1,2916777.1,2552719.3,-774142.34,-135849.37,-655929.75}; +ST(0.1,0.22142857,0,0.095652827,0.22622146,0,0.091864029,0.22106993,0){0,199039.37,394005.54,0,-484109.58,-927852.61,0,494313.66,863120.02,0,-223837.82,-241435.16,0,-173819.74,-536498.87}; +ST(0.0067127961,0.088875219,0,0.01318623,0.084416193,0,0.013428016,0.091778472,0){725937.81,1411871.7,1408980.1,141227.93,378554.62,204626.15,-557260.38,-931831.12,-1174648.8,-806944.34,-1560266,-1549888.7,-406936.37,-1046999.7,-600683.83}; +ST(0.034786476,0.1076516,0,0.038084092,0.1145524,0,0.030466665,0.11568191,0){2912738.3,2981407.2,2608170,-413135.58,-818508.93,-773675.45,-3267374.9,-3575257.7,-3152461.4,-2390915.6,-1775238,-1443702.3,1215377.6,2287308.3,2136967.4}; +ST(0.1,0.15714286,0,0.093710586,0.16080643,0,0.09308158,0.15403623,0){0,507346.27,579061.91,0,-621948.04,-628036.95,0,-366919.85,-525997.02,0,704920.6,672596.25,0,207593.47,469080.04}; +ST(0.0071428571,0,0,0.0045481906,0.0063920675,0,0,0,0){863498.79,552257.15,0,863505.11,549810.55,0,863516.31,544927.47,0,863538.53,537633.65,0,863596.62,527798.54,0}; +ST(0,0,0,0.0045481906,0.0063920675,0,0,0.0071428571,0){0,552257.15,0,0,549810.55,0,0,544927.47,0,0,537633.65,0,0,527798.54,0}; +ST(0,0.29285714,0,0.0045473776,0.2936365,0,0,0.3,0){0,18406.211,0,0,-55138.333,0,0,91630.552,0,0,-127724.83,0,0,162961.08,0}; +ST(0,0.3,0,0.0045473776,0.2936365,0,0.0071428571,0.3,0){0,18406.211,0,0,-55138.333,0,0,91630.552,0,0,-127724.83,0,0,162961.08,0}; +ST(0.092295863,0.26000779,0,0.095492809,0.25375881,0,0.1,0.25714286,0){193329.27,131307.15,0,-546576.12,-363726.6,0,805368.84,512510.07,0,-924990.4,-543451.99,0,884724.5,449348.78,0}; +ST(0.1,0.042857143,0,0.095360834,0.0462161,0,0.092141527,0.03991184,0){0,547145.45,927649.93,0,421466.87,767955.56,0,198977.54,476054.53,0,-69217.008,102192.68,0,-321602.09,-289378.9}; +ST(0.017861336,0.10270337,0,0.013465065,0.10662372,0,0.010955873,0.10281868,0){1773538.4,1351132.7,1124212.8,-87655.931,-165451.82,-57954.543,-1856823.6,-1496410,-1179275.3,-1677437.3,-1147793.4,-1060620.9,261812.45,489093.12,173274.75}; +ST(0.029690249,0.19362013,0,0.034128539,0.18892309,0,0.036160627,0.1953007,0){1647856.1,1872288.6,1834250.2,-3101495.4,-3356683.8,-3509998.2,1088093.1,788949.65,1372423.7,2141745.7,2731311.2,2256297.6,-2977851,-2954777.5,-3434247.7}; +ST(0.070175425,0.16144206,0,0.065117308,0.15657509,0,0.070477538,0.15360968,0){2074683.8,2354870.2,2153625.7,-2570674.4,-2678881.2,-2316413.6,-1460177,-1986291.9,-1978592.7,2919916.2,2952219.2,2466066.8,762077.82,1580034,1792310.4}; +ST(0.061476805,0.16269562,0,0.065117308,0.15657509,0,0.070175425,0.16144206,0){2391378.9,2354870.2,2074683.8,-3025373.1,-2678881.2,-2570674.4,-1589341.3,-1986291.9,-1460177,3446908.2,2952219.2,2919916.2,675366.83,1580034,762077.82}; +ST(0.016702178,0.061420197,0,0.014691551,0.054118398,0,0.021658338,0.054940441,0){1844408.3,1659245.8,2341024.9,1107331.1,1140472.1,1587273.2,-72241.295,265092.56,322446.89,-1222910.6,-693242.8,-1046241,-1885264.1,-1435183.5,-2078353.5}; +ST(0.029690249,0.19362013,0,0.023309936,0.19197185,0,0.027249449,0.18607819,0){1647856.1,1390526.6,1646413.8,-3101495.4,-2573914.4,-2861109.6,1088093.1,799964.88,464444.42,2141745.7,1893175.4,2518610.9,-2977851,-2411477.9,-2323177.4}; +ST(0.030217898,0.25971254,0,0.033025927,0.25326882,0,0.037705658,0.25939989,0){660621.26,809560.38,758443.36,-1866014.4,-2238649.8,-2140288.6,2744196,3142273.3,3141072.6,-3141188.1,-3308331.9,-3582615.2,2987009.7,2697705.3,3385872.9}; +ST(0.037705658,0.25939989,0,0.033025927,0.25326882,0,0.039157325,0.25334591,0){758443.36,809560.38,884627.38,-2140288.6,-2238649.8,-2446896,3141072.6,3142273.3,3436661.2,-3582615.2,-3308331.9,-3622356.9,3385872.9,2697705.3,2960330.2}; +ST(0.072908259,0.24139656,0,0.070607657,0.23670872,0,0.077318805,0.23627719,0){881474.92,1007105.3,830868.27,-2322734,-2594870.8,-2136157.9,2916335.3,3083897.2,2525048.7,-2445637.4,-2267120.1,-1830714.2,1082242,490193.02,350702.19}; +ST(0.013229009,0.21171696,0,0.0051799073,0.21317882,0,0.007303543,0.20469543,0){698716.07,276031.48,422375.13,-1540332.8,-615227.88,-880191.16,1156621.3,479976.29,531663.92,147278.69,25450.705,303952.91,-1334554.8,-511551.59,-861341.37}; +ST(0.047918899,0.14257657,0,0.045364072,0.14896511,0,0.041319833,0.14315875,0){2842478.3,2729630.7,2735557.7,-2400971.6,-2670475.8,-2343944,-3215455,-2787568.3,-3071175.4,1901551.7,2610132.2,1904337.3,3510918.5,2844182.1,3343927.4}; +ST(0.035714286,0,0,0.031710863,0.0075461758,0,0.028571429,0,0){3496308.9,3254919.5,3033980.1,3496337.7,3234618.2,3033983.4,3496399.5,3194153.7,3033988.7,3496538.6,3133832.1,3034024.4,3496562.8,3053845.3,3033982.5}; +ST(0.028571429,0.3,0,0.031264826,0.29263185,0,0.035714286,0.3,0){0,124484.17,0,0,-372709.78,0,0,618717.86,0,0,-861054.65,0,0,1098239.8,0}; +ST(0.077069107,0.15686929,0,0.083337094,0.16031526,0,0.077393474,0.16425214,0){1743907.9,1295652.6,1650679.7,-1994600,-1575018.8,-2141613.9,-1457243.4,-956036.82,-1013799.5,2204191.1,1781183.7,2443278.1,1140253.2,571788.58,287063.28}; +ST(0.032036001,0.10024616,0,0.030017634,0.093495078,0,0.03690243,0.09394169,0){2837469.6,2771844.6,3135041.5,-12660.65,320378.42,337961.95,-2850146.6,-2414486.4,-2760700,-2824890.6,-3014031.4,-3396384.7,37524.098,-948223.96,-1002139.6}; +ST(0.091953893,0.078440357,0,0.095795895,0.073622969,0,0.1,0.078571429,0){889726.23,473503.74,0,322434.75,205720.2,0,-450550.32,-178405.32,0,-936443.15,-461642.03,0,-825354.72,-483922.03,0}; +ST(0.084206466,0.24009781,0,0.078142774,0.24370973,0,0.077318805,0.23627719,0){569988.38,714639.7,830868.27,-1492933.9,-1902709.3,-2136157.9,1847439,2448578.4,2525048.7,-1498530.8,-2167997.3,-1830714.2,578923.58,1155455.3,350702.19}; +ST(0.021502186,0.15931359,0,0.022775714,0.15147437,0,0.027609688,0.15620978,0){1630158.4,1786181.8,2023546.1,-1947614.2,-1841345.2,-2286520.9,-1250943.8,-1729359.8,-1726415,2191316.6,1894858,2510934.9,824223.66,1670732.8,1400022.9}; +ST(0.0066871595,0.19241823,0,0.005051806,0.19767546,0,0,0.19285714,0){432113.5,313084.45,0,-803518.34,-612892.85,0,258472.73,273796.53,0,581490.34,350786.74,0,-758588.26,-609909.8,0}; +ST(0.013878694,0.17880836,0,0.014405512,0.17061143,0,0.020636298,0.17424253,0){971566.52,1063653,1433869.3,-1548960.4,-1519257.6,-2154082.5,-51095.574,-412907.51,-351921.61,1579530,1696192.6,2330929.4,-887966.26,-313907.63,-819073.82}; +ST(0.02133326,0.24577003,0,0.013821768,0.24617185,0,0.015758122,0.23699049,0){675269.21,454053.45,597291.98,-1813848.4,-1221678.8,-1541119.1,2383092.9,1611329.8,1837947.1,-2204305.3,-1502439.1,-1363109.4,1333319.6,928515.88,315646.37}; +ST(0.049721881,0.27094787,0,0.055001581,0.27169863,0,0.051703203,0.27754162,0){588018.61,565900.8,454636.43,-1710042.9,-1648356.5,-1338881.7,2675009.8,2587095.5,2149437.1,-3394309,-3300283.2,-2841702,3801713.7,3725567.5,3377384.9}; +ST(0.030490983,0.2108424,0,0.036840853,0.20596239,0,0.038843793,0.21103197,0){1428644.1,1679916.9,1637090.1,-3128471,-3538121.9,-3590120.4,2293671,2233718.4,2645890.8,399562.24,1067350,433646.44,-2769801.9,-3414669.4,-3163532.2}; +ST(0.028678488,0.042143634,0,0.030602087,0.036163623,0,0.03663522,0.040674234,0){2968313.4,3125169.1,3463485.9,2399521.8,2682310.4,2844620.6,1370917.4,1859340.6,1717431.6,79587.615,772883.67,283267.24,-1227272.3,-423255.99,-1201989.6}; +ST(0,0.25,0,0.0060491453,0.25298129,0,0,0.25714286,0){0,178654.23,0,0,-493529.07,0,0,691183.17,0,0,-724662.05,0,0,585970.08,0}; +ST(0.024044461,0.20382537,0,0.025476801,0.19755762,0,0.03163445,0.20120488,0){1283805.9,1423125.8,1608414.7,-2655634.7,-2782737.9,-3251875.6,1553893.8,1235431.1,1714266.6,995311.88,1602470.1,1500504,-2617892.2,-2766638.2,-3248047}; +ST(0.065478411,0.24860928,0,0.066600159,0.24211306,0,0.071915087,0.24816524,0){912058.17,1004296.2,803363.84,-2478342.9,-2655015,-2179152.4,3344041.2,3359675.2,2928525.2,-3264436.9,-2867211.3,-2836050.6,2261773.6,1352854.8,1927975}; +ST(0.071915087,0.24816524,0,0.066600159,0.24211306,0,0.072908259,0.24139656,0){803363.84,1004296.2,881474.92,-2179152.4,-2655015,-2322734,2928525.2,3359675.2,2916335.3,-2836050.6,-2867211.3,-2445637.4,1927975,1352854.8,1082242}; +ST(0.032036001,0.10024616,0,0.039702853,0.10111678,0,0.034786476,0.1076516,0){2837469.6,3175586.8,2912738.3,-12660.65,-64516.934,-413135.58,-2850146.6,-3238866.3,-3267374.9,-2824890.6,-3108635.2,-2390915.6,37524.098,193445.51,1215377.6}; +ST(0.047556344,0.24377674,0,0.049037582,0.25027532,0,0.043027686,0.24899973,0){1122639.4,998508.07,999522.33,-2989881.7,-2730849.8,-2720190.5,3850350.4,3739350.2,3683283.3,-3414324.1,-3756698.7,-3620573.8,1828478.4,2778087.3,2549278.8}; +ST(0.070865224,0.080352924,0,0.075872285,0.081656016,0,0.072044079,0.08604506,0){2808030.6,2427639,2688599.4,934415.1,758134.07,649473.83,-1562677.5,-1432759.9,-1882262.6,-3017110.1,-2638364.3,-2986497.2,-2458745.5,-2029677.1,-1825996.4}; +ST(0.021957304,0.26060316,0,0.027951851,0.26533243,0,0.023009638,0.26878949,0){505833.44,539100.43,417665.14,-1432636.8,-1547025.6,-1208783.5,2119105.6,2353298.6,1871958.7,-2450095.8,-2852826.8,-2337004.8,2369995.8,2980285,2554445.3}; +ST(0.081004963,0.27070547,0,0.086077973,0.27164165,0,0.082516133,0.27647665,0){333174.81,243157.03,248899.48,-968418.7,-708191.99,-731674.12,1513258.3,1111255.9,1170289.2,-1916833.2,-1417072.6,-1538273.3,2141327.9,1598582.9,1813237.5}; +ST(0.082332164,0.023444943,0,0.085916752,0.02828,0,0.080699945,0.029142305,0){2029600,1643257.2,2185639.9,1907886.4,1500211.7,1983669.2,1671751.1,1226559.7,1598386.1,1335359.8,846114.35,1065401.8,918760.81,391827.49,433818.71}; +ST(0.047385855,0.10193045,0,0.052532368,0.096036702,0,0.054240748,0.10280037,0){3329666.7,3389506.1,3302360.6,-117239.93,240670.51,-169115.68,-3442848.4,-3131818.5,-3462856.5,-3204510.9,-3594959.1,-3116478.2,350991.89,-718569.73,505791.56}; +ST(0.012549176,0.077039569,0,0.01318623,0.084416193,0,0.0064539684,0.081629255,0){1370920.5,1411871.7,711139.06,525978.15,378554.62,222377.16,-643140.23,-931831.12,-419239.47,-1415881.7,-1560266,-772749.89,-1316306.1,-1046999.7,-595288.06}; +ST(0.054010827,0.25507988,0,0.060567191,0.25172758,0,0.060672356,0.25950081,0){897184.36,917440.34,771273.27,-2496661.6,-2522838.3,-2177172.3,3553831.7,3497206.6,3197356.1,-3839088.9,-3596815.5,-3651078,3290330.5,2796536,3457676.3}; +ST(0.060672356,0.25950081,0,0.060567191,0.25172758,0,0.066803853,0.25459223,0){771273.27,917440.34,789541.66,-2177172.3,-2522838.3,-2193455.3,3197356.1,3497206.6,3110738.9,-3651078,-3596815.5,-3337877,3457676.3,2796536,2824240.3}; +ST(0.092450683,0.030760689,0,0.085916752,0.02828,0,0.089183466,0.023798504,0){900007.85,1643257.2,1283383.3,807431.66,1500211.7,1204105.7,631804.95,1226559.7,1050439.6,391202.83,846114.35,831874.08,110124.82,391827.49,561630.79}; +ST(0.089232651,0.27618677,0,0.086077973,0.27164165,0,0.092520768,0.26920591,0){160151.6,243157.03,145042.72,-470555.02,-708191.99,-420173.4,751874.95,1111255.9,651988.34,-986723.61,-1417072.6,-816598.86,1160401.4,1598582.9,896908.09}; +ST(0.064373335,0.2338171,0,0.065627137,0.22734606,0,0.07180958,0.22984275,0){1185902.3,1270705.1,1079159.6,-3010536.1,-3111357.1,-2680718.2,3446119.8,3236198.8,2899261.6,-2291596.2,-1576358.2,-1622013.4,79206.699,-953054.66,-492395.98}; +ST(0.059957308,0.22757204,0,0.065627137,0.22734606,0,0.064373335,0.2338171,0){1366903.5,1270705.1,1185902.3,-3351367.9,-3111357.1,-3010536.1,3498598.8,3236198.8,3446119.8,-1727811.3,-1576358.2,-2291596.2,-990620.01,-953054.66,79206.699}; +ST(0.027609688,0.15620978,0,0.030440206,0.150204,0,0.034314476,0.15645926,0){2023546.1,2239650.6,2334400.9,-2286520.9,-2249230.7,-2649968.2,-1726415,-2230054.7,-1976247.7,2510934.9,2258843.4,2917237.1,1400022.9,2220211.9,1581967.4}; +ST(0.03690243,0.09394169,0,0.030017634,0.093495078,0,0.033761495,0.088496681,0){3135041.5,2771844.6,3029395.9,337961.95,320378.42,608605.12,-2760700,-2414486.4,-2298547.5,-3396384.7,-3014031.4,-3368980,-1002139.6,-948223.96,-1747439.7}; +ST(0.023478597,0.036718106,0,0.022876349,0.043626948,0,0.017433092,0.042090914,0){2561783.8,2488553.5,1971771.3,2187675.4,1978130.3,1594855,1494080.3,1061959.9,913057.13,582277.59,-72059.632,56690.05,-414804.14,-1191549.5,-810753.02}; +ST(0,0.064285714,0,0.0062494098,0.068021592,0,0,0.071428571,0){0,709501.16,0,0,364477.97,0,0,-157824.6,0,0,-603457.47,0,0,-756039.79,0}; +ST(0.020973714,0.16688371,0,0.025851591,0.17077962,0,0.020636298,0.17424253,0){1525118.3,1763476.8,1433869.3,-2061659.5,-2524912.6,-2154082.5,-799875.51,-673288.62,-351921.61,2343184.8,2815714.9,2330929.4,-24581.749,-542697.73,-819073.82}; +ST(0.075488644,0.14176328,0,0.081009521,0.1385969,0,0.08264437,0.14444108,0){1990888.2,1630909.4,1463951.5,-1647841.2,-1242340.3,-1293607.4,-2274843.7,-1926924,-1614532.1,1255935.2,783271.16,1105781,2491166.6,2113542.9,1743195.6}; +ST(0.01180171,0.25230222,0,0.013885016,0.25805955,0,0.0098751756,0.25600949,0){347512.04,357160.64,270470.11,-957611.77,-1003688.5,-755004.71,1333704.3,1459712.7,1082095.4,-1383899.6,-1638678.7,-1183544.7,1095718.6,1506406.6,1038261.4}; +ST(0.0064539684,0.081629255,0,0.01318623,0.084416193,0,0.0067127961,0.088875219,0){711139.06,1411871.7,725937.81,222377.16,378554.62,141227.93,-419239.47,-931831.12,-557260.38,-772749.89,-1560266,-806944.34,-595288.06,-1046999.7,-406936.37}; +ST(0.034786476,0.1076516,0,0.039702853,0.10111678,0,0.042557423,0.10832344,0){2912738.3,3175586.8,3183930.6,-413135.58,-64516.934,-492142.06,-3267374.9,-3238866.3,-3600076,-2390915.6,-3108635.2,-2551523.2,1215377.6,193445.51,1442840.6}; +ST(0.064373335,0.2338171,0,0.056766116,0.23329497,0,0.059957308,0.22757204,0){1185902.3,1298096.4,1366903.5,-3010536.1,-3286228.7,-3351367.9,3446119.8,3735031.6,3498598.8,-2291596.2,-2434254.7,-1727811.3,79206.699,-7070.0355,-990620.01}; +ST(0.071000103,0.28243589,0,0.069147655,0.28722413,0,0.063469548,0.28521738,0){281581.81,213884.16,273598.49,-835250.62,-637821.62,-814255.31,1360764.9,1050341,1335465.2,-1840418.5,-1444059.1,-1824812,2257916.8,1811586.6,2270429.1}; +ST(0.073754091,0.28851618,0,0.069147655,0.28722413,0,0.071000103,0.28243589,0){171229.59,213884.16,281581.81,-511212.67,-637821.62,-835250.62,843808.82,1050341,1360764.9,-1164215.8,-1444059.1,-1840418.5,1467609.3,1811586.6,2257916.8}; +ST(0.064075209,0.013493001,0,0.069232026,0.01217315,0,0.070691378,0.017050195,0){3498581.2,3187096.8,3076870.7,3428890.3,3135369.8,2979073.3,3290906.4,3032749.5,2786592,3087427.7,2880922.9,2505581.5,2822154,2682056.5,2144710.8}; +ST(0.070691378,0.017050195,0,0.069232026,0.01217315,0,0.073684623,0.0112317,0){3076870.7,3187096.8,2850123.3,2979073.3,3135369.8,2810738.2,2786592,3032749.5,2732509.2,2505581.5,2880922.9,2616540.6,2144710.8,2682056.5,2464223.2}; +ST(0.062992669,0.22303634,0,0.065627137,0.22734606,0,0.059957308,0.22757204,0){1396775.9,1270705.1,1366903.5,-3331109.7,-3111357.1,-3351367.9,3216330,3236198.8,3498598.8,-1122974.8,-1576358.2,-1727811.3,-1661551.4,-953054.66,-990620.01}; +ST(0.007303543,0.20469543,0,0.005051806,0.19767546,0,0.011268327,0.1984065,0){422375.13,313084.45,682302.12,-880191.16,-612892.85,-1344805.9,531663.92,273796.53,623458.07,303952.91,350786.74,739532.85,-861341.37,-609909.8,-1341727.7}; +ST(0.054876921,0.07294965,0,0.047469022,0.070467195,0,0.052494391,0.065958781,0){3558755.8,3608010.8,3640248,1580988.4,1730907.5,1971511.2,-1275447.3,-1046792,-601016.65,-3423192.1,-3280034.9,-2898090,-3669097.1,-3807136.9,-3866942}; +ST(0.041803352,0.076750149,0,0.047469022,0.070467195,0,0.049165273,0.076760106,0){3453761.9,3608010.8,3570137.5,1340279.2,1730907.5,1384898,-1593440.1,-1046792,-1648055.9,-3552303.7,-3280034.9,-3672308.6,-3337911.6,-3807136.9,-3449021.3}; +ST(0,0.23571429,0,0.0069516057,0.23320895,0,0.0071147476,0.24137211,0){0,288078.49,259907.57,0,-728952.19,-684802.64,0,827497.2,859611.54,0,-537397.4,-720499.62,0,-5267.3055,317972.39}; +ST(0.038597539,0.20095921,0,0.036840853,0.20596239,0,0.03163445,0.20120488,0){1801301.7,1679916.9,1608414.7,-3633864.6,-3538121.9,-3251875.6,1895634,2233718.4,1714266.6,1705394,1067350,1500504,-3630918.1,-3414669.4,-3248047}; +ST(0.033874053,0.071548869,0,0.041803352,0.076750149,0,0.032911969,0.081185013,0){3157862.8,3453761.9,3037931.3,1466537.3,1340279.2,971274.35,-1010259.7,-1593440.1,-1756226.8,-2946084.6,-3552303.7,-3289165.4,-3304540.6,-3337911.6,-2584916.3}; +ST(0.1,0.05,0,0.095360834,0.0462161,0,0.1,0.042857143,0){0,547145.45,0,0,421466.87,0,0,198977.54,0,0,-69217.008,0,0,-321602.09,0}; +ST(0.069025318,0.11622387,0,0.070840483,0.12204614,0,0.064276416,0.12183086,0){2631986.5,2470738.2,2809128.6,-808686.45,-1044803.2,-1175750.5,-3192250.9,-3073782.1,-3492840.6,-1402768.4,-729197.53,-855220.15,2220554.1,2652961,2995580.4}; +ST(0.1,0.25714286,0,0.095492809,0.25375881,0,0.1,0.25,0){0,131307.15,0,0,-363726.6,0,0,512510.07,0,0,-543451.99,0,0,449348.78,0}; +ST(0,0.11428571,0,0.0062042788,0.11791514,0,0,0.12142857,0){0,612847.32,0,0,-208741.13,0,0,-750565.55,0,0,-286207.66,0,0,561848.67,0}; +ST(0.092141527,0.03991184,0,0.095360834,0.0462161,0,0.08974924,0.047235181,0){927649.93,547145.45,1190814.4,767955.56,421466.87,905328.07,476054.53,198977.54,402804.56,102192.68,-69217.008,-196265.4,-289378.9,-321602.09,-748421.11}; +ST(0.090077759,0.25268961,0,0.095492809,0.25375881,0,0.092295863,0.26000779,0){291813.61,131307.15,193329.27,-805257.31,-363726.6,-546576.12,1125037.4,512510.07,805368.84,-1174248.1,-543451.99,-924990.4,940920.06,449348.78,884724.5}; +ST(0.054010827,0.25507988,0,0.049037582,0.25027532,0,0.054957014,0.24657048,0){897184.36,998508.07,1058545,-2496661.6,-2730849.8,-2852831,3553831.7,3739350.2,3777171.8,-3839088.9,-3756698.7,-3549694.2,3290330.5,2778087.3,2239441.1}; +ST(0,0.19285714,0,0.005051806,0.19767546,0,0,0.2,0){0,313084.45,0,0,-612892.85,0,0,273796.53,0,0,350786.74,0,0,-609909.8,0}; +ST(0.024938414,0.098415267,0,0.030017634,0.093495078,0,0.032036001,0.10024616,0){2383058.5,2771844.6,2837469.6,68195.72,320378.42,-12660.65,-2312962.3,-2414486.4,-2850146.6,-2447461.4,-3014031.4,-2824890.6,-204726.33,-948223.96,37524.098}; +ST(0.06966854,0.20076802,0,0.064671223,0.19505087,0,0.071449289,0.19423207,0){1570520.4,1815232.4,1594804.6,-3162888.4,-3465163,-3019964.8,1636334.6,1334352.3,1103926.4,1503948.1,2252470.6,2033518.7,-3161601.9,-3382100.5,-2921575.1}; +ST(0.060432552,0.20227914,0,0.064671223,0.19505087,0,0.06966854,0.20076802,0){1798951.1,1815232.4,1570520.4,-3671781.8,-3465163,-3162888.4,2023610.8,1334352.3,1636334.6,1565241.8,2252470.6,1503948.1,-3653837,-3382100.5,-3161601.9}; +ST(0.014210915,0.13228117,0,0.012365279,0.12660144,0,0.01788586,0.12850833,0){1289449.4,1158576.2,1616906.9,-813665.75,-596487.84,-895214.81,-1589638.3,-1447959.2,-2016472.2,227067.92,-105993.81,-4802.2192,1673024.3,1396357.8,2014144.7}; +ST(0.0072553778,0.13224921,0,0.012365279,0.12660144,0,0.014210915,0.13228117,0){674958.82,1158576.2,1289449.4,-425463.67,-596487.84,-813665.75,-832230.25,-1447959.2,-1589638.3,117822.57,-105993.81,227067.92,875622.71,1396357.8,1673024.3}; +ST(0.030575169,0.1246812,0,0.023379755,0.12686903,0,0.025139549,0.12057635,0){2526238.7,2047772.9,2224740.3,-1202245.8,-1065433.1,-875333.98,-3156412.2,-2558991,-2755721.9,-451924.48,-162203.53,-796179.51,2919641.1,2481221.5,2272644.8}; +ST(0.036160627,0.1953007,0,0.034128539,0.18892309,0,0.039366597,0.19088868,0){1834250.2,1872288.6,1982365.2,-3509998.2,-3356683.8,-3628592.6,1372423.7,788949.65,1030950.1,2256297.6,2731311.2,2772526.5,-3434247.7,-2954777.5,-3333638.5}; +ST(0.041319833,0.14315875,0,0.045364072,0.14896511,0,0.037897724,0.149701,0){2735557.7,2729630.7,2552043.8,-2343944,-2670475.8,-2536068.8,-3071175.4,-2787568.3,-2567975.2,1904337.3,2610132.2,2520076,3343927.4,2844182.1,2583694.6}; +ST(0.0058133292,0.032528446,0,0.0063343033,0.038958017,0,0,0.035714286,0){694559.72,751213.74,0,614750.96,627892.11,0,464300.7,401490.67,0,260495.38,109174.99,0,26512.55,-201236.23,0}; +ST(0.045044357,0.28188841,0,0.045592054,0.27439642,0,0.051703203,0.27754162,0){362990.51,513714.39,454636.43,-1075960.6,-1504437.2,-1338881.7,1750378.7,2387679.2,2149437.1,-2362097.1,-3100344.3,-2841702,2889034,3591305.7,3377384.9}; +ST(0.068476894,0.0069177029,0,0.06203594,0.0060944193,0,0.064285714,0,0){3242851.4,3604620.2,3496327.6,3225849.8,3589956.2,3496358.5,3191931.3,3560685.5,3496415,3141298.2,3516960.1,3496523.2,3073847.6,3458793.9,3496472.9}; +ST(0.064285714,0.3,0,0.061805884,0.29356168,0,0.068366879,0.29272708,0){0,121923.05,123803.43,0,-365207.83,-370697.46,0,606815.62,615462.12,0,-845641.09,-856697.17,0,1080583.1,1092834.3}; +ST(0.07180958,0.22984275,0,0.065627137,0.22734606,0,0.069002793,0.22246209,0){1079159.6,1270705.1,1267491.2,-2680718.2,-3111357.1,-3011719.2,2899261.6,3236198.8,2877058.6,-1622013.4,-1576358.2,-947533.34,-492395.98,-953054.66,-1573376.1}; +ST(0.066925078,0.074981916,0,0.060416267,0.076932239,0,0.061098586,0.072147464,0){3090390.8,3380545.3,3389933,1280900.5,1302521.2,1545196.6,-1278621.5,-1576156.6,-1140417.3,-3089611.2,-3485992.8,-3205469.9,-3091904.4,-3253298.6,-3526423.9}; +ST(0.064352171,0.083117586,0,0.060416267,0.076932239,0,0.066925078,0.074981916,0){3167194.8,3380545.3,3090390.8,915483.69,1302521.2,1280900.5,-1987167.2,-1576156.6,-1278621.5,-3477240.4,-3485992.8,-3089611.2,-2495770,-3253298.6,-3091904.4}; +ST(0.0060491453,0.25298129,0,0.01180171,0.25230222,0,0.0098751756,0.25600949,0){178654.23,347512.04,270470.11,-493529.07,-957611.77,-755004.71,691183.17,1333704.3,1082095.4,-724662.05,-1383899.6,-1183544.7,585970.08,1095718.6,1038261.4}; +ST(0.0087429334,0.24792416,0,0.01180171,0.25230222,0,0.0060491453,0.25298129,0){283453.34,347512.04,178654.23,-768118.62,-957611.77,-493529.07,1029935.2,1333704.3,691183.17,-992967.39,-1383899.6,-724662.05,667809.3,1095718.6,585970.08}; +ST(0.055202425,0.1814475,0,0.061291474,0.18447479,0,0.055890502,0.18802963,0){2227021.2,2069396,2110328.4,-3667462.5,-3531333.7,-3747121.1,145084.74,425331.11,795966.68,3573754.5,3230965.1,3129878.5,-2457046.3,-2708277.6,-3224012.4}; +ST(0.025350652,0.23917347,0,0.033139613,0.24047735,0,0.029124573,0.24658198,0){868665.73,1026889.2,849052.23,-2265304,-2694450.7,-2288340.2,2773502.3,3348643.4,3030093.5,-2193941.8,-2743423.6,-2848204.4,753574.67,1106136.5,1797881.3}; +ST(0,0.12142857,0,0.0061411468,0.1246533,0,0,0.12857143,0){0,591118.91,0,0,-280990.71,0,0,-738586.84,0,0,-106527.54,0,0,682629.18,0}; +ST(0.03163445,0.20120488,0,0.036160627,0.1953007,0,0.038597539,0.20095921,0){1608414.7,1834250.2,1801301.7,-3251875.6,-3509998.2,-3633864.6,1714266.6,1372423.7,1895634,1500504,2256297.6,1705394,-3248047,-3434247.7,-3630918.1}; +ST(0.029690249,0.19362013,0,0.036160627,0.1953007,0,0.03163445,0.20120488,0){1647856.1,1834250.2,1608414.7,-3101495.4,-3509998.2,-3251875.6,1088093.1,1372423.7,1714266.6,2141745.7,2256297.6,1500504,-2977851,-3434247.7,-3248047}; +ST(0,0.17142857,0,0.0046637588,0.16745308,0,0.0069613667,0.17349451,0){0,362371.83,517779.21,0,-494096.85,-769992.03,0,-182769.85,-142713.64,0,560561.48,839532.94,0,-21256.565,-266340.1}; +ST(0.034314476,0.15645926,0,0.030440206,0.150204,0,0.037897724,0.149701,0){2334400.9,2239650.6,2552043.8,-2649968.2,-2249230.7,-2536068.8,-1976247.7,-2230054.7,-2567975.2,2917237.1,2258843.4,2520076,1581967.4,2220211.9,2583694.6}; +ST(0.077393474,0.16425214,0,0.072573599,0.16764459,0,0.070175425,0.16144206,0){1650679.7,1881427.5,2074683.8,-2141613.9,-2572760.4,-2570674.4,-1013799.5,-936075.04,-1460177,2443278.1,2916777.1,2919916.2,287063.28,-135849.37,762077.82}; +ST(0.050398693,0.1921099,0,0.055890502,0.18802963,0,0.057391395,0.19462543,0){2077292.2,2110328.4,1979510.6,-3850553.1,-3747121.1,-3763012.6,1209682,795966.68,1410875.8,2818064.5,3129878.5,2491970.2,-3615771.1,-3224012.4,-3656419.8}; +ST(0.057391395,0.19462543,0,0.055890502,0.18802963,0,0.06137482,0.19024807,0){1979510.6,2110328.4,1976038.9,-3763012.6,-3747121.1,-3592882,1410875.8,795966.68,963745.22,2491970.2,3129878.5,2804392.5,-3656419.8,-3224012.4,-3258719.1}; +ST(0,0.13571429,0,0.0054758376,0.13911323,0,0,0.14285714,0){0,495708.7,0,0,-382921.42,0,0,-582869.54,0,0,250325.59,0,0,639819.51,0}; +ST(0.063469548,0.28521738,0,0.069147655,0.28722413,0,0.068366879,0.29272708,0){273598.49,213884.16,123803.43,-814255.31,-637821.62,-370697.46,1335465.2,1050341,615462.12,-1824812,-1444059.1,-856697.17,2270429.1,1811586.6,1092834.3}; +ST(0.068366879,0.29272708,0,0.069147655,0.28722413,0,0.073754091,0.28851618,0){123803.43,213884.16,171229.59,-370697.46,-637821.62,-511212.67,615462.12,1050341,843808.82,-856697.17,-1444059.1,-1164215.8,1092834.3,1811586.6,1467609.3}; +ST(0.068476894,0.0069177029,0,0.069232026,0.01217315,0,0.064075209,0.013493001,0){3242851.4,3187096.8,3498581.2,3225849.8,3135369.8,3428890.3,3191931.3,3032749.5,3290906.4,3141298.2,2880922.9,3087427.7,3073847.6,2682056.5,2822154}; +ST(0.073684623,0.0112317,0,0.069232026,0.01217315,0,0.068476894,0.0069177029,0){2850123.3,3187096.8,3242851.4,2810738.2,3135369.8,3225849.8,2732509.2,3032749.5,3191931.3,2616540.6,2880922.9,3141298.2,2464223.2,2682056.5,3073847.6}; +ST(0,0.26428571,0,0.0071908097,0.26035264,0,0.0060732531,0.2674669,0){0,179155.76,124750.88,0,-507033.49,-359918.85,0,748779.14,553735.12,0,-863311.12,-683931.42,0,830950.48,735399.5}; +ST(0.093873231,0.17693503,0,0.095837038,0.182565,0,0.089858368,0.18421461,0){445896.9,291932.87,692603.24,-694096.79,-487211.17,-1178349.1,-59504.029,33971.767,133849.22,727141.13,464480.32,1084450.2,-345394.37,-344762.9,-894447.98}; +ST(0.023309936,0.19197185,0,0.021212478,0.18688263,0,0.027249449,0.18607819,0){1390526.6,1339179.6,1646413.8,-2573914.4,-2348119.2,-2861109.6,799964.88,429909.33,464444.42,1893175.4,2024227.8,2518610.9,-2411477.9,-1955356.8,-2323177.4}; +ST(0,0.035714286,0,0.0063343033,0.038958017,0,0,0.042857143,0){0,751213.74,0,0,627892.11,0,0,401490.67,0,0,109174.99,0,0,-201236.23,0}; +ST(0,0.22857143,0,0.0069516057,0.23320895,0,0,0.23571429,0){0,288078.49,0,0,-728952.19,0,0,827497.2,0,0,-537397.4,0,0,-5267.3055,0}; +ST(0.031710863,0.0075461758,0,0.025051818,0.0051959301,0,0.028571429,0,0){3254919.5,2747435.6,3033980.1,3234618.2,2739316.7,3033983.4,3194153.7,2723095.2,3033988.7,3133832.1,2698832.3,3034024.4,3053845.3,2666496.7,3033982.5}; +ST(0.028571429,0.3,0,0.024877102,0.29495936,0,0.031264826,0.29263185,0){0,72135.52,124484.17,0,-216205.93,-372709.78,0,359676.71,618717.86,0,-502149.61,-861054.65,0,642973.44,1098239.8}; +ST(0.025468185,0.010276157,0,0.025051818,0.0051959301,0,0.031710863,0.0075461758,0){2780034,2747435.6,3254919.5,2747892,2739316.7,3234618.2,2683968.5,2723095.2,3194153.7,2589008.8,2698832.3,3133832.1,2463902.9,2666496.7,3053845.3}; +ST(0.031264826,0.29263185,0,0.024877102,0.29495936,0,0.025130011,0.29009115,0){124484.17,72135.52,142877.47,-372709.78,-216205.93,-427099.39,618717.86,359676.71,706741.94,-861054.65,-502149.61,-978805.55,1098239.8,642973.44,1240164.3}; +ST(0.024938414,0.098415267,0,0.024499807,0.092422798,0,0.030017634,0.093495078,0){2383058.5,2390452.1,2771844.6,68195.72,320672.29,320378.42,-2312962.3,-2026771.7,-2414486.4,-2447461.4,-2619357.9,-3014031.4,-204726.33,-944222.72,-948223.96}; +ST(0.083292987,0.24598228,0,0.085145188,0.25032735,0,0.07921504,0.25033934,0){542685.82,448997.25,606155.6,-1458992.1,-1228228.7,-1658203,1920780.7,1682589.8,2271843.6,-1784182,-1691886.1,-2284831,1091638.2,1253443,1693484.6}; +ST(0.077364239,0.048764008,0,0.083998423,0.049627851,0,0.080938662,0.054906318,0){2450679,1806853.8,2097661.4,1825420.5,1329741.5,1423084,734405.59,501474.01,290856.94,-544039.45,-459273.5,-934922.56,-1683943.8,-1299103.8,-1860365.1}; +ST(0,0.25714286,0,0.0071908097,0.26035264,0,0,0.26428571,0){0,179155.76,0,0,-507033.49,0,0,748779.14,0,0,-863311.12,0,0,830950.48,0}; +ST(0.059437672,0.2400817,0,0.061408089,0.24582042,0,0.054957014,0.24657048,0){1145348.7,1017142.7,1058545,-2999714,-2732695.2,-2852831,3711340.5,3591948.1,3777171.8,-3009146,-3325647.6,-3549694.2,1160252.2,2017029.8,2239441.1}; +ST(0.052494391,0.065958781,0,0.059054943,0.066788508,0,0.054876921,0.07294965,0){3640248,3499189.3,3558755.8,1971511.2,1856149.2,1580988.4,-601016.65,-658492.2,-1275447.3,-2898090,-2864039.1,-3423192.1,-3866942,-3725081.1,-3669097.1}; +ST(0.054876921,0.07294965,0,0.059054943,0.066788508,0,0.061098586,0.072147464,0){3558755.8,3499189.3,3389933,1580988.4,1856149.2,1545196.6,-1275447.3,-658492.2,-1140417.3,-3423192.1,-2864039.1,-3205469.9,-3669097.1,-3725081.1,-3526423.9}; +ST(0.1,0.14285714,0,0.093938974,0.13899,0,0.1,0.13571429,0){0,548364.78,0,0,-422206.84,0,0,-645591.08,0,0,273728.87,0,0,708600.91,0}; +ST(0.030623168,0.1713445,0,0.025851591,0.17077962,0,0.029380008,0.16405835,0){1985985.4,1763476.8,2021292.5,-2866418.8,-2524912.6,-2614335.2,-715248.18,-673288.62,-1254306.4,3183566.3,2815714.9,2982541.3,-696442.05,-542697.73,378860.61}; +ST(0.0064812773,0.046734878,0,0.013132659,0.04767246,0,0.0094132111,0.052421332,0){761350.4,1507774.2,1088603.4,582610.88,1139737.5,768702.62,267082.8,493500.09,222919.17,-111174.21,-273193.01,-388347.22,-463416.67,-973395.4,-885762.83}; +ST(0.011573719,0.041901165,0,0.013132659,0.04767246,0,0.0064812773,0.046734878,0){1347025.1,1507774.2,761350.4,1091815.8,1139737.5,582610.88,629744.45,493500.09,267082.8,48353.226,-273193.01,-111174.21,-542301.86,-973395.4,-463416.67}; +ST(0.092168655,0.23668616,0,0.095706332,0.23121352,0,0.1,0.23571429,0){307607.26,183910.78,0,-792496.69,-460364.34,0,941630.33,508106.39,0,-691810.02,-303408.65,0,148523.72,-52245.513,0}; +ST(0.048791783,0.28884593,0,0.043131118,0.28864457,0,0.045044357,0.28188841,0){226341.07,225252.57,362990.51,-675936.71,-672574.82,-1075960.6,1116322.7,1110400.5,1750378.7,-1541505,-1532552.2,-2362097.1,1945474.1,1932837.8,2889034}; +ST(0.045044357,0.28188841,0,0.043131118,0.28864457,0,0.036602132,0.28491153,0){362990.51,225252.57,279518.56,-1075960.6,-672574.82,-831596.18,1750378.7,1110400.5,1362985.6,-2362097.1,-1532552.2,-1860498.2,2889034,1932837.8,2311728.5}; +ST(0.071449289,0.19423207,0,0.064671223,0.19505087,0,0.06771074,0.1881525,0){1594804.6,1815232.4,1821405.7,-3019964.8,-3465163,-3238423,1103926.4,1334352.3,698008.36,2033518.7,2252470.6,2695511.5,-2921575.1,-3382100.5,-2795478.4}; +ST(0.06771074,0.1881525,0,0.064671223,0.19505087,0,0.06137482,0.19024807,0){1821405.7,1815232.4,1976038.9,-3238423,-3465163,-3592882,698008.36,1334352.3,963745.22,2695511.5,2252470.6,2804392.5,-2795478.4,-3382100.5,-3258719.1}; +ST(0.051703203,0.27754162,0,0.051519181,0.28417908,0,0.045044357,0.28188841,0){454636.43,320732.11,362990.51,-1338881.7,-953415.16,-1075960.6,2149437.1,1560004.1,1750378.7,-2841702,-2123899.5,-2362097.1,3377384.9,2629434.9,2889034}; +ST(0.045044357,0.28188841,0,0.051519181,0.28417908,0,0.048791783,0.28884593,0){362990.51,320732.11,226341.07,-1075960.6,-953415.16,-675936.71,1750378.7,1560004.1,1116322.7,-2362097.1,-2123899.5,-1541505,2889034,2629434.9,1945474.1}; +ST(0.066925078,0.074981916,0,0.064846874,0.068845861,0,0.072323403,0.067507008,0){3090390.8,3243292.3,2781512.1,1280900.5,1629296.1,1448400.9,-1278621.5,-795531.06,-578922.09,-3089611.2,-2824516.6,-2328912.3,-3091904.4,-3448034.5,-2963263.7}; +ST(0.017861336,0.10270337,0,0.013714026,0.097839388,0,0.019165757,0.095107709,0){1773538.4,1412613.2,1930971.9,-87655.931,55008.627,168744.63,-1856823.6,-1355500.2,-1747493.7,-1677437.3,-1463354,-2069009.1,261812.45,-165174.7,-502664.26}; +ST(0.072126291,0.10515927,0,0.076969725,0.10634022,0,0.074105201,0.11070107,0){2539730.3,2181001.1,2359475.3,-241283.81,-255488.75,-471755.94,-2758172.2,-2406546.5,-2736894.8,-2254933.2,-1869163.7,-1717960.7,717337.89,756176.24,1362139.4}; +ST(0.077318805,0.23627719,0,0.078142774,0.24370973,0,0.072908259,0.24139656,0){830868.27,714639.7,881474.92,-2136157.9,-1902709.3,-2322734,2525048.7,2448578.4,2916335.3,-1830714.2,-2167997.3,-2445637.4,350702.19,1155455.3,1082242}; +ST(0,0.17857143,0,0.0062925762,0.18063125,0,0,0.18571429,0){0,445914.92,0,0,-727143.63,0,0,12632.594,0,0,719304.1,0,0,-466469.22,0}; +ST(0.045894811,0.13135905,0,0.044512931,0.13802764,0,0.038217426,0.13599196,0){2973475.7,2867370.6,2738753.8,-1819976.4,-2150242,-1938161,-3679581.9,-3405187.4,-3305386.1,392676.16,1298632.3,972060.89,3832095.1,3729885,3589652.3}; +ST(0.028198926,0.28535727,0,0.0220603,0.28602893,0,0.023483408,0.28013687,0){230200.16,181204.07,270985.88,-685197.76,-539738.59,-801278.39,1124120.6,886739.53,1297043.7,-1536674.3,-1214791.9,-1736920.8,1912913.1,1516611.7,2101746.5}; +ST(0.053497526,0.1329974,0,0.049213686,0.13705186,0,0.045894811,0.13135905,0){2959143.9,2922689.8,2973475.7,-1911000.9,-2132523.3,-1819976.4,-3636096,-3499251.9,-3679581.9,623103.97,1186505.2,392676.16,3857035.6,3819996.4,3832095.1}; +ST(0.060819012,0.031697917,0,0.054261983,0.029107824,0,0.057707972,0.025075094,0){3608360,3801269,3734947.8,3214477.8,3450822.2,3478918.2,2469695.4,2782228.4,2984396.6,1455299.1,1857139.4,2285289.9,281702.17,760852.59,1429238.8}; +ST(0.038217426,0.13599196,0,0.033010101,0.13109378,0,0.038464606,0.12667013,0){2738753.8,2584208,2859316.3,-1938161,-1567613,-1476046.2,-3305386.1,-3200932.4,-3573486.5,972060.89,308418.11,-252868.56,3589652.3,3322264.5,3451249.3}; +ST(0.07180958,0.22984275,0,0.070607657,0.23670872,0,0.064373335,0.2338171,0){1079159.6,1007105.3,1185902.3,-2680718.2,-2594870.8,-3010536.1,2899261.6,3083897.2,3446119.8,-1622013.4,-2267120.1,-2291596.2,-492395.98,490193.02,79206.699}; +ST(0.09308158,0.15403623,0,0.088623123,0.15812222,0,0.084604507,0.15255901,0){579061.91,918302.92,1258841.2,-628036.95,-1074338,-1326319,-525997.02,-735787.48,-1187789.9,672596.25,1199414.9,1390056.3,469080.04,531983.03,1113216.6}; +ST(0.031105381,0.06529626,0,0.027058874,0.069011929,0,0.025221599,0.062165695,0){3030579.1,2727323.5,2618029.3,1667989.8,1363815.9,1547191.2,-444570.51,-681543.48,-156575.4,-2357289.6,-2386220.5,-1796512.5,-3210321.2,-2898415.6,-2702051.5}; +ST(0,0.15,0,0.0056981356,0.15371602,0,0,0.15714286,0){0,478995.44,0,0,-516269.88,0,0,-438816.38,0,0,550400.04,0,0,395913.98,0}; +ST(0.040431855,0.24188745,0,0.033139613,0.24047735,0,0.037546984,0.23452457,0){1110505,1026889.2,1205921.7,-2932804,-2694450.7,-3072707.6,3702149.5,3348643.4,3550700.1,-3142324.5,-2743423.6,-2423829.8,1453973.2,1106136.5,201013.93}; +ST(0.077364239,0.048764008,0,0.073604017,0.054819307,0,0.06961584,0.048915995,0){2450679,2744584.6,3063466,1825420.5,1864679.8,2277085.6,734405.59,386939.94,906160.93,-544039.45,-1214908.7,-697426.19,-1683943.8,-2427603.9,-2122325.6}; +ST(0.037546984,0.23452457,0,0.033139613,0.24047735,0,0.030075176,0.23324008,0){1205921.7,1026889.2,1077047.3,-3072707.6,-2694450.7,-2725827,3550700.1,3348643.4,3095770.8,-2423829.8,-2743423.6,-2013325.9,201013.93,1106136.5,-13872.597}; +ST(0.03690243,0.09394169,0,0.039702853,0.10111678,0,0.032036001,0.10024616,0){3135041.5,3175586.8,2837469.6,337961.95,-64516.934,-12660.65,-2760700,-3238866.3,-2850146.6,-3396384.7,-3108635.2,-2824890.6,-1002139.6,193445.51,37524.098}; +ST(0.054692531,0.17439284,0,0.060859952,0.17787963,0,0.055202425,0.1814475,0){2346407.8,2182203,2227021.2,-3532168.6,-3438395.7,-3667462.5,-561454.61,-202892.1,145084.74,3816051.1,3555311.4,3573754.5,-1367177.6,-1844119.8,-2457046.3}; +ST(0.060825265,0.17090728,0,0.060859952,0.17787963,0,0.054692531,0.17439284,0){2288734.2,2182203,2346407.8,-3282960.5,-3438395.7,-3532168.6,-862639.89,-202892.1,-561454.61,3657845.3,3555311.4,3816051.1,-726586.11,-1844119.8,-1367177.6}; +ST(0.092520768,0.26920591,0,0.095069321,0.27540052,0,0.089232651,0.27618677,0){145042.72,76899.446,160151.6,-420173.4,-225624.71,-470555.02,651988.34,359465.9,751874.95,-816598.86,-469594.27,-986723.61,896908.09,548580.83,1160401.4}; +ST(0.1,0.27142857,0,0.095069321,0.27540052,0,0.092520768,0.26920591,0){0,76899.446,145042.72,0,-225624.71,-420173.4,0,359465.9,651988.34,0,-469594.27,-816598.86,0,548580.83,896908.09}; +ST(0.092450683,0.030760689,0,0.095041081,0.024587994,0,0.1,0.028571429,0){900007.85,597113.29,0,807431.66,557751.32,0,631804.95,481620.22,0,391202.83,373740.48,0,110124.82,241099.33,0}; +ST(0.089183466,0.023798504,0,0.095041081,0.024587994,0,0.092450683,0.030760689,0){1283383.3,597113.29,900007.85,1204105.7,557751.32,807431.66,1050439.6,481620.22,631804.95,831874.08,373740.48,391202.83,561630.79,241099.33,110124.82}; +ST(0.041643161,0.17482395,0,0.034648589,0.17585937,0,0.036146522,0.16944297,0){2284160.6,2080615.7,2222447.1,-3458410.7,-3193762.3,-3121229.8,-506290.81,-371953.81,-960241.74,3718851.8,3392886,3509731.4,-1405815.9,-1443588.4,-459324.98}; +ST(0.1,0.25,0,0.095492809,0.25375881,0,0.095090425,0.2489538,0){0,131307.15,157454.16,0,-363726.6,-428416.46,0,512510.07,579817.55,0,-543451.99,-569427.53,0,449348.78,400020.01}; +ST(0.094913401,0.051076335,0,0.095360834,0.0462161,0,0.1,0.05,0){595503.05,547145.45,0,429138.45,421466.87,0,142901.48,198977.54,0,-183223.65,-69217.008,0,-458373.75,-321602.09,0}; +ST(0.068707287,0.030314019,0,0.067616069,0.037109229,0,0.060819012,0.031697917,0){3188897.7,3239242.7,3608360,2870259.7,2756202.5,3214477.8,2264806.3,1862139.4,2469695.4,1433032.7,690369.93,1455299.1,457746.25,-584563.48,281702.17}; +ST(0.061631884,0.26868773,0,0.068237016,0.26229006,0,0.069536278,0.26943087,0){591535.29,639705.29,505602.11,-1711593.4,-1820649,-1465439,2649353.2,2721368.6,2276404,-3304968.8,-3203243.1,-2856108.7,3608394.3,3191912.1,3145421.5}; +ST(0.057142857,0,0,0.051745598,0.0053231545,0,0.05,0,0){3783317.5,3873250.9,3880596.9,3783357,3861228.9,3880622.4,3783457.6,3837214.6,3880662.8,3783701.2,3801308.2,3880737.9,3783873.9,3753417.7,3880625.6}; +ST(0.05,0.3,0,0.051526128,0.29458598,0,0.057142857,0.3,0){0,109871.78,0,0,-329256.34,0,0,547568.39,0,0,-764098.34,0,0,977975.34,0}; +ST(0.1,0.064285714,0,0.095867013,0.068756454,0,0.09230899,0.063522919,0){0,470210.65,877619.52,0,236792.42,503392.8,0,-114175.46,-85524.836,0,-408471.99,-638068.15,0,-500215.61,-918939.46}; +ST(0.039157325,0.25334591,0,0.033025927,0.25326882,0,0.036308441,0.24745658,0){884627.38,809560.38,958174.94,-2446896,-2238649.8,-2591684.5,3436661.2,3142273.3,3460190.4,-3622356.9,-3308331.9,-3307339.6,2960330.2,2697705.3,2177878.8}; +ST(0.030440206,0.150204,0,0.033990129,0.14330646,0,0.037897724,0.149701,0){2239650.6,2486957.5,2552043.8,-2249230.7,-2138608.5,-2536068.8,-2230054.7,-2786553.8,-2567975.2,2258843.4,1748365.6,2520076,2220211.9,3031412.6,2583694.6}; +ST(0.025130011,0.29009115,0,0.0220603,0.28602893,0,0.028198926,0.28535727,0){142877.47,181204.07,230200.16,-427099.39,-539738.59,-685197.76,706741.94,886739.53,1124120.6,-978805.55,-1214791.9,-1536674.3,1240164.3,1516611.7,1912913.1}; +ST(0.013428016,0.091778472,0,0.013714026,0.097839388,0,0.0071591483,0.096788703,0){1408980.1,1412613.2,756711.76,204626.15,55008.627,43634.951,-1174648.8,-1355500.2,-710572.63,-1549888.7,-1463354,-795194.2,-600683.83,-165174.7,-130859.45}; +ST(0.0071591483,0.096788703,0,0.013714026,0.097839388,0,0.010955873,0.10281868,0){756711.76,1412613.2,1124212.8,43634.951,55008.627,-57954.543,-710572.63,-1355500.2,-1179275.3,-795194.2,-1463354,-1060620.9,-130859.45,-165174.7,173274.75}; +ST(0.037897724,0.149701,0,0.033990129,0.14330646,0,0.041319833,0.14315875,0){2552043.8,2486957.5,2735557.7,-2536068.8,-2138608.5,-2343944,-2567975.2,-2786553.8,-3071175.4,2520076,1748365.6,1904337.3,2583694.6,3031412.6,3343927.4}; +ST(0.035858843,0.031497608,0,0.030602087,0.036163623,0,0.028359285,0.029784535,0){3456371.8,3125169.1,2981166.2,3083741.5,2682310.4,2693525.9,2378649.5,1859340.6,2145980.7,1417116.3,772883.67,1391347.7,302618.73,-423255.99,502245.34}; +ST(0.026971271,0.22659033,0,0.029518097,0.21985532,0,0.034969012,0.22634925,0){1090633.5,1264894.2,1299939.6,-2658504.1,-2954793.2,-3164156.1,2731189,2682751.8,3237729.2,-1267784.1,-629411.95,-1478956,-909068.56,-1842177.8,-1117524.9}; +ST(0.034969012,0.22634925,0,0.029518097,0.21985532,0,0.036912897,0.21765752,0){1299939.6,1264894.2,1486590.9,-3164156.1,-2954793.2,-3421295.1,3237729.2,2682751.8,2965983.4,-1478956,-629411.95,-438566.7,-1117524.9,-1842177.8,-2395869.1}; +ST(0.051167355,0.022914381,0,0.052049192,0.01582547,0,0.057612168,0.01845715,0){3850137.8,3859264.8,3752599.8,3629520.4,3753529.9,3612875.5,3200919.1,3544947.6,3338613.5,2588908.3,3239251.6,2940029.2,1828396.4,2844641.6,2431782.4}; +ST(0.09071018,0.22887426,0,0.095706332,0.23121352,0,0.092168655,0.23668616,0){406264.77,183910.78,307607.26,-1003622.2,-460364.34,-792496.69,1069446.3,508106.39,941630.33,-568907.82,-303408.65,-691810.02,-233040.27,-52245.513,148523.72}; +ST(0.027903545,0.087518505,0,0.024499807,0.092422798,0,0.020473685,0.087577432,0){2674848,2390452.1,2087024.2,580994.77,320672.29,451292.51,-1967676.8,-2026771.7,-1538224.3,-2976106,-2619357.9,-2322280.1,-1655065.1,-944222.72,-1286407.6}; +ST(0.036146522,0.16944297,0,0.034648589,0.17585937,0,0.030623168,0.1713445,0){2222447.1,2080615.7,1985985.4,-3121229.8,-3193762.3,-2866418.8,-960241.74,-371953.81,-715248.18,3509731.4,3392886,3183566.3,-459324.98,-1443588.4,-696442.05}; +ST(0.027249449,0.18607819,0,0.034128539,0.18892309,0,0.029690249,0.19362013,0){1646413.8,1872288.6,1647856.1,-2861109.6,-3356683.8,-3101495.4,464444.42,788949.65,1088093.1,2518610.9,2731311.2,2141745.7,-2323177.4,-2954777.5,-2977851}; +ST(0,0.22142857,0,0.0069979116,0.22643766,0,0,0.22857143,0){0,317964.48,0,0,-774386.26,0,0,793599.18,0,0,-364658.79,0,0,-270536.88,0}; +ST(0.059551151,0.20970619,0,0.053910411,0.21448753,0,0.053221516,0.20704838,0){1688112.8,1667429.4,1805672.4,-3664209.4,-3752161.8,-3837129.3,2601193.1,3023771,2511247.5,619333.89,-28239.212,1011998.4,-3326584.6,-2988983.1,-3650194.7}; +ST(0.053221516,0.20704838,0,0.053910411,0.21448753,0,0.049232245,0.21047418,0){1805672.4,1667429.4,1752658.6,-3837129.3,-3752161.8,-3827070.5,2511247.5,3023771,2777012.8,1011998.4,-28239.212,540242.46,-3650194.7,-2988983.1,-3416565.4}; +ST(0.024008584,0.022367291,0,0.022427218,0.014872357,0,0.029163144,0.015558324,0){2639060.6,2505875.7,3068207,2494948.4,2445229.8,2986953.6,2214593.6,2325397.7,2826596.5,1813324.4,2149288.4,2591406.1,1312931.3,1920956.8,2287504.7}; +ST(0.029163144,0.015558324,0,0.022427218,0.014872357,0,0.025468185,0.010276157,0){3068207,2505875.7,2780034,2986953.6,2445229.8,2747892,2826596.5,2325397.7,2683968.5,2591406.1,2149288.4,2589008.8,2287504.7,1920956.8,2463902.9}; +ST(0.01788586,0.12850833,0,0.012365279,0.12660144,0,0.017763535,0.12074209,0){1616906.9,1158576.2,1657769.5,-895214.81,-596487.84,-657738.05,-2016472.2,-1447959.2,-2054600.3,-4802.2192,-105993.81,-581651.26,2014144.7,1396357.8,1703675.4}; +ST(0.017763535,0.12074209,0,0.012365279,0.12660144,0,0.01093484,0.12117452,0){1657769.5,1158576.2,1052666.9,-657738.05,-596487.84,-426753.37,-2054600.3,-1447959.2,-1306415.4,-581651.26,-105993.81,-350052.21,1703675.4,1396357.8,1098212.1}; +ST(0.03163445,0.20120488,0,0.025476801,0.19755762,0,0.029690249,0.19362013,0){1608414.7,1423125.8,1647856.1,-3251875.6,-2782737.9,-3101495.4,1714266.6,1235431.1,1088093.1,1500504,1602470.1,2141745.7,-3248047,-2766638.2,-2977851}; +ST(0.09230899,0.063522919,0,0.095867013,0.068756454,0,0.09123018,0.070922096,0){877619.52,470210.65,983713.53,503392.8,236792.42,465586.72,-85524.836,-114175.46,-297764.17,-638068.15,-408471.99,-904277.98,-918939.46,-500215.61,-1034644.8}; +ST(0.0079950318,0.059686314,0,0.012193394,0.066188359,0,0.0062494098,0.068021592,0){917766.47,1364188,709501.16,570756.35,734639.92,364477.97,7912.4367,-233939.49,-157824.6,-557994.72,-1094586.7,-603457.47,-913265.38,-1450385,-756039.79}; +ST(0.050721192,0.10961634,0,0.05615957,0.1141762,0,0.051013063,0.11801667,0){3257974.6,3147681.4,3161388.4,-583831.78,-840990.83,-1083065.4,-3737290.3,-3764018.8,-3873486.3,-2483878.9,-1917372.9,-1463412.7,1698581.7,2358868.4,2911579}; +ST(0.051703203,0.27754162,0,0.045592054,0.27439642,0,0.049721881,0.27094787,0){454636.43,513714.39,588018.61,-1338881.7,-1504437.2,-1710042.9,2149437.1,2387679.2,2675009.8,-2841702,-3100344.3,-3394309,3377384.9,3591305.7,3801713.7}; +ST(0.024044461,0.20382537,0,0.021120118,0.21068669,0,0.015977634,0.20443356,0){1283805.9,1077357.5,895779.15,-2655634.7,-2356401.7,-1862602.8,1553893.8,1720167.1,1114548.4,995311.88,314292.11,659707.69,-2617892.2,-2093742.8,-1827076.9}; +ST(0.08682376,0.20181233,0,0.093164956,0.1980516,0,0.093706234,0.20596864,0){767576.83,420734.09,360320.46,-1560255.4,-826537.04,-758974.46,843726.65,376428.12,479351.87,688912.23,463603.83,228803.73,-1555436.8,-823893.15,-732939.79}; +ST(0.030075176,0.23324008,0,0.033139613,0.24047735,0,0.025350652,0.23917347,0){1077047.3,1026889.2,868665.73,-2725827,-2694450.7,-2265304,3095770.8,3348643.4,2773502.3,-2013325.9,-2743423.6,-2193941.8,-13872.597,1106136.5,753574.67}; +ST(0.032229878,0.047894836,0,0.035422008,0.053603109,0,0.028699663,0.054481756,0){3188476.9,3344502.1,2920693,2403076.1,2318078.8,1995520.8,1025710.6,580213.58,438210.61,-604377.64,-1335777.4,-1257984.1,-2086050.7,-2842327.2,-2556170.3}; +ST(0.038515413,0.047952704,0,0.035422008,0.053603109,0,0.032229878,0.047894836,0){3516906.1,3344502.1,3188476.9,2648581.9,2318078.8,2403076.1,1126309.3,580213.58,1025710.6,-674068.75,-1335777.4,-604377.64,-2308227.3,-2842327.2,-2086050.7}; +ST(0.0093450955,0.28843768,0,0.010662343,0.29482959,0,0.0045473776,0.2936365,0){67949.514,34537.041,18406.211,-202850.84,-103506.64,-55138.333,334776.34,172164.12,91630.552,-461793.67,-240303.04,-127724.83,581935.08,307518.14,162961.08}; +ST(0.0045481906,0.0063920675,0,0.010679145,0.0052482016,0,0.0093389246,0.011691623,0){552257.15,1277155.8,1120186.5,549810.55,1273289.3,1103410.3,544927.47,1265566.3,1070108.3,537633.65,1254019.7,1020788.4,527798.54,1238493.9,956114.18}; +ST(0.064285714,0,0,0.06203594,0.0060944193,0,0.057142857,0,0){3496327.6,3604620.2,3783317.5,3496358.5,3589956.2,3783357,3496415,3560685.5,3783457.6,3496523.2,3516960.1,3783701.2,3496472.9,3458793.9,3783873.9}; +ST(0.057142857,0.3,0,0.061805884,0.29356168,0,0.064285714,0.3,0){0,121923.05,0,0,-365207.83,0,0,606815.62,0,0,-845641.09,0,0,1080583.1,0}; +ST(0.070477538,0.15360968,0,0.064971856,0.15110456,0,0.069467767,0.146519,0){2153625.7,2431817,2287173.5,-2316413.6,-2488096.1,-2120501.9,-1978592.7,-2374265.3,-2441744.6,2466066.8,2543085,1942651.5,1792310.4,2315361.9,2583122}; +ST(0.048791783,0.28884593,0,0.051526128,0.29458598,0,0.045931579,0.29422002,0){226341.07,109871.78,116468.36,-675936.71,-329256.34,-348980.73,1116322.7,547568.39,580225.36,-1541505,-764098.34,-809364.6,1945474.1,977975.34,1035478}; +ST(0.046181733,0.0056701177,0,0.051745598,0.0053231545,0,0.049204373,0.010884263,0){3851009.3,3873250.9,3873084,3837454.5,3861228.9,3822842.7,3810385,3837214.6,3723003.5,3769920.5,3801308.2,3574883.8,3715901.2,3753417.7,3380124.5}; +ST(0.089230742,0.11966768,0,0.082946441,0.12207685,0,0.08466046,0.11619385,0){1043332.5,1589878.9,1475783,-391602.7,-673263.29,-452604.25,-1287980.7,-1978038.1,-1789662.1,-412950.99,-467139.5,-788262.21,1030099.2,1708498.9,1243195.1}; +ST(0.1,0.078571429,0,0.095795895,0.073622969,0,0.1,0.071428571,0){0,473503.74,0,0,205720.2,0,0,-178405.32,0,0,-461642.03,0,0,-483922.03,0}; +ST(0.017433092,0.042090914,0,0.022876349,0.043626948,0,0.019247887,0.048569646,0){1971771.3,2488553.5,2135187.8,1594855,1978130.3,1594654.5,913057.13,1061959.9,650408.09,56690.05,-72059.632,-458538.7,-810753.02,-1191549.5,-1451674.1}; +ST(0.060819012,0.031697917,0,0.067616069,0.037109229,0,0.060555575,0.040182349,0){3608360,3239242.7,3588260.7,3214477.8,2756202.5,2962222.2,2469695.4,1862139.4,1819353,1455299.1,690369.93,359025.67,281702.17,-584563.48,-1164330.1}; +ST(0.060672356,0.25950081,0,0.068237016,0.26229006,0,0.061631884,0.26868773,0){771273.27,639705.29,591535.29,-2177172.3,-1820649,-1711593.4,3197356.1,2721368.6,2649353.2,-3651078,-3203243.1,-3304968.8,3457676.3,3191912.1,3608394.3}; +ST(0.043027686,0.24899973,0,0.049037582,0.25027532,0,0.04563604,0.25694979,0){999522.33,998508.07,859240.08,-2720190.5,-2730849.8,-2406042.8,3683283.3,3739350.2,3472131.8,-3620573.8,-3756698.7,-3844488.4,2549278.8,2778087.3,3448330.3}; +ST(0.061098586,0.072147464,0,0.064846874,0.068845861,0,0.066925078,0.074981916,0){3389933,3243292.3,3090390.8,1545196.6,1629296.1,1280900.5,-1140417.3,-795531.06,-1278621.5,-3205469.9,-2824516.6,-3089611.2,-3526423.9,-3448034.5,-3091904.4}; +ST(0.051013063,0.11801667,0,0.05615957,0.1141762,0,0.057323957,0.1204315,0){3161388.4,3147681.4,3051716.5,-1083065.4,-840990.83,-1191883,-3873486.3,-3764018.8,-3778168.4,-1463412.7,-1917372.9,-1110713.1,2911579,2358868.4,3101303}; +ST(0.1,0.22857143,0,0.095652827,0.22622146,0,0.1,0.22142857,0){0,199039.37,0,0,-484109.58,0,0,494313.66,0,0,-223837.82,0,0,-173819.74,0}; +ST(0.1,0.19285714,0,0.095453592,0.18738967,0,0.1,0.18571429,0){0,307137.29,0,0,-541566.85,0,0,106216.39,0,0,460538.95,0,0,-458087.35,0}; +ST(0.049678492,0.18505966,0,0.048811039,0.17808485,0,0.055202425,0.1814475,0){2196886.7,2310715.6,2227021.2,-3774046.6,-3650410,-3667462.5,512508.07,-194330.82,145084.74,3406255.6,3763231.4,3573754.5,-2958276.7,-1987755.8,-2457046.3}; +ST(0.089437553,0.21298247,0,0.086709216,0.20730703,0,0.093706234,0.20596864,0){556322.48,734117.03,360320.46,-1238115.4,-1563285.8,-758974.46,961021.23,1031586.7,479351.87,60411.18,398134,228803.73,-1035404.3,-1481512.9,-732939.79}; +ST(0.093706234,0.20596864,0,0.086709216,0.20730703,0,0.08682376,0.20181233,0){360320.46,734117.03,767576.83,-758974.46,-1563285.8,-1560255.4,479351.87,1031586.7,843726.65,228803.73,398134,688912.23,-732939.79,-1481512.9,-1555436.8}; +ST(0.074105201,0.11070107,0,0.06715469,0.10983132,0,0.072126291,0.10515927,0){2359475.3,2794834,2539730.3,-471755.94,-512277.78,-241283.81,-2736894.8,-3213264.7,-2758172.2,-1717960.7,-2112070.8,-2254933.2,1362139.4,1488257.3,717337.89}; +ST(0.056292141,0.2827555,0,0.051519181,0.28417908,0,0.051703203,0.27754162,0){343081.75,320732.11,454636.43,-1018093.3,-953415.16,-1338881.7,1660020.8,1560004.1,2149437.1,-2248005.1,-2123899.5,-2841702,2762903.8,2629434.9,3377384.9}; +ST(0.055202425,0.1814475,0,0.048811039,0.17808485,0,0.054692531,0.17439284,0){2227021.2,2310715.6,2346407.8,-3667462.5,-3650410,-3532168.6,145084.74,-194330.82,-561454.61,3573754.5,3763231.4,3816051.1,-2457046.3,-1987755.8,-1367177.6}; +ST(0.046063037,0.016810165,0,0.043829005,0.011024747,0,0.049204373,0.010884263,0){3836060.2,3801549.1,3873084,3717529.2,3750937.1,3822842.7,3484126.2,3650381.9,3723003.5,3143090.2,3501249.8,3574883.8,2704667.4,3305260.3,3380124.5}; +ST(0.037071258,0.0642048,0,0.032659307,0.059686042,0,0.038435934,0.058364632,0){3365311.2,3158137.1,3459248.5,1900443.5,1964024.3,2206750.4,-391679.98,27282.242,155241.86,-2513388.8,-1919818.3,-1952496,-3541461.8,-3141270.1,-3353689.4}; +ST(0.011268327,0.1984065,0,0.005051806,0.19767546,0,0.0066871595,0.19241823,0){682302.12,313084.45,432113.5,-1344805.9,-612892.85,-803518.34,623458.07,273796.53,258472.73,739532.85,350786.74,581490.34,-1341727.7,-609909.8,-758588.26}; +ST(0.011197941,0.071439681,0,0.012549176,0.077039569,0,0.0060853536,0.074713803,0){1244724.5,1370920.5,681675.12,579995.21,525978.15,285253.65,-394493.66,-643140.23,-277070.48,-1158343.6,-1415881.7,-678306.76,-1303869.8,-1316306.1,-685312.86}; +ST(0.0060853536,0.074713803,0,0.012549176,0.077039569,0,0.0064539684,0.081629255,0){681675.12,1370920.5,711139.06,285253.65,525978.15,222377.16,-277070.48,-643140.23,-419239.47,-678306.76,-1415881.7,-772749.89,-685312.86,-1316306.1,-595288.06}; +ST(0.0910478,0.13167545,0,0.087905667,0.12517971,0,0.093823791,0.12410599,0){831136.87,1140990.9,595735.92,-514132.23,-554517.87,-276601.23,-1027305.8,-1425990.8,-743959.63,122313.64,-178453.87,-121937.8,1073956.7,1334087.8,678759.2}; +ST(0.087905667,0.12517971,0,0.082946441,0.12207685,0,0.089230742,0.11966768,0){1140990.9,1589878.9,1043332.5,-554517.87,-673263.29,-391602.7,-1425990.8,-1978038.1,-1287980.7,-178453.87,-467139.5,-412950.99,1334087.8,1708498.9,1030099.2}; +ST(0.0066871595,0.19241823,0,0.012931293,0.19295437,0,0.011268327,0.1984065,0){432113.5,815194.79,682302.12,-803518.34,-1524077.7,-1344805.9,258472.73,510133.92,623458.07,581490.34,1080471.8,739532.85,-758588.26,-1450076.4,-1341727.7}; +ST(0.05,0,0,0.046181733,0.0056701177,0,0.042857143,0,0){3880596.9,3851009.3,3783299.5,3880622.4,3837454.5,3783327.5,3880662.8,3810385,3783379.6,3880737.9,3769920.5,3783486.4,3880625.6,3715901.2,3783576.5}; +ST(0.042857143,0.3,0,0.045931579,0.29422002,0,0.05,0.3,0){0,116468.36,0,0,-348980.73,0,0,580225.36,0,0,-809364.6,0,0,1035478,0}; +ST(0.057323957,0.1204315,0,0.05615957,0.1141762,0,0.062195955,0.11505156,0){3051716.5,3147681.4,2965673.8,-1191883,-840990.83,-843057.19,-3778168.4,-3764018.8,-3569130.8,-1110713.1,-1917372.9,-1711501.2,3101303,2358868.4,2344130.4}; +ST(0.013428016,0.091778472,0,0.01318623,0.084416193,0,0.020473685,0.087577432,0){1408980.1,1411871.7,2087024.2,204626.15,378554.62,451292.51,-1174648.8,-931831.12,-1538224.3,-1549888.7,-1560266,-2322280.1,-600683.83,-1046999.7,-1286407.6}; +ST(0.030312881,0.27848596,0,0.028198926,0.28535727,0,0.023483408,0.28013687,0){355416.48,230200.16,270985.88,-1048284.8,-685197.76,-801278.39,1688178.9,1124120.6,1297043.7,-2242771,-1536674.3,-1736920.8,2683885.3,1912913.1,2101746.5}; +ST(0.0069613667,0.17349451,0,0.0062925762,0.18063125,0,0,0.17857143,0){517779.21,445914.92,0,-769992.03,-727143.63,0,-142713.64,12632.594,0,839532.94,719304.1,0,-266340.1,-466469.22,0}; +ST(0.046063037,0.016810165,0,0.052049192,0.01582547,0,0.051167355,0.022914381,0){3836060.2,3859264.8,3850137.8,3717529.2,3753529.9,3629520.4,3484126.2,3544947.6,3200919.1,3143090.2,3239251.6,2588908.3,2704667.4,2844641.6,1828396.4}; +ST(0.065931692,0.10408722,0,0.06715469,0.10983132,0,0.059543685,0.10776494,0){2911358.9,2794834,3132791.5,-218409.17,-512277.78,-451048.14,-3113407,-3213264.7,-3519016.9,-2661455,-2112070.8,-2561357.9,651464.78,1488257.3,1326599.2}; +ST(0.083190767,0.25723975,0,0.085145188,0.25032735,0,0.090077759,0.25268961,0){434158.6,448997.25,291813.61,-1216864.4,-1228228.7,-805257.31,1759626.8,1682589.8,1125037.4,-1955417.3,-1691886.1,-1174248.1,1765235.2,1253443,940920.06}; +ST(0.07921504,0.25033934,0,0.085145188,0.25032735,0,0.083190767,0.25723975,0){606155.6,448997.25,434158.6,-1658203,-1228228.7,-1216864.4,2271843.6,1682589.8,1759626.8,-2284831,-1691886.1,-1955417.3,1693484.6,1253443,1765235.2}; +ST(0.08974924,0.047235181,0,0.083998423,0.049627851,0,0.082493405,0.042375289,0){1190814.4,1806853.8,1978611.8,905328.07,1329741.5,1595319.9,402804.56,501474.01,902966.17,-196265.4,-459273.5,35643.43,-748421.11,-1299103.8,-838916.97}; +ST(0.082493405,0.042375289,0,0.083998423,0.049627851,0,0.077364239,0.048764008,0){1978611.8,1806853.8,2450679,1595319.9,1329741.5,1825420.5,902966.17,501474.01,734405.59,35643.43,-459273.5,-544039.45,-838916.97,-1299103.8,-1683943.8}; +ST(0.1,0.23571429,0,0.095706332,0.23121352,0,0.1,0.22857143,0){0,183910.78,0,0,-460364.34,0,0,508106.39,0,0,-303408.65,0,0,-52245.513,0}; +ST(0.055890502,0.18802963,0,0.061291474,0.18447479,0,0.06137482,0.19024807,0){2110328.4,2069396,1976038.9,-3747121.1,-3531333.7,-3592882,795966.68,425331.11,963745.22,3129878.5,3230965.1,2804392.5,-3224012.4,-2708277.6,-3258719.1}; +ST(0.049204373,0.010884263,0,0.052049192,0.01582547,0,0.046063037,0.016810165,0){3873084,3859264.8,3836060.2,3822842.7,3753529.9,3717529.2,3723003.5,3544947.6,3484126.2,3574883.8,3239251.6,3143090.2,3380124.5,2844641.6,2704667.4}; +ST(0.021428571,0.3,0,0.024877102,0.29495936,0,0.028571429,0.3,0){0,72135.52,0,0,-216205.93,0,0,359676.71,0,0,-502149.61,0,0,642973.44,0}; +ST(0.028571429,0,0,0.025051818,0.0051959301,0,0.021428571,0,0){3033980.1,2747435.6,2419501.9,3033983.4,2739316.7,2419561.9,3033988.7,2723095.2,2419679.8,3034024.4,2698832.3,2419876.4,3033982.5,2666496.7,2419989.4}; +ST(0.093922759,0.092262381,0,0.09416017,0.099511923,0,0.087331535,0.0958472,0){652083.63,613994.66,1318484.3,89312.894,5422.3845,98077.228,-550573,-608645.22,-1213131.9,-715327.2,-619557.01,-1401481.2,-262838.8,-16415.987,-292629.72}; +ST(0.01093484,0.12117452,0,0.012365279,0.12660144,0,0.0061411468,0.1246533,0){1052666.9,1158576.2,591118.91,-426753.37,-596487.84,-280990.71,-1306415.4,-1447959.2,-738586.84,-350052.21,-105993.81,-106527.54,1098212.1,1396357.8,682629.18}; +ST(0.0061411468,0.1246533,0,0.012365279,0.12660144,0,0.0072553778,0.13224921,0){591118.91,1158576.2,674958.82,-280990.71,-596487.84,-425463.67,-738586.84,-1447959.2,-832230.25,-106527.54,-105993.81,117822.57,682629.18,1396357.8,875622.71}; +ST(0.066803853,0.25459223,0,0.068237016,0.26229006,0,0.060672356,0.25950081,0){789541.66,639705.29,771273.27,-2193455.3,-1820649,-2177172.3,3110738.9,2721368.6,3197356.1,-3337877,-3203243.1,-3651078,2824240.3,3191912.1,3457676.3}; +ST(0.060555575,0.040182349,0,0.067616069,0.037109229,0,0.066401409,0.0434645,0){3588260.7,3239242.7,3289675.8,2962222.2,2756202.5,2619840.6,1819353,1862139.4,1416557.6,359025.67,690369.93,-75156.319,-1164330.1,-584563.48,-1551772}; +ST(0.016878531,0.18478654,0,0.021212478,0.18688263,0,0.017373248,0.19021363,0){1113458.1,1339179.6,1095255.9,-1906862.4,-2348119.2,-1990705.9,245299.96,429909.33,532263.7,1732097.5,2024227.8,1555631.8,-1479759.2,-1955356.8,-1804413.6}; +ST(0.021251228,0.18136297,0,0.021212478,0.18688263,0,0.016878531,0.18478654,0){1398279.8,1339179.6,1113458.1,-2300353.4,-2348119.2,-1906862.4,85724.805,429909.33,245299.96,2245163.6,2024227.8,1732097.5,-1534338.6,-1955356.8,-1479759.2}; +ST(0.029991713,0.27132489,0,0.025044032,0.27464897,0,0.023009638,0.26878949,0){469504.82,363665.57,417665.14,-1366503,-1065519.5,-1208783.5,2141236.7,1692735.8,1871958.7,-2724385.3,-2201379.5,-2337004.8,3063642.3,2555652.6,2554445.3}; +ST(0.023009638,0.26878949,0,0.025044032,0.27464897,0,0.018422519,0.27450763,0){417665.14,363665.57,282501.19,-1208783.5,-1065519.5,-827496.14,1871958.7,1692735.8,1313896,-2337004.8,-2201379.5,-1707268.8,2554445.3,2555652.6,1979556.1}; +ST(0.048866761,0.029559705,0,0.054261983,0.029107824,0,0.052748817,0.036292023,0){3831772.8,3801269,3796611.1,3467532.3,3450822.2,3254886.9,2773676.3,2782228.4,2248728.5,1816186,1857139.4,921690.78,685852.4,760852.59,-537197.11}; +ST(0.069025318,0.11622387,0,0.06715469,0.10983132,0,0.074105201,0.11070107,0){2631986.5,2794834,2359475.3,-808686.45,-512277.78,-471755.94,-3192250.9,-3213264.7,-2736894.8,-1402768.4,-2112070.8,-1717960.7,2220554.1,1488257.3,1362139.4}; +ST(0.036912897,0.21765752,0,0.042541479,0.22296234,0,0.034969012,0.22634925,0){1486590.9,1481591,1299939.6,-3421295.1,-3531706.6,-3164156.1,2965983.4,3405357.4,3237729.2,-438566.7,-1180392.3,-1478956,-2395869.1,-1772446.7,-1117524.9}; +ST(0.034969012,0.22634925,0,0.042541479,0.22296234,0,0.041402067,0.22952626,0){1299939.6,1481591,1348916.4,-3164156.1,-3531706.6,-3344816,3237729.2,3405357.4,3600200.4,-1478956,-1180392.3,-1982154,-1117524.9,-1772446.7,-667743.82}; +ST(0.036602132,0.28491153,0,0.028198926,0.28535727,0,0.030312881,0.27848596,0){279518.56,230200.16,355416.48,-831596.18,-685197.76,-1048284.8,1362985.6,1124120.6,1688178.9,-1860498.2,-1536674.3,-2242771,2311728.5,1912913.1,2683885.3}; +ST(0.072126291,0.10515927,0,0.06715469,0.10983132,0,0.065931692,0.10408722,0){2539730.3,2794834,2911358.9,-241283.81,-512277.78,-218409.17,-2758172.2,-3213264.7,-3113407,-2254933.2,-2112070.8,-2661455,717337.89,1488257.3,651464.78}; +ST(0.049165273,0.076760106,0,0.047469022,0.070467195,0,0.054876921,0.07294965,0){3570137.5,3608010.8,3558755.8,1384898,1730907.5,1580988.4,-1648055.9,-1046792,-1275447.3,-3672308.6,-3280034.9,-3423192.1,-3449021.3,-3807136.9,-3669097.1}; +ST(0.085115353,0.26563346,0,0.086077973,0.27164165,0,0.081004963,0.27070547,0){313056.52,243157.03,333174.81,-899063.8,-708191.99,-968418.7,1369900.4,1111255.9,1513258.3,-1665255.4,-1417072.6,-1916833.2,1747205.8,1598582.9,2141327.9}; +ST(0.080699945,0.029142305,0,0.085916752,0.02828,0,0.084917502,0.034253561,0){2185639.9,1643257.2,1742331.8,1983669.2,1500211.7,1520580.8,1598386.1,1226559.7,1105294,1065401.8,846114.35,549324.68,433818.71,391827.49,-76880.401}; +ST(0.016939848,0.22904958,0,0.012706169,0.22573828,0,0.017207343,0.22323305,0){714788.59,571782.3,781289.63,-1767596.2,-1386624.6,-1865590.4,1888698.3,1404300.2,1807835.2,-1014237.8,-614658.98,-643322.1,-395054.79,-528535.98,-915362.92}; +ST(0.011838853,0.2301677,0,0.012706169,0.22573828,0,0.016939848,0.22904958,0){504229.49,571782.3,714788.59,-1254859.2,-1386624.6,-1767596.2,1363834.1,1404300.2,1888698.3,-775392.51,-614658.98,-1014237.8,-209768.04,-528535.98,-395054.79}; +ST(0.018343869,0.21720619,0,0.021120118,0.21068669,0,0.02463475,0.21609565,0){888277.19,1077357.5,1153636.1,-2037897.4,-2356401.7,-2626116.1,1749211,1720167.1,2198315,-225952.88,314292.11,-179791.92,-1457259.1,-2093742.8,-1969098.8}; +ST(0.054237851,0.14012792,0,0.049213686,0.13705186,0,0.053497526,0.1329974,0){2856617.8,2922689.8,2959143.9,-2267029,-2132523.3,-1911000.9,-3324577.4,-3499251.9,-3636096,1580891.3,1186505.2,623103.97,3650971.5,3819996.4,3857035.6}; +ST(0.023009638,0.26878949,0,0.027951851,0.26533243,0,0.029991713,0.27132489,0){417665.14,539100.43,469504.82,-1208783.5,-1547025.6,-1366503,1871958.7,2353298.6,2141236.7,-2337004.8,-2852826.8,-2724385.3,2554445.3,2980285,3063642.3}; +ST(0.1,0.071428571,0,0.095867013,0.068756454,0,0.1,0.064285714,0){0,470210.65,0,0,236792.42,0,0,-114175.46,0,0,-408471.99,0,0,-500215.61,0}; +ST(0.039366597,0.19088868,0,0.038852293,0.18542603,0,0.044234359,0.18859393,0){1982365.2,2057873,2102462.5,-3628592.6,-3549951.2,-3756018.8,1030950.1,516044.6,851571.98,2772526.5,3175871.5,3086402.5,-3333638.5,-2819104.7,-3279385.1}; +ST(0.044234359,0.18859393,0,0.038852293,0.18542603,0,0.043573225,0.18196099,0){2102462.5,2057873,2202933.2,-3756018.8,-3549951.2,-3650165.7,851571.98,516044.6,195066.32,3086402.5,3175871.5,3522129.2,-3279385.1,-2819104.7,-2509350}; +ST(0.010546892,0.2198034,0,0.012706169,0.22573828,0,0.0069979116,0.22643766,0){514716.79,571782.3,317964.48,-1201974.2,-1386624.6,-774386.26,1090194.6,1404300.2,793599.18,-253690.09,-614658.98,-364658.79,-751659.26,-528535.98,-270536.88}; +ST(0.0069979116,0.22643766,0,0.012706169,0.22573828,0,0.011838853,0.2301677,0){317964.48,571782.3,504229.49,-774386.26,-1386624.6,-1254859.2,793599.18,1404300.2,1363834.1,-364658.79,-614658.98,-775392.51,-270536.88,-528535.98,-209768.04}; +ST(0.078571429,0,0,0.074656208,0.0053403125,0,0.071428571,0,0){2419478.6,2772385.5,3033974.4,2419535.2,2763721.5,3033978.9,2419645.1,2746414.1,3033982.8,2419827.2,2720533.7,3034008.5,2420024.4,2685936.9,3033714}; +ST(0,0.1,0,0.0052460498,0.10332732,0,0,0.10714286,0){0,545715.18,0,0,-33256.292,0,0,-576983.54,0,0,-508602.25,0,0,99155.047,0}; +ST(0.071428571,0.3,0,0.074657371,0.29452352,0,0.078571429,0.3,0){0,79525.554,0,0,-238312.39,0,0,396309.36,0,0,-552992.95,0,0,707611.71,0}; +ST(0.1,0.16428571,0,0.093710586,0.16080643,0,0.1,0.15714286,0){0,507346.27,0,0,-621948.04,0,0,-366919.85,0,0,704920.6,0,0,207593.47,0}; +ST(0.042113175,0.053290167,0,0.035422008,0.053603109,0,0.038515413,0.047952704,0){3616583.4,3344502.1,3516906.1,2519252.9,2318078.8,2648581.9,657513.67,580213.58,1126309.3,-1403801.4,-1335777.4,-674068.75,-3039615.4,-2842327.2,-2308227.3}; +ST(0.038435934,0.058364632,0,0.035422008,0.053603109,0,0.042113175,0.053290167,0){3459248.5,3344502.1,3616583.4,2206750.4,2318078.8,2519252.9,155241.86,580213.58,657513.67,-1952496,-1335777.4,-1403801.4,-3353689.4,-2842327.2,-3039615.4}; +ST(0.03345202,0.18222482,0,0.034128539,0.18892309,0,0.027249449,0.18607819,0){1947746.5,1872288.6,1646413.8,-3237509.5,-3356683.8,-2861109.6,196057.01,788949.65,464444.42,3107788.7,2731311.2,2518610.9,-2254322.8,-2954777.5,-2323177.4}; +ST(0.1,0.17857143,0,0.095837038,0.182565,0,0.093873231,0.17693503,0){0,291932.87,445896.9,0,-487211.17,-694096.79,0,33971.767,-59504.029,0,464480.32,727141.13,0,-344762.9,-345394.37}; +ST(0.031105381,0.06529626,0,0.032659307,0.059686042,0,0.037071258,0.0642048,0){3030579.1,3158137.1,3365311.2,1667989.8,1964024.3,1900443.5,-444570.51,27282.242,-391679.98,-2357289.6,-1919818.3,-2513388.8,-3210321.2,-3141270.1,-3541461.8}; +ST(0.08415119,0.061061125,0,0.085646934,0.067722415,0,0.079822506,0.065677674,0){1759442.9,1585902.9,2163855.5,1064240.3,821166.94,1180001.4,-51487.645,-339583.13,-340376.77,-1146904.2,-1336670.3,-1706002.2,-1789550.6,-1689538.4,-2296197.5}; +ST(0.079822506,0.065677674,0,0.085646934,0.067722415,0,0.080160084,0.071577727,0){2163855.5,1585902.9,2107851.9,1180001.4,821166.94,977984.82,-340376.77,-339583.13,-676141.96,-1706002.2,-1336670.3,-1967920.1,-2296197.5,-1689538.4,-2205119.3}; +ST(0.067098511,0.16826118,0,0.066399282,0.17458324,0,0.060825265,0.17090728,0){2121688.2,2061554.2,2288734.2,-2928224.5,-3111294.6,-3282960.5,-1008555.7,-477290.81,-862639.89,3311710.7,3354405.6,3657845.3,-250662.47,-1230983.2,-726586.11}; +ST(0.060859952,0.17787963,0,0.061291474,0.18447479,0,0.055202425,0.1814475,0){2182203,2069396,2227021.2,-3438395.7,-3531333.7,-3667462.5,-202892.1,425331.11,145084.74,3555311.4,3230965.1,3573754.5,-1844119.8,-2708277.6,-2457046.3}; +ST(0.1,0.12142857,0,0.094962535,0.11849101,0,0.1,0.11428571,0){0,497557.04,0,0,-175139.73,0,0,-611084.48,0,0,-220851.73,0,0,467971.5,0}; +ST(0.091758141,0.11296708,0,0.094962535,0.11849101,0,0.089230742,0.11966768,0){824791.32,497557.04,1043332.5,-201020.76,-175139.73,-391602.7,-976886.6,-611084.48,-1287980.7,-537824.26,-220851.73,-412950.99,570097.26,467971.5,1030099.2}; +ST(0.1,0.11428571,0,0.094962535,0.11849101,0,0.091758141,0.11296708,0){0,497557.04,824791.32,0,-175139.73,-201020.76,0,-611084.48,-976886.6,0,-220851.73,-537824.26,0,467971.5,570097.26}; +ST(0,0.24285714,0,0.0043813653,0.24702694,0,0,0.25,0){0,145794.38,0,0,-393661.32,0,0,523477.05,0,0,-496310.62,0,0,320224.07,0}; +ST(0,0.05,0,0.004777904,0.053197076,0,0,0.057142857,0){0,557925.04,0,0,389224.92,0,0,102822.82,0,0,-214698.3,0,0,-467537.22,0}; +ST(0.047918899,0.14257657,0,0.049213686,0.13705186,0,0.054237851,0.14012792,0){2842478.3,2922689.8,2856617.8,-2400971.6,-2132523.3,-2267029,-3215455,-3499251.9,-3324577.4,1901551.7,1186505.2,1580891.3,3510918.5,3819996.4,3650971.5}; +ST(0.049678492,0.18505966,0,0.044234359,0.18859393,0,0.043573225,0.18196099,0){2196886.7,2102462.5,2202933.2,-3774046.6,-3756018.8,-3650165.7,512508.07,851571.98,195066.32,3406255.6,3086402.5,3522129.2,-2958276.7,-3279385.1,-2509350}; +ST(0.050398693,0.1921099,0,0.044234359,0.18859393,0,0.049678492,0.18505966,0){2077292.2,2102462.5,2196886.7,-3850553.1,-3756018.8,-3774046.6,1209682,851571.98,512508.07,2818064.5,3086402.5,3406255.6,-3615771.1,-3279385.1,-2958276.7}; +ST(0.055202425,0.1814475,0,0.055890502,0.18802963,0,0.049678492,0.18505966,0){2227021.2,2110328.4,2196886.7,-3667462.5,-3747121.1,-3774046.6,145084.74,795966.68,512508.07,3573754.5,3129878.5,3406255.6,-2457046.3,-3224012.4,-2958276.7}; +ST(0.1,0.27857143,0,0.095069321,0.27540052,0,0.1,0.27142857,0){0,76899.446,0,0,-225624.71,0,0,359465.9,0,0,-469594.27,0,0,548580.83,0}; +ST(0.066600159,0.24211306,0,0.061408089,0.24582042,0,0.059437672,0.2400817,0){1004296.2,1017142.7,1145348.7,-2655015,-2732695.2,-2999714,3359675.2,3591948.1,3711340.5,-2867211.3,-3325647.6,-3009146,1352854.8,2017029.8,1160252.2}; +ST(0.065478411,0.24860928,0,0.061408089,0.24582042,0,0.066600159,0.24211306,0){912058.17,1017142.7,1004296.2,-2478342.9,-2732695.2,-2655015,3344041.2,3591948.1,3359675.2,-3264436.9,-3325647.6,-2867211.3,2261773.6,2017029.8,1352854.8}; +ST(0.1,0.028571429,0,0.095041081,0.024587994,0,0.1,0.021428571,0){0,597113.29,0,0,557751.32,0,0,481620.22,0,0,373740.48,0,0,241099.33,0}; +ST(0.019165757,0.095107709,0,0.024499807,0.092422798,0,0.024938414,0.098415267,0){1930971.9,2390452.1,2383058.5,168744.63,320672.29,68195.72,-1747493.7,-2026771.7,-2312962.3,-2069009.1,-2619357.9,-2447461.4,-502664.26,-944222.72,-204726.33}; +ST(0.041643161,0.17482395,0,0.036146522,0.16944297,0,0.042242048,0.16806859,0){2284160.6,2222447.1,2399442.3,-3458410.7,-3121229.8,-3302042.1,-506290.81,-960241.74,-1157324.9,3718851.8,3509731.4,3737475.6,-1405815.9,-459324.98,-248746.29}; +ST(0.022876349,0.043626948,0,0.025565101,0.048609543,0,0.019247887,0.048569646,0){2488553.5,2702312,2135187.8,1978130.3,2017092.5,1594654.5,1061959.9,820389.33,650408.09,-72059.632,-584372.75,-458538.7,-1191549.5,-1841258.2,-1451674.1}; +ST(0.038217426,0.13599196,0,0.044512931,0.13802764,0,0.041319833,0.14315875,0){2738753.8,2867370.6,2735557.7,-1938161,-2150242,-2343944,-3305386.1,-3405187.4,-3071175.4,972060.89,1298632.3,1904337.3,3589652.3,3729885,3343927.4}; +ST(0.083559522,0.13424014,0,0.081009521,0.1385969,0,0.076271482,0.13373081,0){1462145.4,1630909.4,2012844.4,-981746.52,-1242340.3,-1330317.6,-1784737.2,-1926924,-2463975.8,395362.65,783271.16,494859.01,1914407.3,2113542.9,2631758.9}; +ST(0.071059851,0.17209017,0,0.066399282,0.17458324,0,0.067098511,0.16826118,0){1900690.4,2061554.2,2121688.2,-2772233.4,-3111294.6,-2928224.5,-629520.98,-477290.81,-1008555.7,3060958.1,3354405.6,3311710.7,-774142.34,-1230983.2,-250662.47}; +ST(0.041319833,0.14315875,0,0.044512931,0.13802764,0,0.047918899,0.14257657,0){2735557.7,2867370.6,2842478.3,-2343944,-2150242,-2400971.6,-3071175.4,-3405187.4,-3215455,1904337.3,1298632.3,1901551.7,3343927.4,3729885,3510918.5}; +ST(0,0.16428571,0,0.0046637588,0.16745308,0,0,0.17142857,0){0,362371.83,0,0,-494096.85,0,0,-182769.85,0,0,560561.48,0,0,-21256.565,0}; +ST(0.049678492,0.18505966,0,0.055890502,0.18802963,0,0.050398693,0.1921099,0){2196886.7,2110328.4,2077292.2,-3774046.6,-3747121.1,-3850553.1,512508.07,795966.68,1209682,3406255.6,3129878.5,2818064.5,-2958276.7,-3224012.4,-3615771.1}; +ST(0.043573225,0.18196099,0,0.048811039,0.17808485,0,0.049678492,0.18505966,0){2202933.2,2310715.6,2196886.7,-3650165.7,-3650410,-3774046.6,195066.32,-194330.82,512508.07,3522129.2,3763231.4,3406255.6,-2509350,-1987755.8,-2958276.7}; +ST(0.066710408,0.18109144,0,0.07206248,0.1830344,0,0.06771074,0.1881525,0){1958233.8,1716055.3,1821405.7,-3210995.9,-2879815.5,-3238423,95959.418,236909.5,698008.36,3149708.8,2719220.1,2695511.5,-2111256.9,-2081132.3,-2795478.4}; +ST(0.1,0.18571429,0,0.095837038,0.182565,0,0.1,0.17857143,0){0,291932.87,0,0,-487211.17,0,0,33971.767,0,0,464480.32,0,0,-344762.9,0}; +ST(0.042242048,0.16806859,0,0.036146522,0.16944297,0,0.038427921,0.16264679,0){2399442.3,2222447.1,2389351.9,-3302042.1,-3121229.8,-3020403.6,-1157324.9,-960241.74,-1591681.4,3737475.6,3509731.4,3440909.6,-248746.29,-459324.98,682723.32}; +ST(0.042541479,0.22296234,0,0.04727629,0.22823863,0,0.041402067,0.22952626,0){1481591,1418822.2,1348916.4,-3531706.6,-3492237.2,-3344816,3405357.4,3684627.2,3600200.4,-1180392.3,-1892328,-1982154,-1772446.7,-919608.01,-667743.82}; +ST(0.049797208,0.2214244,0,0.04727629,0.22823863,0,0.042541479,0.22296234,0){1551864.2,1418822.2,1481591,-3662861.4,-3492237.2,-3531706.6,3430735.4,3684627.2,3405357.4,-1003918.8,-1892328,-1180392.3,-2065424.5,-919608.01,-1772446.7}; +ST(0.062195955,0.11505156,0,0.05615957,0.1141762,0,0.059543685,0.10776494,0){2965673.8,3147681.4,3132791.5,-843057.19,-840990.83,-451048.14,-3569130.8,-3764018.8,-3519016.9,-1711501.2,-1917372.9,-2561357.9,2344130.4,2358868.4,1326599.2}; +ST(0.093823791,0.12410599,0,0.087905667,0.12517971,0,0.089230742,0.11966768,0){595735.92,1140990.9,1043332.5,-276601.23,-554517.87,-391602.7,-743959.63,-1425990.8,-1287980.7,-121937.8,-178453.87,-412950.99,678759.2,1334087.8,1030099.2}; +ST(0.066710408,0.18109144,0,0.066399282,0.17458324,0,0.071841704,0.17726974,0){1958233.8,2061554.2,1799263.7,-3210995.9,-3111294.6,-2812994.5,95959.418,-477290.81,-214389.53,3149708.8,3354405.6,2933842.6,-2111256.9,-1230983.2,-1438939.3}; +ST(0.095453592,0.18738967,0,0.095837038,0.182565,0,0.1,0.18571429,0){307137.29,291932.87,0,-541566.85,-487211.17,0,106216.39,33971.767,0,460538.95,464480.32,0,-458087.35,-344762.9,0}; +ST(0.089858368,0.18421461,0,0.095837038,0.182565,0,0.095453592,0.18738967,0){692603.24,291932.87,307137.29,-1178349.1,-487211.17,-541566.85,133849.22,33971.767,106216.39,1084450.2,464480.32,460538.95,-894447.98,-344762.9,-458087.35}; +ST(0.054692531,0.17439284,0,0.048811039,0.17808485,0,0.048076401,0.17082416,0){2346407.8,2310715.6,2424680.5,-3532168.6,-3650410,-3473815.1,-561454.61,-194330.82,-921629.25,3816051.1,3763231.4,3872759.5,-1367177.6,-1987755.8,-754316.94}; +ST(0.030623168,0.1713445,0,0.034648589,0.17585937,0,0.027644767,0.17736901,0){1985985.4,2080615.7,1774040.3,-2866418.8,-3193762.3,-2777088.7,-715248.18,-371953.81,-203929.31,3183566.3,3392886,2892544.7,-696442.05,-1443588.4,-1431643.3}; +ST(0.027644767,0.17736901,0,0.034648589,0.17585937,0,0.03345202,0.18222482,0){1774040.3,2080615.7,1947746.5,-2777088.7,-3193762.3,-3237509.5,-203929.31,-371953.81,196057.01,2892544.7,3392886,3107788.7,-1431643.3,-1443588.4,-2254322.8}; +ST(0.0060491453,0.25298129,0,0.0043813653,0.24702694,0,0.0087429334,0.24792416,0){178654.23,145794.38,283453.34,-493529.07,-393661.32,-768118.62,691183.17,523477.05,1029935.2,-724662.05,-496310.62,-992967.39,585970.08,320224.07,667809.3}; +ST(0,0.25,0,0.0043813653,0.24702694,0,0.0060491453,0.25298129,0){0,145794.38,178654.23,0,-393661.32,-493529.07,0,523477.05,691183.17,0,-496310.62,-724662.05,0,320224.07,585970.08}; +ST(0.093823791,0.12410599,0,0.094962535,0.11849101,0,0.1,0.12142857,0){595735.92,497557.04,0,-276601.23,-175139.73,0,-743959.63,-611084.48,0,-121937.8,-220851.73,0,678759.2,467971.5,0}; +ST(0.076430303,0.18837043,0,0.07206248,0.1830344,0,0.077619244,0.18028791,0){1444535.6,1716055.3,1471797.4,-2574453.4,-2879815.5,-2389894.4,569102.25,236909.5,18944.546,2129625.3,2719220.1,2378251.6,-2235391.7,-2081132.3,-1502642.9}; +ST(0.027249449,0.18607819,0,0.021212478,0.18688263,0,0.021251228,0.18136297,0){1646413.8,1339179.6,1398279.8,-2861109.6,-2348119.2,-2300353.4,464444.42,429909.33,85724.805,2518610.9,2024227.8,2245163.6,-2323177.4,-1955356.8,-1534338.6}; +ST(0.072908259,0.24139656,0,0.066600159,0.24211306,0,0.070607657,0.23670872,0){881474.92,1004296.2,1007105.3,-2322734,-2655015,-2594870.8,2916335.3,3359675.2,3083897.2,-2445637.4,-2867211.3,-2267120.1,1082242,1352854.8,490193.02}; +ST(0.089230742,0.11966768,0,0.094962535,0.11849101,0,0.093823791,0.12410599,0){1043332.5,497557.04,595735.92,-391602.7,-175139.73,-276601.23,-1287980.7,-611084.48,-743959.63,-412950.99,-220851.73,-121937.8,1030099.2,467971.5,678759.2}; +ST(0.038435934,0.058364632,0,0.032659307,0.059686042,0,0.035422008,0.053603109,0){3459248.5,3158137.1,3344502.1,2206750.4,1964024.3,2318078.8,155241.86,27282.242,580213.58,-1952496,-1919818.3,-1335777.4,-3353689.4,-3141270.1,-2842327.2}; +ST(0.050960377,0.23252058,0,0.04727629,0.22823863,0,0.053624899,0.22742186,0){1342135.9,1418822.2,1430137,-3383651.2,-3492237.2,-3503302.1,3804738.6,3684627.2,3648370.9,-2403721.7,-1892328,-1785483,-148681.88,-919608.01,-1060301.4}; +ST(0.025641665,0.25311603,0,0.033025927,0.25326882,0,0.030217898,0.25971254,0){680173.91,809560.38,660621.26,-1879847.5,-2238649.8,-1866014.4,2635470.4,3142273.3,2744196,-2768550.2,-3308331.9,-3141188.1,2247361.6,2697705.3,2987009.7}; +ST(0.017207343,0.22323305,0,0.021374843,0.22646669,0,0.016939848,0.22904958,0){781289.63,906782.43,714788.59,-1865590.4,-2208721,-1767596.2,1807835.2,2264460.9,1888698.3,-643322.1,-1042528.4,-1014237.8,-915362.92,-767856.24,-395054.79}; +ST(0.027746664,0.13122119,0,0.023379755,0.12686903,0,0.030575169,0.1246812,0){2296333.1,2047772.9,2526238.7,-1399007.9,-1065433.1,-1202245.8,-2843055.5,-2558991,-3156412.2,288094.78,-162203.53,-451924.48,2955532.6,2481221.5,2919641.1}; +ST(0.0064812773,0.046734878,0,0.004777904,0.053197076,0,0,0.05,0){761350.4,557925.04,0,582610.88,389224.92,0,267082.8,102822.82,0,-111174.21,-214698.3,0,-463416.67,-467537.22,0}; +ST(0.0094132111,0.052421332,0,0.004777904,0.053197076,0,0.0064812773,0.046734878,0){1088603.4,557925.04,761350.4,768702.62,389224.92,582610.88,222919.17,102822.82,267082.8,-388347.22,-214698.3,-111174.21,-885762.83,-467537.22,-463416.67}; +ST(0.060567191,0.25172758,0,0.061408089,0.24582042,0,0.065478411,0.24860928,0){917440.34,1017142.7,912058.17,-2522838.3,-2732695.2,-2478342.9,3497206.6,3591948.1,3344041.2,-3596815.5,-3325647.6,-3264436.9,2796536,2017029.8,2261773.6}; +ST(0.077619244,0.18028791,0,0.07206248,0.1830344,0,0.071841704,0.17726974,0){1471797.4,1716055.3,1799263.7,-2389894.4,-2879815.5,-2812994.5,18944.546,236909.5,-214389.53,2378251.6,2719220.1,2933842.6,-1502642.9,-2081132.3,-1438939.3}; +ST(0.071841704,0.17726974,0,0.07206248,0.1830344,0,0.066710408,0.18109144,0){1799263.7,1716055.3,1958233.8,-2812994.5,-2879815.5,-3210995.9,-214389.53,236909.5,95959.418,2933842.6,2719220.1,3149708.8,-1438939.3,-2081132.3,-2111256.9}; +ST(0.060859952,0.17787963,0,0.066399282,0.17458324,0,0.066710408,0.18109144,0){2182203,2061554.2,1958233.8,-3438395.7,-3111294.6,-3210995.9,-202892.1,-477290.81,95959.418,3555311.4,3354405.6,3149708.8,-1844119.8,-1230983.2,-2111256.9}; +ST(0.0062494098,0.068021592,0,0.012193394,0.066188359,0,0.011197941,0.071439681,0){709501.16,1364188,1244724.5,364477.97,734639.92,579995.21,-157824.6,-233939.49,-394493.66,-603457.47,-1094586.7,-1158343.6,-756039.79,-1450385,-1303869.8}; +ST(0.016939848,0.22904958,0,0.021374843,0.22646669,0,0.022740693,0.23189018,0){714788.59,906782.43,887604.04,-1767596.2,-2208721,-2230116.3,1888698.3,2264460.9,2485475.6,-1014237.8,-1042528.4,-1529145.6,-395054.79,-767856.24,-172982.46}; +ST(0.019165757,0.095107709,0,0.013714026,0.097839388,0,0.013428016,0.091778472,0){1930971.9,1412613.2,1408980.1,168744.63,55008.627,204626.15,-1747493.7,-1355500.2,-1174648.8,-2069009.1,-1463354,-1549888.7,-502664.26,-165174.7,-600683.83}; +ST(0.053624899,0.22742186,0,0.04727629,0.22823863,0,0.049797208,0.2214244,0){1430137,1418822.2,1551864.2,-3503302.1,-3492237.2,-3662861.4,3648370.9,3684627.2,3430735.4,-1785483,-1892328,-1003918.8,-1060301.4,-919608.01,-2065424.5}; +ST(0.034648589,0.17585937,0,0.038433858,0.18005903,0,0.03345202,0.18222482,0){2080615.7,2131117.1,1947746.5,-3193762.3,-3450732.6,-3237509.5,-371953.81,5612.0128,196057.01,3392886,3447337.8,3107788.7,-1443588.4,-2140463.9,-2254322.8}; +ST(0.028699663,0.054481756,0,0.025565101,0.048609543,0,0.032229878,0.047894836,0){2920693,2702312,3188476.9,1995520.8,2017092.5,2403076.1,438210.61,820389.33,1025710.6,-1257984.1,-584372.75,-604377.64,-2556170.3,-1841258.2,-2086050.7}; +ST(0.03345202,0.18222482,0,0.038433858,0.18005903,0,0.038852293,0.18542603,0){1947746.5,2131117.1,2057873,-3237509.5,-3450732.6,-3549951.2,196057.01,5612.0128,516044.6,3107788.7,3447337.8,3175871.5,-2254322.8,-2140463.9,-2819104.7}; +ST(0.071841704,0.17726974,0,0.066399282,0.17458324,0,0.071059851,0.17209017,0){1799263.7,2061554.2,1900690.4,-2812994.5,-3111294.6,-2772233.4,-214389.53,-477290.81,-629520.98,2933842.6,3354405.6,3060958.1,-1438939.3,-1230983.2,-774142.34}; +ST(0.06137482,0.19024807,0,0.061291474,0.18447479,0,0.06771074,0.1881525,0){1976038.9,2069396,1821405.7,-3592882,-3531333.7,-3238423,963745.22,425331.11,698008.36,2804392.5,3230965.1,2695511.5,-3258719.1,-2708277.6,-2795478.4}; +ST(0.06771074,0.1881525,0,0.061291474,0.18447479,0,0.066710408,0.18109144,0){1821405.7,2069396,1958233.8,-3238423,-3531333.7,-3210995.9,698008.36,425331.11,95959.418,2695511.5,3230965.1,3149708.8,-2795478.4,-2708277.6,-2111256.9}; +ST(0.0081152275,0.10988635,0,0.01198914,0.11616091,0,0.0062042788,0.11791514,0){821145.89,1171325.2,612847.32,-151361.79,-358450.6,-208741.13,-944689.8,-1420119.3,-750565.55,-619246.83,-627101.02,-286207.66,439508.43,984768,561848.67}; +ST(0.0062042788,0.11791514,0,0.01198914,0.11616091,0,0.01093484,0.12117452,0){612847.32,1171325.2,1052666.9,-208741.13,-358450.6,-426753.37,-750565.55,-1420119.3,-1306415.4,-286207.66,-627101.02,-350052.21,561848.67,984768,1098212.1}; +ST(0.081922129,0.20489902,0,0.086709216,0.20730703,0,0.081656406,0.2108727,0){996952.98,734117.03,951384.03,-2081157.6,-1563285.8,-2083808.1,1266338.6,1031586.7,1528962.6,704044.3,398134,263916.4,-2032271.3,-1481512.9,-1843401}; +ST(0.060825265,0.17090728,0,0.066399282,0.17458324,0,0.060859952,0.17787963,0){2288734.2,2061554.2,2182203,-3282960.5,-3111294.6,-3438395.7,-862639.89,-477290.81,-202892.1,3657845.3,3354405.6,3555311.4,-726586.11,-1230983.2,-1844119.8}; +ST(0.084619556,0.23283838,0,0.084319616,0.22565969,0,0.09071018,0.22887426,0){621044.17,696453.76,406264.77,-1568398.7,-1688204.7,-1003622.2,1771426.2,1707540.6,1069446.3,-1133733.9,-743250.94,-568907.82,-42283.716,-649719.93,-233040.27}; +ST(0.078984823,0.22953004,0,0.084319616,0.22565969,0,0.084619556,0.23283838,0){858343.29,696453.76,621044.17,-2128428.8,-1688204.7,-1568398.7,2291087.1,1707540.6,1771426.2,-1261656.1,-743250.94,-1133733.9,-424553.92,-649719.93,-42283.716}; +ST(0.023309936,0.19197185,0,0.025476801,0.19755762,0,0.018704911,0.19716585,0){1390526.6,1423125.8,1103230.1,-2573914.4,-2782737.9,-2149261.2,799964.88,1235431.1,934589.13,1893175.4,1602470.1,1263201.6,-2411477.9,-2766638.2,-2132672.2}; +ST(0.029690249,0.19362013,0,0.025476801,0.19755762,0,0.023309936,0.19197185,0){1647856.1,1423125.8,1390526.6,-3101495.4,-2782737.9,-2573914.4,1088093.1,1235431.1,799964.88,2141745.7,1602470.1,1893175.4,-2977851,-2766638.2,-2411477.9}; +ST(0.038852293,0.18542603,0,0.034128539,0.18892309,0,0.03345202,0.18222482,0){2057873,1872288.6,1947746.5,-3549951.2,-3356683.8,-3237509.5,516044.6,788949.65,196057.01,3175871.5,2731311.2,3107788.7,-2819104.7,-2954777.5,-2254322.8}; +ST(0.039366597,0.19088868,0,0.034128539,0.18892309,0,0.038852293,0.18542603,0){1982365.2,1872288.6,2057873,-3628592.6,-3356683.8,-3549951.2,1030950.1,788949.65,516044.6,2772526.5,2731311.2,3175871.5,-3333638.5,-2954777.5,-2819104.7}; +ST(0.05,0,0,0.051745598,0.0053231545,0,0.046181733,0.0056701177,0){3880596.9,3873250.9,3851009.3,3880622.4,3861228.9,3837454.5,3880662.8,3837214.6,3810385,3880737.9,3801308.2,3769920.5,3880625.6,3753417.7,3715901.2}; +ST(0.045931579,0.29422002,0,0.051526128,0.29458598,0,0.05,0.3,0){116468.36,109871.78,0,-348980.73,-329256.34,0,580225.36,547568.39,0,-809364.6,-764098.34,0,1035478,977975.34,0}; +ST(0.017373248,0.19021363,0,0.021212478,0.18688263,0,0.023309936,0.19197185,0){1095255.9,1339179.6,1390526.6,-1990705.9,-2348119.2,-2573914.4,532263.7,429909.33,799964.88,1555631.8,2024227.8,1893175.4,-1804413.6,-1955356.8,-2411477.9}; +ST(0.08682376,0.20181233,0,0.086709216,0.20730703,0,0.081922129,0.20489902,0){767576.83,734117.03,996952.98,-1560255.4,-1563285.8,-2081157.6,843726.65,1031586.7,1266338.6,688912.23,398134,704044.3,-1555436.8,-1481512.9,-2032271.3}; +ST(0.08466046,0.11619385,0,0.082946441,0.12207685,0,0.077013163,0.11736903,0){1475783,1589878.9,2095773.2,-452604.25,-673263.29,-691227.47,-1789662.1,-1978038.1,-2559181.5,-788262.21,-467139.5,-1023961.4,1243195.1,1708498.9,1873161.8}; +ST(0.065117308,0.15657509,0,0.064971856,0.15110456,0,0.070477538,0.15360968,0){2354870.2,2431817,2153625.7,-2678881.2,-2488096.1,-2316413.6,-1986291.9,-2374265.3,-1978592.7,2952219.2,2543085,2466066.8,1580034,2315361.9,1792310.4}; +ST(0.036308441,0.24745658,0,0.033139613,0.24047735,0,0.040431855,0.24188745,0){958174.94,1026889.2,1110505,-2591684.5,-2694450.7,-2932804,3460190.4,3348643.4,3702149.5,-3307339.6,-2743423.6,-3142324.5,2177878.8,1106136.5,1453973.2}; +ST(0.035422008,0.053603109,0,0.032659307,0.059686042,0,0.028699663,0.054481756,0){3344502.1,3158137.1,2920693,2318078.8,1964024.3,1995520.8,580213.58,27282.242,438210.61,-1335777.4,-1919818.3,-1257984.1,-2842327.2,-3141270.1,-2556170.3}; +ST(0.083337094,0.16031526,0,0.088623123,0.15812222,0,0.088381846,0.16289419,0){1295652.6,918302.92,911153.68,-1575018.8,-1074338,-1156470.7,-956036.82,-735787.48,-599768.12,1781183.7,1199414.9,1317920.1,571788.58,531983.03,244888.24}; +ST(0.029124573,0.24658198,0,0.033139613,0.24047735,0,0.036308441,0.24745658,0){849052.23,1026889.2,958174.94,-2288340.2,-2694450.7,-2591684.5,3030093.5,3348643.4,3460190.4,-2848204.4,-2743423.6,-3307339.6,1797881.3,1106136.5,2177878.8}; +ST(0.058552205,0.15400025,0,0.064971856,0.15110456,0,0.065117308,0.15657509,0){2589572.8,2431817,2354870.2,-2806487.5,-2488096.1,-2678881.2,-2354581.2,-2374265.3,-1986291.9,3003966,2543085,2952219.2,2103059.1,2315361.9,1580034}; +ST(0.026971271,0.22659033,0,0.02301506,0.22157032,0,0.029518097,0.21985532,0){1090633.5,1025043.6,1264894.2,-2658504.1,-2421684.9,-2954793.2,2731189,2274566.1,2682751.8,-1267784.1,-677461.35,-629411.95,-909068.56,-1351813.7,-1842177.8}; +ST(0.029518097,0.21985532,0,0.02301506,0.22157032,0,0.02463475,0.21609565,0){1264894.2,1025043.6,1153636.1,-2954793.2,-2421684.9,-2626116.1,2682751.8,2274566.1,2198315,-629411.95,-677461.35,-179791.92,-1842177.8,-1351813.7,-1969098.8}; +ST(0.038852293,0.18542603,0,0.038433858,0.18005903,0,0.043573225,0.18196099,0){2057873,2131117.1,2202933.2,-3549951.2,-3450732.6,-3650165.7,516044.6,5612.0128,195066.32,3175871.5,3447337.8,3522129.2,-2819104.7,-2140463.9,-2509350}; +ST(0.095652827,0.22622146,0,0.095706332,0.23121352,0,0.09071018,0.22887426,0){199039.37,183910.78,406264.77,-484109.58,-460364.34,-1003622.2,494313.66,508106.39,1069446.3,-223837.82,-303408.65,-568907.82,-173819.74,-52245.513,-233040.27}; +ST(0.066710408,0.18109144,0,0.061291474,0.18447479,0,0.060859952,0.17787963,0){1958233.8,2069396,2182203,-3210995.9,-3531333.7,-3438395.7,95959.418,425331.11,-202892.1,3149708.8,3230965.1,3555311.4,-2111256.9,-2708277.6,-1844119.8}; +ST(0.09123018,0.070922096,0,0.086276325,0.073599227,0,0.085646934,0.067722415,0){983713.53,1502743.3,1585902.9,465586.72,653401.45,821166.94,-297764.17,-565297.67,-339583.13,-904277.98,-1464602.7,-1336670.3,-1034644.8,-1536324.4,-1689538.4}; +ST(0.085646934,0.067722415,0,0.086276325,0.073599227,0,0.080160084,0.071577727,0){1585902.9,1502743.3,2107851.9,821166.94,653401.45,977984.82,-339583.13,-565297.67,-676141.96,-1336670.3,-1464602.7,-1967920.1,-1689538.4,-1536324.4,-2205119.3}; +ST(0.09123018,0.070922096,0,0.095867013,0.068756454,0,0.095795895,0.073622969,0){983713.53,470210.65,473503.74,465586.72,236792.42,205720.2,-297764.17,-114175.46,-178405.32,-904277.98,-408471.99,-461642.03,-1034644.8,-500215.61,-483922.03}; +ST(0.02301506,0.22157032,0,0.021374843,0.22646669,0,0.017207343,0.22323305,0){1025043.6,906782.43,781289.63,-2421684.9,-2208721,-1865590.4,2274566.1,2264460.9,1807835.2,-677461.35,-1042528.4,-643322.1,-1351813.7,-767856.24,-915362.92}; +ST(0.041643161,0.17482395,0,0.038433858,0.18005903,0,0.034648589,0.17585937,0){2284160.6,2131117.1,2080615.7,-3458410.7,-3450732.6,-3193762.3,-506290.81,5612.0128,-371953.81,3718851.8,3447337.8,3392886,-1405815.9,-2140463.9,-1443588.4}; +ST(0.082709707,0.12855445,0,0.082946441,0.12207685,0,0.087905667,0.12517971,0){1568327.1,1589878.9,1140990.9,-869760.99,-673263.29,-554517.87,-1955764.1,-1978038.1,-1425990.8,-1353.9511,-467139.5,-178453.87,1955094.7,1708498.9,1334087.8}; +ST(0.095090425,0.2489538,0,0.095492809,0.25375881,0,0.090077759,0.25268961,0){157454.16,131307.15,291813.61,-428416.46,-363726.6,-805257.31,579817.55,512510.07,1125037.4,-569427.53,-543451.99,-1174248.1,400020.01,449348.78,940920.06}; +ST(0.08974924,0.047235181,0,0.095360834,0.0462161,0,0.094913401,0.051076335,0){1190814.4,547145.45,595503.05,905328.07,421466.87,429138.45,402804.56,198977.54,142901.48,-196265.4,-69217.008,-183223.65,-748421.11,-321602.09,-458373.75}; +ST(0.1,0.22857143,0,0.095706332,0.23121352,0,0.095652827,0.22622146,0){0,183910.78,199039.37,0,-460364.34,-484109.58,0,508106.39,494313.66,0,-303408.65,-223837.82,0,-52245.513,-173819.74}; +ST(0.049213686,0.13705186,0,0.044512931,0.13802764,0,0.045894811,0.13135905,0){2922689.8,2867370.6,2973475.7,-2132523.3,-2150242,-1819976.4,-3499251.9,-3405187.4,-3679581.9,1186505.2,1298632.3,392676.16,3819996.4,3729885,3832095.1}; +ST(0.047918899,0.14257657,0,0.044512931,0.13802764,0,0.049213686,0.13705186,0){2842478.3,2867370.6,2922689.8,-2400971.6,-2150242,-2132523.3,-3215455,-3405187.4,-3499251.9,1901551.7,1298632.3,1186505.2,3510918.5,3729885,3819996.4}; +ST(0.026971271,0.22659033,0,0.021374843,0.22646669,0,0.02301506,0.22157032,0){1090633.5,906782.43,1025043.6,-2658504.1,-2208721,-2421684.9,2731189,2264460.9,2274566.1,-1267784.1,-1042528.4,-677461.35,-909068.56,-767856.24,-1351813.7}; +ST(0.095795895,0.073622969,0,0.095867013,0.068756454,0,0.1,0.071428571,0){473503.74,470210.65,0,205720.2,236792.42,0,-178405.32,-114175.46,0,-461642.03,-408471.99,0,-483922.03,-500215.61,0}; +}; diff --git a/demos/view02.pos b/demos/view02.pos new file mode 100644 index 0000000000000000000000000000000000000000..2ab8e8d29a8df45e3df0670cdba32a7491c8a22b --- /dev/null +++ b/demos/view02.pos @@ -0,0 +1,362 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + Vector map on points + + All important comments are marked with "README" +*/ + +View "a vector map" { +VP(1e-06,1e-06,0){0,0,122.26654,0,0,122.45426,0,0,122.82769,0,0,123.38417,0,0,124.20759}; +VP(1e-06,0.010000933,0){0,0,121.95116,0,0,120.60823,0,0,117.93735,0,0,113.96957,0,0,108.76298}; +VP(1e-06,0.020000867,0){0,0,121.76276,0,0,116.4134,0,0,105.95451,0,0,90.855892,0,0,71.867727}; +VP(1e-06,0.0300008,0){0,0,120.79673,0,0,108.95219,0,0,86.42978,0,0,55.448276,0,0,19.067191}; +VP(1e-06,0.040000733,0){0,0,119.6291,0,0,98.888056,0,0,61.048627,0,0,12.75009,0,0,-37.476665}; +VP(1e-06,0.050000667,0){0,0,118.01437,0,0,86.430423,0,0,31.638139,0,0,-31.806471,0,0,-86.912688}; +VP(1e-06,0.0600006,0){0,0,116.49231,0,0,71.947632,0,0,0.0082419918,0,0,-71.673337,0,0,-115.66034}; +VP(1e-06,0.070000533,0){0,0,114.18838,0,0,55.530819,0,0,-31.604761,0,0,-102.40655,0,0,-120.49233}; +VP(1e-06,0.080000467,0){0,0,111.73884,0,0,37.77248,0,0,-61.122995,0,0,-119.44024,0,0,-98.690267}; +VP(1e-06,0.0900004,0){0,0,109.02764,0,0,19.140014,0,0,-86.347807,0,0,-120.39736,0,0,-55.210037}; +VP(1e-06,0.10000033,0){0,0,105.89652,0,0,-0.0065380069,0,0,-106.09757,0,0,-106.26766,0,0,0.10907541}; +VP(1e-06,0.11000027,0){0,0,102.73901,0,0,-19.150688,0,0,-118.07603,0,0,-76.769682,0,0,55.222067}; +VP(1e-06,0.1200002,0){0,0,98.952931,0,0,-37.767065,0,0,-122.22482,0,0,-37.780096,0,0,98.736188}; +VP(1e-06,0.13000013,0){0,0,95.122755,0,0,-55.584271,0,0,-118.15756,0,0,6.4473841,0,0,120.69955}; +VP(1e-06,0.14000007,0){0,0,90.852382,0,0,-71.806307,0,0,-105.6782,0,0,49.526055,0,0,115.53689}; +VP(1e-06,0.15,0){0,0,86.563988,0,0,-86.610866,0,0,-86.776431,0,0,86.913071,0,0,87.233235}; +VP(1e-06,0.15999993,0){0,0,81.861739,0,0,-98.925044,0,0,-61.054707,0,0,111.37293,0,0,37.582303}; +VP(1e-06,0.16999987,0){0,0,76.880554,0,0,-108.83108,0,0,-31.635178,0,0,121.95453,0,0,-19.051124}; +VP(1e-06,0.1799998,0){0,0,71.93248,0,0,-116.3445,0,0,0.0051803424,0,0,116.09977,0,0,-71.614187}; +VP(1e-06,0.18999973,0){0,0,66.655881,0,0,-120.84615,0,0,31.684673,0,0,94.843218,0,0,-108.67685}; +VP(1e-06,0.19999967,0){0,0,61.126812,0,0,-122.30122,0,0,61.195533,0,0,61.281721,0,0,-122.75882}; +VP(1e-06,0.2099996,0){0,0,55.454746,0,0,-120.62189,0,0,86.3266,0,0,19.057229,0,0,-108.50779}; +VP(1e-06,0.21999953,0){0,0,49.765538,0,0,-116.57634,0,0,106.4713,0,0,-25.419128,0,0,-73.667176}; +VP(1e-06,0.22999947,0){0,0,43.853336,0,0,-109.05425,0,0,118.28173,0,0,-66.779805,0,0,-19.027558}; +VP(1e-06,0.2399994,0){0,0,37.808977,0,0,-98.930918,0,0,122.15279,0,0,-98.667764,0,0,37.647079}; +VP(1e-06,0.24999933,0){0,0,31.614973,0,0,-86.420956,0,0,118.17907,0,0,-118.35504,0,0,86.812866}; +VP(1e-06,0.25999927,0){0,0,25.446319,0,0,-71.890336,0,0,105.77788,0,0,-121.22558,0,0,115.63648}; +VP(1e-06,0.2699992,0){0,0,19.147235,0,0,-55.558139,0,0,86.505401,0,0,-108.94986,0,0,120.6783}; +VP(1e-06,0.27999913,0){0,0,12.792336,0,0,-37.809277,0,0,61.14898,0,0,-81.777482,0,0,98.845675}; +VP(1e-06,0.28999907,0){0,0,6.3850865,0,0,-19.083517,0,0,31.567694,0,0,-43.697424,0,0,55.414892}; +VP(1e-06,0.299999,0){0,0,0.0095385519,0,0,-0.03787688,0,0,0.093923584,0,0,-0.19582795,0,0,0.49155762}; + +VP(0.0100008,1e-06,0){0,0,1199420,0,0,1199413.7,0,0,1199397.9,0,0,1199378.4,0,0,1199403.4}; +VP(0.0100008,0.010000933,0){0,0,1197824.3,0,0,1184734.2,0,0,1158699.2,0,0,1120019.6,0,0,1069149}; +VP(0.0100008,0.020000867,0){0,0,1192912,0,0,1140722,0,0,1038620.8,0,0,891080.74,0,0,704676.89}; +VP(0.0100008,0.0300008,0){0,0,1184493.3,0,0,1068498.7,0,0,847865.42,0,0,544204.94,0,0,187350.11}; +VP(0.0100008,0.040000733,0){0,0,1173023.5,0,0,970311.11,0,0,599870.71,0,0,125642.73,0,0,-370468.19}; +VP(0.0100008,0.050000667,0){0,0,1158406,0,0,848028.9,0,0,310455.27,0,0,-310247.58,0,0,-847690.45}; +VP(0.0100008,0.0600006,0){0,0,1141160.6,0,0,705256.28,0,0,-99.915745,0,0,-705541.47,0,0,-1141600.4}; +VP(0.0100008,0.070000533,0){0,0,1119507.8,0,0,544453.75,0,0,-310310.46,0,0,-1005770.5,0,0,-1184662.4}; +VP(0.0100008,0.080000467,0){0,0,1095510.9,0,0,370556.44,0,0,-599794.43,0,0,-1173524.1,0,0,-970723.46}; +VP(0.0100008,0.0900004,0){0,0,1068561,0,0,187606.05,0,0,-848133.51,0,0,-1184824.1,0,0,-544820.04}; +VP(0.0100008,0.10000033,0){0,0,1038622.4,0,0,59.994402,0,0,-1038526.3,0,0,-1038609.6,0,0,-114.10057}; +VP(0.0100008,0.11000027,0){0,0,1006283.9,0,0,-187756.34,0,0,-1159127,0,0,-755186.39,0,0,544970.98}; +VP(0.0100008,0.1200002,0){0,0,970146.83,0,0,-370533.83,0,0,-1199206,0,0,-370700.66,0,0,970167.63}; +VP(0.0100008,0.13000013,0){0,0,932049.4,0,0,-544524.54,0,0,-1158572.3,0,0,62773.626,0,0,1184972.7}; +VP(0.0100008,0.14000007,0){0,0,891093.35,0,0,-704750.35,0,0,-1038220.5,0,0,487590.9,0,0,1139583.1}; +VP(0.0100008,0.15,0){0,0,848043.94,0,0,-848162.19,0,0,-847974.76,0,0,848328.9,0,0,847991.67}; +VP(0.0100008,0.15999993,0){0,0,802591.51,0,0,-970520.77,0,0,-600078.94,0,0,1096713.1,0,0,371678.95}; +VP(0.0100008,0.16999987,0){0,0,754801.61,0,0,-1068627.9,0,0,-310284.17,0,0,1197257.1,0,0,-187594.97}; +VP(0.0100008,0.1799998,0){0,0,704861.79,0,0,-1140475,0,0,-9.7592105,0,0,1140481.7,0,0,-704943.27}; +VP(0.0100008,0.18999973,0){0,0,653101.17,0,0,-1184459.4,0,0,310527.61,0,0,931931.51,0,0,-1068734.2}; +VP(0.0100008,0.19999967,0){0,0,599592.55,0,0,-1199104.4,0,0,599503.9,0,0,599267.34,0,0,-1198494.7}; +VP(0.0100008,0.2099996,0){0,0,544384.89,0,0,-1184212.9,0,0,847613.27,0,0,187425.67,0,0,-1067044.3}; +VP(0.0100008,0.21999953,0){0,0,487650.97,0,0,-1140248.2,0,0,1038317,0,0,-249363.16,0,0,-704669.35}; +VP(0.0100008,0.22999947,0){0,0,429775.49,0,0,-1068467.4,0,0,1158136.7,0,0,-652849.84,0,0,-187529.03}; +VP(0.0100008,0.2399994,0){0,0,370742.76,0,0,-970651.21,0,0,1199863,0,0,-970733.39,0,0,370606.77}; +VP(0.0100008,0.24999933,0){0,0,310389.76,0,0,-847996.97,0,0,1158383,0,0,-1158385.8,0,0,848238.2}; +VP(0.0100008,0.25999927,0){0,0,249381.35,0,0,-705070.58,0,0,1038980.9,0,0,-1193427.1,0,0,1141624.8}; +VP(0.0100008,0.2699992,0){0,0,187667.19,0,0,-544609.42,0,0,848186.21,0,0,-1068663.7,0,0,1184526.1}; +VP(0.0100008,0.27999913,0){0,0,125343.27,0,0,-370542.57,0,0,599521.08,0,0,-802247.4,0,0,969885.37}; +VP(0.0100008,0.28999907,0){0,0,62767.644,0,0,-187609.66,0,0,310381.87,0,0,-429732.38,0,0,544296.89}; +VP(0.0100008,0.299999,0){0,0,6.2613191,0,0,-18.79568,0,0,31.365281,0,0,-43.993284,0,0,56.787457}; + +VP(0.0200006,1e-06,0){0,0,2280709.8,0,0,2280750.8,0,0,2280828.8,0,0,2280959.2,0,0,2281129.6}; +VP(0.0200006,0.010000933,0){0,0,2278084.8,0,0,2253198.7,0,0,2203663.2,0,0,2129974,0,0,2032919.9}; +VP(0.0200006,0.020000867,0){0,0,2268407.5,0,0,2169311.8,0,0,1975439,0,0,1695261.3,0,0,1341077.3}; +VP(0.0200006,0.0300008,0){0,0,2252723.5,0,0,2032071.2,0,0,1612411.9,0,0,1034928.7,0,0,356247.55}; +VP(0.0200006,0.040000733,0){0,0,2231113.2,0,0,1845403.9,0,0,1140636.4,0,0,238607.96,0,0,-704725}; +VP(0.0200006,0.050000667,0){0,0,2203326.5,0,0,1612958.8,0,0,590304.13,0,0,-590735.99,0,0,-1613764.5}; +VP(0.0200006,0.0600006,0){0,0,2169459.4,0,0,1340689.5,0,0,-253.26048,0,0,-1341167.5,0,0,-2169964.1}; +VP(0.0200006,0.070000533,0){0,0,2129890.6,0,0,1035882.8,0,0,-590292.11,0,0,-1913508.9,0,0,-2254296.8}; +VP(0.0200006,0.080000467,0){0,0,2083910,0,0,704847.45,0,0,-1140765.6,0,0,-2231594.2,0,0,-1845800.6}; +VP(0.0200006,0.0900004,0){0,0,2032367.2,0,0,356748.59,0,0,-1612959.6,0,0,-2252643.6,0,0,-1034806.6}; +VP(0.0200006,0.10000033,0){0,0,1975611.2,0,0,57.943352,0,0,-1975420.4,0,0,-1975504.9,0,0,-426.45724}; +VP(0.0200006,0.11000027,0){0,0,1913315.4,0,0,-356703.47,0,0,-2203743.9,0,0,-1436328.1,0,0,1035508.3}; +VP(0.0200006,0.1200002,0){0,0,1845574.3,0,0,-704966.07,0,0,-2281489.6,0,0,-705279.75,0,0,1845900.6}; +VP(0.0200006,0.13000013,0){0,0,1772685.9,0,0,-1035509.4,0,0,-2203500.9,0,0,119407.19,0,0,2253641.5}; +VP(0.0200006,0.14000007,0){0,0,1695112.7,0,0,-1340923.1,0,0,-1975160.6,0,0,928234.38,0,0,2168753.8}; +VP(0.0200006,0.15,0){0,0,1612735.8,0,0,-1612718.7,0,0,-1612310.8,0,0,1612112.4,0,0,1611635.4}; +VP(0.0200006,0.15999993,0){0,0,1526063.3,0,0,-1845120.2,0,0,-1140155.4,0,0,2083304.9,0,0,704343.18}; +VP(0.0200006,0.16999987,0){0,0,1435361,0,0,-2032273.5,0,0,-590286.74,0,0,2277973.9,0,0,-357113.77}; +VP(0.0200006,0.1799998,0){0,0,1340603.7,0,0,-2169104.8,0,0,-187.59264,0,0,2169344.4,0,0,-1340174.3}; +VP(0.0200006,0.18999973,0){0,0,1242326.7,0,0,-2253004.8,0,0,590488.21,0,0,1772854.2,0,0,-2032869.4}; +VP(0.0200006,0.19999967,0){0,0,1140484.2,0,0,-2281080.6,0,0,1140863.6,0,0,1140070,0,0,-2281239}; +VP(0.0200006,0.2099996,0){0,0,1035459.2,0,0,-2252611.6,0,0,1612490.4,0,0,356944.25,0,0,-2031783}; +VP(0.0200006,0.21999953,0){0,0,927776.85,0,0,-2169354.9,0,0,1975370.5,0,0,-474298.34,0,0,-1340371.5}; +VP(0.0200006,0.22999947,0){0,0,817407.12,0,0,-2032357.3,0,0,2203356.6,0,0,-1242461.5,0,0,-356900.43}; +VP(0.0200006,0.2399994,0){0,0,704976.55,0,0,-1845571.3,0,0,2281095,0,0,-1845366.1,0,0,705164.78}; +VP(0.0200006,0.24999933,0){0,0,590364.42,0,0,-1612953.4,0,0,2203467,0,0,-2203634.2,0,0,1613249.1}; +VP(0.0200006,0.25999927,0){0,0,474194.23,0,0,-1340559.8,0,0,1975062.6,0,0,-2267979.5,0,0,2168670.2}; +VP(0.0200006,0.2699992,0){0,0,356872.34,0,0,-1035606,0,0,1612764.1,0,0,-2031781.9,0,0,2251747.9}; +VP(0.0200006,0.27999913,0){0,0,238392.68,0,0,-704748.96,0,0,1140275,0,0,-1525901.8,0,0,1844805.9}; +VP(0.0200006,0.28999907,0){0,0,119394.11,0,0,-356902.82,0,0,590587.11,0,0,-817934.15,0,0,1036489.1}; +VP(0.0200006,0.299999,0){0,0,11.932618,0,0,-35.829397,0,0,59.820438,0,0,-83.966334,0,0,108.36963}; + +VP(0.0300004,1e-06,0){0,0,3139675.3,0,0,3139674.2,0,0,3139668.3,0,0,3139681.7,0,0,3139723.8}; +VP(0.0300004,0.010000933,0){0,0,3135081.7,0,0,3100734,0,0,3032371.9,0,0,2930692.9,0,0,2796805.3}; +VP(0.0300004,0.020000867,0){0,0,3122126.6,0,0,2985595.8,0,0,2718520.5,0,0,2332639.4,0,0,1845013.2}; +VP(0.0300004,0.0300008,0){0,0,3101041.9,0,0,2797472.5,0,0,2220045.5,0,0,1425300.7,0,0,491065.86}; +VP(0.0300004,0.040000733,0){0,0,3070989.4,0,0,2539964.8,0,0,1569772.9,0,0,328239.6,0,0,-969845.82}; +VP(0.0300004,0.050000667,0){0,0,3032446.4,0,0,2219926.7,0,0,812540.71,0,0,-812639.58,0,0,-2220026.5}; +VP(0.0300004,0.0600006,0){0,0,2985693.7,0,0,1845152.9,0,0,-174.73805,0,0,-1845312.5,0,0,-2985526.4}; +VP(0.0300004,0.070000533,0){0,0,2930943,0,0,1425196.7,0,0,-812730.34,0,0,-2633146.4,0,0,-3100929.6}; +VP(0.0300004,0.080000467,0){0,0,2867944.7,0,0,970103.04,0,0,-1569472.5,0,0,-3070185.6,0,0,-2539414}; +VP(0.0300004,0.0900004,0){0,0,2797367.8,0,0,491226.4,0,0,-2219884.6,0,0,-3100886.7,0,0,-1425369.6}; +VP(0.0300004,0.10000033,0){0,0,2718698.5,0,0,12.448978,0,0,-2718622.2,0,0,-2718532.7,0,0,51.841297}; +VP(0.0300004,0.11000027,0){0,0,2633088.6,0,0,-490806.8,0,0,-3032414,0,0,-1976012.9,0,0,1425239.2}; +VP(0.0300004,0.1200002,0){0,0,2539832.3,0,0,-970162.37,0,0,-3139509.6,0,0,-970062.59,0,0,2540261.1}; +VP(0.0300004,0.13000013,0){0,0,2439829.8,0,0,-1425373.6,0,0,-3032567.4,0,0,164237.87,0,0,3100974.7}; +VP(0.0300004,0.14000007,0){0,0,2333010.1,0,0,-1845587,0,0,-2718525,0,0,1277556.1,0,0,2985337.9}; +VP(0.0300004,0.15,0){0,0,2219900.9,0,0,-2219866.5,0,0,-2219894.7,0,0,2219752.1,0,0,2219752}; +VP(0.0300004,0.15999993,0){0,0,2100853.7,0,0,-2539747.5,0,0,-1570223,0,0,2867706.4,0,0,971142.34}; +VP(0.0300004,0.16999987,0){0,0,1975706.3,0,0,-2797278.9,0,0,-812588.34,0,0,3135118.2,0,0,-490528.6}; +VP(0.0300004,0.1799998,0){0,0,1845354.4,0,0,-2985881,0,0,194.8881,0,0,2985631.7,0,0,-1845788.8}; +VP(0.0300004,0.18999973,0){0,0,1709967.7,0,0,-3100810.8,0,0,812260.37,0,0,2439906.4,0,0,-2796702.4}; +VP(0.0300004,0.19999967,0){0,0,1569708,0,0,-3139313,0,0,1569373.5,0,0,1570104.7,0,0,-3139262.4}; +VP(0.0300004,0.2099996,0){0,0,1425339.6,0,0,-3100757.9,0,0,2219408.5,0,0,492050.16,0,0,-2797743.3}; +VP(0.0300004,0.21999953,0){0,0,1276986.2,0,0,-2985936.9,0,0,2719040,0,0,-652907.22,0,0,-1845598.7}; +VP(0.0300004,0.22999947,0){0,0,1125215.1,0,0,-2797495.5,0,0,3032403.5,0,0,-1709234.6,0,0,-492137.13}; +VP(0.0300004,0.2399994,0){0,0,970144.1,0,0,-2539846.2,0,0,3139378.7,0,0,-2539753.5,0,0,970193.03}; +VP(0.0300004,0.24999933,0){0,0,812491.11,0,0,-2219797.3,0,0,3032408.6,0,0,-3032616.7,0,0,2220319.1}; +VP(0.0300004,0.25999927,0){0,0,652744.28,0,0,-1845353.3,0,0,2718873,0,0,-3122299.7,0,0,2985657.6}; +VP(0.0300004,0.2699992,0){0,0,491182.49,0,0,-1425463.8,0,0,2220200.9,0,0,-2797555.2,0,0,3100901.2}; +VP(0.0300004,0.27999913,0){0,0,328155.37,0,0,-970088.48,0,0,1569536.1,0,0,-2100275,0,0,2539087.9}; +VP(0.0300004,0.28999907,0){0,0,164322.66,0,0,-491193.3,0,0,812760.14,0,0,-1125540.5,0,0,1426162.8}; +VP(0.0300004,0.299999,0){0,0,16.41221,0,0,-49.283756,0,0,82.296358,0,0,-115.54157,0,0,149.15109}; + +VP(0.0400002,1e-06,0){0,0,3690601,0,0,3690618.3,0,0,3690645.2,0,0,3690704.6,0,0,3690664.7}; +VP(0.0400002,0.010000933,0){0,0,3685613.9,0,0,3645169.9,0,0,3564706,0,0,3445103.4,0,0,3287752.7}; +VP(0.0400002,0.020000867,0){0,0,3670390,0,0,3509941.7,0,0,3196044,0,0,2742426.5,0,0,2168876.8}; +VP(0.0400002,0.0300008,0){0,0,3645136.4,0,0,3288267.4,0,0,2609470.8,0,0,1675240.9,0,0,577177.72}; +VP(0.0400002,0.040000733,0){0,0,3610077.5,0,0,2985786.8,0,0,1845166.8,0,0,385493.72,0,0,-1140750.8}; +VP(0.0400002,0.050000667,0){0,0,3564912,0,0,2609684.4,0,0,955168.57,0,0,-955315.6,0,0,-2609786}; +VP(0.0400002,0.0600006,0){0,0,3510060.8,0,0,2169168.8,0,0,-365.39657,0,0,-2169708.4,0,0,-3510148.3}; +VP(0.0400002,0.070000533,0){0,0,3445393.7,0,0,1675298.9,0,0,-955611.95,0,0,-3095666.7,0,0,-3645126.2}; +VP(0.0400002,0.080000467,0){0,0,3371365.8,0,0,1140256.7,0,0,-1845633.7,0,0,-3610102,0,0,-2984730.7}; +VP(0.0400002,0.0900004,0){0,0,3288335.2,0,0,577001.33,0,0,-2610140.5,0,0,-3645082,0,0,-1674262.7}; +VP(0.0400002,0.10000033,0){0,0,3196271.4,0,0,254.08427,0,0,-3196008.5,0,0,-3196774.9,0,0,-1623.5529}; +VP(0.0400002,0.11000027,0){0,0,3095219.5,0,0,-577212.68,0,0,-3564731.5,0,0,-2322463.3,0,0,1675686.6}; +VP(0.0400002,0.1200002,0){0,0,2985782.7,0,0,-1140499.3,0,0,-3690667.2,0,0,-1140462.4,0,0,2985892.1}; +VP(0.0400002,0.13000013,0){0,0,2868207.9,0,0,-1675702.3,0,0,-3564761.1,0,0,193912.15,0,0,3645088.9}; +VP(0.0400002,0.14000007,0){0,0,2742715.8,0,0,-2169258.5,0,0,-3196241.2,0,0,1500944.4,0,0,3510035.4}; +VP(0.0400002,0.15,0){0,0,2609776.1,0,0,-2609718.6,0,0,-2609840.3,0,0,2609858.9,0,0,2609702.7}; +VP(0.0400002,0.15999993,0){0,0,2469571.8,0,0,-2985800.7,0,0,-1845535.8,0,0,3371611.7,0,0,1141234.7}; +VP(0.0400002,0.16999987,0){0,0,2322604.7,0,0,-3288363.7,0,0,-955261.93,0,0,3685749,0,0,-577636.64}; +VP(0.0400002,0.1799998,0){0,0,2169316.4,0,0,-3510075.5,0,0,26.796365,0,0,3510181.1,0,0,-2169230}; +VP(0.0400002,0.18999973,0){0,0,2010118.7,0,0,-3645239.4,0,0,955058.82,0,0,2868420.1,0,0,-3288332.2}; +VP(0.0400002,0.19999967,0){0,0,1845375.9,0,0,-3690719.5,0,0,1845270.8,0,0,1845577.9,0,0,-3691037.1}; +VP(0.0400002,0.2099996,0){0,0,1675632.4,0,0,-3645342.3,0,0,2609442.4,0,0,578081.72,0,0,-3289083.8}; +VP(0.0400002,0.21999953,0){0,0,1501170.4,0,0,-3510092.5,0,0,3196169.1,0,0,-767085.88,0,0,-2169730.2}; +VP(0.0400002,0.22999947,0){0,0,1322642.5,0,0,-3288389.9,0,0,3564726.5,0,0,-2009812.9,0,0,-577466.5}; +VP(0.0400002,0.2399994,0){0,0,1140541.4,0,0,-2985927.6,0,0,3690606.2,0,0,-2985167.7,0,0,1138794.3}; +VP(0.0400002,0.24999933,0){0,0,955283.2,0,0,-2609818.4,0,0,3564929,0,0,-3564727.2,0,0,2609440.2}; +VP(0.0400002,0.25999927,0){0,0,767387.9,0,0,-2169450.2,0,0,3196377.4,0,0,-3670707.8,0,0,3510598.4}; +VP(0.0400002,0.2699992,0){0,0,577445.52,0,0,-1675755.3,0,0,2609890,0,0,-3288365.9,0,0,3644890.1}; +VP(0.0400002,0.27999913,0){0,0,385709.6,0,0,-1140260.5,0,0,1844946.8,0,0,-2468928.8,0,0,2984936.9}; +VP(0.0400002,0.28999907,0){0,0,193250.5,0,0,-577630.78,0,0,955676.02,0,0,-1323236.2,0,0,1676345.5}; +VP(0.0400002,0.299999,0){0,0,19.269892,0,0,-57.855448,0,0,96.578279,0,0,-135.52806,0,0,174.821}; + +VP(0.05,1e-06,0){0,0,3880596.9,0,0,3880622.3,0,0,3880662.8,0,0,3880737.8,0,0,3880625.5}; +VP(0.05,0.010000933,0){0,0,3875257,0,0,3832814.6,0,0,3748396.3,0,0,3622968.9,0,0,3457852}; +VP(0.05,0.020000867,0){0,0,3859325.9,0,0,3690717.6,0,0,3360871,0,0,2884239.7,0,0,2281724.7}; +VP(0.05,0.0300008,0){0,0,3832795.1,0,0,3457585.2,0,0,2743849,0,0,1761412.2,0,0,606299.02}; +VP(0.05,0.040000733,0){0,0,3795748.5,0,0,3139286.7,0,0,1939875.1,0,0,404959.06,0,0,-1199883.6}; +VP(0.05,0.050000667,0){0,0,3748343.4,0,0,2744093.2,0,0,1004669.5,0,0,-1003856.9,0,0,-2743333.1}; +VP(0.05,0.0600006,0){0,0,3690625.2,0,0,2281073.8,0,0,326.84409,0,0,-2280514,0,0,-3690376.4}; +VP(0.05,0.070000533,0){0,0,3622800.6,0,0,1761625.1,0,0,-1004534.7,0,0,-3254609.6,0,0,-3832806.6}; +VP(0.05,0.080000467,0){0,0,3545045.4,0,0,1198951.3,0,0,-1940576.3,0,0,-3795861.1,0,0,-3139212.2}; +VP(0.05,0.0900004,0){0,0,3457595.9,0,0,606786.66,0,0,-2744419.3,0,0,-3832656.4,0,0,-1760172.9}; +VP(0.05,0.10000033,0){0,0,3360657,0,0,-97.27265,0,0,-3360730.3,0,0,-3360689.2,0,0,-290.22172}; +VP(0.05,0.11000027,0){0,0,3254514.6,0,0,-607227.37,0,0,-3748501,0,0,-2441826.2,0,0,1762467.9}; +VP(0.05,0.1200002,0){0,0,3139405.5,0,0,-1199386.9,0,0,-3880582.8,0,0,-1198369.5,0,0,3140304.6}; +VP(0.05,0.13000013,0){0,0,3015739.1,0,0,-1761864.9,0,0,-3748289.9,0,0,203145.44,0,0,3832787.8}; +VP(0.05,0.14000007,0){0,0,2883822,0,0,-2280986.9,0,0,-3360663.5,0,0,1578441.1,0,0,3690799.9}; +VP(0.05,0.15,0){0,0,2744031.4,0,0,-2743835.6,0,0,-2744150.4,0,0,2743895.2,0,0,2743942.5}; +VP(0.05,0.15999993,0){0,0,2596561.2,0,0,-3139538.8,0,0,-1940150.4,0,0,3545079.6,0,0,1199618.1}; +VP(0.05,0.16999987,0){0,0,2442166,0,0,-3457549.3,0,0,-1004623.5,0,0,3875273.7,0,0,-606466.48}; +VP(0.05,0.1799998,0){0,0,2280926.6,0,0,-3690675.6,0,0,228.51305,0,0,3690556.3,0,0,-2281736.6}; +VP(0.05,0.18999973,0){0,0,2113533.1,0,0,-3832797.1,0,0,1004136.5,0,0,3016195.2,0,0,-3457260.9}; +VP(0.05,0.19999967,0){0,0,1940296,0,0,-3880556.8,0,0,1940292.4,0,0,1940128.9,0,0,-3880527.5}; +VP(0.05,0.2099996,0){0,0,1761773.3,0,0,-3832816.6,0,0,2743897.2,0,0,607237.83,0,0,-3457747.5}; +VP(0.05,0.21999953,0){0,0,1578460.3,0,0,-3690740.5,0,0,3360363.1,0,0,-805756.13,0,0,-2282297.4}; +VP(0.05,0.22999947,0){0,0,1390737.8,0,0,-3457708.4,0,0,3748297.1,0,0,-2113265.5,0,0,-607333.08}; +VP(0.05,0.2399994,0){0,0,1199209.5,0,0,-3139523.8,0,0,3880564,0,0,-3139310.1,0,0,1198994.4}; +VP(0.05,0.24999933,0){0,0,1004412.5,0,0,-2744075,0,0,3748408.9,0,0,-3748301.5,0,0,2743740}; +VP(0.05,0.25999927,0){0,0,806928.23,0,0,-2281198.4,0,0,3360882.3,0,0,-3859250.9,0,0,3690299}; +VP(0.05,0.2699992,0){0,0,607108.49,0,0,-1761901.2,0,0,2744236.2,0,0,-3457909.7,0,0,3832928}; +VP(0.05,0.27999913,0){0,0,405592.69,0,0,-1199043.3,0,0,1940077.6,0,0,-2596308.7,0,0,3139108.2}; +VP(0.05,0.28999907,0){0,0,203104.02,0,0,-607063.77,0,0,1004310.4,0,0,-1390455.9,0,0,1761206}; +VP(0.05,0.299999,0){0,0,20.358382,0,0,-61.109432,0,0,101.96355,0,0,-142.98836,0,0,184.2584}; + +VP(0.0599998,1e-06,0){0,0,3690588.4,0,0,3690594.1,0,0,3690600.5,0,0,3690636.8,0,0,3690680.2}; +VP(0.0599998,0.010000933,0){0,0,3685584.9,0,0,3645126.5,0,0,3564649.5,0,0,3445067.6,0,0,3287702}; +VP(0.0599998,0.020000867,0){0,0,3670339.3,0,0,3509847.2,0,0,3195872,0,0,2742162.2,0,0,2168469.5}; +VP(0.0599998,0.0300008,0){0,0,3645265.4,0,0,3288523.2,0,0,2610025.4,0,0,1676315.4,0,0,578890.16}; +VP(0.0599998,0.040000733,0){0,0,3610072.7,0,0,2985916.8,0,0,1845500.4,0,0,385975.87,0,0,-1140557.6}; +VP(0.0599998,0.050000667,0){0,0,3564932.8,0,0,2609563.8,0,0,954567.28,0,0,-956764.73,0,0,-2612108.6}; +VP(0.0599998,0.0600006,0){0,0,3509883.5,0,0,2169100.8,0,0,-294.39187,0,0,-2169556.7,0,0,-3509772.8}; +VP(0.0599998,0.070000533,0){0,0,3445521.6,0,0,1675462,0,0,-955345.58,0,0,-3095407.5,0,0,-3645237}; +VP(0.0599998,0.080000467,0){0,0,3371542.1,0,0,1140096.9,0,0,-1845826.2,0,0,-3610004.7,0,0,-2985003.9}; +VP(0.0599998,0.0900004,0){0,0,3288201,0,0,577167.05,0,0,-2609684.2,0,0,-3644941.6,0,0,-1675304}; +VP(0.0599998,0.10000033,0){0,0,3196255,0,0,-266.67806,0,0,-3196667.6,0,0,-3195888.6,0,0,1895.9665}; +VP(0.0599998,0.11000027,0){0,0,3095213.4,0,0,-577563.51,0,0,-3564996.6,0,0,-2321862.4,0,0,1676966}; +VP(0.0599998,0.1200002,0){0,0,2985745.7,0,0,-1140533.3,0,0,-3690547,0,0,-1140417.7,0,0,2985531.4}; +VP(0.0599998,0.13000013,0){0,0,2868135,0,0,-1675511.4,0,0,-3564775.9,0,0,193668.06,0,0,3645303.7}; +VP(0.0599998,0.14000007,0){0,0,2742731.7,0,0,-2169340.9,0,0,-3196135,0,0,1501116.1,0,0,3509766.4}; +VP(0.0599998,0.15,0){0,0,2609657.8,0,0,-2609701.8,0,0,-2609700.4,0,0,2609527.5,0,0,2610132.1}; +VP(0.0599998,0.15999993,0){0,0,2469577.5,0,0,-2985824.1,0,0,-1845633.7,0,0,3371429.8,0,0,1142123}; +VP(0.0599998,0.16999987,0){0,0,2322691.7,0,0,-3288363,0,0,-955637.58,0,0,3685705.9,0,0,-576298.25}; +VP(0.0599998,0.1799998,0){0,0,2169321.2,0,0,-3510087.5,0,0,216.20285,0,0,3509911.2,0,0,-2169952.5}; +VP(0.0599998,0.18999973,0){0,0,2010122.2,0,0,-3645257.3,0,0,955123.64,0,0,2868380.8,0,0,-3288529.5}; +VP(0.0599998,0.19999967,0){0,0,1845424.5,0,0,-3690692.7,0,0,1844767.2,0,0,1846485.8,0,0,-3690994.8}; +VP(0.0599998,0.2099996,0){0,0,1675514.1,0,0,-3645174.5,0,0,2609662.4,0,0,577237.71,0,0,-3288394.8}; +VP(0.0599998,0.21999953,0){0,0,1501136.6,0,0,-3510009.9,0,0,3196091.5,0,0,-767114.35,0,0,-2169373.8}; +VP(0.0599998,0.22999947,0){0,0,1322529.6,0,0,-3288249.1,0,0,3564963.2,0,0,-2010624.3,0,0,-576282.31}; +VP(0.0599998,0.2399994,0){0,0,1140476.2,0,0,-2985787.6,0,0,3690602.4,0,0,-2985686.8,0,0,1140031.4}; +VP(0.0599998,0.24999933,0){0,0,955300.73,0,0,-2609900.4,0,0,3565088.7,0,0,-3564807.1,0,0,2609057.9}; +VP(0.0599998,0.25999927,0){0,0,767278.73,0,0,-2169195.9,0,0,3196149.1,0,0,-3670645.8,0,0,3510558.2}; +VP(0.0599998,0.2699992,0){0,0,577333.05,0,0,-1675470.1,0,0,2609593.5,0,0,-3288335.9,0,0,3645415}; +VP(0.0599998,0.27999913,0){0,0,385693.71,0,0,-1140199.5,0,0,1844814.4,0,0,-2468724.5,0,0,2984639.7}; +VP(0.0599998,0.28999907,0){0,0,193213.14,0,0,-577508.25,0,0,955436.41,0,0,-1322824.6,0,0,1675692.8}; +VP(0.0599998,0.299999,0){0,0,19.283606,0,0,-57.905204,0,0,96.689606,0,0,-135.74246,0,0,175.18876}; + +VP(0.0699996,1e-06,0){0,0,3139667.6,0,0,3139665.7,0,0,3139654,0,0,3139650.6,0,0,3139470.9}; +VP(0.0699996,0.010000933,0){0,0,3135125.8,0,0,3100793.8,0,0,3032495.7,0,0,2930991.9,0,0,2797379}; +VP(0.0699996,0.020000867,0){0,0,3122310.7,0,0,2985675.5,0,0,2718374.1,0,0,2332119.2,0,0,1843762.7}; +VP(0.0699996,0.0300008,0){0,0,3100693,0,0,2797093.6,0,0,2219652.4,0,0,1424992.4,0,0,490900.05}; +VP(0.0699996,0.040000733,0){0,0,3070823,0,0,2539797.2,0,0,1569564.7,0,0,327908.52,0,0,-970491.93}; +VP(0.0699996,0.050000667,0){0,0,3032468.4,0,0,2219799.1,0,0,812200.29,0,0,-813120.94,0,0,-2220596.8}; +VP(0.0699996,0.0600006,0){0,0,2985875.8,0,0,1845377.2,0,0,-26.355008,0,0,-1845513.3,0,0,-2986315.5}; +VP(0.0699996,0.070000533,0){0,0,2931046.3,0,0,1425283.6,0,0,-812900.53,0,0,-2633729.7,0,0,-3101410.7}; +VP(0.0699996,0.080000467,0){0,0,2868112.6,0,0,970159.55,0,0,-1569836.3,0,0,-3071130.7,0,0,-2540487.8}; +VP(0.0699996,0.0900004,0){0,0,2797210.7,0,0,490941.67,0,0,-2219930.9,0,0,-3100375.4,0,0,-1424891.3}; +VP(0.0699996,0.10000033,0){0,0,2718885.1,0,0,-182.57461,0,0,-2719058.7,0,0,-2718531.8,0,0,941.97383}; +VP(0.0699996,0.11000027,0){0,0,2632913.9,0,0,-491153,0,0,-3032434.9,0,0,-1975629.9,0,0,1425271.2}; +VP(0.0699996,0.1200002,0){0,0,2539899.6,0,0,-970217.44,0,0,-3139555.4,0,0,-970209.87,0,0,2540083.9}; +VP(0.0699996,0.13000013,0){0,0,2439510.8,0,0,-1425266,0,0,-3031770.5,0,0,164758.65,0,0,3099617.8}; +VP(0.0699996,0.14000007,0){0,0,2332905.6,0,0,-1845309.2,0,0,-2718594,0,0,1277417,0,0,2985507.9}; +VP(0.0699996,0.15,0){0,0,2219941.4,0,0,-2219958.1,0,0,-2219904.1,0,0,2219980.5,0,0,2219784.8}; +VP(0.0699996,0.15999993,0){0,0,2100779.8,0,0,-2539856.5,0,0,-1570056.5,0,0,2867818.8,0,0,971425.75}; +VP(0.0699996,0.16999987,0){0,0,1975781.8,0,0,-2797264.2,0,0,-812705.41,0,0,3135157.1,0,0,-490750.14}; +VP(0.0699996,0.1799998,0){0,0,1845356.9,0,0,-2985850.3,0,0,78.136475,0,0,2985657.3,0,0,-1845159.5}; +VP(0.0699996,0.18999973,0){0,0,1709803.1,0,0,-3100588.9,0,0,812407.05,0,0,2439581.7,0,0,-2797000.3}; +VP(0.0699996,0.19999967,0){0,0,1569746.1,0,0,-3139424.2,0,0,1569485.9,0,0,1570117.5,0,0,-3139429.6}; +VP(0.0699996,0.2099996,0){0,0,1425263.5,0,0,-3100589,0,0,2219581.7,0,0,490836.14,0,0,-2795721.5}; +VP(0.0699996,0.21999953,0){0,0,1277056.4,0,0,-2985909.1,0,0,2718460.4,0,0,-651766.98,0,0,-1846051.6}; +VP(0.0699996,0.22999947,0){0,0,1125152.1,0,0,-2797513.7,0,0,3032908.3,0,0,-1710337.8,0,0,-490994.33}; +VP(0.0699996,0.2399994,0){0,0,970112.98,0,0,-2539826.8,0,0,3139496.3,0,0,-2539996.3,0,0,970367.78}; +VP(0.0699996,0.24999933,0){0,0,812572.07,0,0,-2220016.4,0,0,3032735.9,0,0,-3033096.1,0,0,2221151.5}; +VP(0.0699996,0.25999927,0){0,0,652805.93,0,0,-1845499.8,0,0,2718972.8,0,0,-3122098.8,0,0,2985084.7}; +VP(0.0699996,0.2699992,0){0,0,491084.34,0,0,-1425170.4,0,0,2219732.5,0,0,-2796996.6,0,0,3100323.4}; +VP(0.0699996,0.27999913,0){0,0,328256.73,0,0,-970421.4,0,0,1570170.2,0,0,-2101272.7,0,0,2540471.6}; +VP(0.0699996,0.28999907,0){0,0,164340.78,0,0,-491233.16,0,0,812780.8,0,0,-1125482,0,0,1426000.8}; +VP(0.0699996,0.299999,0){0,0,16.421384,0,0,-49.30993,0,0,82.335561,0,0,-115.58739,0,0,149.15898}; + +VP(0.0799994,1e-06,0){0,0,2280727.8,0,0,2280773.4,0,0,2280859.1,0,0,2280998.1,0,0,2281181.3}; +VP(0.0799994,0.010000933,0){0,0,2278135,0,0,2253241,0,0,2203682.2,0,0,2129941.2,0,0,2032549}; +VP(0.0799994,0.020000867,0){0,0,2268484.2,0,0,2169326.1,0,0,1975330.1,0,0,1694973.6,0,0,1340374.1}; +VP(0.0799994,0.0300008,0){0,0,2252922.6,0,0,2032386.7,0,0,1612868.3,0,0,1035393.9,0,0,356377.56}; +VP(0.0799994,0.040000733,0){0,0,2231419.5,0,0,1845768.6,0,0,1141095.2,0,0,239142.92,0,0,-704394.97}; +VP(0.0799994,0.050000667,0){0,0,2203162.8,0,0,1612856.7,0,0,590370.34,0,0,-590352.65,0,0,-1612864.9}; +VP(0.0799994,0.0600006,0){0,0,2169276.5,0,0,1340623.4,0,0,-76.71712,0,0,-1340625.6,0,0,-2168934.4}; +VP(0.0799994,0.070000533,0){0,0,2129506.4,0,0,1035589.6,0,0,-590316.24,0,0,-1913067.2,0,0,-2253364}; +VP(0.0799994,0.080000467,0){0,0,2084053.6,0,0,704937.17,0,0,-1140774.2,0,0,-2231740.4,0,0,-1845983.4}; +VP(0.0799994,0.0900004,0){0,0,2032426.1,0,0,356710.38,0,0,-1613120.2,0,0,-2253001.3,0,0,-1035367.5}; +VP(0.0799994,0.10000033,0){0,0,1975085.9,0,0,113.85229,0,0,-1974864.7,0,0,-1975020.8,0,0,-380.74858}; +VP(0.0799994,0.11000027,0){0,0,1913349,0,0,-357029.9,0,0,-2203984,0,0,-1435642.7,0,0,1036881.6}; +VP(0.0799994,0.1200002,0){0,0,1845350.6,0,0,-704873.21,0,0,-2281043.5,0,0,-704842.32,0,0,1845655.7}; +VP(0.0799994,0.13000013,0){0,0,1772745.6,0,0,-1035674.6,0,0,-2203648.2,0,0,119514.15,0,0,2254052.1}; +VP(0.0799994,0.14000007,0){0,0,1695180.1,0,0,-1340871,0,0,-1975338.9,0,0,927997.64,0,0,2169093.9}; +VP(0.0799994,0.15,0){0,0,1612825.4,0,0,-1612841.3,0,0,-1612543.8,0,0,1612521.2,0,0,1612058.3}; +VP(0.0799994,0.15999993,0){0,0,1526244.9,0,0,-1845398.3,0,0,-1140637.4,0,0,2084384,0,0,705209.01}; +VP(0.0799994,0.16999987,0){0,0,1435410.5,0,0,-2032217.3,0,0,-590458.98,0,0,2277698.2,0,0,-356556.54}; +VP(0.0799994,0.1799998,0){0,0,1340670.5,0,0,-2169027.1,0,0,-223.59127,0,0,2168584.1,0,0,-1339615}; +VP(0.0799994,0.18999973,0){0,0,1242273.6,0,0,-2252837.9,0,0,590435.56,0,0,1772500.8,0,0,-2032749.8}; +VP(0.0799994,0.19999967,0){0,0,1140442.6,0,0,-2280848.8,0,0,1140564.8,0,0,1139836,0,0,-2280532.3}; +VP(0.0799994,0.2099996,0){0,0,1035699,0,0,-2253241.8,0,0,1613083.8,0,0,357223.09,0,0,-2033463.9}; +VP(0.0799994,0.21999953,0){0,0,927861.35,0,0,-2169623.2,0,0,1975708.5,0,0,-474255.42,0,0,-1341466.6}; +VP(0.0799994,0.22999947,0){0,0,817383.1,0,0,-2032235.4,0,0,2203103.3,0,0,-1242264.5,0,0,-356700.4}; +VP(0.0799994,0.2399994,0){0,0,704847.79,0,0,-1845370.9,0,0,2281143.2,0,0,-1845622.6,0,0,705007.92}; +VP(0.0799994,0.24999933,0){0,0,590342.97,0,0,-1612830.2,0,0,2203126.1,0,0,-2203043.7,0,0,1612498.1}; +VP(0.0799994,0.25999927,0){0,0,474296.31,0,0,-1340926,0,0,1975847.2,0,0,-2269363.4,0,0,2170870.5}; +VP(0.0799994,0.2699992,0){0,0,356851.6,0,0,-1035659.4,0,0,1613192.7,0,0,-2032947.5,0,0,2253814.8}; +VP(0.0799994,0.27999913,0){0,0,238450.24,0,0,-704928.49,0,0,1140598.6,0,0,-1526410.3,0,0,1845458.3}; +VP(0.0799994,0.28999907,0){0,0,119436.21,0,0,-357043.47,0,0,590866.78,0,0,-818411.64,0,0,1037160.2}; +VP(0.0799994,0.299999,0){0,0,11.922335,0,0,-35.808474,0,0,59.818323,0,0,-84.031,0,0,108.55653}; + +VP(0.0899992,1e-06,0){0,0,1199336.2,0,0,1199315.5,0,0,1199270.6,0,0,1199207.1,0,0,1199061.5}; +VP(0.0899992,0.010000933,0){0,0,1198153.6,0,0,1185145.9,0,0,1159246.6,0,0,1120701.4,0,0,1069776.6}; +VP(0.0899992,0.020000867,0){0,0,1192685.5,0,0,1140658.7,0,0,1038853.3,0,0,891683.02,0,0,705546.96}; +VP(0.0899992,0.0300008,0){0,0,1184754.2,0,0,1068843,0,0,848337.39,0,0,544778.53,0,0,187690.61}; +VP(0.0899992,0.040000733,0){0,0,1173715.6,0,0,970816.17,0,0,600039.89,0,0,125399.4,0,0,-371189.8}; +VP(0.0899992,0.050000667,0){0,0,1158276.9,0,0,847929.79,0,0,310324.29,0,0,-310562.7,0,0,-848307.62}; +VP(0.0899992,0.0600006,0){0,0,1140753.9,0,0,704922.14,0,0,-103.62936,0,0,-704829.95,0,0,-1139930.4}; +VP(0.0899992,0.070000533,0){0,0,1119714.7,0,0,544556.53,0,0,-310359.94,0,0,-1005943.5,0,0,-1184994.4}; +VP(0.0899992,0.080000467,0){0,0,1095985,0,0,370759.25,0,0,-600042.12,0,0,-1174023.1,0,0,-970761.2}; +VP(0.0899992,0.0900004,0){0,0,1068224.2,0,0,187464.52,0,0,-848034.87,0,0,-1184473.1,0,0,-543987.2}; +VP(0.0899992,0.10000033,0){0,0,1038500.2,0,0,-7.3678079,0,0,-1038769.7,0,0,-1039036.9,0,0,19.416784}; +VP(0.0899992,0.11000027,0){0,0,1006231.9,0,0,-187640.38,0,0,-1158657.2,0,0,-754841.71,0,0,544327.53}; +VP(0.0899992,0.1200002,0){0,0,970113.93,0,0,-370546.78,0,0,-1199019.8,0,0,-370452.42,0,0,969904.3}; +VP(0.0899992,0.13000013,0){0,0,932207.72,0,0,-544547.54,0,0,-1158917.9,0,0,62512.542,0,0,1185501.3}; +VP(0.0899992,0.14000007,0){0,0,891166.13,0,0,-704795.35,0,0,-1038385.7,0,0,487616.78,0,0,1140014.7}; +VP(0.0899992,0.15,0){0,0,848172.12,0,0,-848217.89,0,0,-847844.69,0,0,847957.13,0,0,847385.47}; +VP(0.0899992,0.15999993,0){0,0,802382.91,0,0,-970181.38,0,0,-599616,0,0,1095765.8,0,0,370693.9}; +VP(0.0899992,0.16999987,0){0,0,754932.06,0,0,-1069114.5,0,0,-310447.26,0,0,1199326.7,0,0,-188765.22}; +VP(0.0899992,0.1799998,0){0,0,704958.68,0,0,-1140556,0,0,-248.65236,0,0,1140833,0,0,-704695.97}; +VP(0.0899992,0.18999973,0){0,0,653304.28,0,0,-1184754,0,0,310423.05,0,0,932308.32,0,0,-1068648.6}; +VP(0.0899992,0.19999967,0){0,0,599602.09,0,0,-1199224.6,0,0,599650.17,0,0,599621.62,0,0,-1199377.5}; +VP(0.0899992,0.2099996,0){0,0,544463.23,0,0,-1184405,0,0,847712.47,0,0,187819.44,0,0,-1068128.6}; +VP(0.0899992,0.21999953,0){0,0,488042.66,0,0,-1141175.6,0,0,1039086.6,0,0,-249151.79,0,0,-706017.92}; +VP(0.0899992,0.22999947,0){0,0,429815.99,0,0,-1068649,0,0,1158547.7,0,0,-653406.34,0,0,-187225.04}; +VP(0.0899992,0.2399994,0){0,0,370690.77,0,0,-970386.82,0,0,1199251.8,0,0,-970007.4,0,0,370681.55}; +VP(0.0899992,0.24999933,0){0,0,310390.11,0,0,-848004.17,0,0,1158394,0,0,-1158345.1,0,0,847660.27}; +VP(0.0899992,0.25999927,0){0,0,249481.19,0,0,-705373.73,0,0,1039488.2,0,0,-1194110.6,0,0,1142537.4}; +VP(0.0899992,0.2699992,0){0,0,187639.98,0,0,-544577.4,0,0,848281.6,0,0,-1069054.9,0,0,1185439.9}; +VP(0.0899992,0.27999913,0){0,0,125326.47,0,0,-370529.74,0,0,599621.01,0,0,-802628.46,0,0,970771.43}; +VP(0.0899992,0.28999907,0){0,0,62802.689,0,0,-187757.37,0,0,310765.55,0,0,-430542.75,0,0,545801.11}; +VP(0.0899992,0.299999,0){0,0,6.2583854,0,0,-18.797492,0,0,31.403123,0,0,-44.11748,0,0,56.993715}; + +VP(0.099999,1e-06,0){0,0,122.2717,0,0,122.22832,0,0,122.14101,0,0,122.01002,0,0,121.86309}; +VP(0.099999,0.010000933,0){0,0,122.46834,0,0,121.03483,0,0,118.188,0,0,113.96935,0,0,108.45126}; +VP(0.099999,0.020000867,0){0,0,121.65209,0,0,116.30315,0,0,105.84466,0,0,90.745939,0,0,71.692521}; +VP(0.099999,0.0300008,0){0,0,120.92677,0,0,109.03403,0,0,86.442932,0,0,55.42058,0,0,19.030381}; +VP(0.099999,0.040000733,0){0,0,119.81359,0,0,99.026732,0,0,61.114881,0,0,12.749458,0,0,-37.607293}; +VP(0.099999,0.050000667,0){0,0,118.01358,0,0,86.395547,0,0,31.616736,0,0,-31.666664,0,0,-86.534566}; +VP(0.099999,0.0600006,0){0,0,116.54411,0,0,71.981358,0,0,-0.080387563,0,0,-72.054845,0,0,-116.34883}; +VP(0.099999,0.070000533,0){0,0,113.96494,0,0,55.410296,0,0,-31.568102,0,0,-102.23279,0,0,-120.27103}; +VP(0.099999,0.080000467,0){0,0,111.95143,0,0,37.861744,0,0,-61.14624,0,0,-119.46009,0,0,-98.614086}; +VP(0.099999,0.0900004,0){0,0,109.0775,0,0,19.117811,0,0,-86.499053,0,0,-120.62539,0,0,-55.236718}; +VP(0.099999,0.10000033,0){0,0,105.77638,0,0,0.00038661946,0,0,-105.70057,0,0,-105.62659,0,0,-0.051360586}; +VP(0.099999,0.11000027,0){0,0,102.7882,0,0,-19.209807,0,0,-118.33606,0,0,-76.968209,0,0,55.676392}; +VP(0.099999,0.1200002,0){0,0,98.846941,0,0,-37.738544,0,0,-122.08846,0,0,-37.705367,0,0,98.674581}; +VP(0.099999,0.13000013,0){0,0,95.300608,0,0,-55.682035,0,0,-118.32145,0,0,6.458813,0,0,120.72836}; +VP(0.099999,0.14000007,0){0,0,90.928246,0,0,-71.860492,0,0,-105.76253,0,0,49.552905,0,0,115.61076}; +VP(0.099999,0.15,0){0,0,86.649422,0,0,-86.706263,0,0,-86.885509,0,0,87.051255,0,0,87.455122}; +VP(0.099999,0.15999993,0){0,0,81.849309,0,0,-98.902526,0,0,-61.030293,0,0,111.30685,0,0,37.639146}; +VP(0.099999,0.16999987,0){0,0,77.088885,0,0,-109.08576,0,0,-31.684924,0,0,122.02127,0,0,-19.059934}; +VP(0.099999,0.1799998,0){0,0,71.759796,0,0,-116.12022,0,0,0.019236055,0,0,116.11968,0,0,-71.659577}; +VP(0.099999,0.18999973,0){0,0,66.548862,0,0,-120.64907,0,0,31.583707,0,0,94.841601,0,0,-108.58648}; +VP(0.099999,0.19999967,0){0,0,61.196684,0,0,-122.402,0,0,61.194661,0,0,61.284233,0,0,-122.59119}; +VP(0.099999,0.2099996,0){0,0,55.531956,0,0,-120.7904,0,0,86.420086,0,0,19.214407,0,0,-108.928}; +VP(0.099999,0.21999953,0){0,0,49.83612,0,0,-116.47011,0,0,105.95411,0,0,-25.423519,0,0,-71.555205}; +VP(0.099999,0.22999947,0){0,0,43.75017,0,0,-108.75091,0,0,117.84066,0,0,-66.39418,0,0,-19.092177}; +VP(0.099999,0.2399994,0){0,0,37.88541,0,0,-99.152242,0,0,122.47173,0,0,-98.953555,0,0,37.716317}; +VP(0.099999,0.24999933,0){0,0,31.620091,0,0,-86.395681,0,0,118.04104,0,0,-118.0743,0,0,86.383089}; +VP(0.099999,0.25999927,0){0,0,25.461477,0,0,-71.929935,0,0,105.82597,0,0,-121.26089,0,0,115.61847}; +VP(0.099999,0.2699992,0){0,0,19.15621,0,0,-55.565276,0,0,86.458221,0,0,-108.78237,0,0,120.35713}; +VP(0.099999,0.27999913,0){0,0,12.779823,0,0,-37.770607,0,0,61.080654,0,0,-81.673399,0,0,98.626637}; +VP(0.099999,0.28999907,0){0,0,6.4118062,0,0,-19.149794,0,0,31.63223,0,0,-43.692585,0,0,55.184315}; +VP(0.099999,0.299999,0){0,0,0.00063643529,0,0,-0.0019081723,0,0,0.0031765239,0,0,-0.0044392302,0,0,0.0056895141}; + +}; diff --git a/demos/view03.pos b/demos/view03.pos new file mode 100644 index 0000000000000000000000000000000000000000..3d2ddb6ef5ed35b975d82d45d7d04be343237073 --- /dev/null +++ b/demos/view03.pos @@ -0,0 +1,1284 @@ +/* + Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle + + Vector map on triangles + + All important comments are marked with "README" +*/ + +View "And another vector map..." { +VT(0.079090117,0.19794942,0,0.06966854,0.20076802,0,0.071449289,0.19423207,0){0,0,1206859.6,0,0,1570520.4,0,0,1594804.6,0,0,-2368529.7,0,0,-3162888.4,0,0,-3019964.8,0,0,1073015.3,0,0,1636334.6,0,0,1103926.4,0,0,1335740.9,0,0,1503948.1,0,0,2033518.7,0,0,-2359414.1,0,0,-3161601.9,0,0,-2921575.1}; +VT(0.056317057,0.058022103,0,0.045416206,0.061541227,0,0.048663579,0.053435419,0){0,0,3630316.8,0,0,3642820.9,0,0,3726394.8,0,0,2330872.5,0,0,2181474.8,0,0,2589713.3,0,0,197001.66,0,0,-155055.51,0,0,663071.82,0,0,-2007682.1,0,0,-2429600.5,0,0,-1465861.1,0,0,-3494460.7,0,0,-3730025.8,0,0,-3147918.6}; +VT(0.052494391,0.065958781,0,0.045416206,0.061541227,0,0.056317057,0.058022103,0){0,0,3640248,0,0,3642820.9,0,0,3630316.8,0,0,1971511.2,0,0,2181474.8,0,0,2330872.5,0,0,-601016.65,0,0,-155055.51,0,0,197001.66,0,0,-2898090,0,0,-2429600.5,0,0,-2007682.1,0,0,-3866942,0,0,-3730025.8,0,0,-3494460.7}; +VT(0.089437553,0.21298247,0,0.093706234,0.20596864,0,0.1,0.21428571,0){0,0,556322.48,0,0,360320.46,0,0,0,0,0,-1238115.4,0,0,-758974.46,0,0,0,0,0,961021.23,0,0,479351.87,0,0,0,0,0,60411.18,0,0,228803.73,0,0,0,0,0,-1035404.3,0,0,-732939.79,0,0,0}; +VT(0,0.021428571,0,0.0084994266,0.025462386,0,0,0.028571429,0){0,0,0,0,0,1014895.2,0,0,0,0,0,0,0,0,943121.65,0,0,0,0,0,0,0,0,804669.5,0,0,0,0,0,0,0,0,609367.99,0,0,0,0,0,0,0,0,370926.59,0,0,0}; +VT(0,0.27142857,0,0.0087746229,0.27470702,0,0,0.27857143,0){0,0,0,0,0,139476.7,0,0,0,0,0,0,0,0,-408686.72,0,0,0,0,0,0,0,0,649356.33,0,0,0,0,0,0,0,0,-844695.79,0,0,0,0,0,0,0,0,980930.37,0,0,0}; +VT(0.064352171,0.083117586,0,0.058212185,0.089881183,0,0.054828578,0.081464579,0){0,0,3167194.8,0,0,3344291.6,0,0,3492382.6,0,0,915483.69,0,0,593905.21,0,0,1101278.5,0,0,-1987167.2,0,0,-2645013.4,0,0,-2043909.2,0,0,-3477240.4,0,0,-3708817.1,0,0,-3789901.6,0,0,-2495770,0,0,-1722713.3,0,0,-2941538.5}; +VT(0.043491003,0.26677795,0,0.04563604,0.25694979,0,0.0528723,0.26429657,0){0,0,657627.62,0,0,859240.08,0,0,718299.05,0,0,-1894105.9,0,0,-2406042.8,0,0,-2055661.9,0,0,2903724.9,0,0,3472131.8,0,0,3109067.1,0,0,-3565612.1,0,0,-3844488.4,0,0,-3733060,0,0,3800401.2,0,0,3448330.3,0,0,3841282.5}; +VT(0.0528723,0.26429657,0,0.04563604,0.25694979,0,0.054010827,0.25507988,0){0,0,718299.05,0,0,859240.08,0,0,897184.36,0,0,-2055661.9,0,0,-2406042.8,0,0,-2496661.6,0,0,3109067.1,0,0,3472131.8,0,0,3553831.7,0,0,-3733060,0,0,-3844488.4,0,0,-3839088.9,0,0,3841282.5,0,0,3448330.3,0,0,3290330.5}; +VT(0.052748817,0.036292023,0,0.046341114,0.044942776,0,0.043838979,0.034579424,0){0,0,3796611.1,0,0,3748809.1,0,0,3745913.7,0,0,3254886.9,0,0,2933624.2,0,0,3260141.4,0,0,2248728.5,0,0,1480431.3,0,0,2351583.2,0,0,921690.78,0,0,-294933.53,0,0,1138042.7,0,0,-537197.11,0,0,-2006921.6,0,0,-223347.31}; +VT(0.054794838,0.043915046,0,0.046341114,0.044942776,0,0.052748817,0.036292023,0){0,0,3735662.6,0,0,3748809.1,0,0,3796611.1,0,0,2959425,0,0,2933624.2,0,0,3254886.9,0,0,1568238.5,0,0,1480431.3,0,0,2248728.5,0,0,-148813.91,0,0,-294933.53,0,0,921690.78,0,0,-1835117.4,0,0,-2006921.6,0,0,-537197.11}; +VT(0.064795861,0.023107998,0,0.057612168,0.01845715,0,0.064075209,0.013493001,0){0,0,3443592.1,0,0,3752599.8,0,0,3498581.2,0,0,3242943.8,0,0,3612875.5,0,0,3428890.3,0,0,2853338,0,0,3338613.5,0,0,3290906.4,0,0,2297494.4,0,0,2940029.2,0,0,3087427.7,0,0,1607540.9,0,0,2431782.4,0,0,2822154}; +VT(0.08812606,0.087328167,0,0.091953893,0.078440357,0,0.1,0.085714286,0){0,0,1269155.7,0,0,889726.23,0,0,0,0,0,279658.57,0,0,322434.75,0,0,0,0,0,-927894.68,0,0,-450550.32,0,0,0,0,0,-1412053.3,0,0,-936443.15,0,0,0,0,0,-795447.99,0,0,-825354.72,0,0,0}; +VT(0.1,0.21428571,0,0.091864029,0.22106993,0,0.089437553,0.21298247,0){0,0,0,0,0,394005.54,0,0,556322.48,0,0,0,0,0,-927852.61,0,0,-1238115.4,0,0,0,0,0,863120.02,0,0,961021.23,0,0,0,0,0,-241435.16,0,0,60411.18,0,0,0,0,0,-536498.87,0,0,-1035404.3}; +VT(0.091758141,0.11296708,0,0.08466046,0.11619385,0,0.082583958,0.10907049,0){0,0,824791.32,0,0,1475783,0,0,1698614.9,0,0,-201020.76,0,0,-452604.25,0,0,-286603.09,0,0,-976886.6,0,0,-1789662.1,0,0,-1936849,0,0,-537824.26,0,0,-788262.21,0,0,-1323464.6,0,0,570097.26,0,0,1243195.1,0,0,836522.31}; +VT(0.046341114,0.044942776,0,0.053426379,0.049768916,0,0.048663579,0.053435419,0){0,0,3748809.1,0,0,3727873.1,0,0,3726394.8,0,0,2933624.2,0,0,2738031.5,0,0,2589713.3,0,0,1480431.3,0,0,1021148,0,0,663071.82,0,0,-294933.53,0,0,-966926.63,0,0,-1465861.1,0,0,-2006921.6,0,0,-2698501,0,0,-3147918.6}; +VT(0.08596482,0.28314521,0,0.082516133,0.27647665,0,0.089232651,0.27618677,0){0,0,145967.81,0,0,248899.48,0,0,160151.6,0,0,-433371.98,0,0,-731674.12,0,0,-470555.02,0,0,707326.96,0,0,1170289.2,0,0,751874.95,0,0,-959333.22,0,0,-1538273.3,0,0,-986723.61,0,0,1181452.3,0,0,1813237.5,0,0,1160401.4}; +VT(0.089183466,0.023798504,0,0.082332164,0.023444943,0,0.085905658,0.016824409,0){0,0,1283383.3,0,0,2029600,0,0,1656238,0,0,1204105.7,0,0,1907886.4,0,0,1604967.9,0,0,1050439.6,0,0,1671751.1,0,0,1504009.2,0,0,831874.08,0,0,1335359.8,0,0,1356492.3,0,0,561630.79,0,0,918760.81,0,0,1166855}; +VT(0.051013063,0.11801667,0,0.052058531,0.12554764,0,0.045375723,0.12284566,0){0,0,3161388.4,0,0,3065498.6,0,0,3072436,0,0,-1083065.4,0,0,-1512626.5,0,0,-1348503.3,0,0,-3873486.3,0,0,-3831818,0,0,-3829159.4,0,0,-1463412.7,0,0,-428428.64,0,0,-800055.99,0,0,2911579,0,0,3614977.4,0,0,3380414.3}; +VT(0.076938259,0.060604721,0,0.080938662,0.054906318,0,0.08415119,0.061061125,0){0,0,2443533.2,0,0,2097661.4,0,0,1759442.9,0,0,1491930.8,0,0,1423084,0,0,1064240.3,0,0,-40674.57,0,0,290856.94,0,0,-51487.645,0,0,-1557435.8,0,0,-934922.56,0,0,-1146904.2,0,0,-2468002.6,0,0,-1860365.1,0,0,-1789550.6}; +VT(0.027903545,0.087518505,0,0.025411973,0.082310594,0,0.032911969,0.081185013,0){0,0,2674848,0,0,2525130.6,0,0,3037931.3,0,0,580994.77,0,0,762374.09,0,0,971274.35,0,0,-1967676.8,0,0,-1532614.6,0,0,-1756226.8,0,0,-2976106,0,0,-2757779.1,0,0,-3289165.4,0,0,-1655065.1,0,0,-2058136.4,0,0,-2584916.3}; +VT(0.045116599,0.21481108,0,0.053910411,0.21448753,0,0.049797208,0.2214244,0){0,0,1654487.5,0,0,1667429.4,0,0,1551864.2,0,0,-3731787.4,0,0,-3752161.8,0,0,-3662861.4,0,0,3030991.5,0,0,3023771,0,0,3430735.4,0,0,-73694.316,0,0,-28239.212,0,0,-1003918.8,0,0,-2938909.4,0,0,-2988983.1,0,0,-2065424.5}; +VT(0.064795861,0.023107998,0,0.057707972,0.025075094,0,0.057612168,0.01845715,0){0,0,3443592.1,0,0,3734947.8,0,0,3752599.8,0,0,3242943.8,0,0,3478918.2,0,0,3612875.5,0,0,2853338,0,0,2984396.6,0,0,3338613.5,0,0,2297494.4,0,0,2285289.9,0,0,2940029.2,0,0,1607540.9,0,0,1429238.8,0,0,2431782.4}; +VT(0.0093450955,0.28843768,0,0.0045473776,0.2936365,0,0,0.28571429,0){0,0,67949.514,0,0,18406.211,0,0,0,0,0,-202850.84,0,0,-55138.333,0,0,0,0,0,334776.34,0,0,91630.552,0,0,0,0,0,-461793.67,0,0,-127724.83,0,0,0,0,0,581935.08,0,0,162961.08,0,0,0}; +VT(0.1,0.13571429,0,0.093938974,0.13899,0,0.0910478,0.13167545,0){0,0,0,0,0,548364.78,0,0,831136.87,0,0,0,0,0,-422206.84,0,0,-514132.23,0,0,0,0,0,-645591.08,0,0,-1027305.8,0,0,0,0,0,273728.87,0,0,122313.64,0,0,0,0,0,708600.91,0,0,1073956.7}; +VT(0,0.014285714,0,0.0045481906,0.0063920675,0,0.0093389246,0.011691623,0){0,0,0,0,0,552257.15,0,0,1120186.5,0,0,0,0,0,549810.55,0,0,1103410.3,0,0,0,0,0,544927.47,0,0,1070108.3,0,0,0,0,0,537633.65,0,0,1020788.4,0,0,0,0,0,527798.54,0,0,956114.18}; +VT(0.085905658,0.016824409,0,0.093571257,0.018380777,0,0.089183466,0.023798504,0){0,0,1656238,0,0,774815.13,0,0,1283383.3,0,0,1604967.9,0,0,746204.54,0,0,1204105.7,0,0,1504009.2,0,0,690036.86,0,0,1050439.6,0,0,1356492.3,0,0,608388.09,0,0,831874.08,0,0,1166855,0,0,504051.02,0,0,561630.79}; +VT(0.089232651,0.27618677,0,0.093593186,0.28160993,0,0.08596482,0.28314521,0){0,0,160151.6,0,0,74588.283,0,0,145967.81,0,0,-470555.02,0,0,-221009.65,0,0,-433371.98,0,0,751874.95,0,0,359269.18,0,0,707326.96,0,0,-986723.61,0,0,-484261.41,0,0,-959333.22,0,0,1160401.4,0,0,591230.88,0,0,1181452.3}; +VT(0.015416139,0.018002698,0,0.006650898,0.018174199,0,0.0093389246,0.011691623,0){0,0,1798828.3,0,0,801243.34,0,0,1120186.5,0,0,1735136,0,0,772347.91,0,0,1103410.3,0,0,1609995.5,0,0,715593.27,0,0,1070108.3,0,0,1427830.3,0,0,633022.27,0,0,1020788.4,0,0,1194733.1,0,0,527557,0,0,956114.18}; +VT(0.0093450955,0.28843768,0,0.0067236406,0.28198319,0,0.015498485,0.28248556,0){0,0,67949.514,0,0,76627.274,0,0,166274.63,0,0,-202850.84,0,0,-227172.13,0,0,-493262.57,0,0,334776.34,0,0,369685.4,0,0,803759.61,0,0,-461793.67,0,0,-499127.77,0,0,-1087394.1,0,0,581935.08,0,0,610772.43,0,0,1334475.8}; +VT(0.048076401,0.17082416,0,0.048811039,0.17808485,0,0.041643161,0.17482395,0){0,0,2424680.5,0,0,2310715.6,0,0,2284160.6,0,0,-3473815.1,0,0,-3650410,0,0,-3458410.7,0,0,-921629.25,0,0,-194330.82,0,0,-506290.81,0,0,3872759.5,0,0,3763231.4,0,0,3718851.8,0,0,-754316.94,0,0,-1987755.8,0,0,-1405815.9}; +VT(0.041643161,0.17482395,0,0.048811039,0.17808485,0,0.043573225,0.18196099,0){0,0,2284160.6,0,0,2310715.6,0,0,2202933.2,0,0,-3458410.7,0,0,-3650410,0,0,-3650165.7,0,0,-506290.81,0,0,-194330.82,0,0,195066.32,0,0,3718851.8,0,0,3763231.4,0,0,3522129.2,0,0,-1405815.9,0,0,-1987755.8,0,0,-2509350}; +VT(0.020973714,0.16688371,0,0.021502186,0.15931359,0,0.029380008,0.16405835,0){0,0,1525118.3,0,0,1630158.4,0,0,2021292.5,0,0,-2061659.5,0,0,-1947614.2,0,0,-2614335.2,0,0,-799875.51,0,0,-1250943.8,0,0,-1254306.4,0,0,2343184.8,0,0,2191316.6,0,0,2982541.3,0,0,-24581.749,0,0,824223.66,0,0,378860.61}; +VT(0.075422073,0.20645372,0,0.06966854,0.20076802,0,0.079090117,0.19794942,0){0,0,1273700.5,0,0,1570520.4,0,0,1206859.6,0,0,-2693470,0,0,-3162888.4,0,0,-2368529.7,0,0,1728669,0,0,1636334.6,0,0,1073015.3,0,0,766631.5,0,0,1503948.1,0,0,1335740.9,0,0,-2583646.6,0,0,-3161601.9,0,0,-2359414.1}; +VT(0.077619244,0.18028791,0,0.077140734,0.17217741,0,0.085369203,0.17624497,0){0,0,1471797.4,0,0,1584233.7,0,0,1039089.6,0,0,-2389894.4,0,0,-2313491.7,0,0,-1603144.1,0,0,18944.546,0,0,-519338.58,0,0,-168940.91,0,0,2378251.6,0,0,2552719.3,0,0,1695116.9,0,0,-1502642.9,0,0,-655929.75,0,0,-751642.95}; +VT(0.0084994266,0.025462386,0,0.006650898,0.018174199,0,0.015416139,0.018002698,0){0,0,1014895.2,0,0,801243.34,0,0,1798828.3,0,0,943121.65,0,0,772347.91,0,0,1735136,0,0,804669.5,0,0,715593.27,0,0,1609995.5,0,0,609367.99,0,0,633022.27,0,0,1427830.3,0,0,370926.59,0,0,527557,0,0,1194733.1}; +VT(0.015498485,0.28248556,0,0.0067236406,0.28198319,0,0.0087746229,0.27470702,0){0,0,166274.63,0,0,76627.274,0,0,139476.7,0,0,-493262.57,0,0,-227172.13,0,0,-408686.72,0,0,803759.61,0,0,369685.4,0,0,649356.33,0,0,-1087394.1,0,0,-499127.77,0,0,-844695.79,0,0,1334475.8,0,0,610772.43,0,0,980930.37}; +VT(0.029380008,0.16405835,0,0.021502186,0.15931359,0,0.027609688,0.15620978,0){0,0,2021292.5,0,0,1630158.4,0,0,2023546.1,0,0,-2614335.2,0,0,-1947614.2,0,0,-2286520.9,0,0,-1254306.4,0,0,-1250943.8,0,0,-1726415,0,0,2982541.3,0,0,2191316.6,0,0,2510934.9,0,0,378860.61,0,0,824223.66,0,0,1400022.9}; +VT(0.0087746229,0.27470702,0,0.018422519,0.27450763,0,0.015498485,0.28248556,0){0,0,139476.7,0,0,282501.19,0,0,166274.63,0,0,-408686.72,0,0,-827496.14,0,0,-493262.57,0,0,649356.33,0,0,1313896,0,0,803759.61,0,0,-844695.79,0,0,-1707268.8,0,0,-1087394.1,0,0,980930.37,0,0,1979556.1,0,0,1334475.8}; +VT(0.014305262,0.26641769,0,0.018422519,0.27450763,0,0.0087746229,0.27470702,0){0,0,294901.31,0,0,282501.19,0,0,139476.7,0,0,-848621.76,0,0,-827496.14,0,0,-408686.72,0,0,1298521.9,0,0,1313896,0,0,649356.33,0,0,-1589572.3,0,0,-1707268.8,0,0,-844695.79,0,0,1686004.5,0,0,1979556.1,0,0,980930.37}; +VT(0.0084994266,0.025462386,0,0.016759526,0.025876157,0,0.014137494,0.034012185,0){0,0,1014895.2,0,0,1932221.9,0,0,1641076.4,0,0,943121.65,0,0,1791225.7,0,0,1435142,0,0,804669.5,0,0,1519509.7,0,0,1049094.4,0,0,609367.99,0,0,1136895.1,0,0,531342.12,0,0,370926.59,0,0,671081.1,0,0,-53364.585}; +VT(0.015416139,0.018002698,0,0.016759526,0.025876157,0,0.0084994266,0.025462386,0){0,0,1798828.3,0,0,1932221.9,0,0,1014895.2,0,0,1735136,0,0,1791225.7,0,0,943121.65,0,0,1609995.5,0,0,1519509.7,0,0,804669.5,0,0,1427830.3,0,0,1136895.1,0,0,609367.99,0,0,1194733.1,0,0,671081.1,0,0,370926.59}; +VT(0.025770754,0.10718168,0,0.032036001,0.10024616,0,0.034786476,0.1076516,0){0,0,2378738.7,0,0,2837469.6,0,0,2912738.3,0,0,-316264.13,0,0,-12660.65,0,0,-413135.58,0,0,-2653040.8,0,0,-2850146.6,0,0,-3267374.9,0,0,-1984140.6,0,0,-2824890.6,0,0,-2390915.6,0,0,932667.69,0,0,37524.098,0,0,1215377.6}; +VT(0.024938414,0.098415267,0,0.032036001,0.10024616,0,0.025770754,0.10718168,0){0,0,2383058.5,0,0,2837469.6,0,0,2378738.7,0,0,68195.72,0,0,-12660.65,0,0,-316264.13,0,0,-2312962.3,0,0,-2850146.6,0,0,-2653040.8,0,0,-2447461.4,0,0,-2824890.6,0,0,-1984140.6,0,0,-204726.33,0,0,37524.098,0,0,932667.69}; +VT(0.049797208,0.2214244,0,0.053910411,0.21448753,0,0.05718895,0.22161738,0){0,0,1551864.2,0,0,1667429.4,0,0,1508977,0,0,-3662861.4,0,0,-3752161.8,0,0,-3566099.1,0,0,3430735.4,0,0,3023771,0,0,3352547.9,0,0,-1003918.8,0,0,-28239.212,0,0,-1004251.2,0,0,-2065424.5,0,0,-2988983.1,0,0,-1983866.6}; +VT(0.1,0.21428571,0,0.093706234,0.20596864,0,0.1,0.20714286,0){0,0,0,0,0,360320.46,0,0,0,0,0,0,0,0,-758974.46,0,0,0,0,0,0,0,0,479351.87,0,0,0,0,0,0,0,0,228803.73,0,0,0,0,0,0,0,0,-732939.79,0,0,0}; +VT(0.066012722,0.055502179,0,0.064832361,0.062804408,0,0.056317057,0.058022103,0){0,0,3257272.9,0,0,3281120.4,0,0,3630316.8,0,0,2187557.2,0,0,1912310.8,0,0,2330872.5,0,0,399401.17,0,0,-254314.65,0,0,197001.66,0,0,-1519988.7,0,0,-2314932.7,0,0,-2007682.1,0,0,-2940625.1,0,0,-3410309.6,0,0,-3494460.7}; +VT(0.063265205,0.21633109,0,0.066992124,0.20847551,0,0.073708403,0.21517194,0){0,0,1505335.5,0,0,1540360.8,0,0,1225969.3,0,0,-3432481.9,0,0,-3311175.4,0,0,-2772471.1,0,0,2888962.8,0,0,2266191.6,0,0,2271379.1,0,0,-265885.87,0,0,706070.36,0,0,-92677.622,0,0,-2549234.8,0,0,-3078419.5,0,0,-2155133.8}; +VT(0.073708403,0.21517194,0,0.066992124,0.20847551,0,0.075422073,0.20645372,0){0,0,1225969.3,0,0,1540360.8,0,0,1273700.5,0,0,-2772471.1,0,0,-3311175.4,0,0,-2693470,0,0,2271379.1,0,0,2266191.6,0,0,1728669,0,0,-92677.622,0,0,706070.36,0,0,766631.5,0,0,-2155133.8,0,0,-3078419.5,0,0,-2583646.6}; +VT(0.015498485,0.28248556,0,0.017990672,0.29207379,0,0.0093450955,0.28843768,0){0,0,166274.63,0,0,86228.122,0,0,67949.514,0,0,-493262.57,0,0,-258100.45,0,0,-202850.84,0,0,803759.61,0,0,428229.3,0,0,334776.34,0,0,-1087394.1,0,0,-595472.42,0,0,-461793.67,0,0,1334475.8,0,0,758576.15,0,0,581935.08}; +VT(0.0093389246,0.011691623,0,0.01808004,0.0081573173,0,0.015416139,0.018002698,0){0,0,1120186.5,0,0,2085729.2,0,0,1798828.3,0,0,1103410.3,0,0,2070583.9,0,0,1735136,0,0,1070108.3,0,0,2040406.9,0,0,1609995.5,0,0,1020788.4,0,0,1995444.2,0,0,1427830.3,0,0,956114.18,0,0,1935913.6,0,0,1194733.1}; +VT(0.089949388,0.2453858,0,0.092168655,0.23668616,0,0.1,0.24285714,0){0,0,339950.36,0,0,307607.26,0,0,0,0,0,-911669.73,0,0,-792496.69,0,0,0,0,0,1193275.4,0,0,941630.33,0,0,0,0,0,-1095139.7,0,0,-691810.02,0,0,0,0,0,648419.14,0,0,148523.72,0,0,0}; +VT(0.077013163,0.11736903,0,0.074105201,0.11070107,0,0.082583958,0.10907049,0){0,0,2095773.2,0,0,2359475.3,0,0,1698614.9,0,0,-691227.47,0,0,-471755.94,0,0,-286603.09,0,0,-2559181.5,0,0,-2736894.8,0,0,-1936849,0,0,-1023961.4,0,0,-1717960.7,0,0,-1323464.6,0,0,1873161.8,0,0,1362139.4,0,0,836522.31}; +VT(0.1,0.13571429,0,0.0910478,0.13167545,0,0.1,0.12857143,0){0,0,0,0,0,831136.87,0,0,0,0,0,0,0,0,-514132.23,0,0,0,0,0,0,0,0,-1027305.8,0,0,0,0,0,0,0,0,122313.64,0,0,0,0,0,0,0,0,1073956.7,0,0,0}; +VT(0.087331535,0.0958472,0,0.081743274,0.092625466,0,0.08812606,0.087328167,0){0,0,1318484.3,0,0,1862860,0,0,1269155.7,0,0,98077.228,0,0,243386.47,0,0,279658.57,0,0,-1213131.9,0,0,-1587731,0,0,-927894.68,0,0,-1401481.2,0,0,-2038652.4,0,0,-1412053.3,0,0,-292629.72,0,0,-717394.49,0,0,-795447.99}; +VT(0.091053567,0.10618538,0,0.091758141,0.11296708,0,0.082583958,0.10907049,0){0,0,914271.31,0,0,824791.32,0,0,1698614.9,0,0,-104388.15,0,0,-201020.76,0,0,-286603.09,0,0,-1006721.9,0,0,-976886.6,0,0,-1936849,0,0,-787386.88,0,0,-537824.26,0,0,-1323464.6,0,0,309052.61,0,0,570097.26,0,0,836522.31}; +VT(0.092857143,0.3,0,0.091323117,0.29067423,0,0.1,0.29285714,0){0,0,0,0,0,51002.156,0,0,0,0,0,0,0,0,-152526.43,0,0,0,0,0,0,0,0,252617.29,0,0,0,0,0,0,0,0,-350336.87,0,0,0,0,0,0,0,0,444691.33,0,0,0}; +VT(0.1,0.0071428571,0,0.091308694,0.0093164623,0,0.092857143,0,0){0,0,0,0,0,1045151,0,0,863626.15,0,0,0,0,0,1035216.9,0,0,863662.39,0,0,0,0,0,1015442.8,0,0,863732,0,0,0,0,0,986027.05,0,0,863838.35,0,0,0,0,0,947106.05,0,0,863813.95}; +VT(0.011573719,0.041901165,0,0.0063343033,0.038958017,0,0.014137494,0.034012185,0){0,0,1347025.1,0,0,751213.74,0,0,1641076.4,0,0,1091815.8,0,0,627892.11,0,0,1435142,0,0,629744.45,0,0,401490.67,0,0,1049094.4,0,0,48353.226,0,0,109174.99,0,0,531342.12,0,0,-542301.86,0,0,-201236.23,0,0,-53364.585}; +VT(0.019499739,0.079597209,0,0.01882241,0.070374011,0,0.026270926,0.075674812,0){0,0,2040354.6,0,0,2018056.9,0,0,2630439.6,0,0,702945.71,0,0,970762.8,0,0,1063205.3,0,0,-1095289.5,0,0,-580354.6,0,0,-1137545.6,0,0,-2175701.2,0,0,-1830388.5,0,0,-2660659.2,0,0,-1830384.7,0,0,-2130853.3,0,0,-2599027.8}; +VT(0.011268327,0.1984065,0,0.015977634,0.20443356,0,0.007303543,0.20469543,0){0,0,682302.12,0,0,895779.15,0,0,422375.13,0,0,-1344805.9,0,0,-1862602.8,0,0,-880191.16,0,0,623458.07,0,0,1114548.4,0,0,531663.92,0,0,739532.85,0,0,659707.69,0,0,303952.91,0,0,-1341727.7,0,0,-1827076.9,0,0,-861341.37}; +VT(0.057323957,0.1204315,0,0.052058531,0.12554764,0,0.051013063,0.11801667,0){0,0,3051716.5,0,0,3065498.6,0,0,3161388.4,0,0,-1191883,0,0,-1512626.5,0,0,-1083065.4,0,0,-3778168.4,0,0,-3831818,0,0,-3873486.3,0,0,-1110713.1,0,0,-428428.64,0,0,-1463412.7,0,0,3101303,0,0,3614977.4,0,0,2911579}; +VT(0.089858368,0.18421461,0,0.091593501,0.1915477,0,0.084368038,0.19048099,0){0,0,692603.24,0,0,544831.72,0,0,992852.93,0,0,-1178349.1,0,0,-1004107.1,0,0,-1809621.2,0,0,133849.22,0,0,301623.68,0,0,495817.1,0,0,1084450.2,0,0,749822.54,0,0,1401810.9,0,0,-894447.98,0,0,-933881.71,0,0,-1649308.4}; +VT(0.015758122,0.23699049,0,0.0069516057,0.23320895,0,0.011838853,0.2301677,0){0,0,597291.98,0,0,288078.49,0,0,504229.49,0,0,-1541119.1,0,0,-728952.19,0,0,-1254859.2,0,0,1837947.1,0,0,827497.2,0,0,1363834.1,0,0,-1363109.4,0,0,-537397.4,0,0,-775392.51,0,0,315646.37,0,0,-5267.3055,0,0,-209768.04}; +VT(0.054794838,0.043915046,0,0.053426379,0.049768916,0,0.046341114,0.044942776,0){0,0,3735662.6,0,0,3727873.1,0,0,3748809.1,0,0,2959425,0,0,2738031.5,0,0,2933624.2,0,0,1568238.5,0,0,1021148,0,0,1480431.3,0,0,-148813.91,0,0,-966926.63,0,0,-294933.53,0,0,-1835117.4,0,0,-2698501,0,0,-2006921.6}; +VT(0,0.28571429,0,0.0067236406,0.28198319,0,0.0093450955,0.28843768,0){0,0,0,0,0,76627.274,0,0,67949.514,0,0,0,0,0,-227172.13,0,0,-202850.84,0,0,0,0,0,369685.4,0,0,334776.34,0,0,0,0,0,-499127.77,0,0,-461793.67,0,0,0,0,0,610772.43,0,0,581935.08}; +VT(0.0093389246,0.011691623,0,0.006650898,0.018174199,0,0,0.014285714,0){0,0,1120186.5,0,0,801243.34,0,0,0,0,0,1103410.3,0,0,772347.91,0,0,0,0,0,1070108.3,0,0,715593.27,0,0,0,0,0,1020788.4,0,0,633022.27,0,0,0,0,0,956114.18,0,0,527557,0,0,0}; +VT(0,0.078571429,0,0.0064539684,0.081629255,0,0,0.085714286,0){0,0,0,0,0,711139.06,0,0,0,0,0,0,0,0,222377.16,0,0,0,0,0,0,0,0,-419239.47,0,0,0,0,0,0,0,0,-772749.89,0,0,0,0,0,0,0,0,-595288.06,0,0,0}; +VT(0.085714286,0.3,0,0.081165886,0.29137431,0,0.091323117,0.29067423,0){0,0,0,0,0,97729.953,0,0,51002.156,0,0,0,0,0,-292395.17,0,0,-152526.43,0,0,0,0,0,484687.71,0,0,252617.29,0,0,0,0,0,-673055.06,0,0,-350336.87,0,0,0,0,0,855744.16,0,0,444691.33}; +VT(0.054876921,0.07294965,0,0.060416267,0.076932239,0,0.054828578,0.081464579,0){0,0,3558755.8,0,0,3380545.3,0,0,3492382.6,0,0,1580988.4,0,0,1302521.2,0,0,1101278.5,0,0,-1275447.3,0,0,-1576156.6,0,0,-2043909.2,0,0,-3423192.1,0,0,-3485992.8,0,0,-3789901.6,0,0,-3669097.1,0,0,-3253298.6,0,0,-2941538.5}; +VT(0.091308694,0.0093164623,0,0.081119523,0.0085521597,0,0.085714286,0,0){0,0,1045151,0,0,2167108.8,0,0,1683752,0,0,1035216.9,0,0,2149779.2,0,0,1683802.7,0,0,1015442.8,0,0,2115263.6,0,0,1683911.1,0,0,986027.05,0,0,2063869.7,0,0,1684108.7,0,0,947106.05,0,0,1995657.9,0,0,1684003.7}; +VT(0.044666369,0.11545829,0,0.042557423,0.10832344,0,0.050721192,0.10961634,0){0,0,3148096.1,0,0,3183930.6,0,0,3257974.6,0,0,-920013.3,0,0,-492142.06,0,0,-583831.78,0,0,-3799301.5,0,0,-3600076,0,0,-3737290.3,0,0,-1769018.1,0,0,-2551523.2,0,0,-2483878.9,0,0,2547335.8,0,0,1442840.6,0,0,1698581.7}; +VT(0.076498673,0.26519709,0,0.083190767,0.25723975,0,0.085115353,0.26563346,0){0,0,473307.48,0,0,434158.6,0,0,313056.52,0,0,-1357765.2,0,0,-1216864.4,0,0,-899063.8,0,0,2063933,0,0,1759626.8,0,0,1369900.4,0,0,-2499100.3,0,0,-1955417.3,0,0,-1665255.4,0,0,2605934.6,0,0,1765235.2,0,0,1747205.8}; +VT(0.084917502,0.034253561,0,0.082493405,0.042375289,0,0.075978544,0.034466341,0){0,0,1742331.8,0,0,1978611.8,0,0,2615244.9,0,0,1520580.8,0,0,1595319.9,0,0,2278283.7,0,0,1105294,0,0,902966.17,0,0,1647758.2,0,0,549324.68,0,0,35643.43,0,0,804880.96,0,0,-76880.401,0,0,-838916.97,0,0,-142067.87}; +VT(0.061244461,0.14481879,0,0.068478919,0.13862632,0,0.069467767,0.146519,0){0,0,2643484.5,0,0,2426951.1,0,0,2287173.5,0,0,-2356788.3,0,0,-1850187.5,0,0,-2120501.9,0,0,-2899198.4,0,0,-2866745.3,0,0,-2441744.6,0,0,2042509.4,0,0,1169007.7,0,0,1942651.5,0,0,3121060.9,0,0,3144665.9,0,0,2583122}; +VT(0.030075176,0.23324008,0,0.022740693,0.23189018,0,0.026971271,0.22659033,0){0,0,1077047.3,0,0,887604.04,0,0,1090633.5,0,0,-2725827,0,0,-2230116.3,0,0,-2658504.1,0,0,3095770.8,0,0,2485475.6,0,0,2731189,0,0,-2013325.9,0,0,-1529145.6,0,0,-1267784.1,0,0,-13872.597,0,0,-172982.46,0,0,-909068.56}; +VT(0.071449289,0.19423207,0,0.076430303,0.18837043,0,0.079090117,0.19794942,0){0,0,1594804.6,0,0,1444535.6,0,0,1206859.6,0,0,-3019964.8,0,0,-2574453.4,0,0,-2368529.7,0,0,1103926.4,0,0,569102.25,0,0,1073015.3,0,0,2033518.7,0,0,2129625.3,0,0,1335740.9,0,0,-2921575.1,0,0,-2235391.7,0,0,-2359414.1}; +VT(0.01062282,0.18656765,0,0.0066871595,0.19241823,0,0,0.18571429,0){0,0,711483.53,0,0,432113.5,0,0,0,0,0,-1243147.4,0,0,-803518.34,0,0,0,0,0,217509.34,0,0,258472.73,0,0,0,0,0,1080570.1,0,0,581490.34,0,0,0,0,0,-1025407.6,0,0,-758588.26,0,0,0}; +VT(0.028699663,0.054481756,0,0.032659307,0.059686042,0,0.025221599,0.062165695,0){0,0,2920693,0,0,3158137.1,0,0,2618029.3,0,0,1995520.8,0,0,1964024.3,0,0,1547191.2,0,0,438210.61,0,0,27282.242,0,0,-156575.4,0,0,-1257984.1,0,0,-1919818.3,0,0,-1796512.5,0,0,-2556170.3,0,0,-3141270.1,0,0,-2702051.5}; +VT(0.032911969,0.081185013,0,0.033761495,0.088496681,0,0.027903545,0.087518505,0){0,0,3037931.3,0,0,3029395.9,0,0,2674848,0,0,971274.35,0,0,608605.12,0,0,580994.77,0,0,-1756226.8,0,0,-2298547.5,0,0,-1967676.8,0,0,-3289165.4,0,0,-3368980,0,0,-2976106,0,0,-2584916.3,0,0,-1747439.7,0,0,-1655065.1}; +VT(0.0084994266,0.025462386,0,0.0058133292,0.032528446,0,0,0.028571429,0){0,0,1014895.2,0,0,694559.72,0,0,0,0,0,943121.65,0,0,614750.96,0,0,0,0,0,804669.5,0,0,464300.7,0,0,0,0,0,609367.99,0,0,260495.38,0,0,0,0,0,370926.59,0,0,26512.55,0,0,0}; +VT(0,0.27142857,0,0.0060732531,0.2674669,0,0.0087746229,0.27470702,0){0,0,0,0,0,124750.88,0,0,139476.7,0,0,0,0,0,-359918.85,0,0,-408686.72,0,0,0,0,0,553735.12,0,0,649356.33,0,0,0,0,0,-683931.42,0,0,-844695.79,0,0,0,0,0,735399.5,0,0,980930.37}; +VT(0.007303543,0.20469543,0,0.015977634,0.20443356,0,0.013229009,0.21171696,0){0,0,422375.13,0,0,895779.15,0,0,698716.07,0,0,-880191.16,0,0,-1862602.8,0,0,-1540332.8,0,0,531663.92,0,0,1114548.4,0,0,1156621.3,0,0,303952.91,0,0,659707.69,0,0,147278.69,0,0,-861341.37,0,0,-1827076.9,0,0,-1334554.8}; +VT(0.036912897,0.21765752,0,0.045116599,0.21481108,0,0.042541479,0.22296234,0){0,0,1486590.9,0,0,1654487.5,0,0,1481591,0,0,-3421295.1,0,0,-3731787.4,0,0,-3531706.6,0,0,2965983.4,0,0,3030991.5,0,0,3405357.4,0,0,-438566.7,0,0,-73694.316,0,0,-1180392.3,0,0,-2395869.1,0,0,-2938909.4,0,0,-1772446.7}; +VT(0.038009007,0.015147577,0,0.029163144,0.015558324,0,0.031710863,0.0075461758,0){0,0,3597209.6,0,0,3068207,0,0,3254919.5,0,0,3506943.3,0,0,2986953.6,0,0,3234618.2,0,0,3328697.3,0,0,2826596.5,0,0,3194153.7,0,0,3067010.9,0,0,2591406.1,0,0,3133832.1,0,0,2728518.9,0,0,2287504.7,0,0,3053845.3}; +VT(0.077069107,0.15686929,0,0.070175425,0.16144206,0,0.070477538,0.15360968,0){0,0,1743907.9,0,0,2074683.8,0,0,2153625.7,0,0,-1994600,0,0,-2570674.4,0,0,-2316413.6,0,0,-1457243.4,0,0,-1460177,0,0,-1978592.7,0,0,2204191.1,0,0,2919916.2,0,0,2466066.8,0,0,1140253.2,0,0,762077.82,0,0,1792310.4}; +VT(0.077393474,0.16425214,0,0.070175425,0.16144206,0,0.077069107,0.15686929,0){0,0,1650679.7,0,0,2074683.8,0,0,1743907.9,0,0,-2141613.9,0,0,-2570674.4,0,0,-1994600,0,0,-1013799.5,0,0,-1460177,0,0,-1457243.4,0,0,2443278.1,0,0,2919916.2,0,0,2204191.1,0,0,287063.28,0,0,762077.82,0,0,1140253.2}; +VT(0.060825265,0.17090728,0,0.054395265,0.16699477,0,0.061476805,0.16269562,0){0,0,2288734.2,0,0,2465605.5,0,0,2391378.9,0,0,-3282960.5,0,0,-3338618.7,0,0,-3025373.1,0,0,-862639.89,0,0,-1283530.8,0,0,-1589341.3,0,0,3657845.3,0,0,3793219.5,0,0,3446908.2,0,0,-726586.11,0,0,-59660.123,0,0,675366.83}; +VT(0.08415119,0.061061125,0,0.079822506,0.065677674,0,0.076938259,0.060604721,0){0,0,1759442.9,0,0,2163855.5,0,0,2443533.2,0,0,1064240.3,0,0,1180001.4,0,0,1491930.8,0,0,-51487.645,0,0,-340376.77,0,0,-40674.57,0,0,-1146904.2,0,0,-1706002.2,0,0,-1557435.8,0,0,-1789550.6,0,0,-2296197.5,0,0,-2468002.6}; +VT(0.038843793,0.21103197,0,0.045116599,0.21481108,0,0.036912897,0.21765752,0){0,0,1637090.1,0,0,1654487.5,0,0,1486590.9,0,0,-3590120.4,0,0,-3731787.4,0,0,-3421295.1,0,0,2645890.8,0,0,3030991.5,0,0,2965983.4,0,0,433646.44,0,0,-73694.316,0,0,-438566.7,0,0,-3163532.2,0,0,-2938909.4,0,0,-2395869.1}; +VT(0.049165273,0.076760106,0,0.054876921,0.07294965,0,0.054828578,0.081464579,0){0,0,3570137.5,0,0,3558755.8,0,0,3492382.6,0,0,1384898,0,0,1580988.4,0,0,1101278.5,0,0,-1648055.9,0,0,-1275447.3,0,0,-2043909.2,0,0,-3672308.6,0,0,-3423192.1,0,0,-3789901.6,0,0,-3449021.3,0,0,-3669097.1,0,0,-2941538.5}; +VT(0.016927821,0.11108648,0,0.017861336,0.10270337,0,0.025770754,0.10718168,0){0,0,1644246.3,0,0,1773538.4,0,0,2378738.7,0,0,-340994.5,0,0,-87655.931,0,0,-316264.13,0,0,-1914445.6,0,0,-1856823.6,0,0,-2653040.8,0,0,-1176430.8,0,0,-1677437.3,0,0,-1984140.6,0,0,981584.41,0,0,261812.45,0,0,932667.69}; +VT(0.028699663,0.054481756,0,0.025221599,0.062165695,0,0.021658338,0.054940441,0){0,0,2920693,0,0,2618029.3,0,0,2341024.9,0,0,1995520.8,0,0,1547191.2,0,0,1587273.2,0,0,438210.61,0,0,-156575.4,0,0,322446.89,0,0,-1257984.1,0,0,-1796512.5,0,0,-1046241,0,0,-2556170.3,0,0,-2702051.5,0,0,-2078353.5}; +VT(0.050721192,0.10961634,0,0.054240748,0.10280037,0,0.059543685,0.10776494,0){0,0,3257974.6,0,0,3302360.6,0,0,3132791.5,0,0,-583831.78,0,0,-169115.68,0,0,-451048.14,0,0,-3737290.3,0,0,-3462856.5,0,0,-3519016.9,0,0,-2483878.9,0,0,-3116478.2,0,0,-2561357.9,0,0,1698581.7,0,0,505791.56,0,0,1326599.2}; +VT(0.059543685,0.10776494,0,0.054240748,0.10280037,0,0.061027247,0.098743066,0){0,0,3132791.5,0,0,3302360.6,0,0,3173016.6,0,0,-451048.14,0,0,-169115.68,0,0,72008.811,0,0,-3519016.9,0,0,-3462856.5,0,0,-3099474,0,0,-2561357.9,0,0,-3116478.2,0,0,-3241975.4,0,0,1326599.2,0,0,505791.56,0,0,-216202.29}; +VT(0.026971271,0.22659033,0,0.034969012,0.22634925,0,0.030075176,0.23324008,0){0,0,1090633.5,0,0,1299939.6,0,0,1077047.3,0,0,-2658504.1,0,0,-3164156.1,0,0,-2725827,0,0,2731189,0,0,3237729.2,0,0,3095770.8,0,0,-1267784.1,0,0,-1478956,0,0,-2013325.9,0,0,-909068.56,0,0,-1117524.9,0,0,-13872.597}; +VT(0.060432552,0.20227914,0,0.066992124,0.20847551,0,0.059551151,0.20970619,0){0,0,1798951.1,0,0,1540360.8,0,0,1688112.8,0,0,-3671781.8,0,0,-3311175.4,0,0,-3664209.4,0,0,2023610.8,0,0,2266191.6,0,0,2601193.1,0,0,1565241.8,0,0,706070.36,0,0,619333.89,0,0,-3653837,0,0,-3078419.5,0,0,-3326584.6}; +VT(0.066799394,0.09162077,0,0.058212185,0.089881183,0,0.064352171,0.083117586,0){0,0,2974160.1,0,0,3344291.6,0,0,3167194.8,0,0,440022.16,0,0,593905.21,0,0,915483.69,0,0,-2469083.6,0,0,-2645013.4,0,0,-1987167.2,0,0,-3274492.4,0,0,-3708817.1,0,0,-3477240.4,0,0,-1290097.2,0,0,-1722713.3,0,0,-2495770}; +VT(0.082942949,0.21818591,0,0.081656406,0.2108727,0,0.089437553,0.21298247,0){0,0,823054.75,0,0,951384.03,0,0,556322.48,0,0,-1901094.8,0,0,-2083808.1,0,0,-1238115.4,0,0,1667014.3,0,0,1528962.6,0,0,961021.23,0,0,-282341.7,0,0,263916.4,0,0,60411.18,0,0,-1297502.9,0,0,-1843401,0,0,-1035404.3}; +VT(0.072126291,0.10515927,0,0.069968451,0.098831219,0,0.079063451,0.10043005,0){0,0,2539730.3,0,0,2730411,0,0,2051820.1,0,0,-241283.81,0,0,57648.531,0,0,-16056.497,0,0,-2758172.2,0,0,-2671597.7,0,0,-2067914.3,0,0,-2254933.2,0,0,-2785714.6,0,0,-2035845.1,0,0,717337.89,0,0,-173126.8,0,0,48244.512}; +VT(0.1,0.014285714,0,0.093571257,0.018380777,0,0.091308694,0.0093164623,0){0,0,0,0,0,774815.13,0,0,1045151,0,0,0,0,0,746204.54,0,0,1035216.9,0,0,0,0,0,690036.86,0,0,1015442.8,0,0,0,0,0,608388.09,0,0,986027.05,0,0,0,0,0,504051.02,0,0,947106.05}; +VT(0.091323117,0.29067423,0,0.093593186,0.28160993,0,0.1,0.28571429,0){0,0,51002.156,0,0,74588.283,0,0,0,0,0,-152526.43,0,0,-221009.65,0,0,0,0,0,252617.29,0,0,359269.18,0,0,0,0,0,-350336.87,0,0,-484261.41,0,0,0,0,0,444691.33,0,0,591230.88,0,0,0}; +VT(0.027746664,0.13122119,0,0.030046638,0.13690443,0,0.021167753,0.13548502,0){0,0,2296333.1,0,0,2369378.2,0,0,1816935.7,0,0,-1399007.9,0,0,-1721516.8,0,0,-1266652.3,0,0,-2843055.5,0,0,-2840145.3,0,0,-2200669.4,0,0,288094.78,0,0,944948.24,0,0,600161.11,0,0,2955532.6,0,0,3098367.4,0,0,2382629.9}; +VT(0.044666369,0.11545829,0,0.051013063,0.11801667,0,0.045375723,0.12284566,0){0,0,3148096.1,0,0,3161388.4,0,0,3072436,0,0,-920013.3,0,0,-1083065.4,0,0,-1348503.3,0,0,-3799301.5,0,0,-3873486.3,0,0,-3829159.4,0,0,-1769018.1,0,0,-1463412.7,0,0,-800055.99,0,0,2547335.8,0,0,2911579,0,0,3380414.3}; +VT(0.1,0.085714286,0,0.093922759,0.092262381,0,0.08812606,0.087328167,0){0,0,0,0,0,652083.63,0,0,1269155.7,0,0,0,0,0,89312.894,0,0,279658.57,0,0,0,0,0,-550573,0,0,-927894.68,0,0,0,0,0,-715327.2,0,0,-1412053.3,0,0,0,0,0,-262838.8,0,0,-795447.99}; +VT(0.056766116,0.23329497,0,0.053624899,0.22742186,0,0.059957308,0.22757204,0){0,0,1298096.4,0,0,1430137,0,0,1366903.5,0,0,-3286228.7,0,0,-3503302.1,0,0,-3351367.9,0,0,3735031.6,0,0,3648370.9,0,0,3498598.8,0,0,-2434254.7,0,0,-1785483,0,0,-1727811.3,0,0,-7070.0355,0,0,-1060301.4,0,0,-990620.01}; +VT(0.032911969,0.081185013,0,0.025411973,0.082310594,0,0.026270926,0.075674812,0){0,0,3037931.3,0,0,2525130.6,0,0,2630439.6,0,0,971274.35,0,0,762374.09,0,0,1063205.3,0,0,-1756226.8,0,0,-1532614.6,0,0,-1137545.6,0,0,-3289165.4,0,0,-2757779.1,0,0,-2660659.2,0,0,-2584916.3,0,0,-2058136.4,0,0,-2599027.8}; +VT(0.1,0.057142857,0,0.09230899,0.063522919,0,0.08944657,0.05485846,0){0,0,0,0,0,877619.52,0,0,1211526.2,0,0,0,0,0,503392.8,0,0,822600.19,0,0,0,0,0,-85524.836,0,0,169573.91,0,0,0,0,0,-638068.15,0,0,-537958.1,0,0,0,0,0,-918939.46,0,0,-1073022.7}; +VT(0.034969012,0.22634925,0,0.037546984,0.23452457,0,0.030075176,0.23324008,0){0,0,1299939.6,0,0,1205921.7,0,0,1077047.3,0,0,-3164156.1,0,0,-3072707.6,0,0,-2725827,0,0,3237729.2,0,0,3550700.1,0,0,3095770.8,0,0,-1478956,0,0,-2423829.8,0,0,-2013325.9,0,0,-1117524.9,0,0,201013.93,0,0,-13872.597}; +VT(0.073708403,0.21517194,0,0.081656406,0.2108727,0,0.082942949,0.21818591,0){0,0,1225969.3,0,0,951384.03,0,0,823054.75,0,0,-2772471.1,0,0,-2083808.1,0,0,-1901094.8,0,0,2271379.1,0,0,1528962.6,0,0,1667014.3,0,0,-92677.622,0,0,263916.4,0,0,-282341.7,0,0,-2155133.8,0,0,-1843401,0,0,-1297502.9}; +VT(0.038464606,0.12667013,0,0.033010101,0.13109378,0,0.030575169,0.1246812,0){0,0,2859316.3,0,0,2584208,0,0,2526238.7,0,0,-1476046.2,0,0,-1567613,0,0,-1202245.8,0,0,-3573486.5,0,0,-3200932.4,0,0,-3156412.2,0,0,-252868.56,0,0,308418.11,0,0,-451924.48,0,0,3451249.3,0,0,3322264.5,0,0,2919641.1}; +VT(0.031264826,0.29263185,0,0.028198926,0.28535727,0,0.036602132,0.28491153,0){0,0,124484.17,0,0,230200.16,0,0,279518.56,0,0,-372709.78,0,0,-685197.76,0,0,-831596.18,0,0,618717.86,0,0,1124120.6,0,0,1362985.6,0,0,-861054.65,0,0,-1536674.3,0,0,-1860498.2,0,0,1098239.8,0,0,1912913.1,0,0,2311728.5}; +VT(0.030575169,0.1246812,0,0.033010101,0.13109378,0,0.027746664,0.13122119,0){0,0,2526238.7,0,0,2584208,0,0,2296333.1,0,0,-1202245.8,0,0,-1567613,0,0,-1399007.9,0,0,-3156412.2,0,0,-3200932.4,0,0,-2843055.5,0,0,-451924.48,0,0,308418.11,0,0,288094.78,0,0,2919641.1,0,0,3322264.5,0,0,2955532.6}; +VT(0.077013163,0.11736903,0,0.070840483,0.12204614,0,0.069025318,0.11622387,0){0,0,2095773.2,0,0,2470738.2,0,0,2631986.5,0,0,-691227.47,0,0,-1044803.2,0,0,-808686.45,0,0,-2559181.5,0,0,-3073782.1,0,0,-3192250.9,0,0,-1023961.4,0,0,-729197.53,0,0,-1402768.4,0,0,1873161.8,0,0,2652961,0,0,2220554.1}; +VT(0.037705658,0.25939989,0,0.034582704,0.26623209,0,0.030217898,0.25971254,0){0,0,758443.36,0,0,604041.77,0,0,660621.26,0,0,-2140288.6,0,0,-1737386.1,0,0,-1866014.4,0,0,3141072.6,0,0,2655775,0,0,2744196,0,0,-3582615.2,0,0,-3245580.1,0,0,-3141188.1,0,0,3385872.9,0,0,3433603.3,0,0,2987009.7}; +VT(0.084604507,0.15255901,0,0.08264437,0.14444108,0,0.09156348,0.14589395,0){0,0,1258841.2,0,0,1463951.5,0,0,734092.88,0,0,-1326319,0,0,-1293607.4,0,0,-670961.7,0,0,-1187789.9,0,0,-1614532.1,0,0,-791796.8,0,0,1390056.3,0,0,1105781,0,0,602866.55,0,0,1113216.6,0,0,1743195.6,0,0,843431.47}; +VT(0.09156348,0.14589395,0,0.08264437,0.14444108,0,0.087083587,0.13880919,0){0,0,734092.88,0,0,1463951.5,0,0,1144744.3,0,0,-670961.7,0,0,-1293607.4,0,0,-877072.07,0,0,-791796.8,0,0,-1614532.1,0,0,-1349889.8,0,0,602866.55,0,0,1105781,0,0,561444.4,0,0,843431.47,0,0,1743195.6,0,0,1481228.8}; +VT(0.034582704,0.26623209,0,0.027951851,0.26533243,0,0.030217898,0.25971254,0){0,0,604041.77,0,0,539100.43,0,0,660621.26,0,0,-1737386.1,0,0,-1547025.6,0,0,-1866014.4,0,0,2655775,0,0,2353298.6,0,0,2744196,0,0,-3245580.1,0,0,-2852826.8,0,0,-3141188.1,0,0,3433603.3,0,0,2980285,0,0,2987009.7}; +VT(0.043573225,0.18196099,0,0.038433858,0.18005903,0,0.041643161,0.17482395,0){0,0,2202933.2,0,0,2131117.1,0,0,2284160.6,0,0,-3650165.7,0,0,-3450732.6,0,0,-3458410.7,0,0,195066.32,0,0,5612.0128,0,0,-506290.81,0,0,3522129.2,0,0,3447337.8,0,0,3718851.8,0,0,-2509350,0,0,-2140463.9,0,0,-1405815.9}; +VT(0.019247887,0.048569646,0,0.014691551,0.054118398,0,0.013132659,0.04767246,0){0,0,2135187.8,0,0,1659245.8,0,0,1507774.2,0,0,1594654.5,0,0,1140472.1,0,0,1139737.5,0,0,650408.09,0,0,265092.56,0,0,493500.09,0,0,-458538.7,0,0,-693242.8,0,0,-273193.01,0,0,-1451674.1,0,0,-1435183.5,0,0,-973395.4}; +VT(0.021167753,0.13548502,0,0.023379755,0.12686903,0,0.027746664,0.13122119,0){0,0,1816935.7,0,0,2047772.9,0,0,2296333.1,0,0,-1266652.3,0,0,-1065433.1,0,0,-1399007.9,0,0,-2200669.4,0,0,-2558991,0,0,-2843055.5,0,0,600161.11,0,0,-162203.53,0,0,288094.78,0,0,2382629.9,0,0,2481221.5,0,0,2955532.6}; +VT(0.044666369,0.11545829,0,0.038084092,0.1145524,0,0.042557423,0.10832344,0){0,0,3148096.1,0,0,2981407.2,0,0,3183930.6,0,0,-920013.3,0,0,-818508.93,0,0,-492142.06,0,0,-3799301.5,0,0,-3575257.7,0,0,-3600076,0,0,-1769018.1,0,0,-1775238,0,0,-2551523.2,0,0,2547335.8,0,0,2287308.3,0,0,1442840.6}; +VT(0.021658338,0.054940441,0,0.014691551,0.054118398,0,0.019247887,0.048569646,0){0,0,2341024.9,0,0,1659245.8,0,0,2135187.8,0,0,1587273.2,0,0,1140472.1,0,0,1594654.5,0,0,322446.89,0,0,265092.56,0,0,650408.09,0,0,-1046241,0,0,-693242.8,0,0,-458538.7,0,0,-2078353.5,0,0,-1435183.5,0,0,-1451674.1}; +VT(0.061027247,0.098743066,0,0.065931692,0.10408722,0,0.059543685,0.10776494,0){0,0,3173016.6,0,0,2911358.9,0,0,3132791.5,0,0,72008.811,0,0,-218409.17,0,0,-451048.14,0,0,-3099474,0,0,-3113407,0,0,-3519016.9,0,0,-3241975.4,0,0,-2661455,0,0,-2561357.9,0,0,-216202.29,0,0,651464.78,0,0,1326599.2}; +VT(0,0.22142857,0,0.0051799073,0.21317882,0,0.010546892,0.2198034,0){0,0,0,0,0,276031.48,0,0,514716.79,0,0,0,0,0,-615227.88,0,0,-1201974.2,0,0,0,0,0,479976.29,0,0,1090194.6,0,0,0,0,0,25450.705,0,0,-253690.09,0,0,0,0,0,-511551.59,0,0,-751659.26}; +VT(0,0.12857143,0,0.0072553778,0.13224921,0,0,0.13571429,0){0,0,0,0,0,674958.82,0,0,0,0,0,0,0,0,-425463.67,0,0,0,0,0,0,0,0,-832230.25,0,0,0,0,0,0,0,0,117822.57,0,0,0,0,0,0,0,0,875622.71,0,0,0}; +VT(0.059543685,0.10776494,0,0.05615957,0.1141762,0,0.050721192,0.10961634,0){0,0,3132791.5,0,0,3147681.4,0,0,3257974.6,0,0,-451048.14,0,0,-840990.83,0,0,-583831.78,0,0,-3519016.9,0,0,-3764018.8,0,0,-3737290.3,0,0,-2561357.9,0,0,-1917372.9,0,0,-2483878.9,0,0,1326599.2,0,0,2358868.4,0,0,1698581.7}; +VT(0.043491003,0.26677795,0,0.045592054,0.27439642,0,0.037999827,0.27482627,0){0,0,657627.62,0,0,513714.39,0,0,474219.19,0,0,-1894105.9,0,0,-1504437.2,0,0,-1389905,0,0,2903724.9,0,0,2387679.2,0,0,2209621.2,0,0,-3565612.1,0,0,-3100344.3,0,0,-2876809.4,0,0,3800401.2,0,0,3591305.7,0,0,3345267.4}; +VT(0.075422073,0.20645372,0,0.081656406,0.2108727,0,0.073708403,0.21517194,0){0,0,1273700.5,0,0,951384.03,0,0,1225969.3,0,0,-2693470,0,0,-2083808.1,0,0,-2772471.1,0,0,1728669,0,0,1528962.6,0,0,2271379.1,0,0,766631.5,0,0,263916.4,0,0,-92677.622,0,0,-2583646.6,0,0,-1843401,0,0,-2155133.8}; +VT(0.048663579,0.053435419,0,0.042113175,0.053290167,0,0.046341114,0.044942776,0){0,0,3726394.8,0,0,3616583.4,0,0,3748809.1,0,0,2589713.3,0,0,2519252.9,0,0,2933624.2,0,0,663071.82,0,0,657513.67,0,0,1480431.3,0,0,-1465861.1,0,0,-1403801.4,0,0,-294933.53,0,0,-3147918.6,0,0,-3039615.4,0,0,-2006921.6}; +VT(0.074105201,0.11070107,0,0.076969725,0.10634022,0,0.082583958,0.10907049,0){0,0,2359475.3,0,0,2181001.1,0,0,1698614.9,0,0,-471755.94,0,0,-255488.75,0,0,-286603.09,0,0,-2736894.8,0,0,-2406546.5,0,0,-1936849,0,0,-1717960.7,0,0,-1869163.7,0,0,-1323464.6,0,0,1362139.4,0,0,756176.24,0,0,836522.31}; +VT(0.08812606,0.087328167,0,0.081743274,0.092625466,0,0.079265602,0.086677581,0){0,0,1269155.7,0,0,1862860,0,0,2114636.1,0,0,279658.57,0,0,243386.47,0,0,488789.06,0,0,-927894.68,0,0,-1587731,0,0,-1512904.7,0,0,-1412053.3,0,0,-2038652.4,0,0,-2351470.6,0,0,-795447.99,0,0,-717394.49,0,0,-1382326.1}; +VT(0.079090117,0.19794942,0,0.076430303,0.18837043,0,0.084368038,0.19048099,0){0,0,1206859.6,0,0,1444535.6,0,0,992852.93,0,0,-2368529.7,0,0,-2574453.4,0,0,-1809621.2,0,0,1073015.3,0,0,569102.25,0,0,495817.1,0,0,1335740.9,0,0,2129625.3,0,0,1401810.9,0,0,-2359414.1,0,0,-2235391.7,0,0,-1649308.4}; +VT(0.0071147476,0.24137211,0,0.0069516057,0.23320895,0,0.015758122,0.23699049,0){0,0,259907.57,0,0,288078.49,0,0,597291.98,0,0,-684802.64,0,0,-728952.19,0,0,-1541119.1,0,0,859611.54,0,0,827497.2,0,0,1837947.1,0,0,-720499.62,0,0,-537397.4,0,0,-1363109.4,0,0,317972.39,0,0,-5267.3055,0,0,315646.37}; +VT(0.075872285,0.081656016,0,0.074756101,0.075901522,0,0.082390534,0.079333541,0){0,0,2427639,0,0,2549479.1,0,0,1865676.5,0,0,758134.07,0,0,1021825.1,0,0,650380.91,0,0,-1432759.9,0,0,-1118145.3,0,0,-988603.29,0,0,-2638364.3,0,0,-2588166.7,0,0,-1983689.6,0,0,-2029677.1,0,0,-2507455.8,0,0,-1686881.4}; +VT(0,0.078571429,0,0.0060853536,0.074713803,0,0.0064539684,0.081629255,0){0,0,0,0,0,681675.12,0,0,711139.06,0,0,0,0,0,285253.65,0,0,222377.16,0,0,0,0,0,-277070.48,0,0,-419239.47,0,0,0,0,0,-678306.76,0,0,-772749.89,0,0,0,0,0,-685312.86,0,0,-595288.06}; +VT(0.050960377,0.23252058,0,0.053624899,0.22742186,0,0.056766116,0.23329497,0){0,0,1342135.9,0,0,1430137,0,0,1298096.4,0,0,-3383651.2,0,0,-3503302.1,0,0,-3286228.7,0,0,3804738.6,0,0,3648370.9,0,0,3735031.6,0,0,-2403721.7,0,0,-1785483,0,0,-2434254.7,0,0,-148681.88,0,0,-1060301.4,0,0,-7070.0355}; +VT(0.085714286,0.3,0,0.091323117,0.29067423,0,0.092857143,0.3,0){0,0,0,0,0,51002.156,0,0,0,0,0,0,0,0,-152526.43,0,0,0,0,0,0,0,0,252617.29,0,0,0,0,0,0,0,0,-350336.87,0,0,0,0,0,0,0,0,444691.33,0,0,0}; +VT(0.1,0.014285714,0,0.091308694,0.0093164623,0,0.1,0.0071428571,0){0,0,0,0,0,1045151,0,0,0,0,0,0,0,0,1035216.9,0,0,0,0,0,0,0,0,1015442.8,0,0,0,0,0,0,0,0,986027.05,0,0,0,0,0,0,0,0,947106.05,0,0,0}; +VT(0.056317057,0.058022103,0,0.061015306,0.048529238,0,0.066012722,0.055502179,0){0,0,3630316.8,0,0,3533367.8,0,0,3257272.9,0,0,2330872.5,0,0,2640342.3,0,0,2187557.2,0,0,197001.66,0,0,1080012.2,0,0,399401.17,0,0,-2007682.1,0,0,-753291.7,0,0,-1519988.7,0,0,-3494460.7,0,0,-2396723.8,0,0,-2940625.1}; +VT(0.092857143,0,0,0.091308694,0.0093164623,0,0.085714286,0,0){0,0,863626.15,0,0,1045151,0,0,1683752,0,0,863662.39,0,0,1035216.9,0,0,1683802.7,0,0,863732,0,0,1015442.8,0,0,1683911.1,0,0,863838.35,0,0,986027.05,0,0,1684108.7,0,0,863813.95,0,0,947106.05,0,0,1684003.7}; +VT(0.1,0.29285714,0,0.091323117,0.29067423,0,0.1,0.28571429,0){0,0,0,0,0,51002.156,0,0,0,0,0,0,0,0,-152526.43,0,0,0,0,0,0,0,0,252617.29,0,0,0,0,0,0,0,0,-350336.87,0,0,0,0,0,0,0,0,444691.33,0,0,0}; +VT(0.03928574,0.29335694,0,0.031264826,0.29263185,0,0.036602132,0.28491153,0){0,0,127378.94,0,0,124484.17,0,0,279518.56,0,0,-381522.06,0,0,-372709.78,0,0,-831596.18,0,0,633829.06,0,0,618717.86,0,0,1362985.6,0,0,-883092.25,0,0,-861054.65,0,0,-1860498.2,0,0,1127859.7,0,0,1098239.8,0,0,2311728.5}; +VT(0.038009007,0.015147577,0,0.031710863,0.0075461758,0,0.039686874,0.0066116125,0){0,0,3597209.6,0,0,3254919.5,0,0,3676489.9,0,0,3506943.3,0,0,3234618.2,0,0,3658909.3,0,0,3328697.3,0,0,3194153.7,0,0,3623831.1,0,0,3067010.9,0,0,3133832.1,0,0,3571457.2,0,0,2728518.9,0,0,3053845.3,0,0,3501797.4}; +VT(0.066803853,0.25459223,0,0.071915087,0.24816524,0,0.074279052,0.25633166,0){0,0,789541.66,0,0,803363.84,0,0,635900.39,0,0,-2193455.3,0,0,-2179152.4,0,0,-1777029.4,0,0,3110738.9,0,0,2928525.2,0,0,2553015.8,0,0,-3337877,0,0,-2836050.6,0,0,-2804423.5,0,0,2824240.3,0,0,1927975,0,0,2479429.3}; +VT(0.0071908097,0.26035264,0,0.013885016,0.25805955,0,0.014305262,0.26641769,0){0,0,179155.76,0,0,357160.64,0,0,294901.31,0,0,-507033.49,0,0,-1003688.5,0,0,-848621.76,0,0,748779.14,0,0,1459712.7,0,0,1298521.9,0,0,-863311.12,0,0,-1638678.7,0,0,-1589572.3,0,0,830950.48,0,0,1506406.6,0,0,1686004.5}; +VT(0,0.28571429,0,0.0045473776,0.2936365,0,0,0.29285714,0){0,0,0,0,0,18406.211,0,0,0,0,0,0,0,0,-55138.333,0,0,0,0,0,0,0,0,91630.552,0,0,0,0,0,0,0,0,-127724.83,0,0,0,0,0,0,0,0,162961.08,0,0,0}; +VT(0,0.0071428571,0,0.0045481906,0.0063920675,0,0,0.014285714,0){0,0,0,0,0,552257.15,0,0,0,0,0,0,0,0,549810.55,0,0,0,0,0,0,0,0,544927.47,0,0,0,0,0,0,0,0,537633.65,0,0,0,0,0,0,0,0,527798.54,0,0,0}; +VT(0.084604507,0.15255901,0,0.076625322,0.14929356,0,0.08264437,0.14444108,0){0,0,1258841.2,0,0,1845555.4,0,0,1463951.5,0,0,-1326319,0,0,-1818255.1,0,0,-1293607.4,0,0,-1187789.9,0,0,-1872475.3,0,0,-1614532.1,0,0,1390056.3,0,0,1790618.2,0,0,1105781,0,0,1113216.6,0,0,1898765.5,0,0,1743195.6}; +VT(0.041803352,0.076750149,0,0.047307891,0.081963043,0,0.041002292,0.08644635,0){0,0,3453761.9,0,0,3516083,0,0,3351345,0,0,1340279.2,0,0,1080946.4,0,0,787437.3,0,0,-1593440.1,0,0,-2102837.3,0,0,-2379027.1,0,0,-3552303.7,0,0,-3830300,0,0,-3725698.5,0,0,-3337911.6,0,0,-2905310.5,0,0,-2222336.9}; +VT(0,0.21428571,0,0.0051799073,0.21317882,0,0,0.22142857,0){0,0,0,0,0,276031.48,0,0,0,0,0,0,0,0,-615227.88,0,0,0,0,0,0,0,0,479976.29,0,0,0,0,0,0,0,0,25450.705,0,0,0,0,0,0,0,0,-511551.59,0,0,0}; +VT(0.082390534,0.079333541,0,0.074756101,0.075901522,0,0.080160084,0.071577727,0){0,0,1865676.5,0,0,2549479.1,0,0,2107851.9,0,0,650380.91,0,0,1021825.1,0,0,977984.82,0,0,-988603.29,0,0,-1118145.3,0,0,-676141.96,0,0,-1983689.6,0,0,-2588166.7,0,0,-1967920.1,0,0,-1686881.4,0,0,-2507455.8,0,0,-2205119.3}; +VT(0.065478411,0.24860928,0,0.071915087,0.24816524,0,0.066803853,0.25459223,0){0,0,912058.17,0,0,803363.84,0,0,789541.66,0,0,-2478342.9,0,0,-2179152.4,0,0,-2193455.3,0,0,3344041.2,0,0,2928525.2,0,0,3110738.9,0,0,-3264436.9,0,0,-2836050.6,0,0,-3337877,0,0,2261773.6,0,0,1927975,0,0,2824240.3}; +VT(0.08812606,0.087328167,0,0.079265602,0.086677581,0,0.082390534,0.079333541,0){0,0,1269155.7,0,0,2114636.1,0,0,1865676.5,0,0,279658.57,0,0,488789.06,0,0,650380.91,0,0,-927894.68,0,0,-1512904.7,0,0,-988603.29,0,0,-1412053.3,0,0,-2351470.6,0,0,-1983689.6,0,0,-795447.99,0,0,-1382326.1,0,0,-1686881.4}; +VT(0.064832361,0.062804408,0,0.059054943,0.066788508,0,0.056317057,0.058022103,0){0,0,3281120.4,0,0,3499189.3,0,0,3630316.8,0,0,1912310.8,0,0,1856149.2,0,0,2330872.5,0,0,-254314.65,0,0,-658492.2,0,0,197001.66,0,0,-2314932.7,0,0,-2864039.1,0,0,-2007682.1,0,0,-3410309.6,0,0,-3725081.1,0,0,-3494460.7}; +VT(0.045416206,0.061541227,0,0.047469022,0.070467195,0,0.041057987,0.068843254,0){0,0,3642820.9,0,0,3608010.8,0,0,3488848.8,0,0,2181474.8,0,0,1730907.5,0,0,1752771.3,0,0,-155055.51,0,0,-1046792,0,0,-855539,0,0,-2429600.5,0,0,-3280034.9,0,0,-3038218.5,0,0,-3730025.8,0,0,-3807136.9,0,0,-3709409.4}; +VT(0.081119523,0.0085521597,0,0.078020383,0.017034313,0,0.073684623,0.0112317,0){0,0,2167108.8,0,0,2461848.1,0,0,2850123.3,0,0,2149779.2,0,0,2383750.6,0,0,2810738.2,0,0,2115263.6,0,0,2230032.5,0,0,2732509.2,0,0,2063869.7,0,0,2005590.6,0,0,2616540.6,0,0,1995657.9,0,0,1717239.5,0,0,2464223.2}; +VT(0.073754091,0.28851618,0,0.078222118,0.28277283,0,0.081165886,0.29137431,0){0,0,171229.59,0,0,220930.92,0,0,97729.953,0,0,-511212.67,0,0,-655625.13,0,0,-292395.17,0,0,843808.82,0,0,1069057.6,0,0,484687.71,0,0,-1164215.8,0,0,-1447830.3,0,0,-673055.06,0,0,1467609.3,0,0,1779434.3,0,0,855744.16}; +VT(0.029124573,0.24658198,0,0.025641665,0.25311603,0,0.02133326,0.24577003,0){0,0,849052.23,0,0,680173.91,0,0,675269.21,0,0,-2288340.2,0,0,-1879847.5,0,0,-1813848.4,0,0,3030093.5,0,0,2635470.4,0,0,2383092.9,0,0,-2848204.4,0,0,-2768550.2,0,0,-2204305.3,0,0,1797881.3,0,0,2247361.6,0,0,1333319.6}; +VT(0.02133326,0.24577003,0,0.025641665,0.25311603,0,0.018179834,0.25267212,0){0,0,675269.21,0,0,680173.91,0,0,514543.14,0,0,-1813848.4,0,0,-1879847.5,0,0,-1419813.2,0,0,2383092.9,0,0,2635470.4,0,0,1983439.5,0,0,-2204305.3,0,0,-2768550.2,0,0,-2069793.3,0,0,1333319.6,0,0,2247361.6,0,0,1657747.8}; +VT(0.036912897,0.21765752,0,0.030490983,0.2108424,0,0.038843793,0.21103197,0){0,0,1486590.9,0,0,1428644.1,0,0,1637090.1,0,0,-3421295.1,0,0,-3128471,0,0,-3590120.4,0,0,2965983.4,0,0,2293671,0,0,2645890.8,0,0,-438566.7,0,0,399562.24,0,0,433646.44,0,0,-2395869.1,0,0,-2769801.9,0,0,-3163532.2}; +VT(0.089437553,0.21298247,0,0.091864029,0.22106993,0,0.082942949,0.21818591,0){0,0,556322.48,0,0,394005.54,0,0,823054.75,0,0,-1238115.4,0,0,-927852.61,0,0,-1901094.8,0,0,961021.23,0,0,863120.02,0,0,1667014.3,0,0,60411.18,0,0,-241435.16,0,0,-282341.7,0,0,-1035404.3,0,0,-536498.87,0,0,-1297502.9}; +VT(0.0060732531,0.2674669,0,0.0071908097,0.26035264,0,0.014305262,0.26641769,0){0,0,124750.88,0,0,179155.76,0,0,294901.31,0,0,-359918.85,0,0,-507033.49,0,0,-848621.76,0,0,553735.12,0,0,748779.14,0,0,1298521.9,0,0,-683931.42,0,0,-863311.12,0,0,-1589572.3,0,0,735399.5,0,0,830950.48,0,0,1686004.5}; +VT(0.082583958,0.10907049,0,0.08466046,0.11619385,0,0.077013163,0.11736903,0){0,0,1698614.9,0,0,1475783,0,0,2095773.2,0,0,-286603.09,0,0,-452604.25,0,0,-691227.47,0,0,-1936849,0,0,-1789662.1,0,0,-2559181.5,0,0,-1323464.6,0,0,-788262.21,0,0,-1023961.4,0,0,836522.31,0,0,1243195.1,0,0,1873161.8}; +VT(0.060672554,0.13561545,0,0.068478919,0.13862632,0,0.061244461,0.14481879,0){0,0,2778852.8,0,0,2426951.1,0,0,2643484.5,0,0,-1944873,0,0,-1850187.5,0,0,-2356788.3,0,0,-3362653.4,0,0,-2866745.3,0,0,-2899198.4,0,0,935707.85,0,0,1169007.7,0,0,2042509.4,0,0,3643681.7,0,0,3144665.9,0,0,3121060.9}; +VT(0.037999827,0.27482627,0,0.045044357,0.28188841,0,0.036602132,0.28491153,0){0,0,474219.19,0,0,362990.51,0,0,279518.56,0,0,-1389905,0,0,-1075960.6,0,0,-831596.18,0,0,2209621.2,0,0,1750378.7,0,0,1362985.6,0,0,-2876809.4,0,0,-2362097.1,0,0,-1860498.2,0,0,3345267.4,0,0,2889034,0,0,2311728.5}; +VT(0.014137494,0.034012185,0,0.0063343033,0.038958017,0,0.0058133292,0.032528446,0){0,0,1641076.4,0,0,751213.74,0,0,694559.72,0,0,1435142,0,0,627892.11,0,0,614750.96,0,0,1049094.4,0,0,401490.67,0,0,464300.7,0,0,531342.12,0,0,109174.99,0,0,260495.38,0,0,-53364.585,0,0,-201236.23,0,0,26512.55}; +VT(0.070865224,0.080352924,0,0.072044079,0.08604506,0,0.064352171,0.083117586,0){0,0,2808030.6,0,0,2688599.4,0,0,3167194.8,0,0,934415.1,0,0,649473.83,0,0,915483.69,0,0,-1562677.5,0,0,-1882262.6,0,0,-1987167.2,0,0,-3017110.1,0,0,-2986497.2,0,0,-3477240.4,0,0,-2458745.5,0,0,-1825996.4,0,0,-2495770}; +VT(0.061476805,0.16269562,0,0.067098511,0.16826118,0,0.060825265,0.17090728,0){0,0,2391378.9,0,0,2121688.2,0,0,2288734.2,0,0,-3025373.1,0,0,-2928224.5,0,0,-3282960.5,0,0,-1589341.3,0,0,-1008555.7,0,0,-862639.89,0,0,3446908.2,0,0,3311710.7,0,0,3657845.3,0,0,675366.83,0,0,-250662.47,0,0,-726586.11}; +VT(0.052494391,0.065958781,0,0.047469022,0.070467195,0,0.045416206,0.061541227,0){0,0,3640248,0,0,3608010.8,0,0,3642820.9,0,0,1971511.2,0,0,1730907.5,0,0,2181474.8,0,0,-601016.65,0,0,-1046792,0,0,-155055.51,0,0,-2898090,0,0,-3280034.9,0,0,-2429600.5,0,0,-3866942,0,0,-3807136.9,0,0,-3730025.8}; +VT(0.034786476,0.1076516,0,0.030466665,0.11568191,0,0.025770754,0.10718168,0){0,0,2912738.3,0,0,2608170,0,0,2378738.7,0,0,-413135.58,0,0,-773675.45,0,0,-316264.13,0,0,-3267374.9,0,0,-3152461.4,0,0,-2653040.8,0,0,-2390915.6,0,0,-1443702.3,0,0,-1984140.6,0,0,1215377.6,0,0,2136967.4,0,0,932667.69}; +VT(0.054828578,0.081464579,0,0.058212185,0.089881183,0,0.049739958,0.088394034,0){0,0,3492382.6,0,0,3344291.6,0,0,3472240.4,0,0,1101278.5,0,0,593905.21,0,0,703521.31,0,0,-2043909.2,0,0,-2645013.4,0,0,-2626240.1,0,0,-3789901.6,0,0,-3708817.1,0,0,-3862017.3,0,0,-2941538.5,0,0,-1722713.3,0,0,-2018648.2}; +VT(0.079063451,0.10043005,0,0.069968451,0.098831219,0,0.07492972,0.092844339,0){0,0,2051820.1,0,0,2730411,0,0,2431427.6,0,0,-16056.497,0,0,57648.531,0,0,308451.38,0,0,-2067914.3,0,0,-2671597.7,0,0,-2083891.4,0,0,-2035845.1,0,0,-2785714.6,0,0,-2656803.1,0,0,48244.512,0,0,-173126.8,0,0,-910298.79}; +VT(0.013878694,0.17880836,0,0.020636298,0.17424253,0,0.021251228,0.18136297,0){0,0,971566.52,0,0,1433869.3,0,0,1398279.8,0,0,-1548960.4,0,0,-2154082.5,0,0,-2300353.4,0,0,-51095.574,0,0,-351921.61,0,0,85724.805,0,0,1579530,0,0,2330929.4,0,0,2245163.6,0,0,-887966.26,0,0,-819073.82,0,0,-1534338.6}; +VT(0.085905658,0.016824409,0,0.078020383,0.017034313,0,0.081119523,0.0085521597,0){0,0,1656238,0,0,2461848.1,0,0,2167108.8,0,0,1604967.9,0,0,2383750.6,0,0,2149779.2,0,0,1504009.2,0,0,2230032.5,0,0,2115263.6,0,0,1356492.3,0,0,2005590.6,0,0,2063869.7,0,0,1166855,0,0,1717239.5,0,0,1995657.9}; +VT(0.081165886,0.29137431,0,0.078222118,0.28277283,0,0.08596482,0.28314521,0){0,0,97729.953,0,0,220930.92,0,0,145967.81,0,0,-292395.17,0,0,-655625.13,0,0,-433371.98,0,0,484687.71,0,0,1069057.6,0,0,707326.96,0,0,-673055.06,0,0,-1447830.3,0,0,-959333.22,0,0,855744.16,0,0,1779434.3,0,0,1181452.3}; +VT(0.021167753,0.13548502,0,0.017312959,0.14496605,0,0.012304267,0.13852123,0){0,0,1816935.7,0,0,1456929,0,0,1094693.2,0,0,-1266652.3,0,0,-1303417.8,0,0,-832176.34,0,0,-2200669.4,0,0,-1594293.7,0,0,-1294374.3,0,0,600161.11,0,0,1135517.7,0,0,521821.54,0,0,2382629.9,0,0,1713822.2,0,0,1419655.5}; +VT(0.026018946,0.14387862,0,0.017312959,0.14496605,0,0.021167753,0.13548502,0){0,0,2064539,0,0,1456929,0,0,1816935.7,0,0,-1800072.3,0,0,-1303417.8,0,0,-1266652.3,0,0,-2295230.1,0,0,-1594293.7,0,0,-2200669.4,0,0,1506177.8,0,0,1135517.7,0,0,600161.11,0,0,2488196.2,0,0,1713822.2,0,0,2382629.9}; +VT(0.014137494,0.034012185,0,0.0058133292,0.032528446,0,0.0084994266,0.025462386,0){0,0,1641076.4,0,0,694559.72,0,0,1014895.2,0,0,1435142,0,0,614750.96,0,0,943121.65,0,0,1049094.4,0,0,464300.7,0,0,804669.5,0,0,531342.12,0,0,260495.38,0,0,609367.99,0,0,-53364.585,0,0,26512.55,0,0,370926.59}; +VT(0.0087746229,0.27470702,0,0.0060732531,0.2674669,0,0.014305262,0.26641769,0){0,0,139476.7,0,0,124750.88,0,0,294901.31,0,0,-408686.72,0,0,-359918.85,0,0,-848621.76,0,0,649356.33,0,0,553735.12,0,0,1298521.9,0,0,-844695.79,0,0,-683931.42,0,0,-1589572.3,0,0,980930.37,0,0,735399.5,0,0,1686004.5}; +VT(0.045375723,0.12284566,0,0.040442009,0.11996282,0,0.044666369,0.11545829,0){0,0,3072436,0,0,2999410,0,0,3148096.1,0,0,-1348503.3,0,0,-1143461.2,0,0,-920013.3,0,0,-3829159.4,0,0,-3706983.7,0,0,-3799301.5,0,0,-800055.99,0,0,-1150363.3,0,0,-1769018.1,0,0,3380414.3,0,0,2995190.5,0,0,2547335.8}; +VT(0,0.18571429,0,0.0066871595,0.19241823,0,0,0.19285714,0){0,0,0,0,0,432113.5,0,0,0,0,0,0,0,0,-803518.34,0,0,0,0,0,0,0,0,258472.73,0,0,0,0,0,0,0,0,581490.34,0,0,0,0,0,0,0,0,-758588.26,0,0,0}; +VT(0.038464606,0.12667013,0,0.030575169,0.1246812,0,0.035619257,0.12028764,0){0,0,2859316.3,0,0,2526238.7,0,0,2821397.9,0,0,-1476046.2,0,0,-1202245.8,0,0,-1093830.4,0,0,-3573486.5,0,0,-3156412.2,0,0,-3491178.8,0,0,-252868.56,0,0,-451924.48,0,0,-1043884.2,0,0,3451249.3,0,0,2919641.1,0,0,2851838.9}; +VT(0.025770754,0.10718168,0,0.017861336,0.10270337,0,0.024938414,0.098415267,0){0,0,2378738.7,0,0,1773538.4,0,0,2383058.5,0,0,-316264.13,0,0,-87655.931,0,0,68195.72,0,0,-2653040.8,0,0,-1856823.6,0,0,-2312962.3,0,0,-1984140.6,0,0,-1677437.3,0,0,-2447461.4,0,0,932667.69,0,0,261812.45,0,0,-204726.33}; +VT(0.022740693,0.23189018,0,0.025350652,0.23917347,0,0.015758122,0.23699049,0){0,0,887604.04,0,0,868665.73,0,0,597291.98,0,0,-2230116.3,0,0,-2265304,0,0,-1541119.1,0,0,2485475.6,0,0,2773502.3,0,0,1837947.1,0,0,-1529145.6,0,0,-2193941.8,0,0,-1363109.4,0,0,-172982.46,0,0,753574.67,0,0,315646.37}; +VT(0.032911969,0.081185013,0,0.041803352,0.076750149,0,0.041002292,0.08644635,0){0,0,3037931.3,0,0,3453761.9,0,0,3351345,0,0,971274.35,0,0,1340279.2,0,0,787437.3,0,0,-1756226.8,0,0,-1593440.1,0,0,-2379027.1,0,0,-3289165.4,0,0,-3552303.7,0,0,-3725698.5,0,0,-2584916.3,0,0,-3337911.6,0,0,-2222336.9}; +VT(0.0087746229,0.27470702,0,0.0067236406,0.28198319,0,0,0.27857143,0){0,0,139476.7,0,0,76627.274,0,0,0,0,0,-408686.72,0,0,-227172.13,0,0,0,0,0,649356.33,0,0,369685.4,0,0,0,0,0,-844695.79,0,0,-499127.77,0,0,0,0,0,980930.37,0,0,610772.43,0,0,0}; +VT(0,0.021428571,0,0.006650898,0.018174199,0,0.0084994266,0.025462386,0){0,0,0,0,0,801243.34,0,0,1014895.2,0,0,0,0,0,772347.91,0,0,943121.65,0,0,0,0,0,715593.27,0,0,804669.5,0,0,0,0,0,633022.27,0,0,609367.99,0,0,0,0,0,527557,0,0,370926.59}; +VT(0.013229009,0.21171696,0,0.018343869,0.21720619,0,0.010546892,0.2198034,0){0,0,698716.07,0,0,888277.19,0,0,514716.79,0,0,-1540332.8,0,0,-2037897.4,0,0,-1201974.2,0,0,1156621.3,0,0,1749211,0,0,1090194.6,0,0,147278.69,0,0,-225952.88,0,0,-253690.09,0,0,-1334554.8,0,0,-1457259.1,0,0,-751659.26}; +VT(0.010546892,0.2198034,0,0.018343869,0.21720619,0,0.017207343,0.22323305,0){0,0,514716.79,0,0,888277.19,0,0,781289.63,0,0,-1201974.2,0,0,-2037897.4,0,0,-1865590.4,0,0,1090194.6,0,0,1749211,0,0,1807835.2,0,0,-253690.09,0,0,-225952.88,0,0,-643322.1,0,0,-751659.26,0,0,-1457259.1,0,0,-915362.92}; +VT(0.060432552,0.20227914,0,0.06966854,0.20076802,0,0.066992124,0.20847551,0){0,0,1798951.1,0,0,1570520.4,0,0,1540360.8,0,0,-3671781.8,0,0,-3162888.4,0,0,-3311175.4,0,0,2023610.8,0,0,1636334.6,0,0,2266191.6,0,0,1565241.8,0,0,1503948.1,0,0,706070.36,0,0,-3653837,0,0,-3161601.9,0,0,-3078419.5}; +VT(0.066012722,0.055502179,0,0.073604017,0.054819307,0,0.070754378,0.060222618,0){0,0,3257272.9,0,0,2744584.6,0,0,2932444.5,0,0,2187557.2,0,0,1864679.8,0,0,1804303.3,0,0,399401.17,0,0,386939.94,0,0,-17984.254,0,0,-1519988.7,0,0,-1214908.7,0,0,-1833384.6,0,0,-2940625.1,0,0,-2427603.9,0,0,-2943704.7}; +VT(0.025770754,0.10718168,0,0.023213665,0.1150537,0,0.016927821,0.11108648,0){0,0,2378738.7,0,0,2130593.3,0,0,1644246.3,0,0,-316264.13,0,0,-605772.32,0,0,-340994.5,0,0,-2653040.8,0,0,-2564157.8,0,0,-1914445.6,0,0,-1984140.6,0,0,-1229375.9,0,0,-1176430.8,0,0,932667.69,0,0,1684092.7,0,0,981584.41}; +VT(0.024008584,0.022367291,0,0.016759526,0.025876157,0,0.015416139,0.018002698,0){0,0,2639060.6,0,0,1932221.9,0,0,1798828.3,0,0,2494948.4,0,0,1791225.7,0,0,1735136,0,0,2214593.6,0,0,1519509.7,0,0,1609995.5,0,0,1813324.4,0,0,1136895.1,0,0,1427830.3,0,0,1312931.3,0,0,671081.1,0,0,1194733.1}; +VT(0.076938259,0.060604721,0,0.079822506,0.065677674,0,0.072323403,0.067507008,0){0,0,2443533.2,0,0,2163855.5,0,0,2781512.1,0,0,1491930.8,0,0,1180001.4,0,0,1448400.9,0,0,-40674.57,0,0,-340376.77,0,0,-578922.09,0,0,-1557435.8,0,0,-1706002.2,0,0,-2328912.3,0,0,-2468002.6,0,0,-2296197.5,0,0,-2963263.7}; +VT(0.015498485,0.28248556,0,0.018422519,0.27450763,0,0.023483408,0.28013687,0){0,0,166274.63,0,0,282501.19,0,0,270985.88,0,0,-493262.57,0,0,-827496.14,0,0,-801278.39,0,0,803759.61,0,0,1313896,0,0,1297043.7,0,0,-1087394.1,0,0,-1707268.8,0,0,-1736920.8,0,0,1334475.8,0,0,1979556.1,0,0,2101746.5}; +VT(0.047556344,0.24377674,0,0.043027686,0.24899973,0,0.040431855,0.24188745,0){0,0,1122639.4,0,0,999522.33,0,0,1110505,0,0,-2989881.7,0,0,-2720190.5,0,0,-2932804,0,0,3850350.4,0,0,3683283.3,0,0,3702149.5,0,0,-3414324.1,0,0,-3620573.8,0,0,-3142324.5,0,0,1828478.4,0,0,2549278.8,0,0,1453973.2}; +VT(0.092295863,0.26000779,0,0.083190767,0.25723975,0,0.090077759,0.25268961,0){0,0,193329.27,0,0,434158.6,0,0,291813.61,0,0,-546576.12,0,0,-1216864.4,0,0,-805257.31,0,0,805368.84,0,0,1759626.8,0,0,1125037.4,0,0,-924990.4,0,0,-1955417.3,0,0,-1174248.1,0,0,884724.5,0,0,1765235.2,0,0,940920.06}; +VT(0.085115353,0.26563346,0,0.083190767,0.25723975,0,0.092295863,0.26000779,0){0,0,313056.52,0,0,434158.6,0,0,193329.27,0,0,-899063.8,0,0,-1216864.4,0,0,-546576.12,0,0,1369900.4,0,0,1759626.8,0,0,805368.84,0,0,-1665255.4,0,0,-1955417.3,0,0,-924990.4,0,0,1747205.8,0,0,1765235.2,0,0,884724.5}; +VT(0.08974924,0.047235181,0,0.082493405,0.042375289,0,0.092141527,0.03991184,0){0,0,1190814.4,0,0,1978611.8,0,0,927649.93,0,0,905328.07,0,0,1595319.9,0,0,767955.56,0,0,402804.56,0,0,902966.17,0,0,476054.53,0,0,-196265.4,0,0,35643.43,0,0,102192.68,0,0,-748421.11,0,0,-838916.97,0,0,-289378.9}; +VT(0.092141527,0.03991184,0,0.082493405,0.042375289,0,0.084917502,0.034253561,0){0,0,927649.93,0,0,1978611.8,0,0,1742331.8,0,0,767955.56,0,0,1595319.9,0,0,1520580.8,0,0,476054.53,0,0,902966.17,0,0,1105294,0,0,102192.68,0,0,35643.43,0,0,549324.68,0,0,-289378.9,0,0,-838916.97,0,0,-76880.401}; +VT(0.04704595,0.16277363,0,0.042155309,0.15589067,0,0.050010485,0.1548865,0){0,0,2543508.6,0,0,2577776.2,0,0,2672912.2,0,0,-3221973.5,0,0,-2895603.6,0,0,-2946373.7,0,0,-1684138.2,0,0,-2220826.4,0,0,-2371553.9,0,0,3671419.3,0,0,3169529.7,0,0,3189127.5,0,0,704902.67,0,0,1830012,0,0,2045305.7}; +VT(0.04704595,0.16277363,0,0.054395265,0.16699477,0,0.048076401,0.17082416,0){0,0,2543508.6,0,0,2465605.5,0,0,2424680.5,0,0,-3221973.5,0,0,-3338618.7,0,0,-3473815.1,0,0,-1684138.2,0,0,-1283530.8,0,0,-921629.25,0,0,3671419.3,0,0,3793219.5,0,0,3872759.5,0,0,704902.67,0,0,-59660.123,0,0,-754316.94}; +VT(0.046341114,0.044942776,0,0.03663522,0.040674234,0,0.043838979,0.034579424,0){0,0,3748809.1,0,0,3463485.9,0,0,3745913.7,0,0,2933624.2,0,0,2844620.6,0,0,3260141.4,0,0,1480431.3,0,0,1717431.6,0,0,2351583.2,0,0,-294933.53,0,0,283267.24,0,0,1138042.7,0,0,-2006921.6,0,0,-1201989.6,0,0,-223347.31}; +VT(0.038515413,0.047952704,0,0.03663522,0.040674234,0,0.046341114,0.044942776,0){0,0,3516906.1,0,0,3463485.9,0,0,3748809.1,0,0,2648581.9,0,0,2844620.6,0,0,2933624.2,0,0,1126309.3,0,0,1717431.6,0,0,1480431.3,0,0,-674068.75,0,0,283267.24,0,0,-294933.53,0,0,-2308227.3,0,0,-1201989.6,0,0,-2006921.6}; +VT(0.043491003,0.26677795,0,0.037705658,0.25939989,0,0.04563604,0.25694979,0){0,0,657627.62,0,0,758443.36,0,0,859240.08,0,0,-1894105.9,0,0,-2140288.6,0,0,-2406042.8,0,0,2903724.9,0,0,3141072.6,0,0,3472131.8,0,0,-3565612.1,0,0,-3582615.2,0,0,-3844488.4,0,0,3800401.2,0,0,3385872.9,0,0,3448330.3}; +VT(0.04563604,0.25694979,0,0.037705658,0.25939989,0,0.039157325,0.25334591,0){0,0,859240.08,0,0,758443.36,0,0,884627.38,0,0,-2406042.8,0,0,-2140288.6,0,0,-2446896,0,0,3472131.8,0,0,3141072.6,0,0,3436661.2,0,0,-3844488.4,0,0,-3582615.2,0,0,-3622356.9,0,0,3448330.3,0,0,3385872.9,0,0,2960330.2}; +VT(0.077069107,0.15686929,0,0.076625322,0.14929356,0,0.084604507,0.15255901,0){0,0,1743907.9,0,0,1845555.4,0,0,1258841.2,0,0,-1994600,0,0,-1818255.1,0,0,-1326319,0,0,-1457243.4,0,0,-1872475.3,0,0,-1187789.9,0,0,2204191.1,0,0,1790618.2,0,0,1390056.3,0,0,1140253.2,0,0,1898765.5,0,0,1113216.6}; +VT(0.07180958,0.22984275,0,0.076796159,0.2234596,0,0.078984823,0.22953004,0){0,0,1079159.6,0,0,1008421.8,0,0,858343.29,0,0,-2680718.2,0,0,-2411357.4,0,0,-2128428.8,0,0,2899261.6,0,0,2346331.8,0,0,2291087.1,0,0,-1622013.4,0,0,-852928.84,0,0,-1261656.1,0,0,-492395.98,0,0,-1160000.7,0,0,-424553.92}; +VT(0.048076401,0.17082416,0,0.042242048,0.16806859,0,0.04704595,0.16277363,0){0,0,2424680.5,0,0,2399442.3,0,0,2543508.6,0,0,-3473815.1,0,0,-3302042.1,0,0,-3221973.5,0,0,-921629.25,0,0,-1157324.9,0,0,-1684138.2,0,0,3872759.5,0,0,3737475.6,0,0,3671419.3,0,0,-754316.94,0,0,-248746.29,0,0,704902.67}; +VT(0.043027686,0.24899973,0,0.036308441,0.24745658,0,0.040431855,0.24188745,0){0,0,999522.33,0,0,958174.94,0,0,1110505,0,0,-2720190.5,0,0,-2591684.5,0,0,-2932804,0,0,3683283.3,0,0,3460190.4,0,0,3702149.5,0,0,-3620573.8,0,0,-3307339.6,0,0,-3142324.5,0,0,2549278.8,0,0,2177878.8,0,0,1453973.2}; +VT(0.026270926,0.075674812,0,0.025411973,0.082310594,0,0.019499739,0.079597209,0){0,0,2630439.6,0,0,2525130.6,0,0,2040354.6,0,0,1063205.3,0,0,762374.09,0,0,702945.71,0,0,-1137545.6,0,0,-1532614.6,0,0,-1095289.5,0,0,-2660659.2,0,0,-2757779.1,0,0,-2175701.2,0,0,-2599027.8,0,0,-2058136.4,0,0,-1830384.7}; +VT(0.073708403,0.21517194,0,0.069002793,0.22246209,0,0.063265205,0.21633109,0){0,0,1225969.3,0,0,1267491.2,0,0,1505335.5,0,0,-2772471.1,0,0,-3011719.2,0,0,-3432481.9,0,0,2271379.1,0,0,2877058.6,0,0,2888962.8,0,0,-92677.622,0,0,-947533.34,0,0,-265885.87,0,0,-2155133.8,0,0,-1573376.1,0,0,-2549234.8}; +VT(0.082390534,0.079333541,0,0.091953893,0.078440357,0,0.08812606,0.087328167,0){0,0,1865676.5,0,0,889726.23,0,0,1269155.7,0,0,650380.91,0,0,322434.75,0,0,279658.57,0,0,-988603.29,0,0,-450550.32,0,0,-927894.68,0,0,-1983689.6,0,0,-936443.15,0,0,-1412053.3,0,0,-1686881.4,0,0,-825354.72,0,0,-795447.99}; +VT(0.1,0.085714286,0,0.091953893,0.078440357,0,0.1,0.078571429,0){0,0,0,0,0,889726.23,0,0,0,0,0,0,0,0,322434.75,0,0,0,0,0,0,0,0,-450550.32,0,0,0,0,0,0,0,0,-936443.15,0,0,0,0,0,0,0,0,-825354.72,0,0,0}; +VT(0.061631884,0.26868773,0,0.06660802,0.27624666,0,0.059078636,0.27701937,0){0,0,591535.29,0,0,417349.44,0,0,447007.97,0,0,-1711593.4,0,0,-1226359.7,0,0,-1315269.1,0,0,2649353.2,0,0,1959900.4,0,0,2107766.2,0,0,-3304968.8,0,0,-2572844.1,0,0,-2778864.5,0,0,3608394.3,0,0,3027289.2,0,0,3289755.3}; +VT(0.014137494,0.034012185,0,0.017433092,0.042090914,0,0.011573719,0.041901165,0){0,0,1641076.4,0,0,1971771.3,0,0,1347025.1,0,0,1435142,0,0,1594855,0,0,1091815.8,0,0,1049094.4,0,0,913057.13,0,0,629744.45,0,0,531342.12,0,0,56690.05,0,0,48353.226,0,0,-53364.585,0,0,-810753.02,0,0,-542301.86}; +VT(0.1,0.24285714,0,0.092168655,0.23668616,0,0.1,0.23571429,0){0,0,0,0,0,307607.26,0,0,0,0,0,0,0,0,-792496.69,0,0,0,0,0,0,0,0,941630.33,0,0,0,0,0,0,0,0,-691810.02,0,0,0,0,0,0,0,0,148523.72,0,0,0}; +VT(0.0072553778,0.13224921,0,0.0054758376,0.13911323,0,0,0.13571429,0){0,0,674958.82,0,0,495708.7,0,0,0,0,0,-425463.67,0,0,-382921.42,0,0,0,0,0,-832230.25,0,0,-582869.54,0,0,0,0,0,117822.57,0,0,250325.59,0,0,0,0,0,875622.71,0,0,639819.51,0,0,0}; +VT(0.015758122,0.23699049,0,0.025350652,0.23917347,0,0.02133326,0.24577003,0){0,0,597291.98,0,0,868665.73,0,0,675269.21,0,0,-1541119.1,0,0,-2265304,0,0,-1813848.4,0,0,1837947.1,0,0,2773502.3,0,0,2383092.9,0,0,-1363109.4,0,0,-2193941.8,0,0,-2204305.3,0,0,315646.37,0,0,753574.67,0,0,1333319.6}; +VT(0.039157325,0.25334591,0,0.036308441,0.24745658,0,0.043027686,0.24899973,0){0,0,884627.38,0,0,958174.94,0,0,999522.33,0,0,-2446896,0,0,-2591684.5,0,0,-2720190.5,0,0,3436661.2,0,0,3460190.4,0,0,3683283.3,0,0,-3622356.9,0,0,-3307339.6,0,0,-3620573.8,0,0,2960330.2,0,0,2177878.8,0,0,2549278.8}; +VT(0.076158908,0.12549637,0,0.070840483,0.12204614,0,0.077013163,0.11736903,0){0,0,2092101.1,0,0,2470738.2,0,0,2095773.2,0,0,-1030118.9,0,0,-1044803.2,0,0,-691227.47,0,0,-2615047.7,0,0,-3073782.1,0,0,-2559181.5,0,0,-297340.89,0,0,-729197.53,0,0,-1023961.4,0,0,2464056,0,0,2652961,0,0,1873161.8}; +VT(0.041402067,0.22952626,0,0.037546984,0.23452457,0,0.034969012,0.22634925,0){0,0,1348916.4,0,0,1205921.7,0,0,1299939.6,0,0,-3344816,0,0,-3072707.6,0,0,-3164156.1,0,0,3600200.4,0,0,3550700.1,0,0,3237729.2,0,0,-1982154,0,0,-2423829.8,0,0,-1478956,0,0,-667743.82,0,0,201013.93,0,0,-1117524.9}; +VT(0.017207343,0.22323305,0,0.012706169,0.22573828,0,0.010546892,0.2198034,0){0,0,781289.63,0,0,571782.3,0,0,514716.79,0,0,-1865590.4,0,0,-1386624.6,0,0,-1201974.2,0,0,1807835.2,0,0,1404300.2,0,0,1090194.6,0,0,-643322.1,0,0,-614658.98,0,0,-253690.09,0,0,-915362.92,0,0,-528535.98,0,0,-751659.26}; +VT(0.01788586,0.12850833,0,0.023379755,0.12686903,0,0.021167753,0.13548502,0){0,0,1616906.9,0,0,2047772.9,0,0,1816935.7,0,0,-895214.81,0,0,-1065433.1,0,0,-1266652.3,0,0,-2016472.2,0,0,-2558991,0,0,-2200669.4,0,0,-4802.2192,0,0,-162203.53,0,0,600161.11,0,0,2014144.7,0,0,2481221.5,0,0,2382629.9}; +VT(0.042433189,0.024814669,0,0.048866761,0.029559705,0,0.043838979,0.034579424,0){0,0,3739739.8,0,0,3831772.8,0,0,3745913.7,0,0,3488658.7,0,0,3467532.3,0,0,3260141.4,0,0,3003356.3,0,0,2773676.3,0,0,2351583.2,0,0,2316430.4,0,0,1816186,0,0,1138042.7,0,0,1473602,0,0,685852.4,0,0,-223347.31}; +VT(0.051167355,0.022914381,0,0.048866761,0.029559705,0,0.042433189,0.024814669,0){0,0,3850137.8,0,0,3831772.8,0,0,3739739.8,0,0,3629520.4,0,0,3467532.3,0,0,3488658.7,0,0,3200919.1,0,0,2773676.3,0,0,3003356.3,0,0,2588908.3,0,0,1816186,0,0,2316430.4,0,0,1828396.4,0,0,685852.4,0,0,1473602}; +VT(0.092195724,0.16853594,0,0.093710586,0.16080643,0,0.1,0.16428571,0){0,0,598378.34,0,0,507346.27,0,0,0,0,0,-829189.07,0,0,-621948.04,0,0,0,0,0,-278570.16,0,0,-366919.85,0,0,0,0,0,936666.51,0,0,704920.6,0,0,0,0,0,-82641.6,0,0,207593.47,0,0,0}; +VT(0.040431855,0.24188745,0,0.045331711,0.23557633,0,0.047556344,0.24377674,0){0,0,1110505,0,0,1270563.3,0,0,1122639.4,0,0,-2932804,0,0,-3255008.9,0,0,-2989881.7,0,0,3702149.5,0,0,3813331,0,0,3850350.4,0,0,-3142324.5,0,0,-2700862,0,0,-3414324.1,0,0,1453973.2,0,0,404484.48,0,0,1828478.4}; +VT(0.01180171,0.25230222,0,0.013821768,0.24617185,0,0.018179834,0.25267212,0){0,0,347512.04,0,0,454053.45,0,0,514543.14,0,0,-957611.77,0,0,-1221678.8,0,0,-1419813.2,0,0,1333704.3,0,0,1611329.8,0,0,1983439.5,0,0,-1383899.6,0,0,-1502439.1,0,0,-2069793.3,0,0,1095718.6,0,0,928515.88,0,0,1657747.8}; +VT(0.073234584,0.04253025,0,0.067616069,0.037109229,0,0.075978544,0.034466341,0){0,0,2820532.7,0,0,3239242.7,0,0,2615244.9,0,0,2270240.9,0,0,2756202.5,0,0,2278283.7,0,0,1277003.9,0,0,1862139.4,0,0,1647758.2,0,0,34586.382,0,0,690369.93,0,0,804880.96,0,0,-1214797.7,0,0,-584563.48,0,0,-142067.87}; +VT(0.076498673,0.26519709,0,0.068237016,0.26229006,0,0.074279052,0.25633166,0){0,0,473307.48,0,0,639705.29,0,0,635900.39,0,0,-1357765.2,0,0,-1820649,0,0,-1777029.4,0,0,2063933,0,0,2721368.6,0,0,2553015.8,0,0,-2499100.3,0,0,-3203243.1,0,0,-2804423.5,0,0,2605934.6,0,0,3191912.1,0,0,2479429.3}; +VT(0.072323403,0.067507008,0,0.070754378,0.060222618,0,0.076938259,0.060604721,0){0,0,2781512.1,0,0,2932444.5,0,0,2443533.2,0,0,1448400.9,0,0,1804303.3,0,0,1491930.8,0,0,-578922.09,0,0,-17984.254,0,0,-40674.57,0,0,-2328912.3,0,0,-1833384.6,0,0,-1557435.8,0,0,-2963263.7,0,0,-2943704.7,0,0,-2468002.6}; +VT(0.021167753,0.13548502,0,0.030046638,0.13690443,0,0.026018946,0.14387862,0){0,0,1816935.7,0,0,2369378.2,0,0,2064539,0,0,-1266652.3,0,0,-1721516.8,0,0,-1800072.3,0,0,-2200669.4,0,0,-2840145.3,0,0,-2295230.1,0,0,600161.11,0,0,944948.24,0,0,1506177.8,0,0,2382629.9,0,0,3098367.4,0,0,2488196.2}; +VT(0.049721881,0.27094787,0,0.045592054,0.27439642,0,0.043491003,0.26677795,0){0,0,588018.61,0,0,513714.39,0,0,657627.62,0,0,-1710042.9,0,0,-1504437.2,0,0,-1894105.9,0,0,2675009.8,0,0,2387679.2,0,0,2903724.9,0,0,-3394309,0,0,-3100344.3,0,0,-3565612.1,0,0,3801713.7,0,0,3591305.7,0,0,3800401.2}; +VT(0.076271482,0.13373081,0,0.076158908,0.12549637,0,0.082709707,0.12855445,0){0,0,2012844.4,0,0,2092101.1,0,0,1568327.1,0,0,-1330317.6,0,0,-1030118.9,0,0,-869760.99,0,0,-2463975.8,0,0,-2615047.7,0,0,-1955764.1,0,0,494859.01,0,0,-297340.89,0,0,-1353.9511,0,0,2631758.9,0,0,2464056,0,0,1955094.7}; +VT(0.090077759,0.25268961,0,0.085145188,0.25032735,0,0.089949388,0.2453858,0){0,0,291813.61,0,0,448997.25,0,0,339950.36,0,0,-805257.31,0,0,-1228228.7,0,0,-911669.73,0,0,1125037.4,0,0,1682589.8,0,0,1193275.4,0,0,-1174248.1,0,0,-1691886.1,0,0,-1095139.7,0,0,940920.06,0,0,1253443,0,0,648419.14}; +VT(0.08944657,0.05485846,0,0.083998423,0.049627851,0,0.08974924,0.047235181,0){0,0,1211526.2,0,0,1806853.8,0,0,1190814.4,0,0,822600.19,0,0,1329741.5,0,0,905328.07,0,0,169573.91,0,0,501474.01,0,0,402804.56,0,0,-537958.1,0,0,-459273.5,0,0,-196265.4,0,0,-1073022.7,0,0,-1299103.8,0,0,-748421.11}; +VT(0.041643161,0.17482395,0,0.042242048,0.16806859,0,0.048076401,0.17082416,0){0,0,2284160.6,0,0,2399442.3,0,0,2424680.5,0,0,-3458410.7,0,0,-3302042.1,0,0,-3473815.1,0,0,-506290.81,0,0,-1157324.9,0,0,-921629.25,0,0,3718851.8,0,0,3737475.6,0,0,3872759.5,0,0,-1405815.9,0,0,-248746.29,0,0,-754316.94}; +VT(0.038009007,0.015147577,0,0.046063037,0.016810165,0,0.042433189,0.024814669,0){0,0,3597209.6,0,0,3836060.2,0,0,3739739.8,0,0,3506943.3,0,0,3717529.2,0,0,3488658.7,0,0,3328697.3,0,0,3484126.2,0,0,3003356.3,0,0,3067010.9,0,0,3143090.2,0,0,2316430.4,0,0,2728518.9,0,0,2704667.4,0,0,1473602}; +VT(0.037999827,0.27482627,0,0.030312881,0.27848596,0,0.029991713,0.27132489,0){0,0,474219.19,0,0,355416.48,0,0,469504.82,0,0,-1389905,0,0,-1048284.8,0,0,-1366503,0,0,2209621.2,0,0,1688178.9,0,0,2141236.7,0,0,-2876809.4,0,0,-2242771,0,0,-2724385.3,0,0,3345267.4,0,0,2683885.3,0,0,3063642.3}; +VT(0.074931673,0.27468874,0,0.069536278,0.26943087,0,0.076498673,0.26519709,0){0,0,363389.18,0,0,505602.11,0,0,473307.48,0,0,-1064791.9,0,0,-1465439,0,0,-1357765.2,0,0,1691857.9,0,0,2276404,0,0,2063933,0,0,-2200836.4,0,0,-2856108.7,0,0,-2499100.3,0,0,2556129.1,0,0,3145421.5,0,0,2605934.6}; +VT(0.075978544,0.034466341,0,0.068707287,0.030314019,0,0.074388951,0.025102472,0){0,0,2615244.9,0,0,3188897.7,0,0,2772012.4,0,0,2278283.7,0,0,2870259.7,0,0,2581574.2,0,0,1647758.2,0,0,2264806.3,0,0,2213781,0,0,804880.96,0,0,1433032.7,0,0,1693914.7,0,0,-142067.87,0,0,457746.25,0,0,1057277.9}; +VT(0.021251228,0.18136297,0,0.016878531,0.18478654,0,0.013878694,0.17880836,0){0,0,1398279.8,0,0,1113458.1,0,0,971566.52,0,0,-2300353.4,0,0,-1906862.4,0,0,-1548960.4,0,0,85724.805,0,0,245299.96,0,0,-51095.574,0,0,2245163.6,0,0,1732097.5,0,0,1579530,0,0,-1534338.6,0,0,-1479759.2,0,0,-887966.26}; +VT(0.076498673,0.26519709,0,0.081004963,0.27070547,0,0.074931673,0.27468874,0){0,0,473307.48,0,0,333174.81,0,0,363389.18,0,0,-1357765.2,0,0,-968418.7,0,0,-1064791.9,0,0,2063933,0,0,1513258.3,0,0,1691857.9,0,0,-2499100.3,0,0,-1916833.2,0,0,-2200836.4,0,0,2605934.6,0,0,2141327.9,0,0,2556129.1}; +VT(0.085115353,0.26563346,0,0.081004963,0.27070547,0,0.076498673,0.26519709,0){0,0,313056.52,0,0,333174.81,0,0,473307.48,0,0,-899063.8,0,0,-968418.7,0,0,-1357765.2,0,0,1369900.4,0,0,1513258.3,0,0,2063933,0,0,-1665255.4,0,0,-1916833.2,0,0,-2499100.3,0,0,1747205.8,0,0,2141327.9,0,0,2605934.6}; +VT(0.075978544,0.034466341,0,0.080699945,0.029142305,0,0.084917502,0.034253561,0){0,0,2615244.9,0,0,2185639.9,0,0,1742331.8,0,0,2278283.7,0,0,1983669.2,0,0,1520580.8,0,0,1647758.2,0,0,1598386.1,0,0,1105294,0,0,804880.96,0,0,1065401.8,0,0,549324.68,0,0,-142067.87,0,0,433818.71,0,0,-76880.401}; +VT(0.074388951,0.025102472,0,0.080699945,0.029142305,0,0.075978544,0.034466341,0){0,0,2772012.4,0,0,2185639.9,0,0,2615244.9,0,0,2581574.2,0,0,1983669.2,0,0,2278283.7,0,0,2213781,0,0,1598386.1,0,0,1647758.2,0,0,1693914.7,0,0,1065401.8,0,0,804880.96,0,0,1057277.9,0,0,433818.71,0,0,-142067.87}; +VT(0.058552205,0.15400025,0,0.05288218,0.14757716,0,0.061244461,0.14481879,0){0,0,2589572.8,0,0,2767228.4,0,0,2643484.5,0,0,-2806487.5,0,0,-2626819.9,0,0,-2356788.3,0,0,-2354581.2,0,0,-2900596.1,0,0,-2899198.4,0,0,3003966,0,0,2479722.6,0,0,2042509.4,0,0,2103059.1,0,0,3026446,0,0,3121060.9}; +VT(0.050010485,0.1548865,0,0.05288218,0.14757716,0,0.058552205,0.15400025,0){0,0,2672912.2,0,0,2767228.4,0,0,2589572.8,0,0,-2946373.7,0,0,-2626819.9,0,0,-2806487.5,0,0,-2371553.9,0,0,-2900596.1,0,0,-2354581.2,0,0,3189127.5,0,0,2479722.6,0,0,3003966,0,0,2045305.7,0,0,3026446,0,0,2103059.1}; +VT(0.089230742,0.11966768,0,0.08466046,0.11619385,0,0.091758141,0.11296708,0){0,0,1043332.5,0,0,1475783,0,0,824791.32,0,0,-391602.7,0,0,-452604.25,0,0,-201020.76,0,0,-1287980.7,0,0,-1789662.1,0,0,-976886.6,0,0,-412950.99,0,0,-788262.21,0,0,-537824.26,0,0,1030099.2,0,0,1243195.1,0,0,570097.26}; +VT(0.0078195435,0.14622426,0,0.017312959,0.14496605,0,0.013794295,0.15422926,0){0,0,680366.1,0,0,1456929,0,0,1126466.2,0,0,-626541.18,0,0,-1303417.8,0,0,-1226232.2,0,0,-729870.69,0,0,-1594293.7,0,0,-1017954.8,0,0,568744.13,0,0,1135517.7,0,0,1316565.7,0,0,774663.29,0,0,1713822.2,0,0,901352.54}; +VT(0.012304267,0.13852123,0,0.017312959,0.14496605,0,0.0078195435,0.14622426,0){0,0,1094693.2,0,0,1456929,0,0,680366.1,0,0,-832176.34,0,0,-1303417.8,0,0,-626541.18,0,0,-1294374.3,0,0,-1594293.7,0,0,-729870.69,0,0,521821.54,0,0,1135517.7,0,0,568744.13,0,0,1419655.5,0,0,1713822.2,0,0,774663.29}; +VT(0.066401409,0.0434645,0,0.067616069,0.037109229,0,0.073234584,0.04253025,0){0,0,3289675.8,0,0,3239242.7,0,0,2820532.7,0,0,2619840.6,0,0,2756202.5,0,0,2270240.9,0,0,1416557.6,0,0,1862139.4,0,0,1277003.9,0,0,-75156.319,0,0,690369.93,0,0,34586.382,0,0,-1551772,0,0,-584563.48,0,0,-1214797.7}; +VT(0.074279052,0.25633166,0,0.068237016,0.26229006,0,0.066803853,0.25459223,0){0,0,635900.39,0,0,639705.29,0,0,789541.66,0,0,-1777029.4,0,0,-1820649,0,0,-2193455.3,0,0,2553015.8,0,0,2721368.6,0,0,3110738.9,0,0,-2804423.5,0,0,-3203243.1,0,0,-3337877,0,0,2479429.3,0,0,3191912.1,0,0,2824240.3}; +VT(0.064352171,0.083117586,0,0.066925078,0.074981916,0,0.070865224,0.080352924,0){0,0,3167194.8,0,0,3090390.8,0,0,2808030.6,0,0,915483.69,0,0,1280900.5,0,0,934415.1,0,0,-1987167.2,0,0,-1278621.5,0,0,-1562677.5,0,0,-3477240.4,0,0,-3089611.2,0,0,-3017110.1,0,0,-2495770,0,0,-3091904.4,0,0,-2458745.5}; +VT(0.069536278,0.26943087,0,0.06660802,0.27624666,0,0.061631884,0.26868773,0){0,0,505602.11,0,0,417349.44,0,0,591535.29,0,0,-1465439,0,0,-1226359.7,0,0,-1711593.4,0,0,2276404,0,0,1959900.4,0,0,2649353.2,0,0,-2856108.7,0,0,-2572844.1,0,0,-3304968.8,0,0,3145421.5,0,0,3027289.2,0,0,3608394.3}; +VT(0.056317057,0.058022103,0,0.053426379,0.049768916,0,0.061015306,0.048529238,0){0,0,3630316.8,0,0,3727873.1,0,0,3533367.8,0,0,2330872.5,0,0,2738031.5,0,0,2640342.3,0,0,197001.66,0,0,1021148,0,0,1080012.2,0,0,-2007682.1,0,0,-966926.63,0,0,-753291.7,0,0,-3494460.7,0,0,-2698501,0,0,-2396723.8}; +VT(0.064276416,0.12183086,0,0.059246105,0.12763558,0,0.057323957,0.1204315,0){0,0,2809128.6,0,0,2918223.5,0,0,3051716.5,0,0,-1175750.5,0,0,-1563762.3,0,0,-1191883,0,0,-3492840.6,0,0,-3644117.3,0,0,-3778168.4,0,0,-855220.15,0,0,-127593.52,0,0,-1110713.1,0,0,2995580.4,0,0,3585046,0,0,3101303}; +VT(0.011838853,0.2301677,0,0.016939848,0.22904958,0,0.015758122,0.23699049,0){0,0,504229.49,0,0,714788.59,0,0,597291.98,0,0,-1254859.2,0,0,-1767596.2,0,0,-1541119.1,0,0,1363834.1,0,0,1888698.3,0,0,1837947.1,0,0,-775392.51,0,0,-1014237.8,0,0,-1363109.4,0,0,-209768.04,0,0,-395054.79,0,0,315646.37}; +VT(0.046341114,0.044942776,0,0.042113175,0.053290167,0,0.038515413,0.047952704,0){0,0,3748809.1,0,0,3616583.4,0,0,3516906.1,0,0,2933624.2,0,0,2519252.9,0,0,2648581.9,0,0,1480431.3,0,0,657513.67,0,0,1126309.3,0,0,-294933.53,0,0,-1403801.4,0,0,-674068.75,0,0,-2006921.6,0,0,-3039615.4,0,0,-2308227.3}; +VT(0.042433189,0.024814669,0,0.033039341,0.023173825,0,0.038009007,0.015147577,0){0,0,3739739.8,0,0,3318087.9,0,0,3597209.6,0,0,3488658.7,0,0,3123656.1,0,0,3506943.3,0,0,3003356.3,0,0,2746181,0,0,3328697.3,0,0,2316430.4,0,0,2207795.9,0,0,3067010.9,0,0,1473602,0,0,1539940.3,0,0,2728518.9}; +VT(0.050010485,0.1548865,0,0.054296142,0.16027015,0,0.04704595,0.16277363,0){0,0,2672912.2,0,0,2568973.7,0,0,2543508.6,0,0,-2946373.7,0,0,-3120486,0,0,-3221973.5,0,0,-2371553.9,0,0,-1899085.7,0,0,-1684138.2,0,0,3189127.5,0,0,3528266.9,0,0,3671419.3,0,0,2045305.7,0,0,1141594.9,0,0,704902.67}; +VT(0.089949388,0.2453858,0,0.085145188,0.25032735,0,0.083292987,0.24598228,0){0,0,339950.36,0,0,448997.25,0,0,542685.82,0,0,-911669.73,0,0,-1228228.7,0,0,-1458992.1,0,0,1193275.4,0,0,1682589.8,0,0,1920780.7,0,0,-1095139.7,0,0,-1691886.1,0,0,-1784182,0,0,648419.14,0,0,1253443,0,0,1091638.2}; +VT(0.080938662,0.054906318,0,0.083998423,0.049627851,0,0.08944657,0.05485846,0){0,0,2097661.4,0,0,1806853.8,0,0,1211526.2,0,0,1423084,0,0,1329741.5,0,0,822600.19,0,0,290856.94,0,0,501474.01,0,0,169573.91,0,0,-934922.56,0,0,-459273.5,0,0,-537958.1,0,0,-1860365.1,0,0,-1299103.8,0,0,-1073022.7}; +VT(0.021957304,0.26060316,0,0.025641665,0.25311603,0,0.030217898,0.25971254,0){0,0,505833.44,0,0,680173.91,0,0,660621.26,0,0,-1432636.8,0,0,-1879847.5,0,0,-1866014.4,0,0,2119105.6,0,0,2635470.4,0,0,2744196,0,0,-2450095.8,0,0,-2768550.2,0,0,-3141188.1,0,0,2369995.8,0,0,2247361.6,0,0,2987009.7}; +VT(0.018179834,0.25267212,0,0.025641665,0.25311603,0,0.021957304,0.26060316,0){0,0,514543.14,0,0,680173.91,0,0,505833.44,0,0,-1419813.2,0,0,-1879847.5,0,0,-1432636.8,0,0,1983439.5,0,0,2635470.4,0,0,2119105.6,0,0,-2069793.3,0,0,-2768550.2,0,0,-2450095.8,0,0,1657747.8,0,0,2247361.6,0,0,2369995.8}; +VT(0.080160084,0.071577727,0,0.086276325,0.073599227,0,0.082390534,0.079333541,0){0,0,2107851.9,0,0,1502743.3,0,0,1865676.5,0,0,977984.82,0,0,653401.45,0,0,650380.91,0,0,-676141.96,0,0,-565297.67,0,0,-988603.29,0,0,-1967920.1,0,0,-1464602.7,0,0,-1983689.6,0,0,-2205119.3,0,0,-1536324.4,0,0,-1686881.4}; +VT(0.059246105,0.12763558,0,0.052058531,0.12554764,0,0.057323957,0.1204315,0){0,0,2918223.5,0,0,3065498.6,0,0,3051716.5,0,0,-1563762.3,0,0,-1512626.5,0,0,-1191883,0,0,-3644117.3,0,0,-3831818,0,0,-3778168.4,0,0,-127593.52,0,0,-428428.64,0,0,-1110713.1,0,0,3585046,0,0,3614977.4,0,0,3101303}; +VT(0.0910478,0.13167545,0,0.093938974,0.13899,0,0.087083587,0.13880919,0){0,0,831136.87,0,0,548364.78,0,0,1144744.3,0,0,-514132.23,0,0,-422206.84,0,0,-877072.07,0,0,-1027305.8,0,0,-645591.08,0,0,-1349889.8,0,0,122313.64,0,0,273728.87,0,0,561444.4,0,0,1073956.7,0,0,708600.91,0,0,1481228.8}; +VT(0.026270926,0.075674812,0,0.033874053,0.071548869,0,0.032911969,0.081185013,0){0,0,2630439.6,0,0,3157862.8,0,0,3037931.3,0,0,1063205.3,0,0,1466537.3,0,0,971274.35,0,0,-1137545.6,0,0,-1010259.7,0,0,-1756226.8,0,0,-2660659.2,0,0,-2946084.6,0,0,-3289165.4,0,0,-2599027.8,0,0,-3304540.6,0,0,-2584916.3}; +VT(0.033874053,0.071548869,0,0.027058874,0.069011929,0,0.031105381,0.06529626,0){0,0,3157862.8,0,0,2727323.5,0,0,3030579.1,0,0,1466537.3,0,0,1363815.9,0,0,1667989.8,0,0,-1010259.7,0,0,-681543.48,0,0,-444570.51,0,0,-2946084.6,0,0,-2386220.5,0,0,-2357289.6,0,0,-3304540.6,0,0,-2898415.6,0,0,-3210321.2}; +VT(0.1,0.17142857,0,0.092195724,0.16853594,0,0.1,0.16428571,0){0,0,0,0,0,598378.34,0,0,0,0,0,0,0,0,-829189.07,0,0,0,0,0,0,0,0,-278570.16,0,0,0,0,0,0,0,0,936666.51,0,0,0,0,0,0,0,0,-82641.6,0,0,0}; +VT(0.016927821,0.11108648,0,0.023213665,0.1150537,0,0.017763535,0.12074209,0){0,0,1644246.3,0,0,2130593.3,0,0,1657769.5,0,0,-340994.5,0,0,-605772.32,0,0,-657738.05,0,0,-1914445.6,0,0,-2564157.8,0,0,-2054600.3,0,0,-1176430.8,0,0,-1229375.9,0,0,-581651.26,0,0,981584.41,0,0,1684092.7,0,0,1703675.4}; +VT(0.085369203,0.17624497,0,0.082729031,0.18391978,0,0.077619244,0.18028791,0){0,0,1039089.6,0,0,1144258.1,0,0,1471797.4,0,0,-1603144.1,0,0,-1940160.8,0,0,-2389894.4,0,0,-168940.91,0,0,205244.05,0,0,18944.546,0,0,1695116.9,0,0,1797438.3,0,0,2378251.6,0,0,-751642.95,0,0,-1455642.1,0,0,-1502642.9}; +VT(0.060825265,0.17090728,0,0.054692531,0.17439284,0,0.054395265,0.16699477,0){0,0,2288734.2,0,0,2346407.8,0,0,2465605.5,0,0,-3282960.5,0,0,-3532168.6,0,0,-3338618.7,0,0,-862639.89,0,0,-561454.61,0,0,-1283530.8,0,0,3657845.3,0,0,3816051.1,0,0,3793219.5,0,0,-726586.11,0,0,-1367177.6,0,0,-59660.123}; +VT(0.047385855,0.10193045,0,0.054240748,0.10280037,0,0.050721192,0.10961634,0){0,0,3329666.7,0,0,3302360.6,0,0,3257974.6,0,0,-117239.93,0,0,-169115.68,0,0,-583831.78,0,0,-3442848.4,0,0,-3462856.5,0,0,-3737290.3,0,0,-3204510.9,0,0,-3116478.2,0,0,-2483878.9,0,0,350991.89,0,0,505791.56,0,0,1698581.7}; +VT(0.018179834,0.25267212,0,0.013821768,0.24617185,0,0.02133326,0.24577003,0){0,0,514543.14,0,0,454053.45,0,0,675269.21,0,0,-1419813.2,0,0,-1221678.8,0,0,-1813848.4,0,0,1983439.5,0,0,1611329.8,0,0,2383092.9,0,0,-2069793.3,0,0,-1502439.1,0,0,-2204305.3,0,0,1657747.8,0,0,928515.88,0,0,1333319.6}; +VT(0.1,0.22142857,0,0.091864029,0.22106993,0,0.1,0.21428571,0){0,0,0,0,0,394005.54,0,0,0,0,0,0,0,0,-927852.61,0,0,0,0,0,0,0,0,863120.02,0,0,0,0,0,0,0,0,-241435.16,0,0,0,0,0,0,0,0,-536498.87,0,0,0}; +VT(0.038427921,0.16264679,0,0.042155309,0.15589067,0,0.04704595,0.16277363,0){0,0,2389351.9,0,0,2577776.2,0,0,2543508.6,0,0,-3020403.6,0,0,-2895603.6,0,0,-3221973.5,0,0,-1591681.4,0,0,-2220826.4,0,0,-1684138.2,0,0,3440909.6,0,0,3169529.7,0,0,3671419.3,0,0,682723.32,0,0,1830012,0,0,704902.67}; +VT(0.091323117,0.29067423,0,0.081165886,0.29137431,0,0.08596482,0.28314521,0){0,0,51002.156,0,0,97729.953,0,0,145967.81,0,0,-152526.43,0,0,-292395.17,0,0,-433371.98,0,0,252617.29,0,0,484687.71,0,0,707326.96,0,0,-350336.87,0,0,-673055.06,0,0,-959333.22,0,0,444691.33,0,0,855744.16,0,0,1181452.3}; +VT(0.085905658,0.016824409,0,0.081119523,0.0085521597,0,0.091308694,0.0093164623,0){0,0,1656238,0,0,2167108.8,0,0,1045151,0,0,1604967.9,0,0,2149779.2,0,0,1035216.9,0,0,1504009.2,0,0,2115263.6,0,0,1015442.8,0,0,1356492.3,0,0,2063869.7,0,0,986027.05,0,0,1166855,0,0,1995657.9,0,0,947106.05}; +VT(0.069025318,0.11622387,0,0.074105201,0.11070107,0,0.077013163,0.11736903,0){0,0,2631986.5,0,0,2359475.3,0,0,2095773.2,0,0,-808686.45,0,0,-471755.94,0,0,-691227.47,0,0,-3192250.9,0,0,-2736894.8,0,0,-2559181.5,0,0,-1402768.4,0,0,-1717960.7,0,0,-1023961.4,0,0,2220554.1,0,0,1362139.4,0,0,1873161.8}; +VT(0.043569257,0.19619451,0,0.036160627,0.1953007,0,0.039366597,0.19088868,0){0,0,1966078.6,0,0,1834250.2,0,0,1982365.2,0,0,-3794921.6,0,0,-3509998.2,0,0,-3628592.6,0,0,1563901,0,0,1372423.7,0,0,1030950.1,0,0,2340412.7,0,0,2256297.6,0,0,2772526.5,0,0,-3741435.4,0,0,-3434247.7,0,0,-3333638.5}; +VT(0.048791783,0.28884593,0,0.051519181,0.28417908,0,0.055764419,0.28986395,0){0,0,226341.07,0,0,320732.11,0,0,202473.1,0,0,-675936.71,0,0,-953415.16,0,0,-605163.67,0,0,1116322.7,0,0,1560004.1,0,0,1001119.7,0,0,-1541505,0,0,-2123899.5,0,0,-1385941.2,0,0,1945474.1,0,0,2629434.9,0,0,1755276.4}; +VT(0.1,0.092857143,0,0.093922759,0.092262381,0,0.1,0.085714286,0){0,0,0,0,0,652083.63,0,0,0,0,0,0,0,0,89312.894,0,0,0,0,0,0,0,0,-550573,0,0,0,0,0,0,0,0,-715327.2,0,0,0,0,0,0,0,0,-262838.8,0,0,0}; +VT(0.049232245,0.21047418,0,0.053910411,0.21448753,0,0.045116599,0.21481108,0){0,0,1752658.6,0,0,1667429.4,0,0,1654487.5,0,0,-3827070.5,0,0,-3752161.8,0,0,-3731787.4,0,0,2777012.8,0,0,3023771,0,0,3030991.5,0,0,540242.46,0,0,-28239.212,0,0,-73694.316,0,0,-3416565.4,0,0,-2988983.1,0,0,-2938909.4}; +VT(0.082493405,0.042375289,0,0.073234584,0.04253025,0,0.075978544,0.034466341,0){0,0,1978611.8,0,0,2820532.7,0,0,2615244.9,0,0,1595319.9,0,0,2270240.9,0,0,2278283.7,0,0,902966.17,0,0,1277003.9,0,0,1647758.2,0,0,35643.43,0,0,34586.382,0,0,804880.96,0,0,-838916.97,0,0,-1214797.7,0,0,-142067.87}; +VT(0.076498673,0.26519709,0,0.074279052,0.25633166,0,0.083190767,0.25723975,0){0,0,473307.48,0,0,635900.39,0,0,434158.6,0,0,-1357765.2,0,0,-1777029.4,0,0,-1216864.4,0,0,2063933,0,0,2553015.8,0,0,1759626.8,0,0,-2499100.3,0,0,-2804423.5,0,0,-1955417.3,0,0,2605934.6,0,0,2479429.3,0,0,1765235.2}; +VT(0.056199026,0.010061392,0,0.06203594,0.0060944193,0,0.064075209,0.013493001,0){0,0,3801979,0,0,3604620.2,0,0,3498581.2,0,0,3759859.9,0,0,3589956.2,0,0,3428890.3,0,0,3676084,0,0,3560685.5,0,0,3290906.4,0,0,3551608.2,0,0,3516960.1,0,0,3087427.7,0,0,3387596.5,0,0,3458793.9,0,0,2822154}; +VT(0.061476805,0.16269562,0,0.054296142,0.16027015,0,0.058552205,0.15400025,0){0,0,2391378.9,0,0,2568973.7,0,0,2589572.8,0,0,-3025373.1,0,0,-3120486,0,0,-2806487.5,0,0,-1589341.3,0,0,-1899085.7,0,0,-2354581.2,0,0,3446908.2,0,0,3528266.9,0,0,3003966,0,0,675366.83,0,0,1141594.9,0,0,2103059.1}; +VT(0.063469548,0.28521738,0,0.061805884,0.29356168,0,0.055764419,0.28986395,0){0,0,273598.49,0,0,121923.05,0,0,202473.1,0,0,-814255.31,0,0,-365207.83,0,0,-605163.67,0,0,1335465.2,0,0,606815.62,0,0,1001119.7,0,0,-1824812,0,0,-845641.09,0,0,-1385941.2,0,0,2270429.1,0,0,1080583.1,0,0,1755276.4}; +VT(0.08812606,0.087328167,0,0.093922759,0.092262381,0,0.087331535,0.0958472,0){0,0,1269155.7,0,0,652083.63,0,0,1318484.3,0,0,279658.57,0,0,89312.894,0,0,98077.228,0,0,-927894.68,0,0,-550573,0,0,-1213131.9,0,0,-1412053.3,0,0,-715327.2,0,0,-1401481.2,0,0,-795447.99,0,0,-262838.8,0,0,-292629.72}; +VT(0.06961584,0.048915995,0,0.073604017,0.054819307,0,0.066012722,0.055502179,0){0,0,3063466,0,0,2744584.6,0,0,3257272.9,0,0,2277085.6,0,0,1864679.8,0,0,2187557.2,0,0,906160.93,0,0,386939.94,0,0,399401.17,0,0,-697426.19,0,0,-1214908.7,0,0,-1519988.7,0,0,-2122325.6,0,0,-2427603.9,0,0,-2940625.1}; +VT(0.082942949,0.21818591,0,0.076796159,0.2234596,0,0.073708403,0.21517194,0){0,0,823054.75,0,0,1008421.8,0,0,1225969.3,0,0,-1901094.8,0,0,-2411357.4,0,0,-2772471.1,0,0,1667014.3,0,0,2346331.8,0,0,2271379.1,0,0,-282341.7,0,0,-852928.84,0,0,-92677.622,0,0,-1297502.9,0,0,-1160000.7,0,0,-2155133.8}; +VT(0.1,0.064285714,0,0.09230899,0.063522919,0,0.1,0.057142857,0){0,0,0,0,0,877619.52,0,0,0,0,0,0,0,0,503392.8,0,0,0,0,0,0,0,0,-85524.836,0,0,0,0,0,0,0,0,-638068.15,0,0,0,0,0,0,0,0,-918939.46,0,0,0}; +VT(0.067728608,0.12931058,0,0.076158908,0.12549637,0,0.076271482,0.13373081,0){0,0,2567539,0,0,2092101.1,0,0,2012844.4,0,0,-1463631.5,0,0,-1030118.9,0,0,-1330317.6,0,0,-3196956.5,0,0,-2615047.7,0,0,-2463975.8,0,0,89062.443,0,0,-297340.89,0,0,494859.01,0,0,3235608.2,0,0,2464056,0,0,2631758.9}; +VT(0.037999827,0.27482627,0,0.034582704,0.26623209,0,0.043491003,0.26677795,0){0,0,474219.19,0,0,604041.77,0,0,657627.62,0,0,-1389905,0,0,-1737386.1,0,0,-1894105.9,0,0,2209621.2,0,0,2655775,0,0,2903724.9,0,0,-2876809.4,0,0,-3245580.1,0,0,-3565612.1,0,0,3345267.4,0,0,3433603.3,0,0,3800401.2}; +VT(0.029991713,0.27132489,0,0.034582704,0.26623209,0,0.037999827,0.27482627,0){0,0,469504.82,0,0,604041.77,0,0,474219.19,0,0,-1366503,0,0,-1737386.1,0,0,-1389905,0,0,2141236.7,0,0,2655775,0,0,2209621.2,0,0,-2724385.3,0,0,-3245580.1,0,0,-2876809.4,0,0,3063642.3,0,0,3433603.3,0,0,3345267.4}; +VT(0.082516133,0.27647665,0,0.078222118,0.28277283,0,0.074931673,0.27468874,0){0,0,248899.48,0,0,220930.92,0,0,363389.18,0,0,-731674.12,0,0,-655625.13,0,0,-1064791.9,0,0,1170289.2,0,0,1069057.6,0,0,1691857.9,0,0,-1538273.3,0,0,-1447830.3,0,0,-2200836.4,0,0,1813237.5,0,0,1779434.3,0,0,2556129.1}; +VT(0.074388951,0.025102472,0,0.078020383,0.017034313,0,0.082332164,0.023444943,0){0,0,2772012.4,0,0,2461848.1,0,0,2029600,0,0,2581574.2,0,0,2383750.6,0,0,1907886.4,0,0,2213781,0,0,2230032.5,0,0,1671751.1,0,0,1693914.7,0,0,2005590.6,0,0,1335359.8,0,0,1057277.9,0,0,1717239.5,0,0,918760.81}; +VT(0.050721192,0.10961634,0,0.042557423,0.10832344,0,0.047385855,0.10193045,0){0,0,3257974.6,0,0,3183930.6,0,0,3329666.7,0,0,-583831.78,0,0,-492142.06,0,0,-117239.93,0,0,-3737290.3,0,0,-3600076,0,0,-3442848.4,0,0,-2483878.9,0,0,-2551523.2,0,0,-3204510.9,0,0,1698581.7,0,0,1442840.6,0,0,350991.89}; +VT(0.015416139,0.018002698,0,0.022427218,0.014872357,0,0.024008584,0.022367291,0){0,0,1798828.3,0,0,2505875.7,0,0,2639060.6,0,0,1735136,0,0,2445229.8,0,0,2494948.4,0,0,1609995.5,0,0,2325397.7,0,0,2214593.6,0,0,1427830.3,0,0,2149288.4,0,0,1813324.4,0,0,1194733.1,0,0,1920956.8,0,0,1312931.3}; +VT(0.023483408,0.28013687,0,0.0220603,0.28602893,0,0.015498485,0.28248556,0){0,0,270985.88,0,0,181204.07,0,0,166274.63,0,0,-801278.39,0,0,-539738.59,0,0,-493262.57,0,0,1297043.7,0,0,886739.53,0,0,803759.61,0,0,-1736920.8,0,0,-1214791.9,0,0,-1087394.1,0,0,2101746.5,0,0,1516611.7,0,0,1334475.8}; +VT(0.059957308,0.22757204,0,0.053624899,0.22742186,0,0.05718895,0.22161738,0){0,0,1366903.5,0,0,1430137,0,0,1508977,0,0,-3351367.9,0,0,-3503302.1,0,0,-3566099.1,0,0,3498598.8,0,0,3648370.9,0,0,3352547.9,0,0,-1727811.3,0,0,-1785483,0,0,-1004251.2,0,0,-990620.01,0,0,-1060301.4,0,0,-1983866.6}; +VT(0.042433189,0.024814669,0,0.046063037,0.016810165,0,0.051167355,0.022914381,0){0,0,3739739.8,0,0,3836060.2,0,0,3850137.8,0,0,3488658.7,0,0,3717529.2,0,0,3629520.4,0,0,3003356.3,0,0,3484126.2,0,0,3200919.1,0,0,2316430.4,0,0,3143090.2,0,0,2588908.3,0,0,1473602,0,0,2704667.4,0,0,1828396.4}; +VT(0.077619244,0.18028791,0,0.071841704,0.17726974,0,0.077140734,0.17217741,0){0,0,1471797.4,0,0,1799263.7,0,0,1584233.7,0,0,-2389894.4,0,0,-2812994.5,0,0,-2313491.7,0,0,18944.546,0,0,-214389.53,0,0,-519338.58,0,0,2378251.6,0,0,2933842.6,0,0,2552719.3,0,0,-1502642.9,0,0,-1438939.3,0,0,-655929.75}; +VT(0.1,0.29285714,0,0.1,0.3,0,0.092857143,0.3,0){0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +VT(0.043838979,0.034579424,0,0.035858843,0.031497608,0,0.042433189,0.024814669,0){0,0,3745913.7,0,0,3456371.8,0,0,3739739.8,0,0,3260141.4,0,0,3083741.5,0,0,3488658.7,0,0,2351583.2,0,0,2378649.5,0,0,3003356.3,0,0,1138042.7,0,0,1417116.3,0,0,2316430.4,0,0,-223347.31,0,0,302618.73,0,0,1473602}; +VT(0.074931673,0.27468874,0,0.078222118,0.28277283,0,0.071000103,0.28243589,0){0,0,363389.18,0,0,220930.92,0,0,281581.81,0,0,-1064791.9,0,0,-655625.13,0,0,-835250.62,0,0,1691857.9,0,0,1069057.6,0,0,1360764.9,0,0,-2200836.4,0,0,-1447830.3,0,0,-1840418.5,0,0,2556129.1,0,0,1779434.3,0,0,2257916.8}; +VT(0.1,0,0,0.1,0.0071428571,0,0.092857143,0,0){0,0,0,0,0,0,0,0,863626.15,0,0,0,0,0,0,0,0,863662.39,0,0,0,0,0,0,0,0,863732,0,0,0,0,0,0,0,0,863838.35,0,0,0,0,0,0,0,0,863813.95}; +VT(0.070691378,0.017050195,0,0.078020383,0.017034313,0,0.074388951,0.025102472,0){0,0,3076870.7,0,0,2461848.1,0,0,2772012.4,0,0,2979073.3,0,0,2383750.6,0,0,2581574.2,0,0,2786592,0,0,2230032.5,0,0,2213781,0,0,2505581.5,0,0,2005590.6,0,0,1693914.7,0,0,2144710.8,0,0,1717239.5,0,0,1057277.9}; +VT(0.038597539,0.20095921,0,0.036160627,0.1953007,0,0.043569257,0.19619451,0){0,0,1801301.7,0,0,1834250.2,0,0,1966078.6,0,0,-3633864.6,0,0,-3509998.2,0,0,-3794921.6,0,0,1895634,0,0,1372423.7,0,0,1563901,0,0,1705394,0,0,2256297.6,0,0,2340412.7,0,0,-3630918.1,0,0,-3434247.7,0,0,-3741435.4}; +VT(0.059078636,0.27701937,0,0.06660802,0.27624666,0,0.063469548,0.28521738,0){0,0,447007.97,0,0,417349.44,0,0,273598.49,0,0,-1315269.1,0,0,-1226359.7,0,0,-814255.31,0,0,2107766.2,0,0,1959900.4,0,0,1335465.2,0,0,-2778864.5,0,0,-2572844.1,0,0,-1824812,0,0,3289755.3,0,0,3027289.2,0,0,2270429.1}; +VT(0.036602132,0.28491153,0,0.030312881,0.27848596,0,0.037999827,0.27482627,0){0,0,279518.56,0,0,355416.48,0,0,474219.19,0,0,-831596.18,0,0,-1048284.8,0,0,-1389905,0,0,1362985.6,0,0,1688178.9,0,0,2209621.2,0,0,-1860498.2,0,0,-2242771,0,0,-2876809.4,0,0,2311728.5,0,0,2683885.3,0,0,3345267.4}; +VT(0.091053567,0.10618538,0,0.09416017,0.099511923,0,0.1,0.10714286,0){0,0,914271.31,0,0,613994.66,0,0,0,0,0,-104388.15,0,0,5422.3845,0,0,0,0,0,-1006721.9,0,0,-608645.22,0,0,0,0,0,-787386.88,0,0,-619557.01,0,0,0,0,0,309052.61,0,0,-16415.987,0,0,0}; +VT(0.076938259,0.060604721,0,0.073604017,0.054819307,0,0.080938662,0.054906318,0){0,0,2443533.2,0,0,2744584.6,0,0,2097661.4,0,0,1491930.8,0,0,1864679.8,0,0,1423084,0,0,-40674.57,0,0,386939.94,0,0,290856.94,0,0,-1557435.8,0,0,-1214908.7,0,0,-934922.56,0,0,-2468002.6,0,0,-2427603.9,0,0,-1860365.1}; +VT(0.0064539684,0.081629255,0,0.0067127961,0.088875219,0,0,0.085714286,0){0,0,711139.06,0,0,725937.81,0,0,0,0,0,222377.16,0,0,141227.93,0,0,0,0,0,-419239.47,0,0,-557260.38,0,0,0,0,0,-772749.89,0,0,-806944.34,0,0,0,0,0,-595288.06,0,0,-406936.37,0,0,0}; +VT(0.070865224,0.080352924,0,0.074756101,0.075901522,0,0.075872285,0.081656016,0){0,0,2808030.6,0,0,2549479.1,0,0,2427639,0,0,934415.1,0,0,1021825.1,0,0,758134.07,0,0,-1562677.5,0,0,-1118145.3,0,0,-1432759.9,0,0,-3017110.1,0,0,-2588166.7,0,0,-2638364.3,0,0,-2458745.5,0,0,-2507455.8,0,0,-2029677.1}; +VT(0.024044461,0.20382537,0,0.03163445,0.20120488,0,0.030490983,0.2108424,0){0,0,1283805.9,0,0,1608414.7,0,0,1428644.1,0,0,-2655634.7,0,0,-3251875.6,0,0,-3128471,0,0,1553893.8,0,0,1714266.6,0,0,2293671,0,0,995311.88,0,0,1500504,0,0,399562.24,0,0,-2617892.2,0,0,-3248047,0,0,-2769801.9}; +VT(0.071915087,0.24816524,0,0.078142774,0.24370973,0,0.07921504,0.25033934,0){0,0,803363.84,0,0,714639.7,0,0,606155.6,0,0,-2179152.4,0,0,-1902709.3,0,0,-1658203,0,0,2928525.2,0,0,2448578.4,0,0,2271843.6,0,0,-2836050.6,0,0,-2167997.3,0,0,-2284831,0,0,1927975,0,0,1155455.3,0,0,1693484.6}; +VT(0.091308694,0.0093164623,0,0.093571257,0.018380777,0,0.085905658,0.016824409,0){0,0,1045151,0,0,774815.13,0,0,1656238,0,0,1035216.9,0,0,746204.54,0,0,1604967.9,0,0,1015442.8,0,0,690036.86,0,0,1504009.2,0,0,986027.05,0,0,608388.09,0,0,1356492.3,0,0,947106.05,0,0,504051.02,0,0,1166855}; +VT(0.08596482,0.28314521,0,0.093593186,0.28160993,0,0.091323117,0.29067423,0){0,0,145967.81,0,0,74588.283,0,0,51002.156,0,0,-433371.98,0,0,-221009.65,0,0,-152526.43,0,0,707326.96,0,0,359269.18,0,0,252617.29,0,0,-959333.22,0,0,-484261.41,0,0,-350336.87,0,0,1181452.3,0,0,591230.88,0,0,444691.33}; +VT(0.069002793,0.22246209,0,0.076796159,0.2234596,0,0.07180958,0.22984275,0){0,0,1267491.2,0,0,1008421.8,0,0,1079159.6,0,0,-3011719.2,0,0,-2411357.4,0,0,-2680718.2,0,0,2877058.6,0,0,2346331.8,0,0,2899261.6,0,0,-947533.34,0,0,-852928.84,0,0,-1622013.4,0,0,-1573376.1,0,0,-1160000.7,0,0,-492395.98}; +VT(0.04704595,0.16277363,0,0.042242048,0.16806859,0,0.038427921,0.16264679,0){0,0,2543508.6,0,0,2399442.3,0,0,2389351.9,0,0,-3221973.5,0,0,-3302042.1,0,0,-3020403.6,0,0,-1684138.2,0,0,-1157324.9,0,0,-1591681.4,0,0,3671419.3,0,0,3737475.6,0,0,3440909.6,0,0,704902.67,0,0,-248746.29,0,0,682723.32}; +VT(0.030466665,0.11568191,0,0.030575169,0.1246812,0,0.025139549,0.12057635,0){0,0,2608170,0,0,2526238.7,0,0,2224740.3,0,0,-773675.45,0,0,-1202245.8,0,0,-875333.98,0,0,-3152461.4,0,0,-3156412.2,0,0,-2755721.9,0,0,-1443702.3,0,0,-451924.48,0,0,-796179.51,0,0,2136967.4,0,0,2919641.1,0,0,2272644.8}; +VT(0.035619257,0.12028764,0,0.030575169,0.1246812,0,0.030466665,0.11568191,0){0,0,2821397.9,0,0,2526238.7,0,0,2608170,0,0,-1093830.4,0,0,-1202245.8,0,0,-773675.45,0,0,-3491178.8,0,0,-3156412.2,0,0,-3152461.4,0,0,-1043884.2,0,0,-451924.48,0,0,-1443702.3,0,0,2851838.9,0,0,2919641.1,0,0,2136967.4}; +VT(0.016927821,0.11108648,0,0.013465065,0.10662372,0,0.017861336,0.10270337,0){0,0,1644246.3,0,0,1351132.7,0,0,1773538.4,0,0,-340994.5,0,0,-165451.82,0,0,-87655.931,0,0,-1914445.6,0,0,-1496410,0,0,-1856823.6,0,0,-1176430.8,0,0,-1147793.4,0,0,-1677437.3,0,0,981584.41,0,0,489093.12,0,0,261812.45}; +VT(0.055764419,0.28986395,0,0.051519181,0.28417908,0,0.056292141,0.2827555,0){0,0,202473.1,0,0,320732.11,0,0,343081.75,0,0,-605163.67,0,0,-953415.16,0,0,-1018093.3,0,0,1001119.7,0,0,1560004.1,0,0,1660020.8,0,0,-1385941.2,0,0,-2123899.5,0,0,-2248005.1,0,0,1755276.4,0,0,2629434.9,0,0,2762903.8}; +VT(0.0068768393,0.16098373,0,0.0046637588,0.16745308,0,0,0.16428571,0){0,0,553409.29,0,0,362371.83,0,0,0,0,0,-680450.71,0,0,-494096.85,0,0,0,0,0,-397156.36,0,0,-182769.85,0,0,0,0,0,771605.48,0,0,560561.48,0,0,0,0,0,219690.78,0,0,-21256.565,0,0,0}; +VT(0.042541479,0.22296234,0,0.045116599,0.21481108,0,0.049797208,0.2214244,0){0,0,1481591,0,0,1654487.5,0,0,1551864.2,0,0,-3531706.6,0,0,-3731787.4,0,0,-3662861.4,0,0,3405357.4,0,0,3030991.5,0,0,3430735.4,0,0,-1180392.3,0,0,-73694.316,0,0,-1003918.8,0,0,-1772446.7,0,0,-2938909.4,0,0,-2065424.5}; +VT(0.07921504,0.25033934,0,0.078142774,0.24370973,0,0.083292987,0.24598228,0){0,0,606155.6,0,0,714639.7,0,0,542685.82,0,0,-1658203,0,0,-1902709.3,0,0,-1458992.1,0,0,2271843.6,0,0,2448578.4,0,0,1920780.7,0,0,-2284831,0,0,-2167997.3,0,0,-1784182,0,0,1693484.6,0,0,1155455.3,0,0,1091638.2}; +VT(0.042557423,0.10832344,0,0.038084092,0.1145524,0,0.034786476,0.1076516,0){0,0,3183930.6,0,0,2981407.2,0,0,2912738.3,0,0,-492142.06,0,0,-818508.93,0,0,-413135.58,0,0,-3600076,0,0,-3575257.7,0,0,-3267374.9,0,0,-2551523.2,0,0,-1775238,0,0,-2390915.6,0,0,1442840.6,0,0,2287308.3,0,0,1215377.6}; +VT(0.026270926,0.075674812,0,0.027058874,0.069011929,0,0.033874053,0.071548869,0){0,0,2630439.6,0,0,2727323.5,0,0,3157862.8,0,0,1063205.3,0,0,1363815.9,0,0,1466537.3,0,0,-1137545.6,0,0,-681543.48,0,0,-1010259.7,0,0,-2660659.2,0,0,-2386220.5,0,0,-2946084.6,0,0,-2599027.8,0,0,-2898415.6,0,0,-3304540.6}; +VT(0.070754378,0.060222618,0,0.073604017,0.054819307,0,0.076938259,0.060604721,0){0,0,2932444.5,0,0,2744584.6,0,0,2443533.2,0,0,1804303.3,0,0,1864679.8,0,0,1491930.8,0,0,-17984.254,0,0,386939.94,0,0,-40674.57,0,0,-1833384.6,0,0,-1214908.7,0,0,-1557435.8,0,0,-2943704.7,0,0,-2427603.9,0,0,-2468002.6}; +VT(0.061098586,0.072147464,0,0.060416267,0.076932239,0,0.054876921,0.07294965,0){0,0,3389933,0,0,3380545.3,0,0,3558755.8,0,0,1545196.6,0,0,1302521.2,0,0,1580988.4,0,0,-1140417.3,0,0,-1576156.6,0,0,-1275447.3,0,0,-3205469.9,0,0,-3485992.8,0,0,-3423192.1,0,0,-3526423.9,0,0,-3253298.6,0,0,-3669097.1}; +VT(0.061027247,0.098743066,0,0.058212185,0.089881183,0,0.066799394,0.09162077,0){0,0,3173016.6,0,0,3344291.6,0,0,2974160.1,0,0,72008.811,0,0,593905.21,0,0,440022.16,0,0,-3099474,0,0,-2645013.4,0,0,-2469083.6,0,0,-3241975.4,0,0,-3708817.1,0,0,-3274492.4,0,0,-216202.29,0,0,-1722713.3,0,0,-1290097.2}; +VT(0.05718895,0.22161738,0,0.053910411,0.21448753,0,0.063265205,0.21633109,0){0,0,1508977,0,0,1667429.4,0,0,1505335.5,0,0,-3566099.1,0,0,-3752161.8,0,0,-3432481.9,0,0,3352547.9,0,0,3023771,0,0,2888962.8,0,0,-1004251.2,0,0,-28239.212,0,0,-265885.87,0,0,-1983866.6,0,0,-2988983.1,0,0,-2549234.8}; +VT(0.076158908,0.12549637,0,0.082946441,0.12207685,0,0.082709707,0.12855445,0){0,0,2092101.1,0,0,1589878.9,0,0,1568327.1,0,0,-1030118.9,0,0,-673263.29,0,0,-869760.99,0,0,-2615047.7,0,0,-1978038.1,0,0,-1955764.1,0,0,-297340.89,0,0,-467139.5,0,0,-1353.9511,0,0,2464056,0,0,1708498.9,0,0,1955094.7}; +VT(0.052748817,0.036292023,0,0.060555575,0.040182349,0,0.054794838,0.043915046,0){0,0,3796611.1,0,0,3588260.7,0,0,3735662.6,0,0,3254886.9,0,0,2962222.2,0,0,2959425,0,0,2248728.5,0,0,1819353,0,0,1568238.5,0,0,921690.78,0,0,359025.67,0,0,-148813.91,0,0,-537197.11,0,0,-1164330.1,0,0,-1835117.4}; +VT(0.060819012,0.031697917,0,0.060555575,0.040182349,0,0.052748817,0.036292023,0){0,0,3608360,0,0,3588260.7,0,0,3796611.1,0,0,3214477.8,0,0,2962222.2,0,0,3254886.9,0,0,2469695.4,0,0,1819353,0,0,2248728.5,0,0,1455299.1,0,0,359025.67,0,0,921690.78,0,0,281702.17,0,0,-1164330.1,0,0,-537197.11}; +VT(0.054010827,0.25507988,0,0.060672356,0.25950081,0,0.0528723,0.26429657,0){0,0,897184.36,0,0,771273.27,0,0,718299.05,0,0,-2496661.6,0,0,-2177172.3,0,0,-2055661.9,0,0,3553831.7,0,0,3197356.1,0,0,3109067.1,0,0,-3839088.9,0,0,-3651078,0,0,-3733060,0,0,3290330.5,0,0,3457676.3,0,0,3841282.5}; +VT(0.0528723,0.26429657,0,0.060672356,0.25950081,0,0.061631884,0.26868773,0){0,0,718299.05,0,0,771273.27,0,0,591535.29,0,0,-2055661.9,0,0,-2177172.3,0,0,-1711593.4,0,0,3109067.1,0,0,3197356.1,0,0,2649353.2,0,0,-3733060,0,0,-3651078,0,0,-3304968.8,0,0,3841282.5,0,0,3457676.3,0,0,3608394.3}; +VT(0.064075209,0.013493001,0,0.06203594,0.0060944193,0,0.068476894,0.0069177029,0){0,0,3498581.2,0,0,3604620.2,0,0,3242851.4,0,0,3428890.3,0,0,3589956.2,0,0,3225849.8,0,0,3290906.4,0,0,3560685.5,0,0,3191931.3,0,0,3087427.7,0,0,3516960.1,0,0,3141298.2,0,0,2822154,0,0,3458793.9,0,0,3073847.6}; +VT(0.068366879,0.29272708,0,0.061805884,0.29356168,0,0.063469548,0.28521738,0){0,0,123803.43,0,0,121923.05,0,0,273598.49,0,0,-370697.46,0,0,-365207.83,0,0,-814255.31,0,0,615462.12,0,0,606815.62,0,0,1335465.2,0,0,-856697.17,0,0,-845641.09,0,0,-1824812,0,0,1092834.3,0,0,1080583.1,0,0,2270429.1}; +VT(0.036912897,0.21765752,0,0.029518097,0.21985532,0,0.030490983,0.2108424,0){0,0,1486590.9,0,0,1264894.2,0,0,1428644.1,0,0,-3421295.1,0,0,-2954793.2,0,0,-3128471,0,0,2965983.4,0,0,2682751.8,0,0,2293671,0,0,-438566.7,0,0,-629411.95,0,0,399562.24,0,0,-2395869.1,0,0,-1842177.8,0,0,-2769801.9}; +VT(0.012304267,0.13852123,0,0.0054758376,0.13911323,0,0.0072553778,0.13224921,0){0,0,1094693.2,0,0,495708.7,0,0,674958.82,0,0,-832176.34,0,0,-382921.42,0,0,-425463.67,0,0,-1294374.3,0,0,-582869.54,0,0,-832230.25,0,0,521821.54,0,0,250325.59,0,0,117822.57,0,0,1419655.5,0,0,639819.51,0,0,875622.71}; +VT(0.07492972,0.092844339,0,0.072044079,0.08604506,0,0.079265602,0.086677581,0){0,0,2431427.6,0,0,2688599.4,0,0,2114636.1,0,0,308451.38,0,0,649473.83,0,0,488789.06,0,0,-2083891.4,0,0,-1882262.6,0,0,-1512904.7,0,0,-2656803.1,0,0,-2986497.2,0,0,-2351470.6,0,0,-910298.79,0,0,-1825996.4,0,0,-1382326.1}; +VT(0.017373248,0.19021363,0,0.012931293,0.19295437,0,0.01062282,0.18656765,0){0,0,1095255.9,0,0,815194.79,0,0,711483.53,0,0,-1990705.9,0,0,-1524077.7,0,0,-1243147.4,0,0,532263.7,0,0,510133.92,0,0,217509.34,0,0,1555631.8,0,0,1080471.8,0,0,1080570.1,0,0,-1804413.6,0,0,-1450076.4,0,0,-1025407.6}; +VT(0.074388951,0.025102472,0,0.068707287,0.030314019,0,0.064795861,0.023107998,0){0,0,2772012.4,0,0,3188897.7,0,0,3443592.1,0,0,2581574.2,0,0,2870259.7,0,0,3242943.8,0,0,2213781,0,0,2264806.3,0,0,2853338,0,0,1693914.7,0,0,1433032.7,0,0,2297494.4,0,0,1057277.9,0,0,457746.25,0,0,1607540.9}; +VT(0.064795861,0.023107998,0,0.068707287,0.030314019,0,0.060819012,0.031697917,0){0,0,3443592.1,0,0,3188897.7,0,0,3608360,0,0,3242943.8,0,0,2870259.7,0,0,3214477.8,0,0,2853338,0,0,2264806.3,0,0,2469695.4,0,0,2297494.4,0,0,1433032.7,0,0,1455299.1,0,0,1607540.9,0,0,457746.25,0,0,281702.17}; +VT(0.084206466,0.24009781,0,0.092168655,0.23668616,0,0.089949388,0.2453858,0){0,0,569988.38,0,0,307607.26,0,0,339950.36,0,0,-1492933.9,0,0,-792496.69,0,0,-911669.73,0,0,1847439,0,0,941630.33,0,0,1193275.4,0,0,-1498530.8,0,0,-691810.02,0,0,-1095139.7,0,0,578923.58,0,0,148523.72,0,0,648419.14}; +VT(0.056199026,0.010061392,0,0.052049192,0.01582547,0,0.049204373,0.010884263,0){0,0,3801979,0,0,3859264.8,0,0,3873084,0,0,3759859.9,0,0,3753529.9,0,0,3822842.7,0,0,3676084,0,0,3544947.6,0,0,3723003.5,0,0,3551608.2,0,0,3239251.6,0,0,3574883.8,0,0,3387596.5,0,0,2844641.6,0,0,3380124.5}; +VT(0.025221599,0.062165695,0,0.032659307,0.059686042,0,0.031105381,0.06529626,0){0,0,2618029.3,0,0,3158137.1,0,0,3030579.1,0,0,1547191.2,0,0,1964024.3,0,0,1667989.8,0,0,-156575.4,0,0,27282.242,0,0,-444570.51,0,0,-1796512.5,0,0,-1919818.3,0,0,-2357289.6,0,0,-2702051.5,0,0,-3141270.1,0,0,-3210321.2}; +VT(0.031105381,0.06529626,0,0.037071258,0.0642048,0,0.033874053,0.071548869,0){0,0,3030579.1,0,0,3365311.2,0,0,3157862.8,0,0,1667989.8,0,0,1900443.5,0,0,1466537.3,0,0,-444570.51,0,0,-391679.98,0,0,-1010259.7,0,0,-2357289.6,0,0,-2513388.8,0,0,-2946084.6,0,0,-3210321.2,0,0,-3541461.8,0,0,-3304540.6}; +VT(0.064795861,0.023107998,0,0.070691378,0.017050195,0,0.074388951,0.025102472,0){0,0,3443592.1,0,0,3076870.7,0,0,2772012.4,0,0,3242943.8,0,0,2979073.3,0,0,2581574.2,0,0,2853338,0,0,2786592,0,0,2213781,0,0,2297494.4,0,0,2505581.5,0,0,1693914.7,0,0,1607540.9,0,0,2144710.8,0,0,1057277.9}; +VT(0.064075209,0.013493001,0,0.070691378,0.017050195,0,0.064795861,0.023107998,0){0,0,3498581.2,0,0,3076870.7,0,0,3443592.1,0,0,3428890.3,0,0,2979073.3,0,0,3242943.8,0,0,3290906.4,0,0,2786592,0,0,2853338,0,0,3087427.7,0,0,2505581.5,0,0,2297494.4,0,0,2822154,0,0,2144710.8,0,0,1607540.9}; +VT(0.024008584,0.022367291,0,0.033039341,0.023173825,0,0.028359285,0.029784535,0){0,0,2639060.6,0,0,3318087.9,0,0,2981166.2,0,0,2494948.4,0,0,3123656.1,0,0,2693525.9,0,0,2214593.6,0,0,2746181,0,0,2145980.7,0,0,1813324.4,0,0,2207795.9,0,0,1391347.7,0,0,1312931.3,0,0,1539940.3,0,0,502245.34}; +VT(0.075488644,0.14176328,0,0.068478919,0.13862632,0,0.076271482,0.13373081,0){0,0,1990888.2,0,0,2426951.1,0,0,2012844.4,0,0,-1647841.2,0,0,-1850187.5,0,0,-1330317.6,0,0,-2274843.7,0,0,-2866745.3,0,0,-2463975.8,0,0,1255935.2,0,0,1169007.7,0,0,494859.01,0,0,2491166.6,0,0,3144665.9,0,0,2631758.9}; +VT(0.076271482,0.13373081,0,0.068478919,0.13862632,0,0.067728608,0.12931058,0){0,0,2012844.4,0,0,2426951.1,0,0,2567539,0,0,-1330317.6,0,0,-1850187.5,0,0,-1463631.5,0,0,-2463975.8,0,0,-2866745.3,0,0,-3196956.5,0,0,494859.01,0,0,1169007.7,0,0,89062.443,0,0,2631758.9,0,0,3144665.9,0,0,3235608.2}; +VT(0.060432552,0.20227914,0,0.053221516,0.20704838,0,0.051624576,0.1997036,0){0,0,1798951.1,0,0,1805672.4,0,0,1943020.7,0,0,-3671781.8,0,0,-3837129.3,0,0,-3875569.2,0,0,2023610.8,0,0,2511247.5,0,0,1911651.5,0,0,1565241.8,0,0,1011998.4,0,0,1974364.4,0,0,-3653837,0,0,-3650194.7,0,0,-3875892.9}; +VT(0.079063451,0.10043005,0,0.076969725,0.10634022,0,0.072126291,0.10515927,0){0,0,2051820.1,0,0,2181001.1,0,0,2539730.3,0,0,-16056.497,0,0,-255488.75,0,0,-241283.81,0,0,-2067914.3,0,0,-2406546.5,0,0,-2758172.2,0,0,-2035845.1,0,0,-1869163.7,0,0,-2254933.2,0,0,48244.512,0,0,756176.24,0,0,717337.89}; +VT(0.063265205,0.21633109,0,0.053910411,0.21448753,0,0.059551151,0.20970619,0){0,0,1505335.5,0,0,1667429.4,0,0,1688112.8,0,0,-3432481.9,0,0,-3752161.8,0,0,-3664209.4,0,0,2888962.8,0,0,3023771,0,0,2601193.1,0,0,-265885.87,0,0,-28239.212,0,0,619333.89,0,0,-2549234.8,0,0,-2988983.1,0,0,-3326584.6}; +VT(0.059551151,0.20970619,0,0.066992124,0.20847551,0,0.063265205,0.21633109,0){0,0,1688112.8,0,0,1540360.8,0,0,1505335.5,0,0,-3664209.4,0,0,-3311175.4,0,0,-3432481.9,0,0,2601193.1,0,0,2266191.6,0,0,2888962.8,0,0,619333.89,0,0,706070.36,0,0,-265885.87,0,0,-3326584.6,0,0,-3078419.5,0,0,-2549234.8}; +VT(0.1,0.10714286,0,0.09416017,0.099511923,0,0.1,0.1,0){0,0,0,0,0,613994.66,0,0,0,0,0,0,0,0,5422.3845,0,0,0,0,0,0,0,0,-608645.22,0,0,0,0,0,0,0,0,-619557.01,0,0,0,0,0,0,0,0,-16415.987,0,0,0}; +VT(0,0.15714286,0,0.0068768393,0.16098373,0,0,0.16428571,0){0,0,0,0,0,553409.29,0,0,0,0,0,0,0,0,-680450.71,0,0,0,0,0,0,0,0,-397156.36,0,0,0,0,0,0,0,0,771605.48,0,0,0,0,0,0,0,0,219690.78,0,0,0}; +VT(0.031710863,0.0075461758,0,0.029163144,0.015558324,0,0.025468185,0.010276157,0){0,0,3254919.5,0,0,3068207,0,0,2780034,0,0,3234618.2,0,0,2986953.6,0,0,2747892,0,0,3194153.7,0,0,2826596.5,0,0,2683968.5,0,0,3133832.1,0,0,2591406.1,0,0,2589008.8,0,0,3053845.3,0,0,2287504.7,0,0,2463902.9}; +VT(0.072323403,0.067507008,0,0.079822506,0.065677674,0,0.080160084,0.071577727,0){0,0,2781512.1,0,0,2163855.5,0,0,2107851.9,0,0,1448400.9,0,0,1180001.4,0,0,977984.82,0,0,-578922.09,0,0,-340376.77,0,0,-676141.96,0,0,-2328912.3,0,0,-1706002.2,0,0,-1967920.1,0,0,-2963263.7,0,0,-2296197.5,0,0,-2205119.3}; +VT(0.085369203,0.17624497,0,0.093873231,0.17693503,0,0.089858368,0.18421461,0){0,0,1039089.6,0,0,445896.9,0,0,692603.24,0,0,-1603144.1,0,0,-694096.79,0,0,-1178349.1,0,0,-168940.91,0,0,-59504.029,0,0,133849.22,0,0,1695116.9,0,0,727141.13,0,0,1084450.2,0,0,-751642.95,0,0,-345394.37,0,0,-894447.98}; +VT(0.064352171,0.083117586,0,0.072044079,0.08604506,0,0.066799394,0.09162077,0){0,0,3167194.8,0,0,2688599.4,0,0,2974160.1,0,0,915483.69,0,0,649473.83,0,0,440022.16,0,0,-1987167.2,0,0,-1882262.6,0,0,-2469083.6,0,0,-3477240.4,0,0,-2986497.2,0,0,-3274492.4,0,0,-2495770,0,0,-1825996.4,0,0,-1290097.2}; +VT(0.0098751756,0.25600949,0,0.013885016,0.25805955,0,0.0071908097,0.26035264,0){0,0,270470.11,0,0,357160.64,0,0,179155.76,0,0,-755004.71,0,0,-1003688.5,0,0,-507033.49,0,0,1082095.4,0,0,1459712.7,0,0,748779.14,0,0,-1183544.7,0,0,-1638678.7,0,0,-863311.12,0,0,1038261.4,0,0,1506406.6,0,0,830950.48}; +VT(0.016759526,0.025876157,0,0.021348697,0.029751655,0,0.014137494,0.034012185,0){0,0,1932221.9,0,0,2382657.5,0,0,1641076.4,0,0,1791225.7,0,0,2153252.9,0,0,1435142,0,0,1519509.7,0,0,1716520.5,0,0,1049094.4,0,0,1136895.1,0,0,1114508.8,0,0,531342.12,0,0,671081.1,0,0,404958.41,0,0,-53364.585}; +VT(0.019499739,0.079597209,0,0.012549176,0.077039569,0,0.01882241,0.070374011,0){0,0,2040354.6,0,0,1370920.5,0,0,2018056.9,0,0,702945.71,0,0,525978.15,0,0,970762.8,0,0,-1095289.5,0,0,-643140.23,0,0,-580354.6,0,0,-2175701.2,0,0,-1415881.7,0,0,-1830388.5,0,0,-1830384.7,0,0,-1316306.1,0,0,-2130853.3}; +VT(0.0910478,0.13167545,0,0.083559522,0.13424014,0,0.082709707,0.12855445,0){0,0,831136.87,0,0,1462145.4,0,0,1568327.1,0,0,-514132.23,0,0,-981746.52,0,0,-869760.99,0,0,-1027305.8,0,0,-1784737.2,0,0,-1955764.1,0,0,122313.64,0,0,395362.65,0,0,-1353.9511,0,0,1073956.7,0,0,1914407.3,0,0,1955094.7}; +VT(0.087083587,0.13880919,0,0.083559522,0.13424014,0,0.0910478,0.13167545,0){0,0,1144744.3,0,0,1462145.4,0,0,831136.87,0,0,-877072.07,0,0,-981746.52,0,0,-514132.23,0,0,-1349889.8,0,0,-1784737.2,0,0,-1027305.8,0,0,561444.4,0,0,395362.65,0,0,122313.64,0,0,1481228.8,0,0,1914407.3,0,0,1073956.7}; +VT(0.018704911,0.19716585,0,0.015977634,0.20443356,0,0.011268327,0.1984065,0){0,0,1103230.1,0,0,895779.15,0,0,682302.12,0,0,-2149261.2,0,0,-1862602.8,0,0,-1344805.9,0,0,934589.13,0,0,1114548.4,0,0,623458.07,0,0,1263201.6,0,0,659707.69,0,0,739532.85,0,0,-2132672.2,0,0,-1827076.9,0,0,-1341727.7}; +VT(0.01882241,0.070374011,0,0.012549176,0.077039569,0,0.011197941,0.071439681,0){0,0,2018056.9,0,0,1370920.5,0,0,1244724.5,0,0,970762.8,0,0,525978.15,0,0,579995.21,0,0,-580354.6,0,0,-643140.23,0,0,-394493.66,0,0,-1830388.5,0,0,-1415881.7,0,0,-1158343.6,0,0,-2130853.3,0,0,-1316306.1,0,0,-1303869.8}; +VT(0.077013163,0.11736903,0,0.082946441,0.12207685,0,0.076158908,0.12549637,0){0,0,2095773.2,0,0,1589878.9,0,0,2092101.1,0,0,-691227.47,0,0,-673263.29,0,0,-1030118.9,0,0,-2559181.5,0,0,-1978038.1,0,0,-2615047.7,0,0,-1023961.4,0,0,-467139.5,0,0,-297340.89,0,0,1873161.8,0,0,1708498.9,0,0,2464056}; +VT(0.061244461,0.14481879,0,0.064971856,0.15110456,0,0.058552205,0.15400025,0){0,0,2643484.5,0,0,2431817,0,0,2589572.8,0,0,-2356788.3,0,0,-2488096.1,0,0,-2806487.5,0,0,-2899198.4,0,0,-2374265.3,0,0,-2354581.2,0,0,2042509.4,0,0,2543085,0,0,3003966,0,0,3121060.9,0,0,2315361.9,0,0,2103059.1}; +VT(0.0094805882,0.16707285,0,0.014405512,0.17061143,0,0.0069613667,0.17349451,0){0,0,730151.01,0,0,1063653,0,0,517779.21,0,0,-989834.58,0,0,-1519257.6,0,0,-769992.03,0,0,-378084.11,0,0,-412907.51,0,0,-142713.64,0,0,1124284.7,0,0,1696192.6,0,0,839532.94,0,0,-22095.939,0,0,-313907.63,0,0,-266340.1}; +VT(0.017763535,0.12074209,0,0.01198914,0.11616091,0,0.016927821,0.11108648,0){0,0,1657769.5,0,0,1171325.2,0,0,1644246.3,0,0,-657738.05,0,0,-358450.6,0,0,-340994.5,0,0,-2054600.3,0,0,-1420119.3,0,0,-1914445.6,0,0,-581651.26,0,0,-627101.02,0,0,-1176430.8,0,0,1703675.4,0,0,984768,0,0,981584.41}; +VT(0.051624576,0.1997036,0,0.043569257,0.19619451,0,0.050398693,0.1921099,0){0,0,1943020.7,0,0,1966078.6,0,0,2077292.2,0,0,-3875569.2,0,0,-3794921.6,0,0,-3850553.1,0,0,1911651.5,0,0,1563901,0,0,1209682,0,0,1974364.4,0,0,2340412.7,0,0,2818064.5,0,0,-3875892.9,0,0,-3741435.4,0,0,-3615771.1}; +VT(0.051624576,0.1997036,0,0.057391395,0.19462543,0,0.060432552,0.20227914,0){0,0,1943020.7,0,0,1979510.6,0,0,1798951.1,0,0,-3875569.2,0,0,-3763012.6,0,0,-3671781.8,0,0,1911651.5,0,0,1410875.8,0,0,2023610.8,0,0,1974364.4,0,0,2491970.2,0,0,1565241.8,0,0,-3875892.9,0,0,-3656419.8,0,0,-3653837}; +VT(0.03663522,0.040674234,0,0.032229878,0.047894836,0,0.028678488,0.042143634,0){0,0,3463485.9,0,0,3188476.9,0,0,2968313.4,0,0,2844620.6,0,0,2403076.1,0,0,2399521.8,0,0,1717431.6,0,0,1025710.6,0,0,1370917.4,0,0,283267.24,0,0,-604377.64,0,0,79587.615,0,0,-1201989.6,0,0,-2086050.7,0,0,-1227272.3}; +VT(0.038515413,0.047952704,0,0.032229878,0.047894836,0,0.03663522,0.040674234,0){0,0,3516906.1,0,0,3188476.9,0,0,3463485.9,0,0,2648581.9,0,0,2403076.1,0,0,2844620.6,0,0,1126309.3,0,0,1025710.6,0,0,1717431.6,0,0,-674068.75,0,0,-604377.64,0,0,283267.24,0,0,-2308227.3,0,0,-2086050.7,0,0,-1201989.6}; +VT(0.014137494,0.034012185,0,0.021348697,0.029751655,0,0.023478597,0.036718106,0){0,0,1641076.4,0,0,2382657.5,0,0,2561783.8,0,0,1435142,0,0,2153252.9,0,0,2187675.4,0,0,1049094.4,0,0,1716520.5,0,0,1494080.3,0,0,531342.12,0,0,1114508.8,0,0,582277.59,0,0,-53364.585,0,0,404958.41,0,0,-414804.14}; +VT(0.058552205,0.15400025,0,0.065117308,0.15657509,0,0.061476805,0.16269562,0){0,0,2589572.8,0,0,2354870.2,0,0,2391378.9,0,0,-2806487.5,0,0,-2678881.2,0,0,-3025373.1,0,0,-2354581.2,0,0,-1986291.9,0,0,-1589341.3,0,0,3003966,0,0,2952219.2,0,0,3446908.2,0,0,2103059.1,0,0,1580034,0,0,675366.83}; +VT(0.021957304,0.26060316,0,0.013885016,0.25805955,0,0.018179834,0.25267212,0){0,0,505833.44,0,0,357160.64,0,0,514543.14,0,0,-1432636.8,0,0,-1003688.5,0,0,-1419813.2,0,0,2119105.6,0,0,1459712.7,0,0,1983439.5,0,0,-2450095.8,0,0,-1638678.7,0,0,-2069793.3,0,0,2369995.8,0,0,1506406.6,0,0,1657747.8}; +VT(0.018179834,0.25267212,0,0.013885016,0.25805955,0,0.01180171,0.25230222,0){0,0,514543.14,0,0,357160.64,0,0,347512.04,0,0,-1419813.2,0,0,-1003688.5,0,0,-957611.77,0,0,1983439.5,0,0,1459712.7,0,0,1333704.3,0,0,-2069793.3,0,0,-1638678.7,0,0,-1383899.6,0,0,1657747.8,0,0,1506406.6,0,0,1095718.6}; +VT(0.078984823,0.22953004,0,0.077318805,0.23627719,0,0.07180958,0.22984275,0){0,0,858343.29,0,0,830868.27,0,0,1079159.6,0,0,-2128428.8,0,0,-2136157.9,0,0,-2680718.2,0,0,2291087.1,0,0,2525048.7,0,0,2899261.6,0,0,-1261656.1,0,0,-1830714.2,0,0,-1622013.4,0,0,-424553.92,0,0,350702.19,0,0,-492395.98}; +VT(0.1,0.15,0,0.09308158,0.15403623,0,0.09156348,0.14589395,0){0,0,0,0,0,579061.91,0,0,734092.88,0,0,0,0,0,-628036.95,0,0,-670961.7,0,0,0,0,0,-525997.02,0,0,-791796.8,0,0,0,0,0,672596.25,0,0,602866.55,0,0,0,0,0,469080.04,0,0,843431.47}; +VT(0.063469548,0.28521738,0,0.06660802,0.27624666,0,0.071000103,0.28243589,0){0,0,273598.49,0,0,417349.44,0,0,281581.81,0,0,-814255.31,0,0,-1226359.7,0,0,-835250.62,0,0,1335465.2,0,0,1959900.4,0,0,1360764.9,0,0,-1824812,0,0,-2572844.1,0,0,-1840418.5,0,0,2270429.1,0,0,3027289.2,0,0,2257916.8}; +VT(0.056317057,0.058022103,0,0.059054943,0.066788508,0,0.052494391,0.065958781,0){0,0,3630316.8,0,0,3499189.3,0,0,3640248,0,0,2330872.5,0,0,1856149.2,0,0,1971511.2,0,0,197001.66,0,0,-658492.2,0,0,-601016.65,0,0,-2007682.1,0,0,-2864039.1,0,0,-2898090,0,0,-3494460.7,0,0,-3725081.1,0,0,-3866942}; +VT(0.028359285,0.029784535,0,0.021348697,0.029751655,0,0.024008584,0.022367291,0){0,0,2981166.2,0,0,2382657.5,0,0,2639060.6,0,0,2693525.9,0,0,2153252.9,0,0,2494948.4,0,0,2145980.7,0,0,1716520.5,0,0,2214593.6,0,0,1391347.7,0,0,1114508.8,0,0,1813324.4,0,0,502245.34,0,0,404958.41,0,0,1312931.3}; +VT(0.054395265,0.16699477,0,0.054692531,0.17439284,0,0.048076401,0.17082416,0){0,0,2465605.5,0,0,2346407.8,0,0,2424680.5,0,0,-3338618.7,0,0,-3532168.6,0,0,-3473815.1,0,0,-1283530.8,0,0,-561454.61,0,0,-921629.25,0,0,3793219.5,0,0,3816051.1,0,0,3872759.5,0,0,-59660.123,0,0,-1367177.6,0,0,-754316.94}; +VT(0.088381846,0.16289419,0,0.093710586,0.16080643,0,0.092195724,0.16853594,0){0,0,911153.68,0,0,507346.27,0,0,598378.34,0,0,-1156470.7,0,0,-621948.04,0,0,-829189.07,0,0,-599768.12,0,0,-366919.85,0,0,-278570.16,0,0,1317920.1,0,0,704920.6,0,0,936666.51,0,0,244888.24,0,0,207593.47,0,0,-82641.6}; +VT(0.08944657,0.05485846,0,0.09230899,0.063522919,0,0.08415119,0.061061125,0){0,0,1211526.2,0,0,877619.52,0,0,1759442.9,0,0,822600.19,0,0,503392.8,0,0,1064240.3,0,0,169573.91,0,0,-85524.836,0,0,-51487.645,0,0,-537958.1,0,0,-638068.15,0,0,-1146904.2,0,0,-1073022.7,0,0,-918939.46,0,0,-1789550.6}; +VT(0.1,0.19285714,0,0.093164956,0.1980516,0,0.091593501,0.1915477,0){0,0,0,0,0,420734.09,0,0,544831.72,0,0,0,0,0,-826537.04,0,0,-1004107.1,0,0,0,0,0,376428.12,0,0,301623.68,0,0,0,0,0,463603.83,0,0,749822.54,0,0,0,0,0,-823893.15,0,0,-933881.71}; +VT(0,0.042857143,0,0.0063343033,0.038958017,0,0.0064812773,0.046734878,0){0,0,0,0,0,751213.74,0,0,761350.4,0,0,0,0,0,627892.11,0,0,582610.88,0,0,0,0,0,401490.67,0,0,267082.8,0,0,0,0,0,109174.99,0,0,-111174.21,0,0,0,0,0,-201236.23,0,0,-463416.67}; +VT(0.014285714,0.3,0,0.017990672,0.29207379,0,0.021428571,0.3,0){0,0,0,0,0,86228.122,0,0,0,0,0,0,0,0,-258100.45,0,0,0,0,0,0,0,0,428229.3,0,0,0,0,0,0,0,0,-595472.42,0,0,0,0,0,0,0,0,758576.15,0,0,0}; +VT(0.021428571,0,0,0.01808004,0.0081573173,0,0.014285714,0,0){0,0,2419501.9,0,0,2085729.2,0,0,1683701.5,0,0,2419561.9,0,0,2070583.9,0,0,1683671.3,0,0,2419679.8,0,0,2040406.9,0,0,1683611.9,0,0,2419876.4,0,0,1995444.2,0,0,1683542.6,0,0,2419989.4,0,0,1935913.6,0,0,1683226}; +VT(0.080160084,0.071577727,0,0.074756101,0.075901522,0,0.072323403,0.067507008,0){0,0,2107851.9,0,0,2549479.1,0,0,2781512.1,0,0,977984.82,0,0,1021825.1,0,0,1448400.9,0,0,-676141.96,0,0,-1118145.3,0,0,-578922.09,0,0,-1967920.1,0,0,-2588166.7,0,0,-2328912.3,0,0,-2205119.3,0,0,-2507455.8,0,0,-2963263.7}; +VT(0.050398693,0.1921099,0,0.057391395,0.19462543,0,0.051624576,0.1997036,0){0,0,2077292.2,0,0,1979510.6,0,0,1943020.7,0,0,-3850553.1,0,0,-3763012.6,0,0,-3875569.2,0,0,1209682,0,0,1410875.8,0,0,1911651.5,0,0,2818064.5,0,0,2491970.2,0,0,1974364.4,0,0,-3615771.1,0,0,-3656419.8,0,0,-3875892.9}; +VT(0.0062494098,0.068021592,0,0.0060853536,0.074713803,0,0,0.071428571,0){0,0,709501.16,0,0,681675.12,0,0,0,0,0,364477.97,0,0,285253.65,0,0,0,0,0,-157824.6,0,0,-277070.48,0,0,0,0,0,-603457.47,0,0,-678306.76,0,0,0,0,0,-756039.79,0,0,-685312.86,0,0,0}; +VT(0.045331711,0.23557633,0,0.052478219,0.23860916,0,0.047556344,0.24377674,0){0,0,1270563.3,0,0,1222305.6,0,0,1122639.4,0,0,-3255008.9,0,0,-3178913.4,0,0,-2989881.7,0,0,3813331,0,0,3866354.4,0,0,3850350.4,0,0,-2700862,0,0,-3010118,0,0,-3414324.1,0,0,404484.48,0,0,951644.63,0,0,1828478.4}; +VT(0.050960377,0.23252058,0,0.052478219,0.23860916,0,0.045331711,0.23557633,0){0,0,1342135.9,0,0,1222305.6,0,0,1270563.3,0,0,-3383651.2,0,0,-3178913.4,0,0,-3255008.9,0,0,3804738.6,0,0,3866354.4,0,0,3813331,0,0,-2403721.7,0,0,-3010118,0,0,-2700862,0,0,-148681.88,0,0,951644.63,0,0,404484.48}; +VT(0.089949388,0.2453858,0,0.083292987,0.24598228,0,0.084206466,0.24009781,0){0,0,339950.36,0,0,542685.82,0,0,569988.38,0,0,-911669.73,0,0,-1458992.1,0,0,-1492933.9,0,0,1193275.4,0,0,1920780.7,0,0,1847439,0,0,-1095139.7,0,0,-1784182,0,0,-1498530.8,0,0,648419.14,0,0,1091638.2,0,0,578923.58}; +VT(0.08415119,0.061061125,0,0.080938662,0.054906318,0,0.08944657,0.05485846,0){0,0,1759442.9,0,0,2097661.4,0,0,1211526.2,0,0,1064240.3,0,0,1423084,0,0,822600.19,0,0,-51487.645,0,0,290856.94,0,0,169573.91,0,0,-1146904.2,0,0,-934922.56,0,0,-537958.1,0,0,-1789550.6,0,0,-1860365.1,0,0,-1073022.7}; +VT(0.014285714,0.3,0,0.010662343,0.29482959,0,0.017990672,0.29207379,0){0,0,0,0,0,34537.041,0,0,86228.122,0,0,0,0,0,-103506.64,0,0,-258100.45,0,0,0,0,0,172164.12,0,0,428229.3,0,0,0,0,0,-240303.04,0,0,-595472.42,0,0,0,0,0,307518.14,0,0,758576.15}; +VT(0.08944657,0.05485846,0,0.094913401,0.051076335,0,0.1,0.057142857,0){0,0,1211526.2,0,0,595503.05,0,0,0,0,0,822600.19,0,0,429138.45,0,0,0,0,0,169573.91,0,0,142901.48,0,0,0,0,0,-537958.1,0,0,-183223.65,0,0,0,0,0,-1073022.7,0,0,-458373.75,0,0,0}; +VT(0.1,0.24285714,0,0.095090425,0.2489538,0,0.089949388,0.2453858,0){0,0,0,0,0,157454.16,0,0,339950.36,0,0,0,0,0,-428416.46,0,0,-911669.73,0,0,0,0,0,579817.55,0,0,1193275.4,0,0,0,0,0,-569427.53,0,0,-1095139.7,0,0,0,0,0,400020.01,0,0,648419.14}; +VT(0.01808004,0.0081573173,0,0.010679145,0.0052482016,0,0.014285714,0,0){0,0,2085729.2,0,0,1277155.8,0,0,1683701.5,0,0,2070583.9,0,0,1273289.3,0,0,1683671.3,0,0,2040406.9,0,0,1265566.3,0,0,1683611.9,0,0,1995444.2,0,0,1254019.7,0,0,1683542.6,0,0,1935913.6,0,0,1238493.9,0,0,1683226}; +VT(0.045375723,0.12284566,0,0.052058531,0.12554764,0,0.045894811,0.13135905,0){0,0,3072436,0,0,3065498.6,0,0,2973475.7,0,0,-1348503.3,0,0,-1512626.5,0,0,-1819976.4,0,0,-3829159.4,0,0,-3831818,0,0,-3679581.9,0,0,-800055.99,0,0,-428428.64,0,0,392676.16,0,0,3380414.3,0,0,3614977.4,0,0,3832095.1}; +VT(0.045894811,0.13135905,0,0.052058531,0.12554764,0,0.053497526,0.1329974,0){0,0,2973475.7,0,0,3065498.6,0,0,2959143.9,0,0,-1819976.4,0,0,-1512626.5,0,0,-1911000.9,0,0,-3679581.9,0,0,-3831818,0,0,-3636096,0,0,392676.16,0,0,-428428.64,0,0,623103.97,0,0,3832095.1,0,0,3614977.4,0,0,3857035.6}; +VT(0.03163445,0.20120488,0,0.036840853,0.20596239,0,0.030490983,0.2108424,0){0,0,1608414.7,0,0,1679916.9,0,0,1428644.1,0,0,-3251875.6,0,0,-3538121.9,0,0,-3128471,0,0,1714266.6,0,0,2233718.4,0,0,2293671,0,0,1500504,0,0,1067350,0,0,399562.24,0,0,-3248047,0,0,-3414669.4,0,0,-2769801.9}; +VT(0.089858368,0.18421461,0,0.082729031,0.18391978,0,0.085369203,0.17624497,0){0,0,692603.24,0,0,1144258.1,0,0,1039089.6,0,0,-1178349.1,0,0,-1940160.8,0,0,-1603144.1,0,0,133849.22,0,0,205244.05,0,0,-168940.91,0,0,1084450.2,0,0,1797438.3,0,0,1695116.9,0,0,-894447.98,0,0,-1455642.1,0,0,-751642.95}; +VT(0.02463475,0.21609565,0,0.021120118,0.21068669,0,0.030490983,0.2108424,0){0,0,1153636.1,0,0,1077357.5,0,0,1428644.1,0,0,-2626116.1,0,0,-2356401.7,0,0,-3128471,0,0,2198315,0,0,1720167.1,0,0,2293671,0,0,-179791.92,0,0,314292.11,0,0,399562.24,0,0,-1969098.8,0,0,-2093742.8,0,0,-2769801.9}; +VT(0.030490983,0.2108424,0,0.021120118,0.21068669,0,0.024044461,0.20382537,0){0,0,1428644.1,0,0,1077357.5,0,0,1283805.9,0,0,-3128471,0,0,-2356401.7,0,0,-2655634.7,0,0,2293671,0,0,1720167.1,0,0,1553893.8,0,0,399562.24,0,0,314292.11,0,0,995311.88,0,0,-2769801.9,0,0,-2093742.8,0,0,-2617892.2}; +VT(0.047385855,0.10193045,0,0.039702853,0.10111678,0,0.044548934,0.094607351,0){0,0,3329666.7,0,0,3175586.8,0,0,3364209.6,0,0,-117239.93,0,0,-64516.934,0,0,323528.56,0,0,-3442848.4,0,0,-3238866.3,0,0,-3009655.6,0,0,-3204510.9,0,0,-3108635.2,0,0,-3622750.1,0,0,350991.89,0,0,193445.51,0,0,-961698.97}; +VT(0.050721192,0.10961634,0,0.051013063,0.11801667,0,0.044666369,0.11545829,0){0,0,3257974.6,0,0,3161388.4,0,0,3148096.1,0,0,-583831.78,0,0,-1083065.4,0,0,-920013.3,0,0,-3737290.3,0,0,-3873486.3,0,0,-3799301.5,0,0,-2483878.9,0,0,-1463412.7,0,0,-1769018.1,0,0,1698581.7,0,0,2911579,0,0,2547335.8}; +VT(0.055764419,0.28986395,0,0.056292141,0.2827555,0,0.063469548,0.28521738,0){0,0,202473.1,0,0,343081.75,0,0,273598.49,0,0,-605163.67,0,0,-1018093.3,0,0,-814255.31,0,0,1001119.7,0,0,1660020.8,0,0,1335465.2,0,0,-1385941.2,0,0,-2248005.1,0,0,-1824812,0,0,1755276.4,0,0,2762903.8,0,0,2270429.1}; +VT(0.058552205,0.15400025,0,0.054296142,0.16027015,0,0.050010485,0.1548865,0){0,0,2589572.8,0,0,2568973.7,0,0,2672912.2,0,0,-2806487.5,0,0,-3120486,0,0,-2946373.7,0,0,-2354581.2,0,0,-1899085.7,0,0,-2371553.9,0,0,3003966,0,0,3528266.9,0,0,3189127.5,0,0,2103059.1,0,0,1141594.9,0,0,2045305.7}; +VT(0.01062282,0.18656765,0,0.0062925762,0.18063125,0,0.013878694,0.17880836,0){0,0,711483.53,0,0,445914.92,0,0,971566.52,0,0,-1243147.4,0,0,-727143.63,0,0,-1548960.4,0,0,217509.34,0,0,12632.594,0,0,-51095.574,0,0,1080570.1,0,0,719304.1,0,0,1579530,0,0,-1025407.6,0,0,-466469.22,0,0,-887966.26}; +VT(0.030490983,0.2108424,0,0.029518097,0.21985532,0,0.02463475,0.21609565,0){0,0,1428644.1,0,0,1264894.2,0,0,1153636.1,0,0,-3128471,0,0,-2954793.2,0,0,-2626116.1,0,0,2293671,0,0,2682751.8,0,0,2198315,0,0,399562.24,0,0,-629411.95,0,0,-179791.92,0,0,-2769801.9,0,0,-1842177.8,0,0,-1969098.8}; +VT(0.030312881,0.27848596,0,0.025044032,0.27464897,0,0.029991713,0.27132489,0){0,0,355416.48,0,0,363665.57,0,0,469504.82,0,0,-1048284.8,0,0,-1065519.5,0,0,-1366503,0,0,1688178.9,0,0,1692735.8,0,0,2141236.7,0,0,-2242771,0,0,-2201379.5,0,0,-2724385.3,0,0,2683885.3,0,0,2555652.6,0,0,3063642.3}; +VT(0.1,0.15,0,0.09156348,0.14589395,0,0.1,0.14285714,0){0,0,0,0,0,734092.88,0,0,0,0,0,0,0,0,-670961.7,0,0,0,0,0,0,0,0,-791796.8,0,0,0,0,0,0,0,0,602866.55,0,0,0,0,0,0,0,0,843431.47,0,0,0}; +VT(0.054957014,0.24657048,0,0.052478219,0.23860916,0,0.059437672,0.2400817,0){0,0,1058545,0,0,1222305.6,0,0,1145348.7,0,0,-2852831,0,0,-3178913.4,0,0,-2999714,0,0,3777171.8,0,0,3866354.4,0,0,3711340.5,0,0,-3549694.2,0,0,-3010118,0,0,-3009146,0,0,2239441.1,0,0,951644.63,0,0,1160252.2}; +VT(0.047556344,0.24377674,0,0.052478219,0.23860916,0,0.054957014,0.24657048,0){0,0,1122639.4,0,0,1222305.6,0,0,1058545,0,0,-2989881.7,0,0,-3178913.4,0,0,-2852831,0,0,3850350.4,0,0,3866354.4,0,0,3777171.8,0,0,-3414324.1,0,0,-3010118,0,0,-3549694.2,0,0,1828478.4,0,0,951644.63,0,0,2239441.1}; +VT(0.016702178,0.061420197,0,0.025221599,0.062165695,0,0.01882241,0.070374011,0){0,0,1844408.3,0,0,2618029.3,0,0,2018056.9,0,0,1107331.1,0,0,1547191.2,0,0,970762.8,0,0,-72241.295,0,0,-156575.4,0,0,-580354.6,0,0,-1222910.6,0,0,-1796512.5,0,0,-1830388.5,0,0,-1885264.1,0,0,-2702051.5,0,0,-2130853.3}; +VT(0.029380008,0.16405835,0,0.034314476,0.15645926,0,0.038427921,0.16264679,0){0,0,2021292.5,0,0,2334400.9,0,0,2389351.9,0,0,-2614335.2,0,0,-2649968.2,0,0,-3020403.6,0,0,-1254306.4,0,0,-1976247.7,0,0,-1591681.4,0,0,2982541.3,0,0,2917237.1,0,0,3440909.6,0,0,378860.61,0,0,1581967.4,0,0,682723.32}; +VT(0.027609688,0.15620978,0,0.034314476,0.15645926,0,0.029380008,0.16405835,0){0,0,2023546.1,0,0,2334400.9,0,0,2021292.5,0,0,-2286520.9,0,0,-2649968.2,0,0,-2614335.2,0,0,-1726415,0,0,-1976247.7,0,0,-1254306.4,0,0,2510934.9,0,0,2917237.1,0,0,2982541.3,0,0,1400022.9,0,0,1581967.4,0,0,378860.61}; +VT(0.041057987,0.068843254,0,0.037071258,0.0642048,0,0.045416206,0.061541227,0){0,0,3488848.8,0,0,3365311.2,0,0,3642820.9,0,0,1752771.3,0,0,1900443.5,0,0,2181474.8,0,0,-855539,0,0,-391679.98,0,0,-155055.51,0,0,-3038218.5,0,0,-2513388.8,0,0,-2429600.5,0,0,-3709409.4,0,0,-3541461.8,0,0,-3730025.8}; +VT(0.084368038,0.19048099,0,0.082729031,0.18391978,0,0.089858368,0.18421461,0){0,0,992852.93,0,0,1144258.1,0,0,692603.24,0,0,-1809621.2,0,0,-1940160.8,0,0,-1178349.1,0,0,495817.1,0,0,205244.05,0,0,133849.22,0,0,1401810.9,0,0,1797438.3,0,0,1084450.2,0,0,-1649308.4,0,0,-1455642.1,0,0,-894447.98}; +VT(0.020973714,0.16688371,0,0.014405512,0.17061143,0,0.014502412,0.16316663,0){0,0,1525118.3,0,0,1063653,0,0,1121335,0,0,-2061659.5,0,0,-1519257.6,0,0,-1429592.9,0,0,-799875.51,0,0,-412907.51,0,0,-728363.13,0,0,2343184.8,0,0,1696192.6,0,0,1629901.1,0,0,-24581.749,0,0,-313907.63,0,0,280110.31}; +VT(0.03663522,0.040674234,0,0.035858843,0.031497608,0,0.043838979,0.034579424,0){0,0,3463485.9,0,0,3456371.8,0,0,3745913.7,0,0,2844620.6,0,0,3083741.5,0,0,3260141.4,0,0,1717431.6,0,0,2378649.5,0,0,2351583.2,0,0,283267.24,0,0,1417116.3,0,0,1138042.7,0,0,-1201989.6,0,0,302618.73,0,0,-223347.31}; +VT(0.064075209,0.013493001,0,0.057612168,0.01845715,0,0.056199026,0.010061392,0){0,0,3498581.2,0,0,3752599.8,0,0,3801979,0,0,3428890.3,0,0,3612875.5,0,0,3759859.9,0,0,3290906.4,0,0,3338613.5,0,0,3676084,0,0,3087427.7,0,0,2940029.2,0,0,3551608.2,0,0,2822154,0,0,2431782.4,0,0,3387596.5}; +VT(0.025130011,0.29009115,0,0.028198926,0.28535727,0,0.031264826,0.29263185,0){0,0,142877.47,0,0,230200.16,0,0,124484.17,0,0,-427099.39,0,0,-685197.76,0,0,-372709.78,0,0,706741.94,0,0,1124120.6,0,0,618717.86,0,0,-978805.55,0,0,-1536674.3,0,0,-861054.65,0,0,1240164.3,0,0,1912913.1,0,0,1098239.8}; +VT(0.066799394,0.09162077,0,0.069968451,0.098831219,0,0.061027247,0.098743066,0){0,0,2974160.1,0,0,2730411,0,0,3173016.6,0,0,440022.16,0,0,57648.531,0,0,72008.811,0,0,-2469083.6,0,0,-2671597.7,0,0,-3099474,0,0,-3274492.4,0,0,-2785714.6,0,0,-3241975.4,0,0,-1290097.2,0,0,-173126.8,0,0,-216202.29}; +VT(0.063469548,0.28521738,0,0.056292141,0.2827555,0,0.059078636,0.27701937,0){0,0,273598.49,0,0,343081.75,0,0,447007.97,0,0,-814255.31,0,0,-1018093.3,0,0,-1315269.1,0,0,1335465.2,0,0,1660020.8,0,0,2107766.2,0,0,-1824812,0,0,-2248005.1,0,0,-2778864.5,0,0,2270429.1,0,0,2762903.8,0,0,3289755.3}; +VT(0.05718895,0.22161738,0,0.062992669,0.22303634,0,0.059957308,0.22757204,0){0,0,1508977,0,0,1396775.9,0,0,1366903.5,0,0,-3566099.1,0,0,-3331109.7,0,0,-3351367.9,0,0,3352547.9,0,0,3216330,0,0,3498598.8,0,0,-1004251.2,0,0,-1122974.8,0,0,-1727811.3,0,0,-1983866.6,0,0,-1661551.4,0,0,-990620.01}; +VT(0.063265205,0.21633109,0,0.062992669,0.22303634,0,0.05718895,0.22161738,0){0,0,1505335.5,0,0,1396775.9,0,0,1508977,0,0,-3432481.9,0,0,-3331109.7,0,0,-3566099.1,0,0,2888962.8,0,0,3216330,0,0,3352547.9,0,0,-265885.87,0,0,-1122974.8,0,0,-1004251.2,0,0,-2549234.8,0,0,-1661551.4,0,0,-1983866.6}; +VT(0.044637502,0.20577347,0,0.045116599,0.21481108,0,0.038843793,0.21103197,0){0,0,1811821.2,0,0,1654487.5,0,0,1637090.1,0,0,-3810004,0,0,-3731787.4,0,0,-3590120.4,0,0,2390091.8,0,0,3030991.5,0,0,2645890.8,0,0,1174216.7,0,0,-73694.316,0,0,433646.44,0,0,-3685779.4,0,0,-2938909.4,0,0,-3163532.2}; +VT(0.061631884,0.26868773,0,0.055001581,0.27169863,0,0.0528723,0.26429657,0){0,0,591535.29,0,0,565900.8,0,0,718299.05,0,0,-1711593.4,0,0,-1648356.5,0,0,-2055661.9,0,0,2649353.2,0,0,2587095.5,0,0,3109067.1,0,0,-3304968.8,0,0,-3300283.2,0,0,-3733060,0,0,3608394.3,0,0,3725567.5,0,0,3841282.5}; +VT(0.049232245,0.21047418,0,0.045116599,0.21481108,0,0.044637502,0.20577347,0){0,0,1752658.6,0,0,1654487.5,0,0,1811821.2,0,0,-3827070.5,0,0,-3731787.4,0,0,-3810004,0,0,2777012.8,0,0,3030991.5,0,0,2390091.8,0,0,540242.46,0,0,-73694.316,0,0,1174216.7,0,0,-3416565.4,0,0,-2938909.4,0,0,-3685779.4}; +VT(0.1,0.17142857,0,0.093873231,0.17693503,0,0.092195724,0.16853594,0){0,0,0,0,0,445896.9,0,0,598378.34,0,0,0,0,0,-694096.79,0,0,-829189.07,0,0,0,0,0,-59504.029,0,0,-278570.16,0,0,0,0,0,727141.13,0,0,936666.51,0,0,0,0,0,-345394.37,0,0,-82641.6}; +VT(0.0060491453,0.25298129,0,0.0071908097,0.26035264,0,0,0.25714286,0){0,0,178654.23,0,0,179155.76,0,0,0,0,0,-493529.07,0,0,-507033.49,0,0,0,0,0,691183.17,0,0,748779.14,0,0,0,0,0,-724662.05,0,0,-863311.12,0,0,0,0,0,585970.08,0,0,830950.48,0,0,0}; +VT(0.0072553778,0.13224921,0,0.014210915,0.13228117,0,0.012304267,0.13852123,0){0,0,674958.82,0,0,1289449.4,0,0,1094693.2,0,0,-425463.67,0,0,-813665.75,0,0,-832176.34,0,0,-832230.25,0,0,-1589638.3,0,0,-1294374.3,0,0,117822.57,0,0,227067.92,0,0,521821.54,0,0,875622.71,0,0,1673024.3,0,0,1419655.5}; +VT(0.028359285,0.029784535,0,0.030602087,0.036163623,0,0.023478597,0.036718106,0){0,0,2981166.2,0,0,3125169.1,0,0,2561783.8,0,0,2693525.9,0,0,2682310.4,0,0,2187675.4,0,0,2145980.7,0,0,1859340.6,0,0,1494080.3,0,0,1391347.7,0,0,772883.67,0,0,582277.59,0,0,502245.34,0,0,-423255.99,0,0,-414804.14}; +VT(0.023478597,0.036718106,0,0.030602087,0.036163623,0,0.028678488,0.042143634,0){0,0,2561783.8,0,0,3125169.1,0,0,2968313.4,0,0,2187675.4,0,0,2682310.4,0,0,2399521.8,0,0,1494080.3,0,0,1859340.6,0,0,1370917.4,0,0,582277.59,0,0,772883.67,0,0,79587.615,0,0,-414804.14,0,0,-423255.99,0,0,-1227272.3}; +VT(0.0069613667,0.17349451,0,0.014405512,0.17061143,0,0.013878694,0.17880836,0){0,0,517779.21,0,0,1063653,0,0,971566.52,0,0,-769992.03,0,0,-1519257.6,0,0,-1548960.4,0,0,-142713.64,0,0,-412907.51,0,0,-51095.574,0,0,839532.94,0,0,1696192.6,0,0,1579530,0,0,-266340.1,0,0,-313907.63,0,0,-887966.26}; +VT(0.069467767,0.146519,0,0.068478919,0.13862632,0,0.075488644,0.14176328,0){0,0,2287173.5,0,0,2426951.1,0,0,1990888.2,0,0,-2120501.9,0,0,-1850187.5,0,0,-1647841.2,0,0,-2441744.6,0,0,-2866745.3,0,0,-2274843.7,0,0,1942651.5,0,0,1169007.7,0,0,1255935.2,0,0,2583122,0,0,3144665.9,0,0,2491166.6}; +VT(0.043838979,0.034579424,0,0.048866761,0.029559705,0,0.052748817,0.036292023,0){0,0,3745913.7,0,0,3831772.8,0,0,3796611.1,0,0,3260141.4,0,0,3467532.3,0,0,3254886.9,0,0,2351583.2,0,0,2773676.3,0,0,2248728.5,0,0,1138042.7,0,0,1816186,0,0,921690.78,0,0,-223347.31,0,0,685852.4,0,0,-537197.11}; +VT(0.0528723,0.26429657,0,0.049721881,0.27094787,0,0.043491003,0.26677795,0){0,0,718299.05,0,0,588018.61,0,0,657627.62,0,0,-2055661.9,0,0,-1710042.9,0,0,-1894105.9,0,0,3109067.1,0,0,2675009.8,0,0,2903724.9,0,0,-3733060,0,0,-3394309,0,0,-3565612.1,0,0,3841282.5,0,0,3801713.7,0,0,3800401.2}; +VT(0.044548934,0.094607351,0,0.039702853,0.10111678,0,0.03690243,0.09394169,0){0,0,3364209.6,0,0,3175586.8,0,0,3135041.5,0,0,323528.56,0,0,-64516.934,0,0,337961.95,0,0,-3009655.6,0,0,-3238866.3,0,0,-2760700,0,0,-3622750.1,0,0,-3108635.2,0,0,-3396384.7,0,0,-961698.97,0,0,193445.51,0,0,-1002139.6}; +VT(0.089858368,0.18421461,0,0.095453592,0.18738967,0,0.091593501,0.1915477,0){0,0,692603.24,0,0,307137.29,0,0,544831.72,0,0,-1178349.1,0,0,-541566.85,0,0,-1004107.1,0,0,133849.22,0,0,106216.39,0,0,301623.68,0,0,1084450.2,0,0,460538.95,0,0,749822.54,0,0,-894447.98,0,0,-458087.35,0,0,-933881.71}; +VT(0,0.12857143,0,0.0061411468,0.1246533,0,0.0072553778,0.13224921,0){0,0,0,0,0,591118.91,0,0,674958.82,0,0,0,0,0,-280990.71,0,0,-425463.67,0,0,0,0,0,-738586.84,0,0,-832230.25,0,0,0,0,0,-106527.54,0,0,117822.57,0,0,0,0,0,682629.18,0,0,875622.71}; +VT(0.057612168,0.01845715,0,0.052049192,0.01582547,0,0.056199026,0.010061392,0){0,0,3752599.8,0,0,3859264.8,0,0,3801979,0,0,3612875.5,0,0,3753529.9,0,0,3759859.9,0,0,3338613.5,0,0,3544947.6,0,0,3676084,0,0,2940029.2,0,0,3239251.6,0,0,3551608.2,0,0,2431782.4,0,0,2844641.6,0,0,3387596.5}; +VT(0.015977634,0.20443356,0,0.021120118,0.21068669,0,0.013229009,0.21171696,0){0,0,895779.15,0,0,1077357.5,0,0,698716.07,0,0,-1862602.8,0,0,-2356401.7,0,0,-1540332.8,0,0,1114548.4,0,0,1720167.1,0,0,1156621.3,0,0,659707.69,0,0,314292.11,0,0,147278.69,0,0,-1827076.9,0,0,-2093742.8,0,0,-1334554.8}; +VT(0.0064812773,0.046734878,0,0.0063343033,0.038958017,0,0.011573719,0.041901165,0){0,0,761350.4,0,0,751213.74,0,0,1347025.1,0,0,582610.88,0,0,627892.11,0,0,1091815.8,0,0,267082.8,0,0,401490.67,0,0,629744.45,0,0,-111174.21,0,0,109174.99,0,0,48353.226,0,0,-463416.67,0,0,-201236.23,0,0,-542301.86}; +VT(0.054395265,0.16699477,0,0.054296142,0.16027015,0,0.061476805,0.16269562,0){0,0,2465605.5,0,0,2568973.7,0,0,2391378.9,0,0,-3338618.7,0,0,-3120486,0,0,-3025373.1,0,0,-1283530.8,0,0,-1899085.7,0,0,-1589341.3,0,0,3793219.5,0,0,3528266.9,0,0,3446908.2,0,0,-59660.123,0,0,1141594.9,0,0,675366.83}; +VT(0.0094805882,0.16707285,0,0.0046637588,0.16745308,0,0.0068768393,0.16098373,0){0,0,730151.01,0,0,362371.83,0,0,553409.29,0,0,-989834.58,0,0,-494096.85,0,0,-680450.71,0,0,-378084.11,0,0,-182769.85,0,0,-397156.36,0,0,1124284.7,0,0,560561.48,0,0,771605.48,0,0,-22095.939,0,0,-21256.565,0,0,219690.78}; +VT(0.017763535,0.12074209,0,0.023213665,0.1150537,0,0.025139549,0.12057635,0){0,0,1657769.5,0,0,2130593.3,0,0,2224740.3,0,0,-657738.05,0,0,-605772.32,0,0,-875333.98,0,0,-2054600.3,0,0,-2564157.8,0,0,-2755721.9,0,0,-581651.26,0,0,-1229375.9,0,0,-796179.51,0,0,1703675.4,0,0,1684092.7,0,0,2272644.8}; +VT(0,0.14285714,0,0.0078195435,0.14622426,0,0,0.15,0){0,0,0,0,0,680366.1,0,0,0,0,0,0,0,0,-626541.18,0,0,0,0,0,0,0,0,-729870.69,0,0,0,0,0,0,0,0,568744.13,0,0,0,0,0,0,0,0,774663.29,0,0,0}; +VT(0,0.10714286,0,0.0081152275,0.10988635,0,0,0.11428571,0){0,0,0,0,0,821145.89,0,0,0,0,0,0,0,0,-151361.79,0,0,0,0,0,0,0,0,-944689.8,0,0,0,0,0,0,0,0,-619246.83,0,0,0,0,0,0,0,0,439508.43,0,0,0}; +VT(0.023483408,0.28013687,0,0.025044032,0.27464897,0,0.030312881,0.27848596,0){0,0,270985.88,0,0,363665.57,0,0,355416.48,0,0,-801278.39,0,0,-1065519.5,0,0,-1048284.8,0,0,1297043.7,0,0,1692735.8,0,0,1688178.9,0,0,-1736920.8,0,0,-2201379.5,0,0,-2242771,0,0,2101746.5,0,0,2555652.6,0,0,2683885.3}; +VT(0.085369203,0.17624497,0,0.083969261,0.16737329,0,0.092195724,0.16853594,0){0,0,1039089.6,0,0,1198489.7,0,0,598378.34,0,0,-1603144.1,0,0,-1632158.2,0,0,-829189.07,0,0,-168940.91,0,0,-607916.58,0,0,-278570.16,0,0,1695116.9,0,0,1852187.2,0,0,936666.51,0,0,-751642.95,0,0,-62490.334,0,0,-82641.6}; +VT(0.0910478,0.13167545,0,0.093823791,0.12410599,0,0.1,0.12857143,0){0,0,831136.87,0,0,595735.92,0,0,0,0,0,-514132.23,0,0,-276601.23,0,0,0,0,0,-1027305.8,0,0,-743959.63,0,0,0,0,0,122313.64,0,0,-121937.8,0,0,0,0,0,1073956.7,0,0,678759.2,0,0,0}; +VT(0.1,0.10714286,0,0.091758141,0.11296708,0,0.091053567,0.10618538,0){0,0,0,0,0,824791.32,0,0,914271.31,0,0,0,0,0,-201020.76,0,0,-104388.15,0,0,0,0,0,-976886.6,0,0,-1006721.9,0,0,0,0,0,-537824.26,0,0,-787386.88,0,0,0,0,0,570097.26,0,0,309052.61}; +VT(0.01808004,0.0081573173,0,0.022427218,0.014872357,0,0.015416139,0.018002698,0){0,0,2085729.2,0,0,2505875.7,0,0,1798828.3,0,0,2070583.9,0,0,2445229.8,0,0,1735136,0,0,2040406.9,0,0,2325397.7,0,0,1609995.5,0,0,1995444.2,0,0,2149288.4,0,0,1427830.3,0,0,1935913.6,0,0,1920956.8,0,0,1194733.1}; +VT(0.015498485,0.28248556,0,0.0220603,0.28602893,0,0.017990672,0.29207379,0){0,0,166274.63,0,0,181204.07,0,0,86228.122,0,0,-493262.57,0,0,-539738.59,0,0,-258100.45,0,0,803759.61,0,0,886739.53,0,0,428229.3,0,0,-1087394.1,0,0,-1214791.9,0,0,-595472.42,0,0,1334475.8,0,0,1516611.7,0,0,758576.15}; +VT(0.013229009,0.21171696,0,0.021120118,0.21068669,0,0.018343869,0.21720619,0){0,0,698716.07,0,0,1077357.5,0,0,888277.19,0,0,-1540332.8,0,0,-2356401.7,0,0,-2037897.4,0,0,1156621.3,0,0,1720167.1,0,0,1749211,0,0,147278.69,0,0,314292.11,0,0,-225952.88,0,0,-1334554.8,0,0,-2093742.8,0,0,-1457259.1}; +VT(0.061015306,0.048529238,0,0.060555575,0.040182349,0,0.066401409,0.0434645,0){0,0,3533367.8,0,0,3588260.7,0,0,3289675.8,0,0,2640342.3,0,0,2962222.2,0,0,2619840.6,0,0,1080012.2,0,0,1819353,0,0,1416557.6,0,0,-753291.7,0,0,359025.67,0,0,-75156.319,0,0,-2396723.8,0,0,-1164330.1,0,0,-1551772}; +VT(0.054794838,0.043915046,0,0.060555575,0.040182349,0,0.061015306,0.048529238,0){0,0,3735662.6,0,0,3588260.7,0,0,3533367.8,0,0,2959425,0,0,2962222.2,0,0,2640342.3,0,0,1568238.5,0,0,1819353,0,0,1080012.2,0,0,-148813.91,0,0,359025.67,0,0,-753291.7,0,0,-1835117.4,0,0,-1164330.1,0,0,-2396723.8}; +VT(0.01062282,0.18656765,0,0.012931293,0.19295437,0,0.0066871595,0.19241823,0){0,0,711483.53,0,0,815194.79,0,0,432113.5,0,0,-1243147.4,0,0,-1524077.7,0,0,-803518.34,0,0,217509.34,0,0,510133.92,0,0,258472.73,0,0,1080570.1,0,0,1080471.8,0,0,581490.34,0,0,-1025407.6,0,0,-1450076.4,0,0,-758588.26}; +VT(0.010546892,0.2198034,0,0.0069979116,0.22643766,0,0,0.22142857,0){0,0,514716.79,0,0,317964.48,0,0,0,0,0,-1201974.2,0,0,-774386.26,0,0,0,0,0,1090194.6,0,0,793599.18,0,0,0,0,0,-253690.09,0,0,-364658.79,0,0,0,0,0,-751659.26,0,0,-270536.88,0,0,0}; +VT(0.04704595,0.16277363,0,0.054296142,0.16027015,0,0.054395265,0.16699477,0){0,0,2543508.6,0,0,2568973.7,0,0,2465605.5,0,0,-3221973.5,0,0,-3120486,0,0,-3338618.7,0,0,-1684138.2,0,0,-1899085.7,0,0,-1283530.8,0,0,3671419.3,0,0,3528266.9,0,0,3793219.5,0,0,704902.67,0,0,1141594.9,0,0,-59660.123}; +VT(0.015758122,0.23699049,0,0.016939848,0.22904958,0,0.022740693,0.23189018,0){0,0,597291.98,0,0,714788.59,0,0,887604.04,0,0,-1541119.1,0,0,-1767596.2,0,0,-2230116.3,0,0,1837947.1,0,0,1888698.3,0,0,2485475.6,0,0,-1363109.4,0,0,-1014237.8,0,0,-1529145.6,0,0,315646.37,0,0,-395054.79,0,0,-172982.46}; +VT(0.076430303,0.18837043,0,0.082729031,0.18391978,0,0.084368038,0.19048099,0){0,0,1444535.6,0,0,1144258.1,0,0,992852.93,0,0,-2574453.4,0,0,-1940160.8,0,0,-1809621.2,0,0,569102.25,0,0,205244.05,0,0,495817.1,0,0,2129625.3,0,0,1797438.3,0,0,1401810.9,0,0,-2235391.7,0,0,-1455642.1,0,0,-1649308.4}; +VT(0.077619244,0.18028791,0,0.082729031,0.18391978,0,0.076430303,0.18837043,0){0,0,1471797.4,0,0,1144258.1,0,0,1444535.6,0,0,-2389894.4,0,0,-1940160.8,0,0,-2574453.4,0,0,18944.546,0,0,205244.05,0,0,569102.25,0,0,2378251.6,0,0,1797438.3,0,0,2129625.3,0,0,-1502642.9,0,0,-1455642.1,0,0,-2235391.7}; +VT(0.059078636,0.27701937,0,0.056292141,0.2827555,0,0.051703203,0.27754162,0){0,0,447007.97,0,0,343081.75,0,0,454636.43,0,0,-1315269.1,0,0,-1018093.3,0,0,-1338881.7,0,0,2107766.2,0,0,1660020.8,0,0,2149437.1,0,0,-2778864.5,0,0,-2248005.1,0,0,-2841702,0,0,3289755.3,0,0,2762903.8,0,0,3377384.9}; +VT(0.010546892,0.2198034,0,0.0051799073,0.21317882,0,0.013229009,0.21171696,0){0,0,514716.79,0,0,276031.48,0,0,698716.07,0,0,-1201974.2,0,0,-615227.88,0,0,-1540332.8,0,0,1090194.6,0,0,479976.29,0,0,1156621.3,0,0,-253690.09,0,0,25450.705,0,0,147278.69,0,0,-751659.26,0,0,-511551.59,0,0,-1334554.8}; +VT(0.061027247,0.098743066,0,0.052532368,0.096036702,0,0.058212185,0.089881183,0){0,0,3173016.6,0,0,3389506.1,0,0,3344291.6,0,0,72008.811,0,0,240670.51,0,0,593905.21,0,0,-3099474,0,0,-3131818.5,0,0,-2645013.4,0,0,-3241975.4,0,0,-3594959.1,0,0,-3708817.1,0,0,-216202.29,0,0,-718569.73,0,0,-1722713.3}; +VT(0.09156348,0.14589395,0,0.09308158,0.15403623,0,0.084604507,0.15255901,0){0,0,734092.88,0,0,579061.91,0,0,1258841.2,0,0,-670961.7,0,0,-628036.95,0,0,-1326319,0,0,-791796.8,0,0,-525997.02,0,0,-1187789.9,0,0,602866.55,0,0,672596.25,0,0,1390056.3,0,0,843431.47,0,0,469080.04,0,0,1113216.6}; +VT(0,0.2,0,0.007303543,0.20469543,0,0,0.20714286,0){0,0,0,0,0,422375.13,0,0,0,0,0,0,0,0,-880191.16,0,0,0,0,0,0,0,0,531663.92,0,0,0,0,0,0,0,0,303952.91,0,0,0,0,0,0,0,0,-861341.37,0,0,0}; +VT(0.052478219,0.23860916,0,0.056766116,0.23329497,0,0.059437672,0.2400817,0){0,0,1222305.6,0,0,1298096.4,0,0,1145348.7,0,0,-3178913.4,0,0,-3286228.7,0,0,-2999714,0,0,3866354.4,0,0,3735031.6,0,0,3711340.5,0,0,-3010118,0,0,-2434254.7,0,0,-3009146,0,0,951644.63,0,0,-7070.0355,0,0,1160252.2}; +VT(0.045331711,0.23557633,0,0.04727629,0.22823863,0,0.050960377,0.23252058,0){0,0,1270563.3,0,0,1418822.2,0,0,1342135.9,0,0,-3255008.9,0,0,-3492237.2,0,0,-3383651.2,0,0,3813331,0,0,3684627.2,0,0,3804738.6,0,0,-2700862,0,0,-1892328,0,0,-2403721.7,0,0,404484.48,0,0,-919608.01,0,0,-148681.88}; +VT(0.072044079,0.08604506,0,0.075872285,0.081656016,0,0.079265602,0.086677581,0){0,0,2688599.4,0,0,2427639,0,0,2114636.1,0,0,649473.83,0,0,758134.07,0,0,488789.06,0,0,-1882262.6,0,0,-1432759.9,0,0,-1512904.7,0,0,-2986497.2,0,0,-2638364.3,0,0,-2351470.6,0,0,-1825996.4,0,0,-2029677.1,0,0,-1382326.1}; +VT(0.084917502,0.034253561,0,0.092450683,0.030760689,0,0.092141527,0.03991184,0){0,0,1742331.8,0,0,900007.85,0,0,927649.93,0,0,1520580.8,0,0,807431.66,0,0,767955.56,0,0,1105294,0,0,631804.95,0,0,476054.53,0,0,549324.68,0,0,391202.83,0,0,102192.68,0,0,-76880.401,0,0,110124.82,0,0,-289378.9}; +VT(0.092295863,0.26000779,0,0.092520768,0.26920591,0,0.085115353,0.26563346,0){0,0,193329.27,0,0,145042.72,0,0,313056.52,0,0,-546576.12,0,0,-420173.4,0,0,-899063.8,0,0,805368.84,0,0,651988.34,0,0,1369900.4,0,0,-924990.4,0,0,-816598.86,0,0,-1665255.4,0,0,884724.5,0,0,896908.09,0,0,1747205.8}; +VT(0.059437672,0.2400817,0,0.056766116,0.23329497,0,0.064373335,0.2338171,0){0,0,1145348.7,0,0,1298096.4,0,0,1185902.3,0,0,-2999714,0,0,-3286228.7,0,0,-3010536.1,0,0,3711340.5,0,0,3735031.6,0,0,3446119.8,0,0,-3009146,0,0,-2434254.7,0,0,-2291596.2,0,0,1160252.2,0,0,-7070.0355,0,0,79206.699}; +VT(0.075978544,0.034466341,0,0.067616069,0.037109229,0,0.068707287,0.030314019,0){0,0,2615244.9,0,0,3239242.7,0,0,3188897.7,0,0,2278283.7,0,0,2756202.5,0,0,2870259.7,0,0,1647758.2,0,0,1862139.4,0,0,2264806.3,0,0,804880.96,0,0,690369.93,0,0,1433032.7,0,0,-142067.87,0,0,-584563.48,0,0,457746.25}; +VT(0.01062282,0.18656765,0,0.016878531,0.18478654,0,0.017373248,0.19021363,0){0,0,711483.53,0,0,1113458.1,0,0,1095255.9,0,0,-1243147.4,0,0,-1906862.4,0,0,-1990705.9,0,0,217509.34,0,0,245299.96,0,0,532263.7,0,0,1080570.1,0,0,1732097.5,0,0,1555631.8,0,0,-1025407.6,0,0,-1479759.2,0,0,-1804413.6}; +VT(0.013878694,0.17880836,0,0.016878531,0.18478654,0,0.01062282,0.18656765,0){0,0,971566.52,0,0,1113458.1,0,0,711483.53,0,0,-1548960.4,0,0,-1906862.4,0,0,-1243147.4,0,0,-51095.574,0,0,245299.96,0,0,217509.34,0,0,1579530,0,0,1732097.5,0,0,1080570.1,0,0,-887966.26,0,0,-1479759.2,0,0,-1025407.6}; +VT(0.069536278,0.26943087,0,0.068237016,0.26229006,0,0.076498673,0.26519709,0){0,0,505602.11,0,0,639705.29,0,0,473307.48,0,0,-1465439,0,0,-1820649,0,0,-1357765.2,0,0,2276404,0,0,2721368.6,0,0,2063933,0,0,-2856108.7,0,0,-3203243.1,0,0,-2499100.3,0,0,3145421.5,0,0,3191912.1,0,0,2605934.6}; +VT(0.059551151,0.20970619,0,0.053221516,0.20704838,0,0.060432552,0.20227914,0){0,0,1688112.8,0,0,1805672.4,0,0,1798951.1,0,0,-3664209.4,0,0,-3837129.3,0,0,-3671781.8,0,0,2601193.1,0,0,2511247.5,0,0,2023610.8,0,0,619333.89,0,0,1011998.4,0,0,1565241.8,0,0,-3326584.6,0,0,-3650194.7,0,0,-3653837}; +VT(0.066799394,0.09162077,0,0.072044079,0.08604506,0,0.07492972,0.092844339,0){0,0,2974160.1,0,0,2688599.4,0,0,2431427.6,0,0,440022.16,0,0,649473.83,0,0,308451.38,0,0,-2469083.6,0,0,-1882262.6,0,0,-2083891.4,0,0,-3274492.4,0,0,-2986497.2,0,0,-2656803.1,0,0,-1290097.2,0,0,-1825996.4,0,0,-910298.79}; +VT(0.0098751756,0.25600949,0,0.0071908097,0.26035264,0,0.0060491453,0.25298129,0){0,0,270470.11,0,0,179155.76,0,0,178654.23,0,0,-755004.71,0,0,-507033.49,0,0,-493529.07,0,0,1082095.4,0,0,748779.14,0,0,691183.17,0,0,-1183544.7,0,0,-863311.12,0,0,-724662.05,0,0,1038261.4,0,0,830950.48,0,0,585970.08}; +VT(0.077140734,0.17217741,0,0.083969261,0.16737329,0,0.085369203,0.17624497,0){0,0,1584233.7,0,0,1198489.7,0,0,1039089.6,0,0,-2313491.7,0,0,-1632158.2,0,0,-1603144.1,0,0,-519338.58,0,0,-607916.58,0,0,-168940.91,0,0,2552719.3,0,0,1852187.2,0,0,1695116.9,0,0,-655929.75,0,0,-62490.334,0,0,-751642.95}; +VT(0.041402067,0.22952626,0,0.04727629,0.22823863,0,0.045331711,0.23557633,0){0,0,1348916.4,0,0,1418822.2,0,0,1270563.3,0,0,-3344816,0,0,-3492237.2,0,0,-3255008.9,0,0,3600200.4,0,0,3684627.2,0,0,3813331,0,0,-1982154,0,0,-1892328,0,0,-2700862,0,0,-667743.82,0,0,-919608.01,0,0,404484.48}; +VT(0.0071147476,0.24137211,0,0.013821768,0.24617185,0,0.0087429334,0.24792416,0){0,0,259907.57,0,0,454053.45,0,0,283453.34,0,0,-684802.64,0,0,-1221678.8,0,0,-768118.62,0,0,859611.54,0,0,1611329.8,0,0,1029935.2,0,0,-720499.62,0,0,-1502439.1,0,0,-992967.39,0,0,317972.39,0,0,928515.88,0,0,667809.3}; +VT(0.007303543,0.20469543,0,0.0051799073,0.21317882,0,0,0.20714286,0){0,0,422375.13,0,0,276031.48,0,0,0,0,0,-880191.16,0,0,-615227.88,0,0,0,0,0,531663.92,0,0,479976.29,0,0,0,0,0,303952.91,0,0,25450.705,0,0,0,0,0,-861341.37,0,0,-511551.59,0,0,0}; +VT(0.052748817,0.036292023,0,0.054261983,0.029107824,0,0.060819012,0.031697917,0){0,0,3796611.1,0,0,3801269,0,0,3608360,0,0,3254886.9,0,0,3450822.2,0,0,3214477.8,0,0,2248728.5,0,0,2782228.4,0,0,2469695.4,0,0,921690.78,0,0,1857139.4,0,0,1455299.1,0,0,-537197.11,0,0,760852.59,0,0,281702.17}; +VT(0.064832361,0.062804408,0,0.070754378,0.060222618,0,0.072323403,0.067507008,0){0,0,3281120.4,0,0,2932444.5,0,0,2781512.1,0,0,1912310.8,0,0,1804303.3,0,0,1448400.9,0,0,-254314.65,0,0,-17984.254,0,0,-578922.09,0,0,-2314932.7,0,0,-1833384.6,0,0,-2328912.3,0,0,-3410309.6,0,0,-2943704.7,0,0,-2963263.7}; +VT(0.011197941,0.071439681,0,0.0060853536,0.074713803,0,0.0062494098,0.068021592,0){0,0,1244724.5,0,0,681675.12,0,0,709501.16,0,0,579995.21,0,0,285253.65,0,0,364477.97,0,0,-394493.66,0,0,-277070.48,0,0,-157824.6,0,0,-1158343.6,0,0,-678306.76,0,0,-603457.47,0,0,-1303869.8,0,0,-685312.86,0,0,-756039.79}; +VT(0.05288218,0.14757716,0,0.045364072,0.14896511,0,0.047918899,0.14257657,0){0,0,2767228.4,0,0,2729630.7,0,0,2842478.3,0,0,-2626819.9,0,0,-2670475.8,0,0,-2400971.6,0,0,-2900596.1,0,0,-2787568.3,0,0,-3215455,0,0,2479722.6,0,0,2610132.2,0,0,1901551.7,0,0,3026446,0,0,2844182.1,0,0,3510918.5}; +VT(0,0.18571429,0,0.0062925762,0.18063125,0,0.01062282,0.18656765,0){0,0,0,0,0,445914.92,0,0,711483.53,0,0,0,0,0,-727143.63,0,0,-1243147.4,0,0,0,0,0,12632.594,0,0,217509.34,0,0,0,0,0,719304.1,0,0,1080570.1,0,0,0,0,0,-466469.22,0,0,-1025407.6}; +VT(0.077140734,0.17217741,0,0.071841704,0.17726974,0,0.071059851,0.17209017,0){0,0,1584233.7,0,0,1799263.7,0,0,1900690.4,0,0,-2313491.7,0,0,-2812994.5,0,0,-2772233.4,0,0,-519338.58,0,0,-214389.53,0,0,-629520.98,0,0,2552719.3,0,0,2933842.6,0,0,3060958.1,0,0,-655929.75,0,0,-1438939.3,0,0,-774142.34}; +VT(0.066992124,0.20847551,0,0.06966854,0.20076802,0,0.075422073,0.20645372,0){0,0,1540360.8,0,0,1570520.4,0,0,1273700.5,0,0,-3311175.4,0,0,-3162888.4,0,0,-2693470,0,0,2266191.6,0,0,1636334.6,0,0,1728669,0,0,706070.36,0,0,1503948.1,0,0,766631.5,0,0,-3078419.5,0,0,-3161601.9,0,0,-2583646.6}; +VT(0.039157325,0.25334591,0,0.043027686,0.24899973,0,0.04563604,0.25694979,0){0,0,884627.38,0,0,999522.33,0,0,859240.08,0,0,-2446896,0,0,-2720190.5,0,0,-2406042.8,0,0,3436661.2,0,0,3683283.3,0,0,3472131.8,0,0,-3622356.9,0,0,-3620573.8,0,0,-3844488.4,0,0,2960330.2,0,0,2549278.8,0,0,3448330.3}; +VT(0.070175425,0.16144206,0,0.072573599,0.16764459,0,0.067098511,0.16826118,0){0,0,2074683.8,0,0,1881427.5,0,0,2121688.2,0,0,-2570674.4,0,0,-2572760.4,0,0,-2928224.5,0,0,-1460177,0,0,-936075.04,0,0,-1008555.7,0,0,2919916.2,0,0,2916777.1,0,0,3311710.7,0,0,762077.82,0,0,-135849.37,0,0,-250662.47}; +VT(0.014502412,0.16316663,0,0.014405512,0.17061143,0,0.0094805882,0.16707285,0){0,0,1121335,0,0,1063653,0,0,730151.01,0,0,-1429592.9,0,0,-1519257.6,0,0,-989834.58,0,0,-728363.13,0,0,-412907.51,0,0,-378084.11,0,0,1629901.1,0,0,1696192.6,0,0,1124284.7,0,0,280110.31,0,0,-313907.63,0,0,-22095.939}; +VT(0.060819012,0.031697917,0,0.057707972,0.025075094,0,0.064795861,0.023107998,0){0,0,3608360,0,0,3734947.8,0,0,3443592.1,0,0,3214477.8,0,0,3478918.2,0,0,3242943.8,0,0,2469695.4,0,0,2984396.6,0,0,2853338,0,0,1455299.1,0,0,2285289.9,0,0,2297494.4,0,0,281702.17,0,0,1429238.8,0,0,1607540.9}; +VT(0.01882241,0.070374011,0,0.012193394,0.066188359,0,0.016702178,0.061420197,0){0,0,2018056.9,0,0,1364188,0,0,1844408.3,0,0,970762.8,0,0,734639.92,0,0,1107331.1,0,0,-580354.6,0,0,-233939.49,0,0,-72241.295,0,0,-1830388.5,0,0,-1094586.7,0,0,-1222910.6,0,0,-2130853.3,0,0,-1450385,0,0,-1885264.1}; +VT(0.011197941,0.071439681,0,0.012193394,0.066188359,0,0.01882241,0.070374011,0){0,0,1244724.5,0,0,1364188,0,0,2018056.9,0,0,579995.21,0,0,734639.92,0,0,970762.8,0,0,-394493.66,0,0,-233939.49,0,0,-580354.6,0,0,-1158343.6,0,0,-1094586.7,0,0,-1830388.5,0,0,-1303869.8,0,0,-1450385,0,0,-2130853.3}; +VT(0.013132659,0.04767246,0,0.014691551,0.054118398,0,0.0094132111,0.052421332,0){0,0,1507774.2,0,0,1659245.8,0,0,1088603.4,0,0,1139737.5,0,0,1140472.1,0,0,768702.62,0,0,493500.09,0,0,265092.56,0,0,222919.17,0,0,-273193.01,0,0,-693242.8,0,0,-388347.22,0,0,-973395.4,0,0,-1435183.5,0,0,-885762.83}; +VT(0,0.14285714,0,0.0054758376,0.13911323,0,0.0078195435,0.14622426,0){0,0,0,0,0,495708.7,0,0,680366.1,0,0,0,0,0,-382921.42,0,0,-626541.18,0,0,0,0,0,-582869.54,0,0,-729870.69,0,0,0,0,0,250325.59,0,0,568744.13,0,0,0,0,0,639819.51,0,0,774663.29}; +VT(0.09071018,0.22887426,0,0.084319616,0.22565969,0,0.091864029,0.22106993,0){0,0,406264.77,0,0,696453.76,0,0,394005.54,0,0,-1003622.2,0,0,-1688204.7,0,0,-927852.61,0,0,1069446.3,0,0,1707540.6,0,0,863120.02,0,0,-568907.82,0,0,-743250.94,0,0,-241435.16,0,0,-233040.27,0,0,-649719.93,0,0,-536498.87}; +VT(0.033874053,0.071548869,0,0.037071258,0.0642048,0,0.041057987,0.068843254,0){0,0,3157862.8,0,0,3365311.2,0,0,3488848.8,0,0,1466537.3,0,0,1900443.5,0,0,1752771.3,0,0,-1010259.7,0,0,-391679.98,0,0,-855539,0,0,-2946084.6,0,0,-2513388.8,0,0,-3038218.5,0,0,-3304540.6,0,0,-3541461.8,0,0,-3709409.4}; +VT(0.07492972,0.092844339,0,0.069968451,0.098831219,0,0.066799394,0.09162077,0){0,0,2431427.6,0,0,2730411,0,0,2974160.1,0,0,308451.38,0,0,57648.531,0,0,440022.16,0,0,-2083891.4,0,0,-2671597.7,0,0,-2469083.6,0,0,-2656803.1,0,0,-2785714.6,0,0,-3274492.4,0,0,-910298.79,0,0,-173126.8,0,0,-1290097.2}; +VT(0,0.2,0,0.005051806,0.19767546,0,0.007303543,0.20469543,0){0,0,0,0,0,313084.45,0,0,422375.13,0,0,0,0,0,-612892.85,0,0,-880191.16,0,0,0,0,0,273796.53,0,0,531663.92,0,0,0,0,0,350786.74,0,0,303952.91,0,0,0,0,0,-609909.8,0,0,-861341.37}; +VT(0.04563604,0.25694979,0,0.049037582,0.25027532,0,0.054010827,0.25507988,0){0,0,859240.08,0,0,998508.07,0,0,897184.36,0,0,-2406042.8,0,0,-2730849.8,0,0,-2496661.6,0,0,3472131.8,0,0,3739350.2,0,0,3553831.7,0,0,-3844488.4,0,0,-3756698.7,0,0,-3839088.9,0,0,3448330.3,0,0,2778087.3,0,0,3290330.5}; +VT(0.084604507,0.15255901,0,0.083337094,0.16031526,0,0.077069107,0.15686929,0){0,0,1258841.2,0,0,1295652.6,0,0,1743907.9,0,0,-1326319,0,0,-1575018.8,0,0,-1994600,0,0,-1187789.9,0,0,-956036.82,0,0,-1457243.4,0,0,1390056.3,0,0,1781183.7,0,0,2204191.1,0,0,1113216.6,0,0,571788.58,0,0,1140253.2}; +VT(0.082709707,0.12855445,0,0.083559522,0.13424014,0,0.076271482,0.13373081,0){0,0,1568327.1,0,0,1462145.4,0,0,2012844.4,0,0,-869760.99,0,0,-981746.52,0,0,-1330317.6,0,0,-1955764.1,0,0,-1784737.2,0,0,-2463975.8,0,0,-1353.9511,0,0,395362.65,0,0,494859.01,0,0,1955094.7,0,0,1914407.3,0,0,2631758.9}; +VT(0.025468185,0.010276157,0,0.022427218,0.014872357,0,0.01808004,0.0081573173,0){0,0,2780034,0,0,2505875.7,0,0,2085729.2,0,0,2747892,0,0,2445229.8,0,0,2070583.9,0,0,2683968.5,0,0,2325397.7,0,0,2040406.9,0,0,2589008.8,0,0,2149288.4,0,0,1995444.2,0,0,2463902.9,0,0,1920956.8,0,0,1935913.6}; +VT(0.017990672,0.29207379,0,0.0220603,0.28602893,0,0.025130011,0.29009115,0){0,0,86228.122,0,0,181204.07,0,0,142877.47,0,0,-258100.45,0,0,-539738.59,0,0,-427099.39,0,0,428229.3,0,0,886739.53,0,0,706741.94,0,0,-595472.42,0,0,-1214791.9,0,0,-978805.55,0,0,758576.15,0,0,1516611.7,0,0,1240164.3}; +VT(0.076271482,0.13373081,0,0.081009521,0.1385969,0,0.075488644,0.14176328,0){0,0,2012844.4,0,0,1630909.4,0,0,1990888.2,0,0,-1330317.6,0,0,-1242340.3,0,0,-1647841.2,0,0,-2463975.8,0,0,-1926924,0,0,-2274843.7,0,0,494859.01,0,0,783271.16,0,0,1255935.2,0,0,2631758.9,0,0,2113542.9,0,0,2491166.6}; +VT(0.024008584,0.022367291,0,0.021348697,0.029751655,0,0.016759526,0.025876157,0){0,0,2639060.6,0,0,2382657.5,0,0,1932221.9,0,0,2494948.4,0,0,2153252.9,0,0,1791225.7,0,0,2214593.6,0,0,1716520.5,0,0,1519509.7,0,0,1813324.4,0,0,1114508.8,0,0,1136895.1,0,0,1312931.3,0,0,404958.41,0,0,671081.1}; +VT(0.020473685,0.087577432,0,0.025411973,0.082310594,0,0.027903545,0.087518505,0){0,0,2087024.2,0,0,2525130.6,0,0,2674848,0,0,451292.51,0,0,762374.09,0,0,580994.77,0,0,-1538224.3,0,0,-1532614.6,0,0,-1967676.8,0,0,-2322280.1,0,0,-2757779.1,0,0,-2976106,0,0,-1286407.6,0,0,-2058136.4,0,0,-1655065.1}; +VT(0.019499739,0.079597209,0,0.025411973,0.082310594,0,0.020473685,0.087577432,0){0,0,2040354.6,0,0,2525130.6,0,0,2087024.2,0,0,702945.71,0,0,762374.09,0,0,451292.51,0,0,-1095289.5,0,0,-1532614.6,0,0,-1538224.3,0,0,-2175701.2,0,0,-2757779.1,0,0,-2322280.1,0,0,-1830384.7,0,0,-2058136.4,0,0,-1286407.6}; +VT(0.039366597,0.19088868,0,0.044234359,0.18859393,0,0.043569257,0.19619451,0){0,0,1982365.2,0,0,2102462.5,0,0,1966078.6,0,0,-3628592.6,0,0,-3756018.8,0,0,-3794921.6,0,0,1030950.1,0,0,851571.98,0,0,1563901,0,0,2772526.5,0,0,3086402.5,0,0,2340412.7,0,0,-3333638.5,0,0,-3279385.1,0,0,-3741435.4}; +VT(0.042857143,0,0,0.039686874,0.0066116125,0,0.035714286,0,0){0,0,3783299.5,0,0,3676489.9,0,0,3496308.9,0,0,3783327.5,0,0,3658909.3,0,0,3496337.7,0,0,3783379.6,0,0,3623831.1,0,0,3496399.5,0,0,3783486.4,0,0,3571457.2,0,0,3496538.6,0,0,3783576.5,0,0,3501797.4,0,0,3496562.8}; +VT(0.035714286,0.3,0,0.03928574,0.29335694,0,0.042857143,0.3,0){0,0,0,0,0,127378.94,0,0,0,0,0,0,0,0,-381522.06,0,0,0,0,0,0,0,0,633829.06,0,0,0,0,0,0,0,0,-883092.25,0,0,0,0,0,0,0,0,1127859.7,0,0,0}; +VT(0.049165273,0.076760106,0,0.047307891,0.081963043,0,0.041803352,0.076750149,0){0,0,3570137.5,0,0,3516083,0,0,3453761.9,0,0,1384898,0,0,1080946.4,0,0,1340279.2,0,0,-1648055.9,0,0,-2102837.3,0,0,-1593440.1,0,0,-3672308.6,0,0,-3830300,0,0,-3552303.7,0,0,-3449021.3,0,0,-2905310.5,0,0,-3337911.6}; +VT(0.1,0.057142857,0,0.094913401,0.051076335,0,0.1,0.05,0){0,0,0,0,0,595503.05,0,0,0,0,0,0,0,0,429138.45,0,0,0,0,0,0,0,0,142901.48,0,0,0,0,0,0,0,0,-183223.65,0,0,0,0,0,0,0,0,-458373.75,0,0,0}; +VT(0.1,0.25,0,0.095090425,0.2489538,0,0.1,0.24285714,0){0,0,0,0,0,157454.16,0,0,0,0,0,0,0,0,-428416.46,0,0,0,0,0,0,0,0,579817.55,0,0,0,0,0,0,0,0,-569427.53,0,0,0,0,0,0,0,0,400020.01,0,0,0}; +VT(0.071428571,0,0,0.068476894,0.0069177029,0,0.064285714,0,0){0,0,3033974.4,0,0,3242851.4,0,0,3496327.6,0,0,3033978.9,0,0,3225849.8,0,0,3496358.5,0,0,3033982.8,0,0,3191931.3,0,0,3496415,0,0,3034008.5,0,0,3141298.2,0,0,3496523.2,0,0,3033714,0,0,3073847.6,0,0,3496472.9}; +VT(0.064285714,0.3,0,0.068366879,0.29272708,0,0.071428571,0.3,0){0,0,0,0,0,123803.43,0,0,0,0,0,0,0,0,-370697.46,0,0,0,0,0,0,0,0,615462.12,0,0,0,0,0,0,0,0,-856697.17,0,0,0,0,0,0,0,0,1092834.3,0,0,0}; +VT(0.057612168,0.01845715,0,0.057707972,0.025075094,0,0.051167355,0.022914381,0){0,0,3752599.8,0,0,3734947.8,0,0,3850137.8,0,0,3612875.5,0,0,3478918.2,0,0,3629520.4,0,0,3338613.5,0,0,2984396.6,0,0,3200919.1,0,0,2940029.2,0,0,2285289.9,0,0,2588908.3,0,0,2431782.4,0,0,1429238.8,0,0,1828396.4}; +VT(0.021658338,0.054940441,0,0.025221599,0.062165695,0,0.016702178,0.061420197,0){0,0,2341024.9,0,0,2618029.3,0,0,1844408.3,0,0,1587273.2,0,0,1547191.2,0,0,1107331.1,0,0,322446.89,0,0,-156575.4,0,0,-72241.295,0,0,-1046241,0,0,-1796512.5,0,0,-1222910.6,0,0,-2078353.5,0,0,-2702051.5,0,0,-1885264.1}; +VT(0.03663522,0.040674234,0,0.030602087,0.036163623,0,0.035858843,0.031497608,0){0,0,3463485.9,0,0,3125169.1,0,0,3456371.8,0,0,2844620.6,0,0,2682310.4,0,0,3083741.5,0,0,1717431.6,0,0,1859340.6,0,0,2378649.5,0,0,283267.24,0,0,772883.67,0,0,1417116.3,0,0,-1201989.6,0,0,-423255.99,0,0,302618.73}; +VT(0.054240748,0.10280037,0,0.052532368,0.096036702,0,0.061027247,0.098743066,0){0,0,3302360.6,0,0,3389506.1,0,0,3173016.6,0,0,-169115.68,0,0,240670.51,0,0,72008.811,0,0,-3462856.5,0,0,-3131818.5,0,0,-3099474,0,0,-3116478.2,0,0,-3594959.1,0,0,-3241975.4,0,0,505791.56,0,0,-718569.73,0,0,-216202.29}; +VT(0.030046638,0.13690443,0,0.033990129,0.14330646,0,0.026018946,0.14387862,0){0,0,2369378.2,0,0,2486957.5,0,0,2064539,0,0,-1721516.8,0,0,-2138608.5,0,0,-1800072.3,0,0,-2840145.3,0,0,-2786553.8,0,0,-2295230.1,0,0,944948.24,0,0,1748365.6,0,0,1506177.8,0,0,3098367.4,0,0,3031412.6,0,0,2488196.2}; +VT(0.054957014,0.24657048,0,0.060567191,0.25172758,0,0.054010827,0.25507988,0){0,0,1058545,0,0,917440.34,0,0,897184.36,0,0,-2852831,0,0,-2522838.3,0,0,-2496661.6,0,0,3777171.8,0,0,3497206.6,0,0,3553831.7,0,0,-3549694.2,0,0,-3596815.5,0,0,-3839088.9,0,0,2239441.1,0,0,2796536,0,0,3290330.5}; +VT(0.014305262,0.26641769,0,0.023009638,0.26878949,0,0.018422519,0.27450763,0){0,0,294901.31,0,0,417665.14,0,0,282501.19,0,0,-848621.76,0,0,-1208783.5,0,0,-827496.14,0,0,1298521.9,0,0,1871958.7,0,0,1313896,0,0,-1589572.3,0,0,-2337004.8,0,0,-1707268.8,0,0,1686004.5,0,0,2554445.3,0,0,1979556.1}; +VT(0.1,0.2,0,0.093164956,0.1980516,0,0.1,0.19285714,0){0,0,0,0,0,420734.09,0,0,0,0,0,0,0,0,-826537.04,0,0,0,0,0,0,0,0,376428.12,0,0,0,0,0,0,0,0,463603.83,0,0,0,0,0,0,0,0,-823893.15,0,0,0}; +VT(0.049204373,0.010884263,0,0.051745598,0.0053231545,0,0.056199026,0.010061392,0){0,0,3873084,0,0,3873250.9,0,0,3801979,0,0,3822842.7,0,0,3861228.9,0,0,3759859.9,0,0,3723003.5,0,0,3837214.6,0,0,3676084,0,0,3574883.8,0,0,3801308.2,0,0,3551608.2,0,0,3380124.5,0,0,3753417.7,0,0,3387596.5}; +VT(0.050010485,0.1548865,0,0.045364072,0.14896511,0,0.05288218,0.14757716,0){0,0,2672912.2,0,0,2729630.7,0,0,2767228.4,0,0,-2946373.7,0,0,-2670475.8,0,0,-2626819.9,0,0,-2371553.9,0,0,-2787568.3,0,0,-2900596.1,0,0,3189127.5,0,0,2610132.2,0,0,2479722.6,0,0,2045305.7,0,0,2844182.1,0,0,3026446}; +VT(0.055764419,0.28986395,0,0.051526128,0.29458598,0,0.048791783,0.28884593,0){0,0,202473.1,0,0,109871.78,0,0,226341.07,0,0,-605163.67,0,0,-329256.34,0,0,-675936.71,0,0,1001119.7,0,0,547568.39,0,0,1116322.7,0,0,-1385941.2,0,0,-764098.34,0,0,-1541505,0,0,1755276.4,0,0,977975.34,0,0,1945474.1}; +VT(0.083190767,0.25723975,0,0.074279052,0.25633166,0,0.07921504,0.25033934,0){0,0,434158.6,0,0,635900.39,0,0,606155.6,0,0,-1216864.4,0,0,-1777029.4,0,0,-1658203,0,0,1759626.8,0,0,2553015.8,0,0,2271843.6,0,0,-1955417.3,0,0,-2804423.5,0,0,-2284831,0,0,1765235.2,0,0,2479429.3,0,0,1693484.6}; +VT(0.077364239,0.048764008,0,0.073234584,0.04253025,0,0.082493405,0.042375289,0){0,0,2450679,0,0,2820532.7,0,0,1978611.8,0,0,1825420.5,0,0,2270240.9,0,0,1595319.9,0,0,734405.59,0,0,1277003.9,0,0,902966.17,0,0,-544039.45,0,0,34586.382,0,0,35643.43,0,0,-1683943.8,0,0,-1214797.7,0,0,-838916.97}; +VT(0.091953893,0.078440357,0,0.086276325,0.073599227,0,0.09123018,0.070922096,0){0,0,889726.23,0,0,1502743.3,0,0,983713.53,0,0,322434.75,0,0,653401.45,0,0,465586.72,0,0,-450550.32,0,0,-565297.67,0,0,-297764.17,0,0,-936443.15,0,0,-1464602.7,0,0,-904277.98,0,0,-825354.72,0,0,-1536324.4,0,0,-1034644.8}; +VT(0.041002292,0.08644635,0,0.033761495,0.088496681,0,0.032911969,0.081185013,0){0,0,3351345,0,0,3029395.9,0,0,3037931.3,0,0,787437.3,0,0,608605.12,0,0,971274.35,0,0,-2379027.1,0,0,-2298547.5,0,0,-1756226.8,0,0,-3725698.5,0,0,-3368980,0,0,-3289165.4,0,0,-2222336.9,0,0,-1747439.7,0,0,-2584916.3}; +VT(0.038843793,0.21103197,0,0.036840853,0.20596239,0,0.044637502,0.20577347,0){0,0,1637090.1,0,0,1679916.9,0,0,1811821.2,0,0,-3590120.4,0,0,-3538121.9,0,0,-3810004,0,0,2645890.8,0,0,2233718.4,0,0,2390091.8,0,0,433646.44,0,0,1067350,0,0,1174216.7,0,0,-3163532.2,0,0,-3414669.4,0,0,-3685779.4}; +VT(0.013794295,0.15422926,0,0.014502412,0.16316663,0,0.0068768393,0.16098373,0){0,0,1126466.2,0,0,1121335,0,0,553409.29,0,0,-1226232.2,0,0,-1429592.9,0,0,-680450.71,0,0,-1017954.8,0,0,-728363.13,0,0,-397156.36,0,0,1316565.7,0,0,1629901.1,0,0,771605.48,0,0,901352.54,0,0,280110.31,0,0,219690.78}; +VT(0.044637502,0.20577347,0,0.036840853,0.20596239,0,0.038597539,0.20095921,0){0,0,1811821.2,0,0,1679916.9,0,0,1801301.7,0,0,-3810004,0,0,-3538121.9,0,0,-3633864.6,0,0,2390091.8,0,0,2233718.4,0,0,1895634,0,0,1174216.7,0,0,1067350,0,0,1705394,0,0,-3685779.4,0,0,-3414669.4,0,0,-3630918.1}; +VT(0.056199026,0.010061392,0,0.051745598,0.0053231545,0,0.057142857,0,0){0,0,3801979,0,0,3873250.9,0,0,3783317.5,0,0,3759859.9,0,0,3861228.9,0,0,3783357,0,0,3676084,0,0,3837214.6,0,0,3783457.6,0,0,3551608.2,0,0,3801308.2,0,0,3783701.2,0,0,3387596.5,0,0,3753417.7,0,0,3783873.9}; +VT(0.057142857,0,0,0.06203594,0.0060944193,0,0.056199026,0.010061392,0){0,0,3783317.5,0,0,3604620.2,0,0,3801979,0,0,3783357,0,0,3589956.2,0,0,3759859.9,0,0,3783457.6,0,0,3560685.5,0,0,3676084,0,0,3783701.2,0,0,3516960.1,0,0,3551608.2,0,0,3783873.9,0,0,3458793.9,0,0,3387596.5}; +VT(0.049739958,0.088394034,0,0.047307891,0.081963043,0,0.054828578,0.081464579,0){0,0,3472240.4,0,0,3516083,0,0,3492382.6,0,0,703521.31,0,0,1080946.4,0,0,1101278.5,0,0,-2626240.1,0,0,-2102837.3,0,0,-2043909.2,0,0,-3862017.3,0,0,-3830300,0,0,-3789901.6,0,0,-2018648.2,0,0,-2905310.5,0,0,-2941538.5}; +VT(0.054828578,0.081464579,0,0.047307891,0.081963043,0,0.049165273,0.076760106,0){0,0,3492382.6,0,0,3516083,0,0,3570137.5,0,0,1101278.5,0,0,1080946.4,0,0,1384898,0,0,-2043909.2,0,0,-2102837.3,0,0,-1648055.9,0,0,-3789901.6,0,0,-3830300,0,0,-3672308.6,0,0,-2941538.5,0,0,-2905310.5,0,0,-3449021.3}; +VT(0.057142857,0.3,0,0.051526128,0.29458598,0,0.055764419,0.28986395,0){0,0,0,0,0,109871.78,0,0,202473.1,0,0,0,0,0,-329256.34,0,0,-605163.67,0,0,0,0,0,547568.39,0,0,1001119.7,0,0,0,0,0,-764098.34,0,0,-1385941.2,0,0,0,0,0,977975.34,0,0,1755276.4}; +VT(0.055764419,0.28986395,0,0.061805884,0.29356168,0,0.057142857,0.3,0){0,0,202473.1,0,0,121923.05,0,0,0,0,0,-605163.67,0,0,-365207.83,0,0,0,0,0,1001119.7,0,0,606815.62,0,0,0,0,0,-1385941.2,0,0,-845641.09,0,0,0,0,0,1755276.4,0,0,1080583.1,0,0,0}; +VT(0.089949388,0.2453858,0,0.095090425,0.2489538,0,0.090077759,0.25268961,0){0,0,339950.36,0,0,157454.16,0,0,291813.61,0,0,-911669.73,0,0,-428416.46,0,0,-805257.31,0,0,1193275.4,0,0,579817.55,0,0,1125037.4,0,0,-1095139.7,0,0,-569427.53,0,0,-1174248.1,0,0,648419.14,0,0,400020.01,0,0,940920.06}; +VT(0.08974924,0.047235181,0,0.094913401,0.051076335,0,0.08944657,0.05485846,0){0,0,1190814.4,0,0,595503.05,0,0,1211526.2,0,0,905328.07,0,0,429138.45,0,0,822600.19,0,0,402804.56,0,0,142901.48,0,0,169573.91,0,0,-196265.4,0,0,-183223.65,0,0,-537958.1,0,0,-748421.11,0,0,-458373.75,0,0,-1073022.7}; +VT(0.012304267,0.13852123,0,0.014210915,0.13228117,0,0.021167753,0.13548502,0){0,0,1094693.2,0,0,1289449.4,0,0,1816935.7,0,0,-832176.34,0,0,-813665.75,0,0,-1266652.3,0,0,-1294374.3,0,0,-1589638.3,0,0,-2200669.4,0,0,521821.54,0,0,227067.92,0,0,600161.11,0,0,1419655.5,0,0,1673024.3,0,0,2382629.9}; +VT(0.021167753,0.13548502,0,0.014210915,0.13228117,0,0.01788586,0.12850833,0){0,0,1816935.7,0,0,1289449.4,0,0,1616906.9,0,0,-1266652.3,0,0,-813665.75,0,0,-895214.81,0,0,-2200669.4,0,0,-1589638.3,0,0,-2016472.2,0,0,600161.11,0,0,227067.92,0,0,-4802.2192,0,0,2382629.9,0,0,1673024.3,0,0,2014144.7}; +VT(0.045375723,0.12284566,0,0.045894811,0.13135905,0,0.038464606,0.12667013,0){0,0,3072436,0,0,2973475.7,0,0,2859316.3,0,0,-1348503.3,0,0,-1819976.4,0,0,-1476046.2,0,0,-3829159.4,0,0,-3679581.9,0,0,-3573486.5,0,0,-800055.99,0,0,392676.16,0,0,-252868.56,0,0,3380414.3,0,0,3832095.1,0,0,3451249.3}; +VT(0.038464606,0.12667013,0,0.045894811,0.13135905,0,0.038217426,0.13599196,0){0,0,2859316.3,0,0,2973475.7,0,0,2738753.8,0,0,-1476046.2,0,0,-1819976.4,0,0,-1938161,0,0,-3573486.5,0,0,-3679581.9,0,0,-3305386.1,0,0,-252868.56,0,0,392676.16,0,0,972060.89,0,0,3451249.3,0,0,3832095.1,0,0,3589652.3}; +VT(0.0087429334,0.24792416,0,0.013821768,0.24617185,0,0.01180171,0.25230222,0){0,0,283453.34,0,0,454053.45,0,0,347512.04,0,0,-768118.62,0,0,-1221678.8,0,0,-957611.77,0,0,1029935.2,0,0,1611329.8,0,0,1333704.3,0,0,-992967.39,0,0,-1502439.1,0,0,-1383899.6,0,0,667809.3,0,0,928515.88,0,0,1095718.6}; +VT(0.025139549,0.12057635,0,0.023379755,0.12686903,0,0.017763535,0.12074209,0){0,0,2224740.3,0,0,2047772.9,0,0,1657769.5,0,0,-875333.98,0,0,-1065433.1,0,0,-657738.05,0,0,-2755721.9,0,0,-2558991,0,0,-2054600.3,0,0,-796179.51,0,0,-162203.53,0,0,-581651.26,0,0,2272644.8,0,0,2481221.5,0,0,1703675.4}; +VT(0.1,0.1,0,0.09416017,0.099511923,0,0.1,0.092857143,0){0,0,0,0,0,613994.66,0,0,0,0,0,0,0,0,5422.3845,0,0,0,0,0,0,0,0,-608645.22,0,0,0,0,0,0,0,0,-619557.01,0,0,0,0,0,0,0,0,-16415.987,0,0,0}; +VT(0.061015306,0.048529238,0,0.06961584,0.048915995,0,0.066012722,0.055502179,0){0,0,3533367.8,0,0,3063466,0,0,3257272.9,0,0,2640342.3,0,0,2277085.6,0,0,2187557.2,0,0,1080012.2,0,0,906160.93,0,0,399401.17,0,0,-753291.7,0,0,-697426.19,0,0,-1519988.7,0,0,-2396723.8,0,0,-2122325.6,0,0,-2940625.1}; +VT(0.066401409,0.0434645,0,0.06961584,0.048915995,0,0.061015306,0.048529238,0){0,0,3289675.8,0,0,3063466,0,0,3533367.8,0,0,2619840.6,0,0,2277085.6,0,0,2640342.3,0,0,1416557.6,0,0,906160.93,0,0,1080012.2,0,0,-75156.319,0,0,-697426.19,0,0,-753291.7,0,0,-1551772,0,0,-2122325.6,0,0,-2396723.8}; +VT(0.051703203,0.27754162,0,0.055001581,0.27169863,0,0.059078636,0.27701937,0){0,0,454636.43,0,0,565900.8,0,0,447007.97,0,0,-1338881.7,0,0,-1648356.5,0,0,-1315269.1,0,0,2149437.1,0,0,2587095.5,0,0,2107766.2,0,0,-2841702,0,0,-3300283.2,0,0,-2778864.5,0,0,3377384.9,0,0,3725567.5,0,0,3289755.3}; +VT(0.036308441,0.24745658,0,0.033025927,0.25326882,0,0.029124573,0.24658198,0){0,0,958174.94,0,0,809560.38,0,0,849052.23,0,0,-2591684.5,0,0,-2238649.8,0,0,-2288340.2,0,0,3460190.4,0,0,3142273.3,0,0,3030093.5,0,0,-3307339.6,0,0,-3308331.9,0,0,-2848204.4,0,0,2177878.8,0,0,2697705.3,0,0,1797881.3}; +VT(0.020636298,0.17424253,0,0.025851591,0.17077962,0,0.027644767,0.17736901,0){0,0,1433869.3,0,0,1763476.8,0,0,1774040.3,0,0,-2154082.5,0,0,-2524912.6,0,0,-2777088.7,0,0,-351921.61,0,0,-673288.62,0,0,-203929.31,0,0,2330929.4,0,0,2815714.9,0,0,2892544.7,0,0,-819073.82,0,0,-542697.73,0,0,-1431643.3}; +VT(0.1,0.092857143,0,0.09416017,0.099511923,0,0.093922759,0.092262381,0){0,0,0,0,0,613994.66,0,0,652083.63,0,0,0,0,0,5422.3845,0,0,89312.894,0,0,0,0,0,-608645.22,0,0,-550573,0,0,0,0,0,-619557.01,0,0,-715327.2,0,0,0,0,0,-16415.987,0,0,-262838.8}; +VT(0.084604507,0.15255901,0,0.088623123,0.15812222,0,0.083337094,0.16031526,0){0,0,1258841.2,0,0,918302.92,0,0,1295652.6,0,0,-1326319,0,0,-1074338,0,0,-1575018.8,0,0,-1187789.9,0,0,-735787.48,0,0,-956036.82,0,0,1390056.3,0,0,1199414.9,0,0,1781183.7,0,0,1113216.6,0,0,531983.03,0,0,571788.58}; +VT(0.017312959,0.14496605,0,0.022775714,0.15147437,0,0.013794295,0.15422926,0){0,0,1456929,0,0,1786181.8,0,0,1126466.2,0,0,-1303417.8,0,0,-1841345.2,0,0,-1226232.2,0,0,-1594293.7,0,0,-1729359.8,0,0,-1017954.8,0,0,1135517.7,0,0,1894858,0,0,1316565.7,0,0,1713822.2,0,0,1670732.8,0,0,901352.54}; +VT(0.057391395,0.19462543,0,0.064671223,0.19505087,0,0.060432552,0.20227914,0){0,0,1979510.6,0,0,1815232.4,0,0,1798951.1,0,0,-3763012.6,0,0,-3465163,0,0,-3671781.8,0,0,1410875.8,0,0,1334352.3,0,0,2023610.8,0,0,2491970.2,0,0,2252470.6,0,0,1565241.8,0,0,-3656419.8,0,0,-3382100.5,0,0,-3653837}; +VT(0,0.057142857,0,0.0079950318,0.059686314,0,0,0.064285714,0){0,0,0,0,0,917766.47,0,0,0,0,0,0,0,0,570756.35,0,0,0,0,0,0,0,0,7912.4367,0,0,0,0,0,0,0,0,-557994.72,0,0,0,0,0,0,0,0,-913265.38,0,0,0}; +VT(0.1,0.20714286,0,0.093706234,0.20596864,0,0.1,0.2,0){0,0,0,0,0,360320.46,0,0,0,0,0,0,0,0,-758974.46,0,0,0,0,0,0,0,0,479351.87,0,0,0,0,0,0,0,0,228803.73,0,0,0,0,0,0,0,0,-732939.79,0,0,0}; +VT(0.1,0.021428571,0,0.093571257,0.018380777,0,0.1,0.014285714,0){0,0,0,0,0,774815.13,0,0,0,0,0,0,0,0,746204.54,0,0,0,0,0,0,0,0,690036.86,0,0,0,0,0,0,0,0,608388.09,0,0,0,0,0,0,0,0,504051.02,0,0,0}; +VT(0.1,0.28571429,0,0.093593186,0.28160993,0,0.1,0.27857143,0){0,0,0,0,0,74588.283,0,0,0,0,0,0,0,0,-221009.65,0,0,0,0,0,0,0,0,359269.18,0,0,0,0,0,0,0,0,-484261.41,0,0,0,0,0,0,0,0,591230.88,0,0,0}; +VT(0.042155309,0.15589067,0,0.045364072,0.14896511,0,0.050010485,0.1548865,0){0,0,2577776.2,0,0,2729630.7,0,0,2672912.2,0,0,-2895603.6,0,0,-2670475.8,0,0,-2946373.7,0,0,-2220826.4,0,0,-2787568.3,0,0,-2371553.9,0,0,3169529.7,0,0,2610132.2,0,0,3189127.5,0,0,1830012,0,0,2844182.1,0,0,2045305.7}; +VT(0.059078636,0.27701937,0,0.055001581,0.27169863,0,0.061631884,0.26868773,0){0,0,447007.97,0,0,565900.8,0,0,591535.29,0,0,-1315269.1,0,0,-1648356.5,0,0,-1711593.4,0,0,2107766.2,0,0,2587095.5,0,0,2649353.2,0,0,-2778864.5,0,0,-3300283.2,0,0,-3304968.8,0,0,3289755.3,0,0,3725567.5,0,0,3608394.3}; +VT(0.024044461,0.20382537,0,0.015977634,0.20443356,0,0.018704911,0.19716585,0){0,0,1283805.9,0,0,895779.15,0,0,1103230.1,0,0,-2655634.7,0,0,-1862602.8,0,0,-2149261.2,0,0,1553893.8,0,0,1114548.4,0,0,934589.13,0,0,995311.88,0,0,659707.69,0,0,1263201.6,0,0,-2617892.2,0,0,-1827076.9,0,0,-2132672.2}; +VT(0.045416206,0.061541227,0,0.037071258,0.0642048,0,0.038435934,0.058364632,0){0,0,3642820.9,0,0,3365311.2,0,0,3459248.5,0,0,2181474.8,0,0,1900443.5,0,0,2206750.4,0,0,-155055.51,0,0,-391679.98,0,0,155241.86,0,0,-2429600.5,0,0,-2513388.8,0,0,-1952496,0,0,-3730025.8,0,0,-3541461.8,0,0,-3353689.4}; +VT(0.092195724,0.16853594,0,0.083969261,0.16737329,0,0.088381846,0.16289419,0){0,0,598378.34,0,0,1198489.7,0,0,911153.68,0,0,-829189.07,0,0,-1632158.2,0,0,-1156470.7,0,0,-278570.16,0,0,-607916.58,0,0,-599768.12,0,0,936666.51,0,0,1852187.2,0,0,1317920.1,0,0,-82641.6,0,0,-62490.334,0,0,244888.24}; +VT(0.067098511,0.16826118,0,0.072573599,0.16764459,0,0.071059851,0.17209017,0){0,0,2121688.2,0,0,1881427.5,0,0,1900690.4,0,0,-2928224.5,0,0,-2572760.4,0,0,-2772233.4,0,0,-1008555.7,0,0,-936075.04,0,0,-629520.98,0,0,3311710.7,0,0,2916777.1,0,0,3060958.1,0,0,-250662.47,0,0,-135849.37,0,0,-774142.34}; +VT(0.05718895,0.22161738,0,0.053624899,0.22742186,0,0.049797208,0.2214244,0){0,0,1508977,0,0,1430137,0,0,1551864.2,0,0,-3566099.1,0,0,-3503302.1,0,0,-3662861.4,0,0,3352547.9,0,0,3648370.9,0,0,3430735.4,0,0,-1004251.2,0,0,-1785483,0,0,-1003918.8,0,0,-1983866.6,0,0,-1060301.4,0,0,-2065424.5}; +VT(0.085714286,0,0,0.081119523,0.0085521597,0,0.078571429,0,0){0,0,1683752,0,0,2167108.8,0,0,2419478.6,0,0,1683802.7,0,0,2149779.2,0,0,2419535.2,0,0,1683911.1,0,0,2115263.6,0,0,2419645.1,0,0,1684108.7,0,0,2063869.7,0,0,2419827.2,0,0,1684003.7,0,0,1995657.9,0,0,2420024.4}; +VT(0.078571429,0.3,0,0.081165886,0.29137431,0,0.085714286,0.3,0){0,0,0,0,0,97729.953,0,0,0,0,0,0,0,0,-292395.17,0,0,0,0,0,0,0,0,484687.71,0,0,0,0,0,0,0,0,-673055.06,0,0,0,0,0,0,0,0,855744.16,0,0,0}; +VT(0.082709707,0.12855445,0,0.087905667,0.12517971,0,0.0910478,0.13167545,0){0,0,1568327.1,0,0,1140990.9,0,0,831136.87,0,0,-869760.99,0,0,-554517.87,0,0,-514132.23,0,0,-1955764.1,0,0,-1425990.8,0,0,-1027305.8,0,0,-1353.9511,0,0,-178453.87,0,0,122313.64,0,0,1955094.7,0,0,1334087.8,0,0,1073956.7}; +VT(0,0.20714286,0,0.0051799073,0.21317882,0,0,0.21428571,0){0,0,0,0,0,276031.48,0,0,0,0,0,0,0,0,-615227.88,0,0,0,0,0,0,0,0,479976.29,0,0,0,0,0,0,0,0,25450.705,0,0,0,0,0,0,0,0,-511551.59,0,0,0}; +VT(0.018704911,0.19716585,0,0.012931293,0.19295437,0,0.017373248,0.19021363,0){0,0,1103230.1,0,0,815194.79,0,0,1095255.9,0,0,-2149261.2,0,0,-1524077.7,0,0,-1990705.9,0,0,934589.13,0,0,510133.92,0,0,532263.7,0,0,1263201.6,0,0,1080471.8,0,0,1555631.8,0,0,-2132672.2,0,0,-1450076.4,0,0,-1804413.6}; +VT(0.011268327,0.1984065,0,0.012931293,0.19295437,0,0.018704911,0.19716585,0){0,0,682302.12,0,0,815194.79,0,0,1103230.1,0,0,-1344805.9,0,0,-1524077.7,0,0,-2149261.2,0,0,623458.07,0,0,510133.92,0,0,934589.13,0,0,739532.85,0,0,1080471.8,0,0,1263201.6,0,0,-1341727.7,0,0,-1450076.4,0,0,-2132672.2}; +VT(0.1,0.26428571,0,0.092295863,0.26000779,0,0.1,0.25714286,0){0,0,0,0,0,193329.27,0,0,0,0,0,0,0,0,-546576.12,0,0,0,0,0,0,0,0,805368.84,0,0,0,0,0,0,0,0,-924990.4,0,0,0,0,0,0,0,0,884724.5,0,0,0}; +VT(0.1,0.042857143,0,0.092141527,0.03991184,0,0.1,0.035714286,0){0,0,0,0,0,927649.93,0,0,0,0,0,0,0,0,767955.56,0,0,0,0,0,0,0,0,476054.53,0,0,0,0,0,0,0,0,102192.68,0,0,0,0,0,0,0,0,-289378.9,0,0,0}; +VT(0.1,0.17857143,0,0.093873231,0.17693503,0,0.1,0.17142857,0){0,0,0,0,0,445896.9,0,0,0,0,0,0,0,0,-694096.79,0,0,0,0,0,0,0,0,-59504.029,0,0,0,0,0,0,0,0,727141.13,0,0,0,0,0,0,0,0,-345394.37,0,0,0}; +VT(0.069002793,0.22246209,0,0.065627137,0.22734606,0,0.062992669,0.22303634,0){0,0,1267491.2,0,0,1270705.1,0,0,1396775.9,0,0,-3011719.2,0,0,-3111357.1,0,0,-3331109.7,0,0,2877058.6,0,0,3236198.8,0,0,3216330,0,0,-947533.34,0,0,-1576358.2,0,0,-1122974.8,0,0,-1573376.1,0,0,-953054.66,0,0,-1661551.4}; +VT(0.03690243,0.09394169,0,0.033761495,0.088496681,0,0.041002292,0.08644635,0){0,0,3135041.5,0,0,3029395.9,0,0,3351345,0,0,337961.95,0,0,608605.12,0,0,787437.3,0,0,-2760700,0,0,-2298547.5,0,0,-2379027.1,0,0,-3396384.7,0,0,-3368980,0,0,-3725698.5,0,0,-1002139.6,0,0,-1747439.7,0,0,-2222336.9}; +VT(0.021957304,0.26060316,0,0.023009638,0.26878949,0,0.014305262,0.26641769,0){0,0,505833.44,0,0,417665.14,0,0,294901.31,0,0,-1432636.8,0,0,-1208783.5,0,0,-848621.76,0,0,2119105.6,0,0,1871958.7,0,0,1298521.9,0,0,-2450095.8,0,0,-2337004.8,0,0,-1589572.3,0,0,2369995.8,0,0,2554445.3,0,0,1686004.5}; +VT(0.071428571,0,0,0.074656208,0.0053403125,0,0.068476894,0.0069177029,0){0,0,3033974.4,0,0,2772385.5,0,0,3242851.4,0,0,3033978.9,0,0,2763721.5,0,0,3225849.8,0,0,3033982.8,0,0,2746414.1,0,0,3191931.3,0,0,3034008.5,0,0,2720533.7,0,0,3141298.2,0,0,3033714,0,0,2685936.9,0,0,3073847.6}; +VT(0.042433189,0.024814669,0,0.035858843,0.031497608,0,0.033039341,0.023173825,0){0,0,3739739.8,0,0,3456371.8,0,0,3318087.9,0,0,3488658.7,0,0,3083741.5,0,0,3123656.1,0,0,3003356.3,0,0,2378649.5,0,0,2746181,0,0,2316430.4,0,0,1417116.3,0,0,2207795.9,0,0,1473602,0,0,302618.73,0,0,1539940.3}; +VT(0.033039341,0.023173825,0,0.035858843,0.031497608,0,0.028359285,0.029784535,0){0,0,3318087.9,0,0,3456371.8,0,0,2981166.2,0,0,3123656.1,0,0,3083741.5,0,0,2693525.9,0,0,2746181,0,0,2378649.5,0,0,2145980.7,0,0,2207795.9,0,0,1417116.3,0,0,1391347.7,0,0,1539940.3,0,0,302618.73,0,0,502245.34}; +VT(0.069002793,0.22246209,0,0.062992669,0.22303634,0,0.063265205,0.21633109,0){0,0,1267491.2,0,0,1396775.9,0,0,1505335.5,0,0,-3011719.2,0,0,-3331109.7,0,0,-3432481.9,0,0,2877058.6,0,0,3216330,0,0,2888962.8,0,0,-947533.34,0,0,-1122974.8,0,0,-265885.87,0,0,-1573376.1,0,0,-1661551.4,0,0,-2549234.8}; +VT(0.068366879,0.29272708,0,0.074657371,0.29452352,0,0.071428571,0.3,0){0,0,123803.43,0,0,79525.554,0,0,0,0,0,-370697.46,0,0,-238312.39,0,0,0,0,0,615462.12,0,0,396309.36,0,0,0,0,0,-856697.17,0,0,-552992.95,0,0,0,0,0,1092834.3,0,0,707611.71,0,0,0}; +VT(0.029124573,0.24658198,0,0.033025927,0.25326882,0,0.025641665,0.25311603,0){0,0,849052.23,0,0,809560.38,0,0,680173.91,0,0,-2288340.2,0,0,-2238649.8,0,0,-1879847.5,0,0,3030093.5,0,0,3142273.3,0,0,2635470.4,0,0,-2848204.4,0,0,-3308331.9,0,0,-2768550.2,0,0,1797881.3,0,0,2697705.3,0,0,2247361.6}; +VT(0.091593501,0.1915477,0,0.095453592,0.18738967,0,0.1,0.19285714,0){0,0,544831.72,0,0,307137.29,0,0,0,0,0,-1004107.1,0,0,-541566.85,0,0,0,0,0,301623.68,0,0,106216.39,0,0,0,0,0,749822.54,0,0,460538.95,0,0,0,0,0,-933881.71,0,0,-458087.35,0,0,0}; +VT(0.091593501,0.1915477,0,0.087008075,0.19596841,0,0.084368038,0.19048099,0){0,0,544831.72,0,0,798107.94,0,0,992852.93,0,0,-1004107.1,0,0,-1537171.7,0,0,-1809621.2,0,0,301623.68,0,0,625323.3,0,0,495817.1,0,0,749822.54,0,0,958187.81,0,0,1401810.9,0,0,-933881.71,0,0,-1512909.8,0,0,-1649308.4}; +VT(0.021251228,0.18136297,0,0.027644767,0.17736901,0,0.027249449,0.18607819,0){0,0,1398279.8,0,0,1774040.3,0,0,1646413.8,0,0,-2300353.4,0,0,-2777088.7,0,0,-2861109.6,0,0,85724.805,0,0,-203929.31,0,0,464444.42,0,0,2245163.6,0,0,2892544.7,0,0,2518610.9,0,0,-1534338.6,0,0,-1431643.3,0,0,-2323177.4}; +VT(0.027249449,0.18607819,0,0.027644767,0.17736901,0,0.03345202,0.18222482,0){0,0,1646413.8,0,0,1774040.3,0,0,1947746.5,0,0,-2861109.6,0,0,-2777088.7,0,0,-3237509.5,0,0,464444.42,0,0,-203929.31,0,0,196057.01,0,0,2518610.9,0,0,2892544.7,0,0,3107788.7,0,0,-2323177.4,0,0,-1431643.3,0,0,-2254322.8}; +VT(0.030466665,0.11568191,0,0.023213665,0.1150537,0,0.025770754,0.10718168,0){0,0,2608170,0,0,2130593.3,0,0,2378738.7,0,0,-773675.45,0,0,-605772.32,0,0,-316264.13,0,0,-3152461.4,0,0,-2564157.8,0,0,-2653040.8,0,0,-1443702.3,0,0,-1229375.9,0,0,-1984140.6,0,0,2136967.4,0,0,1684092.7,0,0,932667.69}; +VT(0.028678488,0.042143634,0,0.025565101,0.048609543,0,0.022876349,0.043626948,0){0,0,2968313.4,0,0,2702312,0,0,2488553.5,0,0,2399521.8,0,0,2017092.5,0,0,1978130.3,0,0,1370917.4,0,0,820389.33,0,0,1061959.9,0,0,79587.615,0,0,-584372.75,0,0,-72059.632,0,0,-1227272.3,0,0,-1841258.2,0,0,-1191549.5}; +VT(0.032229878,0.047894836,0,0.025565101,0.048609543,0,0.028678488,0.042143634,0){0,0,3188476.9,0,0,2702312,0,0,2968313.4,0,0,2403076.1,0,0,2017092.5,0,0,2399521.8,0,0,1025710.6,0,0,820389.33,0,0,1370917.4,0,0,-604377.64,0,0,-584372.75,0,0,79587.615,0,0,-2086050.7,0,0,-1841258.2,0,0,-1227272.3}; +VT(0.091864029,0.22106993,0,0.084319616,0.22565969,0,0.082942949,0.21818591,0){0,0,394005.54,0,0,696453.76,0,0,823054.75,0,0,-927852.61,0,0,-1688204.7,0,0,-1901094.8,0,0,863120.02,0,0,1707540.6,0,0,1667014.3,0,0,-241435.16,0,0,-743250.94,0,0,-282341.7,0,0,-536498.87,0,0,-649719.93,0,0,-1297502.9}; +VT(0.023478597,0.036718106,0,0.017433092,0.042090914,0,0.014137494,0.034012185,0){0,0,2561783.8,0,0,1971771.3,0,0,1641076.4,0,0,2187675.4,0,0,1594855,0,0,1435142,0,0,1494080.3,0,0,913057.13,0,0,1049094.4,0,0,582277.59,0,0,56690.05,0,0,531342.12,0,0,-414804.14,0,0,-810753.02,0,0,-53364.585}; +VT(0.013794295,0.15422926,0,0.022775714,0.15147437,0,0.021502186,0.15931359,0){0,0,1126466.2,0,0,1786181.8,0,0,1630158.4,0,0,-1226232.2,0,0,-1841345.2,0,0,-1947614.2,0,0,-1017954.8,0,0,-1729359.8,0,0,-1250943.8,0,0,1316565.7,0,0,1894858,0,0,2191316.6,0,0,901352.54,0,0,1670732.8,0,0,824223.66}; +VT(0.020473685,0.087577432,0,0.019165757,0.095107709,0,0.013428016,0.091778472,0){0,0,2087024.2,0,0,1930971.9,0,0,1408980.1,0,0,451292.51,0,0,168744.63,0,0,204626.15,0,0,-1538224.3,0,0,-1747493.7,0,0,-1174648.8,0,0,-2322280.1,0,0,-2069009.1,0,0,-1549888.7,0,0,-1286407.6,0,0,-502664.26,0,0,-600683.83}; +VT(0.06137482,0.19024807,0,0.064671223,0.19505087,0,0.057391395,0.19462543,0){0,0,1976038.9,0,0,1815232.4,0,0,1979510.6,0,0,-3592882,0,0,-3465163,0,0,-3763012.6,0,0,963745.22,0,0,1334352.3,0,0,1410875.8,0,0,2804392.5,0,0,2252470.6,0,0,2491970.2,0,0,-3258719.1,0,0,-3382100.5,0,0,-3656419.8}; +VT(0.038217426,0.13599196,0,0.033990129,0.14330646,0,0.030046638,0.13690443,0){0,0,2738753.8,0,0,2486957.5,0,0,2369378.2,0,0,-1938161,0,0,-2138608.5,0,0,-1721516.8,0,0,-3305386.1,0,0,-2786553.8,0,0,-2840145.3,0,0,972060.89,0,0,1748365.6,0,0,944948.24,0,0,3589652.3,0,0,3031412.6,0,0,3098367.4}; +VT(0,0.12142857,0,0.0062042788,0.11791514,0,0.0061411468,0.1246533,0){0,0,0,0,0,612847.32,0,0,591118.91,0,0,0,0,0,-208741.13,0,0,-280990.71,0,0,0,0,0,-750565.55,0,0,-738586.84,0,0,0,0,0,-286207.66,0,0,-106527.54,0,0,0,0,0,561848.67,0,0,682629.18}; +VT(0.0078195435,0.14622426,0,0.0054758376,0.13911323,0,0.012304267,0.13852123,0){0,0,680366.1,0,0,495708.7,0,0,1094693.2,0,0,-626541.18,0,0,-382921.42,0,0,-832176.34,0,0,-729870.69,0,0,-582869.54,0,0,-1294374.3,0,0,568744.13,0,0,250325.59,0,0,521821.54,0,0,774663.29,0,0,639819.51,0,0,1419655.5}; +VT(0.082390534,0.079333541,0,0.086276325,0.073599227,0,0.091953893,0.078440357,0){0,0,1865676.5,0,0,1502743.3,0,0,889726.23,0,0,650380.91,0,0,653401.45,0,0,322434.75,0,0,-988603.29,0,0,-565297.67,0,0,-450550.32,0,0,-1983689.6,0,0,-1464602.7,0,0,-936443.15,0,0,-1686881.4,0,0,-1536324.4,0,0,-825354.72}; +VT(0.038084092,0.1145524,0,0.040442009,0.11996282,0,0.035619257,0.12028764,0){0,0,2981407.2,0,0,2999410,0,0,2821397.9,0,0,-818508.93,0,0,-1143461.2,0,0,-1093830.4,0,0,-3575257.7,0,0,-3706983.7,0,0,-3491178.8,0,0,-1775238,0,0,-1150363.3,0,0,-1043884.2,0,0,2287308.3,0,0,2995190.5,0,0,2851838.9}; +VT(0.027644767,0.17736901,0,0.025851591,0.17077962,0,0.030623168,0.1713445,0){0,0,1774040.3,0,0,1763476.8,0,0,1985985.4,0,0,-2777088.7,0,0,-2524912.6,0,0,-2866418.8,0,0,-203929.31,0,0,-673288.62,0,0,-715248.18,0,0,2892544.7,0,0,2815714.9,0,0,3183566.3,0,0,-1431643.3,0,0,-542697.73,0,0,-696442.05}; +VT(0.025139549,0.12057635,0,0.023213665,0.1150537,0,0.030466665,0.11568191,0){0,0,2224740.3,0,0,2130593.3,0,0,2608170,0,0,-875333.98,0,0,-605772.32,0,0,-773675.45,0,0,-2755721.9,0,0,-2564157.8,0,0,-3152461.4,0,0,-796179.51,0,0,-1229375.9,0,0,-1443702.3,0,0,2272644.8,0,0,1684092.7,0,0,2136967.4}; +VT(0.08682376,0.20181233,0,0.087008075,0.19596841,0,0.093164956,0.1980516,0){0,0,767576.83,0,0,798107.94,0,0,420734.09,0,0,-1560255.4,0,0,-1537171.7,0,0,-826537.04,0,0,843726.65,0,0,625323.3,0,0,376428.12,0,0,688912.23,0,0,958187.81,0,0,463603.83,0,0,-1555436.8,0,0,-1512909.8,0,0,-823893.15}; +VT(0.093164956,0.1980516,0,0.087008075,0.19596841,0,0.091593501,0.1915477,0){0,0,420734.09,0,0,798107.94,0,0,544831.72,0,0,-826537.04,0,0,-1537171.7,0,0,-1004107.1,0,0,376428.12,0,0,625323.3,0,0,301623.68,0,0,463603.83,0,0,958187.81,0,0,749822.54,0,0,-823893.15,0,0,-1512909.8,0,0,-933881.71}; +VT(0.1,0.26428571,0,0.092520768,0.26920591,0,0.092295863,0.26000779,0){0,0,0,0,0,145042.72,0,0,193329.27,0,0,0,0,0,-420173.4,0,0,-546576.12,0,0,0,0,0,651988.34,0,0,805368.84,0,0,0,0,0,-816598.86,0,0,-924990.4,0,0,0,0,0,896908.09,0,0,884724.5}; +VT(0.092141527,0.03991184,0,0.092450683,0.030760689,0,0.1,0.035714286,0){0,0,927649.93,0,0,900007.85,0,0,0,0,0,767955.56,0,0,807431.66,0,0,0,0,0,476054.53,0,0,631804.95,0,0,0,0,0,102192.68,0,0,391202.83,0,0,0,0,0,-289378.9,0,0,110124.82,0,0,0}; +VT(0.015758122,0.23699049,0,0.013821768,0.24617185,0,0.0071147476,0.24137211,0){0,0,597291.98,0,0,454053.45,0,0,259907.57,0,0,-1541119.1,0,0,-1221678.8,0,0,-684802.64,0,0,1837947.1,0,0,1611329.8,0,0,859611.54,0,0,-1363109.4,0,0,-1502439.1,0,0,-720499.62,0,0,315646.37,0,0,928515.88,0,0,317972.39}; +VT(0.08264437,0.14444108,0,0.076625322,0.14929356,0,0.075488644,0.14176328,0){0,0,1463951.5,0,0,1845555.4,0,0,1990888.2,0,0,-1293607.4,0,0,-1818255.1,0,0,-1647841.2,0,0,-1614532.1,0,0,-1872475.3,0,0,-2274843.7,0,0,1105781,0,0,1790618.2,0,0,1255935.2,0,0,1743195.6,0,0,1898765.5,0,0,2491166.6}; +VT(0.093706234,0.20596864,0,0.093164956,0.1980516,0,0.1,0.2,0){0,0,360320.46,0,0,420734.09,0,0,0,0,0,-758974.46,0,0,-826537.04,0,0,0,0,0,479351.87,0,0,376428.12,0,0,0,0,0,228803.73,0,0,463603.83,0,0,0,0,0,-732939.79,0,0,-823893.15,0,0,0}; +VT(0.048663579,0.053435419,0,0.053426379,0.049768916,0,0.056317057,0.058022103,0){0,0,3726394.8,0,0,3727873.1,0,0,3630316.8,0,0,2589713.3,0,0,2738031.5,0,0,2330872.5,0,0,663071.82,0,0,1021148,0,0,197001.66,0,0,-1465861.1,0,0,-966926.63,0,0,-2007682.1,0,0,-3147918.6,0,0,-2698501,0,0,-3494460.7}; +VT(0.052532368,0.096036702,0,0.044548934,0.094607351,0,0.049739958,0.088394034,0){0,0,3389506.1,0,0,3364209.6,0,0,3472240.4,0,0,240670.51,0,0,323528.56,0,0,703521.31,0,0,-3131818.5,0,0,-3009655.6,0,0,-2626240.1,0,0,-3594959.1,0,0,-3622750.1,0,0,-3862017.3,0,0,-718569.73,0,0,-961698.97,0,0,-2018648.2}; +VT(0.070175425,0.16144206,0,0.067098511,0.16826118,0,0.061476805,0.16269562,0){0,0,2074683.8,0,0,2121688.2,0,0,2391378.9,0,0,-2570674.4,0,0,-2928224.5,0,0,-3025373.1,0,0,-1460177,0,0,-1008555.7,0,0,-1589341.3,0,0,2919916.2,0,0,3311710.7,0,0,3446908.2,0,0,762077.82,0,0,-250662.47,0,0,675366.83}; +VT(0.0087429334,0.24792416,0,0.0043813653,0.24702694,0,0.0071147476,0.24137211,0){0,0,283453.34,0,0,145794.38,0,0,259907.57,0,0,-768118.62,0,0,-393661.32,0,0,-684802.64,0,0,1029935.2,0,0,523477.05,0,0,859611.54,0,0,-992967.39,0,0,-496310.62,0,0,-720499.62,0,0,667809.3,0,0,320224.07,0,0,317972.39}; +VT(0.092195724,0.16853594,0,0.093873231,0.17693503,0,0.085369203,0.17624497,0){0,0,598378.34,0,0,445896.9,0,0,1039089.6,0,0,-829189.07,0,0,-694096.79,0,0,-1603144.1,0,0,-278570.16,0,0,-59504.029,0,0,-168940.91,0,0,936666.51,0,0,727141.13,0,0,1695116.9,0,0,-82641.6,0,0,-345394.37,0,0,-751642.95}; +VT(0.082583958,0.10907049,0,0.086838536,0.10220901,0,0.091053567,0.10618538,0){0,0,1698614.9,0,0,1341203.8,0,0,914271.31,0,0,-286603.09,0,0,-54099.381,0,0,-104388.15,0,0,-1936849,0,0,-1393108.8,0,0,-1006721.9,0,0,-1323464.6,0,0,-1282822.5,0,0,-787386.88,0,0,836522.31,0,0,161880.97,0,0,309052.61}; +VT(0.044637502,0.20577347,0,0.053221516,0.20704838,0,0.049232245,0.21047418,0){0,0,1811821.2,0,0,1805672.4,0,0,1752658.6,0,0,-3810004,0,0,-3837129.3,0,0,-3827070.5,0,0,2390091.8,0,0,2511247.5,0,0,2777012.8,0,0,1174216.7,0,0,1011998.4,0,0,540242.46,0,0,-3685779.4,0,0,-3650194.7,0,0,-3416565.4}; +VT(0.051624576,0.1997036,0,0.053221516,0.20704838,0,0.044637502,0.20577347,0){0,0,1943020.7,0,0,1805672.4,0,0,1811821.2,0,0,-3875569.2,0,0,-3837129.3,0,0,-3810004,0,0,1911651.5,0,0,2511247.5,0,0,2390091.8,0,0,1974364.4,0,0,1011998.4,0,0,1174216.7,0,0,-3875892.9,0,0,-3650194.7,0,0,-3685779.4}; +VT(0.013794295,0.15422926,0,0.0056981356,0.15371602,0,0.0078195435,0.14622426,0){0,0,1126466.2,0,0,478995.44,0,0,680366.1,0,0,-1226232.2,0,0,-516269.88,0,0,-626541.18,0,0,-1017954.8,0,0,-438816.38,0,0,-729870.69,0,0,1316565.7,0,0,550400.04,0,0,568744.13,0,0,901352.54,0,0,395913.98,0,0,774663.29}; +VT(0.013878694,0.17880836,0,0.0062925762,0.18063125,0,0.0069613667,0.17349451,0){0,0,971566.52,0,0,445914.92,0,0,517779.21,0,0,-1548960.4,0,0,-727143.63,0,0,-769992.03,0,0,-51095.574,0,0,12632.594,0,0,-142713.64,0,0,1579530,0,0,719304.1,0,0,839532.94,0,0,-887966.26,0,0,-466469.22,0,0,-266340.1}; +VT(0,0.23571429,0,0.0071147476,0.24137211,0,0,0.24285714,0){0,0,0,0,0,259907.57,0,0,0,0,0,0,0,0,-684802.64,0,0,0,0,0,0,0,0,859611.54,0,0,0,0,0,0,0,0,-720499.62,0,0,0,0,0,0,0,0,317972.39,0,0,0}; +VT(0.021502186,0.15931359,0,0.014502412,0.16316663,0,0.013794295,0.15422926,0){0,0,1630158.4,0,0,1121335,0,0,1126466.2,0,0,-1947614.2,0,0,-1429592.9,0,0,-1226232.2,0,0,-1250943.8,0,0,-728363.13,0,0,-1017954.8,0,0,2191316.6,0,0,1629901.1,0,0,1316565.7,0,0,824223.66,0,0,280110.31,0,0,901352.54}; +VT(0.01882241,0.070374011,0,0.027058874,0.069011929,0,0.026270926,0.075674812,0){0,0,2018056.9,0,0,2727323.5,0,0,2630439.6,0,0,970762.8,0,0,1363815.9,0,0,1063205.3,0,0,-580354.6,0,0,-681543.48,0,0,-1137545.6,0,0,-1830388.5,0,0,-2386220.5,0,0,-2660659.2,0,0,-2130853.3,0,0,-2898415.6,0,0,-2599027.8}; +VT(0.072323403,0.067507008,0,0.074756101,0.075901522,0,0.066925078,0.074981916,0){0,0,2781512.1,0,0,2549479.1,0,0,3090390.8,0,0,1448400.9,0,0,1021825.1,0,0,1280900.5,0,0,-578922.09,0,0,-1118145.3,0,0,-1278621.5,0,0,-2328912.3,0,0,-2588166.7,0,0,-3089611.2,0,0,-2963263.7,0,0,-2507455.8,0,0,-3091904.4}; +VT(0.010955873,0.10281868,0,0.013465065,0.10662372,0,0.0081152275,0.10988635,0){0,0,1124212.8,0,0,1351132.7,0,0,821145.89,0,0,-57954.543,0,0,-165451.82,0,0,-151361.79,0,0,-1179275.3,0,0,-1496410,0,0,-944689.8,0,0,-1060620.9,0,0,-1147793.4,0,0,-619246.83,0,0,173274.75,0,0,489093.12,0,0,439508.43}; +VT(0.069968451,0.098831219,0,0.065931692,0.10408722,0,0.061027247,0.098743066,0){0,0,2730411,0,0,2911358.9,0,0,3173016.6,0,0,57648.531,0,0,-218409.17,0,0,72008.811,0,0,-2671597.7,0,0,-3113407,0,0,-3099474,0,0,-2785714.6,0,0,-2661455,0,0,-3241975.4,0,0,-173126.8,0,0,651464.78,0,0,-216202.29}; +VT(0.018704911,0.19716585,0,0.025476801,0.19755762,0,0.024044461,0.20382537,0){0,0,1103230.1,0,0,1423125.8,0,0,1283805.9,0,0,-2149261.2,0,0,-2782737.9,0,0,-2655634.7,0,0,934589.13,0,0,1235431.1,0,0,1553893.8,0,0,1263201.6,0,0,1602470.1,0,0,995311.88,0,0,-2132672.2,0,0,-2766638.2,0,0,-2617892.2}; +VT(0,0.27857143,0,0.0067236406,0.28198319,0,0,0.28571429,0){0,0,0,0,0,76627.274,0,0,0,0,0,0,0,0,-227172.13,0,0,0,0,0,0,0,0,369685.4,0,0,0,0,0,0,0,0,-499127.77,0,0,0,0,0,0,0,0,610772.43,0,0,0}; +VT(0.026018946,0.14387862,0,0.033990129,0.14330646,0,0.030440206,0.150204,0){0,0,2064539,0,0,2486957.5,0,0,2239650.6,0,0,-1800072.3,0,0,-2138608.5,0,0,-2249230.7,0,0,-2295230.1,0,0,-2786553.8,0,0,-2230054.7,0,0,1506177.8,0,0,1748365.6,0,0,2258843.4,0,0,2488196.2,0,0,3031412.6,0,0,2220211.9}; +VT(0,0.014285714,0,0.006650898,0.018174199,0,0,0.021428571,0){0,0,0,0,0,801243.34,0,0,0,0,0,0,0,0,772347.91,0,0,0,0,0,0,0,0,715593.27,0,0,0,0,0,0,0,0,633022.27,0,0,0,0,0,0,0,0,527557,0,0,0}; +VT(0.022740693,0.23189018,0,0.021374843,0.22646669,0,0.026971271,0.22659033,0){0,0,887604.04,0,0,906782.43,0,0,1090633.5,0,0,-2230116.3,0,0,-2208721,0,0,-2658504.1,0,0,2485475.6,0,0,2264460.9,0,0,2731189,0,0,-1529145.6,0,0,-1042528.4,0,0,-1267784.1,0,0,-172982.46,0,0,-767856.24,0,0,-909068.56}; +VT(0.030075176,0.23324008,0,0.025350652,0.23917347,0,0.022740693,0.23189018,0){0,0,1077047.3,0,0,868665.73,0,0,887604.04,0,0,-2725827,0,0,-2265304,0,0,-2230116.3,0,0,3095770.8,0,0,2773502.3,0,0,2485475.6,0,0,-2013325.9,0,0,-2193941.8,0,0,-1529145.6,0,0,-13872.597,0,0,753574.67,0,0,-172982.46}; +VT(0.054957014,0.24657048,0,0.061408089,0.24582042,0,0.060567191,0.25172758,0){0,0,1058545,0,0,1017142.7,0,0,917440.34,0,0,-2852831,0,0,-2732695.2,0,0,-2522838.3,0,0,3777171.8,0,0,3591948.1,0,0,3497206.6,0,0,-3549694.2,0,0,-3325647.6,0,0,-3596815.5,0,0,2239441.1,0,0,2017029.8,0,0,2796536}; +VT(0.047385855,0.10193045,0,0.044548934,0.094607351,0,0.052532368,0.096036702,0){0,0,3329666.7,0,0,3364209.6,0,0,3389506.1,0,0,-117239.93,0,0,323528.56,0,0,240670.51,0,0,-3442848.4,0,0,-3009655.6,0,0,-3131818.5,0,0,-3204510.9,0,0,-3622750.1,0,0,-3594959.1,0,0,350991.89,0,0,-961698.97,0,0,-718569.73}; +VT(0.069467767,0.146519,0,0.064971856,0.15110456,0,0.061244461,0.14481879,0){0,0,2287173.5,0,0,2431817,0,0,2643484.5,0,0,-2120501.9,0,0,-2488096.1,0,0,-2356788.3,0,0,-2441744.6,0,0,-2374265.3,0,0,-2899198.4,0,0,1942651.5,0,0,2543085,0,0,2042509.4,0,0,2583122,0,0,2315361.9,0,0,3121060.9}; +VT(0.0081152275,0.10988635,0,0.0052460498,0.10332732,0,0.010955873,0.10281868,0){0,0,821145.89,0,0,545715.18,0,0,1124212.8,0,0,-151361.79,0,0,-33256.292,0,0,-57954.543,0,0,-944689.8,0,0,-576983.54,0,0,-1179275.3,0,0,-619246.83,0,0,-508602.25,0,0,-1060620.9,0,0,439508.43,0,0,99155.047,0,0,173274.75}; +VT(0.030466665,0.11568191,0,0.038084092,0.1145524,0,0.035619257,0.12028764,0){0,0,2608170,0,0,2981407.2,0,0,2821397.9,0,0,-773675.45,0,0,-818508.93,0,0,-1093830.4,0,0,-3152461.4,0,0,-3575257.7,0,0,-3491178.8,0,0,-1443702.3,0,0,-1775238,0,0,-1043884.2,0,0,2136967.4,0,0,2287308.3,0,0,2851838.9}; +VT(0.0094132111,0.052421332,0,0.014691551,0.054118398,0,0.0079950318,0.059686314,0){0,0,1088603.4,0,0,1659245.8,0,0,917766.47,0,0,768702.62,0,0,1140472.1,0,0,570756.35,0,0,222919.17,0,0,265092.56,0,0,7912.4367,0,0,-388347.22,0,0,-693242.8,0,0,-557994.72,0,0,-885762.83,0,0,-1435183.5,0,0,-913265.38}; +VT(0.020636298,0.17424253,0,0.027644767,0.17736901,0,0.021251228,0.18136297,0){0,0,1433869.3,0,0,1774040.3,0,0,1398279.8,0,0,-2154082.5,0,0,-2777088.7,0,0,-2300353.4,0,0,-351921.61,0,0,-203929.31,0,0,85724.805,0,0,2330929.4,0,0,2892544.7,0,0,2245163.6,0,0,-819073.82,0,0,-1431643.3,0,0,-1534338.6}; +VT(0.0081152275,0.10988635,0,0.013465065,0.10662372,0,0.016927821,0.11108648,0){0,0,821145.89,0,0,1351132.7,0,0,1644246.3,0,0,-151361.79,0,0,-165451.82,0,0,-340994.5,0,0,-944689.8,0,0,-1496410,0,0,-1914445.6,0,0,-619246.83,0,0,-1147793.4,0,0,-1176430.8,0,0,439508.43,0,0,489093.12,0,0,981584.41}; +VT(0.054828578,0.081464579,0,0.060416267,0.076932239,0,0.064352171,0.083117586,0){0,0,3492382.6,0,0,3380545.3,0,0,3167194.8,0,0,1101278.5,0,0,1302521.2,0,0,915483.69,0,0,-2043909.2,0,0,-1576156.6,0,0,-1987167.2,0,0,-3789901.6,0,0,-3485992.8,0,0,-3477240.4,0,0,-2941538.5,0,0,-3253298.6,0,0,-2495770}; +VT(0.0069979116,0.22643766,0,0.0069516057,0.23320895,0,0,0.22857143,0){0,0,317964.48,0,0,288078.49,0,0,0,0,0,-774386.26,0,0,-728952.19,0,0,0,0,0,793599.18,0,0,827497.2,0,0,0,0,0,-364658.79,0,0,-537397.4,0,0,0,0,0,-270536.88,0,0,-5267.3055,0,0,0}; +VT(0.0068768393,0.16098373,0,0.0056981356,0.15371602,0,0.013794295,0.15422926,0){0,0,553409.29,0,0,478995.44,0,0,1126466.2,0,0,-680450.71,0,0,-516269.88,0,0,-1226232.2,0,0,-397156.36,0,0,-438816.38,0,0,-1017954.8,0,0,771605.48,0,0,550400.04,0,0,1316565.7,0,0,219690.78,0,0,395913.98,0,0,901352.54}; +VT(0.08264437,0.14444108,0,0.081009521,0.1385969,0,0.087083587,0.13880919,0){0,0,1463951.5,0,0,1630909.4,0,0,1144744.3,0,0,-1293607.4,0,0,-1242340.3,0,0,-877072.07,0,0,-1614532.1,0,0,-1926924,0,0,-1349889.8,0,0,1105781,0,0,783271.16,0,0,561444.4,0,0,1743195.6,0,0,2113542.9,0,0,1481228.8}; +VT(0.064373335,0.2338171,0,0.066600159,0.24211306,0,0.059437672,0.2400817,0){0,0,1185902.3,0,0,1004296.2,0,0,1145348.7,0,0,-3010536.1,0,0,-2655015,0,0,-2999714,0,0,3446119.8,0,0,3359675.2,0,0,3711340.5,0,0,-2291596.2,0,0,-2867211.3,0,0,-3009146,0,0,79206.699,0,0,1352854.8,0,0,1160252.2}; +VT(0.061015306,0.048529238,0,0.053426379,0.049768916,0,0.054794838,0.043915046,0){0,0,3533367.8,0,0,3727873.1,0,0,3735662.6,0,0,2640342.3,0,0,2738031.5,0,0,2959425,0,0,1080012.2,0,0,1021148,0,0,1568238.5,0,0,-753291.7,0,0,-966926.63,0,0,-148813.91,0,0,-2396723.8,0,0,-2698501,0,0,-1835117.4}; +VT(0.074931673,0.27468874,0,0.081004963,0.27070547,0,0.082516133,0.27647665,0){0,0,363389.18,0,0,333174.81,0,0,248899.48,0,0,-1064791.9,0,0,-968418.7,0,0,-731674.12,0,0,1691857.9,0,0,1513258.3,0,0,1170289.2,0,0,-2200836.4,0,0,-1916833.2,0,0,-1538273.3,0,0,2556129.1,0,0,2141327.9,0,0,1813237.5}; +VT(0.082332164,0.023444943,0,0.080699945,0.029142305,0,0.074388951,0.025102472,0){0,0,2029600,0,0,2185639.9,0,0,2772012.4,0,0,1907886.4,0,0,1983669.2,0,0,2581574.2,0,0,1671751.1,0,0,1598386.1,0,0,2213781,0,0,1335359.8,0,0,1065401.8,0,0,1693914.7,0,0,918760.81,0,0,433818.71,0,0,1057277.9}; +VT(0,0.10714286,0,0.0052460498,0.10332732,0,0.0081152275,0.10988635,0){0,0,0,0,0,545715.18,0,0,821145.89,0,0,0,0,0,-33256.292,0,0,-151361.79,0,0,0,0,0,-576983.54,0,0,-944689.8,0,0,0,0,0,-508602.25,0,0,-619246.83,0,0,0,0,0,99155.047,0,0,439508.43}; +VT(0.019499739,0.079597209,0,0.01318623,0.084416193,0,0.012549176,0.077039569,0){0,0,2040354.6,0,0,1411871.7,0,0,1370920.5,0,0,702945.71,0,0,378554.62,0,0,525978.15,0,0,-1095289.5,0,0,-931831.12,0,0,-643140.23,0,0,-2175701.2,0,0,-1560266,0,0,-1415881.7,0,0,-1830384.7,0,0,-1046999.7,0,0,-1316306.1}; +VT(0.084917502,0.034253561,0,0.085916752,0.02828,0,0.092450683,0.030760689,0){0,0,1742331.8,0,0,1643257.2,0,0,900007.85,0,0,1520580.8,0,0,1500211.7,0,0,807431.66,0,0,1105294,0,0,1226559.7,0,0,631804.95,0,0,549324.68,0,0,846114.35,0,0,391202.83,0,0,-76880.401,0,0,391827.49,0,0,110124.82}; +VT(0.092520768,0.26920591,0,0.086077973,0.27164165,0,0.085115353,0.26563346,0){0,0,145042.72,0,0,243157.03,0,0,313056.52,0,0,-420173.4,0,0,-708191.99,0,0,-899063.8,0,0,651988.34,0,0,1111255.9,0,0,1369900.4,0,0,-816598.86,0,0,-1417072.6,0,0,-1665255.4,0,0,896908.09,0,0,1598582.9,0,0,1747205.8}; +VT(0.037999827,0.27482627,0,0.045592054,0.27439642,0,0.045044357,0.28188841,0){0,0,474219.19,0,0,513714.39,0,0,362990.51,0,0,-1389905,0,0,-1504437.2,0,0,-1075960.6,0,0,2209621.2,0,0,2387679.2,0,0,1750378.7,0,0,-2876809.4,0,0,-3100344.3,0,0,-2362097.1,0,0,3345267.4,0,0,3591305.7,0,0,2889034}; +VT(0.077393474,0.16425214,0,0.083969261,0.16737329,0,0.077140734,0.17217741,0){0,0,1650679.7,0,0,1198489.7,0,0,1584233.7,0,0,-2141613.9,0,0,-1632158.2,0,0,-2313491.7,0,0,-1013799.5,0,0,-607916.58,0,0,-519338.58,0,0,2443278.1,0,0,1852187.2,0,0,2552719.3,0,0,287063.28,0,0,-62490.334,0,0,-655929.75}; +VT(0.066925078,0.074981916,0,0.074756101,0.075901522,0,0.070865224,0.080352924,0){0,0,3090390.8,0,0,2549479.1,0,0,2808030.6,0,0,1280900.5,0,0,1021825.1,0,0,934415.1,0,0,-1278621.5,0,0,-1118145.3,0,0,-1562677.5,0,0,-3089611.2,0,0,-2588166.7,0,0,-3017110.1,0,0,-3091904.4,0,0,-2507455.8,0,0,-2458745.5}; +VT(0.017373248,0.19021363,0,0.023309936,0.19197185,0,0.018704911,0.19716585,0){0,0,1095255.9,0,0,1390526.6,0,0,1103230.1,0,0,-1990705.9,0,0,-2573914.4,0,0,-2149261.2,0,0,532263.7,0,0,799964.88,0,0,934589.13,0,0,1555631.8,0,0,1893175.4,0,0,1263201.6,0,0,-1804413.6,0,0,-2411477.9,0,0,-2132672.2}; +VT(0.079090117,0.19794942,0,0.081922129,0.20489902,0,0.075422073,0.20645372,0){0,0,1206859.6,0,0,996952.98,0,0,1273700.5,0,0,-2368529.7,0,0,-2081157.6,0,0,-2693470,0,0,1073015.3,0,0,1266338.6,0,0,1728669,0,0,1335740.9,0,0,704044.3,0,0,766631.5,0,0,-2359414.1,0,0,-2032271.3,0,0,-2583646.6}; +VT(0.08682376,0.20181233,0,0.081922129,0.20489902,0,0.079090117,0.19794942,0){0,0,767576.83,0,0,996952.98,0,0,1206859.6,0,0,-1560255.4,0,0,-2081157.6,0,0,-2368529.7,0,0,843726.65,0,0,1266338.6,0,0,1073015.3,0,0,688912.23,0,0,704044.3,0,0,1335740.9,0,0,-1555436.8,0,0,-2032271.3,0,0,-2359414.1}; +VT(0.039686874,0.0066116125,0,0.031710863,0.0075461758,0,0.035714286,0,0){0,0,3676489.9,0,0,3254919.5,0,0,3496308.9,0,0,3658909.3,0,0,3234618.2,0,0,3496337.7,0,0,3623831.1,0,0,3194153.7,0,0,3496399.5,0,0,3571457.2,0,0,3133832.1,0,0,3496538.6,0,0,3501797.4,0,0,3053845.3,0,0,3496562.8}; +VT(0.035714286,0.3,0,0.031264826,0.29263185,0,0.03928574,0.29335694,0){0,0,0,0,0,124484.17,0,0,127378.94,0,0,0,0,0,-372709.78,0,0,-381522.06,0,0,0,0,0,618717.86,0,0,633829.06,0,0,0,0,0,-861054.65,0,0,-883092.25,0,0,0,0,0,1098239.8,0,0,1127859.7}; +VT(0.022775714,0.15147437,0,0.030440206,0.150204,0,0.027609688,0.15620978,0){0,0,1786181.8,0,0,2239650.6,0,0,2023546.1,0,0,-1841345.2,0,0,-2249230.7,0,0,-2286520.9,0,0,-1729359.8,0,0,-2230054.7,0,0,-1726415,0,0,1894858,0,0,2258843.4,0,0,2510934.9,0,0,1670732.8,0,0,2220211.9,0,0,1400022.9}; +VT(0.0079950318,0.059686314,0,0.014691551,0.054118398,0,0.016702178,0.061420197,0){0,0,917766.47,0,0,1659245.8,0,0,1844408.3,0,0,570756.35,0,0,1140472.1,0,0,1107331.1,0,0,7912.4367,0,0,265092.56,0,0,-72241.295,0,0,-557994.72,0,0,-693242.8,0,0,-1222910.6,0,0,-913265.38,0,0,-1435183.5,0,0,-1885264.1}; +VT(0,0.028571429,0,0.0058133292,0.032528446,0,0,0.035714286,0){0,0,0,0,0,694559.72,0,0,0,0,0,0,0,0,614750.96,0,0,0,0,0,0,0,0,464300.7,0,0,0,0,0,0,0,0,260495.38,0,0,0,0,0,0,0,0,26512.55,0,0,0}; +VT(0.067728608,0.12931058,0,0.068478919,0.13862632,0,0.060672554,0.13561545,0){0,0,2567539,0,0,2426951.1,0,0,2778852.8,0,0,-1463631.5,0,0,-1850187.5,0,0,-1944873,0,0,-3196956.5,0,0,-2866745.3,0,0,-3362653.4,0,0,89062.443,0,0,1169007.7,0,0,935707.85,0,0,3235608.2,0,0,3144665.9,0,0,3643681.7}; +VT(0,0.26428571,0,0.0060732531,0.2674669,0,0,0.27142857,0){0,0,0,0,0,124750.88,0,0,0,0,0,0,0,0,-359918.85,0,0,0,0,0,0,0,0,553735.12,0,0,0,0,0,0,0,0,-683931.42,0,0,0,0,0,0,0,0,735399.5,0,0,0}; +VT(0.072323403,0.067507008,0,0.064846874,0.068845861,0,0.064832361,0.062804408,0){0,0,2781512.1,0,0,3243292.3,0,0,3281120.4,0,0,1448400.9,0,0,1629296.1,0,0,1912310.8,0,0,-578922.09,0,0,-795531.06,0,0,-254314.65,0,0,-2328912.3,0,0,-2824516.6,0,0,-2314932.7,0,0,-2963263.7,0,0,-3448034.5,0,0,-3410309.6}; +VT(0.1,0.15714286,0,0.09308158,0.15403623,0,0.1,0.15,0){0,0,0,0,0,579061.91,0,0,0,0,0,0,0,0,-628036.95,0,0,0,0,0,0,0,0,-525997.02,0,0,0,0,0,0,0,0,672596.25,0,0,0,0,0,0,0,0,469080.04,0,0,0}; +VT(0.040431855,0.24188745,0,0.037546984,0.23452457,0,0.045331711,0.23557633,0){0,0,1110505,0,0,1205921.7,0,0,1270563.3,0,0,-2932804,0,0,-3072707.6,0,0,-3255008.9,0,0,3702149.5,0,0,3550700.1,0,0,3813331,0,0,-3142324.5,0,0,-2423829.8,0,0,-2700862,0,0,1453973.2,0,0,201013.93,0,0,404484.48}; +VT(0.067728608,0.12931058,0,0.070840483,0.12204614,0,0.076158908,0.12549637,0){0,0,2567539,0,0,2470738.2,0,0,2092101.1,0,0,-1463631.5,0,0,-1044803.2,0,0,-1030118.9,0,0,-3196956.5,0,0,-3073782.1,0,0,-2615047.7,0,0,89062.443,0,0,-729197.53,0,0,-297340.89,0,0,3235608.2,0,0,2652961,0,0,2464056}; +VT(0.046181733,0.0056701177,0,0.043829005,0.011024747,0,0.039686874,0.0066116125,0){0,0,3851009.3,0,0,3801549.1,0,0,3676489.9,0,0,3837454.5,0,0,3750937.1,0,0,3658909.3,0,0,3810385,0,0,3650381.9,0,0,3623831.1,0,0,3769920.5,0,0,3501249.8,0,0,3571457.2,0,0,3715901.2,0,0,3305260.3,0,0,3501797.4}; +VT(0.066803853,0.25459223,0,0.060567191,0.25172758,0,0.065478411,0.24860928,0){0,0,789541.66,0,0,917440.34,0,0,912058.17,0,0,-2193455.3,0,0,-2522838.3,0,0,-2478342.9,0,0,3110738.9,0,0,3497206.6,0,0,3344041.2,0,0,-3337877,0,0,-3596815.5,0,0,-3264436.9,0,0,2824240.3,0,0,2796536,0,0,2261773.6}; +VT(0.03928574,0.29335694,0,0.043131118,0.28864457,0,0.045931579,0.29422002,0){0,0,127378.94,0,0,225252.57,0,0,116468.36,0,0,-381522.06,0,0,-672574.82,0,0,-348980.73,0,0,633829.06,0,0,1110400.5,0,0,580225.36,0,0,-883092.25,0,0,-1532552.2,0,0,-809364.6,0,0,1127859.7,0,0,1932837.8,0,0,1035478}; +VT(0.038597539,0.20095921,0,0.043569257,0.19619451,0,0.044637502,0.20577347,0){0,0,1801301.7,0,0,1966078.6,0,0,1811821.2,0,0,-3633864.6,0,0,-3794921.6,0,0,-3810004,0,0,1895634,0,0,1563901,0,0,2390091.8,0,0,1705394,0,0,2340412.7,0,0,1174216.7,0,0,-3630918.1,0,0,-3741435.4,0,0,-3685779.4}; +VT(0.044637502,0.20577347,0,0.043569257,0.19619451,0,0.051624576,0.1997036,0){0,0,1811821.2,0,0,1966078.6,0,0,1943020.7,0,0,-3810004,0,0,-3794921.6,0,0,-3875569.2,0,0,2390091.8,0,0,1563901,0,0,1911651.5,0,0,1174216.7,0,0,2340412.7,0,0,1974364.4,0,0,-3685779.4,0,0,-3741435.4,0,0,-3875892.9}; +VT(0,0.092857143,0,0.0071591483,0.096788703,0,0,0.1,0){0,0,0,0,0,756711.76,0,0,0,0,0,0,0,0,43634.951,0,0,0,0,0,0,0,0,-710572.63,0,0,0,0,0,0,0,0,-795194.2,0,0,0,0,0,0,0,0,-130859.45,0,0,0}; +VT(0.017990672,0.29207379,0,0.010662343,0.29482959,0,0.0093450955,0.28843768,0){0,0,86228.122,0,0,34537.041,0,0,67949.514,0,0,-258100.45,0,0,-103506.64,0,0,-202850.84,0,0,428229.3,0,0,172164.12,0,0,334776.34,0,0,-595472.42,0,0,-240303.04,0,0,-461793.67,0,0,758576.15,0,0,307518.14,0,0,581935.08}; +VT(0.0093389246,0.011691623,0,0.010679145,0.0052482016,0,0.01808004,0.0081573173,0){0,0,1120186.5,0,0,1277155.8,0,0,2085729.2,0,0,1103410.3,0,0,1273289.3,0,0,2070583.9,0,0,1070108.3,0,0,1265566.3,0,0,2040406.9,0,0,1020788.4,0,0,1254019.7,0,0,1995444.2,0,0,956114.18,0,0,1238493.9,0,0,1935913.6}; +VT(0.060672554,0.13561545,0,0.054237851,0.14012792,0,0.053497526,0.1329974,0){0,0,2778852.8,0,0,2856617.8,0,0,2959143.9,0,0,-1944873,0,0,-2267029,0,0,-1911000.9,0,0,-3362653.4,0,0,-3324577.4,0,0,-3636096,0,0,935707.85,0,0,1580891.3,0,0,623103.97,0,0,3643681.7,0,0,3650971.5,0,0,3857035.6}; +VT(0.074279052,0.25633166,0,0.071915087,0.24816524,0,0.07921504,0.25033934,0){0,0,635900.39,0,0,803363.84,0,0,606155.6,0,0,-1777029.4,0,0,-2179152.4,0,0,-1658203,0,0,2553015.8,0,0,2928525.2,0,0,2271843.6,0,0,-2804423.5,0,0,-2836050.6,0,0,-2284831,0,0,2479429.3,0,0,1927975,0,0,1693484.6}; +VT(0.091864029,0.22106993,0,0.095652827,0.22622146,0,0.09071018,0.22887426,0){0,0,394005.54,0,0,199039.37,0,0,406264.77,0,0,-927852.61,0,0,-484109.58,0,0,-1003622.2,0,0,863120.02,0,0,494313.66,0,0,1069446.3,0,0,-241435.16,0,0,-223837.82,0,0,-568907.82,0,0,-536498.87,0,0,-173819.74,0,0,-233040.27}; +VT(0.021658338,0.054940441,0,0.025565101,0.048609543,0,0.028699663,0.054481756,0){0,0,2341024.9,0,0,2702312,0,0,2920693,0,0,1587273.2,0,0,2017092.5,0,0,1995520.8,0,0,322446.89,0,0,820389.33,0,0,438210.61,0,0,-1046241,0,0,-584372.75,0,0,-1257984.1,0,0,-2078353.5,0,0,-1841258.2,0,0,-2556170.3}; +VT(0.019247887,0.048569646,0,0.025565101,0.048609543,0,0.021658338,0.054940441,0){0,0,2135187.8,0,0,2702312,0,0,2341024.9,0,0,1594654.5,0,0,2017092.5,0,0,1587273.2,0,0,650408.09,0,0,820389.33,0,0,322446.89,0,0,-458538.7,0,0,-584372.75,0,0,-1046241,0,0,-1451674.1,0,0,-1841258.2,0,0,-2078353.5}; +VT(0.084368038,0.19048099,0,0.087008075,0.19596841,0,0.079090117,0.19794942,0){0,0,992852.93,0,0,798107.94,0,0,1206859.6,0,0,-1809621.2,0,0,-1537171.7,0,0,-2368529.7,0,0,495817.1,0,0,625323.3,0,0,1073015.3,0,0,1401810.9,0,0,958187.81,0,0,1335740.9,0,0,-1649308.4,0,0,-1512909.8,0,0,-2359414.1}; +VT(0.029991713,0.27132489,0,0.027951851,0.26533243,0,0.034582704,0.26623209,0){0,0,469504.82,0,0,539100.43,0,0,604041.77,0,0,-1366503,0,0,-1547025.6,0,0,-1737386.1,0,0,2141236.7,0,0,2353298.6,0,0,2655775,0,0,-2724385.3,0,0,-2852826.8,0,0,-3245580.1,0,0,3063642.3,0,0,2980285,0,0,3433603.3}; +VT(0.043569257,0.19619451,0,0.044234359,0.18859393,0,0.050398693,0.1921099,0){0,0,1966078.6,0,0,2102462.5,0,0,2077292.2,0,0,-3794921.6,0,0,-3756018.8,0,0,-3850553.1,0,0,1563901,0,0,851571.98,0,0,1209682,0,0,2340412.7,0,0,3086402.5,0,0,2818064.5,0,0,-3741435.4,0,0,-3279385.1,0,0,-3615771.1}; +VT(0.0069613667,0.17349451,0,0.0046637588,0.16745308,0,0.0094805882,0.16707285,0){0,0,517779.21,0,0,362371.83,0,0,730151.01,0,0,-769992.03,0,0,-494096.85,0,0,-989834.58,0,0,-142713.64,0,0,-182769.85,0,0,-378084.11,0,0,839532.94,0,0,560561.48,0,0,1124284.7,0,0,-266340.1,0,0,-21256.565,0,0,-22095.939}; +VT(0.074931673,0.27468874,0,0.06660802,0.27624666,0,0.069536278,0.26943087,0){0,0,363389.18,0,0,417349.44,0,0,505602.11,0,0,-1064791.9,0,0,-1226359.7,0,0,-1465439,0,0,1691857.9,0,0,1959900.4,0,0,2276404,0,0,-2200836.4,0,0,-2572844.1,0,0,-2856108.7,0,0,2556129.1,0,0,3027289.2,0,0,3145421.5}; +VT(0.068476894,0.0069177029,0,0.074656208,0.0053403125,0,0.073684623,0.0112317,0){0,0,3242851.4,0,0,2772385.5,0,0,2850123.3,0,0,3225849.8,0,0,2763721.5,0,0,2810738.2,0,0,3191931.3,0,0,2746414.1,0,0,2732509.2,0,0,3141298.2,0,0,2720533.7,0,0,2616540.6,0,0,3073847.6,0,0,2685936.9,0,0,2464223.2}; +VT(0.073754091,0.28851618,0,0.074657371,0.29452352,0,0.068366879,0.29272708,0){0,0,171229.59,0,0,79525.554,0,0,123803.43,0,0,-511212.67,0,0,-238312.39,0,0,-370697.46,0,0,843808.82,0,0,396309.36,0,0,615462.12,0,0,-1164215.8,0,0,-552992.95,0,0,-856697.17,0,0,1467609.3,0,0,707611.71,0,0,1092834.3}; +VT(0.025130011,0.29009115,0,0.024877102,0.29495936,0,0.017990672,0.29207379,0){0,0,142877.47,0,0,72135.52,0,0,86228.122,0,0,-427099.39,0,0,-216205.93,0,0,-258100.45,0,0,706741.94,0,0,359676.71,0,0,428229.3,0,0,-978805.55,0,0,-502149.61,0,0,-595472.42,0,0,1240164.3,0,0,642973.44,0,0,758576.15}; +VT(0.017990672,0.29207379,0,0.024877102,0.29495936,0,0.021428571,0.3,0){0,0,86228.122,0,0,72135.52,0,0,0,0,0,-258100.45,0,0,-216205.93,0,0,0,0,0,428229.3,0,0,359676.71,0,0,0,0,0,-595472.42,0,0,-502149.61,0,0,0,0,0,758576.15,0,0,642973.44,0,0,0}; +VT(0.021428571,0,0,0.025051818,0.0051959301,0,0.01808004,0.0081573173,0){0,0,2419501.9,0,0,2747435.6,0,0,2085729.2,0,0,2419561.9,0,0,2739316.7,0,0,2070583.9,0,0,2419679.8,0,0,2723095.2,0,0,2040406.9,0,0,2419876.4,0,0,2698832.3,0,0,1995444.2,0,0,2419989.4,0,0,2666496.7,0,0,1935913.6}; +VT(0.01808004,0.0081573173,0,0.025051818,0.0051959301,0,0.025468185,0.010276157,0){0,0,2085729.2,0,0,2747435.6,0,0,2780034,0,0,2070583.9,0,0,2739316.7,0,0,2747892,0,0,2040406.9,0,0,2723095.2,0,0,2683968.5,0,0,1995444.2,0,0,2698832.3,0,0,2589008.8,0,0,1935913.6,0,0,2666496.7,0,0,2463902.9}; +VT(0.061244461,0.14481879,0,0.054237851,0.14012792,0,0.060672554,0.13561545,0){0,0,2643484.5,0,0,2856617.8,0,0,2778852.8,0,0,-2356788.3,0,0,-2267029,0,0,-1944873,0,0,-2899198.4,0,0,-3324577.4,0,0,-3362653.4,0,0,2042509.4,0,0,1580891.3,0,0,935707.85,0,0,3121060.9,0,0,3650971.5,0,0,3643681.7}; +VT(0.079090117,0.19794942,0,0.087008075,0.19596841,0,0.08682376,0.20181233,0){0,0,1206859.6,0,0,798107.94,0,0,767576.83,0,0,-2368529.7,0,0,-1537171.7,0,0,-1560255.4,0,0,1073015.3,0,0,625323.3,0,0,843726.65,0,0,1335740.9,0,0,958187.81,0,0,688912.23,0,0,-2359414.1,0,0,-1512909.8,0,0,-1555436.8}; +VT(0.093710586,0.16080643,0,0.088623123,0.15812222,0,0.09308158,0.15403623,0){0,0,507346.27,0,0,918302.92,0,0,579061.91,0,0,-621948.04,0,0,-1074338,0,0,-628036.95,0,0,-366919.85,0,0,-735787.48,0,0,-525997.02,0,0,704920.6,0,0,1199414.9,0,0,672596.25,0,0,207593.47,0,0,531983.03,0,0,469080.04}; +VT(0.088381846,0.16289419,0,0.088623123,0.15812222,0,0.093710586,0.16080643,0){0,0,911153.68,0,0,918302.92,0,0,507346.27,0,0,-1156470.7,0,0,-1074338,0,0,-621948.04,0,0,-599768.12,0,0,-735787.48,0,0,-366919.85,0,0,1317920.1,0,0,1199414.9,0,0,704920.6,0,0,244888.24,0,0,531983.03,0,0,207593.47}; +VT(0.060672554,0.13561545,0,0.059246105,0.12763558,0,0.067728608,0.12931058,0){0,0,2778852.8,0,0,2918223.5,0,0,2567539,0,0,-1944873,0,0,-1563762.3,0,0,-1463631.5,0,0,-3362653.4,0,0,-3644117.3,0,0,-3196956.5,0,0,935707.85,0,0,-127593.52,0,0,89062.443,0,0,3643681.7,0,0,3585046,0,0,3235608.2}; +VT(0.02133326,0.24577003,0,0.025350652,0.23917347,0,0.029124573,0.24658198,0){0,0,675269.21,0,0,868665.73,0,0,849052.23,0,0,-1813848.4,0,0,-2265304,0,0,-2288340.2,0,0,2383092.9,0,0,2773502.3,0,0,3030093.5,0,0,-2204305.3,0,0,-2193941.8,0,0,-2848204.4,0,0,1333319.6,0,0,753574.67,0,0,1797881.3}; +VT(0.037897724,0.149701,0,0.045364072,0.14896511,0,0.042155309,0.15589067,0){0,0,2552043.8,0,0,2729630.7,0,0,2577776.2,0,0,-2536068.8,0,0,-2670475.8,0,0,-2895603.6,0,0,-2567975.2,0,0,-2787568.3,0,0,-2220826.4,0,0,2520076,0,0,2610132.2,0,0,3169529.7,0,0,2583694.6,0,0,2844182.1,0,0,1830012}; +VT(0.071449289,0.19423207,0,0.06771074,0.1881525,0,0.076430303,0.18837043,0){0,0,1594804.6,0,0,1821405.7,0,0,1444535.6,0,0,-3019964.8,0,0,-3238423,0,0,-2574453.4,0,0,1103926.4,0,0,698008.36,0,0,569102.25,0,0,2033518.7,0,0,2695511.5,0,0,2129625.3,0,0,-2921575.1,0,0,-2795478.4,0,0,-2235391.7}; +VT(0.078984823,0.22953004,0,0.084619556,0.23283838,0,0.077318805,0.23627719,0){0,0,858343.29,0,0,621044.17,0,0,830868.27,0,0,-2128428.8,0,0,-1568398.7,0,0,-2136157.9,0,0,2291087.1,0,0,1771426.2,0,0,2525048.7,0,0,-1261656.1,0,0,-1133733.9,0,0,-1830714.2,0,0,-424553.92,0,0,-42283.716,0,0,350702.19}; +VT(0.077318805,0.23627719,0,0.084619556,0.23283838,0,0.084206466,0.24009781,0){0,0,830868.27,0,0,621044.17,0,0,569988.38,0,0,-2136157.9,0,0,-1568398.7,0,0,-1492933.9,0,0,2525048.7,0,0,1771426.2,0,0,1847439,0,0,-1830714.2,0,0,-1133733.9,0,0,-1498530.8,0,0,350702.19,0,0,-42283.716,0,0,578923.58}; +VT(0.026018946,0.14387862,0,0.030440206,0.150204,0,0.022775714,0.15147437,0){0,0,2064539,0,0,2239650.6,0,0,1786181.8,0,0,-1800072.3,0,0,-2249230.7,0,0,-1841345.2,0,0,-2295230.1,0,0,-2230054.7,0,0,-1729359.8,0,0,1506177.8,0,0,2258843.4,0,0,1894858,0,0,2488196.2,0,0,2220211.9,0,0,1670732.8}; +VT(0.07492972,0.092844339,0,0.081743274,0.092625466,0,0.079063451,0.10043005,0){0,0,2431427.6,0,0,1862860,0,0,2051820.1,0,0,308451.38,0,0,243386.47,0,0,-16056.497,0,0,-2083891.4,0,0,-1587731,0,0,-2067914.3,0,0,-2656803.1,0,0,-2038652.4,0,0,-2035845.1,0,0,-910298.79,0,0,-717394.49,0,0,48244.512}; +VT(0.079063451,0.10043005,0,0.081743274,0.092625466,0,0.087331535,0.0958472,0){0,0,2051820.1,0,0,1862860,0,0,1318484.3,0,0,-16056.497,0,0,243386.47,0,0,98077.228,0,0,-2067914.3,0,0,-1587731,0,0,-1213131.9,0,0,-2035845.1,0,0,-2038652.4,0,0,-1401481.2,0,0,48244.512,0,0,-717394.49,0,0,-292629.72}; +VT(0.066012722,0.055502179,0,0.070754378,0.060222618,0,0.064832361,0.062804408,0){0,0,3257272.9,0,0,2932444.5,0,0,3281120.4,0,0,2187557.2,0,0,1804303.3,0,0,1912310.8,0,0,399401.17,0,0,-17984.254,0,0,-254314.65,0,0,-1519988.7,0,0,-1833384.6,0,0,-2314932.7,0,0,-2940625.1,0,0,-2943704.7,0,0,-3410309.6}; +VT(0.069467767,0.146519,0,0.076625322,0.14929356,0,0.070477538,0.15360968,0){0,0,2287173.5,0,0,1845555.4,0,0,2153625.7,0,0,-2120501.9,0,0,-1818255.1,0,0,-2316413.6,0,0,-2441744.6,0,0,-1872475.3,0,0,-1978592.7,0,0,1942651.5,0,0,1790618.2,0,0,2466066.8,0,0,2583122,0,0,1898765.5,0,0,1792310.4}; +VT(0.075488644,0.14176328,0,0.076625322,0.14929356,0,0.069467767,0.146519,0){0,0,1990888.2,0,0,1845555.4,0,0,2287173.5,0,0,-1647841.2,0,0,-1818255.1,0,0,-2120501.9,0,0,-2274843.7,0,0,-1872475.3,0,0,-2441744.6,0,0,1255935.2,0,0,1790618.2,0,0,1942651.5,0,0,2491166.6,0,0,1898765.5,0,0,2583122}; +VT(0.070607657,0.23670872,0,0.066600159,0.24211306,0,0.064373335,0.2338171,0){0,0,1007105.3,0,0,1004296.2,0,0,1185902.3,0,0,-2594870.8,0,0,-2655015,0,0,-3010536.1,0,0,3083897.2,0,0,3359675.2,0,0,3446119.8,0,0,-2267120.1,0,0,-2867211.3,0,0,-2291596.2,0,0,490193.02,0,0,1352854.8,0,0,79206.699}; +VT(0.1,0.11428571,0,0.091758141,0.11296708,0,0.1,0.10714286,0){0,0,0,0,0,824791.32,0,0,0,0,0,0,0,0,-201020.76,0,0,0,0,0,0,0,0,-976886.6,0,0,0,0,0,0,0,0,-537824.26,0,0,0,0,0,0,0,0,570097.26,0,0,0}; +VT(0.017763535,0.12074209,0,0.023379755,0.12686903,0,0.01788586,0.12850833,0){0,0,1657769.5,0,0,2047772.9,0,0,1616906.9,0,0,-657738.05,0,0,-1065433.1,0,0,-895214.81,0,0,-2054600.3,0,0,-2558991,0,0,-2016472.2,0,0,-581651.26,0,0,-162203.53,0,0,-4802.2192,0,0,1703675.4,0,0,2481221.5,0,0,2014144.7}; +VT(0.016927821,0.11108648,0,0.01198914,0.11616091,0,0.0081152275,0.10988635,0){0,0,1644246.3,0,0,1171325.2,0,0,821145.89,0,0,-340994.5,0,0,-358450.6,0,0,-151361.79,0,0,-1914445.6,0,0,-1420119.3,0,0,-944689.8,0,0,-1176430.8,0,0,-627101.02,0,0,-619246.83,0,0,981584.41,0,0,984768,0,0,439508.43}; +VT(0.1,0.021428571,0,0.095041081,0.024587994,0,0.093571257,0.018380777,0){0,0,0,0,0,597113.29,0,0,774815.13,0,0,0,0,0,557751.32,0,0,746204.54,0,0,0,0,0,481620.22,0,0,690036.86,0,0,0,0,0,373740.48,0,0,608388.09,0,0,0,0,0,241099.33,0,0,504051.02}; +VT(0.093593186,0.28160993,0,0.095069321,0.27540052,0,0.1,0.27857143,0){0,0,74588.283,0,0,76899.446,0,0,0,0,0,-221009.65,0,0,-225624.71,0,0,0,0,0,359269.18,0,0,359465.9,0,0,0,0,0,-484261.41,0,0,-469594.27,0,0,0,0,0,591230.88,0,0,548580.83,0,0,0}; +VT(0.0071591483,0.096788703,0,0.0052460498,0.10332732,0,0,0.1,0){0,0,756711.76,0,0,545715.18,0,0,0,0,0,43634.951,0,0,-33256.292,0,0,0,0,0,-710572.63,0,0,-576983.54,0,0,0,0,0,-795194.2,0,0,-508602.25,0,0,0,0,0,-130859.45,0,0,99155.047,0,0,0}; +VT(0.09416017,0.099511923,0,0.086838536,0.10220901,0,0.087331535,0.0958472,0){0,0,613994.66,0,0,1341203.8,0,0,1318484.3,0,0,5422.3845,0,0,-54099.381,0,0,98077.228,0,0,-608645.22,0,0,-1393108.8,0,0,-1213131.9,0,0,-619557.01,0,0,-1282822.5,0,0,-1401481.2,0,0,-16415.987,0,0,161880.97,0,0,-292629.72}; +VT(0.049204373,0.010884263,0,0.043829005,0.011024747,0,0.046181733,0.0056701177,0){0,0,3873084,0,0,3801549.1,0,0,3851009.3,0,0,3822842.7,0,0,3750937.1,0,0,3837454.5,0,0,3723003.5,0,0,3650381.9,0,0,3810385,0,0,3574883.8,0,0,3501249.8,0,0,3769920.5,0,0,3380124.5,0,0,3305260.3,0,0,3715901.2}; +VT(0.045931579,0.29422002,0,0.043131118,0.28864457,0,0.048791783,0.28884593,0){0,0,116468.36,0,0,225252.57,0,0,226341.07,0,0,-348980.73,0,0,-672574.82,0,0,-675936.71,0,0,580225.36,0,0,1110400.5,0,0,1116322.7,0,0,-809364.6,0,0,-1532552.2,0,0,-1541505,0,0,1035478,0,0,1932837.8,0,0,1945474.1}; +VT(0.020473685,0.087577432,0,0.024499807,0.092422798,0,0.019165757,0.095107709,0){0,0,2087024.2,0,0,2390452.1,0,0,1930971.9,0,0,451292.51,0,0,320672.29,0,0,168744.63,0,0,-1538224.3,0,0,-2026771.7,0,0,-1747493.7,0,0,-2322280.1,0,0,-2619357.9,0,0,-2069009.1,0,0,-1286407.6,0,0,-944222.72,0,0,-502664.26}; +VT(0.041002292,0.08644635,0,0.044548934,0.094607351,0,0.03690243,0.09394169,0){0,0,3351345,0,0,3364209.6,0,0,3135041.5,0,0,787437.3,0,0,323528.56,0,0,337961.95,0,0,-2379027.1,0,0,-3009655.6,0,0,-2760700,0,0,-3725698.5,0,0,-3622750.1,0,0,-3396384.7,0,0,-2222336.9,0,0,-961698.97,0,0,-1002139.6}; +VT(0.049739958,0.088394034,0,0.044548934,0.094607351,0,0.041002292,0.08644635,0){0,0,3472240.4,0,0,3364209.6,0,0,3351345,0,0,703521.31,0,0,323528.56,0,0,787437.3,0,0,-2626240.1,0,0,-3009655.6,0,0,-2379027.1,0,0,-3862017.3,0,0,-3622750.1,0,0,-3725698.5,0,0,-2018648.2,0,0,-961698.97,0,0,-2222336.9}; +VT(0.041319833,0.14315875,0,0.033990129,0.14330646,0,0.038217426,0.13599196,0){0,0,2735557.7,0,0,2486957.5,0,0,2738753.8,0,0,-2343944,0,0,-2138608.5,0,0,-1938161,0,0,-3071175.4,0,0,-2786553.8,0,0,-3305386.1,0,0,1904337.3,0,0,1748365.6,0,0,972060.89,0,0,3343927.4,0,0,3031412.6,0,0,3589652.3}; +VT(0.042857143,0,0,0.046181733,0.0056701177,0,0.039686874,0.0066116125,0){0,0,3783299.5,0,0,3851009.3,0,0,3676489.9,0,0,3783327.5,0,0,3837454.5,0,0,3658909.3,0,0,3783379.6,0,0,3810385,0,0,3623831.1,0,0,3783486.4,0,0,3769920.5,0,0,3571457.2,0,0,3783576.5,0,0,3715901.2,0,0,3501797.4}; +VT(0.03928574,0.29335694,0,0.045931579,0.29422002,0,0.042857143,0.3,0){0,0,127378.94,0,0,116468.36,0,0,0,0,0,-381522.06,0,0,-348980.73,0,0,0,0,0,633829.06,0,0,580225.36,0,0,0,0,0,-883092.25,0,0,-809364.6,0,0,0,0,0,1127859.7,0,0,1035478,0,0,0}; +VT(0.030217898,0.25971254,0,0.027951851,0.26533243,0,0.021957304,0.26060316,0){0,0,660621.26,0,0,539100.43,0,0,505833.44,0,0,-1866014.4,0,0,-1547025.6,0,0,-1432636.8,0,0,2744196,0,0,2353298.6,0,0,2119105.6,0,0,-3141188.1,0,0,-2852826.8,0,0,-2450095.8,0,0,2987009.7,0,0,2980285,0,0,2369995.8}; +VT(0.091053567,0.10618538,0,0.086838536,0.10220901,0,0.09416017,0.099511923,0){0,0,914271.31,0,0,1341203.8,0,0,613994.66,0,0,-104388.15,0,0,-54099.381,0,0,5422.3845,0,0,-1006721.9,0,0,-1393108.8,0,0,-608645.22,0,0,-787386.88,0,0,-1282822.5,0,0,-619557.01,0,0,309052.61,0,0,161880.97,0,0,-16415.987}; +VT(0.0045473776,0.2936365,0,0.010662343,0.29482959,0,0.0071428571,0.3,0){0,0,18406.211,0,0,34537.041,0,0,0,0,0,-55138.333,0,0,-103506.64,0,0,0,0,0,91630.552,0,0,172164.12,0,0,0,0,0,-127724.83,0,0,-240303.04,0,0,0,0,0,162961.08,0,0,307518.14,0,0,0}; +VT(0.01093484,0.12117452,0,0.01198914,0.11616091,0,0.017763535,0.12074209,0){0,0,1052666.9,0,0,1171325.2,0,0,1657769.5,0,0,-426753.37,0,0,-358450.6,0,0,-657738.05,0,0,-1306415.4,0,0,-1420119.3,0,0,-2054600.3,0,0,-350052.21,0,0,-627101.02,0,0,-581651.26,0,0,1098212.1,0,0,984768,0,0,1703675.4}; +VT(0.043491003,0.26677795,0,0.034582704,0.26623209,0,0.037705658,0.25939989,0){0,0,657627.62,0,0,604041.77,0,0,758443.36,0,0,-1894105.9,0,0,-1737386.1,0,0,-2140288.6,0,0,2903724.9,0,0,2655775,0,0,3141072.6,0,0,-3565612.1,0,0,-3245580.1,0,0,-3582615.2,0,0,3800401.2,0,0,3433603.3,0,0,3385872.9}; +VT(0.0071428571,0,0,0.010679145,0.0052482016,0,0.0045481906,0.0063920675,0){0,0,863498.79,0,0,1277155.8,0,0,552257.15,0,0,863505.11,0,0,1273289.3,0,0,549810.55,0,0,863516.31,0,0,1265566.3,0,0,544927.47,0,0,863538.53,0,0,1254019.7,0,0,537633.65,0,0,863596.62,0,0,1238493.9,0,0,527798.54}; +VT(0.020636298,0.17424253,0,0.014405512,0.17061143,0,0.020973714,0.16688371,0){0,0,1433869.3,0,0,1063653,0,0,1525118.3,0,0,-2154082.5,0,0,-1519257.6,0,0,-2061659.5,0,0,-351921.61,0,0,-412907.51,0,0,-799875.51,0,0,2330929.4,0,0,1696192.6,0,0,2343184.8,0,0,-819073.82,0,0,-313907.63,0,0,-24581.749}; +VT(0.018422519,0.27450763,0,0.025044032,0.27464897,0,0.023483408,0.28013687,0){0,0,282501.19,0,0,363665.57,0,0,270985.88,0,0,-827496.14,0,0,-1065519.5,0,0,-801278.39,0,0,1313896,0,0,1692735.8,0,0,1297043.7,0,0,-1707268.8,0,0,-2201379.5,0,0,-1736920.8,0,0,1979556.1,0,0,2555652.6,0,0,2101746.5}; +VT(0.0061411468,0.1246533,0,0.0062042788,0.11791514,0,0.01093484,0.12117452,0){0,0,591118.91,0,0,612847.32,0,0,1052666.9,0,0,-280990.71,0,0,-208741.13,0,0,-426753.37,0,0,-738586.84,0,0,-750565.55,0,0,-1306415.4,0,0,-106527.54,0,0,-286207.66,0,0,-350052.21,0,0,682629.18,0,0,561848.67,0,0,1098212.1}; +VT(0.042557423,0.10832344,0,0.039702853,0.10111678,0,0.047385855,0.10193045,0){0,0,3183930.6,0,0,3175586.8,0,0,3329666.7,0,0,-492142.06,0,0,-64516.934,0,0,-117239.93,0,0,-3600076,0,0,-3238866.3,0,0,-3442848.4,0,0,-2551523.2,0,0,-3108635.2,0,0,-3204510.9,0,0,1442840.6,0,0,193445.51,0,0,350991.89}; +VT(0.0081152275,0.10988635,0,0.0062042788,0.11791514,0,0,0.11428571,0){0,0,821145.89,0,0,612847.32,0,0,0,0,0,-151361.79,0,0,-208741.13,0,0,0,0,0,-944689.8,0,0,-750565.55,0,0,0,0,0,-619246.83,0,0,-286207.66,0,0,0,0,0,439508.43,0,0,561848.67,0,0,0}; +VT(0.067728608,0.12931058,0,0.059246105,0.12763558,0,0.064276416,0.12183086,0){0,0,2567539,0,0,2918223.5,0,0,2809128.6,0,0,-1463631.5,0,0,-1563762.3,0,0,-1175750.5,0,0,-3196956.5,0,0,-3644117.3,0,0,-3492840.6,0,0,89062.443,0,0,-127593.52,0,0,-855220.15,0,0,3235608.2,0,0,3585046,0,0,2995580.4}; +VT(0.0079950318,0.059686314,0,0.004777904,0.053197076,0,0.0094132111,0.052421332,0){0,0,917766.47,0,0,557925.04,0,0,1088603.4,0,0,570756.35,0,0,389224.92,0,0,768702.62,0,0,7912.4367,0,0,102822.82,0,0,222919.17,0,0,-557994.72,0,0,-214698.3,0,0,-388347.22,0,0,-913265.38,0,0,-467537.22,0,0,-885762.83}; +VT(0.064276416,0.12183086,0,0.062195955,0.11505156,0,0.069025318,0.11622387,0){0,0,2809128.6,0,0,2965673.8,0,0,2631986.5,0,0,-1175750.5,0,0,-843057.19,0,0,-808686.45,0,0,-3492840.6,0,0,-3569130.8,0,0,-3192250.9,0,0,-855220.15,0,0,-1711501.2,0,0,-1402768.4,0,0,2995580.4,0,0,2344130.4,0,0,2220554.1}; +VT(0.057323957,0.1204315,0,0.062195955,0.11505156,0,0.064276416,0.12183086,0){0,0,3051716.5,0,0,2965673.8,0,0,2809128.6,0,0,-1191883,0,0,-843057.19,0,0,-1175750.5,0,0,-3778168.4,0,0,-3569130.8,0,0,-3492840.6,0,0,-1110713.1,0,0,-1711501.2,0,0,-855220.15,0,0,3101303,0,0,2344130.4,0,0,2995580.4}; +VT(0.073684623,0.0112317,0,0.074656208,0.0053403125,0,0.081119523,0.0085521597,0){0,0,2850123.3,0,0,2772385.5,0,0,2167108.8,0,0,2810738.2,0,0,2763721.5,0,0,2149779.2,0,0,2732509.2,0,0,2746414.1,0,0,2115263.6,0,0,2616540.6,0,0,2720533.7,0,0,2063869.7,0,0,2464223.2,0,0,2685936.9,0,0,1995657.9}; +VT(0.081165886,0.29137431,0,0.074657371,0.29452352,0,0.073754091,0.28851618,0){0,0,97729.953,0,0,79525.554,0,0,171229.59,0,0,-292395.17,0,0,-238312.39,0,0,-511212.67,0,0,484687.71,0,0,396309.36,0,0,843808.82,0,0,-673055.06,0,0,-552992.95,0,0,-1164215.8,0,0,855744.16,0,0,707611.71,0,0,1467609.3}; +VT(0.064276416,0.12183086,0,0.070840483,0.12204614,0,0.067728608,0.12931058,0){0,0,2809128.6,0,0,2470738.2,0,0,2567539,0,0,-1175750.5,0,0,-1044803.2,0,0,-1463631.5,0,0,-3492840.6,0,0,-3073782.1,0,0,-3196956.5,0,0,-855220.15,0,0,-729197.53,0,0,89062.443,0,0,2995580.4,0,0,2652961,0,0,3235608.2}; +VT(0.058212185,0.089881183,0,0.052532368,0.096036702,0,0.049739958,0.088394034,0){0,0,3344291.6,0,0,3389506.1,0,0,3472240.4,0,0,593905.21,0,0,240670.51,0,0,703521.31,0,0,-2645013.4,0,0,-3131818.5,0,0,-2626240.1,0,0,-3708817.1,0,0,-3594959.1,0,0,-3862017.3,0,0,-1722713.3,0,0,-718569.73,0,0,-2018648.2}; +VT(0.017433092,0.042090914,0,0.013132659,0.04767246,0,0.011573719,0.041901165,0){0,0,1971771.3,0,0,1507774.2,0,0,1347025.1,0,0,1594855,0,0,1139737.5,0,0,1091815.8,0,0,913057.13,0,0,493500.09,0,0,629744.45,0,0,56690.05,0,0,-273193.01,0,0,48353.226,0,0,-810753.02,0,0,-973395.4,0,0,-542301.86}; +VT(0.042155309,0.15589067,0,0.034314476,0.15645926,0,0.037897724,0.149701,0){0,0,2577776.2,0,0,2334400.9,0,0,2552043.8,0,0,-2895603.6,0,0,-2649968.2,0,0,-2536068.8,0,0,-2220826.4,0,0,-1976247.7,0,0,-2567975.2,0,0,3169529.7,0,0,2917237.1,0,0,2520076,0,0,1830012,0,0,1581967.4,0,0,2583694.6}; +VT(0.038427921,0.16264679,0,0.034314476,0.15645926,0,0.042155309,0.15589067,0){0,0,2389351.9,0,0,2334400.9,0,0,2577776.2,0,0,-3020403.6,0,0,-2649968.2,0,0,-2895603.6,0,0,-1591681.4,0,0,-1976247.7,0,0,-2220826.4,0,0,3440909.6,0,0,2917237.1,0,0,3169529.7,0,0,682723.32,0,0,1581967.4,0,0,1830012}; +VT(0.044666369,0.11545829,0,0.040442009,0.11996282,0,0.038084092,0.1145524,0){0,0,3148096.1,0,0,2999410,0,0,2981407.2,0,0,-920013.3,0,0,-1143461.2,0,0,-818508.93,0,0,-3799301.5,0,0,-3706983.7,0,0,-3575257.7,0,0,-1769018.1,0,0,-1150363.3,0,0,-1775238,0,0,2547335.8,0,0,2995190.5,0,0,2287308.3}; +VT(0.041002292,0.08644635,0,0.047307891,0.081963043,0,0.049739958,0.088394034,0){0,0,3351345,0,0,3516083,0,0,3472240.4,0,0,787437.3,0,0,1080946.4,0,0,703521.31,0,0,-2379027.1,0,0,-2102837.3,0,0,-2626240.1,0,0,-3725698.5,0,0,-3830300,0,0,-3862017.3,0,0,-2222336.9,0,0,-2905310.5,0,0,-2018648.2}; +VT(0.09156348,0.14589395,0,0.093938974,0.13899,0,0.1,0.14285714,0){0,0,734092.88,0,0,548364.78,0,0,0,0,0,-670961.7,0,0,-422206.84,0,0,0,0,0,-791796.8,0,0,-645591.08,0,0,0,0,0,602866.55,0,0,273728.87,0,0,0,0,0,843431.47,0,0,708600.91,0,0,0}; +VT(0.1,0.12857143,0,0.093823791,0.12410599,0,0.1,0.12142857,0){0,0,0,0,0,595735.92,0,0,0,0,0,0,0,0,-276601.23,0,0,0,0,0,0,0,0,-743959.63,0,0,0,0,0,0,0,0,-121937.8,0,0,0,0,0,0,0,0,678759.2,0,0,0}; +VT(0.080938662,0.054906318,0,0.073604017,0.054819307,0,0.077364239,0.048764008,0){0,0,2097661.4,0,0,2744584.6,0,0,2450679,0,0,1423084,0,0,1864679.8,0,0,1825420.5,0,0,290856.94,0,0,386939.94,0,0,734405.59,0,0,-934922.56,0,0,-1214908.7,0,0,-544039.45,0,0,-1860365.1,0,0,-2427603.9,0,0,-1683943.8}; +VT(0.082942949,0.21818591,0,0.084319616,0.22565969,0,0.076796159,0.2234596,0){0,0,823054.75,0,0,696453.76,0,0,1008421.8,0,0,-1901094.8,0,0,-1688204.7,0,0,-2411357.4,0,0,1667014.3,0,0,1707540.6,0,0,2346331.8,0,0,-282341.7,0,0,-743250.94,0,0,-852928.84,0,0,-1297502.9,0,0,-649719.93,0,0,-1160000.7}; +VT(0.1,0.27142857,0,0.092520768,0.26920591,0,0.1,0.26428571,0){0,0,0,0,0,145042.72,0,0,0,0,0,0,0,0,-420173.4,0,0,0,0,0,0,0,0,651988.34,0,0,0,0,0,0,0,0,-816598.86,0,0,0,0,0,0,0,0,896908.09,0,0,0}; +VT(0.1,0.035714286,0,0.092450683,0.030760689,0,0.1,0.028571429,0){0,0,0,0,0,900007.85,0,0,0,0,0,0,0,0,807431.66,0,0,0,0,0,0,0,0,631804.95,0,0,0,0,0,0,0,0,391202.83,0,0,0,0,0,0,0,0,110124.82,0,0,0}; +VT(0.045416206,0.061541227,0,0.042113175,0.053290167,0,0.048663579,0.053435419,0){0,0,3642820.9,0,0,3616583.4,0,0,3726394.8,0,0,2181474.8,0,0,2519252.9,0,0,2589713.3,0,0,-155055.51,0,0,657513.67,0,0,663071.82,0,0,-2429600.5,0,0,-1403801.4,0,0,-1465861.1,0,0,-3730025.8,0,0,-3039615.4,0,0,-3147918.6}; +VT(0.038435934,0.058364632,0,0.042113175,0.053290167,0,0.045416206,0.061541227,0){0,0,3459248.5,0,0,3616583.4,0,0,3642820.9,0,0,2206750.4,0,0,2519252.9,0,0,2181474.8,0,0,155241.86,0,0,657513.67,0,0,-155055.51,0,0,-1952496,0,0,-1403801.4,0,0,-2429600.5,0,0,-3353689.4,0,0,-3039615.4,0,0,-3730025.8}; +VT(0.0528723,0.26429657,0,0.055001581,0.27169863,0,0.049721881,0.27094787,0){0,0,718299.05,0,0,565900.8,0,0,588018.61,0,0,-2055661.9,0,0,-1648356.5,0,0,-1710042.9,0,0,3109067.1,0,0,2587095.5,0,0,2675009.8,0,0,-3733060,0,0,-3300283.2,0,0,-3394309,0,0,3841282.5,0,0,3725567.5,0,0,3801713.7}; +VT(0.082516133,0.27647665,0,0.086077973,0.27164165,0,0.089232651,0.27618677,0){0,0,248899.48,0,0,243157.03,0,0,160151.6,0,0,-731674.12,0,0,-708191.99,0,0,-470555.02,0,0,1170289.2,0,0,1111255.9,0,0,751874.95,0,0,-1538273.3,0,0,-1417072.6,0,0,-986723.61,0,0,1813237.5,0,0,1598582.9,0,0,1160401.4}; +VT(0.089183466,0.023798504,0,0.085916752,0.02828,0,0.082332164,0.023444943,0){0,0,1283383.3,0,0,1643257.2,0,0,2029600,0,0,1204105.7,0,0,1500211.7,0,0,1907886.4,0,0,1050439.6,0,0,1226559.7,0,0,1671751.1,0,0,831874.08,0,0,846114.35,0,0,1335359.8,0,0,561630.79,0,0,391827.49,0,0,918760.81}; +VT(0.079063451,0.10043005,0,0.086838536,0.10220901,0,0.082583958,0.10907049,0){0,0,2051820.1,0,0,1341203.8,0,0,1698614.9,0,0,-16056.497,0,0,-54099.381,0,0,-286603.09,0,0,-2067914.3,0,0,-1393108.8,0,0,-1936849,0,0,-2035845.1,0,0,-1282822.5,0,0,-1323464.6,0,0,48244.512,0,0,161880.97,0,0,836522.31}; +VT(0.059543685,0.10776494,0,0.06715469,0.10983132,0,0.062195955,0.11505156,0){0,0,3132791.5,0,0,2794834,0,0,2965673.8,0,0,-451048.14,0,0,-512277.78,0,0,-843057.19,0,0,-3519016.9,0,0,-3213264.7,0,0,-3569130.8,0,0,-2561357.9,0,0,-2112070.8,0,0,-1711501.2,0,0,1326599.2,0,0,1488257.3,0,0,2344130.4}; +VT(0.011838853,0.2301677,0,0.0069516057,0.23320895,0,0.0069979116,0.22643766,0){0,0,504229.49,0,0,288078.49,0,0,317964.48,0,0,-1254859.2,0,0,-728952.19,0,0,-774386.26,0,0,1363834.1,0,0,827497.2,0,0,793599.18,0,0,-775392.51,0,0,-537397.4,0,0,-364658.79,0,0,-209768.04,0,0,-5267.3055,0,0,-270536.88}; +VT(0.070477538,0.15360968,0,0.076625322,0.14929356,0,0.077069107,0.15686929,0){0,0,2153625.7,0,0,1845555.4,0,0,1743907.9,0,0,-2316413.6,0,0,-1818255.1,0,0,-1994600,0,0,-1978592.7,0,0,-1872475.3,0,0,-1457243.4,0,0,2466066.8,0,0,1790618.2,0,0,2204191.1,0,0,1792310.4,0,0,1898765.5,0,0,1140253.2}; +VT(0.09123018,0.070922096,0,0.095795895,0.073622969,0,0.091953893,0.078440357,0){0,0,983713.53,0,0,473503.74,0,0,889726.23,0,0,465586.72,0,0,205720.2,0,0,322434.75,0,0,-297764.17,0,0,-178405.32,0,0,-450550.32,0,0,-904277.98,0,0,-461642.03,0,0,-936443.15,0,0,-1034644.8,0,0,-483922.03,0,0,-825354.72}; +VT(0.041057987,0.068843254,0,0.041803352,0.076750149,0,0.033874053,0.071548869,0){0,0,3488848.8,0,0,3453761.9,0,0,3157862.8,0,0,1752771.3,0,0,1340279.2,0,0,1466537.3,0,0,-855539,0,0,-1593440.1,0,0,-1010259.7,0,0,-3038218.5,0,0,-3552303.7,0,0,-2946084.6,0,0,-3709409.4,0,0,-3337911.6,0,0,-3304540.6}; +VT(0.075422073,0.20645372,0,0.081922129,0.20489902,0,0.081656406,0.2108727,0){0,0,1273700.5,0,0,996952.98,0,0,951384.03,0,0,-2693470,0,0,-2081157.6,0,0,-2083808.1,0,0,1728669,0,0,1266338.6,0,0,1528962.6,0,0,766631.5,0,0,704044.3,0,0,263916.4,0,0,-2583646.6,0,0,-2032271.3,0,0,-1843401}; +VT(0.084206466,0.24009781,0,0.084619556,0.23283838,0,0.092168655,0.23668616,0){0,0,569988.38,0,0,621044.17,0,0,307607.26,0,0,-1492933.9,0,0,-1568398.7,0,0,-792496.69,0,0,1847439,0,0,1771426.2,0,0,941630.33,0,0,-1498530.8,0,0,-1133733.9,0,0,-691810.02,0,0,578923.58,0,0,-42283.716,0,0,148523.72}; +VT(0.092168655,0.23668616,0,0.084619556,0.23283838,0,0.09071018,0.22887426,0){0,0,307607.26,0,0,621044.17,0,0,406264.77,0,0,-792496.69,0,0,-1568398.7,0,0,-1003622.2,0,0,941630.33,0,0,1771426.2,0,0,1069446.3,0,0,-691810.02,0,0,-1133733.9,0,0,-568907.82,0,0,148523.72,0,0,-42283.716,0,0,-233040.27}; +VT(0.071000103,0.28243589,0,0.078222118,0.28277283,0,0.073754091,0.28851618,0){0,0,281581.81,0,0,220930.92,0,0,171229.59,0,0,-835250.62,0,0,-655625.13,0,0,-511212.67,0,0,1360764.9,0,0,1069057.6,0,0,843808.82,0,0,-1840418.5,0,0,-1447830.3,0,0,-1164215.8,0,0,2257916.8,0,0,1779434.3,0,0,1467609.3}; +VT(0.073684623,0.0112317,0,0.078020383,0.017034313,0,0.070691378,0.017050195,0){0,0,2850123.3,0,0,2461848.1,0,0,3076870.7,0,0,2810738.2,0,0,2383750.6,0,0,2979073.3,0,0,2732509.2,0,0,2230032.5,0,0,2786592,0,0,2616540.6,0,0,2005590.6,0,0,2505581.5,0,0,2464223.2,0,0,1717239.5,0,0,2144710.8}; +VT(0.028678488,0.042143634,0,0.022876349,0.043626948,0,0.023478597,0.036718106,0){0,0,2968313.4,0,0,2488553.5,0,0,2561783.8,0,0,2399521.8,0,0,1978130.3,0,0,2187675.4,0,0,1370917.4,0,0,1061959.9,0,0,1494080.3,0,0,79587.615,0,0,-72059.632,0,0,582277.59,0,0,-1227272.3,0,0,-1191549.5,0,0,-414804.14}; +VT(0.053497526,0.1329974,0,0.059246105,0.12763558,0,0.060672554,0.13561545,0){0,0,2959143.9,0,0,2918223.5,0,0,2778852.8,0,0,-1911000.9,0,0,-1563762.3,0,0,-1944873,0,0,-3636096,0,0,-3644117.3,0,0,-3362653.4,0,0,623103.97,0,0,-127593.52,0,0,935707.85,0,0,3857035.6,0,0,3585046,0,0,3643681.7}; +VT(0.087083587,0.13880919,0,0.093938974,0.13899,0,0.09156348,0.14589395,0){0,0,1144744.3,0,0,548364.78,0,0,734092.88,0,0,-877072.07,0,0,-422206.84,0,0,-670961.7,0,0,-1349889.8,0,0,-645591.08,0,0,-791796.8,0,0,561444.4,0,0,273728.87,0,0,602866.55,0,0,1481228.8,0,0,708600.91,0,0,843431.47}; +VT(0.054957014,0.24657048,0,0.049037582,0.25027532,0,0.047556344,0.24377674,0){0,0,1058545,0,0,998508.07,0,0,1122639.4,0,0,-2852831,0,0,-2730849.8,0,0,-2989881.7,0,0,3777171.8,0,0,3739350.2,0,0,3850350.4,0,0,-3549694.2,0,0,-3756698.7,0,0,-3414324.1,0,0,2239441.1,0,0,2778087.3,0,0,1828478.4}; +VT(0.06771074,0.1881525,0,0.07206248,0.1830344,0,0.076430303,0.18837043,0){0,0,1821405.7,0,0,1716055.3,0,0,1444535.6,0,0,-3238423,0,0,-2879815.5,0,0,-2574453.4,0,0,698008.36,0,0,236909.5,0,0,569102.25,0,0,2695511.5,0,0,2719220.1,0,0,2129625.3,0,0,-2795478.4,0,0,-2081132.3,0,0,-2235391.7}; +VT(0.093571257,0.018380777,0,0.095041081,0.024587994,0,0.089183466,0.023798504,0){0,0,774815.13,0,0,597113.29,0,0,1283383.3,0,0,746204.54,0,0,557751.32,0,0,1204105.7,0,0,690036.86,0,0,481620.22,0,0,1050439.6,0,0,608388.09,0,0,373740.48,0,0,831874.08,0,0,504051.02,0,0,241099.33,0,0,561630.79}; +VT(0.089232651,0.27618677,0,0.095069321,0.27540052,0,0.093593186,0.28160993,0){0,0,160151.6,0,0,76899.446,0,0,74588.283,0,0,-470555.02,0,0,-225624.71,0,0,-221009.65,0,0,751874.95,0,0,359465.9,0,0,359269.18,0,0,-986723.61,0,0,-469594.27,0,0,-484261.41,0,0,1160401.4,0,0,548580.83,0,0,591230.88}; +VT(0.017861336,0.10270337,0,0.019165757,0.095107709,0,0.024938414,0.098415267,0){0,0,1773538.4,0,0,1930971.9,0,0,2383058.5,0,0,-87655.931,0,0,168744.63,0,0,68195.72,0,0,-1856823.6,0,0,-1747493.7,0,0,-2312962.3,0,0,-1677437.3,0,0,-2069009.1,0,0,-2447461.4,0,0,261812.45,0,0,-502664.26,0,0,-204726.33}; +VT(0.082583958,0.10907049,0,0.076969725,0.10634022,0,0.079063451,0.10043005,0){0,0,1698614.9,0,0,2181001.1,0,0,2051820.1,0,0,-286603.09,0,0,-255488.75,0,0,-16056.497,0,0,-1936849,0,0,-2406546.5,0,0,-2067914.3,0,0,-1323464.6,0,0,-1869163.7,0,0,-2035845.1,0,0,836522.31,0,0,756176.24,0,0,48244.512}; +VT(0.020473685,0.087577432,0,0.01318623,0.084416193,0,0.019499739,0.079597209,0){0,0,2087024.2,0,0,1411871.7,0,0,2040354.6,0,0,451292.51,0,0,378554.62,0,0,702945.71,0,0,-1538224.3,0,0,-931831.12,0,0,-1095289.5,0,0,-2322280.1,0,0,-1560266,0,0,-2175701.2,0,0,-1286407.6,0,0,-1046999.7,0,0,-1830384.7}; +VT(0.087331535,0.0958472,0,0.086838536,0.10220901,0,0.079063451,0.10043005,0){0,0,1318484.3,0,0,1341203.8,0,0,2051820.1,0,0,98077.228,0,0,-54099.381,0,0,-16056.497,0,0,-1213131.9,0,0,-1393108.8,0,0,-2067914.3,0,0,-1401481.2,0,0,-1282822.5,0,0,-2035845.1,0,0,-292629.72,0,0,161880.97,0,0,48244.512}; +VT(0.019247887,0.048569646,0,0.013132659,0.04767246,0,0.017433092,0.042090914,0){0,0,2135187.8,0,0,1507774.2,0,0,1971771.3,0,0,1594654.5,0,0,1139737.5,0,0,1594855,0,0,650408.09,0,0,493500.09,0,0,913057.13,0,0,-458538.7,0,0,-273193.01,0,0,56690.05,0,0,-1451674.1,0,0,-973395.4,0,0,-810753.02}; +VT(0.071000103,0.28243589,0,0.06660802,0.27624666,0,0.074931673,0.27468874,0){0,0,281581.81,0,0,417349.44,0,0,363389.18,0,0,-835250.62,0,0,-1226359.7,0,0,-1064791.9,0,0,1360764.9,0,0,1959900.4,0,0,1691857.9,0,0,-1840418.5,0,0,-2572844.1,0,0,-2200836.4,0,0,2257916.8,0,0,3027289.2,0,0,2556129.1}; +VT(0.076796159,0.2234596,0,0.084319616,0.22565969,0,0.078984823,0.22953004,0){0,0,1008421.8,0,0,696453.76,0,0,858343.29,0,0,-2411357.4,0,0,-1688204.7,0,0,-2128428.8,0,0,2346331.8,0,0,1707540.6,0,0,2291087.1,0,0,-852928.84,0,0,-743250.94,0,0,-1261656.1,0,0,-1160000.7,0,0,-649719.93,0,0,-424553.92}; +VT(0.087083587,0.13880919,0,0.081009521,0.1385969,0,0.083559522,0.13424014,0){0,0,1144744.3,0,0,1630909.4,0,0,1462145.4,0,0,-877072.07,0,0,-1242340.3,0,0,-981746.52,0,0,-1349889.8,0,0,-1926924,0,0,-1784737.2,0,0,561444.4,0,0,783271.16,0,0,395362.65,0,0,1481228.8,0,0,2113542.9,0,0,1914407.3}; +VT(0,0.057142857,0,0.004777904,0.053197076,0,0.0079950318,0.059686314,0){0,0,0,0,0,557925.04,0,0,917766.47,0,0,0,0,0,389224.92,0,0,570756.35,0,0,0,0,0,102822.82,0,0,7912.4367,0,0,0,0,0,-214698.3,0,0,-557994.72,0,0,0,0,0,-467537.22,0,0,-913265.38}; +VT(0.0079950318,0.059686314,0,0.0062494098,0.068021592,0,0,0.064285714,0){0,0,917766.47,0,0,709501.16,0,0,0,0,0,570756.35,0,0,364477.97,0,0,0,0,0,7912.4367,0,0,-157824.6,0,0,0,0,0,-557994.72,0,0,-603457.47,0,0,0,0,0,-913265.38,0,0,-756039.79,0,0,0}; +VT(0.041057987,0.068843254,0,0.047469022,0.070467195,0,0.041803352,0.076750149,0){0,0,3488848.8,0,0,3608010.8,0,0,3453761.9,0,0,1752771.3,0,0,1730907.5,0,0,1340279.2,0,0,-855539,0,0,-1046792,0,0,-1593440.1,0,0,-3038218.5,0,0,-3280034.9,0,0,-3552303.7,0,0,-3709409.4,0,0,-3807136.9,0,0,-3337911.6}; +VT(0.0071591483,0.096788703,0,0.0067127961,0.088875219,0,0.013428016,0.091778472,0){0,0,756711.76,0,0,725937.81,0,0,1408980.1,0,0,43634.951,0,0,141227.93,0,0,204626.15,0,0,-710572.63,0,0,-557260.38,0,0,-1174648.8,0,0,-795194.2,0,0,-806944.34,0,0,-1549888.7,0,0,-130859.45,0,0,-406936.37,0,0,-600683.83}; +VT(0.081119523,0.0085521597,0,0.074656208,0.0053403125,0,0.078571429,0,0){0,0,2167108.8,0,0,2772385.5,0,0,2419478.6,0,0,2149779.2,0,0,2763721.5,0,0,2419535.2,0,0,2115263.6,0,0,2746414.1,0,0,2419645.1,0,0,2063869.7,0,0,2720533.7,0,0,2419827.2,0,0,1995657.9,0,0,2685936.9,0,0,2420024.4}; +VT(0.078571429,0.3,0,0.074657371,0.29452352,0,0.081165886,0.29137431,0){0,0,0,0,0,79525.554,0,0,97729.953,0,0,0,0,0,-238312.39,0,0,-292395.17,0,0,0,0,0,396309.36,0,0,484687.71,0,0,0,0,0,-552992.95,0,0,-673055.06,0,0,0,0,0,707611.71,0,0,855744.16}; +VT(0.082332164,0.023444943,0,0.078020383,0.017034313,0,0.085905658,0.016824409,0){0,0,2029600,0,0,2461848.1,0,0,1656238,0,0,1907886.4,0,0,2383750.6,0,0,1604967.9,0,0,1671751.1,0,0,2230032.5,0,0,1504009.2,0,0,1335359.8,0,0,2005590.6,0,0,1356492.3,0,0,918760.81,0,0,1717239.5,0,0,1166855}; +VT(0.08596482,0.28314521,0,0.078222118,0.28277283,0,0.082516133,0.27647665,0){0,0,145967.81,0,0,220930.92,0,0,248899.48,0,0,-433371.98,0,0,-655625.13,0,0,-731674.12,0,0,707326.96,0,0,1069057.6,0,0,1170289.2,0,0,-959333.22,0,0,-1447830.3,0,0,-1538273.3,0,0,1181452.3,0,0,1779434.3,0,0,1813237.5}; +VT(0.072908259,0.24139656,0,0.078142774,0.24370973,0,0.071915087,0.24816524,0){0,0,881474.92,0,0,714639.7,0,0,803363.84,0,0,-2322734,0,0,-1902709.3,0,0,-2179152.4,0,0,2916335.3,0,0,2448578.4,0,0,2928525.2,0,0,-2445637.4,0,0,-2167997.3,0,0,-2836050.6,0,0,1082242,0,0,1155455.3,0,0,1927975}; +VT(0.010955873,0.10281868,0,0.013714026,0.097839388,0,0.017861336,0.10270337,0){0,0,1124212.8,0,0,1412613.2,0,0,1773538.4,0,0,-57954.543,0,0,55008.627,0,0,-87655.931,0,0,-1179275.3,0,0,-1355500.2,0,0,-1856823.6,0,0,-1060620.9,0,0,-1463354,0,0,-1677437.3,0,0,173274.75,0,0,-165174.7,0,0,261812.45}; +VT(0,0.092857143,0,0.0067127961,0.088875219,0,0.0071591483,0.096788703,0){0,0,0,0,0,725937.81,0,0,756711.76,0,0,0,0,0,141227.93,0,0,43634.951,0,0,0,0,0,-557260.38,0,0,-710572.63,0,0,0,0,0,-806944.34,0,0,-795194.2,0,0,0,0,0,-406936.37,0,0,-130859.45}; +VT(0.081656406,0.2108727,0,0.086709216,0.20730703,0,0.089437553,0.21298247,0){0,0,951384.03,0,0,734117.03,0,0,556322.48,0,0,-2083808.1,0,0,-1563285.8,0,0,-1238115.4,0,0,1528962.6,0,0,1031586.7,0,0,961021.23,0,0,263916.4,0,0,398134,0,0,60411.18,0,0,-1843401,0,0,-1481512.9,0,0,-1035404.3}; +VT(0.033761495,0.088496681,0,0.030017634,0.093495078,0,0.027903545,0.087518505,0){0,0,3029395.9,0,0,2771844.6,0,0,2674848,0,0,608605.12,0,0,320378.42,0,0,580994.77,0,0,-2298547.5,0,0,-2414486.4,0,0,-1967676.8,0,0,-3368980,0,0,-3014031.4,0,0,-2976106,0,0,-1747439.7,0,0,-948223.96,0,0,-1655065.1}; +VT(0.073708403,0.21517194,0,0.076796159,0.2234596,0,0.069002793,0.22246209,0){0,0,1225969.3,0,0,1008421.8,0,0,1267491.2,0,0,-2772471.1,0,0,-2411357.4,0,0,-3011719.2,0,0,2271379.1,0,0,2346331.8,0,0,2877058.6,0,0,-92677.622,0,0,-852928.84,0,0,-947533.34,0,0,-2155133.8,0,0,-1160000.7,0,0,-1573376.1}; +VT(0.072126291,0.10515927,0,0.065931692,0.10408722,0,0.069968451,0.098831219,0){0,0,2539730.3,0,0,2911358.9,0,0,2730411,0,0,-241283.81,0,0,-218409.17,0,0,57648.531,0,0,-2758172.2,0,0,-3113407,0,0,-2671597.7,0,0,-2254933.2,0,0,-2661455,0,0,-2785714.6,0,0,717337.89,0,0,651464.78,0,0,-173126.8}; +VT(0.066401409,0.0434645,0,0.073234584,0.04253025,0,0.06961584,0.048915995,0){0,0,3289675.8,0,0,2820532.7,0,0,3063466,0,0,2619840.6,0,0,2270240.9,0,0,2277085.6,0,0,1416557.6,0,0,1277003.9,0,0,906160.93,0,0,-75156.319,0,0,34586.382,0,0,-697426.19,0,0,-1551772,0,0,-1214797.7,0,0,-2122325.6}; +VT(0.06961584,0.048915995,0,0.073234584,0.04253025,0,0.077364239,0.048764008,0){0,0,3063466,0,0,2820532.7,0,0,2450679,0,0,2277085.6,0,0,2270240.9,0,0,1825420.5,0,0,906160.93,0,0,1277003.9,0,0,734405.59,0,0,-697426.19,0,0,34586.382,0,0,-544039.45,0,0,-2122325.6,0,0,-1214797.7,0,0,-1683943.8}; +VT(0.030017634,0.093495078,0,0.024499807,0.092422798,0,0.027903545,0.087518505,0){0,0,2771844.6,0,0,2390452.1,0,0,2674848,0,0,320378.42,0,0,320672.29,0,0,580994.77,0,0,-2414486.4,0,0,-2026771.7,0,0,-1967676.8,0,0,-3014031.4,0,0,-2619357.9,0,0,-2976106,0,0,-948223.96,0,0,-944222.72,0,0,-1655065.1}; +VT(0.079265602,0.086677581,0,0.081743274,0.092625466,0,0.07492972,0.092844339,0){0,0,2114636.1,0,0,1862860,0,0,2431427.6,0,0,488789.06,0,0,243386.47,0,0,308451.38,0,0,-1512904.7,0,0,-1587731,0,0,-2083891.4,0,0,-2351470.6,0,0,-2038652.4,0,0,-2656803.1,0,0,-1382326.1,0,0,-717394.49,0,0,-910298.79}; +VT(0.083969261,0.16737329,0,0.083337094,0.16031526,0,0.088381846,0.16289419,0){0,0,1198489.7,0,0,1295652.6,0,0,911153.68,0,0,-1632158.2,0,0,-1575018.8,0,0,-1156470.7,0,0,-607916.58,0,0,-956036.82,0,0,-599768.12,0,0,1852187.2,0,0,1781183.7,0,0,1317920.1,0,0,-62490.334,0,0,571788.58,0,0,244888.24}; +VT(0,0.071428571,0,0.0060853536,0.074713803,0,0,0.078571429,0){0,0,0,0,0,681675.12,0,0,0,0,0,0,0,0,285253.65,0,0,0,0,0,0,0,0,-277070.48,0,0,0,0,0,0,0,0,-678306.76,0,0,0,0,0,0,0,0,-685312.86,0,0,0}; +VT(0.0068768393,0.16098373,0,0.014502412,0.16316663,0,0.0094805882,0.16707285,0){0,0,553409.29,0,0,1121335,0,0,730151.01,0,0,-680450.71,0,0,-1429592.9,0,0,-989834.58,0,0,-397156.36,0,0,-728363.13,0,0,-378084.11,0,0,771605.48,0,0,1629901.1,0,0,1124284.7,0,0,219690.78,0,0,280110.31,0,0,-22095.939}; +VT(0.09123018,0.070922096,0,0.085646934,0.067722415,0,0.09230899,0.063522919,0){0,0,983713.53,0,0,1585902.9,0,0,877619.52,0,0,465586.72,0,0,821166.94,0,0,503392.8,0,0,-297764.17,0,0,-339583.13,0,0,-85524.836,0,0,-904277.98,0,0,-1336670.3,0,0,-638068.15,0,0,-1034644.8,0,0,-1689538.4,0,0,-918939.46}; +VT(0.09230899,0.063522919,0,0.085646934,0.067722415,0,0.08415119,0.061061125,0){0,0,877619.52,0,0,1585902.9,0,0,1759442.9,0,0,503392.8,0,0,821166.94,0,0,1064240.3,0,0,-85524.836,0,0,-339583.13,0,0,-51487.645,0,0,-638068.15,0,0,-1336670.3,0,0,-1146904.2,0,0,-918939.46,0,0,-1689538.4,0,0,-1789550.6}; +VT(0.035619257,0.12028764,0,0.040442009,0.11996282,0,0.038464606,0.12667013,0){0,0,2821397.9,0,0,2999410,0,0,2859316.3,0,0,-1093830.4,0,0,-1143461.2,0,0,-1476046.2,0,0,-3491178.8,0,0,-3706983.7,0,0,-3573486.5,0,0,-1043884.2,0,0,-1150363.3,0,0,-252868.56,0,0,2851838.9,0,0,2995190.5,0,0,3451249.3}; +VT(0.038464606,0.12667013,0,0.040442009,0.11996282,0,0.045375723,0.12284566,0){0,0,2859316.3,0,0,2999410,0,0,3072436,0,0,-1476046.2,0,0,-1143461.2,0,0,-1348503.3,0,0,-3573486.5,0,0,-3706983.7,0,0,-3829159.4,0,0,-252868.56,0,0,-1150363.3,0,0,-800055.99,0,0,3451249.3,0,0,2995190.5,0,0,3380414.3}; +VT(0.051167355,0.022914381,0,0.054261983,0.029107824,0,0.048866761,0.029559705,0){0,0,3850137.8,0,0,3801269,0,0,3831772.8,0,0,3629520.4,0,0,3450822.2,0,0,3467532.3,0,0,3200919.1,0,0,2782228.4,0,0,2773676.3,0,0,2588908.3,0,0,1857139.4,0,0,1816186,0,0,1828396.4,0,0,760852.59,0,0,685852.4}; +VT(0,0.15714286,0,0.0056981356,0.15371602,0,0.0068768393,0.16098373,0){0,0,0,0,0,478995.44,0,0,553409.29,0,0,0,0,0,-516269.88,0,0,-680450.71,0,0,0,0,0,-438816.38,0,0,-397156.36,0,0,0,0,0,550400.04,0,0,771605.48,0,0,0,0,0,395913.98,0,0,219690.78}; +VT(0.029380008,0.16405835,0,0.036146522,0.16944297,0,0.030623168,0.1713445,0){0,0,2021292.5,0,0,2222447.1,0,0,1985985.4,0,0,-2614335.2,0,0,-3121229.8,0,0,-2866418.8,0,0,-1254306.4,0,0,-960241.74,0,0,-715248.18,0,0,2982541.3,0,0,3509731.4,0,0,3183566.3,0,0,378860.61,0,0,-459324.98,0,0,-696442.05}; +VT(0.038427921,0.16264679,0,0.036146522,0.16944297,0,0.029380008,0.16405835,0){0,0,2389351.9,0,0,2222447.1,0,0,2021292.5,0,0,-3020403.6,0,0,-3121229.8,0,0,-2614335.2,0,0,-1591681.4,0,0,-960241.74,0,0,-1254306.4,0,0,3440909.6,0,0,3509731.4,0,0,2982541.3,0,0,682723.32,0,0,-459324.98,0,0,378860.61}; +VT(0.057707972,0.025075094,0,0.054261983,0.029107824,0,0.051167355,0.022914381,0){0,0,3734947.8,0,0,3801269,0,0,3850137.8,0,0,3478918.2,0,0,3450822.2,0,0,3629520.4,0,0,2984396.6,0,0,2782228.4,0,0,3200919.1,0,0,2285289.9,0,0,1857139.4,0,0,2588908.3,0,0,1429238.8,0,0,760852.59,0,0,1828396.4}; +VT(0.033039341,0.023173825,0,0.029163144,0.015558324,0,0.038009007,0.015147577,0){0,0,3318087.9,0,0,3068207,0,0,3597209.6,0,0,3123656.1,0,0,2986953.6,0,0,3506943.3,0,0,2746181,0,0,2826596.5,0,0,3328697.3,0,0,2207795.9,0,0,2591406.1,0,0,3067010.9,0,0,1539940.3,0,0,2287504.7,0,0,2728518.9}; +VT(0.0071428571,0.3,0,0.010662343,0.29482959,0,0.014285714,0.3,0){0,0,0,0,0,34537.041,0,0,0,0,0,0,0,0,-103506.64,0,0,0,0,0,0,0,0,172164.12,0,0,0,0,0,0,0,0,-240303.04,0,0,0,0,0,0,0,0,307518.14,0,0,0}; +VT(0.014285714,0,0,0.010679145,0.0052482016,0,0.0071428571,0,0){0,0,1683701.5,0,0,1277155.8,0,0,863498.79,0,0,1683671.3,0,0,1273289.3,0,0,863505.11,0,0,1683611.9,0,0,1265566.3,0,0,863516.31,0,0,1683542.6,0,0,1254019.7,0,0,863538.53,0,0,1683226,0,0,1238493.9,0,0,863596.62}; +VT(0.0078195435,0.14622426,0,0.0056981356,0.15371602,0,0,0.15,0){0,0,680366.1,0,0,478995.44,0,0,0,0,0,-626541.18,0,0,-516269.88,0,0,0,0,0,-729870.69,0,0,-438816.38,0,0,0,0,0,568744.13,0,0,550400.04,0,0,0,0,0,774663.29,0,0,395913.98,0,0,0}; +VT(0.062195955,0.11505156,0,0.06715469,0.10983132,0,0.069025318,0.11622387,0){0,0,2965673.8,0,0,2794834,0,0,2631986.5,0,0,-843057.19,0,0,-512277.78,0,0,-808686.45,0,0,-3569130.8,0,0,-3213264.7,0,0,-3192250.9,0,0,-1711501.2,0,0,-2112070.8,0,0,-1402768.4,0,0,2344130.4,0,0,1488257.3,0,0,2220554.1}; +VT(0.010955873,0.10281868,0,0.0052460498,0.10332732,0,0.0071591483,0.096788703,0){0,0,1124212.8,0,0,545715.18,0,0,756711.76,0,0,-57954.543,0,0,-33256.292,0,0,43634.951,0,0,-1179275.3,0,0,-576983.54,0,0,-710572.63,0,0,-1060620.9,0,0,-508602.25,0,0,-795194.2,0,0,173274.75,0,0,99155.047,0,0,-130859.45}; +VT(0.059054943,0.066788508,0,0.064846874,0.068845861,0,0.061098586,0.072147464,0){0,0,3499189.3,0,0,3243292.3,0,0,3389933,0,0,1856149.2,0,0,1629296.1,0,0,1545196.6,0,0,-658492.2,0,0,-795531.06,0,0,-1140417.3,0,0,-2864039.1,0,0,-2824516.6,0,0,-3205469.9,0,0,-3725081.1,0,0,-3448034.5,0,0,-3526423.9}; +VT(0.064832361,0.062804408,0,0.064846874,0.068845861,0,0.059054943,0.066788508,0){0,0,3281120.4,0,0,3243292.3,0,0,3499189.3,0,0,1912310.8,0,0,1629296.1,0,0,1856149.2,0,0,-254314.65,0,0,-795531.06,0,0,-658492.2,0,0,-2314932.7,0,0,-2824516.6,0,0,-2864039.1,0,0,-3410309.6,0,0,-3448034.5,0,0,-3725081.1}; +VT(0.016702178,0.061420197,0,0.012193394,0.066188359,0,0.0079950318,0.059686314,0){0,0,1844408.3,0,0,1364188,0,0,917766.47,0,0,1107331.1,0,0,734639.92,0,0,570756.35,0,0,-72241.295,0,0,-233939.49,0,0,7912.4367,0,0,-1222910.6,0,0,-1094586.7,0,0,-557994.72,0,0,-1885264.1,0,0,-1450385,0,0,-913265.38}; +VT(0.029380008,0.16405835,0,0.025851591,0.17077962,0,0.020973714,0.16688371,0){0,0,2021292.5,0,0,1763476.8,0,0,1525118.3,0,0,-2614335.2,0,0,-2524912.6,0,0,-2061659.5,0,0,-1254306.4,0,0,-673288.62,0,0,-799875.51,0,0,2982541.3,0,0,2815714.9,0,0,2343184.8,0,0,378860.61,0,0,-542697.73,0,0,-24581.749}; +VT(0.045331711,0.23557633,0,0.037546984,0.23452457,0,0.041402067,0.22952626,0){0,0,1270563.3,0,0,1205921.7,0,0,1348916.4,0,0,-3255008.9,0,0,-3072707.6,0,0,-3344816,0,0,3813331,0,0,3550700.1,0,0,3600200.4,0,0,-2700862,0,0,-2423829.8,0,0,-1982154,0,0,404484.48,0,0,201013.93,0,0,-667743.82}; +VT(0.018343869,0.21720619,0,0.02301506,0.22157032,0,0.017207343,0.22323305,0){0,0,888277.19,0,0,1025043.6,0,0,781289.63,0,0,-2037897.4,0,0,-2421684.9,0,0,-1865590.4,0,0,1749211,0,0,2274566.1,0,0,1807835.2,0,0,-225952.88,0,0,-677461.35,0,0,-643322.1,0,0,-1457259.1,0,0,-1351813.7,0,0,-915362.92}; +VT(0.02463475,0.21609565,0,0.02301506,0.22157032,0,0.018343869,0.21720619,0){0,0,1153636.1,0,0,1025043.6,0,0,888277.19,0,0,-2626116.1,0,0,-2421684.9,0,0,-2037897.4,0,0,2198315,0,0,2274566.1,0,0,1749211,0,0,-179791.92,0,0,-677461.35,0,0,-225952.88,0,0,-1969098.8,0,0,-1351813.7,0,0,-1457259.1}; +VT(0.077318805,0.23627719,0,0.070607657,0.23670872,0,0.07180958,0.22984275,0){0,0,830868.27,0,0,1007105.3,0,0,1079159.6,0,0,-2136157.9,0,0,-2594870.8,0,0,-2680718.2,0,0,2525048.7,0,0,3083897.2,0,0,2899261.6,0,0,-1830714.2,0,0,-2267120.1,0,0,-1622013.4,0,0,350702.19,0,0,490193.02,0,0,-492395.98}; +VT(0.0071147476,0.24137211,0,0.0043813653,0.24702694,0,0,0.24285714,0){0,0,259907.57,0,0,145794.38,0,0,0,0,0,-684802.64,0,0,-393661.32,0,0,0,0,0,859611.54,0,0,523477.05,0,0,0,0,0,-720499.62,0,0,-496310.62,0,0,0,0,0,317972.39,0,0,320224.07,0,0,0}; +VT(0.079265602,0.086677581,0,0.075872285,0.081656016,0,0.082390534,0.079333541,0){0,0,2114636.1,0,0,2427639,0,0,1865676.5,0,0,488789.06,0,0,758134.07,0,0,650380.91,0,0,-1512904.7,0,0,-1432759.9,0,0,-988603.29,0,0,-2351470.6,0,0,-2638364.3,0,0,-1983689.6,0,0,-1382326.1,0,0,-2029677.1,0,0,-1686881.4}; +VT(0,0.17142857,0,0.0069613667,0.17349451,0,0,0.17857143,0){0,0,0,0,0,517779.21,0,0,0,0,0,0,0,0,-769992.03,0,0,0,0,0,0,0,0,-142713.64,0,0,0,0,0,0,0,0,839532.94,0,0,0,0,0,0,0,0,-266340.1,0,0,0}; +VT(0.038009007,0.015147577,0,0.043829005,0.011024747,0,0.046063037,0.016810165,0){0,0,3597209.6,0,0,3801549.1,0,0,3836060.2,0,0,3506943.3,0,0,3750937.1,0,0,3717529.2,0,0,3328697.3,0,0,3650381.9,0,0,3484126.2,0,0,3067010.9,0,0,3501249.8,0,0,3143090.2,0,0,2728518.9,0,0,3305260.3,0,0,2704667.4}; +VT(0.025221599,0.062165695,0,0.027058874,0.069011929,0,0.01882241,0.070374011,0){0,0,2618029.3,0,0,2727323.5,0,0,2018056.9,0,0,1547191.2,0,0,1363815.9,0,0,970762.8,0,0,-156575.4,0,0,-681543.48,0,0,-580354.6,0,0,-1796512.5,0,0,-2386220.5,0,0,-1830388.5,0,0,-2702051.5,0,0,-2898415.6,0,0,-2130853.3}; +VT(0.077393474,0.16425214,0,0.083337094,0.16031526,0,0.083969261,0.16737329,0){0,0,1650679.7,0,0,1295652.6,0,0,1198489.7,0,0,-2141613.9,0,0,-1575018.8,0,0,-1632158.2,0,0,-1013799.5,0,0,-956036.82,0,0,-607916.58,0,0,2443278.1,0,0,1781183.7,0,0,1852187.2,0,0,287063.28,0,0,571788.58,0,0,-62490.334}; +VT(0.05288218,0.14757716,0,0.054237851,0.14012792,0,0.061244461,0.14481879,0){0,0,2767228.4,0,0,2856617.8,0,0,2643484.5,0,0,-2626819.9,0,0,-2267029,0,0,-2356788.3,0,0,-2900596.1,0,0,-3324577.4,0,0,-2899198.4,0,0,2479722.6,0,0,1580891.3,0,0,2042509.4,0,0,3026446,0,0,3650971.5,0,0,3121060.9}; +VT(0.047918899,0.14257657,0,0.054237851,0.14012792,0,0.05288218,0.14757716,0){0,0,2842478.3,0,0,2856617.8,0,0,2767228.4,0,0,-2400971.6,0,0,-2267029,0,0,-2626819.9,0,0,-3215455,0,0,-3324577.4,0,0,-2900596.1,0,0,1901551.7,0,0,1580891.3,0,0,2479722.6,0,0,3510918.5,0,0,3650971.5,0,0,3026446}; +VT(0.026018946,0.14387862,0,0.022775714,0.15147437,0,0.017312959,0.14496605,0){0,0,2064539,0,0,1786181.8,0,0,1456929,0,0,-1800072.3,0,0,-1841345.2,0,0,-1303417.8,0,0,-2295230.1,0,0,-1729359.8,0,0,-1594293.7,0,0,1506177.8,0,0,1894858,0,0,1135517.7,0,0,2488196.2,0,0,1670732.8,0,0,1713822.2}; +VT(0,0.042857143,0,0.0064812773,0.046734878,0,0,0.05,0){0,0,0,0,0,761350.4,0,0,0,0,0,0,0,0,582610.88,0,0,0,0,0,0,0,0,267082.8,0,0,0,0,0,0,0,0,-111174.21,0,0,0,0,0,0,0,0,-463416.67,0,0,0}; +VT(0.024008584,0.022367291,0,0.029163144,0.015558324,0,0.033039341,0.023173825,0){0,0,2639060.6,0,0,3068207,0,0,3318087.9,0,0,2494948.4,0,0,2986953.6,0,0,3123656.1,0,0,2214593.6,0,0,2826596.5,0,0,2746181,0,0,1813324.4,0,0,2591406.1,0,0,2207795.9,0,0,1312931.3,0,0,2287504.7,0,0,1539940.3}; +VT(0.053497526,0.1329974,0,0.052058531,0.12554764,0,0.059246105,0.12763558,0){0,0,2959143.9,0,0,3065498.6,0,0,2918223.5,0,0,-1911000.9,0,0,-1512626.5,0,0,-1563762.3,0,0,-3636096,0,0,-3831818,0,0,-3644117.3,0,0,623103.97,0,0,-428428.64,0,0,-127593.52,0,0,3857035.6,0,0,3614977.4,0,0,3585046}; +VT(0.020973714,0.16688371,0,0.014502412,0.16316663,0,0.021502186,0.15931359,0){0,0,1525118.3,0,0,1121335,0,0,1630158.4,0,0,-2061659.5,0,0,-1429592.9,0,0,-1947614.2,0,0,-799875.51,0,0,-728363.13,0,0,-1250943.8,0,0,2343184.8,0,0,1629901.1,0,0,2191316.6,0,0,-24581.749,0,0,280110.31,0,0,824223.66}; +VT(0.083292987,0.24598228,0,0.078142774,0.24370973,0,0.084206466,0.24009781,0){0,0,542685.82,0,0,714639.7,0,0,569988.38,0,0,-1458992.1,0,0,-1902709.3,0,0,-1492933.9,0,0,1920780.7,0,0,2448578.4,0,0,1847439,0,0,-1784182,0,0,-2167997.3,0,0,-1498530.8,0,0,1091638.2,0,0,1155455.3,0,0,578923.58}; +VT(0.039686874,0.0066116125,0,0.043829005,0.011024747,0,0.038009007,0.015147577,0){0,0,3676489.9,0,0,3801549.1,0,0,3597209.6,0,0,3658909.3,0,0,3750937.1,0,0,3506943.3,0,0,3623831.1,0,0,3650381.9,0,0,3328697.3,0,0,3571457.2,0,0,3501249.8,0,0,3067010.9,0,0,3501797.4,0,0,3305260.3,0,0,2728518.9}; +VT(0,0.085714286,0,0.0067127961,0.088875219,0,0,0.092857143,0){0,0,0,0,0,725937.81,0,0,0,0,0,0,0,0,141227.93,0,0,0,0,0,0,0,0,-557260.38,0,0,0,0,0,0,0,0,-806944.34,0,0,0,0,0,0,0,0,-406936.37,0,0,0}; +VT(0.036602132,0.28491153,0,0.043131118,0.28864457,0,0.03928574,0.29335694,0){0,0,279518.56,0,0,225252.57,0,0,127378.94,0,0,-831596.18,0,0,-672574.82,0,0,-381522.06,0,0,1362985.6,0,0,1110400.5,0,0,633829.06,0,0,-1860498.2,0,0,-1532552.2,0,0,-883092.25,0,0,2311728.5,0,0,1932837.8,0,0,1127859.7}; +VT(0.023478597,0.036718106,0,0.021348697,0.029751655,0,0.028359285,0.029784535,0){0,0,2561783.8,0,0,2382657.5,0,0,2981166.2,0,0,2187675.4,0,0,2153252.9,0,0,2693525.9,0,0,1494080.3,0,0,1716520.5,0,0,2145980.7,0,0,582277.59,0,0,1114508.8,0,0,1391347.7,0,0,-414804.14,0,0,404958.41,0,0,502245.34}; +VT(0.014305262,0.26641769,0,0.013885016,0.25805955,0,0.021957304,0.26060316,0){0,0,294901.31,0,0,357160.64,0,0,505833.44,0,0,-848621.76,0,0,-1003688.5,0,0,-1432636.8,0,0,1298521.9,0,0,1459712.7,0,0,2119105.6,0,0,-1589572.3,0,0,-1638678.7,0,0,-2450095.8,0,0,1686004.5,0,0,1506406.6,0,0,2369995.8}; +VT(0.050960377,0.23252058,0,0.056766116,0.23329497,0,0.052478219,0.23860916,0){0,0,1342135.9,0,0,1298096.4,0,0,1222305.6,0,0,-3383651.2,0,0,-3286228.7,0,0,-3178913.4,0,0,3804738.6,0,0,3735031.6,0,0,3866354.4,0,0,-2403721.7,0,0,-2434254.7,0,0,-3010118,0,0,-148681.88,0,0,-7070.0355,0,0,951644.63}; +VT(0.027746664,0.13122119,0,0.033010101,0.13109378,0,0.030046638,0.13690443,0){0,0,2296333.1,0,0,2584208,0,0,2369378.2,0,0,-1399007.9,0,0,-1567613,0,0,-1721516.8,0,0,-2843055.5,0,0,-3200932.4,0,0,-2840145.3,0,0,288094.78,0,0,308418.11,0,0,944948.24,0,0,2955532.6,0,0,3322264.5,0,0,3098367.4}; +VT(0.030046638,0.13690443,0,0.033010101,0.13109378,0,0.038217426,0.13599196,0){0,0,2369378.2,0,0,2584208,0,0,2738753.8,0,0,-1721516.8,0,0,-1567613,0,0,-1938161,0,0,-2840145.3,0,0,-3200932.4,0,0,-3305386.1,0,0,944948.24,0,0,308418.11,0,0,972060.89,0,0,3098367.4,0,0,3322264.5,0,0,3589652.3}; +VT(0.077140734,0.17217741,0,0.072573599,0.16764459,0,0.077393474,0.16425214,0){0,0,1584233.7,0,0,1881427.5,0,0,1650679.7,0,0,-2313491.7,0,0,-2572760.4,0,0,-2141613.9,0,0,-519338.58,0,0,-936075.04,0,0,-1013799.5,0,0,2552719.3,0,0,2916777.1,0,0,2443278.1,0,0,-655929.75,0,0,-135849.37,0,0,287063.28}; +VT(0.071059851,0.17209017,0,0.072573599,0.16764459,0,0.077140734,0.17217741,0){0,0,1900690.4,0,0,1881427.5,0,0,1584233.7,0,0,-2772233.4,0,0,-2572760.4,0,0,-2313491.7,0,0,-629520.98,0,0,-936075.04,0,0,-519338.58,0,0,3060958.1,0,0,2916777.1,0,0,2552719.3,0,0,-774142.34,0,0,-135849.37,0,0,-655929.75}; +VT(0.1,0.22142857,0,0.095652827,0.22622146,0,0.091864029,0.22106993,0){0,0,0,0,0,199039.37,0,0,394005.54,0,0,0,0,0,-484109.58,0,0,-927852.61,0,0,0,0,0,494313.66,0,0,863120.02,0,0,0,0,0,-223837.82,0,0,-241435.16,0,0,0,0,0,-173819.74,0,0,-536498.87}; +VT(0.0067127961,0.088875219,0,0.01318623,0.084416193,0,0.013428016,0.091778472,0){0,0,725937.81,0,0,1411871.7,0,0,1408980.1,0,0,141227.93,0,0,378554.62,0,0,204626.15,0,0,-557260.38,0,0,-931831.12,0,0,-1174648.8,0,0,-806944.34,0,0,-1560266,0,0,-1549888.7,0,0,-406936.37,0,0,-1046999.7,0,0,-600683.83}; +VT(0.034786476,0.1076516,0,0.038084092,0.1145524,0,0.030466665,0.11568191,0){0,0,2912738.3,0,0,2981407.2,0,0,2608170,0,0,-413135.58,0,0,-818508.93,0,0,-773675.45,0,0,-3267374.9,0,0,-3575257.7,0,0,-3152461.4,0,0,-2390915.6,0,0,-1775238,0,0,-1443702.3,0,0,1215377.6,0,0,2287308.3,0,0,2136967.4}; +VT(0.1,0.15714286,0,0.093710586,0.16080643,0,0.09308158,0.15403623,0){0,0,0,0,0,507346.27,0,0,579061.91,0,0,0,0,0,-621948.04,0,0,-628036.95,0,0,0,0,0,-366919.85,0,0,-525997.02,0,0,0,0,0,704920.6,0,0,672596.25,0,0,0,0,0,207593.47,0,0,469080.04}; +VT(0.0071428571,0,0,0.0045481906,0.0063920675,0,0,0,0){0,0,863498.79,0,0,552257.15,0,0,0,0,0,863505.11,0,0,549810.55,0,0,0,0,0,863516.31,0,0,544927.47,0,0,0,0,0,863538.53,0,0,537633.65,0,0,0,0,0,863596.62,0,0,527798.54,0,0,0}; +VT(0,0,0,0.0045481906,0.0063920675,0,0,0.0071428571,0){0,0,0,0,0,552257.15,0,0,0,0,0,0,0,0,549810.55,0,0,0,0,0,0,0,0,544927.47,0,0,0,0,0,0,0,0,537633.65,0,0,0,0,0,0,0,0,527798.54,0,0,0}; +VT(0,0.29285714,0,0.0045473776,0.2936365,0,0,0.3,0){0,0,0,0,0,18406.211,0,0,0,0,0,0,0,0,-55138.333,0,0,0,0,0,0,0,0,91630.552,0,0,0,0,0,0,0,0,-127724.83,0,0,0,0,0,0,0,0,162961.08,0,0,0}; +VT(0,0.3,0,0.0045473776,0.2936365,0,0.0071428571,0.3,0){0,0,0,0,0,18406.211,0,0,0,0,0,0,0,0,-55138.333,0,0,0,0,0,0,0,0,91630.552,0,0,0,0,0,0,0,0,-127724.83,0,0,0,0,0,0,0,0,162961.08,0,0,0}; +VT(0.092295863,0.26000779,0,0.095492809,0.25375881,0,0.1,0.25714286,0){0,0,193329.27,0,0,131307.15,0,0,0,0,0,-546576.12,0,0,-363726.6,0,0,0,0,0,805368.84,0,0,512510.07,0,0,0,0,0,-924990.4,0,0,-543451.99,0,0,0,0,0,884724.5,0,0,449348.78,0,0,0}; +VT(0.1,0.042857143,0,0.095360834,0.0462161,0,0.092141527,0.03991184,0){0,0,0,0,0,547145.45,0,0,927649.93,0,0,0,0,0,421466.87,0,0,767955.56,0,0,0,0,0,198977.54,0,0,476054.53,0,0,0,0,0,-69217.008,0,0,102192.68,0,0,0,0,0,-321602.09,0,0,-289378.9}; +VT(0.017861336,0.10270337,0,0.013465065,0.10662372,0,0.010955873,0.10281868,0){0,0,1773538.4,0,0,1351132.7,0,0,1124212.8,0,0,-87655.931,0,0,-165451.82,0,0,-57954.543,0,0,-1856823.6,0,0,-1496410,0,0,-1179275.3,0,0,-1677437.3,0,0,-1147793.4,0,0,-1060620.9,0,0,261812.45,0,0,489093.12,0,0,173274.75}; +VT(0.029690249,0.19362013,0,0.034128539,0.18892309,0,0.036160627,0.1953007,0){0,0,1647856.1,0,0,1872288.6,0,0,1834250.2,0,0,-3101495.4,0,0,-3356683.8,0,0,-3509998.2,0,0,1088093.1,0,0,788949.65,0,0,1372423.7,0,0,2141745.7,0,0,2731311.2,0,0,2256297.6,0,0,-2977851,0,0,-2954777.5,0,0,-3434247.7}; +VT(0.070175425,0.16144206,0,0.065117308,0.15657509,0,0.070477538,0.15360968,0){0,0,2074683.8,0,0,2354870.2,0,0,2153625.7,0,0,-2570674.4,0,0,-2678881.2,0,0,-2316413.6,0,0,-1460177,0,0,-1986291.9,0,0,-1978592.7,0,0,2919916.2,0,0,2952219.2,0,0,2466066.8,0,0,762077.82,0,0,1580034,0,0,1792310.4}; +VT(0.061476805,0.16269562,0,0.065117308,0.15657509,0,0.070175425,0.16144206,0){0,0,2391378.9,0,0,2354870.2,0,0,2074683.8,0,0,-3025373.1,0,0,-2678881.2,0,0,-2570674.4,0,0,-1589341.3,0,0,-1986291.9,0,0,-1460177,0,0,3446908.2,0,0,2952219.2,0,0,2919916.2,0,0,675366.83,0,0,1580034,0,0,762077.82}; +VT(0.016702178,0.061420197,0,0.014691551,0.054118398,0,0.021658338,0.054940441,0){0,0,1844408.3,0,0,1659245.8,0,0,2341024.9,0,0,1107331.1,0,0,1140472.1,0,0,1587273.2,0,0,-72241.295,0,0,265092.56,0,0,322446.89,0,0,-1222910.6,0,0,-693242.8,0,0,-1046241,0,0,-1885264.1,0,0,-1435183.5,0,0,-2078353.5}; +VT(0.029690249,0.19362013,0,0.023309936,0.19197185,0,0.027249449,0.18607819,0){0,0,1647856.1,0,0,1390526.6,0,0,1646413.8,0,0,-3101495.4,0,0,-2573914.4,0,0,-2861109.6,0,0,1088093.1,0,0,799964.88,0,0,464444.42,0,0,2141745.7,0,0,1893175.4,0,0,2518610.9,0,0,-2977851,0,0,-2411477.9,0,0,-2323177.4}; +VT(0.030217898,0.25971254,0,0.033025927,0.25326882,0,0.037705658,0.25939989,0){0,0,660621.26,0,0,809560.38,0,0,758443.36,0,0,-1866014.4,0,0,-2238649.8,0,0,-2140288.6,0,0,2744196,0,0,3142273.3,0,0,3141072.6,0,0,-3141188.1,0,0,-3308331.9,0,0,-3582615.2,0,0,2987009.7,0,0,2697705.3,0,0,3385872.9}; +VT(0.037705658,0.25939989,0,0.033025927,0.25326882,0,0.039157325,0.25334591,0){0,0,758443.36,0,0,809560.38,0,0,884627.38,0,0,-2140288.6,0,0,-2238649.8,0,0,-2446896,0,0,3141072.6,0,0,3142273.3,0,0,3436661.2,0,0,-3582615.2,0,0,-3308331.9,0,0,-3622356.9,0,0,3385872.9,0,0,2697705.3,0,0,2960330.2}; +VT(0.072908259,0.24139656,0,0.070607657,0.23670872,0,0.077318805,0.23627719,0){0,0,881474.92,0,0,1007105.3,0,0,830868.27,0,0,-2322734,0,0,-2594870.8,0,0,-2136157.9,0,0,2916335.3,0,0,3083897.2,0,0,2525048.7,0,0,-2445637.4,0,0,-2267120.1,0,0,-1830714.2,0,0,1082242,0,0,490193.02,0,0,350702.19}; +VT(0.013229009,0.21171696,0,0.0051799073,0.21317882,0,0.007303543,0.20469543,0){0,0,698716.07,0,0,276031.48,0,0,422375.13,0,0,-1540332.8,0,0,-615227.88,0,0,-880191.16,0,0,1156621.3,0,0,479976.29,0,0,531663.92,0,0,147278.69,0,0,25450.705,0,0,303952.91,0,0,-1334554.8,0,0,-511551.59,0,0,-861341.37}; +VT(0.047918899,0.14257657,0,0.045364072,0.14896511,0,0.041319833,0.14315875,0){0,0,2842478.3,0,0,2729630.7,0,0,2735557.7,0,0,-2400971.6,0,0,-2670475.8,0,0,-2343944,0,0,-3215455,0,0,-2787568.3,0,0,-3071175.4,0,0,1901551.7,0,0,2610132.2,0,0,1904337.3,0,0,3510918.5,0,0,2844182.1,0,0,3343927.4}; +VT(0.035714286,0,0,0.031710863,0.0075461758,0,0.028571429,0,0){0,0,3496308.9,0,0,3254919.5,0,0,3033980.1,0,0,3496337.7,0,0,3234618.2,0,0,3033983.4,0,0,3496399.5,0,0,3194153.7,0,0,3033988.7,0,0,3496538.6,0,0,3133832.1,0,0,3034024.4,0,0,3496562.8,0,0,3053845.3,0,0,3033982.5}; +VT(0.028571429,0.3,0,0.031264826,0.29263185,0,0.035714286,0.3,0){0,0,0,0,0,124484.17,0,0,0,0,0,0,0,0,-372709.78,0,0,0,0,0,0,0,0,618717.86,0,0,0,0,0,0,0,0,-861054.65,0,0,0,0,0,0,0,0,1098239.8,0,0,0}; +VT(0.077069107,0.15686929,0,0.083337094,0.16031526,0,0.077393474,0.16425214,0){0,0,1743907.9,0,0,1295652.6,0,0,1650679.7,0,0,-1994600,0,0,-1575018.8,0,0,-2141613.9,0,0,-1457243.4,0,0,-956036.82,0,0,-1013799.5,0,0,2204191.1,0,0,1781183.7,0,0,2443278.1,0,0,1140253.2,0,0,571788.58,0,0,287063.28}; +VT(0.032036001,0.10024616,0,0.030017634,0.093495078,0,0.03690243,0.09394169,0){0,0,2837469.6,0,0,2771844.6,0,0,3135041.5,0,0,-12660.65,0,0,320378.42,0,0,337961.95,0,0,-2850146.6,0,0,-2414486.4,0,0,-2760700,0,0,-2824890.6,0,0,-3014031.4,0,0,-3396384.7,0,0,37524.098,0,0,-948223.96,0,0,-1002139.6}; +VT(0.091953893,0.078440357,0,0.095795895,0.073622969,0,0.1,0.078571429,0){0,0,889726.23,0,0,473503.74,0,0,0,0,0,322434.75,0,0,205720.2,0,0,0,0,0,-450550.32,0,0,-178405.32,0,0,0,0,0,-936443.15,0,0,-461642.03,0,0,0,0,0,-825354.72,0,0,-483922.03,0,0,0}; +VT(0.084206466,0.24009781,0,0.078142774,0.24370973,0,0.077318805,0.23627719,0){0,0,569988.38,0,0,714639.7,0,0,830868.27,0,0,-1492933.9,0,0,-1902709.3,0,0,-2136157.9,0,0,1847439,0,0,2448578.4,0,0,2525048.7,0,0,-1498530.8,0,0,-2167997.3,0,0,-1830714.2,0,0,578923.58,0,0,1155455.3,0,0,350702.19}; +VT(0.021502186,0.15931359,0,0.022775714,0.15147437,0,0.027609688,0.15620978,0){0,0,1630158.4,0,0,1786181.8,0,0,2023546.1,0,0,-1947614.2,0,0,-1841345.2,0,0,-2286520.9,0,0,-1250943.8,0,0,-1729359.8,0,0,-1726415,0,0,2191316.6,0,0,1894858,0,0,2510934.9,0,0,824223.66,0,0,1670732.8,0,0,1400022.9}; +VT(0.0066871595,0.19241823,0,0.005051806,0.19767546,0,0,0.19285714,0){0,0,432113.5,0,0,313084.45,0,0,0,0,0,-803518.34,0,0,-612892.85,0,0,0,0,0,258472.73,0,0,273796.53,0,0,0,0,0,581490.34,0,0,350786.74,0,0,0,0,0,-758588.26,0,0,-609909.8,0,0,0}; +VT(0.013878694,0.17880836,0,0.014405512,0.17061143,0,0.020636298,0.17424253,0){0,0,971566.52,0,0,1063653,0,0,1433869.3,0,0,-1548960.4,0,0,-1519257.6,0,0,-2154082.5,0,0,-51095.574,0,0,-412907.51,0,0,-351921.61,0,0,1579530,0,0,1696192.6,0,0,2330929.4,0,0,-887966.26,0,0,-313907.63,0,0,-819073.82}; +VT(0.02133326,0.24577003,0,0.013821768,0.24617185,0,0.015758122,0.23699049,0){0,0,675269.21,0,0,454053.45,0,0,597291.98,0,0,-1813848.4,0,0,-1221678.8,0,0,-1541119.1,0,0,2383092.9,0,0,1611329.8,0,0,1837947.1,0,0,-2204305.3,0,0,-1502439.1,0,0,-1363109.4,0,0,1333319.6,0,0,928515.88,0,0,315646.37}; +VT(0.049721881,0.27094787,0,0.055001581,0.27169863,0,0.051703203,0.27754162,0){0,0,588018.61,0,0,565900.8,0,0,454636.43,0,0,-1710042.9,0,0,-1648356.5,0,0,-1338881.7,0,0,2675009.8,0,0,2587095.5,0,0,2149437.1,0,0,-3394309,0,0,-3300283.2,0,0,-2841702,0,0,3801713.7,0,0,3725567.5,0,0,3377384.9}; +VT(0.030490983,0.2108424,0,0.036840853,0.20596239,0,0.038843793,0.21103197,0){0,0,1428644.1,0,0,1679916.9,0,0,1637090.1,0,0,-3128471,0,0,-3538121.9,0,0,-3590120.4,0,0,2293671,0,0,2233718.4,0,0,2645890.8,0,0,399562.24,0,0,1067350,0,0,433646.44,0,0,-2769801.9,0,0,-3414669.4,0,0,-3163532.2}; +VT(0.028678488,0.042143634,0,0.030602087,0.036163623,0,0.03663522,0.040674234,0){0,0,2968313.4,0,0,3125169.1,0,0,3463485.9,0,0,2399521.8,0,0,2682310.4,0,0,2844620.6,0,0,1370917.4,0,0,1859340.6,0,0,1717431.6,0,0,79587.615,0,0,772883.67,0,0,283267.24,0,0,-1227272.3,0,0,-423255.99,0,0,-1201989.6}; +VT(0,0.25,0,0.0060491453,0.25298129,0,0,0.25714286,0){0,0,0,0,0,178654.23,0,0,0,0,0,0,0,0,-493529.07,0,0,0,0,0,0,0,0,691183.17,0,0,0,0,0,0,0,0,-724662.05,0,0,0,0,0,0,0,0,585970.08,0,0,0}; +VT(0.024044461,0.20382537,0,0.025476801,0.19755762,0,0.03163445,0.20120488,0){0,0,1283805.9,0,0,1423125.8,0,0,1608414.7,0,0,-2655634.7,0,0,-2782737.9,0,0,-3251875.6,0,0,1553893.8,0,0,1235431.1,0,0,1714266.6,0,0,995311.88,0,0,1602470.1,0,0,1500504,0,0,-2617892.2,0,0,-2766638.2,0,0,-3248047}; +VT(0.065478411,0.24860928,0,0.066600159,0.24211306,0,0.071915087,0.24816524,0){0,0,912058.17,0,0,1004296.2,0,0,803363.84,0,0,-2478342.9,0,0,-2655015,0,0,-2179152.4,0,0,3344041.2,0,0,3359675.2,0,0,2928525.2,0,0,-3264436.9,0,0,-2867211.3,0,0,-2836050.6,0,0,2261773.6,0,0,1352854.8,0,0,1927975}; +VT(0.071915087,0.24816524,0,0.066600159,0.24211306,0,0.072908259,0.24139656,0){0,0,803363.84,0,0,1004296.2,0,0,881474.92,0,0,-2179152.4,0,0,-2655015,0,0,-2322734,0,0,2928525.2,0,0,3359675.2,0,0,2916335.3,0,0,-2836050.6,0,0,-2867211.3,0,0,-2445637.4,0,0,1927975,0,0,1352854.8,0,0,1082242}; +VT(0.032036001,0.10024616,0,0.039702853,0.10111678,0,0.034786476,0.1076516,0){0,0,2837469.6,0,0,3175586.8,0,0,2912738.3,0,0,-12660.65,0,0,-64516.934,0,0,-413135.58,0,0,-2850146.6,0,0,-3238866.3,0,0,-3267374.9,0,0,-2824890.6,0,0,-3108635.2,0,0,-2390915.6,0,0,37524.098,0,0,193445.51,0,0,1215377.6}; +VT(0.047556344,0.24377674,0,0.049037582,0.25027532,0,0.043027686,0.24899973,0){0,0,1122639.4,0,0,998508.07,0,0,999522.33,0,0,-2989881.7,0,0,-2730849.8,0,0,-2720190.5,0,0,3850350.4,0,0,3739350.2,0,0,3683283.3,0,0,-3414324.1,0,0,-3756698.7,0,0,-3620573.8,0,0,1828478.4,0,0,2778087.3,0,0,2549278.8}; +VT(0.070865224,0.080352924,0,0.075872285,0.081656016,0,0.072044079,0.08604506,0){0,0,2808030.6,0,0,2427639,0,0,2688599.4,0,0,934415.1,0,0,758134.07,0,0,649473.83,0,0,-1562677.5,0,0,-1432759.9,0,0,-1882262.6,0,0,-3017110.1,0,0,-2638364.3,0,0,-2986497.2,0,0,-2458745.5,0,0,-2029677.1,0,0,-1825996.4}; +VT(0.021957304,0.26060316,0,0.027951851,0.26533243,0,0.023009638,0.26878949,0){0,0,505833.44,0,0,539100.43,0,0,417665.14,0,0,-1432636.8,0,0,-1547025.6,0,0,-1208783.5,0,0,2119105.6,0,0,2353298.6,0,0,1871958.7,0,0,-2450095.8,0,0,-2852826.8,0,0,-2337004.8,0,0,2369995.8,0,0,2980285,0,0,2554445.3}; +VT(0.081004963,0.27070547,0,0.086077973,0.27164165,0,0.082516133,0.27647665,0){0,0,333174.81,0,0,243157.03,0,0,248899.48,0,0,-968418.7,0,0,-708191.99,0,0,-731674.12,0,0,1513258.3,0,0,1111255.9,0,0,1170289.2,0,0,-1916833.2,0,0,-1417072.6,0,0,-1538273.3,0,0,2141327.9,0,0,1598582.9,0,0,1813237.5}; +VT(0.082332164,0.023444943,0,0.085916752,0.02828,0,0.080699945,0.029142305,0){0,0,2029600,0,0,1643257.2,0,0,2185639.9,0,0,1907886.4,0,0,1500211.7,0,0,1983669.2,0,0,1671751.1,0,0,1226559.7,0,0,1598386.1,0,0,1335359.8,0,0,846114.35,0,0,1065401.8,0,0,918760.81,0,0,391827.49,0,0,433818.71}; +VT(0.047385855,0.10193045,0,0.052532368,0.096036702,0,0.054240748,0.10280037,0){0,0,3329666.7,0,0,3389506.1,0,0,3302360.6,0,0,-117239.93,0,0,240670.51,0,0,-169115.68,0,0,-3442848.4,0,0,-3131818.5,0,0,-3462856.5,0,0,-3204510.9,0,0,-3594959.1,0,0,-3116478.2,0,0,350991.89,0,0,-718569.73,0,0,505791.56}; +VT(0.012549176,0.077039569,0,0.01318623,0.084416193,0,0.0064539684,0.081629255,0){0,0,1370920.5,0,0,1411871.7,0,0,711139.06,0,0,525978.15,0,0,378554.62,0,0,222377.16,0,0,-643140.23,0,0,-931831.12,0,0,-419239.47,0,0,-1415881.7,0,0,-1560266,0,0,-772749.89,0,0,-1316306.1,0,0,-1046999.7,0,0,-595288.06}; +VT(0.054010827,0.25507988,0,0.060567191,0.25172758,0,0.060672356,0.25950081,0){0,0,897184.36,0,0,917440.34,0,0,771273.27,0,0,-2496661.6,0,0,-2522838.3,0,0,-2177172.3,0,0,3553831.7,0,0,3497206.6,0,0,3197356.1,0,0,-3839088.9,0,0,-3596815.5,0,0,-3651078,0,0,3290330.5,0,0,2796536,0,0,3457676.3}; +VT(0.060672356,0.25950081,0,0.060567191,0.25172758,0,0.066803853,0.25459223,0){0,0,771273.27,0,0,917440.34,0,0,789541.66,0,0,-2177172.3,0,0,-2522838.3,0,0,-2193455.3,0,0,3197356.1,0,0,3497206.6,0,0,3110738.9,0,0,-3651078,0,0,-3596815.5,0,0,-3337877,0,0,3457676.3,0,0,2796536,0,0,2824240.3}; +VT(0.092450683,0.030760689,0,0.085916752,0.02828,0,0.089183466,0.023798504,0){0,0,900007.85,0,0,1643257.2,0,0,1283383.3,0,0,807431.66,0,0,1500211.7,0,0,1204105.7,0,0,631804.95,0,0,1226559.7,0,0,1050439.6,0,0,391202.83,0,0,846114.35,0,0,831874.08,0,0,110124.82,0,0,391827.49,0,0,561630.79}; +VT(0.089232651,0.27618677,0,0.086077973,0.27164165,0,0.092520768,0.26920591,0){0,0,160151.6,0,0,243157.03,0,0,145042.72,0,0,-470555.02,0,0,-708191.99,0,0,-420173.4,0,0,751874.95,0,0,1111255.9,0,0,651988.34,0,0,-986723.61,0,0,-1417072.6,0,0,-816598.86,0,0,1160401.4,0,0,1598582.9,0,0,896908.09}; +VT(0.064373335,0.2338171,0,0.065627137,0.22734606,0,0.07180958,0.22984275,0){0,0,1185902.3,0,0,1270705.1,0,0,1079159.6,0,0,-3010536.1,0,0,-3111357.1,0,0,-2680718.2,0,0,3446119.8,0,0,3236198.8,0,0,2899261.6,0,0,-2291596.2,0,0,-1576358.2,0,0,-1622013.4,0,0,79206.699,0,0,-953054.66,0,0,-492395.98}; +VT(0.059957308,0.22757204,0,0.065627137,0.22734606,0,0.064373335,0.2338171,0){0,0,1366903.5,0,0,1270705.1,0,0,1185902.3,0,0,-3351367.9,0,0,-3111357.1,0,0,-3010536.1,0,0,3498598.8,0,0,3236198.8,0,0,3446119.8,0,0,-1727811.3,0,0,-1576358.2,0,0,-2291596.2,0,0,-990620.01,0,0,-953054.66,0,0,79206.699}; +VT(0.027609688,0.15620978,0,0.030440206,0.150204,0,0.034314476,0.15645926,0){0,0,2023546.1,0,0,2239650.6,0,0,2334400.9,0,0,-2286520.9,0,0,-2249230.7,0,0,-2649968.2,0,0,-1726415,0,0,-2230054.7,0,0,-1976247.7,0,0,2510934.9,0,0,2258843.4,0,0,2917237.1,0,0,1400022.9,0,0,2220211.9,0,0,1581967.4}; +VT(0.03690243,0.09394169,0,0.030017634,0.093495078,0,0.033761495,0.088496681,0){0,0,3135041.5,0,0,2771844.6,0,0,3029395.9,0,0,337961.95,0,0,320378.42,0,0,608605.12,0,0,-2760700,0,0,-2414486.4,0,0,-2298547.5,0,0,-3396384.7,0,0,-3014031.4,0,0,-3368980,0,0,-1002139.6,0,0,-948223.96,0,0,-1747439.7}; +VT(0.023478597,0.036718106,0,0.022876349,0.043626948,0,0.017433092,0.042090914,0){0,0,2561783.8,0,0,2488553.5,0,0,1971771.3,0,0,2187675.4,0,0,1978130.3,0,0,1594855,0,0,1494080.3,0,0,1061959.9,0,0,913057.13,0,0,582277.59,0,0,-72059.632,0,0,56690.05,0,0,-414804.14,0,0,-1191549.5,0,0,-810753.02}; +VT(0,0.064285714,0,0.0062494098,0.068021592,0,0,0.071428571,0){0,0,0,0,0,709501.16,0,0,0,0,0,0,0,0,364477.97,0,0,0,0,0,0,0,0,-157824.6,0,0,0,0,0,0,0,0,-603457.47,0,0,0,0,0,0,0,0,-756039.79,0,0,0}; +VT(0.020973714,0.16688371,0,0.025851591,0.17077962,0,0.020636298,0.17424253,0){0,0,1525118.3,0,0,1763476.8,0,0,1433869.3,0,0,-2061659.5,0,0,-2524912.6,0,0,-2154082.5,0,0,-799875.51,0,0,-673288.62,0,0,-351921.61,0,0,2343184.8,0,0,2815714.9,0,0,2330929.4,0,0,-24581.749,0,0,-542697.73,0,0,-819073.82}; +VT(0.075488644,0.14176328,0,0.081009521,0.1385969,0,0.08264437,0.14444108,0){0,0,1990888.2,0,0,1630909.4,0,0,1463951.5,0,0,-1647841.2,0,0,-1242340.3,0,0,-1293607.4,0,0,-2274843.7,0,0,-1926924,0,0,-1614532.1,0,0,1255935.2,0,0,783271.16,0,0,1105781,0,0,2491166.6,0,0,2113542.9,0,0,1743195.6}; +VT(0.01180171,0.25230222,0,0.013885016,0.25805955,0,0.0098751756,0.25600949,0){0,0,347512.04,0,0,357160.64,0,0,270470.11,0,0,-957611.77,0,0,-1003688.5,0,0,-755004.71,0,0,1333704.3,0,0,1459712.7,0,0,1082095.4,0,0,-1383899.6,0,0,-1638678.7,0,0,-1183544.7,0,0,1095718.6,0,0,1506406.6,0,0,1038261.4}; +VT(0.0064539684,0.081629255,0,0.01318623,0.084416193,0,0.0067127961,0.088875219,0){0,0,711139.06,0,0,1411871.7,0,0,725937.81,0,0,222377.16,0,0,378554.62,0,0,141227.93,0,0,-419239.47,0,0,-931831.12,0,0,-557260.38,0,0,-772749.89,0,0,-1560266,0,0,-806944.34,0,0,-595288.06,0,0,-1046999.7,0,0,-406936.37}; +VT(0.034786476,0.1076516,0,0.039702853,0.10111678,0,0.042557423,0.10832344,0){0,0,2912738.3,0,0,3175586.8,0,0,3183930.6,0,0,-413135.58,0,0,-64516.934,0,0,-492142.06,0,0,-3267374.9,0,0,-3238866.3,0,0,-3600076,0,0,-2390915.6,0,0,-3108635.2,0,0,-2551523.2,0,0,1215377.6,0,0,193445.51,0,0,1442840.6}; +VT(0.064373335,0.2338171,0,0.056766116,0.23329497,0,0.059957308,0.22757204,0){0,0,1185902.3,0,0,1298096.4,0,0,1366903.5,0,0,-3010536.1,0,0,-3286228.7,0,0,-3351367.9,0,0,3446119.8,0,0,3735031.6,0,0,3498598.8,0,0,-2291596.2,0,0,-2434254.7,0,0,-1727811.3,0,0,79206.699,0,0,-7070.0355,0,0,-990620.01}; +VT(0.071000103,0.28243589,0,0.069147655,0.28722413,0,0.063469548,0.28521738,0){0,0,281581.81,0,0,213884.16,0,0,273598.49,0,0,-835250.62,0,0,-637821.62,0,0,-814255.31,0,0,1360764.9,0,0,1050341,0,0,1335465.2,0,0,-1840418.5,0,0,-1444059.1,0,0,-1824812,0,0,2257916.8,0,0,1811586.6,0,0,2270429.1}; +VT(0.073754091,0.28851618,0,0.069147655,0.28722413,0,0.071000103,0.28243589,0){0,0,171229.59,0,0,213884.16,0,0,281581.81,0,0,-511212.67,0,0,-637821.62,0,0,-835250.62,0,0,843808.82,0,0,1050341,0,0,1360764.9,0,0,-1164215.8,0,0,-1444059.1,0,0,-1840418.5,0,0,1467609.3,0,0,1811586.6,0,0,2257916.8}; +VT(0.064075209,0.013493001,0,0.069232026,0.01217315,0,0.070691378,0.017050195,0){0,0,3498581.2,0,0,3187096.8,0,0,3076870.7,0,0,3428890.3,0,0,3135369.8,0,0,2979073.3,0,0,3290906.4,0,0,3032749.5,0,0,2786592,0,0,3087427.7,0,0,2880922.9,0,0,2505581.5,0,0,2822154,0,0,2682056.5,0,0,2144710.8}; +VT(0.070691378,0.017050195,0,0.069232026,0.01217315,0,0.073684623,0.0112317,0){0,0,3076870.7,0,0,3187096.8,0,0,2850123.3,0,0,2979073.3,0,0,3135369.8,0,0,2810738.2,0,0,2786592,0,0,3032749.5,0,0,2732509.2,0,0,2505581.5,0,0,2880922.9,0,0,2616540.6,0,0,2144710.8,0,0,2682056.5,0,0,2464223.2}; +VT(0.062992669,0.22303634,0,0.065627137,0.22734606,0,0.059957308,0.22757204,0){0,0,1396775.9,0,0,1270705.1,0,0,1366903.5,0,0,-3331109.7,0,0,-3111357.1,0,0,-3351367.9,0,0,3216330,0,0,3236198.8,0,0,3498598.8,0,0,-1122974.8,0,0,-1576358.2,0,0,-1727811.3,0,0,-1661551.4,0,0,-953054.66,0,0,-990620.01}; +VT(0.007303543,0.20469543,0,0.005051806,0.19767546,0,0.011268327,0.1984065,0){0,0,422375.13,0,0,313084.45,0,0,682302.12,0,0,-880191.16,0,0,-612892.85,0,0,-1344805.9,0,0,531663.92,0,0,273796.53,0,0,623458.07,0,0,303952.91,0,0,350786.74,0,0,739532.85,0,0,-861341.37,0,0,-609909.8,0,0,-1341727.7}; +VT(0.054876921,0.07294965,0,0.047469022,0.070467195,0,0.052494391,0.065958781,0){0,0,3558755.8,0,0,3608010.8,0,0,3640248,0,0,1580988.4,0,0,1730907.5,0,0,1971511.2,0,0,-1275447.3,0,0,-1046792,0,0,-601016.65,0,0,-3423192.1,0,0,-3280034.9,0,0,-2898090,0,0,-3669097.1,0,0,-3807136.9,0,0,-3866942}; +VT(0.041803352,0.076750149,0,0.047469022,0.070467195,0,0.049165273,0.076760106,0){0,0,3453761.9,0,0,3608010.8,0,0,3570137.5,0,0,1340279.2,0,0,1730907.5,0,0,1384898,0,0,-1593440.1,0,0,-1046792,0,0,-1648055.9,0,0,-3552303.7,0,0,-3280034.9,0,0,-3672308.6,0,0,-3337911.6,0,0,-3807136.9,0,0,-3449021.3}; +VT(0,0.23571429,0,0.0069516057,0.23320895,0,0.0071147476,0.24137211,0){0,0,0,0,0,288078.49,0,0,259907.57,0,0,0,0,0,-728952.19,0,0,-684802.64,0,0,0,0,0,827497.2,0,0,859611.54,0,0,0,0,0,-537397.4,0,0,-720499.62,0,0,0,0,0,-5267.3055,0,0,317972.39}; +VT(0.038597539,0.20095921,0,0.036840853,0.20596239,0,0.03163445,0.20120488,0){0,0,1801301.7,0,0,1679916.9,0,0,1608414.7,0,0,-3633864.6,0,0,-3538121.9,0,0,-3251875.6,0,0,1895634,0,0,2233718.4,0,0,1714266.6,0,0,1705394,0,0,1067350,0,0,1500504,0,0,-3630918.1,0,0,-3414669.4,0,0,-3248047}; +VT(0.033874053,0.071548869,0,0.041803352,0.076750149,0,0.032911969,0.081185013,0){0,0,3157862.8,0,0,3453761.9,0,0,3037931.3,0,0,1466537.3,0,0,1340279.2,0,0,971274.35,0,0,-1010259.7,0,0,-1593440.1,0,0,-1756226.8,0,0,-2946084.6,0,0,-3552303.7,0,0,-3289165.4,0,0,-3304540.6,0,0,-3337911.6,0,0,-2584916.3}; +VT(0.1,0.05,0,0.095360834,0.0462161,0,0.1,0.042857143,0){0,0,0,0,0,547145.45,0,0,0,0,0,0,0,0,421466.87,0,0,0,0,0,0,0,0,198977.54,0,0,0,0,0,0,0,0,-69217.008,0,0,0,0,0,0,0,0,-321602.09,0,0,0}; +VT(0.069025318,0.11622387,0,0.070840483,0.12204614,0,0.064276416,0.12183086,0){0,0,2631986.5,0,0,2470738.2,0,0,2809128.6,0,0,-808686.45,0,0,-1044803.2,0,0,-1175750.5,0,0,-3192250.9,0,0,-3073782.1,0,0,-3492840.6,0,0,-1402768.4,0,0,-729197.53,0,0,-855220.15,0,0,2220554.1,0,0,2652961,0,0,2995580.4}; +VT(0.1,0.25714286,0,0.095492809,0.25375881,0,0.1,0.25,0){0,0,0,0,0,131307.15,0,0,0,0,0,0,0,0,-363726.6,0,0,0,0,0,0,0,0,512510.07,0,0,0,0,0,0,0,0,-543451.99,0,0,0,0,0,0,0,0,449348.78,0,0,0}; +VT(0,0.11428571,0,0.0062042788,0.11791514,0,0,0.12142857,0){0,0,0,0,0,612847.32,0,0,0,0,0,0,0,0,-208741.13,0,0,0,0,0,0,0,0,-750565.55,0,0,0,0,0,0,0,0,-286207.66,0,0,0,0,0,0,0,0,561848.67,0,0,0}; +VT(0.092141527,0.03991184,0,0.095360834,0.0462161,0,0.08974924,0.047235181,0){0,0,927649.93,0,0,547145.45,0,0,1190814.4,0,0,767955.56,0,0,421466.87,0,0,905328.07,0,0,476054.53,0,0,198977.54,0,0,402804.56,0,0,102192.68,0,0,-69217.008,0,0,-196265.4,0,0,-289378.9,0,0,-321602.09,0,0,-748421.11}; +VT(0.090077759,0.25268961,0,0.095492809,0.25375881,0,0.092295863,0.26000779,0){0,0,291813.61,0,0,131307.15,0,0,193329.27,0,0,-805257.31,0,0,-363726.6,0,0,-546576.12,0,0,1125037.4,0,0,512510.07,0,0,805368.84,0,0,-1174248.1,0,0,-543451.99,0,0,-924990.4,0,0,940920.06,0,0,449348.78,0,0,884724.5}; +VT(0.054010827,0.25507988,0,0.049037582,0.25027532,0,0.054957014,0.24657048,0){0,0,897184.36,0,0,998508.07,0,0,1058545,0,0,-2496661.6,0,0,-2730849.8,0,0,-2852831,0,0,3553831.7,0,0,3739350.2,0,0,3777171.8,0,0,-3839088.9,0,0,-3756698.7,0,0,-3549694.2,0,0,3290330.5,0,0,2778087.3,0,0,2239441.1}; +VT(0,0.19285714,0,0.005051806,0.19767546,0,0,0.2,0){0,0,0,0,0,313084.45,0,0,0,0,0,0,0,0,-612892.85,0,0,0,0,0,0,0,0,273796.53,0,0,0,0,0,0,0,0,350786.74,0,0,0,0,0,0,0,0,-609909.8,0,0,0}; +VT(0.024938414,0.098415267,0,0.030017634,0.093495078,0,0.032036001,0.10024616,0){0,0,2383058.5,0,0,2771844.6,0,0,2837469.6,0,0,68195.72,0,0,320378.42,0,0,-12660.65,0,0,-2312962.3,0,0,-2414486.4,0,0,-2850146.6,0,0,-2447461.4,0,0,-3014031.4,0,0,-2824890.6,0,0,-204726.33,0,0,-948223.96,0,0,37524.098}; +VT(0.06966854,0.20076802,0,0.064671223,0.19505087,0,0.071449289,0.19423207,0){0,0,1570520.4,0,0,1815232.4,0,0,1594804.6,0,0,-3162888.4,0,0,-3465163,0,0,-3019964.8,0,0,1636334.6,0,0,1334352.3,0,0,1103926.4,0,0,1503948.1,0,0,2252470.6,0,0,2033518.7,0,0,-3161601.9,0,0,-3382100.5,0,0,-2921575.1}; +VT(0.060432552,0.20227914,0,0.064671223,0.19505087,0,0.06966854,0.20076802,0){0,0,1798951.1,0,0,1815232.4,0,0,1570520.4,0,0,-3671781.8,0,0,-3465163,0,0,-3162888.4,0,0,2023610.8,0,0,1334352.3,0,0,1636334.6,0,0,1565241.8,0,0,2252470.6,0,0,1503948.1,0,0,-3653837,0,0,-3382100.5,0,0,-3161601.9}; +VT(0.014210915,0.13228117,0,0.012365279,0.12660144,0,0.01788586,0.12850833,0){0,0,1289449.4,0,0,1158576.2,0,0,1616906.9,0,0,-813665.75,0,0,-596487.84,0,0,-895214.81,0,0,-1589638.3,0,0,-1447959.2,0,0,-2016472.2,0,0,227067.92,0,0,-105993.81,0,0,-4802.2192,0,0,1673024.3,0,0,1396357.8,0,0,2014144.7}; +VT(0.0072553778,0.13224921,0,0.012365279,0.12660144,0,0.014210915,0.13228117,0){0,0,674958.82,0,0,1158576.2,0,0,1289449.4,0,0,-425463.67,0,0,-596487.84,0,0,-813665.75,0,0,-832230.25,0,0,-1447959.2,0,0,-1589638.3,0,0,117822.57,0,0,-105993.81,0,0,227067.92,0,0,875622.71,0,0,1396357.8,0,0,1673024.3}; +VT(0.030575169,0.1246812,0,0.023379755,0.12686903,0,0.025139549,0.12057635,0){0,0,2526238.7,0,0,2047772.9,0,0,2224740.3,0,0,-1202245.8,0,0,-1065433.1,0,0,-875333.98,0,0,-3156412.2,0,0,-2558991,0,0,-2755721.9,0,0,-451924.48,0,0,-162203.53,0,0,-796179.51,0,0,2919641.1,0,0,2481221.5,0,0,2272644.8}; +VT(0.036160627,0.1953007,0,0.034128539,0.18892309,0,0.039366597,0.19088868,0){0,0,1834250.2,0,0,1872288.6,0,0,1982365.2,0,0,-3509998.2,0,0,-3356683.8,0,0,-3628592.6,0,0,1372423.7,0,0,788949.65,0,0,1030950.1,0,0,2256297.6,0,0,2731311.2,0,0,2772526.5,0,0,-3434247.7,0,0,-2954777.5,0,0,-3333638.5}; +VT(0.041319833,0.14315875,0,0.045364072,0.14896511,0,0.037897724,0.149701,0){0,0,2735557.7,0,0,2729630.7,0,0,2552043.8,0,0,-2343944,0,0,-2670475.8,0,0,-2536068.8,0,0,-3071175.4,0,0,-2787568.3,0,0,-2567975.2,0,0,1904337.3,0,0,2610132.2,0,0,2520076,0,0,3343927.4,0,0,2844182.1,0,0,2583694.6}; +VT(0.0058133292,0.032528446,0,0.0063343033,0.038958017,0,0,0.035714286,0){0,0,694559.72,0,0,751213.74,0,0,0,0,0,614750.96,0,0,627892.11,0,0,0,0,0,464300.7,0,0,401490.67,0,0,0,0,0,260495.38,0,0,109174.99,0,0,0,0,0,26512.55,0,0,-201236.23,0,0,0}; +VT(0.045044357,0.28188841,0,0.045592054,0.27439642,0,0.051703203,0.27754162,0){0,0,362990.51,0,0,513714.39,0,0,454636.43,0,0,-1075960.6,0,0,-1504437.2,0,0,-1338881.7,0,0,1750378.7,0,0,2387679.2,0,0,2149437.1,0,0,-2362097.1,0,0,-3100344.3,0,0,-2841702,0,0,2889034,0,0,3591305.7,0,0,3377384.9}; +VT(0.068476894,0.0069177029,0,0.06203594,0.0060944193,0,0.064285714,0,0){0,0,3242851.4,0,0,3604620.2,0,0,3496327.6,0,0,3225849.8,0,0,3589956.2,0,0,3496358.5,0,0,3191931.3,0,0,3560685.5,0,0,3496415,0,0,3141298.2,0,0,3516960.1,0,0,3496523.2,0,0,3073847.6,0,0,3458793.9,0,0,3496472.9}; +VT(0.064285714,0.3,0,0.061805884,0.29356168,0,0.068366879,0.29272708,0){0,0,0,0,0,121923.05,0,0,123803.43,0,0,0,0,0,-365207.83,0,0,-370697.46,0,0,0,0,0,606815.62,0,0,615462.12,0,0,0,0,0,-845641.09,0,0,-856697.17,0,0,0,0,0,1080583.1,0,0,1092834.3}; +VT(0.07180958,0.22984275,0,0.065627137,0.22734606,0,0.069002793,0.22246209,0){0,0,1079159.6,0,0,1270705.1,0,0,1267491.2,0,0,-2680718.2,0,0,-3111357.1,0,0,-3011719.2,0,0,2899261.6,0,0,3236198.8,0,0,2877058.6,0,0,-1622013.4,0,0,-1576358.2,0,0,-947533.34,0,0,-492395.98,0,0,-953054.66,0,0,-1573376.1}; +VT(0.066925078,0.074981916,0,0.060416267,0.076932239,0,0.061098586,0.072147464,0){0,0,3090390.8,0,0,3380545.3,0,0,3389933,0,0,1280900.5,0,0,1302521.2,0,0,1545196.6,0,0,-1278621.5,0,0,-1576156.6,0,0,-1140417.3,0,0,-3089611.2,0,0,-3485992.8,0,0,-3205469.9,0,0,-3091904.4,0,0,-3253298.6,0,0,-3526423.9}; +VT(0.064352171,0.083117586,0,0.060416267,0.076932239,0,0.066925078,0.074981916,0){0,0,3167194.8,0,0,3380545.3,0,0,3090390.8,0,0,915483.69,0,0,1302521.2,0,0,1280900.5,0,0,-1987167.2,0,0,-1576156.6,0,0,-1278621.5,0,0,-3477240.4,0,0,-3485992.8,0,0,-3089611.2,0,0,-2495770,0,0,-3253298.6,0,0,-3091904.4}; +VT(0.0060491453,0.25298129,0,0.01180171,0.25230222,0,0.0098751756,0.25600949,0){0,0,178654.23,0,0,347512.04,0,0,270470.11,0,0,-493529.07,0,0,-957611.77,0,0,-755004.71,0,0,691183.17,0,0,1333704.3,0,0,1082095.4,0,0,-724662.05,0,0,-1383899.6,0,0,-1183544.7,0,0,585970.08,0,0,1095718.6,0,0,1038261.4}; +VT(0.0087429334,0.24792416,0,0.01180171,0.25230222,0,0.0060491453,0.25298129,0){0,0,283453.34,0,0,347512.04,0,0,178654.23,0,0,-768118.62,0,0,-957611.77,0,0,-493529.07,0,0,1029935.2,0,0,1333704.3,0,0,691183.17,0,0,-992967.39,0,0,-1383899.6,0,0,-724662.05,0,0,667809.3,0,0,1095718.6,0,0,585970.08}; +VT(0.055202425,0.1814475,0,0.061291474,0.18447479,0,0.055890502,0.18802963,0){0,0,2227021.2,0,0,2069396,0,0,2110328.4,0,0,-3667462.5,0,0,-3531333.7,0,0,-3747121.1,0,0,145084.74,0,0,425331.11,0,0,795966.68,0,0,3573754.5,0,0,3230965.1,0,0,3129878.5,0,0,-2457046.3,0,0,-2708277.6,0,0,-3224012.4}; +VT(0.025350652,0.23917347,0,0.033139613,0.24047735,0,0.029124573,0.24658198,0){0,0,868665.73,0,0,1026889.2,0,0,849052.23,0,0,-2265304,0,0,-2694450.7,0,0,-2288340.2,0,0,2773502.3,0,0,3348643.4,0,0,3030093.5,0,0,-2193941.8,0,0,-2743423.6,0,0,-2848204.4,0,0,753574.67,0,0,1106136.5,0,0,1797881.3}; +VT(0,0.12142857,0,0.0061411468,0.1246533,0,0,0.12857143,0){0,0,0,0,0,591118.91,0,0,0,0,0,0,0,0,-280990.71,0,0,0,0,0,0,0,0,-738586.84,0,0,0,0,0,0,0,0,-106527.54,0,0,0,0,0,0,0,0,682629.18,0,0,0}; +VT(0.03163445,0.20120488,0,0.036160627,0.1953007,0,0.038597539,0.20095921,0){0,0,1608414.7,0,0,1834250.2,0,0,1801301.7,0,0,-3251875.6,0,0,-3509998.2,0,0,-3633864.6,0,0,1714266.6,0,0,1372423.7,0,0,1895634,0,0,1500504,0,0,2256297.6,0,0,1705394,0,0,-3248047,0,0,-3434247.7,0,0,-3630918.1}; +VT(0.029690249,0.19362013,0,0.036160627,0.1953007,0,0.03163445,0.20120488,0){0,0,1647856.1,0,0,1834250.2,0,0,1608414.7,0,0,-3101495.4,0,0,-3509998.2,0,0,-3251875.6,0,0,1088093.1,0,0,1372423.7,0,0,1714266.6,0,0,2141745.7,0,0,2256297.6,0,0,1500504,0,0,-2977851,0,0,-3434247.7,0,0,-3248047}; +VT(0,0.17142857,0,0.0046637588,0.16745308,0,0.0069613667,0.17349451,0){0,0,0,0,0,362371.83,0,0,517779.21,0,0,0,0,0,-494096.85,0,0,-769992.03,0,0,0,0,0,-182769.85,0,0,-142713.64,0,0,0,0,0,560561.48,0,0,839532.94,0,0,0,0,0,-21256.565,0,0,-266340.1}; +VT(0.034314476,0.15645926,0,0.030440206,0.150204,0,0.037897724,0.149701,0){0,0,2334400.9,0,0,2239650.6,0,0,2552043.8,0,0,-2649968.2,0,0,-2249230.7,0,0,-2536068.8,0,0,-1976247.7,0,0,-2230054.7,0,0,-2567975.2,0,0,2917237.1,0,0,2258843.4,0,0,2520076,0,0,1581967.4,0,0,2220211.9,0,0,2583694.6}; +VT(0.077393474,0.16425214,0,0.072573599,0.16764459,0,0.070175425,0.16144206,0){0,0,1650679.7,0,0,1881427.5,0,0,2074683.8,0,0,-2141613.9,0,0,-2572760.4,0,0,-2570674.4,0,0,-1013799.5,0,0,-936075.04,0,0,-1460177,0,0,2443278.1,0,0,2916777.1,0,0,2919916.2,0,0,287063.28,0,0,-135849.37,0,0,762077.82}; +VT(0.050398693,0.1921099,0,0.055890502,0.18802963,0,0.057391395,0.19462543,0){0,0,2077292.2,0,0,2110328.4,0,0,1979510.6,0,0,-3850553.1,0,0,-3747121.1,0,0,-3763012.6,0,0,1209682,0,0,795966.68,0,0,1410875.8,0,0,2818064.5,0,0,3129878.5,0,0,2491970.2,0,0,-3615771.1,0,0,-3224012.4,0,0,-3656419.8}; +VT(0.057391395,0.19462543,0,0.055890502,0.18802963,0,0.06137482,0.19024807,0){0,0,1979510.6,0,0,2110328.4,0,0,1976038.9,0,0,-3763012.6,0,0,-3747121.1,0,0,-3592882,0,0,1410875.8,0,0,795966.68,0,0,963745.22,0,0,2491970.2,0,0,3129878.5,0,0,2804392.5,0,0,-3656419.8,0,0,-3224012.4,0,0,-3258719.1}; +VT(0,0.13571429,0,0.0054758376,0.13911323,0,0,0.14285714,0){0,0,0,0,0,495708.7,0,0,0,0,0,0,0,0,-382921.42,0,0,0,0,0,0,0,0,-582869.54,0,0,0,0,0,0,0,0,250325.59,0,0,0,0,0,0,0,0,639819.51,0,0,0}; +VT(0.063469548,0.28521738,0,0.069147655,0.28722413,0,0.068366879,0.29272708,0){0,0,273598.49,0,0,213884.16,0,0,123803.43,0,0,-814255.31,0,0,-637821.62,0,0,-370697.46,0,0,1335465.2,0,0,1050341,0,0,615462.12,0,0,-1824812,0,0,-1444059.1,0,0,-856697.17,0,0,2270429.1,0,0,1811586.6,0,0,1092834.3}; +VT(0.068366879,0.29272708,0,0.069147655,0.28722413,0,0.073754091,0.28851618,0){0,0,123803.43,0,0,213884.16,0,0,171229.59,0,0,-370697.46,0,0,-637821.62,0,0,-511212.67,0,0,615462.12,0,0,1050341,0,0,843808.82,0,0,-856697.17,0,0,-1444059.1,0,0,-1164215.8,0,0,1092834.3,0,0,1811586.6,0,0,1467609.3}; +VT(0.068476894,0.0069177029,0,0.069232026,0.01217315,0,0.064075209,0.013493001,0){0,0,3242851.4,0,0,3187096.8,0,0,3498581.2,0,0,3225849.8,0,0,3135369.8,0,0,3428890.3,0,0,3191931.3,0,0,3032749.5,0,0,3290906.4,0,0,3141298.2,0,0,2880922.9,0,0,3087427.7,0,0,3073847.6,0,0,2682056.5,0,0,2822154}; +VT(0.073684623,0.0112317,0,0.069232026,0.01217315,0,0.068476894,0.0069177029,0){0,0,2850123.3,0,0,3187096.8,0,0,3242851.4,0,0,2810738.2,0,0,3135369.8,0,0,3225849.8,0,0,2732509.2,0,0,3032749.5,0,0,3191931.3,0,0,2616540.6,0,0,2880922.9,0,0,3141298.2,0,0,2464223.2,0,0,2682056.5,0,0,3073847.6}; +VT(0,0.26428571,0,0.0071908097,0.26035264,0,0.0060732531,0.2674669,0){0,0,0,0,0,179155.76,0,0,124750.88,0,0,0,0,0,-507033.49,0,0,-359918.85,0,0,0,0,0,748779.14,0,0,553735.12,0,0,0,0,0,-863311.12,0,0,-683931.42,0,0,0,0,0,830950.48,0,0,735399.5}; +VT(0.093873231,0.17693503,0,0.095837038,0.182565,0,0.089858368,0.18421461,0){0,0,445896.9,0,0,291932.87,0,0,692603.24,0,0,-694096.79,0,0,-487211.17,0,0,-1178349.1,0,0,-59504.029,0,0,33971.767,0,0,133849.22,0,0,727141.13,0,0,464480.32,0,0,1084450.2,0,0,-345394.37,0,0,-344762.9,0,0,-894447.98}; +VT(0.023309936,0.19197185,0,0.021212478,0.18688263,0,0.027249449,0.18607819,0){0,0,1390526.6,0,0,1339179.6,0,0,1646413.8,0,0,-2573914.4,0,0,-2348119.2,0,0,-2861109.6,0,0,799964.88,0,0,429909.33,0,0,464444.42,0,0,1893175.4,0,0,2024227.8,0,0,2518610.9,0,0,-2411477.9,0,0,-1955356.8,0,0,-2323177.4}; +VT(0,0.035714286,0,0.0063343033,0.038958017,0,0,0.042857143,0){0,0,0,0,0,751213.74,0,0,0,0,0,0,0,0,627892.11,0,0,0,0,0,0,0,0,401490.67,0,0,0,0,0,0,0,0,109174.99,0,0,0,0,0,0,0,0,-201236.23,0,0,0}; +VT(0,0.22857143,0,0.0069516057,0.23320895,0,0,0.23571429,0){0,0,0,0,0,288078.49,0,0,0,0,0,0,0,0,-728952.19,0,0,0,0,0,0,0,0,827497.2,0,0,0,0,0,0,0,0,-537397.4,0,0,0,0,0,0,0,0,-5267.3055,0,0,0}; +VT(0.031710863,0.0075461758,0,0.025051818,0.0051959301,0,0.028571429,0,0){0,0,3254919.5,0,0,2747435.6,0,0,3033980.1,0,0,3234618.2,0,0,2739316.7,0,0,3033983.4,0,0,3194153.7,0,0,2723095.2,0,0,3033988.7,0,0,3133832.1,0,0,2698832.3,0,0,3034024.4,0,0,3053845.3,0,0,2666496.7,0,0,3033982.5}; +VT(0.028571429,0.3,0,0.024877102,0.29495936,0,0.031264826,0.29263185,0){0,0,0,0,0,72135.52,0,0,124484.17,0,0,0,0,0,-216205.93,0,0,-372709.78,0,0,0,0,0,359676.71,0,0,618717.86,0,0,0,0,0,-502149.61,0,0,-861054.65,0,0,0,0,0,642973.44,0,0,1098239.8}; +VT(0.025468185,0.010276157,0,0.025051818,0.0051959301,0,0.031710863,0.0075461758,0){0,0,2780034,0,0,2747435.6,0,0,3254919.5,0,0,2747892,0,0,2739316.7,0,0,3234618.2,0,0,2683968.5,0,0,2723095.2,0,0,3194153.7,0,0,2589008.8,0,0,2698832.3,0,0,3133832.1,0,0,2463902.9,0,0,2666496.7,0,0,3053845.3}; +VT(0.031264826,0.29263185,0,0.024877102,0.29495936,0,0.025130011,0.29009115,0){0,0,124484.17,0,0,72135.52,0,0,142877.47,0,0,-372709.78,0,0,-216205.93,0,0,-427099.39,0,0,618717.86,0,0,359676.71,0,0,706741.94,0,0,-861054.65,0,0,-502149.61,0,0,-978805.55,0,0,1098239.8,0,0,642973.44,0,0,1240164.3}; +VT(0.024938414,0.098415267,0,0.024499807,0.092422798,0,0.030017634,0.093495078,0){0,0,2383058.5,0,0,2390452.1,0,0,2771844.6,0,0,68195.72,0,0,320672.29,0,0,320378.42,0,0,-2312962.3,0,0,-2026771.7,0,0,-2414486.4,0,0,-2447461.4,0,0,-2619357.9,0,0,-3014031.4,0,0,-204726.33,0,0,-944222.72,0,0,-948223.96}; +VT(0.083292987,0.24598228,0,0.085145188,0.25032735,0,0.07921504,0.25033934,0){0,0,542685.82,0,0,448997.25,0,0,606155.6,0,0,-1458992.1,0,0,-1228228.7,0,0,-1658203,0,0,1920780.7,0,0,1682589.8,0,0,2271843.6,0,0,-1784182,0,0,-1691886.1,0,0,-2284831,0,0,1091638.2,0,0,1253443,0,0,1693484.6}; +VT(0.077364239,0.048764008,0,0.083998423,0.049627851,0,0.080938662,0.054906318,0){0,0,2450679,0,0,1806853.8,0,0,2097661.4,0,0,1825420.5,0,0,1329741.5,0,0,1423084,0,0,734405.59,0,0,501474.01,0,0,290856.94,0,0,-544039.45,0,0,-459273.5,0,0,-934922.56,0,0,-1683943.8,0,0,-1299103.8,0,0,-1860365.1}; +VT(0,0.25714286,0,0.0071908097,0.26035264,0,0,0.26428571,0){0,0,0,0,0,179155.76,0,0,0,0,0,0,0,0,-507033.49,0,0,0,0,0,0,0,0,748779.14,0,0,0,0,0,0,0,0,-863311.12,0,0,0,0,0,0,0,0,830950.48,0,0,0}; +VT(0.059437672,0.2400817,0,0.061408089,0.24582042,0,0.054957014,0.24657048,0){0,0,1145348.7,0,0,1017142.7,0,0,1058545,0,0,-2999714,0,0,-2732695.2,0,0,-2852831,0,0,3711340.5,0,0,3591948.1,0,0,3777171.8,0,0,-3009146,0,0,-3325647.6,0,0,-3549694.2,0,0,1160252.2,0,0,2017029.8,0,0,2239441.1}; +VT(0.052494391,0.065958781,0,0.059054943,0.066788508,0,0.054876921,0.07294965,0){0,0,3640248,0,0,3499189.3,0,0,3558755.8,0,0,1971511.2,0,0,1856149.2,0,0,1580988.4,0,0,-601016.65,0,0,-658492.2,0,0,-1275447.3,0,0,-2898090,0,0,-2864039.1,0,0,-3423192.1,0,0,-3866942,0,0,-3725081.1,0,0,-3669097.1}; +VT(0.054876921,0.07294965,0,0.059054943,0.066788508,0,0.061098586,0.072147464,0){0,0,3558755.8,0,0,3499189.3,0,0,3389933,0,0,1580988.4,0,0,1856149.2,0,0,1545196.6,0,0,-1275447.3,0,0,-658492.2,0,0,-1140417.3,0,0,-3423192.1,0,0,-2864039.1,0,0,-3205469.9,0,0,-3669097.1,0,0,-3725081.1,0,0,-3526423.9}; +VT(0.1,0.14285714,0,0.093938974,0.13899,0,0.1,0.13571429,0){0,0,0,0,0,548364.78,0,0,0,0,0,0,0,0,-422206.84,0,0,0,0,0,0,0,0,-645591.08,0,0,0,0,0,0,0,0,273728.87,0,0,0,0,0,0,0,0,708600.91,0,0,0}; +VT(0.030623168,0.1713445,0,0.025851591,0.17077962,0,0.029380008,0.16405835,0){0,0,1985985.4,0,0,1763476.8,0,0,2021292.5,0,0,-2866418.8,0,0,-2524912.6,0,0,-2614335.2,0,0,-715248.18,0,0,-673288.62,0,0,-1254306.4,0,0,3183566.3,0,0,2815714.9,0,0,2982541.3,0,0,-696442.05,0,0,-542697.73,0,0,378860.61}; +VT(0.0064812773,0.046734878,0,0.013132659,0.04767246,0,0.0094132111,0.052421332,0){0,0,761350.4,0,0,1507774.2,0,0,1088603.4,0,0,582610.88,0,0,1139737.5,0,0,768702.62,0,0,267082.8,0,0,493500.09,0,0,222919.17,0,0,-111174.21,0,0,-273193.01,0,0,-388347.22,0,0,-463416.67,0,0,-973395.4,0,0,-885762.83}; +VT(0.011573719,0.041901165,0,0.013132659,0.04767246,0,0.0064812773,0.046734878,0){0,0,1347025.1,0,0,1507774.2,0,0,761350.4,0,0,1091815.8,0,0,1139737.5,0,0,582610.88,0,0,629744.45,0,0,493500.09,0,0,267082.8,0,0,48353.226,0,0,-273193.01,0,0,-111174.21,0,0,-542301.86,0,0,-973395.4,0,0,-463416.67}; +VT(0.092168655,0.23668616,0,0.095706332,0.23121352,0,0.1,0.23571429,0){0,0,307607.26,0,0,183910.78,0,0,0,0,0,-792496.69,0,0,-460364.34,0,0,0,0,0,941630.33,0,0,508106.39,0,0,0,0,0,-691810.02,0,0,-303408.65,0,0,0,0,0,148523.72,0,0,-52245.513,0,0,0}; +VT(0.048791783,0.28884593,0,0.043131118,0.28864457,0,0.045044357,0.28188841,0){0,0,226341.07,0,0,225252.57,0,0,362990.51,0,0,-675936.71,0,0,-672574.82,0,0,-1075960.6,0,0,1116322.7,0,0,1110400.5,0,0,1750378.7,0,0,-1541505,0,0,-1532552.2,0,0,-2362097.1,0,0,1945474.1,0,0,1932837.8,0,0,2889034}; +VT(0.045044357,0.28188841,0,0.043131118,0.28864457,0,0.036602132,0.28491153,0){0,0,362990.51,0,0,225252.57,0,0,279518.56,0,0,-1075960.6,0,0,-672574.82,0,0,-831596.18,0,0,1750378.7,0,0,1110400.5,0,0,1362985.6,0,0,-2362097.1,0,0,-1532552.2,0,0,-1860498.2,0,0,2889034,0,0,1932837.8,0,0,2311728.5}; +VT(0.071449289,0.19423207,0,0.064671223,0.19505087,0,0.06771074,0.1881525,0){0,0,1594804.6,0,0,1815232.4,0,0,1821405.7,0,0,-3019964.8,0,0,-3465163,0,0,-3238423,0,0,1103926.4,0,0,1334352.3,0,0,698008.36,0,0,2033518.7,0,0,2252470.6,0,0,2695511.5,0,0,-2921575.1,0,0,-3382100.5,0,0,-2795478.4}; +VT(0.06771074,0.1881525,0,0.064671223,0.19505087,0,0.06137482,0.19024807,0){0,0,1821405.7,0,0,1815232.4,0,0,1976038.9,0,0,-3238423,0,0,-3465163,0,0,-3592882,0,0,698008.36,0,0,1334352.3,0,0,963745.22,0,0,2695511.5,0,0,2252470.6,0,0,2804392.5,0,0,-2795478.4,0,0,-3382100.5,0,0,-3258719.1}; +VT(0.051703203,0.27754162,0,0.051519181,0.28417908,0,0.045044357,0.28188841,0){0,0,454636.43,0,0,320732.11,0,0,362990.51,0,0,-1338881.7,0,0,-953415.16,0,0,-1075960.6,0,0,2149437.1,0,0,1560004.1,0,0,1750378.7,0,0,-2841702,0,0,-2123899.5,0,0,-2362097.1,0,0,3377384.9,0,0,2629434.9,0,0,2889034}; +VT(0.045044357,0.28188841,0,0.051519181,0.28417908,0,0.048791783,0.28884593,0){0,0,362990.51,0,0,320732.11,0,0,226341.07,0,0,-1075960.6,0,0,-953415.16,0,0,-675936.71,0,0,1750378.7,0,0,1560004.1,0,0,1116322.7,0,0,-2362097.1,0,0,-2123899.5,0,0,-1541505,0,0,2889034,0,0,2629434.9,0,0,1945474.1}; +VT(0.066925078,0.074981916,0,0.064846874,0.068845861,0,0.072323403,0.067507008,0){0,0,3090390.8,0,0,3243292.3,0,0,2781512.1,0,0,1280900.5,0,0,1629296.1,0,0,1448400.9,0,0,-1278621.5,0,0,-795531.06,0,0,-578922.09,0,0,-3089611.2,0,0,-2824516.6,0,0,-2328912.3,0,0,-3091904.4,0,0,-3448034.5,0,0,-2963263.7}; +VT(0.017861336,0.10270337,0,0.013714026,0.097839388,0,0.019165757,0.095107709,0){0,0,1773538.4,0,0,1412613.2,0,0,1930971.9,0,0,-87655.931,0,0,55008.627,0,0,168744.63,0,0,-1856823.6,0,0,-1355500.2,0,0,-1747493.7,0,0,-1677437.3,0,0,-1463354,0,0,-2069009.1,0,0,261812.45,0,0,-165174.7,0,0,-502664.26}; +VT(0.072126291,0.10515927,0,0.076969725,0.10634022,0,0.074105201,0.11070107,0){0,0,2539730.3,0,0,2181001.1,0,0,2359475.3,0,0,-241283.81,0,0,-255488.75,0,0,-471755.94,0,0,-2758172.2,0,0,-2406546.5,0,0,-2736894.8,0,0,-2254933.2,0,0,-1869163.7,0,0,-1717960.7,0,0,717337.89,0,0,756176.24,0,0,1362139.4}; +VT(0.077318805,0.23627719,0,0.078142774,0.24370973,0,0.072908259,0.24139656,0){0,0,830868.27,0,0,714639.7,0,0,881474.92,0,0,-2136157.9,0,0,-1902709.3,0,0,-2322734,0,0,2525048.7,0,0,2448578.4,0,0,2916335.3,0,0,-1830714.2,0,0,-2167997.3,0,0,-2445637.4,0,0,350702.19,0,0,1155455.3,0,0,1082242}; +VT(0,0.17857143,0,0.0062925762,0.18063125,0,0,0.18571429,0){0,0,0,0,0,445914.92,0,0,0,0,0,0,0,0,-727143.63,0,0,0,0,0,0,0,0,12632.594,0,0,0,0,0,0,0,0,719304.1,0,0,0,0,0,0,0,0,-466469.22,0,0,0}; +VT(0.045894811,0.13135905,0,0.044512931,0.13802764,0,0.038217426,0.13599196,0){0,0,2973475.7,0,0,2867370.6,0,0,2738753.8,0,0,-1819976.4,0,0,-2150242,0,0,-1938161,0,0,-3679581.9,0,0,-3405187.4,0,0,-3305386.1,0,0,392676.16,0,0,1298632.3,0,0,972060.89,0,0,3832095.1,0,0,3729885,0,0,3589652.3}; +VT(0.028198926,0.28535727,0,0.0220603,0.28602893,0,0.023483408,0.28013687,0){0,0,230200.16,0,0,181204.07,0,0,270985.88,0,0,-685197.76,0,0,-539738.59,0,0,-801278.39,0,0,1124120.6,0,0,886739.53,0,0,1297043.7,0,0,-1536674.3,0,0,-1214791.9,0,0,-1736920.8,0,0,1912913.1,0,0,1516611.7,0,0,2101746.5}; +VT(0.053497526,0.1329974,0,0.049213686,0.13705186,0,0.045894811,0.13135905,0){0,0,2959143.9,0,0,2922689.8,0,0,2973475.7,0,0,-1911000.9,0,0,-2132523.3,0,0,-1819976.4,0,0,-3636096,0,0,-3499251.9,0,0,-3679581.9,0,0,623103.97,0,0,1186505.2,0,0,392676.16,0,0,3857035.6,0,0,3819996.4,0,0,3832095.1}; +VT(0.060819012,0.031697917,0,0.054261983,0.029107824,0,0.057707972,0.025075094,0){0,0,3608360,0,0,3801269,0,0,3734947.8,0,0,3214477.8,0,0,3450822.2,0,0,3478918.2,0,0,2469695.4,0,0,2782228.4,0,0,2984396.6,0,0,1455299.1,0,0,1857139.4,0,0,2285289.9,0,0,281702.17,0,0,760852.59,0,0,1429238.8}; +VT(0.038217426,0.13599196,0,0.033010101,0.13109378,0,0.038464606,0.12667013,0){0,0,2738753.8,0,0,2584208,0,0,2859316.3,0,0,-1938161,0,0,-1567613,0,0,-1476046.2,0,0,-3305386.1,0,0,-3200932.4,0,0,-3573486.5,0,0,972060.89,0,0,308418.11,0,0,-252868.56,0,0,3589652.3,0,0,3322264.5,0,0,3451249.3}; +VT(0.07180958,0.22984275,0,0.070607657,0.23670872,0,0.064373335,0.2338171,0){0,0,1079159.6,0,0,1007105.3,0,0,1185902.3,0,0,-2680718.2,0,0,-2594870.8,0,0,-3010536.1,0,0,2899261.6,0,0,3083897.2,0,0,3446119.8,0,0,-1622013.4,0,0,-2267120.1,0,0,-2291596.2,0,0,-492395.98,0,0,490193.02,0,0,79206.699}; +VT(0.09308158,0.15403623,0,0.088623123,0.15812222,0,0.084604507,0.15255901,0){0,0,579061.91,0,0,918302.92,0,0,1258841.2,0,0,-628036.95,0,0,-1074338,0,0,-1326319,0,0,-525997.02,0,0,-735787.48,0,0,-1187789.9,0,0,672596.25,0,0,1199414.9,0,0,1390056.3,0,0,469080.04,0,0,531983.03,0,0,1113216.6}; +VT(0.031105381,0.06529626,0,0.027058874,0.069011929,0,0.025221599,0.062165695,0){0,0,3030579.1,0,0,2727323.5,0,0,2618029.3,0,0,1667989.8,0,0,1363815.9,0,0,1547191.2,0,0,-444570.51,0,0,-681543.48,0,0,-156575.4,0,0,-2357289.6,0,0,-2386220.5,0,0,-1796512.5,0,0,-3210321.2,0,0,-2898415.6,0,0,-2702051.5}; +VT(0,0.15,0,0.0056981356,0.15371602,0,0,0.15714286,0){0,0,0,0,0,478995.44,0,0,0,0,0,0,0,0,-516269.88,0,0,0,0,0,0,0,0,-438816.38,0,0,0,0,0,0,0,0,550400.04,0,0,0,0,0,0,0,0,395913.98,0,0,0}; +VT(0.040431855,0.24188745,0,0.033139613,0.24047735,0,0.037546984,0.23452457,0){0,0,1110505,0,0,1026889.2,0,0,1205921.7,0,0,-2932804,0,0,-2694450.7,0,0,-3072707.6,0,0,3702149.5,0,0,3348643.4,0,0,3550700.1,0,0,-3142324.5,0,0,-2743423.6,0,0,-2423829.8,0,0,1453973.2,0,0,1106136.5,0,0,201013.93}; +VT(0.077364239,0.048764008,0,0.073604017,0.054819307,0,0.06961584,0.048915995,0){0,0,2450679,0,0,2744584.6,0,0,3063466,0,0,1825420.5,0,0,1864679.8,0,0,2277085.6,0,0,734405.59,0,0,386939.94,0,0,906160.93,0,0,-544039.45,0,0,-1214908.7,0,0,-697426.19,0,0,-1683943.8,0,0,-2427603.9,0,0,-2122325.6}; +VT(0.037546984,0.23452457,0,0.033139613,0.24047735,0,0.030075176,0.23324008,0){0,0,1205921.7,0,0,1026889.2,0,0,1077047.3,0,0,-3072707.6,0,0,-2694450.7,0,0,-2725827,0,0,3550700.1,0,0,3348643.4,0,0,3095770.8,0,0,-2423829.8,0,0,-2743423.6,0,0,-2013325.9,0,0,201013.93,0,0,1106136.5,0,0,-13872.597}; +VT(0.03690243,0.09394169,0,0.039702853,0.10111678,0,0.032036001,0.10024616,0){0,0,3135041.5,0,0,3175586.8,0,0,2837469.6,0,0,337961.95,0,0,-64516.934,0,0,-12660.65,0,0,-2760700,0,0,-3238866.3,0,0,-2850146.6,0,0,-3396384.7,0,0,-3108635.2,0,0,-2824890.6,0,0,-1002139.6,0,0,193445.51,0,0,37524.098}; +VT(0.054692531,0.17439284,0,0.060859952,0.17787963,0,0.055202425,0.1814475,0){0,0,2346407.8,0,0,2182203,0,0,2227021.2,0,0,-3532168.6,0,0,-3438395.7,0,0,-3667462.5,0,0,-561454.61,0,0,-202892.1,0,0,145084.74,0,0,3816051.1,0,0,3555311.4,0,0,3573754.5,0,0,-1367177.6,0,0,-1844119.8,0,0,-2457046.3}; +VT(0.060825265,0.17090728,0,0.060859952,0.17787963,0,0.054692531,0.17439284,0){0,0,2288734.2,0,0,2182203,0,0,2346407.8,0,0,-3282960.5,0,0,-3438395.7,0,0,-3532168.6,0,0,-862639.89,0,0,-202892.1,0,0,-561454.61,0,0,3657845.3,0,0,3555311.4,0,0,3816051.1,0,0,-726586.11,0,0,-1844119.8,0,0,-1367177.6}; +VT(0.092520768,0.26920591,0,0.095069321,0.27540052,0,0.089232651,0.27618677,0){0,0,145042.72,0,0,76899.446,0,0,160151.6,0,0,-420173.4,0,0,-225624.71,0,0,-470555.02,0,0,651988.34,0,0,359465.9,0,0,751874.95,0,0,-816598.86,0,0,-469594.27,0,0,-986723.61,0,0,896908.09,0,0,548580.83,0,0,1160401.4}; +VT(0.1,0.27142857,0,0.095069321,0.27540052,0,0.092520768,0.26920591,0){0,0,0,0,0,76899.446,0,0,145042.72,0,0,0,0,0,-225624.71,0,0,-420173.4,0,0,0,0,0,359465.9,0,0,651988.34,0,0,0,0,0,-469594.27,0,0,-816598.86,0,0,0,0,0,548580.83,0,0,896908.09}; +VT(0.092450683,0.030760689,0,0.095041081,0.024587994,0,0.1,0.028571429,0){0,0,900007.85,0,0,597113.29,0,0,0,0,0,807431.66,0,0,557751.32,0,0,0,0,0,631804.95,0,0,481620.22,0,0,0,0,0,391202.83,0,0,373740.48,0,0,0,0,0,110124.82,0,0,241099.33,0,0,0}; +VT(0.089183466,0.023798504,0,0.095041081,0.024587994,0,0.092450683,0.030760689,0){0,0,1283383.3,0,0,597113.29,0,0,900007.85,0,0,1204105.7,0,0,557751.32,0,0,807431.66,0,0,1050439.6,0,0,481620.22,0,0,631804.95,0,0,831874.08,0,0,373740.48,0,0,391202.83,0,0,561630.79,0,0,241099.33,0,0,110124.82}; +VT(0.041643161,0.17482395,0,0.034648589,0.17585937,0,0.036146522,0.16944297,0){0,0,2284160.6,0,0,2080615.7,0,0,2222447.1,0,0,-3458410.7,0,0,-3193762.3,0,0,-3121229.8,0,0,-506290.81,0,0,-371953.81,0,0,-960241.74,0,0,3718851.8,0,0,3392886,0,0,3509731.4,0,0,-1405815.9,0,0,-1443588.4,0,0,-459324.98}; +VT(0.1,0.25,0,0.095492809,0.25375881,0,0.095090425,0.2489538,0){0,0,0,0,0,131307.15,0,0,157454.16,0,0,0,0,0,-363726.6,0,0,-428416.46,0,0,0,0,0,512510.07,0,0,579817.55,0,0,0,0,0,-543451.99,0,0,-569427.53,0,0,0,0,0,449348.78,0,0,400020.01}; +VT(0.094913401,0.051076335,0,0.095360834,0.0462161,0,0.1,0.05,0){0,0,595503.05,0,0,547145.45,0,0,0,0,0,429138.45,0,0,421466.87,0,0,0,0,0,142901.48,0,0,198977.54,0,0,0,0,0,-183223.65,0,0,-69217.008,0,0,0,0,0,-458373.75,0,0,-321602.09,0,0,0}; +VT(0.068707287,0.030314019,0,0.067616069,0.037109229,0,0.060819012,0.031697917,0){0,0,3188897.7,0,0,3239242.7,0,0,3608360,0,0,2870259.7,0,0,2756202.5,0,0,3214477.8,0,0,2264806.3,0,0,1862139.4,0,0,2469695.4,0,0,1433032.7,0,0,690369.93,0,0,1455299.1,0,0,457746.25,0,0,-584563.48,0,0,281702.17}; +VT(0.061631884,0.26868773,0,0.068237016,0.26229006,0,0.069536278,0.26943087,0){0,0,591535.29,0,0,639705.29,0,0,505602.11,0,0,-1711593.4,0,0,-1820649,0,0,-1465439,0,0,2649353.2,0,0,2721368.6,0,0,2276404,0,0,-3304968.8,0,0,-3203243.1,0,0,-2856108.7,0,0,3608394.3,0,0,3191912.1,0,0,3145421.5}; +VT(0.057142857,0,0,0.051745598,0.0053231545,0,0.05,0,0){0,0,3783317.5,0,0,3873250.9,0,0,3880596.9,0,0,3783357,0,0,3861228.9,0,0,3880622.4,0,0,3783457.6,0,0,3837214.6,0,0,3880662.8,0,0,3783701.2,0,0,3801308.2,0,0,3880737.9,0,0,3783873.9,0,0,3753417.7,0,0,3880625.6}; +VT(0.05,0.3,0,0.051526128,0.29458598,0,0.057142857,0.3,0){0,0,0,0,0,109871.78,0,0,0,0,0,0,0,0,-329256.34,0,0,0,0,0,0,0,0,547568.39,0,0,0,0,0,0,0,0,-764098.34,0,0,0,0,0,0,0,0,977975.34,0,0,0}; +VT(0.1,0.064285714,0,0.095867013,0.068756454,0,0.09230899,0.063522919,0){0,0,0,0,0,470210.65,0,0,877619.52,0,0,0,0,0,236792.42,0,0,503392.8,0,0,0,0,0,-114175.46,0,0,-85524.836,0,0,0,0,0,-408471.99,0,0,-638068.15,0,0,0,0,0,-500215.61,0,0,-918939.46}; +VT(0.039157325,0.25334591,0,0.033025927,0.25326882,0,0.036308441,0.24745658,0){0,0,884627.38,0,0,809560.38,0,0,958174.94,0,0,-2446896,0,0,-2238649.8,0,0,-2591684.5,0,0,3436661.2,0,0,3142273.3,0,0,3460190.4,0,0,-3622356.9,0,0,-3308331.9,0,0,-3307339.6,0,0,2960330.2,0,0,2697705.3,0,0,2177878.8}; +VT(0.030440206,0.150204,0,0.033990129,0.14330646,0,0.037897724,0.149701,0){0,0,2239650.6,0,0,2486957.5,0,0,2552043.8,0,0,-2249230.7,0,0,-2138608.5,0,0,-2536068.8,0,0,-2230054.7,0,0,-2786553.8,0,0,-2567975.2,0,0,2258843.4,0,0,1748365.6,0,0,2520076,0,0,2220211.9,0,0,3031412.6,0,0,2583694.6}; +VT(0.025130011,0.29009115,0,0.0220603,0.28602893,0,0.028198926,0.28535727,0){0,0,142877.47,0,0,181204.07,0,0,230200.16,0,0,-427099.39,0,0,-539738.59,0,0,-685197.76,0,0,706741.94,0,0,886739.53,0,0,1124120.6,0,0,-978805.55,0,0,-1214791.9,0,0,-1536674.3,0,0,1240164.3,0,0,1516611.7,0,0,1912913.1}; +VT(0.013428016,0.091778472,0,0.013714026,0.097839388,0,0.0071591483,0.096788703,0){0,0,1408980.1,0,0,1412613.2,0,0,756711.76,0,0,204626.15,0,0,55008.627,0,0,43634.951,0,0,-1174648.8,0,0,-1355500.2,0,0,-710572.63,0,0,-1549888.7,0,0,-1463354,0,0,-795194.2,0,0,-600683.83,0,0,-165174.7,0,0,-130859.45}; +VT(0.0071591483,0.096788703,0,0.013714026,0.097839388,0,0.010955873,0.10281868,0){0,0,756711.76,0,0,1412613.2,0,0,1124212.8,0,0,43634.951,0,0,55008.627,0,0,-57954.543,0,0,-710572.63,0,0,-1355500.2,0,0,-1179275.3,0,0,-795194.2,0,0,-1463354,0,0,-1060620.9,0,0,-130859.45,0,0,-165174.7,0,0,173274.75}; +VT(0.037897724,0.149701,0,0.033990129,0.14330646,0,0.041319833,0.14315875,0){0,0,2552043.8,0,0,2486957.5,0,0,2735557.7,0,0,-2536068.8,0,0,-2138608.5,0,0,-2343944,0,0,-2567975.2,0,0,-2786553.8,0,0,-3071175.4,0,0,2520076,0,0,1748365.6,0,0,1904337.3,0,0,2583694.6,0,0,3031412.6,0,0,3343927.4}; +VT(0.035858843,0.031497608,0,0.030602087,0.036163623,0,0.028359285,0.029784535,0){0,0,3456371.8,0,0,3125169.1,0,0,2981166.2,0,0,3083741.5,0,0,2682310.4,0,0,2693525.9,0,0,2378649.5,0,0,1859340.6,0,0,2145980.7,0,0,1417116.3,0,0,772883.67,0,0,1391347.7,0,0,302618.73,0,0,-423255.99,0,0,502245.34}; +VT(0.026971271,0.22659033,0,0.029518097,0.21985532,0,0.034969012,0.22634925,0){0,0,1090633.5,0,0,1264894.2,0,0,1299939.6,0,0,-2658504.1,0,0,-2954793.2,0,0,-3164156.1,0,0,2731189,0,0,2682751.8,0,0,3237729.2,0,0,-1267784.1,0,0,-629411.95,0,0,-1478956,0,0,-909068.56,0,0,-1842177.8,0,0,-1117524.9}; +VT(0.034969012,0.22634925,0,0.029518097,0.21985532,0,0.036912897,0.21765752,0){0,0,1299939.6,0,0,1264894.2,0,0,1486590.9,0,0,-3164156.1,0,0,-2954793.2,0,0,-3421295.1,0,0,3237729.2,0,0,2682751.8,0,0,2965983.4,0,0,-1478956,0,0,-629411.95,0,0,-438566.7,0,0,-1117524.9,0,0,-1842177.8,0,0,-2395869.1}; +VT(0.051167355,0.022914381,0,0.052049192,0.01582547,0,0.057612168,0.01845715,0){0,0,3850137.8,0,0,3859264.8,0,0,3752599.8,0,0,3629520.4,0,0,3753529.9,0,0,3612875.5,0,0,3200919.1,0,0,3544947.6,0,0,3338613.5,0,0,2588908.3,0,0,3239251.6,0,0,2940029.2,0,0,1828396.4,0,0,2844641.6,0,0,2431782.4}; +VT(0.09071018,0.22887426,0,0.095706332,0.23121352,0,0.092168655,0.23668616,0){0,0,406264.77,0,0,183910.78,0,0,307607.26,0,0,-1003622.2,0,0,-460364.34,0,0,-792496.69,0,0,1069446.3,0,0,508106.39,0,0,941630.33,0,0,-568907.82,0,0,-303408.65,0,0,-691810.02,0,0,-233040.27,0,0,-52245.513,0,0,148523.72}; +VT(0.027903545,0.087518505,0,0.024499807,0.092422798,0,0.020473685,0.087577432,0){0,0,2674848,0,0,2390452.1,0,0,2087024.2,0,0,580994.77,0,0,320672.29,0,0,451292.51,0,0,-1967676.8,0,0,-2026771.7,0,0,-1538224.3,0,0,-2976106,0,0,-2619357.9,0,0,-2322280.1,0,0,-1655065.1,0,0,-944222.72,0,0,-1286407.6}; +VT(0.036146522,0.16944297,0,0.034648589,0.17585937,0,0.030623168,0.1713445,0){0,0,2222447.1,0,0,2080615.7,0,0,1985985.4,0,0,-3121229.8,0,0,-3193762.3,0,0,-2866418.8,0,0,-960241.74,0,0,-371953.81,0,0,-715248.18,0,0,3509731.4,0,0,3392886,0,0,3183566.3,0,0,-459324.98,0,0,-1443588.4,0,0,-696442.05}; +VT(0.027249449,0.18607819,0,0.034128539,0.18892309,0,0.029690249,0.19362013,0){0,0,1646413.8,0,0,1872288.6,0,0,1647856.1,0,0,-2861109.6,0,0,-3356683.8,0,0,-3101495.4,0,0,464444.42,0,0,788949.65,0,0,1088093.1,0,0,2518610.9,0,0,2731311.2,0,0,2141745.7,0,0,-2323177.4,0,0,-2954777.5,0,0,-2977851}; +VT(0,0.22142857,0,0.0069979116,0.22643766,0,0,0.22857143,0){0,0,0,0,0,317964.48,0,0,0,0,0,0,0,0,-774386.26,0,0,0,0,0,0,0,0,793599.18,0,0,0,0,0,0,0,0,-364658.79,0,0,0,0,0,0,0,0,-270536.88,0,0,0}; +VT(0.059551151,0.20970619,0,0.053910411,0.21448753,0,0.053221516,0.20704838,0){0,0,1688112.8,0,0,1667429.4,0,0,1805672.4,0,0,-3664209.4,0,0,-3752161.8,0,0,-3837129.3,0,0,2601193.1,0,0,3023771,0,0,2511247.5,0,0,619333.89,0,0,-28239.212,0,0,1011998.4,0,0,-3326584.6,0,0,-2988983.1,0,0,-3650194.7}; +VT(0.053221516,0.20704838,0,0.053910411,0.21448753,0,0.049232245,0.21047418,0){0,0,1805672.4,0,0,1667429.4,0,0,1752658.6,0,0,-3837129.3,0,0,-3752161.8,0,0,-3827070.5,0,0,2511247.5,0,0,3023771,0,0,2777012.8,0,0,1011998.4,0,0,-28239.212,0,0,540242.46,0,0,-3650194.7,0,0,-2988983.1,0,0,-3416565.4}; +VT(0.024008584,0.022367291,0,0.022427218,0.014872357,0,0.029163144,0.015558324,0){0,0,2639060.6,0,0,2505875.7,0,0,3068207,0,0,2494948.4,0,0,2445229.8,0,0,2986953.6,0,0,2214593.6,0,0,2325397.7,0,0,2826596.5,0,0,1813324.4,0,0,2149288.4,0,0,2591406.1,0,0,1312931.3,0,0,1920956.8,0,0,2287504.7}; +VT(0.029163144,0.015558324,0,0.022427218,0.014872357,0,0.025468185,0.010276157,0){0,0,3068207,0,0,2505875.7,0,0,2780034,0,0,2986953.6,0,0,2445229.8,0,0,2747892,0,0,2826596.5,0,0,2325397.7,0,0,2683968.5,0,0,2591406.1,0,0,2149288.4,0,0,2589008.8,0,0,2287504.7,0,0,1920956.8,0,0,2463902.9}; +VT(0.01788586,0.12850833,0,0.012365279,0.12660144,0,0.017763535,0.12074209,0){0,0,1616906.9,0,0,1158576.2,0,0,1657769.5,0,0,-895214.81,0,0,-596487.84,0,0,-657738.05,0,0,-2016472.2,0,0,-1447959.2,0,0,-2054600.3,0,0,-4802.2192,0,0,-105993.81,0,0,-581651.26,0,0,2014144.7,0,0,1396357.8,0,0,1703675.4}; +VT(0.017763535,0.12074209,0,0.012365279,0.12660144,0,0.01093484,0.12117452,0){0,0,1657769.5,0,0,1158576.2,0,0,1052666.9,0,0,-657738.05,0,0,-596487.84,0,0,-426753.37,0,0,-2054600.3,0,0,-1447959.2,0,0,-1306415.4,0,0,-581651.26,0,0,-105993.81,0,0,-350052.21,0,0,1703675.4,0,0,1396357.8,0,0,1098212.1}; +VT(0.03163445,0.20120488,0,0.025476801,0.19755762,0,0.029690249,0.19362013,0){0,0,1608414.7,0,0,1423125.8,0,0,1647856.1,0,0,-3251875.6,0,0,-2782737.9,0,0,-3101495.4,0,0,1714266.6,0,0,1235431.1,0,0,1088093.1,0,0,1500504,0,0,1602470.1,0,0,2141745.7,0,0,-3248047,0,0,-2766638.2,0,0,-2977851}; +VT(0.09230899,0.063522919,0,0.095867013,0.068756454,0,0.09123018,0.070922096,0){0,0,877619.52,0,0,470210.65,0,0,983713.53,0,0,503392.8,0,0,236792.42,0,0,465586.72,0,0,-85524.836,0,0,-114175.46,0,0,-297764.17,0,0,-638068.15,0,0,-408471.99,0,0,-904277.98,0,0,-918939.46,0,0,-500215.61,0,0,-1034644.8}; +VT(0.0079950318,0.059686314,0,0.012193394,0.066188359,0,0.0062494098,0.068021592,0){0,0,917766.47,0,0,1364188,0,0,709501.16,0,0,570756.35,0,0,734639.92,0,0,364477.97,0,0,7912.4367,0,0,-233939.49,0,0,-157824.6,0,0,-557994.72,0,0,-1094586.7,0,0,-603457.47,0,0,-913265.38,0,0,-1450385,0,0,-756039.79}; +VT(0.050721192,0.10961634,0,0.05615957,0.1141762,0,0.051013063,0.11801667,0){0,0,3257974.6,0,0,3147681.4,0,0,3161388.4,0,0,-583831.78,0,0,-840990.83,0,0,-1083065.4,0,0,-3737290.3,0,0,-3764018.8,0,0,-3873486.3,0,0,-2483878.9,0,0,-1917372.9,0,0,-1463412.7,0,0,1698581.7,0,0,2358868.4,0,0,2911579}; +VT(0.051703203,0.27754162,0,0.045592054,0.27439642,0,0.049721881,0.27094787,0){0,0,454636.43,0,0,513714.39,0,0,588018.61,0,0,-1338881.7,0,0,-1504437.2,0,0,-1710042.9,0,0,2149437.1,0,0,2387679.2,0,0,2675009.8,0,0,-2841702,0,0,-3100344.3,0,0,-3394309,0,0,3377384.9,0,0,3591305.7,0,0,3801713.7}; +VT(0.024044461,0.20382537,0,0.021120118,0.21068669,0,0.015977634,0.20443356,0){0,0,1283805.9,0,0,1077357.5,0,0,895779.15,0,0,-2655634.7,0,0,-2356401.7,0,0,-1862602.8,0,0,1553893.8,0,0,1720167.1,0,0,1114548.4,0,0,995311.88,0,0,314292.11,0,0,659707.69,0,0,-2617892.2,0,0,-2093742.8,0,0,-1827076.9}; +VT(0.08682376,0.20181233,0,0.093164956,0.1980516,0,0.093706234,0.20596864,0){0,0,767576.83,0,0,420734.09,0,0,360320.46,0,0,-1560255.4,0,0,-826537.04,0,0,-758974.46,0,0,843726.65,0,0,376428.12,0,0,479351.87,0,0,688912.23,0,0,463603.83,0,0,228803.73,0,0,-1555436.8,0,0,-823893.15,0,0,-732939.79}; +VT(0.030075176,0.23324008,0,0.033139613,0.24047735,0,0.025350652,0.23917347,0){0,0,1077047.3,0,0,1026889.2,0,0,868665.73,0,0,-2725827,0,0,-2694450.7,0,0,-2265304,0,0,3095770.8,0,0,3348643.4,0,0,2773502.3,0,0,-2013325.9,0,0,-2743423.6,0,0,-2193941.8,0,0,-13872.597,0,0,1106136.5,0,0,753574.67}; +VT(0.032229878,0.047894836,0,0.035422008,0.053603109,0,0.028699663,0.054481756,0){0,0,3188476.9,0,0,3344502.1,0,0,2920693,0,0,2403076.1,0,0,2318078.8,0,0,1995520.8,0,0,1025710.6,0,0,580213.58,0,0,438210.61,0,0,-604377.64,0,0,-1335777.4,0,0,-1257984.1,0,0,-2086050.7,0,0,-2842327.2,0,0,-2556170.3}; +VT(0.038515413,0.047952704,0,0.035422008,0.053603109,0,0.032229878,0.047894836,0){0,0,3516906.1,0,0,3344502.1,0,0,3188476.9,0,0,2648581.9,0,0,2318078.8,0,0,2403076.1,0,0,1126309.3,0,0,580213.58,0,0,1025710.6,0,0,-674068.75,0,0,-1335777.4,0,0,-604377.64,0,0,-2308227.3,0,0,-2842327.2,0,0,-2086050.7}; +VT(0.0093450955,0.28843768,0,0.010662343,0.29482959,0,0.0045473776,0.2936365,0){0,0,67949.514,0,0,34537.041,0,0,18406.211,0,0,-202850.84,0,0,-103506.64,0,0,-55138.333,0,0,334776.34,0,0,172164.12,0,0,91630.552,0,0,-461793.67,0,0,-240303.04,0,0,-127724.83,0,0,581935.08,0,0,307518.14,0,0,162961.08}; +VT(0.0045481906,0.0063920675,0,0.010679145,0.0052482016,0,0.0093389246,0.011691623,0){0,0,552257.15,0,0,1277155.8,0,0,1120186.5,0,0,549810.55,0,0,1273289.3,0,0,1103410.3,0,0,544927.47,0,0,1265566.3,0,0,1070108.3,0,0,537633.65,0,0,1254019.7,0,0,1020788.4,0,0,527798.54,0,0,1238493.9,0,0,956114.18}; +VT(0.064285714,0,0,0.06203594,0.0060944193,0,0.057142857,0,0){0,0,3496327.6,0,0,3604620.2,0,0,3783317.5,0,0,3496358.5,0,0,3589956.2,0,0,3783357,0,0,3496415,0,0,3560685.5,0,0,3783457.6,0,0,3496523.2,0,0,3516960.1,0,0,3783701.2,0,0,3496472.9,0,0,3458793.9,0,0,3783873.9}; +VT(0.057142857,0.3,0,0.061805884,0.29356168,0,0.064285714,0.3,0){0,0,0,0,0,121923.05,0,0,0,0,0,0,0,0,-365207.83,0,0,0,0,0,0,0,0,606815.62,0,0,0,0,0,0,0,0,-845641.09,0,0,0,0,0,0,0,0,1080583.1,0,0,0}; +VT(0.070477538,0.15360968,0,0.064971856,0.15110456,0,0.069467767,0.146519,0){0,0,2153625.7,0,0,2431817,0,0,2287173.5,0,0,-2316413.6,0,0,-2488096.1,0,0,-2120501.9,0,0,-1978592.7,0,0,-2374265.3,0,0,-2441744.6,0,0,2466066.8,0,0,2543085,0,0,1942651.5,0,0,1792310.4,0,0,2315361.9,0,0,2583122}; +VT(0.048791783,0.28884593,0,0.051526128,0.29458598,0,0.045931579,0.29422002,0){0,0,226341.07,0,0,109871.78,0,0,116468.36,0,0,-675936.71,0,0,-329256.34,0,0,-348980.73,0,0,1116322.7,0,0,547568.39,0,0,580225.36,0,0,-1541505,0,0,-764098.34,0,0,-809364.6,0,0,1945474.1,0,0,977975.34,0,0,1035478}; +VT(0.046181733,0.0056701177,0,0.051745598,0.0053231545,0,0.049204373,0.010884263,0){0,0,3851009.3,0,0,3873250.9,0,0,3873084,0,0,3837454.5,0,0,3861228.9,0,0,3822842.7,0,0,3810385,0,0,3837214.6,0,0,3723003.5,0,0,3769920.5,0,0,3801308.2,0,0,3574883.8,0,0,3715901.2,0,0,3753417.7,0,0,3380124.5}; +VT(0.089230742,0.11966768,0,0.082946441,0.12207685,0,0.08466046,0.11619385,0){0,0,1043332.5,0,0,1589878.9,0,0,1475783,0,0,-391602.7,0,0,-673263.29,0,0,-452604.25,0,0,-1287980.7,0,0,-1978038.1,0,0,-1789662.1,0,0,-412950.99,0,0,-467139.5,0,0,-788262.21,0,0,1030099.2,0,0,1708498.9,0,0,1243195.1}; +VT(0.1,0.078571429,0,0.095795895,0.073622969,0,0.1,0.071428571,0){0,0,0,0,0,473503.74,0,0,0,0,0,0,0,0,205720.2,0,0,0,0,0,0,0,0,-178405.32,0,0,0,0,0,0,0,0,-461642.03,0,0,0,0,0,0,0,0,-483922.03,0,0,0}; +VT(0.017433092,0.042090914,0,0.022876349,0.043626948,0,0.019247887,0.048569646,0){0,0,1971771.3,0,0,2488553.5,0,0,2135187.8,0,0,1594855,0,0,1978130.3,0,0,1594654.5,0,0,913057.13,0,0,1061959.9,0,0,650408.09,0,0,56690.05,0,0,-72059.632,0,0,-458538.7,0,0,-810753.02,0,0,-1191549.5,0,0,-1451674.1}; +VT(0.060819012,0.031697917,0,0.067616069,0.037109229,0,0.060555575,0.040182349,0){0,0,3608360,0,0,3239242.7,0,0,3588260.7,0,0,3214477.8,0,0,2756202.5,0,0,2962222.2,0,0,2469695.4,0,0,1862139.4,0,0,1819353,0,0,1455299.1,0,0,690369.93,0,0,359025.67,0,0,281702.17,0,0,-584563.48,0,0,-1164330.1}; +VT(0.060672356,0.25950081,0,0.068237016,0.26229006,0,0.061631884,0.26868773,0){0,0,771273.27,0,0,639705.29,0,0,591535.29,0,0,-2177172.3,0,0,-1820649,0,0,-1711593.4,0,0,3197356.1,0,0,2721368.6,0,0,2649353.2,0,0,-3651078,0,0,-3203243.1,0,0,-3304968.8,0,0,3457676.3,0,0,3191912.1,0,0,3608394.3}; +VT(0.043027686,0.24899973,0,0.049037582,0.25027532,0,0.04563604,0.25694979,0){0,0,999522.33,0,0,998508.07,0,0,859240.08,0,0,-2720190.5,0,0,-2730849.8,0,0,-2406042.8,0,0,3683283.3,0,0,3739350.2,0,0,3472131.8,0,0,-3620573.8,0,0,-3756698.7,0,0,-3844488.4,0,0,2549278.8,0,0,2778087.3,0,0,3448330.3}; +VT(0.061098586,0.072147464,0,0.064846874,0.068845861,0,0.066925078,0.074981916,0){0,0,3389933,0,0,3243292.3,0,0,3090390.8,0,0,1545196.6,0,0,1629296.1,0,0,1280900.5,0,0,-1140417.3,0,0,-795531.06,0,0,-1278621.5,0,0,-3205469.9,0,0,-2824516.6,0,0,-3089611.2,0,0,-3526423.9,0,0,-3448034.5,0,0,-3091904.4}; +VT(0.051013063,0.11801667,0,0.05615957,0.1141762,0,0.057323957,0.1204315,0){0,0,3161388.4,0,0,3147681.4,0,0,3051716.5,0,0,-1083065.4,0,0,-840990.83,0,0,-1191883,0,0,-3873486.3,0,0,-3764018.8,0,0,-3778168.4,0,0,-1463412.7,0,0,-1917372.9,0,0,-1110713.1,0,0,2911579,0,0,2358868.4,0,0,3101303}; +VT(0.1,0.22857143,0,0.095652827,0.22622146,0,0.1,0.22142857,0){0,0,0,0,0,199039.37,0,0,0,0,0,0,0,0,-484109.58,0,0,0,0,0,0,0,0,494313.66,0,0,0,0,0,0,0,0,-223837.82,0,0,0,0,0,0,0,0,-173819.74,0,0,0}; +VT(0.1,0.19285714,0,0.095453592,0.18738967,0,0.1,0.18571429,0){0,0,0,0,0,307137.29,0,0,0,0,0,0,0,0,-541566.85,0,0,0,0,0,0,0,0,106216.39,0,0,0,0,0,0,0,0,460538.95,0,0,0,0,0,0,0,0,-458087.35,0,0,0}; +VT(0.049678492,0.18505966,0,0.048811039,0.17808485,0,0.055202425,0.1814475,0){0,0,2196886.7,0,0,2310715.6,0,0,2227021.2,0,0,-3774046.6,0,0,-3650410,0,0,-3667462.5,0,0,512508.07,0,0,-194330.82,0,0,145084.74,0,0,3406255.6,0,0,3763231.4,0,0,3573754.5,0,0,-2958276.7,0,0,-1987755.8,0,0,-2457046.3}; +VT(0.089437553,0.21298247,0,0.086709216,0.20730703,0,0.093706234,0.20596864,0){0,0,556322.48,0,0,734117.03,0,0,360320.46,0,0,-1238115.4,0,0,-1563285.8,0,0,-758974.46,0,0,961021.23,0,0,1031586.7,0,0,479351.87,0,0,60411.18,0,0,398134,0,0,228803.73,0,0,-1035404.3,0,0,-1481512.9,0,0,-732939.79}; +VT(0.093706234,0.20596864,0,0.086709216,0.20730703,0,0.08682376,0.20181233,0){0,0,360320.46,0,0,734117.03,0,0,767576.83,0,0,-758974.46,0,0,-1563285.8,0,0,-1560255.4,0,0,479351.87,0,0,1031586.7,0,0,843726.65,0,0,228803.73,0,0,398134,0,0,688912.23,0,0,-732939.79,0,0,-1481512.9,0,0,-1555436.8}; +VT(0.074105201,0.11070107,0,0.06715469,0.10983132,0,0.072126291,0.10515927,0){0,0,2359475.3,0,0,2794834,0,0,2539730.3,0,0,-471755.94,0,0,-512277.78,0,0,-241283.81,0,0,-2736894.8,0,0,-3213264.7,0,0,-2758172.2,0,0,-1717960.7,0,0,-2112070.8,0,0,-2254933.2,0,0,1362139.4,0,0,1488257.3,0,0,717337.89}; +VT(0.056292141,0.2827555,0,0.051519181,0.28417908,0,0.051703203,0.27754162,0){0,0,343081.75,0,0,320732.11,0,0,454636.43,0,0,-1018093.3,0,0,-953415.16,0,0,-1338881.7,0,0,1660020.8,0,0,1560004.1,0,0,2149437.1,0,0,-2248005.1,0,0,-2123899.5,0,0,-2841702,0,0,2762903.8,0,0,2629434.9,0,0,3377384.9}; +VT(0.055202425,0.1814475,0,0.048811039,0.17808485,0,0.054692531,0.17439284,0){0,0,2227021.2,0,0,2310715.6,0,0,2346407.8,0,0,-3667462.5,0,0,-3650410,0,0,-3532168.6,0,0,145084.74,0,0,-194330.82,0,0,-561454.61,0,0,3573754.5,0,0,3763231.4,0,0,3816051.1,0,0,-2457046.3,0,0,-1987755.8,0,0,-1367177.6}; +VT(0.046063037,0.016810165,0,0.043829005,0.011024747,0,0.049204373,0.010884263,0){0,0,3836060.2,0,0,3801549.1,0,0,3873084,0,0,3717529.2,0,0,3750937.1,0,0,3822842.7,0,0,3484126.2,0,0,3650381.9,0,0,3723003.5,0,0,3143090.2,0,0,3501249.8,0,0,3574883.8,0,0,2704667.4,0,0,3305260.3,0,0,3380124.5}; +VT(0.037071258,0.0642048,0,0.032659307,0.059686042,0,0.038435934,0.058364632,0){0,0,3365311.2,0,0,3158137.1,0,0,3459248.5,0,0,1900443.5,0,0,1964024.3,0,0,2206750.4,0,0,-391679.98,0,0,27282.242,0,0,155241.86,0,0,-2513388.8,0,0,-1919818.3,0,0,-1952496,0,0,-3541461.8,0,0,-3141270.1,0,0,-3353689.4}; +VT(0.011268327,0.1984065,0,0.005051806,0.19767546,0,0.0066871595,0.19241823,0){0,0,682302.12,0,0,313084.45,0,0,432113.5,0,0,-1344805.9,0,0,-612892.85,0,0,-803518.34,0,0,623458.07,0,0,273796.53,0,0,258472.73,0,0,739532.85,0,0,350786.74,0,0,581490.34,0,0,-1341727.7,0,0,-609909.8,0,0,-758588.26}; +VT(0.011197941,0.071439681,0,0.012549176,0.077039569,0,0.0060853536,0.074713803,0){0,0,1244724.5,0,0,1370920.5,0,0,681675.12,0,0,579995.21,0,0,525978.15,0,0,285253.65,0,0,-394493.66,0,0,-643140.23,0,0,-277070.48,0,0,-1158343.6,0,0,-1415881.7,0,0,-678306.76,0,0,-1303869.8,0,0,-1316306.1,0,0,-685312.86}; +VT(0.0060853536,0.074713803,0,0.012549176,0.077039569,0,0.0064539684,0.081629255,0){0,0,681675.12,0,0,1370920.5,0,0,711139.06,0,0,285253.65,0,0,525978.15,0,0,222377.16,0,0,-277070.48,0,0,-643140.23,0,0,-419239.47,0,0,-678306.76,0,0,-1415881.7,0,0,-772749.89,0,0,-685312.86,0,0,-1316306.1,0,0,-595288.06}; +VT(0.0910478,0.13167545,0,0.087905667,0.12517971,0,0.093823791,0.12410599,0){0,0,831136.87,0,0,1140990.9,0,0,595735.92,0,0,-514132.23,0,0,-554517.87,0,0,-276601.23,0,0,-1027305.8,0,0,-1425990.8,0,0,-743959.63,0,0,122313.64,0,0,-178453.87,0,0,-121937.8,0,0,1073956.7,0,0,1334087.8,0,0,678759.2}; +VT(0.087905667,0.12517971,0,0.082946441,0.12207685,0,0.089230742,0.11966768,0){0,0,1140990.9,0,0,1589878.9,0,0,1043332.5,0,0,-554517.87,0,0,-673263.29,0,0,-391602.7,0,0,-1425990.8,0,0,-1978038.1,0,0,-1287980.7,0,0,-178453.87,0,0,-467139.5,0,0,-412950.99,0,0,1334087.8,0,0,1708498.9,0,0,1030099.2}; +VT(0.0066871595,0.19241823,0,0.012931293,0.19295437,0,0.011268327,0.1984065,0){0,0,432113.5,0,0,815194.79,0,0,682302.12,0,0,-803518.34,0,0,-1524077.7,0,0,-1344805.9,0,0,258472.73,0,0,510133.92,0,0,623458.07,0,0,581490.34,0,0,1080471.8,0,0,739532.85,0,0,-758588.26,0,0,-1450076.4,0,0,-1341727.7}; +VT(0.05,0,0,0.046181733,0.0056701177,0,0.042857143,0,0){0,0,3880596.9,0,0,3851009.3,0,0,3783299.5,0,0,3880622.4,0,0,3837454.5,0,0,3783327.5,0,0,3880662.8,0,0,3810385,0,0,3783379.6,0,0,3880737.9,0,0,3769920.5,0,0,3783486.4,0,0,3880625.6,0,0,3715901.2,0,0,3783576.5}; +VT(0.042857143,0.3,0,0.045931579,0.29422002,0,0.05,0.3,0){0,0,0,0,0,116468.36,0,0,0,0,0,0,0,0,-348980.73,0,0,0,0,0,0,0,0,580225.36,0,0,0,0,0,0,0,0,-809364.6,0,0,0,0,0,0,0,0,1035478,0,0,0}; +VT(0.057323957,0.1204315,0,0.05615957,0.1141762,0,0.062195955,0.11505156,0){0,0,3051716.5,0,0,3147681.4,0,0,2965673.8,0,0,-1191883,0,0,-840990.83,0,0,-843057.19,0,0,-3778168.4,0,0,-3764018.8,0,0,-3569130.8,0,0,-1110713.1,0,0,-1917372.9,0,0,-1711501.2,0,0,3101303,0,0,2358868.4,0,0,2344130.4}; +VT(0.013428016,0.091778472,0,0.01318623,0.084416193,0,0.020473685,0.087577432,0){0,0,1408980.1,0,0,1411871.7,0,0,2087024.2,0,0,204626.15,0,0,378554.62,0,0,451292.51,0,0,-1174648.8,0,0,-931831.12,0,0,-1538224.3,0,0,-1549888.7,0,0,-1560266,0,0,-2322280.1,0,0,-600683.83,0,0,-1046999.7,0,0,-1286407.6}; +VT(0.030312881,0.27848596,0,0.028198926,0.28535727,0,0.023483408,0.28013687,0){0,0,355416.48,0,0,230200.16,0,0,270985.88,0,0,-1048284.8,0,0,-685197.76,0,0,-801278.39,0,0,1688178.9,0,0,1124120.6,0,0,1297043.7,0,0,-2242771,0,0,-1536674.3,0,0,-1736920.8,0,0,2683885.3,0,0,1912913.1,0,0,2101746.5}; +VT(0.0069613667,0.17349451,0,0.0062925762,0.18063125,0,0,0.17857143,0){0,0,517779.21,0,0,445914.92,0,0,0,0,0,-769992.03,0,0,-727143.63,0,0,0,0,0,-142713.64,0,0,12632.594,0,0,0,0,0,839532.94,0,0,719304.1,0,0,0,0,0,-266340.1,0,0,-466469.22,0,0,0}; +VT(0.046063037,0.016810165,0,0.052049192,0.01582547,0,0.051167355,0.022914381,0){0,0,3836060.2,0,0,3859264.8,0,0,3850137.8,0,0,3717529.2,0,0,3753529.9,0,0,3629520.4,0,0,3484126.2,0,0,3544947.6,0,0,3200919.1,0,0,3143090.2,0,0,3239251.6,0,0,2588908.3,0,0,2704667.4,0,0,2844641.6,0,0,1828396.4}; +VT(0.065931692,0.10408722,0,0.06715469,0.10983132,0,0.059543685,0.10776494,0){0,0,2911358.9,0,0,2794834,0,0,3132791.5,0,0,-218409.17,0,0,-512277.78,0,0,-451048.14,0,0,-3113407,0,0,-3213264.7,0,0,-3519016.9,0,0,-2661455,0,0,-2112070.8,0,0,-2561357.9,0,0,651464.78,0,0,1488257.3,0,0,1326599.2}; +VT(0.083190767,0.25723975,0,0.085145188,0.25032735,0,0.090077759,0.25268961,0){0,0,434158.6,0,0,448997.25,0,0,291813.61,0,0,-1216864.4,0,0,-1228228.7,0,0,-805257.31,0,0,1759626.8,0,0,1682589.8,0,0,1125037.4,0,0,-1955417.3,0,0,-1691886.1,0,0,-1174248.1,0,0,1765235.2,0,0,1253443,0,0,940920.06}; +VT(0.07921504,0.25033934,0,0.085145188,0.25032735,0,0.083190767,0.25723975,0){0,0,606155.6,0,0,448997.25,0,0,434158.6,0,0,-1658203,0,0,-1228228.7,0,0,-1216864.4,0,0,2271843.6,0,0,1682589.8,0,0,1759626.8,0,0,-2284831,0,0,-1691886.1,0,0,-1955417.3,0,0,1693484.6,0,0,1253443,0,0,1765235.2}; +VT(0.08974924,0.047235181,0,0.083998423,0.049627851,0,0.082493405,0.042375289,0){0,0,1190814.4,0,0,1806853.8,0,0,1978611.8,0,0,905328.07,0,0,1329741.5,0,0,1595319.9,0,0,402804.56,0,0,501474.01,0,0,902966.17,0,0,-196265.4,0,0,-459273.5,0,0,35643.43,0,0,-748421.11,0,0,-1299103.8,0,0,-838916.97}; +VT(0.082493405,0.042375289,0,0.083998423,0.049627851,0,0.077364239,0.048764008,0){0,0,1978611.8,0,0,1806853.8,0,0,2450679,0,0,1595319.9,0,0,1329741.5,0,0,1825420.5,0,0,902966.17,0,0,501474.01,0,0,734405.59,0,0,35643.43,0,0,-459273.5,0,0,-544039.45,0,0,-838916.97,0,0,-1299103.8,0,0,-1683943.8}; +VT(0.1,0.23571429,0,0.095706332,0.23121352,0,0.1,0.22857143,0){0,0,0,0,0,183910.78,0,0,0,0,0,0,0,0,-460364.34,0,0,0,0,0,0,0,0,508106.39,0,0,0,0,0,0,0,0,-303408.65,0,0,0,0,0,0,0,0,-52245.513,0,0,0}; +VT(0.055890502,0.18802963,0,0.061291474,0.18447479,0,0.06137482,0.19024807,0){0,0,2110328.4,0,0,2069396,0,0,1976038.9,0,0,-3747121.1,0,0,-3531333.7,0,0,-3592882,0,0,795966.68,0,0,425331.11,0,0,963745.22,0,0,3129878.5,0,0,3230965.1,0,0,2804392.5,0,0,-3224012.4,0,0,-2708277.6,0,0,-3258719.1}; +VT(0.049204373,0.010884263,0,0.052049192,0.01582547,0,0.046063037,0.016810165,0){0,0,3873084,0,0,3859264.8,0,0,3836060.2,0,0,3822842.7,0,0,3753529.9,0,0,3717529.2,0,0,3723003.5,0,0,3544947.6,0,0,3484126.2,0,0,3574883.8,0,0,3239251.6,0,0,3143090.2,0,0,3380124.5,0,0,2844641.6,0,0,2704667.4}; +VT(0.021428571,0.3,0,0.024877102,0.29495936,0,0.028571429,0.3,0){0,0,0,0,0,72135.52,0,0,0,0,0,0,0,0,-216205.93,0,0,0,0,0,0,0,0,359676.71,0,0,0,0,0,0,0,0,-502149.61,0,0,0,0,0,0,0,0,642973.44,0,0,0}; +VT(0.028571429,0,0,0.025051818,0.0051959301,0,0.021428571,0,0){0,0,3033980.1,0,0,2747435.6,0,0,2419501.9,0,0,3033983.4,0,0,2739316.7,0,0,2419561.9,0,0,3033988.7,0,0,2723095.2,0,0,2419679.8,0,0,3034024.4,0,0,2698832.3,0,0,2419876.4,0,0,3033982.5,0,0,2666496.7,0,0,2419989.4}; +VT(0.093922759,0.092262381,0,0.09416017,0.099511923,0,0.087331535,0.0958472,0){0,0,652083.63,0,0,613994.66,0,0,1318484.3,0,0,89312.894,0,0,5422.3845,0,0,98077.228,0,0,-550573,0,0,-608645.22,0,0,-1213131.9,0,0,-715327.2,0,0,-619557.01,0,0,-1401481.2,0,0,-262838.8,0,0,-16415.987,0,0,-292629.72}; +VT(0.01093484,0.12117452,0,0.012365279,0.12660144,0,0.0061411468,0.1246533,0){0,0,1052666.9,0,0,1158576.2,0,0,591118.91,0,0,-426753.37,0,0,-596487.84,0,0,-280990.71,0,0,-1306415.4,0,0,-1447959.2,0,0,-738586.84,0,0,-350052.21,0,0,-105993.81,0,0,-106527.54,0,0,1098212.1,0,0,1396357.8,0,0,682629.18}; +VT(0.0061411468,0.1246533,0,0.012365279,0.12660144,0,0.0072553778,0.13224921,0){0,0,591118.91,0,0,1158576.2,0,0,674958.82,0,0,-280990.71,0,0,-596487.84,0,0,-425463.67,0,0,-738586.84,0,0,-1447959.2,0,0,-832230.25,0,0,-106527.54,0,0,-105993.81,0,0,117822.57,0,0,682629.18,0,0,1396357.8,0,0,875622.71}; +VT(0.066803853,0.25459223,0,0.068237016,0.26229006,0,0.060672356,0.25950081,0){0,0,789541.66,0,0,639705.29,0,0,771273.27,0,0,-2193455.3,0,0,-1820649,0,0,-2177172.3,0,0,3110738.9,0,0,2721368.6,0,0,3197356.1,0,0,-3337877,0,0,-3203243.1,0,0,-3651078,0,0,2824240.3,0,0,3191912.1,0,0,3457676.3}; +VT(0.060555575,0.040182349,0,0.067616069,0.037109229,0,0.066401409,0.0434645,0){0,0,3588260.7,0,0,3239242.7,0,0,3289675.8,0,0,2962222.2,0,0,2756202.5,0,0,2619840.6,0,0,1819353,0,0,1862139.4,0,0,1416557.6,0,0,359025.67,0,0,690369.93,0,0,-75156.319,0,0,-1164330.1,0,0,-584563.48,0,0,-1551772}; +VT(0.016878531,0.18478654,0,0.021212478,0.18688263,0,0.017373248,0.19021363,0){0,0,1113458.1,0,0,1339179.6,0,0,1095255.9,0,0,-1906862.4,0,0,-2348119.2,0,0,-1990705.9,0,0,245299.96,0,0,429909.33,0,0,532263.7,0,0,1732097.5,0,0,2024227.8,0,0,1555631.8,0,0,-1479759.2,0,0,-1955356.8,0,0,-1804413.6}; +VT(0.021251228,0.18136297,0,0.021212478,0.18688263,0,0.016878531,0.18478654,0){0,0,1398279.8,0,0,1339179.6,0,0,1113458.1,0,0,-2300353.4,0,0,-2348119.2,0,0,-1906862.4,0,0,85724.805,0,0,429909.33,0,0,245299.96,0,0,2245163.6,0,0,2024227.8,0,0,1732097.5,0,0,-1534338.6,0,0,-1955356.8,0,0,-1479759.2}; +VT(0.029991713,0.27132489,0,0.025044032,0.27464897,0,0.023009638,0.26878949,0){0,0,469504.82,0,0,363665.57,0,0,417665.14,0,0,-1366503,0,0,-1065519.5,0,0,-1208783.5,0,0,2141236.7,0,0,1692735.8,0,0,1871958.7,0,0,-2724385.3,0,0,-2201379.5,0,0,-2337004.8,0,0,3063642.3,0,0,2555652.6,0,0,2554445.3}; +VT(0.023009638,0.26878949,0,0.025044032,0.27464897,0,0.018422519,0.27450763,0){0,0,417665.14,0,0,363665.57,0,0,282501.19,0,0,-1208783.5,0,0,-1065519.5,0,0,-827496.14,0,0,1871958.7,0,0,1692735.8,0,0,1313896,0,0,-2337004.8,0,0,-2201379.5,0,0,-1707268.8,0,0,2554445.3,0,0,2555652.6,0,0,1979556.1}; +VT(0.048866761,0.029559705,0,0.054261983,0.029107824,0,0.052748817,0.036292023,0){0,0,3831772.8,0,0,3801269,0,0,3796611.1,0,0,3467532.3,0,0,3450822.2,0,0,3254886.9,0,0,2773676.3,0,0,2782228.4,0,0,2248728.5,0,0,1816186,0,0,1857139.4,0,0,921690.78,0,0,685852.4,0,0,760852.59,0,0,-537197.11}; +VT(0.069025318,0.11622387,0,0.06715469,0.10983132,0,0.074105201,0.11070107,0){0,0,2631986.5,0,0,2794834,0,0,2359475.3,0,0,-808686.45,0,0,-512277.78,0,0,-471755.94,0,0,-3192250.9,0,0,-3213264.7,0,0,-2736894.8,0,0,-1402768.4,0,0,-2112070.8,0,0,-1717960.7,0,0,2220554.1,0,0,1488257.3,0,0,1362139.4}; +VT(0.036912897,0.21765752,0,0.042541479,0.22296234,0,0.034969012,0.22634925,0){0,0,1486590.9,0,0,1481591,0,0,1299939.6,0,0,-3421295.1,0,0,-3531706.6,0,0,-3164156.1,0,0,2965983.4,0,0,3405357.4,0,0,3237729.2,0,0,-438566.7,0,0,-1180392.3,0,0,-1478956,0,0,-2395869.1,0,0,-1772446.7,0,0,-1117524.9}; +VT(0.034969012,0.22634925,0,0.042541479,0.22296234,0,0.041402067,0.22952626,0){0,0,1299939.6,0,0,1481591,0,0,1348916.4,0,0,-3164156.1,0,0,-3531706.6,0,0,-3344816,0,0,3237729.2,0,0,3405357.4,0,0,3600200.4,0,0,-1478956,0,0,-1180392.3,0,0,-1982154,0,0,-1117524.9,0,0,-1772446.7,0,0,-667743.82}; +VT(0.036602132,0.28491153,0,0.028198926,0.28535727,0,0.030312881,0.27848596,0){0,0,279518.56,0,0,230200.16,0,0,355416.48,0,0,-831596.18,0,0,-685197.76,0,0,-1048284.8,0,0,1362985.6,0,0,1124120.6,0,0,1688178.9,0,0,-1860498.2,0,0,-1536674.3,0,0,-2242771,0,0,2311728.5,0,0,1912913.1,0,0,2683885.3}; +VT(0.072126291,0.10515927,0,0.06715469,0.10983132,0,0.065931692,0.10408722,0){0,0,2539730.3,0,0,2794834,0,0,2911358.9,0,0,-241283.81,0,0,-512277.78,0,0,-218409.17,0,0,-2758172.2,0,0,-3213264.7,0,0,-3113407,0,0,-2254933.2,0,0,-2112070.8,0,0,-2661455,0,0,717337.89,0,0,1488257.3,0,0,651464.78}; +VT(0.049165273,0.076760106,0,0.047469022,0.070467195,0,0.054876921,0.07294965,0){0,0,3570137.5,0,0,3608010.8,0,0,3558755.8,0,0,1384898,0,0,1730907.5,0,0,1580988.4,0,0,-1648055.9,0,0,-1046792,0,0,-1275447.3,0,0,-3672308.6,0,0,-3280034.9,0,0,-3423192.1,0,0,-3449021.3,0,0,-3807136.9,0,0,-3669097.1}; +VT(0.085115353,0.26563346,0,0.086077973,0.27164165,0,0.081004963,0.27070547,0){0,0,313056.52,0,0,243157.03,0,0,333174.81,0,0,-899063.8,0,0,-708191.99,0,0,-968418.7,0,0,1369900.4,0,0,1111255.9,0,0,1513258.3,0,0,-1665255.4,0,0,-1417072.6,0,0,-1916833.2,0,0,1747205.8,0,0,1598582.9,0,0,2141327.9}; +VT(0.080699945,0.029142305,0,0.085916752,0.02828,0,0.084917502,0.034253561,0){0,0,2185639.9,0,0,1643257.2,0,0,1742331.8,0,0,1983669.2,0,0,1500211.7,0,0,1520580.8,0,0,1598386.1,0,0,1226559.7,0,0,1105294,0,0,1065401.8,0,0,846114.35,0,0,549324.68,0,0,433818.71,0,0,391827.49,0,0,-76880.401}; +VT(0.016939848,0.22904958,0,0.012706169,0.22573828,0,0.017207343,0.22323305,0){0,0,714788.59,0,0,571782.3,0,0,781289.63,0,0,-1767596.2,0,0,-1386624.6,0,0,-1865590.4,0,0,1888698.3,0,0,1404300.2,0,0,1807835.2,0,0,-1014237.8,0,0,-614658.98,0,0,-643322.1,0,0,-395054.79,0,0,-528535.98,0,0,-915362.92}; +VT(0.011838853,0.2301677,0,0.012706169,0.22573828,0,0.016939848,0.22904958,0){0,0,504229.49,0,0,571782.3,0,0,714788.59,0,0,-1254859.2,0,0,-1386624.6,0,0,-1767596.2,0,0,1363834.1,0,0,1404300.2,0,0,1888698.3,0,0,-775392.51,0,0,-614658.98,0,0,-1014237.8,0,0,-209768.04,0,0,-528535.98,0,0,-395054.79}; +VT(0.018343869,0.21720619,0,0.021120118,0.21068669,0,0.02463475,0.21609565,0){0,0,888277.19,0,0,1077357.5,0,0,1153636.1,0,0,-2037897.4,0,0,-2356401.7,0,0,-2626116.1,0,0,1749211,0,0,1720167.1,0,0,2198315,0,0,-225952.88,0,0,314292.11,0,0,-179791.92,0,0,-1457259.1,0,0,-2093742.8,0,0,-1969098.8}; +VT(0.054237851,0.14012792,0,0.049213686,0.13705186,0,0.053497526,0.1329974,0){0,0,2856617.8,0,0,2922689.8,0,0,2959143.9,0,0,-2267029,0,0,-2132523.3,0,0,-1911000.9,0,0,-3324577.4,0,0,-3499251.9,0,0,-3636096,0,0,1580891.3,0,0,1186505.2,0,0,623103.97,0,0,3650971.5,0,0,3819996.4,0,0,3857035.6}; +VT(0.023009638,0.26878949,0,0.027951851,0.26533243,0,0.029991713,0.27132489,0){0,0,417665.14,0,0,539100.43,0,0,469504.82,0,0,-1208783.5,0,0,-1547025.6,0,0,-1366503,0,0,1871958.7,0,0,2353298.6,0,0,2141236.7,0,0,-2337004.8,0,0,-2852826.8,0,0,-2724385.3,0,0,2554445.3,0,0,2980285,0,0,3063642.3}; +VT(0.1,0.071428571,0,0.095867013,0.068756454,0,0.1,0.064285714,0){0,0,0,0,0,470210.65,0,0,0,0,0,0,0,0,236792.42,0,0,0,0,0,0,0,0,-114175.46,0,0,0,0,0,0,0,0,-408471.99,0,0,0,0,0,0,0,0,-500215.61,0,0,0}; +VT(0.039366597,0.19088868,0,0.038852293,0.18542603,0,0.044234359,0.18859393,0){0,0,1982365.2,0,0,2057873,0,0,2102462.5,0,0,-3628592.6,0,0,-3549951.2,0,0,-3756018.8,0,0,1030950.1,0,0,516044.6,0,0,851571.98,0,0,2772526.5,0,0,3175871.5,0,0,3086402.5,0,0,-3333638.5,0,0,-2819104.7,0,0,-3279385.1}; +VT(0.044234359,0.18859393,0,0.038852293,0.18542603,0,0.043573225,0.18196099,0){0,0,2102462.5,0,0,2057873,0,0,2202933.2,0,0,-3756018.8,0,0,-3549951.2,0,0,-3650165.7,0,0,851571.98,0,0,516044.6,0,0,195066.32,0,0,3086402.5,0,0,3175871.5,0,0,3522129.2,0,0,-3279385.1,0,0,-2819104.7,0,0,-2509350}; +VT(0.010546892,0.2198034,0,0.012706169,0.22573828,0,0.0069979116,0.22643766,0){0,0,514716.79,0,0,571782.3,0,0,317964.48,0,0,-1201974.2,0,0,-1386624.6,0,0,-774386.26,0,0,1090194.6,0,0,1404300.2,0,0,793599.18,0,0,-253690.09,0,0,-614658.98,0,0,-364658.79,0,0,-751659.26,0,0,-528535.98,0,0,-270536.88}; +VT(0.0069979116,0.22643766,0,0.012706169,0.22573828,0,0.011838853,0.2301677,0){0,0,317964.48,0,0,571782.3,0,0,504229.49,0,0,-774386.26,0,0,-1386624.6,0,0,-1254859.2,0,0,793599.18,0,0,1404300.2,0,0,1363834.1,0,0,-364658.79,0,0,-614658.98,0,0,-775392.51,0,0,-270536.88,0,0,-528535.98,0,0,-209768.04}; +VT(0.078571429,0,0,0.074656208,0.0053403125,0,0.071428571,0,0){0,0,2419478.6,0,0,2772385.5,0,0,3033974.4,0,0,2419535.2,0,0,2763721.5,0,0,3033978.9,0,0,2419645.1,0,0,2746414.1,0,0,3033982.8,0,0,2419827.2,0,0,2720533.7,0,0,3034008.5,0,0,2420024.4,0,0,2685936.9,0,0,3033714}; +VT(0,0.1,0,0.0052460498,0.10332732,0,0,0.10714286,0){0,0,0,0,0,545715.18,0,0,0,0,0,0,0,0,-33256.292,0,0,0,0,0,0,0,0,-576983.54,0,0,0,0,0,0,0,0,-508602.25,0,0,0,0,0,0,0,0,99155.047,0,0,0}; +VT(0.071428571,0.3,0,0.074657371,0.29452352,0,0.078571429,0.3,0){0,0,0,0,0,79525.554,0,0,0,0,0,0,0,0,-238312.39,0,0,0,0,0,0,0,0,396309.36,0,0,0,0,0,0,0,0,-552992.95,0,0,0,0,0,0,0,0,707611.71,0,0,0}; +VT(0.1,0.16428571,0,0.093710586,0.16080643,0,0.1,0.15714286,0){0,0,0,0,0,507346.27,0,0,0,0,0,0,0,0,-621948.04,0,0,0,0,0,0,0,0,-366919.85,0,0,0,0,0,0,0,0,704920.6,0,0,0,0,0,0,0,0,207593.47,0,0,0}; +VT(0.042113175,0.053290167,0,0.035422008,0.053603109,0,0.038515413,0.047952704,0){0,0,3616583.4,0,0,3344502.1,0,0,3516906.1,0,0,2519252.9,0,0,2318078.8,0,0,2648581.9,0,0,657513.67,0,0,580213.58,0,0,1126309.3,0,0,-1403801.4,0,0,-1335777.4,0,0,-674068.75,0,0,-3039615.4,0,0,-2842327.2,0,0,-2308227.3}; +VT(0.038435934,0.058364632,0,0.035422008,0.053603109,0,0.042113175,0.053290167,0){0,0,3459248.5,0,0,3344502.1,0,0,3616583.4,0,0,2206750.4,0,0,2318078.8,0,0,2519252.9,0,0,155241.86,0,0,580213.58,0,0,657513.67,0,0,-1952496,0,0,-1335777.4,0,0,-1403801.4,0,0,-3353689.4,0,0,-2842327.2,0,0,-3039615.4}; +VT(0.03345202,0.18222482,0,0.034128539,0.18892309,0,0.027249449,0.18607819,0){0,0,1947746.5,0,0,1872288.6,0,0,1646413.8,0,0,-3237509.5,0,0,-3356683.8,0,0,-2861109.6,0,0,196057.01,0,0,788949.65,0,0,464444.42,0,0,3107788.7,0,0,2731311.2,0,0,2518610.9,0,0,-2254322.8,0,0,-2954777.5,0,0,-2323177.4}; +VT(0.1,0.17857143,0,0.095837038,0.182565,0,0.093873231,0.17693503,0){0,0,0,0,0,291932.87,0,0,445896.9,0,0,0,0,0,-487211.17,0,0,-694096.79,0,0,0,0,0,33971.767,0,0,-59504.029,0,0,0,0,0,464480.32,0,0,727141.13,0,0,0,0,0,-344762.9,0,0,-345394.37}; +VT(0.031105381,0.06529626,0,0.032659307,0.059686042,0,0.037071258,0.0642048,0){0,0,3030579.1,0,0,3158137.1,0,0,3365311.2,0,0,1667989.8,0,0,1964024.3,0,0,1900443.5,0,0,-444570.51,0,0,27282.242,0,0,-391679.98,0,0,-2357289.6,0,0,-1919818.3,0,0,-2513388.8,0,0,-3210321.2,0,0,-3141270.1,0,0,-3541461.8}; +VT(0.08415119,0.061061125,0,0.085646934,0.067722415,0,0.079822506,0.065677674,0){0,0,1759442.9,0,0,1585902.9,0,0,2163855.5,0,0,1064240.3,0,0,821166.94,0,0,1180001.4,0,0,-51487.645,0,0,-339583.13,0,0,-340376.77,0,0,-1146904.2,0,0,-1336670.3,0,0,-1706002.2,0,0,-1789550.6,0,0,-1689538.4,0,0,-2296197.5}; +VT(0.079822506,0.065677674,0,0.085646934,0.067722415,0,0.080160084,0.071577727,0){0,0,2163855.5,0,0,1585902.9,0,0,2107851.9,0,0,1180001.4,0,0,821166.94,0,0,977984.82,0,0,-340376.77,0,0,-339583.13,0,0,-676141.96,0,0,-1706002.2,0,0,-1336670.3,0,0,-1967920.1,0,0,-2296197.5,0,0,-1689538.4,0,0,-2205119.3}; +VT(0.067098511,0.16826118,0,0.066399282,0.17458324,0,0.060825265,0.17090728,0){0,0,2121688.2,0,0,2061554.2,0,0,2288734.2,0,0,-2928224.5,0,0,-3111294.6,0,0,-3282960.5,0,0,-1008555.7,0,0,-477290.81,0,0,-862639.89,0,0,3311710.7,0,0,3354405.6,0,0,3657845.3,0,0,-250662.47,0,0,-1230983.2,0,0,-726586.11}; +VT(0.060859952,0.17787963,0,0.061291474,0.18447479,0,0.055202425,0.1814475,0){0,0,2182203,0,0,2069396,0,0,2227021.2,0,0,-3438395.7,0,0,-3531333.7,0,0,-3667462.5,0,0,-202892.1,0,0,425331.11,0,0,145084.74,0,0,3555311.4,0,0,3230965.1,0,0,3573754.5,0,0,-1844119.8,0,0,-2708277.6,0,0,-2457046.3}; +VT(0.1,0.12142857,0,0.094962535,0.11849101,0,0.1,0.11428571,0){0,0,0,0,0,497557.04,0,0,0,0,0,0,0,0,-175139.73,0,0,0,0,0,0,0,0,-611084.48,0,0,0,0,0,0,0,0,-220851.73,0,0,0,0,0,0,0,0,467971.5,0,0,0}; +VT(0.091758141,0.11296708,0,0.094962535,0.11849101,0,0.089230742,0.11966768,0){0,0,824791.32,0,0,497557.04,0,0,1043332.5,0,0,-201020.76,0,0,-175139.73,0,0,-391602.7,0,0,-976886.6,0,0,-611084.48,0,0,-1287980.7,0,0,-537824.26,0,0,-220851.73,0,0,-412950.99,0,0,570097.26,0,0,467971.5,0,0,1030099.2}; +VT(0.1,0.11428571,0,0.094962535,0.11849101,0,0.091758141,0.11296708,0){0,0,0,0,0,497557.04,0,0,824791.32,0,0,0,0,0,-175139.73,0,0,-201020.76,0,0,0,0,0,-611084.48,0,0,-976886.6,0,0,0,0,0,-220851.73,0,0,-537824.26,0,0,0,0,0,467971.5,0,0,570097.26}; +VT(0,0.24285714,0,0.0043813653,0.24702694,0,0,0.25,0){0,0,0,0,0,145794.38,0,0,0,0,0,0,0,0,-393661.32,0,0,0,0,0,0,0,0,523477.05,0,0,0,0,0,0,0,0,-496310.62,0,0,0,0,0,0,0,0,320224.07,0,0,0}; +VT(0,0.05,0,0.004777904,0.053197076,0,0,0.057142857,0){0,0,0,0,0,557925.04,0,0,0,0,0,0,0,0,389224.92,0,0,0,0,0,0,0,0,102822.82,0,0,0,0,0,0,0,0,-214698.3,0,0,0,0,0,0,0,0,-467537.22,0,0,0}; +VT(0.047918899,0.14257657,0,0.049213686,0.13705186,0,0.054237851,0.14012792,0){0,0,2842478.3,0,0,2922689.8,0,0,2856617.8,0,0,-2400971.6,0,0,-2132523.3,0,0,-2267029,0,0,-3215455,0,0,-3499251.9,0,0,-3324577.4,0,0,1901551.7,0,0,1186505.2,0,0,1580891.3,0,0,3510918.5,0,0,3819996.4,0,0,3650971.5}; +VT(0.049678492,0.18505966,0,0.044234359,0.18859393,0,0.043573225,0.18196099,0){0,0,2196886.7,0,0,2102462.5,0,0,2202933.2,0,0,-3774046.6,0,0,-3756018.8,0,0,-3650165.7,0,0,512508.07,0,0,851571.98,0,0,195066.32,0,0,3406255.6,0,0,3086402.5,0,0,3522129.2,0,0,-2958276.7,0,0,-3279385.1,0,0,-2509350}; +VT(0.050398693,0.1921099,0,0.044234359,0.18859393,0,0.049678492,0.18505966,0){0,0,2077292.2,0,0,2102462.5,0,0,2196886.7,0,0,-3850553.1,0,0,-3756018.8,0,0,-3774046.6,0,0,1209682,0,0,851571.98,0,0,512508.07,0,0,2818064.5,0,0,3086402.5,0,0,3406255.6,0,0,-3615771.1,0,0,-3279385.1,0,0,-2958276.7}; +VT(0.055202425,0.1814475,0,0.055890502,0.18802963,0,0.049678492,0.18505966,0){0,0,2227021.2,0,0,2110328.4,0,0,2196886.7,0,0,-3667462.5,0,0,-3747121.1,0,0,-3774046.6,0,0,145084.74,0,0,795966.68,0,0,512508.07,0,0,3573754.5,0,0,3129878.5,0,0,3406255.6,0,0,-2457046.3,0,0,-3224012.4,0,0,-2958276.7}; +VT(0.1,0.27857143,0,0.095069321,0.27540052,0,0.1,0.27142857,0){0,0,0,0,0,76899.446,0,0,0,0,0,0,0,0,-225624.71,0,0,0,0,0,0,0,0,359465.9,0,0,0,0,0,0,0,0,-469594.27,0,0,0,0,0,0,0,0,548580.83,0,0,0}; +VT(0.066600159,0.24211306,0,0.061408089,0.24582042,0,0.059437672,0.2400817,0){0,0,1004296.2,0,0,1017142.7,0,0,1145348.7,0,0,-2655015,0,0,-2732695.2,0,0,-2999714,0,0,3359675.2,0,0,3591948.1,0,0,3711340.5,0,0,-2867211.3,0,0,-3325647.6,0,0,-3009146,0,0,1352854.8,0,0,2017029.8,0,0,1160252.2}; +VT(0.065478411,0.24860928,0,0.061408089,0.24582042,0,0.066600159,0.24211306,0){0,0,912058.17,0,0,1017142.7,0,0,1004296.2,0,0,-2478342.9,0,0,-2732695.2,0,0,-2655015,0,0,3344041.2,0,0,3591948.1,0,0,3359675.2,0,0,-3264436.9,0,0,-3325647.6,0,0,-2867211.3,0,0,2261773.6,0,0,2017029.8,0,0,1352854.8}; +VT(0.1,0.028571429,0,0.095041081,0.024587994,0,0.1,0.021428571,0){0,0,0,0,0,597113.29,0,0,0,0,0,0,0,0,557751.32,0,0,0,0,0,0,0,0,481620.22,0,0,0,0,0,0,0,0,373740.48,0,0,0,0,0,0,0,0,241099.33,0,0,0}; +VT(0.019165757,0.095107709,0,0.024499807,0.092422798,0,0.024938414,0.098415267,0){0,0,1930971.9,0,0,2390452.1,0,0,2383058.5,0,0,168744.63,0,0,320672.29,0,0,68195.72,0,0,-1747493.7,0,0,-2026771.7,0,0,-2312962.3,0,0,-2069009.1,0,0,-2619357.9,0,0,-2447461.4,0,0,-502664.26,0,0,-944222.72,0,0,-204726.33}; +VT(0.041643161,0.17482395,0,0.036146522,0.16944297,0,0.042242048,0.16806859,0){0,0,2284160.6,0,0,2222447.1,0,0,2399442.3,0,0,-3458410.7,0,0,-3121229.8,0,0,-3302042.1,0,0,-506290.81,0,0,-960241.74,0,0,-1157324.9,0,0,3718851.8,0,0,3509731.4,0,0,3737475.6,0,0,-1405815.9,0,0,-459324.98,0,0,-248746.29}; +VT(0.022876349,0.043626948,0,0.025565101,0.048609543,0,0.019247887,0.048569646,0){0,0,2488553.5,0,0,2702312,0,0,2135187.8,0,0,1978130.3,0,0,2017092.5,0,0,1594654.5,0,0,1061959.9,0,0,820389.33,0,0,650408.09,0,0,-72059.632,0,0,-584372.75,0,0,-458538.7,0,0,-1191549.5,0,0,-1841258.2,0,0,-1451674.1}; +VT(0.038217426,0.13599196,0,0.044512931,0.13802764,0,0.041319833,0.14315875,0){0,0,2738753.8,0,0,2867370.6,0,0,2735557.7,0,0,-1938161,0,0,-2150242,0,0,-2343944,0,0,-3305386.1,0,0,-3405187.4,0,0,-3071175.4,0,0,972060.89,0,0,1298632.3,0,0,1904337.3,0,0,3589652.3,0,0,3729885,0,0,3343927.4}; +VT(0.083559522,0.13424014,0,0.081009521,0.1385969,0,0.076271482,0.13373081,0){0,0,1462145.4,0,0,1630909.4,0,0,2012844.4,0,0,-981746.52,0,0,-1242340.3,0,0,-1330317.6,0,0,-1784737.2,0,0,-1926924,0,0,-2463975.8,0,0,395362.65,0,0,783271.16,0,0,494859.01,0,0,1914407.3,0,0,2113542.9,0,0,2631758.9}; +VT(0.071059851,0.17209017,0,0.066399282,0.17458324,0,0.067098511,0.16826118,0){0,0,1900690.4,0,0,2061554.2,0,0,2121688.2,0,0,-2772233.4,0,0,-3111294.6,0,0,-2928224.5,0,0,-629520.98,0,0,-477290.81,0,0,-1008555.7,0,0,3060958.1,0,0,3354405.6,0,0,3311710.7,0,0,-774142.34,0,0,-1230983.2,0,0,-250662.47}; +VT(0.041319833,0.14315875,0,0.044512931,0.13802764,0,0.047918899,0.14257657,0){0,0,2735557.7,0,0,2867370.6,0,0,2842478.3,0,0,-2343944,0,0,-2150242,0,0,-2400971.6,0,0,-3071175.4,0,0,-3405187.4,0,0,-3215455,0,0,1904337.3,0,0,1298632.3,0,0,1901551.7,0,0,3343927.4,0,0,3729885,0,0,3510918.5}; +VT(0,0.16428571,0,0.0046637588,0.16745308,0,0,0.17142857,0){0,0,0,0,0,362371.83,0,0,0,0,0,0,0,0,-494096.85,0,0,0,0,0,0,0,0,-182769.85,0,0,0,0,0,0,0,0,560561.48,0,0,0,0,0,0,0,0,-21256.565,0,0,0}; +VT(0.049678492,0.18505966,0,0.055890502,0.18802963,0,0.050398693,0.1921099,0){0,0,2196886.7,0,0,2110328.4,0,0,2077292.2,0,0,-3774046.6,0,0,-3747121.1,0,0,-3850553.1,0,0,512508.07,0,0,795966.68,0,0,1209682,0,0,3406255.6,0,0,3129878.5,0,0,2818064.5,0,0,-2958276.7,0,0,-3224012.4,0,0,-3615771.1}; +VT(0.043573225,0.18196099,0,0.048811039,0.17808485,0,0.049678492,0.18505966,0){0,0,2202933.2,0,0,2310715.6,0,0,2196886.7,0,0,-3650165.7,0,0,-3650410,0,0,-3774046.6,0,0,195066.32,0,0,-194330.82,0,0,512508.07,0,0,3522129.2,0,0,3763231.4,0,0,3406255.6,0,0,-2509350,0,0,-1987755.8,0,0,-2958276.7}; +VT(0.066710408,0.18109144,0,0.07206248,0.1830344,0,0.06771074,0.1881525,0){0,0,1958233.8,0,0,1716055.3,0,0,1821405.7,0,0,-3210995.9,0,0,-2879815.5,0,0,-3238423,0,0,95959.418,0,0,236909.5,0,0,698008.36,0,0,3149708.8,0,0,2719220.1,0,0,2695511.5,0,0,-2111256.9,0,0,-2081132.3,0,0,-2795478.4}; +VT(0.1,0.18571429,0,0.095837038,0.182565,0,0.1,0.17857143,0){0,0,0,0,0,291932.87,0,0,0,0,0,0,0,0,-487211.17,0,0,0,0,0,0,0,0,33971.767,0,0,0,0,0,0,0,0,464480.32,0,0,0,0,0,0,0,0,-344762.9,0,0,0}; +VT(0.042242048,0.16806859,0,0.036146522,0.16944297,0,0.038427921,0.16264679,0){0,0,2399442.3,0,0,2222447.1,0,0,2389351.9,0,0,-3302042.1,0,0,-3121229.8,0,0,-3020403.6,0,0,-1157324.9,0,0,-960241.74,0,0,-1591681.4,0,0,3737475.6,0,0,3509731.4,0,0,3440909.6,0,0,-248746.29,0,0,-459324.98,0,0,682723.32}; +VT(0.042541479,0.22296234,0,0.04727629,0.22823863,0,0.041402067,0.22952626,0){0,0,1481591,0,0,1418822.2,0,0,1348916.4,0,0,-3531706.6,0,0,-3492237.2,0,0,-3344816,0,0,3405357.4,0,0,3684627.2,0,0,3600200.4,0,0,-1180392.3,0,0,-1892328,0,0,-1982154,0,0,-1772446.7,0,0,-919608.01,0,0,-667743.82}; +VT(0.049797208,0.2214244,0,0.04727629,0.22823863,0,0.042541479,0.22296234,0){0,0,1551864.2,0,0,1418822.2,0,0,1481591,0,0,-3662861.4,0,0,-3492237.2,0,0,-3531706.6,0,0,3430735.4,0,0,3684627.2,0,0,3405357.4,0,0,-1003918.8,0,0,-1892328,0,0,-1180392.3,0,0,-2065424.5,0,0,-919608.01,0,0,-1772446.7}; +VT(0.062195955,0.11505156,0,0.05615957,0.1141762,0,0.059543685,0.10776494,0){0,0,2965673.8,0,0,3147681.4,0,0,3132791.5,0,0,-843057.19,0,0,-840990.83,0,0,-451048.14,0,0,-3569130.8,0,0,-3764018.8,0,0,-3519016.9,0,0,-1711501.2,0,0,-1917372.9,0,0,-2561357.9,0,0,2344130.4,0,0,2358868.4,0,0,1326599.2}; +VT(0.093823791,0.12410599,0,0.087905667,0.12517971,0,0.089230742,0.11966768,0){0,0,595735.92,0,0,1140990.9,0,0,1043332.5,0,0,-276601.23,0,0,-554517.87,0,0,-391602.7,0,0,-743959.63,0,0,-1425990.8,0,0,-1287980.7,0,0,-121937.8,0,0,-178453.87,0,0,-412950.99,0,0,678759.2,0,0,1334087.8,0,0,1030099.2}; +VT(0.066710408,0.18109144,0,0.066399282,0.17458324,0,0.071841704,0.17726974,0){0,0,1958233.8,0,0,2061554.2,0,0,1799263.7,0,0,-3210995.9,0,0,-3111294.6,0,0,-2812994.5,0,0,95959.418,0,0,-477290.81,0,0,-214389.53,0,0,3149708.8,0,0,3354405.6,0,0,2933842.6,0,0,-2111256.9,0,0,-1230983.2,0,0,-1438939.3}; +VT(0.095453592,0.18738967,0,0.095837038,0.182565,0,0.1,0.18571429,0){0,0,307137.29,0,0,291932.87,0,0,0,0,0,-541566.85,0,0,-487211.17,0,0,0,0,0,106216.39,0,0,33971.767,0,0,0,0,0,460538.95,0,0,464480.32,0,0,0,0,0,-458087.35,0,0,-344762.9,0,0,0}; +VT(0.089858368,0.18421461,0,0.095837038,0.182565,0,0.095453592,0.18738967,0){0,0,692603.24,0,0,291932.87,0,0,307137.29,0,0,-1178349.1,0,0,-487211.17,0,0,-541566.85,0,0,133849.22,0,0,33971.767,0,0,106216.39,0,0,1084450.2,0,0,464480.32,0,0,460538.95,0,0,-894447.98,0,0,-344762.9,0,0,-458087.35}; +VT(0.054692531,0.17439284,0,0.048811039,0.17808485,0,0.048076401,0.17082416,0){0,0,2346407.8,0,0,2310715.6,0,0,2424680.5,0,0,-3532168.6,0,0,-3650410,0,0,-3473815.1,0,0,-561454.61,0,0,-194330.82,0,0,-921629.25,0,0,3816051.1,0,0,3763231.4,0,0,3872759.5,0,0,-1367177.6,0,0,-1987755.8,0,0,-754316.94}; +VT(0.030623168,0.1713445,0,0.034648589,0.17585937,0,0.027644767,0.17736901,0){0,0,1985985.4,0,0,2080615.7,0,0,1774040.3,0,0,-2866418.8,0,0,-3193762.3,0,0,-2777088.7,0,0,-715248.18,0,0,-371953.81,0,0,-203929.31,0,0,3183566.3,0,0,3392886,0,0,2892544.7,0,0,-696442.05,0,0,-1443588.4,0,0,-1431643.3}; +VT(0.027644767,0.17736901,0,0.034648589,0.17585937,0,0.03345202,0.18222482,0){0,0,1774040.3,0,0,2080615.7,0,0,1947746.5,0,0,-2777088.7,0,0,-3193762.3,0,0,-3237509.5,0,0,-203929.31,0,0,-371953.81,0,0,196057.01,0,0,2892544.7,0,0,3392886,0,0,3107788.7,0,0,-1431643.3,0,0,-1443588.4,0,0,-2254322.8}; +VT(0.0060491453,0.25298129,0,0.0043813653,0.24702694,0,0.0087429334,0.24792416,0){0,0,178654.23,0,0,145794.38,0,0,283453.34,0,0,-493529.07,0,0,-393661.32,0,0,-768118.62,0,0,691183.17,0,0,523477.05,0,0,1029935.2,0,0,-724662.05,0,0,-496310.62,0,0,-992967.39,0,0,585970.08,0,0,320224.07,0,0,667809.3}; +VT(0,0.25,0,0.0043813653,0.24702694,0,0.0060491453,0.25298129,0){0,0,0,0,0,145794.38,0,0,178654.23,0,0,0,0,0,-393661.32,0,0,-493529.07,0,0,0,0,0,523477.05,0,0,691183.17,0,0,0,0,0,-496310.62,0,0,-724662.05,0,0,0,0,0,320224.07,0,0,585970.08}; +VT(0.093823791,0.12410599,0,0.094962535,0.11849101,0,0.1,0.12142857,0){0,0,595735.92,0,0,497557.04,0,0,0,0,0,-276601.23,0,0,-175139.73,0,0,0,0,0,-743959.63,0,0,-611084.48,0,0,0,0,0,-121937.8,0,0,-220851.73,0,0,0,0,0,678759.2,0,0,467971.5,0,0,0}; +VT(0.076430303,0.18837043,0,0.07206248,0.1830344,0,0.077619244,0.18028791,0){0,0,1444535.6,0,0,1716055.3,0,0,1471797.4,0,0,-2574453.4,0,0,-2879815.5,0,0,-2389894.4,0,0,569102.25,0,0,236909.5,0,0,18944.546,0,0,2129625.3,0,0,2719220.1,0,0,2378251.6,0,0,-2235391.7,0,0,-2081132.3,0,0,-1502642.9}; +VT(0.027249449,0.18607819,0,0.021212478,0.18688263,0,0.021251228,0.18136297,0){0,0,1646413.8,0,0,1339179.6,0,0,1398279.8,0,0,-2861109.6,0,0,-2348119.2,0,0,-2300353.4,0,0,464444.42,0,0,429909.33,0,0,85724.805,0,0,2518610.9,0,0,2024227.8,0,0,2245163.6,0,0,-2323177.4,0,0,-1955356.8,0,0,-1534338.6}; +VT(0.072908259,0.24139656,0,0.066600159,0.24211306,0,0.070607657,0.23670872,0){0,0,881474.92,0,0,1004296.2,0,0,1007105.3,0,0,-2322734,0,0,-2655015,0,0,-2594870.8,0,0,2916335.3,0,0,3359675.2,0,0,3083897.2,0,0,-2445637.4,0,0,-2867211.3,0,0,-2267120.1,0,0,1082242,0,0,1352854.8,0,0,490193.02}; +VT(0.089230742,0.11966768,0,0.094962535,0.11849101,0,0.093823791,0.12410599,0){0,0,1043332.5,0,0,497557.04,0,0,595735.92,0,0,-391602.7,0,0,-175139.73,0,0,-276601.23,0,0,-1287980.7,0,0,-611084.48,0,0,-743959.63,0,0,-412950.99,0,0,-220851.73,0,0,-121937.8,0,0,1030099.2,0,0,467971.5,0,0,678759.2}; +VT(0.038435934,0.058364632,0,0.032659307,0.059686042,0,0.035422008,0.053603109,0){0,0,3459248.5,0,0,3158137.1,0,0,3344502.1,0,0,2206750.4,0,0,1964024.3,0,0,2318078.8,0,0,155241.86,0,0,27282.242,0,0,580213.58,0,0,-1952496,0,0,-1919818.3,0,0,-1335777.4,0,0,-3353689.4,0,0,-3141270.1,0,0,-2842327.2}; +VT(0.050960377,0.23252058,0,0.04727629,0.22823863,0,0.053624899,0.22742186,0){0,0,1342135.9,0,0,1418822.2,0,0,1430137,0,0,-3383651.2,0,0,-3492237.2,0,0,-3503302.1,0,0,3804738.6,0,0,3684627.2,0,0,3648370.9,0,0,-2403721.7,0,0,-1892328,0,0,-1785483,0,0,-148681.88,0,0,-919608.01,0,0,-1060301.4}; +VT(0.025641665,0.25311603,0,0.033025927,0.25326882,0,0.030217898,0.25971254,0){0,0,680173.91,0,0,809560.38,0,0,660621.26,0,0,-1879847.5,0,0,-2238649.8,0,0,-1866014.4,0,0,2635470.4,0,0,3142273.3,0,0,2744196,0,0,-2768550.2,0,0,-3308331.9,0,0,-3141188.1,0,0,2247361.6,0,0,2697705.3,0,0,2987009.7}; +VT(0.017207343,0.22323305,0,0.021374843,0.22646669,0,0.016939848,0.22904958,0){0,0,781289.63,0,0,906782.43,0,0,714788.59,0,0,-1865590.4,0,0,-2208721,0,0,-1767596.2,0,0,1807835.2,0,0,2264460.9,0,0,1888698.3,0,0,-643322.1,0,0,-1042528.4,0,0,-1014237.8,0,0,-915362.92,0,0,-767856.24,0,0,-395054.79}; +VT(0.027746664,0.13122119,0,0.023379755,0.12686903,0,0.030575169,0.1246812,0){0,0,2296333.1,0,0,2047772.9,0,0,2526238.7,0,0,-1399007.9,0,0,-1065433.1,0,0,-1202245.8,0,0,-2843055.5,0,0,-2558991,0,0,-3156412.2,0,0,288094.78,0,0,-162203.53,0,0,-451924.48,0,0,2955532.6,0,0,2481221.5,0,0,2919641.1}; +VT(0.0064812773,0.046734878,0,0.004777904,0.053197076,0,0,0.05,0){0,0,761350.4,0,0,557925.04,0,0,0,0,0,582610.88,0,0,389224.92,0,0,0,0,0,267082.8,0,0,102822.82,0,0,0,0,0,-111174.21,0,0,-214698.3,0,0,0,0,0,-463416.67,0,0,-467537.22,0,0,0}; +VT(0.0094132111,0.052421332,0,0.004777904,0.053197076,0,0.0064812773,0.046734878,0){0,0,1088603.4,0,0,557925.04,0,0,761350.4,0,0,768702.62,0,0,389224.92,0,0,582610.88,0,0,222919.17,0,0,102822.82,0,0,267082.8,0,0,-388347.22,0,0,-214698.3,0,0,-111174.21,0,0,-885762.83,0,0,-467537.22,0,0,-463416.67}; +VT(0.060567191,0.25172758,0,0.061408089,0.24582042,0,0.065478411,0.24860928,0){0,0,917440.34,0,0,1017142.7,0,0,912058.17,0,0,-2522838.3,0,0,-2732695.2,0,0,-2478342.9,0,0,3497206.6,0,0,3591948.1,0,0,3344041.2,0,0,-3596815.5,0,0,-3325647.6,0,0,-3264436.9,0,0,2796536,0,0,2017029.8,0,0,2261773.6}; +VT(0.077619244,0.18028791,0,0.07206248,0.1830344,0,0.071841704,0.17726974,0){0,0,1471797.4,0,0,1716055.3,0,0,1799263.7,0,0,-2389894.4,0,0,-2879815.5,0,0,-2812994.5,0,0,18944.546,0,0,236909.5,0,0,-214389.53,0,0,2378251.6,0,0,2719220.1,0,0,2933842.6,0,0,-1502642.9,0,0,-2081132.3,0,0,-1438939.3}; +VT(0.071841704,0.17726974,0,0.07206248,0.1830344,0,0.066710408,0.18109144,0){0,0,1799263.7,0,0,1716055.3,0,0,1958233.8,0,0,-2812994.5,0,0,-2879815.5,0,0,-3210995.9,0,0,-214389.53,0,0,236909.5,0,0,95959.418,0,0,2933842.6,0,0,2719220.1,0,0,3149708.8,0,0,-1438939.3,0,0,-2081132.3,0,0,-2111256.9}; +VT(0.060859952,0.17787963,0,0.066399282,0.17458324,0,0.066710408,0.18109144,0){0,0,2182203,0,0,2061554.2,0,0,1958233.8,0,0,-3438395.7,0,0,-3111294.6,0,0,-3210995.9,0,0,-202892.1,0,0,-477290.81,0,0,95959.418,0,0,3555311.4,0,0,3354405.6,0,0,3149708.8,0,0,-1844119.8,0,0,-1230983.2,0,0,-2111256.9}; +VT(0.0062494098,0.068021592,0,0.012193394,0.066188359,0,0.011197941,0.071439681,0){0,0,709501.16,0,0,1364188,0,0,1244724.5,0,0,364477.97,0,0,734639.92,0,0,579995.21,0,0,-157824.6,0,0,-233939.49,0,0,-394493.66,0,0,-603457.47,0,0,-1094586.7,0,0,-1158343.6,0,0,-756039.79,0,0,-1450385,0,0,-1303869.8}; +VT(0.016939848,0.22904958,0,0.021374843,0.22646669,0,0.022740693,0.23189018,0){0,0,714788.59,0,0,906782.43,0,0,887604.04,0,0,-1767596.2,0,0,-2208721,0,0,-2230116.3,0,0,1888698.3,0,0,2264460.9,0,0,2485475.6,0,0,-1014237.8,0,0,-1042528.4,0,0,-1529145.6,0,0,-395054.79,0,0,-767856.24,0,0,-172982.46}; +VT(0.019165757,0.095107709,0,0.013714026,0.097839388,0,0.013428016,0.091778472,0){0,0,1930971.9,0,0,1412613.2,0,0,1408980.1,0,0,168744.63,0,0,55008.627,0,0,204626.15,0,0,-1747493.7,0,0,-1355500.2,0,0,-1174648.8,0,0,-2069009.1,0,0,-1463354,0,0,-1549888.7,0,0,-502664.26,0,0,-165174.7,0,0,-600683.83}; +VT(0.053624899,0.22742186,0,0.04727629,0.22823863,0,0.049797208,0.2214244,0){0,0,1430137,0,0,1418822.2,0,0,1551864.2,0,0,-3503302.1,0,0,-3492237.2,0,0,-3662861.4,0,0,3648370.9,0,0,3684627.2,0,0,3430735.4,0,0,-1785483,0,0,-1892328,0,0,-1003918.8,0,0,-1060301.4,0,0,-919608.01,0,0,-2065424.5}; +VT(0.034648589,0.17585937,0,0.038433858,0.18005903,0,0.03345202,0.18222482,0){0,0,2080615.7,0,0,2131117.1,0,0,1947746.5,0,0,-3193762.3,0,0,-3450732.6,0,0,-3237509.5,0,0,-371953.81,0,0,5612.0128,0,0,196057.01,0,0,3392886,0,0,3447337.8,0,0,3107788.7,0,0,-1443588.4,0,0,-2140463.9,0,0,-2254322.8}; +VT(0.028699663,0.054481756,0,0.025565101,0.048609543,0,0.032229878,0.047894836,0){0,0,2920693,0,0,2702312,0,0,3188476.9,0,0,1995520.8,0,0,2017092.5,0,0,2403076.1,0,0,438210.61,0,0,820389.33,0,0,1025710.6,0,0,-1257984.1,0,0,-584372.75,0,0,-604377.64,0,0,-2556170.3,0,0,-1841258.2,0,0,-2086050.7}; +VT(0.03345202,0.18222482,0,0.038433858,0.18005903,0,0.038852293,0.18542603,0){0,0,1947746.5,0,0,2131117.1,0,0,2057873,0,0,-3237509.5,0,0,-3450732.6,0,0,-3549951.2,0,0,196057.01,0,0,5612.0128,0,0,516044.6,0,0,3107788.7,0,0,3447337.8,0,0,3175871.5,0,0,-2254322.8,0,0,-2140463.9,0,0,-2819104.7}; +VT(0.071841704,0.17726974,0,0.066399282,0.17458324,0,0.071059851,0.17209017,0){0,0,1799263.7,0,0,2061554.2,0,0,1900690.4,0,0,-2812994.5,0,0,-3111294.6,0,0,-2772233.4,0,0,-214389.53,0,0,-477290.81,0,0,-629520.98,0,0,2933842.6,0,0,3354405.6,0,0,3060958.1,0,0,-1438939.3,0,0,-1230983.2,0,0,-774142.34}; +VT(0.06137482,0.19024807,0,0.061291474,0.18447479,0,0.06771074,0.1881525,0){0,0,1976038.9,0,0,2069396,0,0,1821405.7,0,0,-3592882,0,0,-3531333.7,0,0,-3238423,0,0,963745.22,0,0,425331.11,0,0,698008.36,0,0,2804392.5,0,0,3230965.1,0,0,2695511.5,0,0,-3258719.1,0,0,-2708277.6,0,0,-2795478.4}; +VT(0.06771074,0.1881525,0,0.061291474,0.18447479,0,0.066710408,0.18109144,0){0,0,1821405.7,0,0,2069396,0,0,1958233.8,0,0,-3238423,0,0,-3531333.7,0,0,-3210995.9,0,0,698008.36,0,0,425331.11,0,0,95959.418,0,0,2695511.5,0,0,3230965.1,0,0,3149708.8,0,0,-2795478.4,0,0,-2708277.6,0,0,-2111256.9}; +VT(0.0081152275,0.10988635,0,0.01198914,0.11616091,0,0.0062042788,0.11791514,0){0,0,821145.89,0,0,1171325.2,0,0,612847.32,0,0,-151361.79,0,0,-358450.6,0,0,-208741.13,0,0,-944689.8,0,0,-1420119.3,0,0,-750565.55,0,0,-619246.83,0,0,-627101.02,0,0,-286207.66,0,0,439508.43,0,0,984768,0,0,561848.67}; +VT(0.0062042788,0.11791514,0,0.01198914,0.11616091,0,0.01093484,0.12117452,0){0,0,612847.32,0,0,1171325.2,0,0,1052666.9,0,0,-208741.13,0,0,-358450.6,0,0,-426753.37,0,0,-750565.55,0,0,-1420119.3,0,0,-1306415.4,0,0,-286207.66,0,0,-627101.02,0,0,-350052.21,0,0,561848.67,0,0,984768,0,0,1098212.1}; +VT(0.081922129,0.20489902,0,0.086709216,0.20730703,0,0.081656406,0.2108727,0){0,0,996952.98,0,0,734117.03,0,0,951384.03,0,0,-2081157.6,0,0,-1563285.8,0,0,-2083808.1,0,0,1266338.6,0,0,1031586.7,0,0,1528962.6,0,0,704044.3,0,0,398134,0,0,263916.4,0,0,-2032271.3,0,0,-1481512.9,0,0,-1843401}; +VT(0.060825265,0.17090728,0,0.066399282,0.17458324,0,0.060859952,0.17787963,0){0,0,2288734.2,0,0,2061554.2,0,0,2182203,0,0,-3282960.5,0,0,-3111294.6,0,0,-3438395.7,0,0,-862639.89,0,0,-477290.81,0,0,-202892.1,0,0,3657845.3,0,0,3354405.6,0,0,3555311.4,0,0,-726586.11,0,0,-1230983.2,0,0,-1844119.8}; +VT(0.084619556,0.23283838,0,0.084319616,0.22565969,0,0.09071018,0.22887426,0){0,0,621044.17,0,0,696453.76,0,0,406264.77,0,0,-1568398.7,0,0,-1688204.7,0,0,-1003622.2,0,0,1771426.2,0,0,1707540.6,0,0,1069446.3,0,0,-1133733.9,0,0,-743250.94,0,0,-568907.82,0,0,-42283.716,0,0,-649719.93,0,0,-233040.27}; +VT(0.078984823,0.22953004,0,0.084319616,0.22565969,0,0.084619556,0.23283838,0){0,0,858343.29,0,0,696453.76,0,0,621044.17,0,0,-2128428.8,0,0,-1688204.7,0,0,-1568398.7,0,0,2291087.1,0,0,1707540.6,0,0,1771426.2,0,0,-1261656.1,0,0,-743250.94,0,0,-1133733.9,0,0,-424553.92,0,0,-649719.93,0,0,-42283.716}; +VT(0.023309936,0.19197185,0,0.025476801,0.19755762,0,0.018704911,0.19716585,0){0,0,1390526.6,0,0,1423125.8,0,0,1103230.1,0,0,-2573914.4,0,0,-2782737.9,0,0,-2149261.2,0,0,799964.88,0,0,1235431.1,0,0,934589.13,0,0,1893175.4,0,0,1602470.1,0,0,1263201.6,0,0,-2411477.9,0,0,-2766638.2,0,0,-2132672.2}; +VT(0.029690249,0.19362013,0,0.025476801,0.19755762,0,0.023309936,0.19197185,0){0,0,1647856.1,0,0,1423125.8,0,0,1390526.6,0,0,-3101495.4,0,0,-2782737.9,0,0,-2573914.4,0,0,1088093.1,0,0,1235431.1,0,0,799964.88,0,0,2141745.7,0,0,1602470.1,0,0,1893175.4,0,0,-2977851,0,0,-2766638.2,0,0,-2411477.9}; +VT(0.038852293,0.18542603,0,0.034128539,0.18892309,0,0.03345202,0.18222482,0){0,0,2057873,0,0,1872288.6,0,0,1947746.5,0,0,-3549951.2,0,0,-3356683.8,0,0,-3237509.5,0,0,516044.6,0,0,788949.65,0,0,196057.01,0,0,3175871.5,0,0,2731311.2,0,0,3107788.7,0,0,-2819104.7,0,0,-2954777.5,0,0,-2254322.8}; +VT(0.039366597,0.19088868,0,0.034128539,0.18892309,0,0.038852293,0.18542603,0){0,0,1982365.2,0,0,1872288.6,0,0,2057873,0,0,-3628592.6,0,0,-3356683.8,0,0,-3549951.2,0,0,1030950.1,0,0,788949.65,0,0,516044.6,0,0,2772526.5,0,0,2731311.2,0,0,3175871.5,0,0,-3333638.5,0,0,-2954777.5,0,0,-2819104.7}; +VT(0.05,0,0,0.051745598,0.0053231545,0,0.046181733,0.0056701177,0){0,0,3880596.9,0,0,3873250.9,0,0,3851009.3,0,0,3880622.4,0,0,3861228.9,0,0,3837454.5,0,0,3880662.8,0,0,3837214.6,0,0,3810385,0,0,3880737.9,0,0,3801308.2,0,0,3769920.5,0,0,3880625.6,0,0,3753417.7,0,0,3715901.2}; +VT(0.045931579,0.29422002,0,0.051526128,0.29458598,0,0.05,0.3,0){0,0,116468.36,0,0,109871.78,0,0,0,0,0,-348980.73,0,0,-329256.34,0,0,0,0,0,580225.36,0,0,547568.39,0,0,0,0,0,-809364.6,0,0,-764098.34,0,0,0,0,0,1035478,0,0,977975.34,0,0,0}; +VT(0.017373248,0.19021363,0,0.021212478,0.18688263,0,0.023309936,0.19197185,0){0,0,1095255.9,0,0,1339179.6,0,0,1390526.6,0,0,-1990705.9,0,0,-2348119.2,0,0,-2573914.4,0,0,532263.7,0,0,429909.33,0,0,799964.88,0,0,1555631.8,0,0,2024227.8,0,0,1893175.4,0,0,-1804413.6,0,0,-1955356.8,0,0,-2411477.9}; +VT(0.08682376,0.20181233,0,0.086709216,0.20730703,0,0.081922129,0.20489902,0){0,0,767576.83,0,0,734117.03,0,0,996952.98,0,0,-1560255.4,0,0,-1563285.8,0,0,-2081157.6,0,0,843726.65,0,0,1031586.7,0,0,1266338.6,0,0,688912.23,0,0,398134,0,0,704044.3,0,0,-1555436.8,0,0,-1481512.9,0,0,-2032271.3}; +VT(0.08466046,0.11619385,0,0.082946441,0.12207685,0,0.077013163,0.11736903,0){0,0,1475783,0,0,1589878.9,0,0,2095773.2,0,0,-452604.25,0,0,-673263.29,0,0,-691227.47,0,0,-1789662.1,0,0,-1978038.1,0,0,-2559181.5,0,0,-788262.21,0,0,-467139.5,0,0,-1023961.4,0,0,1243195.1,0,0,1708498.9,0,0,1873161.8}; +VT(0.065117308,0.15657509,0,0.064971856,0.15110456,0,0.070477538,0.15360968,0){0,0,2354870.2,0,0,2431817,0,0,2153625.7,0,0,-2678881.2,0,0,-2488096.1,0,0,-2316413.6,0,0,-1986291.9,0,0,-2374265.3,0,0,-1978592.7,0,0,2952219.2,0,0,2543085,0,0,2466066.8,0,0,1580034,0,0,2315361.9,0,0,1792310.4}; +VT(0.036308441,0.24745658,0,0.033139613,0.24047735,0,0.040431855,0.24188745,0){0,0,958174.94,0,0,1026889.2,0,0,1110505,0,0,-2591684.5,0,0,-2694450.7,0,0,-2932804,0,0,3460190.4,0,0,3348643.4,0,0,3702149.5,0,0,-3307339.6,0,0,-2743423.6,0,0,-3142324.5,0,0,2177878.8,0,0,1106136.5,0,0,1453973.2}; +VT(0.035422008,0.053603109,0,0.032659307,0.059686042,0,0.028699663,0.054481756,0){0,0,3344502.1,0,0,3158137.1,0,0,2920693,0,0,2318078.8,0,0,1964024.3,0,0,1995520.8,0,0,580213.58,0,0,27282.242,0,0,438210.61,0,0,-1335777.4,0,0,-1919818.3,0,0,-1257984.1,0,0,-2842327.2,0,0,-3141270.1,0,0,-2556170.3}; +VT(0.083337094,0.16031526,0,0.088623123,0.15812222,0,0.088381846,0.16289419,0){0,0,1295652.6,0,0,918302.92,0,0,911153.68,0,0,-1575018.8,0,0,-1074338,0,0,-1156470.7,0,0,-956036.82,0,0,-735787.48,0,0,-599768.12,0,0,1781183.7,0,0,1199414.9,0,0,1317920.1,0,0,571788.58,0,0,531983.03,0,0,244888.24}; +VT(0.029124573,0.24658198,0,0.033139613,0.24047735,0,0.036308441,0.24745658,0){0,0,849052.23,0,0,1026889.2,0,0,958174.94,0,0,-2288340.2,0,0,-2694450.7,0,0,-2591684.5,0,0,3030093.5,0,0,3348643.4,0,0,3460190.4,0,0,-2848204.4,0,0,-2743423.6,0,0,-3307339.6,0,0,1797881.3,0,0,1106136.5,0,0,2177878.8}; +VT(0.058552205,0.15400025,0,0.064971856,0.15110456,0,0.065117308,0.15657509,0){0,0,2589572.8,0,0,2431817,0,0,2354870.2,0,0,-2806487.5,0,0,-2488096.1,0,0,-2678881.2,0,0,-2354581.2,0,0,-2374265.3,0,0,-1986291.9,0,0,3003966,0,0,2543085,0,0,2952219.2,0,0,2103059.1,0,0,2315361.9,0,0,1580034}; +VT(0.026971271,0.22659033,0,0.02301506,0.22157032,0,0.029518097,0.21985532,0){0,0,1090633.5,0,0,1025043.6,0,0,1264894.2,0,0,-2658504.1,0,0,-2421684.9,0,0,-2954793.2,0,0,2731189,0,0,2274566.1,0,0,2682751.8,0,0,-1267784.1,0,0,-677461.35,0,0,-629411.95,0,0,-909068.56,0,0,-1351813.7,0,0,-1842177.8}; +VT(0.029518097,0.21985532,0,0.02301506,0.22157032,0,0.02463475,0.21609565,0){0,0,1264894.2,0,0,1025043.6,0,0,1153636.1,0,0,-2954793.2,0,0,-2421684.9,0,0,-2626116.1,0,0,2682751.8,0,0,2274566.1,0,0,2198315,0,0,-629411.95,0,0,-677461.35,0,0,-179791.92,0,0,-1842177.8,0,0,-1351813.7,0,0,-1969098.8}; +VT(0.038852293,0.18542603,0,0.038433858,0.18005903,0,0.043573225,0.18196099,0){0,0,2057873,0,0,2131117.1,0,0,2202933.2,0,0,-3549951.2,0,0,-3450732.6,0,0,-3650165.7,0,0,516044.6,0,0,5612.0128,0,0,195066.32,0,0,3175871.5,0,0,3447337.8,0,0,3522129.2,0,0,-2819104.7,0,0,-2140463.9,0,0,-2509350}; +VT(0.095652827,0.22622146,0,0.095706332,0.23121352,0,0.09071018,0.22887426,0){0,0,199039.37,0,0,183910.78,0,0,406264.77,0,0,-484109.58,0,0,-460364.34,0,0,-1003622.2,0,0,494313.66,0,0,508106.39,0,0,1069446.3,0,0,-223837.82,0,0,-303408.65,0,0,-568907.82,0,0,-173819.74,0,0,-52245.513,0,0,-233040.27}; +VT(0.066710408,0.18109144,0,0.061291474,0.18447479,0,0.060859952,0.17787963,0){0,0,1958233.8,0,0,2069396,0,0,2182203,0,0,-3210995.9,0,0,-3531333.7,0,0,-3438395.7,0,0,95959.418,0,0,425331.11,0,0,-202892.1,0,0,3149708.8,0,0,3230965.1,0,0,3555311.4,0,0,-2111256.9,0,0,-2708277.6,0,0,-1844119.8}; +VT(0.09123018,0.070922096,0,0.086276325,0.073599227,0,0.085646934,0.067722415,0){0,0,983713.53,0,0,1502743.3,0,0,1585902.9,0,0,465586.72,0,0,653401.45,0,0,821166.94,0,0,-297764.17,0,0,-565297.67,0,0,-339583.13,0,0,-904277.98,0,0,-1464602.7,0,0,-1336670.3,0,0,-1034644.8,0,0,-1536324.4,0,0,-1689538.4}; +VT(0.085646934,0.067722415,0,0.086276325,0.073599227,0,0.080160084,0.071577727,0){0,0,1585902.9,0,0,1502743.3,0,0,2107851.9,0,0,821166.94,0,0,653401.45,0,0,977984.82,0,0,-339583.13,0,0,-565297.67,0,0,-676141.96,0,0,-1336670.3,0,0,-1464602.7,0,0,-1967920.1,0,0,-1689538.4,0,0,-1536324.4,0,0,-2205119.3}; +VT(0.09123018,0.070922096,0,0.095867013,0.068756454,0,0.095795895,0.073622969,0){0,0,983713.53,0,0,470210.65,0,0,473503.74,0,0,465586.72,0,0,236792.42,0,0,205720.2,0,0,-297764.17,0,0,-114175.46,0,0,-178405.32,0,0,-904277.98,0,0,-408471.99,0,0,-461642.03,0,0,-1034644.8,0,0,-500215.61,0,0,-483922.03}; +VT(0.02301506,0.22157032,0,0.021374843,0.22646669,0,0.017207343,0.22323305,0){0,0,1025043.6,0,0,906782.43,0,0,781289.63,0,0,-2421684.9,0,0,-2208721,0,0,-1865590.4,0,0,2274566.1,0,0,2264460.9,0,0,1807835.2,0,0,-677461.35,0,0,-1042528.4,0,0,-643322.1,0,0,-1351813.7,0,0,-767856.24,0,0,-915362.92}; +VT(0.041643161,0.17482395,0,0.038433858,0.18005903,0,0.034648589,0.17585937,0){0,0,2284160.6,0,0,2131117.1,0,0,2080615.7,0,0,-3458410.7,0,0,-3450732.6,0,0,-3193762.3,0,0,-506290.81,0,0,5612.0128,0,0,-371953.81,0,0,3718851.8,0,0,3447337.8,0,0,3392886,0,0,-1405815.9,0,0,-2140463.9,0,0,-1443588.4}; +VT(0.082709707,0.12855445,0,0.082946441,0.12207685,0,0.087905667,0.12517971,0){0,0,1568327.1,0,0,1589878.9,0,0,1140990.9,0,0,-869760.99,0,0,-673263.29,0,0,-554517.87,0,0,-1955764.1,0,0,-1978038.1,0,0,-1425990.8,0,0,-1353.9511,0,0,-467139.5,0,0,-178453.87,0,0,1955094.7,0,0,1708498.9,0,0,1334087.8}; +VT(0.095090425,0.2489538,0,0.095492809,0.25375881,0,0.090077759,0.25268961,0){0,0,157454.16,0,0,131307.15,0,0,291813.61,0,0,-428416.46,0,0,-363726.6,0,0,-805257.31,0,0,579817.55,0,0,512510.07,0,0,1125037.4,0,0,-569427.53,0,0,-543451.99,0,0,-1174248.1,0,0,400020.01,0,0,449348.78,0,0,940920.06}; +VT(0.08974924,0.047235181,0,0.095360834,0.0462161,0,0.094913401,0.051076335,0){0,0,1190814.4,0,0,547145.45,0,0,595503.05,0,0,905328.07,0,0,421466.87,0,0,429138.45,0,0,402804.56,0,0,198977.54,0,0,142901.48,0,0,-196265.4,0,0,-69217.008,0,0,-183223.65,0,0,-748421.11,0,0,-321602.09,0,0,-458373.75}; +VT(0.1,0.22857143,0,0.095706332,0.23121352,0,0.095652827,0.22622146,0){0,0,0,0,0,183910.78,0,0,199039.37,0,0,0,0,0,-460364.34,0,0,-484109.58,0,0,0,0,0,508106.39,0,0,494313.66,0,0,0,0,0,-303408.65,0,0,-223837.82,0,0,0,0,0,-52245.513,0,0,-173819.74}; +VT(0.049213686,0.13705186,0,0.044512931,0.13802764,0,0.045894811,0.13135905,0){0,0,2922689.8,0,0,2867370.6,0,0,2973475.7,0,0,-2132523.3,0,0,-2150242,0,0,-1819976.4,0,0,-3499251.9,0,0,-3405187.4,0,0,-3679581.9,0,0,1186505.2,0,0,1298632.3,0,0,392676.16,0,0,3819996.4,0,0,3729885,0,0,3832095.1}; +VT(0.047918899,0.14257657,0,0.044512931,0.13802764,0,0.049213686,0.13705186,0){0,0,2842478.3,0,0,2867370.6,0,0,2922689.8,0,0,-2400971.6,0,0,-2150242,0,0,-2132523.3,0,0,-3215455,0,0,-3405187.4,0,0,-3499251.9,0,0,1901551.7,0,0,1298632.3,0,0,1186505.2,0,0,3510918.5,0,0,3729885,0,0,3819996.4}; +VT(0.026971271,0.22659033,0,0.021374843,0.22646669,0,0.02301506,0.22157032,0){0,0,1090633.5,0,0,906782.43,0,0,1025043.6,0,0,-2658504.1,0,0,-2208721,0,0,-2421684.9,0,0,2731189,0,0,2264460.9,0,0,2274566.1,0,0,-1267784.1,0,0,-1042528.4,0,0,-677461.35,0,0,-909068.56,0,0,-767856.24,0,0,-1351813.7}; +VT(0.095795895,0.073622969,0,0.095867013,0.068756454,0,0.1,0.071428571,0){0,0,473503.74,0,0,470210.65,0,0,0,0,0,205720.2,0,0,236792.42,0,0,0,0,0,-178405.32,0,0,-114175.46,0,0,0,0,0,-461642.03,0,0,-408471.99,0,0,0,0,0,-483922.03,0,0,-500215.61,0,0,0}; +}; diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..fb1391cf84f1d34faedc158c0b42c961097ce09a --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,41 @@ + +RM = rm +RMFLAGS = -f + +dvi: + texi2dvi gmsh.texi + +ps: dvi + dvips gmsh -o + +pdf: + texi2pdf gmsh.texi + +html: + texi2html -expandinfo -number -split_chapter gmsh.texi + +html2: + Texi2html -init_file gmsh.htmlconfig gmsh.texi + +html3: + makeinfo --html gmsh.texi + +info: + makeinfo gmsh.texi + +infoz: + gtar zcvf gmsh-info.tgz gmsh.info* + +doc: ps pdf html info + +install: + cp gmsh.info* /usr/local/info/ + install-info gmsh.info /usr/local/info/dir + +clean: + $(RM) $(RMFLAGS) *.cp* *.fn* *.ky* *.pg* *.tp* *.vr* *.mv* \ + *.log *.toc *.aux \ + *.dvi *.ps gmsh.pdf \ + *.html *.info* gmsh-info.tgz* + + diff --git a/doc/gmsh.1 b/doc/gmsh.1 new file mode 100644 index 0000000000000000000000000000000000000000..0f9fd79d35195868b9cfcc42bcff77dec54831ec --- /dev/null +++ b/doc/gmsh.1 @@ -0,0 +1,200 @@ +.\" ====================================================================== +.\" +.\" This is the manual page for Gmsh +.\" +.\" Copyright (c) 2000 C. Geuzaine, J.-F. Remacle +.\" +.\" ====================================================================== +.TH Gmsh 0.995 "23 November 2000" +.UC 4 +.\" ====================================================================== +.SH NAME +Gmsh \- a 3D mesh generator with built-in pre- and post-processing +facilities +.\" ====================================================================== +.SH SYNOPSIS +.B gmsh [file(s)] [option(s)] +.\" ====================================================================== +.SH DESCRIPTION +\fIGmsh\fR is an automatic three-dimensional finite element mesh +generator, primarily Delaunay, with built-in pre- and post-processing +facilities. Its primal goal is to provide a simple meshing tool for +academic test cases with parametric input and up to date visualization +capabilities. One of the strengths of \fIGmsh\fR is its ability to +respect a characteristic length field for the generation of adapted +meshes on lines, surfaces and volumes. These adapted meshes can be +mixed with simple structured (transfinite, elliptic, etc.) meshes in +order to augment the flexibility. +.SS Geometrical Entity Definition +Parameterized geometries are created by successively defining points, +oriented curves (segments, circles, ellipsis, splines, etc.), oriented +surfaces (plane surfaces, ruled surfaces, etc.) and volumes. Compound +groups of geometrical entities can be defined, based on these elementary +parameterized geometric entities. +.SS Mesh Generation +A finite element mesh is a tessellation of a given subset of R^3 by +elementary geometrical elements of various shapes (in this case lines, +triangles, quadrangles, tetrahedra, prisms and hexahedra), arranged in +such a way that two of them intersect, if they do, along a common +face, edge or node, and never otherwise. All the finite element meshes +produced by \fIGmsh\fR as unstructured, even if they were generated in +a structured way. This implies that the elementary geometrical +elements are defined only by an ordered list of their vertices (which +allows the orientation of all their lower order geometrical entities) +but no predefined relation is assumed between any two elementary +elements. +.PP +The procedure follows the same order as for the geometry creation: +curves are discretized first; the mesh of the curves is then used to +mesh the surfaces; then the mesh of the surfaces is used to mesh the +volumes. This automatically assures the continuity of the mesh when, +for example, two surfaces share a common curve. Every meshing step is +constrained by the characteristic length field, which can be uniform, +specified by characteristic length associated to elementary +geometrical entities, or associated to another mesh (the background +mesh). +.PP +For each meshing step (i.e. the discretization of lines, surfaces and +volumes), all structured mesh directives are executed first, and serve +as additional constraints for the unstructured parts. The implemented +Delaunay algorithm is subdivided in the following five steps for +surface/volume discretization: +.TP 4 +.B 1. +trivial meshing of a box including the convex polygon/polyhedron +defined by the boundary nodes resulting from the discretization of the +curves/surfaces; +.TP 4 +.B 2. +creation of the initial mesh by insertion of all the nodes on the +curves/surfaces thanks to the Bowyer algorithm; +.TP 4 +.B 3. +boundary restoration to force all the edges/faces of the +curves/surfaces to be present in the initial mesh; +.TP 4 +.B 4. +suppression of all the undesired triangles/tetrahedra (in +particular those containing the nodes of the initial box); +.TP 4 +.B 5. +insertion of new nodes by the Bowyer algorithm until the +characteristic size of each simplex is lower or equal to the +characteristic length field evaluated at the center of its +circumscribed circle/sphere. +.SS Scalar, vector and tensor field Visualization +Multiple post-processing scalar or vector maps can be loaded and +manipulated (globally or individually) along with the geometry and the +mesh. Scalar fields are represented by iso-value curves or color maps +and vector fields by three-dimensional arrows or displacement +maps. Post-processor functions include offsets, elevation, interactive +color map modification, range clamping, interactive animation, vector +postscript output, etc. +.\" ====================================================================== +.SH MESH OPTIONS +.TP 4 +.B file[s] +one or more ASCII file(s) containing the geometrical, mesh or +post-processing descriptions. +.TP 4 +.B \-0 +parse all input files and exit. +.TP 4 +.B \-1 +perform the one-dimensional mesh, i.e. discretize all the curves in +the geometry. +.TP 4 +.B \-2 +perform the two-dimensional mesh, i.e. discretize all the surfaces in +the geometry. +.TP 4 +.B \-3 +perform the three-dimensional mesh, i.e. discretize all the volumes in +the geometry. +.TP 4 +.B \-smooth int +set the number of smoothing passes (default value is 3). +.TP 4 +.B \-degree int +set the degree of the generated elements (default value is 1). +.TP 4 +.B \-scale float +apply a global scaling factor to the generated mesh (default value is +1.0). +.TP 4 +.B \-bgm file +load view in file as current background mesh. +.TP 4 +.B \-extrude +extrude 2-dimensional mesh (interactively) +.TP 4 +.B \-recombine +recombine extruded meshes +.\" ====================================================================== +.SH POST-PROCESSING OPTIONS +.TP 4 +.B \-dl +enable OpenGL display lists. +.TP 4 +.B \-noview +hide all views at startup. +.\" ====================================================================== +.SH DISPLAY OPTIONS +.TP 4 +.B \-nodb +suppress the double buffer. Use this options if you use \fIGmsh\fR on +a remote host without GLX. +.TP 4 +.B \-noov +suppress overlay visual. +.TP 4 +.B \-alpha +enable alpha blending. +.TP 4 +.B \-info +show visual info at startup. +.TP 4 +.B \-geometry geom +specify main window geometry. +.TP 4 +.B \-viewport 9*float. +specify rotation, translation and scale +.TP 4 +.B \-display disp. +specify display. +.TP 4 +.B \-perspective +use perspective instead of orthographic projection. +.TP 4 +.B \-flash +allow colormap flashing. +.TP 4 +.B \-samevisual +force same visual for OpenGL and GUI. +.\" ====================================================================== +.SH OTHER OPTIONS +.TP 4 +.B \-threads +enable threads. +.TP 4 +.B \-path string +set the path for included files. +.TP 4 +.B \-version +show version information. +.TP 4 +.B \-help +show help message. +.\" ====================================================================== +.SH AUTHORS +Christophe Geuzaine (Christope.Geuzaine@ulg.ac.be) and Jean-Francois +Remacle (remacle@scorec.rpi.edu). +.\" ====================================================================== +.SH SEE ALSO +Gmsh homepage at \fIhttp://www.geuz.org/gmsh/\fR +.PP +Gmsh example files in \fI/usr/doc/gmsh-0.995/\fR +.PP +GetDP (a scientific computation software for the numerical solution of +integro-differential equations, using finite element and integral type +methods) at \fIhttp://www.geuz.org/getdp/\fR diff --git a/doc/gmsh.texi b/doc/gmsh.texi new file mode 100644 index 0000000000000000000000000000000000000000..a51045c43b1e302629c37886289d6d4ae0e373c3 --- /dev/null +++ b/doc/gmsh.texi @@ -0,0 +1,220 @@ +\input texinfo.tex @c -*-texinfo-*- +@c ========================================================================= +@c +@c This is the GMSH documentation texinfo source file +@c +@c Indexing : @cindex == concepts +@c @tindex == syntax +@c @mvindex == metasyntactic variables +@c +@c Before release, run C-u C-c C-u C-a in GNU Emacs +@c This updates all node pointers and menus +@c +@c ========================================================================= +@c %**start of header +@setfilename gmsh.info +@set EDITION 0.1 +@set VERSION 0.98 +@set UPDATED 4 March 2000 +@set UPDATE-MONTH March 2000 +@set COPYRIGHT @copyright{} 1997-2000 Christophe Geuzaine, Jean-Francois Remacle +@set WEB @uref{http://www.geuz.org/gmsh/} +@settitle GMSH @value{VERSION} +@footnotestyle separate +@setchapternewpage odd +@paragraphindent 0 +@finalout +@defcodeindex mv +@c %**end of header + +@ifinfo +@dircategory Mesh Generation +@direntry +* Gmsh: (gmsh). a mesh generator with pre- and post-processing facilities +@end direntry +@noindent +This is Edition @value{EDITION}, last updated @value{UPDATED}, of the +@cite{Gmsh Manual}, for Gmsh, Version @value{VERSION}. +@noindent +Copyright @value{COPYRIGHT} +@end ifinfo + +@iftex +@global@let@bullet=- +@global@let@sl=@it +@global@setfont@indit@itshape{9}{1000} +@global@let@linkcolor=@Blue +@parskip=5pt +@end iftex + +@c ========================================================================= +@c Title page +@c ========================================================================= + +@shorttitlepage Gmsh +@titlepage +@title Gmsh +@subtitle The documentation for Gmsh, Version @value{VERSION} +@subtitle A automatic mesh generator with pre- and post-processing facilities +@subtitle +@subtitle Edition @value{EDITION}, @value{UPDATE-MONTH} + +@author Christophe Geuzaine +@author Jean-Francois Remacle + +@page +@vskip 0pt plus 1filll +Copyright @value{COPYRIGHT} +@sp 1 +This document was prepared with Texinfo (@uref{http://texinfo.org}). The source +of this document as well as formatted versions (info, postscript, pdf, html) +are available at @value{WEB}. +@end titlepage + +@c ========================================================================= +@c Table of contents +@c ========================================================================= + +@summarycontents +@contents + +@c ========================================================================= +@c Top node +@c ========================================================================= + +@ifnottex +@node Top, Copying, (dir), (dir) +@top Gmsh + +Gmsh is an automatic three-dimensional mesh generator, with pre- and +post-processing facilities. + +This is Edition @value{EDITION} of the @cite{Gmsh Manual}, last updated +@value{UPDATED} for Gmsh Version @value{VERSION}. +@end ifnottex + + +@c ========================================================================= +@c Master menu +@c ========================================================================= + +@menu +* Copying:: Copyright and copying conditions +* Introduction:: Basic presentation +* Geometry:: +* Mesh:: +* Post-Processing:: +* File formats:: Input and output file formats +* Concept index:: +* Syntax index:: +* Variable index:: +@end menu + + +@c ========================================================================= +@c Copying Conditions +@c ========================================================================= + +@node Copying, Introduction, Top, Top +@unnumbered Copying Conditions + +@cindex Copyright +@cindex Web site +@cindex Internet address +@cindex Download +@cindex Platforms + +Executable versions of Gmsh can be downloaded for most of the classical UNIX +platforms (SUN, DEC, IBM, HP, SGI and Linux) and for Windows 95/98/NT from the +web site @value{WEB} (no source distribution is available for the moment). The +executable versions of Gmsh are free; the only thing asked if you use Gmsh is +to mention it in your work. + +@c ========================================================================= +@c Introduction +@c ========================================================================= + +@node Introduction, Geometry, Copying, Top +@unnumbered Introduction + +@cindex Introduction + +Gmsh . Eventually, the most difficult thing about Gmsh is to find a way to +pronouce 'Gmsh'... + +@c ========================================================================= +@c Geometry +@c ========================================================================= + +@node Geometry, Mesh, Introduction, Top +@unnumbered Geometry + +@cindex Geometry + +@c ========================================================================= +@c Mesh +@c ========================================================================= + +@node Mesh, Post-Processing, Geometry, Top +@unnumbered Mesh + +@cindex Mesh + +@c ========================================================================= +@c Post-Processing +@c ========================================================================= + +@node Post-Processing, File formats, Mesh, Top +@unnumbered Post-Processing + +@cindex Post-Processing + + +@c ========================================================================= +@c File Formats +@c ========================================================================= + +@node File formats, Concept index, Post-Processing, Top +@appendix File Formats + + + +@c ========================================================================= +@c Concept Index +@c ========================================================================= + +@node Concept index, Syntax index, File formats, Top +@unnumbered Concept Index + +@cindex Index, concepts +@cindex Concepts, index + +@printindex cp + +@c ========================================================================= +@c Syntax Index +@c ========================================================================= + +@node Syntax index, Variable index, Concept index, Top +@unnumbered Syntax Index + +@cindex Index, syntax +@cindex Syntax, index +@cindex Keywords, index + +@printindex tp + +@c ========================================================================= +@c Variable Index +@c ========================================================================= + +@node Variable index, , Syntax index, Top +@unnumbered Variable Index + +@cindex Index, metasyntactic variables +@cindex Variables, index +@cindex Metasyntactic variables, index + +@printindex mv + +@bye diff --git a/examples/Bug_MaillageSplines.geo b/examples/Bug_MaillageSplines.geo new file mode 100644 index 0000000000000000000000000000000000000000..08ad7be9296f97f78bcdd5117722aca0acbf3361 --- /dev/null +++ b/examples/Bug_MaillageSplines.geo @@ -0,0 +1,11 @@ +Point(1) = {0.0,0.0,0.0,.1}; +Point(2) = {1,0.0,0.0,.1}; +Point(3) = {1,1,0.0,.1}; +Point(4) = {.5,.5,1,.1}; +Point(5) = {1.2,.3,-.2,.1}; +Point(6) = {.5,0,.2,.1}; +Spline(1) = {1,4,3}; +Spline(2) = {3,5,2}; +Spline(3) = {2,6,1}; +Line Loop(4) = {2,3,1}; +Ruled Surface(5) = {4}; diff --git a/examples/big.geo b/examples/big.geo new file mode 100644 index 0000000000000000000000000000000000000000..1a7c0aacf0317cad0b491d158491d7093b1d23cc --- /dev/null +++ b/examples/big.geo @@ -0,0 +1,50 @@ +la = .05; +la2 = .03; + +Point(newp) = {0,0,0,la}; /* Point 1 */ +Point(newp) = {-1,0,0,la}; /* Point 2 */ +Point(newp) = {1,0,0,la}; /* Point 3 */ +Point(newp) = {1.1,0,0,la}; /* Point 4 */ +Point(newp) = {-1.1,0,0,la}; /* Point 5 */ +Circle(2) = {4,1,5}; +Circle(3) = {3,1,2}; +Point(newp) = {-.2,.4,0,la}; /* Point 6 */ +Point(newp) = {-.2,.4,0,la}; /* Point 7 */ +Point(newp) = {.2,.4,0,la}; /* Point 8 */ +Point(newp) = {.6,.4,0,la}; /* Point 9 */ +Point(newp) = {-.6,.4,0,la2}; /* Point 10 */ +Point(newp) = {-.65,.4,0,la2}; /* Point 11 */ +Point(newp) = {-.55,.4,0,la2}; /* Point 12 */ +Point(newp) = {-.25,.4,0,la2}; /* Point 13 */ +Point(newp) = {-.15,.4,0,la2}; /* Point 14 */ +Point(newp) = {.15,.4,0,la2}; /* Point 15 */ +Point(newp) = {.25,.4,0,la2}; /* Point 16 */ +Point(newp) = {.55,.4,0,la2}; /* Point 17 */ +Point(newp) = {.65,.4,0,la2}; /* Point 18 */ + +Circle(4) = {18,9,17}; +Circle(5) = {17,9,18}; +Circle(6) = {16,8,15}; +Circle(7) = {15,8,16}; +Circle(8) = {14,7,13}; +Circle(9) = {13,7,14}; +Circle(10) = {12,10,11}; +Circle(11) = {11,10,12}; + +Line(12) = {5,2}; +Line(13) = {2,3}; +Line(14) = {3,4}; +Loop(15) = {-12,-2,-14,3}; +Plane Surface(16) = {15}; +Loop(17) = {3,13}; +Loop(18) = {10,11}; +Loop(19) = {8,9}; +Loop(20) = {6,7}; +Loop(21) = {4,5}; +Plane Surface(22) = {17,18,19,20,21}; + +Transfinite Line{12,14} = 7 Using Progression 0.9; +Transfinite Line{2,3} = 40; +Transfinite Surface{16} = {5,2,3,4}; + +Recombine Surface{16}; diff --git a/examples/biz.geo b/examples/biz.geo new file mode 100644 index 0000000000000000000000000000000000000000..1652fde2a470880f95c525d7fb07402182f03d21 --- /dev/null +++ b/examples/biz.geo @@ -0,0 +1,27 @@ +Point(1) = {0,0,0,1.0}; +Point(2) = {1,0,0,1.0}; +Point(3) = {.5,1,0,1.0}; +Point(4) = {.75,.5,0,1.0}; +Line(1) = {2,1}; +Line(2) = {1,3}; +Line(3) = {3,4}; +Line(4) = {4,2}; +Line Loop(5) = {1,2,3,4}; +Ruled Surface(6) = {5}; + +Point(5) = {1,1,0.0,1.0}; +Point(6) = {1,.5,0.0,1.0}; +Line(7) = {3,5}; +Line(8) = {5,6}; +Line(9) = {6,4}; +Line Loop(10) = {-3,7,8,9}; +Ruled Surface(11) = {10}; + +Transfinite Line {2,4} = 5; +Transfinite Line {3,1,8} = 10; +Transfinite Line {7,9} = 10; + +Transfinite Surface {6} = {1,2,4,3}; +Transfinite Surface {11} = {4,6,5,3}; + +Recombine Surface {6,11}; diff --git a/examples/brain.geo b/examples/brain.geo new file mode 100644 index 0000000000000000000000000000000000000000..e42ba7b2511f172392a135c9524abc292481dc83 --- /dev/null +++ b/examples/brain.geo @@ -0,0 +1,35 @@ +Point(newp) = {0,0,0,0.1}; /* Point 1 */ +Point(newp) = {1,0,0,0.1}; /* Point 2 */ +Point(newp) = {-1,0,0,0.1}; /* Point 3 */ + +Point(newp) = {0,.8,0,0.1}; /* Point 4 */ +Point(newp) = {0,0,.8,0.1}; /* Point 5 */ +Point(newp) = {0,0,-.8,0.1}; /* Point 6 */ + +Point(newp) = {.1,0,-.79,.1}; /* Point 7 */ +Point(newp) = {.3,0,-.73,.1}; /* Point 8 */ +Point(newp) = {.65,0,-.55,.1}; /* Point 9 */ +Point(newp) = {.9,0,-.38,.1}; /* Point 10 */ + +Point(newp) = {.1,0,.79,.1}; /* Point 11 */ +Point(newp) = {.3,0,.73,.1}; /* Point 12 */ +Point(newp) = {.65,0,.55,.1}; /* Point 13 */ +Point(newp) = {.9,0,.38,.1}; /* Point 14 */ + +Spline(1) = {6,7,8,9,10,2}; +Circle(2) = {6,1,4}; +Circle(3) = {2,1,1,4}; +Line Loop(4) = {3,-2,1}; +Ruled Surface(5) = {4}; + +Spline(6) = {5,11,12,13,14,2}; +Circle(7) = {5,1,4}; +Line Loop(8) = {3,-7,6}; +Ruled Surface(9) = {8}; +Line(10) = {6,5}; +Line Loop(11) = {7,-2,10}; +Plane Surface(12) = {11}; +Line Loop(13) = {-1,10,6}; +Plane Surface(14) = {13}; +Surface Loop(15) = {12,9,-5,-14}; +Complex Volume(16) = {15}; diff --git a/examples/bug_demi_cercles.geo b/examples/bug_demi_cercles.geo new file mode 100644 index 0000000000000000000000000000000000000000..e0766a20f1f17d26fcd4180df75ca54914f93c71 --- /dev/null +++ b/examples/bug_demi_cercles.geo @@ -0,0 +1,13 @@ +Point(1) = {0.0,0.0,0.0,.08}; +Point(2) = {-.5,0.0,0.0,.08}; +Point(3) = {.5,0.0,0.0,.08}; +Point(4) = {.5,-.5,0.0,.08}; +Point(5) = {-.5,-.5,0.0,.08}; +Circle(1) = {3,1,2}; +Line(2) = {3,4}; +Line(3) = {4,5}; +Line(4) = {5,2}; +Line Loop(5) = {3,4,-1,2}; +Plane Surface(6) = {5}; +Extrude(6, {0,0,.5}); +Coherence; diff --git a/examples/bug_ellipses.geo b/examples/bug_ellipses.geo new file mode 100644 index 0000000000000000000000000000000000000000..eb0fb3910227eebf32d6b63973e04250ab07fd68 --- /dev/null +++ b/examples/bug_ellipses.geo @@ -0,0 +1,37 @@ +Point(newp) = { 0, 0,0,.1}; +Point(newp) = {-1, 0,0,.1}; +Point(newp) = { 1, 0,0,.1}; +Point(newp) = { 0, .5,0,.1}; +Point(newp) = { 0,-.5,0,.1}; +Point(newp) = { 0, 0,.8,.1}; +Point(newp) = { 0, 0,-1,.1}; + +Ellipsis(1) = {3,1,3,4}; +Ellipsis(2) = {4,1,2,2}; +Ellipsis(3) = {2,1,2,5}; +Ellipsis(4) = {5,1,3,3}; +Ellipsis(5) = {7,1,7,4}; +Ellipsis(6) = {4,1,6,6}; +Ellipsis(7) = {6,1,6,5}; +Ellipsis(8) = {5,1,7,7}; +Ellipsis(9) = {6,1,3,3}; +Ellipsis(10) = {2,1,2,6}; +Ellipsis(11) = {7,1,2,2}; +Ellipsis(12) = {3,1,3,7}; + +Line Loop(13) = {1,6,9}; +Ruled Surface(14) = {13}; +Line Loop(15) = {4,-9,7}; +Ruled Surface(16) = {15}; +Line Loop(17) = {-7,-10,3}; +Ruled Surface(18) = {17}; +Line Loop(19) = {3,8,11}; +Ruled Surface(20) = {19}; +Line Loop(21) = {2,-11,5}; +Ruled Surface(22) = {21}; +Line Loop(23) = {-5,-12,1}; +Ruled Surface(24) = {23}; +Line Loop(25) = {-12,-4,8}; +Ruled Surface(26) = {25}; +Line Loop(27) = {-6,2,10}; +Ruled Surface(28) = {27}; diff --git a/examples/bug_select.geo b/examples/bug_select.geo new file mode 100644 index 0000000000000000000000000000000000000000..403f564c6ea785a6b7fec7a61fc798f635a61da4 --- /dev/null +++ b/examples/bug_select.geo @@ -0,0 +1,56 @@ +la = .1; +lc = .2; + +Point(1) = {-1,0,0,lc}; +Point(2) = {1,0,0,lc}; +Point(3) = {1,0.5,0,lc}; +Point(4) = {-1,0.5,0,lc}; +Point(5) = {-1.1,0.6,0,lc}; +Point(6) = {1.1,0.6,0,lc}; +Point(7) = {1.1,0,0,lc}; +Point(8) = {-1.1,0,0,lc}; +Point(9) = {-.3,0,0,lc}; +Point(10) = {.3,0,0,lc}; +Point(11) = {.4,0,0,la}; +Point(12) = {.2,0,0,la}; +Point(13) = {-.2,0,0,la}; +Point(14) = {-.4,0,0,la}; +Point(15) = {-.3,.1,0,la}; +Point(16) = {-.3,-.1,0,la}; +Point(17) = {.3,-.1,0,la}; +Point(18) = {.3,.1,0,la}; +Point(19) = {0,-.5,0,lc}; +Point(20) = {2,-.5,0,lc}; +Point(21) = {-2,-.5,0,lc}; +Point(22) = {0,1.5,0,lc}; +Point(23) = {0,1.7,0,lc}; +Point(24) = {2.2,-.5,0,lc}; +Point(25) = {-2.2,-.5,0,lc}; + +Line(1) = {8,1}; +Line(2) = {1,4}; +Line(3) = {4,3}; +Line(4) = {3,2}; +Line(5) = {2,7}; +Line(6) = {7,6}; +Line(7) = {6,5}; +Line(8) = {5,8}; +Circle(9) = {11,10,18}; +Circle(10) = {18,10,12}; +Circle(11) = {12,10,17}; +Circle(12) = {17,10,11}; +Circle(13) = {13,9,15}; +Circle(14) = {15,9,14}; +Circle(15) = {14,9,16}; +Circle(16) = {16,9,13}; +Circle(17) = {20,19,22}; +Circle(18) = {22,19,21}; +Line(19) = {21,19}; +Line(20) = {20,19}; +Line(21) = {20,24}; +Line(22) = {21,25}; +Circle(23) = {24,19,23}; +Circle(24) = {23,19,25}; + +Line Loop(27) = {19,-20,17,18}; +Plane Surface(28) = {27}; diff --git a/examples/carre.geo b/examples/carre.geo new file mode 100644 index 0000000000000000000000000000000000000000..7385bb5b9ac83233e231d236c8d69c77afe9c7ff --- /dev/null +++ b/examples/carre.geo @@ -0,0 +1,9 @@ +l = 2; +Point(1) = {1.0,0.0,0.0,l}; +Point(2) = {1.0,1.0,0.0,l}; +Point(3) = {0.0,0.0,0.0,l}; +Point(4) = {0.0,1.0,0.0,l}; +Line(1) = {2,1}; +Line(2) = {1,3}; +Line(3) = {3,4}; +Line(4) = {4,2}; diff --git a/examples/coin.geo b/examples/coin.geo new file mode 100644 index 0000000000000000000000000000000000000000..0f5eaa31c7932bbe12c8b74cabec0a1e4db5098c --- /dev/null +++ b/examples/coin.geo @@ -0,0 +1,39 @@ +lc = 0.05 ; +lc = 0.1 ; + + +/* Point 1 */ +Point(newp) = {0,0,0,lc}; +/* Point 2 */ +Point(newp) = {1,0,0,lc}; +/* Point 3 */ +Point(newp) = {0.5,0,0,lc}; +/* Point 4 */ +Point(newp) = {0.5,0.5,0,lc}; +/* Point 5 */ +Point(newp) = {1,0.5,0,lc}; +/* Point 6 */ +Point(newp) = {1,1,0,lc}; +/* Point 7 */ +Point(newp) = {0,1,0,lc}; +Delete { + Point(2); +} +Line(1) = Liste[3,4]; +Line(2) = Liste[4,5]; +Line(3) = Liste[5,6]; +Line(4) = Liste[6,7]; +Line(5) = Liste[7,1]; +Line(6) = Liste[1,3]; + +Loop(7) = {5,6,1,2,3,4}; +Plane Surface(8) = {7}; + + +Air = 1111 ; +CL0 = 2222 ; +CL1 = 3333 ; + +Physical Volume (Air) = Liste[8] ; +Physical Surface (CL0) = Liste[1,2] ; +Physical Surface (CL1) = Liste[4,5] ; diff --git a/examples/cube.geo b/examples/cube.geo new file mode 100644 index 0000000000000000000000000000000000000000..75db8b37cb7b441864c0139095dd11a663c62fec --- /dev/null +++ b/examples/cube.geo @@ -0,0 +1,58 @@ +lcar1 = .2; + +Point(newp) = {0.5,0.5,0.5,lcar1}; /* Point 1 */ +Point(newp) = {0.5,0.5,0,lcar1}; /* Point 2 */ +Point(newp) = {0,0.5,0.5,lcar1}; /* Point 3 */ +Point(newp) = {0,0,0.5,lcar1}; /* Point 4 */ +Point(newp) = {0.5,0,0.5,lcar1}; /* Point 5 */ +Point(newp) = {0.5,0,0,lcar1}; /* Point 6 */ +Point(newp) = {0,0.5,0,lcar1}; /* Point 7 */ +Point(newp) = {0,1,0,lcar1}; /* Point 8 */ +Point(newp) = {1,1,0,lcar1}; /* Point 9 */ +Point(newp) = {0,0,1,lcar1}; /* Point 10 */ +Point(newp) = {0,1,1,lcar1}; /* Point 11 */ +Point(newp) = {1,1,1,lcar1}; /* Point 12 */ +Point(newp) = {1,0,1,lcar1}; /* Point 13 */ +Point(newp) = {1,0,0,lcar1}; + +Line(1) = {8,9}; +Line(2) = {9,12}; +Line(3) = {12,11}; +Line(4) = {11,8}; +Line(5) = {9,14}; +Line(6) = {14,13}; +Line(7) = {13,12}; +Line(8) = {11,10}; +Line(9) = {10,13}; +Line(10) = {10,4}; +Line(11) = {4,5}; +Line(12) = {5,6}; +Line(13) = {6,2}; +Line(14) = {2,1}; +Line(15) = {1,3}; +Line(16) = {3,7}; +Line(17) = {7,2}; +Line(18) = {3,4}; +Line(19) = {5,1}; +Line(20) = {7,8}; +Line(21) = {6,14}; +Line Loop(22) = {11,19,15,18}; +Plane Surface(23) = {22}; +Line Loop(24) = {16,17,14,15}; +Plane Surface(25) = {24}; +Line Loop(26) = {-17,20,1,5,-21,13}; +Plane Surface(27) = {26}; +Line Loop(28) = {4,1,2,3}; +Plane Surface(29) = {28}; +Line Loop(30) = {7,-2,5,6}; +Plane Surface(31) = {30}; +Line Loop(32) = {6,-9,10,11,12,21}; +Plane Surface(33) = {32}; +Line Loop(34) = {7,3,8,9}; +Plane Surface(35) = {34}; +Line Loop(36) = {10,-18,16,20,-4,8}; +Plane Surface(37) = {36}; +Line Loop(38) = {-14,-13,-12,19}; +Plane Surface(39) = {38}; +Surface Loop(40) = {35,31,29,37,33,23,39,25,27}; +Complex Volume(41) = {40}; diff --git a/examples/d2.geo b/examples/d2.geo new file mode 100644 index 0000000000000000000000000000000000000000..86239fb5cee80b4d9fb474628ed854cb5b9647d7 --- /dev/null +++ b/examples/d2.geo @@ -0,0 +1,1065 @@ +Point(3895) = {1.177410e-02,-2.768003e-03,0,1.e-3}; +Point(3897) = {1.081196e-02,-3.794565e-03,0,1.e-3}; +Point(3896) = {1.040081e-02,-4.225326e-03,0,1.e-3}; +Point(3968) = {9.501183e-03,-5.167856e-03,0,1.e-3}; +Point(3995) = {8.172335e-03,-6.541147e-03,0,1.e-3}; +Point(4003) = {6.820756e-03,-7.914438e-03,0,1.e-3}; +Point(3857) = {5.454371e-03,-9.287729e-03,0,1.e-3}; +Point(3856) = {3.534352e-03,-1.119762e-02,0,1.e-3}; +Point(3860) = {7.877699e-04,-1.389559e-02,0,1.e-3}; +Point(3861) = {-1.958812e-03,-1.658843e-02,0,1.e-3}; +Point(3863) = {-4.705394e-03,-1.930092e-02,0,1.e-3}; +Point(3864) = {-7.451976e-03,-2.206110e-02,0,1.e-3}; +Point(3865) = {-1.019856e-02,-2.490134e-02,0,1.e-3}; +Point(3866) = {-1.294514e-02,-2.785668e-02,0,1.e-3}; +Point(3867) = {-1.569172e-02,-3.097311e-02,0,1.e-3}; +Point(3868) = {-1.819787e-02,-3.400697e-02,0,1.e-3}; +Point(3869) = {-1.843830e-02,-3.430929e-02,0,1.e-3}; +Point(3870) = {-2.032098e-02,-3.675355e-02,0,1.e-3}; +Point(3871) = {-2.233602e-02,-3.950013e-02,0,1.e-3}; +Point(3872) = {-2.428062e-02,-4.224671e-02,0,1.e-3}; +Point(3977) = {-2.615522e-02,-4.499330e-02,0,1.e-3}; +Point(3877) = {-2.795526e-02,-4.773988e-02,0,1.e-3}; +Point(3876) = {-2.966457e-02,-5.048646e-02,0,1.e-3}; +Point(3878) = {-3.128951e-02,-5.323304e-02,0,1.e-3}; +Point(3934) = {-3.282722e-02,-5.597962e-02,0,1.e-3}; +Point(3873) = {-3.427526e-02,-5.872621e-02,0,1.e-3}; +Point(3874) = {-3.563187e-02,-6.147279e-02,0,1.e-3}; +Point(3875) = {-3.689577e-02,-6.421937e-02,0,1.e-3}; +Point(3935) = {-3.803475e-02,-6.696595e-02,0,1.e-3}; +Point(3880) = {-3.906585e-02,-6.971253e-02,0,1.e-3}; +Point(3879) = {-3.999980e-02,-7.245912e-02,0,1.e-3}; +Point(3881) = {-4.084348e-02,-7.520570e-02,0,1.e-3}; +Point(3936) = {-4.159737e-02,-7.795228e-02,0,1.e-3}; +Point(3882) = {-4.219350e-02,-8.069886e-02,0,1.e-3}; +Point(3883) = {-4.268262e-02,-8.344544e-02,0,1.e-3}; +Point(3885) = {-4.302180e-02,-8.619203e-02,0,1.e-3}; +Point(3884) = {-4.315754e-02,-8.815942e-02,0,1.e-3}; +Point(1218) = {-4.315754e-02,-8.893861e-02,0,1.e-3}; +Point(3933) = {-4.315754e-02,-8.955185e-02,0,1.e-3}; +Point(3996) = {-4.314894e-02,-9.031190e-02,0,1.e-3}; +Point(3989) = {-4.310538e-02,-9.168519e-02,0,1.e-3}; +Point(3990) = {-4.298693e-02,-9.305848e-02,0,1.e-3}; +Point(3978) = {-4.281442e-02,-9.443177e-02,0,1.e-3}; +Point(3979) = {-4.254831e-02,-9.580506e-02,0,1.e-3}; +Point(3974) = {-4.215142e-02,-9.717835e-02,0,1.e-3}; +Point(3973) = {-4.166490e-02,-9.855164e-02,0,1.e-3}; +Point(3963) = {-4.107412e-02,-9.992494e-02,0,1.e-3}; +Point(3947) = {-4.041096e-02,-1.011964e-01,0,1.e-3}; +Point(3948) = {-4.035707e-02,-1.012982e-01,0,1.e-3}; +Point(3904) = {-3.903767e-02,-1.033356e-01,0,1.e-3}; +Point(3903) = {-3.766438e-02,-1.048133e-01,0,1.e-3}; +Point(3946) = {-3.629109e-02,-1.058804e-01,0,1.e-3}; +Point(3902) = {-3.491780e-02,-1.066897e-01,0,1.e-3}; +Point(3901) = {-3.354451e-02,-1.073184e-01,0,1.e-3}; +Point(3900) = {-3.217121e-02,-1.078168e-01,0,1.e-3}; +Point(3908) = {-3.079792e-02,-1.081973e-01,0,1.e-3}; +Point(3907) = {-2.942463e-02,-1.084688e-01,0,1.e-3}; +Point(3951) = {-2.805134e-02,-1.086029e-01,0,1.e-3}; +Point(3950) = {-2.667805e-02,-1.086423e-01,0,1.e-3}; +Point(3847) = {-2.580700e-02,-1.086440e-01,0,1.e-3}; +Point(3949) = {-2.667805e-02,-1.088853e-01,0,1.e-3}; +Point(3952) = {-2.805134e-02,-1.092658e-01,0,1.e-3}; +Point(3905) = {-2.942463e-02,-1.096463e-01,0,1.e-3}; +Point(3906) = {-3.079792e-02,-1.100268e-01,0,1.e-3}; +Point(3909) = {-3.217121e-02,-1.104020e-01,0,1.e-3}; +Point(3969) = {-3.354451e-02,-1.107749e-01,0,1.e-3}; +Point(3970) = {-3.491780e-02,-1.111477e-01,0,1.e-3}; +Point(3997) = {-3.629109e-02,-1.115205e-01,0,1.e-3}; +Point(3998) = {-3.766438e-02,-1.118690e-01,0,1.e-3}; +Point(4004) = {-3.903767e-02,-1.122095e-01,0,1.e-3}; +Point(3959) = {-4.041096e-02,-1.125499e-01,0,1.e-3}; +Point(3960) = {-4.315754e-02,-1.131897e-01,0,1.e-3}; +Point(3972) = {-4.590412e-02,-1.137699e-01,0,1.e-3}; +Point(3984) = {-4.865071e-02,-1.143079e-01,0,1.e-3}; +Point(3988) = {-5.139729e-02,-1.147970e-01,0,1.e-3}; +Point(3961) = {-5.414387e-02,-1.152035e-01,0,1.e-3}; +Point(3962) = {-5.689045e-02,-1.155501e-01,0,1.e-3}; +Point(3937) = {-5.963703e-02,-1.157358e-01,0,1.e-3}; +Point(3938) = {-6.238362e-02,-1.158519e-01,0,1.e-3}; +Point(3886) = {-6.513020e-02,-1.158332e-01,0,1.e-3}; +Point(3887) = {-6.787678e-02,-1.156607e-01,0,1.e-3}; +Point(3888) = {-7.062336e-02,-1.152790e-01,0,1.e-3}; +Point(3993) = {-7.199665e-02,-1.150098e-01,0,1.e-3}; +Point(3994) = {-7.336994e-02,-1.146075e-01,0,1.e-3}; +Point(3971) = {-7.474324e-02,-1.141776e-01,0,1.e-3}; +Point(3918) = {-7.611653e-02,-1.135965e-01,0,1.e-3}; +Point(3919) = {-7.748982e-02,-1.129165e-01,0,1.e-3}; +Point(3920) = {-7.886311e-02,-1.121014e-01,0,1.e-3}; +Point(3956) = {-8.023640e-02,-1.111186e-01,0,1.e-3}; +Point(3955) = {-8.047561e-02,-1.109113e-01,0,1.e-3}; +Point(3965) = {-8.160969e-02,-1.098434e-01,0,1.e-3}; +Point(3966) = {-8.189452e-02,-1.095380e-01,0,1.e-3}; +Point(3910) = {-8.297356e-02,-1.081647e-01,0,1.e-3}; +Point(3913) = {-8.376570e-02,-1.067914e-01,0,1.e-3}; +Point(3912) = {-8.435627e-02,-1.054263e-01,0,1.e-3}; +Point(3911) = {-8.435982e-02,-1.054181e-01,0,1.e-3}; +Point(3914) = {-8.478803e-02,-1.040448e-01,0,1.e-3}; +Point(3915) = {-8.503641e-02,-1.026715e-01,0,1.e-3}; +Point(3916) = {-8.516945e-02,-1.012982e-01,0,1.e-3}; +Point(3917) = {-8.522183e-02,-9.992494e-02,0,1.e-3}; +Point(3953) = {-8.512327e-02,-9.855164e-02,0,1.e-3}; +Point(3954) = {-8.495463e-02,-9.717835e-02,0,1.e-3}; +Point(3964) = {-8.467545e-02,-9.580506e-02,0,1.e-3}; +Point(3975) = {-8.433113e-02,-9.443177e-02,0,1.e-3}; +Point(3992) = {-8.387660e-02,-9.305848e-02,0,1.e-3}; +Point(3991) = {-8.341194e-02,-9.168519e-02,0,1.e-3}; +Point(3999) = {-8.280629e-02,-9.031190e-02,0,1.e-3}; +Point(3939) = {-8.220063e-02,-8.893861e-02,0,1.e-3}; +Point(3967) = {-8.076693e-02,-8.619203e-02,0,1.e-3}; +Point(3987) = {-7.916546e-02,-8.344544e-02,0,1.e-3}; +Point(3985) = {-7.886311e-02,-8.298081e-02,0,1.e-3}; +Point(3986) = {-7.737820e-02,-8.069886e-02,0,1.e-3}; +Point(4002) = {-7.542111e-02,-7.795228e-02,0,1.e-3}; +Point(3922) = {-7.335979e-02,-7.520570e-02,0,1.e-3}; +Point(4005) = {-7.112105e-02,-7.245912e-02,0,1.e-3}; +Point(3851) = {-6.873828e-02,-6.971253e-02,0,1.e-3}; +Point(3850) = {-6.372231e-02,-6.421937e-02,0,1.e-3}; +Point(3853) = {-5.963703e-02,-6.001430e-02,0,1.e-3}; +Point(3852) = {-5.414387e-02,-5.469298e-02,0,1.e-3}; +Point(3849) = {-4.865071e-02,-4.961204e-02,0,1.e-3}; +Point(3848) = {-4.315754e-02,-4.465740e-02,0,1.e-3}; +Point(3921) = {-3.766438e-02,-3.985542e-02,0,1.e-3}; +Point(3983) = {-3.491780e-02,-3.750843e-02,0,1.e-3}; +Point(3982) = {-3.217121e-02,-3.519259e-02,0,1.e-3}; +Point(3976) = {-2.942463e-02,-3.289435e-02,0,1.e-3}; +Point(3929) = {-2.744807e-02,-3.126039e-02,0,1.e-3}; +Point(3958) = {-2.667805e-02,-3.062383e-02,0,1.e-3}; +Point(3928) = {-2.411032e-02,-2.851380e-02,0,1.e-3}; +Point(3957) = {-2.393147e-02,-2.836765e-02,0,1.e-3}; +Point(3927) = {-2.118489e-02,-2.612321e-02,0,1.e-3}; +Point(3926) = {-1.843830e-02,-2.390843e-02,0,1.e-3}; +Point(3925) = {-1.569172e-02,-2.170681e-02,0,1.e-3}; +Point(3924) = {-1.294514e-02,-1.952576e-02,0,1.e-3}; +Point(3932) = {-1.040573e-02,-1.752748e-02,0,1.e-3}; +Point(3931) = {-1.019856e-02,-1.736495e-02,0,1.e-3}; +Point(3930) = {-7.451976e-03,-1.521330e-02,0,1.e-3}; +Point(3923) = {-4.705394e-03,-1.307794e-02,0,1.e-3}; +Point(3862) = {-1.958812e-03,-1.095092e-02,0,1.e-3}; +Point(3859) = {1.960946e-04,-9.287729e-03,0,1.e-3}; +Point(3858) = {7.877699e-04,-8.831063e-03,0,1.e-3}; +Point(3855) = {3.534352e-03,-6.728705e-03,0,1.e-3}; +Point(3854) = {6.280934e-03,-4.633175e-03,0,1.e-3}; +Point(3945) = {7.386845e-03,-3.794565e-03,0,1.e-3}; +Point(3944) = {7.654225e-03,-3.591811e-03,0,1.e-3}; +Point(3899) = {9.027516e-03,-2.550448e-03,0,1.e-3}; +Point(3898) = {1.040081e-02,-1.509310e-03,0,1.e-3}; +Point(3894) = {1.177410e-02,-4.686545e-04,0,1.e-3}; +Point(3890) = {1.282184e-02,3.253082e-04,0,1.e-3}; +Point(3893) = {1.314739e-02,5.720012e-04,0,1.e-3}; +Point(3941) = {1.463351e-02,1.698599e-03,0,1.e-3}; +Point(4000) = {1.644012e-02,3.071890e-03,0,1.e-3}; +Point(3980) = {1.824674e-02,4.445181e-03,0,1.e-3}; +Point(3846) = {1.892400e-02,4.960000e-03,0,1.e-3}; +Point(3981) = {1.843389e-02,4.445181e-03,0,1.e-3}; +Point(4001) = {1.712649e-02,3.071890e-03,0,1.e-3}; +Point(3942) = {1.584524e-02,1.698599e-03,0,1.e-3}; +Point(3940) = {1.460138e-02,3.253082e-04,0,1.e-3}; +Point(3889) = {1.452068e-02,2.362167e-04,0,1.e-3}; +Point(3892) = {1.335131e-02,-1.047983e-03,0,1.e-3}; +Point(3891) = {1.314739e-02,-1.270371e-03,0,1.e-3}; +Point(3943) = {1.209204e-02,-2.421274e-03,0,1.e-3}; +Point(4063) = {4.498368e-02,-9.287729e-03,0,1.e-3}; +Point(4062) = {4.610574e-02,-6.541147e-03,0,1.e-3}; +Point(4061) = {4.755089e-02,-3.794565e-03,0,1.e-3}; +Point(4114) = {4.934166e-02,-1.047983e-03,0,1.e-3}; +Point(4153) = {5.143154e-02,1.698599e-03,0,1.e-3}; +Point(4178) = {5.390637e-02,4.445181e-03,0,1.e-3}; +Point(4179) = {5.571941e-02,6.252892e-03,0,1.e-3}; +Point(4191) = {5.846599e-02,8.699713e-03,0,1.e-3}; +Point(4203) = {6.121257e-02,1.103796e-02,0,1.e-3}; +Point(4109) = {6.350284e-02,1.268493e-02,0,1.e-3}; +Point(4202) = {6.670574e-02,1.498818e-02,0,1.e-3}; +Point(4199) = {7.170787e-02,1.817809e-02,0,1.e-3}; +Point(4201) = {7.219890e-02,1.846566e-02,0,1.e-3}; +Point(4200) = {7.769207e-02,2.168274e-02,0,1.e-3}; +Point(4100) = {8.318523e-02,2.447113e-02,0,1.e-3}; +Point(4099) = {9.417156e-02,2.953992e-02,0,1.e-3}; +Point(4045) = {1.051579e-01,3.374477e-02,0,1.e-3}; +Point(4044) = {1.161442e-01,3.745387e-02,0,1.e-3}; +Point(4043) = {1.271305e-01,4.084705e-02,0,1.e-3}; +Point(4147) = {1.381169e-01,4.362166e-02,0,1.e-3}; +Point(4146) = {1.491032e-01,4.590535e-02,0,1.e-3}; +Point(4180) = {1.600895e-01,4.775547e-02,0,1.e-3}; +Point(4167) = {1.710759e-01,4.909090e-02,0,1.e-3}; +Point(4166) = {1.820622e-01,5.028654e-02,0,1.e-3}; +Point(4134) = {1.930485e-01,5.118303e-02,0,1.e-3}; +Point(4133) = {2.040348e-01,5.209637e-02,0,1.e-3}; +Point(4098) = {2.150212e-01,5.304431e-02,0,1.e-3}; +Point(4097) = {2.260075e-01,5.389186e-02,0,1.e-3}; +Point(4042) = {2.369938e-01,5.466596e-02,0,1.e-3}; +Point(4041) = {2.479802e-01,5.535583e-02,0,1.e-3}; +Point(4040) = {2.589665e-01,5.602171e-02,0,1.e-3}; +Point(4095) = {2.699528e-01,5.660820e-02,0,1.e-3}; +Point(4096) = {2.809391e-01,5.717080e-02,0,1.e-3}; +Point(4132) = {2.919255e-01,5.768210e-02,0,1.e-3}; +Point(4131) = {3.029118e-01,5.816077e-02,0,1.e-3}; +Point(4165) = {3.138981e-01,5.861410e-02,0,1.e-3}; +Point(4164) = {3.248844e-01,5.902748e-02,0,1.e-3}; +Point(4163) = {3.358708e-01,5.942876e-02,0,1.e-3}; +Point(4130) = {3.468571e-01,5.978313e-02,0,1.e-3}; +Point(4129) = {3.578434e-01,6.012088e-02,0,1.e-3}; +Point(4094) = {3.688298e-01,6.041918e-02,0,1.e-3}; +Point(4093) = {3.798161e-01,6.068571e-02,0,1.e-3}; +Point(4039) = {3.908024e-01,6.092523e-02,0,1.e-3}; +Point(4038) = {4.017887e-01,6.111444e-02,0,1.e-3}; +Point(4037) = {4.127751e-01,6.128792e-02,0,1.e-3}; +Point(4092) = {4.237614e-01,6.139510e-02,0,1.e-3}; +Point(4091) = {4.347477e-01,6.148330e-02,0,1.e-3}; +Point(4128) = {4.457341e-01,6.152051e-02,0,1.e-3}; +Point(4127) = {4.567204e-01,6.152534e-02,0,1.e-3}; +Point(4162) = {4.677067e-01,6.149964e-02,0,1.e-3}; +Point(4161) = {4.786930e-01,6.143130e-02,0,1.e-3}; +Point(4183) = {4.896794e-01,6.134928e-02,0,1.e-3}; +Point(4160) = {5.006657e-01,6.120560e-02,0,1.e-3}; +Point(4159) = {5.116520e-01,6.104561e-02,0,1.e-3}; +Point(4126) = {5.226384e-01,6.083535e-02,0,1.e-3}; +Point(4125) = {5.336247e-01,6.058889e-02,0,1.e-3}; +Point(4088) = {5.446110e-01,6.030455e-02,0,1.e-3}; +Point(4087) = {5.555973e-01,5.996460e-02,0,1.e-3}; +Point(4033) = {5.665837e-01,5.960434e-02,0,1.e-3}; +Point(4032) = {5.775700e-01,5.915575e-02,0,1.e-3}; +Point(4031) = {5.885563e-01,5.867545e-02,0,1.e-3}; +Point(4086) = {5.995427e-01,5.809113e-02,0,1.e-3}; +Point(4085) = {6.105290e-01,5.746759e-02,0,1.e-3}; +Point(4124) = {6.215153e-01,5.679937e-02,0,1.e-3}; +Point(4123) = {6.325016e-01,5.616104e-02,0,1.e-3}; +Point(4158) = {6.434880e-01,5.553466e-02,0,1.e-3}; +Point(4157) = {6.544743e-01,5.490460e-02,0,1.e-3}; +Point(4156) = {6.654606e-01,5.425221e-02,0,1.e-3}; +Point(4122) = {6.764469e-01,5.351456e-02,0,1.e-3}; +Point(4121) = {6.874333e-01,5.273401e-02,0,1.e-3}; +Point(4081) = {6.984196e-01,5.190181e-02,0,1.e-3}; +Point(4080) = {7.094059e-01,5.101347e-02,0,1.e-3}; +Point(4020) = {7.203923e-01,5.010133e-02,0,1.e-3}; +Point(4019) = {7.313786e-01,4.909498e-02,0,1.e-3}; +Point(4018) = {7.423649e-01,4.806316e-02,0,1.e-3}; +Point(4143) = {7.533512e-01,4.694984e-02,0,1.e-3}; +Point(4118) = {7.643376e-01,4.579371e-02,0,1.e-3}; +Point(4022) = {7.753239e-01,4.458624e-02,0,1.e-3}; +Point(4016) = {7.863102e-01,4.330843e-02,0,1.e-3}; +Point(4015) = {7.972966e-01,4.200167e-02,0,1.e-3}; +Point(4011) = {8.082829e-01,4.058146e-02,0,1.e-3}; +Point(4010) = {8.192692e-01,3.912968e-02,0,1.e-3}; +Point(4009) = {8.302555e-01,3.758209e-02,0,1.e-3}; +Point(4219) = {8.357487e-01,3.680830e-02,0,1.e-3}; +Point(4177) = {8.412419e-01,3.598390e-02,0,1.e-3}; +Point(4176) = {8.467350e-01,3.515767e-02,0,1.e-3}; +Point(4149) = {8.494816e-01,3.474456e-02,0,1.e-3}; +Point(4059) = {8.522282e-01,3.433145e-02,0,1.e-3}; +Point(4058) = {8.549748e-01,3.391833e-02,0,1.e-3}; +Point(4055) = {8.577214e-01,3.349214e-02,0,1.e-3}; +Point(4113) = {8.604679e-01,3.306571e-02,0,1.e-3}; +Point(4110) = {8.632145e-01,3.263928e-02,0,1.e-3}; +Point(4213) = {8.659611e-01,3.221285e-02,0,1.e-3}; +Point(4210) = {8.687077e-01,3.178643e-02,0,1.e-3}; +Point(4217) = {8.714543e-01,3.136000e-02,0,1.e-3}; +Point(4006) = {8.740950e-01,3.095000e-02,0,1.e-3}; +Point(4218) = {8.714543e-01,3.095677e-02,0,1.e-3}; +Point(4211) = {8.687077e-01,3.096380e-02,0,1.e-3}; +Point(4212) = {8.659611e-01,3.097084e-02,0,1.e-3}; +Point(4111) = {8.632145e-01,3.097787e-02,0,1.e-3}; +Point(4112) = {8.604679e-01,3.098491e-02,0,1.e-3}; +Point(4056) = {8.577214e-01,3.099195e-02,0,1.e-3}; +Point(4057) = {8.549748e-01,3.099898e-02,0,1.e-3}; +Point(4060) = {8.522282e-01,3.100602e-02,0,1.e-3}; +Point(4148) = {8.494816e-01,3.101305e-02,0,1.e-3}; +Point(4150) = {8.467350e-01,3.102009e-02,0,1.e-3}; +Point(4208) = {8.439885e-01,3.102712e-02,0,1.e-3}; +Point(4209) = {8.412419e-01,3.103416e-02,0,1.e-3}; +Point(4215) = {8.357487e-01,3.104823e-02,0,1.e-3}; +Point(4216) = {8.302555e-01,3.106230e-02,0,1.e-3}; +Point(4220) = {8.247624e-01,3.107638e-02,0,1.e-3}; +Point(4012) = {8.192692e-01,3.109045e-02,0,1.e-3}; +Point(4013) = {8.082829e-01,3.111859e-02,0,1.e-3}; +Point(4014) = {7.972966e-01,3.114674e-02,0,1.e-3}; +Point(4017) = {7.863102e-01,3.117488e-02,0,1.e-3}; +Point(4021) = {7.753239e-01,3.120302e-02,0,1.e-3}; +Point(4023) = {7.643376e-01,3.123117e-02,0,1.e-3}; +Point(4117) = {7.533512e-01,3.125931e-02,0,1.e-3}; +Point(4082) = {7.423649e-01,3.128745e-02,0,1.e-3}; +Point(4083) = {7.313786e-01,3.131560e-02,0,1.e-3}; +Point(4024) = {7.203923e-01,3.134374e-02,0,1.e-3}; +Point(4025) = {7.094059e-01,3.137188e-02,0,1.e-3}; +Point(4007) = {6.999910e-01,3.139600e-02,0,1.e-3}; +Point(4026) = {6.999910e-01,2.367126e-02,0,1.e-3}; +Point(4027) = {6.999910e-01,1.268493e-02,0,1.e-3}; +Point(4028) = {6.999910e-01,1.698599e-03,0,1.e-3}; +Point(4029) = {6.999910e-01,-9.287729e-03,0,1.e-3}; +Point(4008) = {6.999910e-01,-1.722400e-02,0,1.e-3}; +Point(4030) = {6.984196e-01,-1.751626e-02,0,1.e-3}; +Point(4084) = {6.874333e-01,-1.955960e-02,0,1.e-3}; +Point(4194) = {6.764469e-01,-2.159776e-02,0,1.e-3}; +Point(4195) = {6.654606e-01,-2.362865e-02,0,1.e-3}; +Point(4154) = {6.544743e-01,-2.588904e-02,0,1.e-3}; +Point(4155) = {6.434880e-01,-2.825320e-02,0,1.e-3}; +Point(4119) = {6.325016e-01,-3.016078e-02,0,1.e-3}; +Point(4120) = {6.215153e-01,-3.200586e-02,0,1.e-3}; +Point(4089) = {6.105290e-01,-3.369569e-02,0,1.e-3}; +Point(4090) = {5.995427e-01,-3.534073e-02,0,1.e-3}; +Point(4034) = {5.885563e-01,-3.694183e-02,0,1.e-3}; +Point(4035) = {5.775700e-01,-3.852074e-02,0,1.e-3}; +Point(4036) = {5.665837e-01,-4.009157e-02,0,1.e-3}; +Point(4144) = {5.555973e-01,-4.161619e-02,0,1.e-3}; +Point(4192) = {5.446110e-01,-4.311363e-02,0,1.e-3}; +Point(4193) = {5.336247e-01,-4.454372e-02,0,1.e-3}; +Point(4184) = {5.226384e-01,-4.589904e-02,0,1.e-3}; +Point(4185) = {5.116520e-01,-4.719211e-02,0,1.e-3}; +Point(4168) = {5.006657e-01,-4.834107e-02,0,1.e-3}; +Point(4169) = {4.896794e-01,-4.944199e-02,0,1.e-3}; +Point(4135) = {4.786930e-01,-5.032590e-02,0,1.e-3}; +Point(4136) = {4.677067e-01,-5.113121e-02,0,1.e-3}; +Point(4101) = {4.567204e-01,-5.175527e-02,0,1.e-3}; +Point(4102) = {4.457341e-01,-5.227269e-02,0,1.e-3}; +Point(4049) = {4.347477e-01,-5.270239e-02,0,1.e-3}; +Point(4050) = {4.237614e-01,-5.305741e-02,0,1.e-3}; +Point(4051) = {4.127751e-01,-5.339040e-02,0,1.e-3}; +Point(4103) = {4.017887e-01,-5.365720e-02,0,1.e-3}; +Point(4104) = {3.908024e-01,-5.390137e-02,0,1.e-3}; +Point(4137) = {3.798161e-01,-5.408775e-02,0,1.e-3}; +Point(4138) = {3.688298e-01,-5.423035e-02,0,1.e-3}; +Point(4170) = {3.578434e-01,-5.433335e-02,0,1.e-3}; +Point(4171) = {3.468571e-01,-5.436941e-02,0,1.e-3}; +Point(4186) = {3.358708e-01,-5.438425e-02,0,1.e-3}; +Point(4172) = {3.248844e-01,-5.431051e-02,0,1.e-3}; +Point(4173) = {3.138981e-01,-5.421116e-02,0,1.e-3}; +Point(4139) = {3.029118e-01,-5.403703e-02,0,1.e-3}; +Point(4140) = {2.919255e-01,-5.379680e-02,0,1.e-3}; +Point(4105) = {2.809391e-01,-5.349015e-02,0,1.e-3}; +Point(4106) = {2.699528e-01,-5.307623e-02,0,1.e-3}; +Point(4052) = {2.589665e-01,-5.262516e-02,0,1.e-3}; +Point(4053) = {2.479802e-01,-5.205332e-02,0,1.e-3}; +Point(4054) = {2.369938e-01,-5.145659e-02,0,1.e-3}; +Point(4107) = {2.260075e-01,-5.078306e-02,0,1.e-3}; +Point(4108) = {2.150212e-01,-5.007146e-02,0,1.e-3}; +Point(4141) = {2.040348e-01,-4.931867e-02,0,1.e-3}; +Point(4142) = {1.930485e-01,-4.849150e-02,0,1.e-3}; +Point(4174) = {1.820622e-01,-4.763665e-02,0,1.e-3}; +Point(4175) = {1.710759e-01,-4.665625e-02,0,1.e-3}; +Point(4187) = {1.600895e-01,-4.564614e-02,0,1.e-3}; +Point(4188) = {1.491032e-01,-4.455428e-02,0,1.e-3}; +Point(4145) = {1.381169e-01,-4.339482e-02,0,1.e-3}; +Point(4046) = {1.271305e-01,-4.218155e-02,0,1.e-3}; +Point(4047) = {1.161442e-01,-4.082776e-02,0,1.e-3}; +Point(4048) = {1.051579e-01,-3.939290e-02,0,1.e-3}; +Point(4196) = {9.966472e-02,-3.862964e-02,0,1.e-3}; +Point(4197) = {9.417156e-02,-3.788513e-02,0,1.e-3}; +Point(4198) = {8.867839e-02,-3.720163e-02,0,1.e-3}; +Point(4189) = {8.318523e-02,-3.651554e-02,0,1.e-3}; +Point(4190) = {7.769207e-02,-3.569174e-02,0,1.e-3}; +Point(4214) = {7.494548e-02,-3.527985e-02,0,1.e-3}; +Point(4181) = {7.219890e-02,-3.481687e-02,0,1.e-3}; +Point(4182) = {6.945232e-02,-3.430639e-02,0,1.e-3}; +Point(4151) = {6.670574e-02,-3.379591e-02,0,1.e-3}; +Point(4152) = {6.395916e-02,-3.322033e-02,0,1.e-3}; +Point(4064) = {6.121257e-02,-3.263264e-02,0,1.e-3}; +Point(4065) = {5.846599e-02,-3.189105e-02,0,1.e-3}; +Point(4066) = {5.635416e-02,-3.126039e-02,0,1.e-3}; +Point(4205) = {5.434612e-02,-3.049426e-02,0,1.e-3}; +Point(4206) = {5.297283e-02,-2.986940e-02,0,1.e-3}; +Point(4207) = {5.159954e-02,-2.914883e-02,0,1.e-3}; +Point(4072) = {5.022625e-02,-2.824438e-02,0,1.e-3}; +Point(4074) = {4.885296e-02,-2.716087e-02,0,1.e-3}; +Point(4073) = {4.883074e-02,-2.714051e-02,0,1.e-3}; +Point(4076) = {4.747966e-02,-2.578824e-02,0,1.e-3}; +Point(4075) = {4.746129e-02,-2.576722e-02,0,1.e-3}; +Point(4079) = {4.639274e-02,-2.439393e-02,0,1.e-3}; +Point(4078) = {4.561283e-02,-2.302064e-02,0,1.e-3}; +Point(4077) = {4.500573e-02,-2.164735e-02,0,1.e-3}; +Point(4068) = {4.450243e-02,-2.027406e-02,0,1.e-3}; +Point(4067) = {4.415104e-02,-1.890077e-02,0,1.e-3}; +Point(4069) = {4.402927e-02,-1.752748e-02,0,1.e-3}; +Point(4070) = {4.404617e-02,-1.615418e-02,0,1.e-3}; +Point(4071) = {4.411753e-02,-1.478089e-02,0,1.e-3}; +Point(4115) = {4.421802e-02,-1.340760e-02,0,1.e-3}; +Point(4116) = {4.435615e-02,-1.203431e-02,0,1.e-3}; +Point(4204) = {4.461695e-02,-1.066102e-02,0,1.e-3}; +Point(11) = {4.552264e+01,-2.254225e+01,0,1.000000e+00}; +Point(2233) = {4.552264e+01,-1.129225e+01,0,1.000000e+00}; +Point(5) = {4.552264e+01,-4.224671e-02,0,1.000000e+00}; +Point(2236) = {4.552264e+01,1.120775e+01,0,1.000000e+00}; +Point(14) = {4.552264e+01,2.245775e+01,0,1.000000e+00}; +Point(2) = {4.552264e+01,4.495775e+01,0,1.000000e+00}; +Point(15) = {2.302264e+01,4.495775e+01,0,1.000000e+00}; +Point(2301) = {1.177264e+01,4.495775e+01,0,1.000000e+00}; +Point(6) = {5.226384e-01,4.495775e+01,0,1.000000e+00}; +Point(2304) = {-1.072736e+01,4.495775e+01,0,1.000000e+00}; +Point(18) = {-2.197736e+01,4.495775e+01,0,1.000000e+00}; +Point(3) = {-4.447736e+01,4.495775e+01,0,1.000000e+00}; +Point(19) = {-4.447736e+01,2.245775e+01,0,1.000000e+00}; +Point(2240) = {-4.447736e+01,1.120775e+01,0,1.000000e+00}; +Point(7) = {-4.447736e+01,-4.224671e-02,0,1.000000e+00}; +Point(2243) = {-4.447736e+01,-1.129225e+01,0,1.000000e+00}; +Point(22) = {-4.447736e+01,-2.254225e+01,0,1.000000e+00}; +Point(4) = {-4.447736e+01,-4.504225e+01,0,1.000000e+00}; +Point(23) = {-2.197736e+01,-4.504225e+01,0,1.000000e+00}; +Point(2317) = {-1.072736e+01,-4.504225e+01,0,1.000000e+00}; +Point(8) = {5.226384e-01,-4.504225e+01,0,1.000000e+00}; +Point(2297) = {1.177264e+01,-4.504225e+01,0,1.000000e+00}; +Point(10) = {2.302264e+01,-4.504225e+01,0,1.000000e+00}; +Point(1) = {4.552264e+01,-4.504225e+01,0,1.000000e+00}; +Point(4298) = {1.125732e+00,-1.356305e-01,0,1.000000e+00}; +Point(4297) = {1.128473e+00,-1.383771e-01,0,1.000000e+00}; +Point(4222) = {1.130511e+00,-1.404190e-01,0,1.000000e+00}; +Point(4250) = {1.130200e+00,-1.411237e-01,0,1.000000e+00}; +Point(4252) = {1.128987e+00,-1.438702e-01,0,1.000000e+00}; +Point(4221) = {1.128033e+00,-1.460320e-01,0,1.000000e+00}; +Point(4251) = {1.126886e+00,-1.450775e-01,0,1.000000e+00}; +Point(4299) = {1.124140e+00,-1.427912e-01,0,1.000000e+00}; +Point(4335) = {1.121393e+00,-1.405048e-01,0,1.000000e+00}; +Point(4337) = {1.118647e+00,-1.382318e-01,0,1.000000e+00}; +Point(4267) = {1.115900e+00,-1.359746e-01,0,1.000000e+00}; +Point(4294) = {1.115481e+00,-1.356305e-01,0,1.000000e+00}; +Point(4269) = {1.110407e+00,-1.315213e-01,0,1.000000e+00}; +Point(4233) = {1.104914e+00,-1.272651e-01,0,1.000000e+00}; +Point(4234) = {1.099421e+00,-1.231333e-01,0,1.000000e+00}; +Point(4273) = {1.093927e+00,-1.190696e-01,0,1.000000e+00}; +Point(4293) = {1.088434e+00,-1.150965e-01,0,1.000000e+00}; +Point(4314) = {1.082941e+00,-1.112096e-01,0,1.000000e+00}; +Point(4317) = {1.077448e+00,-1.073829e-01,0,1.000000e+00}; +Point(4318) = {1.071955e+00,-1.037168e-01,0,1.000000e+00}; +Point(4274) = {1.066462e+00,-1.001266e-01,0,1.000000e+00}; +Point(4235) = {1.060968e+00,-9.664561e-02,0,1.000000e+00}; +Point(4236) = {1.055475e+00,-9.329373e-02,0,1.000000e+00}; +Point(4237) = {1.049982e+00,-8.999964e-02,0,1.000000e+00}; +Point(4301) = {1.044489e+00,-8.685139e-02,0,1.000000e+00}; +Point(4319) = {1.038996e+00,-8.375978e-02,0,1.000000e+00}; +Point(4321) = {1.033503e+00,-8.073620e-02,0,1.000000e+00}; +Point(4320) = {1.033435e+00,-8.069886e-02,0,1.000000e+00}; +Point(4322) = {1.028009e+00,-7.778268e-02,0,1.000000e+00}; +Point(4347) = {1.022516e+00,-7.485902e-02,0,1.000000e+00}; +Point(4323) = {1.017023e+00,-7.206071e-02,0,1.000000e+00}; +Point(4324) = {1.011530e+00,-6.928798e-02,0,1.000000e+00}; +Point(4325) = {1.006037e+00,-6.656447e-02,0,1.000000e+00}; +Point(4276) = {1.000544e+00,-6.390345e-02,0,1.000000e+00}; +Point(4238) = {9.950505e-01,-6.128188e-02,0,1.000000e+00}; +Point(4240) = {9.895573e-01,-5.875476e-02,0,1.000000e+00}; +Point(4239) = {9.894949e-01,-5.872621e-02,0,1.000000e+00}; +Point(4241) = {9.840641e-01,-5.625125e-02,0,1.000000e+00}; +Point(4277) = {9.785710e-01,-5.382099e-02,0,1.000000e+00}; +Point(4326) = {9.730778e-01,-5.141086e-02,0,1.000000e+00}; +Point(4327) = {9.675846e-01,-4.903782e-02,0,1.000000e+00}; +Point(4328) = {9.620915e-01,-4.670806e-02,0,1.000000e+00}; +Point(4350) = {9.565983e-01,-4.440955e-02,0,1.000000e+00}; +Point(4348) = {9.511052e-01,-4.217563e-02,0,1.000000e+00}; +Point(4349) = {9.456120e-01,-3.995849e-02,0,1.000000e+00}; +Point(4332) = {9.401188e-01,-3.778658e-02,0,1.000000e+00}; +Point(4333) = {9.346257e-01,-3.563417e-02,0,1.000000e+00}; +Point(4334) = {9.291325e-01,-3.354304e-02,0,1.000000e+00}; +Point(4278) = {9.236393e-01,-3.147155e-02,0,1.000000e+00}; +Point(4247) = {9.181462e-01,-2.942051e-02,0,1.000000e+00}; +Point(4248) = {9.126530e-01,-2.741688e-02,0,1.000000e+00}; +Point(4249) = {9.071598e-01,-2.541811e-02,0,1.000000e+00}; +Point(4282) = {9.016667e-01,-2.339436e-02,0,1.000000e+00}; +Point(4283) = {8.961735e-01,-2.121581e-02,0,1.000000e+00}; +Point(4341) = {8.934269e-01,-2.008894e-02,0,1.000000e+00}; +Point(4342) = {8.906803e-01,-1.868991e-02,0,1.000000e+00}; +Point(4343) = {8.879338e-01,-1.729088e-02,0,1.000000e+00}; +Point(4289) = {8.851872e-01,-1.539587e-02,0,1.000000e+00}; +Point(4290) = {8.824406e-01,-1.328983e-02,0,1.000000e+00}; +Point(4286) = {8.796940e-01,-1.068337e-02,0,1.000000e+00}; +Point(4255) = {8.785175e-01,-9.287729e-03,0,1.000000e+00}; +Point(4257) = {8.763537e-01,-6.541147e-03,0,1.000000e+00}; +Point(4256) = {8.745583e-01,-3.794565e-03,0,1.000000e+00}; +Point(4346) = {8.737982e-01,-2.421274e-03,0,1.000000e+00}; +Point(4288) = {8.731375e-01,-1.047983e-03,0,1.000000e+00}; +Point(4287) = {8.725645e-01,3.253082e-04,0,1.000000e+00}; +Point(4260) = {8.721474e-01,1.698599e-03,0,1.000000e+00}; +Point(4259) = {8.718264e-01,3.071890e-03,0,1.000000e+00}; +Point(4258) = {8.716296e-01,4.445181e-03,0,1.000000e+00}; +Point(4262) = {8.715751e-01,5.818472e-03,0,1.000000e+00}; +Point(4261) = {8.716587e-01,7.191763e-03,0,1.000000e+00}; +Point(4264) = {8.718582e-01,8.565054e-03,0,1.000000e+00}; +Point(4263) = {8.721688e-01,9.938345e-03,0,1.000000e+00}; +Point(4265) = {8.726207e-01,1.131164e-02,0,1.000000e+00}; +Point(4266) = {8.732553e-01,1.268493e-02,0,1.000000e+00}; +Point(4303) = {8.741084e-01,1.405822e-02,0,1.000000e+00}; +Point(4302) = {8.742009e-01,1.417564e-02,0,1.000000e+00}; +Point(4304) = {8.752094e-01,1.543151e-02,0,1.000000e+00}; +Point(4305) = {8.755741e-01,1.580615e-02,0,1.000000e+00}; +Point(4306) = {8.765464e-01,1.680480e-02,0,1.000000e+00}; +Point(4307) = {8.769474e-01,1.712646e-02,0,1.000000e+00}; +Point(4308) = {8.783004e-01,1.817809e-02,0,1.000000e+00}; +Point(4309) = {8.783207e-01,1.819390e-02,0,1.000000e+00}; +Point(4345) = {8.796940e-01,1.898483e-02,0,1.000000e+00}; +Point(4344) = {8.810673e-01,1.969096e-02,0,1.000000e+00}; +Point(4254) = {8.824406e-01,2.018966e-02,0,1.000000e+00}; +Point(4253) = {8.851872e-01,2.092940e-02,0,1.000000e+00}; +Point(4285) = {8.879338e-01,2.136484e-02,0,1.000000e+00}; +Point(4284) = {8.906803e-01,2.153023e-02,0,1.000000e+00}; +Point(4340) = {8.934269e-01,2.149455e-02,0,1.000000e+00}; +Point(4339) = {8.961735e-01,2.136105e-02,0,1.000000e+00}; +Point(4338) = {8.989201e-01,2.104930e-02,0,1.000000e+00}; +Point(4246) = {9.016667e-01,2.064514e-02,0,1.000000e+00}; +Point(4245) = {9.071598e-01,1.954695e-02,0,1.000000e+00}; +Point(4281) = {9.126530e-01,1.818666e-02,0,1.000000e+00}; +Point(4280) = {9.181462e-01,1.648801e-02,0,1.000000e+00}; +Point(4279) = {9.236393e-01,1.459116e-02,0,1.000000e+00}; +Point(4244) = {9.291325e-01,1.255534e-02,0,1.000000e+00}; +Point(4243) = {9.346257e-01,1.024686e-02,0,1.000000e+00}; +Point(4242) = {9.401188e-01,7.859173e-03,0,1.000000e+00}; +Point(4296) = {9.456120e-01,5.245962e-03,0,1.000000e+00}; +Point(4295) = {9.511052e-01,2.515401e-03,0,1.000000e+00}; +Point(4300) = {9.565983e-01,-3.522322e-04,0,1.000000e+00}; +Point(4330) = {9.620915e-01,-3.368852e-03,0,1.000000e+00}; +Point(4331) = {9.628545e-01,-3.794565e-03,0,1.000000e+00}; +Point(4329) = {9.675846e-01,-6.447130e-03,0,1.000000e+00}; +Point(4232) = {9.730778e-01,-9.700323e-03,0,1.000000e+00}; +Point(4231) = {9.840641e-01,-1.646639e-02,0,1.000000e+00}; +Point(4230) = {9.950505e-01,-2.366260e-02,0,1.000000e+00}; +Point(4229) = {1.006037e+00,-3.132299e-02,0,1.000000e+00}; +Point(4228) = {1.017023e+00,-3.943289e-02,0,1.000000e+00}; +Point(4227) = {1.028009e+00,-4.793142e-02,0,1.000000e+00}; +Point(4225) = {1.038996e+00,-5.669110e-02,0,1.000000e+00}; +Point(4226) = {1.048275e+00,-6.421937e-02,0,1.000000e+00}; +Point(4312) = {1.054944e+00,-6.971253e-02,0,1.000000e+00}; +Point(4223) = {1.060968e+00,-7.473580e-02,0,1.000000e+00}; +Point(4224) = {1.061523e+00,-7.520570e-02,0,1.000000e+00}; +Point(4311) = {1.066462e+00,-7.943817e-02,0,1.000000e+00}; +Point(4310) = {1.067933e+00,-8.069886e-02,0,1.000000e+00}; +Point(4275) = {1.071955e+00,-8.420612e-02,0,1.000000e+00}; +Point(4316) = {1.077448e+00,-8.903994e-02,0,1.000000e+00}; +Point(4315) = {1.082941e+00,-9.395896e-02,0,1.000000e+00}; +Point(4313) = {1.088434e+00,-9.897945e-02,0,1.000000e+00}; +Point(4292) = {1.093927e+00,-1.041032e-01,0,1.000000e+00}; +Point(4272) = {1.099421e+00,-1.093858e-01,0,1.000000e+00}; +Point(4271) = {1.104914e+00,-1.148004e-01,0,1.000000e+00}; +Point(4270) = {1.110407e+00,-1.202740e-01,0,1.000000e+00}; +Point(4268) = {1.114765e+00,-1.246442e-01,0,1.000000e+00}; +Point(4291) = {1.120249e+00,-1.301373e-01,0,1.000000e+00}; +Point(4336) = {1.122990e+00,-1.328839e-01,0,1.000000e+00}; +Line(1) = {3895,3897}; +Line(2) = {3897,3896}; +Line(3) = {3896,3968}; +Line(4) = {3968,3995}; +Line(5) = {3995,4003}; +Line(6) = {4003,3857}; +Line(7) = {3857,3856}; +Line(8) = {3856,3860}; +Line(9) = {3860,3861}; +Line(10) = {3861,3863}; +Line(11) = {3863,3864}; +Line(12) = {3864,3865}; +Line(13) = {3865,3866}; +Line(14) = {3866,3867}; +Line(15) = {3867,3868}; +Line(16) = {3868,3869}; +Line(17) = {3869,3870}; +Line(18) = {3870,3871}; +Line(19) = {3871,3872}; +Line(20) = {3872,3977}; +Line(21) = {3977,3877}; +Line(22) = {3877,3876}; +Line(23) = {3876,3878}; +Line(24) = {3878,3934}; +Line(25) = {3934,3873}; +Line(26) = {3873,3874}; +Line(27) = {3874,3875}; +Line(28) = {3875,3935}; +Line(29) = {3935,3880}; +Line(30) = {3880,3879}; +Line(31) = {3879,3881}; +Line(32) = {3881,3936}; +Line(33) = {3936,3882}; +Line(34) = {3882,3883}; +Line(35) = {3883,3885}; +Line(36) = {3885,3884}; +Line(37) = {3884,1218}; +Line(38) = {1218,3933}; +Line(39) = {3933,3996}; +Line(40) = {3996,3989}; +Line(41) = {3989,3990}; +Line(42) = {3990,3978}; +Line(43) = {3978,3979}; +Line(44) = {3979,3974}; +Line(45) = {3974,3973}; +Line(46) = {3973,3963}; +Line(47) = {3963,3947}; +Line(48) = {3947,3948}; +Line(49) = {3948,3904}; +Line(50) = {3904,3903}; +Line(51) = {3903,3946}; +Line(52) = {3946,3902}; +Line(53) = {3902,3901}; +Line(54) = {3901,3900}; +Line(55) = {3900,3908}; +Line(56) = {3908,3907}; +Line(57) = {3907,3951}; +Line(58) = {3951,3950}; +Line(59) = {3950,3847}; +Line(60) = {3847,3949}; +Line(61) = {3949,3952}; +Line(62) = {3952,3905}; +Line(63) = {3905,3906}; +Line(64) = {3906,3909}; +Line(65) = {3909,3969}; +Line(66) = {3969,3970}; +Line(67) = {3970,3997}; +Line(68) = {3997,3998}; +Line(69) = {3998,4004}; +Line(70) = {4004,3959}; +Line(71) = {3959,3960}; +Line(72) = {3960,3972}; +Line(73) = {3972,3984}; +Line(74) = {3984,3988}; +Line(75) = {3988,3961}; +Line(76) = {3961,3962}; +Line(77) = {3962,3937}; +Line(78) = {3937,3938}; +Line(79) = {3938,3886}; +Line(80) = {3886,3887}; +Line(81) = {3887,3888}; +Line(82) = {3888,3993}; +Line(83) = {3993,3994}; +Line(84) = {3994,3971}; +Line(85) = {3971,3918}; +Line(86) = {3918,3919}; +Line(87) = {3919,3920}; +Line(88) = {3920,3956}; +Line(89) = {3956,3955}; +Line(90) = {3955,3965}; +Line(91) = {3965,3966}; +Line(92) = {3966,3910}; +Line(93) = {3910,3913}; +Line(94) = {3913,3912}; +Line(95) = {3912,3911}; +Line(96) = {3911,3914}; +Line(97) = {3914,3915}; +Line(98) = {3915,3916}; +Line(99) = {3916,3917}; +Line(100) = {3917,3953}; +Line(101) = {3953,3954}; +Line(102) = {3954,3964}; +Line(103) = {3964,3975}; +Line(104) = {3975,3992}; +Line(105) = {3992,3991}; +Line(106) = {3991,3999}; +Line(107) = {3999,3939}; +Line(108) = {3939,3967}; +Line(109) = {3967,3987}; +Line(110) = {3987,3985}; +Line(111) = {3985,3986}; +Line(112) = {3986,4002}; +Line(113) = {4002,3922}; +Line(114) = {3922,4005}; +Line(115) = {4005,3851}; +Line(116) = {3851,3850}; +Line(117) = {3850,3853}; +Line(118) = {3853,3852}; +Line(119) = {3852,3849}; +Line(120) = {3849,3848}; +Line(121) = {3848,3921}; +Line(122) = {3921,3983}; +Line(123) = {3983,3982}; +Line(124) = {3982,3976}; +Line(125) = {3976,3929}; +Line(126) = {3929,3958}; +Line(127) = {3958,3928}; +Line(128) = {3928,3957}; +Line(129) = {3957,3927}; +Line(130) = {3927,3926}; +Line(131) = {3926,3925}; +Line(132) = {3925,3924}; +Line(133) = {3924,3932}; +Line(134) = {3932,3931}; +Line(135) = {3931,3930}; +Line(136) = {3930,3923}; +Line(137) = {3923,3862}; +Line(138) = {3862,3859}; +Line(139) = {3859,3858}; +Line(140) = {3858,3855}; +Line(141) = {3855,3854}; +Line(142) = {3854,3945}; +Line(143) = {3945,3944}; +Line(144) = {3944,3899}; +Line(145) = {3899,3898}; +Line(146) = {3898,3894}; +Line(147) = {3894,3890}; +Line(148) = {3890,3893}; +Line(149) = {3893,3941}; +Line(150) = {3941,4000}; +Line(151) = {4000,3980}; +Line(152) = {3980,3846}; +Line(153) = {3846,3981}; +Line(154) = {3981,4001}; +Line(155) = {4001,3942}; +Line(156) = {3942,3940}; +Line(157) = {3940,3889}; +Line(158) = {3889,3892}; +Line(159) = {3892,3891}; +Line(160) = {3891,3943}; +Line(161) = {3943,3895}; +Line(162) = {4063,4062}; +Line(163) = {4062,4061}; +Line(164) = {4061,4114}; +Line(165) = {4114,4153}; +Line(166) = {4153,4178}; +Line(167) = {4178,4179}; +Line(168) = {4179,4191}; +Line(169) = {4191,4203}; +Line(170) = {4203,4109}; +Line(171) = {4109,4202}; +Line(172) = {4202,4199}; +Line(173) = {4199,4201}; +Line(174) = {4201,4200}; +Line(175) = {4200,4100}; +Line(176) = {4100,4099}; +Line(177) = {4099,4045}; +Line(178) = {4045,4044}; +Line(179) = {4044,4043}; +Line(180) = {4043,4147}; +Line(181) = {4147,4146}; +Line(182) = {4146,4180}; +Line(183) = {4180,4167}; +Line(184) = {4167,4166}; +Line(185) = {4166,4134}; +Line(186) = {4134,4133}; +Line(187) = {4133,4098}; +Line(188) = {4098,4097}; +Line(189) = {4097,4042}; +Line(190) = {4042,4041}; +Line(191) = {4041,4040}; +Line(192) = {4040,4095}; +Line(193) = {4095,4096}; +Line(194) = {4096,4132}; +Line(195) = {4132,4131}; +Line(196) = {4131,4165}; +Line(197) = {4165,4164}; +Line(198) = {4164,4163}; +Line(199) = {4163,4130}; +Line(200) = {4130,4129}; +Line(201) = {4129,4094}; +Line(202) = {4094,4093}; +Line(203) = {4093,4039}; +Line(204) = {4039,4038}; +Line(205) = {4038,4037}; +Line(206) = {4037,4092}; +Line(207) = {4092,4091}; +Line(208) = {4091,4128}; +Line(209) = {4128,4127}; +Line(210) = {4127,4162}; +Line(211) = {4162,4161}; +Line(212) = {4161,4183}; +Line(213) = {4183,4160}; +Line(214) = {4160,4159}; +Line(215) = {4159,4126}; +Line(216) = {4126,4125}; +Line(217) = {4125,4088}; +Line(218) = {4088,4087}; +Line(219) = {4087,4033}; +Line(220) = {4033,4032}; +Line(221) = {4032,4031}; +Line(222) = {4031,4086}; +Line(223) = {4086,4085}; +Line(224) = {4085,4124}; +Line(225) = {4124,4123}; +Line(226) = {4123,4158}; +Line(227) = {4158,4157}; +Line(228) = {4157,4156}; +Line(229) = {4156,4122}; +Line(230) = {4122,4121}; +Line(231) = {4121,4081}; +Line(232) = {4081,4080}; +Line(233) = {4080,4020}; +Line(234) = {4020,4019}; +Line(235) = {4019,4018}; +Line(236) = {4018,4143}; +Line(237) = {4143,4118}; +Line(238) = {4118,4022}; +Line(239) = {4022,4016}; +Line(240) = {4016,4015}; +Line(241) = {4015,4011}; +Line(242) = {4011,4010}; +Line(243) = {4010,4009}; +Line(244) = {4009,4219}; +Line(245) = {4219,4177}; +Line(246) = {4177,4176}; +Line(247) = {4176,4149}; +Line(248) = {4149,4059}; +Line(249) = {4059,4058}; +Line(250) = {4058,4055}; +Line(251) = {4055,4113}; +Line(252) = {4113,4110}; +Line(253) = {4110,4213}; +Line(254) = {4213,4210}; +Line(255) = {4210,4217}; +Line(256) = {4217,4006}; +Line(257) = {4006,4218}; +Line(258) = {4218,4211}; +Line(259) = {4211,4212}; +Line(260) = {4212,4111}; +Line(261) = {4111,4112}; +Line(262) = {4112,4056}; +Line(263) = {4056,4057}; +Line(264) = {4057,4060}; +Line(265) = {4060,4148}; +Line(266) = {4148,4150}; +Line(267) = {4150,4208}; +Line(268) = {4208,4209}; +Line(269) = {4209,4215}; +Line(270) = {4215,4216}; +Line(271) = {4216,4220}; +Line(272) = {4220,4012}; +Line(273) = {4012,4013}; +Line(274) = {4013,4014}; +Line(275) = {4014,4017}; +Line(276) = {4017,4021}; +Line(277) = {4021,4023}; +Line(278) = {4023,4117}; +Line(279) = {4117,4082}; +Line(280) = {4082,4083}; +Line(281) = {4083,4024}; +Line(282) = {4024,4025}; +Line(283) = {4025,4007}; +Line(284) = {4007,4026}; +Line(285) = {4026,4027}; +Line(286) = {4027,4028}; +Line(287) = {4028,4029}; +Line(288) = {4029,4008}; +Line(289) = {4008,4030}; +Line(290) = {4030,4084}; +Line(291) = {4084,4194}; +Line(292) = {4194,4195}; +Line(293) = {4195,4154}; +Line(294) = {4154,4155}; +Line(295) = {4155,4119}; +Line(296) = {4119,4120}; +Line(297) = {4120,4089}; +Line(298) = {4089,4090}; +Line(299) = {4090,4034}; +Line(300) = {4034,4035}; +Line(301) = {4035,4036}; +Line(302) = {4036,4144}; +Line(303) = {4144,4192}; +Line(304) = {4192,4193}; +Line(305) = {4193,4184}; +Line(306) = {4184,4185}; +Line(307) = {4185,4168}; +Line(308) = {4168,4169}; +Line(309) = {4169,4135}; +Line(310) = {4135,4136}; +Line(311) = {4136,4101}; +Line(312) = {4101,4102}; +Line(313) = {4102,4049}; +Line(314) = {4049,4050}; +Line(315) = {4050,4051}; +Line(316) = {4051,4103}; +Line(317) = {4103,4104}; +Line(318) = {4104,4137}; +Line(319) = {4137,4138}; +Line(320) = {4138,4170}; +Line(321) = {4170,4171}; +Line(322) = {4171,4186}; +Line(323) = {4186,4172}; +Line(324) = {4172,4173}; +Line(325) = {4173,4139}; +Line(326) = {4139,4140}; +Line(327) = {4140,4105}; +Line(328) = {4105,4106}; +Line(329) = {4106,4052}; +Line(330) = {4052,4053}; +Line(331) = {4053,4054}; +Line(332) = {4054,4107}; +Line(333) = {4107,4108}; +Line(334) = {4108,4141}; +Line(335) = {4141,4142}; +Line(336) = {4142,4174}; +Line(337) = {4174,4175}; +Line(338) = {4175,4187}; +Line(339) = {4187,4188}; +Line(340) = {4188,4145}; +Line(341) = {4145,4046}; +Line(342) = {4046,4047}; +Line(343) = {4047,4048}; +Line(344) = {4048,4196}; +Line(345) = {4196,4197}; +Line(346) = {4197,4198}; +Line(347) = {4198,4189}; +Line(348) = {4189,4190}; +Line(349) = {4190,4214}; +Line(350) = {4214,4181}; +Line(351) = {4181,4182}; +Line(352) = {4182,4151}; +Line(353) = {4151,4152}; +Line(354) = {4152,4064}; +Line(355) = {4064,4065}; +Line(356) = {4065,4066}; +Line(357) = {4066,4205}; +Line(358) = {4205,4206}; +Line(359) = {4206,4207}; +Line(360) = {4207,4072}; +Line(361) = {4072,4074}; +Line(362) = {4074,4073}; +Line(363) = {4073,4076}; +Line(364) = {4076,4075}; +Line(365) = {4075,4079}; +Line(366) = {4079,4078}; +Line(367) = {4078,4077}; +Line(368) = {4077,4068}; +Line(369) = {4068,4067}; +Line(370) = {4067,4069}; +Line(371) = {4069,4070}; +Line(372) = {4070,4071}; +Line(373) = {4071,4115}; +Line(374) = {4115,4116}; +Line(375) = {4116,4204}; +Line(376) = {4204,4063}; +Line(377) = {11,2233}; +Line(378) = {2233,5}; +Line(379) = {5,2236}; +Line(380) = {2236,14}; +Line(381) = {14,2}; +Line(382) = {2,15}; +Line(383) = {15,2301}; +Line(384) = {2301,6}; +Line(385) = {6,2304}; +Line(386) = {2304,18}; +Line(387) = {18,3}; +Line(388) = {3,19}; +Line(389) = {19,2240}; +Line(390) = {2240,7}; +Line(391) = {7,2243}; +Line(392) = {2243,22}; +Line(393) = {22,4}; +Line(394) = {4,23}; +Line(395) = {23,2317}; +Line(396) = {2317,8}; +Line(397) = {8,2297}; +Line(398) = {2297,10}; +Line(399) = {10,1}; +Line(400) = {1,11}; +Line(401) = {4298,4297}; +Line(402) = {4297,4222}; +Line(403) = {4222,4250}; +Line(404) = {4250,4252}; +Line(405) = {4252,4221}; +Line(406) = {4221,4251}; +Line(407) = {4251,4299}; +Line(408) = {4299,4335}; +Line(409) = {4335,4337}; +Line(410) = {4337,4267}; +Line(411) = {4267,4294}; +Line(412) = {4294,4269}; +Line(413) = {4269,4233}; +Line(414) = {4233,4234}; +Line(415) = {4234,4273}; +Line(416) = {4273,4293}; +Line(417) = {4293,4314}; +Line(418) = {4314,4317}; +Line(419) = {4317,4318}; +Line(420) = {4318,4274}; +Line(421) = {4274,4235}; +Line(422) = {4235,4236}; +Line(423) = {4236,4237}; +Line(424) = {4237,4301}; +Line(425) = {4301,4319}; +Line(426) = {4319,4321}; +Line(427) = {4321,4320}; +Line(428) = {4320,4322}; +Line(429) = {4322,4347}; +Line(430) = {4347,4323}; +Line(431) = {4323,4324}; +Line(432) = {4324,4325}; +Line(433) = {4325,4276}; +Line(434) = {4276,4238}; +Line(435) = {4238,4240}; +Line(436) = {4240,4239}; +Line(437) = {4239,4241}; +Line(438) = {4241,4277}; +Line(439) = {4277,4326}; +Line(440) = {4326,4327}; +Line(441) = {4327,4328}; +Line(442) = {4328,4350}; +Line(443) = {4350,4348}; +Line(444) = {4348,4349}; +Line(445) = {4349,4332}; +Line(446) = {4332,4333}; +Line(447) = {4333,4334}; +Line(448) = {4334,4278}; +Line(449) = {4278,4247}; +Line(450) = {4247,4248}; +Line(451) = {4248,4249}; +Line(452) = {4249,4282}; +Line(453) = {4282,4283}; +Line(454) = {4283,4341}; +Line(455) = {4341,4342}; +Line(456) = {4342,4343}; +Line(457) = {4343,4289}; +Line(458) = {4289,4290}; +Line(459) = {4290,4286}; +Line(460) = {4286,4255}; +Line(461) = {4255,4257}; +Line(462) = {4257,4256}; +Line(463) = {4256,4346}; +Line(464) = {4346,4288}; +Line(465) = {4288,4287}; +Line(466) = {4287,4260}; +Line(467) = {4260,4259}; +Line(468) = {4259,4258}; +Line(469) = {4258,4262}; +Line(470) = {4262,4261}; +Line(471) = {4261,4264}; +Line(472) = {4264,4263}; +Line(473) = {4263,4265}; +Line(474) = {4265,4266}; +Line(475) = {4266,4303}; +Line(476) = {4303,4302}; +Line(477) = {4302,4304}; +Line(478) = {4304,4305}; +Line(479) = {4305,4306}; +Line(480) = {4306,4307}; +Line(481) = {4307,4308}; +Line(482) = {4308,4309}; +Line(483) = {4309,4345}; +Line(484) = {4345,4344}; +Line(485) = {4344,4254}; +Line(486) = {4254,4253}; +Line(487) = {4253,4285}; +Line(488) = {4285,4284}; +Line(489) = {4284,4340}; +Line(490) = {4340,4339}; +Line(491) = {4339,4338}; +Line(492) = {4338,4246}; +Line(493) = {4246,4245}; +Line(494) = {4245,4281}; +Line(495) = {4281,4280}; +Line(496) = {4280,4279}; +Line(497) = {4279,4244}; +Line(498) = {4244,4243}; +Line(499) = {4243,4242}; +Line(500) = {4242,4296}; +Line(501) = {4296,4295}; +Line(502) = {4295,4300}; +Line(503) = {4300,4330}; +Line(504) = {4330,4331}; +Line(505) = {4331,4329}; +Line(506) = {4329,4232}; +Line(507) = {4232,4231}; +Line(508) = {4231,4230}; +Line(509) = {4230,4229}; +Line(510) = {4229,4228}; +Line(511) = {4228,4227}; +Line(512) = {4227,4225}; +Line(513) = {4225,4226}; +Line(514) = {4226,4312}; +Line(515) = {4312,4223}; +Line(516) = {4223,4224}; +Line(517) = {4224,4311}; +Line(518) = {4311,4310}; +Line(519) = {4310,4275}; +Line(520) = {4275,4316}; +Line(521) = {4316,4315}; +Line(522) = {4315,4313}; +Line(523) = {4313,4292}; +Line(524) = {4292,4272}; +Line(525) = {4272,4271}; +Line(526) = {4271,4270}; +Line(527) = {4270,4268}; +Line(528) = {4268,4291}; +Line(529) = {4291,4336}; +Line(530) = {4336,4298}; +Line Loop(531) = {384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,377,378,379,380,381,382,383}; +Line Loop(532) = {316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315}; +Line Loop(533) = {446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445}; +Line Loop(534) = {41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40}; +Plane Surface(535) = {531,532,534,533}; diff --git a/examples/dd.geo b/examples/dd.geo new file mode 100644 index 0000000000000000000000000000000000000000..0a851e9c512a96b75f3c7bbacb01295189ff146f --- /dev/null +++ b/examples/dd.geo @@ -0,0 +1,1080 @@ +lcext = 6. ; + +Point(3895) = {1.177410e-02,-2.768003e-03,0,1.e-3}; +Point(3897) = {1.081196e-02,-3.794565e-03,0,1.e-3}; +Point(3896) = {1.040081e-02,-4.225326e-03,0,1.e-3}; +Point(3968) = {9.501183e-03,-5.167856e-03,0,1.e-3}; +Point(3995) = {8.172335e-03,-6.541147e-03,0,1.e-3}; +Point(4003) = {6.820756e-03,-7.914438e-03,0,1.e-3}; +Point(3857) = {5.454371e-03,-9.287729e-03,0,1.e-3}; +Point(3856) = {3.534352e-03,-1.119762e-02,0,1.e-3}; +Point(3860) = {7.877699e-04,-1.389559e-02,0,1.e-3}; +Point(3861) = {-1.958812e-03,-1.658843e-02,0,1.e-3}; +Point(3863) = {-4.705394e-03,-1.930092e-02,0,1.e-3}; +Point(3864) = {-7.451976e-03,-2.206110e-02,0,1.e-3}; +Point(3865) = {-1.019856e-02,-2.490134e-02,0,1.e-3}; +Point(3866) = {-1.294514e-02,-2.785668e-02,0,1.e-3}; +Point(3867) = {-1.569172e-02,-3.097311e-02,0,1.e-3}; +Point(3868) = {-1.819787e-02,-3.400697e-02,0,1.e-3}; +Point(3869) = {-1.843830e-02,-3.430929e-02,0,1.e-3}; +Point(3870) = {-2.032098e-02,-3.675355e-02,0,1.e-3}; +Point(3871) = {-2.233602e-02,-3.950013e-02,0,1.e-3}; +Point(3872) = {-2.428062e-02,-4.224671e-02,0,1.e-3}; +Point(3977) = {-2.615522e-02,-4.499330e-02,0,1.e-3}; +Point(3877) = {-2.795526e-02,-4.773988e-02,0,1.e-3}; +Point(3876) = {-2.966457e-02,-5.048646e-02,0,1.e-3}; +Point(3878) = {-3.128951e-02,-5.323304e-02,0,1.e-3}; +Point(3934) = {-3.282722e-02,-5.597962e-02,0,1.e-3}; +Point(3873) = {-3.427526e-02,-5.872621e-02,0,1.e-3}; +Point(3874) = {-3.563187e-02,-6.147279e-02,0,1.e-3}; +Point(3875) = {-3.689577e-02,-6.421937e-02,0,1.e-3}; +Point(3935) = {-3.803475e-02,-6.696595e-02,0,1.e-3}; +Point(3880) = {-3.906585e-02,-6.971253e-02,0,1.e-3}; +Point(3879) = {-3.999980e-02,-7.245912e-02,0,1.e-3}; +Point(3881) = {-4.084348e-02,-7.520570e-02,0,1.e-3}; +Point(3936) = {-4.159737e-02,-7.795228e-02,0,1.e-3}; +Point(3882) = {-4.219350e-02,-8.069886e-02,0,1.e-3}; +Point(3883) = {-4.268262e-02,-8.344544e-02,0,1.e-3}; +Point(3885) = {-4.302180e-02,-8.619203e-02,0,1.e-3}; +Point(3884) = {-4.315754e-02,-8.815942e-02,0,1.e-3}; +Point(1218) = {-4.315754e-02,-8.893861e-02,0,1.e-3}; +Point(3933) = {-4.315754e-02,-8.955185e-02,0,1.e-3}; +Point(3996) = {-4.314894e-02,-9.031190e-02,0,1.e-3}; +Point(3989) = {-4.310538e-02,-9.168519e-02,0,1.e-3}; +Point(3990) = {-4.298693e-02,-9.305848e-02,0,1.e-3}; +Point(3978) = {-4.281442e-02,-9.443177e-02,0,1.e-3}; +Point(3979) = {-4.254831e-02,-9.580506e-02,0,1.e-3}; +Point(3974) = {-4.215142e-02,-9.717835e-02,0,1.e-3}; +Point(3973) = {-4.166490e-02,-9.855164e-02,0,1.e-3}; +Point(3963) = {-4.107412e-02,-9.992494e-02,0,1.e-3}; +Point(3947) = {-4.041096e-02,-1.011964e-01,0,1.e-3}; +Point(3948) = {-4.035707e-02,-1.012982e-01,0,1.e-3}; +Point(3904) = {-3.903767e-02,-1.033356e-01,0,1.e-3}; +Point(3903) = {-3.766438e-02,-1.048133e-01,0,1.e-3}; +Point(3946) = {-3.629109e-02,-1.058804e-01,0,1.e-3}; +Point(3902) = {-3.491780e-02,-1.066897e-01,0,1.e-3}; +Point(3901) = {-3.354451e-02,-1.073184e-01,0,1.e-3}; +Point(3900) = {-3.217121e-02,-1.078168e-01,0,1.e-3}; +Point(3908) = {-3.079792e-02,-1.081973e-01,0,1.e-3}; +Point(3907) = {-2.942463e-02,-1.084688e-01,0,1.e-3}; +Point(3951) = {-2.805134e-02,-1.086029e-01,0,1.e-3}; +Point(3950) = {-2.667805e-02,-1.086423e-01,0,1.e-3}; +Point(3847) = {-2.580700e-02,-1.086440e-01,0,1.e-3}; +Point(3949) = {-2.667805e-02,-1.088853e-01,0,1.e-3}; +Point(3952) = {-2.805134e-02,-1.092658e-01,0,1.e-3}; +Point(3905) = {-2.942463e-02,-1.096463e-01,0,1.e-3}; +Point(3906) = {-3.079792e-02,-1.100268e-01,0,1.e-3}; +Point(3909) = {-3.217121e-02,-1.104020e-01,0,1.e-3}; +Point(3969) = {-3.354451e-02,-1.107749e-01,0,1.e-3}; +Point(3970) = {-3.491780e-02,-1.111477e-01,0,1.e-3}; +Point(3997) = {-3.629109e-02,-1.115205e-01,0,1.e-3}; +Point(3998) = {-3.766438e-02,-1.118690e-01,0,1.e-3}; +Point(4004) = {-3.903767e-02,-1.122095e-01,0,1.e-3}; +Point(3959) = {-4.041096e-02,-1.125499e-01,0,1.e-3}; +Point(3960) = {-4.315754e-02,-1.131897e-01,0,1.e-3}; +Point(3972) = {-4.590412e-02,-1.137699e-01,0,1.e-3}; +Point(3984) = {-4.865071e-02,-1.143079e-01,0,1.e-3}; +Point(3988) = {-5.139729e-02,-1.147970e-01,0,1.e-3}; +Point(3961) = {-5.414387e-02,-1.152035e-01,0,1.e-3}; +Point(3962) = {-5.689045e-02,-1.155501e-01,0,1.e-3}; +Point(3937) = {-5.963703e-02,-1.157358e-01,0,1.e-3}; +Point(3938) = {-6.238362e-02,-1.158519e-01,0,1.e-3}; +Point(3886) = {-6.513020e-02,-1.158332e-01,0,1.e-3}; +Point(3887) = {-6.787678e-02,-1.156607e-01,0,1.e-3}; +Point(3888) = {-7.062336e-02,-1.152790e-01,0,1.e-3}; +Point(3993) = {-7.199665e-02,-1.150098e-01,0,1.e-3}; +Point(3994) = {-7.336994e-02,-1.146075e-01,0,1.e-3}; +Point(3971) = {-7.474324e-02,-1.141776e-01,0,1.e-3}; +Point(3918) = {-7.611653e-02,-1.135965e-01,0,1.e-3}; +Point(3919) = {-7.748982e-02,-1.129165e-01,0,1.e-3}; +Point(3920) = {-7.886311e-02,-1.121014e-01,0,1.e-3}; +Point(3956) = {-8.023640e-02,-1.111186e-01,0,1.e-3}; +Point(3955) = {-8.047561e-02,-1.109113e-01,0,1.e-3}; +Point(3965) = {-8.160969e-02,-1.098434e-01,0,1.e-3}; +Point(3966) = {-8.189452e-02,-1.095380e-01,0,1.e-3}; +Point(3910) = {-8.297356e-02,-1.081647e-01,0,1.e-3}; +Point(3913) = {-8.376570e-02,-1.067914e-01,0,1.e-3}; +Point(3912) = {-8.435627e-02,-1.054263e-01,0,1.e-3}; +Point(3911) = {-8.435982e-02,-1.054181e-01,0,1.e-3}; +Point(3914) = {-8.478803e-02,-1.040448e-01,0,1.e-3}; +Point(3915) = {-8.503641e-02,-1.026715e-01,0,1.e-3}; +Point(3916) = {-8.516945e-02,-1.012982e-01,0,1.e-3}; +Point(3917) = {-8.522183e-02,-9.992494e-02,0,1.e-3}; +Point(3953) = {-8.512327e-02,-9.855164e-02,0,1.e-3}; +Point(3954) = {-8.495463e-02,-9.717835e-02,0,1.e-3}; +Point(3964) = {-8.467545e-02,-9.580506e-02,0,1.e-3}; +Point(3975) = {-8.433113e-02,-9.443177e-02,0,1.e-3}; +Point(3992) = {-8.387660e-02,-9.305848e-02,0,1.e-3}; +Point(3991) = {-8.341194e-02,-9.168519e-02,0,1.e-3}; +Point(3999) = {-8.280629e-02,-9.031190e-02,0,1.e-3}; +Point(3939) = {-8.220063e-02,-8.893861e-02,0,1.e-3}; +Point(3967) = {-8.076693e-02,-8.619203e-02,0,1.e-3}; +Point(3987) = {-7.916546e-02,-8.344544e-02,0,1.e-3}; +Point(3985) = {-7.886311e-02,-8.298081e-02,0,1.e-3}; +Point(3986) = {-7.737820e-02,-8.069886e-02,0,1.e-3}; +Point(4002) = {-7.542111e-02,-7.795228e-02,0,1.e-3}; +Point(3922) = {-7.335979e-02,-7.520570e-02,0,1.e-3}; +Point(4005) = {-7.112105e-02,-7.245912e-02,0,1.e-3}; +Point(3851) = {-6.873828e-02,-6.971253e-02,0,1.e-3}; +Point(3850) = {-6.372231e-02,-6.421937e-02,0,1.e-3}; +Point(3853) = {-5.963703e-02,-6.001430e-02,0,1.e-3}; +Point(3852) = {-5.414387e-02,-5.469298e-02,0,1.e-3}; +Point(3849) = {-4.865071e-02,-4.961204e-02,0,1.e-3}; +Point(3848) = {-4.315754e-02,-4.465740e-02,0,1.e-3}; +Point(3921) = {-3.766438e-02,-3.985542e-02,0,1.e-3}; +Point(3983) = {-3.491780e-02,-3.750843e-02,0,1.e-3}; +Point(3982) = {-3.217121e-02,-3.519259e-02,0,1.e-3}; +Point(3976) = {-2.942463e-02,-3.289435e-02,0,1.e-3}; +Point(3929) = {-2.744807e-02,-3.126039e-02,0,1.e-3}; +Point(3958) = {-2.667805e-02,-3.062383e-02,0,1.e-3}; +Point(3928) = {-2.411032e-02,-2.851380e-02,0,1.e-3}; +Point(3957) = {-2.393147e-02,-2.836765e-02,0,1.e-3}; +Point(3927) = {-2.118489e-02,-2.612321e-02,0,1.e-3}; +Point(3926) = {-1.843830e-02,-2.390843e-02,0,1.e-3}; +Point(3925) = {-1.569172e-02,-2.170681e-02,0,1.e-3}; +Point(3924) = {-1.294514e-02,-1.952576e-02,0,1.e-3}; +Point(3932) = {-1.040573e-02,-1.752748e-02,0,1.e-3}; +Point(3931) = {-1.019856e-02,-1.736495e-02,0,1.e-3}; +Point(3930) = {-7.451976e-03,-1.521330e-02,0,1.e-3}; +Point(3923) = {-4.705394e-03,-1.307794e-02,0,1.e-3}; +Point(3862) = {-1.958812e-03,-1.095092e-02,0,1.e-3}; +Point(3859) = {1.960946e-04,-9.287729e-03,0,1.e-3}; +Point(3858) = {7.877699e-04,-8.831063e-03,0,1.e-3}; +Point(3855) = {3.534352e-03,-6.728705e-03,0,1.e-3}; +Point(3854) = {6.280934e-03,-4.633175e-03,0,1.e-3}; +Point(3945) = {7.386845e-03,-3.794565e-03,0,1.e-3}; +Point(3944) = {7.654225e-03,-3.591811e-03,0,1.e-3}; +Point(3899) = {9.027516e-03,-2.550448e-03,0,1.e-3}; +Point(3898) = {1.040081e-02,-1.509310e-03,0,1.e-3}; +Point(3894) = {1.177410e-02,-4.686545e-04,0,1.e-3}; +Point(3890) = {1.282184e-02,3.253082e-04,0,1.e-3}; +Point(3893) = {1.314739e-02,5.720012e-04,0,1.e-3}; +Point(3941) = {1.463351e-02,1.698599e-03,0,1.e-3}; +Point(4000) = {1.644012e-02,3.071890e-03,0,1.e-3}; +Point(3980) = {1.824674e-02,4.445181e-03,0,1.e-3}; +Point(3846) = {1.892400e-02,4.960000e-03,0,1.e-3}; +Point(3981) = {1.843389e-02,4.445181e-03,0,1.e-3}; +Point(4001) = {1.712649e-02,3.071890e-03,0,1.e-3}; +Point(3942) = {1.584524e-02,1.698599e-03,0,1.e-3}; +Point(3940) = {1.460138e-02,3.253082e-04,0,1.e-3}; +Point(3889) = {1.452068e-02,2.362167e-04,0,1.e-3}; +Point(3892) = {1.335131e-02,-1.047983e-03,0,1.e-3}; +Point(3891) = {1.314739e-02,-1.270371e-03,0,1.e-3}; +Point(3943) = {1.209204e-02,-2.421274e-03,0,1.e-3}; +Point(4063) = {4.498368e-02,-9.287729e-03,0,1.e-3}; +Point(4062) = {4.610574e-02,-6.541147e-03,0,1.e-3}; +Point(4061) = {4.755089e-02,-3.794565e-03,0,1.e-3}; +Point(4114) = {4.934166e-02,-1.047983e-03,0,1.e-3}; +Point(4153) = {5.143154e-02,1.698599e-03,0,1.e-3}; +Point(4178) = {5.390637e-02,4.445181e-03,0,1.e-3}; +Point(4179) = {5.571941e-02,6.252892e-03,0,1.e-3}; +Point(4191) = {5.846599e-02,8.699713e-03,0,1.e-3}; +Point(4203) = {6.121257e-02,1.103796e-02,0,1.e-3}; +Point(4109) = {6.350284e-02,1.268493e-02,0,1.e-3}; +Point(4202) = {6.670574e-02,1.498818e-02,0,1.e-3}; +Point(4199) = {7.170787e-02,1.817809e-02,0,1.e-3}; +Point(4201) = {7.219890e-02,1.846566e-02,0,1.e-3}; +Point(4200) = {7.769207e-02,2.168274e-02,0,1.e-3}; +Point(4100) = {8.318523e-02,2.447113e-02,0,1.e-3}; +Point(4099) = {9.417156e-02,2.953992e-02,0,1.e-3}; +Point(4045) = {1.051579e-01,3.374477e-02,0,1.e-3}; +Point(4044) = {1.161442e-01,3.745387e-02,0,1.e-3}; +Point(4043) = {1.271305e-01,4.084705e-02,0,1.e-3}; +Point(4147) = {1.381169e-01,4.362166e-02,0,1.e-3}; +Point(4146) = {1.491032e-01,4.590535e-02,0,1.e-3}; +Point(4180) = {1.600895e-01,4.775547e-02,0,1.e-3}; +Point(4167) = {1.710759e-01,4.909090e-02,0,1.e-3}; +Point(4166) = {1.820622e-01,5.028654e-02,0,1.e-3}; +Point(4134) = {1.930485e-01,5.118303e-02,0,1.e-3}; +Point(4133) = {2.040348e-01,5.209637e-02,0,1.e-3}; +Point(4098) = {2.150212e-01,5.304431e-02,0,1.e-3}; +Point(4097) = {2.260075e-01,5.389186e-02,0,1.e-3}; +Point(4042) = {2.369938e-01,5.466596e-02,0,1.e-3}; +Point(4041) = {2.479802e-01,5.535583e-02,0,1.e-3}; +Point(4040) = {2.589665e-01,5.602171e-02,0,1.e-3}; +Point(4095) = {2.699528e-01,5.660820e-02,0,1.e-3}; +Point(4096) = {2.809391e-01,5.717080e-02,0,1.e-3}; +Point(4132) = {2.919255e-01,5.768210e-02,0,1.e-3}; +Point(4131) = {3.029118e-01,5.816077e-02,0,1.e-3}; +Point(4165) = {3.138981e-01,5.861410e-02,0,1.e-3}; +Point(4164) = {3.248844e-01,5.902748e-02,0,1.e-3}; +Point(4163) = {3.358708e-01,5.942876e-02,0,1.e-3}; +Point(4130) = {3.468571e-01,5.978313e-02,0,1.e-3}; +Point(4129) = {3.578434e-01,6.012088e-02,0,1.e-3}; +Point(4094) = {3.688298e-01,6.041918e-02,0,1.e-3}; +Point(4093) = {3.798161e-01,6.068571e-02,0,1.e-3}; +Point(4039) = {3.908024e-01,6.092523e-02,0,1.e-3}; +Point(4038) = {4.017887e-01,6.111444e-02,0,1.e-3}; +Point(4037) = {4.127751e-01,6.128792e-02,0,1.e-3}; +Point(4092) = {4.237614e-01,6.139510e-02,0,1.e-3}; +Point(4091) = {4.347477e-01,6.148330e-02,0,1.e-3}; +Point(4128) = {4.457341e-01,6.152051e-02,0,1.e-3}; +Point(4127) = {4.567204e-01,6.152534e-02,0,1.e-3}; +Point(4162) = {4.677067e-01,6.149964e-02,0,1.e-3}; +Point(4161) = {4.786930e-01,6.143130e-02,0,1.e-3}; +Point(4183) = {4.896794e-01,6.134928e-02,0,1.e-3}; +Point(4160) = {5.006657e-01,6.120560e-02,0,1.e-3}; +Point(4159) = {5.116520e-01,6.104561e-02,0,1.e-3}; +Point(4126) = {5.226384e-01,6.083535e-02,0,1.e-3}; +Point(4125) = {5.336247e-01,6.058889e-02,0,1.e-3}; +Point(4088) = {5.446110e-01,6.030455e-02,0,1.e-3}; +Point(4087) = {5.555973e-01,5.996460e-02,0,1.e-3}; +Point(4033) = {5.665837e-01,5.960434e-02,0,1.e-3}; +Point(4032) = {5.775700e-01,5.915575e-02,0,1.e-3}; +Point(4031) = {5.885563e-01,5.867545e-02,0,1.e-3}; +Point(4086) = {5.995427e-01,5.809113e-02,0,1.e-3}; +Point(4085) = {6.105290e-01,5.746759e-02,0,1.e-3}; +Point(4124) = {6.215153e-01,5.679937e-02,0,1.e-3}; +Point(4123) = {6.325016e-01,5.616104e-02,0,1.e-3}; +Point(4158) = {6.434880e-01,5.553466e-02,0,1.e-3}; +Point(4157) = {6.544743e-01,5.490460e-02,0,1.e-3}; +Point(4156) = {6.654606e-01,5.425221e-02,0,1.e-3}; +Point(4122) = {6.764469e-01,5.351456e-02,0,1.e-3}; +Point(4121) = {6.874333e-01,5.273401e-02,0,1.e-3}; +Point(4081) = {6.984196e-01,5.190181e-02,0,1.e-3}; +Point(4080) = {7.094059e-01,5.101347e-02,0,1.e-3}; +Point(4020) = {7.203923e-01,5.010133e-02,0,1.e-3}; +Point(4019) = {7.313786e-01,4.909498e-02,0,1.e-3}; +Point(4018) = {7.423649e-01,4.806316e-02,0,1.e-3}; +Point(4143) = {7.533512e-01,4.694984e-02,0,1.e-3}; +Point(4118) = {7.643376e-01,4.579371e-02,0,1.e-3}; +Point(4022) = {7.753239e-01,4.458624e-02,0,1.e-3}; +Point(4016) = {7.863102e-01,4.330843e-02,0,1.e-3}; +Point(4015) = {7.972966e-01,4.200167e-02,0,1.e-3}; +Point(4011) = {8.082829e-01,4.058146e-02,0,1.e-3}; +Point(4010) = {8.192692e-01,3.912968e-02,0,1.e-3}; +Point(4009) = {8.302555e-01,3.758209e-02,0,1.e-3}; +Point(4219) = {8.357487e-01,3.680830e-02,0,1.e-3}; +Point(4177) = {8.412419e-01,3.598390e-02,0,1.e-3}; +Point(4176) = {8.467350e-01,3.515767e-02,0,1.e-3}; +Point(4149) = {8.494816e-01,3.474456e-02,0,1.e-3}; +Point(4059) = {8.522282e-01,3.433145e-02,0,1.e-3}; +Point(4058) = {8.549748e-01,3.391833e-02,0,1.e-3}; +Point(4055) = {8.577214e-01,3.349214e-02,0,1.e-3}; +Point(4113) = {8.604679e-01,3.306571e-02,0,1.e-3}; +Point(4110) = {8.632145e-01,3.263928e-02,0,1.e-3}; +Point(4213) = {8.659611e-01,3.221285e-02,0,1.e-3}; +Point(4210) = {8.687077e-01,3.178643e-02,0,1.e-3}; +Point(4217) = {8.714543e-01,3.136000e-02,0,1.e-3}; +Point(4006) = {8.740950e-01,3.095000e-02,0,1.e-3}; +Point(4218) = {8.714543e-01,3.095677e-02,0,1.e-3}; +Point(4211) = {8.687077e-01,3.096380e-02,0,1.e-3}; +Point(4212) = {8.659611e-01,3.097084e-02,0,1.e-3}; +Point(4111) = {8.632145e-01,3.097787e-02,0,1.e-3}; +Point(4112) = {8.604679e-01,3.098491e-02,0,1.e-3}; +Point(4056) = {8.577214e-01,3.099195e-02,0,1.e-3}; +Point(4057) = {8.549748e-01,3.099898e-02,0,1.e-3}; +Point(4060) = {8.522282e-01,3.100602e-02,0,1.e-3}; +Point(4148) = {8.494816e-01,3.101305e-02,0,1.e-3}; +Point(4150) = {8.467350e-01,3.102009e-02,0,1.e-3}; +Point(4208) = {8.439885e-01,3.102712e-02,0,1.e-3}; +Point(4209) = {8.412419e-01,3.103416e-02,0,1.e-3}; +Point(4215) = {8.357487e-01,3.104823e-02,0,1.e-3}; +Point(4216) = {8.302555e-01,3.106230e-02,0,1.e-3}; +Point(4220) = {8.247624e-01,3.107638e-02,0,1.e-3}; +Point(4012) = {8.192692e-01,3.109045e-02,0,1.e-3}; +Point(4013) = {8.082829e-01,3.111859e-02,0,1.e-3}; +Point(4014) = {7.972966e-01,3.114674e-02,0,1.e-3}; +Point(4017) = {7.863102e-01,3.117488e-02,0,1.e-3}; +Point(4021) = {7.753239e-01,3.120302e-02,0,1.e-3}; +Point(4023) = {7.643376e-01,3.123117e-02,0,1.e-3}; +Point(4117) = {7.533512e-01,3.125931e-02,0,1.e-3}; +Point(4082) = {7.423649e-01,3.128745e-02,0,1.e-3}; +Point(4083) = {7.313786e-01,3.131560e-02,0,1.e-3}; +Point(4024) = {7.203923e-01,3.134374e-02,0,1.e-3}; +Point(4025) = {7.094059e-01,3.137188e-02,0,1.e-3}; +Point(4007) = {6.999910e-01,3.139600e-02,0,1.e-3}; +Point(4026) = {6.999910e-01,2.367126e-02,0,1.e-3}; +Point(4027) = {6.999910e-01,1.268493e-02,0,1.e-3}; +Point(4028) = {6.999910e-01,1.698599e-03,0,1.e-3}; +Point(4029) = {6.999910e-01,-9.287729e-03,0,1.e-3}; +Point(4008) = {6.999910e-01,-1.722400e-02,0,1.e-3}; +Point(4030) = {6.984196e-01,-1.751626e-02,0,1.e-3}; +Point(4084) = {6.874333e-01,-1.955960e-02,0,1.e-3}; +Point(4194) = {6.764469e-01,-2.159776e-02,0,1.e-3}; +Point(4195) = {6.654606e-01,-2.362865e-02,0,1.e-3}; +Point(4154) = {6.544743e-01,-2.588904e-02,0,1.e-3}; +Point(4155) = {6.434880e-01,-2.825320e-02,0,1.e-3}; +Point(4119) = {6.325016e-01,-3.016078e-02,0,1.e-3}; +Point(4120) = {6.215153e-01,-3.200586e-02,0,1.e-3}; +Point(4089) = {6.105290e-01,-3.369569e-02,0,1.e-3}; +Point(4090) = {5.995427e-01,-3.534073e-02,0,1.e-3}; +Point(4034) = {5.885563e-01,-3.694183e-02,0,1.e-3}; +Point(4035) = {5.775700e-01,-3.852074e-02,0,1.e-3}; +Point(4036) = {5.665837e-01,-4.009157e-02,0,1.e-3}; +Point(4144) = {5.555973e-01,-4.161619e-02,0,1.e-3}; +Point(4192) = {5.446110e-01,-4.311363e-02,0,1.e-3}; +Point(4193) = {5.336247e-01,-4.454372e-02,0,1.e-3}; +Point(4184) = {5.226384e-01,-4.589904e-02,0,1.e-3}; +Point(4185) = {5.116520e-01,-4.719211e-02,0,1.e-3}; +Point(4168) = {5.006657e-01,-4.834107e-02,0,1.e-3}; +Point(4169) = {4.896794e-01,-4.944199e-02,0,1.e-3}; +Point(4135) = {4.786930e-01,-5.032590e-02,0,1.e-3}; +Point(4136) = {4.677067e-01,-5.113121e-02,0,1.e-3}; +Point(4101) = {4.567204e-01,-5.175527e-02,0,1.e-3}; +Point(4102) = {4.457341e-01,-5.227269e-02,0,1.e-3}; +Point(4049) = {4.347477e-01,-5.270239e-02,0,1.e-3}; +Point(4050) = {4.237614e-01,-5.305741e-02,0,1.e-3}; +Point(4051) = {4.127751e-01,-5.339040e-02,0,1.e-3}; +Point(4103) = {4.017887e-01,-5.365720e-02,0,1.e-3}; +Point(4104) = {3.908024e-01,-5.390137e-02,0,1.e-3}; +Point(4137) = {3.798161e-01,-5.408775e-02,0,1.e-3}; +Point(4138) = {3.688298e-01,-5.423035e-02,0,1.e-3}; +Point(4170) = {3.578434e-01,-5.433335e-02,0,1.e-3}; +Point(4171) = {3.468571e-01,-5.436941e-02,0,1.e-3}; +Point(4186) = {3.358708e-01,-5.438425e-02,0,1.e-3}; +Point(4172) = {3.248844e-01,-5.431051e-02,0,1.e-3}; +Point(4173) = {3.138981e-01,-5.421116e-02,0,1.e-3}; +Point(4139) = {3.029118e-01,-5.403703e-02,0,1.e-3}; +Point(4140) = {2.919255e-01,-5.379680e-02,0,1.e-3}; +Point(4105) = {2.809391e-01,-5.349015e-02,0,1.e-3}; +Point(4106) = {2.699528e-01,-5.307623e-02,0,1.e-3}; +Point(4052) = {2.589665e-01,-5.262516e-02,0,1.e-3}; +Point(4053) = {2.479802e-01,-5.205332e-02,0,1.e-3}; +Point(4054) = {2.369938e-01,-5.145659e-02,0,1.e-3}; +Point(4107) = {2.260075e-01,-5.078306e-02,0,1.e-3}; +Point(4108) = {2.150212e-01,-5.007146e-02,0,1.e-3}; +Point(4141) = {2.040348e-01,-4.931867e-02,0,1.e-3}; +Point(4142) = {1.930485e-01,-4.849150e-02,0,1.e-3}; +Point(4174) = {1.820622e-01,-4.763665e-02,0,1.e-3}; +Point(4175) = {1.710759e-01,-4.665625e-02,0,1.e-3}; +Point(4187) = {1.600895e-01,-4.564614e-02,0,1.e-3}; +Point(4188) = {1.491032e-01,-4.455428e-02,0,1.e-3}; +Point(4145) = {1.381169e-01,-4.339482e-02,0,1.e-3}; +Point(4046) = {1.271305e-01,-4.218155e-02,0,1.e-3}; +Point(4047) = {1.161442e-01,-4.082776e-02,0,1.e-3}; +Point(4048) = {1.051579e-01,-3.939290e-02,0,1.e-3}; +Point(4196) = {9.966472e-02,-3.862964e-02,0,1.e-3}; +Point(4197) = {9.417156e-02,-3.788513e-02,0,1.e-3}; +Point(4198) = {8.867839e-02,-3.720163e-02,0,1.e-3}; +Point(4189) = {8.318523e-02,-3.651554e-02,0,1.e-3}; +Point(4190) = {7.769207e-02,-3.569174e-02,0,1.e-3}; +Point(4214) = {7.494548e-02,-3.527985e-02,0,1.e-3}; +Point(4181) = {7.219890e-02,-3.481687e-02,0,1.e-3}; +Point(4182) = {6.945232e-02,-3.430639e-02,0,1.e-3}; +Point(4151) = {6.670574e-02,-3.379591e-02,0,1.e-3}; +Point(4152) = {6.395916e-02,-3.322033e-02,0,1.e-3}; +Point(4064) = {6.121257e-02,-3.263264e-02,0,1.e-3}; +Point(4065) = {5.846599e-02,-3.189105e-02,0,1.e-3}; +Point(4066) = {5.635416e-02,-3.126039e-02,0,1.e-3}; +Point(4205) = {5.434612e-02,-3.049426e-02,0,1.e-3}; +Point(4206) = {5.297283e-02,-2.986940e-02,0,1.e-3}; +Point(4207) = {5.159954e-02,-2.914883e-02,0,1.e-3}; +Point(4072) = {5.022625e-02,-2.824438e-02,0,1.e-3}; +Point(4074) = {4.885296e-02,-2.716087e-02,0,1.e-3}; +Point(4073) = {4.883074e-02,-2.714051e-02,0,1.e-3}; +Point(4076) = {4.747966e-02,-2.578824e-02,0,1.e-3}; +Point(4075) = {4.746129e-02,-2.576722e-02,0,1.e-3}; +Point(4079) = {4.639274e-02,-2.439393e-02,0,1.e-3}; +Point(4078) = {4.561283e-02,-2.302064e-02,0,1.e-3}; +Point(4077) = {4.500573e-02,-2.164735e-02,0,1.e-3}; +Point(4068) = {4.450243e-02,-2.027406e-02,0,1.e-3}; +Point(4067) = {4.415104e-02,-1.890077e-02,0,1.e-3}; +Point(4069) = {4.402927e-02,-1.752748e-02,0,1.e-3}; +Point(4070) = {4.404617e-02,-1.615418e-02,0,1.e-3}; +Point(4071) = {4.411753e-02,-1.478089e-02,0,1.e-3}; +Point(4115) = {4.421802e-02,-1.340760e-02,0,1.e-3}; +Point(4116) = {4.435615e-02,-1.203431e-02,0,1.e-3}; +Point(4204) = {4.461695e-02,-1.066102e-02,0,1.e-3}; +Point(11) = {4.552264e+01,-2.254225e+01,0,lcext}; +Point(2233) = {4.552264e+01,-1.129225e+01,0,lcext}; +Point(5) = {4.552264e+01,-4.224671e-02,0,lcext}; +Point(2236) = {4.552264e+01,1.120775e+01,0,lcext}; +Point(14) = {4.552264e+01,2.245775e+01,0,lcext}; +Point(2) = {4.552264e+01,4.495775e+01,0,lcext}; +Point(15) = {2.302264e+01,4.495775e+01,0,lcext}; +Point(2301) = {1.177264e+01,4.495775e+01,0,lcext}; +Point(6) = {5.226384e-01,4.495775e+01,0,lcext}; +Point(2304) = {-1.072736e+01,4.495775e+01,0,lcext}; +Point(18) = {-2.197736e+01,4.495775e+01,0,lcext}; +Point(3) = {-4.447736e+01,4.495775e+01,0,lcext}; +Point(19) = {-4.447736e+01,2.245775e+01,0,lcext}; +Point(2240) = {-4.447736e+01,1.120775e+01,0,lcext}; +Point(7) = {-4.447736e+01,-4.224671e-02,0,lcext}; +Point(2243) = {-4.447736e+01,-1.129225e+01,0,lcext}; +Point(22) = {-4.447736e+01,-2.254225e+01,0,lcext}; +Point(4) = {-4.447736e+01,-4.504225e+01,0,lcext}; +Point(23) = {-2.197736e+01,-4.504225e+01,0,lcext}; +Point(2317) = {-1.072736e+01,-4.504225e+01,0,lcext}; +Point(8) = {5.226384e-01,-4.504225e+01,0,lcext}; +Point(2297) = {1.177264e+01,-4.504225e+01,0,lcext}; +Point(10) = {2.302264e+01,-4.504225e+01,0,lcext}; +Point(1) = {4.552264e+01,-4.504225e+01,0,lcext}; +Point(4298) = {1.125732e+00,-1.356305e-01,0,lcext}; +Point(4297) = {1.128473e+00,-1.383771e-01,0,lcext}; +Point(4222) = {1.130511e+00,-1.404190e-01,0,lcext}; +Point(4250) = {1.130200e+00,-1.411237e-01,0,lcext}; +Point(4252) = {1.128987e+00,-1.438702e-01,0,lcext}; +Point(4221) = {1.128033e+00,-1.460320e-01,0,lcext}; +Point(4251) = {1.126886e+00,-1.450775e-01,0,lcext}; +Point(4299) = {1.124140e+00,-1.427912e-01,0,lcext}; +Point(4335) = {1.121393e+00,-1.405048e-01,0,lcext}; +Point(4337) = {1.118647e+00,-1.382318e-01,0,lcext}; +Point(4267) = {1.115900e+00,-1.359746e-01,0,lcext}; +Point(4294) = {1.115481e+00,-1.356305e-01,0,lcext}; +Point(4269) = {1.110407e+00,-1.315213e-01,0,lcext}; +Point(4233) = {1.104914e+00,-1.272651e-01,0,lcext}; +Point(4234) = {1.099421e+00,-1.231333e-01,0,lcext}; +Point(4273) = {1.093927e+00,-1.190696e-01,0,lcext}; +Point(4293) = {1.088434e+00,-1.150965e-01,0,lcext}; +Point(4314) = {1.082941e+00,-1.112096e-01,0,lcext}; +Point(4317) = {1.077448e+00,-1.073829e-01,0,lcext}; +Point(4318) = {1.071955e+00,-1.037168e-01,0,lcext}; +Point(4274) = {1.066462e+00,-1.001266e-01,0,lcext}; +Point(4235) = {1.060968e+00,-9.664561e-02,0,lcext}; +Point(4236) = {1.055475e+00,-9.329373e-02,0,lcext}; +Point(4237) = {1.049982e+00,-8.999964e-02,0,lcext}; +Point(4301) = {1.044489e+00,-8.685139e-02,0,lcext}; +Point(4319) = {1.038996e+00,-8.375978e-02,0,lcext}; +Point(4321) = {1.033503e+00,-8.073620e-02,0,lcext}; +Point(4320) = {1.033435e+00,-8.069886e-02,0,lcext}; +Point(4322) = {1.028009e+00,-7.778268e-02,0,lcext}; +Point(4347) = {1.022516e+00,-7.485902e-02,0,lcext}; +Point(4323) = {1.017023e+00,-7.206071e-02,0,lcext}; +Point(4324) = {1.011530e+00,-6.928798e-02,0,lcext}; +Point(4325) = {1.006037e+00,-6.656447e-02,0,lcext}; +Point(4276) = {1.000544e+00,-6.390345e-02,0,lcext}; +Point(4238) = {9.950505e-01,-6.128188e-02,0,lcext}; +Point(4240) = {9.895573e-01,-5.875476e-02,0,lcext}; +Point(4239) = {9.894949e-01,-5.872621e-02,0,lcext}; +Point(4241) = {9.840641e-01,-5.625125e-02,0,lcext}; +Point(4277) = {9.785710e-01,-5.382099e-02,0,lcext}; +Point(4326) = {9.730778e-01,-5.141086e-02,0,lcext}; +Point(4327) = {9.675846e-01,-4.903782e-02,0,lcext}; +Point(4328) = {9.620915e-01,-4.670806e-02,0,lcext}; +Point(4350) = {9.565983e-01,-4.440955e-02,0,lcext}; +Point(4348) = {9.511052e-01,-4.217563e-02,0,lcext}; +Point(4349) = {9.456120e-01,-3.995849e-02,0,lcext}; +Point(4332) = {9.401188e-01,-3.778658e-02,0,lcext}; +Point(4333) = {9.346257e-01,-3.563417e-02,0,lcext}; +Point(4334) = {9.291325e-01,-3.354304e-02,0,lcext}; +Point(4278) = {9.236393e-01,-3.147155e-02,0,lcext}; +Point(4247) = {9.181462e-01,-2.942051e-02,0,lcext}; +Point(4248) = {9.126530e-01,-2.741688e-02,0,lcext}; +Point(4249) = {9.071598e-01,-2.541811e-02,0,lcext}; +Point(4282) = {9.016667e-01,-2.339436e-02,0,lcext}; +Point(4283) = {8.961735e-01,-2.121581e-02,0,lcext}; +Point(4341) = {8.934269e-01,-2.008894e-02,0,lcext}; +Point(4342) = {8.906803e-01,-1.868991e-02,0,lcext}; +Point(4343) = {8.879338e-01,-1.729088e-02,0,lcext}; +Point(4289) = {8.851872e-01,-1.539587e-02,0,lcext}; +Point(4290) = {8.824406e-01,-1.328983e-02,0,lcext}; +Point(4286) = {8.796940e-01,-1.068337e-02,0,lcext}; +Point(4255) = {8.785175e-01,-9.287729e-03,0,lcext}; +Point(4257) = {8.763537e-01,-6.541147e-03,0,lcext}; +Point(4256) = {8.745583e-01,-3.794565e-03,0,lcext}; +Point(4346) = {8.737982e-01,-2.421274e-03,0,lcext}; +Point(4288) = {8.731375e-01,-1.047983e-03,0,lcext}; +Point(4287) = {8.725645e-01,3.253082e-04,0,lcext}; +Point(4260) = {8.721474e-01,1.698599e-03,0,lcext}; +Point(4259) = {8.718264e-01,3.071890e-03,0,lcext}; +Point(4258) = {8.716296e-01,4.445181e-03,0,lcext}; +Point(4262) = {8.715751e-01,5.818472e-03,0,lcext}; +Point(4261) = {8.716587e-01,7.191763e-03,0,lcext}; +Point(4264) = {8.718582e-01,8.565054e-03,0,lcext}; +Point(4263) = {8.721688e-01,9.938345e-03,0,lcext}; +Point(4265) = {8.726207e-01,1.131164e-02,0,lcext}; +Point(4266) = {8.732553e-01,1.268493e-02,0,lcext}; +Point(4303) = {8.741084e-01,1.405822e-02,0,lcext}; +Point(4302) = {8.742009e-01,1.417564e-02,0,lcext}; +Point(4304) = {8.752094e-01,1.543151e-02,0,lcext}; +Point(4305) = {8.755741e-01,1.580615e-02,0,lcext}; +Point(4306) = {8.765464e-01,1.680480e-02,0,lcext}; +Point(4307) = {8.769474e-01,1.712646e-02,0,lcext}; +Point(4308) = {8.783004e-01,1.817809e-02,0,lcext}; +Point(4309) = {8.783207e-01,1.819390e-02,0,lcext}; +Point(4345) = {8.796940e-01,1.898483e-02,0,lcext}; +Point(4344) = {8.810673e-01,1.969096e-02,0,lcext}; +Point(4254) = {8.824406e-01,2.018966e-02,0,lcext}; +Point(4253) = {8.851872e-01,2.092940e-02,0,lcext}; +Point(4285) = {8.879338e-01,2.136484e-02,0,lcext}; +Point(4284) = {8.906803e-01,2.153023e-02,0,lcext}; +Point(4340) = {8.934269e-01,2.149455e-02,0,lcext}; +Point(4339) = {8.961735e-01,2.136105e-02,0,lcext}; +Point(4338) = {8.989201e-01,2.104930e-02,0,lcext}; +Point(4246) = {9.016667e-01,2.064514e-02,0,lcext}; +Point(4245) = {9.071598e-01,1.954695e-02,0,lcext}; +Point(4281) = {9.126530e-01,1.818666e-02,0,lcext}; +Point(4280) = {9.181462e-01,1.648801e-02,0,lcext}; +Point(4279) = {9.236393e-01,1.459116e-02,0,lcext}; +Point(4244) = {9.291325e-01,1.255534e-02,0,lcext}; +Point(4243) = {9.346257e-01,1.024686e-02,0,lcext}; +Point(4242) = {9.401188e-01,7.859173e-03,0,lcext}; +Point(4296) = {9.456120e-01,5.245962e-03,0,lcext}; +Point(4295) = {9.511052e-01,2.515401e-03,0,lcext}; +Point(4300) = {9.565983e-01,-3.522322e-04,0,lcext}; +Point(4330) = {9.620915e-01,-3.368852e-03,0,lcext}; +Point(4331) = {9.628545e-01,-3.794565e-03,0,lcext}; +Point(4329) = {9.675846e-01,-6.447130e-03,0,lcext}; +Point(4232) = {9.730778e-01,-9.700323e-03,0,lcext}; +Point(4231) = {9.840641e-01,-1.646639e-02,0,lcext}; +Point(4230) = {9.950505e-01,-2.366260e-02,0,lcext}; +Point(4229) = {1.006037e+00,-3.132299e-02,0,lcext}; +Point(4228) = {1.017023e+00,-3.943289e-02,0,lcext}; +Point(4227) = {1.028009e+00,-4.793142e-02,0,lcext}; +Point(4225) = {1.038996e+00,-5.669110e-02,0,lcext}; +Point(4226) = {1.048275e+00,-6.421937e-02,0,lcext}; +Point(4312) = {1.054944e+00,-6.971253e-02,0,lcext}; +Point(4223) = {1.060968e+00,-7.473580e-02,0,lcext}; +Point(4224) = {1.061523e+00,-7.520570e-02,0,lcext}; +Point(4311) = {1.066462e+00,-7.943817e-02,0,lcext}; +Point(4310) = {1.067933e+00,-8.069886e-02,0,lcext}; +Point(4275) = {1.071955e+00,-8.420612e-02,0,lcext}; +Point(4316) = {1.077448e+00,-8.903994e-02,0,lcext}; +Point(4315) = {1.082941e+00,-9.395896e-02,0,lcext}; +Point(4313) = {1.088434e+00,-9.897945e-02,0,lcext}; +Point(4292) = {1.093927e+00,-1.041032e-01,0,lcext}; +Point(4272) = {1.099421e+00,-1.093858e-01,0,lcext}; +Point(4271) = {1.104914e+00,-1.148004e-01,0,lcext}; +Point(4270) = {1.110407e+00,-1.202740e-01,0,lcext}; +Point(4268) = {1.114765e+00,-1.246442e-01,0,lcext}; +Point(4291) = {1.120249e+00,-1.301373e-01,0,lcext}; +Point(4336) = {1.122990e+00,-1.328839e-01,0,lcext}; +Line(1) = {3895,3897}; +Line(2) = {3897,3896}; +Line(3) = {3896,3968}; +Line(4) = {3968,3995}; +Line(5) = {3995,4003}; +Line(6) = {4003,3857}; +Line(7) = {3857,3856}; +Line(8) = {3856,3860}; +Line(9) = {3860,3861}; +Line(10) = {3861,3863}; +Line(11) = {3863,3864}; +Line(12) = {3864,3865}; +Line(13) = {3865,3866}; +Line(14) = {3866,3867}; +Line(15) = {3867,3868}; +Line(16) = {3868,3869}; +Line(17) = {3869,3870}; +Line(18) = {3870,3871}; +Line(19) = {3871,3872}; +Line(20) = {3872,3977}; +Line(21) = {3977,3877}; +Line(22) = {3877,3876}; +Line(23) = {3876,3878}; +Line(24) = {3878,3934}; +Line(25) = {3934,3873}; +Line(26) = {3873,3874}; +Line(27) = {3874,3875}; +Line(28) = {3875,3935}; +Line(29) = {3935,3880}; +Line(30) = {3880,3879}; +Line(31) = {3879,3881}; +Line(32) = {3881,3936}; +Line(33) = {3936,3882}; +Line(34) = {3882,3883}; +Line(35) = {3883,3885}; +Line(36) = {3885,3884}; +Line(37) = {3884,1218}; +Line(38) = {1218,3933}; +Line(39) = {3933,3996}; +Line(40) = {3996,3989}; +Line(41) = {3989,3990}; +Line(42) = {3990,3978}; +Line(43) = {3978,3979}; +Line(44) = {3979,3974}; +Line(45) = {3974,3973}; +Line(46) = {3973,3963}; +Line(47) = {3963,3947}; +Line(48) = {3947,3948}; +Line(49) = {3948,3904}; +Line(50) = {3904,3903}; +Line(51) = {3903,3946}; +Line(52) = {3946,3902}; +Line(53) = {3902,3901}; +Line(54) = {3901,3900}; +Line(55) = {3900,3908}; +Line(56) = {3908,3907}; +Line(57) = {3907,3951}; +Line(58) = {3951,3950}; +Line(59) = {3950,3847}; +Line(60) = {3847,3949}; +Line(61) = {3949,3952}; +Line(62) = {3952,3905}; +Line(63) = {3905,3906}; +Line(64) = {3906,3909}; +Line(65) = {3909,3969}; +Line(66) = {3969,3970}; +Line(67) = {3970,3997}; +Line(68) = {3997,3998}; +Line(69) = {3998,4004}; +Line(70) = {4004,3959}; +Line(71) = {3959,3960}; +Line(72) = {3960,3972}; +Line(73) = {3972,3984}; +Line(74) = {3984,3988}; +Line(75) = {3988,3961}; +Line(76) = {3961,3962}; +Line(77) = {3962,3937}; +Line(78) = {3937,3938}; +Line(79) = {3938,3886}; +Line(80) = {3886,3887}; +Line(81) = {3887,3888}; +Line(82) = {3888,3993}; +Line(83) = {3993,3994}; +Line(84) = {3994,3971}; +Line(85) = {3971,3918}; +Line(86) = {3918,3919}; +Line(87) = {3919,3920}; +Line(88) = {3920,3956}; +Line(89) = {3956,3955}; +Line(90) = {3955,3965}; +Line(91) = {3965,3966}; +Line(92) = {3966,3910}; +Line(93) = {3910,3913}; +Line(94) = {3913,3912}; +Line(95) = {3912,3911}; +Line(96) = {3911,3914}; +Line(97) = {3914,3915}; +Line(98) = {3915,3916}; +Line(99) = {3916,3917}; +Line(100) = {3917,3953}; +Line(101) = {3953,3954}; +Line(102) = {3954,3964}; +Line(103) = {3964,3975}; +Line(104) = {3975,3992}; +Line(105) = {3992,3991}; +Line(106) = {3991,3999}; +Line(107) = {3999,3939}; +Line(108) = {3939,3967}; +Line(109) = {3967,3987}; +Line(110) = {3987,3985}; +Line(111) = {3985,3986}; +Line(112) = {3986,4002}; +Line(113) = {4002,3922}; +Line(114) = {3922,4005}; +Line(115) = {4005,3851}; +Line(116) = {3851,3850}; +Line(117) = {3850,3853}; +Line(118) = {3853,3852}; +Line(119) = {3852,3849}; +Line(120) = {3849,3848}; +Line(121) = {3848,3921}; +Line(122) = {3921,3983}; +Line(123) = {3983,3982}; +Line(124) = {3982,3976}; +Line(125) = {3976,3929}; +Line(126) = {3929,3958}; +Line(127) = {3958,3928}; +Line(128) = {3928,3957}; +Line(129) = {3957,3927}; +Line(130) = {3927,3926}; +Line(131) = {3926,3925}; +Line(132) = {3925,3924}; +Line(133) = {3924,3932}; +Line(134) = {3932,3931}; +Line(135) = {3931,3930}; +Line(136) = {3930,3923}; +Line(137) = {3923,3862}; +Line(138) = {3862,3859}; +Line(139) = {3859,3858}; +Line(140) = {3858,3855}; +Line(141) = {3855,3854}; +Line(142) = {3854,3945}; +Line(143) = {3945,3944}; +Line(144) = {3944,3899}; +Line(145) = {3899,3898}; +Line(146) = {3898,3894}; +Line(147) = {3894,3890}; +Line(148) = {3890,3893}; +Line(149) = {3893,3941}; +Line(150) = {3941,4000}; +Line(151) = {4000,3980}; +Line(152) = {3980,3846}; +Line(153) = {3846,3981}; +Line(154) = {3981,4001}; +Line(155) = {4001,3942}; +Line(156) = {3942,3940}; +Line(157) = {3940,3889}; +Line(158) = {3889,3892}; +Line(159) = {3892,3891}; +Line(160) = {3891,3943}; +Line(161) = {3943,3895}; +Line(162) = {4063,4062}; +Line(163) = {4062,4061}; +Line(164) = {4061,4114}; +Line(165) = {4114,4153}; +Line(166) = {4153,4178}; +Line(167) = {4178,4179}; +Line(168) = {4179,4191}; +Line(169) = {4191,4203}; +Line(170) = {4203,4109}; +Line(171) = {4109,4202}; +Line(172) = {4202,4199}; +Line(173) = {4199,4201}; +Line(174) = {4201,4200}; +Line(175) = {4200,4100}; +Line(176) = {4100,4099}; +Line(177) = {4099,4045}; +Line(178) = {4045,4044}; +Line(179) = {4044,4043}; +Line(180) = {4043,4147}; +Line(181) = {4147,4146}; +Line(182) = {4146,4180}; +Line(183) = {4180,4167}; +Line(184) = {4167,4166}; +Line(185) = {4166,4134}; +Line(186) = {4134,4133}; +Line(187) = {4133,4098}; +Line(188) = {4098,4097}; +Line(189) = {4097,4042}; +Line(190) = {4042,4041}; +Line(191) = {4041,4040}; +Line(192) = {4040,4095}; +Line(193) = {4095,4096}; +Line(194) = {4096,4132}; +Line(195) = {4132,4131}; +Line(196) = {4131,4165}; +Line(197) = {4165,4164}; +Line(198) = {4164,4163}; +Line(199) = {4163,4130}; +Line(200) = {4130,4129}; +Line(201) = {4129,4094}; +Line(202) = {4094,4093}; +Line(203) = {4093,4039}; +Line(204) = {4039,4038}; +Line(205) = {4038,4037}; +Line(206) = {4037,4092}; +Line(207) = {4092,4091}; +Line(208) = {4091,4128}; +Line(209) = {4128,4127}; +Line(210) = {4127,4162}; +Line(211) = {4162,4161}; +Line(212) = {4161,4183}; +Line(213) = {4183,4160}; +Line(214) = {4160,4159}; +Line(215) = {4159,4126}; +Line(216) = {4126,4125}; +Line(217) = {4125,4088}; +Line(218) = {4088,4087}; +Line(219) = {4087,4033}; +Line(220) = {4033,4032}; +Line(221) = {4032,4031}; +Line(222) = {4031,4086}; +Line(223) = {4086,4085}; +Line(224) = {4085,4124}; +Line(225) = {4124,4123}; +Line(226) = {4123,4158}; +Line(227) = {4158,4157}; +Line(228) = {4157,4156}; +Line(229) = {4156,4122}; +Line(230) = {4122,4121}; +Line(231) = {4121,4081}; +Line(232) = {4081,4080}; +Line(233) = {4080,4020}; +Line(234) = {4020,4019}; +Line(235) = {4019,4018}; +Line(236) = {4018,4143}; +Line(237) = {4143,4118}; +Line(238) = {4118,4022}; +Line(239) = {4022,4016}; +Line(240) = {4016,4015}; +Line(241) = {4015,4011}; +Line(242) = {4011,4010}; +Line(243) = {4010,4009}; +Line(244) = {4009,4219}; +Line(245) = {4219,4177}; +Line(246) = {4177,4176}; +Line(247) = {4176,4149}; +Line(248) = {4149,4059}; +Line(249) = {4059,4058}; +Line(250) = {4058,4055}; +Line(251) = {4055,4113}; +Line(252) = {4113,4110}; +Line(253) = {4110,4213}; +Line(254) = {4213,4210}; +Line(255) = {4210,4217}; +Line(256) = {4217,4006}; +Line(257) = {4006,4218}; +Line(258) = {4218,4211}; +Line(259) = {4211,4212}; +Line(260) = {4212,4111}; +Line(261) = {4111,4112}; +Line(262) = {4112,4056}; +Line(263) = {4056,4057}; +Line(264) = {4057,4060}; +Line(265) = {4060,4148}; +Line(266) = {4148,4150}; +Line(267) = {4150,4208}; +Line(268) = {4208,4209}; +Line(269) = {4209,4215}; +Line(270) = {4215,4216}; +Line(271) = {4216,4220}; +Line(272) = {4220,4012}; +Line(273) = {4012,4013}; +Line(274) = {4013,4014}; +Line(275) = {4014,4017}; +Line(276) = {4017,4021}; +Line(277) = {4021,4023}; +Line(278) = {4023,4117}; +Line(279) = {4117,4082}; +Line(280) = {4082,4083}; +Line(281) = {4083,4024}; +Line(282) = {4024,4025}; +Line(283) = {4025,4007}; +Line(284) = {4007,4026}; +Line(285) = {4026,4027}; +Line(286) = {4027,4028}; +Line(287) = {4028,4029}; +Line(288) = {4029,4008}; +Line(289) = {4008,4030}; +Line(290) = {4030,4084}; +Line(291) = {4084,4194}; +Line(292) = {4194,4195}; +Line(293) = {4195,4154}; +Line(294) = {4154,4155}; +Line(295) = {4155,4119}; +Line(296) = {4119,4120}; +Line(297) = {4120,4089}; +Line(298) = {4089,4090}; +Line(299) = {4090,4034}; +Line(300) = {4034,4035}; +Line(301) = {4035,4036}; +Line(302) = {4036,4144}; +Line(303) = {4144,4192}; +Line(304) = {4192,4193}; +Line(305) = {4193,4184}; +Line(306) = {4184,4185}; +Line(307) = {4185,4168}; +Line(308) = {4168,4169}; +Line(309) = {4169,4135}; +Line(310) = {4135,4136}; +Line(311) = {4136,4101}; +Line(312) = {4101,4102}; +Line(313) = {4102,4049}; +Line(314) = {4049,4050}; +Line(315) = {4050,4051}; +Line(316) = {4051,4103}; +Line(317) = {4103,4104}; +Line(318) = {4104,4137}; +Line(319) = {4137,4138}; +Line(320) = {4138,4170}; +Line(321) = {4170,4171}; +Line(322) = {4171,4186}; +Line(323) = {4186,4172}; +Line(324) = {4172,4173}; +Line(325) = {4173,4139}; +Line(326) = {4139,4140}; +Line(327) = {4140,4105}; +Line(328) = {4105,4106}; +Line(329) = {4106,4052}; +Line(330) = {4052,4053}; +Line(331) = {4053,4054}; +Line(332) = {4054,4107}; +Line(333) = {4107,4108}; +Line(334) = {4108,4141}; +Line(335) = {4141,4142}; +Line(336) = {4142,4174}; +Line(337) = {4174,4175}; +Line(338) = {4175,4187}; +Line(339) = {4187,4188}; +Line(340) = {4188,4145}; +Line(341) = {4145,4046}; +Line(342) = {4046,4047}; +Line(343) = {4047,4048}; +Line(344) = {4048,4196}; +Line(345) = {4196,4197}; +Line(346) = {4197,4198}; +Line(347) = {4198,4189}; +Line(348) = {4189,4190}; +Line(349) = {4190,4214}; +Line(350) = {4214,4181}; +Line(351) = {4181,4182}; +Line(352) = {4182,4151}; +Line(353) = {4151,4152}; +Line(354) = {4152,4064}; +Line(355) = {4064,4065}; +Line(356) = {4065,4066}; +Line(357) = {4066,4205}; +Line(358) = {4205,4206}; +Line(359) = {4206,4207}; +Line(360) = {4207,4072}; +Line(361) = {4072,4074}; +Line(362) = {4074,4073}; +Line(363) = {4073,4076}; +Line(364) = {4076,4075}; +Line(365) = {4075,4079}; +Line(366) = {4079,4078}; +Line(367) = {4078,4077}; +Line(368) = {4077,4068}; +Line(369) = {4068,4067}; +Line(370) = {4067,4069}; +Line(371) = {4069,4070}; +Line(372) = {4070,4071}; +Line(373) = {4071,4115}; +Line(374) = {4115,4116}; +Line(375) = {4116,4204}; +Line(376) = {4204,4063}; +Line(377) = {11,2233}; +Line(378) = {2233,5}; +Line(379) = {5,2236}; +Line(380) = {2236,14}; +Line(381) = {14,2}; +Line(382) = {2,15}; +Line(383) = {15,2301}; +Line(384) = {2301,6}; +Line(385) = {6,2304}; +Line(386) = {2304,18}; +Line(387) = {18,3}; +Line(388) = {3,19}; +Line(389) = {19,2240}; +Line(390) = {2240,7}; +Line(391) = {7,2243}; +Line(392) = {2243,22}; +Line(393) = {22,4}; +Line(394) = {4,23}; +Line(395) = {23,2317}; +Line(396) = {2317,8}; +Line(397) = {8,2297}; +Line(398) = {2297,10}; +Line(399) = {10,1}; +Line(400) = {1,11}; +Line(401) = {4298,4297}; +Line(402) = {4297,4222}; +Line(403) = {4222,4250}; +Line(404) = {4250,4252}; +Line(405) = {4252,4221}; +Line(406) = {4221,4251}; +Line(407) = {4251,4299}; +Line(408) = {4299,4335}; +Line(409) = {4335,4337}; +Line(410) = {4337,4267}; +Line(411) = {4267,4294}; +Line(412) = {4294,4269}; +Line(413) = {4269,4233}; +Line(414) = {4233,4234}; +Line(415) = {4234,4273}; +Line(416) = {4273,4293}; +Line(417) = {4293,4314}; +Line(418) = {4314,4317}; +Line(419) = {4317,4318}; +Line(420) = {4318,4274}; +Line(421) = {4274,4235}; +Line(422) = {4235,4236}; +Line(423) = {4236,4237}; +Line(424) = {4237,4301}; +Line(425) = {4301,4319}; +Line(426) = {4319,4321}; +Line(427) = {4321,4320}; +Line(428) = {4320,4322}; +Line(429) = {4322,4347}; +Line(430) = {4347,4323}; +Line(431) = {4323,4324}; +Line(432) = {4324,4325}; +Line(433) = {4325,4276}; +Line(434) = {4276,4238}; +Line(435) = {4238,4240}; +Line(436) = {4240,4239}; +Line(437) = {4239,4241}; +Line(438) = {4241,4277}; +Line(439) = {4277,4326}; +Line(440) = {4326,4327}; +Line(441) = {4327,4328}; +Line(442) = {4328,4350}; +Line(443) = {4350,4348}; +Line(444) = {4348,4349}; +Line(445) = {4349,4332}; +Line(446) = {4332,4333}; +Line(447) = {4333,4334}; +Line(448) = {4334,4278}; +Line(449) = {4278,4247}; +Line(450) = {4247,4248}; +Line(451) = {4248,4249}; +Line(452) = {4249,4282}; +Line(453) = {4282,4283}; +Line(454) = {4283,4341}; +Line(455) = {4341,4342}; +Line(456) = {4342,4343}; +Line(457) = {4343,4289}; +Line(458) = {4289,4290}; +Line(459) = {4290,4286}; +Line(460) = {4286,4255}; +Line(461) = {4255,4257}; +Line(462) = {4257,4256}; +Line(463) = {4256,4346}; +Line(464) = {4346,4288}; +Line(465) = {4288,4287}; +Line(466) = {4287,4260}; +Line(467) = {4260,4259}; +Line(468) = {4259,4258}; +Line(469) = {4258,4262}; +Line(470) = {4262,4261}; +Line(471) = {4261,4264}; +Line(472) = {4264,4263}; +Line(473) = {4263,4265}; +Line(474) = {4265,4266}; +Line(475) = {4266,4303}; +Line(476) = {4303,4302}; +Line(477) = {4302,4304}; +Line(478) = {4304,4305}; +Line(479) = {4305,4306}; +Line(480) = {4306,4307}; +Line(481) = {4307,4308}; +Line(482) = {4308,4309}; +Line(483) = {4309,4345}; +Line(484) = {4345,4344}; +Line(485) = {4344,4254}; +Line(486) = {4254,4253}; +Line(487) = {4253,4285}; +Line(488) = {4285,4284}; +Line(489) = {4284,4340}; +Line(490) = {4340,4339}; +Line(491) = {4339,4338}; +Line(492) = {4338,4246}; +Line(493) = {4246,4245}; +Line(494) = {4245,4281}; +Line(495) = {4281,4280}; +Line(496) = {4280,4279}; +Line(497) = {4279,4244}; +Line(498) = {4244,4243}; +Line(499) = {4243,4242}; +Line(500) = {4242,4296}; +Line(501) = {4296,4295}; +Line(502) = {4295,4300}; +Line(503) = {4300,4330}; +Line(504) = {4330,4331}; +Line(505) = {4331,4329}; +Line(506) = {4329,4232}; +Line(507) = {4232,4231}; +Line(508) = {4231,4230}; +Line(509) = {4230,4229}; +Line(510) = {4229,4228}; +Line(511) = {4228,4227}; +Line(512) = {4227,4225}; +Line(513) = {4225,4226}; +Line(514) = {4226,4312}; +Line(515) = {4312,4223}; +Line(516) = {4223,4224}; +Line(517) = {4224,4311}; +Line(518) = {4311,4310}; +Line(519) = {4310,4275}; +Line(520) = {4275,4316}; +Line(521) = {4316,4315}; +Line(522) = {4315,4313}; +Line(523) = {4313,4292}; +Line(524) = {4292,4272}; +Line(525) = {4272,4271}; +Line(526) = {4271,4270}; +Line(527) = {4270,4268}; +Line(528) = {4268,4291}; +Line(529) = {4291,4336}; +Line(530) = {4336,4298}; +Line Loop(531) = {311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310}; + +//Plane Surface(532) = {531}; + +Line Loop(533) = {36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35}; + +Line Loop(534) = {451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450}; + +/* +Plane Surface(535) = {534}; + +Plane Surface(536) = {533}; +*/ + +Line Loop(537) = {386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,377,378,379,380,381,382,383,384,385}; + + +Plane Surface(538) = {537,531,533,534}; diff --git a/examples/fissure.geo b/examples/fissure.geo new file mode 100644 index 0000000000000000000000000000000000000000..1b33e91c18129d5210ca91f18319cb14a0ac2ea1 --- /dev/null +++ b/examples/fissure.geo @@ -0,0 +1,18 @@ +eps = 1.e-3 ; + +Point(1) = {-1,-1,0,.1} ; +Point(2) = {-1,1,0,.1} ; +Point(3) = {1,-1,0,.1} ; +Point(4) = {1,1,0,.1} ; +Point(5) = {-1,0,0,.06} ; +Point(6) = {0,0,0,.03} ; +Point(7) = {-1,0+eps,0,.06} ; +Line(1) = {5,1}; +Line(2) = {1,3}; +Line(3) = {3,4}; +Line(4) = {4,2}; +Line(5) = {2,7}; +Line(6) = {7,6}; +Line(7) = {6,5}; +Line Loop(8) = {5,6,7,1,2,3,4}; +Plane Surface(9) = {8}; diff --git a/examples/gmsh.tmp b/examples/gmsh.tmp new file mode 100644 index 0000000000000000000000000000000000000000..6c7de338556384b0da0864d6add5617a41de3e91 --- /dev/null +++ b/examples/gmsh.tmp @@ -0,0 +1 @@ +Plane Surface(28) = {27}; diff --git a/examples/h6.geo b/examples/h6.geo new file mode 100644 index 0000000000000000000000000000000000000000..349a558949ef1fcb4560e90db061816c7bd6b607 --- /dev/null +++ b/examples/h6.geo @@ -0,0 +1,18 @@ +h = 0.1; +h2 = 0.031; +Point(1) = { 0.00000E+00, 0.00000E+00, 0.0 , h2}; +Point(2) = { 1.00000E-01, 0.00000E+00, 0.0 , h2}; +Point(3) = { 0.00000E+00, 4.00000E-01, 0.00000E+00,h2}; +Point(4) = { 0.00000E+00, 0.00000E+00, 0.00000E+00,h2}; +Point(5) = { 1.00000E-01, 4.00000E-01, 0.00000E+00,h2}; +Line(1) = Liste[1,3]; +Line(2) = Liste[3,5]; +Line(3) = Liste[5,2]; +Line(4) = Liste[2,1]; +Boucle(5) = Liste[2,3,4,1]; +Zone(6) = Liste[5]; + +AIR = 1 ; +CLD = 2 ; +Physical Volume(AIR) = Liste [-6]; +Physical Volume(CLD) = Liste [4]; diff --git a/examples/pp.geo b/examples/pp.geo new file mode 100644 index 0000000000000000000000000000000000000000..f0c0967acf3f6980ffa16fa3593b0a853919cc30 --- /dev/null +++ b/examples/pp.geo @@ -0,0 +1,8 @@ + +Point(101) = {0,0,0,1} ; +Point(102) = {0,1,1,1} ; +Point(100) = {1,1,0,1} ; +Point(103) = {1,0,1,1} ; + +Line(2001) = {100, 101} ; +Line(2000) = {102, 103} ; diff --git a/examples/pri1.geo b/examples/pri1.geo new file mode 100644 index 0000000000000000000000000000000000000000..d537e222cbbe26b62ec93d4e4b070023470fe985 --- /dev/null +++ b/examples/pri1.geo @@ -0,0 +1,46 @@ +Point(1) = {0.0,0.0,0.0,1.0}; +Point(2) = {1,0.0,0.0,1.0}; +Point(3) = {1,0.0,1,1.0}; +Point(4) = {1,2,1,1.0}; +Point(5) = {0,2,0,1.0}; +Point(6) = {1,2,0,1.0}; + +Line(1) = {4,6}; +Line(2) = {6,5}; +Line(3) = {5,4}; +Line(4) = {2,1}; +Line(5) = {1,3}; +Line(6) = {3,2}; +Line(7) = {2,6}; +Line(8) = {5,1}; +Line(9) = {3,4}; + +Line Loop(10) = {9,-3,8,5}; +Plane Surface(11) = {10}; +Line Loop(12) = {-7,-6,9,1}; +Plane Surface(13) = {12}; +Line Loop(14) = {-4,7,2,8}; +Plane Surface(15) = {14}; +Line Loop(16) = {6,4,5}; +Plane Surface(17) = {16}; +Line Loop(18) = {1,2,3}; +Plane Surface(19) = {18}; + +Surface Loop(20) = {13,15,17,-11,-19}; +Complex Volume(21) = {20}; + +Transfinite Line {1,2,3,4,5,6,7,8,9} = 3; + +Transfinite Surface {17} = {1,3,2}; +Transfinite Surface {15} = {1,2,6,5}; +Transfinite Surface {11} = {1,3,4,5}; +Transfinite Surface {13} = {3,2,6,4}; +Transfinite Surface {19} = {5,4,6}; + +Transfinite Volume {21} = {1,3,2,5,4,6}; + +/* +Recombine Surface {17,19}; +*/ +Recombine Surface {11,13,15}; + diff --git a/examples/quads.geo b/examples/quads.geo new file mode 100644 index 0000000000000000000000000000000000000000..164c1a0de6417493b7d4a0e61537ec53798bc9cf --- /dev/null +++ b/examples/quads.geo @@ -0,0 +1,56 @@ +l = .3; +Point(1) = {-2,-1,0,l}; +Point(2) = {-2,1,0,l}; +Point(3) = {0,-1,0,l}; +Point(4) = {0,1,0,l}; +Point(5) = {-3,-2,0,l}; +Point(6) = {-3,2,0,l}; +Point(7) = {1,-2,0,l}; +Point(8) = {1,2,0,l}; + +Line(1) = {6,8}; +Line(2) = {8,7}; +Line(3) = {7,5}; +Line(4) = {5,6}; +Line(5) = {2,1}; +Line(6) = {1,3}; +Line(7) = {3,4}; +Line(8) = {4,2}; + +Line Loop(9) = {5,6,7,8}; +Plane Surface(10) = {9}; + +Line Loop(11) = {2,3,4,1}; +Plane Surface(12) = {11,9}; + +/* this will try to produce quadrangles for surfaces 10 and 12 */ + +Recombine Surface {10,12} ; + + +/* For surface 10, we force a structured mesh (transfinite meshing) */ + +/* We force the number of points on the lines 5,6,7,8 to be 10 and 5 */ +Transfinite Line {5,7} = 10 ; +Transfinite Line {6,8} = 5 ; + +/* we define transfinite interpolation on surface 10, determined by the + ordering of the for ***vertices*** 1,3,2,4 */ +Transfinite Surface {10} = {1,3,4,2} ; + +/* + result : + + Surface 10 should be made entirely of quads + Surface 12 should be mixed tri/quad + + comments : + + Transfinite surfaces can only have 3 or 4 sides + + to have a specified repartion of the nodes for transfinite lines : + + Transfinite Line {X} = Y Using Power Z ; + Transfinite Line {X} = Y Using Bump Z ; + +*/ diff --git a/examples/rot.geo b/examples/rot.geo new file mode 100644 index 0000000000000000000000000000000000000000..523500e101fba4a41bbcdac263dde20be262ea6b --- /dev/null +++ b/examples/rot.geo @@ -0,0 +1,13 @@ +Point(1) = {0,0,0,.25}; +Point(2) = {0,1,0,.25}; +Point(3) = {1,0,0,.25}; +Point(4) = {1,1,0,.25}; +Line(1) = {1,2}; +Line(2) = {2,4}; +Line(3) = {4,3}; +Line(4) = {3,1}; +Line Loop(5) = {4,1,2,3}; +Plane Surface(6) = 5; +Extrude( 6, { 1.,0.,0.}, {0,-1,0.}, 1.57); +Extrude(24, {0,0,-1}, {-1,-1,0}, 1.57); +Coherence; diff --git a/examples/sph.geo b/examples/sph.geo new file mode 100644 index 0000000000000000000000000000000000000000..0f4a835045cc612d756b27aeeb19196074eb500f --- /dev/null +++ b/examples/sph.geo @@ -0,0 +1,56 @@ +lc = 0.01; +dext = .05; +dint = .055; + +Point(1) = {0,0,0,lc}; +Point(2) = {dint,0,0,lc}; +Point(3) = {0,dint,0,lc}; +Point(4) = {0,0,dint,lc}; +Point(5) = {dext,0,0,lc}; +Point(6) = {0,dext,0,lc}; +Point(7) = {0,0,dext,lc}; + +Circle(1) = {7,1,5}; +Circle(2) = {4,1,2}; +Circle(3) = {5,1,6}; +Circle(4) = {2,1,3}; +Circle(5) = {7,1,6}; +Circle(6) = {4,1,3}; +Line(7) = {1,5}; +Line(8) = {5,2}; +Line(9) = {1,6}; +Line(10) = {6,3}; +Line(11) = {1,7}; +Line(12) = {7,4}; + +Line Loop(17) = {2,-8,-1,12}; +Plane Surface(18) = {17}; +Line Loop(19) = {-4,-8,3,10}; +Plane Surface(20) = {19}; +Line Loop(21) = {-6,-12,5,10}; +Plane Surface(22) = {21}; + +Line Loop(23) = {-6,2,4}; +Ruled Surface(24) = {23}; +Line Loop(25) = {-5,1,3}; +Ruled Surface(26) = {25}; + +Surface Loop(27) = {24,-22,-18,20,-26}; +Complex Volume(28) = {27}; + +Transfinite Line {1,2,3,4,5,6} = 10 ; +Transfinite Line {-8,-10,-12} = 5 Using Power 1.6 ; + +Transfinite Surface {22} = {4,7,6,3}; +Transfinite Surface {20} = {3,2,5,6}; +Transfinite Surface {18} = {4,2,5,7}; + +Transfinite Surface {24} = {3,4,2}; +Transfinite Surface {26} = {6,7,5}; + +Recombine Surface {18,20,22}; +/* +Recombine Surface {24,26}; +*/ +Transfinite Volume {28} = {3,4,2,6,7,5}; + diff --git a/examples/these.geo b/examples/these.geo new file mode 100644 index 0000000000000000000000000000000000000000..52c5b44d28918db1aa38a0959ae14e4d84858dce --- /dev/null +++ b/examples/these.geo @@ -0,0 +1,26 @@ +l= .3; +Point(1) = {-1.00000E+00,-1.00000E-00, 0.00000E+00,l}; +Point(2) = {-1.00000E+00, 1.00000E-00, 0.00000E+00,l}; +Point(3) = { 1.00000E+00, 1.00000E-00, 0.00000E+00,l}; +Point(4) = { 1.00000E+00,-1.00000E-00, 0.00000E+00,l}; +Point(5) = {-0.00000E+00,-0.00000E-00, 0.00000E+00,l}; +Point(6) = {-0.00000E+00, 1.00000E-00, 0.00000E+00,l}; +Point(7) = { 1.00000E+00, 0.00000E-00, 0.00000E+00,l}; + +Line(1) = Liste[2,6]; +Line(2) = Liste[6,5]; +Line(3) = Liste[5,7]; +Line(4) = Liste[7,4]; +Line(5) = Liste[4,1]; +Line(6) = Liste[1,2]; +Line Loop(7) = Liste[3,4,5,6,1,2]; +Plane Surface(8) = Liste[7]; +Extrude ( 8, { 0.00000E+00, 0.00000E+00, 1.00000E+00} ); +Line(35) = Liste[6,3]; +Line(36) = Liste[3,7]; +Line Loop(37) = Liste[3,-36,-35,2]; +Plane Surface(38) = Liste[37]; +Extrude ( 38, { 0.00000E+00, 0.00000E+00,-1.00000E+00} ); +Extrude ( 8, { 0.00000E+00, 0.00000E+00,-1.00000E+00} ); +Surface Loop(80) = Liste[56,-79,-68,22,25,-71,-74,28,31,-76,-53,-38,19,34,33,-50]; +Complex Volume(81) = Liste[80]; diff --git a/examples/tooth.geo b/examples/tooth.geo new file mode 100644 index 0000000000000000000000000000000000000000..726b24fe9889d4af6dafa754f9c0820dc010d9c1 --- /dev/null +++ b/examples/tooth.geo @@ -0,0 +1,190 @@ + +dT1 = 10.e-3 ; +dT2 = 10.e-3 ; +dT3 = 10.e-3 ; + +lT1 = 10.e-3 ; +lT2 = 10.e-3 ; +lT3 = 10.e-3 ; + +e = 0.65e-3/2. ; + + +pp = 4.99e-3 ; + +p0 = pp ; +pT1 = pp ; pT2 = pp ; pT3 = pp ; +pT13 = pp ; pT23 = pp ; + + +Point(1) = { -dT3/2.,0,0,p0}; + +Point(2) = { -dT3/2.-lT1, 0, 0, pT1}; +Point(3) = { -dT3/2.-lT1, dT1, 0, pT1}; + +Point(4) = { -dT3/2., dT1 , 0, pT13}; + +Point(5) = { -dT3/2., dT1+lT3, 0, pT3}; +Point(6) = { dT3/2., dT1+lT3, 0, pT3}; + +Point(7) = { dT3/2., dT2 , 0, pT23}; + +Point(8) = { dT3/2.+lT2, dT2, 0, pT2}; +Point(9) = { dT3/2.+lT2, 0, 0, pT2}; + +Point(10) = { dT3/2.,0,0,p0}; + +Line(1) = {1,2}; +Line(2) = {2,3}; +Line(3) = {3,4}; +Line(4) = {4,1}; +Line(5) = {1,10}; +Line(6) = {10,7}; +Line(7) = {7,4}; +Line(8) = {4,5}; +Line(9) = {5,6}; +Line(10) = {6,7}; +Line(11) = {7,8}; +Line(12) = {8,9}; +Line(13) = {9,10}; +Line Loop(14) = {1,2,3,4}; +Plane Surface(15) = {14}; +Line Loop(16) = {11,12,13,6}; +Plane Surface(17) = {16}; +Line Loop(18) = {8,9,10,7}; +Plane Surface(19) = {18}; +Line Loop(20) = {5,6,7,4}; +Plane Surface(21) = {20}; +Translate({0,0,e}) { + Duplicata { Surface(15); } +} +Coherence; +Translate({0,0,e}) { + Duplicata { Surface(21); } +} +Coherence; +Translate({0,0,e}) { + Duplicata { Surface(17); } +} +Coherence; +Translate({0,0,e}) { + Duplicata { Surface(19); } +} +Coherence; +Line(46) = {2,12}; +Line(47) = {3,14}; +Line(48) = {1,11}; +Line(49) = {4,16}; +Line(50) = {5,26}; +Line(51) = {6,28}; +Line(52) = {7,20}; +Line(53) = {10,18}; +Line(54) = {9,24}; +Line(55) = {8,22}; + +Line Loop(56) = {23,-47,-2,46}; +Plane Surface(57) = {56}; +Line Loop(58) = {22,-46,-1,48}; +Plane Surface(59) = {58}; +Line Loop(60) = {-49,-3,47,24}; +Plane Surface(61) = {60}; +Line Loop(62) = {-25,-49,4,48}; +Plane Surface(63) = {62}; +Line Loop(64) = {40,-50,-8,49}; +Plane Surface(65) = {64}; +Line Loop(66) = {41,-51,-9,50}; +Plane Surface(67) = {66}; +Line Loop(68) = {-42,-51,10,52}; +Plane Surface(69) = {68}; +Line Loop(70) = {-30,-52,7,49}; +Plane Surface(71) = {70}; +Line Loop(72) = {28,-53,-5,48}; +Plane Surface(73) = {72}; +Line Loop(74) = {29,-52,-6,53}; +Plane Surface(75) = {74}; +Line Loop(76) = {34,-55,-11,52}; +Plane Surface(77) = {76}; +Line Loop(78) = {36,-53,-13,54}; +Plane Surface(79) = {78}; +Line Loop(80) = {-35,-55,12,54}; +Plane Surface(81) = {80}; +Surface Loop(82) = {63,27,-59,-57,-61,-15}; +Complex Volume(83) = {82}; +Surface Loop(84) = {75,-39,77,-81,17,79}; +Complex Volume(85) = {84}; +Surface Loop(86) = {71,45,-65,-67,69,-19}; +Complex Volume(87) = {86}; +Surface Loop(88) = {71,33,-73,-75,-21,63}; +Complex Volume(89) = {88}; + +/* selon e */ + +Transfinite Line {-46,-48,-53,-54,-47,-49,-52,-55,-50,-51} + = 8 Using Power 1.2 ; + +/* vers les angles */ + +Transfinite Line {-3,-24,1,22, 11,34,-13,-36, 8,40,-10,-42} + = 11 Using Power 1.4 ; + +/* selon y pour f1 et f2 */ + +Transfinite Line {-2,-23,4,25,-6,-29,12,35} + = 11 Using Bump -1.4 ; + +/* selon x pour f3 */ + +Transfinite Line {9,41,7,30,5,28} + = 11 Using Bump -1.4 ; + + +Transfinite Surface {15} = {1,2,3,4} ; +Transfinite Surface {27} = {11,12,14,16} ; + +Transfinite Surface {17} = {9,10,7,8} ; +Transfinite Surface {39} = {24,18,20,22} ; + +Transfinite Surface {19} = {7,4,5,6} ; +Transfinite Surface {45} = {20,16,26,28} ; + +Transfinite Surface {21} = {10,1,4,7} ; +Transfinite Surface {33} = {18,11,16,20} ; + +Transfinite Surface {57} = {2,12,14,3} ; +Transfinite Surface {63} = {1,11,16,4} ; +Transfinite Surface {75} = {10,18,20,7} ; +Transfinite Surface {81} = {9,24,22,8} ; +Transfinite Surface {65} = {4,16,26,5} ; +Transfinite Surface {69} = {7,20,28,6} ; + +Transfinite Surface {59} = {12,11,1,2} ; +Transfinite Surface {61} = {14,16,4,3} ; + +Transfinite Surface {73} = {11,18,10,1} ; +Transfinite Surface {71} = {16,20,7,4} ; +Transfinite Surface {67} = {26,28,6,5} ; + +Transfinite Surface {79} = {18,24,9,10} ; +Transfinite Surface {77} = {20,22,8,7} ; + + +Recombine Surface {15,27,17,39,19,45,21,33,57,63,75,81,59,61,73,71,67,79,77,65,69} ; + + +Transfinite Volume {83} = {1,2,12,11,4,3,14,16} ; +Transfinite Volume {85} = {9,10,18,24,8,7,20,22} ; +Transfinite Volume {87} = {7,4,16,20,6,5,26,28} ; +Transfinite Volume {89} = {10,1,11,18,7,4,16,20} ; + + +Physical Volume(101) = {83,85,87,89} ; /* Tooth */ + +Physical Line(2001) = { 2,47,23,46} ; /* LineFlux1 */ +Physical Line(2002) = {55,12,54,35} ; /* LineFlux2 */ +Physical Line(2003) = { 9,51,41,50} ; /* LineFlux3 */ + +Physical Surface(1001) = {57} ; /* Flux1 */ +Physical Surface(1002) = {81} ; /* Flux2 */ +Physical Surface(1003) = {67} ; /* Flux3 */ + +Physical Surface(1100) = {27,33,39, 59,73,79, 61,65,45,69,77} ; /* SkinTooth */ diff --git a/examples/tooth2.geo b/examples/tooth2.geo new file mode 100644 index 0000000000000000000000000000000000000000..5a31717843edefe6bc8e3cf4d541d1d95f2ebfaa --- /dev/null +++ b/examples/tooth2.geo @@ -0,0 +1,135 @@ + +dT1 = 10.e-3 ; +dT2 = 10.e-3 ; +dT3 = 10.e-3 ; + +lT1 = 10.e-3 ; +lT2 = 10.e-3 ; +lT3 = 10.e-3 ; + +e = 0.65e-2/2. ; + + +pp = 4.99e-3 ; + +p0 = pp ; +pT1 = pp ; pT2 = pp ; pT3 = pp ; +pT13 = pp ; pT23 = pp ; + + +Point(1) = { -dT3/2.,0,0,p0}; + +Point(2) = { -dT3/2.-lT1, 0, 0, pT1}; +Point(3) = { -dT3/2.-lT1, dT1, 0, pT1}; + +Point(4) = { -dT3/2., dT1 , 0, pT13}; + +Point(5) = { -dT3/2., dT1+lT3, 0, pT3}; +Point(6) = { dT3/2., dT1+lT3, 0, pT3}; + +Point(7) = { dT3/2., dT2 , 0, pT23}; + +Point(8) = { dT3/2.+lT2, dT2, 0, pT2}; +Point(9) = { dT3/2.+lT2, 0, 0, pT2}; + +Point(10) = { dT3/2.,0,0,p0}; + +Line(1) = {1,2}; +Line(2) = {2,3}; +Line(3) = {3,4}; +Line(4) = {4,1}; +Line(5) = {1,10}; +Line(6) = {10,7}; +Line(7) = {7,4}; +Line(8) = {4,5}; +Line(9) = {5,6}; +Line(10) = {6,7}; +Line(11) = {7,8}; +Line(12) = {8,9}; +Line(13) = {9,10}; +Line Loop(14) = {1,2,3,4}; +Plane Surface(15) = {14}; +Line Loop(16) = {11,12,13,6}; +Plane Surface(17) = {16}; +Line Loop(18) = {8,9,10,7}; +Plane Surface(19) = {18}; +Line Loop(20) = {5,6,7,4}; +Plane Surface(21) = {20}; +Translate({0,0,e}) { + Duplicata { Surface(15); } +} +Coherence; +Translate({0,0,e}) { + Duplicata { Surface(21); } +} +Coherence; +Translate({0,0,e}) { + Duplicata { Surface(17); } +} +Coherence; +Translate({0,0,e}) { + Duplicata { Surface(19); } +} +Coherence; +Line(46) = {2,12}; +Line(47) = {3,14}; +Line(48) = {1,11}; +Line(49) = {4,16}; +Line(50) = {5,26}; +Line(51) = {6,28}; +Line(52) = {7,20}; +Line(53) = {10,18}; +Line(54) = {9,24}; +Line(55) = {8,22}; + +Line Loop(56) = {23,-47,-2,46}; +Plane Surface(57) = {56}; +Line Loop(58) = {22,-46,-1,48}; +Plane Surface(59) = {58}; +Line Loop(60) = {-49,-3,47,24}; +Plane Surface(61) = {60}; +Line Loop(62) = {-25,-49,4,48}; +Plane Surface(63) = {62}; +Line Loop(64) = {40,-50,-8,49}; +Plane Surface(65) = {64}; +Line Loop(66) = {41,-51,-9,50}; +Plane Surface(67) = {66}; +Line Loop(68) = {-42,-51,10,52}; +Plane Surface(69) = {68}; +Line Loop(70) = {-30,-52,7,49}; +Plane Surface(71) = {70}; +Line Loop(72) = {28,-53,-5,48}; +Plane Surface(73) = {72}; +Line Loop(74) = {29,-52,-6,53}; +Plane Surface(75) = {74}; +Line Loop(76) = {34,-55,-11,52}; +Plane Surface(77) = {76}; +Line Loop(78) = {36,-53,-13,54}; +Plane Surface(79) = {78}; +Line Loop(80) = {-35,-55,12,54}; +Plane Surface(81) = {80}; +Surface Loop(82) = {63,27,-59,-57,-61,-15}; +Complex Volume(83) = {82}; +Surface Loop(84) = {75,-39,77,-81,17,79}; +Complex Volume(85) = {84}; +Surface Loop(86) = {71,45,-65,-67,69,-19}; +Complex Volume(87) = {86}; +Surface Loop(88) = {71,33,-73,-75,-21,63}; +Complex Volume(89) = {88}; + +nbpts1 = 1.0; + +Transfinite Line{46,47,49,48,53,52,50,51,55,54} = nbpts1 Using Power 1.0; + +nbpts2 = 10; +Transfinite Line{9,41,7,30,3,24,11,34,13,36,5,28,1,22} = nbpts2 Using Power 1.0; +nbpts3 = 15; +Transfinite Line{2,23,4,25,8,40,10,42,6,29,12,35} = nbpts3 Using Power 1.0; +Transfinite Surface{27} = {12,11,16,14}; +Transfinite Surface{33} = {11,18,20,16}; +Transfinite Surface{39} = {18,24,22,20}; +Transfinite Surface{15} = {2,1,4,3}; +Transfinite Surface{21} = {1,10,7,4}; +Transfinite Surface{17} = {10,9,8,7}; +Transfinite Surface{45} = {16,20,28,26}; +Transfinite Surface{19} = {4,7,6,5}; diff --git a/examples/tr3d.geo b/examples/tr3d.geo new file mode 100644 index 0000000000000000000000000000000000000000..0d46b26e43476457023d463b889a029dec479ad1 --- /dev/null +++ b/examples/tr3d.geo @@ -0,0 +1,20 @@ +Point(1) = {0,0,0,.2}; +Point(2) = {0,1,0,.2}; +Point(3) = {1,0,0,.2}; +Point(4) = {0,0,.5,.2}; + +Line(7) = {3,4}; +Circle(8) = {3,1,2}; +Line(9) = {1,3}; +Line(10) = {1,4}; +Line(11) = {1,2}; +Line(12) = {4,2}; + +Line Loop(13) = {9,8,-11}; +Plane Surface(14) = {13}; +Line Loop(15) = {10,12,-11}; +Plane Surface(16) = {15}; +Line Loop(17) = {-8,7,12}; +Ruled Surface(18) = {17}; +Line Loop(19) = {-10,9,7}; +Plane Surface(20) = {19}; diff --git a/examples/transfini.geo b/examples/transfini.geo new file mode 100644 index 0000000000000000000000000000000000000000..fe185cd0ff032edd9104e104b8418da90521840b --- /dev/null +++ b/examples/transfini.geo @@ -0,0 +1,33 @@ +l = .3; +Point(1) = {-2,-1,0,l}; +Point(2) = {-2,1,0,l}; +Point(3) = {0,-1,0,l}; +Point(4) = {0,1,0,l}; +Point(5) = {-3,-2,0,l}; +Point(6) = {-3,2,0,l}; +Point(7) = {1,-2,0,l}; +Point(8) = {1,2,0,l}; + +Line(1) = {6,8}; +Line(2) = {8,7}; +Line(3) = {7,5}; +Line(4) = {5,6}; +Line(5) = {2,1}; +Line(6) = {1,3}; +Line(7) = {3,4}; +Line(8) = {4,2}; + +Loop(9) = {5,6,7,8}; +Plane Surface(10) = {9}; + +Loop(11) = {2,3,4,1}; +Plane Surface(12) = {11,9}; + +Transfinite Line 5 = 10 Using Power 1; +Transfinite Line 7 = 10 Using Power 1; +Transfinite Line 6 = 10 Using Power 1; +Transfinite Line 8 = 10 Using Power 1; + + +Recombine Surface {10} = 30; + diff --git a/examples/tt.geo b/examples/tt.geo new file mode 100644 index 0000000000000000000000000000000000000000..c877f1fcb1eb7b54e01d582b0329da6dbb0914ec --- /dev/null +++ b/examples/tt.geo @@ -0,0 +1,41 @@ +l = 1; +Point(1) = {-2,-1,0,l}; +Point(2) = {-2,1,0,l}; +Point(3) = {0,-1,0,l}; +Point(4) = {0,1,0,l}; +Point(5) = {-3,-2,0,l}; +Point(6) = {-3,2,0,l}; +Point(7) = {1,-2,0,l}; +Point(8) = {1,2,0,l}; + +Line(1) = {6,8}; +Line(2) = {8,7}; +Line(3) = {7,5}; +Line(4) = {5,6}; +Line(5) = {2,1}; +Line(6) = {1,3}; +Line(7) = {3,4}; +Line(8) = {4,2}; + +/* +Loop(9) = {5,6,7,8}; +Plane Surface(10) = {9}; + +Loop(11) = {2,3,4,1}; +Plane Surface(12) = {11,9}; + + +Transfinite Line {5,6,7,8} = 3; + +Physical Point(9999) = {2}; + +Physical Line(2222) = {6,7}; +Physical Line(3333) = {-7,-6}; + +Physical Association(111111)= {3333,2222}; +*/ + +Line Loop(9) = {5,6,7,8}; +Plane Surface(10) = {9}; + +Physical Surface(1111) = 10 ; diff --git a/examples/tt4.geo b/examples/tt4.geo new file mode 100644 index 0000000000000000000000000000000000000000..c0c7314aba4f2fa8c96c6f3d6a02901e3c63dde4 --- /dev/null +++ b/examples/tt4.geo @@ -0,0 +1,66 @@ +Point(1) = {0.0,0.0,0.0,1.0}; +Point(2) = {1,0.0,0.0,1.0}; +Point(3) = {.5,.1,0.0,1.0}; +Point(4) = {.5,.2,0.0,1.0}; +Point(5) = {0,.5,0.0,1.0}; +Point(6) = {1,.55,0.0,1.0}; +Point(7) = {0,0,1,1.0}; + +Line(1) = {2,6}; +Line(2) = {5,1}; +Spline(3) = {1,3,2}; +Spline(4) = {5,4,6}; + +Line Loop(5) = {-1,-3,-2,4}; +Plane Surface(6) = {5}; + +Point(8) = {0,.5,1,1.0}; +Point(9) = {1,.5,1,1.0}; +Point(10) = {1,0,1,1.0}; + +Line(7) = {6,9}; +Line(8) = {9,10}; +Line(9) = {10,2}; +Line(10) = {10,7}; +Line(11) = {7,1}; +Line(12) = {5,8}; +Line(13) = {8,7}; +Line(14) = {8,9}; + +Line Loop(15) = {14,-7,-4,12}; +Ruled Surface(16) = {15}; +Line Loop(17) = {7,8,9,1}; +Ruled Surface(18) = {17}; +Line Loop(19) = {-10,-8,-14,13}; +Ruled Surface(20) = {19}; +Line Loop(21) = {-11,-13,-12,2}; +Ruled Surface(22) = {21}; +Line Loop(23) = {-9,10,11,3}; +Ruled Surface(24) = {23}; + +Surface Loop(25) = {16,20,24,18,6,22}; +Complex Volume(26) = {25}; + +Transfinite Line {7,9,11,12} = 5; +Transfinite Line {3,10,14} = 10; +Transfinite Line {4} = 10 Using Bump 1.5; +Transfinite Line {-1,2} = 20 Using Power 1.6; +Transfinite Line {8,13} = 20 ; + +Transfinite Surface {6} = {1,2,6,5}; +Transfinite Surface {20} = {7,10,9,8}; +Transfinite Surface {18} = {10,2,6,9}; +Transfinite Surface {22} = {7,1,5,8}; +Transfinite Surface {16} = {8,9,6,5}; +Transfinite Surface {24} = {7,10,2,1}; + +Transfinite Volume {26} = {7,10,2,1,8,9,6,5}; + +Recombine Surface {6,20,18,22,16,24}; + + + + + + + diff --git a/examples/tt5.geo b/examples/tt5.geo new file mode 100644 index 0000000000000000000000000000000000000000..175d08f926246ca213fcf86e7abe7f0d4a8160a5 --- /dev/null +++ b/examples/tt5.geo @@ -0,0 +1,25 @@ +Point(1) = {0.0,0.0,0.0,1.0}; +Point(2) = {1,0.0,0.0,1.0}; +Point(3) = {.5,.1,0.0,1.0}; +Point(4) = {.5,.2,0.0,1.0}; +Point(5) = {0,.5,0.0,1.0}; +Point(6) = {1,.55,0.0,1.0}; +Point(7) = {0,0,1,1.0}; + +Line(1) = {2,6}; +Line(2) = {5,1}; +Spline(3) = {1,3,2}; +Spline(4) = {5,4,6}; + +Point(8) = {0,.5,1,1.0}; +Point(9) = {1,.5,1,1.0}; +Point(10) = {1,0,1,1.0}; + +Line(7) = {6,9}; +Line(8) = {9,10}; +Line(9) = {10,2}; +Line(10) = {10,7}; +Line(11) = {7,1}; +Line(12) = {5,8}; +Line(13) = {8,7}; +Line(14) = {8,9}; diff --git a/examples/wing.geo b/examples/wing.geo new file mode 100644 index 0000000000000000000000000000000000000000..08a58cb40363c62a10ecd61f4797c6cda2bf354f --- /dev/null +++ b/examples/wing.geo @@ -0,0 +1,1081 @@ +scale = 100 ; + +lc1 = 5.e-3 *scale ; +lc2 = 1.e-2 *scale ; +lc3 = 10 *scale ; + +/* l'aile */ +Point(3895) = {1.177410e-02*scale,-2.768003e-03*scale,0*scale,lc1}; +Point(3897) = {1.081196e-02*scale,-3.794565e-03*scale,0*scale,lc1}; +Point(3896) = {1.040081e-02*scale,-4.225326e-03*scale,0*scale,lc1}; +Point(3968) = {9.501183e-03*scale,-5.167856e-03*scale,0*scale,lc1}; +Point(3995) = {8.172335e-03*scale,-6.541147e-03*scale,0*scale,lc1}; +Point(4003) = {6.820756e-03*scale,-7.914438e-03*scale,0*scale,lc1}; +Point(3857) = {5.454371e-03*scale,-9.287729e-03*scale,0*scale,lc1}; +Point(3856) = {3.534352e-03*scale,-1.119762e-02*scale,0*scale,lc1}; +Point(3860) = {7.877699e-04*scale,-1.389559e-02*scale,0*scale,lc1}; +Point(3861) = {-1.958812e-03*scale,-1.658843e-02*scale,0*scale,lc1}; +Point(3863) = {-4.705394e-03*scale,-1.930092e-02*scale,0*scale,lc1}; +Point(3864) = {-7.451976e-03*scale,-2.206110e-02*scale,0*scale,lc1}; +Point(3865) = {-1.019856e-02*scale,-2.490134e-02*scale,0*scale,lc1}; +Point(3866) = {-1.294514e-02*scale,-2.785668e-02*scale,0*scale,lc1}; +Point(3867) = {-1.569172e-02*scale,-3.097311e-02*scale,0*scale,lc1}; +Point(3868) = {-1.819787e-02*scale,-3.400697e-02*scale,0*scale,lc1}; +Point(3869) = {-1.843830e-02*scale,-3.430929e-02*scale,0*scale,lc1}; +Point(3870) = {-2.032098e-02*scale,-3.675355e-02*scale,0*scale,lc1}; +Point(3871) = {-2.233602e-02*scale,-3.950013e-02*scale,0*scale,lc1}; +Point(3872) = {-2.428062e-02*scale,-4.224671e-02*scale,0*scale,lc1}; +Point(3977) = {-2.615522e-02*scale,-4.499330e-02*scale,0*scale,lc1}; +Point(3877) = {-2.795526e-02*scale,-4.773988e-02*scale,0*scale,lc1}; +Point(3876) = {-2.966457e-02*scale,-5.048646e-02*scale,0*scale,lc1}; +Point(3878) = {-3.128951e-02*scale,-5.323304e-02*scale,0*scale,lc1}; +Point(3934) = {-3.282722e-02*scale,-5.597962e-02*scale,0*scale,lc1}; +Point(3873) = {-3.427526e-02*scale,-5.872621e-02*scale,0*scale,lc1}; +Point(3874) = {-3.563187e-02*scale,-6.147279e-02*scale,0*scale,lc1}; +Point(3875) = {-3.689577e-02*scale,-6.421937e-02*scale,0*scale,lc1}; +Point(3935) = {-3.803475e-02*scale,-6.696595e-02*scale,0*scale,lc1}; +Point(3880) = {-3.906585e-02*scale,-6.971253e-02*scale,0*scale,lc1}; +Point(3879) = {-3.999980e-02*scale,-7.245912e-02*scale,0*scale,lc1}; +Point(3881) = {-4.084348e-02*scale,-7.520570e-02*scale,0*scale,lc1}; +Point(3936) = {-4.159737e-02*scale,-7.795228e-02*scale,0*scale,lc1}; +Point(3882) = {-4.219350e-02*scale,-8.069886e-02*scale,0*scale,lc1}; +Point(3883) = {-4.268262e-02*scale,-8.344544e-02*scale,0*scale,lc1}; +Point(3885) = {-4.302180e-02*scale,-8.619203e-02*scale,0*scale,lc1}; +Point(3884) = {-4.315754e-02*scale,-8.815942e-02*scale,0*scale,lc1}; +Point(1218) = {-4.315754e-02*scale,-8.893861e-02*scale,0*scale,lc1}; +Point(3933) = {-4.315754e-02*scale,-8.955185e-02*scale,0*scale,lc1}; +Point(3996) = {-4.314894e-02*scale,-9.031190e-02*scale,0*scale,lc1}; +Point(3989) = {-4.310538e-02*scale,-9.168519e-02*scale,0*scale,lc1}; +Point(3990) = {-4.298693e-02*scale,-9.305848e-02*scale,0*scale,lc1}; +Point(3978) = {-4.281442e-02*scale,-9.443177e-02*scale,0*scale,lc1}; +Point(3979) = {-4.254831e-02*scale,-9.580506e-02*scale,0*scale,lc1}; +Point(3974) = {-4.215142e-02*scale,-9.717835e-02*scale,0*scale,lc1}; +Point(3973) = {-4.166490e-02*scale,-9.855164e-02*scale,0*scale,lc1}; +Point(3963) = {-4.107412e-02*scale,-9.992494e-02*scale,0*scale,lc1}; +Point(3947) = {-4.041096e-02*scale,-1.011964e-01*scale,0*scale,lc1}; +Point(3948) = {-4.035707e-02*scale,-1.012982e-01*scale,0*scale,lc1}; +Point(3904) = {-3.903767e-02*scale,-1.033356e-01*scale,0*scale,lc1}; +Point(3903) = {-3.766438e-02*scale,-1.048133e-01*scale,0*scale,lc1}; +Point(3946) = {-3.629109e-02*scale,-1.058804e-01*scale,0*scale,lc1}; +Point(3902) = {-3.491780e-02*scale,-1.066897e-01*scale,0*scale,lc1}; +Point(3901) = {-3.354451e-02*scale,-1.073184e-01*scale,0*scale,lc1}; +Point(3900) = {-3.217121e-02*scale,-1.078168e-01*scale,0*scale,lc1}; +Point(3908) = {-3.079792e-02*scale,-1.081973e-01*scale,0*scale,lc1}; +Point(3907) = {-2.942463e-02*scale,-1.084688e-01*scale,0*scale,lc1}; +Point(3951) = {-2.805134e-02*scale,-1.086029e-01*scale,0*scale,lc1}; +Point(3950) = {-2.667805e-02*scale,-1.086423e-01*scale,0*scale,lc1}; +Point(3847) = {-2.580700e-02*scale,-1.086440e-01*scale,0*scale,lc1}; +Point(3949) = {-2.667805e-02*scale,-1.088853e-01*scale,0*scale,lc1}; +Point(3952) = {-2.805134e-02*scale,-1.092658e-01*scale,0*scale,lc1}; +Point(3905) = {-2.942463e-02*scale,-1.096463e-01*scale,0*scale,lc1}; +Point(3906) = {-3.079792e-02*scale,-1.100268e-01*scale,0*scale,lc1}; +Point(3909) = {-3.217121e-02*scale,-1.104020e-01*scale,0*scale,lc1}; +Point(3969) = {-3.354451e-02*scale,-1.107749e-01*scale,0*scale,lc1}; +Point(3970) = {-3.491780e-02*scale,-1.111477e-01*scale,0*scale,lc1}; +Point(3997) = {-3.629109e-02*scale,-1.115205e-01*scale,0*scale,lc1}; +Point(3998) = {-3.766438e-02*scale,-1.118690e-01*scale,0*scale,lc1}; +Point(4004) = {-3.903767e-02*scale,-1.122095e-01*scale,0*scale,lc1}; +Point(3959) = {-4.041096e-02*scale,-1.125499e-01*scale,0*scale,lc1}; +Point(3960) = {-4.315754e-02*scale,-1.131897e-01*scale,0*scale,lc1}; +Point(3972) = {-4.590412e-02*scale,-1.137699e-01*scale,0*scale,lc1}; +Point(3984) = {-4.865071e-02*scale,-1.143079e-01*scale,0*scale,lc1}; +Point(3988) = {-5.139729e-02*scale,-1.147970e-01*scale,0*scale,lc1}; +Point(3961) = {-5.414387e-02*scale,-1.152035e-01*scale,0*scale,lc1}; +Point(3962) = {-5.689045e-02*scale,-1.155501e-01*scale,0*scale,lc1}; +Point(3937) = {-5.963703e-02*scale,-1.157358e-01*scale,0*scale,lc1}; +Point(3938) = {-6.238362e-02*scale,-1.158519e-01*scale,0*scale,lc1}; +Point(3886) = {-6.513020e-02*scale,-1.158332e-01*scale,0*scale,lc1}; +Point(3887) = {-6.787678e-02*scale,-1.156607e-01*scale,0*scale,lc1}; +Point(3888) = {-7.062336e-02*scale,-1.152790e-01*scale,0*scale,lc1}; +Point(3993) = {-7.199665e-02*scale,-1.150098e-01*scale,0*scale,lc1}; +Point(3994) = {-7.336994e-02*scale,-1.146075e-01*scale,0*scale,lc1}; +Point(3971) = {-7.474324e-02*scale,-1.141776e-01*scale,0*scale,lc1}; +Point(3918) = {-7.611653e-02*scale,-1.135965e-01*scale,0*scale,lc1}; +Point(3919) = {-7.748982e-02*scale,-1.129165e-01*scale,0*scale,lc1}; +Point(3920) = {-7.886311e-02*scale,-1.121014e-01*scale,0*scale,lc1}; +Point(3956) = {-8.023640e-02*scale,-1.111186e-01*scale,0*scale,lc1}; +Point(3955) = {-8.047561e-02*scale,-1.109113e-01*scale,0*scale,lc1}; +Point(3965) = {-8.160969e-02*scale,-1.098434e-01*scale,0*scale,lc1}; +Point(3966) = {-8.189452e-02*scale,-1.095380e-01*scale,0*scale,lc1}; +Point(3910) = {-8.297356e-02*scale,-1.081647e-01*scale,0*scale,lc1}; +Point(3913) = {-8.376570e-02*scale,-1.067914e-01*scale,0*scale,lc1}; +Point(3912) = {-8.435627e-02*scale,-1.054263e-01*scale,0*scale,lc1}; +Point(3911) = {-8.435982e-02*scale,-1.054181e-01*scale,0*scale,lc1}; +Point(3914) = {-8.478803e-02*scale,-1.040448e-01*scale,0*scale,lc1}; +Point(3915) = {-8.503641e-02*scale,-1.026715e-01*scale,0*scale,lc1}; +Point(3916) = {-8.516945e-02*scale,-1.012982e-01*scale,0*scale,lc1}; +Point(3917) = {-8.522183e-02*scale,-9.992494e-02*scale,0*scale,lc1}; +Point(3953) = {-8.512327e-02*scale,-9.855164e-02*scale,0*scale,lc1}; +Point(3954) = {-8.495463e-02*scale,-9.717835e-02*scale,0*scale,lc1}; +Point(3964) = {-8.467545e-02*scale,-9.580506e-02*scale,0*scale,lc1}; +Point(3975) = {-8.433113e-02*scale,-9.443177e-02*scale,0*scale,lc1}; +Point(3992) = {-8.387660e-02*scale,-9.305848e-02*scale,0*scale,lc1}; +Point(3991) = {-8.341194e-02*scale,-9.168519e-02*scale,0*scale,lc1}; +Point(3999) = {-8.280629e-02*scale,-9.031190e-02*scale,0*scale,lc1}; +Point(3939) = {-8.220063e-02*scale,-8.893861e-02*scale,0*scale,lc1}; +Point(3967) = {-8.076693e-02*scale,-8.619203e-02*scale,0*scale,lc1}; +Point(3987) = {-7.916546e-02*scale,-8.344544e-02*scale,0*scale,lc1}; +Point(3985) = {-7.886311e-02*scale,-8.298081e-02*scale,0*scale,lc1}; +Point(3986) = {-7.737820e-02*scale,-8.069886e-02*scale,0*scale,lc1}; +Point(4002) = {-7.542111e-02*scale,-7.795228e-02*scale,0*scale,lc1}; +Point(3922) = {-7.335979e-02*scale,-7.520570e-02*scale,0*scale,lc1}; +Point(4005) = {-7.112105e-02*scale,-7.245912e-02*scale,0*scale,lc1}; +Point(3851) = {-6.873828e-02*scale,-6.971253e-02*scale,0*scale,lc1}; +Point(3850) = {-6.372231e-02*scale,-6.421937e-02*scale,0*scale,lc1}; +Point(3853) = {-5.963703e-02*scale,-6.001430e-02*scale,0*scale,lc1}; +Point(3852) = {-5.414387e-02*scale,-5.469298e-02*scale,0*scale,lc1}; +Point(3849) = {-4.865071e-02*scale,-4.961204e-02*scale,0*scale,lc1}; +Point(3848) = {-4.315754e-02*scale,-4.465740e-02*scale,0*scale,lc1}; +Point(3921) = {-3.766438e-02*scale,-3.985542e-02*scale,0*scale,lc1}; +Point(3983) = {-3.491780e-02*scale,-3.750843e-02*scale,0*scale,lc1}; +Point(3982) = {-3.217121e-02*scale,-3.519259e-02*scale,0*scale,lc1}; +Point(3976) = {-2.942463e-02*scale,-3.289435e-02*scale,0*scale,lc1}; +Point(3929) = {-2.744807e-02*scale,-3.126039e-02*scale,0*scale,lc1}; +Point(3958) = {-2.667805e-02*scale,-3.062383e-02*scale,0*scale,lc1}; +Point(3928) = {-2.411032e-02*scale,-2.851380e-02*scale,0*scale,lc1}; +Point(3957) = {-2.393147e-02*scale,-2.836765e-02*scale,0*scale,lc1}; +Point(3927) = {-2.118489e-02*scale,-2.612321e-02*scale,0*scale,lc1}; +Point(3926) = {-1.843830e-02*scale,-2.390843e-02*scale,0*scale,lc1}; +Point(3925) = {-1.569172e-02*scale,-2.170681e-02*scale,0*scale,lc1}; +Point(3924) = {-1.294514e-02*scale,-1.952576e-02*scale,0*scale,lc1}; +Point(3932) = {-1.040573e-02*scale,-1.752748e-02*scale,0*scale,lc1}; +Point(3931) = {-1.019856e-02*scale,-1.736495e-02*scale,0*scale,lc1}; +Point(3930) = {-7.451976e-03*scale,-1.521330e-02*scale,0*scale,lc1}; +Point(3923) = {-4.705394e-03*scale,-1.307794e-02*scale,0*scale,lc1}; +Point(3862) = {-1.958812e-03*scale,-1.095092e-02*scale,0*scale,lc1}; +Point(3859) = {1.960946e-04*scale,-9.287729e-03*scale,0*scale,lc1}; +Point(3858) = {7.877699e-04*scale,-8.831063e-03*scale,0*scale,lc1}; +Point(3855) = {3.534352e-03*scale,-6.728705e-03*scale,0*scale,lc1}; +Point(3854) = {6.280934e-03*scale,-4.633175e-03*scale,0*scale,lc1}; +Point(3945) = {7.386845e-03*scale,-3.794565e-03*scale,0*scale,lc1}; +Point(3944) = {7.654225e-03*scale,-3.591811e-03*scale,0*scale,lc1}; +Point(3899) = {9.027516e-03*scale,-2.550448e-03*scale,0*scale,lc1}; +Point(3898) = {1.040081e-02*scale,-1.509310e-03*scale,0*scale,lc1}; +Point(3894) = {1.177410e-02*scale,-4.686545e-04*scale,0*scale,lc1}; +Point(3890) = {1.282184e-02*scale,3.253082e-04*scale,0*scale,lc1}; +Point(3893) = {1.314739e-02*scale,5.720012e-04*scale,0*scale,lc1}; +Point(3941) = {1.463351e-02*scale,1.698599e-03*scale,0*scale,lc1}; +Point(4000) = {1.644012e-02*scale,3.071890e-03*scale,0*scale,lc1}; +Point(3980) = {1.824674e-02*scale,4.445181e-03*scale,0*scale,lc1}; +Point(3846) = {1.892400e-02*scale,4.960000e-03*scale,0*scale,lc1}; +Point(3981) = {1.843389e-02*scale,4.445181e-03*scale,0*scale,lc1}; +Point(4001) = {1.712649e-02*scale,3.071890e-03*scale,0*scale,lc1}; +Point(3942) = {1.584524e-02*scale,1.698599e-03*scale,0*scale,lc1}; +Point(3940) = {1.460138e-02*scale,3.253082e-04*scale,0*scale,lc1}; +Point(3889) = {1.452068e-02*scale,2.362167e-04*scale,0*scale,lc1}; +Point(3892) = {1.335131e-02*scale,-1.047983e-03*scale,0*scale,lc1}; +Point(3891) = {1.314739e-02*scale,-1.270371e-03*scale,0*scale,lc1}; +Point(3943) = {1.209204e-02*scale,-2.421274e-03*scale,0*scale,lc1}; +Point(4063) = {4.498368e-02*scale,-9.287729e-03*scale,0*scale,lc1}; +Point(4062) = {4.610574e-02*scale,-6.541147e-03*scale,0*scale,lc1}; +Point(4061) = {4.755089e-02*scale,-3.794565e-03*scale,0*scale,lc1}; +Point(4114) = {4.934166e-02*scale,-1.047983e-03*scale,0*scale,lc1}; +Point(4153) = {5.143154e-02*scale,1.698599e-03*scale,0*scale,lc1}; +Point(4178) = {5.390637e-02*scale,4.445181e-03*scale,0*scale,lc1}; +Point(4179) = {5.571941e-02*scale,6.252892e-03*scale,0*scale,lc1}; +Point(4191) = {5.846599e-02*scale,8.699713e-03*scale,0*scale,lc1}; +Point(4203) = {6.121257e-02*scale,1.103796e-02*scale,0*scale,lc1}; +Point(4109) = {6.350284e-02*scale,1.268493e-02*scale,0*scale,lc1}; +Point(4202) = {6.670574e-02*scale,1.498818e-02*scale,0*scale,lc1}; +Point(4199) = {7.170787e-02*scale,1.817809e-02*scale,0*scale,lc1}; +Point(4201) = {7.219890e-02*scale,1.846566e-02*scale,0*scale,lc1}; +Point(4200) = {7.769207e-02*scale,2.168274e-02*scale,0*scale,lc1}; +Point(4100) = {8.318523e-02*scale,2.447113e-02*scale,0*scale,lc1}; +Point(4099) = {9.417156e-02*scale,2.953992e-02*scale,0*scale,lc1}; +Point(4045) = {1.051579e-01*scale,3.374477e-02*scale,0*scale,lc1}; +Point(4044) = {1.161442e-01*scale,3.745387e-02*scale,0*scale,lc1}; +Point(4043) = {1.271305e-01*scale,4.084705e-02*scale,0*scale,lc1}; +Point(4147) = {1.381169e-01*scale,4.362166e-02*scale,0*scale,lc1}; +Point(4146) = {1.491032e-01*scale,4.590535e-02*scale,0*scale,lc1}; +Point(4180) = {1.600895e-01*scale,4.775547e-02*scale,0*scale,lc1}; +Point(4167) = {1.710759e-01*scale,4.909090e-02*scale,0*scale,lc1}; +Point(4166) = {1.820622e-01*scale,5.028654e-02*scale,0*scale,lc1}; +Point(4134) = {1.930485e-01*scale,5.118303e-02*scale,0*scale,lc1}; +Point(4133) = {2.040348e-01*scale,5.209637e-02*scale,0*scale,lc1}; +Point(4098) = {2.150212e-01*scale,5.304431e-02*scale,0*scale,lc1}; +Point(4097) = {2.260075e-01*scale,5.389186e-02*scale,0*scale,lc1}; +Point(4042) = {2.369938e-01*scale,5.466596e-02*scale,0*scale,lc1}; +Point(4041) = {2.479802e-01*scale,5.535583e-02*scale,0*scale,lc1}; +Point(4040) = {2.589665e-01*scale,5.602171e-02*scale,0*scale,lc1}; +Point(4095) = {2.699528e-01*scale,5.660820e-02*scale,0*scale,lc1}; +Point(4096) = {2.809391e-01*scale,5.717080e-02*scale,0*scale,lc1}; +Point(4132) = {2.919255e-01*scale,5.768210e-02*scale,0*scale,lc1}; +Point(4131) = {3.029118e-01*scale,5.816077e-02*scale,0*scale,lc1}; +Point(4165) = {3.138981e-01*scale,5.861410e-02*scale,0*scale,lc1}; +Point(4164) = {3.248844e-01*scale,5.902748e-02*scale,0*scale,lc1}; +Point(4163) = {3.358708e-01*scale,5.942876e-02*scale,0*scale,lc1}; +Point(4130) = {3.468571e-01*scale,5.978313e-02*scale,0*scale,lc1}; +Point(4129) = {3.578434e-01*scale,6.012088e-02*scale,0*scale,lc1}; +Point(4094) = {3.688298e-01*scale,6.041918e-02*scale,0*scale,lc1}; +Point(4093) = {3.798161e-01*scale,6.068571e-02*scale,0*scale,lc1}; +Point(4039) = {3.908024e-01*scale,6.092523e-02*scale,0*scale,lc1}; +Point(4038) = {4.017887e-01*scale,6.111444e-02*scale,0*scale,lc1}; +Point(4037) = {4.127751e-01*scale,6.128792e-02*scale,0*scale,lc1}; +Point(4092) = {4.237614e-01*scale,6.139510e-02*scale,0*scale,lc1}; +Point(4091) = {4.347477e-01*scale,6.148330e-02*scale,0*scale,lc1}; +Point(4128) = {4.457341e-01*scale,6.152051e-02*scale,0*scale,lc1}; +Point(4127) = {4.567204e-01*scale,6.152534e-02*scale,0*scale,lc1}; +Point(4162) = {4.677067e-01*scale,6.149964e-02*scale,0*scale,lc1}; +Point(4161) = {4.786930e-01*scale,6.143130e-02*scale,0*scale,lc1}; +Point(4183) = {4.896794e-01*scale,6.134928e-02*scale,0*scale,lc1}; +Point(4160) = {5.006657e-01*scale,6.120560e-02*scale,0*scale,lc1}; +Point(4159) = {5.116520e-01*scale,6.104561e-02*scale,0*scale,lc1}; +Point(4126) = {5.226384e-01*scale,6.083535e-02*scale,0*scale,lc1}; +Point(4125) = {5.336247e-01*scale,6.058889e-02*scale,0*scale,lc1}; +Point(4088) = {5.446110e-01*scale,6.030455e-02*scale,0*scale,lc1}; +Point(4087) = {5.555973e-01*scale,5.996460e-02*scale,0*scale,lc1}; +Point(4033) = {5.665837e-01*scale,5.960434e-02*scale,0*scale,lc1}; +Point(4032) = {5.775700e-01*scale,5.915575e-02*scale,0*scale,lc1}; +Point(4031) = {5.885563e-01*scale,5.867545e-02*scale,0*scale,lc1}; +Point(4086) = {5.995427e-01*scale,5.809113e-02*scale,0*scale,lc1}; +Point(4085) = {6.105290e-01*scale,5.746759e-02*scale,0*scale,lc1}; +Point(4124) = {6.215153e-01*scale,5.679937e-02*scale,0*scale,lc1}; +Point(4123) = {6.325016e-01*scale,5.616104e-02*scale,0*scale,lc1}; +Point(4158) = {6.434880e-01*scale,5.553466e-02*scale,0*scale,lc1}; +Point(4157) = {6.544743e-01*scale,5.490460e-02*scale,0*scale,lc1}; +Point(4156) = {6.654606e-01*scale,5.425221e-02*scale,0*scale,lc1}; +Point(4122) = {6.764469e-01*scale,5.351456e-02*scale,0*scale,lc1}; +Point(4121) = {6.874333e-01*scale,5.273401e-02*scale,0*scale,lc1}; +Point(4081) = {6.984196e-01*scale,5.190181e-02*scale,0*scale,lc1}; +Point(4080) = {7.094059e-01*scale,5.101347e-02*scale,0*scale,lc1}; +Point(4020) = {7.203923e-01*scale,5.010133e-02*scale,0*scale,lc1}; +Point(4019) = {7.313786e-01*scale,4.909498e-02*scale,0*scale,lc1}; +Point(4018) = {7.423649e-01*scale,4.806316e-02*scale,0*scale,lc1}; +Point(4143) = {7.533512e-01*scale,4.694984e-02*scale,0*scale,lc1}; +Point(4118) = {7.643376e-01*scale,4.579371e-02*scale,0*scale,lc1}; +Point(4022) = {7.753239e-01*scale,4.458624e-02*scale,0*scale,lc1}; +Point(4016) = {7.863102e-01*scale,4.330843e-02*scale,0*scale,lc1}; +Point(4015) = {7.972966e-01*scale,4.200167e-02*scale,0*scale,lc1}; +Point(4011) = {8.082829e-01*scale,4.058146e-02*scale,0*scale,lc1}; +Point(4010) = {8.192692e-01*scale,3.912968e-02*scale,0*scale,lc1}; +Point(4009) = {8.302555e-01*scale,3.758209e-02*scale,0*scale,lc1}; +Point(4219) = {8.357487e-01*scale,3.680830e-02*scale,0*scale,lc1}; +Point(4177) = {8.412419e-01*scale,3.598390e-02*scale,0*scale,lc1}; +Point(4176) = {8.467350e-01*scale,3.515767e-02*scale,0*scale,lc1}; +Point(4149) = {8.494816e-01*scale,3.474456e-02*scale,0*scale,lc1}; +Point(4059) = {8.522282e-01*scale,3.433145e-02*scale,0*scale,lc1}; +Point(4058) = {8.549748e-01*scale,3.391833e-02*scale,0*scale,lc1}; +Point(4055) = {8.577214e-01*scale,3.349214e-02*scale,0*scale,lc1}; +Point(4113) = {8.604679e-01*scale,3.306571e-02*scale,0*scale,lc1}; +Point(4110) = {8.632145e-01*scale,3.263928e-02*scale,0*scale,lc1}; +Point(4213) = {8.659611e-01*scale,3.221285e-02*scale,0*scale,lc1}; +Point(4210) = {8.687077e-01*scale,3.178643e-02*scale,0*scale,lc1}; +Point(4217) = {8.714543e-01*scale,3.136000e-02*scale,0*scale,lc1}; +Point(4006) = {8.740950e-01*scale,3.095000e-02*scale,0*scale,lc1}; +Point(4218) = {8.714543e-01*scale,3.095677e-02*scale,0*scale,lc1}; +Point(4211) = {8.687077e-01*scale,3.096380e-02*scale,0*scale,lc1}; +Point(4212) = {8.659611e-01*scale,3.097084e-02*scale,0*scale,lc1}; +Point(4111) = {8.632145e-01*scale,3.097787e-02*scale,0*scale,lc1}; +Point(4112) = {8.604679e-01*scale,3.098491e-02*scale,0*scale,lc1}; +Point(4056) = {8.577214e-01*scale,3.099195e-02*scale,0*scale,lc1}; +Point(4057) = {8.549748e-01*scale,3.099898e-02*scale,0*scale,lc1}; +Point(4060) = {8.522282e-01*scale,3.100602e-02*scale,0*scale,lc1}; +Point(4148) = {8.494816e-01*scale,3.101305e-02*scale,0*scale,lc1}; +Point(4150) = {8.467350e-01*scale,3.102009e-02*scale,0*scale,lc1}; +Point(4208) = {8.439885e-01*scale,3.102712e-02*scale,0*scale,lc1}; +Point(4209) = {8.412419e-01*scale,3.103416e-02*scale,0*scale,lc1}; +Point(4215) = {8.357487e-01*scale,3.104823e-02*scale,0*scale,lc1}; +Point(4216) = {8.302555e-01*scale,3.106230e-02*scale,0*scale,lc1}; +Point(4220) = {8.247624e-01*scale,3.107638e-02*scale,0*scale,lc1}; +Point(4012) = {8.192692e-01*scale,3.109045e-02*scale,0*scale,lc1}; +Point(4013) = {8.082829e-01*scale,3.111859e-02*scale,0*scale,lc1}; +Point(4014) = {7.972966e-01*scale,3.114674e-02*scale,0*scale,lc1}; +Point(4017) = {7.863102e-01*scale,3.117488e-02*scale,0*scale,lc1}; +Point(4021) = {7.753239e-01*scale,3.120302e-02*scale,0*scale,lc1}; +Point(4023) = {7.643376e-01*scale,3.123117e-02*scale,0*scale,lc1}; +Point(4117) = {7.533512e-01*scale,3.125931e-02*scale,0*scale,lc1}; +Point(4082) = {7.423649e-01*scale,3.128745e-02*scale,0*scale,lc1}; +Point(4083) = {7.313786e-01*scale,3.131560e-02*scale,0*scale,lc1}; +Point(4024) = {7.203923e-01*scale,3.134374e-02*scale,0*scale,lc1}; +Point(4025) = {7.094059e-01*scale,3.137188e-02*scale,0*scale,lc1}; +Point(4007) = {6.999910e-01*scale,3.139600e-02*scale,0*scale,lc1}; +Point(4026) = {6.999910e-01*scale,2.367126e-02*scale,0*scale,lc1}; +Point(4027) = {6.999910e-01*scale,1.268493e-02*scale,0*scale,lc1}; +Point(4028) = {6.999910e-01*scale,1.698599e-03*scale,0*scale,lc1}; +Point(4029) = {6.999910e-01*scale,-9.287729e-03*scale,0*scale,lc1}; +Point(4008) = {6.999910e-01*scale,-1.722400e-02*scale,0*scale,lc1}; +Point(4030) = {6.984196e-01*scale,-1.751626e-02*scale,0*scale,lc1}; +Point(4084) = {6.874333e-01*scale,-1.955960e-02*scale,0*scale,lc1}; +Point(4194) = {6.764469e-01*scale,-2.159776e-02*scale,0*scale,lc1}; +Point(4195) = {6.654606e-01*scale,-2.362865e-02*scale,0*scale,lc1}; +Point(4154) = {6.544743e-01*scale,-2.588904e-02*scale,0*scale,lc1}; +Point(4155) = {6.434880e-01*scale,-2.825320e-02*scale,0*scale,lc1}; +Point(4119) = {6.325016e-01*scale,-3.016078e-02*scale,0*scale,lc1}; +Point(4120) = {6.215153e-01*scale,-3.200586e-02*scale,0*scale,lc1}; +Point(4089) = {6.105290e-01*scale,-3.369569e-02*scale,0*scale,lc1}; +Point(4090) = {5.995427e-01*scale,-3.534073e-02*scale,0*scale,lc1}; +Point(4034) = {5.885563e-01*scale,-3.694183e-02*scale,0*scale,lc1}; +Point(4035) = {5.775700e-01*scale,-3.852074e-02*scale,0*scale,lc1}; +Point(4036) = {5.665837e-01*scale,-4.009157e-02*scale,0*scale,lc1}; +Point(4144) = {5.555973e-01*scale,-4.161619e-02*scale,0*scale,lc1}; +Point(4192) = {5.446110e-01*scale,-4.311363e-02*scale,0*scale,lc1}; +Point(4193) = {5.336247e-01*scale,-4.454372e-02*scale,0*scale,lc1}; +Point(4184) = {5.226384e-01*scale,-4.589904e-02*scale,0*scale,lc1}; +Point(4185) = {5.116520e-01*scale,-4.719211e-02*scale,0*scale,lc1}; +Point(4168) = {5.006657e-01*scale,-4.834107e-02*scale,0*scale,lc1}; +Point(4169) = {4.896794e-01*scale,-4.944199e-02*scale,0*scale,lc1}; +Point(4135) = {4.786930e-01*scale,-5.032590e-02*scale,0*scale,lc1}; +Point(4136) = {4.677067e-01*scale,-5.113121e-02*scale,0*scale,lc1}; +Point(4101) = {4.567204e-01*scale,-5.175527e-02*scale,0*scale,lc1}; +Point(4102) = {4.457341e-01*scale,-5.227269e-02*scale,0*scale,lc1}; +Point(4049) = {4.347477e-01*scale,-5.270239e-02*scale,0*scale,lc1}; +Point(4050) = {4.237614e-01*scale,-5.305741e-02*scale,0*scale,lc1}; +Point(4051) = {4.127751e-01*scale,-5.339040e-02*scale,0*scale,lc1}; +Point(4103) = {4.017887e-01*scale,-5.365720e-02*scale,0*scale,lc1}; +Point(4104) = {3.908024e-01*scale,-5.390137e-02*scale,0*scale,lc1}; +Point(4137) = {3.798161e-01*scale,-5.408775e-02*scale,0*scale,lc1}; +Point(4138) = {3.688298e-01*scale,-5.423035e-02*scale,0*scale,lc1}; +Point(4170) = {3.578434e-01*scale,-5.433335e-02*scale,0*scale,lc1}; +Point(4171) = {3.468571e-01*scale,-5.436941e-02*scale,0*scale,lc1}; +Point(4186) = {3.358708e-01*scale,-5.438425e-02*scale,0*scale,lc1}; +Point(4172) = {3.248844e-01*scale,-5.431051e-02*scale,0*scale,lc1}; +Point(4173) = {3.138981e-01*scale,-5.421116e-02*scale,0*scale,lc1}; +Point(4139) = {3.029118e-01*scale,-5.403703e-02*scale,0*scale,lc1}; +Point(4140) = {2.919255e-01*scale,-5.379680e-02*scale,0*scale,lc1}; +Point(4105) = {2.809391e-01*scale,-5.349015e-02*scale,0*scale,lc1}; +Point(4106) = {2.699528e-01*scale,-5.307623e-02*scale,0*scale,lc1}; +Point(4052) = {2.589665e-01*scale,-5.262516e-02*scale,0*scale,lc1}; +Point(4053) = {2.479802e-01*scale,-5.205332e-02*scale,0*scale,lc1}; +Point(4054) = {2.369938e-01*scale,-5.145659e-02*scale,0*scale,lc1}; +Point(4107) = {2.260075e-01*scale,-5.078306e-02*scale,0*scale,lc1}; +Point(4108) = {2.150212e-01*scale,-5.007146e-02*scale,0*scale,lc1}; +Point(4141) = {2.040348e-01*scale,-4.931867e-02*scale,0*scale,lc1}; +Point(4142) = {1.930485e-01*scale,-4.849150e-02*scale,0*scale,lc1}; +Point(4174) = {1.820622e-01*scale,-4.763665e-02*scale,0*scale,lc1}; +Point(4175) = {1.710759e-01*scale,-4.665625e-02*scale,0*scale,lc1}; +Point(4187) = {1.600895e-01*scale,-4.564614e-02*scale,0*scale,lc1}; +Point(4188) = {1.491032e-01*scale,-4.455428e-02*scale,0*scale,lc1}; +Point(4145) = {1.381169e-01*scale,-4.339482e-02*scale,0*scale,lc1}; +Point(4046) = {1.271305e-01*scale,-4.218155e-02*scale,0*scale,lc1}; +Point(4047) = {1.161442e-01*scale,-4.082776e-02*scale,0*scale,lc1}; +Point(4048) = {1.051579e-01*scale,-3.939290e-02*scale,0*scale,lc1}; +Point(4196) = {9.966472e-02*scale,-3.862964e-02*scale,0*scale,lc1}; +Point(4197) = {9.417156e-02*scale,-3.788513e-02*scale,0*scale,lc1}; +Point(4198) = {8.867839e-02*scale,-3.720163e-02*scale,0*scale,lc1}; +Point(4189) = {8.318523e-02*scale,-3.651554e-02*scale,0*scale,lc1}; +Point(4190) = {7.769207e-02*scale,-3.569174e-02*scale,0*scale,lc1}; +Point(4214) = {7.494548e-02*scale,-3.527985e-02*scale,0*scale,lc1}; +Point(4181) = {7.219890e-02*scale,-3.481687e-02*scale,0*scale,lc1}; +Point(4182) = {6.945232e-02*scale,-3.430639e-02*scale,0*scale,lc1}; +Point(4151) = {6.670574e-02*scale,-3.379591e-02*scale,0*scale,lc1}; +Point(4152) = {6.395916e-02*scale,-3.322033e-02*scale,0*scale,lc1}; +Point(4064) = {6.121257e-02*scale,-3.263264e-02*scale,0*scale,lc1}; +Point(4065) = {5.846599e-02*scale,-3.189105e-02*scale,0*scale,lc1}; +Point(4066) = {5.635416e-02*scale,-3.126039e-02*scale,0*scale,lc1}; +Point(4205) = {5.434612e-02*scale,-3.049426e-02*scale,0*scale,lc1}; +Point(4206) = {5.297283e-02*scale,-2.986940e-02*scale,0*scale,lc1}; +Point(4207) = {5.159954e-02*scale,-2.914883e-02*scale,0*scale,lc1}; +Point(4072) = {5.022625e-02*scale,-2.824438e-02*scale,0*scale,lc1}; +Point(4074) = {4.885296e-02*scale,-2.716087e-02*scale,0*scale,lc1}; +Point(4073) = {4.883074e-02*scale,-2.714051e-02*scale,0*scale,lc1}; +Point(4076) = {4.747966e-02*scale,-2.578824e-02*scale,0*scale,lc1}; +Point(4075) = {4.746129e-02*scale,-2.576722e-02*scale,0*scale,lc1}; +Point(4079) = {4.639274e-02*scale,-2.439393e-02*scale,0*scale,lc1}; +Point(4078) = {4.561283e-02*scale,-2.302064e-02*scale,0*scale,lc1}; +Point(4077) = {4.500573e-02*scale,-2.164735e-02*scale,0*scale,lc1}; +Point(4068) = {4.450243e-02*scale,-2.027406e-02*scale,0*scale,lc1}; +Point(4067) = {4.415104e-02*scale,-1.890077e-02*scale,0*scale,lc1}; +Point(4069) = {4.402927e-02*scale,-1.752748e-02*scale,0*scale,lc1}; +Point(4070) = {4.404617e-02*scale,-1.615418e-02*scale,0*scale,lc1}; +Point(4071) = {4.411753e-02*scale,-1.478089e-02*scale,0*scale,lc1}; +Point(4115) = {4.421802e-02*scale,-1.340760e-02*scale,0*scale,lc1}; +Point(4116) = {4.435615e-02*scale,-1.203431e-02*scale,0*scale,lc1}; +Point(4204) = {4.461695e-02*scale,-1.066102e-02*scale,0*scale,lc1}; + +/* la boite */ + +Point(11) = {4.552264e+01*scale,-2.254225e+01*scale,0*scale,lc3}; +Point(2233) = {4.552264e+01*scale,-1.129225e+01*scale,0*scale,lc3}; +Point(5) = {4.552264e+01*scale,-4.224671e-02*scale,0*scale,lc3}; +Point(2236) = {4.552264e+01*scale,1.120775e+01*scale,0*scale,lc3}; +Point(14) = {4.552264e+01*scale,2.245775e+01*scale,0*scale,lc3}; +Point(2) = {4.552264e+01*scale,4.495775e+01*scale,0*scale,lc3}; +Point(15) = {2.302264e+01*scale,4.495775e+01*scale,0*scale,lc3}; +Point(2301) = {1.177264e+01*scale,4.495775e+01*scale,0*scale,lc3}; +Point(6) = {5.226384e-01*scale,4.495775e+01*scale,0*scale,lc3}; +Point(2304) = {-1.072736e+01*scale,4.495775e+01*scale,0*scale,lc3}; +Point(18) = {-2.197736e+01*scale,4.495775e+01*scale,0*scale,lc3}; +Point(3) = {-4.447736e+01*scale,4.495775e+01*scale,0*scale,lc3}; +Point(19) = {-4.447736e+01*scale,2.245775e+01*scale,0*scale,lc3}; +Point(2240) = {-4.447736e+01*scale,1.120775e+01*scale,0*scale,lc3}; +Point(7) = {-4.447736e+01*scale,-4.224671e-02*scale,0*scale,lc3}; +Point(2243) = {-4.447736e+01*scale,-1.129225e+01*scale,0*scale,lc3}; +Point(22) = {-4.447736e+01*scale,-2.254225e+01*scale,0*scale,lc3}; +Point(4) = {-4.447736e+01*scale,-4.504225e+01*scale,0*scale,lc3}; +Point(23) = {-2.197736e+01*scale,-4.504225e+01*scale,0*scale,lc3}; +Point(2317) = {-1.072736e+01*scale,-4.504225e+01*scale,0*scale,lc3}; +Point(8) = {5.226384e-01*scale,-4.504225e+01*scale,0*scale,lc3}; +Point(2297) = {1.177264e+01*scale,-4.504225e+01*scale,0*scale,lc3}; +Point(10) = {2.302264e+01*scale,-4.504225e+01*scale,0*scale,lc3}; +Point(1) = {4.552264e+01*scale,-4.504225e+01*scale,0*scale,lc3}; + +/* le flap */ + +Point(4298) = {1.125732e+00*scale,-1.356305e-01*scale,0*scale,lc2}; +Point(4297) = {1.128473e+00*scale,-1.383771e-01*scale,0*scale,lc2}; +Point(4222) = {1.130511e+00*scale,-1.404190e-01*scale,0*scale,lc2}; +Point(4250) = {1.130200e+00*scale,-1.411237e-01*scale,0*scale,lc2}; +Point(4252) = {1.128987e+00*scale,-1.438702e-01*scale,0*scale,lc2}; +Point(4221) = {1.128033e+00*scale,-1.460320e-01*scale,0*scale,lc2}; +Point(4251) = {1.126886e+00*scale,-1.450775e-01*scale,0*scale,lc2}; +Point(4299) = {1.124140e+00*scale,-1.427912e-01*scale,0*scale,lc2}; +Point(4335) = {1.121393e+00*scale,-1.405048e-01*scale,0*scale,lc2}; +Point(4337) = {1.118647e+00*scale,-1.382318e-01*scale,0*scale,lc2}; +Point(4267) = {1.115900e+00*scale,-1.359746e-01*scale,0*scale,lc2}; +Point(4294) = {1.115481e+00*scale,-1.356305e-01*scale,0*scale,lc2}; +Point(4269) = {1.110407e+00*scale,-1.315213e-01*scale,0*scale,lc2}; +Point(4233) = {1.104914e+00*scale,-1.272651e-01*scale,0*scale,lc2}; +Point(4234) = {1.099421e+00*scale,-1.231333e-01*scale,0*scale,lc2}; +Point(4273) = {1.093927e+00*scale,-1.190696e-01*scale,0*scale,lc2}; +Point(4293) = {1.088434e+00*scale,-1.150965e-01*scale,0*scale,lc2}; +Point(4314) = {1.082941e+00*scale,-1.112096e-01*scale,0*scale,lc2}; +Point(4317) = {1.077448e+00*scale,-1.073829e-01*scale,0*scale,lc2}; +Point(4318) = {1.071955e+00*scale,-1.037168e-01*scale,0*scale,lc2}; +Point(4274) = {1.066462e+00*scale,-1.001266e-01*scale,0*scale,lc2}; +Point(4235) = {1.060968e+00*scale,-9.664561e-02*scale,0*scale,lc2}; +Point(4236) = {1.055475e+00*scale,-9.329373e-02*scale,0*scale,lc2}; +Point(4237) = {1.049982e+00*scale,-8.999964e-02*scale,0*scale,lc2}; +Point(4301) = {1.044489e+00*scale,-8.685139e-02*scale,0*scale,lc2}; +Point(4319) = {1.038996e+00*scale,-8.375978e-02*scale,0*scale,lc2}; +Point(4321) = {1.033503e+00*scale,-8.073620e-02*scale,0*scale,lc2}; +Point(4320) = {1.033435e+00*scale,-8.069886e-02*scale,0*scale,lc2}; +Point(4322) = {1.028009e+00*scale,-7.778268e-02*scale,0*scale,lc2}; +Point(4347) = {1.022516e+00*scale,-7.485902e-02*scale,0*scale,lc2}; +Point(4323) = {1.017023e+00*scale,-7.206071e-02*scale,0*scale,lc2}; +Point(4324) = {1.011530e+00*scale,-6.928798e-02*scale,0*scale,lc2}; +Point(4325) = {1.006037e+00*scale,-6.656447e-02*scale,0*scale,lc2}; +Point(4276) = {1.000544e+00*scale,-6.390345e-02*scale,0*scale,lc2}; + +Point(4238) = {9.950505e-01*scale,-6.128188e-02*scale,0*scale,lc2}; +Point(4240) = {9.895573e-01*scale,-5.875476e-02*scale,0*scale,lc2}; +Point(4239) = {9.894949e-01*scale,-5.872621e-02*scale,0*scale,lc2}; +Point(4241) = {9.840641e-01*scale,-5.625125e-02*scale,0*scale,lc2}; +Point(4277) = {9.785710e-01*scale,-5.382099e-02*scale,0*scale,lc2}; +Point(4326) = {9.730778e-01*scale,-5.141086e-02*scale,0*scale,lc2}; +Point(4327) = {9.675846e-01*scale,-4.903782e-02*scale,0*scale,lc2}; +Point(4328) = {9.620915e-01*scale,-4.670806e-02*scale,0*scale,lc2}; +Point(4350) = {9.565983e-01*scale,-4.440955e-02*scale,0*scale,lc2}; +Point(4348) = {9.511052e-01*scale,-4.217563e-02*scale,0*scale,lc2}; +Point(4349) = {9.456120e-01*scale,-3.995849e-02*scale,0*scale,lc2}; +Point(4332) = {9.401188e-01*scale,-3.778658e-02*scale,0*scale,lc2}; +Point(4333) = {9.346257e-01*scale,-3.563417e-02*scale,0*scale,lc2}; +Point(4334) = {9.291325e-01*scale,-3.354304e-02*scale,0*scale,lc2}; +Point(4278) = {9.236393e-01*scale,-3.147155e-02*scale,0*scale,lc2}; +Point(4247) = {9.181462e-01*scale,-2.942051e-02*scale,0*scale,lc2}; +Point(4248) = {9.126530e-01*scale,-2.741688e-02*scale,0*scale,lc2}; +Point(4249) = {9.071598e-01*scale,-2.541811e-02*scale,0*scale,lc2}; +Point(4282) = {9.016667e-01*scale,-2.339436e-02*scale,0*scale,lc2}; +Point(4283) = {8.961735e-01*scale,-2.121581e-02*scale,0*scale,lc2}; +Point(4341) = {8.934269e-01*scale,-2.008894e-02*scale,0*scale,lc2}; +Point(4342) = {8.906803e-01*scale,-1.868991e-02*scale,0*scale,lc2}; +Point(4343) = {8.879338e-01*scale,-1.729088e-02*scale,0*scale,lc2}; +Point(4289) = {8.851872e-01*scale,-1.539587e-02*scale,0*scale,lc2}; +Point(4290) = {8.824406e-01*scale,-1.328983e-02*scale,0*scale,lc2}; +Point(4286) = {8.796940e-01*scale,-1.068337e-02*scale,0*scale,lc2}; +Point(4255) = {8.785175e-01*scale,-9.287729e-03*scale,0*scale,lc2}; +Point(4257) = {8.763537e-01*scale,-6.541147e-03*scale,0*scale,lc2}; +Point(4256) = {8.745583e-01*scale,-3.794565e-03*scale,0*scale,lc2}; +Point(4346) = {8.737982e-01*scale,-2.421274e-03*scale,0*scale,lc2}; +Point(4288) = {8.731375e-01*scale,-1.047983e-03*scale,0*scale,lc2}; +Point(4287) = {8.725645e-01*scale,3.253082e-04*scale,0*scale,lc2}; +Point(4260) = {8.721474e-01*scale,1.698599e-03*scale,0*scale,lc2}; +Point(4259) = {8.718264e-01*scale,3.071890e-03*scale,0*scale,lc2}; +Point(4258) = {8.716296e-01*scale,4.445181e-03*scale,0*scale,lc2}; +Point(4262) = {8.715751e-01*scale,5.818472e-03*scale,0*scale,lc2}; +Point(4261) = {8.716587e-01*scale,7.191763e-03*scale,0*scale,lc2}; +Point(4264) = {8.718582e-01*scale,8.565054e-03*scale,0*scale,lc2}; +Point(4263) = {8.721688e-01*scale,9.938345e-03*scale,0*scale,lc2}; +Point(4265) = {8.726207e-01*scale,1.131164e-02*scale,0*scale,lc2}; +Point(4266) = {8.732553e-01*scale,1.268493e-02*scale,0*scale,lc2}; +Point(4303) = {8.741084e-01*scale,1.405822e-02*scale,0*scale,lc2}; +Point(4302) = {8.742009e-01*scale,1.417564e-02*scale,0*scale,lc2}; +Point(4304) = {8.752094e-01*scale,1.543151e-02*scale,0*scale,lc2}; +Point(4305) = {8.755741e-01*scale,1.580615e-02*scale,0*scale,lc2}; +Point(4306) = {8.765464e-01*scale,1.680480e-02*scale,0*scale,lc2}; +Point(4307) = {8.769474e-01*scale,1.712646e-02*scale,0*scale,lc2}; +Point(4308) = {8.783004e-01*scale,1.817809e-02*scale,0*scale,lc2}; +Point(4309) = {8.783207e-01*scale,1.819390e-02*scale,0*scale,lc2}; +Point(4345) = {8.796940e-01*scale,1.898483e-02*scale,0*scale,lc2}; +Point(4344) = {8.810673e-01*scale,1.969096e-02*scale,0*scale,lc2}; +Point(4254) = {8.824406e-01*scale,2.018966e-02*scale,0*scale,lc2}; +Point(4253) = {8.851872e-01*scale,2.092940e-02*scale,0*scale,lc2}; +Point(4285) = {8.879338e-01*scale,2.136484e-02*scale,0*scale,lc2}; +Point(4284) = {8.906803e-01*scale,2.153023e-02*scale,0*scale,lc2}; +Point(4340) = {8.934269e-01*scale,2.149455e-02*scale,0*scale,lc2}; +Point(4339) = {8.961735e-01*scale,2.136105e-02*scale,0*scale,lc2}; +Point(4338) = {8.989201e-01*scale,2.104930e-02*scale,0*scale,lc2}; +Point(4246) = {9.016667e-01*scale,2.064514e-02*scale,0*scale,lc2}; +Point(4245) = {9.071598e-01*scale,1.954695e-02*scale,0*scale,lc2}; +Point(4281) = {9.126530e-01*scale,1.818666e-02*scale,0*scale,lc2}; +Point(4280) = {9.181462e-01*scale,1.648801e-02*scale,0*scale,lc2}; +Point(4279) = {9.236393e-01*scale,1.459116e-02*scale,0*scale,lc2}; +Point(4244) = {9.291325e-01*scale,1.255534e-02*scale,0*scale,lc2}; +Point(4243) = {9.346257e-01*scale,1.024686e-02*scale,0*scale,lc2}; +Point(4242) = {9.401188e-01*scale,7.859173e-03*scale,0*scale,lc2}; +Point(4296) = {9.456120e-01*scale,5.245962e-03*scale,0*scale,lc2}; +Point(4295) = {9.511052e-01*scale,2.515401e-03*scale,0*scale,lc2}; +Point(4300) = {9.565983e-01*scale,-3.522322e-04*scale,0*scale,lc2}; +Point(4330) = {9.620915e-01*scale,-3.368852e-03*scale,0*scale,lc2}; +Point(4331) = {9.628545e-01*scale,-3.794565e-03*scale,0*scale,lc2}; +Point(4329) = {9.675846e-01*scale,-6.447130e-03*scale,0*scale,lc2}; +Point(4232) = {9.730778e-01*scale,-9.700323e-03*scale,0*scale,lc2}; +Point(4231) = {9.840641e-01*scale,-1.646639e-02*scale,0*scale,lc2}; +Point(4230) = {9.950505e-01*scale,-2.366260e-02*scale,0*scale,lc2}; + +Point(4229) = {1.006037e+00*scale,-3.132299e-02*scale,0*scale,lc2}; +Point(4228) = {1.017023e+00*scale,-3.943289e-02*scale,0*scale,lc2}; +Point(4227) = {1.028009e+00*scale,-4.793142e-02*scale,0*scale,lc2}; +Point(4225) = {1.038996e+00*scale,-5.669110e-02*scale,0*scale,lc2}; +Point(4226) = {1.048275e+00*scale,-6.421937e-02*scale,0*scale,lc2}; +Point(4312) = {1.054944e+00*scale,-6.971253e-02*scale,0*scale,lc2}; +Point(4223) = {1.060968e+00*scale,-7.473580e-02*scale,0*scale,lc2}; +Point(4224) = {1.061523e+00*scale,-7.520570e-02*scale,0*scale,lc2}; +Point(4311) = {1.066462e+00*scale,-7.943817e-02*scale,0*scale,lc2}; +Point(4310) = {1.067933e+00*scale,-8.069886e-02*scale,0*scale,lc2}; +Point(4275) = {1.071955e+00*scale,-8.420612e-02*scale,0*scale,lc2}; +Point(4316) = {1.077448e+00*scale,-8.903994e-02*scale,0*scale,lc2}; +Point(4315) = {1.082941e+00*scale,-9.395896e-02*scale,0*scale,lc2}; +Point(4313) = {1.088434e+00*scale,-9.897945e-02*scale,0*scale,lc2}; +Point(4292) = {1.093927e+00*scale,-1.041032e-01*scale,0*scale,lc2}; +Point(4272) = {1.099421e+00*scale,-1.093858e-01*scale,0*scale,lc2}; +Point(4271) = {1.104914e+00*scale,-1.148004e-01*scale,0*scale,lc2}; +Point(4270) = {1.110407e+00*scale,-1.202740e-01*scale,0*scale,lc2}; +Point(4268) = {1.114765e+00*scale,-1.246442e-01*scale,0*scale,lc2}; +Point(4291) = {1.120249e+00*scale,-1.301373e-01*scale,0*scale,lc2}; +Point(4336) = {1.122990e+00*scale,-1.328839e-01*scale,0*scale,lc2}; + +Line(1) = {3895,3897}; +Line(2) = {3897,3896}; +Line(3) = {3896,3968}; +Line(4) = {3968,3995}; +Line(5) = {3995,4003}; +Line(6) = {4003,3857}; +Line(7) = {3857,3856}; +Line(8) = {3856,3860}; +Line(9) = {3860,3861}; +Line(10) = {3861,3863}; +Line(11) = {3863,3864}; +Line(12) = {3864,3865}; +Line(13) = {3865,3866}; +Line(14) = {3866,3867}; +Line(15) = {3867,3868}; +Line(16) = {3868,3869}; +Line(17) = {3869,3870}; +Line(18) = {3870,3871}; +Line(19) = {3871,3872}; +Line(20) = {3872,3977}; +Line(21) = {3977,3877}; +Line(22) = {3877,3876}; +Line(23) = {3876,3878}; +Line(24) = {3878,3934}; +Line(25) = {3934,3873}; +Line(26) = {3873,3874}; +Line(27) = {3874,3875}; +Line(28) = {3875,3935}; +Line(29) = {3935,3880}; +Line(30) = {3880,3879}; +Line(31) = {3879,3881}; +Line(32) = {3881,3936}; +Line(33) = {3936,3882}; +Line(34) = {3882,3883}; +Line(35) = {3883,3885}; +Line(36) = {3885,3884}; +Line(37) = {3884,1218}; +Line(38) = {1218,3933}; +Line(39) = {3933,3996}; +Line(40) = {3996,3989}; +Line(41) = {3989,3990}; +Line(42) = {3990,3978}; +Line(43) = {3978,3979}; +Line(44) = {3979,3974}; +Line(45) = {3974,3973}; +Line(46) = {3973,3963}; +Line(47) = {3963,3947}; +Line(48) = {3947,3948}; +Line(49) = {3948,3904}; +Line(50) = {3904,3903}; +Line(51) = {3903,3946}; +Line(52) = {3946,3902}; +Line(53) = {3902,3901}; +Line(54) = {3901,3900}; +Line(55) = {3900,3908}; +Line(56) = {3908,3907}; +Line(57) = {3907,3951}; +Line(58) = {3951,3950}; +Line(59) = {3950,3847}; +Line(60) = {3847,3949}; +Line(61) = {3949,3952}; +Line(62) = {3952,3905}; +Line(63) = {3905,3906}; +Line(64) = {3906,3909}; +Line(65) = {3909,3969}; +Line(66) = {3969,3970}; +Line(67) = {3970,3997}; +Line(68) = {3997,3998}; +Line(69) = {3998,4004}; +Line(70) = {4004,3959}; +Line(71) = {3959,3960}; +Line(72) = {3960,3972}; +Line(73) = {3972,3984}; +Line(74) = {3984,3988}; +Line(75) = {3988,3961}; +Line(76) = {3961,3962}; +Line(77) = {3962,3937}; +Line(78) = {3937,3938}; +Line(79) = {3938,3886}; +Line(80) = {3886,3887}; +Line(81) = {3887,3888}; +Line(82) = {3888,3993}; +Line(83) = {3993,3994}; +Line(84) = {3994,3971}; +Line(85) = {3971,3918}; +Line(86) = {3918,3919}; +Line(87) = {3919,3920}; +Line(88) = {3920,3956}; +Line(89) = {3956,3955}; +Line(90) = {3955,3965}; +Line(91) = {3965,3966}; +Line(92) = {3966,3910}; +Line(93) = {3910,3913}; +Line(94) = {3913,3912}; +Line(95) = {3912,3911}; +Line(96) = {3911,3914}; +Line(97) = {3914,3915}; +Line(98) = {3915,3916}; +Line(99) = {3916,3917}; +Line(100) = {3917,3953}; +Line(101) = {3953,3954}; +Line(102) = {3954,3964}; +Line(103) = {3964,3975}; +Line(104) = {3975,3992}; +Line(105) = {3992,3991}; +Line(106) = {3991,3999}; +Line(107) = {3999,3939}; +Line(108) = {3939,3967}; +Line(109) = {3967,3987}; +Line(110) = {3987,3985}; +Line(111) = {3985,3986}; +Line(112) = {3986,4002}; +Line(113) = {4002,3922}; +Line(114) = {3922,4005}; +Line(115) = {4005,3851}; +Line(116) = {3851,3850}; +Line(117) = {3850,3853}; +Line(118) = {3853,3852}; +Line(119) = {3852,3849}; +Line(120) = {3849,3848}; +Line(121) = {3848,3921}; +Line(122) = {3921,3983}; +Line(123) = {3983,3982}; +Line(124) = {3982,3976}; +Line(125) = {3976,3929}; +Line(126) = {3929,3958}; +Line(127) = {3958,3928}; +Line(128) = {3928,3957}; +Line(129) = {3957,3927}; +Line(130) = {3927,3926}; +Line(131) = {3926,3925}; +Line(132) = {3925,3924}; +Line(133) = {3924,3932}; +Line(134) = {3932,3931}; +Line(135) = {3931,3930}; +Line(136) = {3930,3923}; +Line(137) = {3923,3862}; +Line(138) = {3862,3859}; +Line(139) = {3859,3858}; +Line(140) = {3858,3855}; +Line(141) = {3855,3854}; +Line(142) = {3854,3945}; +Line(143) = {3945,3944}; +Line(144) = {3944,3899}; +Line(145) = {3899,3898}; +Line(146) = {3898,3894}; +Line(147) = {3894,3890}; +Line(148) = {3890,3893}; +Line(149) = {3893,3941}; +Line(150) = {3941,4000}; +Line(151) = {4000,3980}; +Line(152) = {3980,3846}; +Line(153) = {3846,3981}; +Line(154) = {3981,4001}; +Line(155) = {4001,3942}; +Line(156) = {3942,3940}; +Line(157) = {3940,3889}; +Line(158) = {3889,3892}; +Line(159) = {3892,3891}; +Line(160) = {3891,3943}; +Line(161) = {3943,3895}; +Line(162) = {4063,4062}; +Line(163) = {4062,4061}; +Line(164) = {4061,4114}; +Line(165) = {4114,4153}; +Line(166) = {4153,4178}; +Line(167) = {4178,4179}; +Line(168) = {4179,4191}; +Line(169) = {4191,4203}; +Line(170) = {4203,4109}; +Line(171) = {4109,4202}; +Line(172) = {4202,4199}; +Line(173) = {4199,4201}; +Line(174) = {4201,4200}; +Line(175) = {4200,4100}; +Line(176) = {4100,4099}; +Line(177) = {4099,4045}; +Line(178) = {4045,4044}; +Line(179) = {4044,4043}; +Line(180) = {4043,4147}; +Line(181) = {4147,4146}; +Line(182) = {4146,4180}; +Line(183) = {4180,4167}; +Line(184) = {4167,4166}; +Line(185) = {4166,4134}; +Line(186) = {4134,4133}; +Line(187) = {4133,4098}; +Line(188) = {4098,4097}; +Line(189) = {4097,4042}; +Line(190) = {4042,4041}; +Line(191) = {4041,4040}; +Line(192) = {4040,4095}; +Line(193) = {4095,4096}; +Line(194) = {4096,4132}; +Line(195) = {4132,4131}; +Line(196) = {4131,4165}; +Line(197) = {4165,4164}; +Line(198) = {4164,4163}; +Line(199) = {4163,4130}; +Line(200) = {4130,4129}; +Line(201) = {4129,4094}; +Line(202) = {4094,4093}; +Line(203) = {4093,4039}; +Line(204) = {4039,4038}; +Line(205) = {4038,4037}; +Line(206) = {4037,4092}; +Line(207) = {4092,4091}; +Line(208) = {4091,4128}; +Line(209) = {4128,4127}; +Line(210) = {4127,4162}; +Line(211) = {4162,4161}; +Line(212) = {4161,4183}; +Line(213) = {4183,4160}; +Line(214) = {4160,4159}; +Line(215) = {4159,4126}; +Line(216) = {4126,4125}; +Line(217) = {4125,4088}; +Line(218) = {4088,4087}; +Line(219) = {4087,4033}; +Line(220) = {4033,4032}; +Line(221) = {4032,4031}; +Line(222) = {4031,4086}; +Line(223) = {4086,4085}; +Line(224) = {4085,4124}; +Line(225) = {4124,4123}; +Line(226) = {4123,4158}; +Line(227) = {4158,4157}; +Line(228) = {4157,4156}; +Line(229) = {4156,4122}; +Line(230) = {4122,4121}; +Line(231) = {4121,4081}; +Line(232) = {4081,4080}; +Line(233) = {4080,4020}; +Line(234) = {4020,4019}; +Line(235) = {4019,4018}; +Line(236) = {4018,4143}; +Line(237) = {4143,4118}; +Line(238) = {4118,4022}; +Line(239) = {4022,4016}; +Line(240) = {4016,4015}; +Line(241) = {4015,4011}; +Line(242) = {4011,4010}; +Line(243) = {4010,4009}; +Line(244) = {4009,4219}; +Line(245) = {4219,4177}; +Line(246) = {4177,4176}; +Line(247) = {4176,4149}; +Line(248) = {4149,4059}; +Line(249) = {4059,4058}; +Line(250) = {4058,4055}; +Line(251) = {4055,4113}; +Line(252) = {4113,4110}; +Line(253) = {4110,4213}; +Line(254) = {4213,4210}; +Line(255) = {4210,4217}; +Line(256) = {4217,4006}; +Line(257) = {4006,4218}; +Line(258) = {4218,4211}; +Line(259) = {4211,4212}; +Line(260) = {4212,4111}; +Line(261) = {4111,4112}; +Line(262) = {4112,4056}; +Line(263) = {4056,4057}; +Line(264) = {4057,4060}; +Line(265) = {4060,4148}; +Line(266) = {4148,4150}; +Line(267) = {4150,4208}; +Line(268) = {4208,4209}; +Line(269) = {4209,4215}; +Line(270) = {4215,4216}; +Line(271) = {4216,4220}; +Line(272) = {4220,4012}; +Line(273) = {4012,4013}; +Line(274) = {4013,4014}; +Line(275) = {4014,4017}; +Line(276) = {4017,4021}; +Line(277) = {4021,4023}; +Line(278) = {4023,4117}; +Line(279) = {4117,4082}; +Line(280) = {4082,4083}; +Line(281) = {4083,4024}; +Line(282) = {4024,4025}; +Line(283) = {4025,4007}; +Line(284) = {4007,4026}; +Line(285) = {4026,4027}; +Line(286) = {4027,4028}; +Line(287) = {4028,4029}; +Line(288) = {4029,4008}; +Line(289) = {4008,4030}; +Line(290) = {4030,4084}; +Line(291) = {4084,4194}; +Line(292) = {4194,4195}; +Line(293) = {4195,4154}; +Line(294) = {4154,4155}; +Line(295) = {4155,4119}; +Line(296) = {4119,4120}; +Line(297) = {4120,4089}; +Line(298) = {4089,4090}; +Line(299) = {4090,4034}; +Line(300) = {4034,4035}; +Line(301) = {4035,4036}; +Line(302) = {4036,4144}; +Line(303) = {4144,4192}; +Line(304) = {4192,4193}; +Line(305) = {4193,4184}; +Line(306) = {4184,4185}; +Line(307) = {4185,4168}; +Line(308) = {4168,4169}; +Line(309) = {4169,4135}; +Line(310) = {4135,4136}; +Line(311) = {4136,4101}; +Line(312) = {4101,4102}; +Line(313) = {4102,4049}; +Line(314) = {4049,4050}; +Line(315) = {4050,4051}; +Line(316) = {4051,4103}; +Line(317) = {4103,4104}; +Line(318) = {4104,4137}; +Line(319) = {4137,4138}; +Line(320) = {4138,4170}; +Line(321) = {4170,4171}; +Line(322) = {4171,4186}; +Line(323) = {4186,4172}; +Line(324) = {4172,4173}; +Line(325) = {4173,4139}; +Line(326) = {4139,4140}; +Line(327) = {4140,4105}; +Line(328) = {4105,4106}; +Line(329) = {4106,4052}; +Line(330) = {4052,4053}; +Line(331) = {4053,4054}; +Line(332) = {4054,4107}; +Line(333) = {4107,4108}; +Line(334) = {4108,4141}; +Line(335) = {4141,4142}; +Line(336) = {4142,4174}; +Line(337) = {4174,4175}; +Line(338) = {4175,4187}; +Line(339) = {4187,4188}; +Line(340) = {4188,4145}; +Line(341) = {4145,4046}; +Line(342) = {4046,4047}; +Line(343) = {4047,4048}; +Line(344) = {4048,4196}; +Line(345) = {4196,4197}; +Line(346) = {4197,4198}; +Line(347) = {4198,4189}; +Line(348) = {4189,4190}; +Line(349) = {4190,4214}; +Line(350) = {4214,4181}; +Line(351) = {4181,4182}; +Line(352) = {4182,4151}; +Line(353) = {4151,4152}; +Line(354) = {4152,4064}; +Line(355) = {4064,4065}; +Line(356) = {4065,4066}; +Line(357) = {4066,4205}; +Line(358) = {4205,4206}; +Line(359) = {4206,4207}; +Line(360) = {4207,4072}; +Line(361) = {4072,4074}; +Line(362) = {4074,4073}; +Line(363) = {4073,4076}; +Line(364) = {4076,4075}; +Line(365) = {4075,4079}; +Line(366) = {4079,4078}; +Line(367) = {4078,4077}; +Line(368) = {4077,4068}; +Line(369) = {4068,4067}; +Line(370) = {4067,4069}; +Line(371) = {4069,4070}; +Line(372) = {4070,4071}; +Line(373) = {4071,4115}; +Line(374) = {4115,4116}; +Line(375) = {4116,4204}; +Line(376) = {4204,4063}; +Line(377) = {11,2233}; +Line(378) = {2233,5}; +Line(379) = {5,2236}; +Line(380) = {2236,14}; +Line(381) = {14,2}; +Line(382) = {2,15}; +Line(383) = {15,2301}; +Line(384) = {2301,6}; +Line(385) = {6,2304}; +Line(386) = {2304,18}; +Line(387) = {18,3}; +Line(388) = {3,19}; +Line(389) = {19,2240}; +Line(390) = {2240,7}; +Line(391) = {7,2243}; +Line(392) = {2243,22}; +Line(393) = {22,4}; +Line(394) = {4,23}; +Line(395) = {23,2317}; +Line(396) = {2317,8}; +Line(397) = {8,2297}; +Line(398) = {2297,10}; +Line(399) = {10,1}; +Line(400) = {1,11}; +Line(401) = {4298,4297}; +Line(402) = {4297,4222}; +Line(403) = {4222,4250}; +Line(404) = {4250,4252}; +Line(405) = {4252,4221}; +Line(406) = {4221,4251}; +Line(407) = {4251,4299}; +Line(408) = {4299,4335}; +Line(409) = {4335,4337}; +Line(410) = {4337,4267}; +Line(411) = {4267,4294}; +Line(412) = {4294,4269}; +Line(413) = {4269,4233}; +Line(414) = {4233,4234}; +Line(415) = {4234,4273}; +Line(416) = {4273,4293}; +Line(417) = {4293,4314}; +Line(418) = {4314,4317}; +Line(419) = {4317,4318}; +Line(420) = {4318,4274}; +Line(421) = {4274,4235}; +Line(422) = {4235,4236}; +Line(423) = {4236,4237}; +Line(424) = {4237,4301}; +Line(425) = {4301,4319}; +Line(426) = {4319,4321}; +Line(427) = {4321,4320}; +Line(428) = {4320,4322}; +Line(429) = {4322,4347}; +Line(430) = {4347,4323}; +Line(431) = {4323,4324}; +Line(432) = {4324,4325}; +Line(433) = {4325,4276}; +Line(434) = {4276,4238}; +Line(435) = {4238,4240}; +Line(436) = {4240,4239}; +Line(437) = {4239,4241}; +Line(438) = {4241,4277}; +Line(439) = {4277,4326}; +Line(440) = {4326,4327}; +Line(441) = {4327,4328}; +Line(442) = {4328,4350}; +Line(443) = {4350,4348}; +Line(444) = {4348,4349}; +Line(445) = {4349,4332}; +Line(446) = {4332,4333}; +Line(447) = {4333,4334}; +Line(448) = {4334,4278}; +Line(449) = {4278,4247}; +Line(450) = {4247,4248}; +Line(451) = {4248,4249}; +Line(452) = {4249,4282}; +Line(453) = {4282,4283}; +Line(454) = {4283,4341}; +Line(455) = {4341,4342}; +Line(456) = {4342,4343}; +Line(457) = {4343,4289}; +Line(458) = {4289,4290}; +Line(459) = {4290,4286}; +Line(460) = {4286,4255}; +Line(461) = {4255,4257}; +Line(462) = {4257,4256}; +Line(463) = {4256,4346}; +Line(464) = {4346,4288}; +Line(465) = {4288,4287}; +Line(466) = {4287,4260}; +Line(467) = {4260,4259}; +Line(468) = {4259,4258}; +Line(469) = {4258,4262}; +Line(470) = {4262,4261}; +Line(471) = {4261,4264}; +Line(472) = {4264,4263}; +Line(473) = {4263,4265}; +Line(474) = {4265,4266}; +Line(475) = {4266,4303}; +Line(476) = {4303,4302}; +Line(477) = {4302,4304}; +Line(478) = {4304,4305}; +Line(479) = {4305,4306}; +Line(480) = {4306,4307}; +Line(481) = {4307,4308}; +Line(482) = {4308,4309}; +Line(483) = {4309,4345}; +Line(484) = {4345,4344}; +Line(485) = {4344,4254}; +Line(486) = {4254,4253}; +Line(487) = {4253,4285}; +Line(488) = {4285,4284}; +Line(489) = {4284,4340}; +Line(490) = {4340,4339}; +Line(491) = {4339,4338}; +Line(492) = {4338,4246}; +Line(493) = {4246,4245}; +Line(494) = {4245,4281}; +Line(495) = {4281,4280}; +Line(496) = {4280,4279}; +Line(497) = {4279,4244}; +Line(498) = {4244,4243}; +Line(499) = {4243,4242}; +Line(500) = {4242,4296}; +Line(501) = {4296,4295}; +Line(502) = {4295,4300}; +Line(503) = {4300,4330}; +Line(504) = {4330,4331}; +Line(505) = {4331,4329}; +Line(506) = {4329,4232}; +Line(507) = {4232,4231}; +Line(508) = {4231,4230}; +Line(509) = {4230,4229}; +Line(510) = {4229,4228}; +Line(511) = {4228,4227}; +Line(512) = {4227,4225}; +Line(513) = {4225,4226}; +Line(514) = {4226,4312}; +Line(515) = {4312,4223}; +Line(516) = {4223,4224}; +Line(517) = {4224,4311}; +Line(518) = {4311,4310}; +Line(519) = {4310,4275}; +Line(520) = {4275,4316}; +Line(521) = {4316,4315}; +Line(522) = {4315,4313}; +Line(523) = {4313,4292}; +Line(524) = {4292,4272}; +Line(525) = {4272,4271}; +Line(526) = {4271,4270}; +Line(527) = {4270,4268}; +Line(528) = {4268,4291}; +Line(529) = {4291,4336}; +Line(530) = {4336,4298}; +Line Loop(531) = {384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,377,378,379,380,381,382,383}; +Line Loop(532) = {316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315}; +Line Loop(533) = {446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445}; +Line Loop(534) = {41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40}; +Plane Surface(535) = {531,532,534,533}; diff --git a/lib/Makefile b/lib/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..c5ac5c361ae4c3839c4841910d05ea92f209a607 --- /dev/null +++ b/lib/Makefile @@ -0,0 +1,4 @@ + +clean: + $(RM) $(RMFLAGS) *.a + diff --git a/utils/Makefile b/utils/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..ef5b3ac5ec7ccde43d8cba88540605c9d1549d63 --- /dev/null +++ b/utils/Makefile @@ -0,0 +1,17 @@ +# $Id: Makefile,v 1.1.1.1 2000-11-23 09:22:48 geuzaine Exp $ + +CC = c++ +C_FLAGS = -g + +RM = rm +RMFLAGS = -f + +dxf2geo: dxf2geo.c message.c + $(CC) $(C_FLAGS) -o ../bin/dxf2geo -I../DataStr\ + dxf2geo.c message.c ../lib/libDataStr.a -lm + +clean: + $(RM) $(RMFLAGS) *.o + +depend: + true diff --git a/utils/build_machines b/utils/build_machines new file mode 100644 index 0000000000000000000000000000000000000000..b42871ea38e3a058bab20cce555fc7e7aa589088 --- /dev/null +++ b/utils/build_machines @@ -0,0 +1,13 @@ +TRU64 elap53.montefiore.ulg.ac.be +Linux elap21.montefiore.ulg.ac.be +IRIX elap20.montefiore.ulg.ac.be +SunOS montef01.montefiore.ulg.ac.be +HP-UX stokes.ltas.ulg.ac.be +AIX sp2s.ulg.ac.be + + +Where to change the version number? +1) Makfile +2) utils/gmsh.spec (2 occurrences) +3) doc/gmsh.1 (2 occurrences) + diff --git a/utils/dxf2geo.c b/utils/dxf2geo.c new file mode 100644 index 0000000000000000000000000000000000000000..c0d5254fad9add8d44a9fd9a05e6090e8a9fe17e --- /dev/null +++ b/utils/dxf2geo.c @@ -0,0 +1,439 @@ +/* $Id: dxf2geo.c,v 1.1.1.1 2000-11-23 09:22:48 geuzaine Exp $ */ + +/* + AutoCAD DXF to Gmsh GEO Data File Converter + + This is a hack from the DXF to DKB translator by Aaron A. Collins (8/13/90) + + Christophe.Geuzaine@AdValvas.be +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> +#include "Tree.h" + +#define DEG2RAD 3.14159265359/180. +#define BUFSIZE 2048 +#define GEOLINE 1 +#define GEOCIRCLE 2 + +FILE *infile, *outfile; +char inname[80], outname[80], curobj[80], linbuf[BUFSIZE]; +long primitives = 0L, degenerates = 0L; +int groupcode, curcolor, ints[10], nump=1 , numc=1; +float curthick, xcoords[10], ycoords[10], zcoords[10], floats[10], angles[10]; +float max_x, max_y, max_z, min_x, min_y, min_z ; +float THETOL, THEROT=0., THETRANSX=0., THETRANSY=0. ; +Tree_T *Point_T, *Curve_T ; + +struct Point { + int num ; + float x,y,z ; +} ; + +int fcmpPoint (const void *a, const void *b){ + struct Point *q,*w; + + q = (struct Point*)a; + w = (struct Point*)b; + + if(fabs(q->x - w->x) < THETOL && + fabs(q->y - w->y) < THETOL && + fabs(q->x - w->x) < THETOL) return 0; + + if(q->x > w->x) return(1); + if(q->x < w->x) return(-1); + if(q->y > w->y) return(1); + if(q->y < w->y) return(-1); + if(q->z > w->z) return(1); + if(q->z < w->z) return(-1); +} + +int addpoint(struct Point *p){ + struct Point *pp ; + + if((pp = (struct Point*)Tree_PQuery(Point_T, p))) + return pp->num ; + + p->num = nump++ ; + Tree_Add(Point_T, p) ; + return p->num ; +} + +void writepoint(void *a, void *b){ + struct Point *p ; + float x, y ; + + p = (struct Point *) a ; + + x = p->x ; + y = p->y ; + + p->x = cos(-THEROT*DEG2RAD) * x + sin(-THEROT*DEG2RAD) * y ; + p->y = -sin(-THEROT*DEG2RAD) * x + cos(-THEROT*DEG2RAD) * y; + + p->x += THETRANSX ; + p->y += THETRANSY ; + + fprintf(outfile, "Point (%d) = {%g *u, %g *u, %g *u, lc} ;\n", + p->num, p->x, p->y, p->z) ; +} + +struct Curve { + int num, type, a, b, c ; +} ; + +int fcmpCurve (const void *a, const void *b){ + struct Curve *q,*w; + + q = (struct Curve*)a; + w = (struct Curve*)b; + + if(q->num < w->num) return(-1); + return(1); +} + +void addcurve(struct Curve *c){ + c->num = numc++ ; + Tree_Add(Curve_T, c) ; +} + +void writecurve(void *a, void *b){ + struct Curve *c ; + + c = (struct Curve *) a ; + + switch(c->type){ + case GEOLINE : + fprintf(outfile, "Line (%d) = {%d, %d} ;\n", + c->num, c->a, c->b) ; + break ; + case GEOCIRCLE : + fprintf(outfile, "Circle (%d) = {%d, %d, %d} ;\n", + c->num, c->a, c->b, c->c) ; + break ; + } +} + + + + + +int checkdegen(int a, int b, int c){ /* check for degenerate triangle structure */ + if ( (xcoords[a] == xcoords[b] && + ycoords[a] == ycoords[b] && + zcoords[a] == zcoords[b]) || + (xcoords[b] == xcoords[c] && + ycoords[b] == ycoords[c] && + zcoords[b] == zcoords[c]) || + (xcoords[a] == xcoords[c] && + ycoords[a] == ycoords[c] && + zcoords[a] == zcoords[c]) ) + return(1); + return(0); +} + +void addobj(void){ /* dump out current object we should have all info on */ + struct Point p, *pp ; + struct Curve c ; + int num[10]; + float tmp ; + + if (strstr(curobj, "POINT")){ + p.x = xcoords[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; addpoint(&p) ; + } + else if (strstr(curobj, "LINE") || strstr(curobj, "3DLINE")){ + if (xcoords[0] == xcoords[1] && ycoords[0] == ycoords[1] && zcoords[0] == zcoords[1]){ + degenerates++; + return; + } + p.x = xcoords[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; num[0] = addpoint(&p) ; + p.x = xcoords[1] ; p.y = ycoords[1] ; p.z = zcoords[1] ; num[1] = addpoint(&p) ; + c.type = GEOLINE ; c.a = num[0] ; c.b = num[1] ; addcurve(&c) ; + } + else if (strstr(curobj, "CIRCLE")){ + p.x = xcoords[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; num[0] = addpoint(&p) ; + p.x = xcoords[0]-floats[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; + num[1] = addpoint(&p) ; + p.x = xcoords[0]+floats[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; + num[2] = addpoint(&p) ; + p.x = xcoords[0] ; p.y = ycoords[0]-floats[0] ; p.z = zcoords[0] ; + num[3] = addpoint(&p) ; + p.x = xcoords[0] ; p.y = ycoords[0]+floats[0] ; p.z = zcoords[0] ; + num[4] = addpoint(&p) ; + c.type = GEOCIRCLE ; c.a = num[2] ; c.b = num[0] ; c.c = num[4]; addcurve(&c) ; + c.type = GEOCIRCLE ; c.a = num[4] ; c.b = num[0] ; c.c = num[1]; addcurve(&c) ; + c.type = GEOCIRCLE ; c.a = num[1] ; c.b = num[0] ; c.c = num[3]; addcurve(&c) ; + c.type = GEOCIRCLE ; c.a = num[3] ; c.b = num[0] ; c.c = num[2]; addcurve(&c) ; + } + else if (strstr(curobj, "ARC")){ + p.x = xcoords[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; num[0] = addpoint(&p) ; + + p.x = xcoords[0]+floats[0]*cos(angles[0]*DEG2RAD) ; + p.y = ycoords[0]+floats[0]*sin(angles[0]*DEG2RAD) ; + p.z = zcoords[0] ; num[1] = addpoint(&p) ; + + p.x = xcoords[0]+floats[0]*cos(angles[1]*DEG2RAD) ; + p.y = ycoords[0]+floats[0]*sin(angles[1]*DEG2RAD) ; + p.z = zcoords[0] ; num[2] = addpoint(&p) ; + + if((angles[1]-angles[0] > 0 && angles[1]-angles[0] < 180) || + (angles[1]-angles[0] < 0 && angles[1]-angles[0] < -180)){ + c.type = GEOCIRCLE ; c.a = num[1] ; c.b = num[0] ; c.c = num[2]; addcurve(&c) ; + } + else{ + if(angles[1]-angles[0] > 0){ + p.x = xcoords[0]+floats[0]*cos((angles[1]-angles[0])*0.5*DEG2RAD) ; + p.y = ycoords[0]+floats[0]*sin((angles[1]-angles[0])*0.5*DEG2RAD) ; + } + else{ + p.x = xcoords[0]+floats[0]*cos((angles[0]-angles[1])*0.5*DEG2RAD) ; + p.y = ycoords[0]+floats[0]*sin((angles[0]-angles[1])*0.5*DEG2RAD) ; + } + p.z = zcoords[0] ; num[3] = addpoint(&p) ; + c.type = GEOCIRCLE ; c.a = num[1] ; c.b = num[0] ; c.c = num[3]; addcurve(&c) ; + c.type = GEOCIRCLE ; c.a = num[3] ; c.b = num[0] ; c.c = num[2]; addcurve(&c) ; + } + } + else if (strstr(curobj, "TRACE")){ /* 2 back-to-back triangles */ + if (checkdegen(0, 1, 2)){ + degenerates++; + return; + } + /* add triangle 0, 1, 2 */ + + if (checkdegen(0, 3, 2)){ + degenerates++; + return; + } + /* add triangle 0 3 2 */ + } + else if (strstr(curobj, "SOLID")){ /* 1 or 2 triangles */ + if (checkdegen(0, 1, 2)){ + degenerates++; + return; + } + /* add triangle 0, 1, 2 */ + + if (xcoords[2] == xcoords[3] && ycoords[2] == ycoords[3] && zcoords[2] == zcoords[3]) + return; /* one triangle was enough... */ + + if (checkdegen(0, 3, 2)){ + degenerates++; + return; + } + /* add triangle 0 3 2 */ + } + else if (strstr(curobj, "TEXT")){ /* not implemented for now */ + } + else if (strstr(curobj, "SHAPE")){ /* these look very hard */ + } + else if (strstr(curobj, "BLOCK")){ /* these look very hard */ + } + else if (strstr(curobj, "ENDBLK")){ /* these look very hard */ + } + else if (strstr(curobj, "INSERT")){ /* these look very hard */ + } + else if (strstr(curobj, "ATTDEF")){ /* not implemented for now */ + } + else if (strstr(curobj, "ATTRIB")){ /* not implemented for now */ + } + else if (strstr(curobj, "POLYLINE")){ /* these look fairly hard */ + } + else if (strstr(curobj, "VERTEX")){ /* these look fairly hard */ + } + else if (strstr(curobj, "SEQEND")){ /* these look fairly hard */ + } + else if (strstr(curobj, "3DFACE")){ /* 1 or 2 triangles */ + if (checkdegen(0, 1, 2)){ + degenerates++; + return; + } + /* add triangle 0 1 2 */ + + if (xcoords[2] == xcoords[3] && ycoords[2] == ycoords[3] && zcoords[2] == zcoords[3]) + return; /* one triangle was enough... */ + + if (checkdegen(0, 3, 2)){ + degenerates++; + return; + } + /* add triangle 0 3 2 */ + } + else if (strstr(curobj, "DIMENSION")){ /* not implemented for now */ + } + +} + +int getline(void){ /* read a group code and the next line from infile */ + fgets(linbuf, BUFSIZE, infile); /* get a line from .DXF */ + if (feof(infile)) + return(1); + sscanf(linbuf, "%3d", &groupcode); /* scan out group code */ + fgets(linbuf, BUFSIZE, infile); /* get a line from .DXF */ + if (feof(infile)) + return(1); + return(0); +} + + + +int main(int argc, char *argv[]){ + char *index; + + printf("dxf2geo, an AutoCad DXF to Gmsh GEO file translator\n"); + if (argc < 3){ + printf("Usage: %s infile[.dxf] tol [rot] [xtrans] [ytrans]\n", argv[0]); + exit(1); + } + + THETOL = atof(argv[2]) ; + if(argc > 3) THEROT = atof(argv[3]) ; + if(argc > 4) THETRANSX = atof(argv[4]) ; + if(argc > 5) THETRANSY = atof(argv[5]) ; + + strcpy(inname, argv[1]); /* make copy we can mess with */ + if (!strchr(inname, '.')) /* no dot present in filename? */ + strcat(inname, ".dxf"); + if (!(infile = fopen(inname, "r"))){ + printf("Cannot open input file %s\n", inname); + exit(1); + } + strcpy(outname, inname); + index = strchr(outname, '.'); /* find the dot */ + strcpy(index, ".geo"); /* make new ext. .geo... */ + + if (!(outfile = fopen(outname, "w"))){ + printf("Cannot create output file %s\n", outname); + fclose(infile); + exit(1); + } + + curobj[0] = '\0'; /* not working on any object currently */ + curcolor = 7; /* and it also doesn't have a color yet... */ + max_x = max_y = max_z = -10000000.0; /* init bounding limits */ + min_x = min_y = min_z = 10000000.0; + + Point_T = Tree_Create(sizeof(struct Point), fcmpPoint) ; + Curve_T = Tree_Create(sizeof(struct Curve), fcmpCurve) ; + +find: + while (!feof(infile)){ /* run file up to the "ENTITIES" section */ + if (getline()) goto stopit; + if (groupcode == 0){ /* file section mark */ + if (strstr(linbuf, "EOF")) goto stopit; + if (strstr(linbuf, "SECTION")){ + if (getline()) goto stopit; + if (groupcode != 2) continue; + if (strstr(linbuf, "ENTITIES")) break; + } + } + } + + while (!feof(infile)){ /* scan ENTITIES section */ + if (getline()) /* get a group code and a line */ + break; + if (groupcode < 10){ /* cardinal group codes */ + switch(groupcode){ + case 0: /* start of entity, table, file sep */ + if (strstr(linbuf, "EOF")){ + addobj(); /* dump object */ + goto stopit; + } + if (strstr(linbuf, "ENDSEC")){ + addobj(); /* dump object */ + goto find; + } + addobj(); /* dump old object */ + curobj[0] = '\0'; /* reset object */ + curcolor = 7; + strcpy(curobj, linbuf); /* get new */ + break; + case 1: /* primary text value for entity (?)*/ + break; + case 2: /* block name, attribute tag, etc */ + case 3: /* other names */ + case 4: + break; + case 5: /* entity handle (hex string) */ + break; + case 6: /* line type name */ + break; + case 7: /* text style name */ + break; + case 8: /* layer name */ + break; + case 9: /* variable name ID (only in header)*/ + break; + } + } + else if (groupcode >= 10 && groupcode < 19){ /* Some X coord */ + sscanf(linbuf, "%f", &(xcoords[groupcode-10])); + if (xcoords[groupcode-10] > max_x) + max_x = xcoords[groupcode-10]; + if (xcoords[groupcode-10] < min_x) + min_x = xcoords[groupcode-10]; + } + else if (groupcode >= 20 && groupcode < 29){ /* Some Y coord */ + sscanf(linbuf, "%f", &(ycoords[groupcode-20])); + if (ycoords[groupcode-20] > max_y) + max_y = ycoords[groupcode-20]; + if (ycoords[groupcode-20] < min_y) + min_y = ycoords[groupcode-20]; + } + else if (groupcode >= 30 && groupcode < 38){ /* Some Z coord */ + sscanf(linbuf, "%f", &(zcoords[groupcode-30])); + if (zcoords[groupcode-30] > max_z) + max_z = zcoords[groupcode-30]; + if (zcoords[groupcode-30] < min_z) + min_z = zcoords[groupcode-30]; + } + else if (groupcode == 38){ /* entity elevation if nonzero */ + } + else if (groupcode == 39){ /* entity thickness if nonzero */ + } + else if (groupcode >= 40 && groupcode < 49){ /* misc floats */ + sscanf(linbuf, "%f", &(floats[groupcode-40])); + } + else if (groupcode == 49){ /* repeated value groups */ + } + else if (groupcode >= 50 && groupcode < 59){ /* misc angles */ + sscanf(linbuf, "%f", &(angles[groupcode-50])); + } + else if (groupcode == 62){ /* Color number */ + sscanf(linbuf, "%6d", &curcolor); + } + else if (groupcode == 66){ /* "entities follow" flag */ + } + else if (groupcode >= 70 && groupcode < 79){ /* misc ints */ + sscanf(linbuf, "%f", &(ints[groupcode-70])); + } + else if (groupcode == 210 || groupcode == 220 || groupcode == 230){ + /* X, Y, Z components of extrusion direction */ + } + } + +stopit: + fclose(infile); + fprintf(outfile, "/* Converted from AutoCad DXF file: %s */\n", inname); + fprintf(outfile, "/* Tolerance %g: %d points / %d curves */\n\n", + THETOL, Tree_Nbr(Point_T), Tree_Nbr(Curve_T)); + fprintf(outfile, "u = 1; \nlc = 1 ;\n\n"); + Tree_Action(Point_T, writepoint); + fprintf(outfile, "\n"); + Tree_Action(Curve_T, writecurve); + fprintf(outfile, "\n"); + fflush(outfile); + fclose(outfile); + printf("bounding box [%g,%g] [%g,%g] [%g,%g]\n", + min_x, max_x, min_y, max_y, min_z, max_z); + printf("tolerance %g: %d points / %d curves / %d degenerate entities removed\n", + THETOL, Tree_Nbr(Point_T), Tree_Nbr(Curve_T), degenerates); + Tree_Delete(Point_T) ; + Tree_Delete(Curve_T) ; + exit(0); + +} + diff --git a/utils/endian.c b/utils/endian.c new file mode 100644 index 0000000000000000000000000000000000000000..25ec8d9037fe1ba5d1a5634d3cc9d57d7fef0c48 --- /dev/null +++ b/utils/endian.c @@ -0,0 +1,21 @@ + +/* Are we little or big endian? From Harbison&Steele. */ + +main () { + union{ + long l; + char c[sizeof (long)]; + } u; + + u.l = 1; + if (u.c[0] == 1) + printf ("LittleEndian\n"); + else if (u.c[sizeof (long) - 1] == 1) + printf ("BigEndian\n"); + else + printf ("unknownEndian"); + + exit (u.c[sizeof (long) - 1] == 1); +} + + diff --git a/utils/gmsh.spec b/utils/gmsh.spec new file mode 100644 index 0000000000000000000000000000000000000000..27b458734bbdcb31464df78da464e24ae4d342ea --- /dev/null +++ b/utils/gmsh.spec @@ -0,0 +1,55 @@ +Summary: A 3D mesh generator with pre- and post-processing facilities +Name: gmsh +Version: 0.995 +Source: gmsh-0.995.tar.gz +Release: 1 +Copyright: distributable +Group: Applications/Engineering +URL: http://www.geuz.org/gmsh/ +Packager: Christophe.Geuzaine@AdValvas.be +Buildroot: /var/tmp/%{name}-buildroot +Requires: Mesa >= 3.0 lesstif >= 0.90 + +%description +Gmsh is an automatic three-dimensional mesh generator, primarily +Delaunay, with pre- and post-processing facilities. Its primal goal is +to provide a simple meshing tool for academic test cases with +parametric input and up to date visualization capabilities. One of +the strengths of Gmsh is its ability to respect a characteristic +length field for the generation of adapted meshes on lines, surfaces +and volumes. Gmsh requires the Mesa and Lesstif libraries to be +installed on your system. + +Install Gmsh if you need a simple 3D finite element mesh generator. + +%prep + +%setup -c -q + +%build +make linux +mv bin/gmsh-Linux bin/gmsh +make utils + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/usr/bin +mkdir -p $RPM_BUILD_ROOT/usr/man/man1 + +install -m 755 bin/gmsh $RPM_BUILD_ROOT/usr/bin/gmsh +install -m 755 bin/dxf2geo $RPM_BUILD_ROOT/usr/bin/dxf2geo +install -m 644 doc/gmsh.1 $RPM_BUILD_ROOT/usr/man/man1/gmsh.1 + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) +%doc demos/ex* demos/view* +/usr/bin/gmsh +/usr/bin/dxf2geo +/usr/man/man1/gmsh* + +%changelog +* Sat Sep 23 2000 Christophe Geuzaine <Christophe.Geuzaine@AdValvas.be> + - initial revision diff --git a/utils/message.c b/utils/message.c new file mode 100644 index 0000000000000000000000000000000000000000..9b12df3b8fa3211a07a6453ed2710ca4f7126d4e --- /dev/null +++ b/utils/message.c @@ -0,0 +1,13 @@ + +#include <stdlib.h> +#include <stdio.h> +#include <signal.h> +#include <stdarg.h> + +void Msg(int level, char *fmt, ...){ + va_list args; + va_start (args, fmt); + vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); + va_end (args); +} + diff --git a/utils/modifs b/utils/modifs new file mode 100644 index 0000000000000000000000000000000000000000..572ca5a9badba4c54daf04a6139d6766d886320e --- /dev/null +++ b/utils/modifs @@ -0,0 +1,22 @@ +#! /bin/csh -f + +if ( "$#argv" < "1" ) then + echo usage: modif number_of_days + exit +endif + +find . \( -mtime -$1 -a ! -type d -a ! -name "*.o" -a ! -name "*.a" -a ! -name "*.bak" -a ! -name "*.tar*" -a ! -name "*~" -a ! -name "gmsh*" \) + +echo "archiver ? (y/n)" +set caca = "$<" + +if ("$caca" == "y") then + set liste = `find . \( -mtime -$1 -a ! -type d -a ! -name "*.o" -a ! -name "*.a" -a ! -name "*.bak" -a ! -name "*.tar*" -a ! -name "*~" -a ! -name "gmsh*" \)` + set date = `date "+%d.%m.%y-%Hh%M"` + tar cvf modifs-gmsh-$date.tar $liste + gzip modifs-gmsh-$date.tar +else + echo "bye" +endif + + diff --git a/utils/replace b/utils/replace new file mode 100644 index 0000000000000000000000000000000000000000..6186bebf0b62585e0ee5bd6717ccc1ae40c9e77c --- /dev/null +++ b/utils/replace @@ -0,0 +1,8 @@ +#!/bin/bash - + +for A in $* +do +sed "s/msh_include/msh_Include/g" $A > $A.XXX +/bin/rm -f $A +mv $A.XXX $A +done