Subversion Repositories slepc-dev

Rev

Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1990 Rev 1992
Line 12... Line 12...
PetscInt dvd_improvex_PfuncV(dvdDashboard *d, void *funcV, Vec *D,
PetscInt dvd_improvex_PfuncV(dvdDashboard *d, void *funcV, Vec *D,
                             PetscInt max_size_D, PetscInt r_s, PetscInt r_e,
                             PetscInt max_size_D, PetscInt r_s, PetscInt r_e,
                             Vec *auxV, PetscScalar *auxS);
                             Vec *auxV, PetscScalar *auxS);
PetscErrorCode dvd_matmult_jd(Mat A, Vec in, Vec out);
PetscErrorCode dvd_matmult_jd(Mat A, Vec in, Vec out);
PetscErrorCode dvd_matgetvecs_jd(Mat A, Vec *right, Vec *left);
PetscErrorCode dvd_matgetvecs_jd(Mat A, Vec *right, Vec *left);
 
PetscInt dvd_improvex_jd_d(dvdDashboard *d);
PetscInt dvd_improvex_jd_gen(dvdDashboard *d, Vec *D,
PetscInt dvd_improvex_jd_gen(dvdDashboard *d, Vec *D,
                             PetscInt max_size_D, PetscInt r_s,
                             PetscInt max_size_D, PetscInt r_s,
                             PetscInt r_e, PetscInt *size_D);
                             PetscInt r_e, PetscInt *size_D);
PetscInt dvd_improvex_jd_proj_uv_KBXX(dvdDashboard *d, PetscInt i_s,
PetscInt dvd_improvex_jd_proj_uv_KBXX(dvdDashboard *d, PetscInt i_s,
  PetscInt i_e, Vec **u, Vec **v, Vec **kr, Vec **auxV_, PetscScalar *theta,
  PetscInt i_e, Vec **u, Vec **v, Vec **kr, Vec **auxV_, PetscScalar *theta,
Line 103... Line 104...
    data->old_improveX = d->improveX;
    data->old_improveX = d->improveX;
    ierr = PetscTypeCompare((PetscObject)ksp, KSPPREONLY, &t); CHKERRQ(ierr);
    ierr = PetscTypeCompare((PetscObject)ksp, KSPPREONLY, &t); CHKERRQ(ierr);
    data->ksp = t==PETSC_TRUE?0:ksp;
    data->ksp = t==PETSC_TRUE?0:ksp;
    data->d = d;
    data->d = d;
    d->improveX = dvd_improvex_jd_gen;
    d->improveX = dvd_improvex_jd_gen;
    //DVD_FL_ADD(d->destroyList, dvd_improvex_gdolsen_d);
 
 
 
    /* Create the (I-v*u')*K*(A-s*B) matrix */
 
    ierr = MatGetSize(d->A, &rA, &cA); CHKERRQ(ierr);
 
    ierr = MatGetLocalSize(d->A, &rlA, &clA); CHKERRQ(ierr);
 
    ierr = MatCreateShell(((PetscObject)d->A)->comm, rlA*max_bs, clA*max_bs,
 
                          rA*max_bs, cA*max_bs, data, &A); CHKERRQ(ierr);
 
    ierr = MatShellSetOperation(A, MATOP_MULT,
 
                                (void(*)(void))dvd_matmult_jd); CHKERRQ(ierr);
 
    ierr = MatShellSetOperation(A, MATOP_GET_VECS,
 
                                (void(*)(void))dvd_matgetvecs_jd); CHKERRQ(ierr);
 
 
 
    /* Create the reference vector */
    /* Create the reference vector */
    ierr = VecCreateCompWithVecs(d->V, max_bs, PETSC_NULL, &data->friends);
    ierr = VecCreateCompWithVecs(d->V, max_bs, PETSC_NULL, &data->friends);
    CHKERRQ(ierr);
    CHKERRQ(ierr);
 
 
    /* Setup the ksp */
    /* Setup the ksp */
    if(data->ksp) {
    if(data->ksp) {
 
      /* Create the (I-v*u')*K*(A-s*B) matrix */
 
      ierr = MatGetSize(d->A, &rA, &cA); CHKERRQ(ierr);
 
      ierr = MatGetLocalSize(d->A, &rlA, &clA); CHKERRQ(ierr);
 
      ierr = MatCreateShell(((PetscObject)d->A)->comm, rlA*max_bs, clA*max_bs,
 
                            rA*max_bs, cA*max_bs, data, &A); CHKERRQ(ierr);
 
      ierr = MatShellSetOperation(A, MATOP_MULT,
 
                                  (void(*)(void))dvd_matmult_jd); CHKERRQ(ierr);
 
      ierr = MatShellSetOperation(A, MATOP_GET_VECS,
 
                                  (void(*)(void))dvd_matgetvecs_jd);
 
      CHKERRQ(ierr);
 
 
      data->ksp_max_size = max_bs;
      data->ksp_max_size = max_bs;
      ierr = KSPSetOperators(data->ksp, A, A, 0); CHKERRQ(ierr);
      ierr = KSPSetOperators(data->ksp, A, A, 0); CHKERRQ(ierr);
      ierr = KSPSetUp(data->ksp); CHKERRQ(ierr);
      ierr = KSPSetUp(data->ksp); CHKERRQ(ierr);
 
      ierr = MatDestroy(A); CHKERRQ(ierr);
    }
    }
 
 
 
    DVD_FL_ADD(d->destroyList, dvd_improvex_jd_d);
  }
  }
 
 
 
  PetscFunctionReturn(0);
 
}
 
