xref: /petsc/src/ts/utils/dmplexlandau/tutorials/ex1f90.F90 (revision f14a7c29b82d1117d8e3de344377442be395a55f)
1e0eea495SMark! test phase space (Maxwellian) mesh construction (serial)
2e0eea495SMark!
3e0eea495SMark! Contributed by Mark Adams
4e0eea495SMark#include <petsc/finclude/petscts.h>
5e0eea495SMark#include <petsc/finclude/petscdmplex.h>
6c5e229c2SMartin Diehlprogram DMPlexTestLandauInterface
7ce78bad3SBarry Smith  use petscts
8ce78bad3SBarry Smith  use petscdmplex
9e0eea495SMark  implicit none
10ce78bad3SBarry Smith
118594ddcfSMark Adams  external DMPlexLandauIFunction
128594ddcfSMark Adams  external DMPlexLandauIJacobian
13e0eea495SMark  DM dm
14e0eea495SMark  PetscInt dim
15e0eea495SMark  PetscInt ii
16e0eea495SMark  PetscErrorCode ierr
17e0eea495SMark  TS ts
18e0eea495SMark  Vec X, X_0
19e0eea495SMark  Mat J
20e0eea495SMark  SNES snes
21e0eea495SMark  KSP ksp
22e0eea495SMark  PC pc
23e0eea495SMark  SNESLineSearch linesearch
24e0eea495SMark  PetscReal mone
25e0eea495SMark  PetscScalar scalar
26d8606c27SBarry Smith
27d8606c27SBarry Smith  PetscCallA(PetscInitialize(ierr))
28d8606c27SBarry Smith
29e0eea495SMark  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
30e0eea495SMark  !  Create mesh (DM), read in parameters, create and add f_0 (X)
31e0eea495SMark  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
32e0eea495SMark  dim = 2
33d8606c27SBarry Smith  PetscCallA(DMPlexLandauCreateVelocitySpace(PETSC_COMM_WORLD, dim, '', X, J, dm, ierr))
34d8606c27SBarry Smith  PetscCallA(DMSetUp(dm, ierr))
35d8606c27SBarry Smith  PetscCallA(VecDuplicate(X, X_0, ierr))
36d8606c27SBarry Smith  PetscCallA(VecCopy(X, X_0, ierr))
37e0eea495SMark  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
38e0eea495SMark  !  View
39e0eea495SMark  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
40e0eea495SMark  ii = 0
41d8606c27SBarry Smith  PetscCallA(DMPlexLandauPrintNorms(X, ii, ierr))
42ccfd86f1SBarry Smith  mone = 0
43d8606c27SBarry Smith  PetscCallA(DMSetOutputSequenceNumber(dm, ii, mone, ierr))
44e0eea495SMark  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
45e0eea495SMark  !    Create timestepping solver context
46e0eea495SMark  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
47d8606c27SBarry Smith  PetscCallA(TSCreate(PETSC_COMM_SELF, ts, ierr))
48d8606c27SBarry Smith  PetscCallA(TSSetOptionsPrefix(ts, 'ex1_', ierr)) ! should get this from the dm or give it to the dm
49d8606c27SBarry Smith  PetscCallA(TSSetDM(ts, dm, ierr))
50d8606c27SBarry Smith  PetscCallA(TSGetSNES(ts, snes, ierr))
51d8606c27SBarry Smith  PetscCallA(SNESSetOptionsPrefix(snes, 'ex1_', ierr)) ! should get this from the dm or give it to the dm
52d8606c27SBarry Smith  PetscCallA(SNESGetLineSearch(snes, linesearch, ierr))
53d8606c27SBarry Smith  PetscCallA(SNESLineSearchSetType(linesearch, SNESLINESEARCHBASIC, ierr))
54d8606c27SBarry Smith  PetscCallA(TSSetIFunction(ts, PETSC_NULL_VEC, DMPlexLandauIFunction, PETSC_NULL_VEC, ierr))
55d8606c27SBarry Smith  PetscCallA(TSSetIJacobian(ts, J, J, DMPlexLandauIJacobian, PETSC_NULL_VEC, ierr))
56d8606c27SBarry Smith  PetscCallA(TSSetExactFinalTime(ts, TS_EXACTFINALTIME_STEPOVER, ierr))
57e0eea495SMark
58d8606c27SBarry Smith  PetscCallA(SNESGetKSP(snes, ksp, ierr))
59d8606c27SBarry Smith  PetscCallA(KSPSetOptionsPrefix(ksp, 'ex1_', ierr)) ! should get this from the dm or give it to the dm
60d8606c27SBarry Smith  PetscCallA(KSPGetPC(ksp, pc, ierr))
61d8606c27SBarry Smith  PetscCallA(PCSetOptionsPrefix(pc, 'ex1_', ierr)) ! should get this from the dm or give it to the dm
62e0eea495SMark
63d8606c27SBarry Smith  PetscCallA(TSSetFromOptions(ts, ierr))
64d8606c27SBarry Smith  PetscCallA(TSSetSolution(ts, X, ierr))
65e0eea495SMark  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
66e0eea495SMark  !  Solve nonlinear system
67e0eea495SMark  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
68d8606c27SBarry Smith  PetscCallA(TSSolve(ts, X, ierr))
69e0eea495SMark  ii = 1
70d8606c27SBarry Smith  PetscCallA(DMPlexLandauPrintNorms(X, ii, ierr))
71d8606c27SBarry Smith  PetscCallA(TSGetTime(ts, mone, ierr))
72d8606c27SBarry Smith  PetscCallA(DMSetOutputSequenceNumber(dm, ii, mone, ierr))
73e0eea495SMark  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
74e0eea495SMark  !  remove f_0
75e0eea495SMark  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
76e0eea495SMark  scalar = -1.
77d8606c27SBarry Smith  PetscCallA(VecAXPY(X, scalar, X_0, ierr))
78d8606c27SBarry Smith  PetscCallA(DMPlexLandauDestroyVelocitySpace(dm, ierr))
79d8606c27SBarry Smith  PetscCallA(TSDestroy(ts, ierr))
80d8606c27SBarry Smith  PetscCallA(VecDestroy(X, ierr))
81d8606c27SBarry Smith  PetscCallA(VecDestroy(X_0, ierr))
82d8606c27SBarry Smith  PetscCallA(PetscFinalize(ierr))
83e0eea495SMarkend program DMPlexTestLandauInterface
84e0eea495SMark
85e0eea495SMark!/*TEST
86*1c4a1a5bSMartin Diehl!
87e0eea495SMark!  build:
88ccfb0f9fSMartin Diehl!    requires: defined(PETSC_USE_DMLANDAU_2D)
89e0eea495SMark!
90e0eea495SMark!  test:
91e0eea495SMark!    suffix: 0
9209cb0f53SBarry Smith!    requires: p4est !complex !kokkos_kernels !cuda
93188af4bfSBarry Smith!    args: -dm_landau_num_species_grid 1,2 -petscspace_degree 3 -petscspace_poly_tensor 1 -dm_landau_type p4est -dm_landau_ion_masses 2,4 -dm_landau_ion_charges 1,18 -dm_landau_thermal_temps 5,5,.5 -dm_landau_n 1.00018,1,1e-5 -dm_landau_n_0 1e20 -ex1_ts_monitor -ex1_snes_rtol 1.e-14 -ex1_snes_stol 1.e-14 -ex1_snes_monitor -ex1_snes_converged_reason -ex1_ts_type arkimex -ex1_ts_arkimex_type 1bee -ex1_ts_max_snes_failures unlimited -ex1_ts_rtol 1e-1 -ex1_ts_time_step 1.e-3 -ex1_ts_max_time 1 -ex1_ts_adapt_clip .5,1.25 -ex1_ts_adapt_scale_solve_failed 0.75 -ex1_ts_adapt_time_step_increase_delay 5 -ex1_ts_max_steps 1 -ex1_pc_type lu -ex1_ksp_type preonly -dm_landau_amr_levels_max 2,1 -dm_landau_device_type cpu -dm_landau_verbose 4 -dm_landau_normalization_grid 1
94e0eea495SMark!
95e0eea495SMark!TEST*/
96