hypre/examples/vis.c

237 lines
6.4 KiB
C

/* Save a structured n x n mesh of square elements on the unit square into a
GLVis mesh file with the given name. */
void GLVis_PrintGlobalSquareMesh(const char *meshfile, int n)
{
FILE *file;
int Dim = 2;
int NumOfVertices = (n+1)*(n+1);
int NumOfElements = n*n;
int i, j;
double x, y;
double h = 1.0/n;
if ((file = fopen(meshfile, "w")) == NULL)
{
printf("Error: can't open output file %s\n", meshfile);
exit(1);
}
/* mesh header */
fprintf(file, "MFEM mesh v1.0\n");
fprintf(file, "\ndimension\n");
fprintf(file, "%d\n", Dim);
/* mesh elements */
fprintf(file, "\nelements\n");
fprintf(file, "%d\n", NumOfElements);
for (j = 0; j < n; j++)
for (i = 0; i < n; i++)
fprintf(file, "1 3 %d %d %d %d\n", i + j*(n+1), i + 1 +j*(n+1),
i + 1 + (j+1)*(n+1), i + (j+1)*(n+1));
/* boundary will be generated by GLVis */
fprintf(file, "\nboundary\n");
fprintf(file, "0\n");
/* mesh vertices */
fprintf(file, "\nvertices\n");
fprintf(file, "%d\n", NumOfVertices);
fprintf(file, "%d\n", Dim);
for (j = 0; j < n+1; j++)
for (i = 0; i < n+1; i++)
{
x = i*h;
y = j*h;
fprintf(file, "%.14e %.14e\n", x, y);
}
fflush(file);
fclose(file);
}
/* Save a structured nx x ny mesh of square elements of size h, globally
translated by (x0,y0), into a GLVis mesh file with the given prefix. */
void GLVis_PrintLocalSquareMesh(const char *meshfile_prefix, int nx, int ny,
double h, double x0, double y0, int myid)
{
FILE *file;
char meshfile[255];
int Dim = 2;
int NumOfVertices = (nx+1)*(ny+1);
int NumOfElements = nx*ny;
int i, j;
double x, y;
sprintf(meshfile, "%s.%06d", meshfile_prefix, myid);
if ((file = fopen(meshfile, "w")) == NULL)
{
printf("Error: can't open output file %s\n", meshfile);
exit(1);
}
/* mesh header */
fprintf(file, "MFEM mesh v1.0\n");
fprintf(file, "\ndimension\n");
fprintf(file, "%d\n", Dim);
/* mesh elements */
fprintf(file, "\nelements\n");
fprintf(file, "%d\n", NumOfElements);
for (j = 0; j < ny; j++)
for (i = 0; i < nx; i++)
fprintf(file, "1 3 %d %d %d %d\n", i + j*(nx+1), i + 1 +j*(nx+1),
i + 1 + (j+1)*(nx+1), i + (j+1)*(nx+1));
/* boundary will be generated by GLVis */
fprintf(file, "\nboundary\n");
fprintf(file, "0\n");
/* mesh vertices */
fprintf(file, "\nvertices\n");
fprintf(file, "%d\n", NumOfVertices);
fprintf(file, "%d\n", Dim);
for (j = 0; j < ny+1; j++)
for (i = 0; i < nx+1; i++)
{
x = x0+i*h;
y = y0+j*h;
fprintf(file, "%.14e %.14e\n", x, y);
}
fflush(file);
fclose(file);
}
/* Save a structured n x n mesh of gamma-angled rhombuses, globally rotated by
angle gamma*myid, into a GLVis mesh file with the given prefix. */
void GLVis_PrintLocalRhombusMesh(const char *meshfile_prefix,
int n, int myid, double gamma)
{
FILE *file;
char meshfile[255];
int Dim = 2;
int NumOfVertices = (n+1)*(n+1);
int NumOfElements = n*n;
int i, j;
double x, y;
double h = 1.0/n;
double rho = gamma*myid;
double sg = sin(gamma);
double cg = cos(gamma);
double sr = sin(rho);
double cr = cos(rho);
sprintf(meshfile, "%s.%06d", meshfile_prefix, myid);
if ((file = fopen(meshfile, "w")) == NULL)
{
printf("Error: can't open output file %s\n", meshfile);
exit(1);
}
/* mesh header */
fprintf(file, "MFEM mesh v1.0\n");
fprintf(file, "\ndimension\n");
fprintf(file, "%d\n", Dim);
/* mesh elements */
fprintf(file, "\nelements\n");
fprintf(file, "%d\n", NumOfElements);
for (j = 0; j < n; j++)
for (i = 0; i < n; i++)
fprintf(file, "1 3 %d %d %d %d\n", i + j*(n+1), i + 1 +j*(n+1),
i + 1 + (j+1)*(n+1), i + (j+1)*(n+1));
/* boundary will be generated by GLVis */
fprintf(file, "\nboundary\n");
fprintf(file, "0\n");
/* mesh vertices */
fprintf(file, "\nvertices\n");
fprintf(file, "%d\n", NumOfVertices);
fprintf(file, "%d\n", Dim);
for (j = 0; j < n+1; j++)
for (i = 0; i < n+1; i++)
{
x = i*h + cg*j*h;
y = sg*j*h;
fprintf(file, "%.14e %.14e\n", cr*x - sr*y, sr*x + cr*y);
}
fflush(file);
fclose(file);
}
/* Save a structured nx x ny x nz mesh of cubic elements of size h, globally
translated by (x0,y0,z0), into a GLVis mesh file with the given prefix. */
void GLVis_PrintLocalCubicMesh(const char *meshfile_prefix,
int nx, int ny, int nz, double h,
double x0, double y0, double z0, int myid)
{
FILE *file;
char meshfile[255];
int Dim = 3;
int NumOfVertices = (nx+1)*(ny+1)*(nz+1);
int NumOfElements = nx*ny*nz;
int i, j, k;
double x, y, z;
sprintf(meshfile, "%s.%06d", meshfile_prefix, myid);
if ((file = fopen(meshfile, "w")) == NULL)
{
printf("Error: can't open output file %s\n", meshfile);
exit(1);
}
/* mesh header */
fprintf(file, "MFEM mesh v1.0\n");
fprintf(file, "\ndimension\n");
fprintf(file, "%d\n", Dim);
/* mesh elements */
fprintf(file, "\nelements\n");
fprintf(file, "%d\n", NumOfElements);
for (k = 0; k < nz; k++)
for (j = 0; j < ny; j++)
for (i = 0; i < nx; i++)
fprintf(file, "1 5 %d %d %d %d %d %d %d %d\n",
i + j*(nx+1) + k*(nx+1)*(ny+1),
i + 1 +j*(nx+1) + k*(nx+1)*(ny+1),
i + 1 + (j+1)*(nx+1) + k*(nx+1)*(ny+1),
i + (j+1)*(nx+1) + k*(nx+1)*(ny+1),
i + j*(nx+1) + (k+1)*(nx+1)*(ny+1),
i + 1 +j*(nx+1) + (k+1)*(nx+1)*(ny+1),
i + 1 + (j+1)*(nx+1) + (k+1)*(nx+1)*(ny+1),
i + (j+1)*(nx+1) + (k+1)*(nx+1)*(ny+1));
/* boundary will be generated by GLVis */
fprintf(file, "\nboundary\n");
fprintf(file, "0\n");
/* mesh vertices */
fprintf(file, "\nvertices\n");
fprintf(file, "%d\n", NumOfVertices);
fprintf(file, "%d\n", Dim);
for (k = 0; k < nz+1; k++)
for (j = 0; j < ny+1; j++)
for (i = 0; i < nx+1; i++)
{
x = x0+i*h;
y = y0+j*h;
z = z0+k*h;
fprintf(file, "%.14e %.14e %.14e\n", x, y, z);
}
fflush(file);
fclose(file);
}