EXTERN_C_END
 
 
 
 
 
EXTERN_C_BEGIN
 
#undef __FUNCT__  
 
#define __FUNCT__ "dvd_improvex_jd_d"
 
PetscInt dvd_improvex_jd_d(dvdDashboard *d)
 
{
 
  PetscErrorCode  ierr;
 
  dvdImprovex_jd  *data = (dvdImprovex_jd*)d->improveX_data;
 
 
 
  PetscFunctionBegin;
 
   
 
  /* Restore changes in dvdDashboard */
 
  d->improveX_data = data->old_improveX_data;
 
 
 
  /* Free local data and objects */
 
  ierr = VecDestroy(data->friends); CHKERRQ(ierr);
 
  ierr = PetscFree(data); CHKERRQ(ierr);
 
 
  PetscFunctionReturn(0);
  PetscFunctionReturn(0);
}
}
EXTERN_C_END
EXTERN_C_END
 
 
Line 364... Line 390...
    ierr = PetscFree(r); CHKERRQ(ierr);
    ierr = PetscFree(r); CHKERRQ(ierr);
  }
  }
  if (left) {
  if (left) {
    ierr = PetscFree(l); CHKERRQ(ierr);
    ierr = PetscFree(l); CHKERRQ(ierr);
  }
  }
 
 
  PetscFunctionReturn(0);
 
}
 
EXTERN_C_END
 
 
 
 
 
 
 
EXTERN_C_BEGIN
 
#undef __FUNCT__  
 
#define __FUNCT__ "dvd_improvex_jd_d"
 
PetscInt dvd_improvex_jd_d(dvdDashboard *d)
 
{
 
  PetscErrorCode  ierr;
 
  dvdImprovex_jd  *data = (dvdImprovex_jd*)d->improveX_data;
 
 
 
  PetscFunctionBegin;
 
   
 
  /* Restore changes in dvdDashboard */
 
  d->improveX_data = data->old_improveX_data;
 
 
 
  /* Free local data */
 
  ierr = PetscFree(data); CHKERRQ(ierr);
 
 
 
  PetscFunctionReturn(0);
  PetscFunctionReturn(0);
}
}
EXTERN_C_END
EXTERN_C_END