Previously we often checked the options for -xxx_view directly in various
solvers and other pieces of code. For example in KSPSolve alone we have
ierr =
PetscOptionsGetViewer(PetscObjectComm((PetscObject)ksp),((PetscObject)ksp)->prefix,"-ksp_view_pre",&viewer,&format,&flg);CHKERRQ(ierr);
if (flg && !PetscPreLoadingOn) {
ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
ierr = KSPView(ksp,viewer);CHKERRQ(ierr);
ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
}
ierr =
MatViewFromOptions(mat,((PetscObject)ksp)->prefix,"-ksp_view_mat");CHKERRQ(ierr);
ierr =
MatViewFromOptions(premat,((PetscObject)ksp)->prefix,"-ksp_view_pmat");CHKERRQ(ierr);
ierr =
VecViewFromOptions(ksp->vec_rhs,((PetscObject)ksp)->prefix,"-ksp_view_rhs");CHKERRQ(ierr);
ierr =
PetscOptionsHasName(((PetscObject)ksp)->prefix,"-ksp_view_mat_explicit",&flag2);CHKERRQ(ierr);
if (flag2) {
Mat A,B;
ierr = PCGetOperators(ksp->pc,&A,NULL,NULL);CHKERRQ(ierr);
ierr = MatComputeExplicitOperator(A,&B);CHKERRQ(ierr);
ierr =
MatViewFromOptions(B,((PetscObject)ksp)->prefix,"-ksp_view_mat_explicit");CHKERRQ(ierr);
ierr = MatDestroy(&B);CHKERRQ(ierr);
}
ierr =
PetscOptionsHasName(((PetscObject)ksp)->prefix,"-ksp_view_preconditioned_operator_explicit",&flag2);CHKERRQ(ierr);
if (flag2) {
Mat B;
ierr = KSPComputeExplicitOperator(ksp,&B);CHKERRQ(ierr);
ierr =
MatViewFromOptions(B,((PetscObject)ksp)->prefix,"-ksp_view_preconditioned_operator_explicit");CHKERRQ(ierr);
ierr = MatDestroy(&B);CHKERRQ(ierr);
}
ierr =
PetscOptionsGetViewer(PetscObjectComm((PetscObject)ksp),((PetscObject)ksp)->prefix,"-ksp_view",&viewer,&format,&flg);CHKERRQ(ierr);
if (flg && !PetscPreLoadingOn) {
ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
ierr = KSPView(ksp,viewer);CHKERRQ(ierr);
ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
}
I think these actually belong in KSPSetFromOptions(). Note that currently
these do not have help messages nor would they go into any GUI option setting
system plus the options may be checked many times outside the control of the
user.
The problem is many of them involve creating a viewer object (and format) which
must be destroyed later. I propose putting them all in XXXSetFromOptions() and
with each one using a PetscObjectCompose() to attach them to the XXX object so
that when the XXX object is destroyed these
viewers are suitably destroyed.
Does anyone see a better alternative?
Barry