|
大家好。
我正在学习写一个MPI/C++的计算化学程序,想实现双电子积分和HF的并行计算。串行的程序已经写好了,main函数的结构是这样的:
- Matrix overlap=Overlap(basis_set); // 计算重叠积分,存在一个矩阵里
- Matrix kinetic=Kinetic(basis_set); // 计算动能积分
- Matrix nuclear=Nuclear(basis_set,atom_positions); // 计算核吸引积分
- Tensor repulsion=Repulsion(basis_set); // 计算双电子积分,存在一个四维张量里
- double hfenergy=HF(overlap,kinetic,nuclear,repulsion); // 计算HF能量
复制代码 要在Repulsion函数里用MPI,就要在函数定义里写:
- Tensor Repulsion(...){
- MPI_Init(...);
- ......
- MPI_Finalize();
- return repulsion;
- }
复制代码 HF函数也同理:
- double HF(...){
- MPI_Init(...);
- ......
- MPI_Finalize();
- return hfenergy;
- }
复制代码 可是问题在于在一个程序的运行周期中,MPI只能调用一次。这可怎么办?我试过查看开源程序的源码,看他们是怎么解决这个问题的,但是里面涉及到MPI的部分好复杂啊,看了几天也不明白;我还看了《Using MPI》和《Parallel computing in quantum chemistry》,但它们好像只写了在单个main函数里调用一次MPI的方法;我还想过把每个函数都分别打包成一个独立的程序,可是那样程序结构就不再简洁了。
希望有编写计算化学程序经验的大佬点拨一下,小弟不胜感激。
|
|