📄 bin2ppm.c
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <getopt.h>#include "alloc.h"#include "datadef.h"#define max(x,y) (((x)>(y))?(x):(y))#define min(x,y) (((x)<(y))?(x):(y))void calc_psi_zeta(float **u, float **v, float **psi, float **zeta, char **flag, int imax, int jmax, float delx, float dely);static void print_usage(void);static void print_version(void);static void print_help(void);static char *progname;#define PACKAGE "bin2ppm"#define VERSION "1.0"/* Command line options */static struct option long_opts[] = { { "help", 0, NULL, 'h' }, { "infile", 1, NULL, 'i' }, { "outfile", 1, NULL, 'o' }, { "plot-psi", 0, NULL, 'p' }, { "plot-zeta", 0, NULL, 'z' }, { "version", 0, NULL, 'V' }, { "verbose", 1, NULL, 'v' }, { 0, 0, 0, 0 }};#define GETOPTS "hi:o:pv:Vz"/* Output modes */#define ZETA 0#define PSI 1int main(int argc, char **argv){ int i, j, imax, jmax; int outmode = ZETA, verbose = 1; float xlength, ylength; float zmax = -1e10, zmin = 1e10; float pmax = -1e10, pmin = 1e10; float umax = -1e10, umin = 1e10; float vmax = -1e10, vmin = 1e10; int show_help = 0, show_usage = 0, show_version = 0; char *infile = NULL, *outfile = NULL; FILE *fin = stdin, *fout = stdout; progname = argv[0]; int optc; while ((optc = getopt_long(argc, argv, GETOPTS, long_opts, NULL)) != -1) { switch (optc) { case 'h': show_help = 1; break; case 'V': show_version = 1; break; case 'v': verbose = atoi(optarg); break; case 'i': if (infile != NULL) { free(infile); } infile = strdup(optarg); break; case 'o': if (outfile != NULL) { free(outfile); } outfile = strdup(optarg); break; default: show_usage = 1; } } if (show_usage || optind < argc) { print_usage(); return 1; } if (show_version) { print_version(); if (!show_help) { return 0; } } if (show_help) { print_help(); return 0; } if (infile != NULL) { fin = fopen(infile, "rb"); if (!fin) { fprintf(stderr, "Could not open '%s'\n", infile); return 1; } } if (outfile != NULL) { fout = fopen(outfile, "wb"); if (!fout) { fprintf(stderr, "Could not open '%s'\n", outfile); return 1; } } fread(&imax, sizeof(int), 1, fin); fread(&jmax, sizeof(int), 1, fin); float **u = alloc_floatmatrix(imax+2, jmax+2); float **v = alloc_floatmatrix(imax+2, jmax+2); float **p = alloc_floatmatrix(imax+2, jmax+2); float **psi = alloc_floatmatrix(imax+2, jmax+2); float **zeta = alloc_floatmatrix(imax+2, jmax+2); char **flag = alloc_charmatrix(imax+2, jmax+2); if (!u || !v || !p || !psi || !zeta || !flag) { fprintf(stderr, "Couldn't allocate memory for matrices.\n"); return 1; } fread(&xlength, sizeof(float), 1, fin); fread(&ylength, sizeof(float), 1, fin); float delx = xlength/imax; float dely = ylength/jmax; if (verbose > 1) { printf("imax: %d\n", imax); printf("jmax: %d\n", jmax); printf("xlength: %g\n", xlength); printf("ylength: %g\n", ylength); } for (i = 0; i <= imax+2; i++) { fread(u[i], sizeof(float), jmax+2, fin); fread(v[i], sizeof(float), jmax+2, fin); fread(p[i], sizeof(float), jmax+2, fin); fread(flag[i], sizeof(char), jmax+2, fin); } calc_psi_zeta(u, v, psi, zeta, flag, imax, jmax, delx, dely); fprintf(fout, "P6 %d %d 255\n", imax, jmax); for (j = 1; j < jmax+1 ; j++) { for (i = 1; i < imax+1 ; i++) { int r, g, b; if (!(flag[i][j] & C_F)) { r = 0; b = 0; g = 255; } else { zmax = max(zmax, zeta[i][j]); zmin = min(zmin, zeta[i][j]); pmax = max(pmax, psi[i][j]); pmin = min(pmin, psi[i][j]); umax = max(umax, u[i][j]); umin = min(umin, u[i][j]); vmax = max(vmax, v[i][j]); vmin = min(vmin, v[i][j]); if (outmode == ZETA) { float z = (i < imax && j < jmax)?zeta[i][j]:0.0; r = g = b = pow(fabs(z/12.6),.4) * 255; } else if (outmode == PSI) { float p = (i < imax && j < jmax)?psi[i][j]:0.0; r = g = b = (p+3.0)/7.5 * 255; } } fprintf(fout, "%c%c%c", r, g, b); } } if (verbose > 0) { printf("u: % .5e -- % .5e\n", umin, umax); printf("v: % .5e -- % .5e\n", vmin, vmax); printf("psi: % .5e -- % .5e\n", pmin, pmax); printf("zeta: % .5e -- % .5e\n", zmin, zmax); } fclose(fin); fclose(fout); free_matrix(u); free_matrix(v); free_matrix(p); free_matrix(psi); free_matrix(zeta); free_matrix(flag); return 0;}/* Computation of stream function and vorticity */void calc_psi_zeta(float **u, float **v, float **psi, float **zeta, char **flag, int imax, int jmax, float delx, float dely){ int i, j; /* Computation of the vorticity zeta at the upper right corner */ /* of cell (i,j) (only if the corner is surrounded by fluid cells) */ for (i=1;i<=imax-1;i++) { for (j=1;j<=jmax-1;j++) { if ( (flag[i][j] & C_F) && (flag[i+1][j] & C_F) && (flag[i][j+1] & C_F) && (flag[i+1][j+1] & C_F)) { zeta[i][j] = (u[i][j+1]-u[i][j])/dely -(v[i+1][j]-v[i][j])/delx; } else { zeta[i][j] = 0.0; } } } /* Computation of the stream function at the upper right corner */ /* of cell (i,j) (only if bother lower cells are fluid cells) */ for (i=0;i<=imax;i++) { psi[i][0] = 0.0; for (j=1;j<=jmax;j++) { psi[i][j] = psi[i][j-1]; if ((flag[i][j] & C_F) || (flag[i+1][j] & C_F)) { psi[i][j] += u[i][j]*dely; } } }}static void print_usage(void){ fprintf(stderr, "Try '%s --help' for more information.\n", progname);}static void print_version(void){ fprintf(stderr, "%s %s\n", PACKAGE, VERSION);}static void print_help(void){ fprintf(stderr, "%s. Converts karman output into portable pixmaps.\n\n", PACKAGE); fprintf(stderr, "Usage: %s [OPTIONS]...\n\n", progname); fprintf(stderr, " -h, --help Print a summary of the options\n"); fprintf(stderr, " -V, --version Print the version number\n"); fprintf(stderr, " -v, --verbose=LEVEL Set the verbosity level. 0 is silent\n"); fprintf(stderr, " -i, --infile=FILE Read the simulation state from this file\n"); fprintf(stderr, " (defaults to standard input)\n"); fprintf(stderr, " -o, --outfile=FILE Write the image to this file\n"); fprintf(stderr, " (defaults to standard output)\n"); fprintf(stderr, " -p, --plot-psi Plot psi values in the image\n"); fprintf(stderr, " -z, --plot-zeta Plot zeta (vorticity) in the image\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -