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