Esempio n. 1
0
PetscErrorCode PFApply_Matlab(void *value,PetscInt n,PetscScalar *in,PetscScalar *out)
{
  PF_Matlab      *matlab = (PF_Matlab*)value;
  PetscErrorCode ierr;

  PetscFunctionBegin;
  if (!value) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Need to set string for Matlab function, via -pf_matlab string");
  ierr = PetscMatlabEnginePutArray(matlab->mengine,matlab->dimin,n,in,"x");CHKERRQ(ierr);
  ierr = PetscMatlabEngineEvaluate(matlab->mengine,matlab->string);CHKERRQ(ierr);
  ierr = PetscMatlabEngineGetArray(matlab->mengine,matlab->dimout,n,out,"f");CHKERRQ(ierr);
  PetscFunctionReturn(0);
}
Esempio n. 2
0
int main(int argc, char **argv)
{
  AppCtx         user;
  PetscErrorCode ierr;
  PetscScalar    tmp;
  int            i;

  ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
  ierr = PetscMatlabEngineCreate(PETSC_COMM_SELF,NULL,&user.mengine);CHKERRQ(ierr);
  ierr = PetscMatlabEngineEvaluate(user.mengine,"TestingInitialize");CHKERRQ(ierr);

  for (i = 1; i <= 53; ++i) {
    ierr = PetscPrintf(PETSC_COMM_SELF,"%d\n",i);
    ierr = PetscMatlabEngineEvaluate(user.mengine,"np = %d; ProblemInitialize",i);CHKERRQ(ierr);
    ierr = PetscMatlabEngineGetArray(user.mengine,1,1,&tmp,"n");CHKERRQ(ierr);
    user.n = (int)tmp;
    ierr = PetscMatlabEngineGetArray(user.mengine,1,1,&tmp,"m");CHKERRQ(ierr);
    user.m = (int)tmp;
    ierr = PetscMatlabEngineGetArray(user.mengine,1,1,&tmp,"nfmax");CHKERRQ(ierr);
    user.nfmax = (int)tmp;
    ierr = PetscMatlabEngineGetArray(user.mengine,1,1,&tmp,"npmax");CHKERRQ(ierr);
    user.npmax = (int)tmp;
    ierr = PetscMatlabEngineGetArray(user.mengine,1,1,&tmp,"delta");CHKERRQ(ierr);
    user.delta = (double)tmp;

    /* Ignore return code for now -- do not stop testing on inf or nan errors */
    ierr = TaoPounders(&user);

    ierr = PetscMatlabEngineEvaluate(user.mengine,"ProblemFinalize");CHKERRQ(ierr);
  }

  ierr = PetscMatlabEngineEvaluate(user.mengine,"TestingFinalize");CHKERRQ(ierr);
  ierr = PetscMatlabEngineDestroy(&user.mengine);CHKERRQ(ierr);
  ierr = PetscFinalize();
  return ierr;
}
Esempio n. 3
0
/*
  Given:
    mfqP->delta
    mfqP->Xhist (nHist-array of n-Vec)
    mfqP->Fhist (nHist-array of m-Vec)
    mfqP->minindex

  Computes:
    mfqP->Mdir (array of n-Vec)
    mfqP->nmodelpoints
    mfqP->valid
    mfqP->model_indices (array of integers)
    if (!checkonly):
       mfqP->Gdel (m-array of n-Vec)
       mfqp->Hdel (m-array of nxn Mat)
*/
PetscErrorCode TaoPounders_formquad(TAO_POUNDERS *mfqP,PetscBool checkonly)
{
  PetscErrorCode ierr;
  PetscScalar    *h,tempx[1];
  PetscInt       i,j,*ind;
  const char     *machine="localhost";
  char           name[12];
  Vec            Mind_real;

#ifdef PETSC_HAVE_MATLAB_ENGINE
  if (!mfqP->me) {
    ierr = PetscMatlabEngineCreate(PETSC_COMM_SELF,machine,&mfqP->me);CHKERRQ(ierr);
  }
#endif
  ierr = PetscMatlabEngineEvaluate(me,"Xhist = zeros(%d,%d);",mfqP->nHist,mfqP->n);CHKERRQ(ierr);
  ierr = PetscMatlabEngineEvaluate(me,"Fhist = zeros(%d,%d);",mfqP->nHist,mfqP->n);CHKERRQ(ierr);
  for (i=0;i<mfqP->nHist;i++) {
    snprintf(name,12,"x%010d",(int)i);
    ierr = PetscObjectSetName((PetscObject)(mfqP->Xhist[i]),name);CHKERRQ(ierr);
    ierr = PetscMatlabEnginePut(me,mfqP->Xhist[i]);CHKERRQ(ierr);
    ierr = PetscMatlabEngineEvaluate(me,"Xhist(%d+1,:) = %s;",i,name);CHKERRQ(ierr);
    snprintf(name,12,"f%010d",(int)i);
    ierr = PetscObjectSetName((PetscObject)(mfqP->Fhist[i]),name);CHKERRQ(ierr);
    ierr = PetscMatlabEnginePut(me,mfqP->Fhist[i]);CHKERRQ(ierr);
    ierr = PetscMatlabEngineEvaluate(me,"Fhist(%d,:) = %s;",i,name);CHKERRQ(ierr);
  }
  ierr = PetscMatlabEngineEvaluate(me,"delta=%f;",mfqP->delta);CHKERRQ(ierr);
  ierr = PetscMatlabEngineEvaluate(me,"xkin=%d;",mfqP->xkin+1);CHKERRQ(ierr);
  ierr = PetscMatlabEngineEvaluate(me,"npmax=%d;",mfqP->npmax);CHKERRQ(ierr);
  ierr = PetscMatlabEngineEvaluate(me,"Pars = [%f,%f,%f,%f];",mfqP->par1,mfqP->par2,mfqP->par3,mfqP->par4);CHKERRQ(ierr);
  ierr = PetscMatlabEngineEvaluate(me,"vf=%d;",checkonly?1:0);CHKERRQ(ierr);

  ierr = PetscMatlabEngineEvaluate(me,"[Mdir,np,valid,G,H,Mind] = formquad(X,F,delta,xkin,npmax,Pars,vf);");CHKERRQ(ierr);

  /* Get Mdir */
  ierr = PetscObjectSetName((PetscObject)(mfqP->Mdir),"Mdir");CHKERRQ(ierr);
  ierr = PetscMatlabEngineGet(me,mfqP->Mdir);CHKERRQ(ierr);

  /* Get np */
  ierr = PetscMatlabEngineGetArray(me,1,1,tempx,"np");CHKERRQ(ierr);
  mfqP->nmodelpoints = floor(tempx[0]+0.5);

  /* Get valid */
  ierr = PetscMatlabEngineGetArray(me,1,1,tempx,"valid");CHKERRQ(ierr);
  mfqP->valid = floor(tempx[0]+0.5);

  /* Get Mind */
  ierr = VecCreate(PETSC_COMM_SELF,&Mind_real);
  ierr = PetscObjectSetName((PetscObject)(mfqP->Mind_real),"Mind");CHKERRQ(ierr);
  ierr = PetscMatlabEngineGet(me,mfqP->Mind_real);CHKERRQ(ierr);
  ierr = VecGetArray(mfqP->Mind_real,&v);CHKERRQ(ierr);
  for (i=0;i<mfqP->n;i++) {
    mfqP->model_indices[i] = floor(v[i]+0.5);
  }
  ierr = VecRestoreArray(mfqP->Mind_real,&v);CHKERRQ(ierr);
  ierr = VecDestroy(&Mind_real);CHKERRQ(ierr);

  if (!checkonly) {
    /* Get Gdel */
    for (i=0;i<mfqP->m;i++) {
      snprintf(name,12,"g%010d",(int)i);
      ierr = PetscObjectSetName((PetscObject)(mfqP->Gdel[i]),name);CHKERRQ(ierr);
      ierr = PetscMatlabEngineEvaluate(me,"%s = G(%d+1,:);",name,i);CHKERRQ(ierr);
      ierr = PetscMatlabEngineGet(me,mfqP->Gdel[i]);CHKERRQ(ierr);
    }
    /* Get Hdel */
    for (i=0;i<mfqP->m;i++) {
      snprintf(name,12,"h%010d",(int)i);
      ierr = PetscMatlabeEngineEvaluate(me,"%s = H(:,:,%d+1);",name,i);CHKERRQ(ierr);
      ierr = PetscMatlabEngineGetArray(me,);
    }
  }

  PetscFunctionReturn(0);
}