Пример #1
0
/* PURE fio_rewind PUREGVA */
int fio_rewind( int aerr, int aunit )
{
  static alist params;

  params.aerr      = aerr;
  params.aunit     = aunit;

  return f_rew( &params );
}
Пример #2
0
/* Subroutine */ int deriv_(doublereal *geo, doublereal *grad)
{
    /* Initialized data */

    static integer icalcn = 0;

    /* System generated locals */
    integer i__1, i__2, i__3, i__4;
    doublereal d__1, d__2;
    char ch__1[80];
    olist o__1;
    alist al__1;

    /* Builtin functions */
    integer i_indx(char *, char *, ftnlen, ftnlen), f_open(olist *), f_rew(
	    alist *), s_rsfe(cilist *), do_fio(integer *, char *, ftnlen), 
	    e_rsfe(void), s_wsfe(cilist *), e_wsfe(void);
    /* Subroutine */ int s_stop(char *, ftnlen);
    integer s_rsle(cilist *), do_lio(integer *, integer *, char *, ftnlen), 
	    e_rsle(void);
    double pow_di(doublereal *, integer *), sqrt(doublereal);
    integer s_wsle(cilist *), e_wsle(void);

    /* Local variables */
    static integer i__, j;
    static logical ci;
    static integer ii, ij, il, jl, kl, ll, kk;
    static logical aic;
    extern doublereal dot_(doublereal *, doublereal *, integer *);
    static logical int__;
    extern /* Subroutine */ int mxm_(doublereal *, integer *, doublereal *, 
	    integer *, doublereal *, integer *);
    static doublereal sum;
    static logical scf1;
    static char line[80];
    static integer ncol;
    static doublereal xjuc[3], step;
    static logical slow;
    static integer icapa;
    static logical halfe, debug;
    extern /* Subroutine */ int dcart_(doublereal *, doublereal *);
    static integer iline;
    static logical geook;
    static doublereal grlim;
    static integer ilowa;
    static doublereal gnorm;
    extern /* Subroutine */ int geout_(integer *);
    static integer ilowz;
    static doublereal change[3], aidref[360];
    static integer idelta;
    extern /* Character */ VOID getnam_(char *, ftnlen, char *, ftnlen);
    static logical precis, noanci, aifrst;
    extern /* Subroutine */ int dernvo_(doublereal *, doublereal *), jcarin_(
	    doublereal *, doublereal *, doublereal *, logical *, doublereal *,
	     integer *), gmetry_(doublereal *, doublereal *), deritr_(
	    doublereal *, doublereal *), symtry_(void);

    /* Fortran I/O blocks */
    static cilist io___14 = { 0, 5, 0, "(A)", 0 };
    static cilist io___17 = { 1, 5, 1, "(A)", 0 };
    static cilist io___19 = { 0, 6, 0, "(//,A)", 0 };
    static cilist io___20 = { 0, 6, 0, "(A)", 0 };
    static cilist io___21 = { 0, 6, 0, "(//,A)", 0 };
    static cilist io___22 = { 0, 6, 0, "(A)", 0 };
    static cilist io___23 = { 0, 6, 0, "(6F12.6)", 0 };
    static cilist io___25 = { 1, 5, 1, 0, 0 };
    static cilist io___26 = { 0, 6, 0, "(/,A,/)", 0 };
    static cilist io___27 = { 0, 6, 0, "(5F12.6)", 0 };
    static cilist io___28 = { 0, 6, 0, "(/,A,/)", 0 };
    static cilist io___29 = { 0, 6, 0, "(5F12.6)", 0 };
    static cilist io___31 = { 0, 6, 0, "(/,A,/)", 0 };
    static cilist io___32 = { 0, 6, 0, "(5F12.6)", 0 };
    static cilist io___37 = { 0, 6, 0, "(' GEO AT START OF DERIV')", 0 };
    static cilist io___38 = { 0, 6, 0, "(F19.5,2F12.5)", 0 };
    static cilist io___42 = { 0, 6, 0, 0, 0 };
    static cilist io___43 = { 0, 6, 0, 0, 0 };
    static cilist io___54 = { 0, 6, 0, "(//,3(A,/),I3,A)", 0 };
    static cilist io___55 = { 0, 6, 0, "(//,A)", 0 };
    static cilist io___56 = { 0, 6, 0, 0, 0 };
    static cilist io___57 = { 0, 6, 0, "(' GRADIENTS')", 0 };
    static cilist io___58 = { 0, 6, 0, "(10F8.3)", 0 };
    static cilist io___59 = { 0, 6, 0, "(' ERROR FUNCTION')", 0 };
    static cilist io___60 = { 0, 6, 0, "(10F8.3)", 0 };
    static cilist io___61 = { 0, 6, 0, "(' COSINE OF SEARCH DIRECTION =',F30"
	    ".6)", 0 };


/* COMDECK SIZES */
/* *********************************************************************** */
/*   THIS FILE CONTAINS ALL THE ARRAY SIZES FOR USE IN MOPAC. */

/*     THERE ARE ONLY 5 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) */
/*     ISYBYL = 1 IF MOPAC IS TO BE USED IN THE SYBYL PACKAGE, =0 OTHERWISE */
/*     SEE ALSO NMECI, NPULAY AND MESP AT THE END OF THIS FILE */


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

/*   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 */
/*     MAXALL         LARGER THAN MAXORB OR MAXPAR. */
/* *********************************************************************** */

/* *********************************************************************** */
/* DECK MOPAC */
/* *********************************************************************** */

/*    DERIV CALCULATES THE DERIVATIVES OF THE ENERGY WITH RESPECT TO THE */
/*          INTERNAL COORDINATES. THIS IS DONE BY FINITE DIFFERENCES. */

/*    THE MAIN ARRAYS IN DERIV ARE: */
/*        LOC    INTEGER ARRAY, LOC(1,I) CONTAINS THE ADDRESS OF THE ATOM */
/*               INTERNAL COORDINATE LOC(2,I) IS TO BE USED IN THE */
/*               DERIVATIVE CALCULATION. */
/*        GEO    ARRAY \GEO\ HOLDS THE INTERNAL COORDINATES. */
/*        GRAD   ON EXIT, CONTAINS THE DERIVATIVES */

/* *********************************************************************** */
    /* Parameter adjustments */
    --grad;
    geo -= 4;

    /* Function Body */
    if (icalcn != numcal_1.numcal) {
	aifrst = i_indx(keywrd_1.keywrd, "RESTART", (ftnlen)241, (ftnlen)7) ==
		 0;
	debug = i_indx(keywrd_1.keywrd, "DERIV", (ftnlen)241, (ftnlen)5) != 0;
	precis = i_indx(keywrd_1.keywrd, "PREC", (ftnlen)241, (ftnlen)4) != 0;
	int__ = i_indx(keywrd_1.keywrd, " XYZ", (ftnlen)241, (ftnlen)4) == 0;
	geook = i_indx(keywrd_1.keywrd, "GEO-OK", (ftnlen)241, (ftnlen)6) != 
		0;
	ci = i_indx(keywrd_1.keywrd, "C.I.", (ftnlen)241, (ftnlen)4) != 0;
	scf1 = i_indx(keywrd_1.keywrd, "1SCF", (ftnlen)241, (ftnlen)4) != 0;
	aic = i_indx(keywrd_1.keywrd, "AIDER", (ftnlen)241, (ftnlen)5) != 0;
	icapa = 'A';
	ilowa = 'a';
	ilowz = 'z';
	if (aic && aifrst) {
	    o__1.oerr = 0;
	    o__1.ounit = 5;
	    o__1.ofnmlen = 80;
	    getnam_(ch__1, (ftnlen)80, "FOR005", (ftnlen)6);
	    o__1.ofnm = ch__1;
	    o__1.orl = 0;
	    o__1.osta = "OLD";
	    o__1.oacc = 0;
	    o__1.ofm = 0;
	    o__1.oblnk = "ZERO";
	    f_open(&o__1);
	    al__1.aerr = 0;
	    al__1.aunit = 5;
	    f_rew(&al__1);

/*  ISOK IS SET FALSE: ONLY ONE SYSTEM ALLOWED */

	    okmany_1.isok = FALSE_;
	    for (i__ = 1; i__ <= 3; ++i__) {
/* L10: */
		s_rsfe(&io___14);
		do_fio(&c__1, line, (ftnlen)80);
		e_rsfe();
	    }
	    for (j = 1; j <= 1000; ++j) {
		i__1 = s_rsfe(&io___17);
		if (i__1 != 0) {
		    goto L40;
		}
		i__1 = do_fio(&c__1, line, (ftnlen)80);
		if (i__1 != 0) {
		    goto L40;
		}
		i__1 = e_rsfe();
		if (i__1 != 0) {
		    goto L40;
		}
/* *********************************************************************** */
		for (i__ = 1; i__ <= 80; ++i__) {
		    iline = *(unsigned char *)&line[i__ - 1];
		    if (iline >= ilowa && iline <= ilowz) {
			*(unsigned char *)&line[i__ - 1] = (char) (iline + 
				icapa - ilowa);
		    }
/* L20: */
		}
/* *********************************************************************** */
/* L30: */
		if (i_indx(line, "AIDER", (ftnlen)80, (ftnlen)5) != 0) {
		    goto L60;
		}
	    }
L40:
	    s_wsfe(&io___19);
	    do_fio(&c__1, " KEYWORD \"AIDER\" SPECIFIED, BUT NOT", (ftnlen)35)
		    ;
	    e_wsfe();
	    s_wsfe(&io___20);
	    do_fio(&c__1, " PRESENT AFTER Z-MATRIX.  JOB STOPPED", (ftnlen)37)
		    ;
	    e_wsfe();
	    s_stop("", (ftnlen)0);
L50:
	    s_wsfe(&io___21);
	    do_fio(&c__1, "  FAULT IN READ OF AB INITIO DERIVATIVES", (ftnlen)
		    40);
	    e_wsfe();
	    s_wsfe(&io___22);
	    do_fio(&c__1, "  DERIVATIVES READ IN ARE AS FOLLOWS", (ftnlen)36);
	    e_wsfe();
	    s_wsfe(&io___23);
	    i__1 = i__;
	    for (j = 1; j <= i__1; ++j) {
		do_fio(&c__1, (char *)&aidref[j - 1], (ftnlen)sizeof(
			doublereal));
	    }
	    e_wsfe();
	    s_stop("", (ftnlen)0);
L60:
	    if (geokst_1.natoms > 2) {
		j = geokst_1.natoms * 3 - 6;
	    } else {
		j = 1;
	    }
	    i__1 = s_rsle(&io___25);
	    if (i__1 != 0) {
		goto L50;
	    }
	    i__2 = j;
	    for (i__ = 1; i__ <= i__2; ++i__) {
		i__1 = do_lio(&c__5, &c__1, (char *)&aidref[i__ - 1], (ftnlen)
			sizeof(doublereal));
		if (i__1 != 0) {
		    goto L50;
		}
	    }
	    i__1 = e_rsle();
	    if (i__1 != 0) {
		goto L50;
	    }
	    s_wsfe(&io___26);
	    do_fio(&c__1, " AB-INITIO DERIVATIVES IN KCAL/MOL/(ANGSTROM OR R"
		    "ADIAN)", (ftnlen)55);
	    e_wsfe();
	    s_wsfe(&io___27);
	    i__1 = j;
	    for (i__ = 1; i__ <= i__1; ++i__) {
		do_fio(&c__1, (char *)&aidref[i__ - 1], (ftnlen)sizeof(
			doublereal));
	    }
	    e_wsfe();
	    i__1 = geovar_1.nvar;
	    for (i__ = 1; i__ <= i__1; ++i__) {
		if (geovar_1.loc[(i__ << 1) - 2] > 3) {
		    j = geovar_1.loc[(i__ << 1) - 2] * 3 + geovar_1.loc[(i__ 
			    << 1) - 1] - 9;
		} else if (geovar_1.loc[(i__ << 1) - 2] == 3) {
		    j = geovar_1.loc[(i__ << 1) - 1] + 1;
		} else {
		    j = 1;
		}
/* L70: */
		aidref[i__ - 1] = aidref[j - 1];
	    }
	    s_wsfe(&io___28);
	    do_fio(&c__1, " AB-INITIO DERIVATIVES FOR VARIABLES", (ftnlen)36);
	    e_wsfe();
	    s_wsfe(&io___29);
	    i__1 = geovar_1.nvar;
	    for (i__ = 1; i__ <= i__1; ++i__) {
		do_fio(&c__1, (char *)&aidref[i__ - 1], (ftnlen)sizeof(
			doublereal));
	    }
	    e_wsfe();
	    if (geosym_1.ndep != 0) {
		i__1 = geovar_1.nvar;
		for (i__ = 1; i__ <= i__1; ++i__) {
		    sum = aidref[i__ - 1];
		    i__2 = geosym_1.ndep;
		    for (j = 1; j <= i__2; ++j) {
			if (geovar_1.loc[(i__ << 1) - 2] == geosym_1.locpar[j 
				- 1] && (geovar_1.loc[(i__ << 1) - 1] == 
				geosym_1.idepfn[j - 1] || geovar_1.loc[(i__ <<
				 1) - 1] == 3 && geosym_1.idepfn[j - 1] == 14)
				) {
			    aidref[i__ - 1] += sum;
			}
/* L80: */
		    }
/* L90: */
		}
		s_wsfe(&io___31);
		do_fio(&c__1, " AB-INITIO DERIVATIVES AFTER SYMMETRY WEIGHTI"
			"NG", (ftnlen)47);
		e_wsfe();
		s_wsfe(&io___32);
		i__1 = geovar_1.nvar;
		for (j = 1; j <= i__1; ++j) {
		    do_fio(&c__1, (char *)&aidref[j - 1], (ftnlen)sizeof(
			    doublereal));
		}
		e_wsfe();
	    }
	}
	icalcn = numcal_1.numcal;
	if (i_indx(keywrd_1.keywrd, "RESTART", (ftnlen)241, (ftnlen)7) == 0) {
	    i__1 = geovar_1.nvar;
	    for (i__ = 1; i__ <= i__1; ++i__) {
/* L100: */
		errfn_1.errfn[i__ - 1] = 0.;
	    }
	}
	grlim = .01;
	if (precis) {
	    grlim = 1e-4;
	}
	halfe = molkst_1.nopen > molkst_1.nclose && molkst_1.fract != 2. && 
		molkst_1.fract != 0. || ci;
	idelta = -7;

/*   IDELTA IS A MACHINE-PRECISION DEPENDANT INTEGER */

	change[0] = pow_di(&c_b70, &idelta);
	change[1] = pow_di(&c_b70, &idelta);
	change[2] = pow_di(&c_b70, &idelta);

/*    CHANGE(I) IS THE STEP SIZE USED IN CALCULATING THE DERIVATIVES. */
/*    FOR "CARTESIAN" DERIVATIVES, CALCULATED USING DCART,AN */
/*    INFINITESIMAL STEP, HERE 0.000001, IS ACCEPTABLE. IN THE */
/*    HALF-ELECTRON METHOD A QUITE LARGE STEP IS NEEDED AS FULL SCF */
/*    CALCULATIONS ARE NEEDED, AND THE DIFFERENCE BETWEEN THE TOTAL */
/*    ENERGIES IS USED. THE STEP CANNOT BE VERY LARGE, AS THE SECOND */
/*    DERIVITIVE IN FLEPO IS CALCULATED FROM THE DIFFERENCES OF TWO */
/*    FIRST DERIVATIVES. CHANGE(1) IS FOR CHANGE IN BOND LENGTH, */
/*    (2) FOR ANGLE, AND (3) FOR DIHEDRAL. */

    }
    if (geovar_1.nvar == 0) {
	return 0;
    }
    if (debug) {
	s_wsfe(&io___37);
	e_wsfe();
	s_wsfe(&io___38);
	i__1 = geokst_1.natoms;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    for (j = 1; j <= 3; ++j) {
		do_fio(&c__1, (char *)&geo[j + i__ * 3], (ftnlen)sizeof(
			doublereal));
	    }
	}
	e_wsfe();
    }
    gnorm = 0.;
    i__1 = geovar_1.nvar;
    for (i__ = 1; i__ <= i__1; ++i__) {
	genral_1.gold[i__ - 1] = grad[i__];
	genral_1.xparam[i__ - 1] = geo[geovar_1.loc[(i__ << 1) - 1] + 
		geovar_1.loc[(i__ << 1) - 2] * 3];
/* L110: */
/* Computing 2nd power */
	d__1 = grad[i__];
	gnorm += d__1 * d__1;
    }
    gnorm = sqrt(gnorm);
    slow = FALSE_;
    noanci = FALSE_;
    if (halfe) {
	noanci = i_indx(keywrd_1.keywrd, "NOANCI", (ftnlen)241, (ftnlen)6) != 
		0 || molkst_1.nopen == molkst_1.norbs;
	slow = noanci && (gnorm < grlim || scf1);
    }
    if (geosym_1.ndep != 0) {
	symtry_();
    }
    gmetry_(&geo[4], genral_1.coord);

