XGCa
Data Types | Modules | Functions/Subroutines
poisson.F90 File Reference
#include "petsc_version_defs.h"
#include <petsc/finclude/petsc.h>
Include dependency graph for poisson.F90:

Data Types

interface  f90moduleinterfaces::pcsetapplicationcontext
 
interface  f90moduleinterfaces::pcgetapplicationcontext
 
interface  f90moduleinterfaces::matcreateshell
 
interface  f90moduleinterfaces::matshellsetcontext
 
interface  f90moduleinterfaces::matshellgetcontext
 

Modules

module  f90moduleinterfaces
 Explicit interfaces to somve PETSc function used by the FSA solver.
 

Functions/Subroutines

subroutine clear_monitors ()
 
subroutine init_helmholtz_solver_wrap (isolver, bd, n_rhs, is_update_int)
 
subroutine psn_add_pot0 ()
 
subroutine set_rhs_bd_and_sol_bd (rhs, rhs_bd, sol_bd)
 
integer function get_ntor_num_from_ntor_real (ntor_real, nphi, wedge_n)
 Calculates the numerical toroidal mode number for a given real toroidal mode number. More...
 
subroutine set_petsc_rhs_vec_axisymmetric_poisson (xgc_rhs, xgc_rhs_bd, xgc_sol_bd)
 Places rhs and (optionally) boundary condition data into a PETSc vector. More...
 
subroutine set_to_sheath_pot (tmp00_surf)
 Sets initial guess for the iterative axisymmetric poisson solver using the simple00 solver. The initial guess is stored in psnpot0m. More...
 
subroutine solve_axisymmetric_poisson_iter (pot0m)
 Poisson solver that uses an iterative method to solve for the axisymmetric electrostatic potential: The Poisson equation for the axisymmetric mode is. More...
 
subroutine axisym_mat_mult (A, X, Y, ierr)
 Subroutine used to apply the shell matrix representing the left hand side of the axisymmetric Poisson equation. More...
 
subroutine axisym_ad_mat_mult (A, X, Y, ierr)
 Subroutine used to apply the shell matrix representing the adiabatic term in the axisymmetric Poisson equation. More...
 
subroutine axisym_pc_apply (pc, X, Y, ierr)
 Subroutine used to apply the shell preconditioner used in the iterative solution of the axisymmetric Poisson equation. More...
 
subroutine solve_axisymmetric_poisson_two_step_fsa (xgc_rhs, xgc_rhs00, xgc_rhs_bd, xgc_rhs_bd00, xgc_sol_bd, xgc_sol_bd00, pot0m, dpot)
 Simple two-step 2D solver driver for the axisymmetric potential and one-step solver ("FSA-solver") with constraint equation for the flux-surface averaged potential. For the two-step solver, the RHS is the flux-surface averaged charge density, the LHS consists only of the polarization operator. The result of the 2D solve is flux-surface averaged; i.e., the result is \(\langle\phi\rangle\) The Poisson equation for the flux-surface averaged mode is. More...
 
subroutine positive_phi00_sol (tmp00_surf, pot0m)
 
subroutine get_xpt_i (i_x1, i_x2)
 
subroutine add_pot0 (pot0m)
 
subroutine poisson_turb_petsc_solve (xgc_rhs, xgc_field)
 Routine to solve the non-axisymmetric Poisson equation: More...
 
subroutine poisson_turb_petsc_spectral_solve (xgc_rhs_spectral, xgc_field_spectral)
 Routine to solve the non-axisymmetric Poisson equation: More...
 
subroutine post_process_turb_poisson_neo ()
 Routine to post process the solution from the non-axisymmetric Poisson equation. More...
 
integer(c_int) function get_solverh_nbndry ()
 
integer(c_int) function get_solver00_nbndry ()
 
integer(c_int) function solver00_use_this_rank_int ()
 
integer(c_int) function solverh_use_this_rank_int ()
 
integer(c_int) function solvera_use_this_rank_int (CV_int)
 
subroutine solve_ampere_cv (xgc_rhs, xgc_rhs2, Ah)
 
subroutine solve_ampere_cv_spec (xgc_rhs_spectral, xgc_rhs2_spectral, xgc_field_spectral)
 
