⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pm_genproc.cpp

📁 mpi 结合vc编程用模拟退火法算一个最小路径的值
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "mpi.h"
//#include "mpe.h"
#include "pmandel.h"
#include "args.h"

/* I used the line:
gcc -P -E pm_genproc.c | sed 's/{[]*{/{@{/' | tr "@" "\n" | indent -st > pm_genproc_cleanedup.c
to clean this up and see what it looked like.  Eek!
*/

/* hope this doesn't cause anybody problems */
double drand48();

#define DISP(a, b) (int)((char *)(&(a)) - (char *)(&(b)))

int DefineMPITypes()
{
	Flags flags;
	rect rectangle;
	MPI_Aint a, b;
	
	int len[3];
	MPI_Aint disp[3];
	MPI_Datatype types[3];
	
	NUM_type = MPI_DOUBLE;
	
	MPI_Type_contiguous(6, MPI_INT, &winspecs_type);
	MPI_Type_commit(&winspecs_type);
	
	len[0] = 10;
	len[1] = 2;
	len[2] = 6;
	MPI_Address((void*)&flags.breakout, &a);
	MPI_Address((void*)&flags, &b);
	disp[0] = a - b;
	MPI_Address((void*)&flags.boundary_sq, &a);
	disp[1] = a - b;
	MPI_Address((void*)&flags.rmin, &a);
	disp[2] = a - b;
	types[0] = MPI_INT;
	types[1] = MPI_DOUBLE;
	types[2] = NUM_type;
	MPI_Type_struct(3, len, disp, types, &flags_type);
	MPI_Type_commit(&flags_type);
	
	len[0] = 5;
	MPI_Address((void*)&rectangle.l, &a);
	MPI_Address((void*)&rectangle, &b);
	disp[0] = a - b;
	types[0] = MPI_INT;
	MPI_Type_struct(1, len, disp, types, &rect_type);
	MPI_Type_commit(&rect_type);
	
	return 0;
}


int GetDefaultWinspecs(Winspecs *winspecs)
{
	winspecs->height = DEF_height;
	winspecs->width  = DEF_width;
	winspecs->bw     = DEF_bw;
	winspecs->xpos   = DEF_xpos;
	winspecs->ypos   = DEF_ypos;
	winspecs->numColors = DEF_numColors;
	return 0;
}

int GetDefaultFlags(Winspecs *winspecs, Flags *flags)
{
	flags->logfile   = DEF_logfile;
	flags->inf       = DEF_inf;
	flags->outf      = DEF_outf;
	flags->winspecs  = winspecs;
	flags->breakout  = DEF_breakout;
	flags->randomize = DEF_randomize;
	flags->colReduceFactor = DEF_colReduceFactor;
	flags->loop      = DEF_loop;
	flags->zoom      = DEF_zoom;
	flags->askNeighbor = DEF_askNeighbor;
	flags->sendMasterComplexity = DEF_sendMasterComplexity;
	flags->drawBlockRegion = DEF_drawBlockRegion;
	flags->fractal   = DEF_fractal;
	flags->maxiter   = DEF_maxiter;
	flags->boundary_sq = DEF_boundary * DEF_boundary;
	flags->epsilon   = DEF_epsilon;
	NUM_ASSIGN(flags->rmin, DEF_rmin);
	NUM_ASSIGN(flags->rmax, DEF_rmax);
	NUM_ASSIGN(flags->imin, DEF_imin);
	NUM_ASSIGN(flags->imax, DEF_imax);
	NUM_ASSIGN(flags->julia_r, DEF_julia_r);
	NUM_ASSIGN(flags->julia_i, DEF_julia_i);
	return 0;
}

int GetWinspecs(int *argc, char **argv, Winspecs *winspecs)
{
	int myid;
	
	MPI_Comm_rank(MPI_COMM_WORLD, &myid);
	
	if (!myid) 
	{
		GetIntArg(argc, argv, "-height", &(winspecs->height));
		GetIntArg(argc, argv, "-width",  &(winspecs->width));
		winspecs->bw = IsArgPresent(argc, argv, "-bw");
		GetIntArg(argc, argv, "-xpos", &(winspecs->xpos));
		GetIntArg(argc, argv, "-ypos", &(winspecs->ypos));
		GetIntArg(argc, argv, "-colors", &(winspecs->numColors));
	}
	
	MPI_Bcast(winspecs, 1, winspecs_type, 0, MPI_COMM_WORLD);
	return 0;
}

