计算化学公社

 找回密码 Forget password
 注册 Register
Views: 195|回复 Reply: 0
打印 Print 上一主题 Last thread 下一主题 Next thread

[综合讨论] 免费第一性原理软件的溶剂模型测试笔记

[复制链接 Copy URL]

40

帖子

1

威望

730

eV
积分
790

Level 4 (黑子)

本帖最后由 ultramanm87 于 2024-11-23 01:51 编辑

目的:作为一个搞环境的(重金属方向),如果要按照本论坛大佬们的建议,应该对体系(比如clay+金属离子)这种体系同时使用显式的、尤其是阳离子周围1-2层的水分子以及隐式溶剂模型,还应该进行一定的结构优化。之前搞cp2k sccs搞得头皮发麻尤其是想用它来优化结构,于是想试下其他软件是否能够在隐式溶剂模型下高效的结构优化,在这里做个笔记。欢迎讨论!

一、包含软件
CP2K  
主要为高斯平面波基组,使用了SCCS模型(Andreussi et al., 2012)。实际计算中很依赖调整SCCS模型中判断溶质边界的参数,或者(据说)提高截断能,不然很容易不收敛或者能量振荡严重。  
Quantum ESPRESSO  
平面波软件,使用了SCCS模型(Andreussi et al., 2012),需要使用外部的Environ插件来完成计算。默认参数够用。但是PW方法在原子数较多时计算实在太慢了。      
GPAW  
有PW、FD和LCAO三种方法。由于后续笔者想要在比较大的体系中进行计算,因此不考虑计算速度较慢的PW和FD方法。使用了CSM模型(Held and Walter, 2014)。  
ABACUS  
有PW和LCAO两种方法,同样PW方法在大体系很昂贵,因此只测试LCAO方法。使用了一种应用到VASP中的溶剂化方法(不是VASPSOL)(Mathew et al., 2014)。

二、小分子测试
测试平台7950x+64GB(no GPU)
将乙醇分子在隐式水溶剂中进行优化,比较优化的步数、优化的结构(pyscf的在非周期条件下,用B3LYP-D3(BJ)/def2-TZVP+IEF-PCM进行优化,带density fitting)、和优化完的溶解自由能(为省事儿使用溶剂模型中优化后的结构计算气象能量)。
能量参考:


以下是软件安装和测试的步骤。

GPAW  安装
GAPW可以直接用conda安装,安装命令为:
  1. conda install conda-forge::gpaw
复制代码
上述命令建议先创建一个conda环境后再安装,避免环境冲突。使用上述安装后,可使用gpaw info查看有哪些安装的包:
  1. | python-3.12.7     /home/haha/miniconda/envs/gpaw/bin/python                                                         |

  2. | gpaw-24.6.0       /home/haha/miniconda/envs/gpaw/lib/python3.12/site-packages/gpaw/                                 |

  3. | ase-3.23.0        /home/haha/miniconda/envs/gpaw/lib/python3.12/site-packages/ase/                                  |

  4. | numpy-1.26.4      /home/haha/miniconda/envs/gpaw/lib/python3.12/site-packages/numpy/                                |

  5. | scipy-1.14.1      /home/haha/miniconda/envs/gpaw/lib/python3.12/site-packages/scipy/                                |

  6. | libxc-6.2.2       yes                                                                                              |

  7. | _gpaw             /home/haha/miniconda/envs/gpaw/lib/python3.12/site-packages/_gpaw.cpython-312-x86_64-linux-gnu.so |

  8. | MPI enabled       yes                                                                                              |

  9. | OpenMP enabled    yes                                                                                              |

  10. | GPU enabled       no                                                                                               |

  11. | GPU-aware MPI     no                                                                                               |

  12. | CUPY              /home/haha/miniconda/envs/gpaw/lib/python3.12/site-packages/gpaw/gpu/cpupy/__init__.py            |

  13. | scalapack         yes                                                                                              |

  14. | Elpa              yes; version: 20211125                                                                           |

  15. | FFTW              yes                                                                                              |

  16. | libvdwxc          yes                                                                                              |

  17. | PAW-datasets (1)  /home/haha/miniconda/envs/gpaw/share/gpaw
