Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F80326996
SearchAndFill.c
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, Aug 31, 04:20
Size
6 KB
Mime Type
text/x-c
Expires
Mon, Sep 2, 04:20 (1 d, 21 h)
Engine
blob
Format
Raw Data
Handle
20337790
Attached To
rLAMMPS lammps
SearchAndFill.c
View Options
/****************************
*
* This function first allocates memory to the forcefield item
* structures and then reads parameters from the forcefield file into the
* allocated memory
*
*/
#include "msi2lmp.h"
#include "Forcefield.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
static int blank_line(char *line)
{
while (*line != '\0') {
if (isalnum((int) *line)) return 0;
++line;
}
return 1;
}
static unsigned char string_match(const char *,const char *);
void ClearFrcItem(struct FrcFieldItem *item)
{
free(item->data);
}
const char *SearchAndCheck(const char *keyword)
{
char *status;
int got_it = 0;
char line[MAX_LINE_LENGTH] = "empty";
rewind(FrcF);
while (got_it == 0) {
status = fgets( line, MAX_LINE_LENGTH, FrcF );
if (status == NULL) {
fprintf(stderr," Unable to find keyword '%s'\n",keyword);
fprintf(stderr," Check consistency of forcefield name and class \n");
fprintf(stderr," Exiting....\n");
exit(1);
}
if (line[0] == '@') {
if (string_match(strtok(line+1," '\t\n'("),keyword)) {
got_it = 1;
status = strtok(NULL," '\t\n(");
if (status != NULL)
return strdup(status);
}
}
}
return strdup("(unknown)");
}
void SearchAndFill(struct FrcFieldItem *item)
{
int i,j; /* counters */
int got_it = 0;
int ctr = 0;
long file_pos;
char line[MAX_LINE_LENGTH] = "empty";
char *charptr,*status;
/***********************ALLOCATE MEMORY FOR STRUCTURE ********************/
/* Read and discard lines until keyword is found */
rewind(FrcF);
while (got_it == 0) {
status = fgets( line, MAX_LINE_LENGTH, FrcF );
if (status == NULL) {
fprintf(stderr," Unable to find keyword '%s'\n",item->keyword);
fprintf(stderr," Check consistency of forcefield name and class \n");
fprintf(stderr," Exiting....\n");
exit(1);
}
if (line[0] == '#') {
if (string_match(strtok(line," '\t'("),item->keyword)) got_it = 1;
}
/* if (strncmp(line, item->keyword,strlen(item->keyword))==0) got_it = 1; */
}
file_pos = ftell(FrcF);
/* Count the number of lines until next item is found */
while( strncmp(fgets(line,MAX_LINE_LENGTH,FrcF), "#", 1) != 0 )
ctr++;
/* Allocate the memory using calloc */
item->data = (struct FrcFieldData *)calloc(ctr, sizeof(struct FrcFieldData));
if (item->data == NULL) {
fprintf(stderr,"Could not allocate memory to %s\n", item->keyword);
exit(2);
}
/********************FILL PARAMETERS AND EQUIVALENCES ********************/
/* Read lines until keyword is found */
fseek(FrcF,file_pos,SEEK_SET);
strcpy(line,"empty");
/* Read lines until data starts (when !--- is found) */
ctr = 0;
while ( strncmp(line,"!---", 4) != 0 ) {
fgets(line, MAX_LINE_LENGTH, FrcF);
}
/* Get first line of data that isn't commented out */
fgets(line, MAX_LINE_LENGTH, FrcF);
while (strncmp(line,"!",1) == 0) {
fgets( line, MAX_LINE_LENGTH, FrcF);
}
/* Read data into structure */
while( strncmp( line, "#", 1 ) != 0 ) {
float version;
int reference,replace;
char atom_types[5][5];
double parameters[8];
/* version number and reference number */
version = atof(strtok(line, " "));
reference = atoi(strtok(NULL, " "));
/* equivalences */
for(i = 0; i < item->number_of_members; i++ ) {
charptr = strtok(NULL, " ");
if (strlen(charptr) > 4) {
fprintf(stderr,"Warning: type name overflow for '%s'. "
"Truncating to 4 characters.\n",charptr);
}
sscanf(charptr,"%4s",atom_types[i]);
}
/* parameters -- Because of symmetrical terms, bonang, angtor, and
endbontor have to be treated carefully */
for( i = 0; i < item->number_of_parameters; i++ ) {
charptr = strtok(NULL, " ");
if(charptr == NULL) {
for ( j = i; j < item->number_of_parameters; j++ )
parameters[j] = parameters[j-i];
break;
} else {
parameters[i] = atof(charptr);
}
}
/* Search for matching sets of atom types.
If found and the version number is greater, substitute
the current set of parameters in place of the found set.
Otherwise, add the current set of parameters to the
list.
*/
replace = ctr;
for (j=0; j < ctr; j++) {
int k=0;
int match = 1;
while (match && (k < item->number_of_members)) {
if (strncmp(item->data[j].ff_types[k],atom_types[k],5) == 0)
k++;
else
match = 0;
}
if (match == 1) {
replace = j;
break;
}
}
if (replace != ctr) {
if (version > item->data[replace].ver) {
if (pflag > 1) {
fprintf(stderr," Using higher version of parameters for");
fprintf(stderr," %s ",item->keyword);
for (i=0; i < item->number_of_members; i++)
fprintf(stderr,"%s ",atom_types[i]);
fprintf(stderr," version %3.2f\n",version);
}
item->data[replace].ver = version;
item->data[replace].ref = reference;
for (i=0; i < item->number_of_members; i++) {
strncpy(item->data[replace].ff_types[i],atom_types[i],5);
}
for (i=0; i < item->number_of_parameters; i++) {
item->data[replace].ff_param[i] = parameters[i];
}
} else {
if (pflag > 1) {
fprintf(stderr," Using higher version of parameters for");
fprintf(stderr," %s ",item->keyword);
for (i=0; i < item->number_of_members; i++)
fprintf(stderr,"%s ",item->data[replace].ff_types[i]);
fprintf(stderr," version %3.2f\n",item->data[replace].ver);
}
}
} else {
item->data[ctr].ver = version;
item->data[ctr].ref = reference;
for (i=0; i < item->number_of_members; i++) {
strncpy(item->data[ctr].ff_types[i],atom_types[i],5);
}
for (i=0; i < item->number_of_parameters; i++) {
item->data[ctr].ff_param[i] = parameters[i];
}
ctr++;
}
fgets( line, MAX_LINE_LENGTH, FrcF);
/*if blank line encountered, get next */
while((blank_line(line)) ||
(strncmp(line,"!",1) == 0)) {
status = fgets( line, MAX_LINE_LENGTH, FrcF);
if (status == NULL) break;
}
}
item->entries = ctr;
/*Debugging
fprintf(stderr,"\n%s\n", item->keyword);
for(i=0;i<ctr;i++) {
for(j=0;j<item->number_of_members;j++)
fprintf(stderr,"%3s ", item->data[i].ff_equiv[j]);
fprintf(stderr," ");
for(j=0;j<item->number_of_parameters;j++)
fprintf(stderr,"%10.5f ",item->data[i].ff_param[j]);
fprintf(stderr,"\n");
}
*/
}
unsigned char string_match(const char *string1,const char *string2)
{
int len1,len2;
len1 = strlen(string1);
len2 = strlen(string2);
if (len1 != len2) {
return 0;
} else {
if (strncmp(string1,string2,len1) == 0) {
return 1;
} else {
return 0;
}
}
}
Event Timeline
Log In to Comment