1*72d38120SMatthew G. Knepley static char help[] = "Test periodic DMDA for DMSwarm point location.\n"; 2*72d38120SMatthew G. Knepley 3*72d38120SMatthew G. Knepley #include <petscdmda.h> 4*72d38120SMatthew G. Knepley #include <petscdmswarm.h> 5*72d38120SMatthew G. Knepley 6*72d38120SMatthew G. Knepley typedef struct { 7*72d38120SMatthew G. Knepley PetscInt dim; // Mesh dimension 8*72d38120SMatthew G. Knepley PetscInt Np; // Number of particles along each dimension 9*72d38120SMatthew G. Knepley } UserContext; 10*72d38120SMatthew G. Knepley 11*72d38120SMatthew G. Knepley static PetscErrorCode ProcessOptions(UserContext *options) 12*72d38120SMatthew G. Knepley { 13*72d38120SMatthew G. Knepley PetscFunctionBeginUser; 14*72d38120SMatthew G. Knepley options->dim = 3; 15*72d38120SMatthew G. Knepley options->Np = -1; 16*72d38120SMatthew G. Knepley 17*72d38120SMatthew G. Knepley PetscCall(PetscOptionsGetInt(NULL, NULL, "-dim", &options->dim, NULL)); 18*72d38120SMatthew G. Knepley PetscCall(PetscOptionsGetInt(NULL, NULL, "-np", &options->Np, NULL)); 19*72d38120SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 20*72d38120SMatthew G. Knepley } 21*72d38120SMatthew G. Knepley 22*72d38120SMatthew G. Knepley static PetscErrorCode CreateMesh(DM *da, UserContext *user) 23*72d38120SMatthew G. Knepley { 24*72d38120SMatthew G. Knepley PetscReal gmin[3] = {0, 0., 0.}, gmax[3] = {0, 0., 0.}; 25*72d38120SMatthew G. Knepley 26*72d38120SMatthew G. Knepley PetscFunctionBeginUser; 27*72d38120SMatthew G. Knepley PetscCall(DMDACreate(PETSC_COMM_WORLD, da)); 28*72d38120SMatthew G. Knepley PetscCall(DMSetDimension(*da, user->dim)); 29*72d38120SMatthew G. Knepley PetscCall(DMDASetSizes(*da, 7, 7, 7)); 30*72d38120SMatthew G. Knepley PetscCall(DMDASetBoundaryType(*da, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED)); 31*72d38120SMatthew G. Knepley PetscCall(DMDASetDof(*da, 2)); 32*72d38120SMatthew G. Knepley PetscCall(DMDASetStencilType(*da, DMDA_STENCIL_BOX)); 33*72d38120SMatthew G. Knepley PetscCall(DMDASetStencilWidth(*da, 1)); 34*72d38120SMatthew G. Knepley PetscCall(DMDASetElementType(*da, DMDA_ELEMENT_Q1)); 35*72d38120SMatthew G. Knepley PetscCall(DMSetFromOptions(*da)); 36*72d38120SMatthew G. Knepley PetscCall(DMSetUp(*da)); 37*72d38120SMatthew G. Knepley PetscCall(DMDASetUniformCoordinates(*da, 0., 1., 0., 1., 0., 1.)); 38*72d38120SMatthew G. Knepley PetscCall(DMSetApplicationContext(*da, user)); 39*72d38120SMatthew G. Knepley PetscCall(DMView(*da, PETSC_VIEWER_STDOUT_WORLD)); 40*72d38120SMatthew G. Knepley PetscCall(DMGetBoundingBox(*da, gmin, gmax)); 41*72d38120SMatthew G. Knepley PetscCall(PetscPrintf(PETSC_COMM_WORLD, "min: (%g, %g, %g) max: (%g, %g, %g)\n", gmin[0], gmin[1], gmin[2], gmax[0], gmax[1], gmax[2])); 42*72d38120SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 43*72d38120SMatthew G. Knepley } 44*72d38120SMatthew G. Knepley 45*72d38120SMatthew G. Knepley static PetscErrorCode CreateSwarm(DM mesh, DM *swarm, UserContext *user) 46*72d38120SMatthew G. Knepley { 47*72d38120SMatthew G. Knepley MPI_Comm comm; 48*72d38120SMatthew G. Knepley PetscMPIInt size; 49*72d38120SMatthew G. Knepley PetscInt dim; 50*72d38120SMatthew G. Knepley 51*72d38120SMatthew G. Knepley PetscFunctionBeginUser; 52*72d38120SMatthew G. Knepley PetscCall(PetscObjectGetComm((PetscObject)mesh, &comm)); 53*72d38120SMatthew G. Knepley PetscCallMPI(MPI_Comm_size(comm, &size)); 54*72d38120SMatthew G. Knepley PetscCall(DMCreate(comm, swarm)); 55*72d38120SMatthew G. Knepley PetscCall(PetscObjectSetOptionsPrefix((PetscObject)(*swarm), "pic_")); 56*72d38120SMatthew G. Knepley PetscCall(DMSetType(*swarm, DMSWARM)); 57*72d38120SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)*swarm, "ions")); 58*72d38120SMatthew G. Knepley PetscCall(DMGetDimension(mesh, &dim)); 59*72d38120SMatthew G. Knepley PetscCall(DMSetDimension(*swarm, dim)); 60*72d38120SMatthew G. Knepley PetscCall(DMSwarmSetType(*swarm, DMSWARM_PIC)); 61*72d38120SMatthew G. Knepley PetscCall(DMSwarmSetCellDM(*swarm, mesh)); 62*72d38120SMatthew G. Knepley PetscCall(DMSwarmInitializeFieldRegister(*swarm)); 63*72d38120SMatthew G. Knepley PetscCall(DMSwarmFinalizeFieldRegister(*swarm)); 64*72d38120SMatthew G. Knepley PetscCall(DMSwarmSetLocalSizes(*swarm, user->Np / size, 0)); 65*72d38120SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 66*72d38120SMatthew G. Knepley } 67*72d38120SMatthew G. Knepley 68*72d38120SMatthew G. Knepley static PetscErrorCode InitializeParticles(DM sw, UserContext *user) 69*72d38120SMatthew G. Knepley { 70*72d38120SMatthew G. Knepley DM da; 71*72d38120SMatthew G. Knepley PetscReal gmin[3], gmax[3]; 72*72d38120SMatthew G. Knepley PetscInt ndir[3]; 73*72d38120SMatthew G. Knepley 74*72d38120SMatthew G. Knepley PetscFunctionBeginUser; 75*72d38120SMatthew G. Knepley PetscCall(DMSwarmGetCellDM(sw, &da)); 76*72d38120SMatthew G. Knepley PetscCall(DMGetBoundingBox(da, gmin, gmax)); 77*72d38120SMatthew G. Knepley ndir[0] = user->Np; 78*72d38120SMatthew G. Knepley ndir[1] = user->Np; 79*72d38120SMatthew G. Knepley ndir[2] = user->Np; 80*72d38120SMatthew G. Knepley PetscCall(DMSwarmSetPointsUniformCoordinates(sw, gmin, gmax, ndir, INSERT_VALUES)); 81*72d38120SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 82*72d38120SMatthew G. Knepley } 83*72d38120SMatthew G. Knepley 84*72d38120SMatthew G. Knepley int main(int argc, char **args) 85*72d38120SMatthew G. Knepley { 86*72d38120SMatthew G. Knepley DM dm, sw; 87*72d38120SMatthew G. Knepley UserContext user; 88*72d38120SMatthew G. Knepley 89*72d38120SMatthew G. Knepley PetscFunctionBeginUser; 90*72d38120SMatthew G. Knepley PetscCall(PetscInitialize(&argc, &args, NULL, help)); 91*72d38120SMatthew G. Knepley PetscCall(ProcessOptions(&user)); 92*72d38120SMatthew G. Knepley PetscCall(CreateMesh(&dm, &user)); 93*72d38120SMatthew G. Knepley PetscCall(CreateSwarm(dm, &sw, &user)); 94*72d38120SMatthew G. Knepley 95*72d38120SMatthew G. Knepley PetscCall(InitializeParticles(sw, &user)); 96*72d38120SMatthew G. Knepley PetscCall(DMSwarmMigrate(sw, PETSC_TRUE)); 97*72d38120SMatthew G. Knepley PetscCall(DMViewFromOptions(sw, NULL, "-sw_view")); 98*72d38120SMatthew G. Knepley 99*72d38120SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 100*72d38120SMatthew G. Knepley PetscCall(DMDestroy(&sw)); 101*72d38120SMatthew G. Knepley PetscCall(PetscFinalize()); 102*72d38120SMatthew G. Knepley return 0; 103*72d38120SMatthew G. Knepley } 104*72d38120SMatthew G. Knepley 105*72d38120SMatthew G. Knepley // ./dmswarm-coords -nx 8 -ny 8 -np 4 -pic_sw_view -dim 2 -periodic 0 106*72d38120SMatthew G. Knepley // ./dmswarm-coords -nx 8 -ny 8 -np 4 -pic_sw_view -dim 2 -periodic 1 107*72d38120SMatthew G. Knepley // ./dmswarm-coords -nx 8 -ny 8 -nz 8 -np 4 -pic_sw_view -dim 3 -periodic 0 108*72d38120SMatthew G. Knepley // ./dmswarm-coords -nx 8 -ny 8 -nz 8 -np 4 -pic_sw_view -dim 3 -periodic 1 109*72d38120SMatthew G. Knepley 110*72d38120SMatthew G. Knepley /*TEST 111*72d38120SMatthew G. Knepley 112*72d38120SMatthew G. Knepley build: 113*72d38120SMatthew G. Knepley requires: double !complex 114*72d38120SMatthew G. Knepley 115*72d38120SMatthew G. Knepley testset: 116*72d38120SMatthew G. Knepley suffix: 2d 117*72d38120SMatthew G. Knepley args: -dim 2 -da_grid_x 8 -da_grid_y 8 -np 4 -da_bd_all {{none periodic}} -pic_sw_view 118*72d38120SMatthew G. Knepley 119*72d38120SMatthew G. Knepley test: 120*72d38120SMatthew G. Knepley suffix: p1 121*72d38120SMatthew G. Knepley 122*72d38120SMatthew G. Knepley test: 123*72d38120SMatthew G. Knepley suffix: p2 124*72d38120SMatthew G. Knepley nsize: 2 125*72d38120SMatthew G. Knepley 126*72d38120SMatthew G. Knepley test: 127*72d38120SMatthew G. Knepley suffix: p4 128*72d38120SMatthew G. Knepley nsize: 4 129*72d38120SMatthew G. Knepley 130*72d38120SMatthew G. Knepley testset: 131*72d38120SMatthew G. Knepley suffix: 3d 132*72d38120SMatthew G. Knepley args: -dim 3 -da_grid_x 8 -da_grid_y 8 -da_grid_z 8 -np 4 -da_bd_all {{none periodic}} -pic_sw_view 133*72d38120SMatthew G. Knepley 134*72d38120SMatthew G. Knepley test: 135*72d38120SMatthew G. Knepley suffix: p1 136*72d38120SMatthew G. Knepley 137*72d38120SMatthew G. Knepley test: 138*72d38120SMatthew G. Knepley suffix: p2 139*72d38120SMatthew G. Knepley nsize: 2 140*72d38120SMatthew G. Knepley 141*72d38120SMatthew G. Knepley test: 142*72d38120SMatthew G. Knepley suffix: p4 143*72d38120SMatthew G. Knepley nsize: 4 144*72d38120SMatthew G. Knepley 145*72d38120SMatthew G. Knepley TEST*/ 146