复制代码
可见除了GPU相关,其他需要的库都已经装好了,可以直接使用mpirun -n 4 gpaw python script.py运行

模型构建
GPAW与ASE十分紧密,因此可以使用ASE创建分子与晶胞。创建ethanol_relax.py:
  1. from ase.build import molecule
  2. from ase.io import read as ase_read
  3. from ase.io import write as ase_write
  4. from ase.units import mol, kJ, kcal, Pascal, m
  5. from ase.data.vdw import vdw_radi
  6. from gpaw.convergence_criteria import Energy, Density, Eigenstates
  7. from dftd3.ase import DFTD3  #需要安装simple-dftd3包
  8. from ase.calculators.mixing import SumCalculator
  9. from ase.optimize import BFGSLineSearch
  10. from gpaw.solvation import (
  11.     # calculator
  12.     SolvationGPAW,
  13.     # cavities
  14.     EffectivePotentialCavity,
  15.     ADM12SmoothStepCavity,
  16.     #FG02SmoothStepCavity,
  17.     # custom classes for the cavities
  18.     Power12Potential,
  19.     ElDensity,
  20.     #SSS09Density,
  21.     # dielectric
  22.     LinearDielectric,
  23.     # non-el interactions
  24.     SurfaceInteraction,
  25.     VolumeInteraction,
  26.     LeakedDensityInteraction,
  27.     # surface and volume calculators
  28.     GradientSurface,
  29.     KB51Volume,
  30. )#这边把所有主要的溶剂计算模块载入了,使用默认的CSM不需要这么多


  31. atoms = molecule('CH3CH2OH')
  32. atoms.center(vacuum=5)
  33. atoms.pbc = [True, True, True]
  34. ase_write("ethanol_initial.cif", atoms,format='cif') #保存初始结构给后续其他软件使用



  35. h = 0.1 #格点精度
  36. # solvent parameters for water from J. Chem. Phys. 141, 174108 (2014)
  37. u0 = 0.180  # eV
  38. epsinf = 78.36  # dimensionless
  39. gamma = 18.4 * 1e-3 * Pascal * m  # convert from dyne / cm to eV / Angstrom**2
  40. T = 298.15  # Kelvin
  41. p = -0.35 * 1e9 * Pascal
  42. vdw_radii = vdw_radii.copy()
  43. vdw_radii[1] = 1.09
  44. vdw_radii[25] = 2.04
  45. kappa_T = 4.53e-10 / Pascal


  46. #需要用一个函数为原子添加半径参数
  47. def atomic_radii(atoms_vdwr):
  48.     return [vdw_radii[n] for n in atoms_vdwr.numbers]


  49. dft = SolvationGPAW(mode='lcao', basis='dzp', xc='PBE', nbands='110%', kpts=(2, 2, 2),
  50.                     h=h, txt='ethanol_relax.txt', #输出文件
  51.                     parallel=dict(band=2,  # band parallelization
  52.                                   augment_grids=True,  # use all cores for XC/Poisson
  53.                                   sl_auto=True,  # enable ScaLAPACK parallelization
  54.                                   use_elpa=True),# enable elpa parallelization
  55.                     cavity=EffectivePotentialCavity(
  56.                         effective_potential=Power12Potential(atomic_radii, u0),
  57.                         temperature=T,
  58.                         surface_calculator=GradientSurface(),
  59.                         volume_calculator=KB51Volume(compressibility=kappa_T, temperature=T)),
  60.                     dielectric=LinearDielectric(epsinf=epsinf),
  61.                     interactions=[SurfaceInteraction(surface_tension=gamma),
  62.                                   VolumeInteraction(pressure=p),
  63.                                   LeakedDensityInteraction(voltage=1)])



  64. atoms.calc = SumCalculator([DFTD3(method="PBE", damping="d3bj"), dft])  #加上色散校正

  65. relax = BFGSLineSearch(atoms, trajectory="ethanol.traj")
  66. relax.run(fmax=0.001)     
