CCL Home Page
Up Directory CCL rdmopac.c
/*****
This file is part of the Babel Program
Copyright (C) 1992-96 W. Patrick Walters and Matthew T. Stahl 
All Rights Reserved 
All Rights Reserved 
All Rights Reserved 
All Rights Reserved 

For more information please contact :

babel@mercury.aichem.arizona.edu
--------------------------------------------------------------------------------

FILE : rdmopac.c
AUTHOR(S) : Pat Walters
DATE : 1-93
PURPOSE : Routines to read a MOPAC output file

******/

#include "bbltyp.h"

int 
read_mopac_output(FILE *file1, ums_type *mol)
{
  char mop_line[BUFF_SIZE];
  int i = 0;
  int j;
  int result;
  long int pos = 0;
  long int chg_pos = 0;
  double theEnergy;
  int has_charges = FALSE;
  int count = 0;
  char trigger1[300], trigger2[300];
  int foundEnergy = FALSE;

  while (fgets(mop_line,sizeof(mop_line),file1))
  {
    if (strstr(mop_line,"FINAL") && strstr(mop_line,"HEAT"))
    {
      sscanf(mop_line,"%*s%*s%*s%*s%*s%lf",&theEnergy);
      foundEnergy = TRUE;
    }

    if (strstr(mop_line,"NET ATOMIC CHARGES"))
    {
      has_charges = TRUE;
      chg_pos = ftell(file1);
    }

    if (strstr(mop_line,"CARTESIAN COORDINATES") && foundEnergy)
      break;
  }

  for (i = 0;i < 3;i++)
    fgets(mop_line,sizeof(mop_line),file1);
  
  pos = ftell(file1);
  
  while (fgets(mop_line,sizeof(mop_line), file1))
  {
    j = sscanf(mop_line,"%s %s",trigger1,trigger2);
    if ((count_tokens(mop_line," ") == 5) && isdigit(trigger1[0]) &&
	isalpha(trigger2[0]))
      count++;
    else
      break;
  }
  fseek(file1,pos,0);

  Atoms = count;
  ShowProgress(Atoms,"Reading Atoms");
  initialize_ums(&mol);
  Energy = theEnergy;

  for (i = 1; i <= Atoms; i++)
  {
    UpdateProgress();
    fgets(mop_line,sizeof(mop_line), file1);
    j = sscanf(mop_line,"%*d %s %lf %lf %lf",Type(i),&X(i),&Y(i),&Z(i)); 
    if (j != 4)
    {
      show_warning("Input file error");
      release_ums(mol);
      Atoms = 0;
      return(FALSE);
    }
  }
  
  pos = ftell(file1);

  if (has_charges)
  {
    fseek(file1,chg_pos,0);
    toss(file1,2);
    for (i = 1; i <= Atoms; i++)
    {
      fgets(mop_line,sizeof(mop_line), file1);
      sscanf(mop_line,"%*s%*s%lf",&Charge(i));
    }
  }

  if (Atoms > 0)
  {
    result = assign_radii(mol);
    result = assign_bonds(mol);
    result = assign_types(mol);
    result = build_connection_table(mol);
    assign_bond_order(mol);
  }

  fseek(file1,pos,0);

  while (fgets(mop_line,sizeof(mop_line), file1))
  {
    pos = ftell(file1);
    if (strstr(mop_line,"FINAL") && strstr(mop_line,"HEAT"))
    {
      fseek(file1,pos,0);
      break;
    }
  }  
  
  for (i = 1; i <= Atoms; i++)
  {
    fgets(mop_line,sizeof(mop_line), file1);
    sscanf(mop_line,"%*s%*s%f",&Charge(i));
  }
  
  return(TRUE);
}
Modified: Tue Jan 21 17:00:00 1997 GMT
Page accessed 7290 times since Sat Apr 17 21:36:46 1999 GMT