void ReadWrite(char *rfile, char *wfile, int in_xtcBool, int out_xtcBool, int in_trrBool, int out_trrBool) { XDRFILE *xd_read, *xd_write; int result_xtc, result_trr; int natoms_xtc, natoms_trr; int step_xtc, step_trr; float time_xtc, time_trr; matrix box_xtc, box_trr; rvec *x_xtc, *x_trr, *v_trr, *f_trr; float prec_xtc = 1000.0; float lambda_trr = 0.0; xd_read = xdrfile_open(rfile, "r"); if (NULL == xd_read) die("Opening xdrfile for reading"); /* Test whether output file exists */ if ((xd_write = xdrfile_open(wfile,"r")) != NULL) { xdrfile_close(xd_write); die("Output file exists."); } /* Output file does not exist. Now we can open it for writing */ xd_write = xdrfile_open(wfile, "w"); if (NULL == xd_write) die("Opening xdrfile for writing"); /* .xtc -> .xtc */ if(in_xtcBool && out_xtcBool) { result_xtc = read_xtc_natoms(rfile, &natoms_xtc); if (exdrOK != result_xtc) die_r("read_xtc_natoms",result_xtc); x_xtc = (rvec *)calloc(natoms_xtc, sizeof(x_xtc[0])); while(1) { result_xtc = read_xtc(xd_read, natoms_xtc, &step_xtc, &time_xtc, box_xtc, x_xtc, &prec_xtc); if (result_xtc == 0) // if not reach the end of file, write it to the output.xtc file { if (exdrOK != result_xtc) die_r("Reading xtc file", result_xtc); result_xtc = write_xtc(xd_write, natoms_xtc, step_xtc, time_xtc, box_xtc, x_xtc, prec_xtc); if (result_xtc != 0) die_r("Writing xtc file", result_xtc); } else break; } } /* .xtc -> .trr */ if(in_xtcBool && out_trrBool) { result_xtc = read_xtc_natoms(rfile, &natoms_xtc); if (exdrOK != result_xtc) die_r("read_xtc_natoms",result_xtc); x_xtc = (rvec *)calloc(natoms_xtc, sizeof(x_xtc[0])); while(1) { result_xtc = read_xtc(xd_read, natoms_xtc, &step_xtc, &time_xtc, box_xtc, x_xtc, &prec_xtc); if (result_xtc == 0) // if not reach the end of file, write it to the output.trr file { if (exdrOK != result_xtc) die_r("Reading xtc file", result_xtc); result_trr = write_trr(xd_write, natoms_xtc, step_xtc, time_xtc, lambda_trr, box_xtc, x_xtc, NULL, NULL); if (0 != result_trr) die_r("Writing trr file",result_trr); } else break; } } /* .trr -> .trr */ if(in_trrBool && out_trrBool) { result_trr = read_trr_natoms(rfile, &natoms_trr); if (exdrOK != result_trr) die_r("read_trr_natoms",result_trr); x_trr = (rvec *)calloc(natoms_trr, sizeof(x_trr[0])); v_trr = (rvec *)calloc(natoms_trr, sizeof(v_trr[0])); f_trr = (rvec *)calloc(natoms_trr, sizeof(f_trr[0])); while (1) { result_trr = read_trr(xd_read, natoms_trr, &step_trr, &time_trr, &lambda_trr, box_trr, x_trr, v_trr, f_trr); int ii_trr, jj_trr, x_ck=0, v_ck=0, f_ck=0; int x_ck_bool=0, v_ck_bool=0, f_ck_bool=0; for (ii_trr = 0; ii_trr < natoms_trr; ii_trr++) { for(jj_trr = 0; jj_trr < DIM; jj_trr++) { if (x_trr[ii_trr][jj_trr] == 0) x_ck++; if (v_trr[ii_trr][jj_trr] == 0) v_ck++; if (f_trr[ii_trr][jj_trr] == 0) f_ck++; } } if (x_ck == natoms_trr*DIM) x_ck_bool = 1; if (v_ck == natoms_trr*DIM) v_ck_bool = 1; if (f_ck == natoms_trr*DIM) f_ck_bool = 1; if (result_trr == 0) // if not reach the end of file, write it to the output.trr file { if (exdrOK != result_trr) die_r("Reading trr file",result_trr); if(v_ck_bool && f_ck_bool) result_trr = write_trr(xd_write, natoms_trr, step_trr, time_trr, lambda_trr, box_trr, x_trr, NULL, NULL); else if(v_ck_bool) result_trr = write_trr(xd_write, natoms_trr, step_trr, time_trr, lambda_trr, box_trr, x_trr, NULL, f_trr); else if(f_ck_bool) result_trr = write_trr(xd_write, natoms_trr, step_trr, time_trr, lambda_trr, box_trr, x_trr, v_trr, NULL); else result_trr = write_trr(xd_write, natoms_trr, step_trr, time_trr, lambda_trr, box_trr, x_trr, v_trr, f_trr); if (0 != result_trr) die_r("Writing trr file",result_trr); } else break; } } /* .trr -> .xtc */ if(in_trrBool && out_xtcBool) { result_trr = read_trr_natoms(rfile, &natoms_trr); if (exdrOK != result_trr) die_r("read_trr_natoms",result_trr); x_trr = (rvec *)calloc(natoms_trr, sizeof(x_trr[0])); v_trr = (rvec *)calloc(natoms_trr, sizeof(v_trr[0])); f_trr = (rvec *)calloc(natoms_trr, sizeof(f_trr[0])); while(1) { result_trr = read_trr(xd_read, natoms_trr, &step_trr, &time_trr, &lambda_trr, box_trr, x_trr, v_trr, f_trr); if (result_trr == 0) // if not reach the end of file, write it to the output.trr file { if (exdrOK != result_trr) die_r("Reading trr file", result_trr); result_xtc = write_xtc(xd_write, natoms_trr, step_trr, time_trr, box_trr, x_trr, prec_xtc); if (result_xtc != 0) die_r("Writing xtc file", result_xtc); } else break; } } xdrfile_close(xd_read); xdrfile_close(xd_write); }
static void test_xtc() { char *testfn = "test.xtc"; XDRFILE *xd; int result,i,j,k,nframes=13; int natoms2,natoms1=173; int step2,step1=1993; float time2,time1=1097.23; matrix box2,box1; rvec *x2,*x1; float prec2,prec1=1000; float toler=1e-3; printf("Testing xtc functionality:"); for(i=0; (i<DIM); i++) for(j=0; (j<DIM); j++) box1[i][j] = (i+1)*3.7 + (j+1); x1 = calloc(natoms1,sizeof(*x1)); if (NULL == x1) die("Allocating memory for x1 in test_xtc"); for(i=0; (i<natoms1); i++) for(j=0; (j<DIM); j++) x1[i][j] = (i+1)*3.7 + (j+1); xd = xdrfile_open(testfn,"w"); if (NULL == xd) die("Opening xdrfile for writing"); for(k=0; (k<nframes); k++) { result = write_xtc(xd,natoms1,step1+k,time1+k,box1,x1,prec1); if (0 != result) die_r("Writing xtc file",result); } xdrfile_close(xd); result = read_xtc_natoms(testfn,&natoms2); if (exdrOK != result) die_r("read_xtc_natoms",result); if (natoms2 != natoms1) die("Number of atoms incorrect when reading trr"); x2 = calloc(natoms2,sizeof(x2[0])); if (NULL == x2) die("Allocating memory for x2"); xd = xdrfile_open(testfn,"r"); if (NULL == xd) die("Opening xdrfile for reading"); k = 0; do { result = read_xtc(xd,natoms2,&step2,&time2,box2,x2,&prec2); if (exdrENDOFFILE != result) { if (exdrOK != result) die_r("read_xtc",result); if (natoms2 != natoms1) die("natoms2 != natoms1"); if (step2-step1 != k) die("incorrect step"); if (fabs(time2-time1-k) > toler) die("incorrect time"); if (fabs(prec2-prec1) > toler) die("incorrect precision"); for(i=0; (i<DIM); i++) for(j=0; (j<DIM); j++) if (fabs(box2[i][j] - box1[i][j]) > toler) die("box incorrect"); for(i=0; (i<natoms1); i++) for(j=0; (j<DIM); j++) if (fabs(x2[i][j] - x1[i][j]) > toler) die("x incorrect"); } k++; } while (result == exdrOK); xdrfile_close(xd); #ifdef HAVE_UNISTD unlink(testfn); #endif printf(" PASSED\n"); }