| 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
|
|
|