On Thu, Nov 14, 2013 at 3:31 PM, Geoffrey Irving <[email protected]> wrote:
> On Thu, Nov 14, 2013 at 3:01 PM, Geoffrey Irving <[email protected]> wrote:
>> On Thu, Nov 14, 2013 at 2:37 PM, Jed Brown <[email protected]> wrote:
>>> Matthew Knepley <[email protected]> writes:
>>>> We are talking about an Apple.
>>>
>>> I believe Geoff is running an adequate operating system on Apple
>>> hardware. ;-)
>>
>> In my defense, I tried Debian first, and fell back to Ubuntu only when
>> I couldn't get it to boot thanks to Apple's trickery.  It's a shame
>> that Ubuntu is only adequate these days.
>
> In any case, ex12 works for me if I remove the -hosts business,
> assuming that packages which "depend on Broken" aren't supposed to be
> run.
>
> Minor refactoring coming up.

Here you go.  What's the preferred way of submitting little patches,
again?  These go on top of next.

Geoffrey
From 069a5ebc8c8a35ca14d86c547c4f323a3ff70173 Mon Sep 17 00:00:00 2001
From: Geoffrey Irving <[email protected]>
Date: Thu, 14 Nov 2013 13:06:29 -0800
Subject: [PATCH 1/2] manual: Fix a typo

---
 src/docs/tex/manual/part2.tex | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/docs/tex/manual/part2.tex b/src/docs/tex/manual/part2.tex
index ad1746f..47575c1 100644
--- a/src/docs/tex/manual/part2.tex
+++ b/src/docs/tex/manual/part2.tex
@@ -7754,7 +7754,7 @@ which can also be represented as the DAG
 \caption{The Hasse diagram for our 2D doublet mesh, expressed as a DAG.}
 \label{fig:doubletSieve}
 \end{figure}
-To use the PETSc API, we first consecutively number the mesh pieces. The PETSc convention is to numbers first cells,
+To use the PETSc API, we first consecutively number the mesh pieces. The PETSc convention is to number first cells,
 then vertices, then faces, and then edges, but the user is free to violate this convention. First, we declare the set of
 points present in a mesh,
 \begin{tabbing}
-- 
1.8.4.1.559.gdb9bdfb

From 8173e5011b00c47eff94ed4df19c296350a51ae3 Mon Sep 17 00:00:00 2001
From: Geoffrey Irving <[email protected]>
Date: Thu, 14 Nov 2013 16:02:38 -0800
Subject: [PATCH 2/2] snes ex12: Deduplicate SetupElement and friends

---
 src/snes/examples/tutorials/ex12.c | 106 ++++++++++---------------------------
 1 file changed, 29 insertions(+), 77 deletions(-)

diff --git a/src/snes/examples/tutorials/ex12.c b/src/snes/examples/tutorials/ex12.c
index e1abfaa..fa6c1aa 100644
--- a/src/snes/examples/tutorials/ex12.c
+++ b/src/snes/examples/tutorials/ex12.c
@@ -343,11 +343,9 @@ PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
 }
 
 #undef __FUNCT__
