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 */ }
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]); } } }