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 **)