source: PSPA/madxPSPA/src/mad_core.c @ 445

Last change on this file since 445 was 430, checked in by touze, 11 years ago

import madx-5.01.00

File size: 7.8 KB
Line 
1#include <signal.h>
2
3#include "madx.h"
4
5// private functions
6
7static void
8mad_init_c(void)
9  /* initializes program */
10{
11  struct variable* var;
12  int ione = 1;
13
14  // make stdout unbuffered for proper I/O synchronization with fortran
15  setvbuf(stdout, 0, _IONBF, 0);
16
17  init55(123456789);          /* random generator */
18  if (watch_flag == 1)  debug_file = fopen("madx.debug", "w");
19  else if (watch_flag == 2)  debug_file = stdout;
20  if (stamp_flag == 1)  stamp_file = fopen("madx.stamp", "w");
21  else if (stamp_flag == 2)  stamp_file = stdout;
22  in = new_in_buff_list(100); /* list of input buffers, dynamic */
23  // quick and dirty fix to accept jobs from filename
24  in->input_files[0] = mad_argc > 1 ? fopen(mad_argv[1], "r") : stdin;
25  if (!in->input_files[0]) {
26    error("invalid input filename ", " %s", mad_argv[1]);
27    in->input_files[0] = stdin;
28  }
29  interactive = intrac();
30  prt_file = stdout;
31  pro = new_in_buff_list(100); /* list of process buffers, dynamic */
32  pro->buffers[0] = new_in_buffer(IN_BUFF_SIZE);
33  pro->curr = 1;
34  c_dum = new_char_array(AUX_LG);
35  c_join = new_char_array(AUX_LG);
36  work = new_char_array(AUX_LG);
37  l_wrk = new_char_array(AUX_LG);
38  char_buff = new_char_array_list(100); /* list of character arrays, dynamic */
39  char_buff->ca[char_buff->curr++] = new_char_array(CHAR_BUFF_SIZE);
40  aux_buff = new_char_array(AUX_LG);  /* dynamic temporary buffer */
41  drift_list = new_el_list(1000); /* dynamic list for internal drifts */
42  variable_list = new_var_list(2000); /* dynamic list of variables */
43  comm_constraints = new_constraint_list(10); /* dynamic constraint list */
44  beam_list = new_command_list("beam_list", 10); /* dynamic beam list */
45  stored_track_start = new_command_list("track_start", 100); /* dynamic */
46  table_deselect = new_command_list_list(10); /* dynamic */
47  table_select = new_command_list_list(10); /* dynamic */
48  defined_commands = new_command_list("defined_commands", 100); /* dynamic */
49  stored_commands = new_command_list("stored_commands", 500); /* dynamic */
50  line_list = new_macro_list(100); /* dynamic */
51  macro_list = new_macro_list(100); /* dynamic */
52  base_type_list = new_el_list(60); /* dynamic */
53  element_list = new_el_list(20000); /* dynamic */
54  buffered_cmds = new_in_cmd_list(10000); /* dynamic */
55  sequences = new_sequence_list(20); /* dynamic */
56  match_sequs = new_sequence_list(2);
57  selected_ranges = new_node_list(10000); /* dynamic */
58  selected_elements = new_el_list(10000); /* dynamic */
59  tmp_p_array = new_char_p_array(1000); /* dynamic */
60  tmp_l_array = new_char_p_array(1000); /* dynamic */
61  sxf_list = new_name_list("sxf_list", 50); /* dynamic */
62  all_table_lists = new_table_list_list(10); /* dynamic */
63  deco_init();
64  get_defined_constants();
65  get_defined_commands();
66  get_sxf_names();
67  pi = get_variable("pi");
68  twopi = two * pi;
69  degrad = 180 / pi;
70  raddeg = pi / 180;
71  e = get_variable("e");
72  clight = get_variable("clight");
73  hbar = get_variable("hbar");
74  var = new_variable("twiss_tol", 1.e-6, 1, 1, NULL, NULL);
75  add_to_var_list(var, variable_list, 1);
76  title = permbuff("no-title");
77  set_defaults("option");
78  set_defaults("beam");
79  add_to_command_list("default_beam", current_beam, beam_list, 0);
80  set_defaults("set");
81  set_defaults("setplot");
82  set_defaults("threader");
83  table_register = new_table_list(10); /* dynamic */
84  beta0_list = new_command_list("beta0_list", 10); /* dynamic */
85  savebeta_list = new_command_list("savebeta_list", 10); /* dynamic */
86  seqedit_select = /* dynamic - for "select seqedit" commands */
87    new_command_list("seqedit_select", 10);
88  error_select = /* dynamic - for "select error" commands */
89    new_command_list("error-select", 10);
90  save_select = /* dynamic - for "select save" commands */
91    new_command_list("save_select", 10);
92  slice_select = /* dynamic - for "select makethin" commands */
93    new_command_list("slice_select", 10);
94  sector_select = /* dynamic - for "select sectormap" commands */
95    new_command_list("sector_select", 10);
96  s_range = new_int_array(10); /* dynamic */
97  e_range = new_int_array(10); /* dynamic */
98  sd_range = new_int_array(10); /* dynamic */
99  ed_range = new_int_array(10); /* dynamic */
100  zero_double(orbit0, 6);
101  zero_double(disp0, 6);
102  zero_double(guess_orbit,6);
103  zero_double(oneturnmat, 36);
104  set_option("twiss_print", &ione);
105}
106
107static void
108set_sigterm(void)
109{
110  /* provide a termination routine for access to memory outside scope */
111  if (signal(SIGSEGV, mad_mem_handler) == SIG_IGN)
112    signal(SIGSEGV, SIG_IGN);
113}
114
115// public functions
116
117void
118madx_start(void)
119  /* prints start message after having read madxdict.h */
120{
121  struct tm* tm;
122
123  // set signal handlers (temporary)
124  set_sigterm();
125
126  // init C and Fortran
127  mad_init_c();
128  mad_init_f_();
129
130  /*  setbuf(stdout,(char *)0); */ /* no buffering - for debugging */
131  time(&start_time); /* initialize timing */
132  tm = localtime(&start_time); /* split system time */
133  last_time = start_time;
134
135  // compute padding of OSTYPE
136  const char *pad[] = { "", " ", "  ", "    " };
137  const int pad_sz = sizeof pad/sizeof *pad;
138  int pad_idx = strlen("Windows")-strlen(version_ostype);
139  if (pad_idx >= pad_sz) pad_idx = pad_sz-1; 
140
141  int version_is_pro = !strcmp(strrchr(version_name, '.'), ".00");
142
143  printf("\n  +++++++++++++++++++++++++++++++++++++++++++\n");
144  printf("  +    %s  (%s bit, %s) %s    +\n", version_name, version_arch, version_ostype, pad[pad_idx]);
145  printf("  +    %s     +\n", version_is_pro ? version_type_pro : version_type_dev);
146  printf("  + %s      +\n", version_date_mod);
147  printf("  + Execution Time Stamp: %02d.%02d.%02d %02d.%02d.%02d +\n",
148         tm->tm_mday, tm->tm_mon+1, tm->tm_year%100,
149         tm->tm_hour, tm->tm_min, tm->tm_sec);
150  printf("  +++++++++++++++++++++++++++++++++++++++++++\n");
151}
152
153void
154madx_input(int top)
155  /* loops over input until end of execution */
156{
157  while (in_stop == 0)
158  {
159    if (interactive && in->curr == 0) puts("X: ==>");
160    if (return_flag || get_stmt(in->input_files[in->curr], 0) == 0)
161    {
162      if (in->input_files[in->curr] != stdin) {
163        fclose(in->input_files[in->curr]);
164        in->input_files[in->curr] = 0;
165      }
166      if (in->curr == 0)
167        return;
168      else
169        in->curr -= 1;
170      return_flag = 0;
171      if (in->curr == top) return;
172    }
173    else
174    {
175      stolower_nq(in->buffers[in->curr]->c_a->c);
176      pro_input(in->buffers[in->curr]->c_a->c);
177      if (stop_flag)  return;
178    }
179  }
180}
181
182#if 0
183static unsigned long long poly_mul_count = 0;
184
185void poly_mul_incr_(void);
186void poly_mul_incr_(void)
187{
188  ++poly_mul_count;
189}
190#endif
191
192void
193madx_finish(void)
194  /* write the termination message, pass madx.ps through ps2ps */
195{
196  int warn_numb, warn_numbf, nwarnings;
197 
198  /* should work with Lahey on windows 24.03.2004 */
199
200  match2_delete_expressions();
201  match2_delete_arrays();
202
203  if (final_message == 0)
204  {
205    final_message = 1;
206    if (plots_made)
207    {
208      gxterm_();
209#ifndef _WIN32
210      if(system("which ps2ps > tmp_plot.ps") == 0)
211            {
212         system("cp madx.ps tmp_plot.ps");
213         system("ps2ps tmp_plot.ps madx.ps");
214            }
215      system("rm tmp_plot.ps");
216#endif
217    }
218    mad_err_getwarn(&warn_numb, &warn_numbf);
219    nwarnings = warn_numb + warn_numbf;
220    printf("\n  Number of warnings: %d\n",nwarnings);
221    if (nwarnings > 0)
222    {
223      printf("%d in C and %d in Fortran\n",warn_numb,warn_numbf);
224    }
225    if (get_option("trace")) time_stamp("end");
226
227    // printf("poly-mul= %llu\n", poly_mul_count);
228
229    printf("\n"
230           "  ++++++++++++++++++++++++++++++++++++++++++++\n");
231    printf("  + %s (%s bit) finished normally +\n", version_name, version_arch);
232    printf("  ++++++++++++++++++++++++++++++++++++++++++++\n");
233  }
234}
235
236
Note: See TracBrowser for help on using the repository browser.