# File petsc_laplace.hxx¶

class LaplacePetsc : public Laplacian

Public Functions

LaplacePetsc(Options *opt = nullptr, const CELL_LOC loc = CELL_CENTRE, Mesh *mesh_in = nullptr)
~LaplacePetsc()
void setCoefA(const Field2D &val)

Set coefficients for inversion. Re-builds matrices if necessary.

void setCoefC(const Field2D &val)
void setCoefC1(const Field2D &val)
void setCoefC2(const Field2D &val)
void setCoefD(const Field2D &val)
void setCoefEx(const Field2D &val)
void setCoefEz(const Field2D &val)
void setCoefA(const Field3D &val)
void setCoefC(const Field3D &val)
void setCoefC1(const Field3D &val)
void setCoefC2(const Field3D &val)
void setCoefD(const Field3D &val)
void setCoefEx(const Field3D &val)
void setCoefEz(const Field3D &val)
FieldPerp solve(const FieldPerp &b)
FieldPerp solve(const FieldPerp &b, const FieldPerp &x0)

Solves Ax=b for x given a b and an initial guess for x (x0)

This function will:

1. Set the matrix element of the matrix A, used to solve Ax=b (this includes setting the values for the bounary condition)
2. Solve the matrix Ax = b

Return
sol The solution x of the problem Ax=b.
Parameters
• b: The RHS of the equation Ax=b. This is an y-slice of the original field. The field wil be flattened to an 1D array in order to write the equation on the form Ax=b
• x0: The initial guess for the solver. May also contain the boundary condition if flag 32 - INVERT_SET is set

int precon(Vec x, Vec y)

Preconditioner function.

Private Functions

void Element(int i, int x, int z, int xshift, int zshift, PetscScalar ele, Mat &MatA)

Sets the elements of the matrix A, which is used to solve the problem Ax=b.

Parameters
• i: The row of the PETSc matrix
• x: Local x index of the mesh
• z: Local z index of the mesh
• xshift: The shift in rows from the index x
• zshift: The shift in columns from the index z
• ele: Value of the element
• MatA: The matrix A used in the inversion
• MatA: The matrix A used in the inversion

void Coeffs(int x, int y, int z, BoutReal &A1, BoutReal &A2, BoutReal &A3, BoutReal &A4, BoutReal &A5)

Set the matrix components of A in Ax=b, solving D*Laplace_perp(x) + (1/C1)Grad_perp(C2)*Grad_perp(x) + Ax = B

Note
”A” in the equation above is not added here. For calculations of the coefficients, please refer to the user manual.
Parameters
• x: The current x index
• y: The current y index
• z: The current y index
• coef1: Placeholder for convenient variable used to set matrix (see manual for details)
• coef2: Convenient variable used to set matrix (see manual for details)
• coef3: Placeholder for convenient variable used to set matrix (see manual for details)
• coef4: Placeholder for convenient variable used to set matrix (see manual for details)
• coef5: Placeholder for convenient variable used to set matrix (see manual for details)
• coef1: Convenient variable used to set matrix (see manual for details)
• coef2: Convenient variable used to set matrix (see manual for details)
• coef3: Convenient variable used to set matrix (see manual for details)
• coef4: Convenient variable used to set matrix (see manual for details)
• coef5: Convenient variable used to set matrix (see manual for details)

void vecToField(Vec x, FieldPerp &f)
void fieldToVec(const FieldPerp &f, Vec x)

Private Members

Field3D A
Field3D C1
Field3D C2
Field3D D
Field3D Ex
Field3D Ez
bool issetD
bool issetC
bool issetE
int lastflag
FieldPerp sol
int Istart
int Iend
int meshx
int meshz
int size
int localN
MPI_Comm comm
Mat MatA
Vec xs
Vec bs
KSP ksp
Options *opts
std::string ksptype

KSP solver type.

std::string pctype

Preconditioner type.

BoutReal richardson_damping_factor
BoutReal chebyshev_max
BoutReal chebyshev_min
int gmres_max_steps
BoutReal rtol
BoutReal atol
BoutReal dtol
int maxits
bool direct
bool fourth_order
PetscLib lib
bool use_precon
bool rightprec
Laplacian *pcsolve
int implemented_flags
int implemented_boundary_flags