-#define __FUNCT__ "SetupElement"
-PetscErrorCode SetupElement(DM dm, AppCtx *user)
+#define __FUNCT__ "SetupElementCommon"
+PetscErrorCode SetupElementCommon(DM dm, const PetscInt dim, const char *prefix, const PetscInt qorder, PetscFE *fem)
 {
-  const PetscInt  dim = user->dim;
-  PetscFE         fem;
   PetscQuadrature q;
   DM              K;
   PetscSpace      P;
@@ -358,12 +356,14 @@ PetscErrorCode SetupElement(DM dm, AppCtx *user)
   PetscFunctionBegin;
   /* Create space */
   ierr = PetscSpaceCreate(PetscObjectComm((PetscObject) dm), &P);CHKERRQ(ierr);
+  ierr = PetscObjectSetOptionsPrefix((PetscObject) P, prefix);CHKERRQ(ierr);
   ierr = PetscSpaceSetFromOptions(P);CHKERRQ(ierr);
   ierr = PetscSpacePolynomialSetNumVariables(P, dim);CHKERRQ(ierr);
   ierr = PetscSpaceSetUp(P);CHKERRQ(ierr);
   ierr = PetscSpaceGetOrder(P, &order);CHKERRQ(ierr);
   /* Create dual space */
   ierr = PetscDualSpaceCreate(PetscObjectComm((PetscObject) dm), &Q);CHKERRQ(ierr);
+  ierr = PetscObjectSetOptionsPrefix((PetscObject) Q, prefix);CHKERRQ(ierr);
   ierr = PetscDualSpaceCreateReferenceCell(Q, dim, PETSC_TRUE, &K);CHKERRQ(ierr);
   ierr = PetscDualSpaceSetDM(Q, K);CHKERRQ(ierr);
   ierr = DMDestroy(&K);CHKERRQ(ierr);
@@ -371,16 +371,29 @@ PetscErrorCode SetupElement(DM dm, AppCtx *user)
   ierr = PetscDualSpaceSetFromOptions(Q);CHKERRQ(ierr);
   ierr = PetscDualSpaceSetUp(Q);CHKERRQ(ierr);
   /* Create element */
-  ierr = PetscFECreate(PetscObjectComm((PetscObject) dm), &fem);CHKERRQ(ierr);
-  ierr = PetscFESetFromOptions(fem);CHKERRQ(ierr);
-  ierr = PetscFESetBasisSpace(fem, P);CHKERRQ(ierr);
-  ierr = PetscFESetDualSpace(fem, Q);CHKERRQ(ierr);
-  ierr = PetscFESetNumComponents(fem, 1);CHKERRQ(ierr);
+  ierr = PetscFECreate(PetscObjectComm((PetscObject) dm), fem);CHKERRQ(ierr);
+  ierr = PetscObjectSetOptionsPrefix((PetscObject) *fem, prefix);CHKERRQ(ierr);
+  ierr = PetscFESetFromOptions(*fem);CHKERRQ(ierr);
+  ierr = PetscFESetBasisSpace(*fem, P);CHKERRQ(ierr);
+  ierr = PetscFESetDualSpace(*fem, Q);CHKERRQ(ierr);
+  ierr = PetscFESetNumComponents(*fem, 1);CHKERRQ(ierr);
   ierr = PetscSpaceDestroy(&P);CHKERRQ(ierr);
   ierr = PetscDualSpaceDestroy(&Q);CHKERRQ(ierr);
-  /* Create quadrature */
-  ierr = PetscDTGaussJacobiQuadrature(dim, order, -1.0, 1.0, &q);CHKERRQ(ierr);
-  ierr = PetscFESetQuadrature(fem, q);CHKERRQ(ierr);
+  /* Create quadrature (with specified order if given) */
+  ierr = PetscDTGaussJacobiQuadrature(dim, qorder > 0 ? qorder : order, -1.0, 1.0, &q);CHKERRQ(ierr);
+  ierr = PetscFESetQuadrature(*fem, q);CHKERRQ(ierr);
+  PetscFunctionReturn(0);
+}
+
+#undef __FUNCT__
+#define __FUNCT__ "SetupElement"
+PetscErrorCode SetupElement(DM dm, AppCtx *user)
+{
+  const PetscInt  dim = user->dim;
+  PetscFE         fem;
+  PetscErrorCode  ierr;
+
+  ierr = SetupElementCommon(dm, dim, 0, -1, &fem);CHKERRQ(ierr);
   user->fe[0] = fem;
   user->fem.fe = user->fe;
   PetscFunctionReturn(0);
@@ -393,45 +406,16 @@ PetscErrorCode SetupMaterialElement(DM dm, AppCtx *user)
   const PetscInt  dim = user->dim;
   const char     *prefix = "mat_";
   PetscFE         fem;
-  PetscQuadrature q;
-  DM              K;
   PetscSpace      P;
-  PetscDualSpace  Q;
-  PetscInt        order, qorder;
+  PetscInt        qorder;
   PetscErrorCode  ierr;
 
   PetscFunctionBegin;
   if (user->variableCoefficient != COEFF_FIELD) {user->fem.feAux = NULL; user->feAux[0] = NULL; PetscFunctionReturn(0);}
-  /* Create space */
-  ierr = PetscSpaceCreate(PetscObjectComm((PetscObject) dm), &P);CHKERRQ(ierr);
-  ierr = PetscObjectSetOptionsPrefix((PetscObject) P, prefix);CHKERRQ(ierr);
-  ierr = PetscSpaceSetFromOptions(P);CHKERRQ(ierr);
-  ierr = PetscSpacePolynomialSetNumVariables(P, dim);CHKERRQ(ierr);
-  ierr = PetscSpaceSetUp(P);CHKERRQ(ierr);
-  ierr = PetscSpaceGetOrder(P, &order);CHKERRQ(ierr);
-  /* Create dual space */
-  ierr = PetscDualSpaceCreate(PetscObjectComm((PetscObject) dm), &Q);CHKERRQ(ierr);
-  ierr = PetscObjectSetOptionsPrefix((PetscObject) Q, prefix);CHKERRQ(ierr);
-  ierr = PetscDualSpaceCreateReferenceCell(Q, dim, PETSC_TRUE, &K);CHKERRQ(ierr);
-  ierr = PetscDualSpaceSetDM(Q, K);CHKERRQ(ierr);
-  ierr = DMDestroy(&K);CHKERRQ(ierr);
-  ierr = PetscDualSpaceSetOrder(Q, order);CHKERRQ(ierr);
-  ierr = PetscDualSpaceSetFromOptions(Q);CHKERRQ(ierr);
-  ierr = PetscDualSpaceSetUp(Q);CHKERRQ(ierr);
-  /* Create element */
-  ierr = PetscFECreate(PetscObjectComm((PetscObject) dm), &fem);CHKERRQ(ierr);
-  ierr = PetscObjectSetOptionsPrefix((PetscObject) fem, prefix);CHKERRQ(ierr);
-  ierr = PetscFESetFromOptions(fem);CHKERRQ(ierr);
-  ierr = PetscFESetBasisSpace(fem, P);CHKERRQ(ierr);
-  ierr = PetscFESetDualSpace(fem, Q);CHKERRQ(ierr);
-  ierr = PetscFESetNumComponents(fem, 1);CHKERRQ(ierr);
-  ierr = PetscSpaceDestroy(&P);CHKERRQ(ierr);
-  ierr = PetscDualSpaceDestroy(&Q);CHKERRQ(ierr);
-  /* Create quadrature, must agree with solution quadrature */
+  /* Our quadrature must agree with solution quadrature, so look it up */
   ierr = PetscFEGetBasisSpace(user->fe[0], &P);CHKERRQ(ierr);
   ierr = PetscSpaceGetOrder(P, &qorder);CHKERRQ(ierr);
-  ierr = PetscDTGaussJacobiQuadrature(dim, qorder, -1.0, 1.0, &q);CHKERRQ(ierr);
-  ierr = PetscFESetQuadrature(fem, q);CHKERRQ(ierr);
+  ierr = SetupElementCommon(dm, dim, prefix, qorder, &fem);CHKERRQ(ierr);
   user->feAux[0]  = fem;
   user->fem.feAux = user->feAux;
   PetscFunctionReturn(0);
@@ -444,43 +428,11 @@ PetscErrorCode SetupBdElement(DM dm, AppCtx *user)
   const PetscInt  dim    = user->dim-1;
   const char     *prefix = "bd_";
   PetscFE         fem;
-  PetscQuadrature q;
-  DM              K;
-  PetscSpace      P;
-  PetscDualSpace  Q;
-  PetscInt        order;
   PetscErrorCode  ierr;
 
   PetscFunctionBegin;
   if (user->bcType != NEUMANN) {user->fem.feBd = NULL; user->feBd[0] = NULL; PetscFunctionReturn(0);}
-  /* Create space */
-  ierr = PetscSpaceCreate(PetscObjectComm((PetscObject) dm), &P);CHKERRQ(ierr);
-  ierr = PetscObjectSetOptionsPrefix((PetscObject) P, prefix);CHKERRQ(ierr);
-  ierr = PetscSpaceSetFromOptions(P);CHKERRQ(ierr);
-  ierr = PetscSpacePolynomialSetNumVariables(P, dim);CHKERRQ(ierr);
-  ierr = PetscSpaceSetUp(P);CHKERRQ(ierr);
-  ierr = PetscSpaceGetOrder(P, &order);CHKERRQ(ierr);
-  /* Create dual space */
-  ierr = PetscDualSpaceCreate(PetscObjectComm((PetscObject) dm), &Q);CHKERRQ(ierr);
-  ierr = PetscObjectSetOptionsPrefix((PetscObject) Q, prefix);CHKERRQ(ierr);
-  ierr = PetscDualSpaceCreateReferenceCell(Q, dim, PETSC_TRUE, &K);CHKERRQ(ierr);
-  ierr = PetscDualSpaceSetDM(Q, K);CHKERRQ(ierr);
-  ierr = DMDestroy(&K);CHKERRQ(ierr);
-  ierr = PetscDualSpaceSetOrder(Q, order);CHKERRQ(ierr);
-  ierr = PetscDualSpaceSetFromOptions(Q);CHKERRQ(ierr);
-  ierr = PetscDualSpaceSetUp(Q);CHKERRQ(ierr);
-  /* Create element */
-  ierr = PetscFECreate(PetscObjectComm((PetscObject) dm), &fem);CHKERRQ(ierr);
-  ierr = PetscObjectSetOptionsPrefix((PetscObject) fem, prefix);CHKERRQ(ierr);
-  ierr = PetscFESetFromOptions(fem);CHKERRQ(ierr);
-  ierr = PetscFESetBasisSpace(fem, P);CHKERRQ(ierr);
-  ierr = PetscFESetDualSpace(fem, Q);CHKERRQ(ierr);
-  ierr = PetscFESetNumComponents(fem, 1);CHKERRQ(ierr);
-  ierr = PetscSpaceDestroy(&P);CHKERRQ(ierr);
-  ierr = PetscDualSpaceDestroy(&Q);CHKERRQ(ierr);
-  /* Create quadrature */
-  ierr = PetscDTGaussJacobiQuadrature(dim, order, -1.0, 1.0, &q);CHKERRQ(ierr);
-  ierr = PetscFESetQuadrature(fem, q);CHKERRQ(ierr);
+  ierr = SetupElementCommon(dm, dim, prefix, -1, &fem);CHKERRQ(ierr);
   user->feBd[0] = fem;
   user->fem.feBd = user->feBd;
   PetscFunctionReturn(0);
-- 
1.8.4.1.559.gdb9bdfb

Reply via email to