static gmx_bool do_trnheader(t_fileio *fio, gmx_bool bRead, t_trnheader *sh, gmx_bool *bOK) { int magic = GROMACS_MAGIC; static gmx_bool bFirst = TRUE; char buf[256]; *bOK = TRUE; gmx_fio_checktype(fio); if (!gmx_fio_do_int(fio, magic) || magic != GROMACS_MAGIC) { return FALSE; } if (bRead) { *bOK = *bOK && gmx_fio_do_string(fio, buf); if (bFirst) { fprintf(stderr, "trn version: %s ", buf); } } else { sprintf(buf, "GMX_trn_file"); *bOK = *bOK && gmx_fio_do_string(fio, buf); } *bOK = *bOK && gmx_fio_do_int(fio, sh->ir_size); *bOK = *bOK && gmx_fio_do_int(fio, sh->e_size); *bOK = *bOK && gmx_fio_do_int(fio, sh->box_size); *bOK = *bOK && gmx_fio_do_int(fio, sh->vir_size); *bOK = *bOK && gmx_fio_do_int(fio, sh->pres_size); *bOK = *bOK && gmx_fio_do_int(fio, sh->top_size); *bOK = *bOK && gmx_fio_do_int(fio, sh->sym_size); *bOK = *bOK && gmx_fio_do_int(fio, sh->x_size); *bOK = *bOK && gmx_fio_do_int(fio, sh->v_size); *bOK = *bOK && gmx_fio_do_int(fio, sh->f_size); *bOK = *bOK && gmx_fio_do_int(fio, sh->natoms); if (!*bOK) { return *bOK; } sh->bDouble = (nFloatSize(sh) == sizeof(double)); gmx_fio_setprecision(fio, sh->bDouble); if (bRead && bFirst) { fprintf(stderr, "(%s precision)\n", sh->bDouble ? "double" : "single"); bFirst = FALSE; } *bOK = *bOK && gmx_fio_do_int(fio, sh->step); *bOK = *bOK && gmx_fio_do_int(fio, sh->nre); *bOK = *bOK && gmx_fio_do_real(fio, sh->t); *bOK = *bOK && gmx_fio_do_real(fio, sh->lambda); return *bOK; }
int get_tpr_version(const char *infile) { char buf[STRLEN]; gmx_bool bDouble; int precision,fver; t_fileio *fio; fio = open_tpx(infile,"r"); gmx_fio_checktype(fio); precision = sizeof(real); gmx_fio_do_string(fio,buf); if (strncmp(buf,"VERSION",7)) gmx_fatal(FARGS,"Can not read file %s,\n" " this file is from a Gromacs version which is older than 2.0\n" " Make a new one with grompp or use a gro or pdb file, if possible", gmx_fio_getname(fio)); gmx_fio_do_int(fio,precision); bDouble = (precision == sizeof(double)); if ((precision != sizeof(float)) && !bDouble) gmx_fatal(FARGS,"Unknown precision in file %s: real is %d bytes " "instead of %d or %d", gmx_fio_getname(fio),precision,sizeof(float),sizeof(double)); gmx_fio_setprecision(fio,bDouble); fprintf(stderr,"Reading file %s, %s (%s precision)\n", gmx_fio_getname(fio),buf,bDouble ? "double" : "single"); gmx_fio_do_int(fio,fver); close_tpx(fio); return fver; }
void gmx_mtxio_read (const char * filename, int * nrow, int * ncol, real ** full_matrix, gmx_sparsematrix_t ** sparse_matrix) { t_fileio *fio; XDR * xd; int i,j,prec; gmx_bool bDum = TRUE; gmx_bool bRead = TRUE; char gmxver[256]; size_t sz; fio = gmx_fio_open(filename,"r"); gmx_fio_checktype(fio); xd = gmx_fio_getxdr(fio); /* Read and check magic number */ i = GMX_MTXIO_MAGIC_NUMBER; gmx_fio_do_int(fio, i); if(i!=GMX_MTXIO_MAGIC_NUMBER) { gmx_fatal(FARGS, "No matrix data found in file. Note that the Hessian matrix format changed\n" "in Gromacs 3.3 to enable portable files and sparse matrix storage.\n"); } /* Read generating Gromacs version */ gmx_fio_do_string(fio, gmxver); /* Write 1 for double, 0 for single precision */ if(sizeof(real)==sizeof(double)) prec = 1; else prec = 0; gmx_fio_do_int(fio, prec); fprintf(stderr,"Reading %s precision matrix generated by Gromacs %s\n", (prec == 1) ? "double" : "single",gmxver); gmx_fio_do_int(fio, i); *nrow=i; gmx_fio_do_int(fio, i); *ncol=i; gmx_fio_do_int(fio, i); if(i==GMX_MTXIO_FULL_MATRIX) { printf("Full matrix storage format, nrow=%d, ncols=%d\n",*nrow,*ncol); sz = (*nrow) * (*ncol); snew((*full_matrix),sz); bDum=gmx_fio_ndo_real(fio, (*full_matrix),sz); } else { /* Sparse storage */ printf("Sparse matrix storage format, nrow=%d, ncols=%d\n",*nrow,*ncol); snew((*sparse_matrix),1); gmx_fio_do_gmx_bool(fio, (*sparse_matrix)->compressed_symmetric); gmx_fio_do_int(fio, (*sparse_matrix)->nrow); if((*sparse_matrix)->nrow != *nrow) { gmx_fatal(FARGS,"Internal inconsistency in sparse matrix.\n"); } snew((*sparse_matrix)->ndata,(*sparse_matrix)->nrow); snew((*sparse_matrix)->nalloc,(*sparse_matrix)->nrow); snew((*sparse_matrix)->data,(*sparse_matrix)->nrow); bDum=gmx_fio_ndo_int(fio, (*sparse_matrix)->ndata, (*sparse_matrix)->nrow); for(i=0;i<(*sparse_matrix)->nrow;i++) { (*sparse_matrix)->nalloc[i] = (*sparse_matrix)->ndata[i] + 10; snew(((*sparse_matrix)->data[i]),(*sparse_matrix)->nalloc[i]); for(j=0;j<(*sparse_matrix)->ndata[i];j++) { gmx_fio_do_int(fio, (*sparse_matrix)->data[i][j].col); gmx_fio_do_real(fio, (*sparse_matrix)->data[i][j].value); } } } gmx_fio_close(fio); }