1*e0eea495SMark! test phase space (Maxwellian) mesh construction (serial) 2*e0eea495SMark! 3*e0eea495SMark!run: 4*e0eea495SMark! -${MPIEXEC} .... 5*e0eea495SMark! -@${PETSC_DIR}/lib/petsc/bin/petsc_gen_xdmf.py *.h5 6*e0eea495SMark! 7*e0eea495SMark! 8*e0eea495SMark! Contributed by Mark Adams 9*e0eea495SMarkprogram DMPlexTestLandauInterface 10*e0eea495SMark use petscts 11*e0eea495SMark use petscdmplex 12*e0eea495SMark#include <petsc/finclude/petscts.h> 13*e0eea495SMark#include <petsc/finclude/petscdmplex.h> 14*e0eea495SMark implicit none 15*e0eea495SMark external LandauIFunction 16*e0eea495SMark external LandauIJacobian 17*e0eea495SMark DM dm 18*e0eea495SMark PetscInt dim 19*e0eea495SMark PetscInt ii 20*e0eea495SMark PetscErrorCode ierr 21*e0eea495SMark TS ts 22*e0eea495SMark Vec X,X_0 23*e0eea495SMark Mat J 24*e0eea495SMark SNES snes 25*e0eea495SMark KSP ksp 26*e0eea495SMark PC pc 27*e0eea495SMark SNESLineSearch linesearch 28*e0eea495SMark PetscReal mone 29*e0eea495SMark PetscScalar scalar 30*e0eea495SMark call PetscInitialize(PETSC_NULL_CHARACTER, ierr) 31*e0eea495SMark if (ierr .ne. 0) then 32*e0eea495SMark print*,'Unable to initialize PETSc' 33*e0eea495SMark stop 34*e0eea495SMark endif 35*e0eea495SMark ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 36*e0eea495SMark ! Create mesh (DM), read in parameters, create and add f_0 (X) 37*e0eea495SMark ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 38*e0eea495SMark dim = 2 39*e0eea495SMark call LandauCreateVelocitySpace(PETSC_COMM_SELF, dim, '', X, J, dm, ierr);CHKERRA(ierr) 40*e0eea495SMark call LandauCreateMassMatrix(dm, PETSC_NULL_MAT, ierr);CHKERRA(ierr) 41*e0eea495SMark call DMSetUp(dm,ierr);CHKERRA(ierr) 42*e0eea495SMark call VecDuplicate(X,X_0,ierr);CHKERRA(ierr) 43*e0eea495SMark call VecCopy(X,X_0,ierr) 44*e0eea495SMark ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 45*e0eea495SMark ! View 46*e0eea495SMark ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 47*e0eea495SMark ii = 0 48*e0eea495SMark call LandauPrintNorms(X,ii,ierr);CHKERRA(ierr) 49*e0eea495SMark mone = 0; 50*e0eea495SMark call DMSetOutputSequenceNumber(dm, ii, mone, ierr);CHKERRA(ierr); 51*e0eea495SMark ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 52*e0eea495SMark ! Create timestepping solver context 53*e0eea495SMark ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 54*e0eea495SMark call TSCreate(PETSC_COMM_SELF,ts,ierr);CHKERRA(ierr) 55*e0eea495SMark call TSSetOptionsPrefix(ts, 'ex1f90_', ierr);CHKERRA(ierr) ! should get this from the dm or give it to the dm 56*e0eea495SMark call TSSetDM(ts,dm,ierr);CHKERRA(ierr) 57*e0eea495SMark call TSGetSNES(ts,snes,ierr);CHKERRA(ierr) 58*e0eea495SMark call SNESSetOptionsPrefix(snes, 'ex1f90_', ierr);CHKERRA(ierr) ! should get this from the dm or give it to the dm 59*e0eea495SMark call SNESGetLineSearch(snes,linesearch,ierr);CHKERRA(ierr) 60*e0eea495SMark call SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC,ierr);CHKERRA(ierr) 61*e0eea495SMark call TSSetIFunction(ts,PETSC_NULL_VEC,LandauIFunction,PETSC_NULL_VEC,ierr);CHKERRA(ierr) 62*e0eea495SMark call TSSetIJacobian(ts,J,J,LandauIJacobian,PETSC_NULL_VEC,ierr);CHKERRA(ierr) 63*e0eea495SMark call TSSetExactFinalTime(ts,TS_EXACTFINALTIME_STEPOVER,ierr);CHKERRA(ierr) 64*e0eea495SMark 65*e0eea495SMark call SNESGetKSP(snes,ksp,ierr);CHKERRA(ierr) 66*e0eea495SMark call KSPSetOptionsPrefix(ksp, 'ex1f90_', ierr);CHKERRA(ierr) ! should get this from the dm or give it to the dm 67*e0eea495SMark call KSPGetPC(ksp,pc,ierr);CHKERRA(ierr) 68*e0eea495SMark call PCSetOptionsPrefix(pc, 'ex1f90_', ierr);CHKERRA(ierr) ! should get this from the dm or give it to the dm 69*e0eea495SMark 70*e0eea495SMark call TSSetFromOptions(ts,ierr);CHKERRA(ierr) 71*e0eea495SMark call TSSetSolution(ts,X,ierr);CHKERRA(ierr) 72*e0eea495SMark ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 73*e0eea495SMark ! Solve nonlinear system 74*e0eea495SMark ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 75*e0eea495SMark call TSSolve(ts,X,ierr);CHKERRA(ierr) 76*e0eea495SMark ii = 1 77*e0eea495SMark call LandauPrintNorms(X,ii,ierr);CHKERRA(ierr) 78*e0eea495SMark call TSGetTime(ts, mone, ierr);CHKERRA(ierr); 79*e0eea495SMark call DMSetOutputSequenceNumber(dm, ii, mone, ierr);CHKERRA(ierr); 80*e0eea495SMark ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 81*e0eea495SMark ! remove f_0 82*e0eea495SMark ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 83*e0eea495SMark scalar = -1. 84*e0eea495SMark call VecAXPY(X,scalar,X_0,ierr);CHKERRA(ierr) 85*e0eea495SMark call LandauDestroyVelocitySpace(dm, ierr);CHKERRA(ierr) 86*e0eea495SMark call TSDestroy(ts, ierr);CHKERRA(ierr) 87*e0eea495SMark call VecDestroy(X, ierr);CHKERRA(ierr) 88*e0eea495SMark call VecDestroy(X_0, ierr);CHKERRA(ierr) 89*e0eea495SMark call PetscFinalize(ierr) 90*e0eea495SMarkend program DMPlexTestLandauInterface 91*e0eea495SMark 92*e0eea495SMark!/*TEST 93*e0eea495SMark! build: 94*e0eea495SMark! requires: define(PETSC_USING_F90FREEFORM) 95*e0eea495SMark! 96*e0eea495SMark! test: 97*e0eea495SMark! suffix: 0 98*e0eea495SMark! requires: p4est !complex 99*e0eea495SMark! args: -petscspace_degree 4 -petscspace_poly_tensor 1 -dm_landau_type p4est -info :dm,tsadapt -dm_landau_ion_masses 2,4 -dm_landau_ion_charges 1,8 -dm_landau_thermal_temps 5,5,.5 -dm_landau_n 1.00018,1,1e-5 -dm_landau_n_0 1e20 -ex1f90_ts_monitor -ex1f90_snes_rtol 1.e-6 -ex1f90_snes_monitor -ex1f90_snes_converged_reason -ex1f90_ts_type arkimex -ex1f90_ts_arkimex_type 1bee -ex1f90_ts_max_snes_failures -1 -ex1f90_ts_rtol 1e-4 -ex1f90_ts_dt 1.e-6 -ex1f90_ts_max_time 1 -ex1f90_ts_adapt_clip .5,1.25 -ex1f90_ts_adapt_scale_solve_failed 0.75 -ex1f90_ts_adapt_time_step_increase_delay 5 -ex1f90_ts_max_steps 1 -ex1f90_pc_type lu -ex1f90_ksp_type preonly -dm_landau_amr_levels_max 7 -dm_landau_domain_radius 5 -dm_landau_amr_re_levels 0 -dm_landau_re_radius 1 -dm_landau_amr_z_refine1 1 -dm_landau_amr_z_refine2 0 -dm_landau_amr_post_refine 0 -dm_landau_z_radius1 .1 -dm_landau_z_radius2 .1 -dm_refine 1 -dm_landau_device_type cpu 100*e0eea495SMark! 101*e0eea495SMark!TEST*/ 102