void do_enxnms(int fp,int *nre,char ***nms) { bool bRead; bRead = gmx_fio_getread(fp); if (gmx_fio_getftp(fp) == efEDR) { gmx_fio_select(fp); edr_nms(fp,nre,nms); } else if (bRead) rd_ener_nms(gmx_fio_getfp(fp),nre,nms); else wr_ener_nms(gmx_fio_getfp(fp),*nre,*nms); }
static bool do_trnheader(int fp,bool bRead,t_trnheader *sh, bool *bOK) { const int magic=GROMACS_MAGIC; const char *version = "GMX_trn_file"; static bool bFirst=TRUE; char buf[256]; *bOK=TRUE; gmx_fio_select(fp); if (!do_int(magic)) return FALSE; if (bRead) { *bOK = *bOK && do_string(buf); if (bFirst) fprintf(stderr,"trn version: %s ",buf); } else *bOK = *bOK && do_string(version); *bOK = *bOK && do_int(sh->ir_size); *bOK = *bOK && do_int(sh->e_size); *bOK = *bOK && do_int(sh->box_size); *bOK = *bOK && do_int(sh->vir_size); *bOK = *bOK && do_int(sh->pres_size); *bOK = *bOK && do_int(sh->top_size); *bOK = *bOK && do_int(sh->sym_size); *bOK = *bOK && do_int(sh->x_size); *bOK = *bOK && do_int(sh->v_size); *bOK = *bOK && do_int(sh->f_size); *bOK = *bOK && do_int(sh->natoms); if (!*bOK) return *bOK; sh->bDouble = (nFloatSize(sh) == sizeof(double)); gmx_fio_setprecision(fp,sh->bDouble); if (bRead && bFirst) { fprintf(stderr,"(%s precision)\n",sh->bDouble ? "double" : "single"); bFirst = FALSE; } *bOK = *bOK && do_int(sh->step); *bOK = *bOK && do_int(sh->nre); *bOK = *bOK && do_real(sh->t); *bOK = *bOK && do_real(sh->lambda); return *bOK; }
bool do_enx(int fp,t_enxframe *fr) { int i,block; bool bRead,bOK,bOK1,bSane; real tmp1,tmp2; bOK = TRUE; bRead = gmx_fio_getread(fp); if (!bRead) { fr->e_size = fr->nre*sizeof(fr->ener[0].e)*4; fr->d_size = fr->ndisre*(sizeof(fr->rav[0]) + sizeof(fr->rt[0])); } gmx_fio_select(fp); if (!do_eheader(fp,fr,&bOK)) { if (bRead) { fprintf(stderr,"\rLast frame read %d ",framenr-1); if (!bOK) fprintf(stderr,"\nWARNING: Incomplete frame: nr %6d time %8.3f\n", framenr,fr->t); } return FALSE; } if (bRead) { if ( ( framenr<10 ) || ( framenr%10 == 0) ) fprintf(stderr,"\rReading frame %6d time %8.3f ",framenr,fr->t); framenr++; } /* Check sanity of this header */ bSane = (fr->nre > 0 || fr->ndisre > 0); for(block=0; block<fr->nblock; block++) bSane = bSane || (fr->nr[block] > 0); if (!((fr->step >= 0) && bSane)) { fprintf(stderr,"\nWARNING: there may be something wrong with energy file %s\n", gmx_fio_getname(fp)); fprintf(stderr,"Found: step=%d, nre=%d, ndisre=%d, nblock=%d, time=%g.\n" "Trying to skip frame expect a crash though\n", fr->step,fr->nre,fr->ndisre,fr->nblock,fr->t); } if (bRead && fr->nre>fr->e_alloc) { srenew(fr->ener,fr->nre); fr->e_alloc = fr->nre; } for(i=0; i<fr->nre; i++) { bOK = bOK && do_real(fr->ener[i].e); tmp1 = fr->ener[i].eav; if((tmp1/(fr->step+1))<GMX_REAL_EPS) tmp1=0; bOK = bOK && do_real(tmp1); fr->ener[i].eav = tmp1; /* This is to save only in single precision (unless compiled in DP) */ tmp2 = fr->ener[i].esum; bOK = bOK && do_real(tmp2); fr->ener[i].esum = tmp2; bOK = bOK && do_real(fr->ener[i].e2sum); } if (fr->ndisre) { if (bRead && fr->ndisre>fr->d_alloc) { srenew(fr->rav,fr->ndisre); srenew(fr->rt,fr->ndisre); fr->d_alloc = fr->ndisre; } ndo_real(fr->rav,fr->ndisre,bOK1); bOK = bOK && bOK1; ndo_real(fr->rt,fr->ndisre,bOK1); bOK = bOK && bOK1; } for(block=0; block<fr->nblock; block++) { if (bRead && fr->nr[block]>fr->b_alloc[block]) { srenew(fr->block[block],fr->nr[block]); fr->b_alloc[block] = fr->nr[block]; } ndo_real(fr->block[block],fr->nr[block],bOK1); bOK = bOK && bOK1; } if (!bOK) { if (bRead) { fprintf(stderr,"\nLast frame read %d ", framenr-1); fprintf(stderr,"\nWARNING: Incomplete frame: nr %6d time %8.3f \n", framenr,fr->t); } else fatal_error(-1,"could not write energies"); return FALSE; } return TRUE; }
int open_enx(char *fn,char *mode) { int fp,nre,i; char **nm=NULL; t_enxframe *fr; bool bDum=TRUE; /* Energy files should always be opened as binary files, * but that is checked in gmx_fio_open. */ if (mode[0]=='r') { fp=gmx_fio_open(fn,mode); gmx_fio_select(fp); gmx_fio_setprecision(fp,FALSE); do_enxnms(fp,&nre,&nm); snew(fr,1); do_eheader(fp,fr,&bDum); /* Now check whether this file is in single precision */ if (((fr->e_size && (fr->nre == nre) && (nre*4*sizeof(float) == fr->e_size)) || (fr->d_size && (fr->ndisre*sizeof(float)*2+sizeof(int) == fr->d_size)))){ fprintf(stderr,"Opened %s as single precision energy file\n",fn); for(i=0; (i<nre); i++) sfree(nm[i]); sfree(nm); } else { gmx_fio_rewind(fp); gmx_fio_select(fp); gmx_fio_setprecision(fp,TRUE); do_enxnms(fp,&nre,&nm); do_eheader(fp,fr,&bDum); if (((fr->e_size && (fr->nre == nre) && (nre*4*sizeof(double) == fr->e_size)) || (fr->d_size && (fr->ndisre*sizeof(double)*2+sizeof(int) == fr->d_size)))) fprintf(stderr,"Opened %s as double precision energy file\n",fn); else { if (empty_file(fn)) fatal_error(0,"File %s is empty",fn); else fatal_error(0,"Energy file %s not recognized, maybe different CPU?", fn); } for(i=0; (i<nre); i++) sfree(nm[i]); sfree(nm); } free_enxframe(fr); sfree(fr); gmx_fio_rewind(fp); } else fp = gmx_fio_open(fn,mode); framenr=0; return fp; }
void gmx_mtxio_write(char * filename, int nrow, int ncol, real * full_matrix, gmx_sparsematrix_t * sparse_matrix) { int fd; XDR * xd; int i,j,prec; bool bDum = TRUE; bool bRead = FALSE; size_t sz; if(full_matrix!=NULL && sparse_matrix!=NULL) { gmx_fatal(FARGS,"Both full AND sparse matrix specified to gmx_mtxio_write().\n"); } fd = gmx_fio_open(filename,"w"); gmx_fio_select(fd); xd = gmx_fio_getxdr(fd); /* Write magic number */ i = GMX_MTXIO_MAGIC_NUMBER; do_int(i); /* Write generating Gromacs version */ do_string(GromacsVersion()); /* Write 1 for double, 0 for single precision */ if(sizeof(real)==sizeof(double)) prec = 1; else prec = 0; do_int(prec); do_int(nrow); do_int(ncol); if(full_matrix!=NULL) { /* Full matrix storage format */ i = GMX_MTXIO_FULL_MATRIX; do_int(i); sz = nrow*ncol; ndo_real(full_matrix,sz,bDum); } else { /* Sparse storage */ i = GMX_MTXIO_SPARSE_MATRIX; do_int(i); do_int(sparse_matrix->compressed_symmetric); do_int(sparse_matrix->nrow); if(sparse_matrix->nrow != nrow) { gmx_fatal(FARGS,"Internal inconsistency in sparse matrix.\n"); } ndo_int(sparse_matrix->ndata,sparse_matrix->nrow,bDum); for(i=0; i<sparse_matrix->nrow; i++) { for(j=0; j<sparse_matrix->ndata[i]; j++) { do_int(sparse_matrix->data[i][j].col); do_real(sparse_matrix->data[i][j].value); } } } gmx_fio_close(fd); }
void gmx_mtxio_read (char * filename, int * nrow, int * ncol, real ** full_matrix, gmx_sparsematrix_t ** sparse_matrix) { int fd; XDR * xd; int i,j,prec; bool bDum = TRUE; bool bRead = TRUE; char gmxver[256]; size_t sz; fd = gmx_fio_open(filename,"r"); gmx_fio_select(fd); xd = gmx_fio_getxdr(fd); /* Read and check magic number */ i = GMX_MTXIO_MAGIC_NUMBER; do_int(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 */ do_string(gmxver); /* Write 1 for double, 0 for single precision */ if(sizeof(real)==sizeof(double)) prec = 1; else prec = 0; do_int(prec); fprintf(stderr,"Reading %s precision matrix generated by Gromacs %s\n", (prec == 1) ? "double" : "single",gmxver); do_int(i); *nrow=i; do_int(i); *ncol=i; do_int(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); ndo_real((*full_matrix),sz,bDum); } else { /* Sparse storage */ printf("Sparse matrix storage format, nrow=%d, ncols=%d\n",*nrow,*ncol); snew((*sparse_matrix),1); do_int((*sparse_matrix)->compressed_symmetric); do_int((*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); ndo_int((*sparse_matrix)->ndata,(*sparse_matrix)->nrow,bDum); 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++) { do_int((*sparse_matrix)->data[i][j].col); do_real((*sparse_matrix)->data[i][j].value); } } } gmx_fio_close(fd); }
bool do_enx(int fp,t_enxframe *fr) { int file_version=-1; int i,block; bool bRead,bOK,bOK1,bSane; real tmp1,tmp2,rdum; char buf[22]; bOK = TRUE; bRead = gmx_fio_getread(fp); if (!bRead) { fr->e_size = fr->nre*sizeof(fr->ener[0].e)*4; fr->d_size = fr->ndisre*(sizeof(fr->disre_rm3tav[0]) + sizeof(fr->disre_rt[0])); } gmx_fio_select(fp); if (!do_eheader(fp,&file_version,fr,FALSE,&bOK)) { if (bRead) { fprintf(stderr,"\rLast energy frame read %d time %8.3f ", framenr-1,frametime); if (!bOK) { fprintf(stderr, "\nWARNING: Incomplete energy frame: nr %d time %8.3f\n", framenr,fr->t); } } else { gmx_file("Cannot write energy file header; maybe you are out of quota?"); } return FALSE; } if (bRead) { if ((framenr < 20 || framenr % 10 == 0) && (framenr < 200 || framenr % 100 == 0) && (framenr < 2000 || framenr % 1000 == 0)) { fprintf(stderr,"\rReading energy frame %6d time %8.3f ", framenr,fr->t); } framenr++; frametime = fr->t; } /* Check sanity of this header */ bSane = (fr->nre > 0 || fr->ndisre > 0); for(block=0; block<fr->nblock; block++) { bSane = bSane || (fr->nr[block] > 0); } if (!((fr->step >= 0) && bSane)) { fprintf(stderr,"\nWARNING: there may be something wrong with energy file %s\n", gmx_fio_getname(fp)); fprintf(stderr,"Found: step=%s, nre=%d, ndisre=%d, nblock=%d, time=%g.\n" "Trying to skip frame expect a crash though\n", gmx_step_str(fr->step,buf),fr->nre,fr->ndisre,fr->nblock,fr->t); } if (bRead && fr->nre > fr->e_alloc) { srenew(fr->ener,fr->nre); for(i=fr->e_alloc; (i<fr->nre); i++) { fr->ener[i].e = 0; fr->ener[i].eav = 0; fr->ener[i].esum = 0; } fr->e_alloc = fr->nre; } for(i=0; i<fr->nre; i++) { bOK = bOK && do_real(fr->ener[i].e); /* Do not store sums of length 1, * since this does not add information. */ if (file_version == 1 || (bRead && fr->nsum > 0) || fr->nsum > 1) { tmp1 = fr->ener[i].eav; bOK = bOK && do_real(tmp1); if (bRead) fr->ener[i].eav = tmp1; /* This is to save only in single precision (unless compiled in DP) */ tmp2 = fr->ener[i].esum; bOK = bOK && do_real(tmp2); if (bRead) fr->ener[i].esum = tmp2; if (file_version == 1) { /* Old, unused real */ rdum = 0; bOK = bOK && do_real(rdum); } } } /* Here we can not check for file_version==1, since one could have * continued an old format simulation with a new one with mdrun -append. */ if (bRead && fp < ener_old_nalloc && ener_old[fp].bOldFileOpen) { /* Convert old full simulation sums to sums between energy frames */ convert_full_sums(&ener_old[fp],fr); } if (fr->ndisre) { if (bRead && fr->ndisre>fr->d_alloc) { srenew(fr->disre_rm3tav,fr->ndisre); srenew(fr->disre_rt,fr->ndisre); fr->d_alloc = fr->ndisre; } ndo_real(fr->disre_rm3tav,fr->ndisre,bOK1); bOK = bOK && bOK1; ndo_real(fr->disre_rt,fr->ndisre,bOK1); bOK = bOK && bOK1; } for(block=0; block<fr->nblock; block++) { if (bRead && fr->nr[block]>fr->b_alloc[block]) { srenew(fr->block[block],fr->nr[block]); fr->b_alloc[block] = fr->nr[block]; } ndo_real(fr->block[block],fr->nr[block],bOK1); bOK = bOK && bOK1; } if(!bRead) { if( gmx_fio_flush(fp) != 0) { gmx_file("Cannot write energy file; maybe you are out of quota?"); } } if (!bOK) { if (bRead) { fprintf(stderr,"\nLast energy frame read %d", framenr-1); fprintf(stderr,"\nWARNING: Incomplete energy frame: nr %d time %8.3f\n", framenr,fr->t); } else { gmx_fatal(FARGS,"could not write energies"); } return FALSE; } return TRUE; }
int open_enx(const char *fn,const char *mode) { int fp,nre,i; gmx_enxnm_t *nms=NULL; int file_version=-1; t_enxframe *fr; bool bDum=TRUE; if (mode[0]=='r') { fp=gmx_fio_open(fn,mode); gmx_fio_select(fp); gmx_fio_setprecision(fp,FALSE); do_enxnms(fp,&nre,&nms); snew(fr,1); do_eheader(fp,&file_version,fr,TRUE,&bDum); if(!bDum) { gmx_file("Cannot read energy file header. Corrupt file?"); } /* Now check whether this file is in single precision */ if (((fr->e_size && (fr->nre == nre) && (nre*4*sizeof(float) == fr->e_size)) || (fr->d_size && (fr->ndisre*sizeof(float)*2+sizeof(int) == fr->d_size)))){ fprintf(stderr,"Opened %s as single precision energy file\n",fn); free_enxnms(nre,nms); } else { gmx_fio_rewind(fp); gmx_fio_select(fp); gmx_fio_setprecision(fp,TRUE); do_enxnms(fp,&nre,&nms); do_eheader(fp,&file_version,fr,TRUE,&bDum); if(!bDum) { gmx_file("Cannot write energy file header; maybe you are out of quota?"); } if (((fr->e_size && (fr->nre == nre) && (nre*4*sizeof(double) == fr->e_size)) || (fr->d_size && (fr->ndisre*sizeof(double)*2+sizeof(int) == fr->d_size)))) fprintf(stderr,"Opened %s as double precision energy file\n",fn); else { if (empty_file(fn)) gmx_fatal(FARGS,"File %s is empty",fn); else gmx_fatal(FARGS,"Energy file %s not recognized, maybe different CPU?", fn); } free_enxnms(nre,nms); } free_enxframe(fr); sfree(fr); gmx_fio_rewind(fp); } else fp = gmx_fio_open(fn,mode); framenr=0; frametime=0; return fp; }
void do_enxnms(int fp,int *nre,gmx_enxnm_t **nms) { int magic=-55555; XDR *xdr; bool bRead = gmx_fio_getread(fp); int file_version; int i; gmx_fio_select(fp); xdr = gmx_fio_getxdr(fp); if (!xdr_int(xdr,&magic)) { if(!bRead) { gmx_file("Cannot write energy names to file; maybe you are out of quota?"); } *nre=0; return; } if (magic > 0) { /* Assume this is an old edr format */ file_version = 1; *nre = magic; if (fp >= ener_old_nalloc) { srenew(ener_old,fp + 1); for(i=ener_old_nalloc; i<fp+1; i++) { ener_old[i].bOldFileOpen = FALSE; ener_old[i].ener_prev = NULL; } ener_old_nalloc = fp + 1; } ener_old[fp].bOldFileOpen = TRUE; ener_old[fp].bReadFirstStep = FALSE; srenew(ener_old[fp].ener_prev,*nre); } else { if (fp < ener_old_nalloc) { ener_old[fp].bOldFileOpen = FALSE; } if (magic != -55555) { gmx_fatal(FARGS,"Energy names magic number mismatch, this is not a GROMACS edr file"); } file_version = enx_version; xdr_int(xdr,&file_version); if (file_version > enx_version) { gmx_fatal(FARGS,"reading tpx file (%s) version %d with version %d program",gmx_fio_getname(fp),file_version,enx_version); } xdr_int(xdr,nre); } if (file_version != enx_version) { fprintf(stderr,"Note: enx file_version %d, software version %d\n", file_version,enx_version); } edr_strings(xdr,bRead,file_version,*nre,nms); }