File: deri21.c

package info (click to toggle)
ghemical 0.82-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 9,448 kB
  • ctags: 18,571
  • sloc: ansic: 68,828; cpp: 51,774; fortran: 35,324; sh: 2,505; makefile: 475; perl: 70
file content (109 lines) | stat: -rw-r--r-- 3,065 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* deri21.f -- translated by f2c (version 19991025).
   You must link the resulting object file with the libraries:
	-lf2c -lm   (in that order)
*/

#include "f2c.h"

/* Subroutine */ int deri21_(a, nvar, minear, nfirst, vnert, pnert, b, ncut)
doublereal *a;
integer *nvar, *minear, *nfirst;
doublereal *vnert, *pnert, *b;
integer *ncut;
{
    /* System generated locals */
    integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2;

    /* Builtin functions */
    double sqrt();

    /* Local variables */
    static doublereal work[4];
    static integer i__, j, l;
    extern /* Subroutine */ int hqrii_(), mtxmc_();
    static doublereal cutoff;
    extern /* Subroutine */ int mxm_();
    static doublereal sum, sum2;

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

/*     LEAST-SQUARE ANALYSIS OF A SET OF NVAR POINTS {A} : */

/*     PRODUCE A SUBSET OF NCUT ORTHONORMALIZED VECTORS B, OPTIMUM IN A */
/*     LEAST-SQUARE SENSE WITH RESPECT TO THE INITIAL SPACE {A}. */
/*     EACH NEW HIERARCHIZED VECTOR B EXTRACTS A MAXIMUM PERCENTAGE FROM */
/*     THE REMAINING DISPERSION OF THE SET {A} OUT OF THE PREVIOUS */
/*     {B} SUBSPACE. */
/*   INPUT */
/*     A(MINEAR,NVAR): ORIGINAL SET {A}. */
/*     NFIRST        : MAXIMUM ALLOWED SIZE OF THE BASIS B. */
/*   OUTPUT */
/*     VNERT(NVAR)   : LOWEST EIGENVECTOR OF A'* A. */
/*     PNERT(NVAR)     : SQUARE ROOT OF THE ASSOCIATED EIGENVALUES */
/*                     IN DECREASING ORDER. */
/*     B(MINEAR,NCUT): OPTIMUM ORTHONORMALIZED SUBSET {B}. */

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

/*     VNERT = A' * A */
    /* Parameter adjustments */
    --pnert;
    --vnert;
    b_dim1 = *minear;
    b_offset = 1 + b_dim1 * 1;
    b -= b_offset;
    a_dim1 = *minear;
    a_offset = 1 + a_dim1 * 1;
    a -= a_offset;

    /* Function Body */
    cutoff = .85;
    sum2 = 0.;
    mtxmc_(&a[a_offset], nvar, &a[a_offset], minear, work);
    i__1 = *nvar * (*nvar + 1) / 2;
    for (i__ = 1; i__ <= i__1; ++i__) {
/* L10: */
	work[i__ - 1] = -work[i__ - 1];
    }
/*     DIAGONALIZE IN DECREASING ORDER OF EIGENVALUES */
    if (abs(work[0]) < 1e-28 && *nvar == 1) {
	pnert[1] = sqrt(-work[0]);
	work[0] = 1e15;
	vnert[1] = 1.;
	*ncut = 1;
	goto L50;
    } else {
	hqrii_(work, nvar, nvar, &pnert[1], &vnert[1]);
/*     FIND NCUT ACCORDING TO CUTOFF, BUILD WORK = VNERT * (PNERT)**-0.5 */
	sum = 0.;
	i__1 = *nvar;
	for (i__ = 1; i__ <= i__1; ++i__) {
/* L20: */
	    sum -= pnert[i__];
	}
	l = 1;
	i__1 = *nfirst;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    sum2 -= pnert[i__] / sum;
	    pnert[i__] = sqrt(-pnert[i__]);
	    i__2 = *nvar;
	    for (j = 1; j <= i__2; ++j) {
		work[l - 1] = vnert[l] / pnert[i__];
/* L30: */
		++l;
	    }
	    if (sum2 >= cutoff) {
		*ncut = i__;
		goto L50;
	    }
/* L40: */
	}
	*ncut = *nfirst;
/*     ORTHONORMALIZED BASIS */
/*     B(MINEAR,NCUT) = A(MINEAR,NVAR)*WORK(NVAR,NCUT) */
    }
L50:
    mxm_(&a[a_offset], minear, work, nvar, &b[b_offset], ncut);
    return 0;
} /* deri21_ */