NSF Postdoctoral Research
A set of C++ code developed by Andrew E. Slaughter
|
#include <string> using std::string; // libMesh includes #include <libmesh.h> #include <libmesh_common.h> #include <equation_systems.h> #include <transient_system.h> #include <explicit_system.h> #include <parameters.h> #include <mesh.h> using namespace libMesh; // Fundamental behavior that will be used among many classes template <typename Type> class EqCore{ public: // Class constructor EqCore(EquationSystems& sys, string name) : eq_sys(sys){ // Creates a system that will store the constant(s) name_.assign(name); eq_sys.add_system<Type>(name_); // I can set stuff from here set_constant<double>("test4", 4); } // A function for storing a constant value template<typename ParamType> void set_constant(std::string name, ParamType var){ eq_sys.parameters.set<ParamType>(name) = var; } // A function for retrieving a constant value template<typename ParamType> ParamType get_constant(std::string name){ ParamType output = eq_sys.parameters.get<ParamType>(name); return output; } // Reference to the controlling equation system EquationSystems& eq_sys; // The name of the system holding the constant(s) string name_; }; // A test class derived template <typename Type> class EqBase : public EqCore<Type>{ public: // Constructor EqBase(EquationSystems& sys, string name) : EqCore<Type>(sys, name){ // I want to do this! // (remove this and the associated print statement in the main and it works) EqCore<Type>::template set_constant<double>("test5", 5); } }; // Begin main function int main (int argc, char** argv){ // Initialize libMesh and create an empty mesh LibMeshInit init (argc, argv); Mesh mesh; // Test w/o any of the above classes EquationSystems eq_sys(mesh); eq_sys.parameters.set<double>("test1") = 1; printf("Test 1: %f\n", eq_sys.parameters.get<double>("test1")); // Test EqBase/EqCore functions set/get functions EqBase<TransientExplicitSystem> eq(eq_sys, "TestSystem"); eq.set_constant<double>("test2", 2); printf("Test 2: %f\n", eq.get_constant<double>("test2")); // Test generic creation but accessed through EqBase eq.eq_sys.parameters.set<double>("test3") = 3; printf("Test 3: %f\n", eq.eq_sys.parameters.get<double>("test3")); // Test the constant created in EqCore constructor from EqBase printf("Test 4: %f\n", eq.eq_sys.parameters.get<double>("test4")); // Test the constant created in EqBase constructor from EqBase printf("Test 5: %f\n", eq.eq_sys.parameters.get<double>("test5")); }