复制代码
运行结构优化
mpirun -n 16 gpaw python ethanol_relax.py共优化12步,29个SCF,用时4377s
运行结束后产生轨迹文件ethanol.traj和记录SCF过程的ethanol_relax.txt

计算能量差
完成优化后,读取优化完的结构计算气相与液相能量之差:
  1. from ase.io import read as ase_read
  2. from ase.io import write as ase_write
  3. from gpaw import GPAW, PW
  4. from ase.optimize import BFGSLineSearch
  5. #from ase.filters import UnitCellFilter
  6. from dftd3.ase import DFTD3
  7. from ase.calculators.mixing import SumCalculator
  8. from ase.constraints import FixAtoms
  9. from ase.units import mol, kJ, kcal, Pascal, m
  10. from ase.data.vdw import vdw_radii
  11. from ase.build import molecule
  12. from ase.parallel import parprint
  13. from gpaw.solvation import (
  14.     # calculator
  15.     SolvationGPAW,
  16.     # cavities
  17.     EffectivePotentialCavity,
  18.     ADM12SmoothStepCavity,
  19.     #FG02SmoothStepCavity,
  20.     # custom classes for the cavities
  21.     Power12Potential,
  22.     ElDensity,
  23.     #SSS09Density,
  24.     # dielectric
  25.     LinearDielectric,
  26.     # non-el interactions
  27.     SurfaceInteraction,
  28.     VolumeInteraction,
  29.     LeakedDensityInteraction,
  30.     # surface and volume calculators
  31.     GradientSurface,
  32.     KB51Volume,
  33. )

  34. from ase.io.trajectory import Trajectory
  35. atoms = Trajectory('ethanol.traj')[-1] #取最后一帧


  36. # non-solvent related DFT parameters
  37. h = 0.1

  38. # solvent parameters for water from J. Chem. Phys. 141, 174108 (2014)
  39. u0 = 0.180  # eV
  40. epsinf = 78.36  # dimensionless
  41. gamma = 18.4 * 1e-3 * Pascal * m  # convert from dyne / cm to eV / Angstrom**2
  42. T = 298.15  # Kelvin
  43. p = -0.35 * 1e9 * Pascal
  44. vdw_radii = vdw_radii.copy()
  45. vdw_radii[1] = 1.09
  46. vdw_radii[25] = 2.04
  47. kappa_T = 4.53e-10 / Pascal

  48. def atomic_radii(atoms_vdwr):
  49.     return [vdw_radii[n] for n in atoms_vdwr.numbers]

  50. #液相
  51. dft1 = SolvationGPAW(mode='lcao', basis='dzp', xc='PBE',nbands='110%',kpts=(2,2,2),
  52.                     parallel=dict(band=2,  # band parallelization
  53.                                   augment_grids=True,  # use all cores for XC/Poisson
  54.                                   sl_auto=True,  # enable ScaLAPACK parallelization
  55.                                   use_elpa=True),
  56.                     h=h, txt='ethanol_water.txt',
  57.                    # occupations={'name': 'fermi-dirac', 'width': 0.05},
  58.                     cavity=EffectivePotentialCavity(
  59.                         effective_potential=Power12Potential(atomic_radii, u0),
  60.                         temperature=T,
  61.                         surface_calculator=GradientSurface(),
  62.                         volume_calculator=KB51Volume(compressibility=kappa_T,temperature=T)),
  63.                     dielectric=LinearDielectric(epsinf=epsinf),
  64.                     interactions=[SurfaceInteraction(surface_tension=gamma),
  65.                                   VolumeInteraction(pressure=p),
  66.                                   LeakedDensityInteraction(voltage=1)])


  67. atoms.calc = SumCalculator([DFTD3(method="PBE", damping="d3bj"), dft1])
  68. Ewater = atoms.get_potential_energy()


  69. #气相
  70. dft2=GPAW(xc='PBE',mode='lcao',basis='dzp',h=h,nbands='110%',kpts=(2,2,2),
  71.          parallel=dict(band=2,  # band parallelization
  72.                       augment_grids=True,  # use all cores for XC/Poisson
  73.                         sl_auto=True,  # enable ScaLAPACK parallelization
  74.                         use_elpa=True),
  75.                txt='ethanol_gas.txt')

  76. atoms.calc = SumCalculator([DFTD3(method="PBE", damping="d3bj"), dft2])

  77. Egasphase = atoms.get_potential_energy()

  78. DGSol_eV = Ewater - Egasphase
  79. DGSol_kJ_per_mol = DGSol_eV / (kJ / mol)
  80. DGSol_kcal_per_mol = DGSol_eV / (kcal / mol)

  81. parprint('calculated Delta Gsol = %.0f meV = %.1f kJ / mol = %.1f kcal / mol' %
  82.          (DGSol_eV * 1000., DGSol_kJ_per_mol, DGSol_kcal_per_mol))
