====== 材料子项扩展 ====== 扩展材料子项时,对象类应从XMaterialEntry继承,材料子项可能包含若干不同的本构模型,需要对不同本构模型声明其参数并实现本构句柄,在任何一个时刻,材料子项只可能是其中的一种本构模型,对本构模型的具体调用均由本构句柄的具体接口实现。需按照下列代码重新实现基类的接口。 class NewMatEntry: public XMaterialEntry { DECLARE_MITEM(NewMatEntry) public: NewMatEntry(ulong id = 0); //构造函数 void setConstitutiveType(const char * v); //实现本构模型设置接口 }; * 注册对象定义,它被归为Domain_MaterialEntry域,所以被MaterialEntryManager管理,需要注意的是材料子项的声明宏是DECLARE_MITEM(NewMatEntry),而不是一般使用的DECLARE_CITEM以及REGISTER_CITEM,这是因为材料子项的内存分配需要分配一些额外的空间用来存放不同本构模型的属性参数。类型标识前缀为“CMAT”, 其实现通过宏按照如下形式实现: REGISTER_MITEM(NewMatEntry, "CMATNEWMATENTRY", MaterialEntryManager::ctype(), 0); * 材料子项的构造函数,在这里需要设置材料子项的默认本构类型: NewMatEntry::NewMatEntry(ulong id):XMaterialEntry(id, NewMatEntry::ctype()) { setConstitutiveType("Isotropic"); } * 材料子项的本构模型设置,在这里重置本构模型参数处理句柄的虚函数表,不同本构模型对应不同的虚函数表: void Density::setConstitutiveType(const char * v) { ResetHandlerVFTBL(m_ConsHdl, v); } * 为材料子项的每种本构模型声明属性并定义处理句柄,重新实现处理句柄的接口: struct NewMatEntryIsoAttribute: public MaterialEntryAttrib //本构模型声明 { double dValue; }; struct NewMatEntryIsoHandler : public TEntryConsHandler //处理句柄 { const char * name() { return "Isotropic"; } bool loadFromJson(JsonNode * consNode); void exchangeData(ParamList * pl, const char * typeStr); int dataCount() const; void reset() { dValue = 0.0;} }; * 注册本构模型,必须使用下面的宏完成本构模型的注册,第一个参数为材料子项类名,第二个参数为本构句柄类名,否则该本构模型将不能正常使用。 REGISTER_CONSMODEL(NewMatEntry, NewMatEntryIsoHandler )