FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_dlb_read_control.c
Go to the documentation of this file.
1 /*****************************************************************************
2  * Copyright (c) 2019 FrontISTR Commons
3  * This software is released under the MIT License, see LICENSE.txt
4  *****************************************************************************/
5 
6 #include "hecmw_repart.h"
7 
8 int HECMW_dlb_is_blank_line(char *buf) {
9  int i, j;
10  int flag;
11 
12  i = 0;
13  flag = 1;
14  while (buf[i] != '\n') {
15  if (buf[i] != ' ') {
16  flag = 0;
17  break;
18  }
19  i++;
20  }
21  return (flag);
22 }
23 
24 int HECMW_dlb_is_comment_line(char *buf) {
25  int i, j;
26  int flag;
27  flag = 0;
28  if (buf[0] == '#')
29  flag = 1;
30  else if ((buf[0] == '!') && (buf[1] == '!'))
31  flag = 1;
32  return (flag);
33 }
34 
35 void HECMW_dlb_get_string_item(char *para, char *buf, int *start_location,
36  char para2[128]) {
37  int value;
38  int i, j;
39 
40  i = *start_location;
41  while ((buf[i] == ',') || (buf[i] == ' ') || (buf[i] == '=')) i++;
42  if (buf[i] == '\n') {
43  fprintf(stderr, "No string value for %s\n", para);
45  "ERROR: HEC-MW-VIS-E0002: The control parameter format error: should "
46  "start from !");
47  }
48  j = 0;
49  while ((buf[i] != ' ') && (buf[i] != ',') && (buf[i] != '\n')) {
50  para2[j] = buf[i];
51  i++;
52  j++;
53  }
54  para2[j] = '\0';
55  *start_location = i;
56  return;
57 }
58 
59 int HECMW_dlb_get_int_item(char *para, char *buf, int *start_location) {
60  int value;
61  int i, j;
62  char para2[128];
63 
64  i = *start_location;
65  while ((buf[i] == ',') || (buf[i] == ' ') || (buf[i] == '=')) i++;
66  if (buf[i] == '\n') {
68  "ERROR: HEC-MW-VIS-E0003:The control parameter format error:No integer "
69  "value for %s");
70  }
71  j = 0;
72  while ((buf[i] != ' ') && (buf[i] != ',') && (buf[i] != '\n')) {
73  para2[j] = buf[i];
74  i++;
75  j++;
76  }
77  para2[j] = '\0';
78  if ((isdigit(para2[0]) == 0) && (para2[0] != '+') && (para2[0] != '-')) {
79  fprintf(stderr, "ERROR: HEC-MW-VIS-E0004: %s should be integer \n", para);
80  HECMW_dlb_print_exit("Please re-input and run again!");
81  }
82  value = atoi(para2);
83  *start_location = i;
84  return (value);
85 }
86 
87 double HECMW_dlb_get_double_item(char *para, char *buf, int *start_location) {
88  double value;
89  int i, j;
90  char para2[128];
91 
92  i = *start_location;
93  while ((buf[i] == ',') || (buf[i] == ' ') || (buf[i] == '=')) i++;
94  if (buf[i] == '\n') {
95  fprintf(stderr, "No integer value for %s\n", para);
96  HECMW_dlb_print_exit("The control parameter format error:!");
97  }
98  j = 0;
99  while ((buf[i] != ' ') && (buf[i] != ',') && (buf[i] != '\n')) {
100  para2[j] = buf[i];
101  i++;
102  j++;
103  }
104  para2[j] = '\0';
105  if ((isdigit(para2[0]) == 0) && (para2[0] != '+') && (para2[0] != '-')) {
106  fprintf(stderr, "ERROR: HEC-MW-VIS-E0005:%s should be a real \n", para);
107  HECMW_dlb_print_exit("Please re-input and run again!");
108  }
109  value = atof(para2);
110  *start_location = i;
111  return (value);
112 }
113 
114 int HECMW_dlb_get_keyword_item(char *buf, char *para) {
115  int i, j;
116  int flag;
117  i = 0;
118  while (buf[i] == ' ') i++;
119  if (buf[i] != '!') {
120  fprintf(stderr, "Please check the line %s\n", buf);
121  HECMW_dlb_print_exit("The control parameter format error:!");
122  }
123  i++;
124  j = 0;
125  while ((buf[i] != ' ') && (buf[i] != '=') && (buf[i] != ',') &&
126  (buf[i] != '\n')) {
127  para[j] = buf[i];
128  i++;
129  j++;
130  }
131  para[j] = '\0';
132  return (i);
133 }
134 
135 int HECMW_dlb_get_keyword_repart(char *buf, Control_para *ctl_para) {
136  int i, j;
137  int flag;
138  char para[128], para2[128];
139 
140  i = 0;
141  while (buf[i] == ' ') i++;
142  if (buf[i] != '!')
144  "ERROR: HEC-MW-DLB-E0002: The control parameter format error: should "
145  "start from !");
146  i = i + 1;
147  j = 0;
148  while ((buf[i] != ' ') && (buf[i] != ',') && (buf[i] != '\n')) {
149  para[j] = buf[i];
150  i++;
151  j++;
152  }
153  flag = 1;
154  if ((strncmp(para, "DLB_CTRL", 8) != 0) &&
155  (strncmp(para, "dlb_ctrl", 8) != 0)) {
156  flag = 0;
157  return (flag);
158  }
159  /* while((buf[i]!='=') && (buf[i]!='\n'))
160  i++;
161  if(buf[i]=='\n')
162  HECMW_dlb_print_exit("ERROR: HEC-MW-DLB-E0006:The control
163  parameter format error: DLB_METHOD");
164  i++;
165  while((buf[i]==' ') && (buf[i]!='\n'))
166  i++;
167  if(buf[i]=='\n')
168  HECMW_dlb_print_exit("ERROR: HEC-MW-VIS-E0006:The control
169  parameter format error: visual ID");
170  j=0;
171  while((buf[i]!=' ') && (buf[i]!=',') && (buf[i]!='=') &&
172  (buf[i]!='\n')) {
173  para[j]=buf[i];
174  i++;
175  j++;
176  }
177  if((strncmp(para, "PSR", 3)==0) || (strncmp(para, "psr", 3)==0)) {
178  flag=1;
179  return (flag);
180  }
181 
182  if((strncmp(para, "PVR", 3)==0) || (strncmp(para, "pvr", 3)==0)) {
183  flag=2;
184  return (flag);
185  }
186 
187  HECMW_dlb_print_exit("ERROR: HEC-MW-VIS-E0007:The control parameter
188  format error: method only can be PSR or PVR");
189  */
190  snprintf(ctl_para->adaptive_repartition,
191  sizeof(ctl_para->adaptive_repartition), "off");
192 
193  while ((buf[i] == ',') || (buf[i] == ' ')) i++;
194  while (buf[i] != '\n') {
195  j = 0;
196  while ((buf[i] != ' ') && (buf[i] != ',') && (buf[i] != '=') &&
197  (buf[i] != '\n')) {
198  para[j] = buf[i];
199  i++;
200  j++;
201  }
202  para[j] = '\0';
203  if ((strncmp(para, "method", 6) == 0) ||
204  (strncmp(para, "METHOD", 6) == 0)) {
205  HECMW_dlb_get_string_item(para, buf, &i, para2);
206  if ((strncmp(para, "ADAPT", 5) == 0) || (strncmp(para, "adapt", 5) == 0))
207  snprintf(ctl_para->adaptive_repartition,
208  sizeof(ctl_para->adaptive_repartition), "on");
209  }
210 
211  while ((buf[i] == ',') || (buf[i] == ' ')) i++;
212  }
213  return flag;
214 }
215 
216 void hecmw_dlb_read_control(char *contfile, Control_para *ctl_para,
217  int stat_para[NUM_CONTROL_PARAS], int pesize) {
218  int i, j, k, offset;
219  char buf[MAX_LINE_LEN];
220  char *parameters[NUM_CONTROL_PARAS];
221  int len_para[NUM_CONTROL_PARAS];
222 
223  char para[128], para1[128];
224  int hit;
225  int surface_num;
226  int len_str;
227  int location, visual_method;
228  int flag, flag_surface;
229  int cont_flag;
230 
231  FILE *fp;
232 
233  fp = fopen(contfile, "r");
234  if (fp == NULL) HECMW_dlb_print_exit("Cannot find the control input file");
235  parameters[0] = "adaptive_repartition";
236  len_para[0] = 11;
237  parameters[1] = "num_of_criteria";
238  len_para[1] = 12;
239  parameters[2] = "balance_rate";
240  len_para[2] = 10;
241  parameters[3] = "num_of_repartition";
242  len_para[3] = 15;
243  parameters[4] = "itr_rate";
244  len_para[4] = 8;
245  parameters[5] = "wgtflag";
246  len_para[5] = 7;
247  parameters[6] = "vwgt_filename";
248  len_para[6] = 9;
249  parameters[7] = "adjwgt_filename";
250  len_para[7] = 12;
251  parameters[8] = "machine_wgt";
252  len_para[8] = 11;
253 
254  for (i = 0; i < NUM_CONTROL_PARAS; i++) {
255  stat_para[i] = 0;
256  }
257  ctl_para->num_criteria = 1;
258 
259  offset = 0;
260  cont_flag = 1;
261  while (cont_flag) {
262  if (fgets(buf, MAX_LINE_LEN, fp) != NULL) {
263  if ((HECMW_dlb_is_blank_line(buf) == 0) &&
264  (HECMW_dlb_is_comment_line(buf) == 0))
265  break;
266  } else
267  cont_flag = 0;
268  }
269 
270  hit = 0;
271  if (cont_flag == 1) cont_flag = HECMW_dlb_get_keyword_repart(buf, ctl_para);
272  while (cont_flag == 1) {
273  if (fgets(buf, MAX_LINE_LEN, fp) != NULL) {
274  if ((HECMW_dlb_is_blank_line(buf) == 0) &&
275  (HECMW_dlb_is_comment_line(buf) == 0))
276  break;
277  } else
278  cont_flag = 0;
279  }
280 
281  while (cont_flag == 1) {
282  hit = -1;
283  location = HECMW_dlb_get_keyword_item(buf, para);
284  for (i = 1; i < NUM_CONTROL_PARAS; i++) {
285  if ((strncmp(para, parameters[i], len_para[i])) == 0) {
286  hit = i;
287  stat_para[i] = 1;
288  break;
289  }
290  }
291  /* fprintf(stderr, "para=%s hit=%d\n", para, hit);
292  */
293  if ((hit >= 0) && (hit < NUM_CONTROL_PARAS)) {
294  switch (hit) {
295  /* case 0:
296  sf[k].surface_style=get_int_item(para, buf,
297  &location);
298  break;
299  */
300  case 1:
301  ctl_para->num_criteria = HECMW_dlb_get_int_item(para, buf, &location);
302  break;
303  case 2:
304  ctl_para->balance_rate =
305  (float *)calloc(ctl_para->num_criteria, sizeof(float));
306  for (i = 0; i < ctl_para->num_criteria; i++) {
307  ctl_para->balance_rate[i] =
308  (float)HECMW_dlb_get_double_item(para, buf, &location);
309  }
310  break;
311  case 3:
312  ctl_para->num_repartition =
313  HECMW_dlb_get_int_item(para, buf, &location);
314  break;
315  case 4:
316  ctl_para->itr_rate =
317  (float)HECMW_dlb_get_double_item(para, buf, &location);
318  break;
319  case 5:
320  ctl_para->wgtflag = HECMW_dlb_get_int_item(para, buf, &location);
321  break;
322  case 6:
323  HECMW_dlb_get_string_item(para, buf, &location,
324  ctl_para->vwgt_filename);
325  break;
326  case 7:
327  HECMW_dlb_get_string_item(para, buf, &location,
328  ctl_para->adjwgt_filename);
329  break;
330  case 8:
331  ctl_para->machine_wgt = (float *)calloc(pesize, sizeof(float));
332  for (i = 0; i < pesize; i++) {
333  ctl_para->machine_wgt[i] =
334  (float)HECMW_dlb_get_double_item(para, buf, &location);
335  }
336  break;
337  /* case 9:
338  fscanf(contfp, "%s", ctl_para->output_filename);
339  */
340 
341  break;
342  }
343  }
344  while (cont_flag) {
345  if (fgets(buf, MAX_LINE_LEN, fp) != NULL) {
346  if ((HECMW_dlb_is_blank_line(buf) == 0) &&
347  (HECMW_dlb_is_comment_line(buf) == 0))
348  break;
349  } else
350  cont_flag = 0;
351  }
352  if (cont_flag == 0) break;
353  }
354  /* check the parameters */
355  /* if(stat_para[0]==0) {
356  snprintf(ctl_para->adaptive_repartition,
357  sizeof(ctl_para->adaptive_repartition), "off");
358  }
359 
360  if((strncmp(ctl_para->adaptive_repartition, "on", 2)!=0) &&
361  (strncmp(ctl_para->adaptive_repartition, "off", 3)!=0)){
362  fprintf(stderr, "adaptive_repartition should be on
363  or off\n");
364  fprintf(stderr, "Please re-input again\n");
365  exit(0);
366  }
367  */
368  if (stat_para[1] == 0) {
369  ctl_para->num_criteria = 1;
370  }
371 
372  if (ctl_para->num_criteria <= 0) {
373  fprintf(
374  stderr,
375  "#### HEC-MW-DLB-E1001: num_of_criteria should be greater than 0\n");
376  fprintf(stderr, "Please re-input a correct one\n");
377  exit(EXIT_FAILURE);
378  }
379  if (stat_para[2] == 0) {
380  ctl_para->balance_rate =
381  (float *)calloc(ctl_para->num_criteria, sizeof(float));
382  for (i = 0; i < ctl_para->num_criteria; i++)
383  ctl_para->balance_rate[i] = 1.05;
384  }
385  for (i = 0; i < ctl_para->num_criteria; i++) {
386  if (ctl_para->balance_rate[i] < 1.0) {
387  fprintf(stderr,
388  "#### HEC-MW-DLB-E1002: The balance rate should be >=1.0\n");
389  fprintf(stderr, "Please input again\n");
390  exit(EXIT_FAILURE);
391  }
392  }
393 
394  if (stat_para[3] == 0) {
395  ctl_para->num_repartition = pesize;
396  }
397  if (ctl_para->num_repartition < 1) {
398  fprintf(
399  stderr,
400  "#### HEC-MW-DLB-E1003: The num_of_repartition cannot less than 1\n");
401  fprintf(stderr, "Please input again\n");
402  exit(EXIT_FAILURE);
403  }
404  if (stat_para[4] == 0) {
405  ctl_para->itr_rate = 10000.0;
406  }
407  if (ctl_para->itr_rate < 0.0) {
408  fprintf(stderr, "#### HEC-MW-DLB-E1004:itr_rate cannot be less than 0.0\n");
409  exit(EXIT_FAILURE);
410  }
411 
412  if (stat_para[5] == 0) {
413  ctl_para->wgtflag = 0;
414  }
415  if ((ctl_para->wgtflag < 0) || (ctl_para->wgtflag > 3)) {
416  fprintf(stderr, "#### HEC-MW-DLB-E1005:wgtflag only can be in 0--3\n");
417  exit(EXIT_FAILURE);
418  }
419  if (stat_para[8] == 0) {
420  ctl_para->machine_wgt = (float *)calloc(pesize, sizeof(float));
421  for (i = 0; i < pesize; i++) ctl_para->machine_wgt[i] = 1.0 / (float)pesize;
422  }
423 
424  return;
425 }
426 
428  int stat_para[NUM_CONTROL_PARAS],
429  int pesize) {
430  int i;
431 
432  snprintf(ctl_para->adaptive_repartition,
433  sizeof(ctl_para->adaptive_repartition), "on");
434  ctl_para->num_criteria = 1;
435 
436  ctl_para->balance_rate = (float *)calloc(1, sizeof(float));
437  ctl_para->balance_rate[0] = 1.02;
438  ctl_para->num_repartition = pesize;
439  ctl_para->itr_rate = 10000.0;
440  ctl_para->wgtflag = 0;
441  for (i = 6; i < NUM_CONTROL_PARAS; i++) stat_para[i] = 0;
442  stat_para[8] = 1;
443  ctl_para->machine_wgt = (float *)calloc(pesize, sizeof(float));
444  for (i = 0; i < pesize; i++) ctl_para->machine_wgt[i] = 1.0 / (float)pesize;
445 
446  return;
447 }
void HECMW_dlb_print_exit(char *var)
void hecmw_dlb_read_control(char *contfile, Control_para *ctl_para, int stat_para[NUM_CONTROL_PARAS], int pesize)
void HECMW_dlb_get_string_item(char *para, char *buf, int *start_location, char para2[128])
void hecmw_dlb_set_default_control(Control_para *ctl_para, int stat_para[NUM_CONTROL_PARAS], int pesize)
int HECMW_dlb_get_int_item(char *para, char *buf, int *start_location)
int HECMW_dlb_get_keyword_item(char *buf, char *para)
int HECMW_dlb_is_comment_line(char *buf)
int HECMW_dlb_is_blank_line(char *buf)
double HECMW_dlb_get_double_item(char *para, char *buf, int *start_location)
int HECMW_dlb_get_keyword_repart(char *buf, Control_para *ctl_para)
#define NULL
#define MAX_LINE_LEN
Definition: hecmw_repart.h:25
#define NUM_CONTROL_PARAS
Definition: hecmw_repart.h:27
char adjwgt_filename[128]
Definition: hecmw_repart.h:47
char vwgt_filename[128]
Definition: hecmw_repart.h:46
char adaptive_repartition[4]
Definition: hecmw_repart.h:35