/* mndo.f -- translated by f2c (version 19950314).
   You must link the resulting object file with the libraries:
	-lF77 -lI77 -lm   (in that order)
*/

#include "f2c.h"

/* Common Block Declarations */

struct {
    char argz[512];
} argz_;

#define argz_1 argz_

struct {
    char keywrd[80];
} keywrd_;

#define keywrd_1 keywrd_

struct {
    integer nvar, loc[516]	/* was [2][258] */, idumy;
    doublereal xparam[258];
} geovar_;

#define geovar_1 geovar_

struct {
    integer ndep, locpar[258], idepfn[258], locdep[258];
} geosym_;

#define geosym_1 geosym_

struct {
    integer natoms, labels[86], na[86], nb[86], nc[86];
} geokst_;

#define geokst_1 geokst_

struct {
    doublereal geo[258]	/* was [3][86] */;
} geom_;

#define geom_1 geom_

struct {
    doublereal grad[258], gnorm;
} gradnt_;

#define gradnt_1 gradnt_

struct {
    integer numcal;
} numcal_;

#define numcal_1 numcal_

struct {
    doublereal time0;
} time_;

#define time_1 time_

struct {
    integer latom, lparam;
    doublereal react[200];
} path_;

#define path_1 path_

/* Table of constant values */

static integer c__1 = 1;
static logical c_true = TRUE_;