/*  COORD NOW HOLDS THE CARTESIAN COORDINATES */

    if (halfe && ! noanci) {
	if (debug) {
	    s_wsle(&io___42);
	    do_lio(&c__9, &c__1, "DOING ANALYTICAL C.I. DERIVATIVES", (ftnlen)
		    33);
	    e_wsle();
	}
	dernvo_(genral_1.coord, xyzgra_1.dxyz);
    } else {
	if (debug) {
	    s_wsle(&io___43);
	    do_lio(&c__9, &c__1, "DOING VARIATIONALLY OPIMIZED DERIVATIVES", (
		    ftnlen)40);
	    e_wsle();
	}
	dcart_(genral_1.coord, xyzgra_1.dxyz);
    }
    ij = 0;
    i__1 = molkst_1.numat;
    for (ii = 1; ii <= i__1; ++ii) {
	i__2 = ucell_1.l1u;
	for (il = ucell_1.l1l; il <= i__2; ++il) {
	    i__3 = ucell_1.l2u;
	    for (jl = ucell_1.l2l; jl <= i__3; ++jl) {
		i__4 = ucell_1.l3u;
		for (kl = ucell_1.l3l; kl <= i__4; ++kl) {
/* $DOIT ASIS */
		    for (ll = 1; ll <= 3; ++ll) {
/* L120: */
			xjuc[ll - 1] = genral_1.coord[ll + ii * 3 - 4] + 
				euler_1.tvec[ll - 1] * il + euler_1.tvec[ll + 
				2] * jl + euler_1.tvec[ll + 5] * kl;
		    }
		    ++ij;
/* $DOIT ASIS */
		    for (kk = 1; kk <= 3; ++kk) {
			genral_1.cold[kk + ij * 3 - 4] = xjuc[kk - 1];
/* L130: */
		    }
/* L140: */
		}
	    }
	}
/* L150: */
    }
    step = change[0];
    jcarin_(genral_1.coord, genral_1.xparam, &step, &precis, work3_1.work2, &
	    ncol);
    mxm_(work3_1.work2, &geovar_1.nvar, xyzgra_1.dxyz, &ncol, &grad[1], &c__1)
	    ;
    if (precis) {
	step = .5 / step;
    } else {
	step = 1. / step;
    }
    i__1 = geovar_1.nvar;
    for (i__ = 1; i__ <= i__1; ++i__) {
/* L160: */
	grad[i__] *= step;
    }

/*  NOW TO ENSURE THAT INTERNAL DERIVATIVES ACCURATELY REFLECT CARTESIAN */
/*  DERIVATIVES */

    if (int__ && ! geook && geovar_1.nvar >= molkst_1.numat * 3 - 6 && 
	    euler_1.id == 0) {

/*  NUMBER OF VARIABLES LOOKS O.K. */

	sum = dot_(&grad[1], &grad[1], &geovar_1.nvar);
	i__1 = molkst_1.numat * 3;
/* Computing MAX */
	d__1 = 4., d__2 = sum * 4.;
	if (sum < 2. && dot_(xyzgra_1.dxyz, xyzgra_1.dxyz, &i__1) > max(d__1,
		d__2)) {

/* OOPS, LOOKS LIKE AN ERROR. */

	    i__1 = geovar_1.nvar;
	    for (i__ = 1; i__ <= i__1; ++i__) {
		j = (integer) (genral_1.xparam[i__ - 1] / 3.141);
		if (geovar_1.loc[(i__ << 1) - 1] == 2 && geovar_1.loc[(i__ << 
			1) - 2] > 3 && (d__1 = genral_1.xparam[i__ - 1] - j * 
			3.1415926, abs(d__1)) < .005) {

/*  ERROR LOCATED, BUT CANNOT CORRECT IN THIS RUN */

		    s_wsfe(&io___54);
		    do_fio(&c__1, " INTERNAL COORDINATE DERIVATIVES DO NOT R"
			    "EFLECT", (ftnlen)47);
		    do_fio(&c__1, " CARTESIAN COORDINATE DERIVATIVES", (
			    ftnlen)33);
		    do_fio(&c__1, " TO CORRECT ERROR, INCREASE DIHEDRAL OF A"
			    "TOM", (ftnlen)44);
		    do_fio(&c__1, (char *)&geovar_1.loc[(i__ << 1) - 2], (
			    ftnlen)sizeof(integer));
		    do_fio(&c__1, " BY 90 DEGREES", (ftnlen)14);
		    e_wsfe();
		    s_wsfe(&io___55);
		    do_fio(&c__1, "     CURRENT GEOMETRY", (ftnlen)21);
		    e_wsfe();
		    geout_(&c__6);
		    s_stop("", (ftnlen)0);
		}
/* L170: */
	    }
	}
    }

