xref: /petsc/src/ts/utils/dmplexlandau/tutorials/ex1f90.F90 (revision e600fa544e2bb197ca2af9b6e65ea465976dec56)
1! test phase space (Maxwellian) mesh construction (serial)
2!
3!run:
4!       -${MPIEXEC} ....
5!       -@${PETSC_DIR}/lib/petsc/bin/petsc_gen_xdmf.py *.h5
6!
7!
8! Contributed by Mark Adams
9program DMPlexTestLandauInterface
10  use petscts
11  use petscdmplex
12#include <petsc/finclude/petscts.h>
13#include <petsc/finclude/petscdmplex.h>
14  implicit none
15  external LandauIFunction
16  external LandauIJacobian
17  DM             dm
18  PetscInt       dim
19  PetscInt       ii
20  PetscErrorCode ierr
21  TS             ts
22  Vec            X,X_0
23  Mat            J
24  SNES           snes
25  KSP            ksp
26  PC             pc
27  SNESLineSearch linesearch
28  PetscReal      mone
29  PetscScalar    scalar
30  call PetscInitialize(PETSC_NULL_CHARACTER, ierr)
31  if (ierr .ne. 0) then
32     print*,'Unable to initialize PETSc'
33     stop
34  endif
35  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
36  !  Create mesh (DM), read in parameters, create and add f_0 (X)
37  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
38  dim = 2
39  call LandauCreateVelocitySpace(PETSC_COMM_WORLD, dim, '', X, J, dm, ierr);CHKERRA(ierr)
40  call DMSetUp(dm,ierr);CHKERRA(ierr)
41  call VecDuplicate(X,X_0,ierr);CHKERRA(ierr)
42  call VecCopy(X,X_0,ierr)
43  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
44  !  View
45  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
46  ii = 0
47  call LandauPrintNorms(X,ii,ierr);CHKERRA(ierr)
48  mone = 0;
49  call DMSetOutputSequenceNumber(dm, ii, mone, ierr);CHKERRA(ierr);
50  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
51  !    Create timestepping solver context
52  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
53  call TSCreate(PETSC_COMM_SELF,ts,ierr);CHKERRA(ierr)
54  call TSSetOptionsPrefix(ts, 'ex1_', ierr);CHKERRA(ierr) ! should get this from the dm or give it to the dm
55  call TSSetDM(ts,dm,ierr);CHKERRA(ierr)
56  call TSGetSNES(ts,snes,ierr);CHKERRA(ierr)
57  call SNESSetOptionsPrefix(snes, 'ex1_', ierr);CHKERRA(ierr) ! should get this from the dm or give it to the dm
58  call SNESGetLineSearch(snes,linesearch,ierr);CHKERRA(ierr)
59  call SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC,ierr);CHKERRA(ierr)
60  call TSSetIFunction(ts,PETSC_NULL_VEC,LandauIFunction,PETSC_NULL_VEC,ierr);CHKERRA(ierr)
61  call TSSetIJacobian(ts,J,J,LandauIJacobian,PETSC_NULL_VEC,ierr);CHKERRA(ierr)
62  call TSSetExactFinalTime(ts,TS_EXACTFINALTIME_STEPOVER,ierr);CHKERRA(ierr)
63
64  call SNESGetKSP(snes,ksp,ierr);CHKERRA(ierr)
65  call KSPSetOptionsPrefix(ksp, 'ex1_', ierr);CHKERRA(ierr) ! should get this from the dm or give it to the dm
66  call KSPGetPC(ksp,pc,ierr);CHKERRA(ierr)
67  call PCSetOptionsPrefix(pc, 'ex1_', ierr);CHKERRA(ierr) ! should get this from the dm or give it to the dm
68
69  call TSSetFromOptions(ts,ierr);CHKERRA(ierr)
70  call TSSetSolution(ts,X,ierr);CHKERRA(ierr)
71  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
72  !  Solve nonlinear system
73  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
74  call TSSolve(ts,X,ierr);CHKERRA(ierr)
75  ii = 1
76  call LandauPrintNorms(X,ii,ierr);CHKERRA(ierr)
77  call TSGetTime(ts, mone, ierr);CHKERRA(ierr);
78  call DMSetOutputSequenceNumber(dm, ii, mone, ierr);CHKERRA(ierr);
79  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
80  !  remove f_0
81  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
82  scalar = -1.
83  call VecAXPY(X,scalar,X_0,ierr);CHKERRA(ierr)
84  call LandauDestroyVelocitySpace(dm, ierr);CHKERRA(ierr)
85  call TSDestroy(ts, ierr);CHKERRA(ierr)
86  call VecDestroy(X, ierr);CHKERRA(ierr)
87  call VecDestroy(X_0, ierr);CHKERRA(ierr)
88  call PetscFinalize(ierr)
89end program DMPlexTestLandauInterface
90
91!/*TEST
92!  build:
93!    requires: defined(PETSC_USING_F90FREEFORM)
94!
95!  test:
96!    suffix: 0
97!    requires: p4est !complex  !kokkos_kernels !cuda
98!    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 -1 -ex1_ts_rtol 1e-1 -ex1_ts_dt 1.e-1 -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
99!
100!TEST*/
101