/* ijkl.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 {
    doublereal xy[10000]	/* was [10][10][10][10] */;
} xyijkl_;

#define xyijkl_1 xyijkl_

struct {
    real wj[219386], wk[219386];
} wmatrx_;

#define wmatrx_1 wmatrx_

/* Subroutine */ int ijkl_(integer *i1, integer *i2, integer *j1, integer *j2,
	 doublereal *elem, doublereal *a1, integer *mdim)
{
    /* System generated locals */
    integer a1_dim1, a1_offset;

    /* Local variables */
    extern doublereal spcg_(doublereal *, doublereal *, doublereal *, 
	    doublereal *, doublereal *, real *);
#define w ((doublereal *)&wmatrx_1)
    static doublereal x, y, z;

/* 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 */

/* ***********************************************************************
 */

/*   IJKL FILLS THE TWO-ELECTRON MATRIX XY WITH REPULSION INTEGRALS. */
/*        XY(I,J,K,L) IS THE REPULSION BETWEEN ONE ELECTRON IN */
/*        M.O.S I AND J AND AN ELECTRON IN M.O.S K AND L. */
/*        <I1(1),J1(1)/I2(2),J2(2)> */
/* ***********************************************************************
 */
    /* Parameter adjustments */
    a1_dim1 = *mdim;
    a1_offset = a1_dim1 + 1;
    a1 -= a1_offset;

    /* Function Body */
    if (xyijkl_1.xy[*i1 + (*j1 + (*i2 + *j2 * 10) * 10) * 10 - 1111] == 100.) 
	    {
	x = spcg_(&a1[*i1 * a1_dim1 + 1], &a1[*j1 * a1_dim1 + 1], &a1[*i2 * 
		a1_dim1 + 1], &a1[*j2 * a1_dim1 + 1], w, wmatrx_1.wj);
/* #          WRITE(6,'(4I6,F13.6)')I1,J1,I2,J2,X */
	xyijkl_1.xy[*i1 + (*j1 + (*i2 + *j2 * 10) * 10) * 10 - 1111] = x;
	xyijkl_1.xy[*i1 + (*j1 + (*j2 + *i2 * 10) * 10) * 10 - 1111] = x;
	xyijkl_1.xy[*j1 + (*i1 + (*i2 + *j2 * 10) * 10) * 10 - 1111] = x;
	xyijkl_1.xy[*j1 + (*i1 + (*j2 + *i2 * 10) * 10) * 10 - 1111] = x;
	xyijkl_1.xy[*i2 + (*j2 + (*i1 + *j1 * 10) * 10) * 10 - 1111] = x;
	xyijkl_1.xy[*i2 + (*j2 + (*j1 + *i1 * 10) * 10) * 10 - 1111] = x;
	xyijkl_1.xy[*j2 + (*i2 + (*i1 + *j1 * 10) * 10) * 10 - 1111] = x;
	xyijkl_1.xy[*j2 + (*i2 + (*j1 + *i1 * 10) * 10) * 10 - 1111] = x;
    }
    if (xyijkl_1.xy[*i1 + (*i2 + (*j1 + *j2 * 10) * 10) * 10 - 1111] == 100.) 
	    {
	z = spcg_(&a1[*i1 * a1_dim1 + 1], &a1[*i2 * a1_dim1 + 1], &a1[*j1 * 
		a1_dim1 + 1], &a1[*j2 * a1_dim1 + 1], w, wmatrx_1.wj);
/* #          WRITE(6,'(4I6,F13.6)')I1,I2,J1,J2,Z */
	xyijkl_1.xy[*i1 + (*i2 + (*j1 + *j2 * 10) * 10) * 10 - 1111] = z;
	xyijkl_1.xy[*i1 + (*i2 + (*j2 + *j1 * 10) * 10) * 10 - 1111] = z;
	xyijkl_1.xy[*i2 + (*i1 + (*j1 + *j2 * 10) * 10) * 10 - 1111] = z;
	xyijkl_1.xy[*i2 + (*i1 + (*j2 + *j1 * 10) * 10) * 10 - 1111] = z;
	xyijkl_1.xy[*j1 + (*j2 + (*i1 + *i2 * 10) * 10) * 10 - 1111] = z;
	xyijkl_1.xy[*j1 + (*j2 + (*i2 + *i1 * 10) * 10) * 10 - 1111] = z;
	xyijkl_1.xy[*j2 + (*j1 + (*i1 + *i2 * 10) * 10) * 10 - 1111] = z;
	xyijkl_1.xy[*j2 + (*j1 + (*i2 + *i1 * 10) * 10) * 10 - 1111] = z;
    }
    if (xyijkl_1.xy[*i1 + (*j2 + (*i2 + *j1 * 10) * 10) * 10 - 1111] == 100.) 
	    {
	y = spcg_(&a1[*i1 * a1_dim1 + 1], &a1[*j2 * a1_dim1 + 1], &a1[*i2 * 
		a1_dim1 + 1], &a1[*j1 * a1_dim1 + 1], w, wmatrx_1.wj);
/* #          WRITE(6,'(4I6,F13.6)')I1,J2,I2,J1,Y */
	xyijkl_1.xy[*i1 + (*j2 + (*i2 + *j1 * 10) * 10) * 10 - 1111] = y;
	xyijkl_1.xy[*i1 + (*j2 + (*j1 + *i2 * 10) * 10) * 10 - 1111] = y;
	xyijkl_1.xy[*j2 + (*i1 + (*i2 + *j1 * 10) * 10) * 10 - 1111] = y;
	xyijkl_1.xy[*j2 + (*i1 + (*j1 + *i2 * 10) * 10) * 10 - 1111] = y;
	xyijkl_1.xy[*i2 + (*j1 + (*i1 + *j2 * 10) * 10) * 10 - 1111] = y;
	xyijkl_1.xy[*i2 + (*j1 + (*j2 + *i1 * 10) * 10) * 10 - 1111] = y;
	xyijkl_1.xy[*j1 + (*i2 + (*i1 + *j2 * 10) * 10) * 10 - 1111] = y;
	xyijkl_1.xy[*j1 + (*i2 + (*j2 + *i1 * 10) * 10) * 10 - 1111] = y;
    }
    x = xyijkl_1.xy[*i1 + (*j1 + (*i2 + *j2 * 10) * 10) * 10 - 1111];
    y = xyijkl_1.xy[*i1 + (*j2 + (*j1 + *i2 * 10) * 10) * 10 - 1111];
    *elem = x - y;
    return 0;
} /* ijkl_ */

#undef w


