你在这里
工厂习语和材料模型
过几天我就要离开美国了,可能会暂时离开iMechanica几个月。万博manbetx平台在我离开之前,我想告诉你们一个c++成语这简化了在计算力学代码中多种材料模型的实现和使用。
第一本关于c++习惯用法的书是由吉姆Copilien在20世纪90年代末的某个时候,被称为“高级c++:编程风格和习惯用法”。从那时起,这些习语的概念就变得相当普遍了——以至于有了一个关于这个主题的维基教科书。
我要讲的成语是The工厂的成语。
当我试图比较一些可塑性模型时,我需要使用工厂习语。我想通过使用来避免使代码复杂化if语句或其他手动控制机制来处理输入中指定的模型。
让我一步一步地告诉你怎么做。为简单起见,让我们假设只有流动应力模型变化,其他一切保持不变。
步骤1:我们创建了一个抽象基类flowstresmodel .h。
该文件的内容为:
类FlowStressModel {
私人:
公众:
FlowStressModel ();
虚拟~ FlowStressModel ();
虚拟双computeFlowStress(const PlasticityState* state,…)= 0;
(const PlasticityState* state,…)= 0;
};
在相应的flowstress模型中。Cc文件
# include“FlowStressModel.h”
FlowStressModel: FlowStressModel () {}
FlowStressModel:: ~ FlowStressModel () {}
步骤2:接下来,我们为流动应力模型创建一个名为FlowStressModelFactory.h的工厂
该文件包含类似的内容
类FlowStressModel;
类FlowStressModelFactory
{
公众:
静态塑性模型*创建(问题规格& ps);
};
这里的问题规范(ProblemSpec)是指向输入XML文件或您可能拥有的任何其他输入格式的指针。
工厂在文件FlowStressModelFactory中的实现。Cc的形式如下
# include“FlowStressModelFactory.h”
# include“LinearHardeningPlasticity.h”
# include“JohnsonCookPlasticity.h”
…。
FlowStressModel* FlowStressModelFactory::create(ProblemSpecP& ps)
{
//首先阅读问题说明(无论你想要什么)
//获取材料类型(mat_type)
如果(mat_type == "线性硬化"){
return (new LinearHardeningPlasticity(ps));
} else if (mat_type == "johnson_cook") {
return (new JohnsonCookPlasticity(ps));
}
}
步骤3:现在我们可以实现线性硬化可塑性和JohnsonCookPlasticity模型,通过从FlowStressModel类中导出它们并使它们具体化。例如,对于JohnsonCookPlasticity模型,我们有一个johnsoncookplastic .h文件,其中包含
# include“FlowStressModel.h”
类JohnsonCookPlasticity:公共flowstress模型
{
私人:
LocalModelData d_data;
公众:
JohsonCookPlasticity (ProblemSpecP& ps);
虚拟~ JohnsonCookPlasticity ();
double computeFlowStress(const PlasticityState* state,…)
(const PlasticityState* state,…);
}
该模型的实现在JohnsonCookPlasticity中。Cc包含类似的东西
# include“JohnsonCookPlasticity.h”
JohnsonCookPlasticity:: JohnsonCookPlasticity (ProblemSpecP& ps)
{
//从输入文件中读取内容并创建对象
}
JohnsonCookPlasticity:: ~ JohnsonCookPlasticity ()
{
//删除任何需要删除的内容
}
双
::computeFlowStress(const PlasticityState* state,…)
{
//在这里计算实际的流动应力
}
双
JohnsonCookPlasticity:: computeDsigDep(const PlasticityState* state,…)
{
//计算流动应力对塑性应变的导数
}
添加其他流动应力模型遵循相同的模式。您所要做的就是为模型创建代码,并向工厂添加一行代码。
步骤4:最后一步是将这些信息添加到弹塑性应力更新代码中。让我们假设这个类叫做ElasticPlastic。然后,文件ElasticPlastic.h将具有该表单
# include“FlowStressModel.h”
.....
类ElasticPlastic {
公众:
.....
保护:
FlowStressModel * d_flowStress;
.....
公众:
ElasticPlastic (ProblemSpecP& ps);
~ ElasticPlastic ();
void computeStress(Matrix& stress);
……
};
在ElasticPlastic的实际实现中(即在ElasticPlastic。Cc文件)
# include“ElasticPlastic.h”
# include“FlowStressModelFactory.h”
…
ElasticPlastic:: ElasticPlastic (ProblemSpecP& ps)
{
//阅读所有其他的东西,你需要的弹性塑料模型
//创建流动应力模型
d_flowStress = FlowStressModelFactory::创建(ps);
}
ElasticPlastic:: ~ ElasticPlastic ()
{
//删除所有需要删除的内容
//删除流应力模型
删除d_flowStress;
}
无效
弹性塑性:计算应力(矩阵和应力)
{
//在计算流动应力之前做任何需要做的事情
//设置塑性状态
* state = new PlasticityState();
//计算流动应力
double flowStress = d_flowStress->computeFlowStress(state, ....);
}
因此,您已经使代码比其他方式更干净,更直观。
这是我们在犹他大学广泛使用的基本理念。我们的输入文件是XML格式的,可以很容易地输入和输出数百个材质模型,而无需用户或编码器为if语句是否正确完成而烦恼。例如,如果原始输入文件包含类似的内容
90.0e6
< c > 0.025 c >
< / flow_stress_model >
然后,所有用户需要做的就是切换到线性强化模型,而是写入
< / plasticity_model >
一切都和以前一模一样,只是换了一种新模式。
希望这对你们中的一些人有所帮助。
——Biswajit
- Biswajit Banerjee的博客
- 登录或注册发表评manbetx体育论
- 10514年读
评论
祝福比斯瓦吉特
亲爱的比斯瓦吉特:非常感谢你你对iMechanica的贡献万博manbetx平台。我从你身上学到了很多。当你在新环境安顿下来时,请告诉我们。祝你好运,祝你好运,志刚
c++习惯用法和设计模式…
亲爱的Biswajit,
很好,你提出了这个话题…我想知道与编程相关的讨论是否适合在iMechanica上进行——特别是在更抽象的层面上的讨论(即不关心语言的语法等)……万博manbetx平台此外,在c++教程代码中更严重的是…我已经在想如果我应该张贴一些我的代码我的一般博客网站…所以,我真的很高兴在这里看到你上面的帖子…
关于c++习惯用法。一个非常密切相关的话题是设计模式。例如,参见在这里和在这里。
话虽如此,我还是要提醒你一句。在我看来,最好*不要*尝试在软件的主要版本的第一次迭代中使用设计模式——v1.0或v2.0或其他....
我知道我听起来像一个不热情的傻瓜,不尊重抽象或高级设计……但在我看来,有时候除了高级抽象设计之外,也有太多的好东西……例如,请注意数据局部性(缓存和虚拟内存)、IPC和并行化的便利性等问题和因素应该进入软件设计…然而,事实上,在第一次削减已经结束之前,许多这种性质的问题不可能变得像它们应该的那样清楚。(我们不必等到分析阶段,但至少应该先存在一大块代码,然后人们才能真正正确地处理这些部分。)因此,有时最好采用一个简单的方案,其中包含最少数量的非常松散耦合的类,然后将它们全部放在一个更好的框架中……一个真正的自下而上的设计练习,在某种意义上....
当然,我上面的评论并不适用于你上面的c++习惯用法(或者你的工厂习惯用法的例子)…我只是想证明一下我对设计模式的推荐,仅此而已……
-----
Biswajit,就我个人而言:如果你想离开美国,那很好(问我为什么),但你不想因此回到印度,是吗?
不管怎样,我喜欢你对一系列问题的回答……让我祝你在新的环境中一切顺利,正如志刚所说,一旦你准备好再次在iMechanica聊天,请告诉我们……万博manbetx平台我期待着很快再次与你互动……
——特
亲爱的比斯瓦吉特,祝你
亲爱的Biswajit,
祝你在新的岗位上一切顺利,并期待你再次回到iMechanica。万博manbetx平台
腾
设计模式/习惯用法库
祝你好运,比瓦吉特。包含设计模式和习惯用法实现的c++库是洛基。