malt-wr
points.c
Go to the documentation of this file.
1 #include <math.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5 
6 #include "constype.h"
7 #include "filenames.h"
8 
9 #include "qnrutil.h"
10 
11 int dim, var = 0, *yield, pin = 0, *xyz;
12 int pntcount = 0;
13 
15 char (*names)[NAME_LENGTH];
16 
18 
19 
20 static int skip_arg(char * line, int arg_num)
21 {
22  int i=0, k;
23  int line_length = strlen(line);
24 
25  for(k=0; k<arg_num; k++)
26  {
27  while(isspace(line[i]) && (i<line_length))
28  i++;
29  while(!isspace(line[i]) && (i<line_length))
30  i++;
31  }
32 
33  while(isspace(line[i]) && (i<line_length))
34  i++;
35 
36  return i;
37 }
38 
39 
40 int addpoint(double *pc,double *po)
41 {
42  FILE *fp;
43  double dum, dist=0.0, inveffcenter;
44  int x, concave;
45  char errmsg[LINE_LENGTH];
46  char system_call[LINE_LENGTH];
47 
48  if ((fp=fopen(LIMITS_FILE,"w")) == NULL) {
49  strcpy(errmsg, "Can't write to the '");
50  strcat(errmsg, LIMITS_FILE);
51  strcat(errmsg, "' file.\n");
52  nrerror(errmsg);
53  }
54 /* load zeroeth element with unscaled value for accuracy */
55  for (x=1; dim >= x; ++x)
56  dist += (pc[x]-po[x])*(pc[x]-po[x])*scale[x]*scale[x];
57  dist = sqrt(dist);
58 
59  inveffcenter = fabs(pc[1]-po[1])/(dist*centerpnt[1]);
60  for (x=2; dim >= x; ++x)
61  if((dum = fabs(pc[x]-po[x])/(dist*centerpnt[x])) > inveffcenter)
62  inveffcenter = dum;
63 /* in 1-D, X=(pc[]-po[])/centerpnt[ ] */
64 /* in 2-D, pick effcenter such that above holds for each dimension */
65  fprintf(fp,"pc[0]=0\npo[0]=%f\n",dist*inveffcenter);
66 /* pc on plane, po on the boundary */
67 /* unscale it */
68  for (x=1; dim >= x; ++x) {
69  fprintf(fp, "pc[%i]=%f\n", x, pc[x]*scale[x]);
70  fprintf(fp, "po[%i]=%f\n", x, po[x]*scale[x]);
71  }
72 /* print the circuit and circnumber names */
73  fprintf(fp, "set circuit = '%s'\n", param.circuit_name);
74  fprintf(fp, "set opt_num = '%s'\n", param.opt_num);
75  fclose(fp);
76 
77  strcpy(system_call, param.spice_name);
78  strcat(system_call, BOUNDARY_CALL);
79  system(system_call);
80 
81  if ((fp=fopen(POINT_FILE,"r")) == NULL) {
82  strcpy(errmsg, "Can't read the '");
83  strcat(errmsg, POINT_FILE);
84  strcat(errmsg, "' file.\n");
85  nrerror(errmsg);
86  }
87  fscanf(fp, "%d", &concave);
88 
89 /* read in and scale the new point */
90  if (!concave) {
91  ++pntcount;
92 
93  /* throw away the zeroeth array element */
94  fscanf(fp, "%lf",&dum);
95  for (x=1; dim >= x; ++x) {
96  fscanf(fp, "%lf", *(hullpnts+pntcount)+x);
97  hullpnts[pntcount][x] /= scale[x];
98  }
99 
100  for (x=0; dim >= x; ++x)
101  fscanf(fp, "%lf", &delta[x]);
102  }
103 
104  fclose(fp);
105  return(!concave);
106 }
107 
108 static int read_long_line(FILE *fp, char* line, int *line_no)
109 {
110  if(fgets(line, LONG_LINE_LENGTH, fp)!=NULL)
111  {
112  (*line_no)++;
113  return 1;
114  }
115  else
116  return 0;
117 }
118 
119 
120 static void error_in_line(char* filename, int line_num, char*line)
121 {
122  printf("ERROR IN FILE %s LINE: %d\n%s\n", filename, line_num, line);
123  exit(255);
124 }
125 
126 
127 static void unexpctd_eof(char* filename)
128 {
129  printf("UNEXPECTED END OF FILE: %s\n", filename);
130  exit(255);
131 }
132 
133 
134 static int blank_line(char *line)
135 {
136  int i=0, n=strlen(line);
137 
138  while(i<n)
139  {
140  if(!isspace(line[i++]))
141  return 0;
142  }
143  return 1;
144 }
145 
147 {
148  PARAMETER_SET *tmp;
149  static PARAMETER_SET *end_of_list;
150 
151  if(parameter_list==NULL)
152  end_of_list=parameter_list=new;
153  else {
154  end_of_list->next=new;
155  end_of_list=new;
156  }
157 }
158 
159 void readinit(void)
160 {
161  FILE *fp;
162  char filename[LINE_LENGTH];
163  int x,k,temp;
164  char in_buffer[LONG_LINE_LENGTH],errmssg[LINE_LENGTH+30];
165  int line_num=0;
166 
167 /* string out the input file name */
168  strcpy(filename, param.input_dir);
169  strcat(filename, param.circuit_name);
170  strcat(filename, param.init_ext);
171  strcat(filename, param.opt_num);
172 
173 /* string out the error message */
174  strcpy(errmssg, "Can't read the '");
175  strcat(errmssg, filename);
176  strcat(errmssg, "'file.\n");
177 
178 /* read init file */
179  if ((fp=fopen(filename, "r")) == NULL)
180  nrerror(errmssg);
181 
182  do {
183  if(!read_long_line(fp, in_buffer, &line_num))
184  unexpctd_eof(filename);
185  } while(in_buffer[0]=='*');
186  if(sscanf(in_buffer, "%d", &dim)!=1)
187  error_in_line(filename, line_num, in_buffer);
188 
189 /* initialize */
190  startpnt = vector(1,dim);
191  centerpnt = vector(1,dim);
192  lower = vector(1,dim);
193  upper = vector(1,dim);
194  scale = vector(1,dim);
195  yield = ivector(1,dim);
196  names = (char(*)[NAME_LENGTH])calloc(dim, NAME_LENGTH);
197  delta = (double *)calloc(dim+1, sizeof(double));
198 
199 /* read some more */
200 
201  /* parameter names */
202  do {
203  if(!read_long_line(fp, in_buffer, &line_num))
204  unexpctd_eof(filename);
205  } while((in_buffer[0]=='*') || blank_line(in_buffer));
206  k=0;
207  for (x=0; dim > x; ++x) {
208  if(sscanf(&in_buffer[k], "%s", names[x])!=1)
209  error_in_line(filename, line_num, in_buffer);
210  k+=skip_arg(&in_buffer[k], 1);
211  }
212 
213  /* nominal values */
214  do {
215  if(!read_long_line(fp, in_buffer, &line_num))
216  unexpctd_eof(filename);
217  } while((in_buffer[0]=='*') || blank_line(in_buffer));
218  k=0;
219  for (x=1; dim >= x; ++x) {
220  if(sscanf(&in_buffer[k], "%lf", centerpnt+x)!=1)
221  error_in_line(filename, line_num, in_buffer);
222  k+=skip_arg(&in_buffer[k], 1);
223  }
224 
225  /* minimum parameter search values */
226  do {
227  if(!read_long_line(fp, in_buffer, &line_num))
228  unexpctd_eof(filename);
229  } while((in_buffer[0]=='*') || blank_line(in_buffer));
230  k=0;
231  for (x=1; dim >= x; ++x) {
232  if(sscanf(&in_buffer[k], "%lf", lower+x)!=1)
233  error_in_line(filename, line_num, in_buffer);
234  k+=skip_arg(&in_buffer[k], 1);
235  }
236 
237  /* maximum parameter search values */
238  do {
239  if(!read_long_line(fp, in_buffer, &line_num))
240  unexpctd_eof(filename);
241  } while((in_buffer[0]=='*') || blank_line(in_buffer));
242  k=0;
243  for (x=1; dim >= x; ++x) {
244  if(sscanf(&in_buffer[k], "%lf", upper+x)!=1)
245  error_in_line(filename, line_num, in_buffer);
246  k+=skip_arg(&in_buffer[k], 1);
247  }
248 
249  if(param.program == OPT_PROGRAM) {
250  /* percent variations */
251  do {
252  if(!read_long_line(fp, in_buffer, &line_num))
253  unexpctd_eof(filename);
254  } while((in_buffer[0]=='*') || blank_line(in_buffer));
255  k=0;
256  for (x=1; dim >= x; ++x) {
257  if(sscanf(&in_buffer[k], "%lf", scale+x)!=1)
258  error_in_line(filename, line_num, in_buffer);
259  k+=skip_arg(&in_buffer[k], 1);
260  }
261 
262  /* yield */
263  do {
264  if(!read_long_line(fp, in_buffer, &line_num))
265  unexpctd_eof(filename);
266  } while((in_buffer[0]=='*') || blank_line(in_buffer));
267  k=0;
268  for (x=1; dim >= x; ++x) {
269  if(sscanf(&in_buffer[k], "%d", yield+x)!=1)
270  error_in_line(filename, line_num, in_buffer);
271  k+=skip_arg(&in_buffer[k], 1);
272 
273  if (yield[x]) ++var;
274  }
275 
276  /* static */
277  do {
278  if(!read_long_line(fp, in_buffer, &line_num))
279  unexpctd_eof(filename);
280  } while(in_buffer[0]=='*');
281  k=0;
282  for (x=1; dim >= x; ++x) {
283  if(sscanf(&in_buffer[k], "%d", &temp)!=1)
284  error_in_line(filename, line_num, in_buffer);
285  k+=skip_arg(&in_buffer[k], 1);
286 
287  if (temp) ++pin;
288  }
289  xyz = ivector(1,pin);
290  pin=0;
291  k=0;
292  for (x=1; dim >= x; ++x) {
293  if(sscanf(&in_buffer[k], "%d", &temp)!=1)
294  error_in_line(filename, line_num, in_buffer);
295  k+=skip_arg(&in_buffer[k], 1);
296 
297  if (temp)
298  xyz[++pin]=x;
299  }
300  } /* endif OPT_PROGRAM */
301 
302 
303  /* 2D - mapping (optional) */
305  PARAMETER_SET *tmp;
306 
307  while(read_long_line(fp, in_buffer, &line_num)) {
308  if((in_buffer[0]=='*') || blank_line(in_buffer))
309  continue;
310  tmp=(PARAMETER_SET*)calloc(1, sizeof(PARAMETER_SET));
311  if(sscanf(in_buffer, "%d %d %d", &tmp->x,
312  &tmp->y,
313  &tmp->points_nr)!=3) {
314  free(tmp);
315  error_in_line(filename, line_num, in_buffer);
316  }
317  else {
318  if((tmp->points_nr<4) || (tmp->x<1) || (tmp->y<1) ||
319  (tmp->x>dim) || (tmp->y>dim) || (tmp->x==tmp->y))
320  error_in_line(filename, line_num, in_buffer);
321  }
322  add_parameter_set(tmp);
323  }
324  } /* endif TWO_SET */
325 
327  for (x=1; dim >= x; ++x)
328  scale[x] = 1.0;
329 /* scale it */
330  for (x=1; dim >= x; ++x) {
331  scale[x] *= fabs(centerpnt[x]);
332  centerpnt[x] /= scale[x];
333  lower[x] /= scale[x];
334  upper[x] /= scale[x];
335  startpnt[x] = centerpnt[x];
336  }
337 
338  fclose(fp);
339 }
int * ivector(int nl, int nh)
Definition: qnrutil.c:8
int var
Definition: points.c:11
static double * temp
Definition: optimize.c:40
double * scale
Definition: points.c:14
char circuit_name[NAME_LENGTH]
Definition: constype.h:184
static int blank_line(char *line)
Definition: points.c:134
int input_options
Definition: constype.h:199
#define LIMITS_FILE
Definition: filenames.h:8
#define LONG_LINE_LENGTH
Definition: constype.h:5
static void unexpctd_eof(char *filename)
Definition: points.c:127
PARAMETER_SET * parameter_list
Definition: points.c:17
int * yield
Definition: points.c:11
int dim
Definition: points.c:11
#define TWO_SET
Definition: constype.h:27
int pntcount
Definition: points.c:12
PARAMETERS param
Definition: init.c:10
double ** hullpnts
Definition: points.c:14
double * delta
Definition: points.c:14
void nrerror(char *error_text)
Definition: lineread.c:7
int * xyz
Definition: points.c:11
#define NAME_LENGTH
Definition: constype.h:3
static void error_in_line(char *filename, int line_num, char *line)
Definition: points.c:120
char init_ext[NAME_LENGTH]
Definition: constype.h:175
void readinit(void)
Definition: points.c:159
char spice_name[NAME_LENGTH]
Definition: constype.h:152
double * lower
Definition: points.c:14
char opt_num[NAME_LENGTH]
Definition: constype.h:196
double * vector(int nl, int nh)
Definition: qnrutil.c:16
int program
Definition: constype.h:193
double * upper
Definition: points.c:14
char input_dir[NAME_LENGTH]
Definition: constype.h:143
static void add_parameter_set(PARAMETER_SET *new)
Definition: points.c:146
double * centerpnt
Definition: points.c:14
static char line[LONG_LINE_LENGTH]
Definition: collect.c:7
#define BOUNDARY_CALL
Definition: filenames.h:25
double * startpnt
Definition: points.c:14
#define OPT_PROGRAM
Definition: constype.h:246
#define LINE_LENGTH
Definition: constype.h:4
#define HS_PROGRAM
Definition: constype.h:243
#define MARG_PROGRAM
Definition: constype.h:245
char(* names)[NAME_LENGTH]
Definition: points.c:15
static int read_long_line(FILE *fp, char *line, int *line_no)
Definition: points.c:108
int addpoint(double *pc, double *po)
Definition: points.c:40
static char filename[LINE_LENGTH]
Definition: optimize.c:35
struct PARAMETER_SET_STRUCT * next
Definition: constype.h:537
static int skip_arg(char *line, int arg_num)
Definition: points.c:20
#define POINT_FILE
Definition: filenames.h:7
int pin
Definition: points.c:11