1 /****************************************************************
2 Copyright (C) 1997, 1999-2001 Lucent Technologies
3 All Rights Reserved
4 
5 Permission to use, copy, modify, and distribute this software and
6 its documentation for any purpose and without fee is hereby
7 granted, provided that the above copyright notice appear in all
8 copies and that both that the copyright notice and this
9 permission notice and warranty disclaimer appear in supporting
10 documentation, and that the name of Lucent or any of its entities
11 not be used in advertising or publicity pertaining to
12 distribution of the software without specific, written prior
13 permission.
14 
15 LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
17 IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
18 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
20 IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
22 THIS SOFTWARE.
23 ****************************************************************/
24 
25 #include "jac2dim.h"
26 
27  static void
28 #ifdef KR_headers
INchk(asl,who,i,ix)29 INchk(asl, who, i, ix) ASL *asl; char *who; int i, ix;
30 #else
31 INchk(ASL *asl, char *who, int i, int ix)
32 #endif
33 {
34 	ASL_CHECK(asl, ASL_read_fgh, who);
35 	if (i < 0 || i >= ix) {
36 		fprintf(Stderr, "%s: got I = %d; expected 0 <= I < %d\n",
37 			who, i, ix);
38 		exit(1);
39 		}
40 	}
41 
42  static real
43 #ifdef KR_headers
c2ival(asl,i,X,nerror)44 c2ival(asl, i, X, nerror) ASL_fgh *asl; int i; fint *nerror; real *X;
45 #else
46 c2ival(ASL_fgh *asl, int i, real *X, fint *nerror)
47 #endif
48 {
49 	Jmp_buf err_jmp0;
50 	expr *e;
51 	int ij;
52 	real f;
53 
54 	if (nerror && *nerror >= 0) {
55 		err_jmp = &err_jmp0;
56 		ij = setjmp(err_jmp0.jb);
57 		if (*nerror = ij)
58 			return 0.;
59 		}
60 	want_deriv = want_derivs;
61 	errno = 0;	/* in case f77 set errno opening files */
62 	if (!asl->i.x_known)
63 		x2_check_ASL(asl,X);
64 	if (!asl->i.ncxval)
65 		asl->i.ncxval = (int*)M1zapalloc(nclcon*sizeof(int));
66 	if (!(x0kind & ASL_have_concom)) {
67 		if (comb < combc)
68 			comeval(asl, comb, combc);
69 		if (comc1)
70 			com1eval(asl, 0, comc1);
71 		x0kind |= ASL_have_concom;
72 		}
73 	asl->i.ncxval[i] = asl->i.nxval;
74 	co_index = i;
75 	e = con_de[i].e;
76 	f = (*e->op)(e C_ASL);
77 	err_jmp = 0;
78 	return f;
79 	}
80 
81  real
82 #ifdef KR_headers
con2ival_ASL(a,i,X,nerror)83 con2ival_ASL(a, i, X, nerror) ASL *a; int i; fint *nerror; real *X;
84 #else
85 con2ival_ASL(ASL *a, int i, real *X, fint *nerror)
86 #endif
87 {
88 	ASL_fgh *asl;
89 	cgrad *gr, **gr0;
90 	expr_v *V;
91 	real f;
92 
93 	INchk(a, "con2ival", i, a->i.n_con_);
94 	f = c2ival(asl = (ASL_fgh*)a, i, X, nerror);
95 	gr0 = Cgrad + i;
96 	gr = *gr0;
97 	if (asl->i.vscale)
98 		for(V = var_e; gr; gr = gr->next)
99 			f += gr->coef * V[gr->varno].v;
100 	else
101 		for(; gr; gr = gr->next)
102 			f += gr->coef * X[gr->varno];
103 	if (asl->i.cscale)
104 		f *= asl->i.cscale[i];
105 	return f;
106 	}
107 
108  int
109 #ifdef KR_headers
lcon2val_ASL(a,i,X,nerror)110 lcon2val_ASL(a, i, X, nerror) ASL *a; int i; fint *nerror; real *X;
111 #else
112 lcon2val_ASL(ASL *a, int i, real *X, fint *nerror)
113 #endif
114 {
115 	real f;
116 
117 	INchk(a, "lcon2val", i, a->i.n_lcon_);
118 	f = c2ival((ASL_fgh*)a, i + a->i.n_con0, X, nerror);
119 	return f != 0.;
120 	}
121 
122  void
123 #ifdef KR_headers
con2grd_ASL(a,i,X,G,nerror)124 con2grd_ASL(a, i, X, G, nerror)
125 	ASL *a; int i; fint *nerror; real *X, *G;
126 #else
127 con2grd_ASL(ASL *a, int i, real *X, real *G, fint *nerror)
128 #endif
129 {
130 	cde *d;
131 	cgrad *gr, **gr0;
132 	real *Adjoints, *vscale;
133 	Jmp_buf err_jmp0;
134 	int i0, ij, L, xksave;
135 	ASL_fgh *asl;
136 	real scale;
137 	static char who[] = "con2grd";
138 
139 	INchk(a, who, i, a->i.n_con_);
140 	asl = (ASL_fgh*)a;
141 	if (!want_derivs)
142 		No_derivs_ASL(who);
143 	if (nerror && *nerror >= 0) {
144 		err_jmp = &err_jmp0;
145 		ij = setjmp(err_jmp0.jb);
146 		if (*nerror = ij)
147 			return;
148 		}
149 	errno = 0;	/* in case f77 set errno opening files */
150 	if (!asl->i.x_known)
151 		x2_check_ASL(asl,X);
152 	if ((!asl->i.ncxval || asl->i.ncxval[i] != asl->i.nxval)
153 	 && (!(x0kind & ASL_have_conval)
154 	     || i < n_conjac[0] || i >= n_conjac[1])) {
155 		xksave = asl->i.x_known;
156 		asl->i.x_known = 1;
157 		con2ival_ASL(a,i,X,nerror);
158 		asl->i.x_known = xksave;
159 		if (nerror && *nerror)
160 			return;
161 		}
162 	if (!(x0kind & ASL_have_funnel)) {
163 		if (f_b)
164 			funnelset(asl, f_b);
165 		if (f_c)
166 			funnelset(asl, f_c);
167 		x0kind |= ASL_have_funnel;
168 		}
169 	Adjoints = adjoints;
170 	d = con_de + i;
171 	gr0 = Cgrad + i;
172 	scale = asl->i.cscale ? asl->i.cscale[i] : 1.;
173 	for(gr = *gr0; gr; gr = gr->next)
174 		Adjoints[gr->varno] = gr->coef;
175 	if (L = d->zaplen) {
176 		memset(adjoints_nv1, 0, L);
177 		derprop(d->d);
178 		}
179 	if (vscale = asl->i.vscale)
180 		for(gr = *gr0; gr; gr = gr->next) {
181 			L = gr->varno;
182 			Adjoints[L] *= vscale[L];
183 			}
184 	gr = *gr0;
185 	i0 = 0;
186 	switch(asl->i.congrd_mode) {
187 	  case 1:
188 		for(; gr; gr = gr->next)
189 			G[i0++] = scale * Adjoints[gr->varno];
190 		break;
191 	  case 2:
192 		for(; gr; gr = gr->next)
193 			G[gr->goff] = scale * Adjoints[gr->varno];
194 		break;
195 	  default:
196 		for(; gr; gr = gr->next) {
197 			i = gr->varno;
198 			while(i0 < i)
199 				G[i0++] = 0;
200 			G[i] = scale * Adjoints[i];
201 			i0 = i + 1;
202 			}
203 		i = n_var;
204 		while(i0 < i)
205 			G[i0++] = 0;
206 	  }
207 	err_jmp = 0;
208 	}
209