120 lines
3.3 KiB
C
120 lines
3.3 KiB
C
/****************************** ReadCarFile.c ******************************
|
|
*
|
|
* This function opens the .car file and extracts coordinate information
|
|
* into the atoms Atom structure
|
|
*
|
|
* THIS FUNCTION HAS BEEN MODIFIED FROM Msi2LMP2 AND USES THE ATOM
|
|
* STRUCTURE MEMBERS DIFFERENTLY
|
|
*/
|
|
|
|
#include "lmp2.h"
|
|
|
|
void ReadCarFile(FILE *CarF,struct Sys *sysinfo)
|
|
{
|
|
char line[MAX_LINE_LENGTH]; /* Stores lines as they are read in */
|
|
int k,m,n; /* counters */
|
|
int skip; /* lines to skip at beginning of file */
|
|
|
|
|
|
/* Determine Number of molecules & atoms */
|
|
|
|
rewind(CarF);
|
|
sysinfo->no_molecules = -1; /* Set to -1 because counter will be
|
|
incremented an extra time at the end of the file */
|
|
|
|
fgets(line,MAX_LINE_LENGTH,CarF); /* Read header line */
|
|
|
|
/* Check for periodicity, set periodic and skip */
|
|
|
|
if( strncmp(fgets(line,MAX_LINE_LENGTH,CarF),"PBC=ON",6) == 0)
|
|
{
|
|
sysinfo->periodic = 1;
|
|
skip = 5; /* Data starts 5 lines from beginning of file */
|
|
}
|
|
else
|
|
{
|
|
sysinfo->periodic = 0;
|
|
skip = 4;
|
|
}
|
|
|
|
/* First pass through file -- Count molecules */
|
|
|
|
while( fgets(line,MAX_LINE_LENGTH,CarF) != NULL )
|
|
if( strncmp(line,"end",3) == 0 )
|
|
sysinfo->no_molecules++;
|
|
|
|
/* Allocate space to keep track of the number of atoms within a molecule */
|
|
|
|
sysinfo->molinfo =
|
|
(struct Mol *) calloc(sysinfo->no_molecules,sizeof(struct Mol));
|
|
|
|
if ( sysinfo->molinfo == NULL )
|
|
{
|
|
puts("Could not allocate memory for molinfo");
|
|
exit(2);
|
|
}
|
|
|
|
/* Second pass through file -- Count atoms */
|
|
|
|
rewind(CarF);
|
|
for(n=0; n < skip; n++) /* Skip beginning lines */
|
|
fgets(line,MAX_LINE_LENGTH,CarF);
|
|
|
|
sysinfo->molinfo[0].start = 0;
|
|
sysinfo->molinfo[0].end = 0;
|
|
for(n=0; n < sysinfo->no_molecules; n++)
|
|
{
|
|
if (n != 0) {
|
|
sysinfo->molinfo[n].start = sysinfo->molinfo[n-1].end;
|
|
sysinfo->molinfo[n].end = sysinfo->molinfo[n-1].end;
|
|
}
|
|
while( strncmp(fgets(line,MAX_LINE_LENGTH,CarF),"end",3) )
|
|
sysinfo->molinfo[n].end++;
|
|
}
|
|
n = sysinfo->no_molecules-1;
|
|
sysinfo->natoms = sysinfo->molinfo[n].end;
|
|
|
|
/* Allocate space for atoms Atom structures */
|
|
|
|
sysinfo->atoms = (struct Atom *) calloc(sysinfo->natoms,
|
|
sizeof(struct Atom));
|
|
if( sysinfo->atoms == NULL )
|
|
{
|
|
puts("Could not allocate memory for AtomList");
|
|
exit(2);
|
|
}
|
|
|
|
/* Third pass through file -- Read+Parse Car File */
|
|
|
|
rewind(CarF);
|
|
|
|
for(n=0; n < skip; n++)
|
|
fgets(line,MAX_LINE_LENGTH,CarF);
|
|
|
|
for(m=0; m < sysinfo->no_molecules; m++)
|
|
{ /* m loops through molecules */
|
|
for(n=sysinfo->molinfo[m].start; n < sysinfo->molinfo[m].end; n++)
|
|
{ /* n loops through atoms within a molecule */
|
|
|
|
sysinfo->atoms[n].molecule = m;
|
|
|
|
fscanf(CarF,"%s %lf %lf %lf %s %s %s %s %f",
|
|
sysinfo->atoms[n].name,
|
|
&(sysinfo->atoms[n].xyz[0]),
|
|
&(sysinfo->atoms[n].xyz[1]),
|
|
&(sysinfo->atoms[n].xyz[2]),
|
|
sysinfo->atoms[n].res_name,
|
|
sysinfo->atoms[n].res_num,
|
|
sysinfo->atoms[n].potential,
|
|
sysinfo->atoms[n].element,
|
|
&(sysinfo->atoms[n].q));
|
|
} /* End n (atoms) loop */
|
|
|
|
fgets(line,MAX_LINE_LENGTH,CarF);
|
|
fgets(line,MAX_LINE_LENGTH,CarF);
|
|
|
|
} /* End m (molecule) loop */
|
|
|
|
} /* End ReadCarFile() */
|
|
|