/*  THIS CODE IS ONLY USED IF THE KEYWORD NOANCI IS SPECIFIED */
    if (slow) {
	if (debug) {
	    s_wsle(&io___56);
	    do_lio(&c__9, &c__1, "DOING FULL SCF DERIVATIVES", (ftnlen)26);
	    e_wsle();
	}
	deritr_(errfn_1.errfn, &geo[4]);

/* THE ARRAY ERRFN HOLDS THE EXACT DERIVATIVES MINUS THE APPROXIMATE */
/* DERIVATIVES */
	i__1 = geovar_1.nvar;
	for (i__ = 1; i__ <= i__1; ++i__) {
/* L180: */
	    errfn_1.errfn[i__ - 1] -= grad[i__];
	}
    }
    gravec_1.cosine = dot_(&grad[1], genral_1.gold, &geovar_1.nvar) / sqrt(
	    dot_(&grad[1], &grad[1], &geovar_1.nvar) * dot_(genral_1.gold, 
	    genral_1.gold, &geovar_1.nvar) + 1e-20);
    i__1 = geovar_1.nvar;
    for (i__ = 1; i__ <= i__1; ++i__) {
/* L190: */
	grad[i__] += errfn_1.errfn[i__ - 1];
    }
    if (aic) {
	if (aifrst) {
	    aifrst = FALSE_;
	    i__1 = geovar_1.nvar;
	    for (i__ = 1; i__ <= i__1; ++i__) {
/* L200: */
		errfn_1.aicorr[i__ - 1] = -aidref[i__ - 1] - grad[i__];
	    }
	}
/* #         WRITE(6,'('' GRADIENTS BEFORE AI CORRECTION'')') */
/* #         WRITE(6,'(10F8.3)')(GRAD(I),I=1,NVAR) */
	i__1 = geovar_1.nvar;
	for (i__ = 1; i__ <= i__1; ++i__) {
/* L210: */
	    grad[i__] += errfn_1.aicorr[i__ - 1];
	}
    }
/* L220: */
    if (debug) {
	s_wsfe(&io___57);
	e_wsfe();
	s_wsfe(&io___58);
	i__1 = geovar_1.nvar;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    do_fio(&c__1, (char *)&grad[i__], (ftnlen)sizeof(doublereal));
	}
	e_wsfe();
	if (slow) {
	    s_wsfe(&io___59);
	    e_wsfe();
	    s_wsfe(&io___60);
	    i__1 = geovar_1.nvar;
	    for (i__ = 1; i__ <= i__1; ++i__) {
		do_fio(&c__1, (char *)&errfn_1.errfn[i__ - 1], (ftnlen)sizeof(
			doublereal));
	    }
	    e_wsfe();
	}
    }
    if (debug) {
	s_wsfe(&io___61);
	do_fio(&c__1, (char *)&gravec_1.cosine, (ftnlen)sizeof(doublereal));
	e_wsfe();
    }
    return 0;
} /* deriv_ */
Пример #3
0
/* Subroutine */ int geoutg_(integer *iprt)
{
    /* Initialized data */

    static char elemnt[2*107] = " H" "He" "Li" "Be" " B" " C" " N" " O" " F" 
	    "Ne" "Na" "Mg" "Al" "Si" " P" " S" "Cl" "Ar" " K" "Ca" "Sc" "Ti" 
	    " V" "Cr" "Mn" "Fe" "Co" "Ni" "Cu" "Zn" "Ga" "Ge" "As" "Se" "Br" 
	    "Kr" "Rb" "Sr" " Y" "Zr" "Nb" "Mo" "Tc" "Ru" "Rh" "Pd" "Ag" "Cd" 
	    "In" "Sn" "Sb" "Te" " I" "Xe" "Cs" "Ba" "La" "Ce" "Pr" "Nd" "Pm" 
	    "Sm" "Eu" "Gd" "Tb" "Dy" "Ho" "Er" "Tm" "Yb" "Lu" "Hf" "Ta" " W" 
	    "Re" "Os" "Ir" "Pt" "Au" "Hg" "Tl" "Pb" "Bi" "Po" "At" "Rn" "Fr" 
	    "Ra" "Ac" "Th" "Pa" " U" "Np" "Pu" "Am" "Cm" "Bk" "Cf" "XX" "Fm" 
	    "Md" "Cb" "++" " +" "--" " -" "Tv";
    static char type__[1*3] = "r" "a" "d";

    /* System generated locals */
    address a__1[3];
    integer i__1, i__2[3], i__3, i__4;
    doublereal d__1;
    olist o__1;
    alist al__1;

    /* Builtin functions */
    integer f_open(olist *);
    double asin(doublereal);
    /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen);
    integer f_rew(alist *), s_wsfe(cilist *), do_fio(integer *, char *, 
	    ftnlen), e_wsfe(void), s_rsfe(cilist *), e_rsfe(void), s_cmp(char 
	    *, char *, ftnlen, ftnlen);
    /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen);
    integer s_wsle(cilist *), e_wsle(void);

    /* Local variables */
    static integer i__, j, l, nbi, nci;
    extern /* Subroutine */ int xxx_(char *, integer *, integer *, integer *, 
	    integer *, char *, ftnlen, ftnlen);
    static integer igeo[360]	/* was [3][120] */;
    static char line[15*3*120];
    static integer nopt;
    static char blank[80];
    static doublereal degree;
    static char optdat[14*360];
    static integer maxtxt;

    /* Fortran I/O blocks */
    static cilist io___10 = { 0, 21, 0, "(F12.6)", 0 };
    static cilist io___11 = { 0, 21, 0, "(F12.6)", 0 };
    static cilist io___12 = { 0, 21, 0, "(A)", 0 };
    static cilist io___17 = { 0, 0, 0, "(1X,A,I4,A,I4,A,I4,A,I4)", 0 };
    static cilist io___18 = { 0, 0, 0, "(1X,A,I4,A,I4,A,I4,A,I4)", 0 };
    static cilist io___19 = { 0, 0, 0, "(1X,A,I4,A,I4,A,I4,A,I4)", 0 };
    static cilist io___21 = { 0, 0, 0, "(1X,A,I4,A,I4,A,I4,A,I4)", 0 };
    static cilist io___22 = { 0, 0, 0, 0, 0 };
    static cilist io___23 = { 0, 0, 0, "(A,F12.6)", 0 };
    static cilist io___24 = { 0, 0, 0, "(A,F12.6)", 0 };


/* COMDECK SIZES */
/* *********************************************************************** */
/*   THIS FILE CONTAINS ALL THE ARRAY SIZES FOR USE IN MOPAC. */

/*     THERE ARE ONLY 5 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) */
/*     ISYBYL = 1 IF MOPAC IS TO BE USED IN THE SYBYL PACKAGE, =0 OTHERWISE */
/*     SEE ALSO NMECI, NPULAY AND MESP AT THE END OF THIS FILE */


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

/*   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 */
/*     MAXALL         LARGER THAN MAXORB OR MAXPAR. */
/* *********************************************************************** */

/* *********************************************************************** */
/* DECK MOPAC */
/* *********************************************************************** */

/*   GEOUTG WRITES OUT THE GEOMETRY IN GAUSSIAN-8X STYLE */

