哎,真是苦逼的,对分子动力学的不熟悉导致对Gromacs源码的解读不太顺利。目前摸索出来的Gromacs程序集中最主要的计算程序为mdrun,所以很自然地想要了解mdrun程序源码都包含哪些。经过解读,终于有了初步的了解:
Gromacs中的核心运算程序为mdrun程序,为了查找mdrun程序的源码,通过查看CMake中发现如下语句:
其程序信息主要在kernel\CMakeLists.txt中。
set(MDRUN_SOURCES gctio.c ionize.c runner.c do_gct.c repl_ex.c xutils.c pme_loadbal.c md.c mdrun.c genalg.c membed.c) add_executable(mdrun ${MDRUN_SOURCES} main.c) |
而gpu相关的则在gmxlib目录下面的Cmake中。
if(GMX_GPU) add_subdirectory(cuda_tools) add_subdirectory(gpu_utils) set(GMX_GPU_LIBRARIES gpu_utils cuda_tools) endif() |
可以看到应该是生成了两个库,同时其子文件夹为cuda_tools以及gpu_utils两个文件夹。
同时通过查看生成的exe的方式,可以看到main.c只有一个文件,只是起到一个入口的作用。
set(GMX_KERNEL_PROGRAMS grompp tpbconv pdb2gmx g_protonate gmxdump g_x2top gmxcheck) if (NOT GMX_NO_QUOTES) set(GMX_KERNEL_PROGRAMS ${GMX_KERNEL_PROGRAMS} g_luck) endif (NOT GMX_NO_QUOTES) foreach(PROGRAM ${GMX_KERNEL_PROGRAMS}) add_executable(${PROGRAM} ${PROGRAM}.c main.c) if (NOT ${PROGRAM} STREQUAL "g_luck") gmx_add_man_page(${PROGRAM}) endif() target_link_libraries(${PROGRAM} gmxpreprocess md gmx ${OpenMP_LINKER_FLAGS}) set_target_properties(${PROGRAM} PROPERTIES OUTPUT_NAME "${PROGRAM}${GMX_BINARY_SUFFIX}") endforeach() |
如表格中红色字体标注部分,也就是说对于所有的gromacs程序,都是用main.c这个文件作为入口,通过其中对各个程序的链接入口(暂且这么叫吧)cmain()函数链接到其他程序。
main.c中内容:
#ifdef __cplusplus extern "C" { #endif int cmain(int argc, char *argv[]); #ifdef __cplusplus } #endif int main(int argc, char *argv[]) { return cmain(argc, argv); } |
真正的入口是cmain,这样就可以用一个main.c搞定了所有函数入口,不需要写多个main.c给管理带来灵活性。
例如:mdrun.c中,实际上就是有一个cmain函数作为入口。