Difference between revisions of "Creating MPM Materials"
Line 47: | Line 47: | ||
<li>Add the new material's header file to the header file's needed to compile <tt>MaterialController.hpp</tt>. Using the alias defined in step 1, the added text will be <tt>$(MyMaterial).hpp</tt>. | <li>Add the new material's header file to the header file's needed to compile <tt>MaterialController.hpp</tt>. Using the alias defined in step 1, the added text will be <tt>$(MyMaterial).hpp</tt>. | ||
<li>Compile the new material's source file with lines such as | <li>Compile the new material's source file with lines such as | ||
<pre>MyMaterial.o : $(MyMaterial).cpp $(dprefix) $(MyMaterial).hpp $(MaterialBase).hpp $(MPMBase).hpp $(CommonException).hpp | <pre>MyMaterial.o : $(MyMaterial).cpp $(dprefix) $(MyMaterial).hpp $(MaterialBase).hpp $(MPMBase).hpp \ | ||
$(CommonException).hpp | |||
$(CC) $(CFLAGS) $(headers) -include $(prefix) $(MyMaterial).cpp | $(CC) $(CFLAGS) $(headers) -include $(prefix) $(MyMaterial).cpp | ||
The list of headers must include all headers explicitly (or implicitly included in the new material's source code. | </pre> | ||
The list of headers must include all headers explicitly (or implicitly included in the new material's source code. The leading white space for lines 2 (and on) must use only tabs and only one tab for the final compilation line. | |||
</ol> | </ol> |
Revision as of 12:28, 4 December 2013
This section explains how to write C++ code create a new material class for use in NairnMPM.
Getting Started
The first steps are to create source files for the new material class, to give the material a unique name, and to allow the main NairnMPM code to instantiate the material class when it is needed for a particle.
Class Source Code
The best way to create the source code is to duplicate the NewMaterial.cpp and NewMaterial.hpp files, which are templates for a new material class. Edit the files and change NewMaterial to the new material's class name (e.g., MyMaterial). The NewMaterial template is a subclass of MaterialBase. Normally the new material will be a subclass of another class. If so, change MaterialBase references, as needed, to the actual parent class. These changes are needed whenever a method in the new material class needs to pass control to its immediate super class.
Material Class Hierarchy
The new material should be inserted into the NairnMPM material class hierarchy with its name (from previous step) and a unique ID (an integer). In the new material's header files, replace NEWMATERIAL with a defined constant representing the new material's ID (which by convention is in UPPERCASE) and replace the number in the new constant's definition with the new material's ID. For example:
#define MYMATERIAL 102
All documented materials use low numbers (starting with 1). To avoid conflicts, those working on custom materials should use large numbers (>100).
Editing Required in Core Code
Almost all coding will be done in the new material class files, but for that material to be recognized as an option in NairnMPM, two places in the core code have to be edited first. These should be the only changes needed outside the new material's class files.
- Include the new material's header file at the top of Common/Read_XML/MaterialController.cpp:
#include "Materials/MyMaterial.hpp"
or the appropriate relative path to the new material's header file.
- In MaterialController::AddMaterial(int matID,char *matName), add a new case in the switch(matID) section to call the default constructor of the new material when matID matches the new material's constant defined above.
case MYMATERIAL: newMaterial=new MyMaterial(matName); break;
If needed you can define a custom constructor and use that in this code (this need is very rare).
Compiling with make Command
If you want to be able to do command-line compile using the make command, the new material source files needed to add to the file NairnMPM/build/makefile. The steps are best done by comparing to a similar material's files in that makefile. The main makeFile editing stepsare:
- Define an alias for relative path from makefile to the new material class files (in the list d)
MyMaterial = $(src)/Materials/MyMaterial
- Add an object file to the list of "all compiled objects" in the form MyMaterial.o.
- Add the new material's header file to the header file's needed to compile MaterialController.hpp. Using the alias defined in step 1, the added text will be $(MyMaterial).hpp.
- Compile the new material's source file with lines such as
MyMaterial.o : $(MyMaterial).cpp $(dprefix) $(MyMaterial).hpp $(MaterialBase).hpp $(MPMBase).hpp \ $(CommonException).hpp $(CC) $(CFLAGS) $(headers) -include $(prefix) $(MyMaterial).cpp
The list of headers must include all headers explicitly (or implicitly included in the new material's source code. The leading white space for lines 2 (and on) must use only tabs and only one tab for the final compilation line.