/* *********************************************************************** */
    i__1 = geokst_1.natoms;
    for (i__ = 1; i__ <= i__1; ++i__) {
	for (j = 1; j <= 3; ++j) {
/* L10: */
	    igeo[j + i__ * 3 - 4] = -1;
	}
    }
    i__1 = geovar_1.nvar;
    for (i__ = 1; i__ <= i__1; ++i__) {
/* L20: */
	igeo[geovar_1.loc[(i__ << 1) - 1] + geovar_1.loc[(i__ << 1) - 2] * 3 
		- 4] = -2;
    }
    i__1 = geosym_1.ndep;
    for (i__ = 1; i__ <= i__1; ++i__) {
	if (geosym_1.idepfn[i__ - 1] == 14) {
	    igeo[geosym_1.locdep[i__ - 1] * 3 - 1] = -geosym_1.locpar[i__ - 1]
		    ;
	} else {
	    if (geosym_1.idepfn[i__ - 1] > 3) {
		goto L30;
	    }
	    igeo[geosym_1.idepfn[i__ - 1] + geosym_1.locdep[i__ - 1] * 3 - 4] 
		    = geosym_1.locpar[i__ - 1];
	}
L30:
	;
    }
    o__1.oerr = 0;
    o__1.ounit = 21;
    o__1.ofnm = 0;
    o__1.orl = 0;
    o__1.osta = "SCRATCH";
    o__1.oacc = 0;
    o__1.ofm = 0;
    o__1.oblnk = 0;
    f_open(&o__1);
    degree = 90. / asin(1.);
    maxtxt = *(unsigned char *)atomtx_1.ltxt;
    nopt = 0;
    i__1 = geokst_1.natoms;
    for (i__ = 1; i__ <= i__1; ++i__) {
	for (j = 1; j <= 3; ++j) {
	    s_copy(line + (j + i__ * 3 - 4) * 15, " ", (ftnlen)15, (ftnlen)1);
	    if (igeo[j + i__ * 3 - 4] == -1) {
		al__1.aerr = 0;
		al__1.aunit = 21;
		f_rew(&al__1);
		if (j != 1) {
		    s_wsfe(&io___10);
		    d__1 = geom_1.geo[j + i__ * 3 - 4] * degree;
		    do_fio(&c__1, (char *)&d__1, (ftnlen)sizeof(doublereal));
		    e_wsfe();
		} else {
		    s_wsfe(&io___11);
		    do_fio(&c__1, (char *)&geom_1.geo[j + i__ * 3 - 4], (
			    ftnlen)sizeof(doublereal));
		    e_wsfe();
		}
		al__1.aerr = 0;
		al__1.aunit = 21;
		f_rew(&al__1);
		s_rsfe(&io___12);
		do_fio(&c__1, line + (j + i__ * 3 - 4) * 15, (ftnlen)15);
		e_rsfe();
	    } else if (igeo[j + i__ * 3 - 4] == -2) {
		++nopt;
		if (s_cmp(simbol_1.simbol + (nopt - 1) * 10, "---", (ftnlen)
			10, (ftnlen)3) != 0) {
		    if (*(unsigned char *)&simbol_1.simbol[(nopt - 1) * 10] ==
			     '-') {
			s_copy(line + ((j + i__ * 3 - 4) * 15 + 3), 
				simbol_1.simbol + ((nopt - 1) * 10 + 1), (
				ftnlen)12, (ftnlen)9);
		    } else {
			s_copy(line + ((j + i__ * 3 - 4) * 15 + 3), 
				simbol_1.simbol + (nopt - 1) * 10, (ftnlen)12,
				 (ftnlen)10);
		    }
		} else {
		    nbi = geokst_1.nb[i__ - 1];
		    nci = geokst_1.nc[i__ - 1];
		    if (j != 3) {
			nci = 0;
		    }
		    if (j == 1) {
			nbi = 0;
		    }
		    xxx_(type__ + (j - 1), &i__, &geokst_1.na[i__ - 1], &nbi, 
			    &nci, line + ((j + i__ * 3 - 4) * 15 + 3), (
			    ftnlen)1, (ftnlen)12);
		}
		s_copy(optdat + (nopt - 1) * 14, line + (j + i__ * 3 - 4) * 
			15, (ftnlen)14, (ftnlen)15);
	    } else if (igeo[j + i__ * 3 - 4] < 0) {
		s_copy(line + (i__ * 3 - 1) * 15, line + (-igeo[j + i__ * 3 - 
			4] * 3 - 1) * 15, (ftnlen)15, (ftnlen)15);
		*(unsigned char *)&line[(i__ * 3 - 1) * 15 + 2] = '-';
	    } else {
		s_copy(line + (j + i__ * 3 - 4) * 15, line + (j + igeo[j + 
			i__ * 3 - 4] * 3 - 4) * 15, (ftnlen)15, (ftnlen)15);
	    }
/* L40: */
	}
/* Writing concatenation */
	i__2[0] = 2, a__1[0] = elemnt + (geokst_1.labels[i__ - 1] - 1 << 1);
	i__2[1] = 8, a__1[1] = atomtx_1.txtatm + (i__ - 1 << 3);
	i__2[2] = 2, a__1[2] = "  ";
	s_cat(blank, a__1, i__2, &c__3, (ftnlen)80);
	if (geokst_1.labels[i__ - 1] == 99) {
	    *(unsigned char *)blank = ' ';
	}
/* Computing MAX */
	i__3 = 4, i__4 = maxtxt + 2;
	j = max(i__3,i__4);
	if (i__ == 1) {
	    io___17.ciunit = *iprt;
	    s_wsfe(&io___17);
	    do_fio(&c__1, blank, j);
	    e_wsfe();
	} else if (i__ == 2) {
	    io___18.ciunit = *iprt;
	    s_wsfe(&io___18);
	    do_fio(&c__1, blank, j);
	    do_fio(&c__1, (char *)&geokst_1.na[i__ - 1], (ftnlen)sizeof(
		    integer));
	    do_fio(&c__1, line + (i__ * 3 - 3) * 15, (ftnlen)15);
	    e_wsfe();
	} else if (i__ == 3) {
	    io___19.ciunit = *iprt;
	    s_wsfe(&io___19);
	    do_fio(&c__1, blank, j);
	    do_fio(&c__1, (char *)&geokst_1.na[i__ - 1], (ftnlen)sizeof(
		    integer));
	    do_fio(&c__1, line + (i__ * 3 - 3) * 15, (ftnlen)15);
	    do_fio(&c__1, (char *)&geokst_1.nb[i__ - 1], (ftnlen)sizeof(
		    integer));
	    do_fio(&c__1, line + (i__ * 3 - 2) * 15, (ftnlen)15);
	    e_wsfe();
	} else {
	    l = 0;
	    io___21.ciunit = *iprt;
	    s_wsfe(&io___21);
	    do_fio(&c__1, blank, j);
	    do_fio(&c__1, (char *)&geokst_1.na[i__ - 1], (ftnlen)sizeof(
		    integer));
	    do_fio(&c__1, line + (i__ * 3 - 3) * 15, (ftnlen)15);
	    do_fio(&c__1, (char *)&geokst_1.nb[i__ - 1], (ftnlen)sizeof(
		    integer));
	    do_fio(&c__1, line + (i__ * 3 - 2) * 15, (ftnlen)15);
	    do_fio(&c__1, (char *)&geokst_1.nc[i__ - 1], (ftnlen)sizeof(
		    integer));
	    do_fio(&c__1, line + (i__ * 3 - 1) * 15, (ftnlen)15);
	    do_fio(&c__1, (char *)&l, (ftnlen)sizeof(integer));
	    e_wsfe();
	}
/* L50: */
    }
    io___22.ciunit = *iprt;
    s_wsle(&io___22);
    e_wsle();
    for (l = 1; l <= 3; ++l) {
	i__1 = nopt;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    if (geovar_1.loc[(i__ << 1) - 1] == l) {
		if (geovar_1.loc[(i__ << 1) - 1] != 1) {
		    io___23.ciunit = *iprt;
		    s_wsfe(&io___23);
		    do_fio(&c__1, optdat + (i__ - 1) * 14, (ftnlen)14);
		    d__1 = geom_1.geo[geovar_1.loc[(i__ << 1) - 1] + 
			    geovar_1.loc[(i__ << 1) - 2] * 3 - 4] * degree;
		    do_fio(&c__1, (char *)&d__1, (ftnlen)sizeof(doublereal));
		    e_wsfe();
		} else {
		    io___24.ciunit = *iprt;
		    s_wsfe(&io___24);
		    do_fio(&c__1, optdat + (i__ - 1) * 14, (ftnlen)14);
		    do_fio(&c__1, (char *)&geom_1.geo[geovar_1.loc[(i__ << 1) 
			    - 1] + geovar_1.loc[(i__ << 1) - 2] * 3 - 4], (
			    ftnlen)sizeof(doublereal));
		    e_wsfe();
		}
	    }
/* L60: */
	}
/* L70: */
    }
    return 0;
} /* geoutg_ */
Пример #4
0
/* Subroutine */ int gettxt_()
{
    /* System generated locals */
    integer i__1;
    char ch__1[80];
    olist o__1;
    alist al__1;

    /* Builtin functions */
    /* Subroutine */ int s_copy();
    integer s_rsfe(), do_fio(), e_rsfe(), i_indx(), f_open(), f_rew(), s_wsfe(
	    ), e_wsfe(), s_cmp();
    /* Subroutine */ int s_stop();

    /* Local variables */
    static integer i__, j;
    static char filen[50], ch[1];
    static integer is[3];
    extern /* Character */ VOID getnam_();
    extern /* Subroutine */ int upcase_();
    static char oldkey[80], ch2[1];

    /* Fortran I/O blocks */
    static cilist io___2 = { 1, 5, 1, "(A)", 0 };
    static cilist io___7 = { 1, 4, 1, "(A)", 0 };
    static cilist io___8 = { 1, 4, 1, "(A)", 0 };
    static cilist io___9 = { 1, 5, 1, "(A)", 0 };
    static cilist io___10 = { 1, 5, 1, "(A)", 0 };
    static cilist io___11 = { 1, 4, 1, "(A)", 0 };
    static cilist io___12 = { 1, 5, 1, "(A)", 0 };
    static cilist io___13 = { 1, 5, 1, "(A)", 0 };
    static cilist io___14 = { 1, 5, 1, "(A)", 0 };
    static cilist io___15 = { 1, 4, 1, "(A)", 0 };
    static cilist io___16 = { 1, 5, 1, "(A)", 0 };
    static cilist io___17 = { 1, 5, 1, "(A)", 0 };
    static cilist io___18 = { 1, 5, 1, "(A)", 0 };
    static cilist io___19 = { 1, 5, 1, "(A)", 0 };
    static cilist io___20 = { 0, 6, 0, "(A)", 0 };
    static cilist io___23 = { 0, 6, 0, "(A,I2,A)", 0 };
    static cilist io___24 = { 0, 6, 0, "(A)", 0 };
    static cilist io___25 = { 0, 6, 0, "(A)", 0 };


    is[0] = 161;
    is[1] = 81;
    is[2] = 1;
    s_copy(keywrd_1.keywrd, " ", (ftnlen)241, (ftnlen)1);
    s_copy(titles_1.koment, "    NULL  ", (ftnlen)81, (ftnlen)10);
    s_copy(titles_1.title, "    NULL  ", (ftnlen)81, (ftnlen)10);
    i__1 = s_rsfe(&io___2);
    if (i__1 != 0) {
	goto L100001;
    }
    i__1 = do_fio(&c__1, keywrd_1.keywrd, (ftnlen)80);
    if (i__1 != 0) {
	goto L100001;
    }
    i__1 = e_rsfe();
L100001:
    if (i__1 < 0) {
	goto L100;
    }
    if (i__1 > 0) {
	goto L90;
    }
    s_copy(oldkey, keywrd_1.keywrd, (ftnlen)80, (ftnlen)241);
    upcase_(keywrd_1.keywrd, (ftnlen)80);
    if (i_indx(keywrd_1.keywrd, "SETUP", (ftnlen)241, (ftnlen)5) != 0) {
	i__ = i_indx(keywrd_1.keywrd, "SETUP=", (ftnlen)241, (ftnlen)6);
	if (i__ != 0) {
	    j = i_indx(keywrd_1.keywrd + (i__ - 1), " ", 241 - (i__ - 1), (
		    ftnlen)1);
	    i__1 = i__ + 5;
	    s_copy(filen, oldkey + i__1, (ftnlen)50, i__ + j - 1 - i__1);
	} else {
	    s_copy(filen, "SETUP", (ftnlen)50, (ftnlen)5);
	}
	o__1.oerr = 0;
	o__1.ounit = 4;
	o__1.ofnmlen = 80;
	getnam_(ch__1, (ftnlen)80, filen, (ftnlen)50);
	o__1.ofnm = ch__1;
	o__1.orl = 0;
	o__1.osta = "UNKNOWN";
	o__1.oacc = 0;
	o__1.ofm = "FORMATTED";
	o__1.oblnk = 0;
	f_open(&o__1);
	al__1.aerr = 0;
	al__1.aunit = 4;
	f_rew(&al__1);
	i__1 = s_rsfe(&io___7);
	if (i__1 != 0) {
	    goto L40;
	}
	i__1 = do_fio(&c__1, keywrd_1.keywrd + 80, (ftnlen)80);
	if (i__1 != 0) {
	    goto L40;
	}
	i__1 = e_rsfe();
	if (i__1 != 0) {
	    goto L40;
	}
	upcase_(keywrd_1.keywrd + 80, (ftnlen)80);
	i__1 = s_rsfe(&io___8);
	if (i__1 != 0) {
	    goto L10;
	}
	i__1 = do_fio(&c__1, keywrd_1.keywrd + 160, (ftnlen)80);
	if (i__1 != 0) {
	    goto L10;
	}
	i__1 = e_rsfe();
	if (i__1 != 0) {
	    goto L10;
	}
	upcase_(keywrd_1.keywrd + 160, (ftnlen)80);
L10:
	i__1 = s_rsfe(&io___9);
	if (i__1 != 0) {
	    goto L100002;
	}
	i__1 = do_fio(&c__1, titles_1.koment, (ftnlen)81);
	if (i__1 != 0) {
	    goto L100002;
	}
	i__1 = do_fio(&c__1, titles_1.title, (ftnlen)81);
	if (i__1 != 0) {
	    goto L100002;
	}
	i__1 = e_rsfe();
L100002:
	if (i__1 < 0) {
	    goto L100;
	}
	if (i__1 > 0) {
	    goto L90;
	}
    } else if (i_indx(keywrd_1.keywrd, " +", (ftnlen)80, (ftnlen)2) != 0) {

/*  READ SECOND KEYWORD LINE */

	i__1 = s_rsfe(&io___10);
	if (i__1 != 0) {
	    goto L100003;
	}
	i__1 = do_fio(&c__1, keywrd_1.keywrd + 80, (ftnlen)80);
	if (i__1 != 0) {
	    goto L100003;
	}
	i__1 = e_rsfe();
L100003:
	if (i__1 < 0) {
	    goto L100;
	}
	if (i__1 > 0) {
	    goto L90;
	}
	s_copy(oldkey, keywrd_1.keywrd + 80, (ftnlen)80, (ftnlen)80);
	upcase_(keywrd_1.keywrd + 80, (ftnlen)80);
	if (i_indx(keywrd_1.keywrd + 80, "SETUP", (ftnlen)80, (ftnlen)5) != 0)
		 {
	    i__ = i_indx(keywrd_1.keywrd, "SETUP=", (ftnlen)241, (ftnlen)6);
	    if (i__ != 0) {
		j = i_indx(keywrd_1.keywrd + (i__ - 1), " ", 241 - (i__ - 1), 
			(ftnlen)1);
		i__1 = i__ - 75;
		s_copy(filen, oldkey + i__1, (ftnlen)50, i__ + j - 80 - i__1);
	    } else {
		s_copy(filen, "SETUP", (ftnlen)50, (ftnlen)5);
	    }
	    o__1.oerr = 0;
	    o__1.ounit = 4;
	    o__1.ofnmlen = 80;
	    getnam_(ch__1, (ftnlen)80, filen, (ftnlen)50);
	    o__1.ofnm = ch__1;
	    o__1.orl = 0;
	    o__1.osta = "UNKNOWN";
	    o__1.oacc = 0;
	    o__1.ofm = "FORMATTED";
	    o__1.oblnk = 0;
	    f_open(&o__1);
	    al__1.aerr = 0;
	    al__1.aunit = 4;
	    f_rew(&al__1);
	    i__1 = s_rsfe(&io___11);
	    if (i__1 != 0) {
		goto L20;
	    }
	    i__1 = do_fio(&c__1, keywrd_1.keywrd + 160, (ftnlen)80);
	    if (i__1 != 0) {
		goto L20;
	    }
	    i__1 = e_rsfe();
	    if (i__1 != 0) {
		goto L20;
	    }
	    upcase_(keywrd_1.keywrd + 160, (ftnlen)80);
L20:
	    ;
	} else if (i_indx(keywrd_1.keywrd + 80, " +", (ftnlen)80, (ftnlen)2) 
		!= 0) {

/*  READ THIRD KEYWORD LINE */

	    i__1 = s_rsfe(&io___12);
	    if (i__1 != 0) {
		goto L100004;
	    }
	    i__1 = do_fio(&c__1, keywrd_1.keywrd + 160, (ftnlen)80);
	    if (i__1 != 0) {
		goto L100004;
	    }
	    i__1 = e_rsfe();
L100004:
	    if (i__1 < 0) {
		goto L100;
	    }
	    if (i__1 > 0) {
		goto L90;
	    }
	    upcase_(keywrd_1.keywrd + 160, (ftnlen)80);
	}

/*  READ TITLE LINE */

	i__1 = s_rsfe(&io___13);
	if (i__1 != 0) {
	    goto L100005;
	}
	i__1 = do_fio(&c__1, titles_1.koment, (ftnlen)81);
	if (i__1 != 0) {
	    goto L100005;
	}
	i__1 = do_fio(&c__1, titles_1.title, (ftnlen)81);
	if (i__1 != 0) {
	    goto L100005;
	}
	i__1 = e_rsfe();
L100005:
	if (i__1 < 0) {
	    goto L100;
	}
	if (i__1 > 0) {
	    goto L90;
	}
    } else if (i_indx(keywrd_1.keywrd, "&", (ftnlen)80, (ftnlen)1) != 0) {
	i__1 = s_rsfe(&io___14);
	if (i__1 != 0) {
	    goto L100006;
	}
	i__1 = do_fio(&c__1, keywrd_1.keywrd + 80, (ftnlen)80);
	if (i__1 != 0) {
	    goto L100006;
	}
	i__1 = e_rsfe();
L100006:
	if (i__1 < 0) {
	    goto L100;
	}
	if (i__1 > 0) {
	    goto L90;
	}
	s_copy(oldkey, keywrd_1.keywrd + 80, (ftnlen)80, (ftnlen)80);
	upcase_(keywrd_1.keywrd + 80, (ftnlen)80);
	if (i_indx(keywrd_1.keywrd + 80, "SETUP", (ftnlen)80, (ftnlen)5) != 0)
		 {
	    i__ = i_indx(keywrd_1.keywrd, "SETUP=", (ftnlen)241, (ftnlen)6);
	    if (i__ != 0) {
		j = i_indx(keywrd_1.keywrd + (i__ - 1), " ", 241 - (i__ - 1), 
			(ftnlen)1);
		i__1 = i__ - 75;
		s_copy(filen, oldkey + i__1, (ftnlen)50, i__ + j - 80 - i__1);
/*               write(*,*)' <'//FILEN//'>' */
/*               stop */
	    } else {
		s_copy(filen, "SETUP", (ftnlen)50, (ftnlen)5);
	    }
	    o__1.oerr = 0;
	    o__1.ounit = 4;
	    o__1.ofnmlen = 80;
	    getnam_(ch__1, (ftnlen)80, filen, (ftnlen)50);
	    o__1.ofnm = ch__1;
	    o__1.orl = 0;
	    o__1.osta = "UNKNOWN";
	    o__1.oacc = 0;
	    o__1.ofm = "FORMATTED";
	    o__1.oblnk = 0;
	    f_open(&o__1);
	    al__1.aerr = 0;
	    al__1.aunit = 4;
	    f_rew(&al__1);
	    i__1 = s_rsfe(&io___15);
	    if (i__1 != 0) {
		goto L30;
	    }
	    i__1 = do_fio(&c__1, keywrd_1.keywrd + 160, (ftnlen)80);
	    if (i__1 != 0) {
		goto L30;
	    }
	    i__1 = e_rsfe();
	    if (i__1 != 0) {
		goto L30;
	    }
	    upcase_(keywrd_1.keywrd + 160, (ftnlen)80);
	    i__1 = s_rsfe(&io___16);
	    if (i__1 != 0) {
		goto L100007;
	    }
	    i__1 = do_fio(&c__1, titles_1.title, (ftnlen)81);
	    if (i__1 != 0) {
		goto L100007;
	    }
	    i__1 = e_rsfe();
L100007:
	    if (i__1 < 0) {
		goto L100;
	    }
	    if (i__1 > 0) {
		goto L90;
	    }
L30:
	    ;
	} else if (i_indx(keywrd_1.keywrd + 80, "&", (ftnlen)80, (ftnlen)1) !=
		 0) {
	    i__1 = s_rsfe(&io___17);
	    if (i__1 != 0) {
		goto L100008;
	    }
	    i__1 = do_fio(&c__1, keywrd_1.keywrd + 160, (ftnlen)80);
	    if (i__1 != 0) {
		goto L100008;
	    }
	    i__1 = e_rsfe();
L100008:
	    if (i__1 < 0) {
		goto L100;
	    }
	    if (i__1 > 0) {
		goto L90;
	    }
	} else {
	    i__1 = s_rsfe(&io___18);
	    if (i__1 != 0) {
		goto L100009;
	    }
	    i__1 = do_fio(&c__1, titles_1.title, (ftnlen)81);
	    if (i__1 != 0) {
		goto L100009;
	    }
	    i__1 = e_rsfe();
L100009:
	    if (i__1 < 0) {
		goto L100;
	    }
	    if (i__1 > 0) {
		goto L90;
	    }
	}
    } else {
	i__1 = s_rsfe(&io___19);
	if (i__1 != 0) {
	    goto L100010;
	}
	i__1 = do_fio(&c__1, titles_1.koment, (ftnlen)81);
	if (i__1 != 0) {
	    goto L100010;
	}
	i__1 = do_fio(&c__1, titles_1.title, (ftnlen)81);
	if (i__1 != 0) {
	    goto L100010;
	}
	i__1 = e_rsfe();
L100010:
	if (i__1 < 0) {
	    goto L100;
	}
	if (i__1 > 0) {
	    goto L90;
	}
    }
    goto L50;
L40:
    s_wsfe(&io___20);
    do_fio(&c__1, " SETUP FILE MISSING OR CORRUPT", (ftnlen)30);
    e_wsfe();
L50:
    for (j = 1; j <= 3; ++j) {
	i__1 = is[j - 1] - 1;
	if (s_cmp(keywrd_1.keywrd + i__1, " ", is[j - 1] - i__1, (ftnlen)1) !=
		 0) {
	    i__1 = is[j - 1] - 1;
	    s_copy(ch, keywrd_1.keywrd + i__1, (ftnlen)1, is[j - 1] - i__1);
	    i__1 = is[j - 1] - 1;
	    s_copy(keywrd_1.keywrd + i__1, " ", is[j - 1] - i__1, (ftnlen)1);
	    for (i__ = is[j - 1] + 1; i__ <= 239; ++i__) {
		*(unsigned char *)ch2 = *(unsigned char *)&keywrd_1.keywrd[
			i__ - 1];
		*(unsigned char *)&keywrd_1.keywrd[i__ - 1] = *(unsigned char 
			*)ch;
		*(unsigned char *)ch = *(unsigned char *)ch2;
		i__1 = i__;
		if (s_cmp(keywrd_1.keywrd + i__1, "  ", i__ + 2 - i__1, (
			ftnlen)2) == 0) {
		    i__1 = i__;
		    s_copy(keywrd_1.keywrd + i__1, ch, i__ + 1 - i__1, (
			    ftnlen)1);
		    goto L70;
		}
/* L60: */
	    }
	    s_wsfe(&io___23);
	    do_fio(&c__1, " LINE", (ftnlen)5);
	    do_fio(&c__1, (char *)&j, (ftnlen)sizeof(integer));
	    do_fio(&c__1, " OF KEYWORDS DOES NOT HAVE ENOUGH", (ftnlen)33);
	    e_wsfe();
	    s_wsfe(&io___24);
	    do_fio(&c__1, " SPACES FOR PARSING.  PLEASE CORRECT LINE.", (
		    ftnlen)42);
	    e_wsfe();
	    s_stop("", (ftnlen)0);
L70:
	    ;
	}
/* L80: */
    }
    return 0;
L90:
    s_wsfe(&io___25);
    do_fio(&c__1, " ERROR IN READ OF FIRST THREE LINES", (ftnlen)35);
    e_wsfe();
L100:
    s_stop("", (ftnlen)0);
} /* gettxt_ */
Пример #5
0
/* $Procedure COUNTC ( Count characters in a text file ) */
integer countc_(integer *unit, integer *bline, integer *eline, char *line, 
	ftnlen line_len)
{
    /* System generated locals */
    integer ret_val;
    cilist ci__1;
    alist al__1;

    /* Builtin functions */
    integer f_rew(alist *), s_rsfe(cilist *), do_fio(integer *, char *, 
	    ftnlen), e_rsfe(void), s_cmp(char *, char *, ftnlen, ftnlen);

    /* Local variables */
    logical done;
    extern /* Subroutine */ int chkin_(char *, ftnlen);
    integer chars, linect;
    extern integer lastnb_(char *, ftnlen);
    extern /* Subroutine */ int errfnm_(char *, integer *, ftnlen), sigerr_(
	    char *, ftnlen), chkout_(char *, ftnlen), setmsg_(char *, ftnlen);
    integer iostat;
    extern /* Subroutine */ int errint_(char *, integer *, ftnlen), astrip_(
	    char *, char *, char *, char *, ftnlen, ftnlen, ftnlen, ftnlen);
    extern logical return_(void);

/* $ Abstract */

/*     Count the characters in a group of lines in a text file. */

/* $ Disclaimer */

/*     THIS SOFTWARE AND ANY RELATED MATERIALS WERE CREATED BY THE */
/*     CALIFORNIA INSTITUTE OF TECHNOLOGY (CALTECH) UNDER A U.S. */
/*     GOVERNMENT CONTRACT WITH THE NATIONAL AERONAUTICS AND SPACE */
/*     ADMINISTRATION (NASA). THE SOFTWARE IS TECHNOLOGY AND SOFTWARE */
/*     PUBLICLY AVAILABLE UNDER U.S. EXPORT LAWS AND IS PROVIDED "AS-IS" */
/*     TO THE RECIPIENT WITHOUT WARRANTY OF ANY KIND, INCLUDING ANY */
/*     WARRANTIES OF PERFORMANCE OR MERCHANTABILITY OR FITNESS FOR A */
/*     PARTICULAR USE OR PURPOSE (AS SET FORTH IN UNITED STATES UCC */
/*     SECTIONS 2312-2313) OR FOR ANY PURPOSE WHATSOEVER, FOR THE */
/*     SOFTWARE AND RELATED MATERIALS, HOWEVER USED. */

/*     IN NO EVENT SHALL CALTECH, ITS JET PROPULSION LABORATORY, OR NASA */
/*     BE LIABLE FOR ANY DAMAGES AND/OR COSTS, INCLUDING, BUT NOT */
/*     LIMITED TO, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND, */
/*     INCLUDING ECONOMIC DAMAGE OR INJURY TO PROPERTY AND LOST PROFITS, */
/*     REGARDLESS OF WHETHER CALTECH, JPL, OR NASA BE ADVISED, HAVE */
/*     REASON TO KNOW, OR, IN FACT, SHALL KNOW OF THE POSSIBILITY. */

/*     RECIPIENT BEARS ALL RISK RELATING TO QUALITY AND PERFORMANCE OF */
/*     THE SOFTWARE AND ANY RELATED MATERIALS, AND AGREES TO INDEMNIFY */
/*     CALTECH AND NASA FOR ALL THIRD-PARTY CLAIMS RESULTING FROM THE */
/*     ACTIONS OF RECIPIENT IN THE USE OF THE SOFTWARE. */

/* $ Required_Reading */

/*     None. */

/* $ Keywords */

/*     CHARACTERS */
/*     FILES */

/* $ Declarations */
/* $ Brief_I/O */

/*     Variable  I/O  Description */
/*     --------  ---  -------------------------------------------------- */
/*     UNIT       I   Logical unit connected to text file. */
/*     BLINE      I   Beginning line number. */
/*     ELINE      I   Ending line number. */
/*     LINE      I,O  Workspace. */

/*     COUNTC returns the number of characters. */

/* $ Detailed_Input */

/*     UNIT        is a logical unit that has been connected to a */
/*                 text file by the calling program.  Use the routine */
/*                 TXTOPR to open the file for read access and get its */
/*                 logical unit.  A text file is a formatted, */
/*                 sequential file that contains only printable */
/*                 characters:  ASCII 32-126. */

/*     BLINE, */
/*     ELINE       are line numbers in the text file.  BLINE is */
/*                 the line where the count will begin, and ELINE */
/*                 is the line where the count will end.  The */
/*                 number of characters in the beginning and ending */
/*                 lines are included in the total count. */

/*                 By convention, line 1 is the first line of the file. */

/*     LINE        on input, is an arbitrary character string whose */
/*                 contents are ignored. LINE is used to read lines */
/*                 from the file connected to UNIT; its function */
/*                 is to determine the maximum length of the lines */
/*                 that can be read from the file. Lines longer */
/*                 than the declared length of LINE are truncated */
/*                 as they are read. */

/* $ Detailed_Output */

/*      LINE       on output, is undefined. */

/*     The function, COUNTC,  returns the number of characters in the */
/*     group of lines in the file beginning with BLINE and ending with */
/*     ELINE.  Trailing blanks on a line are not included in the count. */

/* $ Parameters */

/*      None. */

/* $ Exceptions */

/*      1) If an error occurs while reading from the input file, */
/*         the error SPICE(FILEREADFAILED) is signalled. */

/*      2) If a non-printing ASCII character is encountered during */
/*         the count, the error SPICE(INVALIDTEXT) is signalled. */

/*      3) If BLINE is greater than ELINE or if the file does not */
/*         contain both of this lines, the error SPICE(CANNOTFINDGRP) */
/*         is signalled. */

/* $ Files */

/*     See argument UNIT.  COUNTC rewinds the text file connected to */
/*     UNIT and then steps through the file.  The next read statement */
/*     after calling COUNTC would return the line after ELINE. */

/* $ Particulars */

/*     This routine counts characters in a group of lines in a text */
/*     file.  Using COUNTC, you can determine in advance how much space */
/*     is required to store those characters. */

/* $ Examples */

/*     The following code fragment opens an existing text file for */
/*     read access and counts the characters that it contains in */
/*     the first five lines.  We'll assume that the longest line */
/*     in the file is 80 characters. */

/*        INTEGER               COUNTC */
/*        INTEGER               UNIT */
/*        INTEGER               N */
/*        CHARACTER*(80)        LINE */

/*        CALL TXTOPR ( 'DATA.TXT', UNIT ) */

/*        N = COUNTC ( UNIT, 1, 5, LINE ) */

/* $ Restrictions */

/*     None. */

/* $ Literature_References */

/*     None. */

/* $ Author_and_Institution */

/*     J.E. McLean    (JPL) */
/*     H.A. Neilan    (JPL) */

/* $ Version */

/* -    SPICELIB Version 1.1.0, 17-MAY-1994 (HAN) */

/*       Set the default function value to either 0, 0.0D0, .FALSE., */
/*       or blank depending on the type of the function. */

/* -    SPICELIB Version 1.0.1, 10-MAR-1992 (WLT) */

/*        Comment section for permuted index source lines was added */
/*        following the header. */

/* -    SPICELIB Version 1.0.0, 05-APR-1991 (JEM) */

/* -& */
/* $ Index_Entries */

/*     count characters in a text file */

/* -& */

/*     SPICELIB functions */


/*     Local variables */


/*     Standard SPICE error handling. */

    if (return_()) {
	ret_val = 0;
	return ret_val;
    } else {
	chkin_("COUNTC", (ftnlen)6);
	ret_val = 0;
    }

/*     First, see if the line numbers make sense. */

    if (*bline > *eline || *bline <= 0) {
	setmsg_("The line numbers do not make sense:  BLINE = # and  ELINE ="
		" #.", (ftnlen)62);
	errint_("#", bline, (ftnlen)1);
	errint_("#", eline, (ftnlen)1);
	sigerr_("SPICE(CANNOTFINDGRP)", (ftnlen)20);
	chkout_("COUNTC", (ftnlen)6);
	return ret_val;
    }

/*     Read through the file, line by line, beginning with the first */
/*     line in the file, checking for I/O errors, and counting */
/*     characters in the lines between and including BLINE and ELINE. */

    al__1.aerr = 0;
    al__1.aunit = *unit;
    f_rew(&al__1);
    linect = 0;
    chars = 0;
    done = FALSE_;
    while(! done) {
	ci__1.cierr = 1;
	ci__1.ciend = 1;
	ci__1.ciunit = *unit;
	ci__1.cifmt = "(A)";
	iostat = s_rsfe(&ci__1);
	if (iostat != 0) {
	    goto L100001;
	}
	iostat = do_fio(&c__1, line, line_len);
	if (iostat != 0) {
	    goto L100001;
	}
	iostat = e_rsfe();
L100001:

/*        An end-of-file condition is indicated by a negative value */
/*        for IOSTAT. Any other non-zero value indicates some other */
/*        error.  If IOSTAT is zero, the read was successful. */

	if (iostat > 0) {
	    setmsg_("Error reading text file named FILENAME.The value of IOS"
		    "TAT is #.", (ftnlen)64);
	    errint_("#", &iostat, (ftnlen)1);
	    errfnm_("FILENAME", unit, (ftnlen)8);
	    sigerr_("SPICE(FILEREADFAILED)", (ftnlen)21);
	    chkout_("COUNTC", (ftnlen)6);
	    return ret_val;
	} else if (iostat < 0) {
	    setmsg_("Reached end of file unexpectedly at line # in file FILE"
		    ".  BLINE = # and ELINE = #.", (ftnlen)82);
	    errint_("#", &linect, (ftnlen)1);
	    errint_("#", bline, (ftnlen)1);
	    errint_("#", eline, (ftnlen)1);
	    errfnm_("FILE", unit, (ftnlen)4);
	    sigerr_("SPICE(CANNOTFINDGRP)", (ftnlen)20);
	    chkout_("COUNTC", (ftnlen)6);
	    return ret_val;
	} else {

/*           We've read a line successfully, so add it to the line count. */
/*           If this line is in the group delimited by BLINE and ELINE, */
/*           count the characters in it, and if this line is ELINE, we're */
/*           done. */

	    ++linect;
	    if (linect >= *bline && linect <= *eline) {

/*              Add the number of characters in this line to the count. */
/*              If LINE is blank, LASTNB will return 0 which is just */
/*              what we want. */

		chars += lastnb_(line, line_len);

/*              Remove the printable characters from the line.  If */
/*              any characters remain, signal an error. */

		astrip_(line, " ", "~", line, line_len, (ftnlen)1, (ftnlen)1, 
			line_len);
		if (s_cmp(line, " ", line_len, (ftnlen)1) != 0) {
		    setmsg_("Non-printing ASCII characters were found when c"
			    "ounting characters on line number # in file FILE"
			    "NAME.", (ftnlen)100);
		    errint_("#", &linect, (ftnlen)1);
		    errfnm_("FILENAME", unit, (ftnlen)8);
		    sigerr_("SPICE(INVALIDTEXT)", (ftnlen)18);
		    chkout_("COUNTC", (ftnlen)6);
		    return ret_val;
		}
	    }
	    if (linect == *eline) {
		done = TRUE_;
	    }
	}
    }

/*     Assign the final character count. */

    ret_val = chars;
    chkout_("COUNTC", (ftnlen)6);
    return ret_val;
} /* countc_ */
Пример #6
0
/* Subroutine */ int forsav_(doublereal *time, doublereal *deldip, integer *
	ipt, doublereal *fmatrx, doublereal *coord, integer *nvar, doublereal 
	*refh, doublereal *evecs, integer *jstart, doublereal *fconst)
{
    /* System generated locals */
    integer i__1, i__2;
    char ch__1[80];
    olist o__1;
    cllist cl__1;
    alist al__1;

    /* Builtin functions */
    integer f_open(olist *), f_rew(alist *), s_rsue(cilist *), do_uio(integer 
	    *, char *, ftnlen), e_rsue(void), s_wsue(cilist *), e_wsue(void), 
	    f_clos(cllist *), s_wsfe(cilist *), e_wsfe(void);
    /* Subroutine */ int s_stop(char *, ftnlen);

    /* Local variables */
    static integer i__, j, n33, ir, iw;
    extern /* Character */ VOID getnam_(char *, ftnlen, char *, ftnlen);
    static integer linear;

    /* Fortran I/O blocks */
    static cilist io___3 = { 1, 0, 1, 0, 0 };
    static cilist io___5 = { 0, 0, 0, 0, 0 };
    static cilist io___7 = { 1, 0, 1, 0, 0 };
    static cilist io___8 = { 0, 0, 0, 0, 0 };
    static cilist io___11 = { 0, 0, 0, 0, 0 };
    static cilist io___12 = { 0, 0, 0, 0, 0 };
    static cilist io___13 = { 0, 0, 0, 0, 0 };
    static cilist io___14 = { 0, 0, 0, 0, 0 };
    static cilist io___15 = { 0, 0, 0, 0, 0 };
    static cilist io___16 = { 0, 0, 0, 0, 0 };
    static cilist io___17 = { 0, 0, 0, 0, 0 };
    static cilist io___18 = { 0, 0, 0, 0, 0 };
    static cilist io___19 = { 0, 10, 0, 0, 0 };
    static cilist io___20 = { 0, 10, 0, 0, 0 };
    static cilist io___21 = { 0, 6, 0, "(10X,'INSUFFICIENT DATA ON DISK FILE"
	    "S FOR A FORCE ',   'CALCULATION',/10X,'RESTART. PERHAPS THIS STA"
	    "RTED OF AS A ',  'FORCE CALCULATION ')", 0 };
    static cilist io___22 = { 0, 6, 0, "(10X,'BUT THE GEOMETRY HAD TO BE OPT"
	    "IMIZED FIRST, ',   'IN WHICH CASE ',/10X,'REMOVE THE KEY-WORD \""
	    "FORCE\".')", 0 };
    static cilist io___23 = { 0, 6, 0, "(//10X,'NO RESTART FILE EXISTS!')", 0 
	    };


/* COMDECK SIZES */
/* *********************************************************************** */
/*   THIS FILE CONTAINS ALL THE ARRAY SIZES FOR USE IN MOPAC. */

/*     THERE ARE ONLY 5 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) */
/*     ISYBYL = 1 IF MOPAC IS TO BE USED IN THE SYBYL PACKAGE, =0 OTHERWISE */
/*     SEE ALSO NMECI, NPULAY AND MESP AT THE END OF THIS FILE */


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

/*   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 */
/*     MAXALL         LARGER THAN MAXORB OR MAXPAR. */
/* *********************************************************************** */

/* *********************************************************************** */
/* DECK MOPAC */
/* *********************************************************************** */

/*  FORSAV SAVES AND RESTORES DATA USED IN THE FORCE CALCULATION. */

/* ON INPUT TIME = TOTAL TIME ELAPSED SINCE THE START OF THE CALCULATION. */
/*          IPT  = LINE OF FORCE MATRIX REACHED, IF IN WRITE MODE, */
/*               = 0 IF IN READ MODE. */
/*        FMATRX = FORCE MATRIX */
/* *********************************************************************** */
    /* Parameter adjustments */
    --fconst;
    --evecs;
    --coord;
    --fmatrx;
    deldip -= 4;

    /* Function Body */
    o__1.oerr = 0;
    o__1.ounit = 9;
    o__1.ofnmlen = 80;
    getnam_(ch__1, (ftnlen)80, "FOR009", (ftnlen)6);
    o__1.ofnm = ch__1;
    o__1.orl = 0;
    o__1.osta = "UNKNOWN";
    o__1.oacc = 0;
    o__1.ofm = "UNFORMATTED";
    o__1.oblnk = 0;
    f_open(&o__1);
    al__1.aerr = 0;
    al__1.aunit = 9;
    f_rew(&al__1);
    o__1.oerr = 0;
    o__1.ounit = 10;
    o__1.ofnmlen = 80;
    getnam_(ch__1, (ftnlen)80, "FOR010", (ftnlen)6);
    o__1.ofnm = ch__1;
    o__1.orl = 0;
    o__1.osta = "UNKNOWN";
    o__1.oacc = 0;
    o__1.ofm = "UNFORMATTED";
    o__1.oblnk = 0;
    f_open(&o__1);
    al__1.aerr = 0;
    al__1.aunit = 10;
    f_rew(&al__1);
    ir = 9;
    iw = 9;
    if (*ipt == 0) {

/*   READ IN FORCE DATA */

	io___3.ciunit = ir;
	i__1 = s_rsue(&io___3);
	if (i__1 != 0) {
	    goto L20;
	}
	i__1 = do_uio(&c__1, (char *)&(*time), (ftnlen)sizeof(doublereal));
	if (i__1 != 0) {
	    goto L20;
	}
	i__1 = do_uio(&c__1, (char *)&(*ipt), (ftnlen)sizeof(integer));
	if (i__1 != 0) {
	    goto L20;
	}
	i__1 = do_uio(&c__1, (char *)&(*refh), (ftnlen)sizeof(doublereal));
	if (i__1 != 0) {
	    goto L20;
	}
	i__1 = e_rsue();
	if (i__1 != 0) {
	    goto L20;
	}
	linear = *nvar * (*nvar + 1) / 2;
	io___5.ciunit = ir;
	s_rsue(&io___5);
	i__1 = *nvar;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    do_uio(&c__1, (char *)&coord[i__], (ftnlen)sizeof(doublereal));
	}
	e_rsue();
	io___7.ciunit = ir;
	i__1 = s_rsue(&io___7);
	if (i__1 != 0) {
	    goto L10;
	}
	i__2 = linear;
	for (i__ = 1; i__ <= i__2; ++i__) {
	    i__1 = do_uio(&c__1, (char *)&fmatrx[i__], (ftnlen)sizeof(
		    doublereal));
	    if (i__1 != 0) {
		goto L10;
	    }
	}
	i__1 = e_rsue();
	if (i__1 != 0) {
	    goto L10;
	}
	io___8.ciunit = ir;
	s_rsue(&io___8);
	i__1 = *ipt;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    for (j = 1; j <= 3; ++j) {
		do_uio(&c__1, (char *)&deldip[j + i__ * 3], (ftnlen)sizeof(
			doublereal));
	    }
	}
	e_rsue();
	n33 = *nvar * *nvar;
	io___11.ciunit = ir;
	s_rsue(&io___11);
	i__1 = n33;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    do_uio(&c__1, (char *)&evecs[i__], (ftnlen)sizeof(doublereal));
	}
	e_rsue();
	io___12.ciunit = ir;
	s_rsue(&io___12);
	do_uio(&c__1, (char *)&(*jstart), (ftnlen)sizeof(integer));
	i__1 = *nvar;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    do_uio(&c__1, (char *)&fconst[i__], (ftnlen)sizeof(doublereal));
	}
	e_rsue();
	return 0;
    } else {

/*    WRITE FORCE DATA */

	al__1.aerr = 0;
	al__1.aunit = iw;
	f_rew(&al__1);
	if (*time > 1e6) {
	    *time += -1e6;
	}
	io___13.ciunit = iw;
	s_wsue(&io___13);
	do_uio(&c__1, (char *)&(*time), (ftnlen)sizeof(doublereal));
	do_uio(&c__1, (char *)&(*ipt), (ftnlen)sizeof(integer));
	do_uio(&c__1, (char *)&(*refh), (ftnlen)sizeof(doublereal));
	e_wsue();
	linear = *nvar * (*nvar + 1) / 2;
	io___14.ciunit = iw;
	s_wsue(&io___14);
	i__1 = *nvar;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    do_uio(&c__1, (char *)&coord[i__], (ftnlen)sizeof(doublereal));
	}
	e_wsue();
	io___15.ciunit = iw;
	s_wsue(&io___15);
	i__1 = linear;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    do_uio(&c__1, (char *)&fmatrx[i__], (ftnlen)sizeof(doublereal));
	}
	e_wsue();
	io___16.ciunit = iw;
	s_wsue(&io___16);
	i__1 = *ipt;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    for (j = 1; j <= 3; ++j) {
		do_uio(&c__1, (char *)&deldip[j + i__ * 3], (ftnlen)sizeof(
			doublereal));
	    }
	}
	e_wsue();
	n33 = *nvar * *nvar;
	io___17.ciunit = ir;
	s_wsue(&io___17);
	i__1 = n33;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    do_uio(&c__1, (char *)&evecs[i__], (ftnlen)sizeof(doublereal));
	}
	e_wsue();
	io___18.ciunit = ir;
	s_wsue(&io___18);
	do_uio(&c__1, (char *)&(*jstart), (ftnlen)sizeof(integer));
	i__1 = *nvar;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    do_uio(&c__1, (char *)&fconst[i__], (ftnlen)sizeof(doublereal));
	}
	e_wsue();
	linear = molkst_1.norbs * (molkst_1.norbs + 1) / 2;
	s_wsue(&io___19);
	i__1 = linear;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    do_uio(&c__1, (char *)&densty_1.pa[i__ - 1], (ftnlen)sizeof(
		    doublereal));
	}
	e_wsue();
	if (molkst_1.nalpha != 0) {
	    s_wsue(&io___20);
	    i__1 = linear;
	    for (i__ = 1; i__ <= i__1; ++i__) {
		do_uio(&c__1, (char *)&densty_1.pb[i__ - 1], (ftnlen)sizeof(
			doublereal));
	    }
	    e_wsue();
	}
	cl__1.cerr = 0;
	cl__1.cunit = 9;
	cl__1.csta = 0;
	f_clos(&cl__1);
	cl__1.cerr = 0;
	cl__1.cunit = 10;
	cl__1.csta = 0;
	f_clos(&cl__1);
    }
    return 0;
