int myorder_gesvd_op_tran(int M,int N,double tol,double *A,double *D, double *Q,double *P,int *INFO) { int i,j,k,w,q; double a,b,c; int cond = 0; int iteration = 0; int id; int st_1,en_1,st_2,en_2; double tol_orth = 0; double last_ave_orth = 0; int MlsN = 0; *INFO = 0; if(M < 0) *INFO = -1; else if(N < 0) *INFO = -2; if(*INFO < 0) { printf("error:%d\n",*INFO); exit(0); } omp_set_num_threads(NUM_THREADS); if(M<N) //转置矩阵A { MlsN = 1; TransposeQuick(M,N,A); N = N + M; M = N - M; N = N - M; }// 转置后 M N交换值 M > N assert(M%8==0); #pragma omp parallel default(shared) private(id,i) { id = omp_get_thread_num(); if(MlsN==0) { //初始化Q为单位阵 for(i=id*M/4; i<(id+1)*M/4; i++) { *(Q+i*M+i) = 1.0; } } else { //初始化P为单位阵 for(i=id*M/4; i<(id+1)*M/4; i++) { *(P+i*M+i) = 1.0; } } }// end for pragma while(1) { cond = 0; last_ave_orth = 2*tol_orth/(M*(M-1)); tol_orth = 0; #pragma omp parallel reduction(||:cond) reduction(+:tol_orth) default(shared) private(id) { id = omp_get_thread_num(); // void orth_all(int start,int end,int M,int N,double* A,double* P,double* Q,int MlsN // int* cond,double* tol_orth,int iteration,double last_ave_orth) orth_all(id*M/4,(id+1)*M/4-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp barrier // (p1,p2) (p3,p4) #pragma omp sections { // void orth_two(int st_1,int en_1,int st_2,int en_2,int M,int N,double* A,double* P, double* Q, int MlsN, // int* cond,double* tol_orth,int iteration,double last_ave_orth) #pragma omp section orth_two(0*M/8,1*M/8-1,2*M/8,3*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(1*M/8,2*M/8-1,3*M/8,4*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(4*M/8,5*M/8-1,6*M/8,7*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(5*M/8,6*M/8-1,7*M/8,8*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); } #pragma omp sections { #pragma omp section orth_two(0*M/8,1*M/8-1,3*M/8,4*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(1*M/8,2*M/8-1,2*M/8,3*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(4*M/8,5*M/8-1,7*M/8,8*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(5*M/8,6*M/8-1,6*M/8,7*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); } // (p1,p3) (p2,p4) #pragma omp sections { #pragma omp section orth_two(0*M/8,1*M/8-1,4*M/8,5*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(1*M/8,2*M/8-1,5*M/8,6*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(2*M/8,3*M/8-1,6*M/8,7*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(3*M/8,4*M/8-1,7*M/8,8*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); } #pragma omp sections { #pragma omp section orth_two(0*M/8,1*M/8-1,5*M/8,6*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(1*M/8,2*M/8-1,4*M/8,5*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(2*M/8,3*M/8-1,7*M/8,8*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(3*M/8,4*M/8-1,6*M/8,7*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); } // (p1,p4) (p2,p3) #pragma omp sections { #pragma omp section orth_two(0*M/8,1*M/8-1,6*M/8,7*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(1*M/8,2*M/8-1,7*M/8,8*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(2*M/8,3*M/8-1,4*M/8,5*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(3*M/8,4*M/8-1,5*M/8,6*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); } #pragma omp sections { #pragma omp section orth_two(0*M/8,1*M/8-1,7*M/8,8*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(1*M/8,2*M/8-1,6*M/8,7*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(2*M/8,3*M/8-1,5*M/8,6*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); #pragma omp section orth_two(3*M/8,4*M/8-1,4*M/8,5*M/8-1,M,N,A,P,Q,MlsN,&cond,&tol_orth,iteration,last_ave_orth); } }// end for pragma if(cond == 0) break; if((++iteration) > ITERATION) { printf("the iteration is over\n"); break; } }// end for while ChangeOrder(M,N,A,Q,P,D,MlsN); // 按行向量模的大小进行排序 return 0; }
/*主函数*/ void main() { int press; int bOutWhile=0;/*退出循环标志*/ int a=DETECT,b; /*切换到图形模式*/ initgraph(&a,&b,"d:\\tc"); gotoxy(28,5);printf ("****WELCOME TO WU ZI Qi****"); gotoxy(33,8);printf("xi tong ben\n"); gotoxy(33,11);printf ("shao wang quan\n"); gotoxy(33,12);printf("zhou rui fei\n "); gotoxy(33,13);printf ("wu guo xu\n"); gotoxy(33,14);printf ("yang wu"); gotoxy(28,20);printf("Please press any key start....."); getch(); closegraph(); /*切换到字符模式*/ Init();/*初始化图象,数据*/ while(1) { press=GetKey();/*获取用户的按键值*/ switch(CheckKey(press))/*判断按键类别*/ { /*是退出键*/ case KEY_EXIT: clrscr();/*清屏*/ bOutWhile = 1; break; /*是落子键*/ case KEY_FALLCHESS: /*走棋*/ if(ChessGo(gPlayOrder,gCursor)==0)/*判断当前是否有子并提示*/ { textcolor(RED+BLINK); gotoxy(2,21); cputs("Point for chessman,Please enter again!"); gotoxy(gCursor.x+MAPX_O,gCursor.y+MAPY_O); } else { gotoxy(2,21); cputs(" "); /*如果当前行棋方赢棋*/ if(JudgeWin(gPlayOrder,gCursor)==1) { DoWin(gPlayOrder); bOutWhile = 1;/*退出循环标志置为真*/ } else /*交换行棋方*/ ChangeOrder(); } break; /*是光标移动键*/ case KEY_MOVECURSOR: MoveCursor(gPlayOrder,press); break; /*是无效键*/ case KEY_INVALID: break; } if(bOutWhile==1) break; } /*游戏结束*/ EndGame(); }