xref: /petsc/src/vec/pf/impls/string/cstring.c (revision cc868d588e6525025db9ed956a5d931ad4fcc224)
1 
2 #include "src/vec/pf/pfimpl.h"            /*I "petscpf.h" I*/
3 
4 /*
5         Ths PF generates a function on the fly and loads it into the running
6    program.
7 */
8 
9 #undef __FUNCT__
10 #define __FUNCT__ "PFView_String"
11 PetscErrorCode PFView_String(void *value,PetscViewer viewer)
12 {
13   PetscErrorCode ierr;
14   PetscTruth iascii;
15 
16   PetscFunctionBegin;
17   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
18   if (iascii) {
19     ierr = PetscViewerASCIIPrintf(viewer,"String = %s\n",(char*)value);CHKERRQ(ierr);
20   }
21   PetscFunctionReturn(0);
22 }
23 
24 #undef __FUNCT__
25 #define __FUNCT__ "PFDestroy_String"
26 PetscErrorCode PFDestroy_String(void *value)
27 {
28   PetscErrorCode ierr;
29 
30   PetscFunctionBegin;
31   ierr = PetscStrfree(value);CHKERRQ(ierr);
32   PetscFunctionReturn(0);
33 }
34 
35 #undef __FUNCT__
36 #define __FUNCT__ "PFStringCreateFunction"
37 /*
38     PFStringCreateFunction - Creates a function from a string
39 
40    Collective over PF
41 
42   Input Parameters:
43 +    pf - the function object
44 -    string - the string that defines the function
45 
46   Output Parameter:
47 .    f - the function pointer.
48 
49 .seealso: PFSetFromOptions()
50 
51 */
52 PetscErrorCode PFStringCreateFunction(PF pf,char *string,void **f)
53 {
54 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
55   PetscErrorCode ierr;
56   char       task[1024],tmp[256],lib[PETSC_MAX_PATH_LEN],username[64];
57   FILE       *fd;
58   PetscTruth tmpshared,wdshared,keeptmpfiles = PETSC_FALSE;
59   MPI_Comm   comm;
60 #endif
61 
62   PetscFunctionBegin;
63 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
64   ierr = PetscStrfree(pf->data);CHKERRQ(ierr);
65   ierr = PetscStrallocpy(string,(char**)&pf->data);CHKERRQ(ierr);
66 
67   /* create the new C function and compile it */
68   ierr = PetscSharedTmp(pf->comm,&tmpshared);CHKERRQ(ierr);
69   ierr = PetscSharedWorkingDirectory(pf->comm,&wdshared);CHKERRQ(ierr);
70   if (tmpshared) {  /* do it in /tmp since everyone has one */
71     ierr = PetscGetTmp(pf->comm,tmp,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
72     comm = pf->comm;
73   } else if (!wdshared) {  /* each one does in private /tmp */
74     ierr = PetscGetTmp(pf->comm,tmp,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
75     comm = PETSC_COMM_SELF;
76   } else { /* do it in current directory */
77     ierr = PetscStrcpy(tmp,".");CHKERRQ(ierr);
78     comm = pf->comm;
79   }
80   ierr = PetscOptionsHasName(pf->prefix,"-pf_string_keep_files",&keeptmpfiles);CHKERRQ(ierr);
81   if (keeptmpfiles) {
82     sprintf(task,"cd %s ; mkdir ${USERNAME} ; cd ${USERNAME} ; \\cp -f ${PETSC_DIR}/src/pf/impls/string/makefile ./makefile ; make BOPT=${BOPT} MIN=%d NOUT=%d petscdlib STRINGFUNCTION=\"%s\" ; sync\n",tmp,pf->dimin,pf->dimout,string);
83   } else {
84     sprintf(task,"cd %s ; mkdir ${USERNAME} ;cd ${USERNAME} ; \\cp -f ${PETSC_DIR}/src/pf/impls/string/makefile ./makefile ; make BOPT=${BOPT} MIN=%d NOUT=%d -f makefile petscdlib STRINGFUNCTION=\"%s\" ; \\rm -f makefile petscdlib.c libpetscdlib.a ;  sync\n",tmp,pf->dimin,pf->dimout,string);
85   }
86   ierr = PetscPOpen(comm,PETSC_NULL,task,"r",&fd);CHKERRQ(ierr);
87   ierr = PetscPClose(comm,fd);CHKERRQ(ierr);
88 
89   ierr = MPI_Barrier(comm);CHKERRQ(ierr);
90 
91   /* load the apply function from the dynamic library */
92   ierr = PetscGetUserName(username,64);CHKERRQ(ierr);
93   sprintf(lib,"%s/%s/libpetscdlib",tmp,username);
94   ierr = PetscDLLibrarySym(comm,PETSC_NULL,lib,"PFApply_String",f);CHKERRQ(ierr);
95 #endif
96   PetscFunctionReturn(0);
97 }
98 
99 #undef __FUNCT__
100 #define __FUNCT__ "PFSetFromOptions_String"
101 PetscErrorCode PFSetFromOptions_String(PF pf)
102 {
103   PetscErrorCode ierr;
104   PetscTruth flag;
105   char       value[PETSC_MAX_PATH_LEN];
106   PetscErrorCode (*f)(void*,PetscInt,PetscScalar*,PetscScalar*) = 0;
107 
108   PetscFunctionBegin;
109   ierr = PetscOptionsHead("String function options");CHKERRQ(ierr);
110     ierr = PetscOptionsString("-pf_string","Enter the function","PFStringCreateFunction","",value,PETSC_MAX_PATH_LEN,&flag);CHKERRQ(ierr);
111     if (flag) {
112       ierr = PFStringCreateFunction(pf,value,(void**)&f);CHKERRQ(ierr);
113       pf->ops->apply = f;
114     }
115   ierr = PetscOptionsTail();CHKERRQ(ierr);
116   PetscFunctionReturn(0);
117 }
118 
119 typedef PetscErrorCode (*FCN)(void*,PetscInt,PetscScalar*,PetscScalar*); /* force argument to next function to not be extern C*/
120 EXTERN_C_BEGIN
121 #undef __FUNCT__
122 #define __FUNCT__ "PFCreate_String"
123 PetscErrorCode PFCreate_String(PF pf,void *value)
124 {
125   PetscErrorCode ierr;
126   FCN        f = 0;
127 
128   PetscFunctionBegin;
129   if (value) {
130     ierr = PFStringCreateFunction(pf,(char*)value,(void**)&f);CHKERRQ(ierr);
131   }
132   ierr   = PFSet(pf,f,PETSC_NULL,PFView_String,PFDestroy_String,PETSC_NULL);CHKERRQ(ierr);
133   pf->ops->setfromoptions = PFSetFromOptions_String;
134   PetscFunctionReturn(0);
135 }
136 EXTERN_C_END
137 
138 
139 
140 
141 
142