L10:
    s_wsfe(&io___21);
    e_wsfe();
    s_wsfe(&io___22);
    e_wsfe();
    s_stop("", (ftnlen)0);
L20:
    s_wsfe(&io___23);
    e_wsfe();
    s_stop("", (ftnlen)0);
    return 0;
} /* forsav_ */
Пример #7
0
/* ----------------------------------------------------------------------- */
/* Main program */ int MAIN__(void)
{
    /* System generated locals */
    address a__1[7];
    integer i__1, i__2[7], i__3, i__4;
    alist al__1;

    /* Builtin functions */
    /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen);
    integer s_rsfe(cilist *), do_fio(integer *, char *, ftnlen), e_rsfe(void),
	     s_wsle(cilist *), do_lio(integer *, integer *, char *, ftnlen), 
	    e_wsle(void);
    /* Subroutine */ int s_stop(char *, ftnlen);
    integer f_rew(alist *), s_wsfe(cilist *), e_wsfe(void), s_wsfi(icilist *),
	     e_wsfi(void);
    /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen);
    integer s_cmp(char *, char *, ftnlen, ftnlen);

    /* Local variables */
    static integer i__, l, m, ld;
    static char cmd[4];
    static integer irc;
    static real data[6];
    static integer leng;
    static char line[72];
    static integer nred, nmem, ipos, kpos, iout;
    static char type__[1];
    static real work[300000];
    static integer ldata;
    static char aleng[6];
    extern /* Subroutine */ int pdsin_(char *, char *, real *, integer *, 
	    integer *, integer *, ftnlen, ftnlen);
    static integer iomls, iotxt;
    extern /* Subroutine */ int setli1_(char *, integer *, real *, integer *, 
	    ftnlen), setli2_(char *, integer *, real *, integer *, ftnlen), 
	    setli3_(char *, integer *, real *, integer *, ftnlen);
    static char member[8], dirnam[72], memnam[8*4000];
    extern /* Subroutine */ int setlin_(char *, integer *, real *, ftnlen), 
	    memlst_(integer *, integer *, char *, ftnlen), uioset_(void), 
	    txtlin_(integer *, integer *);

    /* Fortran I/O blocks */
    static cilist io___7 = { 0, 5, 0, "(A72)", 0 };
    static cilist io___9 = { 0, 6, 0, 0, 0 };
    static cilist io___10 = { 0, 6, 0, 0, 0 };
    static cilist io___11 = { 0, 6, 0, 0, 0 };
    static cilist io___13 = { 0, 0, 0, "(A72)", 0 };
    static cilist io___16 = { 0, 6, 0, 0, 0 };
    static cilist io___22 = { 0, 6, 0, 0, 0 };
    static cilist io___23 = { 0, 6, 0, 0, 0 };
    static cilist io___24 = { 0, 6, 0, 0, 0 };
    static icilist io___26 = { 0, aleng, 0, "(I6)", 6, 1 };
    static cilist io___27 = { 0, 0, 0, "(A72)", 0 };
    static cilist io___35 = { 0, 0, 0, "(A72)", 0 };
    static cilist io___36 = { 0, 0, 0, "(A72)", 0 };
    static cilist io___37 = { 0, 0, 0, 0, 0 };
    static cilist io___38 = { 0, 0, 0, 0, 0 };
    static cilist io___39 = { 0, 0, 0, 0, 0 };



