/* PFStringCreateFunction - Creates a function from a string Collective over PF Input Parameters: + pf - the function object - string - the string that defines the function Output Parameter: . f - the function pointer. .seealso: PFSetFromOptions() */ PetscErrorCode PETSCVEC_DLLEXPORT PFStringCreateFunction(PF pf,char *string,void **f) { #if defined(PETSC_USE_DYNAMIC_LIBRARIES) PetscErrorCode ierr; char task[1024],tmp[256],lib[PETSC_MAX_PATH_LEN],username[64]; FILE *fd; PetscTruth tmpshared,wdshared,keeptmpfiles = PETSC_FALSE; MPI_Comm comm; #endif PetscFunctionBegin; #if defined(PETSC_USE_DYNAMIC_LIBRARIES) ierr = PetscStrfree(pf->data);CHKERRQ(ierr); ierr = PetscStrallocpy(string,(char**)&pf->data);CHKERRQ(ierr); /* create the new C function and compile it */ ierr = PetscSharedTmp(((PetscObject)pf)->comm,&tmpshared);CHKERRQ(ierr); ierr = PetscSharedWorkingDirectory(((PetscObject)pf)->comm,&wdshared);CHKERRQ(ierr); if (tmpshared) { /* do it in /tmp since everyone has one */ ierr = PetscGetTmp(((PetscObject)pf)->comm,tmp,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); comm = ((PetscObject)pf)->comm; } else if (!wdshared) { /* each one does in private /tmp */ ierr = PetscGetTmp(((PetscObject)pf)->comm,tmp,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); comm = PETSC_COMM_SELF; } else { /* do it in current directory */ ierr = PetscStrcpy(tmp,".");CHKERRQ(ierr); comm = ((PetscObject)pf)->comm; } ierr = PetscOptionsGetTruth(((PetscObject)pf)->prefix,"-pf_string_keep_files",&keeptmpfiles,PETSC_NULL);CHKERRQ(ierr); if (keeptmpfiles) { sprintf(task,"cd %s ; mkdir ${USERNAME} ; cd ${USERNAME} ; \\cp -f ${PETSC_DIR}/src/pf/impls/string/makefile ./makefile ; ke MIN=%d NOUT=%d petscdlib STRINGFUNCTION=\"%s\" ; sync\n",tmp,(int)pf->dimin,(int)pf->dimout,string); } else { sprintf(task,"cd %s ; mkdir ${USERNAME} ;cd ${USERNAME} ; \\cp -f ${PETSC_DIR}/src/pf/impls/string/makefile ./makefile ; make MIN=%d NOUT=%d -f makefile petscdlib STRINGFUNCTION=\"%s\" ; \\rm -f makefile petscdlib.c libpetscdlib.a ; sync\n",tmp,(int)pf->dimin,(int)pf->dimout,string); } #if defined(PETSC_HAVE_POPEN) ierr = PetscPOpen(comm,PETSC_NULL,task,"r",&fd);CHKERRQ(ierr); ierr = PetscPClose(comm,fd);CHKERRQ(ierr); #else SETERRQ(PETSC_ERR_SUP_SYS,"Cannot run external programs on this machine"); #endif ierr = MPI_Barrier(comm);CHKERRQ(ierr); /* load the apply function from the dynamic library */ ierr = PetscGetUserName(username,64);CHKERRQ(ierr); sprintf(lib,"%s/%s/libpetscdlib",tmp,username); ierr = PetscDLLibrarySym(comm,PETSC_NULL,lib,"PFApply_String",f);CHKERRQ(ierr); #endif PetscFunctionReturn(0); }
END_TEST START_TEST( test_PetscTemp ) { PetscErrorCode ierr; size_t len = 100; char* dir; PetscMalloc( len, &dir); ierr = PetscGetTmp( PETSC_COMM_WORLD, dir, len); CHKERRQ(ierr); printf("\n\nDIR: %s\n\n", dir); ierr = PetscFree(dir); CHKERRQ(ierr); PetscReal data[4] = {6,2,3,4}; ierr = WriteVectorArray("tempdir",4,data); CHKERRQ(ierr); ierr = WriteVectorArray("tempdir1",4,data); CHKERRQ(ierr); ierr = WriteVectorArray("tempdir2",4,data); CHKERRQ(ierr); ierr = WriteVectorArray("tempdir3",4,data); CHKERRQ(ierr); }