int GetFlags(int *argc, char **argv, Winspecs *winspecs, Flags *flags)
{
	double x, y;
	int myid, strLens[3];
	
	MPI_Comm_rank(MPI_COMM_WORLD, &myid);
	
	if (myid == 0) 
	{
		GetStringArg(argc, argv, "-l", &(flags->logfile));
		GetStringArg(argc, argv, "-i", &(flags->inf));
		/* if reading from input file, disable zooming */
		if (flags->inf) 
		{
			flags->zoom = 0;
		}
		GetStringArg(argc, argv, "-o", &(flags->outf));
		GetIntArg(argc, argv, "-breakout", &(flags->breakout));
		if (IsArgPresent(argc, argv, "-randomize")) 
		{
			flags->randomize = 0;
		}
		if (IsArgPresent(argc, argv, "+randomize")) 
		{
			flags->randomize = 1;
		}
		GetIntArg(argc, argv, "-colreduce", &(flags->colReduceFactor));
		flags->loop = IsArgPresent(argc, argv, "-loop");
		if (IsArgPresent(argc, argv, "-zoom")) 
		{
			flags->zoom = 0;
		}
		if (IsArgPresent(argc, argv, "+zoom") && !flags->inf) 
		{
			flags->zoom = 1;
		}
		flags->askNeighbor = IsArgPresent(argc, argv, "-neighbor");
		flags->sendMasterComplexity = IsArgPresent(argc, argv, "-complexity");
		flags->drawBlockRegion = IsArgPresent(argc, argv, "-delaydraw");
		
		if (IsArgPresent(argc, argv, "-mandel")) 
		{
			flags->fractal = MBROT;
		} 
		else if (IsArgPresent(argc, argv, "-julia")) 
		{
			flags->fractal = JULIA;
		} 
		else if (IsArgPresent(argc, argv, "-newton")) 
		{
			flags->fractal = NEWTON;
		}
		
		GetIntArg(argc, argv, "-maxiter", &(flags->maxiter));
		if (GetDoubleArg(argc, argv, "-boundary", &x)) 
		{
			flags->boundary_sq = x * x;
		}
		GetDoubleArg(argc, argv, "-epsilon", &(flags->epsilon));
		if (GetDoubleArg(argc, argv, "-rmin", &x)) 
		{
			NUM_ASSIGN(flags->rmin, DBL2NUM(x));
		}
		if (GetDoubleArg(argc, argv, "-rmax", &x)) 
		{
			NUM_ASSIGN(flags->rmax, DBL2NUM(x));
		}
		
		if (GetDoubleArg(argc, argv, "-imin", &x)) 
		{
			NUM_ASSIGN(flags->imin, DBL2NUM(x));
		}
		if (GetDoubleArg(argc, argv, "-imax", &x)) 
		{
			NUM_ASSIGN(flags->imax, DBL2NUM(x));
		}
		if (GetDoubleArg(argc, argv, "-radius", &x)) 
		{
			if (GetDoubleArg(argc, argv, "-rcenter", &y)) 
			{
				NUM_ASSIGN(flags->rmin, DBL2NUM(y-x));
				NUM_ASSIGN(flags->rmax, DBL2NUM(y + x));
			}
			if (GetDoubleArg(argc, argv, "-icenter", &y)) 
			{
				NUM_ASSIGN(flags->imin, DBL2NUM(y-x));
				NUM_ASSIGN(flags->imax, DBL2NUM(y + x));
			}
		}
		strLens[0] = (flags->logfile) ? strlen(flags->logfile) + 1 : 0;
		strLens[1] = (flags->inf)     ? strlen(flags->inf) + 1     : 0;
		strLens[2] = (flags->outf)    ? strlen(flags->outf) + 1    : 0;
	} /* End of myid == 0 */
	
	MPI_Bcast(flags, 1, flags_type, 0, MPI_COMM_WORLD);
	
	MPI_Bcast(strLens, 3, MPI_INT, 0, MPI_COMM_WORLD);
	
	if (myid != 0) 
	{
		flags->logfile = (strLens[0]) ?
			(char *)malloc(strLens[0] * sizeof(char)) : 0;
		flags->inf = (strLens[1]) ?
			(char *)malloc(strLens[1] * sizeof(char)) : 0;
		flags->outf = (strLens[2]) ?
			(char *)malloc(strLens[2] * sizeof(char)) : 0;
	}
	if (strLens[0]) 
		MPI_Bcast(flags->logfile, strLens[0], MPI_CHAR, 0, MPI_COMM_WORLD);
	if (strLens[1]) 
		MPI_Bcast(flags->inf,     strLens[1], MPI_CHAR, 0, MPI_COMM_WORLD);
	if (strLens[2]) 
		MPI_Bcast(flags->outf,    strLens[2], MPI_CHAR, 0, MPI_COMM_WORLD);
	
	return 0;
}



