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