NSF Postdoctoral Research
A set of C++ code developed by Andrew E. Slaughter
test_libmesh.cpp

#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"));
   
}
 All Classes Namespaces Files Functions Variables Typedefs