⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdcorlt.c

📁 一个很好的分子动力学程序
💻 C
字号:
/*************************************************************************History*************************************************************************//*8 Jan 1997   Added test in ReadCorFile to return if end-of-file encounteredwhen reading first string.  This was a problem encounteredwhen trying to read a COR file with more than one step.*//*************************************************************************Compile Switches*************************************************************************//*************************************************************************File Includes*************************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include "cdcor.h"/*Import   Structure Particle_t*/#include "particle.h"/*Import   CleanAfterError()*/#include "cdhouse.h"/*Import  ReallocateParticle()*/#include "cdalloc.h"/*************************************************************************Defines*************************************************************************//*  Boolean values  */#define BOOLEAN int#define TRUE    1#define FALSE   0/*Define types for standardizing file reads between machines  - Following definitions valid for PC, Linux and AIX*/#define INT2    short#define INT4    int#define WORD1   unsigned char#define WORD2   unsigned short#define WORD4   unsigned long#define REAL4   float#define REAL8   double/*  Maximum value of word  */#define MAX_WORD2 0xffff/*  Default string length  */#define STRING_LENGTH 256/*************************************************************************Macros*************************************************************************//*  Macro for reversing byte order  */#define REVERSE(VAR) \   ReverseVar (&(VAR), sizeof(VAR));/*  Macro for block write  */#define FWRITE(VAR,FILE,N) \   fwrite (&(VAR), sizeof(VAR), (N), (FILE));/*  Macro for block read  */#define FREAD(VAR,FILE,N) \   fread (&(VAR), sizeof(VAR), (N), (FILE));/*  Macro for string write  */#define FWRITESTR(STRING,FILE) \   fwrite (STRING, strlen(STRING), (1), (FILE));/*************************************************************************Type Definitions*************************************************************************/typedef struct   {   INT2   EndianWord;   INT4   Run;   INT4   Step;   REAL8  Time;   WORD2  BoundaryType;   WORD1  Surf[NDIR];   REAL8  Box [NDIR];   REAL8  Etot;   REAL8  Epot;   REAL8  Ekin;   REAL8  Ebath;   REAL8  Min [NDIR];   REAL8  Max [NDIR];   INT4   Np;   }   CorFileHeader_t;/*************************************************************************Module-wide Variables*************************************************************************/INT2   EndianWord_m         = 0x0001;INT2   SwitchedEndianWord_m = 0x0100;char *VersionStr_m = "COR FILE: Version 1.0.0";char *CompareStr_m = "COR FILE";/*************************************************************************Local Function Prototypes*************************************************************************/void GetNextStringFromFile (char *InputString, int Length, FILE *InputFile);void ReverseVar (void *WordPtr, int SizeVar);void ReverseHeader (CorFileHeader_t *FileHeader);/*************************************************************************Exported Functions*************************************************************************/void ReadCorFile (FILE *InputFile, Particle_t *a)   {   int    ititle;   int    ipart;   int    idir;   int    InputNP;   WORD2  WordCoord[NDIR];   double Min  [NDIR];   double Max  [NDIR];   double Scale[NDIR];   BOOLEAN IsReverse;   char   InputChar;   char   InputStr[STRING_LENGTH];   CorFileHeader_t FileHeader;   /*   *********************   Read Text Format Data   *********************   */   /*  Determine if input file is a cor file  */   GetNextStringFromFile (InputStr, STRING_LENGTH, InputFile);   /*  Test for end of file  */   if (feof(InputFile))      {      return;      }   if (strncmp(InputStr, CompareStr_m, strlen(CompareStr_m))!=0)      {      printf ("ERROR READING COR FILE: \n");      printf ("  Input file is not a COR file.\n");      CleanAfterError();      }   /*  Read input file version  */   if (strcmp(InputStr, VersionStr_m)!=0)      {      printf ("ERROR READING COR FILE: \n");      printf ("  Input file is version: %s\n", InputStr);      printf ("  Can only read version: %s\n", VersionStr_m);      CleanAfterError();      }   /*  Skip date, run, step, title, strings  */   GetNextStringFromFile (InputStr, STRING_LENGTH, InputFile);   GetNextStringFromFile (InputStr, STRING_LENGTH, InputFile);   GetNextStringFromFile (InputStr, STRING_LENGTH, InputFile);   GetNextStringFromFile (InputStr, STRING_LENGTH, InputFile);   /*  Read title lines  */   LOOP (ititle, 8)      {      GetNextStringFromFile (InputStr, STRING_LENGTH, InputFile);      strcpy (a->title[ititle], InputStr);      }   /*  Next character should be DOS End-of-file character  */   FREAD (InputChar, InputFile, 1)   if (InputChar != '\032')      {      printf ("ERROR:  COR file is corrupted.\n");      CleanAfterError();      }   /*   ************************   Read Machine Format Data   ************************   */   FREAD (FileHeader.EndianWord,    InputFile, 1)   FREAD (FileHeader.Run,           InputFile, 1)   FREAD (FileHeader.Step,          InputFile, 1)   FREAD (FileHeader.Time,          InputFile, 1)   FREAD (FileHeader.BoundaryType,  InputFile, 1)   FREAD (FileHeader.Surf[X],       InputFile, 1)   FREAD (FileHeader.Surf[Y],       InputFile, 1)   FREAD (FileHeader.Surf[Z],       InputFile, 1)   FREAD (FileHeader.Box[X],        InputFile, 1)   FREAD (FileHeader.Box[Y],        InputFile, 1)   FREAD (FileHeader.Box[Z],        InputFile, 1)   FREAD (FileHeader.Etot,          InputFile, 1)   FREAD (FileHeader.Epot,          InputFile, 1)   FREAD (FileHeader.Ekin,          InputFile, 1)   FREAD (FileHeader.Ebath,         InputFile, 1)   FREAD (FileHeader.Min[X],        InputFile, 1)   FREAD (FileHeader.Min[Y],        InputFile, 1)   FREAD (FileHeader.Min[Z],        InputFile, 1)   FREAD (FileHeader.Max[X],        InputFile, 1)   FREAD (FileHeader.Max[Y],        InputFile, 1)   FREAD (FileHeader.Max[Z],        InputFile, 1)   FREAD (FileHeader.Np,            InputFile, 1)WRITEVAR(FileHeader.Run,%i)WRITEVAR(FileHeader.Step,%i)WRITEVAR(FileHeader.Time,%le)WRITEVAR(FileHeader.Box[X],%le)WRITEVAR(FileHeader.Box[Y],%le)WRITEVAR(FileHeader.Box[Z],%le)   /*   Set flag for reversing byte order   (necessary if file written on CPU of opposite Endian Type   */   IsReverse = (FileHeader.EndianWord != EndianWord_m);   if (IsReverse)      ReverseHeader (&FileHeader);   /*  Copy header to Particle_t data  */   a->run           =  FileHeader.Run;   a->step          =  FileHeader.Step;   a->time          =  FileHeader.Time;   a->surf[X]       =  FileHeader.Surf[X];   a->surf[Y]       =  FileHeader.Surf[Y];   a->surf[Z]       =  FileHeader.Surf[Z];   a->bcur[X]       =  FileHeader.Box[X];   a->bcur[Y]       =  FileHeader.Box[Y];   a->bcur[Z]       =  FileHeader.Box[Z];   a->etot          =  FileHeader.Etot;   a->epot          =  FileHeader.Epot;   a->ekin          =  FileHeader.Ekin;   a->ebath         =  FileHeader.Ebath;   Min[X]           =  FileHeader.Min[X];   Min[Y]           =  FileHeader.Min[Y];   Min[Z]           =  FileHeader.Min[Z];   Max[X]           =  FileHeader.Max[X];   Max[Y]           =  FileHeader.Max[Y];   Max[Z]           =  FileHeader.Max[Z];   InputNP          =  (int) FileHeader.Np;   /*  Initialize variables  */   a->coordflag     = TRUE;   a->boxflag       = TRUE;   /*   ************************   Allocate space as needed   ************************   */   /*  Allocate space for types and particles  */   /*  Reallocate particles if new number different from previous number  */   if (InputNP != a->np)      ReallocateParticle (a, InputNP);   /*  Reallocate tag info if keeping it  */   if (a->selkeep)      {      if (a->tag==NULL)         a->tag  = (BYTE *) calloc   ( (BYTE) InputNP, sizeof(BYTE) );      }   /* .. else remove tag info, clear select  */   else      {      /*  Remove tag  */      if (a->tag!=NULL)         {         free (a->tag);         a->tag = NULL;         }      /*  Clear select  */		if (a->Selection != NULL)         LOOP (ipart, InputNP)				REMOVE_SELECT(ipart);      }   a->np = InputNP;   /*   **********************************   Read particle type and coordinates   **********************************   */   /*   Read particle types (these are individual bytes ->   don't need  to reverse byte order due to endian mis-match)   */   FREAD (a->type[0], InputFile, a->np)   /*  Find scale for particles  */   LOOP (idir, NDIR)      {WRITEVAR(Min[idir],%le)WRITEVAR(Max[idir],%le)      if (Max[idir]==Min[idir])         Scale[idir] = 0.0;      else         Scale[idir] = (Max[idir] - Min[idir]) / MAX_WORD2;      }   /*  Read particle coordinates  */   LOOP (ipart, a->np)      {      /*  Read scaled word coordinates  */      FREAD   (WordCoord[X], InputFile, NDIR)      /*  Reverse byte order if necessary  */      if (IsReverse)         {         REVERSE (WordCoord[X])         REVERSE (WordCoord[Y])         REVERSE (WordCoord[Z])         }      /*  Scale to real coordinates  */      LOOP (idir, NDIR)			{         a->cur[NDIR*ipart+idir] = Scale[idir]*WordCoord[idir] + Min[idir];			}      }   }/*   ... ReadCorFile  *//*************************************************************************Local Functions*************************************************************************//*  Reverse bytes of word (works for any length WORD)  */void ReverseVars (void *VarPtr, int SizeVar, int NumVar)   {   BYTE *BytePtr;   BYTE TempByte;   int  FirstIndex;   int  LastIndex;   int  ivar;   /*  Set BYTE pointer to WORD array  */   BytePtr = (BYTE *) VarPtr;   LOOP (ivar, NumVar)      {      /*  Find start and end of current word in list  */      FirstIndex = ivar * SizeVar;      LastIndex  = FirstIndex + SizeVar - 1;      while (FirstIndex<LastIndex)         {         TempByte = BytePtr[FirstIndex];         BytePtr[FirstIndex] = BytePtr[LastIndex];         BytePtr[LastIndex ] = TempByte;         FirstIndex++;         LastIndex--;         }      }   }/* .. Reverse Vars  *//*  Read binary file into string until LineFeed encountered  */void GetNextStringFromFile (char *InputString, int Length, FILE *InputFile)   {   int iread;   char InputChar;   iread = 0;   do      {      FREAD (InputChar, InputFile, 1);      if (InputChar!='\r' && InputChar!='\n' && iread < Length-1)         {         InputString[iread] = InputChar;         iread++;         }      }      while (InputChar != '\r' && !feof(InputFile));   InputString[iread] = '\0';   }/*  Reverse bytes of variable  */void ReverseVar (void *VarPtr, int SizeVar)   {   BYTE *BytePtr;   BYTE TempByte;   int  FirstIndex;   int  LastIndex;   /*  Return if no bytes to switch  */   if (SizeVar<2)      return;   /*  Set BYTE pointer to WORD array  */   BytePtr = (BYTE *) VarPtr;   /*  Find start and end of current word in list  */   FirstIndex = 0;   LastIndex  = FirstIndex + SizeVar - 1;   while (FirstIndex<LastIndex)      {      TempByte = BytePtr[FirstIndex];      BytePtr[FirstIndex] = BytePtr[LastIndex];      BytePtr[LastIndex ] = TempByte;      FirstIndex++;      LastIndex--;      }   }/* .. Reverse Var  */void ReverseHeader (CorFileHeader_t *FileHeader)   {   REVERSE (FileHeader->Run)   REVERSE (FileHeader->Step)   REVERSE (FileHeader->Time)   REVERSE (FileHeader->BoundaryType)   REVERSE (FileHeader->Surf[X])   REVERSE (FileHeader->Surf[Y])   REVERSE (FileHeader->Surf[Z])   REVERSE (FileHeader->Box[X])   REVERSE (FileHeader->Box[Y])   REVERSE (FileHeader->Box[Z])   REVERSE (FileHeader->Etot)   REVERSE (FileHeader->Epot)   REVERSE (FileHeader->Ekin)   REVERSE (FileHeader->Ebath)   REVERSE (FileHeader->Min[X])   REVERSE (FileHeader->Min[Y])   REVERSE (FileHeader->Min[Z])   REVERSE (FileHeader->Max[X])   REVERSE (FileHeader->Max[Y])   REVERSE (FileHeader->Max[Z])   REVERSE (FileHeader->Np)   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -