Log In | Get Help   
Home My Page Projects Code Snippets Project Openings Mareframe
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files
[mareframe] Annotation of /trunk/gadget/maininfo.cc
[mareframe] / trunk / gadget / maininfo.cc Repository:
ViewVC logotype

Annotation of /trunk/gadget/maininfo.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 12 - (view) (download)

1 : agomez 1 #include "maininfo.h"
2 :     #include "errorhandler.h"
3 :     #include "gadget.h"
4 :     #include "runid.h"
5 :     #include "global.h"
6 :    
7 :     void MainInfo::showCorrectUsage(char* error) {
8 :     RUNID.Print(cerr);
9 :     cerr << "\nError in command line value - unrecognised option " << error << endl
10 :     << "Common options are -l or -s, -i <filename> -o <filename>\n"
11 :     << "For more information try running Gadget with the -h switch\n";
12 :     exit(EXIT_FAILURE);
13 :     }
14 :    
15 :     void MainInfo::showUsage() {
16 :     RUNID.Print(cout);
17 :     cout << "\nOptions for running Gadget:\n"
18 :     << " -l perform a likelihood (optimising) model run\n"
19 :     << " -s perform a single (simulation) model run\n"
20 :     << " -n perform a network run (using paramin)\n"
21 :     << " -v --version display version information and exit\n"
22 :     << " -h --help display this help screen and exit\n"
23 :     << "\nOptions for specifying the input to Gadget models:\n"
24 :     << " -i <filename> read model parameters from <filename>\n"
25 :     << " -opt <filename> read optimising parameters from <filename>\n"
26 :     << " -main <filename> read model information from <filename>\n"
27 :     << " (default filename is 'main')\n"
28 :     << " -m <filename> read other commandline parameters from <filename>\n"
29 :     << "\nOptions for specifying the output from Gadget models:\n"
30 :     << " -p <filename> print final model parameters to <filename>\n"
31 :     << " (default filename is 'params.out')\n"
32 :     << " -o <filename> print likelihood output to <filename>\n"
33 :     << " -print <number> print -o output every <number> iterations\n"
34 :     << " -precision <number> set the precision to <number> in output files\n"
35 :     << "\nOptions for debugging Gadget models:\n"
36 :     << " -log <filename> print logging information to <filename>\n"
37 :     << " -printinitial <filename> print initial model information to <filename>\n"
38 :     << " -printfinal <filename> print final model information to <filename>\n"
39 :     << "\nFor more information see the Gadget web page at http://www.hafro.is/gadget\n\n";
40 :     exit(EXIT_SUCCESS);
41 :     }
42 :    
43 :     MainInfo::MainInfo()
44 : ulcessvp 12 : givenOptInfo(0), givenInitialParam(0), runoptimise(0),
45 : agomez 1 runstochastic(0), runnetwork(0), runprint(1), forceprint(0),
46 :     printInitialInfo(0), printFinalInfo(0), printLogLevel(0), maxratio(0.95) {
47 :    
48 :     char tmpname[10];
49 :     strncpy(tmpname, "", 10);
50 :     strcpy(tmpname, "main");
51 :    
52 :     strOptInfoFile = NULL;
53 :     strInitialParamFile = NULL;
54 :     strPrintInitialFile = NULL;
55 :     strPrintFinalFile = NULL;
56 :     strMainGadgetFile = NULL;
57 :     setMainGadgetFile(tmpname);
58 :     }
59 :    
60 :     MainInfo::~MainInfo() {
61 :     if (strOptInfoFile != NULL) {
62 :     delete[] strOptInfoFile;
63 :     strOptInfoFile = NULL;
64 :     }
65 :     if (strInitialParamFile != NULL) {
66 :     delete[] strInitialParamFile;
67 :     strInitialParamFile = NULL;
68 :     }
69 :     if (strPrintInitialFile != NULL) {
70 :     delete[] strPrintInitialFile;
71 :     strPrintInitialFile = NULL;
72 :     }
73 :     if (strPrintFinalFile != NULL) {
74 :     delete[] strPrintFinalFile;
75 :     strPrintFinalFile = NULL;
76 :     }
77 :     if (strMainGadgetFile != NULL) {
78 :     delete[] strMainGadgetFile;
79 :     strMainGadgetFile = NULL;
80 :     }
81 : ulcessvp 11 if (seed != NULL) {
82 :     delete[] seed;
83 :     seed = NULL;
84 :     }
85 : agomez 1 }
86 :    
87 :     void MainInfo::read(int aNumber, char* const aVector[]) {
88 :    
89 :     if (aNumber == 1) {
90 :     handle.logMessage(LOGWARN, "Warning - no command line options specified, using default values");
91 :     return;
92 :     }
93 :    
94 : ulcessvp 11 seed = new unsigned[3];
95 :     seed[0] = 0;
96 :     seed[1] = 0;
97 :     seed[2] = 0;
98 : agomez 1 int k = 1;
99 :     while (k < aNumber) {
100 :     if (strcasecmp(aVector[k], "-l") == 0) {
101 :     runoptimise = 1;
102 :    
103 :     } else if (strcasecmp(aVector[k], "-n") == 0) {
104 :     runnetwork = 1;
105 :    
106 :     #ifndef GADGET_NETWORK
107 :     handle.logMessage(LOGFAIL, "Error - Gadget cannot currently run in network mode for paramin\nGadget must be recompiled to enable the network communication");
108 :     #endif
109 :    
110 :     } else if (strcasecmp(aVector[k], "-s") == 0) {
111 : ulcessvp 11 runstochastic = 1;
112 : agomez 1 } else if (strcasecmp(aVector[k], "-m") == 0) {
113 :     ifstream infile;
114 :     CommentStream incomment(infile);
115 :     if (k == aNumber - 1)
116 :     this->showCorrectUsage(aVector[k]);
117 :     k++;
118 :     infile.open(aVector[k], ios::in);
119 :     handle.checkIfFailure(infile, aVector[k]);
120 :     if (infile.fail())
121 :     this->showCorrectUsage(aVector[k]);
122 :     this->read(incomment);
123 :     infile.close();
124 :     infile.clear();
125 :    
126 :     } else if (strcasecmp(aVector[k], "-i") == 0) {
127 :     if (k == aNumber - 1)
128 :     this->showCorrectUsage(aVector[k]);
129 :     k++;
130 :     this->setInitialParamFile(aVector[k]);
131 :    
132 :     } else if (strcasecmp(aVector[k], "-o") == 0) {
133 :     if (k == aNumber - 1)
134 :     this->showCorrectUsage(aVector[k]);
135 :     k++;
136 :     printinfo.setOutputFile(aVector[k]);
137 :    
138 :     } else if (strcasecmp(aVector[k], "-p") == 0) {
139 :     if (k == aNumber - 1)
140 :     this->showCorrectUsage(aVector[k]);
141 :     k++;
142 :     printinfo.setParamOutFile(aVector[k]);
143 :    
144 :     } else if (strcasecmp(aVector[k], "-forceprint") == 0) {
145 :     forceprint = 1;
146 :    
147 :     } else if (strcasecmp(aVector[k], "-co") == 0) {
148 :     handle.logMessage(LOGFAIL, "The -co switch is no longer supported");
149 :    
150 :     } else if (strcasecmp(aVector[k], "-printinitial") == 0) {
151 :     if (k == aNumber - 1)
152 :     this->showCorrectUsage(aVector[k]);
153 :     k++;
154 :     this->setPrintInitialFile(aVector[k]);
155 :    
156 :     } else if (strcasecmp(aVector[k], "-printfinal") == 0) {
157 :     if (k == aNumber - 1)
158 :     this->showCorrectUsage(aVector[k]);
159 :     k++;
160 :     this->setPrintFinalFile(aVector[k]);
161 :    
162 :     } else if (strcasecmp(aVector[k], "-main") == 0) {
163 :     if (k == aNumber - 1)
164 :     this->showCorrectUsage(aVector[k]);
165 :     k++;
166 :     this->setMainGadgetFile(aVector[k]);
167 :    
168 :     } else if (strcasecmp(aVector[k], "-opt") == 0) {
169 :     if (k == aNumber - 1)
170 :     this->showCorrectUsage(aVector[k]);
171 :     k++;
172 :     this->setOptInfoFile(aVector[k]);
173 :    
174 :     } else if ((strcasecmp(aVector[k], "-printlikelihood") == 0) || (strcasecmp(aVector[k], "-likelihoodprint") == 0)) {
175 :     handle.logMessage(LOGFAIL, "The -printlikelihood switch is no longer supported\nSpecify a likelihoodprinter class in the model print file instead");
176 :    
177 :     } else if (strcasecmp(aVector[k], "-printlikesummary") == 0) {
178 :     handle.logMessage(LOGFAIL, "The -printlikesummary switch is no longer supported\nSpecify a likelihoodsummaryprinter class in the model print file instead");
179 :    
180 :     } else if (strcasecmp(aVector[k], "-printonelikelihood") == 0) {
181 :     handle.logMessage(LOGFAIL, "The -printonelikelihood switch is no longer supported\nSpecify a likelihoodprinter class in the model print file instead");
182 :    
183 :     } else if ((strcasecmp(aVector[k], "-print") == 0) || (strcasecmp(aVector[k], "-print1") == 0)) {
184 :     if (k == aNumber - 1)
185 :     this->showCorrectUsage(aVector[k]);
186 :     k++;
187 :     printinfo.setPrintIteration(atoi(aVector[k]));
188 :    
189 :     } else if (strcasecmp(aVector[k], "-precision") == 0) {
190 :     if (k == aNumber - 1)
191 :     this->showCorrectUsage(aVector[k]);
192 :     k++;
193 :     printinfo.setPrecision(atoi(aVector[k]));
194 :    
195 :     } else if ((strcasecmp(aVector[k], "-v") == 0) || (strcasecmp(aVector[k], "--version") == 0)) {
196 :     RUNID.Print(cout);
197 :     exit(EXIT_SUCCESS);
198 :    
199 :     } else if ((strcasecmp(aVector[k], "-h") == 0) || (strcasecmp(aVector[k], "--help") == 0)) {
200 :     this->showUsage();
201 :    
202 :     } else if (strcasecmp(aVector[k], "-log") == 0) {
203 :     if (k == aNumber - 1)
204 :     this->showCorrectUsage(aVector[k]);
205 :     k++;
206 :     handle.setLogFile(aVector[k]);
207 :     printLogLevel = 5;
208 :    
209 :     } else if (strcasecmp(aVector[k], "-nowarnings") == 0) {
210 :     //handle.logMessage(LOGWARN, "The -nowarnings switch is no longer supported\nSpecify a logging level using the -loglevel <number> instead");
211 :     printLogLevel = 1;
212 :    
213 :     } else if (strcasecmp(aVector[k], "-loglevel") == 0) {
214 :     if (k == aNumber - 1)
215 :     this->showCorrectUsage(aVector[k]);
216 :     k++;
217 :     printLogLevel = atoi(aVector[k]);
218 :    
219 :     } else if (strcasecmp(aVector[k], "-noprint") == 0) {
220 :     //JMB disable model printing from the commandline
221 :     runprint = 0;
222 :    
223 :     } else if (strcasecmp(aVector[k], "-seed") == 0) {
224 :     //JMB experimental setting of random number seed from the commandline
225 :     //if the "seed" is also specified in the optinfo file then that will override
226 :     //any seed that is specified on the commandline
227 :     if (k == aNumber - 1)
228 :     this->showCorrectUsage(aVector[k]);
229 :     k++;
230 : ulcessvp 11 seed[0] = atoi(aVector[k]);
231 :     srand(seed[0]);
232 : ulcessvp 12 //seedM = seed to set the metropolis acceptance in SA
233 : ulcessvp 11 } else if (strcasecmp(aVector[k], "-seedM") == 0) {
234 :     //JMB experimental setting of random number seed from the commandline
235 :     //if the "seed" is also specified in the optinfo file then that will override
236 :     //any seed that is specified on the commandline
237 :     if (k == aNumber - 1)
238 :     this->showCorrectUsage(aVector[k]);
239 :     k++;
240 :     seed[1] = atoi(aVector[k]);
241 : ulcessvp 12 //seedP = seed to set the orden of evaluation of the parameter in SA
242 : ulcessvp 11 } else if (strcasecmp(aVector[k], "-seedP") == 0) {
243 :     //JMB experimental setting of random number seed from the commandline
244 :     //if the "seed" is also specified in the optinfo file then that will override
245 :     //any seed that is specified on the commandline
246 :     if (k == aNumber - 1)
247 :     this->showCorrectUsage(aVector[k]);
248 :     k++;
249 :     seed[2] = atoi(aVector[k]);
250 :    
251 : agomez 1 } else if (strcasecmp(aVector[k], "-maxratio") == 0) {
252 :     //JMB experimental setting of maximum ratio of stock consumed in one timestep
253 :     if (k == aNumber - 1)
254 :     this->showCorrectUsage(aVector[k]);
255 :     k++;
256 :     maxratio = atof(aVector[k]);
257 :    
258 :     } else
259 :     this->showCorrectUsage(aVector[k]);
260 :    
261 :     k++;
262 :     }
263 : ulcessvp 11
264 :     if (seed[0] == 0) {
265 :     seed[0] = unsigned(time(NULL));
266 :     if (seed[1] == 0)
267 :     seed[1] = unsigned(time(NULL));
268 :     if (seed[2] == 0)
269 :     seed[2] = unsigned(time(NULL));
270 :     } else {
271 :     if (seed[1] == 0)
272 :     seed[1] = seed[0];
273 :     if (seed[2] == 0)
274 :     seed[2] = seed[0];
275 :     }
276 :    
277 :    
278 :    
279 :    
280 : agomez 1 }
281 :    
282 :     void MainInfo::checkUsage(const char* const inputdir, const char* const workingdir) {
283 :     int check = 0;
284 :     if (runnetwork)
285 :     check = max(0, printLogLevel);
286 :     else if (runstochastic)
287 :     check = max(3, printLogLevel);
288 :     else
289 :     check = max(2, printLogLevel);
290 :     handle.setLogLevel(check);
291 :    
292 :     //JMB dont print output if doing a network run
293 :     if (!runnetwork)
294 :     RUNID.Print(cout);
295 :     handle.logMessage(LOGINFO, "Starting Gadget from directory:", workingdir);
296 :     handle.logMessage(LOGINFO, "using data from directory:", inputdir);
297 :     handle.logMessage(LOGMESSAGE, ""); //write a blank line to the log file
298 :     if (strcasecmp(inputdir, workingdir) != 0)
299 :     handle.logMessage(LOGWARN, "Warning - working directory different from input directory");
300 :    
301 :     if (runnetwork) {
302 :     handle.logMessage(LOGINFO, "\n** Gadget running in network mode for Paramin **");
303 :     if (printInitialInfo) {
304 :     handle.logMessage(LOGINFO, "Warning - cannot print initial model information");
305 :     printInitialInfo = 0;
306 :     }
307 :     if (printFinalInfo) {
308 :     handle.logMessage(LOGINFO, "Warning - cannot print final model information");
309 :     printFinalInfo = 0;
310 :     }
311 :     }
312 :    
313 :     //JMB check to see if we can actually open required files ...
314 :     ifstream tmpin;
315 :     if (chdir(inputdir) != 0)
316 :     handle.logMessage(LOGFAIL, "Error - failed to change input directory to", inputdir);
317 :     if (givenInitialParam) {
318 :     //JMB check to see that the input and output filenames are different
319 :     //Otherwise Gadget will over-write the inputfile with a blank outputfile ...
320 :     if (strcasecmp(strInitialParamFile, printinfo.getParamOutFile()) == 0)
321 :     handle.logFileMessage(LOGFAIL, "the parameter input and output filenames are the same");
322 :    
323 :     tmpin.open(strInitialParamFile, ios::in);
324 :     handle.checkIfFailure(tmpin, strInitialParamFile);
325 :     tmpin.close();
326 :     tmpin.clear();
327 :     }
328 :     if (givenOptInfo) {
329 :     tmpin.open(strOptInfoFile, ios::in);
330 :     handle.checkIfFailure(tmpin, strOptInfoFile);
331 :     tmpin.close();
332 :     tmpin.clear();
333 :     }
334 :     ofstream tmpout;
335 :     if (chdir(workingdir) != 0)
336 :     handle.logMessage(LOGFAIL, "Error - failed to change working directory to", workingdir);
337 :     if (printInitialInfo) {
338 :     tmpout.open(strPrintInitialFile, ios::out);
339 :     handle.checkIfFailure(tmpout, strPrintInitialFile);
340 :     tmpout.close();
341 :     tmpout.clear();
342 :     }
343 :     if (printFinalInfo) {
344 :     tmpout.open(strPrintFinalFile, ios::out);
345 :     handle.checkIfFailure(tmpout, strPrintFinalFile);
346 :     tmpout.close();
347 :     tmpout.clear();
348 :     }
349 :     printinfo.checkPrintInfo(runnetwork);
350 :    
351 :     //JMB check the value of maxratio
352 :     if ((maxratio < rathersmall) || (maxratio > 1.0)) {
353 :     handle.logMessage(LOGWARN, "Warning - value of maxratio outside bounds", maxratio);
354 :     maxratio = 0.95;
355 :     }
356 :    
357 :     if ((!runstochastic) && (runnetwork)) {
358 :     handle.logMessage(LOGWARN, "\nWarning - Gadget for the paramin network should be used with -s option\nGadget will now set the -s switch to perform a simulation run");
359 :     runstochastic = 1;
360 :     }
361 :    
362 :     if ((runstochastic) && (runoptimise)) {
363 :     handle.logMessage(LOGWARN, "\nWarning - Gadget has been started with both the -s switch and the -l switch\nHowever, it is not possible to do both a simulation run and a likelihood run!\nGadget will perform only the simulation run (and ignore the -l switch)");
364 :     runoptimise = 0;
365 :     }
366 :    
367 :     if ((!runstochastic) && (!runoptimise)) {
368 :     handle.logMessage(LOGWARN, "\nWarning - Gadget has been started without either the -s switch or the -l switch\nGadget will now set the -s switch to perform a simulation run");
369 :     runstochastic = 1;
370 :     }
371 :    
372 :     handle.setRunOptimise(runoptimise);
373 :     if ((printLogLevel == 1) && (!runoptimise))
374 :     handle.logMessage(LOGWARN, "\n** Gadget cannot disable warnings for a simulation run **");
375 :    
376 :     if ((handle.checkLogFile()) && (runoptimise) && (printLogLevel >= 5))
377 :     handle.logMessage(LOGWARN, "\n** logging model information from a Gadget optimisation is not recommended **");
378 :    
379 :     if ((handle.checkLogFile()) && (runnetwork))
380 :     handle.logMessage(LOGWARN, "\n** logging model information from a Gadget network run is not recommended **");
381 :    
382 :     //check the printing options
383 :     if (forceprint)
384 :     handle.logMessage(LOGMESSAGE, "\nPrinting model output has been enabled from the command line");
385 :     if (!runprint)
386 :     handle.logMessage(LOGMESSAGE, "\nPrinting model output has been disabled from the command line");
387 :    
388 :     check = runprint;
389 :     if (runnetwork)
390 :     check = 0;
391 :     else if ((runoptimise) && (!forceprint))
392 :     check = 0;
393 :     runprint = check;
394 :    
395 :     handle.logMessage(LOGMESSAGE, ""); //write blank line to log file
396 :     }
397 :    
398 :     void MainInfo::read(CommentStream& infile) {
399 :     int dummy = 0;
400 :     char text[MaxStrLength];
401 :     strncpy(text, "", MaxStrLength);
402 :     infile >> ws;
403 :     while (!infile.eof()) {
404 :     infile >> text >> ws;
405 :    
406 :     if (strcasecmp(text, "-i") == 0) {
407 :     infile >> text >> ws;
408 :     this->setInitialParamFile(text);
409 :     } else if (strcasecmp(text, "-o") == 0) {
410 :     infile >> text >> ws;
411 :     printinfo.setOutputFile(text);
412 :     } else if (strcasecmp(text, "-co") == 0) {
413 :     handle.logMessage(LOGFAIL, "The -co switch is no longer supported");
414 :     } else if (strcasecmp(text, "-p") == 0) {
415 :     infile >> text >> ws;
416 :     printinfo.setParamOutFile(text);
417 :     } else if (strcasecmp(text, "-main") == 0) {
418 :     infile >> text >> ws;
419 :     this->setMainGadgetFile(text);
420 :     } else if (strcasecmp(text, "-printinitial") == 0) {
421 :     infile >> text >> ws;
422 :     this->setPrintInitialFile(text);
423 :     } else if (strcasecmp(text, "-printfinal") == 0) {
424 :     infile >> text >> ws;
425 :     this->setPrintFinalFile(text);
426 :     } else if (strcasecmp(text, "-opt") == 0) {
427 :     infile >> text >> ws;
428 :     this->setOptInfoFile(text);
429 :     } else if (strcasecmp(text, "-forceprint") == 0) {
430 :     forceprint = 1;
431 :     } else if (strcasecmp(text, "-noprint") == 0) {
432 :     runprint = 0;
433 :     } else if ((strcasecmp(text, "-print") == 0) || (strcasecmp(text, "-print1") == 0)) {
434 :     infile >> dummy >> ws;
435 :     printinfo.setPrintIteration(dummy);
436 :     } else if (strcasecmp(text, "-precision") == 0) {
437 :     infile >> dummy >> ws;
438 :     printinfo.setPrecision(dummy);
439 :     } else if (strcasecmp(text, "-log") == 0) {
440 :     infile >> text >> ws;
441 :     handle.setLogFile(text);
442 :     printLogLevel = 5;
443 :     } else if (strcasecmp(text, "-nowarnings") == 0) {
444 :     printLogLevel = 1;
445 :     } else if (strcasecmp(text, "-loglevel") == 0) {
446 :     infile >> printLogLevel >> ws;
447 :     } else if (strcasecmp(text, "-seed") == 0) {
448 :     infile >> dummy >> ws;
449 :     srand(dummy);
450 :     } else if (strcasecmp(text, "-maxratio") == 0) {
451 :     infile >> maxratio >> ws;
452 :     } else if (strcasecmp(text, "-printlikesummary") == 0) {
453 :     handle.logMessage(LOGWARN, "The -printlikesummary switch is no longer supported\nSpecify a likelihoodsummaryprinter class in the model print file instead");
454 :     } else if (strcasecmp(text, "-printlikelihood") == 0) {
455 :     handle.logMessage(LOGWARN, "The -printlikelihood switch is no longer supported\nSpecify a likelihoodprinter class in the model print file instead");
456 :     } else if (strcasecmp(text, "-printonelikelihood") == 0) {
457 :     handle.logMessage(LOGWARN, "The -printonelikelihood switch is no longer supported\nSpecify a likelihoodprinter class in the model print file instead");
458 :     } else
459 :     this->showCorrectUsage(text);
460 :     }
461 :     }
462 :    
463 :     void MainInfo::setPrintInitialFile(char* filename) {
464 :     if (strPrintInitialFile != NULL) {
465 :     delete[] strPrintInitialFile;
466 :     strPrintInitialFile = NULL;
467 :     }
468 :     strPrintInitialFile = new char[strlen(filename) + 1];
469 :     strcpy(strPrintInitialFile, filename);
470 :     printInitialInfo = 1;
471 :     }
472 :    
473 :     void MainInfo::setPrintFinalFile(char* filename) {
474 :     if (strPrintFinalFile != NULL) {
475 :     delete[] strPrintFinalFile;
476 :     strPrintFinalFile = NULL;
477 :     }
478 :     strPrintFinalFile = new char[strlen(filename) + 1];
479 :     strcpy(strPrintFinalFile, filename);
480 :     printFinalInfo = 1;
481 :     }
482 :    
483 :     void MainInfo::setMainGadgetFile(char* filename) {
484 :     if (strMainGadgetFile != NULL) {
485 :     delete[] strMainGadgetFile;
486 :     strMainGadgetFile = NULL;
487 :     }
488 :     strMainGadgetFile = new char[strlen(filename) + 1];
489 :     strcpy(strMainGadgetFile, filename);
490 :     }
491 :    
492 :     void MainInfo::setInitialParamFile(char* filename) {
493 :     if (strInitialParamFile != NULL) {
494 :     delete[] strInitialParamFile;
495 :     strInitialParamFile = NULL;
496 :     }
497 :     strInitialParamFile = new char[strlen(filename) + 1];
498 :     strcpy(strInitialParamFile, filename);
499 :     givenInitialParam = 1;
500 :     }
501 :    
502 :     void MainInfo::setOptInfoFile(char* filename) {
503 :     if (strOptInfoFile != NULL) {
504 :     delete[] strOptInfoFile;
505 :     strOptInfoFile = NULL;
506 :     }
507 :     strOptInfoFile = new char[strlen(filename) + 1];
508 :     strcpy(strOptInfoFile, filename);
509 :     givenOptInfo = 1;
510 :     }

root@forge.cesga.es
ViewVC Help
Powered by ViewVC 1.0.0  

Powered By FusionForge