[petsc-users] Some Problems about SNES EX19.c

Jed Brown jed at jedbrown.org
Sun Nov 4 09:31:07 CST 2018


Yingjie Wu via petsc-users <petsc-users at mcs.anl.gov> writes:

> Dear Petsc developer:
> Hi,
> Recently, I am very interested in the ex19 example in SNES, which uses NGS
> method to solve the non-linear equations, which may be the method I need to
> use in the future. I have some doubts about the program.
> 1.
>
> 82: typedef struct {
> 83:   PetscScalar u,v,omega,temp;
> 84: } Field
> 86: PetscErrorCode FormFunctionLocal(DMDALocalInfo*,Field**,Field**,void*);
>> 150:   DMDASNESSetFunctionLocal(da,INSERT_VALUES,(PetscErrorCode
> (*)(DMDALocalInfo*,void*,void*,void*))FormFunctionLocal,&user);
>
>
> I looked at PETSc manualpage:
>
> For PetscErrorCode (*func)(DMDALocalInfo *info,void *x, void *f, void *ctx),
> info - DMDALocalInfo defining the subdomain to evaluate the residual on
> x - dimensional pointer to state at which to evaluate residual (e.g.
> PetscScalar *x or **x or ***x)
> f - dimensional pointer to residual, write the residual here (e.g.
> PetscScalar *f or **f or ***f)
> ctx - optional context passed above
>
> In the function FormFunctionLocal, the second and third parameters should
> be pointers to PetscScalar, where pointers are directly used to point to
> Field. Why can we use them here?            Although I know that there are
> four degrees of freedom in DM objects, how can I ensure that the program
> correctly corresponds to variables in Field?

DMDA "interlaces" the fields, so this memory layout is guaranteed.

> 2.
> In the NGS subroutine,
>
> 530: dfudu = 2.0* (hydhx + hxdhy);
>
> But in the residual function:
>
> 526: u = x[j][i].u;
> 527: uxx = (2.0*u - x[j][i-1].u - x[j][i+1].u) *hydhx;
> 528: uyy = (2.0*u - x[j-1][i].u - x[j+1][i].u) *hxdhy;
> 529: Fu = uxx + uyy -.5* (x[j+1][i].omega-x[j-1][i].omega) *hx - bjiu;
>
> / * invert the system:
> 572:              [ dfu / du     0        0        0    ][yu] = [fu]
> 573:              [     0    dfv / dv     0        0    ][yv]   [fv]
> 574:              [ dfo / du dfo / dv dfo / do     0    ][yo]   [fo]
> 575:              [ dft / du dft / dv     0    dft / dt ][yt]   [ft]
> 576:              by simple back-substitution
> 577: * /
>
> It is known that the residual function fu [j] [i] is a function of five
> variables (x [j] [i].u, x [j] [i-1].u, x [j] [i+1].u, x [j-1] [i].u, x
> [j+1] [i] [i].u) (it is same for analytic Jacobian matrix). But in this
> program, only the central grid is used to solve the partial derivatives.
> Why do we choose to do so?            In my understanding, the sub-matrix
> 'dfudu' is a five-diagonal matrix, but it is processed into a diagonal
> matrix in the program. Will this affect the accuracy of the solution?

This may be a misunderstanding.  The residual calculates a vector as a
nonlinear function of the input.  The Jacobian matrix is not assembled
in this example, but can be computed efficiently by finite differencing
using coloring.  Each row has 5*4=20 formal nonzeros and computing the
matrix by coloring requires somewhere around that number of residual
evaluations.


More information about the petsc-users mailing list