static PetscErrorCode PetscHTTPBuildRequest(const char type[],const char url[],const char header[],const char ctype[],const char body[],char **outrequest) { char *request=0; char contentlength[40],contenttype[80],*path,*host; size_t request_len,headlen,bodylen,contentlen,pathlen,hostlen,typelen,contenttypelen = 0; PetscErrorCode ierr; PetscBool flg; PetscFunctionBegin; ierr = PetscStrallocpy(url,&host);CHKERRQ(ierr); ierr = PetscStrchr(host,'/',&path);CHKERRQ(ierr); if (!path) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"url must contain / it is %s",url); *path = 0; ierr = PetscStrlen(host,&hostlen);CHKERRQ(ierr); ierr = PetscStrchr(url,'/',&path);CHKERRQ(ierr); ierr = PetscStrlen(path,&pathlen);CHKERRQ(ierr); if (header) { ierr = PetscStrendswith(header,"\r\n",&flg);CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"header must end with \\r\\n"); } ierr = PetscStrlen(type,&typelen);CHKERRQ(ierr); if (ctype) { ierr = PetscSNPrintf(contenttype,80,"Content-Type: %s\r\n",ctype);CHKERRQ(ierr); ierr = PetscStrlen(contenttype,&contenttypelen);CHKERRQ(ierr); } ierr = PetscStrlen(header,&headlen);CHKERRQ(ierr); ierr = PetscStrlen(body,&bodylen);CHKERRQ(ierr); ierr = PetscSNPrintf(contentlength,40,"Content-Length: %d\r\n\r\n",(int)bodylen);CHKERRQ(ierr); ierr = PetscStrlen(contentlength,&contentlen);CHKERRQ(ierr); /* Now construct our HTTP request */ request_len = typelen + 1 + pathlen + hostlen + 100 + headlen + contenttypelen + contentlen + bodylen + 1; ierr = PetscMalloc1(request_len,&request);CHKERRQ(ierr); ierr = PetscStrcpy(request,type);CHKERRQ(ierr); ierr = PetscStrcat(request," ");CHKERRQ(ierr); ierr = PetscStrcat(request,path);CHKERRQ(ierr); ierr = PetscStrcat(request," HTTP/1.1\r\nHost: ");CHKERRQ(ierr); ierr = PetscStrcat(request,host);CHKERRQ(ierr); ierr = PetscFree(host);CHKERRQ(ierr); ierr = PetscStrcat(request,"\r\nUser-Agent:PETScClient\r\n");CHKERRQ(ierr); ierr = PetscStrcat(request,header);CHKERRQ(ierr); if (ctype) { ierr = PetscStrcat(request,contenttype);CHKERRQ(ierr); } ierr = PetscStrcat(request,contentlength);CHKERRQ(ierr); ierr = PetscStrcat(request,body);CHKERRQ(ierr); ierr = PetscStrlen(request,&request_len);CHKERRQ(ierr); ierr = PetscInfo1(NULL,"HTTPS request follows: \n%s\n",request);CHKERRQ(ierr); *outrequest = request; PetscFunctionReturn(0); }
/* Removes trailing zeros */ PetscErrorCode PetscStripTrailingZeros(char *buf) { PetscErrorCode ierr; char *found; size_t i,n,m = PETSC_MAX_INT; PetscFunctionBegin; /* if there is an e in string DO NOT strip trailing zeros */ ierr = PetscStrchr(buf,'e',&found);CHKERRQ(ierr); if (found) PetscFunctionReturn(0); ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); /* locate decimal point */ for (i=0; i<n; i++) { if (buf[i] == '.') {m = i; break;} } /* if not decimal point then no zeros to remove */ if (m == PETSC_MAX_INT) PetscFunctionReturn(0); /* start at right end of string removing 0s */ for (i=n-1; i>m; i++) { if (buf[i] != '0') PetscFunctionReturn(0); buf[i] = 0; } PetscFunctionReturn(0); }
/*@C PetscGetHostName - Returns the name of the host. This attempts to return the entire Internet name. It may not return the same name as MPI_Get_processor_name(). Not Collective Input Parameter: . nlen - length of name Output Parameter: . name - contains host name. Must be long enough to hold the name This is the fully qualified name, including the domain. Level: developer Concepts: machine name Concepts: host name Fortran Version: In Fortran this routine has the format $ character*(64) name $ call PetscGetHostName(name,ierr) .seealso: PetscGetUserName(),PetscGetArchType() @*/ PetscErrorCode PetscGetHostName(char name[],size_t nlen) { char *domain; PetscErrorCode ierr; #if defined(PETSC_HAVE_UNAME) && !defined(PETSC_HAVE_GETCOMPUTERNAME) struct utsname utname; #endif PetscFunctionBegin; #if defined(PETSC_HAVE_GETCOMPUTERNAME) { size_t nnlen = nlen; GetComputerName((LPTSTR)name,(LPDWORD)(&nnlen)); } #elif defined(PETSC_HAVE_UNAME) uname(&utname); ierr = PetscStrncpy(name,utname.nodename,nlen); CHKERRQ(ierr); #elif defined(PETSC_HAVE_GETHOSTNAME) gethostname(name,nlen); #elif defined(PETSC_HAVE_SYSINFO_3ARG) sysinfo(SI_HOSTNAME,name,nlen); #endif /* if there was not enough room then system call will not null terminate name */ name[nlen-1] = 0; /* See if this name includes the domain */ ierr = PetscStrchr(name,'.',&domain); CHKERRQ(ierr); if (!domain) { size_t l,ll; ierr = PetscStrlen(name,&l); CHKERRQ(ierr); if (l == nlen-1) PetscFunctionReturn(0); name[l++] = '.'; name[l] = 0; #if defined(PETSC_HAVE_SYSINFO_3ARG) sysinfo(SI_SRPC_DOMAIN,name+l,nlen-l); #elif defined(PETSC_HAVE_GETDOMAINNAME) if (getdomainname(name+l,nlen - l)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"getdomainname()"); #endif /* check if domain name is not a dnsdomainname and nuke it */ ierr = PetscStrlen(name,&ll); CHKERRQ(ierr); if (ll > 4) { const char *suffixes[] = {".edu",".com",".net",".org",".mil",0}; PetscInt index; ierr = PetscStrendswithwhich(name,suffixes,&index); CHKERRQ(ierr); if (!suffixes[index]) { ierr = PetscInfo1(0,"Rejecting domainname, likely is NIS %s\n",name); CHKERRQ(ierr); name[l-1] = 0; } } } PetscFunctionReturn(0); }
/*@C PetscGetFileFromPath - Finds a file from a name and a path string. A default can be provided. Not Collective Input Parameters: + path - A string containing "directory:directory:..." (without the quotes, of course). As a special case, if the name is a single FILE, that file is used. . defname - default name . name - file name to use with the directories from env - mode - file mode desired (usually r for readable, w for writable, or e for executable) Output Parameter: . fname - qualified file name Level: developer Developer Notes: Wrongly returns 1 as an error code sometimes. Maybe should have additional flag argument indicating if it found it. Most arguments likely should be const. Concepts: files^finding in path Concepts: path^searching for file @*/ PetscErrorCode PetscGetFileFromPath(char *path,char *defname,char *name,char *fname,char mode) { char *p,*cdir,trial[PETSC_MAX_PATH_LEN],*senv,*env; size_t ln; PetscErrorCode ierr; PetscBool flg; PetscFunctionBegin; /* Setup default */ ierr = PetscGetFullPath(defname,fname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); if (path) { /* Check to see if the path is a valid regular FILE */ ierr = PetscTestFile(path,mode,&flg);CHKERRQ(ierr); if (flg) { ierr = PetscStrcpy(fname,path);CHKERRQ(ierr); PetscFunctionReturn(1); } /* Make a local copy of path and mangle it */ ierr = PetscStrallocpy(path,&senv);CHKERRQ(ierr); env = senv; while (env) { /* Find next directory in env */ cdir = env; ierr = PetscStrchr(env,PETSC_PATH_SEPARATOR,&p);CHKERRQ(ierr); if (p) { *p = 0; env = p + 1; } else env = 0; /* Form trial file name */ ierr = PetscStrcpy(trial,cdir);CHKERRQ(ierr); ierr = PetscStrlen(trial,&ln);CHKERRQ(ierr); if (trial[ln-1] != '/') trial[ln++] = '/'; ierr = PetscStrcpy(trial + ln,name);CHKERRQ(ierr); ierr = PetscTestFile(path,mode,&flg);CHKERRQ(ierr); if (flg) { /* need PetscGetFullPath rather then copy in case path has . in it */ ierr = PetscGetFullPath(trial,fname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); ierr = PetscFree(senv);CHKERRQ(ierr); PetscFunctionReturn(1); } } ierr = PetscFree(senv);CHKERRQ(ierr); } ierr = PetscTestFile(path,mode,&flg);CHKERRQ(ierr); if (flg) PetscFunctionReturn(1); PetscFunctionReturn(0); }
/*@C PetscPullJSONValue - Given a JSON response containing the substring with "key" : "value" where there may or not be spaces around the : returns the value. Input Parameters: + buff - the char array containing the possible values . key - the key of the requested value - valuelen - the length of the array to contain the value associated with the key Output Parameters: + value - the value obtained - found - flag indicating if the value was found in the buff Level: advanced @*/ PetscErrorCode PetscPullJSONValue(const char buff[],const char key[],char value[],size_t valuelen,PetscBool *found) { PetscErrorCode ierr; char *v,*w; char work[256]; size_t len; PetscFunctionBegin; ierr = PetscStrcpy(work,"\"");CHKERRQ(ierr); ierr = PetscStrlcat(work,key,sizeof(work));CHKERRQ(ierr); ierr = PetscStrcat(work,"\":");CHKERRQ(ierr); ierr = PetscStrstr(buff,work,&v);CHKERRQ(ierr); ierr = PetscStrlen(work,&len);CHKERRQ(ierr); if (v) { v += len; } else { work[len++-1] = 0; ierr = PetscStrcat(work," :");CHKERRQ(ierr); ierr = PetscStrstr(buff,work,&v);CHKERRQ(ierr); if (!v) { *found = PETSC_FALSE; PetscFunctionReturn(0); } v += len; } ierr = PetscStrchr(v,'\"',&v);CHKERRQ(ierr); if (!v) { *found = PETSC_FALSE; PetscFunctionReturn(0); } ierr = PetscStrchr(v+1,'\"',&w);CHKERRQ(ierr); if (!w) { *found = PETSC_FALSE; PetscFunctionReturn(0); } *found = PETSC_TRUE; ierr = PetscStrncpy(value,v+1,PetscMin((size_t)(w-v),valuelen));CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscDrawSetSave - Saves images produced in a PetscDraw into a file Collective on PetscDraw Input Parameter: + draw - the graphics context . filename - name of the file, if .ext then uses name of draw object plus .ext using .ext to determine the image type - movieext - if not NULL, produces a movie of all the images Options Database Command: + -draw_save <filename> - filename could be name.ext or .ext (where .ext determines the type of graphics file to save, for example .png) . -draw_save_movie <.ext> - saves a movie to filename.ext . -draw_save_final_image [optional filename] - saves the final image displayed in a window - -draw_save_single_file - saves each new image in the same file, normally each new image is saved in a new file with filename/filename_%d.ext Level: intermediate Concepts: X windows^graphics Notes: You should call this BEFORE creating your image and calling PetscDrawSave(). The supported image types are .png, .gif, .jpg, and .ppm (PETSc chooses the default in that order). Support for .png images requires configure --with-libpng. Support for .gif images requires configure --with-giflib. Support for .jpg images requires configure --with-libjpeg. Support for .ppm images is built-in. The PPM format has no compression (640x480 pixels ~ 900 KiB). The ffmpeg utility must be in your path to make the movie. .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawSetSaveFinalImage() @*/ PetscErrorCode PetscDrawSetSave(PetscDraw draw,const char filename[],const char movieext[]) { const char *savename = NULL; const char *imageext = NULL; char buf[PETSC_MAX_PATH_LEN]; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); if (filename) PetscValidCharPointer(filename,2); if (movieext) PetscValidCharPointer(movieext,2); /* determine save filename and image extension */ if (filename && filename[0]) { ierr = PetscStrchr(filename,'.',(char **)&imageext);CHKERRQ(ierr); if (!imageext) savename = filename; else if (imageext != filename) { size_t l1 = 0,l2 = 0; ierr = PetscStrlen(filename,&l1);CHKERRQ(ierr); ierr = PetscStrlen(imageext,&l2);CHKERRQ(ierr); ierr = PetscStrncpy(buf,filename,l1-l2+1);CHKERRQ(ierr); savename = buf; } } if (!savename) {ierr = PetscObjectGetName((PetscObject)draw,&savename);CHKERRQ(ierr);} ierr = PetscDrawImageCheckFormat(&imageext);CHKERRQ(ierr); if (movieext) {ierr = PetscDrawMovieCheckFormat(&movieext);CHKERRQ(ierr);} if (movieext) draw->savesinglefile = PETSC_FALSE; /* otherwise we cannot generage movies */ if (draw->savesinglefile) { ierr = PetscInfo2(NULL,"Will save image to file %s%s\n",savename,imageext);CHKERRQ(ierr); } else { ierr = PetscInfo3(NULL,"Will save images to file %s/%s_%%d%s\n",savename,savename,imageext);CHKERRQ(ierr); } if (movieext) { ierr = PetscInfo2(NULL,"Will save movie to file %s%s\n",savename,movieext);CHKERRQ(ierr); } draw->savefilecount = 0; ierr = PetscFree(draw->savefilename);CHKERRQ(ierr); ierr = PetscFree(draw->saveimageext);CHKERRQ(ierr); ierr = PetscFree(draw->savemovieext);CHKERRQ(ierr); ierr = PetscStrallocpy(savename,&draw->savefilename);CHKERRQ(ierr); ierr = PetscStrallocpy(imageext,&draw->saveimageext);CHKERRQ(ierr); ierr = PetscStrallocpy(movieext,&draw->savemovieext);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode PetscPythonFindLibrary(char pythonexe[PETSC_MAX_PATH_LEN],char pythonlib[PETSC_MAX_PATH_LEN]) { const char cmdline[] = "-c 'import sys; print(sys.exec_prefix); print(sys.version[:3])'"; char command[PETSC_MAX_PATH_LEN+1+sizeof(cmdline)+1]; char prefix[PETSC_MAX_PATH_LEN],version[8],sep[2]={PETSC_DIR_SEPARATOR, 0},*eol; FILE *fp = NULL; char path[PETSC_MAX_PATH_LEN+1]; PetscBool found = PETSC_FALSE; PetscErrorCode ierr; PetscFunctionBegin; #if defined(PETSC_PYTHON_LIB) ierr = PetscStrcpy(pythonlib,PETSC_PYTHON_LIB);CHKERRQ(ierr); PetscFunctionReturn(0); #endif /* call Python to find out the name of the Python dynamic library */ ierr = PetscStrncpy(command,pythonexe,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); ierr = PetscStrcat(command," ");CHKERRQ(ierr); ierr = PetscStrcat(command,cmdline);CHKERRQ(ierr); #if defined(PETSC_HAVE_POPEN) ierr = PetscPOpen(PETSC_COMM_SELF,NULL,command,"r",&fp);CHKERRQ(ierr); if (!fgets(prefix,sizeof(prefix),fp)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Python: bad output from executable: %s",pythonexe); if (!fgets(version,sizeof(version),fp)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Python: bad output from executable: %s",pythonexe); ierr = PetscPClose(PETSC_COMM_SELF,fp,NULL);CHKERRQ(ierr); #else SETERRQ(PETSC_COMM_SELF,1,"Python: Aborted due to missing popen()"); #endif /* remove newlines */ ierr = PetscStrchr(prefix,'\n',&eol);CHKERRQ(ierr); if (eol) eol[0] = 0; ierr = PetscStrchr(version,'\n',&eol);CHKERRQ(ierr); if (eol) eol[0] = 0; /* test for $prefix/lib64/libpythonX.X[.so]*/ ierr = PetscStrcpy(pythonlib,prefix);CHKERRQ(ierr); ierr = PetscStrcat(pythonlib,sep);CHKERRQ(ierr); ierr = PetscStrcat(pythonlib,"lib64");CHKERRQ(ierr); ierr = PetscTestDirectory(pythonlib,'r',&found);CHKERRQ(ierr); if (found) { ierr = PetscStrcat(pythonlib,sep);CHKERRQ(ierr); ierr = PetscStrcat(pythonlib,"libpython");CHKERRQ(ierr); ierr = PetscStrcat(pythonlib,version);CHKERRQ(ierr); ierr = PetscDLLibraryRetrieve(PETSC_COMM_SELF,pythonlib,path,PETSC_MAX_PATH_LEN,&found);CHKERRQ(ierr); if (found) PetscFunctionReturn(0); } /* test for $prefix/lib/libpythonX.X[.so]*/ ierr = PetscStrcpy(pythonlib,prefix);CHKERRQ(ierr); ierr = PetscStrcat(pythonlib,sep);CHKERRQ(ierr); ierr = PetscStrcat(pythonlib,"lib");CHKERRQ(ierr); ierr = PetscTestDirectory(pythonlib,'r',&found);CHKERRQ(ierr); if (found) { ierr = PetscStrcat(pythonlib,sep);CHKERRQ(ierr); ierr = PetscStrcat(pythonlib,"libpython");CHKERRQ(ierr); ierr = PetscStrcat(pythonlib,version);CHKERRQ(ierr); ierr = PetscDLLibraryRetrieve(PETSC_COMM_SELF,pythonlib,path,PETSC_MAX_PATH_LEN,&found);CHKERRQ(ierr); if (found) PetscFunctionReturn(0); } /* nothing good found */ ierr = PetscMemzero(pythonlib,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); ierr = PetscInfo(0,"Python dynamic library not found\n");CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ PetscAttachDebugger - Attaches the debugger to the running process. Not Collective Level: advanced Concepts: debugger^starting from program Developer Notes: Since this can be called by the error handler should it be calling SETERRQ() and CHKERRQ()? .seealso: PetscSetDebugger() @*/ PetscErrorCode PetscAttachDebugger(void) { #if !defined(PETSC_CANNOT_START_DEBUGGER) int child =0; PetscReal sleeptime=0; PetscErrorCode ierr; char program[PETSC_MAX_PATH_LEN],display[256],hostname[64]; #endif PetscFunctionBegin; #if defined(PETSC_CANNOT_START_DEBUGGER) || !defined(PETSC_HAVE_FORK) (*PetscErrorPrintf)("System cannot start debugger\n"); (*PetscErrorPrintf)("On Cray run program in Totalview debugger\n"); (*PetscErrorPrintf)("On Windows use Developer Studio(MSDEV)\n"); MPI_Abort(PETSC_COMM_WORLD,1); #else ierr = PetscGetDisplay(display,128);CHKERRQ(ierr); ierr = PetscGetProgramName(program,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); if (ierr) { (*PetscErrorPrintf)("Cannot determine program name\n"); PetscFunctionReturn(1); } if (!program[0]) { (*PetscErrorPrintf)("Cannot determine program name\n"); PetscFunctionReturn(1); } child = (int)fork(); if (child < 0) { (*PetscErrorPrintf)("Error in fork() attaching debugger\n"); PetscFunctionReturn(1); } /* Swap role the parent and child. This is (I think) so that control c typed in the debugger goes to the correct process. */ if (child) child = 0; else child = (int)getppid(); if (child) { /* I am the parent, will run the debugger */ const char *args[10]; char pid[10]; PetscInt j,jj; PetscBool isdbx,isidb,isxldb,isxxgdb,isups,isxdb,isworkshop,isddd,iskdbg,islldb; ierr = PetscGetHostName(hostname,64);CHKERRQ(ierr); /* We need to send a continue signal to the "child" process on the alpha, otherwise it just stays off forever */ #if defined(PETSC_NEED_KILL_FOR_DEBUGGER) kill(child,SIGCONT); #endif sprintf(pid,"%d",child); ierr = PetscStrcmp(Debugger,"xxgdb",&isxxgdb);CHKERRQ(ierr); ierr = PetscStrcmp(Debugger,"ddd",&isddd);CHKERRQ(ierr); ierr = PetscStrcmp(Debugger,"kdbg",&iskdbg);CHKERRQ(ierr); ierr = PetscStrcmp(Debugger,"ups",&isups);CHKERRQ(ierr); ierr = PetscStrcmp(Debugger,"xldb",&isxldb);CHKERRQ(ierr); ierr = PetscStrcmp(Debugger,"xdb",&isxdb);CHKERRQ(ierr); ierr = PetscStrcmp(Debugger,"dbx",&isdbx);CHKERRQ(ierr); ierr = PetscStrcmp(Debugger,"idb",&isidb);CHKERRQ(ierr); ierr = PetscStrcmp(Debugger,"workshop",&isworkshop);CHKERRQ(ierr); ierr = PetscStrcmp(Debugger,"lldb",&islldb);CHKERRQ(ierr); if (isxxgdb || isups || isddd) { args[1] = program; args[2] = pid; args[3] = "-display"; args[0] = Debugger; args[4] = display; args[5] = 0; (*PetscErrorPrintf)("PETSC: Attaching %s to %s %s on %s\n",args[0],args[1],pid,hostname); if (execvp(args[0],(char**)args) < 0) { perror("Unable to start debugger"); exit(0); } } else if (iskdbg) { args[1] = "-p"; args[2] = pid; args[3] = program; args[4] = "-display"; args[0] = Debugger; args[5] = display; args[6] = 0; (*PetscErrorPrintf)("PETSC: Attaching %s to %s %s on %s\n",args[0],args[3],pid,hostname); if (execvp(args[0],(char**)args) < 0) { perror("Unable to start debugger"); exit(0); } } else if (isxldb) { args[1] = "-a"; args[2] = pid; args[3] = program; args[4] = "-display"; args[0] = Debugger; args[5] = display; args[6] = 0; (*PetscErrorPrintf)("PETSC: Attaching %s to %s %s on %s\n",args[0],args[1],pid,hostname); if (execvp(args[0],(char**)args) < 0) { perror("Unable to start debugger"); exit(0); } } else if (isworkshop) { args[1] = "-s"; args[2] = pid; args[3] = "-D"; args[4] = "-"; args[0] = Debugger; args[5] = pid; args[6] = "-display"; args[7] = display; args[8] = 0; (*PetscErrorPrintf)("PETSC: Attaching %s to %s on %s\n",args[0],pid,hostname); if (execvp(args[0],(char**)args) < 0) { perror("Unable to start debugger"); exit(0); } } else { j = 0; if (Xterm) { PetscBool cmp; char *tmp,*tmp1; ierr = PetscStrncmp(DebugTerminal,"screen",6,&cmp);CHKERRQ(ierr); if (cmp) display[0] = 0; /* when using screen, we never pass -display */ args[j++] = tmp = DebugTerminal; if (display[0]) { args[j++] = "-display"; args[j++] = display; } while (*tmp) { ierr = PetscStrchr(tmp,' ',&tmp1);CHKERRQ(ierr); if (!tmp1) break; *tmp1 = 0; tmp = tmp1+1; args[j++] = tmp; } } args[j++] = Debugger; jj = j; args[j++] = program; args[j++] = pid; args[j++] = 0; if (isidb) { j = jj; args[j++] = "-pid"; args[j++] = pid; args[j++] = "-gdb"; args[j++] = program; args[j++] = 0; } if (islldb) { j = jj; args[j++] = "-p"; args[j++] = pid; args[j++] = 0; } if (isdbx) { j = jj; #if defined(PETSC_USE_P_FOR_DEBUGGER) args[j++] = "-p"; args[j++] = pid; args[j++] = program; #elif defined(PETSC_USE_LARGEP_FOR_DEBUGGER) args[j++] = "-l"; args[j++] = "ALL"; args[j++] = "-P"; args[j++] = pid; args[j++] = program; #elif defined(PETSC_USE_A_FOR_DEBUGGER) args[j++] = "-a"; args[j++] = pid; #elif defined(PETSC_USE_PID_FOR_DEBUGGER) args[j++] = "-pid"; args[j++] = pid; args[j++] = program; #endif args[j++] = 0; } if (Xterm) { if (display[0]) (*PetscErrorPrintf)("PETSC: Attaching %s to %s of pid %s on display %s on machine %s\n",Debugger,program,pid,display,hostname); else (*PetscErrorPrintf)("PETSC: Attaching %s to %s on pid %s on %s\n",Debugger,program,pid,hostname); if (execvp(args[0],(char**)args) < 0) { perror("Unable to start debugger in xterm"); exit(0); } } else { (*PetscErrorPrintf)("PETSC: Attaching %s to %s of pid %s on %s\n",Debugger,program,pid,hostname); if (execvp(args[0],(char**)args) < 0) { perror("Unable to start debugger"); exit(0); } } } } else { /* I am the child, continue with user code */ sleeptime = 10; /* default to sleep waiting for debugger */ ierr = PetscOptionsGetReal(NULL,"-debugger_pause",&sleeptime,NULL);CHKERRQ(ierr); if (sleeptime < 0) sleeptime = -sleeptime; #if defined(PETSC_NEED_DEBUGGER_NO_SLEEP) /* HP cannot attach process to sleeping debugger, hence count instead */ { PetscReal x = 1.0; int i =10000000; while (i--) x++; /* cannot attach to sleeper */ } #elif defined(PETSC_HAVE_SLEEP_RETURNS_EARLY) /* IBM sleep may return at anytime, hence must see if there is more time to sleep */ { int left = sleeptime; while (left > 0) left = PetscSleep(left) - 1; } #else PetscSleep(sleeptime); #endif } #endif PetscFunctionReturn(0); }
/*@C PetscOptionsGetViewer - Gets a viewer appropriate for the type indicated by the user Collective on MPI_Comm Input Parameters: + comm - the communicator to own the viewer . pre - the string to prepend to the name or NULL - name - the option one is seeking Output Parameter: + viewer - the viewer, pass NULL if not needed . format - the PetscViewerFormat requested by the user, pass NULL if not needed - set - PETSC_TRUE if found, else PETSC_FALSE Level: intermediate Notes: If no value is provided ascii:stdout is used $ ascii[:[filename][:[format][:append]]] defaults to stdout - format can be one of ascii_info, ascii_info_detail, or ascii_matlab, for example ascii::ascii_info prints just the information about the object not all details unless :append is given filename opens in write mode, overwriting what was already there $ binary[:[filename][:[format][:append]]] defaults to the file binaryoutput $ draw[:drawtype] for example, draw:tikz or draw:x $ socket[:port] defaults to the standard output port $ saws[:communicatorname] publishes object to the Scientific Application Webserver (SAWs) Use PetscViewerDestroy() after using the viewer, otherwise a memory leak will occur .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), PetscOptionsFList(), PetscOptionsEList() @*/ PetscErrorCode PetscOptionsGetViewer(MPI_Comm comm,const char pre[],const char name[],PetscViewer *viewer,PetscViewerFormat *format,PetscBool *set) { char *value; PetscErrorCode ierr; PetscBool flag,hashelp; PetscFunctionBegin; PetscValidCharPointer(name,3); ierr = PetscOptionsHasName(NULL,"-help",&hashelp);CHKERRQ(ierr); if (hashelp) { ierr = (*PetscHelpPrintf)(comm," -%s%s ascii[:[filename][:[format][:append]]]: %s (%s)\n",pre ? pre : "",name+1,"Triggers display of a PETSc object to screen or ASCII file","PetscOptionsGetViewer");CHKERRQ(ierr); ierr = (*PetscHelpPrintf)(comm," -%s%s binary[:[filename][:[format][:append]]]: %s (%s)\n",pre ? pre : "",name+1,"Triggers saving of a PETSc object to a binary file","PetscOptionsGetViewer");CHKERRQ(ierr); ierr = (*PetscHelpPrintf)(comm," -%s%s draw[:drawtype]: %s (%s)\n",pre ? pre : "",name+1,"Triggers drawing of a PETSc object","PetscOptionsGetViewer");CHKERRQ(ierr); ierr = (*PetscHelpPrintf)(comm," -%s%s socket[:port]: %s (%s)\n",pre ? pre : "",name+1,"Triggers push of a PETSc object to a Unix socket","PetscOptionsGetViewer");CHKERRQ(ierr); ierr = (*PetscHelpPrintf)(comm," -%s%s saws[:communicatorname]: %s (%s)\n",pre ? pre : "",name+1,"Triggers publishing of a PETSc object to SAWs","PetscOptionsGetViewer");CHKERRQ(ierr); } if (format) *format = PETSC_VIEWER_DEFAULT; if (set) *set = PETSC_FALSE; ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); if (flag) { if (set) *set = PETSC_TRUE; if (!value) { if (viewer) { ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); } } else { char *loc0_vtype,*loc1_fname,*loc2_fmt = NULL,*loc3_fmode = NULL; PetscInt cnt; const char *viewers[] = {PETSCVIEWERASCII,PETSCVIEWERBINARY,PETSCVIEWERDRAW,PETSCVIEWERSOCKET,PETSCVIEWERMATLAB,PETSCVIEWERSAWS,PETSCVIEWERVTK,PETSCVIEWERHDF5,0}; ierr = PetscStrallocpy(value,&loc0_vtype);CHKERRQ(ierr); ierr = PetscStrchr(loc0_vtype,':',&loc1_fname);CHKERRQ(ierr); if (loc1_fname) { *loc1_fname++ = 0; ierr = PetscStrchr(loc1_fname,':',&loc2_fmt);CHKERRQ(ierr); } if (loc2_fmt) { *loc2_fmt++ = 0; ierr = PetscStrchr(loc2_fmt,':',&loc3_fmode);CHKERRQ(ierr); } if (loc3_fmode) *loc3_fmode++ = 0; ierr = PetscStrendswithwhich(*loc0_vtype ? loc0_vtype : "ascii",viewers,&cnt);CHKERRQ(ierr); if (cnt > (PetscInt) sizeof(viewers)-1) SETERRQ1(comm,PETSC_ERR_ARG_OUTOFRANGE,"Unknown viewer type: %s",loc0_vtype); if (viewer) { if (!loc1_fname) { switch (cnt) { case 0: ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); break; case 1: if (!(*viewer = PETSC_VIEWER_BINARY_(comm))) CHKERRQ(PETSC_ERR_PLIB); break; case 2: if (!(*viewer = PETSC_VIEWER_DRAW_(comm))) CHKERRQ(PETSC_ERR_PLIB); break; #if defined(PETSC_USE_SOCKET_VIEWER) case 3: if (!(*viewer = PETSC_VIEWER_SOCKET_(comm))) CHKERRQ(PETSC_ERR_PLIB); break; #endif #if defined(PETSC_HAVE_MATLAB_ENGINE) case 4: if (!(*viewer = PETSC_VIEWER_MATLAB_(comm))) CHKERRQ(PETSC_ERR_PLIB); break; #endif #if defined(PETSC_HAVE_SAWS) case 5: if (!(*viewer = PETSC_VIEWER_SAWS_(comm))) CHKERRQ(PETSC_ERR_PLIB); break; #endif #if defined(PETSC_HAVE_HDF5) case 7: if (!(*viewer = PETSC_VIEWER_HDF5_(comm))) CHKERRQ(PETSC_ERR_PLIB); break; #endif default: SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported viewer %s",loc0_vtype); } ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); } else { if (loc2_fmt && !*loc1_fname && (cnt == 0)) { /* ASCII format without file name */ ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); } else { PetscFileMode fmode; ierr = PetscViewerCreate(comm,viewer);CHKERRQ(ierr); ierr = PetscViewerSetType(*viewer,*loc0_vtype ? loc0_vtype : "ascii");CHKERRQ(ierr); fmode = FILE_MODE_WRITE; if (loc3_fmode && *loc3_fmode) { /* Has non-empty file mode ("write" or "append") */ ierr = PetscEnumFind(PetscFileModes,loc3_fmode,(PetscEnum*)&fmode,&flag);CHKERRQ(ierr); if (!flag) SETERRQ1(comm,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown file mode: %s",loc3_fmode); } ierr = PetscViewerFileSetMode(*viewer,flag?fmode:FILE_MODE_WRITE);CHKERRQ(ierr); ierr = PetscViewerFileSetName(*viewer,loc1_fname);CHKERRQ(ierr); ierr = PetscViewerDrawSetDrawType(*viewer,loc1_fname);CHKERRQ(ierr); } } } if (viewer) { ierr = PetscViewerSetUp(*viewer);CHKERRQ(ierr); } if (loc2_fmt && *loc2_fmt) { ierr = PetscEnumFind(PetscViewerFormats,loc2_fmt,(PetscEnum*)format,&flag);CHKERRQ(ierr); if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unknown viewer format %s",loc2_fmt);CHKERRQ(ierr); } ierr = PetscFree(loc0_vtype);CHKERRQ(ierr); } } PetscFunctionReturn(0); }