Line data Source code
1 : // The libMesh Finite Element Library. 2 : // Copyright (C) 2002-2025 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner 3 : 4 : // This library is free software; you can redistribute it and/or 5 : // modify it under the terms of the GNU Lesser General Public 6 : // License as published by the Free Software Foundation; either 7 : // version 2.1 of the License, or (at your option) any later version. 8 : 9 : // This library is distributed in the hope that it will be useful, 10 : // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 : // Lesser General Public License for more details. 13 : 14 : // You should have received a copy of the GNU Lesser General Public 15 : // License along with this library; if not, write to the Free Software 16 : // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 : 18 : 19 : 20 : #ifndef LIBMESH_RADIAL_BASIS_INTERPOLATION_H 21 : #define LIBMESH_RADIAL_BASIS_INTERPOLATION_H 22 : 23 : // Local includes 24 : #include "libmesh/libmesh_config.h" 25 : #include "libmesh/libmesh_common.h" 26 : #include "libmesh/meshfree_interpolation.h" 27 : #include "libmesh/radial_basis_functions.h" 28 : #include "libmesh/bounding_box.h" 29 : 30 : 31 : 32 : namespace libMesh 33 : { 34 : 35 : /** 36 : * Radial Basis Function interpolation. 37 : * 38 : * \author Benjamin S. Kirk 39 : * \date 2013 40 : * \brief Does radial basis function interpolation using Nanoflann. 41 : */ 42 : template <unsigned int KDDim, class RBF = WendlandRBF<KDDim, 2>> 43 : class RadialBasisInterpolation : public InverseDistanceInterpolation<KDDim> 44 : { 45 : /** 46 : * Bring base class data into our namespace. 47 : */ 48 : using InverseDistanceInterpolation<KDDim>::_src_pts; 49 : using InverseDistanceInterpolation<KDDim>::_src_vals; 50 : using InverseDistanceInterpolation<KDDim>::_names; 51 : 52 : protected: 53 : 54 : /** 55 : * Bounding box for our source points. 56 : */ 57 : BoundingBox _src_bbox; 58 : 59 : /** 60 : * basis coefficients. 61 : */ 62 : std::vector<Number> _weights; 63 : 64 : /** 65 : * Diagonal of the bounding box. 66 : */ 67 : Real _r_bbox; 68 : 69 : /** 70 : * Diagonal override 71 : */ 72 : Real _r_override; 73 : 74 : public: 75 : 76 : /** 77 : * Constructor. 78 : */ 79 0 : RadialBasisInterpolation (const libMesh::Parallel::Communicator & comm_in, 80 : Real radius=-1) : 81 : InverseDistanceInterpolation<KDDim> (comm_in,8,2), 82 0 : _r_bbox(0.), 83 0 : _r_override(radius) 84 0 : { } 85 : 86 : /** 87 : * Clears all internal data structures and restores to a 88 : * pristine state. 89 : */ 90 : virtual void clear() override; 91 : 92 : /** 93 : * Prepares data structures for use. 94 : */ 95 : virtual void prepare_for_use () override; 96 : 97 : /** 98 : * Interpolate source data at target points. 99 : * Pure virtual, must be overridden in derived classes. 100 : */ 101 : virtual void interpolate_field_data (const std::vector<std::string> & field_names, 102 : const std::vector<Point> & tgt_pts, 103 : std::vector<Number> & tgt_vals) const override; 104 : }; 105 : 106 : } // namespace libMesh 107 : 108 : 109 : #endif // #define LIBMESH_RADIAL_BASIS_INTERPOLATION_H