/*******************************************************************/ /* Example of the C call to NetSolve */ /* This program sends : */ /* */ /* - One blocking request for the problem 'dgesv' */ /* - One non-blocking request for the problem 'dgesv' */ /* */ /* and */ /* */ /* - One blocking request for the problem 'linsol' */ /* - One non-blocking request for the problem 'linsol' */ /* */ /* The problem 'linsol' is a simplified version of 'dgesv' */ /* */ /* The matrices are stored column-wise in a Fortran fashion */ /* */ /* WARNING : The matrix may be singular, in which case NetSolve */ /* will print out an error message. */ /* */ /*******************************************************************/ #include <stdio.h> #include "netsolve.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> main(int argc,char **argv) { int m; /* Size of the matrix and right-hand side */ double *a1,*b1; /* Matrix and right-hand side for the 1st call */ double *a2,*b2; /* Matrix and right-hand side for the 2nd call */ double *a3,*b3; /* Matrix and right-hand side for the 3rd call */ double *a4,*b4; /* Matrix and right-hand side for the 4th call */ int *pivot; /* Vector of pivots returned by 'dgesv' */ int ierr; /* 'dgesv' error code */ int i; /* Loop index */ int init=1325; /* Seed of the random number generator */ int info; /* NetSolve error code */ int request; /* NetSolve request handler */ if (argc != 2) { fprintf(stderr,"Usage : %s <size>\n",argv[0]); exit(0); } if ((m = atoi(argv[1])) <= 0) { fprintf(stderr,"'%s' : Should be a positive integer\n",argv[1]); exit(0); } /* * Generating the random mxm matrices, as well as the * random right hand sides. */ fprintf(stderr,"Generating the problem ...\n"); a1 = (double *)malloc(m*m*sizeof(double)); a2 = (double *)malloc(m*m*sizeof(double)); a3 = (double *)malloc(m*m*sizeof(double)); a4 = (double *)malloc(m*m*sizeof(double)); for (i=0;i<m*m;i++) { init = 2315*init % 65536; a1[i] = (double)((double)init - 32768.0) / 16384.0; a2[i] = a1[i]; /* */ a3[i] = a1[i]; /* In this example, we solve 4 times the same problem */ a4[i] = a1[i]; /* */ } b1 = (double *)malloc(m*sizeof(double)); b2 = (double *)malloc(m*sizeof(double)); b3 = (double *)malloc(m*sizeof(double)); b4 = (double *)malloc(m*sizeof(double)); for (i=0;i<m;i++) { init = 2315*init % 65536; b1[i] = (double)((double)init - 32768.0) / 16384.0; b2[i] = b1[i]; b3[i] = b1[i]; b4[i] = b1[i]; } pivot = (int *)malloc(m*sizeof(double)); /* Calling Netsolve for 'dgesv' in a blocking fashion */ /* For 'dgesv', the right-hand side is overwritten */ /* with the solution */ netslmajor("Col"); fprintf(stderr,"Calling NetSolve for 'dgesv', blocking :\n"); info = netsl("dgesv()",m,1,a1,m,pivot,b1,m,&ierr); if (info <0) { netslerr(info); exit(0); } if (ierr != 0) fprintf(stderr,"Cannot solve for this Matrix and right-hand side\n"); else { fprintf(stderr,"Solution :\n"); for (i=0;i<m;i++) fprintf(stderr,"--> %f\n",b1[i]); } /* Calling Netsolve for 'dgesv' in a non-blocking fashion */ /* For 'dgesv', the right-hand side is overwritten */ /* with the solution */ fprintf(stderr,"Calling NetSolve for 'dgesv', non-blocking :\n"); request = netslnb("dgesv()",m,1,a2,m,pivot,b2,m,&ierr); if (request <0) { netslerr(request); exit(0); } fprintf(stderr,"Request #%d being processed\n",request); fprintf(stderr,"Probing......\n"); info = netslpr(request); while(info == NetSolveNotReady) { sleep(4); fprintf(stderr,"."); fflush(stderr); info = netslpr(request); } fprintf(stderr,"\n"); if (info == NetSolveOK) { info = netslwt(request); } if (info < 0) netslerr(info); else { if (ierr != 0) fprintf(stderr,"Cannot solve for this Matrix and right-hand side\n"); else { fprintf(stderr,"Solution :\n"); for (i=0;i<m;i++) fprintf(stderr,"\t--> %f\n",b2[i]); } } /* Calling Netsolve for 'linsol' in a blocking fashion */ /* For 'linsol', the right-hand side is overwritten */ /* with the solution */ fprintf(stderr,"Calling NetSolve for 'linsol', blocking :\n"); info = netsl("linsol()",m,1,a3,m,b3,m); if (info <0) { netslerr(info); } else { fprintf(stderr,"*************\n"); fprintf(stderr,"** Success **\n"); fprintf(stderr,"*************\n"); fprintf(stderr,"Solution :\n"); for (i=0;i<m;i++) fprintf(stderr,"\t --> %f\n",b3[i]); } /* Calling Netsolve for 'linsol' in a non-blocking fashion */ /* For 'linsol', the right-hand side is overwritten */ /* with the solution */ fprintf(stderr,"Calling NetSolve for 'linsol', non-blocking :\n"); request = netslnb("linsol()",m,1,a4,m,b4,m); if (info <0) { netslerr(info); exit(0); } fprintf(stderr,"Request #%d being processed\n",request); fprintf(stderr,"Probing......\n"); info = netslpr(request); while(info == NetSolveNotReady) { sleep(4); fprintf(stderr,"."); fflush(stderr); info = netslpr(request); } fprintf(stderr,"\n"); if (info == NetSolveOK) { info = netslwt(request); } if (info < 0) netslerr(info); else { fprintf(stderr,"*************\n"); fprintf(stderr,"** Success **\n"); fprintf(stderr,"*************\n"); fprintf(stderr,"Solution :\n"); for (i=0;i<m;i++) fprintf(stderr,"\t--> %f\n",b4[i]); } return 1; } |