复制代码
运行上述.py文件得到的结果为-0.185eV,与其他软件的结果相近。气相每次scf迭代用时1s,液相每次迭代用时10s。

ABACUS
安装
与GPAW一样,ABACUS也可以直接用conda安装所有需要的库与本体,建议使用新环境隔离开。
安装:conda create -n abacus_env abacus "libblas=*=*mkl" mpich -c conda-forge
运行:mpirun -n 16 abacus

模型构建与输入文件
ABACUS的结构文件STRU文件有点恶心,使用ABACUS的ASE插件来生成最方便,参考:https://gitlab.com/1041176461/ase-abacus。直接使用上一部分产生的初始.cif文件即可:
  1. from ase.io import read as ase_read
  2. from ase.io import write as ase_write
  3. from ase.constraints import FixAtoms
  4. from ase.build import molecule
  5. ethanol = ase_read('ethanol_initial.cif')

  6. #实际上ASE atom对象的FixAtoms和定义磁矩也是有效的,比如固定slab中的底层可以:
  7. #mno2.set_constraint(FixAtoms(mask=mno2.positions[:, 2] < 3))
  8. #表明固定二氧化锰z坐标低于3埃的原子
  9. #磁矩,给Mn原子一个3的初猜:
  10. #maganetic = []
  11. #for atom in mno2:
  12. #    if atom.symbol == "Mn":
  13. #        maganetic.append(3)
  14. #    else:
  15. #        maganetic.append(0)
  16. #mno2.set_initial_magnetic_moments(maganetic)



  17. #ABACUS使用LCAO时需要同时提供赝势文件与数值轨道基组,可以在官网下载
  18. pp={'C':'C_ONCV_PBE-1.0.upf',
  19.         'H':'H_ONCV_PBE-1.0.upf',
  20.         'O':'O_ONCV_PBE-1.0.upf'}
  21. basis={'C':'C_gga_7au_100Ry_2s2p1d.orb',
  22.         'H':'H_gga_6au_100Ry_2s1p.orb',
  23.         'O':'O_gga_7au_100Ry_2s2p1d.orb'}

  24. ase_write('STRU',ethanol,format='abacus',pp=pp,basis=basis)
