I tried your code but it appears the ./gyroid_solution.txt contains a vector 
of all zeros. Is this intended?

   Actually VecDuplicateVecs() does not copy the values in the vector so your 
nsp[0] will contain the zero vector anyways.

  Would you be able to send the data that indicates what rows of the vector are 
associated with each subdomain? For example a vector with all 1s on the first 
domain and all 2s on the second domain?  I think with this one should be able 
to construct the 2 dimensional null space.

  Barry


> On Dec 16, 2021, at 11:09 AM, Marco Cisternino <[email protected]> 
> wrote:
> 
> Hello Matthew,
> as promised I prepared a minimal (112960 rows. I’m not able to produce 
> anything smaller than this and triggering the issue) example of the behavior 
> I was talking about some days ago.
> What I did is to produce matrix, right hand side and initial solution of the 
> linear system.
>  
> As I told you before, this linear system is the discretization of the 
> pressure equation of a predictor-corrector method for NS equations in the 
> framework of finite volume method.
> This case has homogeneous Neumann boundary conditions. Computational domain 
> has two independent and separated sub-domains.
> I discretize the weak formulation and I divide every row of the linear system 
> by the volume of the relative cell.
> The underlying mesh is not uniform, therefore cells have different volumes.
> The issue I’m going to explain does not show up if the mesh is uniform, same 
> volume for all the cells.
>  
> I usually build the null space sub-domain by sub-domain with
> MatNullSpaceCreate(getCommunicator(), PETSC_FALSE, nConstants, constants, 
> &nullspace);
> Where nConstants = 2 and constants contains two normalized arrays with 
> constant values on degrees of freedom relative to the associated sub-domain 
> and zeros elsewhere.
>  
> However, as a test I tried the constant over the whole domain using 2 
> alternatives that should produce the same null space:
> MatNullSpaceCreate(getCommunicator(), PETSC_TRUE, 0, nullptr, &nullspace);
> Vec* nsp;
> VecDuplicateVecs(solution, 1, &nsp);
> VecSet(nsp[0],1.0);
> VecNormalize(nsp[0], nullptr);
> MatNullSpaceCreate(getCommunicator(), PETSC_FALSE, 1, nsp, &nullspace);
>  
> Once I created the null space I test it using:
> MatNullSpaceTest(nullspace, m_A, &isNullSpaceValid);
>  
> The case 1 pass the test while case 2 don’t.
>  
> I have a small code for matrix loading, null spaces creation and testing.
> Unfortunately I cannot implement a small code able to produce that linear 
> system.
>  
> As attachment you can find an archive containing the matrix, the initial 
> solution (used to manually build the null space) and the rhs (not used in the 
> test code) in binary format.
> You can also find the testing code in the same archive.
> I used petsc 3.12(gcc+openMPI) and petsc 3.15.2(intelOneAPI) same results.
> If the attachment is not delivered, I can share a link to it.
>  
> Thanks for any help.
>  
> Marco Cisternino 
>  
>  
> Marco Cisternino, PhD
> [email protected] <mailto:[email protected]>
> ______________________
> Optimad Engineering Srl
> Via Bligny 5, Torino, Italia.
> +3901119719782
> www.optimad.it <http://www.optimad.it/>
>  
> From: Marco Cisternino <[email protected] 
> <mailto:[email protected]>> 
> Sent: martedì 7 dicembre 2021 19:36
> To: Matthew Knepley <[email protected] <mailto:[email protected]>>
> Cc: petsc-users <[email protected] <mailto:[email protected]>>
> Subject: Re: [petsc-users] Nullspaces
>  
> I will, as soon as possible...
>  
> Scarica Outlook per Android <https://aka.ms/AAb9ysg>
> From: Matthew Knepley <[email protected] <mailto:[email protected]>>
> Sent: Tuesday, December 7, 2021 7:25:43 PM
> To: Marco Cisternino <[email protected] 
> <mailto:[email protected]>>
> Cc: petsc-users <[email protected] <mailto:[email protected]>>
> Subject: Re: [petsc-users] Nullspaces
>  
> On Tue, Dec 7, 2021 at 11:19 AM Marco Cisternino <[email protected] 
> <mailto:[email protected]>> wrote:
> Good morning,
> 
> I’m still struggling with the Poisson equation with Neumann BCs.
> 
> I discretize the equation by finite volume method and I divide every line of 
> the linear system by the volume of the cell. I could avoid this division, but 
> I’m trying to understand.
> 
> My mesh is not uniform, i.e. cells have different volumes (it is an octree 
> mesh).
> 
> Moreover, in my computational domain there are 2 separated sub-domains.
> 
> I build the null space and then I use MatNullSpaceTest to check it.
> 
>  
> 
> If I do this:
> 
> MatNullSpaceCreate(getCommunicator(), PETSC_TRUE, 0, nullptr, &nullspace);
> 
> It works
> 
>  
> This produces the normalized constant vector.
>  
> If I do this:
> 
> Vec nsp;
> 
> VecDuplicate(m_rhs, &nsp);
> 
> VecSet(nsp,1.0);
> 
> VecNormalize(nsp, nullptr);
> 
> MatNullSpaceCreate(getCommunicator(), PETSC_FALSE, 1, &nsp, &nullspace);
> 
> It does not work
> 
>  
> This is also the normalized constant vector.
>  
> So you are saying that these two vectors give different results with 
> MatNullSpaceTest()?
> Something must be wrong in the code. Can you send a minimal example of this? 
> I will go
> through and debug it.
>  
>   Thanks,
>  
>      Matt
>  
> Probably, I have wrong expectations, but should not it be the same?
> 
>  
> 
> Thanks
> 
>  
> 
> Marco Cisternino, PhD
> [email protected] <mailto:[email protected]>
> ______________________
> 
> Optimad Engineering Srl
> 
> Via Bligny 5, Torino, Italia.
> +3901119719782
> www.optimad.it <http://www.optimad.it/>
>  
> 
> 
>  
> -- 
> 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
>  
> https://www.cse.buffalo.edu/~knepley/ 
> <http://www.cse.buffalo.edu/~knepley/><nullspaceTest.tar.gz>

Reply via email to