static int xtc_coord(XDR *xd, int *natoms, rvec *box, rvec *x, real *prec, gmx_bool bRead) { int i, j, result; #if GMX_DOUBLE float *ftmp; float fprec; #endif /* box */ result = 1; for (i = 0; ((i < DIM) && result); i++) { for (j = 0; ((j < DIM) && result); j++) { result = XTC_CHECK("box", xdr_r2f(xd, &(box[i][j]), bRead)); } } if (!result) { return result; } #if GMX_DOUBLE /* allocate temp. single-precision array */ snew(ftmp, (*natoms)*DIM); /* Copy data to temp. array if writing */ if (!bRead) { for (i = 0; (i < *natoms); i++) { ftmp[DIM*i+XX] = x[i][XX]; ftmp[DIM*i+YY] = x[i][YY]; ftmp[DIM*i+ZZ] = x[i][ZZ]; } fprec = *prec; } result = XTC_CHECK("x", xdr3dfcoord(xd, ftmp, natoms, &fprec)); /* Copy from temp. array if reading */ if (bRead) { for (i = 0; (i < *natoms); i++) { x[i][XX] = ftmp[DIM*i+XX]; x[i][YY] = ftmp[DIM*i+YY]; x[i][ZZ] = ftmp[DIM*i+ZZ]; } *prec = fprec; } sfree(ftmp); #else result = XTC_CHECK("x", xdr3dfcoord(xd, x[0], natoms, prec)); #endif return result; }
void F77_FUNC(xdrf3dfcoord,XDRF3DFCOORD)(int *xdrid, float *fp, int *size, float *precision, int *ret) { xdr_fortran_lock(); *ret = xdr3dfcoord(xdridptr[*xdrid], fp, size, precision); xdr_fortran_unlock(); }
bool XtcFileFormat::read(std::istream &input, chemkit::TrajectoryFile *file) { // read data into temporary file QTemporaryFile dataFile; dataFile.open(); unsigned int dataSize = 0; for(;;){ char c = input.get(); if(input.eof()){ break; } dataFile.write(&c, 1); dataSize++; } dataFile.close(); XDR xdrs; xdropen(&xdrs, dataFile.fileName().toAscii().constData(), "r"); chemkit::Trajectory *trajectory = new chemkit::Trajectory; while(xdr_getpos(&xdrs) < dataSize){ // read magic (should be '1995') int magic = 0; xdr_int(&xdrs, &magic); if(magic != 1995){ break; } // create new frame chemkit::TrajectoryFrame *frame = trajectory->addFrame(); // read atom count int atomCount = 0; xdr_int(&xdrs, &atomCount); // read frame number int frameNumber = 0; xdr_int(&xdrs, &frameNumber); // read time float time = 0; xdr_float(&xdrs, &time); // read unit cell float box[3][3]; for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ xdr_float(&xdrs, &box[i][j]); } } chemkit::Vector3 x(box[0][0], box[0][1], box[0][2]); chemkit::Vector3 y(box[1][0], box[1][1], box[1][2]); chemkit::Vector3 z(box[2][0], box[2][1], box[2][2]); frame->setUnitCell(new chemkit::UnitCell(x * 10, y * 10, z * 10)); // read coordinates float coordinateData[3 * atomCount]; float precision = 1000.0f; xdr3dfcoord(&xdrs, coordinateData, &atomCount, &precision); chemkit::Coordinates coordinates(atomCount); for(int i = 0; i < atomCount; i++){ // multiply each coordinate by 10 to convert // from nanometers to angstroms chemkit::Point3 position(coordinateData[i*3+0] * 10, coordinateData[i*3+1] * 10, coordinateData[i*3+2] * 10); coordinates.setPosition(i, position); } frame->setCoordinates(&coordinates); } xdrclose(&xdrs); if(trajectory->isEmpty()){ delete trajectory; return false; } file->setTrajectory(trajectory); return true; }
void F77_FUNC(xdrf3dfcoord,XDRF3DFCOORD)(int *xdrid, float *fp, int *size, float *precision, int *ret) { *ret = xdr3dfcoord(xdridptr[*xdrid], fp, size, precision); }