Пример #1
0
void read_com ( char * com ) {
	
		/* LOG */
		//log_print ("XBoard>Engine>Line>>" , LOG_COMMAND_FILE);
		log_print ( com , LOG_COMMAND_FILE );
		/* END LOG */
	
				
		int length = strlen(com) + 1;
		char *prop = (char *) malloc ( length * sizeof (char) );
		memcpy( prop , com , length );
		
		char * poz = prop;
		char * word;
		
		word = parse_com ( &poz );
		

		
		/* Analyse command */
				
		if ( !strcmp ( word , "quit" ) ) 		exit(0);
		if ( !strcmp ( word , "xboard" ) ) 		write_to_xboard ("\n");
		if ( !strcmp ( word , "protover" ) ) 	{ Init ( INIT_POSX) ; write_to_xboard (FEATURES); }
		if ( !strcmp ( word , "go" ) ) { 
			
				set_engine_lock (0); // Remove Lock
				if ( !is_engine_on_move() ) flip_state () ;
		}
		if ( !strcmp ( word , "force" ) ) set_engine_lock(1); // Put Lock
		if ( !strcmp ( word , "new" ) ) { set_engine_lock (1) ; Init ( INIT_NEW ) ; }
		
		/* Command is a move */
		if ( !strcmp ( word , "usermove" )) 	{ 
			
			set_engine_lock (0);
			word = parse_com ( &poz );
			
			// Now : word is command in XBoard format
			
			/* LOG */
			
			log_print ("XBoard>Engine>Move" , LOG_COMMAND_FILE );
			log_print ( word , LOG_COMMAND_FILE );
			log_print ("XBoard>Engine>SAN_to_Move" , LOG_COMMAND_FILE);
			log_print_move ( SAN_to_Move ( cur_state_get() , word ) , LOG_COMMAND_FILE );
		
			/* END LOG */
			
			/* LOG History */
			char color_text [10];
			tag_to_text ( not ( get_engine_col () ) , color_text );
			log_print ( color_text , LOG_HISTORY_FILE );
			log_print (word , LOG_HISTORY_FILE );
			/* END LOG History */
			
			update_state ( cur_state_get() , SAN_to_Move ( cur_state_get() , word ) );  
			
		}
		
		/* Free statement */
		free(prop);
		
		/* LOG */
		log_print("END read_com", LOG_COMMAND_FILE );
		/* END LOG */
		
}
Пример #2
0
void execute(struct ed_s *ed)
{
	double a, b, ib;
	unsigned k, iter, neighb;
	index_type i;
	state_type s, s1;
	MPI_Request req_send, req_recv;
	MPI_Request req_send2, req_recv2;
	MPI_Status stat;
	
	b = 0.0;
	for (i = 0; i < ed->nlstates; ++i)
		b += ed->v1[i] * ed->v1[i];
		
	for (iter = 0; iter < ed->max_iter; ++iter) {
		/* calculate beta */
		MPI_Barrier(MPI_COMM_WORLD);
		MPI_Allreduce(&b, &ed->beta[iter], 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
		ed->beta[iter] = sqrt(fabs(ed->beta[iter]));

		/* normalize v1 */
		ib = 1.0 / ed->beta[iter];
		for (i = 0; i < ed->nlstates; ++i)
			ed->v1[i] *= ib;

		/* send and receive data in advance */
		MPI_Isend(ed->v1, ed->nlstates, MPI_DOUBLE, ed->to_nbs[0], ed->nm - 1, MPI_COMM_WORLD, &req_send);
		MPI_Irecv(ed->vv1, ed->nlstates, MPI_DOUBLE, ed->from_nbs[0], ed->nm - 1, MPI_COMM_WORLD, &req_recv);

		/* matrix vector multiplication */
		/* v2 = A * v1, the same core */
		for (i = 0; i < ed->nlstates; ++i) {
			s = loc_index2state(i, ed->nm, ed->rank);

			/* diagonal part */
			ed->v2[i] = diag(s, ed->n, ed->j) * ed->v1[i];

			/* offdiagonal part */
			for (k = 0; k < ed->nm; ++k) {
				s1 = flip_state(s, k);
				ed->v2[i] += ed->gamma * ed->v1[state2loc_index(s1, ed->nlstates)];
			}
		}

		/* matrix vector multiplication */
		/* v2 = A * v1, offdiagonal part, other cores */
		a = 0.0;
		for (k = ed->nm; k < ed->n; ++k) {
			if (k < ed->n - 1) {
				/* send and receive data in advance */
				neighb = k - ed->nm + 1;
				MPI_Isend(ed->v1, ed->nlstates, MPI_DOUBLE, ed->to_nbs[neighb], k, MPI_COMM_WORLD, &req_send2);
				MPI_Irecv(ed->vv2, ed->nlstates, MPI_DOUBLE, ed->from_nbs[neighb], k, MPI_COMM_WORLD, &req_recv2);
			}

			/* wait until data arrives */
			MPI_Wait(&req_recv, &stat);

			for (i = 0; i < ed->nlstates; ++i) {
				ed->v2[i] += ed->gamma * ed->vv1[i];

				if (k == ed->n - 1)
					a += ed->v1[i] * ed->v2[i];
			}

			req_recv = req_recv2;
			swap(&ed->vv1, &ed->vv2);
		}

		/* calculate alpha */
		MPI_Barrier(MPI_COMM_WORLD);
		MPI_Allreduce(&a, &ed->alpha[iter], 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);

		/* v2 = v2 - v0 * beta1 - v1 * alpha1 */
		b = 0.0;
		for (i = 0; i < ed->nlstates; ++i) {
			ed->v2[i] -= ed->v0[i] * ed->beta[iter] + ed->v1[i] * ed->alpha[iter];
			b += ed->v2[i] * ed->v2[i];
		}

		/* "shift" vectors */
		swap(&ed->v0, &ed->v1); swap(&ed->v1, &ed->v2);

                if (ed->rank == MASTER_CORE && iter > 0) {
                        calc_eigenvalues(ed, iter);
                        printf("%5i %20.12g\n", iter, ed->evals[0]);
                }
	}
}