Actual source code: ex1f90.F90

  1: ! test phase space (Maxwellian) mesh construction (serial)
  2: !
  3: ! Contributed by Mark Adams
  4: #include <petsc/finclude/petscts.h>
  5: #include <petsc/finclude/petscdmplex.h>
  6: program DMPlexTestLandauInterface
  7:   use petscts
  8:   use petscdmplex
  9:   implicit none

 11:   external DMPlexLandauIFunction
 12:   external DMPlexLandauIJacobian
 13:   DM dm
 14:   PetscInt, parameter :: dim = 2
 15:   PetscErrorCode ierr
 16:   TS ts
 17:   Vec X, X_0
 18:   Mat J
 19:   SNES snes
 20:   KSP ksp
 21:   PC pc
 22:   SNESLineSearch linesearch
 23:   PetscReal :: time
 24:   PetscScalar, parameter :: scalar = -1.0

 26:   PetscCallA(PetscInitialize(ierr))

 28:   ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 29:   !  Create mesh (DM), read in parameters, create and add f_0 (X)
 30:   ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 31:   PetscCallA(DMPlexLandauCreateVelocitySpace(PETSC_COMM_WORLD, dim, '', X, J, dm, ierr))
 32:   PetscCallA(DMSetUp(dm, ierr))
 33:   PetscCallA(VecDuplicate(X, X_0, ierr))
 34:   PetscCallA(VecCopy(X, X_0, ierr))
 35:   ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 36:   !  View
 37:   ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 38:   PetscCallA(DMPlexLandauPrintNorms(X, 0_PETSC_INT_KIND, ierr))
 39:   PetscCallA(DMSetOutputSequenceNumber(dm, 0_PETSC_INT_KIND, 0.0_PETSC_REAL_KIND, ierr))
 40:   ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 41:   !    Create timestepping solver context
 42:   ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 43:   PetscCallA(TSCreate(PETSC_COMM_SELF, ts, ierr))
 44:   PetscCallA(TSSetOptionsPrefix(ts, 'ex1_', ierr)) ! should get this from the dm or give it to the dm
 45:   PetscCallA(TSSetDM(ts, dm, ierr))
 46:   PetscCallA(TSGetSNES(ts, snes, ierr))
 47:   PetscCallA(SNESSetOptionsPrefix(snes, 'ex1_', ierr)) ! should get this from the dm or give it to the dm
 48:   PetscCallA(SNESGetLineSearch(snes, linesearch, ierr))
 49:   PetscCallA(SNESLineSearchSetType(linesearch, SNESLINESEARCHBASIC, ierr))
 50:   PetscCallA(TSSetIFunction(ts, PETSC_NULL_VEC, DMPlexLandauIFunction, PETSC_NULL_VEC, ierr))
 51:   PetscCallA(TSSetIJacobian(ts, J, J, DMPlexLandauIJacobian, PETSC_NULL_VEC, ierr))
 52:   PetscCallA(TSSetExactFinalTime(ts, TS_EXACTFINALTIME_STEPOVER, ierr))

 54:   PetscCallA(SNESGetKSP(snes, ksp, ierr))
 55:   PetscCallA(KSPSetOptionsPrefix(ksp, 'ex1_', ierr)) ! should get this from the dm or give it to the dm
 56:   PetscCallA(KSPGetPC(ksp, pc, ierr))
 57:   PetscCallA(PCSetOptionsPrefix(pc, 'ex1_', ierr)) ! should get this from the dm or give it to the dm

 59:   PetscCallA(TSSetFromOptions(ts, ierr))
 60:   PetscCallA(TSSetSolution(ts, X, ierr))
 61:   ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 62:   !  Solve nonlinear system
 63:   ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 64:   PetscCallA(TSSolve(ts, X, ierr))
 65:   PetscCallA(DMPlexLandauPrintNorms(X, 1_PETSC_INT_KIND, ierr))
 66:   PetscCallA(TSGetTime(ts, time, ierr))
 67:   PetscCallA(DMSetOutputSequenceNumber(dm, 1_PETSC_INT_KIND, time, ierr))
 68:   ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 69:   !  remove f_0
 70:   ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 71:   PetscCallA(VecAXPY(X, scalar, X_0, ierr))
 72:   PetscCallA(DMPlexLandauDestroyVelocitySpace(dm, ierr))
 73:   PetscCallA(TSDestroy(ts, ierr))
 74:   PetscCallA(VecDestroy(X, ierr))
 75:   PetscCallA(VecDestroy(X_0, ierr))
 76:   PetscCallA(PetscFinalize(ierr))
 77: end program DMPlexTestLandauInterface

 79: !/*TEST
 80: !
 81: !  build:
 82: !    requires: defined(PETSC_USE_DMLANDAU_2D)
 83: !
 84: !  test:
 85: !    suffix: 0
 86: !    requires: p4est !complex !kokkos_kernels !cuda
 87: !    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
 88: !
 89: !TEST*/