复制代码
然后得到相应的STRU文件:
  1. ATOMIC_SPECIES
  2. C   12.011        C_ONCV_PBE-1.0.upf
  3. O   15.999        O_ONCV_PBE-1.0.upf
  4. H   1.008         H_ONCV_PBE-1.0.upf

  5. NUMERICAL_ORBITAL
  6. C_gga_7au_100Ry_2s2p1d.orb
  7. O_gga_7au_100Ry_2s2p1d.orb
  8. H_gga_6au_100Ry_2s1p.orb

  9. LATTICE_CONSTANT
  10. 1.8897261258369282

  11. LATTICE_VECTORS
  12. 14.062514000      0.0000000000      0.0000000000      
  13. 0.0000000000      12.244742000      0.0000000000      
  14. 0.0000000000      0.0000000000      11.773866000      

  15. ATOMIC_POSITIONS
  16. Direct

  17. C
  18. 0.0000000000
  19. 2
  20. 0.5770520000 0.4603490000 0.5000000000 1 1 1 mag 0.0
  21. 0.4939820000 0.5387370000 0.5000000000 1 1 1 mag 0.0

  22. O
  23. 0.0000000000
  24. 1
  25. 0.4093540000 0.4744540000 0.5000000000 1 1 1 mag 0.0

  26. H
  27. 0.0000000000
  28. 6
  29. 0.3555550000 0.5242050000 0.5000000000 1 1 1 mag 0.0
  30. 0.4970080000 0.5916610000 0.5753310000 1 1 1 mag 0.0
  31. 0.4970080000 0.5916610000 0.4246690000 1 1 1 mag 0.0
  32. 0.6444450000 0.5048730000 0.5000000000 1 1 1 mag 0.0
  33. 0.5742370000 0.4083390000 0.5752410000 1 1 1 mag 0.0
  34. 0.5742370000 0.4083390000 0.4247590000 1 1 1 mag 0.0
复制代码
INPUT文件:
  1. INPUT_PARAMETERS
  2. suffix                  ethanol
  3. ntype                   3
  4. nelec                   0.0
  5. nspin                   1
  6. pseudo_dir              /path_to_pp/    #赝势文件夹
  7. orbital_dir                /path_to_orb/   #轨道基组文件夹
  8. dft_functional          pbe
  9. ecutwfc                 100             # Rydberg #LCAO使用建议值100Ry,使用PW方法最好测试下
  10. scf_thr                 1e-7                # Rydberg #用比较高的收敛限
  11. basis_type              lcao            #使用LCAO
  12. calculation             relax                # this is the key parameter telling abacus to do a scf calculation
  13. force_thr_ev                0.01                # the threshold of the force convergence, in unit of eV/Angstrom
  14. relax_nmax                100                # the maximal number of ionic iteration steps
  15. out_stru                1               #输出结构


  16. vdw_method  d3_bj                       #dftd3-bj校正


  17. #溶剂模型参数
  18. imp_sol                 1               #打开溶剂模型
  19. eb_k                    80
  20. tau                     0.000010798
  21. sigma_k                 0.6
  22. nc_k                    0.00037
复制代码
KPT文件:
  1. K_POINTS
  2. 0
  3. Gamma
  4. 2 2 2 0 0 0
复制代码
和VASP类似(幸好不用合并赝势文件),把他们放到同一个文件夹,运行mpirun -n 16 abacus,得到最后一帧结构。
共优化27步,用时7785s

溶解自由能
使用优化后的结构,分别计算气相与液相的能量。
  1. INPUT_PARAMETERS
  2. suffix                  ethanol
  3. ntype                   3
  4. nelec                   0.0
  5. nspin                   1
  6. pseudo_dir              /path_to_pp/    #赝势文件夹
  7. orbital_dir                /path_to_orb/   #轨道基组文件夹
  8. dft_functional          pbe
  9. ecutwfc                 100             # Rydberg #LCAO使用建议值100Ry,使用PW方法最好测试下
  10. scf_thr                 1e-7                # Rydberg #用比较高的收敛限
  11. basis_type              lcao            #使用LCAO
  12. calculation             scf                # this is the key parameter telling abacus to do a scf calculation



  13. vdw_method  d3_bj                       #dftd3-bj校正

  14. #溶剂模型参数
  15. imp_sol                 0               #关闭溶剂模型
  16. eb_k                    80
  17. tau                     0.000010798
  18. sigma_k                 0.6
  19. nc_k                    0.00037
复制代码
气相中每次scf迭代用时约为0.8s,总能量-841.1220375167616 eV 。液相中每次scf迭代用时16s,总能量-841.3260286872329 eV,溶解自由能:-0.20 eV符合。

