xref: /petsc/src/ts/utils/dmplexlandau/tutorials/ex1.c (revision 24ded41b4e3afbef0dd5eaa1b3d8dd0172f6dba2)
1e0eea495SMark static char help[] = "Landau collision operator driver\n\n";
2e0eea495SMark 
3e0eea495SMark #include <petscts.h>
4e0eea495SMark #include <petsclandau.h>
5e0eea495SMark 
6*24ded41bSmarkadams4 typedef struct {
7*24ded41bSmarkadams4   PetscInt  grid_target, batch_target, field_target;
8*24ded41bSmarkadams4   PetscBool init;
9*24ded41bSmarkadams4 } ex1Ctx;
10*24ded41bSmarkadams4 
11*24ded41bSmarkadams4 /*
12*24ded41bSmarkadams4  call back method for DMPlexLandauAddToFunction:
13*24ded41bSmarkadams4 
14*24ded41bSmarkadams4 Input Parameters:
15*24ded41bSmarkadams4  .   dm - a DM for this field
16*24ded41bSmarkadams4  -   local_field - the local index in the grid for this field
17*24ded41bSmarkadams4  .   grid - the grid index
18*24ded41bSmarkadams4  +   b_id - the batch index
19*24ded41bSmarkadams4  -   vctx - a user context
20*24ded41bSmarkadams4 
21*24ded41bSmarkadams4  Input/Output Parameters:
22*24ded41bSmarkadams4  +   x - Vector to data to
23*24ded41bSmarkadams4 
24*24ded41bSmarkadams4  */
25*24ded41bSmarkadams4 PetscErrorCode landau_field_add_to_callback(DM dm, Vec x, PetscInt local_field,  PetscInt grid, PetscInt b_id, void *vctx)
26*24ded41bSmarkadams4 {
27*24ded41bSmarkadams4   ex1Ctx *user = (ex1Ctx*)vctx;
28*24ded41bSmarkadams4 
29*24ded41bSmarkadams4   PetscFunctionBegin;
30*24ded41bSmarkadams4   if (grid == user->grid_target && b_id==user->batch_target && local_field==user->field_target) {
31*24ded41bSmarkadams4     PetscScalar one = 1.0;
32*24ded41bSmarkadams4     PetscCall(VecSet(x,one));
33*24ded41bSmarkadams4     if (!user->init) {
34*24ded41bSmarkadams4       PetscCall(PetscObjectSetName((PetscObject)dm, "single"));
35*24ded41bSmarkadams4       PetscCall(DMViewFromOptions(dm,NULL,"-ex1_dm_view"));
36*24ded41bSmarkadams4       user->init = PETSC_TRUE;
37*24ded41bSmarkadams4     }
38*24ded41bSmarkadams4     PetscCall(PetscObjectSetName((PetscObject)x, "u"));
39*24ded41bSmarkadams4     PetscCall(VecViewFromOptions(x,NULL,"-ex1_vec_view")); // this causes diffs with Kokkos, etc
40*24ded41bSmarkadams4     PetscCall(PetscInfo(dm, "DMPlexLandauAddToFunction user 'add' method to grid %" PetscInt_FMT ", batch %" PetscInt_FMT " and local field %" PetscInt_FMT "\n",grid,b_id,local_field));
41*24ded41bSmarkadams4   }
42*24ded41bSmarkadams4   PetscFunctionReturn(0);
43*24ded41bSmarkadams4 }
44*24ded41bSmarkadams4 
45e0eea495SMark int main(int argc, char **argv)
46e0eea495SMark {
47*24ded41bSmarkadams4   DM             pack;
48e0eea495SMark   Vec            X,X_0;
49e0eea495SMark   PetscInt       dim=2;
50e0eea495SMark   TS             ts;
51e0eea495SMark   Mat            J;
52e0eea495SMark   SNES           snes;
53e0eea495SMark   KSP            ksp;
54e0eea495SMark   PC             pc;
55e0eea495SMark   SNESLineSearch linesearch;
56e0eea495SMark   PetscReal      time;
57e0eea495SMark 
589566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL,help));
599566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL,NULL, "-dim", &dim, NULL));
60e0eea495SMark   /* Create a mesh */
61*24ded41bSmarkadams4   PetscCall(DMPlexLandauCreateVelocitySpace(PETSC_COMM_SELF, dim, "", &X, &J, &pack));
62*24ded41bSmarkadams4   PetscCall(DMSetUp(pack));
639566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(X,&X_0));
649566063dSJacob Faibussowitsch   PetscCall(VecCopy(X,X_0));
659566063dSJacob Faibussowitsch   PetscCall(DMPlexLandauPrintNorms(X,0));
66*24ded41bSmarkadams4   PetscCall(DMSetOutputSequenceNumber(pack, 0, 0.0));
67e0eea495SMark   /* Create timestepping solver context */
689566063dSJacob Faibussowitsch   PetscCall(TSCreate(PETSC_COMM_SELF,&ts));
69*24ded41bSmarkadams4   PetscCall(TSSetDM(ts,pack));
709566063dSJacob Faibussowitsch   PetscCall(TSGetSNES(ts,&snes));
719566063dSJacob Faibussowitsch   PetscCall(SNESGetLineSearch(snes,&linesearch));
729566063dSJacob Faibussowitsch   PetscCall(SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC));
739566063dSJacob Faibussowitsch   PetscCall(TSSetIFunction(ts,NULL,DMPlexLandauIFunction,NULL));
749566063dSJacob Faibussowitsch   PetscCall(TSSetIJacobian(ts,J,J,DMPlexLandauIJacobian,NULL));
759566063dSJacob Faibussowitsch   PetscCall(TSSetExactFinalTime(ts,TS_EXACTFINALTIME_STEPOVER));
769566063dSJacob Faibussowitsch   PetscCall(SNESGetKSP(snes,&ksp));
779566063dSJacob Faibussowitsch   PetscCall(KSPGetPC(ksp,&pc));
789566063dSJacob Faibussowitsch   PetscCall(TSSetFromOptions(ts));
799566063dSJacob Faibussowitsch   PetscCall(TSSetSolution(ts,X));
809566063dSJacob Faibussowitsch   PetscCall(TSSolve(ts,X));
819566063dSJacob Faibussowitsch   PetscCall(DMPlexLandauPrintNorms(X,1));
829566063dSJacob Faibussowitsch   PetscCall(TSGetTime(ts, &time));
83*24ded41bSmarkadams4   PetscCall(DMSetOutputSequenceNumber(pack, 1, time));
849566063dSJacob Faibussowitsch   PetscCall(VecAXPY(X,-1,X_0));
85*24ded41bSmarkadams4   { /* test add field method */
86*24ded41bSmarkadams4     ex1Ctx *user;
87*24ded41bSmarkadams4     PetscCall(PetscNew(&user));
88*24ded41bSmarkadams4     user->grid_target = 1; // 2nd ion species
89*24ded41bSmarkadams4     user->field_target = 1;
90*24ded41bSmarkadams4     PetscCall(DMPlexLandauAddToFunction(pack,X,landau_field_add_to_callback,user));
91*24ded41bSmarkadams4     PetscCall(PetscFree(user));
92*24ded41bSmarkadams4   }
93e0eea495SMark   /* clean up */
94*24ded41bSmarkadams4   PetscCall(DMPlexLandauDestroyVelocitySpace(&pack));
959566063dSJacob Faibussowitsch   PetscCall(TSDestroy(&ts));
969566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&X));
979566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&X_0));
989566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
99b122ec5aSJacob Faibussowitsch   return 0;
100e0eea495SMark }
101e0eea495SMark 
102e0eea495SMark /*TEST
1035dac466eSMark Adams   testset:
104984ed092SMark Adams     requires: p4est !complex double defined(PETSC_USE_DMLANDAU_2D)
1055dac466eSMark Adams     output_file: output/ex1_0.out
106*24ded41bSmarkadams4     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 -ts_monitor -snes_rtol 1.e-14 -snes_stol 1.e-14 -snes_monitor -snes_converged_reason -ts_type arkimex -ts_arkimex_type 1bee -ts_max_snes_failures -1 -ts_rtol 1e-1 -ts_dt 1.e-1 -ts_max_time 1 -ts_adapt_clip .5,1.25 -ts_adapt_scale_solve_failed 0.75 -ts_adapt_time_step_increase_delay 5 -ts_max_steps 1 -pc_type lu -ksp_type preonly -dm_landau_amr_levels_max 2,1 -ex1_dm_view  -ex1_vec_view
107e0eea495SMark     test:
1085dac466eSMark Adams       suffix: cpu
1095dac466eSMark Adams       args: -dm_landau_device_type cpu
1105dac466eSMark Adams     test:
1115dac466eSMark Adams       suffix: kokkos
1125dac466eSMark Adams       requires: kokkos_kernels
1135dac466eSMark Adams       args: -dm_landau_device_type kokkos -dm_mat_type aijkokkos -dm_vec_type kokkos
1145dac466eSMark Adams     test:
1155dac466eSMark Adams       suffix: cuda
1165dac466eSMark Adams       requires: cuda
1175dac466eSMark Adams       args: -dm_landau_device_type cuda -dm_mat_type aijcusparse -dm_vec_type cuda -mat_cusparse_use_cpu_solve
118e0eea495SMark 
119e0eea495SMark TEST*/
120