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