Hi Matthew

We are now facing a related problem. When running on a single process 
everything works as intended, where the values of global stiffness matrix are 
between 0.0 and 2.0 (the number corresponds to the number of elements/cells 
which affects the relation between two dofs).

However if the program is using 2 (or more) processes, then the global 
stiffness matrix changes, such that the values is now between 0.0 and 1.0 (even 
though we are using ADD_VALUES in the MatSetValuesLocal).

Any idea what could be wrong? I have attached a modified version of the code, 
where the program outputs the matrix to a file called ‘Kmat.m'.

Kind regards,
Morten


Fra: Matthew Knepley <knep...@gmail.com<mailto:knep...@gmail.com>>
Dato: Tuesday 8 March 2016 at 19:47
Til: Morten Nobel-Jørgensen <m...@mek.dtu.dk<mailto:m...@mek.dtu.dk>>
Cc: "petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>" 
<petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>>
Emne: Re: [petsc-users] DMPlex : Assemble global stiffness matrix problem

On Tue, Mar 8, 2016 at 7:10 AM, Matthew Knepley 
<knep...@gmail.com<mailto:knep...@gmail.com>> wrote:
On Mon, Mar 7, 2016 at 1:28 PM, Morten Nobel-Jørgensen 
<m...@mek.dtu.dk<mailto:m...@mek.dtu.dk>> wrote:
I have some problems using DMPlex on unstructured grids in 3D.

After I have created the DMPlex and assigned dofs (3 dofs on each node), I run 
into some problems when assembling the global stiffness matrix. I have created 
a small example in the attached cc file. My problems are:

  *   It seems like the matrix (created using DMCreateMatrix) contains no 
non-zero elements. I was under the impression that the sparsity pattern of the 
matrix would be created automatically when the dofs has been assigned to the 
default section.
  *   (Probably as a consequence of this) when assigning values to the matrix I 
get an: "Argument of of range. New nonzero at (0,0) caused a malloc. Use 
MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE) to turn off this 
check"
  *   Finally, I'm reading the nodes of each element using the 
get-transitive-clojure (where I test if each point is inside the node range), 
but I have a hard time understanding if the returned values are sorted. And if 
not, how to sort the values (e.g. using orientation which the 
get-transitive-clojure function also returns).

I hope someone can guide me in the right direction :)

I will take a look today or tomorrow. The first thing to do is to look at the 
nonzero pattern of the Jacobian. I use -mat_view draw -draw_pause -1

I admit that this problem is counter-intuitive, and I will think about a good 
error check. The problem is that I allow "inconsistent"
sections, meaning that the dof for each field do not add up to the total dof. 
In your code, when you call

      ierr = PetscSectionSetDof(s, v, 3);CHKERRQ(ierr);

you should also call

      ierr = PetscSectionSetFieldDof(s, v, 0, 3);CHKERRQ(ierr);

Then everything works. I am attaching my slight rewrite of your code.

  Thanks,

    Matt

  Thanks,

    Matt

Kind regards,
Morten



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



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

Attachment: ex18.cc
Description: ex18.cc

Reply via email to