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; }
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); }
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); }
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; }