subroutine solve_ampere (xgc_rhs, xgc_rhs2, Ah)
 
subroutine solve_ampere_spec (xgc_rhs_spectral, xgc_rhs2_spectral, xgc_field_spectral)
 

Function/Subroutine Documentation

◆ add_pot0()

subroutine add_pot0 ( real(8), dimension(grid%nnode)  pot0m)
Here is the call graph for this function:

◆ axisym_ad_mat_mult()

subroutine axisym_ad_mat_mult (   A,
  X,
  Y,
  ierr 
)

Subroutine used to apply the shell matrix representing the adiabatic term in the axisymmetric Poisson equation.

\[ \frac{e n_0/T_{e,0}} \left( \overline{\phi} - \alpha(\psi) \langle \overline{\phi} \rangle_{fs} \right) \]

Parameters
[in]AShell matrix which multiplies X, Petsc Mat
[in]XVector to be multiplied, Petsc Vec
[out]YVector to store product A*X, Petsc Vec
[out]ierrPETSc Error code
Here is the caller graph for this function:

◆ axisym_mat_mult()

subroutine axisym_mat_mult (   A,
  X,
  Y,
  ierr 
)

Subroutine used to apply the shell matrix representing the left hand side of the axisymmetric Poisson equation.

\[ -\nabla_\perp \cdot \xi \nabla_\perp \overline{\phi} + \frac{e n_0/T_{e,0}} \left( \overline{\phi} - \langle \overline{\phi} \rangle_{fs} \right) \]

Parameters
[in]AShell matrix which multiplies X, Petsc Mat
[in]XVector to be multiplied, Petsc Vec
[out]YVector to store product A*X, Petsc Vec
[out]ierrPETSc Error code
Here is the caller graph for this function:

◆ axisym_pc_apply()

subroutine axisym_pc_apply (   pc,
  X,
  Y,
  ierr 
)

Subroutine used to apply the shell preconditioner used in the iterative solution of the axisymmetric Poisson equation.

Parameters
[in]pcShell preconditioner which is applied to residual X, Petsc PC
[in]XResidual vector, Petsc Vec
[out]YPreconditioned residual vector, Petsc Vec
[out]ierrPETSc Error code
Here is the caller graph for this function:

◆ clear_monitors()

subroutine clear_monitors

◆ get_ntor_num_from_ntor_real()

integer function get_ntor_num_from_ntor_real ( integer, intent(in)  ntor_real,
integer, intent(in)  nphi,
integer, intent(in)  wedge_n 
)

Calculates the numerical toroidal mode number for a given real toroidal mode number.

Parameters
[in]ntor_realReal toroidal mode number, integer
[in]nphiNumber of toroidal planes per wedge, integer
[in]wedge_nNumber of wedges per toroidal circuit, integer
Here is the caller graph for this function:

◆ get_solver00_nbndry()

integer(c_int) function get_solver00_nbndry
Here is the caller graph for this function:

◆ get_solverh_nbndry()

integer(c_int) function get_solverh_nbndry

◆ get_xpt_i()

subroutine get_xpt_i ( integer(c_int)  i_x1,
integer(c_int)  i_x2 
)

◆ init_helmholtz_solver_wrap()

subroutine init_helmholtz_solver_wrap ( integer, intent(in), value  isolver,
integer, dimension(grid%nnode)  bd,
integer, intent(in), value  n_rhs,
integer, intent(in), value  is_update_int 
)
Here is the call graph for this function:

◆ poisson_turb_petsc_solve()

subroutine poisson_turb_petsc_solve ( real (8), dimension(grid%nnode)  xgc_rhs,
real (8), dimension(grid%nnode)  xgc_field 
)

Routine to solve the non-axisymmetric Poisson equation:

\[ -\nabla_\perp \cdot \xi \nabla_\perp \delta\phi + \frac{e n_0/T_{e,0}} \delta\phi = e \left( \langle \delta n_i \rangle_g - \overline{\delta n_{e,NA}} \right) \]

Parameters
[in]gridXGC grid data object
[in,out]psnXGC field data object
Here is the call graph for this function:

◆ poisson_turb_petsc_spectral_solve()