/* Main program */ MAIN__(void)
{
    /* System generated locals */
    integer i__1, i__2;
    olist o__1;
    cllist cl__1;

    /* Builtin functions */
    integer f_open(olist *), i_indx(char *, char *, ftnlen, ftnlen), s_wsfe(
	    cilist *), e_wsfe(void), do_fio(integer *, char *, ftnlen), 
	    f_clos(cllist *);
    /* Subroutine */ int s_stop(char *, ftnlen);

    /* Local variables */
    extern /* Subroutine */ int read_(void);
    static doublereal escf;
    extern /* Subroutine */ int grid_(void);
    static integer ilim, i, j;
    extern /* Subroutine */ int force_(void), flepo_(doublereal *, integer *, 
	    doublereal *), polar_(void), paths_(void), nllsq_(doublereal *, 
	    integer *), write_(doublereal *, doublereal *), powsq_(doublereal 
	    *, integer *, doublereal *), react1_(doublereal *);
    extern doublereal second_(void);
    extern /* Subroutine */ int compfg_(doublereal *, logical *, doublereal *,
	     logical *, doublereal *, logical *), moldat_(void), am1_(void), 
	    drc_(doublereal *, doublereal *);
    static doublereal tim;

    /* Fortran I/O blocks */
    static cilist io___1 = { 0, 6, 0, "(10X,' MOPAC - A GENERAL MOLECULAR OR"
	    "BITAL PACKAGE',/         ,10X,'   ORIGINAL VERSION WRITTEN IN 19"
	    "83')", 0 };
    static cilist io___2 = { 0, 6, 0, "(10X,'     BY JAMES J. P. STEWART AT "
	    "THE',/                  ,10X,'     UNIVERSITY OF TEXAS AT AUSTIN"
	    "',/                     ,10X,'          AUSTIN, TEXAS, 78712')", 
	    0 };
    static cilist io___5 = { 0, 6, 0, "(//,10X,A)", 0 };
    static cilist io___6 = { 0, 6, 0, "(   10X,A)", 0 };
    static cilist io___10 = { 0, 6, 0, "(///,' TOTAL CPU TIME: ',F16.2,' SEC"
	    "ONDS')", 0 };
    static cilist io___11 = { 0, 6, 0, "(/,' == MOPAC DONE ==')", 0 };



/*         Notice of Public Domain nature of MOPAC */

/*      'This computer program is a work of the United States */
/*       Government and as such is not subject to protection by */
/*       copyright (17 U.S.C. # 105.)  Any person who fraudulently */
/*       places a copyright notice or does any other act contrary */
/*       to the provisions of 17 U.S. Code 506(c) shall be subject */
/*       to the penalties provided therein.  This notice shall not */
/*       be altered or removed from this software and is to be on */
/*       all reproductions.' */


/* COMDECK SIZES */
/************************************************************************
****/
/*  THIS FILE CONTAINS ALL THE ARRAY SIZES FOR USE IN MOPAC.              
**/
/*                                                                        
**/
/*    THERE ARE ONLY  PARAMETERS THAT THE PROGRAMMER NEED SET:            
**/
/*    MAXHEV = MAXIMUM NUMBER OF HEAVY ATOMS (HEAVY: NON-HYDROGEN ATOMS)  
**/
/*    MAXLIT = MAXIMUM NUMBER OF HYDROGEN ATOMS.                          
**/
/*    MAXTIM = DEFAULT TIME FOR A JOB. (SECONDS)                          
**/
/*    MAXDMP = DEFAULT TIME FOR AUTOMATIC RESTART FILE GENERATION (SECS)  
**/
/*                                                                        
**/
/*                                                                        
**/
/************************************************************************
****/
/*                                                                        
**/
/*  THE FOLLOWING CODE DOES NOT NEED TO BE ALTERED BY THE PROGRAMMER      
**/
/*                                                                        
**/
/************************************************************************
****/
/*                                                                        
**/
/*   ALL OTHER PARAMETERS ARE DERIVED FUNCTIONS OF THESE TWO PARAMETERS   
**/
/*                                                                        
**/
/*     NAME                   DEFINITION                                  
**/
/*    NUMATM         MAXIMUM NUMBER OF ATOMS ALLOWED.                     
**/
/*    MAXORB         MAXIMUM NUMBER OF ORBITALS ALLOWED.                  
**/
/*    MAXPAR         MAXIMUM NUMBER OF PARAMETERS FOR OPTIMISATION.       
**/
/*    N2ELEC         MAXIMUM NUMBER OF TWO ELECTRON INTEGRALS ALLOWED.    
**/
/*    MPACK          AREA OF LOWER HALF TRIANGLE OF DENSITY MATRIX.       
**/
/*    MORB2          SQUARE OF THE MAXIMUM NUMBER OF ORBITALS ALLOWED.    
**/
/*    MAXHES         AREA OF HESSIAN MATRIX                               
**/
/************************************************************************
****/
/************************************************************************
****/
/*  FOR SHORT VERSION USE LINE WITH NMECI=1, FOR LONG VERSION USE LINE    
**/
/*  WITH NMECI=10                                                         
**/
/************************************************************************
****/
/*     PARAMETER (NMECI=1,   NPULAY=1) */
/************************************************************************
****/
/* DECK MOPAC */
/* next line added for Unix implementation for command line arguments */

    o__1.oerr = 0;
    o__1.ounit = 5;
    o__1.ofnm = 0;
    o__1.orl = 0;
    o__1.osta = "OLD";
    o__1.oacc = 0;
    o__1.ofm = 0;
    o__1.oblnk = "ZERO";
    f_open(&o__1);
/*     REWIND 5 */
    o__1.oerr = 0;
    o__1.ounit = 6;
    o__1.ofnm = 0;
    o__1.orl = 0;
    o__1.osta = "NEW";
    o__1.oacc = 0;
    o__1.ofm = 0;
    o__1.oblnk = 0;
    f_open(&o__1);
/*     REWIND 6 */
    numcal_1.numcal = 1;

    time_1.time0 = second_();

/* READ AND CHECK INPUT FILE, EXIT IF NECESSARY. */
/*     WRITE INPUT FILE TO UNIT 6 AS FEEDBACK TO USER */

/* L10: */
    read_();
    if (i_indx(keywrd_1.keywrd, "AUTHOR", 80L, 6L) != 0) {
	s_wsfe(&io___1);
	e_wsfe();
	s_wsfe(&io___2);
	e_wsfe();
    }

/* INITIALIZE CALCULATION AND WRITE CALCULATION INDEPENDENT INFO */

    if (i_indx(keywrd_1.keywrd, "0SCF", 80L, 4L) != 0) {
	goto L70;
    }
    if (i_indx(keywrd_1.keywrd, "EXTERNAL", 80L, 8L) != 0) {
	am1_();
    } else {
	moldat_();
    }
    if (i_indx(keywrd_1.keywrd, " XYZ", 80L, 4L) != 0 && geovar_1.nvar != 0) {

/*   SET ALL OPTIMIZATION FLAGS TO 1.  IT IS POSSIBLE TO SPECIFY " XYZ
" */
/*   AND HAVE 3N-6 FLAGS SET AND STILL NOT HAVE EVERY ATOM MARKED FOR 
*/
/*   OPTIMIZATION.  THIS CAN HAPPEN IF DUMMY ATOMS ARE PRESENT */
/*   TO PREVENT THIS, WE EXPLICITELY SET ALL FLAGS. */

	geovar_1.nvar = 0;
	i__1 = geokst_1.natoms;
	for (i = 1; i <= i__1; ++i) {

/*  I DON'T THINK THE FOLLOWING LOGICAL WILL EVER BE TRUE, BUT I'M
 NOT */
/*  TAKING IT OUT IN THIS VERSION, JUST IN CASE. */

	    if (geokst_1.labels[i - 1] == 99) {
		goto L30;
	    }
	    for (j = 1; j <= 3; ++j) {
		++geovar_1.nvar;
		geovar_1.loc[(geovar_1.nvar << 1) - 2] = i;
		geovar_1.loc[(geovar_1.nvar << 1) - 1] = j;
/* L20: */
		geovar_1.xparam[geovar_1.nvar - 1] = geom_1.geo[j + i * 3 - 4]
			;
	    }
L30:
	    ;
	}
    }
    if (i_indx(keywrd_1.keywrd, "RESTART", 80L, 7L) == 0) {
	if (i_indx(keywrd_1.keywrd, "1SCF", 80L, 4L) != 0) {
	    if (path_1.latom != 0) {
		s_wsfe(&io___5);
		do_fio(&c__1, "1SCF SPECIFIED WITH PATH.  THIS PAIR OF", 39L);
		e_wsfe();
		s_wsfe(&io___6);
		do_fio(&c__1, "OPTIONS IS NOT ALLOWED", 22L);
		e_wsfe();
		goto L70;
	    }
	    geovar_1.nvar = 0;
	    if (i_indx(keywrd_1.keywrd, "GRAD", 80L, 4L) != 0) {
		geovar_1.nvar = 0;
		i__1 = geokst_1.natoms;
		for (i = 2; i <= i__1; ++i) {
		    if (geokst_1.labels[i - 1] == 99) {
			goto L50;
		    }
		    if (i == 2) {
			ilim = 1;
		    }
		    if (i == 3) {
			ilim = 2;
		    }
		    if (i > 3) {
			ilim = 3;
		    }
		    i__2 = ilim;
		    for (j = 1; j <= i__2; ++j) {
			++geovar_1.nvar;
			geovar_1.loc[(geovar_1.nvar << 1) - 2] = i;
			geovar_1.loc[(geovar_1.nvar << 1) - 1] = j;
/* L40: */
			geovar_1.xparam[geovar_1.nvar - 1] = geom_1.geo[j + i 
				* 3 - 4];
		    }
L50:
		    ;
		}
	    }
	}
    }

/* CALCULATE DYNAMIC REACTION COORDINATE. */


    if (i_indx(keywrd_1.keywrd, "SADDLE", 80L, 6L) != 0) {
	react1_(&escf);
	goto L60;
    }
    cl__1.cerr = 0;
    cl__1.cunit = 5;
    cl__1.csta = 0;
    f_clos(&cl__1);
    if (i_indx(keywrd_1.keywrd, "STEP1", 80L, 5L) != 0) {
	grid_();
	goto L70;
    }
    if (path_1.latom != 0) {

/*       DO PATH */

	paths_();
	goto L70;
    }
    if (i_indx(keywrd_1.keywrd, "FORCE", 80L, 5L) + i_indx(keywrd_1.keywrd, 
	    "IRC=", 80L, 4L) != 0) {

/* FORCE CALCULATION IF DESIRED */

	force_();
	goto L70;
    }
    if (i_indx(keywrd_1.keywrd, " DRC", 80L, 4L) + i_indx(keywrd_1.keywrd, 
	    " IRC", 80L, 4L) != 0) {

/*   IN THIS CONTEXT, "REACT" HOLDS INITIAL VELOCITY VECTOR COMPONENTS
. */

	drc_(path_1.react, path_1.react);
	goto L70;
    }

    if (i_indx(keywrd_1.keywrd, "NLLSQ", 80L, 5L) != 0) {
	nllsq_(geovar_1.xparam, &geovar_1.nvar);
	compfg_(geovar_1.xparam, &c_true, &escf, &c_true, gradnt_1.grad, &
		c_true);
	goto L60;
    }

    if (i_indx(keywrd_1.keywrd, "SIGMA", 80L, 5L) != 0) {
	powsq_(geovar_1.xparam, &geovar_1.nvar, &escf);
	goto L60;
    }

/* ORDINARY GEOMETRY OPTIMISATION */

    flepo_(geovar_1.xparam, &geovar_1.nvar, &escf);
L60:
    write_(&time_1.time0, &escf);
    if (i_indx(keywrd_1.keywrd, "POLAR", 80L, 5L) != 0) {
	polar_();
    }
L70:
    tim = second_() - time_1.time0;
    s_wsfe(&io___10);
    do_fio(&c__1, (char *)&tim, (ftnlen)sizeof(doublereal));
    e_wsfe();
    s_wsfe(&io___11);
    e_wsfe();
    s_stop("", 0L);
    return 0;
} /* MAIN__ */

/* Main program alias */ int main_ () { MAIN__ (); return 0; }