/* ----- IO DEVICE */
/*     IOTXT : TEXT PDS (WRITE) */
/*     IOMLS : MEMBER LIST (READ) */
/*      IOUT : STANDARD OUTPUT (WRITE) */
/*       49  : DEVICE FOR PDS MEMBER, INTERNALLY OPENED AND CLOSED (READ) */
/*        5  : STANDARD INPUT FOR DIRECTORY NAME OF PDS FILE */

    uioset_();
    iotxt = 10;
    iomls = 11;
    iout = 6;

    nred = 0;
    s_copy(cmd, "*PUT", (ftnlen)4, (ftnlen)4);
    *(unsigned char *)type__ = 'N';
/* ******************** */
/*  READ INPUT DATA  * */
/* ******************** */
/*     DIRNAM : FULL NAME OF DIRECTORY FOR PDS */
/*     EX:/DG05/UFS02/J9347/SRAC95/LIB/PDS/PFAST/PFASTJ2 */
    s_rsfe(&io___7);
    do_fio(&c__1, dirnam, (ftnlen)72);
    e_rsfe();
    if (*(unsigned char *)dirnam == ' ') {
	s_wsle(&io___9);
	do_lio(&c__9, &c__1, " ERROR(MAIN) : DIRECTORY NAME IS INVALID", (
		ftnlen)40);
	e_wsle();
	s_wsle(&io___10);
	do_lio(&c__9, &c__1, " THE FIRST COLUMN SHOULD BE NON-BLANK", (ftnlen)
		37);
	e_wsle();
	s_wsle(&io___11);
	do_lio(&c__9, &c__1, " DIRNAM = ", (ftnlen)10);
	do_lio(&c__9, &c__1, dirnam, (ftnlen)72);
	e_wsle();
	s_stop("", (ftnlen)0);
    }
