xref: /libCEED/examples/petsc/include/swarmutils.h (revision 78f7fce354c760f980d0580f63d29ea51c63cedc)
1b6972d74SZach Atkins // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
2b6972d74SZach Atkins // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3b6972d74SZach Atkins //
4b6972d74SZach Atkins // SPDX-License-Identifier: BSD-2-Clause
5b6972d74SZach Atkins //
6b6972d74SZach Atkins // This file is part of CEED:  http://github.com/ceed
7b6972d74SZach Atkins 
8b6972d74SZach Atkins /// @file
9b6972d74SZach Atkins /// Utility functions for particle-based methods with DMSwarm
10b6972d74SZach Atkins 
11b6972d74SZach Atkins #pragma once
12b6972d74SZach Atkins 
13b6972d74SZach Atkins #include <ceed.h>
14b6972d74SZach Atkins #include <math.h>
15b6972d74SZach Atkins #include <petscdmplex.h>
16b6972d74SZach Atkins #include <petscdmswarm.h>
17b6972d74SZach Atkins #include <petsc/private/petscfeimpl.h> /* For interpolation */
18b6972d74SZach Atkins 
19b6972d74SZach Atkins #include "petscutils.h"
20b6972d74SZach Atkins 
21b6972d74SZach Atkins // libCEED context data
22b6972d74SZach Atkins typedef struct DMSwarmCeedContext_ *DMSwarmCeedContext;
23b6972d74SZach Atkins struct DMSwarmCeedContext_ {
24b6972d74SZach Atkins   Ceed         ceed;
25b6972d74SZach Atkins   CeedVector   u_mesh, v_mesh, u_points;
26b6972d74SZach Atkins   CeedOperator op_mass, op_mesh_to_points, op_points_to_mesh;
27b6972d74SZach Atkins };
28b6972d74SZach Atkins 
29b6972d74SZach Atkins PetscErrorCode DMSwarmCeedContextCreate(DM dm_swarm, const char *ceed_resource, DMSwarmCeedContext *ctx);
30b6972d74SZach Atkins PetscErrorCode DMSwarmCeedContextDestroy(DMSwarmCeedContext *ctx);
31b6972d74SZach Atkins 
32b6972d74SZach Atkins // Swarm point distribution
33b6972d74SZach Atkins typedef enum { SWARM_GAUSS = 0, SWARM_UNIFORM = 1, SWARM_CELL_RANDOM = 2, SWARM_SINUSOIDAL = 3 } PointSwarmType;
34b6972d74SZach Atkins static const char *const point_swarm_types[] = {"gauss", "uniform", "cell_random", "sinusoidal", "PointSwarmType", "SWARM", 0};
35b6972d74SZach Atkins 
36b6972d74SZach Atkins // Memory utilities
37b6972d74SZach Atkins PetscErrorCode DMSwarmPICFieldP2C(DM dm_swarm, const char *field, CeedVector x_ceed);
38b6972d74SZach Atkins PetscErrorCode DMSwarmPICFieldC2P(DM dm_swarm, const char *field, CeedVector x_ceed);
39b6972d74SZach Atkins 
40b6972d74SZach Atkins // Swarm helper function
41b6972d74SZach Atkins PetscErrorCode DMSwarmInitalizePointLocations(DM dm_swarm, PointSwarmType point_swarm_type, PetscInt num_points, PetscInt num_points_per_cell);
42b6972d74SZach Atkins PetscErrorCode DMSwarmCreateReferenceCoordinates(DM dm_swarm, IS *is_points, Vec *ref_coords);
43b6972d74SZach Atkins 
44b6972d74SZach Atkins // Swarm to mesh projection
45*78f7fce3SZach Atkins PetscErrorCode DMSwarmCreateProjectionRHS(DM dm_swarm, const char *field, Vec U_points, Vec B_mesh);
46b6972d74SZach Atkins PetscErrorCode MatMult_SwarmMass(Mat A, Vec U_mesh, Vec V_mesh);
47*78f7fce3SZach Atkins PetscErrorCode DMSwarmProjectFromSwarmToCells(DM dm_swarm, const char *field, Vec U_points, Vec U_mesh);
48*78f7fce3SZach Atkins 
49*78f7fce3SZach Atkins PetscErrorCode SetupProblemSwarm(DM dm_swarm, Ceed ceed, BPData bp_data, CeedData data, PetscBool setup_rhs, Vec rhs, Vec target);
50