コード例 #1
0
ファイル: trr2xtc.c プロジェクト: AFriemann/LowCarb
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);
  
}
コード例 #2
0
ファイル: xdrfile_c_test.c プロジェクト: 000Justin000/FastPCA
static void test_trr()
{
	char *testfn = "test.trr";
	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 lambda2,lambda1=0.4;
	float toler=1e-3;
	
	printf("Testing trr 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 trr file for writing");
	for(k=0; (k<nframes); k++)
		{
			result = write_trr(xd,natoms1,step1+k,time1+k,lambda1,box1,x1,NULL,NULL);
			if (0 != result)
				die_r("Writing trr file",result);
		}
	xdrfile_close(xd);
	
	result = read_trr_natoms(testfn,&natoms2);
	if (exdrOK != result)
		die_r("read_trr_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 trr file for reading");
	
	for(k=0; (k<nframes); k++) 
		{
			result = read_trr(xd,natoms2,&step2,&time2,&lambda2,box2,x2,NULL,NULL);
			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(lambda2-lambda2) > toler)
				die("incorrect lambda");
			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");
		} 
	
	xdrfile_close(xd);
#ifdef HAVE_UNISTD
	unlink(testfn);
#endif
	printf(" PASSED\n");
}