<div dir="ltr">On Mon, Sep 9, 2013 at 10:14 PM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
    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<br>
<br>
  ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)ksp),((PetscObject)ksp)->prefix,"-ksp_view_pre",&viewer,&format,&flg);CHKERRQ(ierr);<br>
  if (flg && !PetscPreLoadingOn) {<br>
    ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);<br>
    ierr = KSPView(ksp,viewer);CHKERRQ(ierr);<br>
    ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);<br>
    ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);<br>
  }<br>
<br>
  ierr = MatViewFromOptions(mat,((PetscObject)ksp)->prefix,"-ksp_view_mat");CHKERRQ(ierr);<br>
  ierr = MatViewFromOptions(premat,((PetscObject)ksp)->prefix,"-ksp_view_pmat");CHKERRQ(ierr);<br>
  ierr = VecViewFromOptions(ksp->vec_rhs,((PetscObject)ksp)->prefix,"-ksp_view_rhs");CHKERRQ(ierr);<br>
<br>
  ierr = PetscOptionsHasName(((PetscObject)ksp)->prefix,"-ksp_view_mat_explicit",&flag2);CHKERRQ(ierr);<br>
  if (flag2) {<br>
    Mat A,B;<br>
    ierr = PCGetOperators(ksp->pc,&A,NULL,NULL);CHKERRQ(ierr);<br>
    ierr = MatComputeExplicitOperator(A,&B);CHKERRQ(ierr);<br>
    ierr = MatViewFromOptions(B,((PetscObject)ksp)->prefix,"-ksp_view_mat_explicit");CHKERRQ(ierr);<br>
    ierr = MatDestroy(&B);CHKERRQ(ierr);<br>
  }<br>
  ierr = PetscOptionsHasName(((PetscObject)ksp)->prefix,"-ksp_view_preconditioned_operator_explicit",&flag2);CHKERRQ(ierr);<br>
  if (flag2) {<br>
    Mat B;<br>
    ierr = KSPComputeExplicitOperator(ksp,&B);CHKERRQ(ierr);<br>
    ierr = MatViewFromOptions(B,((PetscObject)ksp)->prefix,"-ksp_view_preconditioned_operator_explicit");CHKERRQ(ierr);<br>
    ierr = MatDestroy(&B);CHKERRQ(ierr);<br>
  }<br>
  ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)ksp),((PetscObject)ksp)->prefix,"-ksp_view",&viewer,&format,&flg);CHKERRQ(ierr);<br>
  if (flg && !PetscPreLoadingOn) {<br>
    ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);<br>
    ierr = KSPView(ksp,viewer);CHKERRQ(ierr);<br>
    ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);<br>
    ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);<br>
  }<br>
<br>
   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.<br>

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

viewers are suitably destroyed.<br>
<br>
   Does anyone see a better alternative?</blockquote><div><br></div><div>This has a problem if you follow your reasoning about Vec. You did not want VecSetFromOptions called internally, which</div><div>is a good thing because users should be in charge of configuration. However, viewing is not configuration, so I would</div>
<div>propose a split of diagnostic options, which should probably always be accepted, and configuration options, which should</div><div>depend on calling SetFromOptions(). I have not better idea than ViewFromOptions().</div>
<div><br></div><div>    Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888"><br>
    Barry<br>
<br>
<br>
<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>
-- Norbert Wiener
</div></div>