subroutine poisson_turb_petsc_spectral_solve ( real (8), dimension(grid%nnode,2)  xgc_rhs_spectral,
real (8), dimension(grid%nnode,2)  xgc_field_spectral 
)

Routine to solve the non-axisymmetric Poisson equation:

\[ -\nabla_\perp \cdot \xi \nabla_\perp \delta\phi + \frac{e n_0/T_{e,0}} \delta\phi = e \left( \langle \delta n_i \rangle_g - \overline{\delta n_{e,NA}} \right) \]

Parameters
[in]gridXGC grid data object
[in,out]psnXGC field data object
Here is the call graph for this function:

◆ positive_phi00_sol()

subroutine positive_phi00_sol ( real (kind=8), dimension(grid%npsi_surf)  tmp00_surf,
real(8), dimension(grid%nnode)  pot0m 
)
Here is the call graph for this function:

◆ post_process_turb_poisson_neo()

subroutine post_process_turb_poisson_neo

Routine to post process the solution from the non-axisymmetric Poisson equation.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ psn_add_pot0()

subroutine psn_add_pot0
Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_petsc_rhs_vec_axisymmetric_poisson()

subroutine set_petsc_rhs_vec_axisymmetric_poisson ( real(8), dimension(grid%nnode)  xgc_rhs,
real(8), dimension(psn%solver00%n_boundary)  xgc_rhs_bd,
real(8), dimension(psn%solver00%n_boundary)  xgc_sol_bd 
)

Places rhs and (optionally) boundary condition data into a PETSc vector.

Parameters
[in]gridSolver grid data, type(grid_type)
[in,out]psnField data; the rhs XGC data is stored there, type(psn_type)
[in,out]solverXGC solver object; the rhs PETSc vector is stored there, type(xgc_solver)
Here is the call graph for this function:

◆ set_rhs_bd_and_sol_bd()

subroutine set_rhs_bd_and_sol_bd ( real (8), dimension(grid%nnode)  rhs,
real (8), dimension(psn%solver00%n_boundary)  rhs_bd,
real (8), dimension(psn%solver00%n_boundary)  sol_bd 
)
Here is the call graph for this function:

◆ set_to_sheath_pot()

subroutine set_to_sheath_pot ( real (8), dimension(grid%npsi_surf)  tmp00_surf)

Sets initial guess for the iterative axisymmetric poisson solver using the simple00 solver. The initial guess is stored in psnpot0m.

Parameters
[in]gridSolver grid data, type(grid_type)
[in,out]psnField data; the pot0m is stored there, type(psn_type)
Here is the call graph for this function:

◆ solve_ampere()

subroutine solve_ampere ( real (8), dimension(grid%nnode)  xgc_rhs,
real (8), dimension(grid%nnode)  xgc_rhs2,
real (8), dimension(grid%nnode), intent(out)  Ah 
)
Here is the call graph for this function:

◆ solve_ampere_cv()

subroutine solve_ampere_cv ( real (8), dimension(grid%nnode)  xgc_rhs,
real (8), dimension(grid%nnode)  xgc_rhs2,
real (8), dimension(grid%nnode), intent(out)  Ah 
)
Here is the call graph for this function:

◆ solve_ampere_cv_spec()

subroutine solve_ampere_cv_spec ( real (8), dimension(grid%nnode,2)  xgc_rhs_spectral,
real (8), dimension(grid%nnode,2)  xgc_rhs2_spectral,
real (8), dimension(grid%nnode,2)  xgc_field_spectral 
)
Here is the call graph for this function:

◆ solve_ampere_spec()

subroutine solve_ampere_spec ( real (8), dimension(grid%nnode,2)  xgc_rhs_spectral,
real (8), dimension(grid%nnode,2)  xgc_rhs2_spectral,
real (8), dimension(grid%nnode,2)  xgc_field_spectral 
)
Here is the call graph for this function:

◆ solve_axisymmetric_poisson_iter()

subroutine solve_axisymmetric_poisson_iter ( real(8), dimension(grid%nnode)  pot0m)

Poisson solver that uses an iterative method to solve for the axisymmetric electrostatic potential: The Poisson equation for the axisymmetric mode is.

