《跟随霄,LAMMPS源码学习05》Atom::new_avec()
Posted 非设限人生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《跟随霄,LAMMPS源码学习05》Atom::new_avec()相关的知识,希望对你有一定的参考价值。
回忆到上次(04期)推文调用new_avec()的方式为:
avec = new_avec(style,trysuffix,sflag);
该函数接受三个参数,最主要的是第一个参数style,该参数表明了所要创建的原子类型;而trysuffix和sflag分别表示尝试加速和是否已经加速的标记,sflag全称为suffix flag,这里我们假设不用任何加速。
本部分代码用到了C++很多高级编程技巧如工厂模式,模板和STL。
伪代码如下[atom.cpp]:
AtomVec *Atom::new_avec(const char *style, int trysuffix, int &sflag)
{
if (avec_map->find(style) != avec_map->end()) {
AtomVecCreator avec_creator = (*avec_map)[style];
return avec_creator(lmp);
}
error->all(FLERR,"Unknown atom style");
return NULL;
}
代码详解:
new_avec()函数接受style参数,这里假设参数style=”atomic”。
ave_map定义为AtomVecCreatorMap类的一个实例,而其又为std::map
类型的map。 ave_map通过find()来查找key=style即key=”atomic”的值是否存在,若存在,则进入if语句。
ave_map通过[“atomic”]进行索引查找,参数传递给AtomVecCreatorMap,即传递给std::map<”atomic”,AtomVecCreator>,在style_atom.h文件中寻找原子类型,找到后返回一个AtomVecAtomic实例并赋值给 avec_creator变量
lmp参数传递给avec_creator,并返回AtomVecAtomic类型的指针
new_avec()函数返回值为AtomVecAtomic指针,并且被avec变量接受。
ave_map定义如下:
ave_map = new AtomVecCreatorMap()
avec_creator()的定义如下:
template <typename T>
AtomVec *Atom::avec_creator(LAMMPS *lmp)
{
return new T(lmp);
}
代码详解:
工厂模式是一种实例化对象的模式,用来替代new操作。
map是STL的一个关联容器,可以进行快速查找工作。map对象是模板类,需要关键字和存储对象两个模板参数语法如std::map<int,string>
相关文章:
长按关注,获得更多相关内容!
感兴趣的可以研究atom.h文件中的代码加深理解:
第一句:定义AtomVecCreator 为一种新的类型。这种类型可以定义一个指针,该指针可指向这样一个函数,函数的参数为LAMMPS类型的指针,函数的返回值为AtomVec类型的指针。
第二句:定义AtomVecCreatorMap为一种新的类型。这种类型可以定义一个std map。map可以看成(key,value)这样键值一一对应的列表,这里定义的map的键为string类型,值为AtomVecCreator类型。
第三句:定义一个指针avec_map指向AtomVecCreatorMap类型数据。
第四、五句:定义一个函数avec_creator,该函数参数为LAMMPS类型的指针,返回值为AtomVec类型的指针。具体实现在上面代码中。
class AtomVec *avec;
typedef AtomVec *(*AtomVecCreator)(LAMMPS *);
typedef std::map<std::string,AtomVecCreator> AtomVecCreatorMap;
AtomVecCreatorMap *avec_map;
template <typename T>
static AtomVec *avec_creator(LAMMPS *);
以上是关于《跟随霄,LAMMPS源码学习05》Atom::new_avec()的主要内容,如果未能解决你的问题,请参考以下文章