Commit 22ce6718 authored by Axel Kohlmeyer's avatar Axel Kohlmeyer
Browse files

improved whitespace handling in msi2lmp for force fields and topologies

parent 4921dc18
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
Axel Kohlmeyer is the current maintainer of the msi2lmp tool.
Please send any inquiries about msi2lmp to the lammps-users mailing list.

06 Oct 2016 Axel Kohlmeyer <akohlmey@gmail.com>

Improved whitespace handling in parsing topology and force field
files to avoid bogus warnings about type name truncation.

24 Oct 2015 Axel Kohlmeyer <akohlmey@gmail.com>

Added check to make certain that force field files
are consistent with the notation of non-bonded parameters
that the msi2lmp code expects. For Class 1 and OPLS-AA
the A-B notation with geometric mixing is expected and for
Class 2 the r-eps notation with sixthpower mixing.(
Class 2 the r-eps notation with sixthpower mixing.

11 Sep 2014 Axel Kohlmeyer <akohlmey@gmail.com>

+8 −8
Original line number Diff line number Diff line
@@ -74,9 +74,9 @@ void ReadMdfFile(void)
        at_end = 1;
      } else if (strncmp(line,"@column",7) == 0) {

        temp_string = strtok(line," ");
        col_no = strtok(NULL," ");
        col_name = strtok(NULL," ");
        temp_string = strtok(line,WHITESPACE);
        col_no = strtok(NULL,WHITESPACE);
        col_name = strtok(NULL,WHITESPACE);
        if (strncmp(col_name,"charge",6) == 0) {
          if (strlen(col_name) < 8) {
            q_col_no = atoi(col_no);
@@ -285,7 +285,7 @@ int get_molecule(char *line, int connect_col_no, int q_col_no,
    /* Get atom name */
    cur_field = strtok(line,":");
    sscanf(cur_field, "%s", atoms[*counter].residue_string);
    cur_field = strtok(NULL," ");
    cur_field = strtok(NULL,WHITESPACE);
    /* Compare atom name with that in .car file */
    if (strcmp(atoms[*counter].name, cur_field)) {
      printf("Names %s from .car file and %s from .mdf file do not match\n",
@@ -297,18 +297,18 @@ int get_molecule(char *line, int connect_col_no, int q_col_no,

    /* Skip unwanted fields until charge column, then update charge */

    for (i=1; i < q_col_no; i++) strtok(NULL," ");
    cur_field = strtok(NULL, " ");
    for (i=1; i < q_col_no; i++) strtok(NULL,WHITESPACE);
    cur_field = strtok(NULL, WHITESPACE);
    atoms[*counter].q = atof(cur_field);

    /* Continue skipping unwanted fields until connectivity records begin */

    for ( i = (q_col_no + 1); i < connect_col_no; i++) strtok(NULL," ");
    for ( i = (q_col_no + 1); i < connect_col_no; i++) strtok(NULL,WHITESPACE);

    /* Process connections */

    connect_no = 0; /* reset connections counter */
    while ((cur_field = strtok(NULL," ")) && (connect_no < MAX_CONNECTIONS)) {
    while ((cur_field = strtok(NULL,WHITESPACE)) && (connect_no < MAX_CONNECTIONS)) {
      sscanf(cur_field, "%s", atoms[*counter].connections[connect_no++]);
    }
    atoms[*counter].no_connect = connect_no;
+7 −7
Original line number Diff line number Diff line
@@ -45,9 +45,9 @@ const char *SearchAndCheck(const char *keyword)
      exit(1);
    }
    if (line[0] == '@') {
      if (string_match(strtok(line+1," '\t\n'("),keyword)) {
      if (string_match(strtok(line+1," '\t\n\r\f("),keyword)) {
        got_it = 1;
        status = strtok(NULL," '\t\n(");
        status = strtok(NULL," '\t\n\r\f(");
        if (status != NULL)
          return strdup(status);
      }
@@ -79,7 +79,7 @@ void SearchAndFill(struct FrcFieldItem *item)
      exit(1);
    }
    if (line[0] == '#') {
      if (string_match(strtok(line," '\t'("),item->keyword)) got_it = 1;
      if (string_match(strtok(line," '\t\r\n("),item->keyword)) got_it = 1;
    }
    /*     if (strncmp(line, item->keyword,strlen(item->keyword))==0) got_it = 1; */
  }
@@ -132,13 +132,13 @@ void SearchAndFill(struct FrcFieldItem *item)

    /* version number and reference number */

    version = atof(strtok(line, " "));
    reference = atoi(strtok(NULL, " "));
    version = atof(strtok(line, WHITESPACE));
    reference = atoi(strtok(NULL, WHITESPACE));

    /* equivalences */

    for(i = 0; i < item->number_of_members; i++ ) {
      charptr = strtok(NULL, " ");
      charptr = strtok(NULL, WHITESPACE);
      if (strlen(charptr) > 4) {
        fprintf(stderr,"Warning: type name overflow for '%s'. "
                "Truncating to 4 characters.\n",charptr);
@@ -150,7 +150,7 @@ void SearchAndFill(struct FrcFieldItem *item)
       endbontor have to be treated carefully */

    for( i = 0; i < item->number_of_parameters; i++ ) {
      charptr = strtok(NULL, " ");
      charptr = strtok(NULL, WHITESPACE);
      if(charptr == NULL) {
        for ( j = i; j < item->number_of_parameters; j++ )
          parameters[j] = parameters[j-i];
+3 −0
Original line number Diff line number Diff line
@@ -2,6 +2,9 @@
*
*  msi2lmp.exe
*
*   v3.9.8 AK- Improved whitespace handling in parsing topology and force
*              field files to avoid bogus warnings about type name truncation
*
*   v3.9.7 AK- Add check to enforce that Class1/OPLS-AA use A-B parameter
*              conventions in force field file and Class2 us r-eps conventions
*
+3 −1
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@

# include <stdio.h>

#define MSI2LMP_VERSION "v3.9.7 / 24 Oct 2015"
#define MSI2LMP_VERSION "v3.9.8 / 06 Oct 2016"

#define PI_180  0.01745329251994329576

@@ -45,6 +45,8 @@
#define MAX_STRING        64
#define MAX_NAME          16

#define WHITESPACE " \t\r\n\f"

#define MAX_ATOM_TYPES         100
#define MAX_BOND_TYPES         200
#define MAX_ANGLE_TYPES        300