/* ************************ */
/*  WRITE HEADER IN TEXT * */
/* ************************ */
    al__1.aerr = 0;
    al__1.aunit = iotxt;
    f_rew(&al__1);
    s_copy(line, "  3        PDSEDT INPUT R/W MODE  ", (ftnlen)72, (ftnlen)34)
	    ;
    io___13.ciunit = iotxt;
    s_wsfe(&io___13);
    do_fio(&c__1, line, (ftnlen)72);
    e_wsfe();
/* ******************** */
/*  READ MEMBER LIST * */
/* ******************** */
    memlst_(&iomls, &nmem, memnam, (ftnlen)8);
    if (nmem > 4000) {
	s_wsle(&io___16);
	do_lio(&c__9, &c__1, " ERROR (MAIN) : MAX OF MEMBER(MAXME=", (ftnlen)
		36);
	do_lio(&c__3, &c__1, (char *)&c__4000, (ftnlen)sizeof(integer));
	do_lio(&c__9, &c__1, ") IS LESS THAN REQUIRED SIZE(=", (ftnlen)30);
	do_lio(&c__3, &c__1, (char *)&nmem, (ftnlen)sizeof(integer));
	e_wsle();
	s_stop("", (ftnlen)0);
    }
/* ******************** */
/*  LOOP ON MEMBER   * */
/* ******************** */
    i__1 = nmem;
    for (m = 1; m <= i__1; ++m) {
	s_copy(member, memnam + (m - 1 << 3), (ftnlen)8, (ftnlen)8);
	setdt_1.ntnuc1 = 0;
	setdt_1.ntnuc2 = 0;
	setdt_1.nzon2 = 0;
	setdt_1.nzon3 = 0;
/* *************************** */
/*  READ CONTENTS OF MEMBER * */
/* *************************** */
	pdsin_(dirnam, member, work, &leng, &irc, &iout, (ftnlen)72, (ftnlen)
		8);
	if (irc != 0) {
	    s_wsle(&io___22);
	    do_lio(&c__9, &c__1, " PDS ERROR : ERROR CODE = ", (ftnlen)26);
	    do_lio(&c__3, &c__1, (char *)&irc, (ftnlen)sizeof(integer));
	    e_wsle();
	    s_wsle(&io___23);
	    do_lio(&c__9, &c__1, " MEMBER = ", (ftnlen)10);
	    do_lio(&c__9, &c__1, member, (ftnlen)8);
	    e_wsle();
	    s_stop("", (ftnlen)0);
	} else {
	    ++nred;
	}
	if (leng > 300000) {
	    s_wsle(&io___24);
	    do_lio(&c__9, &c__1, " ERROR (MAIN) : WORK AREA(MAXWK=", (ftnlen)
		    32);
	    do_lio(&c__3, &c__1, (char *)&c_b48, (ftnlen)sizeof(integer));
	    do_lio(&c__9, &c__1, ") IS LESS THAN REQUIRED SIZE(=", (ftnlen)30)
		    ;
	    do_lio(&c__3, &c__1, (char *)&leng, (ftnlen)sizeof(integer));
	    do_lio(&c__9, &c__1, " IN MEMBER:", (ftnlen)11);
	    do_lio(&c__9, &c__1, member, (ftnlen)8);
	    e_wsle();
	    s_stop("", (ftnlen)0);
	}
/* ***************** */
/*  WRITE IN TEXT * */
/* ***************** */
/* ----- WRITE MEMBER NAME AND LENGTH */
	s_wsfi(&io___26);
	do_fio(&c__1, (char *)&leng, (ftnlen)sizeof(integer));
	e_wsfi();
/* Writing concatenation */
	i__2[0] = 4, a__1[0] = cmd;
	i__2[1] = 1, a__1[1] = " ";
	i__2[2] = 8, a__1[2] = member;
	i__2[3] = 1, a__1[3] = " ";
	i__2[4] = 1, a__1[4] = type__;
	i__2[5] = 1, a__1[5] = " ";
	i__2[6] = 6, a__1[6] = aleng;
	s_cat(line, a__1, i__2, &c__7, (ftnlen)72);
	io___27.ciunit = iotxt;
	s_wsfe(&io___27);
	do_fio(&c__1, line, (ftnlen)72);
	e_wsfe();
/* ----- SET NUMBER OF LINES TO WRITE IN TEXT FOR DATA OF A MEMBER */
	txtlin_(&leng, &ldata);
/* ----- SET LINE DATA AND WRITE IN TEXT */
	i__3 = ldata;
	for (l = 1; l <= i__3; ++l) {
	    kpos = (l - 1) * 6 + 1;
	    if (l != ldata) {
		ld = 6;
	    } else {
		ld = leng - (ldata - 1) * 6;
	    }
	    i__4 = ld;
	    for (i__ = 1; i__ <= i__4; ++i__) {
		ipos = (l - 1) * 6 + i__;
		data[i__ - 1] = work[ipos - 1];
/* L110: */
	    }
	    if (s_cmp(member + 4, "DN", (ftnlen)2, (ftnlen)2) == 0 && *(
		    unsigned char *)&member[7] == 'T') {
		setli1_(line, &ld, data, &kpos, (ftnlen)72);
	    } else if (s_cmp(member + 4, "BNUP", (ftnlen)4, (ftnlen)4) == 0) {
		setli2_(line, &ld, data, &kpos, (ftnlen)72);
	    } else if (s_cmp(member + 4, "REST", (ftnlen)4, (ftnlen)4) == 0) {
		setli3_(line, &ld, data, &kpos, (ftnlen)72);
	    } else {
		setlin_(line, &ld, data, (ftnlen)72);
	    }
	    io___35.ciunit = iotxt;
	    s_wsfe(&io___35);
	    do_fio(&c__1, line, (ftnlen)72);
	    e_wsfe();
/* L100: */
	}

/* L1000: */
    }
/* *********** */
/*  FINISH  * */
/* *********** */
    s_copy(line, "*FIN", (ftnlen)72, (ftnlen)4);
    io___36.ciunit = iotxt;
    s_wsfe(&io___36);
    do_fio(&c__1, line, (ftnlen)72);
    e_wsfe();
    io___37.ciunit = iout;
    s_wsle(&io___37);
    e_wsle();
    io___38.ciunit = iout;
    s_wsle(&io___38);
    do_lio(&c__9, &c__1, " NUMBER OF MEMBERS READ FROM PDS=", (ftnlen)33);
    do_lio(&c__3, &c__1, (char *)&nred, (ftnlen)sizeof(integer));
    e_wsle();
    io___39.ciunit = iout;
    s_wsle(&io___39);
    do_lio(&c__9, &c__1, " ********** JOB END **********", (ftnlen)30);
    e_wsle();
    s_stop("", (ftnlen)0);
    return 0;
} /* MAIN__ */