SALSA Analysis Modules
|
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 }