00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 static char const Id[] = "$Id: hext_py.c 2983 2010-02-22 22:56:23Z scholz $\n\n";
00026 static char const Td[] = "$Today: " __FILE__ "  " __DATE__ "  "  __TIME__  " $\n\n";
00027 
00028 #include "field.h"
00029 #include "util/util.h"
00030 
00031 static int       doinit=1;
00032 static int       fieldon=0;
00033 static Vec       VHthis;
00034 static PetscReal hextamp=0.0;
00035 
00036 int Hext_py_Init(GridData *gdata)
00037 {
00038   MagparFunctionLogBegin;
00039 
00040   PetscTruth flg;
00041   char str[256];
00042   ierr = PetscOptionsGetString(PETSC_NULL,"-hext_py",str,256,&flg);CHKERRQ(ierr);
00043   if (flg!=PETSC_TRUE) {
00044     fieldon=0;
00045     PetscPrintf(PETSC_COMM_WORLD,
00046       "Option -hext_py not found, using default value: %i (field off)\n",
00047       fieldon
00048     );
00049   }
00050   else {
00051     fieldon=1;
00052   }
00053 
00054   if (!fieldon) {
00055     PetscPrintf(PETSC_COMM_WORLD,"Hext_py off\n");
00056     MagparFunctionLogReturn(0);
00057   }
00058 
00059 #ifdef PYTHON
00060   PetscPrintf(PETSC_COMM_WORLD,"Hext_py on, using Python script: %s\n",str);
00061 
00062   ierr = VecDuplicate(gdata->M,&VHthis);CHKERRQ(ierr);
00063 
00064   
00065 
00066   PyObject *pFunc;
00067   pFunc=PyObject_GetAttrString(gdata->pModule,str);  
00068   if(!pFunc) {
00069     SETERRQ1(PETSC_ERR_ARG_CORRUPT,"Cannot find Python function %s!\n",str);
00070   }
00071   if (!PyCallable_Check(pFunc)) {
00072     SETERRQ1(PETSC_ERR_ARG_CORRUPT,"Python object %s is not callable (not a function)!\n",str);
00073   }
00074 
00075   
00076   PyObject *pTuple;
00077   pTuple = PyTuple_New(ND); 
00078 
00079   PyObject *pVal=PETSC_NULL;
00080 
00081   
00082   PetscReal *ta_Hext;
00083   ierr = VecGetArray(VHthis,&ta_Hext);CHKERRQ(ierr);
00084 
00085   
00086   for (int j=0; j<gdata->ln_vert; j++) {
00087     ierr = ProgressBar(j,gdata->ln_vert,10);
00088     PetscReal x,y,z;
00089     x=gdata->vertxyz[ND*gdata->vertl2g[j]+0];
00090     y=gdata->vertxyz[ND*gdata->vertl2g[j]+1];
00091     z=gdata->vertxyz[ND*gdata->vertl2g[j]+2];
00092 
00093     PyTuple_SetItem(pTuple,0,PyFloat_FromDouble(x)); 
00094     PyTuple_SetItem(pTuple,1,PyFloat_FromDouble(y));
00095     PyTuple_SetItem(pTuple,2,PyFloat_FromDouble(z));
00096 
00097     
00098     pVal = PyObject_CallObject(pFunc,pTuple);  
00099 
00100     
00101     for (int i=0; i<ND; i++) {
00102       ta_Hext[ND*j+i]=PyFloat_AsDouble(PyTuple_GetItem(pVal,i));
00103     }
00104   }
00105   ierr = ProgressBar(1,1,10);
00106   ierr = VecRestoreArray(VHthis,&ta_Hext);CHKERRQ(ierr);
00107 
00108   
00109   Py_DECREF(pFunc);
00110   Py_DECREF(pTuple);
00111   Py_DECREF(pVal);
00112 
00113   int k;
00114   ierr = VecMax(VHthis,&k,&hextamp);CHKERRQ(ierr);
00115 #else
00116   SETERRQ(PETSC_ERR_ARG_CORRUPT,"magpar not linked with Python interpreter. Cannot execute Python scripts!\n");
00117 #endif
00118 
00119   MagparFunctionLogReturn(0);
00120 }
00121 
00122 
00123 int hext_f(GridData *gdata, PetscReal time_ns)
00124 {
00125 #ifdef PYTHON
00126   MagparFunctionInfoBegin;
00127 
00128   char str[256]="hext_f";
00129   PyObject *pFunc;
00130   pFunc=PyObject_GetAttrString(gdata->pModule,str);  
00131   if(!pFunc) {
00132     SETERRQ1(PETSC_ERR_ARG_CORRUPT,"Cannot find Python function %s!\n",str);
00133   }
00134   if (!PyCallable_Check(pFunc)) {
00135     SETERRQ1(PETSC_ERR_ARG_CORRUPT,"Python object %s is not callable (not a function)!\n",str);
00136   }
00137 
00138   
00139   PyObject *pTuple;
00140   pTuple = PyTuple_New(ND); 
00141 
00142   PyObject *pVal=PETSC_NULL;
00143 
00144   PyTuple_SetItem(pTuple,0,PyFloat_FromDouble(time_ns)); 
00145 
00146   
00147   pVal = PyObject_CallObject(pFunc,pTuple);  
00148 
00149   PetscReal f;
00150   f=PyFloat_AsDouble(PyTuple_GetItem(pVal,0));
00151 
00152   
00153   Py_DECREF(pFunc);
00154   Py_DECREF(pTuple);
00155   Py_DECREF(pVal);
00156 
00157   MagparFunctionInfoReturn(f);
00158 #else
00159   SETERRQ(PETSC_ERR_ARG_CORRUPT,"magpar not linked with Python interpreter. Cannot execute Python scripts!\n");
00160 #endif
00161 }
00162 
00163 int Hext_py(GridData *gdata,Vec VHextsum,PetscReal *hext)
00164 {
00165   MagparFunctionInfoBegin;
00166 
00167   
00168 
00169   if (doinit) {
00170     ierr = Hext_py_Init(gdata);CHKERRQ(ierr);
00171     doinit=0;
00172   }
00173   if (!fieldon) {
00174     MagparFunctionInfoReturn(0);
00175   }
00176 
00177   ierr = VecAXPY(VHextsum,1.0,VHthis);CHKERRQ(ierr);
00178 
00179   
00180   PetscReal nstime;
00181   nstime=gdata->time*gdata->tscale*1e9;
00182 
00183   
00184   PetscReal hext2;
00185 
00186 #if 0
00187   hext2=hext_f(gdata,nstime);
00188 #else
00189   hext2=0;
00190 #endif
00191 
00192   ierr = VecAXPY(VHextsum,hext2,VHthis);CHKERRQ(ierr);
00193 
00194   *hext=hextamp;
00195 
00196   MagparFunctionProfReturn(0);
00197 }
00198