Пример #1
0
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;
}
Пример #2
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();
}