⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iohb.c

📁 很好用的库
💻 C
📖 第 1 页 / 共 4 页
字号:
          sprintf(rformat,"%% %d.%dE",Rhswidth,Rhsprec);       if (Rhsflag == 'D') *strchr(Rhsfmt,'D') = 'E';       rhscrd = nrhsentries/Rhsperline;        if ( nrhsentries%Rhsperline != 0) rhscrd++;       if ( Rhstype[1] == 'G' ) rhscrd+=rhscrd;       if ( Rhstype[2] == 'X' ) rhscrd+=rhscrd;       rhscrd*=Nrhs;    } else rhscrd = 0;    totcrd = 4+ptrcrd+indcrd+valcrd+rhscrd;/*  Print header information:  */    fprintf(out_file,"%-72s%-8s\n%14d%14d%14d%14d%14d\n",Title, Key, totcrd,            ptrcrd, indcrd, valcrd, rhscrd);    fprintf(out_file,"%3s%11s%14d%14d%14d\n",Type,"          ", M, N, nz);    fprintf(out_file,"%-16s%-16s%-20s", Ptrfmt, Indfmt, Valfmt);    if ( Nrhs != 0 ) {/*     Print Rhsfmt on fourth line and                                    *//*           optional fifth header line for auxillary vector information: */       fprintf(out_file,"%-20s\n%-14s%d\n",Rhsfmt,Rhstype,Nrhs);    } else fprintf(out_file,"\n");    offset = 1-_SP_base;  /* if base 0 storage is declared (via macro definition), */                          /* then storage entries are offset by 1                  *//*  Print column pointers:   */    for (i=0;i<N+1;i++)    {       entry = colptr[i]+offset;       fprintf(out_file,pformat,entry);       if ( (i+1)%Ptrperline == 0 ) fprintf(out_file,"\n");    }   if ( (N+1) % Ptrperline != 0 ) fprintf(out_file,"\n");/*  Print row indices:       */    for (i=0;i<nz;i++)    {       entry = rowind[i]+offset;       fprintf(out_file,iformat,entry);       if ( (i+1)%Indperline == 0 ) fprintf(out_file,"\n");    }   if ( nz % Indperline != 0 ) fprintf(out_file,"\n");/*  Print values:            */    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */    for (i=0;i<nvalentries;i++)    {       fprintf(out_file,vformat,val[i]);       if ( (i+1)%Valperline == 0 ) fprintf(out_file,"\n");    }    if ( nvalentries % Valperline != 0 ) fprintf(out_file,"\n");/*  If available,  print right hand sides,            guess vectors and exact solution vectors:  */    acount = 1;    linemod = 0;    if ( Nrhs > 0 ) {       for (i=0;i<Nrhs;i++)       {          for ( j=0;j<nrhsentries;j++ ) {            fprintf(out_file,rformat,rhs[j]);            if ( acount++%Rhsperline == linemod ) fprintf(out_file,"\n");          }          if ( acount%Rhsperline != linemod ) {            fprintf(out_file,"\n");            linemod = (acount-1)%Rhsperline;          }          rhs += nrhsentries;          if ( Rhstype[1] == 'G' ) {            for ( j=0;j<nrhsentries;j++ ) {              fprintf(out_file,rformat,guess[j]);              if ( acount++%Rhsperline == linemod ) fprintf(out_file,"\n");            }            if ( acount%Rhsperline != linemod ) {              fprintf(out_file,"\n");              linemod = (acount-1)%Rhsperline;            }            guess += nrhsentries;          }          if ( Rhstype[2] == 'X' ) {            for ( j=0;j<nrhsentries;j++ ) {              fprintf(out_file,rformat,exact[j]);              if ( acount++%Rhsperline == linemod ) fprintf(out_file,"\n");            }            if ( acount%Rhsperline != linemod ) {              fprintf(out_file,"\n");              linemod = (acount-1)%Rhsperline;            }            exact += nrhsentries;          }       }    }    }    if ( fclose(out_file) != 0){      fprintf(stderr,"Error closing file in writeHB_mat_double().\n");      return 0;    } else return 1;    }int readHB_mat_char(const char* filename, int colptr[], int rowind[],                                            char val[], char* Valfmt){/****************************************************************************//*  This function opens and reads the specified file, interpreting its      *//*  contents as a sparse matrix stored in the Harwell/Boeing standard       *//*  format and creating compressed column storage scheme vectors to hold    *//*  the index and nonzero value information.                                *//*                                                                          *//*    ----------                                                            *//*    **CAVEAT**                                                            *//*    ----------                                                            *//*  Parsing real formats from Fortran is tricky, and this file reader       *//*  does not claim to be foolproof.   It has been tested for cases when     *//*  the real values are printed consistently and evenly spaced on each      *//*  line, with Fixed (F), and Exponential (E or D) formats.                 *//*                                                                          *//*  **  If the input file does not adhere to the H/B format, the  **        *//*  **             results will be unpredictable.                 **        *//*                                                                          *//****************************************************************************/    FILE *in_file;    int i,j,ind,col,offset,count,last;    int Nrow,Ncol,Nnzero,Nentries,Nrhs;    int Ptrcrd, Indcrd, Valcrd, Rhscrd;    int Ptrperline, Ptrwidth, Indperline, Indwidth;    int Valperline, Valwidth, Valprec;    int Valflag;           /* Indicates 'E','D', or 'F' float format */    char* ThisElement;    char line[BUFSIZ];    char Title[73], Key[8], Type[4], Rhstype[4];    char Ptrfmt[17], Indfmt[17], Rhsfmt[21];    if ( (in_file = fopen( filename, "r")) == NULL ) {       fprintf(stderr,"Error: Cannot open file: %s\n",filename);       return 0;    }    readHB_header(in_file, Title, Key, Type, &Nrow, &Ncol, &Nnzero, &Nrhs,                  Ptrfmt, Indfmt, Valfmt, Rhsfmt,                  &Ptrcrd, &Indcrd, &Valcrd, &Rhscrd, Rhstype);/*  Parse the array input formats from Line 3 of HB file  */    ParseIfmt(Ptrfmt,&Ptrperline,&Ptrwidth);    ParseIfmt(Indfmt,&Indperline,&Indwidth);    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */       ParseRfmt(Valfmt,&Valperline,&Valwidth,&Valprec,&Valflag);       if (Valflag == 'D') {          *strchr(Valfmt,'D') = 'E';       }    }/*  Read column pointer array:   */    offset = 1-_SP_base;  /* if base 0 storage is declared (via macro definition), */                          /* then storage entries are offset by 1                  */    ThisElement = (char *) malloc(Ptrwidth+1);    if ( ThisElement == NULL ) IOHBTerminate("Insufficient memory for ThisElement.");    *(ThisElement+Ptrwidth) = (char) NULL;    count=0;     for (i=0;i<Ptrcrd;i++)    {       fgets(line, BUFSIZ, in_file);       if ( sscanf(line,"%*s") < 0 )          IOHBTerminate("iohb.c: Null (or blank) line in pointer data region of HB file.\n");       col =  0;       for (ind = 0;ind<Ptrperline;ind++)       {          if (count > Ncol) break;          strncpy(ThisElement,line+col,Ptrwidth);          /*ThisElement = substr(line,col,Ptrwidth);*/          colptr[count] = atoi(ThisElement)-offset;          count++; col += Ptrwidth;       }    }    free(ThisElement);/*  Read row index array:  */    ThisElement = (char *) malloc(Indwidth+1);    if ( ThisElement == NULL ) IOHBTerminate("Insufficient memory for ThisElement.");    *(ThisElement+Indwidth) = (char) NULL;    count = 0;    for (i=0;i<Indcrd;i++)    {       fgets(line, BUFSIZ, in_file);       if ( sscanf(line,"%*s") < 0 )          IOHBTerminate("iohb.c: Null (or blank) line in index data region of HB file.\n");       col =  0;       for (ind = 0;ind<Indperline;ind++)       {          if (count == Nnzero) break;          strncpy(ThisElement,line+col,Indwidth);          /*ThisElement = substr(line,col,Indwidth);*/          rowind[count] = atoi(ThisElement)-offset;          count++; col += Indwidth;       }    }    free(ThisElement);/*  Read array of values:  AS CHARACTERS*/    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */       if ( Type[0] == 'C' ) Nentries = 2*Nnzero;           else Nentries = Nnzero;    ThisElement = (char *) malloc(Valwidth+1);    if ( ThisElement == NULL ) IOHBTerminate("Insufficient memory for ThisElement.");    *(ThisElement+Valwidth) = (char) NULL;    count = 0;    for (i=0;i<Valcrd;i++)    {       fgets(line, BUFSIZ, in_file);       if ( sscanf(line,"%*s") < 0 )          IOHBTerminate("iohb.c: Null (or blank) line in value data region of HB file.\n");       if (Valflag == 'D') {          while( strchr(line,'D') ) *strchr(line,'D') = 'E';       }       col =  0;       for (ind = 0;ind<Valperline;ind++)       {          if (count == Nentries) break;          ThisElement = &val[count*Valwidth];          strncpy(ThisElement,line+col,Valwidth);          /*strncpy(ThisElement,substr(line,col,Valwidth),Valwidth);*/          if ( Valflag != 'F' && strchr(ThisElement,'E') == NULL ) {              /* insert a char prefix for exp */             last = strlen(ThisElement);             for (j=last+1;j>=0;j--) {                ThisElement[j] = ThisElement[j-1];                if ( ThisElement[j] == '+' || ThisElement[j] == '-' ) {                   ThisElement[j-1] = Valflag;                                       break;                }             }          }          count++; col += Valwidth;       }    }    }    return 1;}int readHB_newmat_char(const char* filename, int* M, int* N, int* nonzeros, int** colptr,                           int** rowind, char** val, char** Valfmt){    FILE *in_file;    int Nrhs;    int Ptrcrd, Indcrd, Valcrd, Rhscrd;    int Valperline, Valwidth, Valprec;    int Valflag;           /* Indicates 'E','D', or 'F' float format */    char Title[73], Key[9], Type[4], Rhstype[4];    char Ptrfmt[17], Indfmt[17], Rhsfmt[21];    if ((in_file = fopen( filename, "r")) == NULL) {      fprintf(stderr,"Error: Cannot open file: %s\n",filename);      return 0;     }        *Valfmt = (char *)malloc(21*sizeof(char));    if ( *Valfmt == NULL ) IOHBTerminate("Insufficient memory for Valfmt.");    readHB_header(in_file, Title, Key, Type, M, N, nonzeros, &Nrhs,                  Ptrfmt, Indfmt, (*Valfmt), Rhsfmt,                  &Ptrcrd, &Indcrd, &Valcrd, &Rhscrd, Rhstype);    fclose(in_file);    ParseRfmt(*Valfmt,&Valperline,&Valwidth,&Valprec,&Valflag);        *colptr = (int *)malloc((*N+1)*sizeof(int));        if ( *colptr == NULL ) IOHBTerminate("Insufficient memory for colptr.\n");        *rowind = (int *)malloc(*nonzeros*sizeof(int));        if ( *rowind == NULL ) IOHBTerminate("Insufficient memory for rowind.\n");        if ( Type[0] == 'C' ) {/*   fprintf(stderr, "Warning: Reading complex data from HB file %s.\n",filename);   fprintf(stderr, "         Real and imaginary parts will be interlaced in val[].\n");*/           /* Malloc enough space for real AND imaginary parts of val[] */           *val = (char *)malloc(*nonzeros*Valwidth*sizeof(char)*2);           if ( *val == NULL ) IOHBTerminate("Insufficient memory for val.\n");        } else {           if ( Type[0] != 'P' ) {                /* Malloc enough space for real array val[] */             *val = (char *)malloc(*nonzeros*Valwidth*sizeof(char));             if ( *val == NULL ) IOHBTerminate("Insufficient memory for val.\n");           }        }  /* No val[] space needed if pattern only */	return readHB_mat_char(filename, *colptr, *rowind, *val, *Valfmt);}int readHB_aux_char(const char* filename, const char AuxType, char b[]){/****************************************************************************//*  This function opens and reads the specified file, placing auxilary      *//*  vector(s) of the given type (if available) in b :                       *//*  Return value is the number of vectors successfully read.                *//*                                                                          *//*                AuxType = 'F'   full right-hand-side vector(s)            *//*                AuxType = 'G'   initial Guess vector(s)                   *//*                AuxType = 'X'   eXact solution vector(s)                  *//*                                                                          *//*    ----------                                                            *//*    **CAVEAT**                                                            *//*    ----------                                                            *//*  Parsing real formats from Fortran is tricky, and this file reader       *//*  does not claim to be foolproof.   It has been tested for cases when     *//*  the real values are printed consistently and evenly spaced on each      *//*  line, with Fixed (F), and Exponential (E or D) formats.                 *//*                                                                          *//*  **  If the input file does not adhere to the H/B format, the  **        *//*  **             results will be unpredictable.                 **        *//*                                                                          *//****************************************************************************/    FILE *in_file;    int i,j,n,maxcol,start,stride,col,last,linel,nvecs,rhsi;    int Nrow, Ncol, Nnzero, Nentries,Nrhs;    int Ptrcrd, Indcrd, Valcrd, Rhscrd;    int Rhsperline, Rhswidth, Rhsprec;    int Rhsflag;    char Title[73], Key[9], Type[4], Rhstype[4];    char Ptrfmt[17], Indfmt[17], Valfmt[21], Rhsfmt[21];    char line[BUFSIZ];    char *ThisElement;    if ((in_file = fopen( filename, "r")) == NULL) {      fprintf(stderr,"Error: Cannot open file: %s\n",filename);      return 0;     }    readHB_header(in_file, Title, Key, Type, &Nrow, &Ncol, &Nnzero, &Nrhs,                  Ptrfmt, Indfmt, Valfmt, Rhsfmt,                  &Ptrcrd, &Indcrd, &Valcrd, &Rhscrd, Rhstype);    if (Nrhs <= 0)    {      fprintf(stderr, "Warn: Attempt to read auxillary vector(s) when none are present.\n");      return 0;    }    if (Rhstype[0] != 'F' )    {      fprintf(stderr,"Warn: Attempt to read auxillary vector(s) which are not stored in Full form.\n");      fprintf(stderr,"       Rhs must be specified as full. \n");      return 0;    }/* If reading complex data, allow for interleaved real and imaginary values. */     if ( Type[0] == 'C' ) {       Nentries = 2*Nrow;     } else {       Nentries = Nrow;    }    nvecs = 1;        if ( Rhstype[1] == 'G' ) nvecs++;    if ( Rhstype[2] == 'X' ) nvecs++;    if ( AuxType == 'G' && Rhstype[1] != 'G' ) {      fprintf(stderr, "Warn: Attempt to read auxillary Guess vector(s) when none are present.\n");      return 0;    }    if ( AuxType == 'X' && Rhstype[2] != 'X' ) {      fprintf(stderr, "Warn: Attempt to read auxillary eXact solution vector(s) when none are present.\n");      return 0;    }    ParseRfmt(Rhsfmt, &Rhsperline, &Rhswidth, &Rhsprec,&Rhsflag);    maxcol = Rhsperline*Rhswidth;/*  Lines to skip before starting to read RHS values... */    n = Ptrcrd + Indcrd + Valcrd;    for (i = 0; i < n; i++)      fgets(line, BUFSIZ, in_file);/*  start  - number of initial aux vector entries to skip   *//*           to reach first  vector requested               *//*  stride - number of aux vector entries to skip between   *//*           requested vectors                              */    if ( AuxType == 'F' ) start = 0;    else if ( AuxType == 'G' ) start = Nentries;    else start = (nvecs-1)*Nentries;    stride = (nvecs-1)*Nentries;    fgets(line, BUFSIZ, in_file);    linel= strchr(line,'\n')-line;    if ( sscanf(line,"%*s") < 0 )        IOHBTerminate("iohb.c: Null (or blank) line in auxillary vector data region of HB file.\n");    col = 0;/*  Skip to initial offset */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -