SALSA Analysis Modules
anamoddriver.c
Go to the documentation of this file.
00001 #include <stdlib.h>
00002 #include "nmd.h"
00003 #include "anamod.h"
00004 #include "anamodsalsamodules.h"
00005 #if defined(HAVE_MYSQL)
00006 #include "mysql.h"      
00007 MYSQL *dbase;
00008 #endif
00009 
00010 #undef __FUNCT__
00011 #define __FUNCT__ "get_matrix"
00012 static PetscErrorCode get_matrix(Mat *A,PetscBool *success)
00013 {
00014   MPI_Comm comm = MPI_COMM_WORLD; char option[1000];
00015   PetscBool has,done=PETSC_FALSE; PetscViewer binary_dump; PetscErrorCode ierr;
00016 
00017   PetscFunctionBegin;
00018   *success = PETSC_FALSE;
00019 
00020   ierr = PetscOptionsGetString
00021     (PETSC_NULL,"-petsc",option,1000,&has); CHKERRQ(ierr);
00022   if (has) {
00023     PetscPrintf(comm,"reading matrix from petsc dump <%s>\n",option);
00024     ierr = PetscViewerBinaryOpen
00025       (comm,option,FILE_MODE_READ,&binary_dump); CHKERRQ(ierr);
00026     ierr = MatCreate(MPI_COMM_SELF,A); CHKERRQ(ierr);
00027     ierr = MatSetType(*A,MATSEQAIJ); CHKERRQ(ierr);
00028     ierr = MatLoad(*A,binary_dump); CHKERRQ(ierr);
00029     ierr = PetscViewerDestroy(&binary_dump); CHKERRQ(ierr);
00030     *success = PETSC_TRUE; done = PETSC_TRUE; goto exit;
00031   }
00032 
00033   ierr = PetscOptionsGetString
00034     (PETSC_NULL,"-matrixmarket",option,1000,&has); CHKERRQ(ierr);
00035   if (has) {
00036     PetscPrintf(comm,"matrix market read not yet supported\n");
00037     *success = PETSC_FALSE; done = PETSC_TRUE; goto exit;
00038   }
00039   
00040  exit:
00041   if (!done) printf("Usage: petsc -petsc matrix\n");
00042   CHKMEMQ;
00043   PetscFunctionReturn(0);
00044 }
00045 
00046 #undef __FUNCT__
00047 #define __FUNCT__ "analyze_matrix"
00048 PetscErrorCode analyze_matrix(Mat A,NMD_metadata nmd)
00049 {
00050   const char *cat,**modules;
00051   AnalysisDataType *types; int imod,nmod;
00052   PetscBool success; PetscErrorCode ierr;
00053 
00054   PetscFunctionBegin;
00055   ierr = GetFirstCategory(&cat,&success); CHKERRQ(ierr);
00056   while (success) {
00057     ierr = CategoryGetModules
00058       (cat,&modules,&types,PETSC_NULL,&nmod); CHKERRQ(ierr);
00059     for (imod=0; imod<nmod; imod++) {
00060       AnalysisItem res; int reslen; PetscBool success;
00061       ierr = ComputeQuantity
00062         ((AnaModNumericalProblem)A,cat,modules[imod],
00063          &res,&reslen,&success); CHKERRQ(ierr);
00064       if (success) {
00065         AnalysisDataType type;
00066         ierr = GetDataType(cat,modules[imod],&type,NULL); CHKERRQ(ierr);
00067         ierr = NMDSetArrayValue
00068           (nmd,cat,modules[imod],type,(void*)&res,reslen); CHKERRQ(ierr);
00069       }
00070     }
00071     ierr = GetNextCategory(&cat,&success); CHKERRQ(ierr);
00072   }
00073   PetscFunctionReturn(0);
00074 }
00075 
00076 static PetscErrorCode usage(MPI_Comm comm)
00077 {
00078   PetscErrorCode ierr;
00079   PetscFunctionBegin;
00080   ierr = PetscPrintf
00081     (comm,"-------------------------------------------------\n"); CHKERRQ(ierr);
00082   ierr = PetscPrintf
00083     (comm,"Use -petsc or -matrixmarket option to specify a matrix\n");
00084   ierr = PetscPrintf
00085     (comm,"Use -mysql to get a table definition and insert command for all computed quantities\n");
00086   PetscFunctionReturn(0);
00087 }
00088 
00089 #undef __FUNCT__
00090 #define __FUNCT__ "main"
00091 int main(int argc,char **argv)
00092 {
00093   MPI_Comm comm; Mat A; NMD_metadata nmd; PetscBool table,success,help;
00094   PetscErrorCode ierr;
00095 
00096   PetscFunctionBegin;
00097   PetscInitialize(&argc,&argv,0,0);
00098   comm = MPI_COMM_WORLD;
00099 
00100   help = PETSC_FALSE;
00101   ierr = PetscOptionsHasName(PETSC_NULL,"-h",&help); CHKERRQ(ierr);
00102   if (!help) {
00103     ierr = PetscOptionsHasName(PETSC_NULL,"-help",&help); CHKERRQ(ierr);
00104   }
00105   if (help) {
00106     ierr = usage(comm); CHKERRQ(ierr);
00107     goto petscfinalize;
00108   }
00109 
00110   ierr = AnaModInitialize(); CHKERRQ(ierr);
00111   ierr = AnaModRegisterSalsaModules(); CHKERRQ(ierr);
00112   ierr = AnaModOptionsHandling(); CHKERRQ(ierr);
00113 
00114   ierr = PetscOptionsHasName(PETSC_NULL,"-table",&table); CHKERRQ(ierr);
00115   if (table) {
00116     printf("CREATE TABLE anamod_data (\n");
00117     {
00118       int ncat,icat,iwrite=0; const char **cats;
00119       ierr = GetCategories(&ncat,&cats); CHKERRQ(ierr);
00120       for (icat=0; icat<ncat; icat++) {
00121         int ncmp,icmp; const char **cmps; AnalysisDataType *types;
00122         ierr = CategoryGetModules
00123           (cats[icat],&cmps,&types,NULL,&ncmp); CHKERRQ(ierr);
00124         for (icmp=0; icmp<ncmp; icmp++) {
00125           const char *type;
00126           if (iwrite>0) printf(",\n"); iwrite++;
00127           ierr = AnaModGetTypeMySQLName(types[icmp],&type); CHKERRQ(ierr);
00128           printf("  `%s:%s` %s",cats[icat],cmps[icmp],type);
00129           
00130         }
00131       }
00132     }
00133 #if defined(HAVE_MYSQL)
00134 /*   dbase = mysql_init(NULL); */
00135 /*   mysql_real_connect(dbase,MYSQLHOST,MYSQLUSER,MYSQLPASS,MYSQLDBASE, */
00136 /*                   0,NULL,0); */
00137 #endif
00138     printf("\n)\n");
00139   }
00140   ierr = get_matrix(&A,&success); CHKERRQ(ierr);
00141   if (!success) goto exit;
00142 
00143   ierr = NMDCreateObject(&nmd); CHKERRQ(ierr);
00144   ierr = analyze_matrix(A,nmd); CHKERRQ(ierr);
00145   ierr = NMDViewObject(nmd); CHKERRQ(ierr);
00146   ierr = NMDObjectDumpToMySQL(nmd); CHKERRQ(ierr);
00147 /*   { */
00148 /*     char *key,*val; */
00149 /*     ierr = NMDReportObject */
00150 /*       (nmd,NMDFalse,&key,&val,'\t',0,0); CHKERRQ(ierr); */
00151 /*     printf("Keys: %s\nValues: %s\n",key,val); */
00152 /*     //NMD_FREE(key); NMD_FREE(val); */
00153 /*   } */
00154   ierr = NMDDestroyObject(nmd); CHKERRQ(ierr);
00155 
00156  exit:
00157 #if defined(HAVE_MYSQL)
00158   mysql_close(dbase);
00159 #endif
00160   ierr = AnaModDeregisterSalsaModules(); CHKERRQ(ierr);
00161   ierr = AnaModFinalize(); CHKERRQ(ierr);
00162  petscfinalize:
00163   PetscFinalize();
00164   PetscFunctionReturn(0);
00165 }