用户登录

你在这里

工厂习语和材料模型

过几天我就要离开美国了,可能会暂时离开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
0.31
1.09
< / flow_stress_model >

然后,所有用户需要做的就是切换到线性强化模型,而是写入


90.0e6

< / plasticity_model >

一切都和以前一模一样,只是换了一种新模式。

希望这对你们中的一些人有所帮助。

——Biswajit

评论

索志刚的照片

亲爱的比斯瓦吉特:非常感谢你你对iMechanica的贡献万博manbetx平台。我从你身上学到了很多。当你在新环境安顿下来时,请告诉我们。祝你好运,祝你好运,志刚

亲爱的Biswajit,

很好,你提出了这个话题…我想知道与编程相关的讨论是否适合在iMechanica上进行——特别是在更抽象的层面上的讨论(即不关心语言的语法等)……万博manbetx平台此外,在c++教程代码中更严重的是…我已经在想如果我应该张贴一些我的代码我的一般博客网站…所以,我真的很高兴在这里看到你上面的帖子…

关于c++习惯用法。一个非常密切相关的话题是设计模式。例如,参见在这里在这里

话虽如此,我还是要提醒你一句。在我看来,最好*不要*尝试在软件的主要版本的第一次迭代中使用设计模式——v1.0或v2.0或其他....

我知道我听起来像一个不热情的傻瓜,不尊重抽象或高级设计……但在我看来,有时候除了高级抽象设计之外,也有太多的好东西……例如,请注意数据局部性(缓存和虚拟内存)、IPC和并行化的便利性等问题和因素应该进入软件设计…然而,事实上,在第一次削减已经结束之前,许多这种性质的问题不可能变得像它们应该的那样清楚。(我们不必等到分析阶段,但至少应该先存在一大块代码,然后人们才能真正正确地处理这些部分。)因此,有时最好采用一个简单的方案,其中包含最少数量的非常松散耦合的类,然后将它们全部放在一个更好的框架中……一个真正的自下而上的设计练习,在某种意义上....

当然,我上面的评论并不适用于你上面的c++习惯用法(或者你的工厂习惯用法的例子)…我只是想证明一下我对设计模式的推荐,仅此而已……

-----

Biswajit,就我个人而言:如果你想离开美国,那很好(问我为什么),但你不想因此回到印度,是吗?

不管怎样,我喜欢你对一系列问题的回答……让我祝你在新的环境中一切顺利,正如志刚所说,一旦你准备好再次在iMechanica聊天,请告诉我们……万博manbetx平台我期待着很快再次与你互动……

——特

滕丽的照片

亲爱的Biswajit,

祝你在新的岗位上一切顺利,并期待你再次回到iMechanica。万博manbetx平台

N. Sukumar的照片

祝你好运,比瓦吉特。包含设计模式和习惯用法实现的c++库是洛基。

订阅“工厂习惯用语和材料模型”的评论

最近的评论

更多的评论

辛迪加

认购辛迪加