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_PARAMETER_POINTER_H 21 : #define LIBMESH_PARAMETER_POINTER_H 22 : 23 : 24 : // Local Includes 25 : #include "libmesh/libmesh_common.h" 26 : #include "libmesh/parameter_accessor.h" 27 : 28 : // C++ Includes 29 : #include <memory> 30 : 31 : namespace libMesh 32 : { 33 : 34 : /** 35 : * Accessor object allowing reading and modification of the 36 : * independent variables in a parameter sensitivity calculation. 37 : * 38 : * This is the "default" ParameterAccessor subclass: it simply stores 39 : * a user-provided pointer to the parameter, and modifies the value at 40 : * that location in memory. 41 : * 42 : * \author Roy Stogner 43 : * \date 2015 44 : * \brief Stores/modifies a user-provided pointer to a parameter. 45 : */ 46 : template <typename T=Number> 47 : class ParameterPointer : public ParameterAccessor<T> 48 : { 49 : public: 50 : /** 51 : * Constructor: take the raw pointer to the parameter 52 : */ 53 0 : ParameterPointer(T * param_ptr) : _ptr(param_ptr) {} 54 : /** 55 : * Setter: change the value of the parameter we access. 56 : */ 57 0 : virtual void set (const T & new_value) override 58 0 : { libmesh_assert(_ptr); *_ptr = new_value; } 59 : 60 : /** 61 : * Getter: get the value of the parameter we access. 62 : */ 63 0 : virtual const T & get () const override 64 0 : { libmesh_assert(_ptr); return *_ptr; } 65 : 66 : /** 67 : * \returns A new copy of the accessor. 68 : */ 69 0 : virtual std::unique_ptr<ParameterAccessor<T>> clone() const override 70 : { 71 0 : return std::make_unique<ParameterPointer<T>>(_ptr); 72 : } 73 : 74 : private: 75 : T * _ptr; 76 : }; 77 : 78 : } // namespace libMesh 79 : 80 : #endif // LIBMESH_PARAMETER_POINTER_H