| [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 | } | 
|---|