[a0bcf1] | 1 | /** \file opt.c
|
---|
| 2 | * Option Retrieving and debugger.
|
---|
| 3 | * This file contains routines that read options from command line GetOptions(),
|
---|
| 4 | * set the verbosity level SetOutGroup1() and individually for each process
|
---|
| 5 | * SetOutGroup2() and starting the various debuggers Start_cvd(), Start_dbx(),
|
---|
| 6 | * Start_ddd(), Start_gdb(), Start_totalview(), Start_ups(), StartDebugger().
|
---|
| 7 | * And deallocating the debug string FreeDebugStr().
|
---|
| 8 | *
|
---|
| 9 | * \date 1998-2000
|
---|
| 10 | *
|
---|
| 11 | * $Id: opt.c,v 1.15 2007-02-12 09:44:56 foo Exp $
|
---|
| 12 | */
|
---|
| 13 |
|
---|
| 14 | #include<stdio.h>
|
---|
| 15 | #include<stdlib.h>
|
---|
| 16 | #include<string.h>
|
---|
| 17 | #include<unistd.h>
|
---|
| 18 | #include<sys/utsname.h>
|
---|
| 19 | #include"data.h"
|
---|
| 20 | #include"helpers.h"
|
---|
| 21 | #include"opt.h"
|
---|
| 22 |
|
---|
| 23 | static char *DebugString = NULL; //!< command line option
|
---|
| 24 | static char *program_name = NULL;//<! copy of argv[0]
|
---|
| 25 | static int debugger_started = 0; //!< "debugger been started?"-flag (0 - no, 1 - yes)
|
---|
| 26 |
|
---|
| 27 | /** Free debug string memory .
|
---|
| 28 | * Frees memory for DebugString and program_name
|
---|
| 29 | */
|
---|
| 30 | static void FreeDebugStr(void) {
|
---|
[64fa9e] | 31 | if (DebugString) Free(DebugString, "FreeDebugStr: DebugString");
|
---|
| 32 | if (program_name) Free(program_name, "FreeDebugStr: program_name");
|
---|
[a0bcf1] | 33 | }
|
---|
| 34 |
|
---|
| 35 | /*extern char *optarg;
|
---|
| 36 | extern int optind;*/
|
---|
| 37 |
|
---|
| 38 | /** Reads options from commandline and fills \ref CallOptions.
|
---|
| 39 | * uses getopt in order to retrieve options from command line, including
|
---|
| 40 | * most importantly the main paramter file. The rest is just verbosity,
|
---|
| 41 | * debugging, alarm timer and source file for restarting calculations.\n
|
---|
| 42 | * Also usage is printed on request
|
---|
| 43 | *
|
---|
| 44 | * \param *Call \ref CallOptions structure to be filled
|
---|
| 45 | * \param argc argument count and ...
|
---|
| 46 | * \param argv[] .. argument const char array right from command line
|
---|
| 47 | */
|
---|
| 48 | void GetOptions(struct CallOptions *Call, int argc, char *const argv[]) {
|
---|
| 49 | /* parsen der Kommandozeile */
|
---|
| 50 | int c, errflg = 0;
|
---|
| 51 |
|
---|
| 52 | /* defaults setzen */
|
---|
| 53 | Call->MainParameterFile = NULL;
|
---|
[c13d72] | 54 | Call->ForcesFile = NULL;
|
---|
[a0bcf1] | 55 | Call->debug = 0;
|
---|
| 56 | Call->nicelevel = 0;
|
---|
| 57 | Call->Out = 0;
|
---|
| 58 | Call->alarm = 0;
|
---|
| 59 | Call->proc[PEPsi] = 0;
|
---|
| 60 | Call->proc[PEGamma] = 0;
|
---|
| 61 | Call->ReadSrcFiles = 0;
|
---|
| 62 | Call->WriteSrcFiles = 0;
|
---|
| 63 | Call->AddNFactor = 1;
|
---|
| 64 |
|
---|
[c13d72] | 65 | while ((c = getopt(argc, argv, "a:d:D:hn:o:p:m:rvwxF:")) != -1) {
|
---|
[a0bcf1] | 66 | switch (c) {
|
---|
| 67 | case 'a':
|
---|
| 68 | Call->alarm = abs(atoi(optarg));
|
---|
| 69 | break;
|
---|
| 70 | case 'd':
|
---|
[64fa9e] | 71 | if (DebugString) Free(DebugString, "GetOptions: DebugString");
|
---|
[a0bcf1] | 72 | Call->debug = 1;
|
---|
| 73 | DebugString = (char *)Malloc(strlen(optarg)+1, "GetOptions");
|
---|
| 74 | strcpy(DebugString, optarg);
|
---|
| 75 | break;
|
---|
| 76 | case 'D':
|
---|
[64fa9e] | 77 | if (DebugString) Free(DebugString, "GetOptions: DebugString");
|
---|
[a0bcf1] | 78 | DebugString = (char *)Malloc(strlen(optarg)+1, "GetOptions");
|
---|
| 79 | strcpy(DebugString, optarg);
|
---|
| 80 | Call->debug = 2;
|
---|
| 81 | break;
|
---|
| 82 | case 'h':
|
---|
| 83 | printf("Usage: %s [-hvxrw ] [-a alarmtime] [-d debugstr|-D debugstr] [-n nicelevel] [-m addNfactor]\n","pcp");
|
---|
| 84 | printf(" [-o verbosity] mainparameterfile\n");
|
---|
| 85 | printf(" -a alarmtime Sets alarm to alarmtime seconds. Code will finish after\n");
|
---|
| 86 | printf(" next timestep, writing out the current state.\n");
|
---|
| 87 | printf(" -d debugstr Starts debugger right away.\n");
|
---|
| 88 | printf(" -D debugstr Starts debugger when encountering an error.\n");
|
---|
| 89 | printf(" Valid syntax for debugstr:\n");
|
---|
| 90 | printf(" 0 sleep for a minute, no debugger\n");
|
---|
| 91 | printf(" [host[:display][,debugger]] start debugger xterm on host:display\n");
|
---|
| 92 | printf(" (if DISPLAY is set or for local connection set host to local).\n");
|
---|
| 93 | printf(" Valid values for debugger are: gdb, dbx, ddd, cvd, totalview, ups.\n");
|
---|
| 94 | printf(" -h Displays this help page and exits successfully.\n");
|
---|
| 95 | printf(" -n nicelevel Decreases priority of process.\n");
|
---|
| 96 | printf(" -o verbosity Sets verbosity level. Deprecated, use -v instead.\n");
|
---|
| 97 | printf(" Possible values include: 0-5.\n");
|
---|
| 98 | printf(" -v Increases verbosity level by one. Default value: 0.\n");
|
---|
| 99 | printf(" -p n,m procs per Gamma-point, procs per psi\n");
|
---|
| 100 | printf(" No.of PE = n * m\n");
|
---|
| 101 | printf(" -r Read old src files.\n");
|
---|
| 102 | printf(" -w Write src files.\n");
|
---|
| 103 | printf(" -m f Additional NFactor - to fix read srcpsi\n");
|
---|
[c13d72] | 104 | printf(" -F file Do not calculate Hellmann-Feyman forces but read from file\n");
|
---|
[a0bcf1] | 105 | printf("For parallel codes it is necessary to specify the main parameter file\n");
|
---|
| 106 | printf("with an absolute path.\n");
|
---|
| 107 | exit(EXIT_SUCCESS);
|
---|
| 108 | case 'n':
|
---|
| 109 | Call->nicelevel = abs(atoi(optarg));
|
---|
| 110 | break;
|
---|
| 111 | case 'o':
|
---|
| 112 | Call->Out = abs(atoi(optarg));
|
---|
| 113 | break;
|
---|
| 114 | case 'p':
|
---|
| 115 | if (sscanf(optarg, "%d,%d", &Call->proc[PEPsi], &Call->proc[PEGamma]) < 2)
|
---|
| 116 | errflg++;
|
---|
| 117 | if (Call->proc[PEPsi] < 1 || Call->proc[PEGamma] < 1) {
|
---|
| 118 | fprintf(stderr, "proc[i] must be > 0\n");
|
---|
| 119 | errflg++;
|
---|
| 120 | }
|
---|
| 121 | break;
|
---|
| 122 | case 'r':
|
---|
| 123 | Call->ReadSrcFiles++;
|
---|
| 124 | break;
|
---|
| 125 | case 'v':
|
---|
| 126 | Call->Out++;
|
---|
| 127 | break;
|
---|
| 128 | case 'w':
|
---|
| 129 | Call->WriteSrcFiles++;
|
---|
| 130 | break;
|
---|
| 131 | case 'm':
|
---|
| 132 | if (sscanf(optarg, "%d", &Call->AddNFactor) < 1)
|
---|
[c13d72] | 133 | errflg++;
|
---|
[a0bcf1] | 134 | if (Call->AddNFactor <= 1) {
|
---|
[c13d72] | 135 | fprintf(stderr, "AddNFactor must be > 0\n");
|
---|
| 136 | errflg++;
|
---|
[a0bcf1] | 137 | }
|
---|
| 138 | break;
|
---|
| 139 | case '?':
|
---|
| 140 | errflg++;
|
---|
| 141 | break;
|
---|
[c13d72] | 142 | case 'F':
|
---|
| 143 | fprintf(stderr, "Recognized forces file '%s' with length %ld.\n", optarg, strlen(optarg));
|
---|
| 144 | Call->ForcesFile = (char *) Malloc((strlen(optarg)+2)*sizeof(char), "GetOptions: CallOptions::*ForcesFile");
|
---|
| 145 | strcpy(Call->ForcesFile, optarg);
|
---|
| 146 | fprintf(stderr, "Stored CallOptions->ForcesFile: %s\n", Call->ForcesFile);
|
---|
| 147 | break;
|
---|
[a0bcf1] | 148 | default:
|
---|
| 149 | fprintf(stderr, "GetOptions: getopt() returned character code O%o !?\n", c);
|
---|
| 150 | errflg++;
|
---|
| 151 | }
|
---|
| 152 | }
|
---|
| 153 | if (errflg) {
|
---|
| 154 | fprintf(stderr,"Usage: %s [ OPTIONS ] mainparameterfile\nTry '%s -h' for more information.\n", argv[0], argv[0]);
|
---|
| 155 | exit(EXIT_FAILURE);
|
---|
| 156 | }
|
---|
| 157 | if ( optind < argc - 1)
|
---|
| 158 | fprintf(stderr, "Warning: more than one file specified\n");
|
---|
| 159 | for ( ; optind < argc ; optind++) {
|
---|
| 160 | Call->MainParameterFile = (char *)Malloc(strlen(argv[optind])+1, "GetOptions: MainParameterFile");
|
---|
| 161 | strcpy(Call->MainParameterFile, argv[optind]);
|
---|
| 162 | }
|
---|
| 163 |
|
---|
| 164 | /* nun auswerten */
|
---|
| 165 | program_name = (char *)Malloc(strlen(argv[0]) + 1, "GetOptions");
|
---|
| 166 | strcpy(program_name, argv[0]);
|
---|
| 167 | if (Call->alarm) alarm(Call->alarm);
|
---|
| 168 | if (Call->nicelevel) nice(Call->nicelevel);
|
---|
| 169 | if (!Call->MainParameterFile) {
|
---|
| 170 | fprintf(stderr, "Did not specify a main parameter file.\n");
|
---|
| 171 | exit(EXIT_FAILURE);
|
---|
| 172 | }
|
---|
| 173 | atexit(FreeDebugStr); /* nachher aufraeumen */
|
---|
| 174 | }
|
---|
| 175 |
|
---|
| 176 | /** Starts DDD Debugger.
|
---|
| 177 | * Via a system call the debugger is started with certain paramaters
|
---|
| 178 | * \param *Host hostname (if not specified, then launched via \a pid)
|
---|
| 179 | * \param *program program name
|
---|
| 180 | * \param pid Process ID of te program
|
---|
| 181 | * \return return value of launched debugger
|
---|
| 182 | */
|
---|
| 183 | static int Start_ddd(char *Host, char *program, pid_t pid) {
|
---|
| 184 | char s[MAXDUMMYSTRING];
|
---|
| 185 | if (Host) sprintf(s, "ddd -display %s %s %ld &", Host, program, (long int)pid);
|
---|
| 186 | else sprintf(s, "ddd %s %ld &", program, (long int)pid);
|
---|
| 187 | return system(s);
|
---|
| 188 | }
|
---|
| 189 |
|
---|
| 190 | /** Starts GDB Debugger.
|
---|
| 191 | * Via a system call the debugger is started with certain paramaters
|
---|
| 192 | * \param *Host hostname (if not specified, then launched via \a pid)
|
---|
| 193 | * \param *program program name
|
---|
| 194 | * \param pid Process ID of te program
|
---|
| 195 | * \return return value of launched debugger
|
---|
| 196 | */
|
---|
| 197 | static int Start_gdb(char *Host, char *program, pid_t pid) {
|
---|
| 198 | char s[MAXDUMMYSTRING];
|
---|
| 199 | if (Host) sprintf(s, "xterm -display %s -e gdb %s %ld &", Host, program, (long int)pid);
|
---|
| 200 | else sprintf(s, "xterm -e gdb %s %ld &", program, (long int)pid);
|
---|
| 201 | return system(s);
|
---|
| 202 | }
|
---|
| 203 |
|
---|
| 204 | /** Starts DBX Debugger.
|
---|
| 205 | * Via a system call the debugger is started with certain paramaters
|
---|
| 206 | * \param *Host hostname (if not specified, then launched via \a pid)
|
---|
| 207 | * \param *program program name
|
---|
| 208 | * \param pid Process ID of te program
|
---|
| 209 | * \return return value of launched debugger
|
---|
| 210 | */
|
---|
| 211 | static int Start_dbx(char *Host, char *program, pid_t pid) {
|
---|
| 212 | char s[MAXDUMMYSTRING];
|
---|
| 213 | program = program;
|
---|
| 214 | if (Host) sprintf(s, "xterm -display %s -e dbx -p %ld &", Host, (long int)pid);
|
---|
| 215 | else sprintf(s, "xterm -e dbx -p %ld &", (long int)pid);
|
---|
| 216 | return system(s);
|
---|
| 217 | }
|
---|
| 218 |
|
---|
| 219 | /** Starts CVD Debugger.
|
---|
| 220 | * Via a system call the debugger is started with certain paramaters
|
---|
| 221 | * \param *Host hostname (if not specified, then launched via \a pid)
|
---|
| 222 | * \param *program program name
|
---|
| 223 | * \param pid Process ID of te program
|
---|
| 224 | * \return return value of launched debugger
|
---|
| 225 | */
|
---|
| 226 | static int Start_cvd(char *Host, char *program, pid_t pid) {
|
---|
| 227 | char s[MAXDUMMYSTRING];
|
---|
| 228 | program = program;
|
---|
| 229 | if (Host) sprintf(s, "cvd -pid %ld -display %s &", (long int)pid, Host);
|
---|
| 230 | else sprintf(s, "cvd -pid %ld &", (long int)pid);
|
---|
| 231 | return system(s);
|
---|
| 232 | }
|
---|
| 233 |
|
---|
| 234 | /** Starts Totalview Debugger.
|
---|
| 235 | * Via a system call the debugger is started with certain paramaters
|
---|
| 236 | * \param *Host hostname (if not specified, then launched via \a pid)
|
---|
| 237 | * \param *program program name
|
---|
| 238 | * \param pid Process ID of te program
|
---|
| 239 | * \return return value of launched debugger
|
---|
| 240 | */
|
---|
| 241 | static int Start_totalview(char *Host, char *program, pid_t pid) {
|
---|
| 242 | char s[MAXDUMMYSTRING];
|
---|
| 243 | int myrank = 0;
|
---|
| 244 | MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
|
---|
| 245 | if (myrank) return 0; /* nur einmal totalview aufrufen */
|
---|
| 246 | if (Host) sprintf(s, "totalview -display %s -p %ld %s &", Host, (long int)pid, program);
|
---|
| 247 | else sprintf(s, "totalview -p %ld %s &", (long int)pid, program);
|
---|
| 248 | return system(s);
|
---|
| 249 | }
|
---|
| 250 |
|
---|
| 251 | /** Starts UPS Debugger.
|
---|
| 252 | * Via a system call the debugger is started with certain paramaters
|
---|
| 253 | * \param *Host hostname (if not specified, then launched via \a pid)
|
---|
| 254 | * \param *program program name
|
---|
| 255 | * \param pid Process ID of te program
|
---|
| 256 | * \return return value of launched debugger
|
---|
| 257 | */
|
---|
| 258 | static int Start_ups(char *Host, char *program, pid_t pid) {
|
---|
| 259 | char s[MAXDUMMYSTRING];
|
---|
| 260 | if (Host) sprintf(s, "ups -display %s %s %ld &", Host, program, (long int)pid);
|
---|
| 261 | else sprintf(s, "ups %s %ld &", program, (long int)pid);
|
---|
| 262 | return system(s);
|
---|
| 263 | }
|
---|
| 264 |
|
---|
| 265 | /** Starts debugger.
|
---|
| 266 | * Tries to start a certain debugger, specified either via command line
|
---|
| 267 | * or educatedly guessed (having a list of typical ones), waits a minute
|
---|
| 268 | * in order to let the debugger have time for its pre-activities
|
---|
| 269 | *
|
---|
| 270 | * \warning no mallocs in this routine, no \ref Error
|
---|
| 271 | */
|
---|
| 272 | void StartDebugger(void) {
|
---|
| 273 | char Host[MAXDUMMYSTRING] = "", Debugger[MAXDUMMYSTRING] = "";
|
---|
| 274 | char *host_ptr = Host;
|
---|
| 275 | int (*Debugger_call) (char *, char *, pid_t);
|
---|
| 276 | struct utsname op;
|
---|
| 277 |
|
---|
| 278 | if (debugger_started || !DebugString)
|
---|
| 279 | return; /* nicht starten, falls kein -d oder -D, nicht zweimal starten */
|
---|
| 280 | debugger_started = 1;
|
---|
| 281 |
|
---|
| 282 | if (strcmp(DebugString, "0")) {
|
---|
| 283 | /* debugger soll aus Programm heraus gestartet werden */
|
---|
| 284 | if (!system(NULL)) {
|
---|
| 285 | fprintf(stderr,"StartDebugger: No shell available\n");
|
---|
| 286 | exit(EXIT_FAILURE);
|
---|
| 287 | }
|
---|
| 288 | switch (sscanf(DebugString, " %197[a-zA-Z0-9._:-],%199s", Host, Debugger)) {
|
---|
| 289 | case 2:
|
---|
| 290 | if (!strcmp(Debugger, "ddd")) Debugger_call = Start_ddd;
|
---|
| 291 | else if (!strcmp(Debugger, "gdb")) Debugger_call = Start_gdb;
|
---|
| 292 | else if (!strcmp(Debugger, "dbx")) Debugger_call = Start_dbx;
|
---|
| 293 | else if (!strcmp(Debugger, "cvd")) Debugger_call = Start_cvd;
|
---|
| 294 | else if (!strcmp(Debugger, "totalview")) Debugger_call = Start_totalview;
|
---|
| 295 | else if (!strcmp(Debugger, "ups")) Debugger_call = Start_ups;
|
---|
| 296 | else {
|
---|
| 297 | fprintf(stderr, "StartDebugger: debugger %s not supported.\n", Debugger);
|
---|
| 298 | exit(EXIT_FAILURE);
|
---|
| 299 | }
|
---|
| 300 | break;
|
---|
| 301 | case 0:
|
---|
| 302 | host_ptr = NULL; /* no -display */
|
---|
| 303 | case 1:
|
---|
| 304 | /* try to set debugger smart ;-) */
|
---|
| 305 | if (uname(&op) == -1) {
|
---|
| 306 | perror("StartDebugger: uname failed");
|
---|
| 307 | exit(EXIT_FAILURE);
|
---|
| 308 | }
|
---|
| 309 | if (!strncmp(op.sysname, "Linux", 5) || !strncmp(op.sysname, "linux", 5)) Debugger_call = Start_gdb;
|
---|
| 310 | else if (!strncmp(op.sysname, "IRIX", 4)) Debugger_call = Start_cvd;
|
---|
| 311 | else if (!strncmp(op.sysname, "sn", 2)) Debugger_call = Start_totalview;
|
---|
| 312 | else Debugger_call = Start_gdb;
|
---|
| 313 | break;
|
---|
| 314 | default:
|
---|
| 315 | fprintf(stderr, "StartDebugger: could not read debugstring.\n");
|
---|
| 316 | exit(EXIT_FAILURE);
|
---|
| 317 | }
|
---|
| 318 | if (!strcmp(Host, "local")) host_ptr = NULL; /* no -display */
|
---|
| 319 | else if (!strchr(Host, ':')) strcat(Host, ":0"); /* kein :0 gesetzt */
|
---|
| 320 | if (Debugger_call(host_ptr, program_name, getpid())) {
|
---|
| 321 | fprintf(stderr, "StartDebugger: could not start %s on %s\n", Debugger, Host);
|
---|
| 322 | exit(EXIT_FAILURE);
|
---|
| 323 | }
|
---|
| 324 | }
|
---|
| 325 | sleep(60); /* danach sollte der Debugger gestartet sein */
|
---|
| 326 | }
|
---|
| 327 |
|
---|
| 328 | /** Sets verbosity individually for each group.
|
---|
| 329 | * Depending on the specified general verbosity \ref CallOptions#Out the array \ref CallOptions#out
|
---|
| 330 | * is set accordingly
|
---|
| 331 | *
|
---|
| 332 | * \sa SetOutGroup2()
|
---|
| 333 | * \param *Call \ref CallOptions structure containing \ref CallOptions#Out and \ref CallOptions#out
|
---|
| 334 | */
|
---|
| 335 | void SetOutGroup1(struct CallOptions *Call) {
|
---|
| 336 | int i, me;
|
---|
| 337 | MPI_Comm_rank(MPI_COMM_WORLD, &me); // me is the process number of this one
|
---|
| 338 | for (i=0; i < MaxOutGroup; i++) Call->out[i] = 0; // resetting all levels
|
---|
| 339 | if (me == 0) Call->out[MinOut] = 1; // generally (0) does some output
|
---|
| 340 | switch (Call->Out) {
|
---|
| 341 | case OutNone:
|
---|
| 342 | break;
|
---|
| 343 | case OutNormal:
|
---|
| 344 | if (me == 0) Call->out[MinOut] = 1;
|
---|
| 345 | if (me == 0) Call->out[NormalOut] = 1;
|
---|
| 346 | if (me == 0) Call->out[ValueOut] = 1;
|
---|
| 347 | break;
|
---|
| 348 | case OutNormalP:
|
---|
| 349 | Call->out[MinOut] = 1;
|
---|
| 350 | Call->out[NormalOut] = 1;
|
---|
| 351 | if (me == 0) Call->out[ValueOut] = 1;
|
---|
| 352 | break;
|
---|
| 353 | case OutMore:
|
---|
| 354 | if (me == 0) Call->out[MinOut] = 1;
|
---|
| 355 | if (me == 0) Call->out[NormalOut] = 1;
|
---|
| 356 | if (me == 0) Call->out[ReadOut] = 1;
|
---|
| 357 | if (me == 0) Call->out[ValueOut] = 1;
|
---|
| 358 | break;
|
---|
| 359 | case OutMoreP:
|
---|
| 360 | Call->out[MinOut] = 1;
|
---|
| 361 | Call->out[NormalOut] = 1;
|
---|
| 362 | Call->out[ReadOut] = 1;
|
---|
| 363 | Call->out[ValueOut] = 1;
|
---|
| 364 | break;
|
---|
| 365 | case OutAll:
|
---|
| 366 | break;
|
---|
| 367 | case OutAllP:
|
---|
| 368 | default:
|
---|
| 369 | ;
|
---|
| 370 | }
|
---|
| 371 | }
|
---|
| 372 |
|
---|
| 373 | /** Set the output of various MPI communicating groups.
|
---|
| 374 | * Groups such as SpinDouble and for fft receive equal output levels
|
---|
| 375 | * regarding their calculations. Pattern is: "Me being part of the
|
---|
| 376 | * group? (..==0) Then set level to blabla"
|
---|
| 377 | *
|
---|
| 378 | * \sa SetOutGroup1()
|
---|
| 379 | * \param *P \ref Problem contains the communicators (aka groups)
|
---|
| 380 | * \param *Call \ref CallOptions contains verbosity level
|
---|
| 381 | */
|
---|
| 382 | void SetOutGroup2(struct Problem *P, struct CallOptions *Call) {
|
---|
| 383 | int i;
|
---|
| 384 | switch (Call->Out) {
|
---|
| 385 | case OutNone:
|
---|
| 386 | break;
|
---|
| 387 | case OutNormal:
|
---|
| 388 | if (P->Par.me_comm_ST_Psi == 0) Call->out[LeaderOut] = 1;
|
---|
| 389 | break;
|
---|
| 390 | case OutNormalP:
|
---|
| 391 | if (P->Par.me_comm_ST_Psi == 0) Call->out[LeaderOut] = 1;
|
---|
| 392 | if (P->Par.me_comm_ST == 0) Call->out[StepLeaderOut] = 1;
|
---|
| 393 | break;
|
---|
| 394 | case OutMore:
|
---|
| 395 | if (P->Par.me_comm_ST_Psi == 0) Call->out[LeaderOut] = 1;
|
---|
| 396 | if (P->Par.me_comm_ST == 0) Call->out[PsiOut] = 1;
|
---|
| 397 | if (P->Par.me_comm_ST_Psi == 0) Call->out[StepLeaderOut] = 1;
|
---|
| 398 | break;
|
---|
| 399 | case OutMoreP:
|
---|
| 400 | if (P->Par.my_color_comm_ST_Psi == 0) Call->out[LeaderOut] = 1;
|
---|
| 401 | if (P->Par.my_color_comm_ST_Psi == 0) Call->out[PsiOut] = 1;
|
---|
| 402 | if (P->Par.my_color_comm_ST_Psi == 0) Call->out[StepLeaderOut] = 1;
|
---|
| 403 | break;
|
---|
| 404 | case OutAll:
|
---|
| 405 | for (i=0; i < MaxOutGroup; i++) Call->out[i] = 1;
|
---|
| 406 | break;
|
---|
| 407 | case OutAllP:
|
---|
| 408 | default:
|
---|
| 409 | for (i=0; i < MaxOutGroup; i++) Call->out[i] = 1;
|
---|
| 410 | }
|
---|
| 411 | }
|
---|