Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #4
0
void 
F77_FUNC(xdrf3dfcoord,XDRF3DFCOORD)(int *xdrid, float *fp, int *size, float *precision, int *ret)
{
	*ret = xdr3dfcoord(xdridptr[*xdrid], fp, size, precision);
}