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