[petsc-users] Using SNES to solve Non linear elasticity, passing matrix to form function

Matthew Knepley knepley at gmail.com
Wed May 19 12:42:28 CDT 2021


On Wed, May 19, 2021 at 1:30 PM Kaushik Vijaykumar <kaushikv318 at gmail.com>
wrote:

> Matt,
>
> Thanks for the comment, I see your point now. I was using the linear
> elastic [K] from the previous load step as the guess for the jacobian. The
> stiffness matrix was being built outside formfunction using displacements
> from the previous load step. What is the best approach, Build [K] abd {F}
> inside the form function and compute the residual [K]_{i}{U}_{i} - {F}_{i},
> where i designates the iterated matrices and vector for a given load step ?
>

Yes, exactly. You want the residual

  F(U) = 0

which for you sounds like

  K(U) U - F = 0

and then the Jacobian callback builds

  K(U)

from the input U.

  Thanks,

     Matt


> Thanks
> Kaushik
>
> On Wed, May 19, 2021 at 11:51 AM Matthew Knepley <knepley at gmail.com>
> wrote:
>
>> On Wed, May 19, 2021 at 11:48 AM Kaushik Vijaykumar <
>> kaushikv318 at gmail.com> wrote:
>>
>>> Barry,
>>>
>>> Thanks for your response. I am trying to copy K into Kloc, the purpose
>>> of doing that is to calculate the residual in formfunction - Residual =
>>> [Kloc]{X} - {Floc}, where Kloc and Floc are the copies of assembled global
>>> K matrix and F vector, and X is the current iterated solution. This is the
>>> reason that I need to access the global stiffness matrix and force vector
>>> in formfunction.
>>> I agree that formjacobian only needs access to global stiffness matrix K
>>> to form the jacobian and does not need to access the force vector.
>>>
>>> Therefore, to be able to pass both K and F to formfunction, I defined a
>>> struct that contains a vector F and matrix K and populated them in the
>>> main().
>>>
>>> Please let me know, if this unclear and I can clarify with more details
>>>
>>
>> This still does not make sense. If you have a nonlinear problem, how can
>> you know the Jacobian up front? It changes with the input point.
>>
>>   Thanks,
>>
>>     Matt
>>
>>
>>> Thanks
>>> Kaushik
>>>
>>>
>>> On Wed, May 19, 2021 at 11:25 AM Barry Smith <bsmith at petsc.dev> wrote:
>>>
>>>> *ierr = MatSeqAIJGetArray(ptr->K,&Kc);CHKERRQ(ierr); *
>>>>
>>>> *ierr = MatGetLocalSize(ptr->K,&m,&n); CHKERRQ(ierr);*
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> *for(i=0;i<m;i++)    {       for(j=0;j<n;j++)      {        v  = *(Kc +
>>>> (i*n+j));        ierr =
>>>> MatSetValues(Kloc,1,&i,1,&j,&v,INSERT_VALUES);CHKERRQ(ierr);      }*
>>>> *    } *
>>>>
>>>>
>>>>
>>>> I don't understand the purpose of this code fragment. Are you wanting
>>>> to copy your K into Kloc? What is the purpose of Kloc? With standard usage
>>>> of SNES one only needs to provide PETSc a global matrix, one does not need
>>>> to work with "ghosted" matrices at all.
>>>>
>>>> Also normally one fills the f vector in FormFunction and the Jacobian
>>>> in FormJacobian and there is no need to access the Jacobians at all in SNES
>>>> https://www.mcs.anl.gov/petsc/documentation/faq.html#functionjacobian
>>>> nor do you need to pass into FormFunction in the context the F or Jacobian
>>>> matrix.
>>>>
>>>> Maybe if you explained your use case a bit more we could make
>>>> suggestions on how to accomplish it.
>>>>
>>>> Barry
>>>>
>>>>
>>>>
>>>> On May 19, 2021, at 10:00 AM, Kaushik Vijaykumar <kaushikv318 at gmail.com>
>>>> wrote:
>>>>
>>>> Hi everyone,
>>>>
>>>> We are in the process of integrating nonlinear solution to our FE code
>>>> through SNES. The first steps that I understood that need to be done is to
>>>> be able to pass the assembled stiffness matrix K and force vector F to the "
>>>> *formfunction*" to calculate the residual and "*formjacobian*" to
>>>> calculate the tangent stiffness matrix. To do so, I have defined a struct:
>>>>
>>>>
>>>> *extern PetscErrorCode FormJacobian(SNES,Vec,Mat,Mat,void*);extern
>>>> PetscErrorCode FormFunction(SNES,Vec,Vec,void*);*
>>>>
>>>> // define a struct type to pass K and f as "user context"
>>>>
>>>>
>>>>
>>>>
>>>> *typedef struct    {      Mat K;      Vec f;    } K_and_f;*
>>>>
>>>> In the main program, the struct is declared
>>>> *int main()*
>>>> *{*
>>>> *K_and_f main_K_and_f;* // declare the struct
>>>>
>>>> // SNES - Populate K and f into the struct
>>>> *main_K_and_f.K = K;* // K matrix
>>>> *main_K_and_f.f = f; *// f vector
>>>> ....
>>>> ....
>>>> *}*
>>>> In form function
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> *PetscErrorCode FormFunction(SNES snes, Vec x, Vec F, void* ctx) {
>>>> PetscErrorCode ierr;    PetscReal *ax,*c;    PetscReal *aF;    PetscScalar
>>>> *Kc,v;     PetscInt nlocal,m,n,i,j,index[100000];   * // Create local
>>>> Vec and Mat
>>>> *    Mat Kloc;*
>>>> *    Vec Floc, Uloc, KUloc, resloc;*
>>>>
>>>> *    K_and_f* ptr = (K_and_f*) ctx; *// cast the pointer to void into
>>>> pointer to struct
>>>>     // Get local F array, FLOC
>>>> *    ierr = VecGhostGetLocalForm(ptr->f,&Floc);CHKERRQ(ierr);*
>>>>
>>>>
>>>> I am able to get the f array from the main program using "
>>>> VecGhostGetLocalForm" and the vec is correct. However, I am having trouble
>>>> with reading the K matrix in formfunction.
>>>>
>>>> The following trial gives me incorrect K values in Kloc:
>>>> *ierr = MatSeqAIJGetArray(ptr->K,&Kc);CHKERRQ(ierr); *
>>>>
>>>> *ierr = MatGetLocalSize(ptr->K,&m,&n); CHKERRQ(ierr);*
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> *for(i=0;i<m;i++)    {       for(j=0;j<n;j++)      {        v  = *(Kc +
>>>> (i*n+j));        ierr =
>>>> MatSetValues(Kloc,1,&i,1,&j,&v,INSERT_VALUES);CHKERRQ(ierr);      }*
>>>> *    } *
>>>>
>>>>     When I compare K and Kloc, they are not identical
>>>>
>>>>
>>>> Please let me know if there is an equivalent function like
>>>> *VecGhostGetLocalForm()* for Matrices. If not, is there a better way
>>>> to do this.
>>>>
>>>> Any guidance/help is greatly appreciated.
>>>>
>>>> Thanks
>>>> Kaushik
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>
>> --
>> 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/>
>>
>

-- 
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/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20210519/ccff1d77/attachment-0001.html>


More information about the petsc-users mailing list