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