On Apr 7, 2017, at 6:25 AM, Matthew Knepley 
<[email protected]<mailto:[email protected]>> wrote:

On Thu, Apr 6, 2017 at 1:04 PM, Abhyankar, Shrirang G. 
<[email protected]<mailto:[email protected]>> wrote:
I am solving a time-dependent problem using DMNetwork (uses DMPlex
internally) to manage the network. To find the initial conditions, I need
to solve a nonlinear problem on the same network but with different number
of dofs on the nodes and edges.

Question: Can I reuse the same DMNetwork (DMPlex) for solving the two
problems. The way I am trying to approach this currently is by creating
two PetscSections to be used with Plex. The first one is used for the
initial conditions and the second one is for the time-stepping. Here¹s the
code I have

This is the right way to do it, but its easier if you call DMClone() first to 
get a new
DM with the same Plex, and then change its default Section and solve your 
problem
with it.

Thanks Matt. Doesn't DMClone() make a shallow copy for Plex? So any section set 
for the cloned Plex will also be set for the original one?


  Matt


  for(i=vStart; i < vEnd; i++) {
    /* Two variables at each vertex for the initial condition problem */
    ierr = PetscSectionSetDof(dyn->initpflowpsection,i,2);CHKERRQ(ierr);
  }
  ierr = PetscSectionSetUp(dyn->initpflowpsection);CHKERRQ(ierr);

  /* Get the plex dm */
  ierr = DMNetworkGetPlex(networkdm,&plexdm);CHKERRQ(ierr);

  /* Get default sections associated with this plex set for time-stepping
*/
  ierr = DMGetDefaultSection(plexdm,&dyn->defaultsection);CHKERRQ(ierr);
ierr =
DMGetDefaultGlobalSection(plexdm,&dyn->defaultglobalsection);CHKERRQ(ierr);

/* Increase the reference count so that the section does not get destroyed
when a new one is set with DMSetDefaultSection */
ierr =
PetscObjectReference((PetscObject)dyn->defaultsection);CHKERRQ(ierr);
ierr =
PetscObjectReference((PetscObject)dyn->defaultglobalsection);CHKERRQ(ierr);


  /* Set the new section created for initial conditions */
  ierr = DMSetDefaultSection(plexdm,dyn->initpflowpsection);CHKERRQ(ierr);
  ierr =
DMGetDefaultGlobalSection(plexdm,&dyn->initpflowpglobsection);CHKERRQ(ierr)
;



Would this work or should I rather use DMPlexCreateSection to create the
PetscSection used for initial conditions (dyn->initpflowpsection)? Any
other problems that I should be aware of? Has anyone else attempted using
the same plex for solving two different problems?

Thanks,
Shri





--
What most experimenters take for granted before they begin their experiments is 
infinitely more interesting than any results to which their experiments lead.
-- Norbert Wiener

Reply via email to