int Pixel2Complex(Flags *flags, int x, int y, NUM *nx, NUM *ny)
{
	NUM_PTR_ASSIGN(
		nx,
		NUM_ADD(
		NUM_MULT(
		DBL2NUM((double)x / flags->winspecs->width),
		NUM_SUB(flags->rmax, flags->rmin)),
		flags->rmin)
		);
	
	NUM_PTR_ASSIGN(
		ny,
		NUM_ADD(
		NUM_MULT(
        DBL2NUM((double)y / flags->winspecs->height),
        NUM_SUB(flags->imin, flags->imax)),
		flags->imax)
		);
	
		/*
		fprintf(stderr, "In (%d %d) to (%lf,%lf)-(%lf,%lf)\n",
		flags->winspecs->width, flags->winspecs->height,
		flags->rmin, flags->imin, flags->rmax, flags->imax);
		fprintf(stderr, "Converted (%d, %d) to (%lf, %lf)\n",
		x, y, *nx, *ny);
	*/
	
	return 0;
}


int StrContainsNonWhiteSpace(char *str)
{
	while (*str) 
	{
		if (!isspace(*str)) return 1;
		str++;
	}
	return 0;
}




/* Q_Create - create the queue */
void Q_Create(rect_queue *q, int randomize)
{
	q->head = q->tail = 0;       /* create the queue */
	q->size = 100;
	q->r = (rect *) malloc(q->size * sizeof(rect));
	q->randomPt = 1;
	q->randomize = randomize;
}


/* Q_Checksize - check if the queue is full.  If so, double the size */
void Q_Checksize(rect_queue *q)
{
	if (q->head == q->tail + 1 ||
		!q->head && q->tail == q->size - 1) 
	{
		/* if the queue is full */
		q->r = (rect *) realloc(q->r, sizeof(rect) * q->size * 2);
		/* get a bigger queue */
		if (q->tail < q->head) 
		{
			memcpy(q->r + q->size, q->r, q->tail * sizeof(rect));
			/* copy over any data that needs to be moved */
			q->tail += q->size;
		}
		if (q->randomize && q->randomPt<q->head) 
		{
			q->randomPt += q->size;
		}
		q->size *= 2;
	}
}


void Q_Print(rect_queue *q)
{
	int i;
	i = q->head;
	while (i != q->tail) 
	{
		fprintf(debug_file, "queue[%d] = (%d %d %d %d)\n", i, q->r[i].l, q->r[i].r,
			q->r[i].t, q->r[i].b);
		i++;
		if (i == q->size) i = 0;
	}
}


int Q_CheckValidity(rect_queue *q)
{
	int i;
	i = q->head;
	while (i != q->tail) 
	{
		if (q->r[i].l > 10000 ||
			q->r[i].r > 10000 ||
			q->r[i].t > 10000 ||
			q->r[i].b > 10000 ||
			q->r[i].length > 10000) 
		{
			fprintf(debug_file, "Error in queue[%d]: (%d %d %d %d %d)\n",
				i, q->r[i].l, q->r[i].r, q->r[i].t, q->r[i].b, q->r[i].length);
		}
		if (++i == q->size) i = 0;
	}
	return 0;
}


/* Q_Enqueue - add a rectangle to the queue */
void Q_Enqueue(rect_queue *q, rect *r)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -