15 #ifndef OUTPUT_SINGLE_FILE    16 #define OUTPUT_SINGLE_FILE 1    21 #define access(PATH,MODE) _access(PATH,00)    24 #define NAMD_write NAMD_write64    28 #if defined(WIN32) && !defined(__CYGWIN__)    29     long retval = _write(fd,buf,count);
    31     ssize_t retval = write(fd,buf,count);
    33     if ( retval < 0 && errno == EINTR ) retval = 0;
    34     if ( retval < 0 ) 
NAMD_die(strerror(errno));
    35     if ( retval > count ) 
NAMD_bug(
"extra bytes written in NAMD_write64()");
    42 #define LSEEK _lseeki64    51   if ( retval < 0 ) 
NAMD_err(
"seek failed while writing DCD file");
    52   if ( whence == SEEK_SET && retval != offset ) {
    54     sprintf(buf, 
"seek failed while writing DCD file: SEEK_SET %lld returned %lld\n", offset, retval);
    61 #define LSEEK NAMD_seek    64 #define O_LARGEFILE 0x0    80 #define CHECK_FREAD(X, msg)  if (X==-1) \    82                                 return(DCD_BADREAD); \    97 #define CHECK_FEOF(X, msg)  if (X==0) \   105 void pad(
char *s, 
int len)
   118         for (i=curlen; i<len; i++)
   151         if (access(filename, F_OK) != 0)
   161         dcdfd=_open(filename, O_RDONLY|O_BINARY|
O_LARGEFILE);
   200                    int *NSAVC, 
double *DELTA, 
int *NAMNF, 
   214         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   216         CHECK_FREAD(ret_val, 
"reading first int from dcd file");
   217         CHECK_FEOF(ret_val, 
"reading first int from dcd file");
   219         if (input_integer != 84)
   225         ret_val = read(fd, HDR, 4);
   227         CHECK_FREAD(ret_val, 
"reading CORD from dcd file");
   228         CHECK_FEOF(ret_val, 
"reading CORD from dcd file");
   232         if (strcmp(HDR, 
"CORD") != 0)
   238         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   239         *NSET = input_integer;
   245         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   246         *ISTART = input_integer;
   253         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   254         *NSAVC = input_integer;
   263                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   270         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   271         *NAMNF = input_integer;
   277         ret_val = read(fd, &input_float, 
sizeof(
float));
   281         *DELTA = input_float;
   286                 ret_val = read(fd, &I, 
sizeof(
int32));
   293         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   295         CHECK_FREAD(ret_val, 
"reading second 84 from dcd file");
   296         CHECK_FEOF(ret_val, 
"reading second 84 from dcd file");
   298         if (input_integer != 84)
   304         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   306         CHECK_FREAD(ret_val, 
"reading size of title block");
   307         CHECK_FEOF(ret_val, 
"reading size of title block");
   309         if ( ((input_integer-4)%80) == 0)
   313                 ret_val = read(fd, &NTITLE, 
sizeof(
int32));
   318                 for (i=0; i<NTITLE; i++)
   320                         ret_val = read(fd, bigbuf, 80);
   327                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   329                 CHECK_FREAD(ret_val, 
"reading size of title block");
   330                 CHECK_FEOF(ret_val, 
"reading size of title block");
   338         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   343         if (input_integer != 4)
   349         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   353         CHECK_FEOF(ret_val, 
"reading number of atoms");
   356         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   361         if (input_integer != 4)
   368                 (*FREEINDEXES) = 
new int[(*N)-(*NAMNF)];
   369                 int32 *freeindexes32 = 
new int32[(*N)-(*NAMNF)];
   371                 if (*FREEINDEXES == NULL || freeindexes32 == NULL)
   375                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   377                 CHECK_FREAD(ret_val, 
"reading size of index array");
   378                 CHECK_FEOF(ret_val, 
"reading size of index array");
   380                 if (input_integer != ((*N)-(*NAMNF))*4)
   385                 ret_val = read(fd, freeindexes32, ((*N)-(*NAMNF))*
sizeof(
int32));
   387                 CHECK_FREAD(ret_val, 
"reading size of index array");
   388                 CHECK_FEOF(ret_val, 
"reading size of index array");
   390                 for (i=0; i<((*N)-(*NAMNF)); ++i)
   391                         (*FREEINDEXES)[i] = freeindexes32[i];
   393                 delete [] freeindexes32;
   395                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   397                 CHECK_FREAD(ret_val, 
"reading size of index array");
   398                 CHECK_FEOF(ret_val, 
"reading size of index array");
   400                 if (input_integer != ((*N)-(*NAMNF))*4)
   433 int read_dcdstep(
int fd, 
int N, 
float *
X, 
float *
Y, 
float *
Z, 
int num_fixed,
   434                  int first, 
int *indexes)
   442         if (first && num_fixed)
   444                 tmpX = 
new float[N-num_fixed];
   453         ret_val = read(fd, &input_integer, 
sizeof(
int32));
   455         CHECK_FREAD(ret_val, 
"reading number of atoms at begining of step");
   465         if ( (num_fixed==0) || first)
   467                 if (input_integer != 4*N)
   472                 ret_val = read(fd, 
X, 4*N);
   477                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   479                 CHECK_FREAD(ret_val, 
"reading number of atoms after X array");
   480                 CHECK_FEOF(ret_val, 
"reading number of atoms after X array");
   482                 if (input_integer != 4*N)
   487                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   489                 CHECK_FREAD(ret_val, 
"reading number of atoms after X array");
   490                 CHECK_FEOF(ret_val, 
"reading number of atoms after X array");
   492                 if (input_integer != 4*N)
   497                 ret_val = read(fd, 
Y, 4*N);
   502                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   504                 CHECK_FREAD(ret_val, 
"reading number of atoms after Y array");
   505                 CHECK_FEOF(ret_val, 
"reading number of atoms after Y array");
   507                 if (input_integer != 4*N)
   512                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   514                 CHECK_FREAD(ret_val, 
"reading number of atoms after Y array");
   515                 CHECK_FEOF(ret_val, 
"reading number of atoms after Y array");
   517                 if (input_integer != 4*N)
   522                 ret_val = read(fd, 
Z, 4*N);
   527                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   529                 CHECK_FREAD(ret_val, 
"reading number of atoms after Z array");
   530                 CHECK_FEOF(ret_val, 
"reading number of atoms after Z array");
   532                 if (input_integer != 4*N)
   539                 if (input_integer != 4*(N-num_fixed))
   544                 ret_val = read(fd, tmpX, 4*(N-num_fixed));
   549                 for (i=0; i<N-num_fixed; i++)
   551                         X[indexes[i]-1]=tmpX[i];
   554                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   556                 CHECK_FREAD(ret_val, 
"reading number of atoms after X array");
   557                 CHECK_FEOF(ret_val, 
"reading number of atoms after X array");
   559                 if (input_integer != 4*(N-num_fixed))
   564                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   566                 if (input_integer != 4*(N-num_fixed))
   571                 ret_val = read(fd, tmpX, 4*(N-num_fixed));
   576                 for (i=0; i<N-num_fixed; i++)
   578                         Y[indexes[i]-1]=tmpX[i];
   581                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   583                 CHECK_FREAD(ret_val, 
"reading number of atoms after Y array");
   584                 CHECK_FEOF(ret_val, 
"reading number of atoms after Y array");
   586                 if (input_integer != 4*(N-num_fixed))
   591                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   593                 if (input_integer != 4*(N-num_fixed))
   598                 ret_val = read(fd, tmpX, 4*(N-num_fixed));
   603                 for (i=0; i<N-num_fixed; i++)
   605                         Z[indexes[i]-1]=tmpX[i];
   608                 ret_val = read(fd, &input_integer, 
sizeof(
int32));
   610                 CHECK_FREAD(ret_val, 
"reading number of atoms after Z array");
   611                 CHECK_FEOF(ret_val, 
"reading number of atoms after Z array");
   613                 if (input_integer != 4*(N-num_fixed))
   623 #ifndef OUTPUT_SINGLE_FILE   624 #error OUTPUT_SINGLE_FILE not defined!   627 #if OUTPUT_SINGLE_FILE   628 #define NFILE_POS  ((OFF_T) 8)   629 #define NPRIV_POS  ((OFF_T) 12)   630 #define NSAVC_POS  ((OFF_T) 16)   631 #define NSTEP_POS  ((OFF_T) 20)   638 #define NFILE_POS  ((OFF_T) 20)   639 #define NPRIV_POS  ((OFF_T) 24)   640 #define NSAVC_POS  ((OFF_T) 28)   641 #define NSTEP_POS  ((OFF_T) 32)   669         while ( (dcdfd = _open(dcdname, O_RDWR|O_CREAT|O_EXCL|O_BINARY|
O_LARGEFILE,
   670                                 _S_IREAD|_S_IWRITE)) < 0)
   672 #ifdef NAMD_NO_O_EXCL   673         while ( (dcdfd = open(dcdname, O_RDWR|O_CREAT|O_TRUNC|
