📄 pmandel.cpp
字号:
#include <afx.h>//#include "PpmPgm.h"#include <stdlib.h>#include <stdio.h>#include <string.h>#include <windows.h>#include "mpi.h"#include "pmandel.h"#include "lists.h"#include "args.h"#include "pm_genproc.h"FILE *debug_file;MPI_Datatype winspecs_type, flags_type, NUM_type, rect_type;/* Forward refs */int SeparateRect_Master (MPE_XGraph graph, Winspecs *winspecs, Flags *flags);void SeparateRect_Slave (MPE_XGraph graph, Winspecs *winspecs, Flags *flags);int DrawImage (MPE_XGraph, Winspecs *, Flags *);int ProcessArgsFromFile (MPE_XGraph, Winspecs *, Flags *);int DragZoom (MPE_XGraph, Flags *);int main(int argc, char *argv[]){ int np, myid, myWindowOpened, allWindowsOpened; Winspecs winspecs; Flags flags; MPE_XGraph graph; try{ if (IsArgPresent(&argc, argv, "-h")) { PrintHelp(argv[0]); } if (IsArgPresent(&argc, argv, "-Stretch")) g_bNoStretch = false; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &np); if (np == 1) { fprintf(stderr, "\nmandle requires at least 2 processes (master + slaves)\n\n"); PrintHelp(argv[0]); MPI_Finalize(); return 1; } DefineMPITypes(); GetDefaultWinspecs(&winspecs); GetDefaultFlags(&winspecs, &flags); GetWinspecs(&argc, argv, &winspecs); GetFlags(&argc, argv, &winspecs, &flags); myWindowOpened = ( MPE_Open_graphics(&graph, MPI_COMM_WORLD, (char *)0, winspecs.xpos, winspecs.ypos, winspecs.width, winspecs.height, !myid) ==0); MPI_Allreduce(&myWindowOpened, &allWindowsOpened, 1, MPI_INT, MPI_LAND, MPI_COMM_WORLD); if (allWindowsOpened) { //printf("all windows opened\n");fflush(stdout); if (!winspecs.bw) { winspecs.colorArray = (MPE_Color *) malloc(winspecs.numColors * sizeof(MPE_Color)); MPE_Make_color_array(graph, winspecs.numColors, winspecs.colorArray); } //printf("calling DrawImage\n");fflush(stdout); int ret_val; ret_val = DrawImage(graph, &winspecs, &flags); //printf("back in main\n");fflush(stdout); MPI_Barrier(MPI_COMM_WORLD); //printf(".");fflush(stdout); if (!myid && (ret_val == FALSE)) { MPI_Status status; printf("done\n");fflush(stdout); MPI_Recv(0, 0, MPI_INT, 0, WINDOW_CLOSED, MPI_COMM_WORLD, &status); } /* if (!myid) { PpmPgm *ppm = new PpmPgm(graph.width, graph.height); //printf("copying data to ppm\n");fflush(stdout); for (int i=0; i<graph.width; i++) for (int j=0; j<graph.height; j++) ppm->SetPixel(i, j, graph.map[i + j*graph.width]); printf("writing output to file\n");fflush(stdout); CFile fout; TCHAR filename[100]; _stprintf(filename, TEXT("\\temp\\mandel%d.ppm"), myid); fout.Open(filename, CFile::modeCreate | CFile::modeReadWrite); ppm->Write(fout); fout.Close(); } //*/ //printf("closing graphics\n");fflush(stdout); MPE_Close_graphics(&graph); } else { if (!myid) { fprintf(stderr, "One or more processes could not connect\n"); fprintf(stderr, "to the display. Exiting.\n\n"); } if (myWindowOpened) MPE_Close_graphics(&graph); } //printf("Finalize\n");fflush(stdout); MPI_Finalize(); }catch(...) { printf("Exception thrown, exiting...\n"); } return 0;}int ProcessArgsFromFile(MPE_XGraph graph, Winspecs *winspecs, Flags *oldFlags){ Flags newFlags; char line[1025], *copy, *tok, **argv; int doOneMore, ndrawn, myid, argc; xpand_list_Strings *argList; FILE *inf; int ret_val = FALSE; MPI_Comm_rank(MPI_COMM_WORLD, &myid); if (myid == 0) { if (!oldFlags->inf || strcmp(oldFlags->inf, "-") == 0) { inf = stdin; } else { inf = fopen(oldFlags->inf, "r"); if (inf == NULL) { fprintf(stderr, "Sorry, could not open %s, skipping.\n", oldFlags->inf);fflush(stderr); doOneMore = 0; MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD); } } ndrawn = 0; while (inf && (oldFlags->loop || fgets(line, 1024, inf))) { if (oldFlags->loop && !fgets(line, 1024, inf)) { rewind(inf); fgets(line, 1024, inf); } if (*line!='#' && StrContainsNonWhiteSpace(line)) { /* skip blank lines and lines starting with # */ line[strlen(line) - 1] = 0; /* chop off trailing '\n' */ argList = Strings_CreateList(10); Strings_AddItem(argList, oldFlags->inf); tok = strtok(line, " \t"); while (tok) { copy = (char *) malloc(sizeof(char) * strlen(tok) + 1); strcpy(copy, tok); Strings_AddItem(argList, copy); tok = strtok((char *)0, " \t"); } newFlags = *oldFlags; newFlags.inf = (char *)0; newFlags.loop = 0; newFlags.zoom = 0; argc = ListSize(argList); argv = ListHeadPtr(argList); doOneMore = 1; //printf("-");fflush(stdout); MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD); GetFlags(&argc, argv, winspecs, &newFlags); if (DrawImage(graph, winspecs, &newFlags)) { inf = NULL; ret_val = TRUE; doOneMore = 0; //printf("-");fflush(stdout); MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD); //break; return TRUE; } } } doOneMore = 0; //printf("-");fflush(stdout); MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD); } else { //printf("-");fflush(stdout); MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD); argc = 0; argv = 0; while (doOneMore) { newFlags = *oldFlags; GetFlags(&argc, argv, winspecs, &newFlags); if (DrawImage(graph, winspecs, &newFlags)) { ret_val = TRUE; } //printf("-");fflush(stdout); MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD); } } return ret_val;}int DrawImage(MPE_XGraph graph, Winspecs *winspecs, Flags *flags){ int myid, drawAnother; MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Barrier(MPI_COMM_WORLD); /* helpful when starting up debuggers */ //printf("Entering DrawImage\n");fflush(stdout); if (flags->inf) { //printf("input file selected\n");fflush(stdout); int ret_val = ProcessArgsFromFile(graph, winspecs, flags); //printf("ret_val: %d\n", ret_val);fflush(stdout); return ret_val; } else { drawAnother = 0; do { MPE_INIT_LOG(); if (myid == 0) { MPE_Fill_rectangle(graph, 0, 0, winspecs->width, winspecs->height, MPE_BLACK); //MPE_WHITE); fprintf(stderr, "Drawing region -rmin %.17lf -imin %.17lf -rmax %.17lf -imax %.17lf\n", NUM2DBL(flags->rmin), NUM2DBL(flags-> imin), NUM2DBL(flags->rmax), NUM2DBL(flags-> imax)); fflush(stderr); if (SeparateRect_Master(graph, winspecs, flags)) { // Window closed MPI_Barrier(MPI_COMM_WORLD); return TRUE; } } else { SeparateRect_Slave(graph, winspecs, flags); } MPI_Barrier(MPI_COMM_WORLD); MPE_FINISH_LOG(flags->logfile); if (flags->zoom) { //drawAnother = DragZoom(graph, flags); drawAnother = 0; } else { Sleep(3000); MPI_Barrier(MPI_COMM_WORLD); } } while (drawAnother); } return FALSE;}/*int DragZoom(MPE_XGraph graph, Flags *flags){ int x1, y1, x2, y2, i, myid; NUM zx1, zy1, zx2, zy2; MPI_Comm_rank(MPI_COMM_WORLD, &myid); if (!myid) { printf("Ready for zoom rectangle"); MPE_Get_drag_region(graph, 1, MPE_DRAG_SQUARE, &x1, &y1, &x2, &y2); if (x1>x2) { i = x1; x1 = x2; x2 = i; } if (y1>y2) { i = y1; y1 = y2; y2 = i; } Pixel2Complex(flags, x1, y1, &zx1, &zy1); Pixel2Complex(flags, x2, y2, &zx2, &zy2); NUM_ASSIGN(flags->rmin, zx1); NUM_ASSIGN(flags->imin, zy2); NUM_ASSIGN(flags->rmax, zx2); NUM_ASSIGN(flags->imax, zy1); } MPI_Bcast(flags, 1, flags_type, 0, MPI_COMM_WORLD); return 1;}//*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -