std::vector<receiverStruct> receiver::getReceiversFromOptions() { // get number of receivers PetscInt numReceivers; PetscOptionsGetInt(NULL, "--number_of_receivers", &numReceivers, NULL); // get base directory for where to write receivers char dumC[PETSC_MAX_PATH_LEN]; PetscOptionsGetString(NULL, "--base_write_directory", dumC, PETSC_MAX_PATH_LEN, NULL); std::string baseName = dumC; PetscOptionsGetString(NULL, "--iteration_name", dumC, PETSC_MAX_PATH_LEN, NULL); baseName += "/" + std::string(dumC) + "/receivers"; // make the base dir if (MPI::COMM_WORLD.Get_rank() == 0) { mkdir(baseName.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); } // get receiver parameters char *names[numReceivers]; PetscBool dumB = PETSC_FALSE; std::vector<PetscScalar> xs(numReceivers); std::vector<PetscScalar> ys(numReceivers); PetscOptionsGetStringArray(NULL, "--receiver_names", names, &numReceivers, NULL); PetscOptionsGetScalarArray(NULL, "--receiver_x", xs.data(), &numReceivers, NULL); PetscOptionsGetScalarArray(NULL, "--receiver_y", ys.data(), &numReceivers, NULL); PetscOptionsGetBool(NULL, "--write_receivers", &dumB, NULL); // add to structures std::vector<receiverStruct> receivers; for (auto i=0; i<numReceivers; i++) { receiverStruct r; r.name = baseName + "/" + names[i] + ".txt"; r.xLoc = xs[i]; r.yLoc = ys[i]; r.write = dumB; receivers.push_back(r); } return receivers; }
PetscErrorCode DMDASelectFields(DM da,PetscInt *outfields,PetscInt **fields) { PetscErrorCode ierr; PetscInt step,ndisplayfields,*displayfields,k,j; PetscBool flg; PetscFunctionBegin; ierr = DMDAGetInfo(da,0,0,0,0,0,0,0,&step,0,0,0,0,0);CHKERRQ(ierr); ierr = PetscMalloc1(step,&displayfields);CHKERRQ(ierr); for (k=0; k<step; k++) displayfields[k] = k; ndisplayfields = step; ierr = PetscOptionsGetIntArray(NULL,"-draw_fields",displayfields,&ndisplayfields,&flg);CHKERRQ(ierr); if (!ndisplayfields) ndisplayfields = step; if (!flg) { char **fields; const char *fieldname; PetscInt nfields = step; ierr = PetscMalloc1(step,&fields);CHKERRQ(ierr); ierr = PetscOptionsGetStringArray(NULL,"-draw_fields_by_name",fields,&nfields,&flg);CHKERRQ(ierr); if (flg) { ndisplayfields = 0; for (k=0; k<nfields;k++) { for (j=0; j<step; j++) { ierr = DMDAGetFieldName(da,j,&fieldname);CHKERRQ(ierr); ierr = PetscStrcmp(fieldname,fields[k],&flg);CHKERRQ(ierr); if (flg) { goto found; } } SETERRQ1(PetscObjectComm((PetscObject)da),PETSC_ERR_USER,"Unknown fieldname %s",fields[k]); found: displayfields[ndisplayfields++] = j; } } for (k=0; k<nfields; k++) { ierr = PetscFree(fields[k]);CHKERRQ(ierr); } ierr = PetscFree(fields);CHKERRQ(ierr); } *fields = displayfields; *outfields = ndisplayfields; PetscFunctionReturn(0); }
PetscErrorCode Metos3DBGCOutputPrefix(Metos3D *metos3d, char *prefix, PetscInt n, Vec *v) { // work vars PetscInt nmax, i_tracer; PetscBool flag = PETSC_FALSE; char outputDirectory [PETSC_MAX_PATH_LEN]; char *outputFileNames [PETSC_MAX_PATH_LEN]; char outputFileNameFormat[PETSC_MAX_PATH_LEN]; char format [PETSC_MAX_PATH_LEN]; char filePath [PETSC_MAX_PATH_LEN]; PetscFunctionBegin; // output tracer vectors to disk Metos3DUtilOptionsGetString(metos3d, "-Metos3DTracerOutputDirectory", outputDirectory); PetscOptionsGetString(PETSC_NULL, "-Metos3DTracerOutputFileFormat", outputFileNameFormat, PETSC_MAX_PATH_LEN, &flag); if (flag == PETSC_TRUE) { Metos3DUtilFormatParse(metos3d, outputFileNameFormat); for (i_tracer = 0; i_tracer < n; i_tracer++) { sprintf(format, "%s%s%s", outputDirectory, prefix, outputFileNameFormat); sprintf(filePath, format, i_tracer); Metos3DUtilVectorView(metos3d, filePath, &v[i_tracer]); } } else { nmax = n; PetscOptionsGetStringArray(PETSC_NULL, "-Metos3DTracerOutputFile", outputFileNames, &nmax, &flag); if (flag == PETSC_TRUE) { for (i_tracer = 0; i_tracer < n; i_tracer++) { sprintf(filePath, "%s%s%s", outputDirectory, prefix, outputFileNames[i_tracer]); Metos3DUtilVectorView(metos3d, filePath, &v[i_tracer]); PetscFree(outputFileNames[i_tracer]); } } } // debug Metos3DDebug(metos3d, kDebugLevel, "Metos3DBGCOutputPrefix\n"); PetscFunctionReturn(0); }
PetscErrorCode PetscViewerMathematicaSetFromOptions(PetscViewer v) { PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data; char linkname[256]; char modename[256]; char hostname[256]; char type[256]; PetscInt numPorts; PetscInt *ports; PetscInt numHosts; int h; char **hosts; PetscMPIInt size, rank; PetscBool opt; PetscErrorCode ierr; PetscFunctionBegin; ierr = MPI_Comm_size(PetscObjectComm((PetscObject)v), &size); CHKERRQ(ierr); ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)v), &rank); CHKERRQ(ierr); /* Get link name */ ierr = PetscOptionsGetString("viewer_", "-math_linkname", linkname, 256, &opt); CHKERRQ(ierr); if (opt) { ierr = PetscViewerMathematicaSetLinkName(v, linkname); CHKERRQ(ierr); } /* Get link port */ numPorts = size; ierr = PetscMalloc1(size, &ports); CHKERRQ(ierr); ierr = PetscOptionsGetIntArray("viewer_", "-math_linkport", ports, &numPorts, &opt); CHKERRQ(ierr); if (opt) { if (numPorts > rank) snprintf(linkname, 255, "%6d", ports[rank]); else snprintf(linkname, 255, "%6d", ports[0]); ierr = PetscViewerMathematicaSetLinkName(v, linkname); CHKERRQ(ierr); } ierr = PetscFree(ports); CHKERRQ(ierr); /* Get link host */ numHosts = size; ierr = PetscMalloc1(size, &hosts); CHKERRQ(ierr); ierr = PetscOptionsGetStringArray("viewer_", "-math_linkhost", hosts, &numHosts, &opt); CHKERRQ(ierr); if (opt) { if (numHosts > rank) { ierr = PetscStrncpy(hostname, hosts[rank], 255); CHKERRQ(ierr); } else { ierr = PetscStrncpy(hostname, hosts[0], 255); CHKERRQ(ierr); } ierr = PetscViewerMathematicaSetLinkHost(v, hostname); CHKERRQ(ierr); } for (h = 0; h < numHosts; h++) { ierr = PetscFree(hosts[h]); CHKERRQ(ierr); } ierr = PetscFree(hosts); CHKERRQ(ierr); /* Get link mode */ ierr = PetscOptionsGetString("viewer_", "-math_linkmode", modename, 256, &opt); CHKERRQ(ierr); if (opt) { LinkMode mode; ierr = PetscViewerMathematicaParseLinkMode_Private(modename, &mode); CHKERRQ(ierr); ierr = PetscViewerMathematicaSetLinkMode(v, mode); CHKERRQ(ierr); } /* Get graphics type */ ierr = PetscOptionsGetString("viewer_", "-math_graphics", type, 256, &opt); CHKERRQ(ierr); if (opt) { PetscBool isMotif, isPS, isPSFile; ierr = PetscStrcasecmp(type, "Motif", &isMotif); CHKERRQ(ierr); ierr = PetscStrcasecmp(type, "PS", &isPS); CHKERRQ(ierr); ierr = PetscStrcasecmp(type, "PSFile", &isPSFile); CHKERRQ(ierr); if (isMotif) vmath->graphicsType = GRAPHICS_MOTIF; else if (isPS) vmath->graphicsType = GRAPHICS_PS_STDOUT; else if (isPSFile) vmath->graphicsType = GRAPHICS_PS_FILE; } /* Get plot type */ ierr = PetscOptionsGetString("viewer_", "-math_type", type, 256, &opt); CHKERRQ(ierr); if (opt) { PetscBool isTri, isVecTri, isVec, isSurface; ierr = PetscStrcasecmp(type, "Triangulation", &isTri); CHKERRQ(ierr); ierr = PetscStrcasecmp(type, "VectorTriangulation", &isVecTri); CHKERRQ(ierr); ierr = PetscStrcasecmp(type, "Vector", &isVec); CHKERRQ(ierr); ierr = PetscStrcasecmp(type, "Surface", &isSurface); CHKERRQ(ierr); if (isTri) vmath->plotType = MATHEMATICA_TRIANGULATION_PLOT; else if (isVecTri) vmath->plotType = MATHEMATICA_VECTOR_TRIANGULATION_PLOT; else if (isVec) vmath->plotType = MATHEMATICA_VECTOR_PLOT; else if (isSurface) vmath->plotType = MATHEMATICA_SURFACE_PLOT; } PetscFunctionReturn(0); }
/* PetscInitialize_DynamicLibraries - Adds the default dynamic link libraries to the search path. */ PETSC_INTERN PetscErrorCode PetscInitialize_DynamicLibraries(void) { char *libname[32]; PetscErrorCode ierr; PetscInt nmax,i; #if defined(PETSC_USE_DYNAMIC_LIBRARIES) && defined(PETSC_USE_SHARED_LIBRARIES) PetscBool preload; #endif PetscFunctionBegin; nmax = 32; ierr = PetscOptionsGetStringArray(NULL,NULL,"-dll_prepend",libname,&nmax,NULL);CHKERRQ(ierr); for (i=0; i<nmax; i++) { ierr = PetscDLLibraryPrepend(PETSC_COMM_WORLD,&PetscDLLibrariesLoaded,libname[i]);CHKERRQ(ierr); ierr = PetscFree(libname[i]);CHKERRQ(ierr); } #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) || !defined(PETSC_USE_SHARED_LIBRARIES) /* This just initializes the most basic PETSc stuff. The classes, from PetscDraw to PetscTS, are initialized the first time an XXCreate() is called. */ ierr = PetscSysInitializePackage();CHKERRQ(ierr); #else preload = PETSC_FALSE; ierr = PetscOptionsGetBool(NULL,NULL,"-dynamic_library_preload",&preload,NULL);CHKERRQ(ierr); if (preload) { PetscBool found; #if defined(PETSC_USE_SINGLE_LIBRARY) ierr = PetscLoadDynamicLibrary("",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc dynamic library \n You cannot move the dynamic libraries!"); #else ierr = PetscLoadDynamicLibrary("sys",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("vec",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc Vec dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("mat",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc Mat dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("dm",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc DM dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("ksp",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc KSP dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("snes",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc SNES dynamic library \n You cannot move the dynamic libraries!"); ierr = PetscLoadDynamicLibrary("ts",&found);CHKERRQ(ierr); if (!found) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to locate PETSc TS dynamic library \n You cannot move the dynamic libraries!"); #endif } #endif nmax = 32; ierr = PetscOptionsGetStringArray(NULL,NULL,"-dll_append",libname,&nmax,NULL);CHKERRQ(ierr); for (i=0; i<nmax; i++) { ierr = PetscDLLibraryAppend(PETSC_COMM_WORLD,&PetscDLLibrariesLoaded,libname[i]);CHKERRQ(ierr); ierr = PetscFree(libname[i]);CHKERRQ(ierr); } #if defined(PETSC_HAVE_THREADSAFETY) /* These must be done here because it is not safe for individual threads to call these initialize routines */ ierr = AOInitializePackage();CHKERRQ(ierr); ierr = PetscSFInitializePackage();CHKERRQ(ierr); #if !defined(PETSC_USE_COMPLEX) ierr = CharacteristicInitializePackage();CHKERRQ(ierr); #endif ierr = ISInitializePackage();CHKERRQ(ierr); ierr = VecInitializePackage();CHKERRQ(ierr); ierr = MatInitializePackage();CHKERRQ(ierr); ierr = DMInitializePackage();CHKERRQ(ierr); ierr = PCInitializePackage();CHKERRQ(ierr); ierr = KSPInitializePackage();CHKERRQ(ierr); ierr = SNESInitializePackage();CHKERRQ(ierr); ierr = TSInitializePackage();CHKERRQ(ierr); ierr = PetscCommDuplicate(PETSC_COMM_SELF,&PETSC_COMM_SELF_INNER,NULL);CHKERRQ(ierr); ierr = PetscCommDuplicate(PETSC_COMM_WORLD,&PETSC_COMM_WORLD_INNER,NULL);CHKERRQ(ierr); #endif PetscFunctionReturn(0); }
PetscErrorCode Metos3DBGCTracerInit(Metos3D *metos3d) { // load PetscInt nvec = metos3d->vectorLength; PetscInt nvecloc = metos3d->vectorLengthLocal; // work vars PetscInt ntracer, itracer; PetscInt nmax; PetscBool flag; char initFileNameFormat [PETSC_MAX_PATH_LEN]; PetscFunctionBegin; // tracer count Metos3DUtilOptionsGetInt(metos3d, "-Metos3DTracerCount", &ntracer); metos3d->tracerCount = ntracer; // read tracer init options // order: // 1. file name format // 2. file names // 3. constant values PetscOptionsGetString(PETSC_NULL, "-Metos3DTracerInitFileFormat", initFileNameFormat, PETSC_MAX_PATH_LEN, &flag); if (flag == PETSC_TRUE) { // work vars char tracerInputDirectory[PETSC_MAX_PATH_LEN]; char format [PETSC_MAX_PATH_LEN]; char filePath [PETSC_MAX_PATH_LEN]; // input directory, vector, format Metos3DUtilOptionsGetString(metos3d, "-Metos3DTracerInputDirectory", tracerInputDirectory); Metos3DUtilVecCreateAndSetValue(metos3d, ntracer, nvec, nvecloc, &metos3d->y0, 0.0); Metos3DUtilFormatParse(metos3d, initFileNameFormat); for (itracer = 0; itracer < ntracer; itracer++) { sprintf(format, "%s%s", tracerInputDirectory, initFileNameFormat); sprintf(filePath, format, itracer); Metos3DUtilVectorLoad(metos3d, filePath, &metos3d->y0[itracer]); } } else { // work vars char tracerInputDirectory[PETSC_MAX_PATH_LEN]; char *initFileNames [PETSC_MAX_PATH_LEN]; char filePath [PETSC_MAX_PATH_LEN]; // file name nmax = ntracer; PetscOptionsGetStringArray(PETSC_NULL, "-Metos3DTracerInitFile", initFileNames, &nmax, &flag); if (flag == PETSC_TRUE) { // input directory, vector, file name Metos3DUtilOptionsGetString(metos3d, "-Metos3DTracerInputDirectory", tracerInputDirectory); Metos3DUtilVecCreateAndSetValue(metos3d, ntracer, nvec, nvecloc, &metos3d->y0, 0.0); for (itracer = 0; itracer < ntracer; itracer++) { sprintf(filePath, "%s%s", tracerInputDirectory, initFileNames[itracer]); Metos3DUtilVectorLoad(metos3d, filePath, &metos3d->y0[itracer]); PetscFree(initFileNames[itracer]); } } else { // work vars PetscReal *y0value; // value nmax = ntracer; PetscMalloc(nmax*sizeof(PetscReal),&y0value); // array, vector Metos3DUtilOptionsGetRealArray(metos3d, "-Metos3DTracerInitValue", &nmax, y0value); Metos3DUtilVecCreateAndSetValues(metos3d, ntracer, nvec, nvecloc, &metos3d->y0, y0value); PetscFree(y0value); } } // create work vectors Metos3DUtilVecCreateAndSetValue(metos3d, 1, ntracer*nvec, ntracer*nvecloc, &metos3d->ybgcinBD, 0.0); Metos3DUtilVecCreateAndSetValue(metos3d, 1, ntracer*nvec, ntracer*nvecloc, &metos3d->ybgcoutBD, 0.0); Metos3DDebug(metos3d, kDebugLevel, "Metos3DBGCTracerInit\n"); PetscFunctionReturn(0); }
PetscErrorCode Metos3DBGCDomainConditionInit(Metos3D *metos3d) { // work vars PetscInt ndc; PetscFunctionBegin; // count Metos3DUtilOptionsGetInt(metos3d, "-Metos3DDomainConditionCount", &ndc); metos3d->domainConditionCount = ndc; if (ndc > 0) { // geometry PetscInt nvec = metos3d->vectorLength; // load PetscInt nvecloc = metos3d->vectorLengthLocal; // work vars PetscInt *ndcs; char inputDirectory [PETSC_MAX_PATH_LEN]; char *conditionName [PETSC_MAX_PATH_LEN]; char message [PETSC_MAX_PATH_LEN]; char optionName [PETSC_MAX_PATH_LEN]; char fileFormat [PETSC_MAX_PATH_LEN]; char filePath [PETSC_MAX_PATH_LEN]; char fileName [PETSC_MAX_PATH_LEN]; PetscInt nmax, idc, idcs; PetscBool flag; // count array PetscMalloc(ndc*sizeof(PetscInt),&ndcs); metos3d->domainConditionCountArray = ndcs; // input directory Metos3DUtilOptionsGetString(metos3d, "-Metos3DDomainConditionInputDirectory", inputDirectory); // name nmax = ndc; PetscOptionsGetStringArray(PETSC_NULL, "-Metos3DDomainConditionName", conditionName, &nmax, &flag); sprintf(message, "Please provide the '%s' option", "-Metos3DDomainConditionName"); Metos3DFlag(flag, message); // PetscMalloc(ndc*sizeof(Vec*), &metos3d->domainConditionArray); // condition for (idc = 0; idc < ndc; idc++) { Metos3DDebug(metos3d, kDebugLevel, F3S, "Metos3DBGCDomainConditionInit", "name:", conditionName[idc]); // count sprintf(optionName, "-Metos3D%sCount", conditionName[idc]); Metos3DUtilOptionsGetInt(metos3d, optionName, &ndcs[idc]); // name sprintf(optionName, "-Metos3D%sFileFormat", conditionName[idc]); Metos3DUtilOptionsGetString(metos3d, optionName, fileFormat); Metos3DUtilFormatParse(metos3d, fileFormat); // create vector Metos3DUtilVecCreateAndSetValue(metos3d, ndcs[idc], nvec, nvecloc, &metos3d->domainConditionArray[idc], 0.0); // files for (idcs = 0; idcs < ndcs[idc]; idcs++) { // file path sprintf(fileName, fileFormat, idcs); sprintf(filePath, "%s%s", inputDirectory, fileName); // load Metos3DUtilVectorLoad(metos3d, filePath, &metos3d->domainConditionArray[idc][idcs]); } // name PetscFree(conditionName[idc]); } // bgc api Metos3DUtilVecCreateAndSetValue(metos3d, ndc, nvec, nvecloc, &metos3d->bgcdc, 0.0); Metos3DUtilVecCreateAndSetValue(metos3d, 1, ndc*nvec, ndc*nvecloc, &metos3d->bgcdcBD, 0.0); } Metos3DDebug(metos3d, kDebugLevel, "Metos3DBGCDomainConditionInit\n"); PetscFunctionReturn(0); }
PetscErrorCode waitForSignal(PetscInt waitTime) { PetscErrorCode ierr; FILE *fd1; PetscViewer fd; PetscInt iDone=0; PetscInt zero=0; PetscInt one=1; PetscInt fp; PetscInt numsignalfiles = 2; PetscTruth flg; if (firstTime) { ierr = PetscPrintf(PETSC_COMM_WORLD,"Initializing signaling module ...\n");CHKERRQ(ierr); ierr = PetscOptionsGetString(PETSC_NULL,"-signalscript",externalSignalScriptName,PETSC_MAX_PATH_LEN-1,&useExternalSignalScript);CHKERRQ(ierr); ierr = PetscOptionsHasName(PETSC_NULL,"-signalfiles",&useSignalFiles);CHKERRQ(ierr); if ((useExternalSignalScript) && (useSignalFiles)) { SETERRQ(1,"Cannot specify both an external signal script and signal files!"); } if ((!useExternalSignalScript) && (!useSignalFiles)) { SETERRQ(1,"Must specify an external signal script OR signal files!"); } if (useExternalSignalScript) { ierr = PetscPrintf(PETSC_COMM_WORLD,"External signaling script has been specified: %s\n",externalSignalScriptName);CHKERRQ(ierr); } if (useSignalFiles) { ierr = PetscOptionsGetStringArray(PETSC_NULL,"-signalfiles",signalfiles,&numsignalfiles,&flg);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"Signal files have been specified: %s, %s\n",signalfiles[0],signalfiles[1]);CHKERRQ(ierr); ierr = PetscOptionsGetInt(PETSC_NULL,"-signalwaittime",&signalWaitTime,&flg);CHKERRQ(ierr); if (flg) { ierr = PetscPrintf(PETSC_COMM_WORLD,"Signal wait time of %d seconds has been specified\n",signalWaitTime);CHKERRQ(ierr); } else { signalWaitTime = -1; } } firstTime = PETSC_FALSE; } else { if (useExternalSignalScript) { ierr = PetscPOpen(PETSC_COMM_WORLD,PETSC_NULL,externalSignalScriptName,"r",&fd1);CHKERRQ(ierr); ierr = PetscPClose(PETSC_COMM_WORLD,fd1);CHKERRQ(ierr); } else { if (signalWaitTime>0) waitTime = signalWaitTime; /* overwrite with runtime option */ /* overwrite external signal file */ ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,signalfiles[1],FILE_MODE_WRITE,&fd);CHKERRQ(ierr); ierr = PetscViewerBinaryGetDescriptor(fd,&fp);CHKERRQ(ierr); ierr = PetscBinarySynchronizedWrite(PETSC_COMM_WORLD,fp,&zero,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); ierr = PetscViewerDestroy(fd);CHKERRQ(ierr); /* send "ready" signal */ ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,signalfiles[0],&fd);CHKERRQ(ierr); ierr = PetscViewerASCIIPrintf(fd,"%d\n",one);CHKERRQ(ierr); ierr = PetscViewerDestroy(fd);CHKERRQ(ierr); /* wait for external signal */ while (iDone==0) { ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,signalfiles[1],FILE_MODE_READ,&fd);CHKERRQ(ierr); ierr = PetscViewerBinaryGetDescriptor(fd,&fp);CHKERRQ(ierr); ierr = PetscBinarySynchronizedRead(PETSC_COMM_WORLD,fp,&iDone,1,PETSC_INT);CHKERRQ(ierr); ierr = PetscViewerDestroy(fd);CHKERRQ(ierr); PetscSleep(waitTime); } /* send "busy" signal */ ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,signalfiles[0],&fd);CHKERRQ(ierr); ierr = PetscViewerASCIIPrintf(fd,"%d\n",zero);CHKERRQ(ierr); ierr = PetscViewerDestroy(fd);CHKERRQ(ierr); } } return 0; }