O_LARGEFILE,
   675         while ( (dcdfd = open(dcdname, O_RDWR|O_CREAT|O_EXCL|
O_LARGEFILE,
   677                                 S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0)
   692 #if OUTPUT_SINGLE_FILE   698         while ( (dcdfd = _open(dcdname, O_WRONLY|O_BINARY|
O_LARGEFILE,
   699                                 _S_IREAD|_S_IWRITE)) < 0)
   701         while ( (dcdfd = open(dcdname, O_WRONLY|
O_LARGEFILE,
   702                                 S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0)
   739         int32 NSAVC,NSTEP,NFILE;
   754   size_t nbytes = ((size_t) N) * 4;
   780         LSEEK(fd,end,SEEK_SET);
   787           int32 out_integer = 48;
   816   out_integer = N*
sizeof(float);
   823   LSEEK(fd, nbytes, SEEK_CUR);
   827   LSEEK(fd, nbytes, SEEK_CUR);
   831   LSEEK(fd, nbytes, SEEK_CUR);
   841         int32 NSAVC,NSTEP,NFILE;
   856         LSEEK(fd,end,SEEK_SET);
   867         int parN = parU-parL+1;
   868   size_t nbytes = ((size_t)parN) * 4;
   872         OFF_T xoffset = 
sizeof(int)+
sizeof(
float)*((
OFF_T)parL);
   873         LSEEK(fd, xoffset, SEEK_CUR);
   880         OFF_T yoffset = 2*
sizeof(int)+
sizeof(
float)*((
OFF_T)(N-parU+parL-1));
   881         LSEEK(fd, yoffset, SEEK_CUR);
   884         OFF_T zoffset = yoffset;
   885         LSEEK(fd, zoffset, SEEK_CUR);
   916                    int NSAVC, 
int NSTEP, 
double DELTA, 
int with_unitcell)
   920         char    title_string[200];
   923         struct  passwd *pwbuf;
   931         strcpy(title_string, 
"CORD");
   941         out_integer = NPRIV - NSAVC;  
   950         NAMD_write(fd, (
char *) &out_float, 
sizeof(
float));
   951   out_integer = with_unitcell ? 1 : 0;
   972         sprintf(title_string, 
"REMARKS FILENAME=%s CREATED BY NAMD", filename);
   973         pad(title_string, 80);
   977 #if defined(WIN32) || defined(NO_GETPWUID)   978         sprintf(username,
"Win32");
   980         user_id= (int) getuid();
   981         pwbuf=getpwuid(user_id);
   982         if ( pwbuf ) sprintf(username,
"%s",pwbuf->pw_name);
   983         else sprintf(username,
"%d",user_id);
   986         tmbuf=localtime(&cur_time);
   987         strftime(time_str, 10, 
"%m/%d/%y", tmbuf);
   989         sprintf(title_string, 
"REMARKS DATE: %s CREATED BY USER: %s",
   991         pad(title_string, 80);
  1007         int totalInt32s = 27; 
  1008         int totalChars = 164; 
  1009         int totalFloats = 1; 
  1010         headersize = 
sizeof(
int32)*totalInt32s+totalChars+
sizeof(
float)*totalFloats;
  1069   if ( fsync(fd) || close(fd) )
  1072     NAMD_err(
"Error closing DCD file");
 
#define CHECK_FEOF(X, msg)
 
int open_dcd_write_par_slave(char *dcdname)
 
int open_dcd_read(char *filename)
 
void NAMD_err(const char *err_msg)
 
int update_dcdstep_par_header(int fd)
 
#define CHECK_FREAD(X, msg)
 
int open_dcd_write(const char *dcdname)
 
int read_dcdstep(int, int, float *, float *, float *, int, int, int *)
 
int write_dcdstep_par_XYZUnits(int fd, int N)
 
int write_dcdstep_par_cell(int fd, double *cell)
 
OFF_T NAMD_seek(int file, OFF_T offset, int whence)
 
void NAMD_bug(const char *err_msg)
 
void close_dcd_read(int fd, int num_fixed, int *indexes)
 
int write_dcdstep(int fd, int N, float *X, float *Y, float *Z, double *cell)
 
void NAMD_die(const char *err_msg)
 
int write_dcdheader(int fd, const char *filename, int N, int NFILE, int NPRIV, int NSAVC, int NSTEP, double DELTA, int with_unitcell)
 
void NAMD_backup_file(const char *filename, const char *extension)
 
int write_dcdstep_par_slave(int fd, int parL, int parU, int N, float *X, float *Y, float *Z)
 
void close_dcd_write(int fd)
 
void pad(char *s, int len)
 
int read_dcdheader(int, int *, int *, int *, int *, double *, int *, int **)