QE
安装
QE要使用溶剂模型需要在编译时加入Environ插件。由于是AMD平台,不考虑的MKL的话编译很简单,先进入解压后的Environ源代码文件夹,输入:./configure --with-qe=<absolute_path_to_QE>,成功后进行编译:make -j compile。
没有报错后进入QE的目录,输入./configure --with-environ=<absolute_path_to_Environ> -enable-openmp,成功后开始编译QEmake -jN all。详细QE编译并且加上MKL参考http://sobereva.com/562。在测试中发现有些版本QE的configure无法正确识别MKL,如果出现此情况,有条件的可以自行修改,没条件的又不急需那个版本的话直接换一个版本的源码包。

结构优化(qe用的人比较多,就不放输入文件了)
使用SSSP Efficiency的赝势库,截断能设置为60,600。
Environ input (environ.in):
  1. &ENVIRON
  2.    verbose = 1
  3.    environ_type = "water"  #应用默认的参数
  4.    environ_thr = 1.d2

  5. /
  6. &BOUNDARY
  7.    solvent_mode = 'full'
  8. /
  9. &ELECTROSTATIC
  10.    pbc_dim = 3
复制代码
将.in文件和environ.in放到一个文件夹运行:
mpirun -n 16 pw.x < enthanol.in -environ液相优化用时494s,12步。每次scf迭代8s。气相每次迭代3.8秒。

溶解自由能
液相中总能量-85.6621819080 Ry ,气相中-85.65146975 Ry,溶解自由能为-0.14 eV,差距有点多。

CP2K
安装
参考http://sobereva.com/586
直接使用Multiwfn生成的输入文件默认值进行优化。首先使用非周期性,gamma点进行计算。中间偶尔几步能量波动特别大,在优化85步之后,SCF直接由于solvation energy异常(+1022 kcal/mol)不收敛了。
现在改成三维周期性,直接用Multiwfn生成的输入文件(截断能:55,400;Perodic求解器;RHO_MIN 0.0001841; RHO_MAX 0.0013604)。同样,优化前几步就出现很大的能量波动以及不合理的solvation energy:


将输入文件中的值改成和Envrion中的值一致(Dupont et al., 2013),即α+γ 50,β -0.35,RHO_MIN 0.0001,RHO_MAX 0.005。将截断能提高至60、800再次进行结构优化。这次经过8步后优化收敛,每步scf迭代为10s左右,总用时1744s,Solvation energy为-0.17 eV符合。

小结
以上软件应该都能够通过调整参数来得到合理的小分子自由能,但是cp2k需要很小心地测试隐式溶剂模型截断能(测试力?),有时候虽然第一步能给个负值,但是在优化过程中就会不收敛,尽管此时构象并没有发生明显变化。其他软件在这一环节中没有出现cp2k的问题。优化后GPAW给出的结构与pyscf优化的差距稍大,部分键长差距2%左右,其他软件优化的差距在1%以内。

三、slab吸附模型测试

参考文献中优化好的晶胞(Boyd et al., 2021),进行扩胞搞了个很大的双层MnO2 slab,原子数448,层间有一些水和钾离子。
1. GPAW
GPAW目前的隐式溶剂模型不支持带电体系;偶极校正需要校正方向与slab面垂直且在该方向上为非周期性边界;带电体系不支持周期性和非周期性边界的混合。因此,目前的GPAW模拟水溶液中的吸附、带电体系的吸附有很大的局限。
2. ABACUS
正在施工。。。。有空补上
3. QE
就不难为我小小的机子了,直接放弃
4. CP2K
用OT很勉强,截断能不能很高。。。。。有空补上





评分 Rate

参与人数
Participants 4
威望 +1 eV +14 收起 理由
Reason
sobereva + 1
LittlePupil + 5 好物!
jianying8996 + 4
r1ck + 5 GJ!

查看全部评分 View all ratings

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-23 10:07 , Processed in 0.177680 second(s), 26 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list