\[ -\nabla_\perp \cdot \xi \nabla_\perp \overline{\phi}_{k+1} + \frac{e n_0/T_{e,0}} \overline{\phi}_{k+1} = e \left( \langle \overline{\delta n_i} \rangle_g - \overline{\delta n_{e,NA}} \right) + \frac{e n_0/T_{e,0}} \langle \phi_{k} \rangle_{fs} \]

where \(k\) is the iteration index, \(xi\) is the electric susceptibility, \(e\) is the elementary charge, \(n_0\) and \(T_0\) are the background density and temperature, \(\langle \overline{\delta n_i} \rangle_g\) is the gyroaveraged ion (gyrocenter) charge density, \(\overline{\delta n_{e,NA}}\) is the non-adiabatic electron charge density, and \(\langle\dots\rangle_{fs}\) is the the flux-surface average. \(\overline{\dots}\) is the toroidal average.

The RHS and LHS of the axisymmetric equation can be Fourier-filtered (poloidal modes). The LHS of the non-axisymmetric equation can be Fourier-filtered in the toroidal and poloidal direction. The solver in both cases is a linear finite-element solver on an unstructured triangular grid.

Parameters
[in]gridSolver grid data, type(grid_type)
[in,out]psnField data; the potential is stored there, type(psn_type)
Here is the call graph for this function:

◆ solve_axisymmetric_poisson_two_step_fsa()

subroutine solve_axisymmetric_poisson_two_step_fsa ( real (8), dimension(grid%nnode)  xgc_rhs,
real (8), dimension(grid%nnode)  xgc_rhs00,
real (8), dimension(psn%solverh%n_boundary)  xgc_rhs_bd,
real (8), dimension(psn%solver00%n_boundary)  xgc_rhs_bd00,
real (8), dimension(psn%solverh%n_boundary)  xgc_sol_bd,
real (8), dimension(psn%solver00%n_boundary)  xgc_sol_bd00,
real(8), dimension(grid%nnode)  pot0m,
real(8), dimension(grid%nnode)  dpot 
)

Simple two-step 2D solver driver for the axisymmetric potential and one-step solver ("FSA-solver") with constraint equation for the flux-surface averaged potential. For the two-step solver, the RHS is the flux-surface averaged charge density, the LHS consists only of the polarization operator. The result of the 2D solve is flux-surface averaged; i.e., the result is \(\langle\phi\rangle\) The Poisson equation for the flux-surface averaged mode is.

\[ -\nabla_\perp \cdot \xi \nabla_\perp \overline{\phi} = e \left\langle \left( \langle \overline{\delta n_i} \rangle_g - \overline{\delta n_{e,NA}} \right) \right\rangle_{fs} \]

where \(xi\) is the electric susceptibility, \(e\) is the elementary charge, \(n_0\) is the background density, \(\langle \overline{\delta n_i} \rangle_g\) is the gyroaveraged ion (gyrocenter) charge density, \(\overline{\delta n_{e,NA}}\) is the non-adiabatic electron charge density, and \(\langle\dots\rangle_{fs}\) is the the flux-surface average. \(\overline{\dots}\) is the toroidal average.

NOTE: The two-step solver does not support non-zero Dirichlet boundary conditions!

The FSA solver solves the same equation as the outer-iterative solver (solve_axisymmetric_poisson_iter), but with a twist. The flux-surface averaged potential is treated as an independent field \(\lambda\) in the Poisson equation. In order to make the equation consistent, a second (constraint) equation is added that enforces \(\lambda=\langle\phi\rangle_{fs}\). So the FSA solver solves a 2x2 block system.

Parameters
[in]gridSolver grid data, type(grid_type)
[in,out]psnField data; the potential is stored there, type(psn_type)
Here is the call graph for this function:

◆ solver00_use_this_rank_int()

integer(c_int) function solver00_use_this_rank_int
Here is the caller graph for this function:

◆ solvera_use_this_rank_int()

integer(c_int) function solvera_use_this_rank_int ( integer(c_int), intent(in), value  CV_int)

◆ solverh_use_this_rank_int()

integer(c_int) function solverh_use_this_rank_int