gfn0-xTB and parallel DFT-D4 (#3765)

This commit is contained in:
Juerg Hutter 2024-11-08 17:48:34 +01:00 committed by GitHub
parent b5a5e3a0a2
commit 8e5fe4401f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
129 changed files with 61561 additions and 3236 deletions

1799
data/xTB0_parameters Normal file

File diff suppressed because it is too large Load diff

1180
data/xTB1_parameters Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,246 +0,0 @@
# Element-specific parameters in tight-binding Hamiltonians
# Table S31: Element-specific parameters employed in GFN-xTB:
# Atomic Hubbard parameter (eta), its charge derivative (gamma), the exponential scaling parameter alpha
# and Zeff (both entering the repulsion potential), the polynomial scaling parameters kpoly,
# the shell-specific scaling parameters of the Hubbard parameter kappa, the atomic level energies (H) and the
# corresponding Slater exponents zeta.
#
# element eta gamma alpha Zeff level kpoly kappa Hl / eV zeta
#
H 0.470099 0.0 2.209700 1.116244 1s 0.0 0.0 -10.923452 1.207940
2s 0.0 0.0 -2.171902 1.993207
He 1.441379 1.500000 1.382907 0.440231 1s 8.084149 0.0 -22.121015 2.133698
Li 0.205342 1.027370 0.671797 2.747587 2s -4.102845 0.0 -7.270105 0.743881
2p 9.259276 -0.772012 -4.609277 0.541917
Be 0.274022 0.900554 0.865377 4.076830 2s -12.991482 0.0 -9.541494 0.876888
2p -1.308797 1.113005 -5.812621 1.104598
B 0.340530 1.300000 1.093544 4.458376 2s -7.088823 0.0 -12.497913 1.667617
2p 0.655877 0.165643 -7.604923 1.495078
C 0.479988 1.053856 1.281954 4.428763 2s -7.082170 0.0 -13.587210 1.960324
2p 0.812216 -0.471181 -10.052785 1.832096
N 0.476106 0.042507 1.727773 5.498808 2s -12.745585 0.0 -20.058000 2.050067
2p -1.428367 0.315090 -12.889326 2.113682
O 0.583349 -0.005102 2.004253 5.171786 2s -13.729047 0.0 -23.398376 2.345365
2p -4.453341 0.374608 -17.886554 2.153060
F 0.788194 1.615037 2.507078 6.931741 2s -3.921613 0.0 -24.776175 2.968015
2p -11.422491 -0.827352 -17.274415 2.256959
Ne 0.612878 1.600000 3.038727 9.102523 2s -2.115896 0.0 -31.167487 3.200000
2p -15.124326 -3.892542 -18.268975 2.294365
3d 0.0 0.0 1.487984 2.684436
Na 0.146475 1.200000 0.678744 9.192606 2s 7.549004 0.0 -5.425941 0.566702
2p 13.576090 -4.545627 -2.970587 0.391147
Mg 0.332890 1.100000 0.796201 12.176772 2s -18.095421 0.0 -10.585393 0.947394
2p 21.451533 1.823758 -2.983087 0.538324
Al 0.221658 1.200000 0.929219 16.283595 3s -21.085827 0.0 -12.916245 1.497753
3p 24.805127 0.503564 -3.441043 1.232966
3d 26.405814 0.0 -1.751415 0.606937
Si 0.438331 1.500000 0.948165 16.898359 3s -14.201582 0.0 -14.506128 1.521960
3p -3.893343 -5.925834 -7.557337 1.609138
3d 25.499221 0.0 -2.508113 1.168971
P 0.798319 1.500000 1.067197 15.249559 3s -16.118985 0.0 -18.865587 1.993165
3p -2.241189 -2.530875 -9.386464 1.826973
3d 30.984577 0.0 -0.673989 1.293345
S 0.643959 1.500000 1.200803 15.100323 3s -16.989922 0.0 -23.819013 2.506934
3p -6.067779 -1.678147 -12.120136 1.992775
3d 16.248395 0.0 -1.711261 1.964867
Cl 0.519712 1.000000 1.404155 17.000000 3s -9.341919 0.0 -24.452163 2.847946
3p -8.499805 -4.481841 -12.883714 2.077534
3d 13.088867 0.0 -1.190095 1.932463
Ar 0.529906 0.829312 1.323756 17.153132 3s -0.082808 0.0 -31.395427 3.502323
3p -9.217948 -1.450000 -17.412901 2.287983
3d 12.204172 0.0 -1.119399 1.761181
K 0.114358 0.732923 0.581529 20.831436 4s 12.482844 0.0 -5.815562 0.841791
4p 22.323655 -5.332978 -3.747255 0.771618
Ca 0.134187 1.116963 0.665588 19.840212 4s -11.421376 0.0 -7.979180 1.321845
4p 14.628284 11.522018 -2.517008 0.734954
3d 10.129602 0.0 -2.752355 0.947032
Sc 0.778545 1.000000 0.841357 18.676202 3d -36.027863 -5.934820 -7.172021 2.200000
4s 9.522966 0.0 -9.632943 1.532191
4p 44.183320 -2.000000 -0.696628 1.017366
Ti 1.044998 0.739203 0.828638 17.084130 3d -24.908650 -7.388986 -7.617343 1.941479
4s 24.879987 0.0 -7.948161 1.477526
4p 18.910954 -1.500000 -0.902143 1.063921
V 0.985157 0.800000 1.061627 22.352532 3d -29.197847 -5.229338 -6.677563 1.812440
4s -5.301066 0.0 -9.000000 1.345487
4p 22.945047 -2.000000 -0.108008 1.100000
Cr 0.468100 0.800000 0.997051 22.873486 3d -22.608167 0.786859 -7.357172 1.915482
4s -2.432193 0.0 -7.024438 1.241910
4p 11.274054 -2.500000 -3.933133 1.130000
Mn 0.609868 0.300000 1.019783 24.160655 3d -25.016650 10.544199 -8.558648 2.016302
4s 1.025345 0.0 -6.149482 1.882798
4p 1.834626 -2.500000 -4.360801 1.270000
Fe 0.900000 0.500000 1.137174 25.983149 3d -22.920815 1.018896 -9.705009 2.264485
4s -2.182723 0.0 -6.617863 1.382959
4p 11.769535 -2.000000 -4.595985 1.300000
Co 0.426680 0.300000 1.188538 27.169215 3d -21.678930 0.222849 -10.285239 2.279966
4s 0.815250 0.0 -4.593686 1.925082
4p 15.765732 -2.000000 -3.855768 1.350000
Ni 0.367019 1.000000 1.399197 23.396999 3d -26.348820 1.282426 -10.841022 2.356745
4s 15.160508 0.0 -8.687611 1.532263
4p 15.782685 -2.000000 -3.332933 1.350000
Cu 0.260192 0.237602 1.199230 29.000000 3d -21.142399 -1.290373 -11.114050 2.598287
4s -3.590501 0.0 -8.373193 1.583677
4p 7.413473 0.0 -4.419045 1.350000
Zn 0.209459 1.400000 1.145056 31.185765 4s -15.535695 0.0 -11.263459 1.722526
4p 4.061664 0.200991 -4.666731 1.061945
Ga 0.193302 1.400000 1.047536 33.128619 4s -14.584657 0.0 -13.273222 1.992354
4p 9.375082 -2.021175 -4.859478 1.482052
4d 19.671655 1.000000 -2.245112 0.712761
Ge 0.800000 1.400000 1.129480 35.493164 4s -12.195371 0.0 -12.558286 2.172951
4p -11.374296 -7.631942 -8.035796 1.794495
4d 9.364108 -1.300000 -2.752271 0.769997
As 0.732367 1.300000 1.233641 36.125762 4s -17.489686 0.0 -17.515251 2.265106
4p -6.747956 -0.335509 -8.272706 1.986411
4d 17.858510 -1.000000 -1.245776 1.113511
Se 0.714534 1.300000 1.270088 32.148852 4s -14.852299 0.0 -23.000000 3.044672
4p -9.863477 -3.213580 -10.398968 2.098532
4d 9.556181 -2.500000 -0.821804 1.863317
Br 0.732530 -0.500000 1.153580 35.000000 4s -17.815502 0.0 -19.875752 2.886237
4p -14.058044 -1.440020 -12.818655 2.190987
4d 5.468245 -1.000000 -3.348113 1.789395
Kr 0.820312 1.000000 1.335287 36.000000 4s -25.437273 0.0 -20.280017 2.828105
4p -12.813227 -3.743296 -15.200155 1.965472
4d 10.440712 0.0 -4.253986 1.512609
Rb 0.075735 1.500000 0.554032 39.653032 5s -7.450752 0.0 -7.616948 0.809529
5p 16.670533 -5.181667 -4.369842 0.950253
Sr 0.122861 1.300000 0.657904 38.924904 5s -6.087125 0.0 -6.840171 1.458742
5p 2.115262 -8.003590 -3.338573 0.730658
4d 17.076466 0.0 -1.715680 1.028147
Y 0.351290 1.400000 0.760144 39.000000 4d -28.061976 -4.159186 -5.731066 2.300000
5s 10.950764 0.0 -8.748292 1.593058
5p 45.679760 -0.800000 -0.838555 1.170000
Zr 0.168219 0.581478 0.739520 36.521516 4d -22.240873 0.337914 -6.771010 2.175661
5s 44.110231 0.0 -3.979156 1.665905
5p 25.863572 -2.500000 -3.954049 1.230000
Nb 0.175875 0.280147 0.895357 40.803132 4d -25.998052 0.638436 -9.245726 2.092288
5s 15.379439 0.0 -9.268975 1.459971
5p 30.159730 -2.000000 -1.348707 1.200000
Mo 0.384677 0.041052 0.944064 41.939347 4d -22.556077 -3.426221 -8.176239 1.891236
5s 5.815301 0.0 -7.645737 1.827996
5p 14.527159 -2.500000 -3.802884 1.220000
Tc 0.405474 0.500000 1.028240 43.000000 4d -23.231470 2.642680 -8.690050 2.120497
5s 24.977603 0.0 -5.089073 1.789115
5p 1.953838 -2.000000 -4.878724 1.250000
Ru 0.305394 0.001205 1.066144 44.492732 4d -23.099524 1.772831 -10.960165 2.352683
5s 15.281981 0.0 -6.304229 1.883645
5p 1.340798 -1.500000 -5.569969 1.370000
Rh 0.293973 0.622690 1.131380 45.241537 4d -23.540560 3.782936 -11.935915 2.436353
5s 10.450086 0.0 -4.883179 2.000000
5p 15.559547 -2.500000 -4.427854 1.470000
Pd 0.280766 0.500000 1.206869 42.105527 4d -23.290322 3.210802 -12.059626 2.528954
5s 17.475085 0.0 -5.724219 2.073217
5p 21.621321 -2.500000 -2.575000 1.550000
Ag 0.472978 -0.445675 1.058886 43.201446 4d -6.963262 -1.477715 -9.675945 2.720329
5s -12.856324 0.0 -5.723081 1.994885
5p 0.187155 -1.500000 -3.273430 1.620000
Cd 0.130828 1.362587 1.026434 49.016827 5s -10.281188 0.0 -12.099216 1.980518
5p 6.247124 -0.775216 -3.859493 1.191810
In 0.132120 1.063557 0.898148 51.718417 5s -10.488459 0.0 -16.894094 2.226101
5p 19.136222 0.762515 -3.502771 1.625926
5d 5.584366 0.0 -3.650350 0.663076
Sn 0.480655 -0.321283 1.008192 54.503455 5s -19.310676 0.0 -24.164818 2.474055
5p -5.460959 -3.444851 -7.640096 1.893755
5d 10.683419 -1.500000 -1.908531 1.547485
Sb 0.564406 -0.341503 0.982673 50.757213 5s -17.310388 0.0 -20.650528 2.761687
5p -7.203718 -1.459812 -7.536020 2.076379
5d 10.096015 -2.000000 -2.185884 1.071094
Te 0.400301 0.894388 0.973410 49.215262 5s -17.836704 0.0 -29.899753 2.880945
5p -9.887978 0.137154 -10.026096 2.254863
5d 20.942979 -2.000000 -0.372055 1.724516
I 0.520472 -0.500000 0.949181 53.000000 5s -21.954071 0.0 -23.832631 3.117622
5p -10.823970 -0.387987 -11.604442 2.248195
5d 12.522287 -1.500000 -2.025327 1.831809
Xe 0.935394 -0.800000 1.074785 52.500985 5s -22.530281 0.0 -21.969064 3.128524
5p -16.667114 -3.435282 -11.870978 2.316580
5d 8.021956 -1.500000 -2.697796 1.888452
Cs 0.085110 1.500000 0.579919 65.029838 5s -1.460631 0.0 -6.341379 0.779877
5p 15.879494 -7.035550 -3.944275 0.810404
Ba 0.137819 1.500000 0.606485 46.532974 5s -5.468018 0.0 -6.452630 1.387083
5p 4.368854 -8.801363 -3.975353 0.532658
4d 14.328052 0.0 -2.305768 0.853415
La 0.495969 1.500000 1.311200 48.337542 5d -44.208463 -6.396752 -5.872226 3.000000
6s -3.988102 0.0 -6.500000 1.492677
6p 40.847293 -1.500000 -0.727921 1.350000
Ce 0.350000 1.200000 0.839861 30.638143 5d -36.440945 -5.245538 -5.032003 3.000000
6s 6.148475 0.0 -6.275363 1.553483
6p 42.873822 -1.500000 0.291196 1.380859
Pr 0.342306 1.200000 0.847281 34.130718 5d -36.021673 -5.064761 -4.944984 2.992307
6s 7.806576 0.0 -6.271128 1.578839
6p 42.846148 -1.500000 0.241817 1.385620
Nd 0.334612 1.200000 0.854701 37.623294 5d -35.602402 -4.883984 -4.857964 2.984614
6s 9.464678 0.0 -6.266893 1.604196
6p 42.818474 -1.500000 0.192438 1.390381
Pm 0.326917 1.200000 0.862121 41.115870 5d -35.183130 -4.703207 -4.770945 2.976922
6s 11.122779 0.0 -6.262657 1.629552
6p 42.790801 -1.500000 0.143059 1.395142
Sm 0.319223 1.200000 0.869541 44.608445 5d -34.763859 -4.522429 -4.683925 2.969229
6s 12.780881 0.0 -6.258422 1.654909
6p 42.763127 -1.500000 0.093680 1.399903
Eu 0.311529 1.200000 0.876961 48.101021 5d -34.344587 -4.341652 -4.596906 2.961536
6s 14.438982 0.0 -6.254187 1.680265
6p 42.735454 -1.500000 0.044301 1.404664
Gd 0.303835 1.200000 0.884381 51.593596 5d -33.925315 -4.160875 -4.509886 2.953843
6s 16.097083 0.0 -6.249952 1.705622
6p 42.707780 -1.500000 -0.005078 1.409425
Tb 0.296140 1.200000 0.891801 55.086172 5d -33.506044 -3.980098 -4.422867 2.946150
6s 17.755185 0.0 -6.245716 1.730979
6p 42.680106 -1.500000 -0.054457 1.414186
Dy 0.288446 1.200000 0.899221 58.578748 5d -33.086772 -3.799321 -4.335848 2.938457
6s 19.413286 0.0 -6.241481 1.756335
6p 42.652433 -1.500000 -0.103836 1.418947
Ho 0.280752 1.200000 0.906641 62.071323 5d -32.667501 -3.618544 -4.248828 2.930765
6s 21.071387 0.0 -6.237246 1.781692
6p 42.624759 -1.500000 -0.153215 1.423708
Er 0.273058 1.200000 0.914061 65.563899 5d -32.248229 -3.437767 -4.161809 2.923072
6s 22.729489 0.0 -6.233011 1.807048
6p 42.597085 -1.500000 -0.202593 1.428469
Tm 0.265364 1.200000 0.921481 69.056474 5d -31.828957 -3.256989 -4.074789 2.915379
6s 24.387590 0.0 -6.228775 1.832405
6p 42.569412 -1.500000 -0.251972 1.433230
Yb 0.257669 1.200000 0.928901 72.549050 5d -31.409686 -3.076212 -3.987770 2.907686
6s 26.045692 0.0 -6.224540 1.857761
6p 42.541738 -1.500000 -0.301351 1.437991
Lu 0.249975 1.200000 0.936321 76.041625 5d -30.990414 -2.895435 -3.900750 2.899993
6s 27.703793 0.0 -6.220305 1.883118
6p 42.514065 -1.500000 -0.350730 1.442752
Hf 0.269977 0.847011 0.853744 55.222897 5d -21.116286 -1.485678 -4.360558 2.466693
6s 15.014122 0.0 -5.910623 2.039390
6p 22.898249 -1.500000 -2.814338 1.450000
Ta 0.239696 0.064592 0.971873 63.743065 5d -23.077812 -1.870583 -9.232014 2.177327
6s 29.782424 0.0 -8.600553 1.692963
6p 36.420564 -1.500000 -0.252865 1.400000
W 0.243663 -0.014599 0.992643 74.000000 5d -17.030630 0.130920 -8.997799 2.300752
6s 35.195571 0.0 -2.878936 2.096013
6p 18.760746 -1.500000 -3.369287 1.400000
Re 0.362512 0.300000 1.132106 75.000000 5d -23.115824 2.507095 -7.858164 2.470782
6s 23.560994 0.0 -6.430285 2.220548
6p -0.067497 -2.000000 -5.165147 1.450000
Os 0.354318 -0.170295 1.118216 76.000000 5d -19.564083 -0.262294 -10.716969 2.734340
6s 24.928002 0.0 -3.655133 2.365840
6p -4.330556 -1.000000 -7.060522 1.650000
Ir 0.290898 0.965726 1.245003 77.000000 5d -21.172493 3.805255 -12.054598 2.797508
6s 25.774929 0.0 -5.686006 2.274300
6p -0.704597 -1.500000 -6.208990 1.650000
Pt 0.370447 1.092759 1.304590 78.000000 5d -22.169385 0.996400 -11.571582 2.807068
6s 38.415536 0.0 -7.184794 2.341428
6p -0.665483 -2.000000 -5.080419 1.650000
Au 0.496380 0.123512 1.293034 79.000000 5d -11.067532 -4.380921 -10.047575 3.117733
6s -11.443658 0.0 -6.530840 2.325119
6p -5.119735 -1.500000 -3.296026 1.750000
Hg 0.334997 -0.267745 1.181865 80.000000 6s -6.581368 0.0 -12.452637 2.062597
6p 3.995243 -4.204099 -4.169731 1.721925
Tl 0.671316 0.936157 0.976397 81.000000 6s -2.193199 0.0 -12.563376 2.647541
6p 0.060451 -8.101017 -5.131043 1.717991
Pb 1.000000 1.500000 0.988859 79.578302 6s -10.874138 0.0 -14.496335 2.847707
6p -6.034796 -7.925216 -5.848584 2.068091
Bi 0.944879 0.877488 1.047194 83.000000 6s -20.410234 0.0 -18.199529 2.895660
6p -9.424568 -7.150589 -6.735929 2.256279
Po 1.091248 -0.035874 1.013118 84.000000 6s -18.477865 0.0 -23.908422 3.150662
6p -14.037423 -3.955914 -8.889548 2.382063
5d 13.809093 0.0 -0.921251 1.241625
At 1.264162 -0.860502 0.964652 85.000000 6s -21.965390 0.0 -21.752193 3.516922
6p -12.804436 -3.402676 -10.031093 2.392024
5d 16.836546 0.0 -0.852571 1.380239
Rn 0.798170 -0.838429 0.998641 86.000000 6s -22.139701 0.0 -18.381647 3.520683
6p -20.539955 -2.380762 -10.236606 2.535389
5d 17.249637 0.0 -0.973687 1.418875

View file

@ -131,6 +131,9 @@ list(
dm_ls_scf_types.F
domain_submatrix_methods.F
domain_submatrix_types.F
eeq_data.F
eeq_input.F
eeq_method.F
ec_efield_local.F
ec_environment.F
ec_env_types.F
@ -839,10 +842,15 @@ list(
xas_tp_scf.F
xray_diffraction.F
xtb_coulomb.F
xtb_eeq.F
xtb_ehess.F
xtb_ehess_force.F
xtb_hcore.F
xtb_hab_force.F
xtb_ks_matrix.F
xtb_matrices.F
xtb_parameters.F
xtb_potentials.F
xtb_types.F)
list(

View file

@ -86,7 +86,7 @@ MODULE bibliography
Mattiat2022, Belleflamme2023, Knizia2013, Musaelian2023, Eriksen2020, &
Bussy2023, Bussy2024, Wang2018, Zeng2023, Graml2024, Solca2024, &
Caldeweyher2017, Caldeweyher2019, Caldeweyher2020, Freeman1977, Gruneis2009, &
Stein2022, Stein2024, &
Stein2022, Stein2024, Pracht2019, &
Blase2018, Blase2020, Bruneval2015, Golze2019, Gui2018, Jacquemin2017, Liu2020, &
Sander2015, Schreiber2008, vanSetten2015, Setyawan2010, Ahart2024
@ -1884,6 +1884,12 @@ CONTAINS
source="J. Chem. Theory Comput.", volume="20", pages="6772-6780", &
year=2024, doi="10.1021/acs.jctc.4c00371")
CALL add_reference(key=Pracht2019, &
authors=s2a("P. Pracht", "E. Caldeweyher", "S. Ehlert", "S. Grimme"), &
title="A Robust Non-Self-Consistent Tight-Binding Quantum Chemistry Method for large Molecules", &
source="ChemRxiv", volume="", pages="", &
year=2019, doi="10.26434/chemrxiv.8326202.v1")
END SUBROUTINE add_all_references
END MODULE bibliography

View file

@ -12,6 +12,7 @@
MODULE cp_control_types
USE cp_fm_types, ONLY: cp_fm_release,&
cp_fm_type
USE eeq_input, ONLY: eeq_solver_type
USE input_constants, ONLY: do_full_density,&
rtp_bse_ham_G0W0,&
rtp_method_tddft
@ -132,12 +133,15 @@ MODULE cp_control_types
! \brief Control parameters for xTB calculations
! **************************************************************************************************
TYPE xtb_control_type
!
INTEGER :: gfn_type = 1
!
LOGICAL :: do_ewald = .FALSE.
!
INTEGER :: sto_ng = 0
INTEGER :: h_sto_ng = 0
!
INTEGER :: vdw_type = -1
CHARACTER(LEN=default_path_length) :: parameter_file_path = ""
CHARACTER(LEN=default_path_length) :: parameter_file_name = ""
!
@ -151,7 +155,10 @@ MODULE cp_control_types
REAL(KIND=dp) :: kg = 0.0_dp, kf = 0.0_dp
REAL(KIND=dp) :: kcns = 0.0_dp, kcnp = 0.0_dp, kcnd = 0.0_dp
REAL(KIND=dp) :: ken = 0.0_dp
REAL(KIND=dp) :: ksen = 0.0_dp, kpen = 0.0_dp, kden = 0.0_dp
REAL(KIND=dp) :: ben = 0.0_dp
REAL(KIND=dp) :: kxr = 0.0_dp, kx2 = 0.0_dp
REAL(KIND=dp) :: enscale = 0.0_dp
!
LOGICAL :: xb_interaction = .FALSE.
LOGICAL :: do_nonbonded = .FALSE.
@ -159,7 +166,6 @@ MODULE cp_control_types
LOGICAL :: coulomb_lr = .FALSE.
LOGICAL :: tb3_interaction = .FALSE.
LOGICAL :: check_atomic_charges = .FALSE.
LOGICAL :: old_coulomb_damping = .FALSE.
!
REAL(KIND=dp) :: xb_radius = 0.0_dp
REAL(KIND=dp) :: coulomb_sr_cut = 0.0_dp
@ -172,6 +178,17 @@ MODULE cp_control_types
REAL, DIMENSION(:), POINTER :: kab_vals => NULL()
!
TYPE(pair_potential_p_type), POINTER :: nonbonded => NULL()
REAL(KIND=dp) :: eps_pair = 0.0_dp
REAL(KIND=dp), DIMENSION(:, :), &
POINTER :: rcpair => NULL()
!
! SRB terms
REAL(KIND=dp) :: ksrb = 0.0_dp, esrb = 0.0_dp, gscal = 0.0_dp
REAL(KIND=dp) :: c1srb = 0.0_dp, c2srb = 0.0_dp, shift = 0.0_dp
!
! EN shift in EEQ (molecular=1 or crystaline=2)
INTEGER :: enshift_type = 1
TYPE(eeq_solver_type) :: eeq_sparam ! parameters for EEQ solver
END TYPE xtb_control_type
! **************************************************************************************************
@ -1072,6 +1089,7 @@ CONTAINS
NULLIFY (xtb_control%kab_vals)
NULLIFY (xtb_control%kab_types)
NULLIFY (xtb_control%nonbonded)
NULLIFY (xtb_control%rcpair)
END SUBROUTINE xtb_control_create
@ -1092,6 +1110,9 @@ CONTAINS
IF (ASSOCIATED(xtb_control%kab_types)) THEN
DEALLOCATE (xtb_control%kab_types)
END IF
IF (ASSOCIATED(xtb_control%rcpair)) THEN
DEALLOCATE (xtb_control%rcpair)
END IF
IF (ASSOCIATED(xtb_control%nonbonded)) THEN
CALL pair_potential_p_release(xtb_control%nonbonded)
END IF

View file

@ -11,9 +11,10 @@
MODULE cp_control_utils
USE bibliography, ONLY: &
Andreussi2012, Dewar1977, Dewar1985, Elstner1998, Fattebert2002, Grimme2017, Hu2007, &
Krack2000, Lippert1997, Lippert1999, Porezag1995, Repasky2002, Rocha2006, Schenter2008, &
Seifert1996, Souza2002, Stengel2009, Stewart1989, Stewart2007, Thiel1992, Umari2002, &
VanVoorhis2015, VandeVondele2005a, VandeVondele2005b, Yin2017, Zhechkov2005, cite_reference
Krack2000, Lippert1997, Lippert1999, Porezag1995, Pracht2019, Repasky2002, Rocha2006, &
Schenter2008, Seifert1996, Souza2002, Stengel2009, Stewart1989, Stewart2007, Thiel1992, &
Umari2002, VanVoorhis2015, VandeVondele2005a, VandeVondele2005b, Yin2017, Zhechkov2005, &
cite_reference
USE cp_control_types, ONLY: &
admm_control_create, admm_control_type, ddapc_control_create, ddapc_restraint_type, &
dft_control_create, dft_control_type, efield_type, expot_control_create, &
@ -27,6 +28,7 @@ MODULE cp_control_utils
cp_print_key_unit_nr
USE cp_units, ONLY: cp_unit_from_cp2k,&
cp_unit_to_cp2k
USE eeq_input, ONLY: read_eeq_param
USE force_fields_input, ONLY: read_gp_section
USE input_constants, ONLY: &
admm1_type, admm2_type, admmp_type, admmq_type, admms_type, constant_env, custom_env, &
@ -50,7 +52,7 @@ MODULE cp_control_utils
sccs_derivative_cd3, sccs_derivative_cd5, sccs_derivative_cd7, sccs_derivative_fft, &
sccs_fattebert_gygi, sic_ad, sic_eo, sic_list_all, sic_list_unpaired, sic_mauri_spz, &
sic_mauri_us, sic_none, slater, tddfpt_dipole_length, tddfpt_excitations, &
tddfpt_kernel_stda, use_mom_ref_user
tddfpt_kernel_stda, use_mom_ref_user, xtb_vdw_type_d3, xtb_vdw_type_d4, xtb_vdw_type_none
USE input_cp2k_check, ONLY: xc_functionals_expand
USE input_cp2k_dft, ONLY: create_dft_section
USE input_enumeration_types, ONLY: enum_i2c,&
@ -723,6 +725,7 @@ CONTAINS
CHARACTER(len=*), PARAMETER :: routineN = 'read_qs_section'
CHARACTER(LEN=default_string_length) :: cval
CHARACTER(LEN=default_string_length), &
DIMENSION(:), POINTER :: clist
INTEGER :: handle, itmp, j, jj, k, n_rep, n_var, &
@ -732,15 +735,16 @@ CONTAINS
REAL(dp) :: tmp, tmpsqrt, value
REAL(dp), POINTER :: scal(:)
TYPE(section_vals_type), POINTER :: cdft_control_section, ddapc_restraint_section, &
dftb_parameter, dftb_section, genpot_section, lri_optbas_section, mull_section, &
nonbonded_section, s2_restraint_section, se_section, xtb_parameter, xtb_section
dftb_parameter, dftb_section, eeq_section, genpot_section, lri_optbas_section, &
mull_section, nonbonded_section, s2_restraint_section, se_section, xtb_parameter, &
xtb_section
CALL timeset(routineN, handle)
was_present = .FALSE.
NULLIFY (mull_section, ddapc_restraint_section, s2_restraint_section, &
se_section, dftb_section, xtb_section, dftb_parameter, xtb_parameter, lri_optbas_section, &
cdft_control_section, genpot_section)
cdft_control_section, genpot_section, eeq_section)
mull_section => section_vals_get_subs_vals(qs_section, "MULLIKEN_RESTRAINT")
ddapc_restraint_section => section_vals_get_subs_vals(qs_section, "DDAPC_RESTRAINT")
@ -750,6 +754,7 @@ CONTAINS
xtb_section => section_vals_get_subs_vals(qs_section, "xTB")
dftb_parameter => section_vals_get_subs_vals(dftb_section, "PARAMETER")
xtb_parameter => section_vals_get_subs_vals(xtb_section, "PARAMETER")
eeq_section => section_vals_get_subs_vals(xtb_section, "EEQ")
lri_optbas_section => section_vals_get_subs_vals(qs_section, "OPTIMIZE_LRI_BASIS")
cdft_control_section => section_vals_get_subs_vals(qs_section, "CDFT")
nonbonded_section => section_vals_get_subs_vals(xtb_section, "NONBONDED")
@ -922,6 +927,7 @@ CONTAINS
CASE (do_method_xtb)
qs_control%xtb = .TRUE.
CALL cite_reference(Grimme2017)
CALL cite_reference(Pracht2019)
CASE (do_method_mndo)
CALL cite_reference(Dewar1977)
qs_control%semi_empirical = .TRUE.
@ -1197,6 +1203,7 @@ CONTAINS
! xTB code
IF (qs_control%xtb) THEN
CALL section_vals_val_get(xtb_section, "GFN_TYPE", i_val=qs_control%xtb_control%gfn_type)
CALL section_vals_val_get(xtb_section, "DO_EWALD", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(xtb_section, "DO_EWALD", &
@ -1204,43 +1211,208 @@ CONTAINS
ELSE
qs_control%xtb_control%do_ewald = (qs_control%periodicity /= 0)
END IF
! vdW
CALL section_vals_val_get(xtb_section, "VDW_POTENTIAL", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(xtb_section, "VDW_POTENTIAL", c_val=cval)
CALL uppercase(cval)
SELECT CASE (cval)
CASE ("NONE")
qs_control%xtb_control%vdw_type = xtb_vdw_type_none
CASE ("DFTD3")
qs_control%xtb_control%vdw_type = xtb_vdw_type_d3
CASE ("DFTD4")
qs_control%xtb_control%vdw_type = xtb_vdw_type_d4
CASE DEFAULT
CPABORT("vdW type")
END SELECT
ELSE
SELECT CASE (qs_control%xtb_control%gfn_type)
CASE (0)
qs_control%xtb_control%vdw_type = xtb_vdw_type_d4
CASE (1)
qs_control%xtb_control%vdw_type = xtb_vdw_type_d3
CASE (2)
qs_control%xtb_control%vdw_type = xtb_vdw_type_d4
CPABORT("gfn2-xtb tbd")
CASE DEFAULT
CPABORT("GFN type")
END SELECT
END IF
!
CALL section_vals_val_get(xtb_section, "STO_NG", i_val=ngauss)
qs_control%xtb_control%sto_ng = ngauss
CALL section_vals_val_get(xtb_section, "HYDROGEN_STO_NG", i_val=ngauss)
qs_control%xtb_control%h_sto_ng = ngauss
CALL section_vals_val_get(xtb_parameter, "PARAM_FILE_PATH", &
c_val=qs_control%xtb_control%parameter_file_path)
CALL section_vals_val_get(xtb_parameter, "PARAM_FILE_NAME", &
c_val=qs_control%xtb_control%parameter_file_name)
CALL section_vals_val_get(xtb_parameter, "PARAM_FILE_NAME", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(xtb_parameter, "PARAM_FILE_NAME", &
c_val=qs_control%xtb_control%parameter_file_name)
ELSE
SELECT CASE (qs_control%xtb_control%gfn_type)
CASE (0)
qs_control%xtb_control%parameter_file_name = "xTB0_parameters"
CASE (1)
qs_control%xtb_control%parameter_file_name = "xTB1_parameters"
CASE (2)
CPABORT("gfn2-xtb tbd")
CASE DEFAULT
CPABORT("GFN type")
END SELECT
END IF
! D3 Dispersion
CALL section_vals_val_get(xtb_parameter, "DISPERSION_RADIUS", &
r_val=qs_control%xtb_control%rcdisp)
CALL section_vals_val_get(xtb_parameter, "COORDINATION_CUTOFF", &
r_val=qs_control%xtb_control%epscn)
CALL section_vals_val_get(xtb_parameter, "D3BJ_SCALING", r_vals=scal)
qs_control%xtb_control%s6 = scal(1)
qs_control%xtb_control%s8 = scal(2)
CALL section_vals_val_get(xtb_parameter, "D3BJ_PARAM", r_vals=scal)
qs_control%xtb_control%a1 = scal(1)
qs_control%xtb_control%a2 = scal(2)
CALL section_vals_val_get(xtb_parameter, "D3BJ_SCALING", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(xtb_parameter, "D3BJ_SCALING", r_vals=scal)
qs_control%xtb_control%s6 = scal(1)
qs_control%xtb_control%s8 = scal(2)
ELSE
SELECT CASE (qs_control%xtb_control%gfn_type)
CASE (0)
qs_control%xtb_control%s6 = 1.00_dp
qs_control%xtb_control%s8 = 2.85_dp
CASE (1)
qs_control%xtb_control%s6 = 1.00_dp
qs_control%xtb_control%s8 = 2.40_dp
CASE (2)
CPABORT("gfn2-xtb tbd")
CASE DEFAULT
CPABORT("GFN type")
END SELECT
END IF
CALL section_vals_val_get(xtb_parameter, "D3BJ_PARAM", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(xtb_parameter, "D3BJ_PARAM", r_vals=scal)
qs_control%xtb_control%a1 = scal(1)
qs_control%xtb_control%a2 = scal(2)
ELSE
SELECT CASE (qs_control%xtb_control%gfn_type)
CASE (0)
qs_control%xtb_control%a1 = 0.80_dp
qs_control%xtb_control%a2 = 4.60_dp
CASE (1)
qs_control%xtb_control%a1 = 0.63_dp
qs_control%xtb_control%a2 = 5.00_dp
CASE (2)
CPABORT("gfn2-xtb tbd")
CASE DEFAULT
CPABORT("GFN type")
END SELECT
END IF
CALL section_vals_val_get(xtb_parameter, "DISPERSION_PARAMETER_FILE", &
c_val=qs_control%xtb_control%dispersion_parameter_file)
! global parameters
CALL section_vals_val_get(xtb_parameter, "HUCKEL_CONSTANTS", r_vals=scal)
qs_control%xtb_control%ks = scal(1)
qs_control%xtb_control%kp = scal(2)
qs_control%xtb_control%kd = scal(3)
qs_control%xtb_control%ksp = scal(4)
qs_control%xtb_control%k2sh = scal(5)
CALL section_vals_val_get(xtb_parameter, "COULOMB_CONSTANTS", r_vals=scal)
qs_control%xtb_control%kg = scal(1)
qs_control%xtb_control%kf = scal(2)
CALL section_vals_val_get(xtb_parameter, "HUCKEL_CONSTANTS", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(xtb_parameter, "HUCKEL_CONSTANTS", r_vals=scal)
qs_control%xtb_control%ks = scal(1)
qs_control%xtb_control%kp = scal(2)
qs_control%xtb_control%kd = scal(3)
qs_control%xtb_control%ksp = scal(4)
qs_control%xtb_control%k2sh = scal(5)
IF (qs_control%xtb_control%gfn_type == 0) THEN
! enforce ksp for gfn0
qs_control%xtb_control%ksp = 0.5_dp*(scal(1) + scal(2))
END IF
ELSE
SELECT CASE (qs_control%xtb_control%gfn_type)
CASE (0)
qs_control%xtb_control%ks = 2.00_dp
qs_control%xtb_control%kp = 2.4868_dp
qs_control%xtb_control%kd = 2.27_dp
qs_control%xtb_control%ksp = 2.2434_dp
qs_control%xtb_control%k2sh = 1.1241_dp
CASE (1)
qs_control%xtb_control%ks = 1.85_dp
qs_control%xtb_control%kp = 2.25_dp
qs_control%xtb_control%kd = 2.00_dp
qs_control%xtb_control%ksp = 2.08_dp
qs_control%xtb_control%k2sh = 2.85_dp
CASE (2)
CPABORT("gfn2-xtb tbd")
CASE DEFAULT
CPABORT("GFN type")
END SELECT
END IF
CALL section_vals_val_get(xtb_parameter, "COULOMB_CONSTANTS", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(xtb_parameter, "COULOMB_CONSTANTS", r_vals=scal)
qs_control%xtb_control%kg = scal(1)
qs_control%xtb_control%kf = scal(2)
ELSE
SELECT CASE (qs_control%xtb_control%gfn_type)
CASE (0)
qs_control%xtb_control%kg = 2.00_dp
qs_control%xtb_control%kf = 1.50_dp
CASE (1)
qs_control%xtb_control%kg = 2.00_dp
qs_control%xtb_control%kf = 1.50_dp
CASE (2)
CPABORT("gfn2-xtb tbd")
CASE DEFAULT
CPABORT("GFN type")
END SELECT
END IF
CALL section_vals_val_get(xtb_parameter, "CN_CONSTANTS", r_vals=scal)
qs_control%xtb_control%kcns = scal(1)
qs_control%xtb_control%kcnp = scal(2)
qs_control%xtb_control%kcnd = scal(3)
CALL section_vals_val_get(xtb_parameter, "EN_CONSTANT", r_vals=scal)
qs_control%xtb_control%ken = scal(1)
!
CALL section_vals_val_get(xtb_parameter, "EN_CONSTANTS", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(xtb_parameter, "EN_CONSTANTS", r_vals=scal)
SELECT CASE (qs_control%xtb_control%gfn_type)
CASE (0)
qs_control%xtb_control%ksen = scal(1)
qs_control%xtb_control%kpen = scal(2)
qs_control%xtb_control%kden = scal(3)
CASE (1)
qs_control%xtb_control%ken = scal(1)
CASE (2)
CPABORT("gfn2-xtb tbd")
CASE DEFAULT
CPABORT("GFN type")
END SELECT
ELSE
SELECT CASE (qs_control%xtb_control%gfn_type)
CASE (0)
qs_control%xtb_control%ksen = 0.006_dp
qs_control%xtb_control%kpen = -0.001_dp
qs_control%xtb_control%kden = -0.002_dp
CASE (1)
qs_control%xtb_control%ken = -0.007_dp
CASE (2)
CPABORT("gfn2-xtb tbd")
CASE DEFAULT
CPABORT("GFN type")
END SELECT
END IF
! ben
CALL section_vals_val_get(xtb_parameter, "BEN_CONSTANT", r_vals=scal)
qs_control%xtb_control%ben = scal(1)
! enscale (hidden parameter in repulsion
CALL section_vals_val_get(xtb_parameter, "ENSCALE", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(xtb_parameter, "ENSCALE", &
r_val=qs_control%xtb_control%enscale)
ELSE
SELECT CASE (qs_control%xtb_control%gfn_type)
CASE (0)
qs_control%xtb_control%enscale = -0.09_dp
CASE (1)
qs_control%xtb_control%enscale = 0._dp
CASE (2)
CPABORT("gfn2-xtb tbd")
CASE DEFAULT
CPABORT("GFN type")
END SELECT
END IF
! XB
CALL section_vals_val_get(xtb_section, "USE_HALOGEN_CORRECTION", &
l_val=qs_control%xtb_control%xb_interaction)
@ -1258,9 +1430,9 @@ CONTAINS
CALL read_gp_section(qs_control%xtb_control%nonbonded, genpot_section, 0)
END IF
END IF !nonbonded
CALL section_vals_val_get(xtb_section, "EPS_PAIRPOTENTIAL", &
r_val=qs_control%xtb_control%eps_pair)
! SR Coulomb
CALL section_vals_val_get(xtb_section, "OLD_COULOMB_DAMPING", &
l_val=qs_control%xtb_control%old_coulomb_damping)
CALL section_vals_val_get(xtb_parameter, "COULOMB_SR_CUT", r_vals=scal)
qs_control%xtb_control%coulomb_sr_cut = scal(1)
CALL section_vals_val_get(xtb_parameter, "COULOMB_SR_EPS", r_vals=scal)
@ -1269,17 +1441,29 @@ CONTAINS
CALL section_vals_val_get(xtb_parameter, "XB_RADIUS", r_val=qs_control%xtb_control%xb_radius)
! Kab
CALL section_vals_val_get(xtb_parameter, "KAB_PARAM", n_rep_val=n_rep)
! For debug purposes
CALL section_vals_val_get(xtb_section, "COULOMB_INTERACTION", &
l_val=qs_control%xtb_control%coulomb_interaction)
CALL section_vals_val_get(xtb_section, "COULOMB_LR", &
l_val=qs_control%xtb_control%coulomb_lr)
CALL section_vals_val_get(xtb_section, "TB3_INTERACTION", &
l_val=qs_control%xtb_control%tb3_interaction)
! Check for bad atomic charges
CALL section_vals_val_get(xtb_section, "CHECK_ATOMIC_CHARGES", &
l_val=qs_control%xtb_control%check_atomic_charges)
! Coulomb
SELECT CASE (qs_control%xtb_control%gfn_type)
CASE (0)
qs_control%xtb_control%coulomb_interaction = .FALSE.
qs_control%xtb_control%coulomb_lr = .FALSE.
qs_control%xtb_control%tb3_interaction = .FALSE.
qs_control%xtb_control%check_atomic_charges = .FALSE.
CASE (1)
! For debugging purposes
CALL section_vals_val_get(xtb_section, "COULOMB_INTERACTION", &
l_val=qs_control%xtb_control%coulomb_interaction)
CALL section_vals_val_get(xtb_section, "COULOMB_LR", &
l_val=qs_control%xtb_control%coulomb_lr)
CALL section_vals_val_get(xtb_section, "TB3_INTERACTION", &
l_val=qs_control%xtb_control%tb3_interaction)
! Check for bad atomic charges
CALL section_vals_val_get(xtb_section, "CHECK_ATOMIC_CHARGES", &
l_val=qs_control%xtb_control%check_atomic_charges)
CASE (2)
CPABORT("gfn2-xtb tbd")
CASE DEFAULT
CPABORT("GFN type")
END SELECT
qs_control%xtb_control%kab_nval = n_rep
IF (n_rep > 0) THEN
ALLOCATE (qs_control%xtb_control%kab_param(3, n_rep))
@ -1297,6 +1481,33 @@ CONTAINS
READ (clist(3), '(F10.0)') qs_control%xtb_control%kab_vals(j)
END DO
END IF
IF (qs_control%xtb_control%gfn_type == 0) THEN
CALL section_vals_val_get(xtb_parameter, "SRB_PARAMETER", r_vals=scal)
qs_control%xtb_control%ksrb = scal(1)
qs_control%xtb_control%esrb = scal(2)
qs_control%xtb_control%gscal = scal(3)
qs_control%xtb_control%c1srb = scal(4)
qs_control%xtb_control%c2srb = scal(5)
qs_control%xtb_control%shift = scal(6)
END IF
CALL section_vals_val_get(xtb_section, "EN_SHIFT_TYPE", c_val=cval)
CALL uppercase(cval)
SELECT CASE (TRIM(cval))
CASE ("SELECT")
qs_control%xtb_control%enshift_type = 0
CASE ("MOLECULE")
qs_control%xtb_control%enshift_type = 1
CASE ("CRYSTAL")
qs_control%xtb_control%enshift_type = 2
CASE DEFAULT
CPABORT("Unknown value for EN_SHIFT_TYPE")
END SELECT
! EEQ solver params
CALL read_eeq_param(eeq_section, qs_control%xtb_control%eeq_sparam)
END IF
! Optimize LRI basis set
@ -1938,14 +2149,30 @@ CONTAINS
"xTB| Basis expansion STO-NG", xtb_control%sto_ng
WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
"xTB| Basis expansion STO-NG for Hydrogen", xtb_control%h_sto_ng
WRITE (UNIT=output_unit, FMT="(T2,A,T71,E10.4)") &
"xTB| Repulsive pair potential accuracy", xtb_control%eps_pair
WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.6)") &
"xTB| Repulsive enhancement factor", xtb_control%enscale
WRITE (UNIT=output_unit, FMT="(T2,A,T71,L10)") &
"xTB| Halogen interaction potential", xtb_control%xb_interaction
WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.3)") &
"xTB| Halogen interaction potential cutoff radius", xtb_control%xb_radius
WRITE (UNIT=output_unit, FMT="(T2,A,T71,L10)") &
"xTB| Nonbonded interactions", xtb_control%do_nonbonded
WRITE (UNIT=output_unit, FMT="(T2,A,T31,A50)") &
"xTB| D3 Dispersion: Parameter file", ADJUSTR(TRIM(xtb_control%dispersion_parameter_file))
SELECT CASE (xtb_control%vdw_type)
CASE (xtb_vdw_type_none)
WRITE (UNIT=output_unit, FMT="(T2,A)") "xTB| No vdW potential selected"
CASE (xtb_vdw_type_d3)
WRITE (UNIT=output_unit, FMT="(T2,A,T72,A)") "xTB| vdW potential type:", "DFTD3(BJ)"
WRITE (UNIT=output_unit, FMT="(T2,A,T31,A50)") &
"xTB| D3 Dispersion: Parameter file", ADJUSTR(TRIM(xtb_control%dispersion_parameter_file))
CASE (xtb_vdw_type_d4)
WRITE (UNIT=output_unit, FMT="(T2,A,T76,A)") "xTB| vdW potential type:", "DFTD4"
WRITE (UNIT=output_unit, FMT="(T2,A,T31,A50)") &
"xTB| D4 Dispersion: Parameter file", ADJUSTR(TRIM(xtb_control%dispersion_parameter_file))
CASE DEFAULT
CPABORT("vdw type")
END SELECT
WRITE (UNIT=output_unit, FMT="(T2,A,T51,3F10.3)") &
"xTB| Huckel constants ks kp kd", xtb_control%ks, xtb_control%kp, xtb_control%kd
WRITE (UNIT=output_unit, FMT="(T2,A,T61,2F10.3)") &

View file

@ -106,8 +106,7 @@ CONTAINS
INTEGER :: stress_tensor
INTEGER, DIMENSION(:), POINTER :: seed_vals
LOGICAL :: atomic_energy, atomic_stress, &
my_use_motion_section, &
LOGICAL :: atomic_energy, my_use_motion_section, &
pv_availability, pv_diagonal, &
pv_numerical
TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
@ -208,12 +207,6 @@ CONTAINS
CALL atprop_create(subsys%atprop)
CALL section_vals_val_get(my_force_env_section, "PROPERTIES%ATOMIC%ENERGY", l_val=atomic_energy)
subsys%atprop%energy = atomic_energy
CALL section_vals_val_get(my_force_env_section, "PROPERTIES%ATOMIC%PRESSURE", l_val=atomic_stress)
IF (atomic_stress) THEN
CPASSERT(pv_availability)
CPASSERT(.NOT. pv_numerical)
END IF
subsys%atprop%stress = atomic_stress
CALL cp_result_create(subsys%results)
END SUBROUTINE cp_subsys_create

262
src/eeq_data.F Normal file
View file

@ -0,0 +1,262 @@
!--------------------------------------------------------------------------------------------------!
! CP2K: A general program to perform molecular dynamics simulations !
! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
! !
! SPDX-License-Identifier: GPL-2.0-or-later !
!--------------------------------------------------------------------------------------------------!
! **************************************************************************************************
!> \brief EEQ data from different sources
!> \author JGH
! **************************************************************************************************
MODULE eeq_data
USE kinds, ONLY: dp
#include "./base/base_uses.f90"
IMPLICIT NONE
PRIVATE
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'eeq_data'
! ==========================================================================
! 2019-2020 Sebastian Ehlert : EEQ gfn0-xTB parameters
INTEGER, PARAMETER :: maxElem = 86
! COULOMB DATA
!> Electronegativity for the EEQ model
REAL(KIND=dp), PARAMETER :: eeqChi(1:maxElem) = [&
& 1.2500000_dp, 1.2912463_dp, 0.8540050_dp, 1.1723939_dp, 1.1094487_dp, &
& 1.3860275_dp, 1.5341534_dp, 1.5378836_dp, 1.5890750_dp, 1.2893646_dp, &
& 0.7891208_dp, 0.9983021_dp, 0.9620847_dp, 1.0441134_dp, 1.4789559_dp, &
& 1.3926377_dp, 1.4749100_dp, 1.2250415_dp, 0.8162292_dp, 1.1252036_dp, &
& 0.9641451_dp, 0.8810155_dp, 0.9741986_dp, 1.1029038_dp, 1.0076949_dp, &
& 0.7744353_dp, 0.7554040_dp, 1.0182630_dp, 1.0316167_dp, 1.6317474_dp, &
& 1.1186739_dp, 1.0345958_dp, 1.3090772_dp, 1.4119283_dp, 1.4500674_dp, &
& 1.1746889_dp, 0.6686200_dp, 1.0744648_dp, 0.9107813_dp, 0.7876056_dp, &
& 1.0039889_dp, 0.9225265_dp, 0.9035515_dp, 1.0332301_dp, 1.0293975_dp, &
& 1.0549549_dp, 1.2356867_dp, 1.2793315_dp, 1.1145650_dp, 1.1214927_dp, &
& 1.2123167_dp, 1.4003158_dp, 1.4255511_dp, 1.1640198_dp, 0.4685133_dp, &
& 1.0687873_dp, 0.9335398_dp, 1.0573550_dp, 1.0532043_dp, 1.0490537_dp, &
& 1.0449031_dp, 1.0407524_dp, 1.0366018_dp, 1.0324512_dp, 1.0283005_dp, &
& 1.0241499_dp, 1.0199992_dp, 1.0158486_dp, 1.0116980_dp, 1.0075473_dp, &
& 1.0033967_dp, 0.8612827_dp, 1.0422031_dp, 0.7633168_dp, 0.6019707_dp, &
& 0.7499393_dp, 0.9511744_dp, 0.9357472_dp, 1.3555382_dp, 1.2006726_dp, &
& 1.2092025_dp, 1.1736669_dp, 1.1936584_dp, 1.3045488_dp, 1.1964604_dp, &
& 1.2653792_dp]
!> Chemical hardness for the EEQ model
REAL(KIND=dp), PARAMETER :: eeqGam(1:maxElem) = [&
&-0.3023159_dp, 0.7743046_dp, 0.5303164_dp, 0.2176474_dp, 0.1956176_dp, &
& 0.0308461_dp, 0.0559522_dp, 0.0581228_dp, 0.1574017_dp, 0.6825784_dp, &
& 0.3922376_dp, 0.5581866_dp, 0.3017510_dp, 0.1039137_dp, 0.2124917_dp, &
& 0.0580720_dp, 0.2537467_dp, 0.5780354_dp, 0.3920658_dp, -0.0024897_dp, &
&-0.0061520_dp, 0.1663252_dp, 0.1051751_dp, 0.0009900_dp, 0.0976543_dp, &
& 0.0612028_dp, 0.0561526_dp, 0.0899774_dp, 0.1313171_dp, 0.5728071_dp, &
& 0.1741615_dp, 0.2671888_dp, 0.2351989_dp, 0.0718104_dp, 0.3458143_dp, &
& 0.8203265_dp, 0.4287770_dp, 0.2667067_dp, 0.0873658_dp, 0.0599431_dp, &
& 0.1581972_dp, 0.1716374_dp, 0.2721649_dp, 0.2817608_dp, 0.1391572_dp, &
& 0.1175925_dp, 0.2316104_dp, 0.2256303_dp, 0.1230459_dp, 0.0141941_dp, &
& 0.0188612_dp, 0.0230207_dp, 0.3644113_dp, 0.1668461_dp, 0.5167533_dp, &
& 0.1979578_dp, 0.0345176_dp, 0.0240233_dp, 0.0246333_dp, 0.0252433_dp, &
& 0.0258532_dp, 0.0264632_dp, 0.0270732_dp, 0.0276832_dp, 0.0282931_dp, &
& 0.0289031_dp, 0.0295131_dp, 0.0301230_dp, 0.0307330_dp, 0.0313430_dp, &
& 0.0319529_dp, 0.0262881_dp, 0.1715396_dp, 0.1803633_dp, 0.3631824_dp, &
& 0.3010980_dp, 0.1100299_dp, 0.0277514_dp, 0.0554975_dp, 0.7723231_dp, &
& 0.1287718_dp, 0.1034598_dp, 0.0114935_dp, 0.0160842_dp, 0.3369611_dp, &
& 0.1844179_dp]
!> Coordination number dependence of the EN in the EEQ model
REAL(KIND=dp), PARAMETER :: eeqkCN(1:maxElem) = [&
& 0.0248762_dp, 0.1342276_dp, 0.0103048_dp, -0.0352374_dp, -0.0980031_dp, &
& 0.0643920_dp, 0.1053273_dp, 0.1394809_dp, 0.1276675_dp, -0.1081936_dp, &
&-0.0008132_dp, -0.0279860_dp, -0.0521436_dp, -0.0257206_dp, 0.1651461_dp, &
& 0.0914418_dp, 0.1213634_dp, -0.0636298_dp, -0.0045838_dp, 0.0007509_dp, &
&-0.0307730_dp, -0.0286150_dp, -0.0341465_dp, -0.0419655_dp, -0.0088536_dp, &
&-0.1001069_dp, -0.1190502_dp, -0.0726233_dp, -0.0219233_dp, 0.0641913_dp, &
&-0.0103130_dp, 0.0262628_dp, 0.0222202_dp, 0.0709954_dp, 0.0422244_dp, &
&-0.0308245_dp, 0.0086249_dp, -0.0237146_dp, -0.0721798_dp, -0.0848810_dp, &
&-0.0402828_dp, -0.0372396_dp, -0.0027043_dp, 0.0525839_dp, 0.0051192_dp, &
& 0.0188401_dp, 0.0103998_dp, 0.0000549_dp, 0.0087717_dp, -0.0237228_dp, &
& 0.0169656_dp, 0.0924186_dp, 0.0352884_dp, -0.0091444_dp, 0.0192916_dp, &
&-0.0154483_dp, -0.0736833_dp, -0.0064191_dp, -0.0093012_dp, -0.0121833_dp, &
&-0.0150654_dp, -0.0179475_dp, -0.0208296_dp, -0.0237117_dp, -0.0265938_dp, &
&-0.0294759_dp, -0.0323580_dp, -0.0352400_dp, -0.0381221_dp, -0.0410042_dp, &
&-0.0438863_dp, -0.0894776_dp, -0.0333583_dp, -0.0154963_dp, -0.0121092_dp, &
&-0.0744239_dp, 0.0050138_dp, -0.0153757_dp, -0.0029221_dp, 0.0239125_dp, &
& 0.0183012_dp, -0.0238011_dp, -0.0268025_dp, 0.0136505_dp, -0.0132199_dp, &
&-0.0439890_dp]
!> Charge width in the EEQ model
REAL(KIND=dp), PARAMETER :: eeqAlp(1:maxElem) = [&
& 0.7490227_dp, 0.4196569_dp, 1.4256190_dp, 2.0698743_dp, 1.7358798_dp, &
& 1.8288757_dp, 1.9346081_dp, 1.6974795_dp, 0.8169179_dp, 0.6138441_dp, &
& 1.7294046_dp, 1.7925036_dp, 1.2156739_dp, 1.5314457_dp, 1.3730859_dp, &
& 1.7936326_dp, 2.4255996_dp, 1.5891656_dp, 2.1829647_dp, 1.4177623_dp, &
& 1.5181399_dp, 1.9919805_dp, 1.7171675_dp, 2.0655063_dp, 1.3318009_dp, &
& 1.3660068_dp, 1.5694128_dp, 1.2762644_dp, 1.0039549_dp, 0.7338863_dp, &
& 3.2596250_dp, 1.7530299_dp, 1.5281792_dp, 2.1837813_dp, 2.1642027_dp, &
& 2.7280594_dp, 0.7838049_dp, 1.4274742_dp, 1.8023947_dp, 1.6093288_dp, &
& 1.3834349_dp, 1.1740977_dp, 1.5768259_dp, 1.3205263_dp, 1.4259466_dp, &
& 1.1499748_dp, 0.7013009_dp, 1.2374416_dp, 1.3799991_dp, 1.8528424_dp, &
& 1.8497568_dp, 2.0159294_dp, 1.2903708_dp, 2.0199161_dp, 0.9530522_dp, &
& 1.5015025_dp, 2.1917012_dp, 1.9134370_dp, 1.9897910_dp, 2.0661450_dp, &
& 2.1424991_dp, 2.2188531_dp, 2.2952071_dp, 2.3715611_dp, 2.4479151_dp, &
& 2.5242691_dp, 2.6006231_dp, 2.6769771_dp, 2.7533312_dp, 2.8296852_dp, &
& 2.9060392_dp, 1.6423047_dp, 1.3567622_dp, 1.8966648_dp, 0.8253100_dp, &
& 0.7412219_dp, 1.0350883_dp, 0.9692278_dp, 1.0048087_dp, 2.3138674_dp, &
& 2.8055966_dp, 3.0968677_dp, 1.6597596_dp, 3.2191575_dp, 1.5388148_dp, &
& 2.1222013_dp]
! covalent radii (taken from Pyykko and Atsumi, Chem. Eur. J. 15, 2009, 188-197)
! values for metals decreased by 10 %
REAL(KIND=dp), PARAMETER :: rcov(1:maxElem) = [&
& 0.32_dp, 0.46_dp, 1.20_dp, 0.94_dp, 0.77_dp, 0.75_dp, 0.71_dp, 0.63_dp, &
& 0.64_dp, 0.67_dp, 1.40_dp, 1.25_dp, 1.13_dp, 1.04_dp, 1.10_dp, 1.02_dp, &
& 0.99_dp, 0.96_dp, 1.76_dp, 1.54_dp, 1.33_dp, 1.22_dp, 1.21_dp, 1.10_dp, &
& 1.07_dp, 1.04_dp, 1.00_dp, 0.99_dp, 1.01_dp, 1.09_dp, 1.12_dp, 1.09_dp, &
& 1.15_dp, 1.10_dp, 1.14_dp, 1.17_dp, 1.89_dp, 1.67_dp, 1.47_dp, 1.39_dp, &
& 1.32_dp, 1.24_dp, 1.15_dp, 1.13_dp, 1.13_dp, 1.08_dp, 1.15_dp, 1.23_dp, &
& 1.28_dp, 1.26_dp, 1.26_dp, 1.23_dp, 1.32_dp, 1.31_dp, 2.09_dp, 1.76_dp, &
& 1.62_dp, 1.47_dp, 1.58_dp, 1.57_dp, 1.56_dp, 1.55_dp, 1.51_dp, 1.52_dp, &
& 1.51_dp, 1.50_dp, 1.49_dp, 1.49_dp, 1.48_dp, 1.53_dp, 1.46_dp, 1.37_dp, &
& 1.31_dp, 1.23_dp, 1.18_dp, 1.16_dp, 1.11_dp, 1.12_dp, 1.13_dp, 1.32_dp, &
& 1.30_dp, 1.30_dp, 1.36_dp, 1.31_dp, 1.38_dp, 1.42_dp]
! ==========================================================================
!> Electronegativity equilibration charge model published in
!>
!> E. Caldeweyher, S. Ehlert, A. Hansen, H. Neugebauer, S. Spicher, C. Bannwarth
!> and S. Grimme, *J. Chem. Phys.*, **2019**, 150, 154122.
!> DOI: [10.1063/1.5090222](https://dx.doi.org/10.1063/1.5090222)
!
!> Maximum atomic number allowed in EEQ calculations
INTEGER, PARAMETER :: max_elem = 103
!> Element-specific electronegativity for the electronegativity equilibration charges.
REAL(dp), PARAMETER :: eeq_chi(max_elem) = [&
& 1.23695041_dp, 1.26590957_dp, 0.54341808_dp, 0.99666991_dp, 1.26691604_dp, &
& 1.40028282_dp, 1.55819364_dp, 1.56866440_dp, 1.57540015_dp, 1.15056627_dp, &
& 0.55936220_dp, 0.72373742_dp, 1.12910844_dp, 1.12306840_dp, 1.52672442_dp, &
& 1.40768172_dp, 1.48154584_dp, 1.31062963_dp, 0.40374140_dp, 0.75442607_dp, &
& 0.76482096_dp, 0.98457281_dp, 0.96702598_dp, 1.05266584_dp, 0.93274875_dp, &
& 1.04025281_dp, 0.92738624_dp, 1.07419210_dp, 1.07900668_dp, 1.04712861_dp, &
& 1.15018618_dp, 1.15388455_dp, 1.36313743_dp, 1.36485106_dp, 1.39801837_dp, &
& 1.18695346_dp, 0.36273870_dp, 0.58797255_dp, 0.71961946_dp, 0.96158233_dp, &
& 0.89585296_dp, 0.81360499_dp, 1.00794665_dp, 0.92613682_dp, 1.09152285_dp, &
& 1.14907070_dp, 1.13508911_dp, 1.08853785_dp, 1.11005982_dp, 1.12452195_dp, &
& 1.21642129_dp, 1.36507125_dp, 1.40340000_dp, 1.16653482_dp, 0.34125098_dp, &
& 0.58884173_dp, 0.68441115_dp, 0.56999999_dp, 0.56999999_dp, 0.56999999_dp, &
& 0.56999999_dp, 0.56999999_dp, 0.56999999_dp, 0.56999999_dp, 0.56999999_dp, &
& 0.56999999_dp, 0.56999999_dp, 0.56999999_dp, 0.56999999_dp, 0.56999999_dp, &
& 0.56999999_dp, 0.87936784_dp, 1.02761808_dp, 0.93297476_dp, 1.10172128_dp, &
& 0.97350071_dp, 1.16695666_dp, 1.23997927_dp, 1.18464453_dp, 1.14191734_dp, &
& 1.12334192_dp, 1.01485321_dp, 1.12950808_dp, 1.30804834_dp, 1.33689961_dp, &
& 1.27465977_dp, 1.06598299_dp, 0.68184178_dp, 1.04581665_dp, 1.09888688_dp, &
& 1.07206461_dp, 1.09821942_dp, 1.10900303_dp, 1.01039812_dp, 1.00095966_dp, &
& 1.11003303_dp, 1.16831853_dp, 1.00887482_dp, 1.05928842_dp, 1.07672363_dp, &
& 1.11308426_dp, 1.14340090_dp, 1.13714110_dp]
!> Element-specific chemical hardnesses for the electronegativity equilibration charges.
REAL(dp), PARAMETER :: eeq_eta(max_elem) = [&
&-0.35015861_dp, 1.04121227_dp, 0.09281243_dp, 0.09412380_dp, 0.26629137_dp, &
& 0.19408787_dp, 0.05317918_dp, 0.03151644_dp, 0.32275132_dp, 1.30996037_dp, &
& 0.24206510_dp, 0.04147733_dp, 0.11634126_dp, 0.13155266_dp, 0.15350650_dp, &
& 0.15250997_dp, 0.17523529_dp, 0.28774450_dp, 0.42937314_dp, 0.01896455_dp, &
& 0.07179178_dp, -0.01121381_dp, -0.03093370_dp, 0.02716319_dp, -0.01843812_dp, &
&-0.15270393_dp, -0.09192645_dp, -0.13418723_dp, -0.09861139_dp, 0.18338109_dp, &
& 0.08299615_dp, 0.11370033_dp, 0.19005278_dp, 0.10980677_dp, 0.12327841_dp, &
& 0.25345554_dp, 0.58615231_dp, 0.16093861_dp, 0.04548530_dp, -0.02478645_dp, &
& 0.01909943_dp, 0.01402541_dp, -0.03595279_dp, 0.01137752_dp, -0.03697213_dp, &
& 0.08009416_dp, 0.02274892_dp, 0.12801822_dp, -0.02078702_dp, 0.05284319_dp, &
& 0.07581190_dp, 0.09663758_dp, 0.09547417_dp, 0.07803344_dp, 0.64913257_dp, &
& 0.15348654_dp, 0.05054344_dp, 0.11000000_dp, 0.11000000_dp, 0.11000000_dp, &
& 0.11000000_dp, 0.11000000_dp, 0.11000000_dp, 0.11000000_dp, 0.11000000_dp, &
& 0.11000000_dp, 0.11000000_dp, 0.11000000_dp, 0.11000000_dp, 0.11000000_dp, &
& 0.11000000_dp, -0.02786741_dp, 0.01057858_dp, -0.03892226_dp, -0.04574364_dp, &
&-0.03874080_dp, -0.03782372_dp, -0.07046855_dp, 0.09546597_dp, 0.21953269_dp, &
& 0.02522348_dp, 0.15263050_dp, 0.08042611_dp, 0.01878626_dp, 0.08715453_dp, &
& 0.10500484_dp, 0.10034731_dp, 0.15801991_dp, -0.00071039_dp, -0.00170887_dp, &
&-0.00133327_dp, -0.00104386_dp, -0.00094936_dp, -0.00111390_dp, -0.00125257_dp, &
&-0.00095936_dp, -0.00102814_dp, -0.00104450_dp, -0.00112666_dp, -0.00101529_dp, &
&-0.00059592_dp, -0.00012585_dp, -0.00140896_dp]
!> Element-specific CN scaling constant for the electronegativity equilibration charges.
REAL(dp), PARAMETER :: eeq_kcn(max_elem) = [&
& 0.04916110_dp, 0.10937243_dp, -0.12349591_dp, -0.02665108_dp, -0.02631658_dp, &
& 0.06005196_dp, 0.09279548_dp, 0.11689703_dp, 0.15704746_dp, 0.07987901_dp, &
&-0.10002962_dp, -0.07712863_dp, -0.02170561_dp, -0.04964052_dp, 0.14250599_dp, &
& 0.07126660_dp, 0.13682750_dp, 0.14877121_dp, -0.10219289_dp, -0.08979338_dp, &
&-0.08273597_dp, -0.01754829_dp, -0.02765460_dp, -0.02558926_dp, -0.08010286_dp, &
&-0.04163215_dp, -0.09369631_dp, -0.03774117_dp, -0.05759708_dp, 0.02431998_dp, &
&-0.01056270_dp, -0.02692862_dp, 0.07657769_dp, 0.06561608_dp, 0.08006749_dp, &
& 0.14139200_dp, -0.05351029_dp, -0.06701705_dp, -0.07377246_dp, -0.02927768_dp, &
&-0.03867291_dp, -0.06929825_dp, -0.04485293_dp, -0.04800824_dp, -0.01484022_dp, &
& 0.07917502_dp, 0.06619243_dp, 0.02434095_dp, -0.01505548_dp, -0.03030768_dp, &
& 0.01418235_dp, 0.08953411_dp, 0.08967527_dp, 0.07277771_dp, -0.02129476_dp, &
&-0.06188828_dp, -0.06568203_dp, -0.11000000_dp, -0.11000000_dp, -0.11000000_dp, &
&-0.11000000_dp, -0.11000000_dp, -0.11000000_dp, -0.11000000_dp, -0.11000000_dp, &
&-0.11000000_dp, -0.11000000_dp, -0.11000000_dp, -0.11000000_dp, -0.11000000_dp, &
&-0.11000000_dp, -0.03585873_dp, -0.03132400_dp, -0.05902379_dp, -0.02827592_dp, &
&-0.07606260_dp, -0.02123839_dp, 0.03814822_dp, 0.02146834_dp, 0.01580538_dp, &
&-0.00894298_dp, -0.05864876_dp, -0.01817842_dp, 0.07721851_dp, 0.07936083_dp, &
& 0.05849285_dp, 0.00013506_dp, -0.00020631_dp, 0.00473118_dp, 0.01590519_dp, &
& 0.00369763_dp, 0.00417543_dp, 0.00706682_dp, 0.00488679_dp, 0.00505103_dp, &
& 0.00710682_dp, 0.00463050_dp, 0.00387799_dp, 0.00296795_dp, 0.00400648_dp, &
& 0.00548481_dp, 0.01350400_dp, 0.00675380_dp]
!> Element-specific charge widths for the electronegativity equilibration charges.
REAL(dp), PARAMETER :: eeq_rad(max_elem) = [&
& 0.55159092_dp, 0.66205886_dp, 0.90529132_dp, 1.51710827_dp, 2.86070364_dp, &
& 1.88862966_dp, 1.32250290_dp, 1.23166285_dp, 1.77503721_dp, 1.11955204_dp, &
& 1.28263182_dp, 1.22344336_dp, 1.70936266_dp, 1.54075036_dp, 1.38200579_dp, &
& 2.18849322_dp, 1.36779065_dp, 1.27039703_dp, 1.64466502_dp, 1.58859404_dp, &
& 1.65357953_dp, 1.50021521_dp, 1.30104175_dp, 1.46301827_dp, 1.32928147_dp, &
& 1.02766713_dp, 1.02291377_dp, 0.94343886_dp, 1.14881311_dp, 1.47080755_dp, &
& 1.76901636_dp, 1.98724061_dp, 2.41244711_dp, 2.26739524_dp, 2.95378999_dp, &
& 1.20807752_dp, 1.65941046_dp, 1.62733880_dp, 1.61344972_dp, 1.63220728_dp, &
& 1.60899928_dp, 1.43501286_dp, 1.54559205_dp, 1.32663678_dp, 1.37644152_dp, &
& 1.36051851_dp, 1.23395526_dp, 1.65734544_dp, 1.53895240_dp, 1.97542736_dp, &
& 1.97636542_dp, 2.05432381_dp, 3.80138135_dp, 1.43893803_dp, 1.75505957_dp, &
& 1.59815118_dp, 1.76401732_dp, 1.63999999_dp, 1.63999999_dp, 1.63999999_dp, &
& 1.63999999_dp, 1.63999999_dp, 1.63999999_dp, 1.63999999_dp, 1.63999999_dp, &
& 1.63999999_dp, 1.63999999_dp, 1.63999999_dp, 1.63999999_dp, 1.63999999_dp, &
& 1.63999999_dp, 1.47055223_dp, 1.81127084_dp, 1.40189963_dp, 1.54015481_dp, &
& 1.33721475_dp, 1.57165422_dp, 1.04815857_dp, 1.78342098_dp, 2.79106396_dp, &
& 1.78160840_dp, 2.47588882_dp, 2.37670734_dp, 1.76613217_dp, 2.66172302_dp, &
& 2.82773085_dp, 1.04059593_dp, 0.60550051_dp, 1.22262145_dp, 1.28736399_dp, &
& 1.44431317_dp, 1.29032833_dp, 1.41009404_dp, 1.25501213_dp, 1.15181468_dp, &
& 1.42010424_dp, 1.43955530_dp, 1.28565237_dp, 1.35017463_dp, 1.33011749_dp, &
& 1.30745135_dp, 1.26526071_dp, 1.34071499_dp]
PUBLIC :: get_eeq_data
CONTAINS
! **************************************************************************************************
!> \brief ...
!> \param za ...
!> \param model ...
!> \param chi ...
!> \param eta ...
!> \param kcn ...
!> \param rad ...
! **************************************************************************************************
SUBROUTINE get_eeq_data(za, model, chi, eta, kcn, rad)
INTEGER, INTENT(IN) :: za, model
REAL(kind=dp), INTENT(OUT), OPTIONAL :: chi, eta, kcn, rad
IF (model == 1) THEN
CPASSERT(za <= maxElem)
IF (PRESENT(chi)) chi = eeqChi(za)
IF (PRESENT(eta)) eta = eeqGam(za)
IF (PRESENT(kcn)) kcn = eeqkCN(za)
IF (PRESENT(rad)) rad = eeqAlp(za)
ELSEIF (model == 2) THEN
CPASSERT(za <= max_elem)
IF (PRESENT(chi)) chi = eeq_chi(za)
IF (PRESENT(eta)) eta = eeq_eta(za)
IF (PRESENT(kcn)) kcn = eeq_kcn(za)
IF (PRESENT(rad)) rad = eeq_rad(za)
ELSE
CPABORT("get_eeq_data: unknown model")
END IF
END SUBROUTINE get_eeq_data
END MODULE eeq_data

124
src/eeq_input.F Normal file
View file

@ -0,0 +1,124 @@
!--------------------------------------------------------------------------------------------------!
! CP2K: A general program to perform molecular dynamics simulations !
! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
! !
! SPDX-License-Identifier: GPL-2.0-or-later !
!--------------------------------------------------------------------------------------------------!
! **************************************************************************************************
!> \brief Input definition and setup for EEQ model
!> \author JGH [2024]
! **************************************************************************************************
MODULE eeq_input
USE input_keyword_types, ONLY: keyword_create,&
keyword_release,&
keyword_type
USE input_section_types, ONLY: section_add_keyword,&
section_create,&
section_type,&
section_vals_type,&
section_vals_val_get
USE kinds, ONLY: dp
#include "./base/base_uses.f90"
IMPLICIT NONE
PRIVATE
TYPE eeq_solver_type
LOGICAL :: direct = .FALSE.
LOGICAL :: sparse = .FALSE.
REAL(KIND=dp) :: eps_diis = 1.0E-09_dp
REAL(KIND=dp) :: alpha = 0.75_dp
INTEGER :: mdiis = 12
INTEGER :: sdiis = 3
INTEGER :: max_diis = 500
END TYPE eeq_solver_type
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'eeq_input'
PUBLIC :: eeq_solver_type
PUBLIC :: read_eeq_param
PUBLIC :: create_eeq_control_section
CONTAINS
! **************************************************************************************************
!> \brief ...
!> \param section ...
! **************************************************************************************************
SUBROUTINE create_eeq_control_section(section)
TYPE(section_type), POINTER :: section
TYPE(keyword_type), POINTER :: keyword
CPASSERT(.NOT. ASSOCIATED(section))
CALL section_create(section, __LOCATION__, name="EEQ", &
description="Parameters needed for EEQ method and solver", &
n_keywords=1, n_subsections=1, repeats=.FALSE.)
NULLIFY (keyword)
CALL keyword_create(keyword, __LOCATION__, name="DIRECT", &
description="Use a direct method to solve the EEQ equations in PBC (matrix solver)", &
usage="DIRECT", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="SPARSE", &
description="Use a sparse method to solve the EEQ equations. (NYA)", &
usage="SPARSE", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="EPS_DIIS", &
description="Accuracy for the iterative solver.", &
usage="EPS_DIIS 1.0E-10", default_r_val=1.0e-10_dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="ALPHA", &
description="Step length of initial steepest descent steps.", &
usage="ALPHA 1.0", default_r_val=0.75_dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="MAX_DIIS", &
description="Max. number of iterations for EEQ solver.", &
usage="MAX_DIIS 100", default_i_val=500)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="MDIIS", &
description="Max. number of DIIS vectors used.", &
usage="MDIIS 10", default_i_val=12)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="SDIIS", &
description="Number of vectors accumulated before starting DIIS.", &
usage="SDIIS 4", default_i_val=3)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
END SUBROUTINE create_eeq_control_section
! **************************************************************************************************
!> \brief ...
!> \param eeq_section ...
!> \param eeq_sparam ...
! **************************************************************************************************
SUBROUTINE read_eeq_param(eeq_section, eeq_sparam)
TYPE(section_vals_type), POINTER :: eeq_section
TYPE(eeq_solver_type), INTENT(INOUT) :: eeq_sparam
CALL section_vals_val_get(eeq_section, "DIRECT", l_val=eeq_sparam%direct)
CALL section_vals_val_get(eeq_section, "SPARSE", l_val=eeq_sparam%sparse)
CALL section_vals_val_get(eeq_section, "EPS_DIIS", r_val=eeq_sparam%eps_diis)
CALL section_vals_val_get(eeq_section, "ALPHA", r_val=eeq_sparam%alpha)
CALL section_vals_val_get(eeq_section, "MAX_DIIS", i_val=eeq_sparam%max_diis)
CALL section_vals_val_get(eeq_section, "MDIIS", i_val=eeq_sparam%mdiis)
CALL section_vals_val_get(eeq_section, "SDIIS", i_val=eeq_sparam%sdiis)
END SUBROUTINE read_eeq_param
END MODULE eeq_input

1809
src/eeq_method.F Normal file

File diff suppressed because it is too large Load diff

View file

@ -32,6 +32,7 @@ MODULE ewald_environment_types
section_vals_val_get
USE kinds, ONLY: dp
USE mathconstants, ONLY: twopi
USE mathlib, ONLY: det_3x3
USE message_passing, ONLY: mp_comm_type,&
mp_para_env_release,&
mp_para_env_type
@ -380,20 +381,28 @@ CONTAINS
!> \param ewald_env the pointer to the ewald_env
!> \param ewald_section ...
!> \param hmat ...
!> \param silent ...
!> \param pset ...
!> \author JGH
! **************************************************************************************************
SUBROUTINE read_ewald_section_tb(ewald_env, ewald_section, hmat)
SUBROUTINE read_ewald_section_tb(ewald_env, ewald_section, hmat, silent, pset)
TYPE(ewald_environment_type), INTENT(INOUT) :: ewald_env
TYPE(section_vals_type), POINTER :: ewald_section
REAL(KIND=dp), DIMENSION(3, 3), INTENT(IN) :: hmat
LOGICAL, INTENT(IN), OPTIONAL :: silent
CHARACTER(LEN=*), OPTIONAL :: pset
CHARACTER(LEN=5) :: param = "none"
INTEGER :: i, iw, n(3)
INTEGER, DIMENSION(:), POINTER :: gmax_read
LOGICAL :: explicit
REAL(KIND=dp) :: alat, cutoff, dummy
LOGICAL :: do_print, explicit
REAL(KIND=dp) :: alat, cutoff, dummy, omega
TYPE(cp_logger_type), POINTER :: logger
logger => cp_get_default_logger()
do_print = .TRUE.
IF (PRESENT(silent)) do_print = .NOT. silent
IF (PRESENT(pset)) param = pset
ewald_env%do_multipoles = .FALSE.
ewald_env%do_ipol = 0
@ -417,11 +426,33 @@ CONTAINS
IF (explicit) THEN
CALL section_vals_val_get(ewald_section, "ALPHA", r_val=ewald_env%alpha)
ELSE
ewald_env%alpha = 1.0_dp
SELECT CASE (param)
CASE DEFAULT
ewald_env%alpha = 1.0_dp
CASE ("EEQ")
omega = ABS(det_3x3(hmat))
ewald_env%alpha = SQRT(twopi)/omega**(1./3.)
END SELECT
END IF
CALL section_vals_val_get(ewald_section, "EWALD_ACCURACY", r_val=ewald_env%precs)
CALL section_vals_val_get(ewald_section, "O_SPLINE", i_val=ewald_env%o_spline)
CALL section_vals_val_get(ewald_section, "EWALD_ACCURACY", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(ewald_section, "EWALD_ACCURACY", r_val=ewald_env%precs)
ELSE
CALL section_vals_val_get(ewald_section, "EWALD_ACCURACY", r_val=ewald_env%precs)
END IF
CALL section_vals_val_get(ewald_section, "O_SPLINE", explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(ewald_section, "O_SPLINE", i_val=ewald_env%o_spline)
ELSE
SELECT CASE (param)
CASE DEFAULT
ewald_env%o_spline = 6
CASE ("EEQ")
ewald_env%o_spline = 4
END SELECT
END IF
CALL section_vals_val_get(ewald_section, "RCUT", explicit=explicit)
IF (explicit) THEN
@ -442,8 +473,14 @@ CONTAINS
CPABORT("")
END SELECT
ELSE
! set GMAX using ECUT=alpha*45 Ry
cutoff = 45._dp*ewald_env%alpha
SELECT CASE (param)
CASE DEFAULT
! set GMAX using ECUT=alpha*45 Ry
cutoff = 45._dp*ewald_env%alpha
CASE ("EEQ")
! set GMAX using ECUT=alpha*45 Ry
cutoff = 30._dp*ewald_env%alpha
END SELECT
DO i = 1, 3
alat = SUM(hmat(:, i)**2)
CPASSERT(alat /= 0._dp)
@ -455,7 +492,7 @@ CONTAINS
iw = cp_print_key_unit_nr(logger, ewald_section, "PRINT%PROGRAM_RUN_INFO", &
extension=".log")
IF (iw > 0) THEN
IF (iw > 0 .AND. do_print) THEN
WRITE (iw, '(/,T2,"EWALD| ",A,T67,A14 )') 'Summation is done by:', ADJUSTR("SPME")
dummy = cp_unit_from_cp2k(ewald_env%alpha, "angstrom^-1")
WRITE (iw, '( T2,"EWALD| ",A,A18,A,T71,F10.4 )') &

View file

@ -10,7 +10,6 @@
!> \author JGH
! **************************************************************************************************
MODULE ewald_methods_tb
USE atprop_types, ONLY: atprop_type
USE cell_types, ONLY: cell_type
USE dgs, ONLY: dg_sum_patch,&
dg_sum_patch_force_1d,&
@ -29,13 +28,9 @@ MODULE ewald_methods_tb
set_list
USE pw_grid_types, ONLY: pw_grid_type
USE pw_grids, ONLY: get_pw_grid_info
USE pw_methods, ONLY: pw_copy,&
pw_derive,&
pw_integral_a2b,&
pw_multiply,&
USE pw_methods, ONLY: pw_integral_a2b,&
pw_multiply_with,&
pw_transfer,&
pw_zero
pw_transfer
USE pw_poisson_methods, ONLY: pw_poisson_rebuild,&
pw_poisson_solve
USE pw_poisson_types, ONLY: greens_fn_type,&
@ -83,10 +78,9 @@ CONTAINS
!> \param calculate_forces ...
!> \param virial ...
!> \param use_virial ...
!> \param atprop ...
! **************************************************************************************************
SUBROUTINE tb_spme_evaluate(ewald_env, ewald_pw, particle_set, box, &
gmcharge, mcharge, calculate_forces, virial, use_virial, atprop)
gmcharge, mcharge, calculate_forces, virial, use_virial)
TYPE(ewald_environment_type), POINTER :: ewald_env
TYPE(ewald_pw_type), POINTER :: ewald_pw
@ -97,15 +91,14 @@ CONTAINS
LOGICAL, INTENT(in) :: calculate_forces
TYPE(virial_type), POINTER :: virial
LOGICAL, INTENT(in) :: use_virial
TYPE(atprop_type), OPTIONAL, POINTER :: atprop
CHARACTER(len=*), PARAMETER :: routineN = 'tb_spme_evaluate'
INTEGER :: handle, i, ig, ipart, j, n, npart, &
o_spline, p1
INTEGER :: handle, i, ipart, j, n, npart, o_spline, &
p1
INTEGER, ALLOCATABLE, DIMENSION(:, :) :: center
INTEGER, DIMENSION(3) :: nd, npts
REAL(KIND=dp) :: alpha, dvols, fat(3), ffa, ffb, fint, vgc
INTEGER, DIMENSION(3) :: npts
REAL(KIND=dp) :: alpha, dvols, fat(3), ffa, fint, vgc
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: delta
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: rhos
REAL(KIND=dp), DIMENSION(3, 3) :: f_stress, h_stress
@ -113,7 +106,7 @@ CONTAINS
TYPE(mp_comm_type) :: group
TYPE(mp_para_env_type), POINTER :: para_env
TYPE(pw_c1d_gs_type), DIMENSION(3) :: dphi_g
TYPE(pw_c1d_gs_type), POINTER :: phi_g, phib_g, rhob_g
TYPE(pw_c1d_gs_type), POINTER :: phi_g, rhob_g
TYPE(pw_grid_type), POINTER :: grid_spme
TYPE(pw_poisson_type), POINTER :: poisson_env
TYPE(pw_pool_type), POINTER :: pw_pool
@ -195,71 +188,6 @@ CONTAINS
CALL rs_grid_create(rpot, rs_desc)
CALL rs_grid_set_box(grid_spme, rs=rpot)
! Atomic Stress
IF (PRESENT(atprop)) THEN
IF (ASSOCIATED(atprop)) THEN
IF (atprop%stress .AND. use_virial) THEN
CALL rs_grid_zero(rpot)
CALL pw_zero(rhob_g)
CALL pw_multiply(rhob_g, phi_g, green%p3m_charge)
CALL pw_transfer(rhob_g, rhob_r)
CALL transfer_pw2rs(rpot, rhob_r)
ipart = 0
DO
CALL set_list(particle_set, npart, center, p1, rden, ipart)
IF (p1 == 0) EXIT
! calculate function on small boxes
CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.FALSE., &
is_shell=.FALSE., unit_charge=.TRUE.)
CALL dg_sum_patch_force_1d(rpot, rhos, center(:, p1), fint)
atprop%atstress(1, 1, p1) = atprop%atstress(1, 1, p1) + 0.5_dp*mcharge(p1)*fint*dvols
atprop%atstress(2, 2, p1) = atprop%atstress(2, 2, p1) + 0.5_dp*mcharge(p1)*fint*dvols
atprop%atstress(3, 3, p1) = atprop%atstress(3, 3, p1) + 0.5_dp*mcharge(p1)*fint*dvols
END DO
NULLIFY (phib_g)
ALLOCATE (phib_g)
CALL pw_pool%create_pw(phib_g)
ffa = (0.5_dp/alpha)**2
ffb = 1.0_dp/fourpi
DO i = 1, 3
DO ig = grid_spme%first_gne0, grid_spme%ngpts_cut_local
phib_g%array(ig) = ffb*dphi_g(i)%array(ig)*(1.0_dp + ffa*grid_spme%gsq(ig))
phib_g%array(ig) = phib_g%array(ig)*green%influence_fn%array(ig)
END DO
IF (grid_spme%have_g0) phib_g%array(1) = 0.0_dp
DO j = 1, i
nd = 0
nd(j) = 1
CALL pw_copy(phib_g, rhob_g)
CALL pw_derive(rhob_g, nd)
CALL pw_multiply_with(rhob_g, green%p3m_charge)
CALL pw_transfer(rhob_g, rhob_r)
CALL transfer_pw2rs(rpot, rhob_r)
ipart = 0
DO
CALL set_list(particle_set, npart, center, p1, rden, ipart)
IF (p1 == 0) EXIT
! calculate function on small boxes
CALL get_patch(particle_set, delta, green, p1, rhos, &
is_core=.FALSE., is_shell=.FALSE., unit_charge=.TRUE.)
! integrate box and potential
CALL dg_sum_patch_force_1d(rpot, rhos, center(:, p1), fint)
atprop%atstress(i, j, p1) = atprop%atstress(i, j, p1) + fint*dvols*mcharge(p1)
IF (i /= j) atprop%atstress(j, i, p1) = atprop%atstress(j, i, p1) + fint*dvols*mcharge(p1)
END DO
END DO
END DO
CALL pw_pool%give_back_pw(phib_g)
DEALLOCATE (phib_g)
END IF
END IF
END IF
CALL pw_pool%give_back_pw(rhob_g)
DEALLOCATE (rhob_g)
@ -358,9 +286,8 @@ CONTAINS
!> \param n_list ...
!> \param virial ...
!> \param use_virial ...
!> \param atprop ...
! **************************************************************************************************
SUBROUTINE tb_ewald_overlap(gmcharge, mcharge, alpha, n_list, virial, use_virial, atprop)
SUBROUTINE tb_ewald_overlap(gmcharge, mcharge, alpha, n_list, virial, use_virial)
REAL(KIND=dp), DIMENSION(:, :), INTENT(inout) :: gmcharge
REAL(KIND=dp), DIMENSION(:), INTENT(in) :: mcharge
@ -369,7 +296,6 @@ CONTAINS
POINTER :: n_list
TYPE(virial_type), POINTER :: virial
LOGICAL, INTENT(IN) :: use_virial
TYPE(atprop_type), OPTIONAL, POINTER :: atprop
CHARACTER(LEN=*), PARAMETER :: routineN = 'tb_ewald_overlap'
@ -406,14 +332,6 @@ CONTAINS
pfr = -dfr*mcharge(iatom)*mcharge(jatom)
END IF
CALL virial_pair_force(virial%pv_virial, -pfr, rij, rij)
IF (PRESENT(atprop)) THEN
IF (ASSOCIATED(atprop)) THEN
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp*pfr, rij, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp*pfr, rij, rij)
END IF
END IF
END IF
END IF
END IF

View file

@ -68,14 +68,12 @@ CONTAINS
!> \param use_virial ...
!> \param charges ...
!> \param e_coulomb ...
!> \param pv_coulomb ...
!> \par History
!> JGH (21-Feb-2001) : changed name
!> \author CJM
! **************************************************************************************************
SUBROUTINE ewald_evaluate(ewald_env, ewald_pw, cell, atomic_kind_set, particle_set, &
local_particles, fg_coulomb, vg_coulomb, pv_g, use_virial, charges, e_coulomb, &
pv_coulomb)
local_particles, fg_coulomb, vg_coulomb, pv_g, use_virial, charges, e_coulomb)
TYPE(ewald_environment_type), POINTER :: ewald_env
TYPE(ewald_pw_type), POINTER :: ewald_pw
TYPE(cell_type), POINTER :: cell
@ -87,8 +85,6 @@ CONTAINS
REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: pv_g
LOGICAL, INTENT(IN) :: use_virial
REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER :: charges, e_coulomb
REAL(KIND=dp), DIMENSION(:, :, :), OPTIONAL, &
POINTER :: pv_coulomb
CHARACTER(LEN=*), PARAMETER :: routineN = 'ewald_evaluate'
@ -98,7 +94,7 @@ CONTAINS
iparticle_local, lp, mp, nnodes, node, &
np, nparticle_kind, nparticle_local
INTEGER, DIMENSION(:, :), POINTER :: bds
LOGICAL :: atenergy, atstress, use_charge_array
LOGICAL :: atenergy, use_charge_array
REAL(KIND=dp) :: alpha, denom, e_igdotr, factor, &
four_alpha_sq, gauss, pref, q
REAL(KIND=dp), DIMENSION(3) :: vec
@ -120,10 +116,6 @@ CONTAINS
IF (atenergy) atenergy = ASSOCIATED(e_coulomb)
IF (atenergy) e_coulomb = 0._dp
atstress = PRESENT(pv_coulomb)
IF (atstress) atstress = ASSOCIATED(pv_coulomb)
IF (atstress) pv_coulomb = 0._dp
! pointing
CALL ewald_env_get(ewald_env, alpha=alpha, group=group)
CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, dg=dg)
@ -252,29 +244,11 @@ CONTAINS
pv_g(3, 2) = pv_g(3, 2) - factor*(2.0_dp*pw_grid%g(3, gpt)*pw_grid%g(2, gpt)*denom)
pv_g(3, 3) = pv_g(3, 3) + factor*(1.0_dp - 2.0_dp*pw_grid%g(3, gpt)*pw_grid%g(3, gpt)*denom)
END IF
IF (atstress) THEN
DO node = 1, nnodes
snode = CONJG(exp_igr%ex(lp, node) &
*exp_igr%ey(mp, node) &
*exp_igr%ez(np, node))
factor = gauss*charge(node)*REAL(summe(gpt)*snode, KIND=dp)
pv_coulomb(1, 1, node) = pv_coulomb(1, 1, node) + factor*(1.0_dp - 2.0_dp*pw_grid%g(1, gpt)*pw_grid%g(1, gpt)*denom)
pv_coulomb(1, 2, node) = pv_coulomb(1, 2, node) - factor*(2.0_dp*pw_grid%g(1, gpt)*pw_grid%g(2, gpt)*denom)
pv_coulomb(1, 3, node) = pv_coulomb(1, 3, node) - factor*(2.0_dp*pw_grid%g(1, gpt)*pw_grid%g(3, gpt)*denom)
pv_coulomb(2, 1, node) = pv_coulomb(2, 1, node) - factor*(2.0_dp*pw_grid%g(2, gpt)*pw_grid%g(1, gpt)*denom)
pv_coulomb(2, 2, node) = pv_coulomb(2, 2, node) + factor*(1.0_dp - 2.0_dp*pw_grid%g(2, gpt)*pw_grid%g(2, gpt)*denom)
pv_coulomb(2, 3, node) = pv_coulomb(2, 3, node) - factor*(2.0_dp*pw_grid%g(2, gpt)*pw_grid%g(3, gpt)*denom)
pv_coulomb(3, 1, node) = pv_coulomb(3, 1, node) - factor*(2.0_dp*pw_grid%g(3, gpt)*pw_grid%g(1, gpt)*denom)
pv_coulomb(3, 2, node) = pv_coulomb(3, 2, node) - factor*(2.0_dp*pw_grid%g(3, gpt)*pw_grid%g(2, gpt)*denom)
pv_coulomb(3, 3, node) = pv_coulomb(3, 3, node) + factor*(1.0_dp - 2.0_dp*pw_grid%g(3, gpt)*pw_grid%g(3, gpt)*denom)
END DO
END IF
END DO
vg_coulomb = vg_coulomb*pref
IF (use_virial) pv_g = pv_g*pref
IF (atenergy) e_coulomb = e_coulomb*pref
IF (atstress) pv_coulomb = pv_coulomb*pref
fg_coulomb = fg_coulomb*(2.0_dp*pref)

View file

@ -130,7 +130,6 @@ CONTAINS
pv_g, pv_imptors, pv_nonbond, &
pv_opbend, pv_torsion, pv_urey_bradley
REAL(KIND=dp), DIMENSION(:), POINTER :: e_coulomb
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: pv_coulomb
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atomic_kind_type), POINTER :: atomic_kind
TYPE(atprop_type), POINTER :: atprop_env
@ -174,7 +173,7 @@ CONTAINS
fist_nonbond_env, mm_section, local_molecules, local_particles, &
molecule_kind_set, molecule_set, particle_set, print_section, &
shell, shell_particle_set, core_particle_set, thermo, multipoles, &
e_coulomb, pv_coulomb)
e_coulomb)
mm_section => section_vals_get_subs_vals(force_env_section, "MM")
iw = cp_print_key_unit_nr(logger, mm_section, "PRINT%DERIVATIVES", &
@ -396,13 +395,9 @@ CONTAINS
IF (atprop_env%energy) THEN
ALLOCATE (e_coulomb(fg_coulomb_size))
END IF
IF (atprop_env%stress) THEN
ALLOCATE (pv_coulomb(3, 3, fg_coulomb_size))
END IF
CALL ewald_evaluate(ewald_env, ewald_pw, cell, atomic_kind_set, particle_set, &
local_particles, fg_coulomb, vg_coulomb, pv_g, use_virial=use_virial, &
charges=fist_nonbond_env%charges, e_coulomb=e_coulomb, &
pv_coulomb=pv_coulomb)
charges=fist_nonbond_env%charges, e_coulomb=e_coulomb)
END IF
END IF
CASE (do_ewald_pme)
@ -659,17 +654,11 @@ CONTAINS
IF (atprop_env%energy) THEN
atprop_env%atener(ii) = atprop_env%atener(ii) + e_coulomb(node)
END IF
IF (atprop_env%stress) THEN
atprop_env%atstress(:, :, ii) = atprop_env%atstress(:, :, ii) + pv_coulomb(:, :, node)
END IF
END DO
END DO
IF (atprop_env%energy) THEN
DEALLOCATE (e_coulomb)
END IF
IF (atprop_env%stress) THEN
DEALLOCATE (pv_coulomb)
END IF
END IF
IF (iw > 0) THEN

View file

@ -107,7 +107,7 @@ CONTAINS
INTEGER :: first_atom, handle, i, ibend, ibond, ikind, imol, imul, index_a, index_b, &
index_c, index_d, iopbend, ishell, itorsion, nbends, nbonds, nimptors, nkind, &
nmol_per_kind, nopbends, nshell, ntorsions, nub
LOGICAL :: atener, atstress
LOGICAL :: atener
REAL(KIND=dp) :: d12, d32, dist, dist1, dist2, energy, &
fscalar, id12, id32, is32, ism, isn, &
k2_spring, k4_spring, r2, s32, sm, sn, &
@ -116,7 +116,6 @@ CONTAINS
gt4, k1, k2, k3, k4, rij, t12, t32, &
t34, t41, t42, t43, tm, tn
REAL(KIND=dp), DIMENSION(:), POINTER :: ener_a
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: pv_a
TYPE(bend_type), POINTER :: bend_list(:)
TYPE(bond_type), POINTER :: bond_list(:)
TYPE(cp_logger_type), POINTER :: logger
@ -148,8 +147,6 @@ CONTAINS
atener = atprop_env%energy
IF (atener) ener_a => atprop_env%atener
atstress = atprop_env%stress
IF (atstress) pv_a => atprop_env%atstress
nkind = SIZE(molecule_kind_set)
MOL: DO ikind = 1, nkind
@ -195,10 +192,6 @@ CONTAINS
! computing the pressure tensor
k2 = -rij*fscalar
IF (use_virial) CALL get_pv_bond(k2, rij, pv_bond)
IF (atstress) THEN
CALL get_pv_bond(0.5_dp*k2, rij, pv_a(:, :, index_a))
CALL get_pv_bond(0.5_dp*k2, rij, pv_a(:, :, index_b))
END IF
! the contribution from the bonds. ONLY FOR DEBUG
IF (PRESENT(f_bond)) THEN
@ -237,9 +230,6 @@ CONTAINS
k1 = -rij*fscalar
CALL get_pv_bond(k1, rij, pv_bond)
END IF
IF (atstress) THEN
CALL get_pv_bond(k1, rij, pv_a(:, :, index_a))
END IF
END DO SHELL
UREY_BRADLEY: DO ibend = 1, nub
@ -265,10 +255,6 @@ CONTAINS
! computing the pressure tensor
k2 = -rij*fscalar
IF (use_virial) CALL get_pv_bond(k2, rij, pv_urey_bradley)
IF (atstress) THEN
CALL get_pv_bond(0.5_dp*k2, rij, pv_a(:, :, index_a))
CALL get_pv_bond(0.5_dp*k2, rij, pv_a(:, :, index_b))
END IF
! the contribution from the ub. ONLY FOR DEBUG
IF (PRESENT(f_ub)) THEN
@ -327,13 +313,6 @@ CONTAINS
k1 = fscalar*g1
k3 = fscalar*g3
IF (use_virial) CALL get_pv_bend(k1, k3, b12, b32, pv_bend)
IF (atstress) THEN
k1 = fscalar*g1/3._dp
k3 = fscalar*g3/3._dp
CALL get_pv_bend(k1, k3, b12, b32, pv_a(:, :, index_a))
CALL get_pv_bend(k1, k3, b12, b32, pv_a(:, :, index_b))
CALL get_pv_bend(k1, k3, b12, b32, pv_a(:, :, index_c))
END IF
! the contribution from the bends. ONLY FOR DEBUG
IF (PRESENT(f_bend)) THEN
@ -404,15 +383,6 @@ CONTAINS
k3 = fscalar*gt3
k4 = fscalar*gt4
IF (use_virial) CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_torsion)
IF (atstress) THEN
k1 = 0.25_dp*fscalar*gt1
k3 = 0.25_dp*fscalar*gt3
k4 = 0.25_dp*fscalar*gt4
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_a))
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_b))
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_c))
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_d))
END IF
! the contribution from the torsions. ONLY FOR DEBUG
IF (PRESENT(f_torsion)) THEN
@ -483,15 +453,6 @@ CONTAINS
k3 = fscalar*gt3
k4 = fscalar*gt4
IF (use_virial) CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_imp_torsion)
IF (atstress) THEN
k1 = 0.25_dp*fscalar*gt1
k3 = 0.25_dp*fscalar*gt3
k4 = 0.25_dp*fscalar*gt4
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_a))
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_b))
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_c))
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_d))
END IF
! the contribution from the torsions. ONLY FOR DEBUG
IF (PRESENT(f_imptor)) THEN
@ -555,15 +516,6 @@ CONTAINS
k4 = fscalar*gt4
IF (use_virial) CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_opbend)
IF (atstress) THEN
k1 = 0.25_dp*fscalar*gt1
k3 = 0.25_dp*fscalar*gt3
k4 = 0.25_dp*fscalar*gt4
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_a))
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_b))
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_c))
CALL get_pv_torsion(k1, k3, k4, t12, t32, t43, pv_a(:, :, index_d))
END IF
! the contribution from the opbends. ONLY FOR DEBUG
IF (PRESENT(f_opbend)) THEN

View file

@ -540,15 +540,6 @@ CONTAINS
DO i = 1, 3
DO j = 1, 3
pv_thread(j, i) = pv_thread(j, i) + pv(j, i)
! Update atomic stress tensors
IF (atprop_env%stress) THEN
!$OMP ATOMIC
atprop_env%atstress(j, i, atom_a) = atprop_env%atstress(j, i, atom_a) + &
0.5_dp*pv(j, i)
!$OMP ATOMIC
atprop_env%atstress(j, i, atom_b) = atprop_env%atstress(j, i, atom_b) + &
0.5_dp*pv(j, i)
END IF
END DO
END DO
END IF
@ -976,13 +967,6 @@ CONTAINS
fbc(3, 2) = -fij_com(3)*rij(2)
fbc(3, 3) = -fij_com(3)*rij(3)
pv_bc(:, :) = pv_bc(:, :) + fbc(:, :)
IF (atprop_env%stress) THEN
! Atomic stress tensors
iatom = particle_set1(i)%atom_index
atprop_env%atstress(:, :, iatom) = atprop_env%atstress(:, :, iatom) + 0.5_dp*fbc(:, :)
jatom = particle_set2(j)%atom_index
atprop_env%atstress(:, :, jatom) = atprop_env%atstress(:, :, jatom) + 0.5_dp*fbc(:, :)
END IF
END IF
END SUBROUTINE bonded_correct_gaussian_low
@ -1091,11 +1075,6 @@ CONTAINS
fbc(3, 2) = -fr(3)*rij(2)
fbc(3, 3) = -fr(3)*rij(3)
pv_bc(:, :) = pv_bc(:, :) + fbc(:, :)
IF (atprop_env%stress) THEN
! Atomic stress tensors
iatom = shell_particle_set(i)%atom_index
atprop_env%atstress(:, :, iatom) = atprop_env%atstress(:, :, iatom) + fbc(:, :)
END IF
END IF
END SUBROUTINE bonded_correct_gaussian_low_sh

View file

@ -66,7 +66,8 @@ MODULE cp_fm_basic_linalg
cp_fm_rot_cols, & ! rotates two columns
cp_fm_cholesky_restore, & ! apply Cholesky decomposition
cp_fm_Gram_Schmidt_orthonorm, & ! Gram-Schmidt orthonormalization of columns of a full matrix, &
cp_fm_det ! determinant of a real matrix with correct sign
cp_fm_det, & ! determinant of a real matrix with correct sign
cp_fm_matvec ! matrix-vector multiplication (vector replicated)
REAL(KIND=dp), EXTERNAL :: dlange, pdlange, pdlatra
REAL(KIND=sp), EXTERNAL :: slange, pslange, pslatra
@ -1853,7 +1854,7 @@ CONTAINS
CHARACTER(len=*), PARAMETER :: routineN = 'cp_fm_solve'
INTEGER :: handle, info, n
INTEGER :: handle, info, n, nrhs
INTEGER, ALLOCATABLE, DIMENSION(:) :: ipivot
REAL(KIND=dp), DIMENSION(:, :), POINTER :: a, a_general
#if defined(__parallel)
@ -1867,20 +1868,21 @@ CONTAINS
a => matrix_a%local_data
a_general => general_a%local_data
n = matrix_a%matrix_struct%nrow_global
nrhs = general_a%matrix_struct%ncol_global
ALLOCATE (ipivot(n + matrix_a%matrix_struct%nrow_block))
#if defined(__parallel)
desca(:) = matrix_a%matrix_struct%descriptor(:)
descb(:) = general_a%matrix_struct%descriptor(:)
CALL pdgetrf(n, n, a, 1, 1, desca, ipivot, info)
CALL pdgetrs("N", n, n, a, 1, 1, desca, ipivot, a_general, &
CALL pdgetrs("N", n, nrhs, a, 1, 1, desca, ipivot, a_general, &
1, 1, descb, info)
#else
lda = SIZE(a, 1)
ldb = SIZE(a_general, 1)
CALL dgetrf(n, n, a, lda, ipivot, info)
CALL dgetrs("N", n, n, a, lda, ipivot, a_general, ldb, info)
CALL dgetrs("N", n, nrhs, a, lda, ipivot, a_general, ldb, info)
#endif
! info is allowed to be zero
@ -2766,4 +2768,68 @@ CONTAINS
END SUBROUTINE cp_fm_cholesky_restore
! **************************************************************************************************
!> \brief Calculates
!> yv = alpha*amat*xv + beta*yv
!> where amat: fm matrix
!> xv : vector replicated
!> yv : vector replicated
!> Defaults: alpha = 1, beta = 0
! **************************************************************************************************
SUBROUTINE cp_fm_matvec(amat, xv, yv, alpha, beta)
TYPE(cp_fm_type), INTENT(IN) :: amat
REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: xv
REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: yv
REAL(KIND=dp), OPTIONAL, INTENT(IN) :: alpha, beta
INTEGER :: na, nc, nx, ny
REAL(KIND=dp) :: aval, bval
#if defined(__parallel)
INTEGER :: nrl, ncl, ic, ir
INTEGER, DIMENSION(:), POINTER :: rind, cind
REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: xvl, yvl, yvm
#endif
IF (amat%use_sp) THEN
CPABORT("cp_fm_matvec: SP option not available")
END IF
aval = 1.0_dp
IF (PRESENT(alpha)) aval = alpha
bval = 0.0_dp
IF (PRESENT(beta)) bval = beta
CALL cp_fm_get_info(amat, nrow_global=na, ncol_global=nc)
nx = SIZE(xv)
ny = SIZE(yv)
IF ((nx /= ny) .OR. (nc /= nx)) THEN
CPABORT("cp_fm_matvec: incompatible dimensions")
END IF
#if defined(__parallel)
CALL cp_fm_get_info(amat, nrow_local=nrl, ncol_local=ncl, &
row_indices=rind, col_indices=cind)
ALLOCATE (xvl(ncl), yvl(nrl), yvm(ny))
DO ic = 1, ncl
xvl(ic) = xv(cind(ic))
END DO
yvl(1:nrl) = MATMUL(amat%local_data, xvl(1:ncl))
yvm = 0.0_dp
DO ir = 1, nrl
yvm(rind(ir)) = yvl(ir)
END DO
CALL amat%matrix_struct%para_env%sum(yvm)
IF (bval == 0.0_dp) THEN
yv = aval*yvm
ELSE
yv = bval*yv + aval*yvm
END IF
#else
IF (bval == 0.0_dp) THEN
yv = aval*MATMUL(amat%local_data, xv)
ELSE
yv = bval*yv + aval*MATMUL(amat%local_data, xv)
END IF
#endif
END SUBROUTINE cp_fm_matvec
END MODULE cp_fm_basic_linalg

View file

@ -199,17 +199,15 @@ CONTAINS
REAL(kind=dp), PARAMETER :: ateps = 1.0E-6_dp
INTEGER :: i, ikind, j, nat, ndigits, nfixed_atoms, &
INTEGER :: ikind, nat, ndigits, nfixed_atoms, &
nfixed_atoms_total, nkind, &
output_unit, print_forces, print_grrm, &
print_scine
LOGICAL :: calculate_forces, calculate_stress_tensor, energy_consistency, eval_ef, &
linres_run, my_skip, print_components
REAL(KIND=dp) :: checksum, e_entropy, e_gap, e_pot, &
sum_energy, sum_pv_virial, &
sum_stress_tensor
sum_energy
REAL(KIND=dp), DIMENSION(3) :: grand_total_force, total_force
REAL(KIND=dp), DIMENSION(3, 3) :: atomic_stress_tensor, diff_stress_tensor
TYPE(atprop_type), POINTER :: atprop_env
TYPE(cell_type), POINTER :: cell
TYPE(cp_logger_type), POINTER :: logger
@ -475,70 +473,6 @@ CONTAINS
END IF
CALL cp_print_key_finished_output(print_scine, logger, force_env%force_env_section, "PRINT%SCINE")
! Atomic stress
output_unit = cp_print_key_unit_nr(logger, force_env%force_env_section, "PRINT%PROGRAM_RUN_INFO", &
extension=".Log")
IF (atprop_env%stress) THEN
CALL force_env%para_env%sum(atprop_env%atstress)
! symmetrize (same as pv_virial)
DO i = 1, SIZE(atprop_env%atstress, 3)
atprop_env%atstress(:, :, i) = 0.5_dp*(atprop_env%atstress(:, :, i) &
+ TRANSPOSE(atprop_env%atstress(:, :, i)))
END DO
IF (output_unit > 0) THEN
IF (logger%iter_info%print_level > low_print_level) THEN
DO i = 1, SIZE(atprop_env%atstress, 3)
WRITE (UNIT=output_unit, FMT="(/,T2,I0,T16,A1,2(19X,A1))") i, "X", "Y", "Z"
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "X", (atprop_env%atstress(1, j, i), j=1, 3)
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "Y", (atprop_env%atstress(2, j, i), j=1, 3)
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "Z", (atprop_env%atstress(3, j, i), j=1, 3)
WRITE (UNIT=output_unit, FMT="(T2,A,F20.13)") "1/3 Trace(Atomic stress tensor):", &
(atprop_env%atstress(1, 1, i) + atprop_env%atstress(2, 2, i) + atprop_env%atstress(3, 3, i))/3.0_dp
END DO
END IF
atomic_stress_tensor(:, :) = 0.0_dp
DO i = 1, 3
atomic_stress_tensor(i, i) = accurate_sum(atprop_env%atstress(i, i, :))
DO j = i + 1, 3
atomic_stress_tensor(i, j) = accurate_sum(atprop_env%atstress(i, j, :))
atomic_stress_tensor(j, i) = atomic_stress_tensor(i, j)
END DO
END DO
WRITE (UNIT=output_unit, FMT="(/,T2,A,T15,A1,2(19X,A1))") "Atomic", "X", "Y", "Z"
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "X", (atomic_stress_tensor(1, i), i=1, 3)
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "Y", (atomic_stress_tensor(2, i), i=1, 3)
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "Z", (atomic_stress_tensor(3, i), i=1, 3)
WRITE (UNIT=output_unit, FMT="(T2,A,10X,F20.13)") "1/3 Trace(Atomic stress tensor):", &
(atomic_stress_tensor(1, 1) + atomic_stress_tensor(2, 2) + atomic_stress_tensor(3, 3))/3.0_dp
sum_stress_tensor = accurate_sum(atomic_stress_tensor(:, :))
IF (virial%pv_availability .AND. calculate_forces) THEN
WRITE (UNIT=output_unit, FMT="(/,T2,A,T16,A1,2(19X,A1))") "Total", "X", "Y", "Z"
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "X", (virial%pv_virial(1, i), i=1, 3)
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "Y", (virial%pv_virial(2, i), i=1, 3)
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "Z", (virial%pv_virial(3, i), i=1, 3)
WRITE (UNIT=output_unit, FMT="(T2,A,10X,F20.13)") "1/3 Trace(Total stress tensor): ", &
(virial%pv_virial(1, 1) + virial%pv_virial(2, 2) + virial%pv_virial(3, 3))/3.0_dp
sum_pv_virial = SUM(virial%pv_virial(:, :))
diff_stress_tensor(:, :) = ABS(virial%pv_virial(:, :) - atomic_stress_tensor(:, :))
WRITE (UNIT=output_unit, FMT="(/,T2,A,T16,A1,2(19X,A1))") "Diff", "X", "Y", "Z"
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "X", (diff_stress_tensor(1, i), i=1, 3)
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "Y", (diff_stress_tensor(2, i), i=1, 3)
WRITE (UNIT=output_unit, FMT="(A3,3F20.13)") "Z", (diff_stress_tensor(3, i), i=1, 3)
WRITE (UNIT=output_unit, FMT="(T2,A,10X,F20.13)") "1/3 Trace(Diff) : ", &
(diff_stress_tensor(1, 1) + diff_stress_tensor(2, 2) + diff_stress_tensor(3, 3))/3.0_dp
checksum = accurate_sum(diff_stress_tensor(:, :))
WRITE (UNIT=output_unit, FMT="(/,(T2,A,11X,F25.13))") &
"Checksum stress (Atomic) :", sum_stress_tensor, &
"Checksum stress (Total) :", sum_pv_virial, &
"Difference :", checksum
CPASSERT(checksum < ateps)
END IF
END IF
CALL cp_print_key_finished_output(output_unit, logger, force_env%force_env_section, &
"PRINT%PROGRAM_RUN_INFO")
END IF
END SUBROUTINE force_env_calc_energy_force
! **************************************************************************************************

View file

@ -211,24 +211,36 @@ CONTAINS
! **************************************************************************************************
!> \brief ...
!> \param iw ...
!> \param gfn_type ...
! **************************************************************************************************
SUBROUTINE xtb_header(iw)
INTEGER, INTENT(in) :: iw
SUBROUTINE xtb_header(iw, gfn_type)
INTEGER, INTENT(in) :: iw, gfn_type
IF (iw < 0) RETURN
WRITE (iw, '( / )')
WRITE (iw, '( 11(16x,a,/) )') &
WRITE (iw, '( 7(16x,a,/) )') &
' ##### ##### # ####### ###### ', &
' # # # # # # # # ', &
' # # # # ## ## # # # ', &
' # # ##### # ## ## # ###### ', &
' # # # # # ### # # # ', &
' # # # # # ## ## # # # ', &
' #### # ##### # ## ## # ###### ', &
' ', &
' Version 1.0 ', &
' J. Hutter and A. Hehn ', &
' '
' #### # ##### # ## ## # ###### '
SELECT CASE (gfn_type)
CASE (0)
WRITE (iw, '( 34x,a )') ' GFN0-xTB '
CASE (1)
WRITE (iw, '( 34x,a )') ' GFN1-xTB '
CASE (2)
WRITE (iw, '( 34x,a )') ' GFN2-xTB '
CASE DEFAULT
END SELECT
WRITE (iw, '( 2(16x,a,/) )') &
' Version 1.1 ', &
' J. Hutter and A. Hehn '
END SUBROUTINE xtb_header
! **************************************************************************************************
!> \brief ...

View file

@ -624,6 +624,10 @@ MODULE input_constants
INTEGER, PARAMETER, PUBLIC :: xc_pot_none = 1000, &
xc_pot_saop = 1001
INTEGER, PARAMETER, PUBLIC :: xtb_vdw_type_none = 0, &
xtb_vdw_type_d3 = 1, &
xtb_vdw_type_d4 = 2
! Hirshfeld partitioning
INTEGER, PARAMETER, PUBLIC :: shape_function_gaussian = 1, &
shape_function_density = 2

View file

@ -60,16 +60,6 @@ CONTAINS
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="PRESSURE", &
description="Calculate atomic pressure tensors ", &
usage="PRESSURE {logical}", &
repeats=.FALSE., &
n_var=1, &
default_l_val=.FALSE., &
lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
END SUBROUTINE create_atprop_section
END MODULE input_cp2k_atprop

View file

@ -24,7 +24,7 @@ MODULE input_cp2k_print_dft
Lippert1999, Lu2004, Merlot2014, Perdew1981, Repasky2002, Rocha2006, Schenter2008, Schiffmann2015, &
Shigeta2001, Stewart1982, Stewart1989, Stewart2007, Thiel1992, VanVoorhis2015, &
VandeVondele2003, VandeVondele2005a, VandeVondele2005b, VandeVondele2006, Weber2008, &
Yin2017
Yin2017, Pracht2019, Caldeweyher2019, Caldeweyher2020
USE cp_output_handling, ONLY: add_last_numeric, &
cp_print_key_section_create, &
debug_print_level, &
@ -1204,6 +1204,15 @@ CONTAINS
CALL section_add_subsection(section, print_key)
CALL section_release(print_key)
! Print EEQ Charges
CALL cp_print_key_section_create(print_key, __LOCATION__, "EEQ_CHARGES", &
description="Controls the printing of the EEQ charges", &
print_level=debug_print_level, filename="__STD_OUT__", &
common_iter_levels=1, &
citations=(/Pracht2019, Caldeweyher2019, Caldeweyher2020/))
CALL section_add_subsection(section, print_key)
CALL section_release(print_key)
! MAO (modified atomic orbital) analysis
CALL cp_print_key_section_create(print_key, __LOCATION__, "MAO_ANALYSIS", &
description="Controls the printing of the MAO (modified atomic orbital) analysis", &

View file

@ -290,6 +290,14 @@ CONTAINS
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="FORCE_SCF_CALCULATION", &
description="Request a SCF type solution even for nonSCF methods. ", &
usage="FORCE_SCF_CALCULATION logical_value", &
default_l_val=.FALSE., &
lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL section_create(subsection, __LOCATION__, name="PRINT", &
description="Printing of information during the SCF.", repeats=.FALSE.)

View file

@ -18,6 +18,7 @@ MODULE input_cp2k_tb
Porezag1995,&
Seifert1996,&
Zhechkov2005
USE eeq_input, ONLY: create_eeq_control_section
USE input_constants, ONLY: dispersion_d2,&
dispersion_d3,&
dispersion_d3bj,&
@ -32,11 +33,9 @@ MODULE input_cp2k_tb
section_create,&
section_release,&
section_type
USE input_val_types, ONLY: char_t,&
lchar_t
USE input_val_types, ONLY: char_t
USE kinds, ONLY: dp
USE string_utilities, ONLY: newline,&
s2a
USE string_utilities, ONLY: s2a
#include "./base/base_uses.f90"
IMPLICIT NONE
@ -140,15 +139,21 @@ CONTAINS
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)
CALL create_atom_parameter_section(subsection)
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)
CALL create_xtb_nonbonded_section(subsection)
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)
CALL create_eeq_control_section(subsection)
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)
NULLIFY (keyword)
CALL keyword_create(keyword, __LOCATION__, name="GFN_TYPE", &
description="Which GFN xTB method should be used.", &
usage="GFN_TYPE 1", default_i_val=1)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="DO_EWALD", &
description="Use Ewald type method instead of direct sum for Coulomb interaction", &
usage="DO_EWALD", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
@ -157,13 +162,13 @@ CONTAINS
CALL keyword_create(keyword, __LOCATION__, name="STO_NG", &
description="Provides the order of the Slater orbital expansion in GTOs.", &
usage="STO_NG", default_i_val=6)
usage="STO_NG 3", default_i_val=6)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="HYDROGEN_STO_NG", &
description="Number of GTOs for Hydrogen basis expansion.", &
usage="HYDROGEN_STO_NG", default_i_val=4)
usage="HYDROGEN_STO_NG 3", default_i_val=4)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
@ -180,6 +185,13 @@ CONTAINS
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="VDW_POTENTIAL", &
description="vdW potential to be used: NONE, DFTD3, DFTD4. "// &
"Defaults: DFTD3(gfn1), DFTD4(gfn0, gfn2).", &
usage="VDW_POTENTIAL type", default_c_val="")
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="COULOMB_INTERACTION", &
description="Use Coulomb interaction terms (electrostatics + TB3); for debug only", &
usage="COULOMB_INTERACTION T", default_l_val=.TRUE., lone_keyword_l_val=.TRUE.)
@ -204,9 +216,17 @@ CONTAINS
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="OLD_COULOMB_DAMPING", &
description="Only use for backward compatability. Handle with extreme caution.", &
usage="OLD_COULOMB_DAMPING T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
CALL keyword_create(keyword, __LOCATION__, name="EPS_PAIRPOTENTIAL", &
description="Accuracy for the repulsive pair potential.", &
usage="EPS_PAIRPOTENTIAL 1.0E-8", default_r_val=1.0e-10_dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="EN_SHIFT_TYPE", &
description="Shift function for electronegativity in EEQ method. "// &
"[Select/Molecule/Crystal] Default Select from periodicity.", &
usage="EN_SHIFT_TYPE [Select/Molecule/Crystal]", &
n_var=1, type_of_var=char_t, default_c_val="Molecule")
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
@ -414,9 +434,24 @@ CONTAINS
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="EN_CONSTANT", &
CALL keyword_create(keyword, __LOCATION__, name="EN_CONSTANTS", &
description="Scaling parameters for electronegativity correction term.", &
usage="EN_CONSTANT -0.007", n_var=1, default_r_val=-0.007_dp)
usage="EN_CONSTANTS -0.007 0.000 0.000", n_var=3, &
default_r_vals=(/-0.007_dp, 0.000_dp, 0.000_dp/))
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="BEN_CONSTANT", &
description="Scaling parameter for electronegativity correction term.", &
usage="BEN_CONSTANT 4.0", n_var=1, &
default_r_val=4.0_dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="ENSCALE", &
description="Scaling parameter repulsive energy (dEN in exponential).", &
usage="ENSCALE 0.01", n_var=1, &
default_r_val=0.0_dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
@ -454,6 +489,14 @@ CONTAINS
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="SRB_PARAMETER", &
description="SRB parameters (ksrb, esrb, gscal, c1, c2, shift).", &
usage="SRB_PARAMETER -0.0129 3.48 0.51 -1.71 2.11 0.0537", n_var=6, &
default_r_vals=(/-0.0129_dp, 3.4847_dp, 0.5097_dp, &
-1.70549806_dp, 2.10878369_dp, 0.0537_dp/))
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
END SUBROUTINE create_xtb_parameter_section
! **************************************************************************************************
!> \brief ...
@ -490,33 +533,5 @@ CONTAINS
CALL keyword_release(keyword)
END SUBROUTINE create_xtb_nonbonded_section
! **************************************************************************************************
!> \brief Creates the &ATOM_APRAMETER section
!> \param section the section to create
!> \author teo
! **************************************************************************************************
SUBROUTINE create_atom_parameter_section(section)
TYPE(section_type), POINTER :: section
TYPE(keyword_type), POINTER :: keyword
CALL section_create(section, __LOCATION__, name="ATOM_PARAMETER", &
description="Section used to specify a atom parameter set for xTB calclulations.", &
n_keywords=1, n_subsections=0, repeats=.TRUE.)
NULLIFY (keyword)
CALL keyword_create( &
keyword, __LOCATION__, name="_DEFAULT_KEYWORD_", &
repeats=.TRUE., type_of_var=lchar_t, &
description="xTB atom parameters in standard format:"//newline//newline// &
"```"//newline// &
"Element symbol eta gamma alpha Zeff label kpoly kappa Hen zeta"//newline// &
"nshell repeat the following block of lines)"//newline// &
"label kpoly kappa Hen zeta"//newline// &
"```")
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
END SUBROUTINE create_atom_parameter_section
END MODULE input_cp2k_tb

View file

@ -19,6 +19,7 @@ MODULE input_cp2k_xc
USE cp_output_handling, ONLY: add_last_numeric,&
cp_print_key_section_create,&
high_print_level
USE eeq_input, ONLY: create_eeq_control_section
USE input_constants, ONLY: &
do_adiabatic_hybrid_mcy3, do_adiabatic_model_pade, fxc_funct_gga, fxc_funct_lda, &
fxc_funct_pade, fxc_none, gaussian, slater, vdw_nl_drsll, vdw_nl_lmkll, vdw_nl_rvv10, &
@ -916,7 +917,7 @@ CONTAINS
TYPE(section_type), POINTER :: section
TYPE(keyword_type), POINTER :: keyword
TYPE(section_type), POINTER :: print_key, subsection
TYPE(section_type), POINTER :: newsection, print_key, subsection
CPASSERT(.NOT. ASSOCIATED(section))
CALL section_create(section, __LOCATION__, name="vdw_potential", &
@ -944,6 +945,7 @@ CONTAINS
description="Information on the pair potential to calculate dispersion", &
n_keywords=5, n_subsections=0, repeats=.TRUE.)
CALL keyword_create(keyword, __LOCATION__, name="R_CUTOFF", &
variants=s2a("D3_CUTOFF", "D4_3B_CUTOFF"), &
description="Range of potential. The cutoff will be 2 times this value. "// &
"In the case of D4 it will be used for the 3-body term", &
usage="R_CUTOFF 20.0", default_r_val=20.0_dp, &
@ -953,13 +955,13 @@ CONTAINS
CALL keyword_create(keyword, __LOCATION__, name="D4_CUTOFF", &
description="Range of potential. The cutoff will be 2 times this value. "// &
"Only used for the 2-body term of D4", &
usage="D4_CUTOFF 30.0", default_r_val=30.0_dp, &
usage="D4_CUTOFF 30.0", default_r_val=20.0_dp, &
unit_str="angstrom")
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="D4_CN_CUTOFF", &
description="Coordination number cutoff for D4", &
usage="D4_CN_CUTOFF 30.0", default_r_val=30.0_dp, &
usage="D4_CN_CUTOFF 30.0", default_r_val=10.0_dp, &
unit_str="angstrom")
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
@ -999,15 +1001,23 @@ CONTAINS
lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="SCALING", &
CALL keyword_create(keyword, __LOCATION__, name="D4_DEBUG", &
description="Debug output for D4 method using reference code.", &
usage="D4_DEBUG", default_l_val=.FALSE., &
lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="D2_SCALING", &
variants=["SCALING"], &
description="XC Functional dependent scaling parameter, if set to zero CP2K attempts"// &
" to guess the xc functional that is in use and sets the associated scaling parameter.", &
usage="SCALING 0.2", default_r_val=0._dp)
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="EXP_PRE", &
CALL keyword_create(keyword, __LOCATION__, name="D2_EXP_PRE", &
variants=["EXP_PRE"], &
description="Prefactor in exponential damping factor (DFT-D2 potential)", &
usage="EXP_PRE 20.", default_r_val=20._dp)
usage="D2_EXP_PRE 20.", default_r_val=20._dp)
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="EPS_CN", &
@ -1031,6 +1041,14 @@ CONTAINS
default_r_vals=(/0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp/))
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="D4_SCALING", &
description="XC Functional dependent scaling parameters (s6,a1,s8,a2) for the DFT-D4 method,"// &
" if set to zero CP2K attempts"// &
" to guess the xc functional from REFERENCE_FUNCTIONAL and sets the associated scaling parameter.", &
usage="D4_SCALING 1.0 1.0 1.0 1.0", n_var=4, &
default_r_vals=(/0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp/))
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="CALCULATE_C9_TERM", &
description="Calculate C9 terms in DFT-D3 model", &
usage="CALCULATE_C9_TERM", default_l_val=.FALSE., &
@ -1082,7 +1100,8 @@ CONTAINS
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="VERBOSE_OUTPUT", &
description="Extensive output for the DFT-D2 and DFT-D3 models", &
description="Extensive output for the DFT-D2 and DFT-D3 models."// &
" Needs PRINT_DFTD section to be specified.", &
usage="VERBOSE_OUTPUT", default_l_val=.FALSE., &
lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(subsection, keyword)
@ -1135,6 +1154,11 @@ CONTAINS
CALL section_add_subsection(subsection, print_key)
CALL section_release(print_key)
NULLIFY (newsection)
CALL create_eeq_control_section(newsection)
CALL section_add_subsection(subsection, newsection)
CALL section_release(newsection)
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)

View file

@ -37,9 +37,7 @@ MODULE pme
USE pme_tools, ONLY: get_center,&
set_list
USE pw_grid_types, ONLY: pw_grid_type
USE pw_methods, ONLY: pw_copy,&
pw_derive,&
pw_integral_a2b,&
USE pw_methods, ONLY: pw_integral_a2b,&
pw_transfer
USE pw_poisson_methods, ONLY: pw_poisson_solve
USE pw_poisson_types, ONLY: pw_poisson_type
@ -112,16 +110,15 @@ CONTAINS
CHARACTER(LEN=*), PARAMETER :: routineN = 'pme_evaluate'
INTEGER :: handle, i, ig, ipart, j, nd(3), npart, &
nshell, p1, p2
INTEGER :: handle, i, ipart, j, npart, nshell, p1, &
p2
LOGICAL :: is1_core, is2_core
REAL(KIND=dp) :: alpha, dvols, fat1, ffa, ffb
REAL(KIND=dp) :: alpha, dvols, fat1, ffa
REAL(KIND=dp), DIMENSION(3) :: fat
REAL(KIND=dp), DIMENSION(3, 3) :: f_stress, h_stress
TYPE(dg_rho0_type), POINTER :: dg_rho0
TYPE(dg_type), POINTER :: dg
TYPE(mp_comm_type) :: group
TYPE(pw_c1d_gs_type) :: phi_g, rhob_g
TYPE(pw_c1d_gs_type), DIMENSION(3) :: dphi_g
TYPE(pw_grid_type), POINTER :: grid_b, grid_s
TYPE(pw_poisson_type), POINTER :: poisson_env
@ -251,7 +248,7 @@ CONTAINS
CALL pw_poisson_solve(poisson_env, rhob_r, vg_coulomb, phi_r, dphi_g, h_stress)
! atomic energies
IF (atprop%energy .OR. atprop%stress) THEN
IF (atprop%energy) THEN
dvols = rhos1%pw_grid%dvol
ALLOCATE (rpot)
CALL rs_grid_create(rpot, rs_desc)
@ -269,65 +266,13 @@ CONTAINS
IF (atprop%energy) THEN
atprop%atener(p1) = atprop%atener(p1) + 0.5_dp*fat1*dvols
END IF
IF (atprop%stress) THEN
atprop%atstress(1, 1, p1) = atprop%atstress(1, 1, p1) + 0.5_dp*fat1*dvols
atprop%atstress(2, 2, p1) = atprop%atstress(2, 2, p1) + 0.5_dp*fat1*dvols
atprop%atstress(3, 3, p1) = atprop%atstress(3, 3, p1) + 0.5_dp*fat1*dvols
END IF
IF (p2 /= 0) THEN
CALL dg_sum_patch_force_1d(rpot, rhos2, exp_igr%centre(:, p2), fat1)
IF (atprop%energy) THEN
atprop%atener(p2) = atprop%atener(p2) + 0.5_dp*fat1*dvols
END IF
IF (atprop%stress) THEN
atprop%atstress(1, 1, p2) = atprop%atstress(1, 1, p2) + 0.5_dp*fat1*dvols
atprop%atstress(2, 2, p2) = atprop%atstress(2, 2, p2) + 0.5_dp*fat1*dvols
atprop%atstress(3, 3, p2) = atprop%atstress(3, 3, p2) + 0.5_dp*fat1*dvols
END IF
END IF
END DO
IF (atprop%stress) THEN
CALL pw_big_pool%create_pw(phi_g)
CALL pw_big_pool%create_pw(rhob_g)
ffa = (0.5_dp/dg_rho0%zet(1))**2
ffb = 1.0_dp/fourpi
DO i = 1, 3
DO ig = grid_b%first_gne0, grid_b%ngpts_cut_local
phi_g%array(ig) = ffb*dphi_g(i)%array(ig)*(ffa*grid_b%gsq(ig) + 1.0_dp)
phi_g%array(ig) = phi_g%array(ig)*poisson_env%green_fft%influence_fn%array(ig)
END DO
IF (grid_b%have_g0) phi_g%array(1) = 0.0_dp
DO j = 1, i
CALL pw_copy(phi_g, rhob_g)
nd = 0
nd(j) = 1
CALL pw_derive(rhob_g, nd)
CALL pw_transfer(rhob_g, rhob_r)
CALL transfer_pw2rs(rpot, rhob_r)
ipart = 0
DO
CALL set_list(particle_set, npart, exp_igr%centre, p1, rden, ipart, exp_igr%core_centre)
CALL set_list(particle_set, npart, exp_igr%centre, p2, rden, ipart, exp_igr%core_centre)
IF (p1 == 0 .AND. p2 == 0) EXIT
! integrate box and potential
CALL get_patch(dg, particle_set, exp_igr, box, p1, p2, grid_b, grid_s, &
rhos1, rhos2, charges=charges)
! add boxes to real space grid (big box)
CALL dg_sum_patch_force_1d(rpot, rhos1, exp_igr%centre(:, p1), fat1)
atprop%atstress(i, j, p1) = atprop%atstress(i, j, p1) + fat1*dvols
IF (i /= j) atprop%atstress(j, i, p1) = atprop%atstress(j, i, p1) + fat1*dvols
IF (p2 /= 0) THEN
CALL dg_sum_patch_force_1d(rpot, rhos2, exp_igr%centre(:, p2), fat1)
atprop%atstress(i, j, p2) = atprop%atstress(i, j, p2) + fat1*dvols
IF (i /= j) atprop%atstress(j, i, p2) = atprop%atstress(j, i, p2) + fat1*dvols
END IF
END DO
END DO
END DO
CALL pw_big_pool%give_back_pw(phi_g)
CALL pw_big_pool%give_back_pw(rhob_g)
END IF
CALL rs_grid_release(rpot)
DEALLOCATE (rpot)
END IF

View file

@ -191,7 +191,7 @@ CONTAINS
CPABORT("PME not implemented in DFTB")
CASE (do_ewald_spme)
CALL tb_spme_evaluate(ewald_env, ewald_pw, particle_set, mm_cell, &
gmcharge, mcharge, calculate_forces, virial, use_virial, atprop)
gmcharge, mcharge, calculate_forces, virial, use_virial)
END SELECT
!
CALL para_env%sum(gmcharge(:, 1))

View file

@ -226,10 +226,6 @@ CONTAINS
fi = 1.0_dp
IF (iatom == jatom) fi = 0.5_dp
CALL virial_pair_force(virial%pv_virial, fi, fij, rij)
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, irow), fi*0.5_dp, fij, rij)
CALL virial_pair_force(atprop%atstress(:, :, icol), fi*0.5_dp, fij, rij)
END IF
END IF
END DO
END DO
@ -284,10 +280,6 @@ CONTAINS
fi = 1.0_dp
IF (iatom == jatom) fi = 0.5_dp
CALL virial_pair_force(virial%pv_virial, fi, fij, rij)
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, iatom), fi*0.5_dp, fij, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), fi*0.5_dp, fij, rij)
END IF
END IF
END DO

View file

@ -234,10 +234,6 @@ CONTAINS
fi = 1.0_dp
IF (iatom == jatom) fi = 0.5_dp
CALL virial_pair_force(virial%pv_virial, fi, fij, rij)
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, iatom), fi*0.5_dp, fij, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), fi*0.5_dp, fij, rij)
END IF
END IF
END IF
END DO
@ -259,8 +255,7 @@ CONTAINS
CALL get_cell(cell=cell, periodic=periodic, deth=deth)
CALL ewald_env_get(ewald_env, alpha=alpha, ewald_type=ewald_type)
CALL get_qs_env(qs_env=qs_env, sab_tbe=n_list)
CALL tb_ewald_overlap(gmcharge, mcharge, alpha, n_list, &
virial, use_virial, atprop=atprop)
CALL tb_ewald_overlap(gmcharge, mcharge, alpha, n_list, virial, use_virial)
SELECT CASE (ewald_type)
CASE DEFAULT
CPABORT("Invalid Ewald type")
@ -272,8 +267,7 @@ CONTAINS
CPABORT("PME not implemented in DFTB")
CASE (do_ewald_spme)
CALL tb_spme_evaluate(ewald_env, ewald_pw, particle_set, cell, &
gmcharge, mcharge, calculate_forces, virial, &
use_virial, atprop=atprop)
gmcharge, mcharge, calculate_forces, virial, use_virial)
END SELECT
ELSE
! direct sum
@ -437,10 +431,6 @@ CONTAINS
fi = 1.0_dp
IF (iatom == jatom) fi = 0.5_dp
CALL virial_pair_force(virial%pv_virial, fi, fij, rij)
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, iatom), 0.5_dp*fi, fij, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), 0.5_dp*fi, fij, rij)
END IF
END IF
END DO
END DO
@ -498,10 +488,6 @@ CONTAINS
fi = 1.0_dp
IF (iatom == jatom) fi = 0.5_dp
CALL virial_pair_force(virial%pv_virial, fi, fij, rij)
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, iatom), fi*0.5_dp, fij, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), fi*0.5_dp, fij, rij)
END IF
END IF
END IF
END DO

View file

@ -238,10 +238,6 @@ CONTAINS
END IF
IF (calculate_forces .AND. (dr > 0.001_dp) .AND. use_virial) THEN
CALL virial_pair_force(virial%pv_virial, -1._dp, fdij, rij)
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fdij, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp, fdij, rij)
END IF
END IF
END IF
END DO

View file

@ -108,8 +108,8 @@ CONTAINS
INTEGER, DIMENSION(3) :: cell
INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
LOGICAL :: defined, found, omit_headers, use_virial
REAL(KIND=dp) :: ddr, dgrd, dr, erep, erepij, f0, f1, &
foab, fow, s_cut, urep_cut
REAL(KIND=dp) :: ddr, dgrd, dr, erep, erepij, f0, foab, &
fow, s_cut, urep_cut
REAL(KIND=dp), DIMENSION(0:3) :: eta_a, eta_b, skself
REAL(KIND=dp), DIMENSION(10) :: urep
REAL(KIND=dp), DIMENSION(2) :: surr
@ -366,13 +366,6 @@ CONTAINS
IF (iatom == jatom) f0 = 0.5_dp*f0
CALL virial_pair_force(virial%pv_virial, -f0, force_ab, rij)
CALL virial_pair_force(virial%pv_virial, -f0, force_w, rij)
IF (atprop%stress) THEN
f1 = 0.5_dp*f0
CALL virial_pair_force(atprop%atstress(:, :, iatom), -f1, force_ab, rij)
CALL virial_pair_force(atprop%atstress(:, :, iatom), -f1, force_w, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), -f1, force_ab, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), -f1, force_w, rij)
END IF
END IF
DEALLOCATE (dfblock, dsblock)
END IF
@ -412,10 +405,6 @@ CONTAINS
f0 = -1.0_dp
IF (iatom == jatom) f0 = -0.5_dp
CALL virial_pair_force(virial%pv_virial, f0, force_rr, rij)
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, iatom), f0*0.5_dp, force_rr, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), f0*0.5_dp, force_rr, rij)
END IF
END IF
END IF
END IF

View file

@ -12,6 +12,7 @@
MODULE qs_dispersion_cnum
USE kinds, ONLY: dp
USE mathconstants, ONLY: oorootpi
USE memory_utilities, ONLY: reallocate
USE message_passing, ONLY: mp_para_env_type
USE particle_types, ONLY: particle_type
@ -19,6 +20,8 @@ MODULE qs_dispersion_cnum
USE qs_dispersion_types, ONLY: qs_dispersion_type
USE qs_environment_types, ONLY: get_qs_env,&
qs_environment_type
USE qs_kind_types, ONLY: get_qs_kind,&
qs_kind_type
USE qs_neighbor_list_types, ONLY: get_iterator_info,&
neighbor_list_iterate,&
neighbor_list_iterator_create,&
@ -40,7 +43,7 @@ MODULE qs_dispersion_cnum
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_dispersion_cnum'
PUBLIC :: exclude_d3_kind_pair, setcn, setr0ab
PUBLIC :: exclude_d3_kind_pair, setcn, setr0ab, setrcov, seten
TYPE dcnum_type
INTEGER :: neighbors = -1
@ -50,6 +53,7 @@ MODULE qs_dispersion_cnum
END TYPE dcnum_type
PUBLIC :: d3_cnumber, dcnum_type, dcnum_distribute
PUBLIC :: cnumber_init, cnumber_release, get_cn_radius
! **************************************************************************************************
@ -880,6 +884,31 @@ CONTAINS
END SUBROUTINE setr0ab
! **************************************************************************************************
!> \brief ...
!> \param rcov ...
! **************************************************************************************************
SUBROUTINE setrcov(rcov)
! set cut-off radii
REAL(KIND=dp), DIMENSION(:) :: rcov
! covalent radii (taken from Pyykko and Atsumi, Chem. Eur. J. 15, 2009, 188-197)
! values for metals decreased by 10 %
rcov(1:94) = (/ &
0.32, 0.46, 1.20, 0.94, 0.77, 0.75, 0.71, 0.63, 0.64, 0.67 &
, 1.40, 1.25, 1.13, 1.04, 1.10, 1.02, 0.99, 0.96, 1.76, 1.54 &
, 1.33, 1.22, 1.21, 1.10, 1.07, 1.04, 1.00, 0.99, 1.01, 1.09 &
, 1.12, 1.09, 1.15, 1.10, 1.14, 1.17, 1.89, 1.67, 1.47, 1.39 &
, 1.32, 1.24, 1.15, 1.13, 1.13, 1.08, 1.15, 1.23, 1.28, 1.26 &
, 1.26, 1.23, 1.32, 1.31, 2.09, 1.76, 1.62, 1.47, 1.58, 1.57 &
, 1.56, 1.55, 1.51, 1.52, 1.51, 1.50, 1.49, 1.49, 1.48, 1.53 &
, 1.46, 1.37, 1.31, 1.23, 1.18, 1.16, 1.11, 1.12, 1.13, 1.32 &
, 1.30, 1.30, 1.36, 1.31, 1.38, 1.42, 2.01, 1.81, 1.67, 1.58 &
, 1.52, 1.53, 1.54, 1.55 &
/)
END SUBROUTINE setrcov
! **************************************************************************************************
!> \brief ...
!> \param cnout ...
@ -907,33 +936,64 @@ CONTAINS
END SUBROUTINE setcn
! **************************************************************************************************
!> \brief ...
!> \param enout ...
! **************************************************************************************************
SUBROUTINE seten(enout)
! Element Pauling Electronegativity
REAL(KIND=dp), DIMENSION(:) :: enout
INTEGER :: n
REAL(KIND=dp), DIMENSION(104) :: en
en(1:104) = [2.20_dp, 3.00_dp, & ! 2
0.98_dp, 1.57_dp, 2.04_dp, 2.55_dp, 3.04_dp, 3.44_dp, 3.98_dp, 4.50_dp, & ! 10
0.93_dp, 1.31_dp, 1.61_dp, 1.90_dp, 2.19_dp, 2.58_dp, 3.16_dp, 3.50_dp, & ! 18
0.82_dp, 1.00_dp, 1.36_dp, 1.54_dp, 1.63_dp, 1.66_dp, 1.55_dp, 1.83_dp, &
1.88_dp, 1.91_dp, 1.90_dp, 1.65_dp, 1.81_dp, 2.01_dp, 2.18_dp, 2.55_dp, 2.96_dp, 3.00_dp, & ! 36
0.82_dp, 0.95_dp, 1.22_dp, 1.33_dp, 1.60_dp, 2.16_dp, 1.90_dp, 2.20_dp, &
2.28_dp, 2.20_dp, 1.93_dp, 1.69_dp, 1.78_dp, 1.96_dp, 2.05_dp, 2.10_dp, 2.66_dp, 2.60_dp, & ! 54
0.79_dp, 0.89_dp, 1.10_dp, &
1.12_dp, 1.13_dp, 1.14_dp, 1.15_dp, 1.17_dp, 1.18_dp, 1.20_dp, 1.21_dp, &
1.22_dp, 1.23_dp, 1.24_dp, 1.25_dp, 1.26_dp, 1.27_dp, & ! Lanthanides
1.30_dp, 1.50_dp, 2.36_dp, 1.90_dp, 2.20_dp, 2.20_dp, 2.28_dp, 2.54_dp, &
2.00_dp, 2.04_dp, 2.33_dp, 2.02_dp, 2.00_dp, 2.20_dp, 2.20_dp, & ! 86
0.70_dp, 0.89_dp, 1.10_dp, &
1.30_dp, 1.50_dp, 1.38_dp, 1.36_dp, 1.28_dp, 1.30_dp, 1.30_dp, 1.30_dp, &
1.30_dp, 1.30_dp, 1.30_dp, 1.30_dp, 1.30_dp, 1.50_dp, & ! Actinides
1.50_dp]
enout = 0._dp
n = MIN(SIZE(en), SIZE(enout))
enout(1:n) = en(1:n)
END SUBROUTINE seten
! **************************************************************************************************
!> \brief ...
!> \param rab ...
!> \param rcova ...
!> \param rcovb ...
!> \param rcovab ...
!> \param k1 ...
!> \param cnab ...
!> \param dcnab ...
! **************************************************************************************************
SUBROUTINE cnparam_d3(rab, rcova, rcovb, k1, cnab, dcnab)
SUBROUTINE cnparam_d3(rab, rcovab, k1, cnab, dcnab)
REAL(KIND=dp), INTENT(IN) :: rab, rcova, rcovb, k1
REAL(KIND=dp), INTENT(IN) :: rab, rcovab, k1
REAL(KIND=dp), INTENT(OUT) :: cnab, dcnab
REAL(KIND=dp) :: dfz, ee, fz, rco, rr
REAL(KIND=dp) :: dfz, ee, fz, rr
! covalent distance in Bohr
rco = rcova + rcovb
rr = rco/rab
! covalent distance in Bohr
rr = rcovab/rab
! counting function exponential has a better long-range behavior
! than MHGs inverse damping
! factor k2 already included into rcov
ee = EXP(-k1*(rr - 1.0_dp))
! force the function to zero using a second step function
fz = 0.5_dp*(1.0_dp - TANH(rab - 2.0_dp*rco))
dfz = 0.5_dp*((TANH(rab - 2.0_dp*rco))**2 - 1.0_dp)
fz = 0.5_dp*(1.0_dp - TANH(rab - 2.0_dp*rcovab))
dfz = 0.5_dp*((TANH(rab - 2.0_dp*rcovab))**2 - 1.0_dp)
cnab = 1.0_dp/(1.0_dp + ee)*fz
dcnab = -cnab*cnab*k1*rr/rab*ee + 1.0_dp/(1.0_dp + ee)*dfz
@ -954,8 +1014,7 @@ CONTAINS
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: dvals
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rik
! we only have to do something if this is a parallel run
! we only have to do something if this is a parallel run
IF (para_env%num_pe > 1) THEN
natom = SIZE(dcnum)
!pack my dcnum data
@ -1011,35 +1070,67 @@ CONTAINS
END SUBROUTINE dcnum_distribute
! **************************************************************************************************
!> \brief ...
!> \param dispersion_env ...
!> \return ...
! **************************************************************************************************
FUNCTION get_cn_radius(dispersion_env) RESULT(rcut)
TYPE(qs_dispersion_type), POINTER :: dispersion_env
REAL(KIND=dp) :: rcut
INTEGER :: i
REAL(KIND=dp) :: cnab, cnfun, dcnab, den, rcov
cnfun = dispersion_env%cnfun
rcut = 0.0_dp
rcov = 1.5_dp*MAXVAL(dispersion_env%rcov)
DO i = 1, 250
rcut = rcut + 0.1_dp
IF (cnfun == 1) THEN
CALL cnparam_d3(rcut, rcov, dispersion_env%k1, cnab, dcnab)
ELSEIF (cnfun == 2) THEN
CALL modcn_d3(rcut, rcov, cnab, dcnab)
ELSEIF (cnfun == 3) THEN
den = 0.0_dp
CALL cn_d4per(rcut, rcov, den, cnab, dcnab)
ELSE
CPABORT("cnfun in get_cn_radius")
END IF
IF (cnab < 10._dp*dispersion_env%eps_cn) EXIT
END DO
END FUNCTION get_cn_radius
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param dispersion_env ...
!> \param cnumbers ...
!> \param dcnum ...
!> \param ghost ...
!> \param floating ...
!> \param exclude ...
!> \param atomnumber ...
!> \param calculate_forces ...
!> \param debugall ...
!> \param derivatives ...
!> \param cnfun ...
! **************************************************************************************************
SUBROUTINE d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, ghost, floating, atomnumber, &
calculate_forces, debugall)
SUBROUTINE d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, exclude, atomnumber, &
derivatives, cnfun)
TYPE(qs_environment_type), POINTER :: qs_env
TYPE(qs_dispersion_type), POINTER :: dispersion_env
REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: cnumbers
TYPE(dcnum_type), DIMENSION(:), INTENT(INOUT) :: dcnum
LOGICAL, DIMENSION(:), INTENT(IN) :: ghost, floating
LOGICAL, DIMENSION(:), INTENT(IN) :: exclude
INTEGER, DIMENSION(:), INTENT(IN) :: atomnumber
LOGICAL, INTENT(IN) :: calculate_forces, debugall
LOGICAL, INTENT(IN) :: derivatives
INTEGER, INTENT(IN) :: cnfun
CHARACTER(LEN=*), PARAMETER :: routineN = 'd3_cnumber'
INTEGER :: handle, iatom, ikind, jatom, jkind, &
mepos, natom, ni, nj, num_pe, za, zb
LOGICAL :: exclude_pair
REAL(KIND=dp) :: cnab, dcnab, eps_cn, rcc, rcova, rcovb
REAL(KIND=dp) :: cnab, dcnab, den, eps_cn, rcc, rcovab
REAL(KIND=dp), DIMENSION(3) :: rij
TYPE(neighbor_list_iterator_p_type), &
DIMENSION(:), POINTER :: nl_iterator
@ -1066,13 +1157,13 @@ CONTAINS
!$OMP PARALLEL DEFAULT( NONE ) &
!$OMP SHARED( locks, number_of_locks, nl_iterator &
!$OMP , ghost, floating, atomnumber, eps_cn &
!$OMP , dispersion_env, calculate_forces, debugall &
!$OMP , dcnum, cnumbers &
!$OMP , exclude, atomnumber, eps_cn &
!$OMP , dispersion_env, derivatives &
!$OMP , dcnum, cnumbers, cnfun &
!$OMP ) &
!$OMP PRIVATE( mepos &
!$OMP , ikind, jkind, iatom, jatom, rij, rcc &
!$OMP , za, zb, rcova, rcovb, cnab, dcnab &
!$OMP , za, zb, rcovab, cnab, dcnab, den &
!$OMP , ni, nj, exclude_pair &
!$OMP )
@ -1091,7 +1182,7 @@ CONTAINS
DO WHILE (neighbor_list_iterate(nl_iterator, mepos=mepos) == 0)
CALL get_iterator_info(nl_iterator, mepos=mepos, ikind=ikind, jkind=jkind, iatom=iatom, jatom=jatom, r=rij)
IF (ghost(ikind) .OR. ghost(jkind) .OR. floating(ikind) .OR. floating(jkind)) CYCLE
IF (exclude(ikind) .OR. exclude(jkind)) CYCLE
IF (dispersion_env%nd3_exclude_pair > 0) THEN
CALL exclude_d3_kind_pair(dispersion_env%d3_exclude_pair, ikind, jkind, exclude=exclude_pair)
IF (exclude_pair) CYCLE
@ -1101,9 +1192,17 @@ CONTAINS
IF (rcc > 1.e-6_dp) THEN
za = atomnumber(ikind)
zb = atomnumber(jkind)
rcova = dispersion_env%rcov(za)
rcovb = dispersion_env%rcov(zb)
CALL cnparam_d3(rcc, rcova, rcovb, dispersion_env%k1, cnab, dcnab)
rcovab = dispersion_env%rcov(za) + dispersion_env%rcov(zb)
IF (cnfun == 1) THEN
CALL cnparam_d3(rcc, rcovab, dispersion_env%k1, cnab, dcnab)
ELSEIF (cnfun == 2) THEN
CALL modcn_d3(rcc, rcovab, cnab, dcnab)
ELSEIF (cnfun == 3) THEN
den = ABS(dispersion_env%eneg(za) - dispersion_env%eneg(zb))
CALL cn_d4per(rcc, rcovab, den, cnab, dcnab)
ELSE
CPABORT("cnfun in d3_cnumber")
END IF
IF (cnab > eps_cn) THEN
!$OMP ATOMIC
cnumbers(iatom) = cnumbers(iatom) + cnab
@ -1112,7 +1211,7 @@ CONTAINS
cnumbers(jatom) = cnumbers(jatom) + cnab
END IF
END IF
IF (calculate_forces .OR. debugall .AND. cnab > eps_cn) THEN
IF (derivatives .AND. cnab > eps_cn) THEN
!$ CALL omp_set_lock(locks(iatom))
dcnum(iatom)%neighbors = dcnum(iatom)%neighbors + 1
ni = dcnum(iatom)%neighbors
@ -1161,6 +1260,55 @@ CONTAINS
END SUBROUTINE d3_cnumber
! **************************************************************************************************
!> \brief ...
!> \param rab ...
!> \param rcovab ...
!> \param cnab ...
!> \param dcnab ...
! **************************************************************************************************
SUBROUTINE modcn_d3(rab, rcovab, cnab, dcnab)
REAL(KIND=dp), INTENT(IN) :: rab, rcovab
REAL(KIND=dp), INTENT(OUT) :: cnab, dcnab
REAL(KIND=dp) :: ee, k1, rr
rr = rab/rcovab
k1 = 7.5_dp
ee = ERF(-k1*(rr - 1.0_dp))
cnab = 0.5_dp*(1.0_dp + ee)
dcnab = -k1*oorootpi/rcovab*EXP(-k1*k1*(rr - 1.0_dp)**2)
END SUBROUTINE modcn_d3
! **************************************************************************************************
!> \brief ...
!> \param rab ...
!> \param rcovab ...
!> \param den ...
!> \param cnab ...
!> \param dcnab ...
! **************************************************************************************************
SUBROUTINE cn_d4per(rab, rcovab, den, cnab, dcnab)
REAL(KIND=dp), INTENT(IN) :: rab, rcovab, den
REAL(KIND=dp), INTENT(OUT) :: cnab, dcnab
REAL(KIND=dp), PARAMETER :: k0 = 7.5_dp, k1 = 4.10451_dp, &
k2 = 19.08857_dp, k3 = 2*11.28174_dp**2
REAL(KIND=dp) :: dee, dij, ee, rr
rr = rab/rcovab
dij = k1*EXP(-((den + k2)**2)/k3)
ee = ERF(-k0*(rr - 1.0_dp))
cnab = 0.5_dp*dij*(1.0_dp + ee)
dee = -2.0_dp*k0/rcovab*oorootpi*EXP(-k0*k0*(rr - 1.0_dp)**2)
dcnab = 0.5_dp*dij*dee
END SUBROUTINE cn_d4per
! **************************************************************************************************
!> \brief ...
!> \param exclude_list List of kind pairs to exclude
@ -1203,4 +1351,97 @@ CONTAINS
END SUBROUTINE exclude_d3_kind_pair
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param cnumbers ...
!> \param dcnum ...
!> \param ftype ...
!> \param derivatives ...
!> \param disp_env ...
! **************************************************************************************************
SUBROUTINE cnumber_init(qs_env, cnumbers, dcnum, ftype, derivatives, disp_env)
TYPE(qs_environment_type), POINTER :: qs_env
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: cnumbers
TYPE(dcnum_type), ALLOCATABLE, DIMENSION(:) :: dcnum
INTEGER, INTENT(IN) :: ftype
LOGICAL, INTENT(IN) :: derivatives
TYPE(qs_dispersion_type), OPTIONAL, POINTER :: disp_env
INTEGER :: iatom, ikind, natom, nkind, za
INTEGER, ALLOCATABLE, DIMENSION(:) :: atomnumber
LOGICAL :: floating_a, ghost_a
LOGICAL, ALLOCATABLE, DIMENSION(:) :: exclude
TYPE(mp_para_env_type), POINTER :: para_env
TYPE(qs_dispersion_type), POINTER :: dispersion_env
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, &
dispersion_env=dispersion_env, &
para_env=para_env, &
nkind=nkind, natom=natom)
IF (PRESENT(disp_env)) dispersion_env => disp_env
CALL cnumber_release(cnumbers, dcnum, derivatives)
ALLOCATE (cnumbers(natom))
cnumbers = 0._dp
IF (derivatives) THEN
ALLOCATE (dcnum(natom))
dcnum(:)%neighbors = 0
DO iatom = 1, natom
ALLOCATE (dcnum(iatom)%nlist(10), dcnum(iatom)%dvals(10), dcnum(iatom)%rik(3, 10))
END DO
ELSE
ALLOCATE (dcnum(1))
END IF
ALLOCATE (exclude(nkind), atomnumber(nkind))
DO ikind = 1, nkind
CALL get_qs_kind(qs_kind_set(ikind), zatom=za, ghost=ghost_a, floating=floating_a)
exclude(ikind) = ghost_a .OR. floating_a
atomnumber(ikind) = za
END DO
CALL d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, exclude, atomnumber, &
derivatives, ftype)
CALL para_env%sum(cnumbers)
IF (derivatives) THEN
CALL dcnum_distribute(dcnum, para_env)
END IF
DEALLOCATE (exclude, atomnumber)
END SUBROUTINE cnumber_init
! **************************************************************************************************
!> \brief ...
!> \param cnumbers ...
!> \param dcnum ...
!> \param derivatives ...
! **************************************************************************************************
SUBROUTINE cnumber_release(cnumbers, dcnum, derivatives)
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: cnumbers
TYPE(dcnum_type), ALLOCATABLE, DIMENSION(:) :: dcnum
LOGICAL, INTENT(IN) :: derivatives
INTEGER :: iatom, natom
! deallocate coordination numbers
IF (ALLOCATED(cnumbers)) DEALLOCATE (cnumbers)
IF (ALLOCATED(dcnum)) THEN
IF (derivatives) THEN
natom = SIZE(dcnum)
DO iatom = 1, natom
DEALLOCATE (dcnum(iatom)%nlist, dcnum(iatom)%dvals, dcnum(iatom)%rik)
END DO
END IF
DEALLOCATE (dcnum)
END IF
END SUBROUTINE cnumber_release
END MODULE qs_dispersion_cnum

View file

@ -71,8 +71,8 @@ CONTAINS
jatom, jkind, mepos, natom, nkind, &
num_pe, za, zb
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, atomnumber, kind_of
LOGICAL :: atenergy, atex, atstress, floating_a, &
ghost_a, use_virial
LOGICAL :: atenergy, atex, floating_a, ghost_a, &
use_virial
LOGICAL, ALLOCATABLE, DIMENSION(:) :: dodisp, floating, ghost
REAL(KIND=dp) :: c6, dd, devdw, dfdmp, dr, er, fac, fdmp, &
rcc, rcut, s6, xp
@ -80,7 +80,6 @@ CONTAINS
REAL(KIND=dp), DIMENSION(3) :: fdij, rij
REAL(KIND=dp), DIMENSION(3, 3) :: pv_virial_thread
REAL(KIND=dp), DIMENSION(:), POINTER :: atener
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: atstr
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atprop_type), POINTER :: atprop
TYPE(cell_type), POINTER :: cell
@ -108,8 +107,6 @@ CONTAINS
CALL atprop_array_init(atprop%atevdw, natom)
atener => atprop%atevdw
END IF
atstress = atprop%stress
atstr => atprop%atstress
! external atomic energy
atex = .FALSE.
IF (PRESENT(atevdw)) THEN
@ -175,10 +172,6 @@ CONTAINS
IF (use_virial) THEN
CALL virial_pair_force(pv_virial_thread, -1._dp, fdij, rij)
END IF
IF (atstress) THEN
CALL virial_pair_force(atstr(:, :, iatom), -0.5_dp, fdij, rij)
CALL virial_pair_force(atstr(:, :, jatom), -0.5_dp, fdij, rij)
END IF
END IF
IF (atenergy) THEN
atener(iatom) = atener(iatom) - 0.5_dp*xp*fdmp*fac

View file

@ -92,9 +92,9 @@ CONTAINS
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, atomnumber, kind_of
INTEGER, DIMENSION(3) :: cell_b, cell_c, ncell, periodic
INTEGER, DIMENSION(:), POINTER :: atom_list
LOGICAL :: atenergy, atex, atstress, debugall, domol, exclude_pair, floating_a, floating_b, &
LOGICAL :: atenergy, atex, debugall, domol, exclude_pair, floating_a, floating_b, &
floating_c, ghost_a, ghost_b, ghost_c, is000, use_virial
LOGICAL, ALLOCATABLE, DIMENSION(:) :: dodisp, floating, ghost
LOGICAL, ALLOCATABLE, DIMENSION(:) :: dodisp, exclude
REAL(KIND=dp) :: a1, a2, alp6, alp8, ang, c6, c8, c9, cc6ab, cc6bc, cc6ca, cnum, dc6a, dc6b, &
dc8a, dc8b, dcc6aba, dcc6abb, dcc6bcb, dcc6bcc, dcc6caa, dcc6cac, de6, de8, de91, de921, &
de922, dea, dfdab6, dfdab8, dfdabc, dr, drk, e6, e6tot, e8, e8tot, e9, e9tot, elrc6, &
@ -108,7 +108,6 @@ CONTAINS
rc0, rca, rij, rik, sab_max
REAL(KIND=dp), DIMENSION(3, 3) :: pv_virial_thread
REAL(KIND=dp), DIMENSION(:), POINTER :: atener
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: atstr
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atprop_type), POINTER :: atprop
TYPE(cell_type), POINTER :: cell
@ -142,8 +141,6 @@ CONTAINS
CALL atprop_array_init(atprop%atevdw, natom)
atener => atprop%atevdw
END IF
atstress = atprop%stress
atstr => atprop%atstress
! external atomic energy
atex = .FALSE.
IF (PRESENT(atevdw)) THEN
@ -160,13 +157,12 @@ CONTAINS
use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
pv_virial_thread(:, :) = 0._dp
ALLOCATE (dodisp(nkind), ghost(nkind), floating(nkind), atomnumber(nkind), c6d2(nkind), radd2(nkind))
ALLOCATE (dodisp(nkind), exclude(nkind), atomnumber(nkind), c6d2(nkind), radd2(nkind))
DO ikind = 1, nkind
CALL get_atomic_kind(atomic_kind_set(ikind), z=za)
CALL get_qs_kind(qs_kind_set(ikind), dispersion=disp_a, ghost=ghost_a, floating=floating_a)
dodisp(ikind) = disp_a%defined
ghost(ikind) = ghost_a
floating(ikind) = floating_a
exclude(ikind) = ghost_a .OR. floating_a
atomnumber(ikind) = za
c6d2(ikind) = disp_a%c6
radd2(ikind) = disp_a%vdw_radii
@ -260,8 +256,8 @@ CONTAINS
ALLOCATE (dcnum(1))
END IF
CALL d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, ghost, floating, atomnumber, &
calculate_forces, debugall)
CALL d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, exclude, atomnumber, &
calculate_forces, 1)
CALL para_env%sum(cnumbers)
! for parallel runs we have to update dcnum on all processors
@ -346,7 +342,7 @@ CONTAINS
DO WHILE (neighbor_list_iterate(nl_iterator, mepos=mepos) == 0)
CALL get_iterator_info(nl_iterator, mepos=mepos, ikind=ikind, jkind=jkind, iatom=iatom, jatom=jatom, r=rij)
IF (ghost(ikind) .OR. ghost(jkind) .OR. floating(ikind) .OR. floating(jkind)) CYCLE
IF (exclude(ikind) .OR. exclude(jkind)) CYCLE
IF (.NOT. (dodisp(ikind) .AND. dodisp(jkind))) CYCLE
@ -438,10 +434,6 @@ CONTAINS
IF (use_virial) THEN
CALL virial_pair_force(pv_virial_thread, -1._dp, fdij, rij)
END IF
IF (atstress) THEN
CALL virial_pair_force(atstr(:, :, iatom), -0.5_dp, fdij, rij)
CALL virial_pair_force(atstr(:, :, jatom), -0.5_dp, fdij, rij)
END IF
! forces from the r-dependence of the coordination numbers
IF (idmp == 1) THEN
! zero
@ -470,10 +462,6 @@ CONTAINS
IF (use_virial) THEN
CALL virial_pair_force(pv_virial_thread, -1._dp, fdik, rik)
END IF
IF (atstress) THEN
CALL virial_pair_force(atstr(:, :, iatom), -0.5_dp, fdik, rik)
CALL virial_pair_force(atstr(:, :, katom), -0.5_dp, fdik, rik)
END IF
END DO
DO i = 1, dcnum(jatom)%neighbors
katom = dcnum(jatom)%nlist(i)
@ -487,10 +475,6 @@ CONTAINS
IF (use_virial) THEN
CALL virial_pair_force(pv_virial_thread, -1._dp, fdik, rik)
END IF
IF (atstress) THEN
CALL virial_pair_force(atstr(:, :, jatom), -0.5_dp, fdik, rik)
CALL virial_pair_force(atstr(:, :, katom), -0.5_dp, fdik, rik)
END IF
END DO
END IF
IF (dispersion_env%doabc) THEN
@ -529,7 +513,7 @@ CONTAINS
rc0 = MATMUL(cell%hmat, cell_c)
DO katom = kstart, natom
kkind = kind_of(katom)
IF (ghost(kkind) .OR. floating(kkind) .OR. .NOT. dodisp(kkind)) CYCLE
IF (exclude(kkind) .OR. .NOT. dodisp(kkind)) CYCLE
rc(:) = rcpbc(:, katom) + rc0(:)
r2bc = SUM((rb - rc)**2)
IF (r2bc >= rc2) CYCLE
@ -607,10 +591,6 @@ CONTAINS
IF (use_virial) THEN
CALL virial_pair_force(pv_virial_thread, -1._dp, fdij, rab)
END IF
IF (atstress) THEN
CALL virial_pair_force(atstr(:, :, iatom), -0.5_dp, fdij, rab)
CALL virial_pair_force(atstr(:, :, jatom), -0.5_dp, fdij, rab)
END IF
fdij(:) = de91*rbc(:)/r2bc
fdij(:) = fdij(:) + dea*s1*s2*s3*rbc(:)/r2bc
fdij(:) = fdij(:) - dea*(s2*s3 - s1*s3 + s1*s2)*rbc(:)
@ -619,10 +599,6 @@ CONTAINS
IF (use_virial) THEN
CALL virial_pair_force(pv_virial_thread, -1._dp, fdij, rbc)
END IF
IF (atstress) THEN
CALL virial_pair_force(atstr(:, :, jatom), -0.5_dp, fdij, rbc)
CALL virial_pair_force(atstr(:, :, katom), -0.5_dp, fdij, rbc)
END IF
fdij(:) = de91*rca(:)/r2ca
fdij(:) = fdij(:) + dea*s1*s2*s3*rca(:)/r2ca
fdij(:) = fdij(:) - dea*(-s2*s3 + s1*s3 + s1*s2)*rca(:)
@ -631,10 +607,6 @@ CONTAINS
IF (use_virial) THEN
CALL virial_pair_force(pv_virial_thread, -1._dp, fdij, rca)
END IF
IF (atstress) THEN
CALL virial_pair_force(atstr(:, :, iatom), -0.5_dp, fdij, rca)
CALL virial_pair_force(atstr(:, :, katom), -0.5_dp, fdij, rca)
END IF
IF (.NOT. dispersion_env%c9cnst) THEN
! forces from the r-dependence of the coordination numbers
@ -870,7 +842,7 @@ CONTAINS
END IF
END IF
DEALLOCATE (dodisp, ghost, floating, atomnumber, rcpbc, radd2, c6d2)
DEALLOCATE (dodisp, exclude, atomnumber, rcpbc, radd2, c6d2)
IF (domol) THEN
DEALLOCATE (atom2mol)

File diff suppressed because it is too large Load diff

View file

@ -14,7 +14,8 @@ MODULE qs_dispersion_pairpot
USE atomic_kind_types, ONLY: atomic_kind_type,&
get_atomic_kind,&
get_atomic_kind_set
USE atprop_types, ONLY: atprop_type
USE atprop_types, ONLY: atprop_array_init,&
atprop_type
USE bibliography, ONLY: Caldeweyher2017,&
Caldeweyher2019,&
Caldeweyher2020,&
@ -25,6 +26,7 @@ MODULE qs_dispersion_pairpot
grimme2011
USE cell_types, ONLY: cell_type
USE cp_log_handling, ONLY: cp_get_default_logger,&
cp_logger_get_default_io_unit,&
cp_logger_type
USE cp_output_handling, ONLY: cp_print_key_finished_output,&
cp_print_key_unit_nr
@ -33,12 +35,14 @@ MODULE qs_dispersion_pairpot
USE cp_parser_types, ONLY: cp_parser_type,&
parser_create,&
parser_release
USE eeq_input, ONLY: read_eeq_param
USE input_constants, ONLY: vdw_pairpot_dftd2,&
vdw_pairpot_dftd3,&
vdw_pairpot_dftd3bj,&
vdw_pairpot_dftd4,&
xc_vdw_fun_pairpot
USE input_section_types, ONLY: section_vals_type,&
USE input_section_types, ONLY: section_vals_get_subs_vals,&
section_vals_type,&
section_vals_val_get
USE kinds, ONLY: default_string_length,&
dp
@ -46,8 +50,11 @@ MODULE qs_dispersion_pairpot
USE physcon, ONLY: bohr,&
kcalmol,&
kjmol
USE qs_dispersion_cnum, ONLY: setcn,&
setr0ab
USE qs_dispersion_cnum, ONLY: get_cn_radius,&
setcn,&
seten,&
setr0ab,&
setrcov
USE qs_dispersion_d2, ONLY: calculate_dispersion_d2_pairpot,&
dftd2_param
USE qs_dispersion_d3, ONLY: calculate_dispersion_d3_pairpot,&
@ -107,6 +114,7 @@ CONTAINS
LOGICAL :: at_end, explicit, found, is_available
REAL(KIND=dp) :: dum
TYPE(qs_atom_dispersion_type), POINTER :: disp
TYPE(section_vals_type), POINTER :: eeq_section
CALL timeset(routineN, handle)
@ -202,6 +210,7 @@ CONTAINS
ALLOCATE (dispersion_env%c6ab(max_elem, max_elem, maxc, maxc, 3))
ALLOCATE (dispersion_env%r0ab(max_elem, max_elem))
ALLOCATE (dispersion_env%rcov(max_elem))
ALLOCATE (dispersion_env%eneg(max_elem))
ALLOCATE (dispersion_env%r2r4(max_elem))
ALLOCATE (dispersion_env%cn(max_elem))
@ -209,6 +218,8 @@ CONTAINS
filename = dispersion_env%parameter_file_name
CALL dftd3_c6_param(dispersion_env%c6ab, dispersion_env%maxci, filename, para_env)
CALL setr0ab(dispersion_env%r0ab, dispersion_env%rcov, dispersion_env%r2r4)
! Electronegativity
CALL seten(dispersion_env%eneg)
! the default coordination numbers
CALL setcn(dispersion_env%cn)
! scale r4/r2 values of the atoms by sqrt(Z)
@ -314,6 +325,34 @@ CONTAINS
disp%defined = .TRUE.
CALL set_qs_kind(qs_kind_set(ikind), dispersion=disp)
END DO
! maybe needed in cnumber calculations
max_elem = 94
maxc = 5
dispersion_env%max_elem = max_elem
dispersion_env%maxc = maxc
ALLOCATE (dispersion_env%maxci(max_elem))
ALLOCATE (dispersion_env%rcov(max_elem))
ALLOCATE (dispersion_env%eneg(max_elem))
ALLOCATE (dispersion_env%cn(max_elem))
! the default covalent radii
CALL setrcov(dispersion_env%rcov)
! the default coordination numbers
CALL setcn(dispersion_env%cn)
! Electronegativity
CALL seten(dispersion_env%eneg)
! parameters
dispersion_env%k1 = 16.0_dp
dispersion_env%k2 = 4._dp/3._dp
dispersion_env%k3 = -4._dp
dispersion_env%rcov = dispersion_env%k2*dispersion_env%rcov*bohr
dispersion_env%alp = 14._dp
!
dispersion_env%cnfun = 3
dispersion_env%rc_cn = get_cn_radius(dispersion_env)
IF (PRESENT(pp_section)) THEN
eeq_section => section_vals_get_subs_vals(pp_section, "EEQ")
CALL read_eeq_param(eeq_section, dispersion_env%eeq_sparam)
END IF
END SELECT
END SELECT
@ -339,15 +378,14 @@ CONTAINS
CHARACTER(LEN=*), PARAMETER :: routineN = 'calculate_dispersion_pairpot'
INTEGER :: atom_a, handle, iatom, ikind, natom, &
INTEGER :: atom_a, handle, iatom, ikind, iw, natom, &
nkind, unit_nr
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of
LOGICAL :: atenergy, atex, atstress, debugall, &
use_virial
LOGICAL :: atenergy, atex, debugall, use_virial
REAL(KIND=dp) :: evdw, gnorm
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: atomic_energy
REAL(KIND=dp), DIMENSION(3) :: fdij
REAL(KIND=dp), DIMENSION(3, 3) :: dvirial, pv_loc, pv_virial_thread
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: atstr
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atprop_type), POINTER :: atprop
TYPE(cell_type), POINTER :: cell
@ -384,8 +422,6 @@ CONTAINS
! atomic energy and stress arrays
atenergy = atprop%energy
atstress = atprop%stress
atstr => atprop%atstress
! external atomic energy
atex = .FALSE.
IF (PRESENT(atevdw)) THEN
@ -429,15 +465,6 @@ CONTAINS
CALL calculate_dispersion_d3_pairpot(qs_env, dispersion_env, evdw, calculate_forces, &
unit_nr, atevdw)
ELSEIF (dispersion_env%pp_type == vdw_pairpot_dftd4) THEN
IF (atenergy) THEN
CPABORT("Atomic energy with DFTD4 not implemented")
END IF
IF (atex) THEN
CPABORT("Atomic energy with DFTD4 not implemented")
END IF
IF (atstress) THEN
CPABORT("Atomic stress with DFTD4 not implemented")
END IF
IF (dispersion_env%lrc) THEN
CPABORT("Long range correction with DFTD4 not implemented")
END IF
@ -448,7 +475,27 @@ CONTAINS
CPABORT("Molecular approximation with DFTD4 not implemented")
END IF
!
CALL calculate_dispersion_d4_pairpot(qs_env, dispersion_env, evdw, calculate_forces, unit_nr)
iw = -1
IF (dispersion_env%verbose) iw = cp_logger_get_default_io_unit(logger)
!
IF (atenergy .OR. atex) THEN
ALLOCATE (atomic_energy(natom))
CALL calculate_dispersion_d4_pairpot(qs_env, dispersion_env, evdw, calculate_forces, &
iw, atomic_energy=atomic_energy)
ELSE
CALL calculate_dispersion_d4_pairpot(qs_env, dispersion_env, evdw, calculate_forces, iw)
END IF
!
IF (atex) THEN
atevdw(1:natom) = atomic_energy(1:natom)
END IF
IF (atenergy) THEN
CALL atprop_array_init(atprop%atevdw, natom)
atprop%atevdw(1:natom) = atomic_energy(1:natom)
END IF
IF (atenergy .OR. atex) THEN
DEALLOCATE (atomic_energy)
END IF
END IF
! set dispersion energy

View file

@ -11,6 +11,7 @@
! **************************************************************************************************
MODULE qs_dispersion_types
USE eeq_input, ONLY: eeq_solver_type
USE input_section_types, ONLY: section_vals_type
USE kinds, ONLY: default_string_length,&
dp
@ -33,7 +34,7 @@ MODULE qs_dispersion_types
INTEGER :: TYPE = -1
INTEGER :: pp_type = -1
INTEGER :: nl_type = -1
CHARACTER(LEN=default_string_length) :: ref_functional = ""
CHARACTER(LEN=default_string_length) :: ref_functional = ""
REAL(KIND=dp) :: scaling = -1.0_dp
REAL(KIND=dp) :: rc_disp = -1.0_dp
REAL(KIND=dp) :: rc_d4 = -1.0_dp
@ -41,12 +42,13 @@ MODULE qs_dispersion_types
REAL(KIND=dp) :: exp_pre = -1.0_dp
TYPE(section_vals_type), POINTER :: dftd_section => NULL()
LOGICAL :: verbose = .FALSE. !extended output
CHARACTER(LEN=default_string_length) :: parameter_file_name = ""
CHARACTER(LEN=default_string_length) :: kernel_file_name = ""
CHARACTER(LEN=default_string_length) :: parameter_file_name = ""
CHARACTER(LEN=default_string_length) :: kernel_file_name = ""
!charges
LOGICAL :: ext_charges = .FALSE.
REAL(KIND=dp), DIMENSION(:), POINTER :: charges => NULL() !charges for D4
REAL(KIND=dp), DIMENSION(:), POINTER :: dcharges => NULL() !derivatives of D4 energy wrt charges
REAL(KIND=dp), DIMENSION(:), POINTER :: charges => NULL() !charges for D4
REAL(KIND=dp), DIMENSION(:), POINTER :: dcharges => NULL() !derivatives of D4 energy wrt charges
TYPE(eeq_solver_type) :: eeq_sparam ! parameters for EEQ solver
!DFT-D3 global parameters
INTEGER :: max_elem = -1 !elements parametrized
INTEGER :: maxc = -1 !max coordination number references per element
@ -56,6 +58,7 @@ MODULE qs_dispersion_types
REAL(KIND=dp) :: a1 = -1.0_dp, a2 = -1.0_dp !BJ scaling parameters
REAL(KIND=dp) :: eps_cn = -1.0_dp
LOGICAL :: d4_reference_code = .FALSE. !Use D4 calculation from ext. library
LOGICAL :: d4_debug = .FALSE. !Output debug information for D4
LOGICAL :: doabc = .FALSE. !neglect C9 terms
LOGICAL :: c9cnst = .FALSE. !use constant c9 terms
LOGICAL :: lrc = .FALSE. !calculate a long range correction
@ -63,24 +66,25 @@ MODULE qs_dispersion_types
REAL(KIND=dp), DIMENSION(4) :: srb_params = -1.0_dp ! parameters for SRB (s,g,t1,t2)
REAL(KIND=dp) :: s9 = -1.0_dp !scale the many-body dispersion energy (default=1.0), dftd4
TYPE(neighbor_list_set_p_type), &
DIMENSION(:), POINTER :: sab_vdw => NULL(), sab_cn => NULL() ! neighborlists for pair interactions
DIMENSION(:), POINTER :: sab_vdw => NULL(), sab_cn => NULL() ! neighborlists for pair interactions
REAL(KIND=dp), DIMENSION(:, :, :, :, :), POINTER &
:: c6ab => NULL()
INTEGER, DIMENSION(:), POINTER :: maxci => NULL()
REAL(KIND=dp), DIMENSION(:, :), POINTER :: r0ab => NULL()
REAL(KIND=dp), DIMENSION(:), POINTER :: rcov => NULL() !covalent radii
REAL(KIND=dp), DIMENSION(:), POINTER :: r2r4 => NULL() !atomic <r^2>/<r^4> values
REAL(KIND=dp), DIMENSION(:), POINTER :: cn => NULL() !coordination numbers (defaults)
TYPE(cn_kind_list), DIMENSION(:), POINTER &
:: cnkind => NULL()
TYPE(cn_atom_list), DIMENSION(:), POINTER &
:: cnlist => NULL()
INTEGER, DIMENSION(:), POINTER :: maxci => NULL()
REAL(KIND=dp), DIMENSION(:, :), POINTER :: r0ab => NULL()
REAL(KIND=dp), DIMENSION(:), POINTER :: rcov => NULL() !covalent radii
REAL(KIND=dp), DIMENSION(:), POINTER :: eneg => NULL() !electronegativity
REAL(KIND=dp), DIMENSION(:), POINTER :: r2r4 => NULL() !atomic <r^2>/<r^4> values
INTEGER :: cnfun = 1 ! CN function to be used
REAL(KIND=dp), DIMENSION(:), POINTER :: cn => NULL()
TYPE(cn_kind_list), DIMENSION(:), POINTER :: cnkind => NULL()
TYPE(cn_atom_list), DIMENSION(:), POINTER :: cnlist => NULL()
! KG molecular corrections
LOGICAL :: domol = .FALSE.
REAL(KIND=dp) :: kgc8 = -1.0_dp !s8 scaling parameter
!vdW-DF variables
REAL(KIND=dp) :: pw_cutoff = -1.0_dp
REAL(KIND=dp) :: b_value = -1.0_dp, c_value = -1.0_dp, scale_rvv10 = -1.0_dp !parameters for the rVV10 functional
!parameters for the rVV10 functional
REAL(KIND=dp) :: b_value = -1.0_dp, c_value = -1.0_dp, scale_rvv10 = -1.0_dp
INTEGER :: nqs = -1, nr_points = -1
!! The number of q points and radial points
!! used in generating the kernel phi(q1*r, q2*r)
@ -141,23 +145,36 @@ CONTAINS
INTEGER :: i
IF (ASSOCIATED(dispersion_env)) THEN
! DFT-D3 arrays
IF (ASSOCIATED(dispersion_env%maxci)) THEN
! DFT-D3 arrays
DEALLOCATE (dispersion_env%maxci)
END IF
IF (ASSOCIATED(dispersion_env%c6ab)) THEN
DEALLOCATE (dispersion_env%c6ab)
END IF
IF (ASSOCIATED(dispersion_env%r0ab)) THEN
DEALLOCATE (dispersion_env%r0ab)
END IF
IF (ASSOCIATED(dispersion_env%rcov)) THEN
DEALLOCATE (dispersion_env%rcov)
END IF
IF (ASSOCIATED(dispersion_env%eneg)) THEN
DEALLOCATE (dispersion_env%eneg)
END IF
IF (ASSOCIATED(dispersion_env%r2r4)) THEN
DEALLOCATE (dispersion_env%r2r4)
END IF
IF (ASSOCIATED(dispersion_env%cn)) THEN
DEALLOCATE (dispersion_env%cn)
IF (ASSOCIATED(dispersion_env%cnkind)) THEN
DEALLOCATE (dispersion_env%cnkind)
END IF
IF (ASSOCIATED(dispersion_env%cnlist)) THEN
DO i = 1, SIZE(dispersion_env%cnlist)
DEALLOCATE (dispersion_env%cnlist(i)%atom)
END DO
DEALLOCATE (dispersion_env%cnlist)
END IF
END IF
IF (ASSOCIATED(dispersion_env%cnkind)) THEN
DEALLOCATE (dispersion_env%cnkind)
END IF
IF (ASSOCIATED(dispersion_env%cnlist)) THEN
DO i = 1, SIZE(dispersion_env%cnlist)
DEALLOCATE (dispersion_env%cnlist(i)%atom)
END DO
DEALLOCATE (dispersion_env%cnlist)
END IF
! vdD-DF
IF (ASSOCIATED(dispersion_env%q_mesh)) THEN

View file

@ -123,7 +123,8 @@ CONTAINS
CALL section_vals_val_get(pp_section, "REFERENCE_FUNCTIONAL", explicit=exfun)
CPASSERT(exfun)
IF (dispersion_env%pp_type == vdw_pairpot_dftd3) THEN
CALL qs_scaling_dftd3(dispersion_env%s6, dispersion_env%sr6, dispersion_env%s8, vdw_section)
CALL qs_scaling_dftd3(dispersion_env%s6, dispersion_env%sr6, &
dispersion_env%s8, vdw_section)
ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd3bj) THEN
CALL qs_scaling_dftd3bj(dispersion_env%s6, dispersion_env%a1, dispersion_env%s8, &
dispersion_env%a2, vdw_section)
@ -156,14 +157,29 @@ CONTAINS
dispersion_env%eps_cn = 0._dp
END IF
IF (dispersion_env%pp_type == vdw_pairpot_dftd4) THEN
CALL section_vals_val_get(pp_section, "REFERENCE_FUNCTIONAL", explicit=exfun)
IF (.NOT. exfun) THEN
CPABORT("D4 vdW functional needs specification of REFERENCE_FUNCTIONAL")
CALL section_vals_val_get(pp_section, "D4_SCALING", explicit=explicit)
IF (.NOT. explicit) THEN
CALL section_vals_val_get(pp_section, "REFERENCE_FUNCTIONAL", explicit=exfun)
IF (.NOT. exfun) THEN
CPABORT("D4 vdW REFERENCE_FUNCTIONAL or D4_SCALING expected")
ELSE
CALL section_vals_val_get(vdw_section, &
"PAIR_POTENTIAL%REFERENCE_FUNCTIONAL", &
c_val=dispersion_env%ref_functional)
END IF
ELSE
CALL section_vals_val_get(pp_section, "D4_SCALING", r_vals=scal)
dispersion_env%s6 = scal(1)
dispersion_env%a1 = scal(2)
dispersion_env%s8 = scal(3)
dispersion_env%a2 = scal(4)
dispersion_env%sr6 = 0.0_dp
dispersion_env%ref_functional = "none"
END IF
CALL section_vals_val_get(pp_section, "EPS_CN", r_val=dispersion_env%eps_cn)
CALL section_vals_val_get(pp_section, "D4_REFERENCE_CODE", &
l_val=dispersion_env%d4_reference_code)
CALL section_vals_val_get(vdw_section, "PAIR_POTENTIAL%REFERENCE_FUNCTIONAL", &
c_val=dispersion_env%ref_functional)
CALL section_vals_val_get(pp_section, "D4_DEBUG", l_val=dispersion_env%d4_debug)
CALL section_vals_val_get(pp_section, "D4_CUTOFF", r_val=dispersion_env%rc_d4)
CALL section_vals_val_get(pp_section, "D4_CN_CUTOFF", r_val=dispersion_env%rc_cn)
CALL section_vals_val_get(pp_section, "FACTOR_S9_TERM", r_val=dispersion_env%s9)

View file

@ -109,7 +109,7 @@ CONTAINS
! *** Perform a SCF run ***
IF (.NOT. loverlap_deltat) THEN
IF (scf_control%non_selfconsistent) THEN
IF (scf_control%non_selfconsistent .AND. .NOT. scf_control%force_scf_calculation) THEN
CALL nonscf(qs_env)
ELSE IF (dft_control%qs_control%do_ls_scf) THEN
CALL ls_scf(qs_env)

View file

@ -191,7 +191,7 @@ CONTAINS
subset_of_mol=kg_env%subset_of_mol, current_subset=isubset)
END DO
CASE (kg_tnadd_embed_ri)
!deb should be deleted as soon as atomic grids work
! should be deleted as soon as atomic grids work
! allocate the subset list
IF (.NOT. ASSOCIATED(kg_env%subset_of_mol)) THEN
ALLOCATE (kg_env%subset_of_mol(SIZE(molecule_set)))
@ -204,7 +204,7 @@ CONTAINS
CALL kg_build_neighborlist(qs_env, sab_orb=kg_env%subset(isubset)%sab_orb, molecular=.TRUE., &
subset_of_mol=kg_env%subset_of_mol, current_subset=isubset)
END DO
!deb
!
! LRI neighborlist
NULLIFY (soo_list)
CALL kg_build_neighborlist(qs_env, sab_orb=soo_list, molecular=.TRUE.)
@ -306,10 +306,7 @@ CONTAINS
calculate_forces=.FALSE.)
CALL qs_env_update_s_mstruct(qs_env)
ELSEIF (dft_control%qs_control%xtb) THEN
CALL build_xtb_matrices(qs_env=qs_env, para_env=para_env, &
calculate_forces=.FALSE.)
CALL get_qs_env(qs_env=qs_env, dispersion_env=dispersion_env, energy=energy)
CALL calculate_dispersion_pairpot(qs_env, dispersion_env, energy%dispersion, calc_forces)
CALL build_xtb_matrices(qs_env=qs_env, calculate_forces=.FALSE.)
CALL qs_env_update_s_mstruct(qs_env)
ELSE
CALL build_core_hamiltonian_matrix(qs_env=qs_env, calculate_forces=.FALSE.)

View file

@ -30,6 +30,9 @@ MODULE qs_energy_types
repulsive = 0.0_dp, &
dispersion = 0.0_dp, &
gcp = 0.0_dp, &
srb = 0.0_dp, &
eeq = 0.0_dp, &
ies = 0.0_dp, &
ex = 0.0_dp, &
exc = 0.0_dp, &
exc_aux_fit = 0.0_dp, &

View file

@ -26,7 +26,6 @@ MODULE qs_environment
USE basis_set_types, ONLY: basis_sort_zet,&
create_primitive_basis_set,&
deallocate_gto_basis_set,&
get_gto_basis_set,&
gto_basis_set_type
USE bibliography, ONLY: Iannuzzi2006,&
Iannuzzi2007,&
@ -95,9 +94,10 @@ MODULE qs_environment
do_method_mndod, do_method_ofgpw, do_method_pdg, do_method_pm3, do_method_pm6, &
do_method_pm6fm, do_method_pnnl, do_method_rigpw, do_method_rm1, do_method_xtb, &
do_qmmm_gauss, do_qmmm_swave, general_roks, hden_atomic, kg_tnadd_embed_ri, rel_none, &
rel_trans_atom, vdw_pairpot_dftd2, vdw_pairpot_dftd3, vdw_pairpot_dftd3bj, wfi_aspc_nr, &
wfi_linear_ps_method_nr, wfi_linear_wf_method_nr, wfi_ps_method_nr, &
wfi_use_guess_method_nr, xc_vdw_fun_none, xc_vdw_fun_nonloc, xc_vdw_fun_pairpot
rel_trans_atom, vdw_pairpot_dftd2, vdw_pairpot_dftd3, vdw_pairpot_dftd3bj, &
vdw_pairpot_dftd4, wfi_aspc_nr, wfi_linear_ps_method_nr, wfi_linear_wf_method_nr, &
wfi_ps_method_nr, wfi_use_guess_method_nr, xc_vdw_fun_none, xc_vdw_fun_nonloc, &
xc_vdw_fun_pairpot, xtb_vdw_type_d3, xtb_vdw_type_d4, xtb_vdw_type_none
USE input_section_types, ONLY: section_vals_get,&
section_vals_get_subs_vals,&
section_vals_type,&
@ -204,8 +204,8 @@ MODULE qs_environment
USE transport, ONLY: transport_env_create
USE xtb_parameters, ONLY: init_xtb_basis,&
xtb_parameters_init,&
xtb_parameters_read,&
xtb_parameters_set
USE xtb_potentials, ONLY: xtb_pp_radius
USE xtb_types, ONLY: allocate_xtb_atom_param
#include "./base/base_uses.f90"
@ -595,9 +595,9 @@ CONTAINS
CHARACTER(len=*), PARAMETER :: routineN = 'qs_init_subsys'
CHARACTER(len=2) :: element_symbol
INTEGER :: handle, ikind, ispin, iw, lmax_sphere, maxl, maxlgto, maxlgto_lri, maxlppl, &
maxlppnl, method_id, multiplicity, my_ival, n_ao, n_mo_add, natom, nelectron, ngauss, &
nkind, output_unit, sort_basis, tnadd_method
INTEGER :: gfn_type, handle, ikind, ispin, iw, lmax_sphere, maxl, maxlgto, maxlgto_lri, &
maxlppl, maxlppnl, method_id, multiplicity, my_ival, n_ao, n_mo_add, natom, nelectron, &
ngauss, nkind, output_unit, sort_basis, tnadd_method
INTEGER, DIMENSION(2) :: n_mo, nelectron_spin
LOGICAL :: all_potential_present, be_silent, do_kpoints, do_ri_hfx, do_ri_mp2, do_ri_rpa, &
do_ri_sos_mp2, do_rpa_ri_exx, do_wfc_im_time, e1terms, has_unit_metric, lribas, &
@ -645,7 +645,7 @@ CONTAINS
TYPE(se_taper_type), POINTER :: se_taper
TYPE(section_vals_type), POINTER :: dft_section, et_coupling_section, et_ddapc_section, &
ewald_section, harris_section, lri_section, mp2_section, nl_section, poisson_section, &
pp_section, print_section, qs_section, se_section, tddfpt_section, xc_section, xtb_section
pp_section, print_section, qs_section, se_section, tddfpt_section, xc_section
TYPE(semi_empirical_control_type), POINTER :: se_control
TYPE(semi_empirical_si_type), POINTER :: se_store_int_env
TYPE(xtb_control_type), POINTER :: xtb_control
@ -691,6 +691,11 @@ CONTAINS
IF (dft_control%do_tddfpt_calculation) THEN
CALL read_tddfpt_control(dft_control%tddfpt_control, dft_section)
END IF
! set periodicity flag
dft_control%qs_control%periodicity = SUM(cell%perd)
! Read the input section with the Quickstep control parameters
CALL read_qs_section(dft_control%qs_control, qs_section)
! *** Print the Quickstep program banner (copyright and version number) ***
IF (.NOT. be_silent) THEN
@ -705,17 +710,13 @@ CONTAINS
CASE (do_method_dftb)
CALL dftb_header(iw)
CASE (do_method_xtb)
CALL xtb_header(iw)
gfn_type = dft_control%qs_control%xtb_control%gfn_type
CALL xtb_header(iw, gfn_type)
END SELECT
CALL cp_print_key_finished_output(iw, logger, dft_section, &
"PRINT%PROGRAM_BANNER")
END IF
! set periodicity flag
dft_control%qs_control%periodicity = SUM(cell%perd)
! Read the input section with the Quickstep control parameters
CALL read_qs_section(dft_control%qs_control, qs_section)
IF (dft_control%do_sccs .AND. dft_control%qs_control%gapw) THEN
CPABORT("SCCS is not yet implemented with GAPW")
END IF
@ -784,13 +785,11 @@ CONTAINS
CPASSERT(.NOT. ASSOCIATED(qs_kind%xtb_parameter))
CALL allocate_xtb_atom_param(qs_kind%xtb_parameter)
! Set default parameters
gfn_type = dft_control%qs_control%xtb_control%gfn_type
CALL get_qs_kind(qs_kind, element_symbol=element_symbol)
CALL xtb_parameters_init(qs_kind%xtb_parameter, element_symbol, &
CALL xtb_parameters_init(qs_kind%xtb_parameter, gfn_type, element_symbol, &
xtb_control%parameter_file_path, xtb_control%parameter_file_name, &
para_env)
! Read specific parameters from input
xtb_section => section_vals_get_subs_vals(qs_section, "xTB")
CALL xtb_parameters_read(qs_kind%xtb_parameter, element_symbol, xtb_section)
! set dependent parameters
CALL xtb_parameters_set(qs_kind%xtb_parameter)
! Generate basis set
@ -823,6 +822,10 @@ CONTAINS
END IF
END DO
!
! set repulsive potential range
!
ALLOCATE (xtb_control%rcpair(nkind, nkind))
CALL xtb_pp_radius(qs_kind_set, xtb_control%rcpair, xtb_control%eps_pair, xtb_control%kf)
! check for Ewald
IF (xtb_control%do_ewald) THEN
ALLOCATE (ewald_env)
@ -831,7 +834,11 @@ CONTAINS
CALL ewald_env_set(ewald_env, poisson_section=poisson_section)
ewald_section => section_vals_get_subs_vals(poisson_section, "EWALD")
print_section => section_vals_get_subs_vals(qs_env%input, "PRINT%GRID_INFORMATION")
CALL read_ewald_section_tb(ewald_env, ewald_section, cell_ref%hmat)
IF (gfn_type == 0) THEN
CALL read_ewald_section_tb(ewald_env, ewald_section, cell_ref%hmat, pset="EEQ")
ELSE
CALL read_ewald_section_tb(ewald_env, ewald_section, cell_ref%hmat)
END IF
ALLOCATE (ewald_pw)
CALL ewald_pw_create(ewald_pw, ewald_env, cell, cell_ref, print_section=print_section)
CALL set_qs_env(qs_env, ewald_env=ewald_env, ewald_pw=ewald_pw)
@ -1080,16 +1087,11 @@ CONTAINS
qs_kind => qs_kind_set(ikind)
IF (qs_kind%xtb_parameter%defined) THEN
CALL get_qs_kind(qs_kind, basis_set=tmp_basis_set)
IF (xtb_control%old_coulomb_damping) THEN
CALL get_gto_basis_set(tmp_basis_set, kind_radius=rcut)
qs_kind%xtb_parameter%rcut = rcut
ELSE
rcut = xtb_control%coulomb_sr_cut
fxx = 2.0_dp*xtb_control%coulomb_sr_eps*qs_kind%xtb_parameter%eta**2
fxx = 0.80_dp*(1.0_dp/fxx)**0.3333_dp
rcut = MIN(rcut, xtb_control%coulomb_sr_cut)
qs_kind%xtb_parameter%rcut = MIN(rcut, fxx)
END IF
rcut = xtb_control%coulomb_sr_cut
fxx = 2.0_dp*xtb_control%coulomb_sr_eps*qs_kind%xtb_parameter%eta**2
fxx = 0.80_dp*(1.0_dp/fxx)**0.3333_dp
rcut = MIN(rcut, xtb_control%coulomb_sr_cut)
qs_kind%xtb_parameter%rcut = MIN(rcut, fxx)
ELSE
qs_kind%xtb_parameter%rcut = 0.0_dp
END IF
@ -1121,6 +1123,9 @@ CONTAINS
IF (dft_control%qs_control%dftb) THEN
scf_control%non_selfconsistent = .NOT. dft_control%qs_control%dftb_control%self_consistent
END IF
IF (dft_control%qs_control%xtb) THEN
scf_control%non_selfconsistent = (dft_control%qs_control%xtb_control%gfn_type == 0)
END IF
IF (qs_env%harris_method) THEN
scf_control%non_selfconsistent = .TRUE.
END IF
@ -1379,14 +1384,15 @@ CONTAINS
dispersion_env%lrc = .FALSE.
dispersion_env%srb = .FALSE.
dispersion_env%verbose = .FALSE.
NULLIFY (dispersion_env%c6ab, dispersion_env%maxci, dispersion_env%r0ab, dispersion_env%rcov, &
dispersion_env%r2r4, dispersion_env%cn, dispersion_env%cnkind, dispersion_env%cnlist, &
NULLIFY (dispersion_env%c6ab, dispersion_env%maxci, &
dispersion_env%r0ab, dispersion_env%rcov, &
dispersion_env%r2r4, dispersion_env%cn, &
dispersion_env%cnkind, dispersion_env%cnlist, &
dispersion_env%d3_exclude_pair)
NULLIFY (dispersion_env%q_mesh, dispersion_env%kernel, dispersion_env%d2phi_dk2, &
dispersion_env%d2y_dx2, dispersion_env%dftd_section)
NULLIFY (dispersion_env%sab_vdw, dispersion_env%sab_cn)
dispersion_env%type = xc_vdw_fun_pairpot
dispersion_env%pp_type = vdw_pairpot_dftd3bj
dispersion_env%eps_cn = xtb_control%epscn
dispersion_env%s6 = xtb_control%s6
dispersion_env%s8 = xtb_control%s8
@ -1395,11 +1401,26 @@ CONTAINS
dispersion_env%domol = .FALSE.
dispersion_env%kgc8 = 0._dp
dispersion_env%rc_disp = xtb_control%rcdisp
dispersion_env%rc_d4 = xtb_control%rcdisp
dispersion_env%exp_pre = 0._dp
dispersion_env%scaling = 0._dp
dispersion_env%nd3_exclude_pair = 0
dispersion_env%parameter_file_name = xtb_control%dispersion_parameter_file
CALL qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, para_env=para_env)
!
SELECT CASE (xtb_control%vdw_type)
CASE (xtb_vdw_type_none, xtb_vdw_type_d3)
dispersion_env%pp_type = vdw_pairpot_dftd3bj
CALL qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, dispersion_env, para_env=para_env)
IF (xtb_control%vdw_type == xtb_vdw_type_none) dispersion_env%type = xc_vdw_fun_none
CASE (xtb_vdw_type_d4)
dispersion_env%pp_type = vdw_pairpot_dftd4
dispersion_env%ref_functional = "none"
CALL qs_dispersion_pairpot_init(atomic_kind_set, qs_kind_set, &
dispersion_env, para_env=para_env)
dispersion_env%cnfun = 2
CASE DEFAULT
CPABORT("vdw type")
END SELECT
CALL set_qs_env(qs_env, dispersion_env=dispersion_env)
ELSE IF (dft_control%qs_control%semi_empirical) THEN
ALLOCATE (dispersion_env)

View file

@ -346,6 +346,7 @@ CONTAINS
!> \param sab_tbe ...
!> \param sab_core ...
!> \param sab_xb ...
!> \param sab_xtb_pp ...
!> \param sab_xtb_nonbond ...
!> \param sab_almo ...
!> \param sab_kp ...
@ -482,7 +483,8 @@ CONTAINS
SUBROUTINE get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, &
dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, &
sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, &
sab_xb, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, &
sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, &
sab_kp, sab_kp_nosym, particle_set, energy, force, &
matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, &
matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, &
matrix_w_kp, matrix_s_RI_aux_kp, matrix_s, matrix_s_RI_aux, matrix_w, &
@ -520,7 +522,7 @@ CONTAINS
LOGICAL, OPTIONAL :: qmmm, qmmm_periodic
TYPE(neighbor_list_set_p_type), DIMENSION(:), OPTIONAL, POINTER :: sac_ae, sac_ppl, sac_lri, &
sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, &
sab_xb, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym
sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym
TYPE(particle_type), DIMENSION(:), OPTIONAL, &
POINTER :: particle_set
TYPE(qs_energy_type), OPTIONAL, POINTER :: energy
@ -791,6 +793,7 @@ CONTAINS
sab_xtbe=sab_xtbe, &
sab_core=sab_core, &
sab_xb=sab_xb, &
sab_xtb_pp=sab_xtb_pp, &
sab_xtb_nonbond=sab_xtb_nonbond, &
sab_almo=sab_almo, &
sab_kp=sab_kp, &

View file

@ -287,8 +287,7 @@ CONTAINS
CALL calculate_dftb_dispersion(qs_env=qs_env, para_env=para_env, &
calculate_forces=.TRUE.)
ELSEIF (dft_control%qs_control%xtb) THEN
CALL build_xtb_matrices(qs_env=qs_env, para_env=para_env, &
calculate_forces=.TRUE.)
CALL build_xtb_matrices(qs_env=qs_env, calculate_forces=.TRUE.)
ELSEIF (perform_ec) THEN
! Calculates core and grid based forces
CALL energy_correction(qs_env, ec_init=.FALSE., calculate_forces=.TRUE.)

View file

@ -73,8 +73,7 @@ CONTAINS
jatom, jkind, mepos, natom, nkind, &
nsto, unit_nr
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of, ngcpat
LOGICAL :: atenergy, atex, atstress, use_virial, &
verbose
LOGICAL :: atenergy, atex, use_virial, verbose
REAL(KIND=dp) :: eama, eamb, egcp, expab, fac, fda, fdb, &
gnorm, nvirta, nvirtb, rcc, sint, sqa, &
sqb
@ -85,7 +84,6 @@ CONTAINS
REAL(KIND=dp), DIMENSION(6, 6) :: sab
REAL(KIND=dp), DIMENSION(6, 6, 3) :: dab
REAL(KIND=dp), DIMENSION(:), POINTER :: atener
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: atstr
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atprop_type), POINTER :: atprop
TYPE(cell_type), POINTER :: cell
@ -125,8 +123,6 @@ CONTAINS
CALL atprop_array_init(atprop%ategcp, natom)
atener => atprop%ategcp
END IF
atstress = atprop%stress
atstr => atprop%atstress
! external atomic energy
atex = .FALSE.
IF (PRESENT(ategcp)) atex = .TRUE.
@ -235,10 +231,6 @@ CONTAINS
IF (use_virial) THEN
CALL virial_pair_force(virial%pv_virial, -1._dp, fdij, rij)
END IF
IF (atstress) THEN
CALL virial_pair_force(atstr(:, :, iatom), -0.5_dp, fdij, rij)
CALL virial_pair_force(atstr(:, :, jatom), -0.5_dp, fdij, rij)
END IF
END IF
IF (atenergy) THEN
atener(iatom) = atener(iatom) + fda*fac

View file

@ -2684,6 +2684,7 @@ CONTAINS
TYPE(dft_control_type), INTENT(IN) :: dft_control
TYPE(section_vals_type), POINTER :: subsys_section
INTEGER :: gfn_type
LOGICAL :: defined
TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter
TYPE(semi_empirical_type), POINTER :: se_parameter
@ -2704,7 +2705,8 @@ CONTAINS
ELSE IF (dft_control%qs_control%xtb) THEN
CALL get_qs_kind(qs_kind, xtb_parameter=xtb_parameter)
CPASSERT(ASSOCIATED(xtb_parameter))
CALL write_xtb_atom_param(xtb_parameter, subsys_section)
gfn_type = dft_control%qs_control%xtb_control%gfn_type
CALL write_xtb_atom_param(xtb_parameter, gfn_type, subsys_section)
END IF
END SUBROUTINE check_qs_kind

View file

@ -133,7 +133,7 @@ MODULE qs_ks_methods
USE smeagol_interface, ONLY: smeagol_shift_v_hartree
USE surface_dipole, ONLY: calc_dipsurf_potential
USE virial_types, ONLY: virial_type
USE xtb_matrices, ONLY: build_xtb_ks_matrix
USE xtb_ks_matrix, ONLY: build_xtb_ks_matrix
#include "./base/base_uses.f90"
IMPLICIT NONE

View file

@ -109,6 +109,7 @@ MODULE qs_ks_types
!> Ewald terms (DFTB)
!> \param sab_core neighbor lists for the calculation of the core interactions
!> \param sab_xb neighbor lists for the calculation of the XB interactions in xTB
!> \param sab_xtb_pp neighbor lists for the calculation of the repulsive interactions in xTB
!> \param sab_xtb_nonbond neighbor lists for the calculation of the nonbonded interactions in xTB
!> \param sab_all neighbor lists for the calculation of the matrix element of
!> non-symmetric operators
@ -143,7 +144,7 @@ MODULE qs_ks_types
! hartree is supposed to contain the hartree potential (for cube output)
! ugly to keep it always around only for a cube output...
TYPE(pw_r3d_rs_type), POINTER :: v_hartree_rspace => Null()
TYPE(pw_r3d_rs_type), POINTER :: v_hartree_rspace => Null()
TYPE(kpoint_transitional_type) :: matrix_ks, &
matrix_s, &
@ -155,18 +156,18 @@ MODULE qs_ks_types
matrix_ks_im, &
matrix_h_im
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p_mp2 => Null(), &
matrix_p_mp2_admm => Null()
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p_mp2 => Null(), &
matrix_p_mp2_admm => Null()
TYPE(qs_rho_type), POINTER :: rho => Null(), &
rho_xc => Null()
TYPE(pw_r3d_rs_type), POINTER :: vppl => Null(), &
rho_nlcc => Null()
TYPE(pw_c1d_gs_type), POINTER :: rho_nlcc_g => Null()
TYPE(pw_r3d_rs_type), POINTER :: vppl => Null(), &
rho_nlcc => Null()
TYPE(pw_c1d_gs_type), POINTER :: rho_nlcc_g => Null()
TYPE(pw_c1d_gs_type), POINTER :: rho_core => NULL()
TYPE(pw_r3d_rs_type), POINTER :: vee => NULL()
TYPE(pw_c1d_gs_type), POINTER :: rho_core => NULL()
TYPE(pw_r3d_rs_type), POINTER :: vee => NULL()
INTEGER :: neighbor_list_id = -1
TYPE(neighbor_list_set_p_type), DIMENSION(:), POINTER :: sab_orb => Null(), &
@ -182,6 +183,7 @@ MODULE qs_ks_types
sab_xtbe => Null(), &
sab_core => Null(), &
sab_xb => Null(), &
sab_xtb_pp => Null(), &
sab_xtb_nonbond => Null(), &
sab_all => Null(), &
sab_lrc => Null(), &
@ -195,7 +197,7 @@ MODULE qs_ks_types
TYPE(kpoint_type), POINTER :: kpoints => Null()
TYPE(qs_subsys_type), POINTER :: subsys => Null()
TYPE(dft_control_type), POINTER :: dft_control => Null()
TYPE(dbcsr_distribution_type), POINTER :: dbcsr_dist => Null()
TYPE(dbcsr_distribution_type), POINTER :: dbcsr_dist => Null()
TYPE(distribution_2d_type), POINTER :: distribution_2d => Null()
TYPE(pw_env_type), POINTER :: pw_env => Null()
TYPE(mp_para_env_type), POINTER :: para_env => Null()
@ -268,6 +270,7 @@ CONTAINS
!> \param sab_tbe ...
!> \param sab_core ...
!> \param sab_xb ...
!> \param sab_xtb_pp ...
!> \param sab_xtb_nonbond ...
!> \param sab_vdw ...
!> \param sab_scp ...
@ -318,8 +321,8 @@ CONTAINS
vppl, rho_core, rho_nlcc, rho_nlcc_g, vee, &
neighbor_list_id, &
sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, &
sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_vdw, sab_scp, &
sab_almo, sab_kp, sab_kp_nosym, &
sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, &
sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, &
task_list, task_list_soft, &
kpoints, do_kpoints, &
atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, &
@ -348,7 +351,7 @@ CONTAINS
INTEGER, OPTIONAL :: neighbor_list_id
TYPE(neighbor_list_set_p_type), DIMENSION(:), OPTIONAL, POINTER :: sab_orb, sab_all, sac_ae, &
sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, &
sab_xb, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym
sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym
TYPE(task_list_type), OPTIONAL, POINTER :: task_list, task_list_soft
TYPE(kpoint_type), OPTIONAL, POINTER :: kpoints
LOGICAL, OPTIONAL :: do_kpoints
@ -438,6 +441,7 @@ CONTAINS
IF (PRESENT(sab_xtbe)) sab_xtbe => ks_env%sab_xtbe
IF (PRESENT(sab_core)) sab_core => ks_env%sab_core
IF (PRESENT(sab_xb)) sab_xb => ks_env%sab_xb
IF (PRESENT(sab_xtb_pp)) sab_xtb_pp => ks_env%sab_xtb_pp
IF (PRESENT(sab_xtb_nonbond)) sab_xtb_nonbond => ks_env%sab_xtb_nonbond
IF (PRESENT(sab_almo)) sab_almo => ks_env%sab_almo
IF (PRESENT(sab_kp)) sab_kp => ks_env%sab_kp
@ -531,6 +535,7 @@ CONTAINS
!> \param sab_tbe ...
!> \param sab_core ...
!> \param sab_xb ...
!> \param sab_xtb_pp ...
!> \param sab_xtb_nonbond ...
!> \param sab_vdw ...
!> \param sab_scp ...
@ -559,8 +564,8 @@ CONTAINS
neighbor_list_id, &
kpoints, &
sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, &
sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_vdw, sab_scp, &
sab_almo, sab_kp, sab_kp_nosym, &
sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, &
sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, &
task_list, task_list_soft, &
subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, &
para_env, blacs_env)
@ -585,7 +590,7 @@ CONTAINS
TYPE(kpoint_type), OPTIONAL, POINTER :: kpoints
TYPE(neighbor_list_set_p_type), DIMENSION(:), OPTIONAL, POINTER :: sab_orb, sab_all, sac_ae, &
sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, &
sab_xb, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym
sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym
TYPE(task_list_type), OPTIONAL, POINTER :: task_list, task_list_soft
TYPE(qs_subsys_type), OPTIONAL, POINTER :: subsys
TYPE(dft_control_type), OPTIONAL, POINTER :: dft_control
@ -656,6 +661,7 @@ CONTAINS
IF (PRESENT(sab_xtbe)) ks_env%sab_xtbe => sab_xtbe
IF (PRESENT(sab_core)) ks_env%sab_core => sab_core
IF (PRESENT(sab_xb)) ks_env%sab_xb => sab_xb
IF (PRESENT(sab_xtb_pp)) ks_env%sab_xtb_pp => sab_xtb_pp
IF (PRESENT(sab_xtb_nonbond)) ks_env%sab_xtb_nonbond => sab_xtb_nonbond
IF (PRESENT(sab_almo)) ks_env%sab_almo => sab_almo
IF (PRESENT(sab_kp)) ks_env%sab_kp => sab_kp
@ -795,6 +801,7 @@ CONTAINS
CALL release_neighbor_list_sets(ks_env%sab_xtbe)
CALL release_neighbor_list_sets(ks_env%sab_core)
CALL release_neighbor_list_sets(ks_env%sab_xb)
CALL release_neighbor_list_sets(ks_env%sab_xtb_pp)
CALL release_neighbor_list_sets(ks_env%sab_xtb_nonbond)
CALL release_neighbor_list_sets(ks_env%sab_all)
CALL release_neighbor_list_sets(ks_env%sab_lrc)
@ -888,6 +895,7 @@ CONTAINS
CALL release_neighbor_list_sets(ks_env%sab_xtbe)
CALL release_neighbor_list_sets(ks_env%sab_core)
CALL release_neighbor_list_sets(ks_env%sab_xb)
CALL release_neighbor_list_sets(ks_env%sab_xtb_pp)
CALL release_neighbor_list_sets(ks_env%sab_xtb_nonbond)
CALL release_neighbor_list_sets(ks_env%sab_all)
CALL release_neighbor_list_sets(ks_env%sab_lrc)

View file

@ -48,8 +48,7 @@ MODULE qs_neighbor_lists
sgp_potential_type
USE input_constants, ONLY: &
dispersion_uff, do_method_lrigpw, do_method_rigpw, do_potential_id, do_potential_short, &
do_potential_truncated, do_se_IS_slater, vdw_pairpot_dftd3, vdw_pairpot_dftd3bj, &
vdw_pairpot_dftd4, xc_vdw_fun_pairpot
do_potential_truncated, do_se_IS_slater, vdw_pairpot_dftd4, xc_vdw_fun_pairpot
USE input_section_types, ONLY: section_vals_get,&
section_vals_get_subs_vals,&
section_vals_type,&
@ -322,8 +321,8 @@ CONTAINS
TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
TYPE(neighbor_list_set_p_type), DIMENSION(:), POINTER :: saa_list, sab_all, sab_almo, &
sab_cn, sab_core, sab_gcp, sab_kp, sab_kp_nosym, sab_lrc, sab_orb, sab_scp, sab_se, &
sab_tbe, sab_vdw, sab_xb, sab_xtb_nonbond, sab_xtbe, sac_ae, sac_lri, sac_ppl, sap_oce, &
sap_ppnl, soa_list, soo_list
sab_tbe, sab_vdw, sab_xb, sab_xtb_nonbond, sab_xtb_pp, sab_xtbe, sac_ae, sac_lri, &
sac_ppl, sap_oce, sap_ppnl, soa_list, soo_list
TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
TYPE(paw_proj_set_type), POINTER :: paw_proj
TYPE(qs_dftb_atom_type), POINTER :: dftb_atom
@ -355,6 +354,7 @@ CONTAINS
NULLIFY (sab_xtbe)
NULLIFY (sab_core)
NULLIFY (sab_xb)
NULLIFY (sab_xtb_pp)
NULLIFY (sab_xtb_nonbond)
NULLIFY (sab_all)
NULLIFY (sab_vdw)
@ -398,6 +398,7 @@ CONTAINS
sab_xtbe=sab_xtbe, &
sab_core=sab_core, &
sab_xb=sab_xb, &
sab_xtb_pp=sab_xtb_pp, &
sab_xtb_nonbond=sab_xtb_nonbond, &
sab_scp=sab_scp, &
sab_all=sab_all, &
@ -783,6 +784,12 @@ CONTAINS
subcells=subcells, nlname="sab_tbe")
CALL set_ks_env(ks_env=ks_env, sab_tbe=sab_tbe)
END IF
! Repulsive Potential
pair_radius(1:nkind, 1:nkind) = dft_control%qs_control%xtb_control%rcpair(1:nkind, 1:nkind)
default_present = .TRUE.
CALL build_neighbor_lists(sab_xtb_pp, particle_set, atom2d, cell, pair_radius, &
subcells=subcells, nlname="sab_xtb_pp")
CALL set_ks_env(ks_env=ks_env, sab_xtb_pp=sab_xtb_pp)
! SR part of Coulomb interaction
DO ikind = 1, nkind
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom)
@ -865,19 +872,16 @@ CONTAINS
subcells=subcells, operator_type="PP", nlname="sab_vdw")
dispersion_env%sab_vdw => sab_vdw
IF (xtb .OR. dispersion_env%pp_type == vdw_pairpot_dftd3 .OR. &
dispersion_env%pp_type == vdw_pairpot_dftd3bj) THEN
! Build the neighbor lists for coordination numbers as needed by the DFT-D3 method
! This is also needed for the xTB Hamiltonian
DO ikind = 1, nkind
CALL get_atomic_kind(atomic_kind_set(ikind), z=zat)
c_radius(ikind) = 4._dp*ptable(zat)%covalent_radius*bohr
END DO
CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
CALL build_neighbor_lists(sab_cn, particle_set, atom2d, cell, pair_radius, &
subcells=subcells, operator_type="PP", nlname="sab_cn")
dispersion_env%sab_cn => sab_cn
END IF
! Build the neighbor lists for coordination numbers as needed by the DFT-D3/D4 method
! This is also needed for the xTB Hamiltonian
DO ikind = 1, nkind
CALL get_atomic_kind(atomic_kind_set(ikind), z=zat)
c_radius(ikind) = 4._dp*ptable(zat)%covalent_radius*bohr
END DO
CALL pair_radius_setup(default_present, default_present, c_radius, c_radius, pair_radius)
CALL build_neighbor_lists(sab_cn, particle_set, atom2d, cell, pair_radius, &
subcells=subcells, operator_type="PP", nlname="sab_cn")
dispersion_env%sab_cn => sab_cn
END IF
! Build the neighbor lists for the gCP pair potential

View file

@ -304,14 +304,13 @@ CONTAINS
energy%total = energy%total + energy%band + energy%qmmm_el
WRITE (UNIT=iounit, FMT="(/,T2,A,T40,A,F10.2,T61,F20.10)") &
"Diagonalization", "Time:", tdiag, energy%total
CPASSERT(dft_control%qs_control%xtb_control%gfn_type == 0)
WRITE (UNIT=iounit, FMT="((T3,A,T56,F25.14))") &
"Core Hamiltonian energy: ", energy%core, &
"Repulsive potential energy: ", energy%repulsive, &
"Electronic energy: ", energy%hartree, &
"SRB Correction energy: ", energy%srb, &
"Charge equilibration energy: ", energy%eeq, &
"Dispersion energy: ", energy%dispersion
IF (dft_control%qs_control%xtb_control%xb_interaction) &
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
"Correction for halogen bonding: ", energy%xtb_xb_inter
IF (dft_control%qs_control%xtb_control%do_nonbonded) &
WRITE (UNIT=iounit, FMT="(T3,A,T56,F25.14)") &
"Correction for nonbonded interactions: ", energy%xtb_nonbonded
@ -336,12 +335,8 @@ CONTAINS
END IF
END IF
IF (dft_control%qs_control%semi_empirical) THEN
CPABORT("NONSCF not available")
ELSEIF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb) THEN
WRITE (UNIT=iounit, FMT="(/,(T3,A,T56,F25.14))") &
"Total energy: ", energy%total
END IF
WRITE (UNIT=iounit, FMT="(/,(T3,A,T56,F25.14))") &
"Total energy: ", energy%total
CALL m_flush(iounit)
END IF

View file

@ -61,26 +61,28 @@ MODULE qs_rho_types
! **************************************************************************************************
TYPE qs_rho_type
PRIVATE
TYPE(kpoint_transitional_type) :: rho_ao = kpoint_transitional_type()
TYPE(kpoint_transitional_type) :: rho_ao_im = kpoint_transitional_type()
TYPE(kpoint_transitional_type) :: rho_ao = kpoint_transitional_type()
TYPE(kpoint_transitional_type) :: rho_ao_im = kpoint_transitional_type()
TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r => Null()
TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g => Null()
TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: tau_r => Null()
TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: tau_g => Null()
TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER :: drho_r => NULL()
TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER :: drho_g => NULL()
TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g => Null()
TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: tau_r => Null()
TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: tau_g => Null()
TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER :: drho_r => NULL()
TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER :: drho_g => NULL()
! Final rho_iter of last SCCS cycle (r-space)
TYPE(pw_r3d_rs_type), POINTER :: rho_r_sccs => Null()
LOGICAL :: rho_g_valid = .FALSE., &
rho_r_valid = .FALSE., &
drho_r_valid = .FALSE., &
drho_g_valid = .FALSE., &
tau_r_valid = .FALSE., &
tau_g_valid = .FALSE., &
soft_valid = .FALSE., &
complex_rho_ao = .FALSE.
REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_r => Null(), &
tot_rho_g => Null()
!
LOGICAL :: rho_g_valid = .FALSE., &
rho_r_valid = .FALSE., &
drho_r_valid = .FALSE., &
drho_g_valid = .FALSE., &
tau_r_valid = .FALSE., &
tau_g_valid = .FALSE., &
soft_valid = .FALSE., &
complex_rho_ao = .FALSE.
!
REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_r => Null(), &
tot_rho_g => Null()
END TYPE qs_rho_type
! **************************************************************************************************
@ -175,10 +177,8 @@ CONTAINS
CALL kpoint_transitional_release(rho_struct%rho_ao_im)
IF (ASSOCIATED(rho_struct%tot_rho_r)) &
DEALLOCATE (rho_struct%tot_rho_r)
IF (ASSOCIATED(rho_struct%tot_rho_g)) &
DEALLOCATE (rho_struct%tot_rho_g)
IF (ASSOCIATED(rho_struct%tot_rho_r)) DEALLOCATE (rho_struct%tot_rho_r)
IF (ASSOCIATED(rho_struct%tot_rho_g)) DEALLOCATE (rho_struct%tot_rho_g)
END SUBROUTINE qs_rho_clear

View file

@ -670,15 +670,28 @@ CONTAINS
WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
"Electric field interaction energy: ", energy%efield
ELSEIF (dft_control%qs_control%xtb) THEN
WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
"Core Hamiltonian energy: ", energy%core, &
"Repulsive potential energy: ", energy%repulsive, &
"Electronic energy: ", energy%hartree, &
"DFTB3 3rd order energy: ", energy%dftb3, &
"Dispersion energy: ", energy%dispersion
IF (dft_control%qs_control%xtb_control%xb_interaction) &
WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
"Correction for halogen bonding: ", energy%xtb_xb_inter
IF (dft_control%qs_control%xtb_control%gfn_type == 0) THEN
WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
"Core Hamiltonian energy: ", energy%core, &
"Repulsive potential energy: ", energy%repulsive, &
"SRB Correction energy: ", energy%srb, &
"Charge equilibration energy: ", energy%eeq, &
"Dispersion energy: ", energy%dispersion
ELSEIF (dft_control%qs_control%xtb_control%gfn_type == 1) THEN
WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
"Core Hamiltonian energy: ", energy%core, &
"Repulsive potential energy: ", energy%repulsive, &
"Electronic energy: ", energy%hartree, &
"DFTB3 3rd order energy: ", energy%dftb3, &
"Dispersion energy: ", energy%dispersion
IF (dft_control%qs_control%xtb_control%xb_interaction) &
WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
"Correction for halogen bonding: ", energy%xtb_xb_inter
ELSEIF (dft_control%qs_control%xtb_control%gfn_type == 2) THEN
CPABORT("gfn_typ 2 NYA")
ELSE
CPABORT("invalid gfn_typ")
END IF
IF (dft_control%qs_control%xtb_control%do_nonbonded) &
WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
"Correction for nonbonded interactions: ", energy%xtb_nonbonded

View file

@ -54,6 +54,7 @@ MODULE qs_scf_post_gpw
USE cp_realspace_grid_cube, ONLY: cp_pw_to_cube
USE dct, ONLY: pw_shrink
USE ed_analysis, ONLY: edmf_analysis
USE eeq_method, ONLY: eeq_print
USE et_coupling_types, ONLY: set_et_coupling_type
USE hfx_ri, ONLY: print_ri_hfx
USE hirshfeld_methods, ONLY: comp_hirshfeld_charges,&
@ -2662,6 +2663,15 @@ CONTAINS
END IF
END IF
! Compute EEQ charges
print_key => section_vals_get_subs_vals(input, "DFT%PRINT%EEQ_CHARGES")
IF (BTEST(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
unit_nr = cp_print_key_unit_nr(logger, input, "DFT%PRINT%EEQ_CHARGES", extension=".eeq", log_filename=.FALSE.)
print_level = 1
CALL eeq_print(qs_env, unit_nr, print_level)
CALL cp_print_key_finished_output(unit_nr, logger, input, "DFT%PRINT%MULLIKEN")
END IF
! Do a Voronoi Integration or write a compressed BQB File
print_key_voro => section_vals_get_subs_vals(input, "DFT%PRINT%VORONOI")
print_key_bqb => section_vals_get_subs_vals(input, "DFT%PRINT%E_DENSITY_BQB")

View file

@ -35,6 +35,7 @@ MODULE qs_scf_post_se
USE cp_result_methods, ONLY: cp_results_erase,&
put_results
USE cp_result_types, ONLY: cp_result_type
USE eeq_method, ONLY: eeq_print
USE input_section_types, ONLY: section_get_ival,&
section_vals_get,&
section_vals_get_subs_vals,&
@ -560,6 +561,15 @@ CONTAINS
DEALLOCATE (charges, mcharge)
END IF
! EEQ Charges
print_key => section_vals_get_subs_vals(input, "DFT%PRINT%EEQ_CHARGES")
IF (BTEST(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
unit_nr = cp_print_key_unit_nr(logger, input, "DFT%PRINT%EEQ_CHARGES", &
extension=".eeq", log_filename=.FALSE.)
CALL eeq_print(qs_env, unit_nr, print_level=1)
CALL cp_print_key_finished_output(unit_nr, logger, print_key)
END IF
! Compute the Lowdin charges
print_key => section_vals_get_subs_vals(input, "DFT%PRINT%LOWDIN")
IF (BTEST(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN

View file

@ -48,6 +48,9 @@ MODULE qs_scf_post_tb
USE cp_result_methods, ONLY: cp_results_erase,&
put_results
USE cp_result_types, ONLY: cp_result_type
USE eeq_input, ONLY: eeq_solver_type
USE eeq_method, ONLY: eeq_charges,&
eeq_print
USE input_constants, ONLY: ot_precond_full_all
USE input_section_types, ONLY: section_get_ival,&
section_get_ivals,&
@ -170,18 +173,17 @@ CONTAINS
CHARACTER(LEN=6) :: ana
CHARACTER(LEN=default_string_length) :: aname
INTEGER :: after, handle, homo, iat, iatom, ikind, &
img, ispin, iw, nat, natom, nkind, &
nlumo_stm, nlumos, nspins, &
print_level, unit_nr
INTEGER :: after, enshift_type, handle, homo, iat, iatom, ikind, img, ispin, iw, nat, natom, &
nkind, nlumo_stm, nlumos, nspins, print_level, unit_nr
LOGICAL :: do_cube, do_kpoints, explicit, has_homo, &
omit_headers, print_it, rebuild
REAL(KIND=dp) :: zeff
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: mcharge
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: echarge, mcharge
REAL(KIND=dp), DIMENSION(2, 2) :: homo_lumo
REAL(KIND=dp), DIMENSION(:), POINTER :: mo_eigenvalues
REAL(KIND=dp), DIMENSION(:, :), POINTER :: charges
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(cell_type), POINTER :: cell
TYPE(cp_1d_r_p_type), DIMENSION(:), POINTER :: unoccupied_evals_stm
TYPE(cp_fm_type), DIMENSION(:), POINTER :: unoccupied_orbs_stm
TYPE(cp_fm_type), POINTER :: mo_coeff
@ -190,6 +192,7 @@ CONTAINS
TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_ks, matrix_p, matrix_s
TYPE(dbcsr_type), POINTER :: mo_coeff_deriv
TYPE(dft_control_type), POINTER :: dft_control
TYPE(eeq_solver_type) :: eeq_sparam
TYPE(kpoint_type), POINTER :: kpoints
TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
TYPE(mp_para_env_type), POINTER :: para_env
@ -337,6 +340,15 @@ CONTAINS
END SELECT
END IF
! EEQ Charges
print_key => section_vals_get_subs_vals(print_section, "EEQ_CHARGES")
IF (BTEST(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
unit_nr = cp_print_key_unit_nr(logger, print_section, "EEQ_CHARGES", &
extension=".eeq", log_filename=.FALSE.)
CALL eeq_print(qs_env, unit_nr, print_level)
CALL cp_print_key_finished_output(unit_nr, logger, print_key)
END IF
! Hirshfeld
print_key => section_vals_get_subs_vals(print_section, "HIRSHFELD")
CALL section_vals_get(print_key, explicit=explicit)
@ -370,7 +382,21 @@ CONTAINS
unit_nr = cp_print_key_unit_nr(logger, print_section, "MOMENTS", &
extension=".data", middle_name="tb_dipole", log_filename=.FALSE.)
moments_section => section_vals_get_subs_vals(print_section, "MOMENTS")
CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
IF (tb_type == "xTB" .AND. dft_control%qs_control%xtb_control%gfn_type == 0) THEN
enshift_type = dft_control%qs_control%xtb_control%enshift_type
IF (enshift_type == 0) THEN
CALL get_qs_env(qs_env, cell=cell)
enshift_type = 1
IF (.NOT. ALL(cell%perd == 0)) enshift_type = 2
END IF
ALLOCATE (echarge(natom))
echarge = 0.0_dp
CALL eeq_charges(qs_env, echarge, eeq_sparam, 1, enshift_type)
CALL tb_dipole(qs_env, moments_section, unit_nr, echarge)
DEALLOCATE (echarge)
ELSE
CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
END IF
CALL cp_print_key_finished_output(unit_nr, logger, print_key)
END IF

View file

@ -66,8 +66,8 @@ MODULE qs_tddfpt2_fprint
response_force,&
response_force_xtb
USE ri_environment_methods, ONLY: build_ri_matrices
USE xtb_matrices, ONLY: build_xtb_ks_matrix,&
build_xtb_matrices
USE xtb_ks_matrix, ONLY: build_xtb_ks_matrix
USE xtb_matrices, ONLY: build_xtb_matrices
#include "./base/base_uses.f90"
IMPLICIT NONE
@ -332,8 +332,7 @@ CONTAINS
ELSEIF (dft_control%qs_control%dftb) THEN
CPABORT("TDDFPT| DFTB not available")
ELSEIF (dft_control%qs_control%xtb) THEN
CALL build_xtb_matrices(qs_env=qs_env, para_env=para_env, &
calculate_forces=.TRUE.)
CALL build_xtb_matrices(qs_env=qs_env, calculate_forces=.TRUE.)
CALL build_xtb_ks_matrix(qs_env, calculate_forces=.TRUE., just_energy=.FALSE.)
ELSE
CALL build_core_hamiltonian_matrix(qs_env=qs_env, calculate_forces=.TRUE.)

View file

@ -68,7 +68,7 @@ MODULE qs_tddfpt2_utils
USE qs_tddfpt2_types, ONLY: tddfpt_ground_state_mos
USE util, ONLY: sort
USE xc_pot_saop, ONLY: add_saop_pot
USE xtb_matrices, ONLY: build_xtb_ks_matrix
USE xtb_ks_matrix, ONLY: build_xtb_ks_matrix
#include "./base/base_uses.f90"
IMPLICIT NONE

View file

@ -147,7 +147,7 @@ MODULE response_solver
USE virial_types, ONLY: virial_type
USE xtb_ehess, ONLY: xtb_coulomb_hessian
USE xtb_ehess_force, ONLY: calc_xtb_ehess_force
USE xtb_matrices, ONLY: xtb_hab_force
USE xtb_hab_force, ONLY: build_xtb_hab_force
USE xtb_types, ONLY: get_xtb_atom_param,&
xtb_atom_type
#include "./base/base_uses.f90"
@ -2606,7 +2606,7 @@ CONTAINS
END IF
! Hcore matrix
IF (debug_forces) fodeb(1:3) = force(1)%all_potential(1:3, 1)
CALL xtb_hab_force(qs_env, mpa(1)%matrix)
CALL build_xtb_hab_force(qs_env, mpa(1)%matrix)
IF (debug_forces) THEN
fodeb(1:3) = force(1)%all_potential(1:3, 1) - fodeb(1:3)
CALL para_env%sum(fodeb)

View file

@ -136,6 +136,7 @@ MODULE scf_control_types
use_cholesky = .FALSE., use_ot = .FALSE., &
use_diag = .FALSE., do_outer_scf_reortho = .FALSE., &
ignore_convergence_failure = .FALSE.
LOGICAL :: force_scf_calculation = .FALSE.
LOGICAL :: non_selfconsistent = .FALSE.
INTEGER, DIMENSION(2) :: added_mos = -1
INTEGER :: roks_scheme = -1
@ -185,6 +186,7 @@ CONTAINS
scf_control%do_diag_sub = .FALSE.
scf_control%use_ot = .FALSE.
scf_control%ignore_convergence_failure = .FALSE.
scf_control%force_scf_calculation = .FALSE.
scf_control%do_outer_scf_reortho = .TRUE.
scf_control%max_diis = 4
scf_control%eps_diis = 0.1_dp
@ -348,6 +350,7 @@ CONTAINS
scf_control%use_cholesky = .TRUE.
END IF
CALL section_vals_val_get(scf_section, "IGNORE_CONVERGENCE_FAILURE", l_val=scf_control%ignore_convergence_failure)
CALL section_vals_val_get(scf_section, "FORCE_SCF_CALCULATION", l_val=scf_control%force_scf_calculation)
CALL section_vals_val_get(scf_section, "eps_scf", r_val=scf_control%eps_scf)
CALL section_vals_val_get(scf_section, "level_shift", r_val=scf_control%level_shift)
CALL section_vals_val_get(scf_section, "max_diis", i_val=scf_control%max_diis)
@ -565,7 +568,7 @@ CONTAINS
keyword => section_get_keyword(section, "SCF_GUESS")
CALL keyword_get(keyword, enum=enum)
IF (.NOT. scf_control%non_selfconsistent) THEN
IF (.NOT. scf_control%non_selfconsistent .OR. scf_control%force_scf_calculation) THEN
WRITE (UNIT=output_unit, &
FMT="(/,/,T2,A,T25,A,T51,A30,/,T25,56('-'),3(/,T25,A,T76,I5),/, "// &
"T25,56('-'),4(/,T25,A,T72,ES9.2),/,T25,56('-'), "// &

View file

@ -27,15 +27,14 @@ MODULE spme
ewald_pw_type
USE kinds, ONLY: dp
USE mathconstants, ONLY: fourpi
USE message_passing, ONLY: mp_comm_type
USE message_passing, ONLY: mp_comm_type,&
mp_para_env_type
USE particle_types, ONLY: particle_type
USE pme_tools, ONLY: get_center,&
set_list
USE pw_grid_types, ONLY: pw_grid_type
USE pw_grids, ONLY: get_pw_grid_info
USE pw_methods, ONLY: pw_copy,&
pw_derive,&
pw_integral_a2b,&
USE pw_methods, ONLY: pw_integral_a2b,&
pw_multiply_with,&
pw_transfer
USE pw_poisson_methods, ONLY: pw_poisson_rebuild,&
@ -61,7 +60,7 @@ MODULE spme
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'spme'
PRIVATE
PUBLIC :: spme_evaluate, spme_potential, spme_forces, get_patch
PUBLIC :: spme_evaluate, spme_potential, spme_forces, spme_virial, get_patch
INTERFACE get_patch
MODULE PROCEDURE get_patch_a, get_patch_b
@ -110,12 +109,12 @@ CONTAINS
CHARACTER(len=*), PARAMETER :: routineN = 'spme_evaluate'
INTEGER :: handle, i, ig, ipart, j, n, ncore, &
npart, nshell, o_spline, p1, p1_shell
INTEGER :: handle, i, ipart, j, n, ncore, npart, &
nshell, o_spline, p1, p1_shell
INTEGER, ALLOCATABLE, DIMENSION(:, :) :: center, core_center, shell_center
INTEGER, DIMENSION(3) :: nd, npts
INTEGER, DIMENSION(3) :: npts
LOGICAL :: do_shell
REAL(KIND=dp) :: alpha, dvols, fat1, ffa, ffb
REAL(KIND=dp) :: alpha, dvols, fat1, ffa
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: core_delta, delta, shell_delta
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: rhos
REAL(KIND=dp), DIMENSION(3) :: fat
@ -240,8 +239,8 @@ CONTAINS
h_stress)
!---------- END OF ELECTROSTATIC CALCULATION --------
! Atomic Energy and Stress
IF (atprop%energy .OR. atprop%stress) THEN
! Atomic Energy
IF (atprop%energy) THEN
ALLOCATE (rpot)
CALL rs_grid_create(rpot, rs_desc)
CALL rs_grid_set_box(grid_spme, rs=rpot)
@ -262,11 +261,6 @@ CONTAINS
IF (atprop%energy) THEN
atprop%atener(p1) = atprop%atener(p1) + 0.5_dp*fat1*dvols
END IF
IF (atprop%stress) THEN
atprop%atstress(1, 1, p1) = atprop%atstress(1, 1, p1) + 0.5_dp*fat1*dvols
atprop%atstress(2, 2, p1) = atprop%atstress(2, 2, p1) + 0.5_dp*fat1*dvols
atprop%atstress(3, 3, p1) = atprop%atstress(3, 3, p1) + 0.5_dp*fat1*dvols
END IF
END DO
! Core-shell model
IF (PRESENT(shell_particle_set) .AND. PRESENT(core_particle_set)) THEN
@ -295,40 +289,6 @@ CONTAINS
END IF
END DO
END IF
IF (atprop%stress) THEN
ffa = (0.5_dp/alpha)**2
ffb = 1.0_dp/fourpi
DO i = 1, 3
DO ig = grid_spme%first_gne0, grid_spme%ngpts_cut_local
phi_g%array(ig) = ffb*dphi_g(i)%array(ig)*(ffa*grid_spme%gsq(ig) + 1.0_dp)
phi_g%array(ig) = phi_g%array(ig)*poisson_env%green_fft%influence_fn%array(ig)
END DO
IF (grid_spme%have_g0) phi_g%array(1) = 0.0_dp
DO j = 1, i
nd = 0
nd(j) = 1
CALL pw_copy(phi_g, rhob_g)
CALL pw_derive(rhob_g, nd)
CALL pw_multiply_with(rhob_g, green%p3m_charge)
CALL pw_transfer(rhob_g, rhob_r)
CALL transfer_pw2rs(rpot, rhob_r)
ipart = 0
DO
CALL set_list(particle_set, npart, center, p1, rden, ipart)
IF (p1 == 0) EXIT
! calculate function on small boxes
CALL get_patch(particle_set, delta, green, p1, rhos, &
is_core=.FALSE., is_shell=.FALSE., unit_charge=.FALSE., charges=charges)
! integrate box and potential
CALL dg_sum_patch_force_1d(rpot, rhos, center(:, p1), fat1)
atprop%atstress(i, j, p1) = atprop%atstress(i, j, p1) + fat1*dvols
IF (i /= j) atprop%atstress(j, i, p1) = atprop%atstress(j, i, p1) + fat1*dvols
END DO
END DO
END DO
END IF
CALL rs_grid_release(rpot)
DEALLOCATE (rpot)
END IF
@ -746,6 +706,155 @@ CONTAINS
END SUBROUTINE spme_forces
! **************************************************************************************************
!> \brief Internal Virial for 1/2 [rho||rho] (rho=mcharge)
!> \param ewald_env ...
!> \param ewald_pw ...
!> \param particle_set ...
!> \param box ...
!> \param mcharge ...
!> \param virial ...
! **************************************************************************************************
SUBROUTINE spme_virial(ewald_env, ewald_pw, particle_set, box, mcharge, virial)
TYPE(ewald_environment_type), POINTER :: ewald_env
TYPE(ewald_pw_type), POINTER :: ewald_pw
TYPE(particle_type), DIMENSION(:), INTENT(IN) :: particle_set
TYPE(cell_type), POINTER :: box
REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: mcharge
REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT) :: virial
CHARACTER(len=*), PARAMETER :: routineN = 'spme_virial'
INTEGER :: handle, i, ipart, j, n, npart, o_spline, &
p1
INTEGER, ALLOCATABLE, DIMENSION(:, :) :: center
INTEGER, DIMENSION(3) :: npts
REAL(KIND=dp) :: alpha, dvols, ffa, vgc
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: delta
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: rhos
REAL(KIND=dp), DIMENSION(3, 3) :: f_stress, h_stress
TYPE(greens_fn_type), POINTER :: green
TYPE(mp_comm_type) :: group
TYPE(mp_para_env_type), POINTER :: para_env
TYPE(pw_c1d_gs_type), DIMENSION(3) :: dphi_g
TYPE(pw_c1d_gs_type), POINTER :: phi_g, rhob_g
TYPE(pw_grid_type), POINTER :: grid_spme
TYPE(pw_poisson_type), POINTER :: poisson_env
TYPE(pw_pool_type), POINTER :: pw_pool
TYPE(pw_r3d_rs_type), POINTER :: rhob_r
TYPE(realspace_grid_desc_type), POINTER :: rs_desc
TYPE(realspace_grid_type) :: rden, rpot
CALL timeset(routineN, handle)
!-------------- INITIALISATION ---------------------
virial = 0.0_dp
CALL ewald_env_get(ewald_env, alpha=alpha, o_spline=o_spline, group=group, &
para_env=para_env)
NULLIFY (green, poisson_env, pw_pool)
CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, rs_desc=rs_desc, &
poisson_env=poisson_env)
CALL pw_poisson_rebuild(poisson_env)
green => poisson_env%green_fft
grid_spme => pw_pool%pw_grid
CALL get_pw_grid_info(grid_spme, dvol=dvols, npts=npts)
npart = SIZE(particle_set)
n = o_spline
ALLOCATE (rhos(n, n, n))
CALL rs_grid_create(rden, rs_desc)
CALL rs_grid_set_box(grid_spme, rs=rden)
CALL rs_grid_zero(rden)
ALLOCATE (center(3, npart), delta(3, npart))
CALL get_center(particle_set, box, center, delta, npts, n)
!-------------- DENSITY CALCULATION ----------------
ipart = 0
DO
CALL set_list(particle_set, npart, center, p1, rden, ipart)
IF (p1 == 0) EXIT
! calculate function on small boxes
CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.FALSE., &
is_shell=.FALSE., unit_charge=.TRUE.)
rhos(:, :, :) = rhos(:, :, :)*mcharge(p1)
! add boxes to real space grid (big box)
CALL dg_sum_patch(rden, rhos, center(:, p1))
END DO
NULLIFY (rhob_r)
ALLOCATE (rhob_r)
CALL pw_pool%create_pw(rhob_r)
CALL transfer_rs2pw(rden, rhob_r)
! transform density to G space and add charge function
NULLIFY (rhob_g)
ALLOCATE (rhob_g)
CALL pw_pool%create_pw(rhob_g)
CALL pw_transfer(rhob_r, rhob_g)
! update charge function
CALL pw_multiply_with(rhob_g, green%p3m_charge)
!-------------- ELECTROSTATIC CALCULATION -----------
! allocate intermediate arrays
DO i = 1, 3
CALL pw_pool%create_pw(dphi_g(i))
END DO
NULLIFY (phi_g)
ALLOCATE (phi_g)
CALL pw_pool%create_pw(phi_g)
CALL pw_poisson_solve(poisson_env, rhob_g, vgc, phi_g, dphi_g, h_stress=h_stress)
CALL rs_grid_create(rpot, rs_desc)
CALL rs_grid_set_box(grid_spme, rs=rpot)
CALL pw_pool%give_back_pw(rhob_g)
DEALLOCATE (rhob_g)
CALL rs_grid_zero(rpot)
CALL pw_multiply_with(phi_g, green%p3m_charge)
CALL pw_transfer(phi_g, rhob_r)
CALL pw_pool%give_back_pw(phi_g)
DEALLOCATE (phi_g)
CALL transfer_pw2rs(rpot, rhob_r)
!---------- END OF ELECTROSTATIC CALCULATION --------
!------------- STRESS TENSOR CALCULATION ------------
DO i = 1, 3
DO j = i, 3
f_stress(i, j) = pw_integral_a2b(dphi_g(i), dphi_g(j))
f_stress(j, i) = f_stress(i, j)
END DO
END DO
ffa = (1.0_dp/fourpi)*(0.5_dp/alpha)**2
virial = virial - (ffa*f_stress - h_stress)/REAL(para_env%num_pe, dp)
!--------END OF STRESS TENSOR CALCULATION -----------
DO i = 1, 3
CALL pw_pool%give_back_pw(dphi_g(i))
END DO
CALL pw_pool%give_back_pw(rhob_r)
DEALLOCATE (rhob_r)
CALL rs_grid_release(rden)
CALL rs_grid_release(rpot)
DEALLOCATE (rhos)
DEALLOCATE (center, delta)
CALL timestop(handle)
END SUBROUTINE spme_virial
! **************************************************************************************************
!> \brief Calculates local density in a small box
!> \param part ...

View file

@ -30,7 +30,6 @@ MODULE atprop_types
! **************************************************************************************************
TYPE atprop_type
LOGICAL :: energy = .FALSE.
LOGICAL :: stress = .FALSE.
REAL(KIND=dp), DIMENSION(:), POINTER :: atener => NULL()
REAL(KIND=dp), DIMENSION(:), POINTER :: ateb => NULL()
REAL(KIND=dp), DIMENSION(:), POINTER :: atexc => NULL()
@ -40,7 +39,6 @@ MODULE atprop_types
REAL(KIND=dp), DIMENSION(:), POINTER :: atecc => NULL()
REAL(KIND=dp), DIMENSION(:), POINTER :: ate1c => NULL()
REAL(KIND=dp), DIMENSION(:), POINTER :: atecoul => NULL()
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: atstress => NULL()
END TYPE atprop_type
CONTAINS
@ -78,15 +76,6 @@ CONTAINS
CALL atprop_array_release(atprop_env%ate1c)
END IF
IF (atprop_env%stress) THEN
IF (ASSOCIATED(atprop_env%atstress)) THEN
CPASSERT(SIZE(atprop_env%atstress, 3) == natom)
ELSE
ALLOCATE (atprop_env%atstress(3, 3, natom))
END IF
atprop_env%atstress = 0._dp
END IF
END SUBROUTINE atprop_init
! **************************************************************************************************
@ -154,10 +143,6 @@ CONTAINS
CALL atprop_array_release(atprop_env%atecc)
CALL atprop_array_release(atprop_env%ate1c)
CALL atprop_array_release(atprop_env%atecoul)
! stress
IF (ASSOCIATED(atprop_env%atstress)) THEN
DEALLOCATE (atprop_env%atstress)
END IF
! atprop type
DEALLOCATE (atprop_env)
END IF

View file

@ -201,11 +201,7 @@ CONTAINS
! loop over all atom pairs (sab_xtbe)
kg = xtb_control%kg
NULLIFY (n_list)
IF (xtb_control%old_coulomb_damping) THEN
CALL get_qs_env(qs_env=qs_env, sab_orb=n_list)
ELSE
CALL get_qs_env(qs_env=qs_env, sab_xtbe=n_list)
END IF
CALL get_qs_env(qs_env=qs_env, sab_xtbe=n_list)
CALL neighbor_list_iterator_create(nl_iterator, n_list)
DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
@ -249,10 +245,6 @@ CONTAINS
fi = 1.0_dp
IF (iatom == jatom) fi = 0.5_dp
CALL virial_pair_force(virial%pv_virial, fi, fij, rij)
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, iatom), fi*0.5_dp, fij, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), fi*0.5_dp, fij, rij)
END IF
END IF
END IF
END IF
@ -272,21 +264,19 @@ CONTAINS
CALL get_cell(cell=cell, periodic=periodic, deth=deth)
CALL ewald_env_get(ewald_env, alpha=alpha, ewald_type=ewald_type)
CALL get_qs_env(qs_env=qs_env, sab_tbe=n_list)
CALL tb_ewald_overlap(gmcharge, mcharge, alpha, n_list, virial, &
use_virial, atprop=atprop)
CALL tb_ewald_overlap(gmcharge, mcharge, alpha, n_list, virial, use_virial)
SELECT CASE (ewald_type)
CASE DEFAULT
CPABORT("Invalid Ewald type")
CASE (do_ewald_none)
CPABORT("Not allowed with DFTB")
CPABORT("Not allowed with xTB/DFTB")
CASE (do_ewald_ewald)
CPABORT("Standard Ewald not implemented in DFTB")
CPABORT("Standard Ewald not implemented in xTB/DFTB")
CASE (do_ewald_pme)
CPABORT("PME not implemented in DFTB")
CPABORT("PME not implemented in xTB/DFTB")
CASE (do_ewald_spme)
CALL tb_spme_evaluate(ewald_env, ewald_pw, particle_set, cell, &
gmcharge, mcharge, calculate_forces, virial, &
use_virial, atprop=atprop)
gmcharge, mcharge, calculate_forces, virial, use_virial)
END SELECT
ELSE
! direct sum
@ -525,10 +515,6 @@ CONTAINS
fi = 1.0_dp
IF (iatom == jatom) fi = 0.5_dp
CALL virial_pair_force(virial%pv_virial, fi, fij, rij)
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, iatom), fi*0.5_dp, fij, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), fi*0.5_dp, fij, rij)
END IF
END IF
END DO
END DO
@ -620,10 +606,6 @@ CONTAINS
fi = 1.0_dp
IF (iatom == jatom) fi = 0.5_dp
CALL virial_pair_force(virial%pv_virial, fi, fij, rij)
IF (atprop%stress) THEN
CALL virial_pair_force(atprop%atstress(:, :, iatom), fi*0.5_dp, fij, rij)
CALL virial_pair_force(atprop%atstress(:, :, jatom), fi*0.5_dp, fij, rij)
END IF
END IF
END IF
END IF

491
src/xtb_eeq.F Normal file
View file

@ -0,0 +1,491 @@
!--------------------------------------------------------------------------------------------------!
! CP2K: A general program to perform molecular dynamics simulations !
! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
! !
! SPDX-License-Identifier: GPL-2.0-or-later !
!--------------------------------------------------------------------------------------------------!
! **************************************************************************************************
!> \brief Calculation of charge equilibration in xTB
!> \author JGH
! **************************************************************************************************
MODULE xtb_eeq
USE atomic_kind_types, ONLY: atomic_kind_type,&
get_atomic_kind_set
USE atprop_types, ONLY: atprop_array_init,&
atprop_type
USE cell_types, ONLY: cell_type,&
pbc
USE cp_blacs_env, ONLY: cp_blacs_env_type
USE cp_control_types, ONLY: dft_control_type,&
xtb_control_type
USE cp_log_handling, ONLY: cp_logger_get_default_unit_nr
USE distribution_1d_types, ONLY: distribution_1d_type
USE eeq_input, ONLY: eeq_solver_type
USE eeq_method, ONLY: eeq_efield_energy,&
eeq_efield_force_loc,&
eeq_efield_force_periodic,&
eeq_efield_pot,&
eeq_solver
USE ewald_environment_types, ONLY: ewald_env_get,&
ewald_environment_type
USE ewald_pw_types, ONLY: ewald_pw_type
USE kinds, ONLY: dp
USE mathconstants, ONLY: oorootpi
USE message_passing, ONLY: mp_para_env_type
USE particle_types, ONLY: particle_type
USE qs_dispersion_cnum, ONLY: dcnum_type
USE qs_environment_types, ONLY: get_qs_env,&
qs_environment_type
USE qs_force_types, ONLY: qs_force_type
USE qs_kind_types, ONLY: get_qs_kind,&
qs_kind_type
USE qs_neighbor_list_types, ONLY: get_iterator_info,&
neighbor_list_iterate,&
neighbor_list_iterator_create,&
neighbor_list_iterator_p_type,&
neighbor_list_iterator_release,&
neighbor_list_set_p_type
USE spme, ONLY: spme_forces,&
spme_virial
USE virial_methods, ONLY: virial_pair_force
USE virial_types, ONLY: virial_type
USE xtb_types, ONLY: get_xtb_atom_param,&
xtb_atom_type
#include "./base/base_uses.f90"
IMPLICIT NONE
PRIVATE
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_eeq'
PUBLIC :: xtb_eeq_calculation, xtb_eeq_forces
CONTAINS
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param charges ...
!> \param cnumbers ...
!> \param eeq_sparam ...
!> \param eeq_energy ...
!> \param ef_energy ...
!> \param lambda ...
! **************************************************************************************************
SUBROUTINE xtb_eeq_calculation(qs_env, charges, cnumbers, &
eeq_sparam, eeq_energy, ef_energy, lambda)
TYPE(qs_environment_type), POINTER :: qs_env
REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: charges
REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: cnumbers
TYPE(eeq_solver_type), INTENT(IN) :: eeq_sparam
REAL(KIND=dp), INTENT(INOUT) :: eeq_energy, ef_energy, lambda
CHARACTER(len=*), PARAMETER :: routineN = 'xtb_eeq_calculation'
INTEGER :: enshift_type, handle, iatom, ikind, &
iunit, jkind, natom, nkind
INTEGER, ALLOCATABLE, DIMENSION(:) :: kind_of
LOGICAL :: defined, do_ewald
REAL(KIND=dp) :: ala, alb, cn, esg, gama, kappa, scn, &
sgamma, totalcharge, xi
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: chia, efr, gam
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: gab
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atprop_type), POINTER :: atprop
TYPE(cell_type), POINTER :: cell
TYPE(cp_blacs_env_type), POINTER :: blacs_env
TYPE(dft_control_type), POINTER :: dft_control
TYPE(ewald_environment_type), POINTER :: ewald_env
TYPE(ewald_pw_type), POINTER :: ewald_pw
TYPE(mp_para_env_type), POINTER :: para_env
TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
TYPE(xtb_control_type), POINTER :: xtb_control
CALL timeset(routineN, handle)
iunit = cp_logger_get_default_unit_nr()
CALL get_qs_env(qs_env, &
qs_kind_set=qs_kind_set, &
atomic_kind_set=atomic_kind_set, &
particle_set=particle_set, &
cell=cell, &
atprop=atprop, &
dft_control=dft_control)
CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
xtb_control => dft_control%qs_control%xtb_control
totalcharge = dft_control%charge
IF (atprop%energy) THEN
CALL atprop_array_init(atprop%atecoul, natom)
END IF
! gamma[a,b]
ALLOCATE (gab(nkind, nkind), gam(nkind))
gab = 0.0_dp
gam = 0.0_dp
DO ikind = 1, nkind
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, defined=defined)
IF (.NOT. defined) CYCLE
CALL get_xtb_atom_param(xtb_atom_a, alpg=ala, eta=gama)
gam(ikind) = gama
DO jkind = 1, nkind
CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
CALL get_xtb_atom_param(xtb_atom_b, defined=defined)
IF (.NOT. defined) CYCLE
CALL get_xtb_atom_param(xtb_atom_b, alpg=alb)
!
gab(ikind, jkind) = SQRT(1._dp/(ala*ala + alb*alb))
!
END DO
END DO
! Chi[a,a]
enshift_type = xtb_control%enshift_type
IF (enshift_type == 0) THEN
enshift_type = 2
IF (ALL(cell%perd == 0)) enshift_type = 1
END IF
sgamma = 8.0_dp ! see D4 for periodic systems paper
esg = 1.0_dp + EXP(sgamma)
ALLOCATE (chia(natom))
CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
DO iatom = 1, natom
ikind = kind_of(iatom)
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, xi=xi, kappa0=kappa)
!
IF (enshift_type == 1) THEN
scn = SQRT(cnumbers(iatom)) + 1.0e-14_dp
ELSE IF (enshift_type == 2) THEN
cn = cnumbers(iatom)/esg
scn = LOG(esg/(esg - cnumbers(iatom)))
ELSE
CPABORT("Unknown enshift_type")
END IF
chia(iatom) = xi - kappa*scn
!
END DO
ef_energy = 0.0_dp
IF (dft_control%apply_period_efield .OR. dft_control%apply_efield .OR. &
dft_control%apply_efield_field) THEN
ALLOCATE (efr(natom))
efr(1:natom) = 0.0_dp
CALL eeq_efield_pot(qs_env, efr)
chia(1:natom) = chia(1:natom) + efr(1:natom)
END IF
do_ewald = xtb_control%do_ewald
CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
IF (do_ewald) THEN
CALL get_qs_env(qs_env=qs_env, &
ewald_env=ewald_env, ewald_pw=ewald_pw)
CALL eeq_solver(charges, lambda, eeq_energy, &
particle_set, kind_of, cell, chia, gam, gab, &
para_env, blacs_env, dft_control, eeq_sparam, &
totalcharge=totalcharge, ewald=do_ewald, &
ewald_env=ewald_env, ewald_pw=ewald_pw, iounit=iunit)
ELSE
CALL eeq_solver(charges, lambda, eeq_energy, &
particle_set, kind_of, cell, chia, gam, gab, &
para_env, blacs_env, dft_control, eeq_sparam, &
totalcharge=totalcharge, iounit=iunit)
END IF
IF (dft_control%apply_period_efield .OR. dft_control%apply_efield .OR. &
dft_control%apply_efield_field) THEN
CALL eeq_efield_energy(qs_env, charges, ef_energy)
eeq_energy = eeq_energy - SUM(charges*efr)
DEALLOCATE (efr)
END IF
DEALLOCATE (gab, gam, chia)
CALL timestop(handle)
END SUBROUTINE xtb_eeq_calculation
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param charges ...
!> \param dcharges ...
!> \param cnumbers ...
!> \param dcnum ...
!> \param eeq_sparam ...
! **************************************************************************************************
SUBROUTINE xtb_eeq_forces(qs_env, charges, dcharges, cnumbers, dcnum, eeq_sparam)
TYPE(qs_environment_type), POINTER :: qs_env
REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: charges, dcharges, cnumbers
TYPE(dcnum_type), DIMENSION(:), INTENT(IN) :: dcnum
TYPE(eeq_solver_type), INTENT(IN) :: eeq_sparam
CHARACTER(len=*), PARAMETER :: routineN = 'xtb_eeq_forces'
INTEGER :: atom_a, atom_b, atom_c, enshift_type, &
handle, i, ia, iatom, ikind, iunit, &
jatom, jkind, katom, kkind, natom, &
nkind
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of
LOGICAL :: defined, do_ewald, use_virial
REAL(KIND=dp) :: ala, alb, alpha, cn, ctot, dr, dr2, drk, &
elag, esg, gam2, gama, grc, kappa, &
qlam, qq, qq1, qq2, rcut, scn, sgamma, &
totalcharge, xi
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: gam
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: epforce, gab
REAL(KIND=dp), DIMENSION(3) :: fdik, ri, rij, rik, rj
REAL(KIND=dp), DIMENSION(3, 3) :: pvir
REAL(KIND=dp), DIMENSION(:), POINTER :: chrgx, dchia, qlag
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atprop_type), POINTER :: atprop
TYPE(cell_type), POINTER :: cell
TYPE(cp_blacs_env_type), POINTER :: blacs_env
TYPE(dft_control_type), POINTER :: dft_control
TYPE(distribution_1d_type), POINTER :: local_particles
TYPE(ewald_environment_type), POINTER :: ewald_env
TYPE(ewald_pw_type), POINTER :: ewald_pw
TYPE(mp_para_env_type), POINTER :: para_env
TYPE(neighbor_list_iterator_p_type), &
DIMENSION(:), POINTER :: nl_iterator
TYPE(neighbor_list_set_p_type), DIMENSION(:), &
POINTER :: sab_tbe
TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
TYPE(qs_force_type), DIMENSION(:), POINTER :: force
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(virial_type), POINTER :: virial
TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
TYPE(xtb_control_type), POINTER :: xtb_control
CALL timeset(routineN, handle)
iunit = cp_logger_get_default_unit_nr()
CALL get_qs_env(qs_env, &
qs_kind_set=qs_kind_set, &
atomic_kind_set=atomic_kind_set, &
particle_set=particle_set, &
atprop=atprop, &
force=force, &
virial=virial, &
cell=cell, &
dft_control=dft_control)
CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
xtb_control => dft_control%qs_control%xtb_control
totalcharge = dft_control%charge
CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
atom_of_kind=atom_of_kind, kind_of=kind_of)
! gamma[a,b]
ALLOCATE (gab(nkind, nkind), gam(nkind))
gab = 0.0_dp
DO ikind = 1, nkind
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, defined=defined)
IF (.NOT. defined) CYCLE
CALL get_xtb_atom_param(xtb_atom_a, alpg=ala, eta=gama)
gam(ikind) = gama
DO jkind = 1, nkind
CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
CALL get_xtb_atom_param(xtb_atom_b, defined=defined)
IF (.NOT. defined) CYCLE
CALL get_xtb_atom_param(xtb_atom_b, alpg=alb)
!
gab(ikind, jkind) = SQRT(1._dp/(ala*ala + alb*alb))
!
END DO
END DO
ALLOCATE (qlag(natom))
do_ewald = xtb_control%do_ewald
CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
IF (do_ewald) THEN
CALL get_qs_env(qs_env=qs_env, &
ewald_env=ewald_env, ewald_pw=ewald_pw)
CALL eeq_solver(qlag, qlam, elag, &
particle_set, kind_of, cell, -dcharges, gam, gab, &
para_env, blacs_env, dft_control, eeq_sparam, &
ewald=do_ewald, ewald_env=ewald_env, ewald_pw=ewald_pw, iounit=iunit)
ELSE
CALL eeq_solver(qlag, qlam, elag, &
particle_set, kind_of, cell, -dcharges, gam, gab, &
para_env, blacs_env, dft_control, eeq_sparam, iounit=iunit)
END IF
enshift_type = xtb_control%enshift_type
IF (enshift_type == 0) THEN
enshift_type = 2
IF (ALL(cell%perd == 0)) enshift_type = 1
END IF
sgamma = 8.0_dp ! see D4 for periodic systems paper
esg = 1.0_dp + EXP(sgamma)
ALLOCATE (chrgx(natom), dchia(natom))
DO iatom = 1, natom
ikind = kind_of(iatom)
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, xi=xi, kappa0=kappa)
!
ctot = 0.5_dp*(charges(iatom) - qlag(iatom))
IF (enshift_type == 1) THEN
scn = SQRT(cnumbers(iatom)) + 1.0e-14_dp
dchia(iatom) = -ctot*kappa/scn
ELSE IF (enshift_type == 2) THEN
cn = cnumbers(iatom)
scn = 1.0_dp/(esg - cn)
dchia(iatom) = -ctot*kappa*scn
ELSE
CPABORT("Unknown enshift_type")
END IF
END DO
! Efield
IF (dft_control%apply_period_efield) THEN
CALL eeq_efield_force_periodic(qs_env, charges, qlag)
ELSE IF (dft_control%apply_efield) THEN
CALL eeq_efield_force_loc(qs_env, charges, qlag)
ELSE IF (dft_control%apply_efield_field) THEN
CPABORT("apply field")
END IF
! Forces from q*X
CALL get_qs_env(qs_env=qs_env, &
local_particles=local_particles)
DO ikind = 1, nkind
DO ia = 1, local_particles%n_el(ikind)
iatom = local_particles%list(ikind)%array(ia)
atom_a = atom_of_kind(iatom)
DO i = 1, dcnum(iatom)%neighbors
katom = dcnum(iatom)%nlist(i)
kkind = kind_of(katom)
atom_c = atom_of_kind(katom)
rik = dcnum(iatom)%rik(:, i)
drk = SQRT(SUM(rik(:)**2))
IF (drk > 1.e-3_dp) THEN
fdik(:) = dchia(iatom)*dcnum(iatom)%dvals(i)*rik(:)/drk
force(ikind)%rho_elec(:, atom_a) = force(ikind)%rho_elec(:, atom_a) - fdik(:)
force(kkind)%rho_elec(:, atom_c) = force(kkind)%rho_elec(:, atom_c) + fdik(:)
IF (use_virial) THEN
CALL virial_pair_force(virial%pv_virial, -1._dp, fdik, rik)
END IF
END IF
END DO
END DO
END DO
! Forces from (0.5*q+l)*dA/dR*q
IF (do_ewald) THEN
CALL get_qs_env(qs_env, sab_tbe=sab_tbe)
CALL ewald_env_get(ewald_env, alpha=alpha, rcut=rcut)
rcut = 2.0_dp*rcut
CALL neighbor_list_iterator_create(nl_iterator, sab_tbe)
DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
iatom=iatom, jatom=jatom, r=rij)
atom_a = atom_of_kind(iatom)
atom_b = atom_of_kind(jatom)
!
dr2 = SUM(rij**2)
dr = SQRT(dr2)
IF (dr > rcut .OR. dr < 1.E-6_dp) CYCLE
qq = (0.5_dp*charges(iatom) - qlag(iatom))*charges(jatom)
gama = gab(ikind, jkind)
gam2 = gama*gama
grc = 2._dp*gama*EXP(-gam2*dr2)*oorootpi/dr - erf(gama*dr)/dr2 &
- 2._dp*alpha*EXP(-alpha**2*dr2)*oorootpi/dr + erf(alpha*dr)/dr2
qq1 = (0.5_dp*charges(iatom) - qlag(iatom))*charges(jatom)
qq2 = (0.5_dp*charges(jatom) - qlag(jatom))*charges(iatom)
fdik(:) = -qq1*grc*rij(:)/dr
force(ikind)%rho_elec(:, atom_a) = force(ikind)%rho_elec(:, atom_a) + fdik(:)
force(jkind)%rho_elec(:, atom_b) = force(jkind)%rho_elec(:, atom_b) - fdik(:)
IF (use_virial) THEN
CALL virial_pair_force(virial%pv_virial, 1._dp, fdik, rij)
END IF
fdik(:) = qq2*grc*rij(:)/dr
force(ikind)%rho_elec(:, atom_a) = force(ikind)%rho_elec(:, atom_a) - fdik(:)
force(jkind)%rho_elec(:, atom_b) = force(jkind)%rho_elec(:, atom_b) + fdik(:)
IF (use_virial) THEN
CALL virial_pair_force(virial%pv_virial, -1._dp, fdik, rij)
END IF
END DO
CALL neighbor_list_iterator_release(nl_iterator)
ELSE
DO ikind = 1, nkind
DO ia = 1, local_particles%n_el(ikind)
iatom = local_particles%list(ikind)%array(ia)
atom_a = atom_of_kind(iatom)
ri(1:3) = particle_set(iatom)%r(1:3)
DO jatom = 1, natom
IF (iatom == jatom) CYCLE
jkind = kind_of(jatom)
atom_b = atom_of_kind(jatom)
qq = (0.5_dp*charges(iatom) - qlag(iatom))*charges(jatom)
rj(1:3) = particle_set(jatom)%r(1:3)
rij(1:3) = ri(1:3) - rj(1:3)
rij = pbc(rij, cell)
dr2 = SUM(rij**2)
dr = SQRT(dr2)
gama = gab(ikind, jkind)
gam2 = gama*gama
grc = 2._dp*gama*EXP(-gam2*dr2)*oorootpi/dr - erf(gama*dr)/dr2
fdik(:) = qq*grc*rij(:)/dr
force(ikind)%rho_elec(:, atom_a) = force(ikind)%rho_elec(:, atom_a) + fdik(:)
force(jkind)%rho_elec(:, atom_b) = force(jkind)%rho_elec(:, atom_b) - fdik(:)
END DO
END DO
END DO
END IF
! Forces from Ewald potential: (q+l)*A*q
IF (do_ewald) THEN
ALLOCATE (epforce(3, natom))
epforce = 0.0_dp
dchia = -charges + qlag
chrgx = charges
CALL spme_forces(ewald_env, ewald_pw, cell, particle_set, chrgx, &
particle_set, dchia, epforce)
dchia = charges
chrgx = qlag
CALL spme_forces(ewald_env, ewald_pw, cell, particle_set, chrgx, &
particle_set, dchia, epforce)
DO iatom = 1, natom
ikind = kind_of(iatom)
i = atom_of_kind(iatom)
force(ikind)%rho_elec(:, i) = force(ikind)%rho_elec(:, i) + epforce(:, iatom)
END DO
DEALLOCATE (epforce)
! virial
IF (use_virial) THEN
chrgx = charges - qlag
CALL spme_virial(ewald_env, ewald_pw, particle_set, cell, chrgx, pvir)
virial%pv_virial = virial%pv_virial + pvir
chrgx = qlag
CALL spme_virial(ewald_env, ewald_pw, particle_set, cell, chrgx, pvir)
virial%pv_virial = virial%pv_virial - pvir
END IF
END IF
DEALLOCATE (gab, chrgx, dchia, qlag)
CALL timestop(handle)
END SUBROUTINE xtb_eeq_forces
END MODULE xtb_eeq

View file

@ -141,11 +141,7 @@ CONTAINS
! loop over all atom pairs (sab_xtbe)
kg = xtb_control%kg
NULLIFY (n_list)
IF (xtb_control%old_coulomb_damping) THEN
CALL get_qs_env(qs_env=qs_env, sab_orb=n_list)
ELSE
CALL get_qs_env(qs_env=qs_env, sab_xtbe=n_list)
END IF
CALL get_qs_env(qs_env=qs_env, sab_xtbe=n_list)
CALL neighbor_list_iterator_create(nl_iterator, n_list)
DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &

View file

@ -179,11 +179,7 @@ CONTAINS
! loop over all atom pairs (sab_xtbe)
kg = xtb_control%kg
NULLIFY (n_list)
IF (xtb_control%old_coulomb_damping) THEN
CALL get_qs_env(qs_env=qs_env, sab_orb=n_list)
ELSE
CALL get_qs_env(qs_env=qs_env, sab_xtbe=n_list)
END IF
CALL get_qs_env(qs_env=qs_env, sab_xtbe=n_list)
CALL neighbor_list_iterator_create(nl_iterator, n_list)
DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &

486
src/xtb_hab_force.F Normal file
View file

@ -0,0 +1,486 @@
!--------------------------------------------------------------------------------------------------!
! CP2K: A general program to perform molecular dynamics simulations !
! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
! !
! SPDX-License-Identifier: GPL-2.0-or-later !
!--------------------------------------------------------------------------------------------------!
! **************************************************************************************************
!> \brief Calculation of xTB Hamiltonian derivative
!> Reference: Stefan Grimme, Christoph Bannwarth, Philip Shushkov
!> JCTC 13, 1989-2009, (2017)
!> DOI: 10.1021/acs.jctc.7b00118
!> \author JGH
! **************************************************************************************************
MODULE xtb_hab_force
USE ai_contraction, ONLY: block_add,&
contraction
USE ai_overlap, ONLY: overlap_ab
USE atomic_kind_types, ONLY: atomic_kind_type,&
get_atomic_kind_set
USE basis_set_types, ONLY: gto_basis_set_p_type,&
gto_basis_set_type
USE block_p_types, ONLY: block_p_type
USE cp_control_types, ONLY: dft_control_type,&
xtb_control_type
USE cp_dbcsr_api, ONLY: dbcsr_create,&
dbcsr_finalize,&
dbcsr_get_block_p,&
dbcsr_p_type,&
dbcsr_type
USE cp_dbcsr_cp2k_link, ONLY: cp_dbcsr_alloc_block_from_nbl
USE cp_dbcsr_operations, ONLY: dbcsr_allocate_matrix_set,&
dbcsr_deallocate_matrix_set
USE cp_log_handling, ONLY: cp_get_default_logger,&
cp_logger_type
USE kinds, ONLY: dp
USE message_passing, ONLY: mp_para_env_type
USE orbital_pointers, ONLY: ncoset
USE particle_types, ONLY: particle_type
USE qs_dispersion_cnum, ONLY: cnumber_init,&
cnumber_release,&
dcnum_type
USE qs_environment_types, ONLY: get_qs_env,&
qs_environment_type
USE qs_force_types, ONLY: qs_force_type
USE qs_integral_utils, ONLY: basis_set_list_setup,&
get_memory_usage
USE qs_kind_types, ONLY: get_qs_kind,&
qs_kind_type
USE qs_ks_types, ONLY: qs_ks_env_type
USE qs_neighbor_list_types, ONLY: get_iterator_info,&
neighbor_list_iterate,&
neighbor_list_iterator_create,&
neighbor_list_iterator_p_type,&
neighbor_list_iterator_release,&
neighbor_list_set_p_type
USE qs_overlap, ONLY: create_sab_matrix
USE xtb_hcore, ONLY: gfn1_huckel,&
gfn1_kpair
USE xtb_types, ONLY: get_xtb_atom_param,&
xtb_atom_type
#include "./base/base_uses.f90"
IMPLICIT NONE
PRIVATE
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_hab_force'
PUBLIC :: build_xtb_hab_force
CONTAINS
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param p_matrix ...
! **************************************************************************************************
SUBROUTINE build_xtb_hab_force(qs_env, p_matrix)
TYPE(qs_environment_type), POINTER :: qs_env
TYPE(dbcsr_type), POINTER :: p_matrix
CHARACTER(LEN=*), PARAMETER :: routineN = 'build_xtb_hab_force'
INTEGER :: atom_a, atom_b, atom_c, handle, i, iatom, ic, icol, ikind, img, ir, irow, iset, &
j, jatom, jkind, jset, katom, kkind, la, lb, ldsab, maxder, n1, n2, na, natom, natorb_a, &
natorb_b, nb, ncoa, ncob, nderivatives, nimg, nkind, nsa, nsb, nseta, nsetb, sgfa, sgfb, &
za, zb
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of
INTEGER, DIMENSION(25) :: laoa, laob, naoa, naob
INTEGER, DIMENSION(3) :: cell
INTEGER, DIMENSION(:), POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
npgfb, nsgfa, nsgfb
INTEGER, DIMENSION(:, :), POINTER :: first_sgfa, first_sgfb
LOGICAL :: defined, diagblock, found, use_virial
REAL(KIND=dp) :: dfp, dhij, dr, drk, drx, f0, fhua, fhub, &
fhud, foab, hij, rcova, rcovab, rcovb, &
rrab
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: cnumbers
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: dfblock, dhuckel, huckel, owork
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: oint, sint
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: kijab
REAL(KIND=dp), DIMENSION(3) :: fdik, fdika, fdikb, force_ab, rij, rik
REAL(KIND=dp), DIMENSION(5) :: dpia, dpib, kpolya, kpolyb, pia, pib
REAL(KIND=dp), DIMENSION(:), POINTER :: set_radius_a, set_radius_b
REAL(KIND=dp), DIMENSION(:, :), POINTER :: fblock, pblock, rpgfa, rpgfb, sblock, &
scon_a, scon_b, zeta, zetb
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(block_p_type), DIMENSION(2:4) :: dsblocks
TYPE(cp_logger_type), POINTER :: logger
TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_h, matrix_s
TYPE(dcnum_type), ALLOCATABLE, DIMENSION(:) :: dcnum
TYPE(dft_control_type), POINTER :: dft_control
TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: basis_set_list
TYPE(gto_basis_set_type), POINTER :: basis_set_a, basis_set_b
TYPE(mp_para_env_type), POINTER :: para_env
TYPE(neighbor_list_iterator_p_type), &
DIMENSION(:), POINTER :: nl_iterator
TYPE(neighbor_list_set_p_type), DIMENSION(:), &
POINTER :: sab_orb
TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
TYPE(qs_force_type), DIMENSION(:), POINTER :: force
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(qs_ks_env_type), POINTER :: ks_env
TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
TYPE(xtb_control_type), POINTER :: xtb_control
CALL timeset(routineN, handle)
NULLIFY (logger)
logger => cp_get_default_logger()
NULLIFY (matrix_h, matrix_s, atomic_kind_set, qs_kind_set, sab_orb)
CALL get_qs_env(qs_env=qs_env, &
atomic_kind_set=atomic_kind_set, &
qs_kind_set=qs_kind_set, &
dft_control=dft_control, &
para_env=para_env, &
sab_orb=sab_orb)
CPASSERT(dft_control%qs_control%xtb_control%gfn_type == 1)
nkind = SIZE(atomic_kind_set)
xtb_control => dft_control%qs_control%xtb_control
nimg = dft_control%nimages
nderivatives = 1
maxder = ncoset(nderivatives)
NULLIFY (particle_set)
CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
natom = SIZE(particle_set)
CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
atom_of_kind=atom_of_kind, kind_of=kind_of)
NULLIFY (force)
CALL get_qs_env(qs_env=qs_env, force=force)
use_virial = .FALSE.
CPASSERT(nimg == 1)
! set up basis set lists
ALLOCATE (basis_set_list(nkind))
CALL basis_set_list_setup(basis_set_list, "ORB", qs_kind_set)
! allocate overlap matrix
CALL get_qs_env(qs_env=qs_env, ks_env=ks_env)
CALL dbcsr_allocate_matrix_set(matrix_s, maxder, nimg)
CALL create_sab_matrix(ks_env, matrix_s, "xTB OVERLAP MATRIX", basis_set_list, basis_set_list, &
sab_orb, .TRUE.)
! initialize H matrix
CALL dbcsr_allocate_matrix_set(matrix_h, 1, nimg)
DO img = 1, nimg
ALLOCATE (matrix_h(1, img)%matrix)
CALL dbcsr_create(matrix_h(1, img)%matrix, template=matrix_s(1, 1)%matrix, &
name="HAMILTONIAN MATRIX")
CALL cp_dbcsr_alloc_block_from_nbl(matrix_h(1, img)%matrix, sab_orb)
END DO
! Calculate coordination numbers
! needed for effective atomic energy levels (Eq. 12)
! code taken from D3 dispersion energy
CALL cnumber_init(qs_env, cnumbers, dcnum, 1, .TRUE.)
! Calculate Huckel parameters
CALL gfn1_huckel(qs_env, cnumbers, huckel, dhuckel, .TRUE.)
! Calculate KAB parameters and electronegativity correction
CALL gfn1_kpair(qs_env, kijab)
! loop over all atom pairs with a non-zero overlap (sab_orb)
CALL neighbor_list_iterator_create(nl_iterator, sab_orb)
DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
iatom=iatom, jatom=jatom, r=rij, cell=cell)
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, defined=defined, natorb=natorb_a)
IF (.NOT. defined .OR. natorb_a < 1) CYCLE
CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
CALL get_xtb_atom_param(xtb_atom_b, defined=defined, natorb=natorb_b)
IF (.NOT. defined .OR. natorb_b < 1) CYCLE
dr = SQRT(SUM(rij(:)**2))
! atomic parameters
CALL get_xtb_atom_param(xtb_atom_a, z=za, nao=naoa, lao=laoa, rcov=rcova, &
nshell=nsa, kpoly=kpolya)
CALL get_xtb_atom_param(xtb_atom_b, z=zb, nao=naob, lao=laob, rcov=rcovb, &
nshell=nsb, kpoly=kpolyb)
ic = 1
icol = MAX(iatom, jatom)
irow = MIN(iatom, jatom)
NULLIFY (sblock, fblock)
CALL dbcsr_get_block_p(matrix=matrix_s(1, ic)%matrix, &
row=irow, col=icol, BLOCK=sblock, found=found)
CPASSERT(found)
CALL dbcsr_get_block_p(matrix=matrix_h(1, ic)%matrix, &
row=irow, col=icol, BLOCK=fblock, found=found)
CPASSERT(found)
NULLIFY (pblock)
CALL dbcsr_get_block_p(matrix=p_matrix, &
row=irow, col=icol, block=pblock, found=found)
CPASSERT(ASSOCIATED(pblock))
DO i = 2, 4
NULLIFY (dsblocks(i)%block)
CALL dbcsr_get_block_p(matrix=matrix_s(i, ic)%matrix, &
row=irow, col=icol, BLOCK=dsblocks(i)%block, found=found)
CPASSERT(found)
END DO
! overlap
basis_set_a => basis_set_list(ikind)%gto_basis_set
IF (.NOT. ASSOCIATED(basis_set_a)) CYCLE
basis_set_b => basis_set_list(jkind)%gto_basis_set
IF (.NOT. ASSOCIATED(basis_set_b)) CYCLE
atom_a = atom_of_kind(iatom)
atom_b = atom_of_kind(jatom)
! basis ikind
first_sgfa => basis_set_a%first_sgf
la_max => basis_set_a%lmax
la_min => basis_set_a%lmin
npgfa => basis_set_a%npgf
nseta = basis_set_a%nset
nsgfa => basis_set_a%nsgf_set
rpgfa => basis_set_a%pgf_radius
set_radius_a => basis_set_a%set_radius
scon_a => basis_set_a%scon
zeta => basis_set_a%zet
! basis jkind
first_sgfb => basis_set_b%first_sgf
lb_max => basis_set_b%lmax
lb_min => basis_set_b%lmin
npgfb => basis_set_b%npgf
nsetb = basis_set_b%nset
nsgfb => basis_set_b%nsgf_set
rpgfb => basis_set_b%pgf_radius
set_radius_b => basis_set_b%set_radius
scon_b => basis_set_b%scon
zetb => basis_set_b%zet
ldsab = get_memory_usage(qs_kind_set, "ORB", "ORB")
ALLOCATE (oint(ldsab, ldsab, maxder), owork(ldsab, ldsab))
ALLOCATE (sint(natorb_a, natorb_b, maxder))
sint = 0.0_dp
DO iset = 1, nseta
ncoa = npgfa(iset)*ncoset(la_max(iset))
n1 = npgfa(iset)*(ncoset(la_max(iset)) - ncoset(la_min(iset) - 1))
sgfa = first_sgfa(1, iset)
DO jset = 1, nsetb
IF (set_radius_a(iset) + set_radius_b(jset) < dr) CYCLE
ncob = npgfb(jset)*ncoset(lb_max(jset))
n2 = npgfb(jset)*(ncoset(lb_max(jset)) - ncoset(lb_min(jset) - 1))
sgfb = first_sgfb(1, jset)
CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
rij, sab=oint(:, :, 1), dab=oint(:, :, 2:4))
! Contraction
DO i = 1, 4
CALL contraction(oint(:, :, i), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.FALSE.)
CALL block_add("IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, i), sgfa, sgfb, trans=.FALSE.)
END DO
END DO
END DO
! update S matrix
IF (iatom <= jatom) THEN
sblock(:, :) = sblock(:, :) + sint(:, :, 1)
ELSE
sblock(:, :) = sblock(:, :) + TRANSPOSE(sint(:, :, 1))
END IF
DO i = 2, 4
IF (iatom <= jatom) THEN
dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) + sint(:, :, i)
ELSE
dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) - TRANSPOSE(sint(:, :, i))
END IF
END DO
! Calculate Pi = Pia * Pib (Eq. 11)
rcovab = rcova + rcovb
rrab = SQRT(dr/rcovab)
pia(1:nsa) = 1._dp + kpolya(1:nsa)*rrab
pib(1:nsb) = 1._dp + kpolyb(1:nsb)*rrab
IF (dr > 1.e-6_dp) THEN
drx = 0.5_dp/rrab/rcovab
ELSE
drx = 0.0_dp
END IF
dpia(1:nsa) = drx*kpolya(1:nsa)
dpib(1:nsb) = drx*kpolyb(1:nsb)
! diagonal block
diagblock = .FALSE.
IF (iatom == jatom .AND. dr < 0.001_dp) diagblock = .TRUE.
!
! Eq. 10
!
IF (diagblock) THEN
DO i = 1, natorb_a
na = naoa(i)
fblock(i, i) = fblock(i, i) + huckel(na, iatom)
END DO
ELSE
DO j = 1, natorb_b
nb = naob(j)
DO i = 1, natorb_a
na = naoa(i)
hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
IF (iatom <= jatom) THEN
fblock(i, j) = fblock(i, j) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
ELSE
fblock(j, i) = fblock(j, i) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
END IF
END DO
END DO
END IF
f0 = 1.0_dp
IF (irow == iatom) f0 = -1.0_dp
! Derivative wrt coordination number
fhua = 0.0_dp
fhub = 0.0_dp
fhud = 0.0_dp
IF (diagblock) THEN
DO i = 1, natorb_a
la = laoa(i)
na = naoa(i)
fhud = fhud + pblock(i, i)*dhuckel(na, iatom)
END DO
ELSE
DO j = 1, natorb_b
lb = laob(j)
nb = naob(j)
DO i = 1, natorb_a
la = laoa(i)
na = naoa(i)
hij = 0.5_dp*pia(na)*pib(nb)
IF (iatom <= jatom) THEN
fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*dhuckel(na, iatom)
fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*dhuckel(nb, jatom)
ELSE
fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*dhuckel(na, iatom)
fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*dhuckel(nb, jatom)
END IF
END DO
END DO
IF (iatom /= jatom) THEN
fhua = 2.0_dp*fhua
fhub = 2.0_dp*fhub
END IF
END IF
! iatom
atom_a = atom_of_kind(iatom)
DO i = 1, dcnum(iatom)%neighbors
katom = dcnum(iatom)%nlist(i)
kkind = kind_of(katom)
atom_c = atom_of_kind(katom)
rik = dcnum(iatom)%rik(:, i)
drk = SQRT(SUM(rik(:)**2))
IF (drk > 1.e-3_dp) THEN
fdika(:) = fhua*dcnum(iatom)%dvals(i)*rik(:)/drk
force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdika(:)
force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdika(:)
fdikb(:) = fhud*dcnum(iatom)%dvals(i)*rik(:)/drk
force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdikb(:)
force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdikb(:)
END IF
END DO
! jatom
atom_b = atom_of_kind(jatom)
DO i = 1, dcnum(jatom)%neighbors
katom = dcnum(jatom)%nlist(i)
kkind = kind_of(katom)
atom_c = atom_of_kind(katom)
rik = dcnum(jatom)%rik(:, i)
drk = SQRT(SUM(rik(:)**2))
IF (drk > 1.e-3_dp) THEN
fdik(:) = fhub*dcnum(jatom)%dvals(i)*rik(:)/drk
force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) - fdik(:)
force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdik(:)
END IF
END DO
IF (diagblock) THEN
force_ab = 0._dp
ELSE
! force from R dendent Huckel element
n1 = SIZE(fblock, 1)
n2 = SIZE(fblock, 2)
ALLOCATE (dfblock(n1, n2))
dfblock = 0.0_dp
DO j = 1, natorb_b
lb = laob(j)
nb = naob(j)
DO i = 1, natorb_a
la = laoa(i)
na = naoa(i)
dhij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*(dpia(na)*pib(nb) + pia(na)*dpib(nb))
IF (iatom <= jatom) THEN
dfblock(i, j) = dfblock(i, j) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
ELSE
dfblock(j, i) = dfblock(j, i) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
END IF
END DO
END DO
dfp = f0*SUM(dfblock(:, :)*pblock(:, :))
DO ir = 1, 3
foab = 2.0_dp*dfp*rij(ir)/dr
! force from overlap matrix contribution to H
DO j = 1, natorb_b
lb = laob(j)
nb = naob(j)
DO i = 1, natorb_a
la = laoa(i)
na = naoa(i)
hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
IF (iatom <= jatom) THEN
foab = foab + 2.0_dp*hij*sint(i, j, ir + 1)*pblock(i, j)*kijab(i, j, ikind, jkind)
ELSE
foab = foab - 2.0_dp*hij*sint(i, j, ir + 1)*pblock(j, i)*kijab(i, j, ikind, jkind)
END IF
END DO
END DO
force_ab(ir) = foab
END DO
DEALLOCATE (dfblock)
END IF
atom_a = atom_of_kind(iatom)
atom_b = atom_of_kind(jatom)
IF (irow == iatom) force_ab = -force_ab
force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - force_ab(:)
force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) + force_ab(:)
DEALLOCATE (oint, owork, sint)
END DO
CALL neighbor_list_iterator_release(nl_iterator)
DO i = 1, SIZE(matrix_h, 1)
DO img = 1, nimg
CALL dbcsr_finalize(matrix_h(i, img)%matrix)
CALL dbcsr_finalize(matrix_s(i, img)%matrix)
END DO
END DO
CALL dbcsr_deallocate_matrix_set(matrix_s)
CALL dbcsr_deallocate_matrix_set(matrix_h)
! deallocate coordination numbers
CALL cnumber_release(cnumbers, dcnum, .TRUE.)
! deallocate Huckel parameters
DEALLOCATE (huckel, dhuckel)
! deallocate KAB parameters
DEALLOCATE (kijab)
DEALLOCATE (basis_set_list)
CALL timestop(handle)
END SUBROUTINE build_xtb_hab_force
END MODULE xtb_hab_force

402
src/xtb_hcore.F Normal file
View file

@ -0,0 +1,402 @@
!--------------------------------------------------------------------------------------------------!
! CP2K: A general program to perform molecular dynamics simulations !
! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
! !
! SPDX-License-Identifier: GPL-2.0-or-later !
!--------------------------------------------------------------------------------------------------!
! **************************************************************************************************
!> \brief Calculation of EHT matrix elements in xTB
!> Reference: Stefan Grimme, Christoph Bannwarth, Philip Shushkov
!> JCTC 13, 1989-2009, (2017)
!> DOI: 10.1021/acs.jctc.7b00118
!> \author JGH
! **************************************************************************************************
MODULE xtb_hcore
USE atomic_kind_types, ONLY: atomic_kind_type,&
get_atomic_kind,&
get_atomic_kind_set
USE cp_control_types, ONLY: dft_control_type,&
xtb_control_type
USE kinds, ONLY: dp
USE physcon, ONLY: evolt
USE qs_environment_types, ONLY: get_qs_env,&
qs_environment_type
USE qs_kind_types, ONLY: get_qs_kind,&
get_qs_kind_set,&
qs_kind_type
USE xtb_parameters, ONLY: early3d,&
metal,&
pp_gfn0,&
xtb_set_kab
USE xtb_types, ONLY: get_xtb_atom_param,&
xtb_atom_type
#include "./base/base_uses.f90"
IMPLICIT NONE
PRIVATE
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_hcore'
PUBLIC :: gfn0_huckel, gfn1_huckel, gfn0_kpair, gfn1_kpair
CONTAINS
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param cnumbers ...
!> \param charges ...
!> \param huckel ...
!> \param dhuckel ...
!> \param dqhuckel ...
!> \param calculate_forces ...
! **************************************************************************************************
SUBROUTINE gfn0_huckel(qs_env, cnumbers, charges, huckel, dhuckel, dqhuckel, calculate_forces)
TYPE(qs_environment_type), POINTER :: qs_env
REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: cnumbers, charges
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: huckel, dhuckel, dqhuckel
LOGICAL, INTENT(IN) :: calculate_forces
INTEGER :: i, iatom, ikind, l, natom, nshell
INTEGER, ALLOCATABLE, DIMENSION(:) :: kind_of
INTEGER, DIMENSION(25) :: lval
REAL(KIND=dp) :: kqat2
REAL(KIND=dp), DIMENSION(5) :: hena, kcn, kq
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(dft_control_type), POINTER :: dft_control
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(xtb_atom_type), POINTER :: xtb_atom_a
TYPE(xtb_control_type), POINTER :: xtb_control
CALL get_qs_env(qs_env=qs_env, &
atomic_kind_set=atomic_kind_set, &
qs_kind_set=qs_kind_set, &
dft_control=dft_control)
xtb_control => dft_control%qs_control%xtb_control
CALL get_qs_env(qs_env=qs_env, natom=natom)
ALLOCATE (huckel(5, natom))
IF (calculate_forces) THEN
ALLOCATE (dhuckel(5, natom), dqhuckel(5, natom))
END IF
CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
DO iatom = 1, natom
ikind = kind_of(iatom)
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, nshell=nshell, lval=lval, &
kcn=kcn, kq=kq, kqat2=kqat2, hen=hena)
kcn = kcn/evolt
kq = kq/evolt
kqat2 = kqat2/evolt
huckel(:, iatom) = 0.0_dp
DO i = 1, nshell
l = lval(i) + 1
huckel(i, iatom) = hena(i) - kcn(l)*cnumbers(iatom) &
- kq(l)*charges(iatom) - kqat2*charges(iatom)**2
END DO
IF (calculate_forces) THEN
dhuckel(:, iatom) = 0.0_dp
dqhuckel(:, iatom) = 0.0_dp
DO i = 1, nshell
l = lval(i) + 1
dhuckel(i, iatom) = -kcn(l)
dqhuckel(i, iatom) = -kq(l) - 2.0_dp*kqat2*charges(iatom)
END DO
END IF
END DO
END SUBROUTINE gfn0_huckel
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param cnumbers ...
!> \param huckel ...
!> \param dhuckel ...
!> \param calculate_forces ...
! **************************************************************************************************
SUBROUTINE gfn1_huckel(qs_env, cnumbers, huckel, dhuckel, calculate_forces)
TYPE(qs_environment_type), POINTER :: qs_env
REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: cnumbers
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: huckel, dhuckel
LOGICAL, INTENT(IN) :: calculate_forces
INTEGER :: i, iatom, ikind, natom, nkind, nshell, za
INTEGER, ALLOCATABLE, DIMENSION(:) :: kind_of
INTEGER, DIMENSION(25) :: lval
REAL(KIND=dp) :: kcnd, kcnp, kcns
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: kcnlk
REAL(KIND=dp), DIMENSION(5) :: hena
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(dft_control_type), POINTER :: dft_control
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(xtb_atom_type), POINTER :: xtb_atom_a
TYPE(xtb_control_type), POINTER :: xtb_control
CALL get_qs_env(qs_env=qs_env, &
atomic_kind_set=atomic_kind_set, &
qs_kind_set=qs_kind_set, &
dft_control=dft_control)
xtb_control => dft_control%qs_control%xtb_control
CALL get_qs_env(qs_env=qs_env, nkind=nkind, natom=natom)
kcns = xtb_control%kcns
kcnp = xtb_control%kcnp
kcnd = xtb_control%kcnd
! Calculate Huckel parameters
! Eq 12
! huckel(nshell,natom)
ALLOCATE (kcnlk(0:3, nkind))
DO ikind = 1, nkind
CALL get_atomic_kind(atomic_kind_set(ikind), z=za)
IF (metal(za)) THEN
kcnlk(0:3, ikind) = 0.0_dp
ELSEIF (early3d(za)) THEN
kcnlk(0, ikind) = kcns
kcnlk(1, ikind) = kcnp
kcnlk(2, ikind) = 0.005_dp
kcnlk(3, ikind) = 0.0_dp
ELSE
kcnlk(0, ikind) = kcns
kcnlk(1, ikind) = kcnp
kcnlk(2, ikind) = kcnd
kcnlk(3, ikind) = 0.0_dp
END IF
END DO
ALLOCATE (huckel(5, natom))
IF (calculate_forces) THEN
ALLOCATE (dhuckel(5, natom))
END IF
CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
DO iatom = 1, natom
ikind = kind_of(iatom)
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, nshell=nshell, lval=lval, hen=hena)
huckel(:, iatom) = 0.0_dp
DO i = 1, nshell
huckel(i, iatom) = hena(i)*(1._dp + kcnlk(lval(i), ikind)*cnumbers(iatom))
END DO
IF (calculate_forces) THEN
dhuckel(:, iatom) = 0.0_dp
DO i = 1, nshell
dhuckel(i, iatom) = hena(i)*kcnlk(lval(i), ikind)
END DO
END IF
END DO
DEALLOCATE (kcnlk)
END SUBROUTINE gfn1_huckel
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param kijab ...
! **************************************************************************************************
SUBROUTINE gfn0_kpair(qs_env, kijab)
TYPE(qs_environment_type), POINTER :: qs_env
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: kijab
INTEGER :: i, ikind, j, jkind, la, lb, maxs, na, &
natorb_a, natorb_b, nb, nkind, za, zb
INTEGER, DIMENSION(25) :: laoa, laob, naoa, naob
LOGICAL :: defined
REAL(KIND=dp) :: ben, den, etaa, etab, kab, kd, kden, &
kdiff, ken, kia, kjb, km, kp, kpen, &
ks, ksen, ksp, xijab, yijab
REAL(KIND=dp), DIMENSION(0:3) :: ke, kl
REAL(KIND=dp), DIMENSION(5) :: zetaa, zetab
TYPE(dft_control_type), POINTER :: dft_control
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
TYPE(xtb_control_type), POINTER :: xtb_control
CALL get_qs_env(qs_env=qs_env, &
qs_kind_set=qs_kind_set, &
dft_control=dft_control)
xtb_control => dft_control%qs_control%xtb_control
CALL get_qs_env(qs_env=qs_env, nkind=nkind)
CALL get_qs_kind_set(qs_kind_set=qs_kind_set, maxsgf=maxs, basis_type="ORB")
ks = xtb_control%ks
kp = xtb_control%kp
kd = xtb_control%kd
ksp = xtb_control%ksp
ksen = xtb_control%ksen
kpen = xtb_control%kpen
kden = xtb_control%kden
ben = xtb_control%ben
kdiff = xtb_control%k2sh
kl(0) = ks
kl(1) = kp
kl(2) = kd
kl(3) = 0.0_dp
ke(0) = ksen
ke(1) = kpen
ke(2) = kden
ke(3) = 0.0_dp
! Calculate KAB parameters and electronegativity correction
ALLOCATE (kijab(maxs, maxs, nkind, nkind))
kijab = 0.0_dp
DO ikind = 1, nkind
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, defined=defined, natorb=natorb_a)
IF (.NOT. defined .OR. natorb_a < 1) CYCLE
CALL get_xtb_atom_param(xtb_atom_a, z=za, nao=naoa, lao=laoa, &
en=etaa, zeta=zetaa)
DO jkind = 1, nkind
CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
CALL get_xtb_atom_param(xtb_atom_b, defined=defined, natorb=natorb_b)
IF (.NOT. defined .OR. natorb_b < 1) CYCLE
CALL get_xtb_atom_param(xtb_atom_b, z=zb, nao=naob, lao=laob, &
en=etab, zeta=zetab)
! Kab
kab = pp_gfn0(za, zb)
DO j = 1, natorb_b
lb = laob(j)
nb = naob(j)
DO i = 1, natorb_a
la = laoa(i)
na = naoa(i)
kia = kl(la)
kjb = kl(lb)
km = 0.5_dp*(kia + kjb)*kab
IF (za == 1 .AND. na == 2) THEN
IF (zb == 1 .AND. nb == 2) THEN
km = 0._dp
ELSE
km = km*kdiff
END IF
ELSEIF (zb == 1 .AND. nb == 2) THEN
km = km*kdiff
END IF
kijab(i, j, ikind, jkind) = km
END DO
END DO
! Yab
DO j = 1, natorb_b
nb = naob(j)
kjb = zetab(nb)
DO i = 1, natorb_a
na = naoa(i)
kia = zetaa(na)
yijab = 2.0_dp*SQRT(kia*kjb)/(kia + kjb)
kijab(i, j, ikind, jkind) = kijab(i, j, ikind, jkind)*yijab
END DO
END DO
! X
den = etaa - etab
DO j = 1, natorb_b
lb = laob(j)
kjb = ke(lb)
DO i = 1, natorb_a
la = laoa(i)
kia = ke(la)
ken = 0.5_dp*(kia + kjb)
xijab = 1.0_dp + ken*den**2 + ken*ben*den**4
kijab(i, j, ikind, jkind) = kijab(i, j, ikind, jkind)*xijab
END DO
END DO
END DO
END DO
END SUBROUTINE gfn0_kpair
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param kijab ...
! **************************************************************************************************
SUBROUTINE gfn1_kpair(qs_env, kijab)
TYPE(qs_environment_type), POINTER :: qs_env
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: kijab
INTEGER :: i, ikind, j, jkind, la, lb, maxs, na, &
natorb_a, natorb_b, nb, nkind, za, zb
INTEGER, DIMENSION(25) :: laoa, laob, naoa, naob
LOGICAL :: defined
REAL(KIND=dp) :: ena, enb, fen, k2sh, kab, kd, ken, kia, &
kjb, kp, ks, ksp
REAL(KIND=dp), DIMENSION(0:3) :: kl
TYPE(dft_control_type), POINTER :: dft_control
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
TYPE(xtb_control_type), POINTER :: xtb_control
CALL get_qs_env(qs_env=qs_env, &
qs_kind_set=qs_kind_set, &
dft_control=dft_control)
xtb_control => dft_control%qs_control%xtb_control
CALL get_qs_env(qs_env=qs_env, nkind=nkind)
CALL get_qs_kind_set(qs_kind_set=qs_kind_set, maxsgf=maxs, basis_type="ORB")
ks = xtb_control%ks
kp = xtb_control%kp
kd = xtb_control%kd
ksp = xtb_control%ksp
k2sh = xtb_control%k2sh
ken = xtb_control%ken
kl(0) = ks
kl(1) = kp
kl(2) = kd
kl(3) = 0.0_dp
! Calculate KAB parameters and electronegativity correction
! kijab -> K_l_l'[A,B] * X_l_l'[ENa, ENb] * Y[xia, xib]
ALLOCATE (kijab(maxs, maxs, nkind, nkind))
kijab = 0.0_dp
DO ikind = 1, nkind
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, defined=defined, natorb=natorb_a)
IF (.NOT. defined .OR. natorb_a < 1) CYCLE
CALL get_xtb_atom_param(xtb_atom_a, z=za, nao=naoa, lao=laoa, electronegativity=ena)
DO jkind = 1, nkind
CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
CALL get_xtb_atom_param(xtb_atom_b, defined=defined, natorb=natorb_b)
IF (.NOT. defined .OR. natorb_b < 1) CYCLE
CALL get_xtb_atom_param(xtb_atom_b, z=zb, nao=naob, lao=laob, electronegativity=enb)
! get Fen = (1+ken*deltaEN^2)
fen = 1.0_dp + ken*(ena - enb)**2
! Kab
kab = xtb_set_kab(za, zb, xtb_control)
DO j = 1, natorb_b
lb = laob(j)
nb = naob(j)
DO i = 1, natorb_a
la = laoa(i)
na = naoa(i)
kia = kl(la)
kjb = kl(lb)
IF (zb == 1 .AND. nb == 2) kjb = k2sh
IF (za == 1 .AND. na == 2) kia = k2sh
IF ((zb == 1 .AND. nb == 2) .OR. (za == 1 .AND. na == 2)) THEN
kijab(i, j, ikind, jkind) = 0.5_dp*(kia + kjb)
ELSE
IF ((la == 0 .AND. lb == 1) .OR. (la == 1 .AND. lb == 0)) THEN
kijab(i, j, ikind, jkind) = ksp*kab*fen
ELSE
kijab(i, j, ikind, jkind) = 0.5_dp*(kia + kjb)*kab*fen
END IF
END IF
END DO
END DO
END DO
END DO
END SUBROUTINE gfn1_kpair
END MODULE xtb_hcore

475
src/xtb_ks_matrix.F Normal file
View file

@ -0,0 +1,475 @@
!--------------------------------------------------------------------------------------------------!
! CP2K: A general program to perform molecular dynamics simulations !
! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
! !
! SPDX-License-Identifier: GPL-2.0-or-later !
!--------------------------------------------------------------------------------------------------!
! **************************************************************************************************
!> \brief Calculation of KS matrix in xTB
!> Reference: Stefan Grimme, Christoph Bannwarth, Philip Shushkov
!> JCTC 13, 1989-2009, (2017)
!> DOI: 10.1021/acs.jctc.7b00118
!> \author JGH
! **************************************************************************************************
MODULE xtb_ks_matrix
USE atomic_kind_types, ONLY: atomic_kind_type,&
get_atomic_kind
USE cp_control_types, ONLY: dft_control_type
USE cp_dbcsr_api, ONLY: dbcsr_add,&
dbcsr_copy,&
dbcsr_dot,&
dbcsr_multiply,&
dbcsr_p_type,&
dbcsr_type
USE cp_log_handling, ONLY: cp_get_default_logger,&
cp_logger_get_default_io_unit,&
cp_logger_type
USE cp_output_handling, ONLY: cp_print_key_finished_output,&
cp_print_key_unit_nr
USE efield_tb_methods, ONLY: efield_tb_matrix
USE input_section_types, ONLY: section_vals_get_subs_vals,&
section_vals_type
USE kinds, ONLY: dp
USE message_passing, ONLY: mp_para_env_type
USE mulliken, ONLY: ao_charges
USE particle_types, ONLY: particle_type
USE qs_charge_mixing, ONLY: charge_mixing
USE qs_energy_types, ONLY: qs_energy_type
USE qs_environment_types, ONLY: get_qs_env,&
qs_environment_type
USE qs_kind_types, ONLY: get_qs_kind,&
get_qs_kind_set,&
qs_kind_type
USE qs_ks_types, ONLY: qs_ks_env_type
USE qs_mo_types, ONLY: get_mo_set,&
mo_set_type
USE qs_rho_types, ONLY: qs_rho_get,&
qs_rho_type
USE qs_scf_types, ONLY: qs_scf_env_type
USE xtb_coulomb, ONLY: build_xtb_coulomb
USE xtb_types, ONLY: get_xtb_atom_param,&
xtb_atom_type
#include "./base/base_uses.f90"
IMPLICIT NONE
PRIVATE
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_ks_matrix'
PUBLIC :: build_xtb_ks_matrix
CONTAINS
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param calculate_forces ...
!> \param just_energy ...
!> \param ext_ks_matrix ...
! **************************************************************************************************
SUBROUTINE build_xtb_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
TYPE(qs_environment_type), POINTER :: qs_env
LOGICAL, INTENT(in) :: calculate_forces, just_energy
TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
POINTER :: ext_ks_matrix
INTEGER :: gfn_type
TYPE(dft_control_type), POINTER :: dft_control
CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
gfn_type = dft_control%qs_control%xtb_control%gfn_type
SELECT CASE (gfn_type)
CASE (0)
CPASSERT(.NOT. PRESENT(ext_ks_matrix))
CALL build_gfn0_xtb_ks_matrix(qs_env, calculate_forces, just_energy)
CASE (1)
CALL build_gfn1_xtb_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
CASE (2)
CPABORT("gfn_type = 2 not yet available")
CASE DEFAULT
CPABORT("Unknown gfn_type")
END SELECT
END SUBROUTINE build_xtb_ks_matrix
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param calculate_forces ...
!> \param just_energy ...
! **************************************************************************************************
SUBROUTINE build_gfn0_xtb_ks_matrix(qs_env, calculate_forces, just_energy)
TYPE(qs_environment_type), POINTER :: qs_env
LOGICAL, INTENT(in) :: calculate_forces, just_energy
CHARACTER(len=*), PARAMETER :: routineN = 'build_gfn0_xtb_ks_matrix'
INTEGER :: handle, img, iounit, ispin, natom, nimg, &
nspins
REAL(KIND=dp) :: pc_ener, qmmm_el
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(cp_logger_type), POINTER :: logger
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p1, mo_derivs
TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ks_matrix, matrix_h
TYPE(dbcsr_type), POINTER :: mo_coeff
TYPE(dft_control_type), POINTER :: dft_control
TYPE(mp_para_env_type), POINTER :: para_env
TYPE(qs_energy_type), POINTER :: energy
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(qs_ks_env_type), POINTER :: ks_env
TYPE(qs_rho_type), POINTER :: rho
TYPE(section_vals_type), POINTER :: scf_section
CALL timeset(routineN, handle)
MARK_USED(calculate_forces)
NULLIFY (dft_control, logger, scf_section, ks_env, ks_matrix, rho, &
energy)
CPASSERT(ASSOCIATED(qs_env))
logger => cp_get_default_logger()
iounit = cp_logger_get_default_io_unit(logger)
CALL get_qs_env(qs_env, &
dft_control=dft_control, &
atomic_kind_set=atomic_kind_set, &
qs_kind_set=qs_kind_set, &
matrix_h_kp=matrix_h, &
para_env=para_env, &
ks_env=ks_env, &
matrix_ks_kp=ks_matrix, &
energy=energy)
energy%hartree = 0.0_dp
energy%qmmm_el = 0.0_dp
scf_section => section_vals_get_subs_vals(qs_env%input, "DFT%SCF")
nspins = dft_control%nspins
nimg = dft_control%nimages
CPASSERT(ASSOCIATED(matrix_h))
CPASSERT(SIZE(ks_matrix) > 0)
DO ispin = 1, nspins
DO img = 1, nimg
! copy the core matrix into the fock matrix
CALL dbcsr_copy(ks_matrix(ispin, img)%matrix, matrix_h(1, img)%matrix)
END DO
END DO
IF (qs_env%qmmm) THEN
CPABORT("gfn0 QMMM NYA")
CALL get_qs_env(qs_env=qs_env, rho=rho, natom=natom)
CPASSERT(SIZE(ks_matrix, 2) == 1)
DO ispin = 1, nspins
! If QM/MM sumup the 1el Hamiltonian
CALL dbcsr_add(ks_matrix(ispin, 1)%matrix, qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
1.0_dp, 1.0_dp)
CALL qs_rho_get(rho, rho_ao=matrix_p1)
! Compute QM/MM Energy
CALL dbcsr_dot(qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
matrix_p1(ispin)%matrix, qmmm_el)
energy%qmmm_el = energy%qmmm_el + qmmm_el
END DO
pc_ener = qs_env%ks_qmmm_env%pc_ener
energy%qmmm_el = energy%qmmm_el + pc_ener
END IF
energy%total = energy%core + energy%eeq + energy%efield + energy%qmmm_el + &
energy%repulsive + energy%dispersion + energy%kTS
iounit = cp_print_key_unit_nr(logger, scf_section, "PRINT%DETAILED_ENERGY", &
extension=".scfLog")
IF (iounit > 0) THEN
WRITE (UNIT=iounit, FMT="(/,(T9,A,T60,F20.10))") &
"Repulsive pair potential energy: ", energy%repulsive, &
"SRB Correction energy: ", energy%srb, &
"Zeroth order Hamiltonian energy: ", energy%core, &
"Charge equilibration energy: ", energy%eeq, &
"London dispersion energy: ", energy%dispersion
IF (dft_control%qs_control%xtb_control%do_nonbonded) &
WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
"Correction for nonbonded interactions: ", energy%xtb_nonbonded
IF (ABS(energy%efield) > 1.e-12_dp) THEN
WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
"Electric field interaction energy: ", energy%efield
END IF
IF (qs_env%qmmm) THEN
WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
"QM/MM Electrostatic energy: ", energy%qmmm_el
END IF
END IF
CALL cp_print_key_finished_output(iounit, logger, scf_section, &
"PRINT%DETAILED_ENERGY")
! here we compute dE/dC if needed. Assumes dE/dC is H_{ks}C
IF (qs_env%requires_mo_derivs .AND. .NOT. just_energy) THEN
CPASSERT(SIZE(ks_matrix, 2) == 1)
BLOCK
TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
CALL get_qs_env(qs_env, mo_derivs=mo_derivs, mos=mo_array)
DO ispin = 1, SIZE(mo_derivs)
CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
IF (.NOT. mo_array(ispin)%use_mo_coeff_b) THEN
CPABORT("")
END IF
CALL dbcsr_multiply('n', 'n', 1.0_dp, ks_matrix(ispin, 1)%matrix, mo_coeff, &
0.0_dp, mo_derivs(ispin)%matrix)
END DO
END BLOCK
END IF
CALL timestop(handle)
END SUBROUTINE build_gfn0_xtb_ks_matrix
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param calculate_forces ...
!> \param just_energy ...
!> \param ext_ks_matrix ...
! **************************************************************************************************
SUBROUTINE build_gfn1_xtb_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
TYPE(qs_environment_type), POINTER :: qs_env
LOGICAL, INTENT(in) :: calculate_forces, just_energy
TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
POINTER :: ext_ks_matrix
CHARACTER(len=*), PARAMETER :: routineN = 'build_gfn1_xtb_ks_matrix'
INTEGER :: atom_a, handle, iatom, ikind, img, &
iounit, is, ispin, na, natom, natorb, &
nimg, nkind, ns, nsgf, nspins
INTEGER, DIMENSION(25) :: lao
INTEGER, DIMENSION(5) :: occ
LOGICAL :: do_efield, pass_check
REAL(KIND=dp) :: achrg, chmax, pc_ener, qmmm_el
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: mcharge
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: aocg, charges
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(cp_logger_type), POINTER :: logger
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p1, mo_derivs, p_matrix
TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ks_matrix, matrix_h, matrix_p, matrix_s
TYPE(dbcsr_type), POINTER :: mo_coeff, s_matrix
TYPE(dft_control_type), POINTER :: dft_control
TYPE(mp_para_env_type), POINTER :: para_env
TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
TYPE(qs_energy_type), POINTER :: energy
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(qs_ks_env_type), POINTER :: ks_env
TYPE(qs_rho_type), POINTER :: rho
TYPE(qs_scf_env_type), POINTER :: scf_env
TYPE(section_vals_type), POINTER :: scf_section
TYPE(xtb_atom_type), POINTER :: xtb_kind
CALL timeset(routineN, handle)
NULLIFY (dft_control, logger, scf_section, matrix_p, particle_set, ks_env, &
ks_matrix, rho, energy)
CPASSERT(ASSOCIATED(qs_env))
logger => cp_get_default_logger()
iounit = cp_logger_get_default_io_unit(logger)
CALL get_qs_env(qs_env, &
dft_control=dft_control, &
atomic_kind_set=atomic_kind_set, &
qs_kind_set=qs_kind_set, &
matrix_h_kp=matrix_h, &
para_env=para_env, &
ks_env=ks_env, &
matrix_ks_kp=ks_matrix, &
rho=rho, &
energy=energy)
IF (PRESENT(ext_ks_matrix)) THEN
! remap pointer to allow for non-kpoint external ks matrix
! ext_ks_matrix is used in linear response code
ns = SIZE(ext_ks_matrix)
ks_matrix(1:ns, 1:1) => ext_ks_matrix(1:ns)
END IF
energy%hartree = 0.0_dp
energy%qmmm_el = 0.0_dp
energy%efield = 0.0_dp
scf_section => section_vals_get_subs_vals(qs_env%input, "DFT%SCF")
nspins = dft_control%nspins
nimg = dft_control%nimages
CPASSERT(ASSOCIATED(matrix_h))
CPASSERT(ASSOCIATED(rho))
CPASSERT(SIZE(ks_matrix) > 0)
DO ispin = 1, nspins
DO img = 1, nimg
! copy the core matrix into the fock matrix
CALL dbcsr_copy(ks_matrix(ispin, img)%matrix, matrix_h(1, img)%matrix)
END DO
END DO
IF (dft_control%apply_period_efield .OR. dft_control%apply_efield .OR. &
dft_control%apply_efield_field) THEN
do_efield = .TRUE.
ELSE
do_efield = .FALSE.
END IF
IF (dft_control%qs_control%xtb_control%coulomb_interaction .OR. do_efield) THEN
! Mulliken charges
CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, matrix_s_kp=matrix_s)
CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
natom = SIZE(particle_set)
ALLOCATE (mcharge(natom), charges(natom, 5))
charges = 0.0_dp
nkind = SIZE(atomic_kind_set)
CALL get_qs_kind_set(qs_kind_set, maxsgf=nsgf)
ALLOCATE (aocg(nsgf, natom))
aocg = 0.0_dp
IF (nimg > 1) THEN
CALL ao_charges(matrix_p, matrix_s, aocg, para_env)
ELSE
p_matrix => matrix_p(:, 1)
s_matrix => matrix_s(1, 1)%matrix
CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
END IF
DO ikind = 1, nkind
CALL get_atomic_kind(atomic_kind_set(ikind), natom=na)
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
CALL get_xtb_atom_param(xtb_kind, natorb=natorb, lao=lao, occupation=occ)
DO iatom = 1, na
atom_a = atomic_kind_set(ikind)%atom_list(iatom)
charges(atom_a, :) = REAL(occ(:), KIND=dp)
DO is = 1, natorb
ns = lao(is) + 1
charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
END DO
END DO
END DO
DEALLOCATE (aocg)
! charge mixing
IF (dft_control%qs_control%do_ls_scf) THEN
!
ELSE
CALL get_qs_env(qs_env=qs_env, scf_env=scf_env)
CALL charge_mixing(scf_env%mixing_method, scf_env%mixing_store, &
charges, para_env, scf_env%iter_count)
END IF
DO iatom = 1, natom
mcharge(iatom) = SUM(charges(iatom, :))
END DO
END IF
IF (dft_control%qs_control%xtb_control%coulomb_interaction) THEN
CALL build_xtb_coulomb(qs_env, ks_matrix, rho, charges, mcharge, energy, &
calculate_forces, just_energy)
END IF
IF (do_efield) THEN
CALL efield_tb_matrix(qs_env, ks_matrix, rho, mcharge, energy, calculate_forces, just_energy)
END IF
IF (dft_control%qs_control%xtb_control%coulomb_interaction) THEN
IF (dft_control%qs_control%xtb_control%check_atomic_charges) THEN
pass_check = .TRUE.
DO ikind = 1, nkind
CALL get_atomic_kind(atomic_kind_set(ikind), natom=na)
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
CALL get_xtb_atom_param(xtb_kind, chmax=chmax)
DO iatom = 1, na
atom_a = atomic_kind_set(ikind)%atom_list(iatom)
achrg = mcharge(atom_a)
IF (ABS(achrg) > chmax) THEN
IF (iounit > 0) THEN
WRITE (iounit, "(A,A,I3,I6,A,F4.2,A,F6.2)") " Charge outside chemical range:", &
" Kind Atom=", ikind, atom_a, " Limit=", chmax, " Charge=", achrg
END IF
pass_check = .FALSE.
END IF
END DO
END DO
IF (.NOT. pass_check) THEN
CALL cp_warn(__LOCATION__, "Atomic charges outside chemical range were detected."// &
" Switch-off CHECK_ATOMIC_CHARGES keyword in the &xTB section"// &
" if you want to force to continue the calculation.")
CPABORT("xTB Charges")
END IF
END IF
END IF
IF (dft_control%qs_control%xtb_control%coulomb_interaction .OR. do_efield) THEN
DEALLOCATE (mcharge, charges)
END IF
IF (qs_env%qmmm) THEN
CPASSERT(SIZE(ks_matrix, 2) == 1)
DO ispin = 1, nspins
! If QM/MM sumup the 1el Hamiltonian
CALL dbcsr_add(ks_matrix(ispin, 1)%matrix, qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
1.0_dp, 1.0_dp)
CALL qs_rho_get(rho, rho_ao=matrix_p1)
! Compute QM/MM Energy
CALL dbcsr_dot(qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
matrix_p1(ispin)%matrix, qmmm_el)
energy%qmmm_el = energy%qmmm_el + qmmm_el
END DO
pc_ener = qs_env%ks_qmmm_env%pc_ener
energy%qmmm_el = energy%qmmm_el + pc_ener
END IF
energy%total = energy%core + energy%hartree + energy%efield + energy%qmmm_el + &
energy%repulsive + energy%dispersion + energy%dftb3 + energy%kTS
iounit = cp_print_key_unit_nr(logger, scf_section, "PRINT%DETAILED_ENERGY", &
extension=".scfLog")
IF (iounit > 0) THEN
WRITE (UNIT=iounit, FMT="(/,(T9,A,T60,F20.10))") &
"Repulsive pair potential energy: ", energy%repulsive, &
"Zeroth order Hamiltonian energy: ", energy%core, &
"Charge fluctuation energy: ", energy%hartree, &
"London dispersion energy: ", energy%dispersion
IF (dft_control%qs_control%xtb_control%xb_interaction) &
WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
"Correction for halogen bonding: ", energy%xtb_xb_inter
IF (dft_control%qs_control%xtb_control%do_nonbonded) &
WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
"Correction for nonbonded interactions: ", energy%xtb_nonbonded
IF (ABS(energy%efield) > 1.e-12_dp) THEN
WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
"Electric field interaction energy: ", energy%efield
END IF
WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
"DFTB3 3rd Order Energy Correction ", energy%dftb3
IF (qs_env%qmmm) THEN
WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
"QM/MM Electrostatic energy: ", energy%qmmm_el
END IF
END IF
CALL cp_print_key_finished_output(iounit, logger, scf_section, &
"PRINT%DETAILED_ENERGY")
! here we compute dE/dC if needed. Assumes dE/dC is H_{ks}C
IF (qs_env%requires_mo_derivs .AND. .NOT. just_energy) THEN
CPASSERT(SIZE(ks_matrix, 2) == 1)
BLOCK
TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
CALL get_qs_env(qs_env, mo_derivs=mo_derivs, mos=mo_array)
DO ispin = 1, SIZE(mo_derivs)
CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
IF (.NOT. mo_array(ispin)%use_mo_coeff_b) THEN
CPABORT("")
END IF
CALL dbcsr_multiply('n', 'n', 1.0_dp, ks_matrix(ispin, 1)%matrix, mo_coeff, &
0.0_dp, mo_derivs(ispin)%matrix)
END DO
END BLOCK
END IF
CALL timestop(handle)
END SUBROUTINE build_gfn1_xtb_ks_matrix
END MODULE xtb_ks_matrix

File diff suppressed because it is too large Load diff

View file

@ -18,19 +18,11 @@ MODULE xtb_parameters
set_sto_basis_set,&
sto_basis_set_type
USE cp_control_types, ONLY: xtb_control_type
USE cp_linked_list_input, ONLY: cp_sll_val_next,&
cp_sll_val_type
USE cp_parser_methods, ONLY: parser_get_next_line,&
parser_get_object
USE cp_parser_types, ONLY: cp_parser_type,&
parser_create,&
parser_release
USE input_section_types, ONLY: section_vals_get,&
section_vals_get_subs_vals,&
section_vals_list_get,&
section_vals_type
USE input_val_types, ONLY: val_get,&
val_type
USE kinds, ONLY: default_string_length,&
dp
USE message_passing, ONLY: mp_para_env_type
@ -38,8 +30,7 @@ MODULE xtb_parameters
ptable
USE physcon, ONLY: bohr,&
evolt
USE string_utilities, ONLY: remove_word,&
uppercase
USE string_utilities, ONLY: uppercase
USE xtb_types, ONLY: xtb_atom_type
#include "./base/base_uses.f90"
@ -167,11 +158,45 @@ MODULE xtb_parameters
! *** Public data types ***
PUBLIC :: xtb_parameters_init, xtb_parameters_read, xtb_parameters_set, init_xtb_basis, &
xtb_set_kab
PUBLIC :: xtb_parameters_init, xtb_parameters_set, init_xtb_basis, xtb_set_kab
PUBLIC :: metal, early3d, pp_gfn0
CONTAINS
! **************************************************************************************************
!> \brief ...
!> \param param ...
!> \param gfn_type ...
!> \param element_symbol ...
!> \param parameter_file_path ...
!> \param parameter_file_name ...
!> \param para_env ...
! **************************************************************************************************
SUBROUTINE xtb_parameters_init(param, gfn_type, element_symbol, &
parameter_file_path, parameter_file_name, &
para_env)
TYPE(xtb_atom_type), POINTER :: param
INTEGER, INTENT(IN) :: gfn_type
CHARACTER(LEN=2), INTENT(IN) :: element_symbol
CHARACTER(LEN=*), INTENT(IN) :: parameter_file_path, parameter_file_name
TYPE(mp_para_env_type), POINTER :: para_env
SELECT CASE (gfn_type)
CASE (0)
CALL xtb0_parameters_init(param, element_symbol, parameter_file_path, &
parameter_file_name, para_env)
CASE (1)
CALL xtb1_parameters_init(param, element_symbol, parameter_file_path, &
parameter_file_name, para_env)
CASE (2)
CPABORT("gfn_type = 2 not yet supported")
CASE DEFAULT
CPABORT("Wrong gfn_type")
END SELECT
END SUBROUTINE xtb_parameters_init
! **************************************************************************************************
!> \brief ...
!> \param param ...
@ -180,66 +205,100 @@ CONTAINS
!> \param parameter_file_name ...
!> \param para_env ...
! **************************************************************************************************
SUBROUTINE xtb_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, &
para_env)
SUBROUTINE xtb0_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, &
para_env)
TYPE(xtb_atom_type), POINTER :: param
CHARACTER(LEN=2), INTENT(IN) :: element_symbol
CHARACTER(LEN=*), INTENT(IN) :: parameter_file_path, parameter_file_name
TYPE(mp_para_env_type), POINTER :: para_env
CHARACTER(len=2) :: enam, esym
CHARACTER(len=default_string_length) :: aname, filename
INTEGER :: i, ia, l
CHARACTER(len=2) :: esym
CHARACTER(len=default_string_length) :: aname, atag, filename
INTEGER :: i, l, zin, znum
LOGICAL :: at_end, found
TYPE(cp_parser_type) :: parser
filename = ADJUSTL(TRIM(parameter_file_path))//ADJUSTL(TRIM(parameter_file_name))
CALL parser_create(parser, filename, para_env=para_env)
CALL parser_create(parser, filename, apply_preprocessing=.FALSE., para_env=para_env)
found = .FALSE.
znum = 0
CALL get_ptable_info(element_symbol, znum)
DO
at_end = .FALSE.
CALL parser_get_next_line(parser, 1, at_end)
IF (at_end) EXIT
CALL parser_get_object(parser, aname)
enam = aname
esym = element_symbol
CALL uppercase(enam)
CALL uppercase(esym)
IF (enam == esym) THEN
found = .TRUE.
CALL parser_get_object(parser, param%eta)
CALL parser_get_object(parser, param%xgamma)
CALL parser_get_object(parser, param%alpha)
CALL parser_get_object(parser, param%zneff)
DO i = 1, 5
CALL parser_get_object(parser, aname)
ia = ICHAR(aname(1:1))
IF (ia >= 49 .AND. ia <= 57) THEN
CALL parser_get_object(parser, param%kpoly(i))
CALL parser_get_object(parser, param%kappa(i))
CALL parser_get_object(parser, param%hen(i))
CALL parser_get_object(parser, param%zeta(i))
param%nshell = i
param%nval(i) = ia - 48
SELECT CASE (aname(2:2))
CASE ("s", "S")
param%lval(i) = 0
CASE ("p", "P")
param%lval(i) = 1
CASE ("d", "D")
param%lval(i) = 2
CASE ("f", "F")
param%lval(i) = 3
CASE DEFAULT
CPABORT("xTB PARAMETER ERROR")
END SELECT
CALL uppercase(aname)
IF (aname == "$Z") THEN
CALL parser_get_object(parser, zin)
IF (zin == znum) THEN
found = .TRUE.
DO
CALL parser_get_next_line(parser, 1, at_end)
IF (at_end) EXIT
ELSE
EXIT
END IF
END DO
IF (at_end) THEN
CPABORT("Incomplete xTB parameter file")
END IF
CALL parser_get_object(parser, aname)
CALL uppercase(aname)
SELECT CASE (aname)
CASE ("AO")
CALL parser_get_object(parser, atag)
CALL xtb_get_shells(atag, param%nshell, param%nval, param%lval)
CASE ("LEV")
DO i = 1, param%nshell
CALL parser_get_object(parser, param%hen(i))
END DO
CASE ("EXP")
DO i = 1, param%nshell
CALL parser_get_object(parser, param%zeta(i))
END DO
CASE ("EN")
CALL parser_get_object(parser, param%en)
CASE ("GAM")
CALL parser_get_object(parser, param%eta)
CASE ("KQAT2")
CALL parser_get_object(parser, param%kqat2)
CASE ("KCNS")
CALL parser_get_object(parser, param%kcn(1))
param%kcn(1) = param%kcn(1)*0.1_dp !from orig xtb code
CASE ("KCNP")
CALL parser_get_object(parser, param%kcn(2))
param%kcn(2) = param%kcn(2)*0.1_dp !from orig xtb code
CASE ("KCND")
CALL parser_get_object(parser, param%kcn(3))
param%kcn(3) = param%kcn(3)*0.1_dp !from orig xtb code
CASE ("REPA")
CALL parser_get_object(parser, param%alpha)
CASE ("REPB")
CALL parser_get_object(parser, param%zneff)
CASE ("POLYS")
CALL parser_get_object(parser, param%kpoly(1))
CASE ("POLYP")
CALL parser_get_object(parser, param%kpoly(2))
CASE ("POLYD")
CALL parser_get_object(parser, param%kpoly(3))
CASE ("KQS")
CALL parser_get_object(parser, param%kq(1))
CASE ("KQP")
CALL parser_get_object(parser, param%kq(2))
CASE ("KQD")
CALL parser_get_object(parser, param%kq(3))
CASE ("XI")
CALL parser_get_object(parser, param%xi)
CASE ("KAPPA")
CALL parser_get_object(parser, param%kappa0)
CASE ("ALPG")
CALL parser_get_object(parser, param%alpg)
CASE ("$END")
EXIT
CASE DEFAULT
CPABORT("Unknown parameter in xTB file")
END SELECT
END DO
ELSE
CYCLE
END IF
EXIT
END IF
END DO
@ -247,16 +306,15 @@ CONTAINS
param%typ = "STANDARD"
param%symbol = element_symbol
param%defined = .TRUE.
CALL get_ptable_info(element_symbol, number=ia)
param%z = ia
param%aname = ptable(ia)%name
param%z = znum
param%aname = ptable(znum)%name
param%lmax = MAXVAL(param%lval(1:param%nshell))
param%natorb = 0
DO i = 1, param%nshell
l = param%lval(i)
param%natorb = param%natorb + (2*l + 1)
END DO
param%zeff = zval(ia)
param%zeff = zval(znum)
ELSE
esym = element_symbol
CALL uppercase(esym)
@ -278,137 +336,131 @@ CONTAINS
END IF
CALL parser_release(parser)
END SUBROUTINE xtb_parameters_init
END SUBROUTINE xtb0_parameters_init
! **************************************************************************************************
!> \brief Read atom parameters for xTB Hamiltonian from input file
!> \brief ...
!> \param param ...
!> \param element_symbol ...
!> \param xtb_section ...
!> \param parameter_file_path ...
!> \param parameter_file_name ...
!> \param para_env ...
! **************************************************************************************************
SUBROUTINE xtb_parameters_read(param, element_symbol, xtb_section)
SUBROUTINE xtb1_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, &
para_env)
TYPE(xtb_atom_type), POINTER :: param
CHARACTER(LEN=2), INTENT(IN) :: element_symbol
TYPE(section_vals_type), POINTER :: xtb_section
CHARACTER(LEN=*), INTENT(IN) :: parameter_file_path, parameter_file_name
TYPE(mp_para_env_type), POINTER :: para_env
CHARACTER(LEN=2) :: label
CHARACTER(len=20*default_string_length) :: line_att
INTEGER :: i, ia, k, l, nshell
LOGICAL :: explicit, found, is_ok
TYPE(cp_sll_val_type), POINTER :: list
TYPE(section_vals_type), POINTER :: ap_section
TYPE(val_type), POINTER :: val
CHARACTER(len=2) :: esym
CHARACTER(len=default_string_length) :: aname, atag, filename
INTEGER :: i, l, zin, znum
LOGICAL :: at_end, found
TYPE(cp_parser_type) :: parser
!
! This could probably be done nicer
!
NULLIFY (list, val)
ap_section => section_vals_get_subs_vals(xtb_section, "ATOM_PARAMETER")
CALL section_vals_get(ap_section, explicit=explicit)
IF (explicit) THEN
CALL section_vals_list_get(ap_section, "_DEFAULT_KEYWORD_", list=list)
found = .FALSE.
nshell = 0
DO
is_ok = cp_sll_val_next(list, val)
IF (.NOT. is_ok) EXIT
CALL val_get(val, c_val=line_att)
IF (found) THEN
READ (line_att, *) label
CALL remove_word(line_att)
ia = ICHAR(label(1:1))
IF (ia >= 49 .AND. ia <= 57) THEN
nshell = nshell + 1
k = nshell
param%nval(k) = ia - 48
SELECT CASE (label(2:2))
CASE ("s", "S")
param%lval(k) = 0
CASE ("p", "P")
param%lval(k) = 1
CASE ("d", "D")
param%lval(k) = 2
CASE ("f", "F")
param%lval(k) = 3
filename = ADJUSTL(TRIM(parameter_file_path))//ADJUSTL(TRIM(parameter_file_name))
CALL parser_create(parser, filename, apply_preprocessing=.FALSE., para_env=para_env)
found = .FALSE.
znum = 0
CALL get_ptable_info(element_symbol, znum)
DO
at_end = .FALSE.
CALL parser_get_next_line(parser, 1, at_end)
IF (at_end) EXIT
CALL parser_get_object(parser, aname)
CALL uppercase(aname)
IF (aname == "$Z") THEN
CALL parser_get_object(parser, zin)
IF (zin == znum) THEN
found = .TRUE.
DO
CALL parser_get_next_line(parser, 1, at_end)
IF (at_end) THEN
CPABORT("Incomplete xTB parameter file")
END IF
CALL parser_get_object(parser, aname)
CALL uppercase(aname)
SELECT CASE (aname)
CASE ("AO")
CALL parser_get_object(parser, atag)
CALL xtb_get_shells(atag, param%nshell, param%nval, param%lval)
CASE ("LEV")
DO i = 1, param%nshell
CALL parser_get_object(parser, param%hen(i))
END DO
CASE ("EXP")
DO i = 1, param%nshell
CALL parser_get_object(parser, param%zeta(i))
END DO
CASE ("GAM")
CALL parser_get_object(parser, param%eta)
CASE ("GAM3")
CALL parser_get_object(parser, param%xgamma)
CASE ("CXB")
CALL parser_get_object(parser, param%kx)
CASE ("REPA")
CALL parser_get_object(parser, param%alpha)
CASE ("REPB")
CALL parser_get_object(parser, param%zneff)
CASE ("POLYS")
CALL parser_get_object(parser, param%kpoly(1))
CASE ("POLYP")
CALL parser_get_object(parser, param%kpoly(2))
CASE ("POLYD")
CALL parser_get_object(parser, param%kpoly(3))
CASE ("LPARP")
CALL parser_get_object(parser, param%kappa(2))
CASE ("LPARD")
CALL parser_get_object(parser, param%kappa(3))
CASE ("$END")
EXIT
CASE DEFAULT
CPABORT("xTB PARAMETER ERROR")
CPABORT("Unknown parameter in xTB file")
END SELECT
!
READ (line_att, *) param%kpoly(k)
CALL remove_word(line_att)
READ (line_att, *) param%kappa(k)
CALL remove_word(line_att)
READ (line_att, *) param%hen(k)
CALL remove_word(line_att)
READ (line_att, *) param%zeta(k)
CALL remove_word(line_att)
ELSE
EXIT
END IF
END DO
ELSE
READ (line_att, *) label
CALL remove_word(line_att)
IF (label == element_symbol) THEN
found = .TRUE.
nshell = nshell + 1
k = nshell
READ (line_att, *) param%eta
CALL remove_word(line_att)
READ (line_att, *) param%xgamma
CALL remove_word(line_att)
READ (line_att, *) param%alpha
CALL remove_word(line_att)
READ (line_att, *) param%zneff
CALL remove_word(line_att)
READ (line_att, *) label
CALL remove_word(line_att)
ia = ICHAR(label(1:1))
CPASSERT((ia >= 49 .AND. ia <= 57))
param%nval(k) = ia - 48
SELECT CASE (label(2:2))
CASE ("s", "S")
param%lval(k) = 0
CASE ("p", "P")
param%lval(k) = 1
CASE ("d", "D")
param%lval(k) = 2
CASE ("f", "F")
param%lval(k) = 3
CASE DEFAULT
CPABORT("xTB PARAMETER ERROR")
END SELECT
!
READ (line_att, *) param%kpoly(k)
CALL remove_word(line_att)
READ (line_att, *) param%kappa(k)
CALL remove_word(line_att)
READ (line_att, *) param%hen(k)
CALL remove_word(line_att)
READ (line_att, *) param%zeta(k)
CALL remove_word(line_att)
END IF
CYCLE
END IF
EXIT
END IF
END DO
IF (found) THEN
param%typ = "STANDARD"
param%symbol = element_symbol
param%defined = .TRUE.
param%z = znum
param%aname = ptable(znum)%name
param%lmax = MAXVAL(param%lval(1:param%nshell))
param%natorb = 0
DO i = 1, param%nshell
l = param%lval(i)
param%natorb = param%natorb + (2*l + 1)
END DO
IF (found) THEN
param%typ = "STANDARD"
param%zeff = zval(znum)
ELSE
esym = element_symbol
CALL uppercase(esym)
IF ("X " == esym) THEN
param%typ = "GHOST"
param%symbol = element_symbol
param%defined = .TRUE.
CALL get_ptable_info(element_symbol, number=ia)
param%z = ia
param%aname = ptable(ia)%name
param%lmax = MAXVAL(param%lval(1:param%nshell))
param%defined = .FALSE.
param%z = 0
param%aname = "X "
param%lmax = 0
param%natorb = 0
param%nshell = nshell
DO i = 1, param%nshell
l = param%lval(i)
param%natorb = param%natorb + (2*l + 1)
END DO
param%zeff = zval(ia)
param%nshell = 0
param%zeff = 0.0_dp
ELSE
param%defined = .FALSE.
CALL cp_warn(__LOCATION__, "xTB parameters for element "//element_symbol// &
" were not found in the parameter file "//ADJUSTL(TRIM(filename)))
END IF
END IF
CALL parser_release(parser)
END SUBROUTINE xtb_parameters_read
END SUBROUTINE xtb1_parameters_init
! **************************************************************************************************
!> \brief Read atom parameters for xTB Hamiltonian from input file
@ -437,6 +489,7 @@ CONTAINS
i = param%z
! Electronegativity
param%electronegativity = eneg(i)
IF (param%en == 0.0_dp) param%en = eneg(i)
! covalent radius
param%rcov = crad(i)*bohr
! shell occupances
@ -453,19 +506,16 @@ CONTAINS
param%kappa(:) = 0.1_dp*param%kappa(:)
! we have 1/6 g * q**3 (not 1/3)
param%xgamma = -2.0_dp*param%xgamma
! we need kappa l-indexed
kp(:) = param%kappa(:)
param%kappa(:) = 0.0_dp
! we need kpoly in shell order
kp(:) = param%kpoly(:)
param%kpoly(:) = 0.0_dp
DO is = 1, param%nshell
l = param%lval(is)
IF (param%kappa(l + 1) == 0.0_dp) THEN
param%kappa(l + 1) = kp(is)
ELSE
CPASSERT(ABS(param%kappa(l + 1) - kp(is)) < 1.e-10_dp)
END IF
param%kpoly(is) = kp(l + 1)
END DO
! kx
IF (param%kx < -10._dp) THEN
param%kx = 0.1_dp*param%kx
IF (param%kx < -5._dp) THEN
! use defaults
SELECT CASE (param%z)
CASE DEFAULT
@ -635,5 +685,98 @@ CONTAINS
END FUNCTION xtb_set_kab
! **************************************************************************************************
!> \brief ...
!> \param atag ...
!> \param nshell ...
!> \param nval ...
!> \param lval ...
!> \return ...
! **************************************************************************************************
SUBROUTINE xtb_get_shells(atag, nshell, nval, lval)
CHARACTER(len=*) :: atag
INTEGER :: nshell
INTEGER, DIMENSION(:) :: nval, lval
CHARACTER(LEN=1) :: ltag
CHARACTER(LEN=10) :: aotag
INTEGER :: i, j
aotag = ADJUSTL(TRIM(atag))
nshell = LEN(TRIM(aotag))/2
DO i = 1, nshell
j = (i - 1)*2 + 1
READ (aotag(j:j), FMT="(i1)") nval(i)
READ (aotag(j + 1:j + 1), FMT="(A1)") ltag
CALL uppercase(ltag)
SELECT CASE (ltag)
CASE ("S")
lval(i) = 0
CASE ("P")
lval(i) = 1
CASE ("D")
lval(i) = 2
CASE DEFAULT
END SELECT
END DO
END SUBROUTINE xtb_get_shells
! **************************************************************************************************
!> \brief ...
!> \param z ...
!> \return ...
! **************************************************************************************************
FUNCTION metal(z) RESULT(ismetal)
INTEGER :: z
LOGICAL :: ismetal
SELECT CASE (z)
CASE DEFAULT
ismetal = .TRUE.
CASE (1:2, 6:10, 14:18, 32:36, 50:54, 82:86)
ismetal = .FALSE.
END SELECT
END FUNCTION metal
! **************************************************************************************************
!> \brief ...
!> \param z ...
!> \return ...
! **************************************************************************************************
FUNCTION early3d(z) RESULT(isearly3d)
INTEGER :: z
LOGICAL :: isearly3d
isearly3d = .FALSE.
IF (z >= 21 .AND. z <= 24) isearly3d = .TRUE.
END FUNCTION early3d
! **************************************************************************************************
!> \brief ...
!> \param za ...
!> \param zb ...
!> \return ...
! **************************************************************************************************
FUNCTION pp_gfn0(za, zb) RESULT(pparm)
INTEGER :: za, zb
REAL(KIND=dp) :: pparm
pparm = 1.0_dp
IF ((za > 20 .AND. za < 30) .OR. (za > 38 .AND. za < 48) .OR. (za > 56 .AND. za < 80)) THEN
IF ((zb > 20 .AND. zb < 30) .OR. (zb > 38 .AND. zb < 48) .OR. (zb > 56 .AND. zb < 80)) THEN
pparm = 1.1_dp
IF (za == 29 .OR. za == 47 .OR. za == 79) THEN
IF (za == 29 .OR. za == 47 .OR. za == 79) THEN
pparm = 0.9_dp
END IF
END IF
END IF
END IF
END FUNCTION pp_gfn0
END MODULE xtb_parameters

954
src/xtb_potentials.F Normal file
View file

@ -0,0 +1,954 @@
!--------------------------------------------------------------------------------------------------!
! CP2K: A general program to perform molecular dynamics simulations !
! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
! !
! SPDX-License-Identifier: GPL-2.0-or-later !
!--------------------------------------------------------------------------------------------------!
! **************************************************************************************************
!> \brief xTB (repulsive) pair potentials
!> Reference: Stefan Grimme, Christoph Bannwarth, Philip Shushkov
!> JCTC 13, 1989-2009, (2017)
!> DOI: 10.1021/acs.jctc.7b00118
!> \author JGH
! **************************************************************************************************
MODULE xtb_potentials
USE atomic_kind_types, ONLY: atomic_kind_type,&
get_atomic_kind,&
get_atomic_kind_set
USE atprop_types, ONLY: atprop_type
USE cp_control_types, ONLY: dft_control_type,&
xtb_control_type
USE cp_log_handling, ONLY: cp_get_default_logger,&
cp_logger_get_default_io_unit,&
cp_logger_type,&
cp_to_string
USE ewald_environment_types, ONLY: ewald_env_get,&
ewald_environment_type
USE fparser, ONLY: evalfd,&
finalizef
USE input_section_types, ONLY: section_vals_get_subs_vals,&
section_vals_type,&
section_vals_val_get
USE kinds, ONLY: default_string_length,&
dp
USE message_passing, ONLY: mp_para_env_type
USE pair_potential, ONLY: init_genpot
USE pair_potential_types, ONLY: not_initialized,&
pair_potential_p_type,&
pair_potential_pp_create,&
pair_potential_pp_release,&
pair_potential_pp_type,&
pair_potential_single_clean,&
pair_potential_single_copy,&
pair_potential_single_type
USE pair_potential_util, ONLY: ener_pot
USE particle_types, ONLY: particle_type
USE qs_dispersion_cnum, ONLY: dcnum_type
USE qs_environment_types, ONLY: get_qs_env,&
qs_environment_type
USE qs_force_types, ONLY: qs_force_type
USE qs_kind_types, ONLY: get_qs_kind,&
qs_kind_type
USE qs_neighbor_list_types, ONLY: get_iterator_info,&
neighbor_list_iterate,&
neighbor_list_iterator_create,&
neighbor_list_iterator_p_type,&
neighbor_list_iterator_release,&
neighbor_list_set_p_type
USE string_utilities, ONLY: compress,&
uppercase
USE virial_methods, ONLY: virial_pair_force
USE virial_types, ONLY: virial_type
USE xtb_types, ONLY: get_xtb_atom_param,&
xtb_atom_type
#include "./base/base_uses.f90"
IMPLICIT NONE
TYPE neighbor_atoms_type
REAL(KIND=dp), DIMENSION(:, :), POINTER :: coord => NULL()
REAL(KIND=dp), DIMENSION(:), POINTER :: rab => NULL()
INTEGER, DIMENSION(:), POINTER :: katom => NULL()
END TYPE neighbor_atoms_type
PRIVATE
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_potentials'
PUBLIC :: xtb_pp_radius, repulsive_potential, srb_potential
PUBLIC :: nonbonded_correction, xb_interaction
PUBLIC :: neighbor_atoms_type
CONTAINS
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param erep ...
!> \param kf ...
!> \param enscale ...
!> \param calculate_forces ...
! **************************************************************************************************
SUBROUTINE repulsive_potential(qs_env, erep, kf, enscale, calculate_forces)
TYPE(qs_environment_type), POINTER :: qs_env
REAL(dp), INTENT(INOUT) :: erep
REAL(dp), INTENT(IN) :: kf, enscale
LOGICAL, INTENT(IN) :: calculate_forces
CHARACTER(len=*), PARAMETER :: routineN = 'repulsive_potential'
INTEGER :: atom_a, atom_b, handle, iatom, ikind, &
jatom, jkind, za, zb
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind
INTEGER, DIMENSION(3) :: cell
LOGICAL :: defined, use_virial
REAL(KIND=dp) :: alphaa, alphab, den2, den4, derepij, dr, &
ena, enb, ens, erepij, f1, sal, &
zneffa, zneffb
REAL(KIND=dp), DIMENSION(3) :: force_rr, rij
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atprop_type), POINTER :: atprop
TYPE(neighbor_list_iterator_p_type), &
DIMENSION(:), POINTER :: nl_iterator
TYPE(neighbor_list_set_p_type), DIMENSION(:), &
POINTER :: sab_xtb_pp
TYPE(qs_force_type), DIMENSION(:), POINTER :: force
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(virial_type), POINTER :: virial
TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
CALL timeset(routineN, handle)
erep = 0._dp
CALL get_qs_env(qs_env=qs_env, &
atomic_kind_set=atomic_kind_set, &
qs_kind_set=qs_kind_set, &
atprop=atprop, &
sab_xtb_pp=sab_xtb_pp)
CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind)
IF (calculate_forces) THEN
CALL get_qs_env(qs_env=qs_env, virial=virial, force=force)
use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
END IF
CALL neighbor_list_iterator_create(nl_iterator, sab_xtb_pp)
DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
iatom=iatom, jatom=jatom, r=rij, cell=cell)
CALL get_qs_kind(qs_kind_set(ikind), zatom=za, xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, defined=defined)
IF (.NOT. defined) CYCLE
CALL get_qs_kind(qs_kind_set(jkind), zatom=zb, xtb_parameter=xtb_atom_b)
CALL get_xtb_atom_param(xtb_atom_b, defined=defined)
IF (.NOT. defined) CYCLE
dr = SQRT(SUM(rij(:)**2))
! repulsive potential
IF (dr > 0.001_dp) THEN
! atomic parameters
CALL get_xtb_atom_param(xtb_atom_a, en=ena, alpha=alphaa, zneff=zneffa)
CALL get_xtb_atom_param(xtb_atom_b, en=enb, alpha=alphab, zneff=zneffb)
! scaling (not in papers! but in code)
den2 = (ena - enb)**2
den4 = den2*den2
sal = SQRT(alphaa*alphab)
ens = 1.0_dp + (0.01_dp*den2 + 0.01_dp*den4)*enscale
erepij = zneffa*zneffb/dr*EXP(-ens*sal*dr**kf)
erep = erep + erepij
IF (atprop%energy) THEN
atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*erepij
atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*erepij
END IF
IF (calculate_forces .AND. (iatom /= jatom .OR. dr > 0.001_dp)) THEN
derepij = -(1.0_dp/dr + ens*sal*kf*dr**(kf - 1.0_dp))*erepij
force_rr(1) = derepij*rij(1)/dr
force_rr(2) = derepij*rij(2)/dr
force_rr(3) = derepij*rij(3)/dr
atom_a = atom_of_kind(iatom)
atom_b = atom_of_kind(jatom)
force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - force_rr(:)
force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + force_rr(:)
IF (use_virial) THEN
f1 = 1.0_dp
IF (iatom == jatom) f1 = 0.5_dp
CALL virial_pair_force(virial%pv_virial, -f1, force_rr, rij)
END IF
END IF
END IF
END DO
CALL neighbor_list_iterator_release(nl_iterator)
CALL timestop(handle)
END SUBROUTINE repulsive_potential
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param esrb ...
!> \param calculate_forces ...
!> \param xtb_control ...
!> \param cnumbers ...
!> \param dcnum ...
! **************************************************************************************************
SUBROUTINE srb_potential(qs_env, esrb, calculate_forces, xtb_control, cnumbers, dcnum)
TYPE(qs_environment_type), POINTER :: qs_env
REAL(dp), INTENT(INOUT) :: esrb
LOGICAL, INTENT(IN) :: calculate_forces
TYPE(xtb_control_type), POINTER :: xtb_control
REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: cnumbers
TYPE(dcnum_type), DIMENSION(:), INTENT(IN) :: dcnum
CHARACTER(len=*), PARAMETER :: routineN = 'srb_potential'
REAL(KIND=dp), DIMENSION(5:9), PARAMETER :: &
cnfac = (/0.05646607_dp, 0.10514203_dp, 0.09753494_dp, 0.30470380_dp, 0.23261783_dp/), &
ensrb = (/2.20568300_dp, 2.49640820_dp, 2.81007174_dp, 4.51078438_dp, 4.67476223_dp/), &
r0srb = (/1.35974851_dp, 0.98310699_dp, 0.98423007_dp, 0.76716063_dp, 1.06139799_dp/)
INTEGER :: atom_a, atom_b, atom_c, handle, i, &
iatom, ikind, jatom, jkind, katom, &
kkind, za, zb
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of
INTEGER, DIMENSION(3) :: cell
LOGICAL :: defined, use_virial
REAL(KIND=dp) :: c1srb, c2srb, den1, den2, desrbij, dr, &
dr0, drk, enta, entb, esrbij, etasrb, &
f1, fhua, fhub, gscal, ksrb, rra0, &
rrb0, shift
REAL(KIND=dp), DIMENSION(3) :: fdik, fdika, fdikb, force_rr, rij, rik
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atprop_type), POINTER :: atprop
TYPE(neighbor_list_iterator_p_type), &
DIMENSION(:), POINTER :: nl_iterator
TYPE(neighbor_list_set_p_type), DIMENSION(:), &
POINTER :: sab_xtb_pp
TYPE(qs_force_type), DIMENSION(:), POINTER :: force
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(virial_type), POINTER :: virial
TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
CALL timeset(routineN, handle)
esrb = 0._dp
CALL get_qs_env(qs_env=qs_env, &
atomic_kind_set=atomic_kind_set, &
qs_kind_set=qs_kind_set, &
atprop=atprop, &
sab_xtb_pp=sab_xtb_pp)
CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind, &
kind_of=kind_of)
IF (calculate_forces) THEN
CALL get_qs_env(qs_env=qs_env, virial=virial, force=force)
use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
END IF
! SRB parameters
ksrb = xtb_control%ksrb
etasrb = xtb_control%esrb
c1srb = xtb_control%c1srb*0.01_dp
c2srb = xtb_control%c2srb*0.01_dp
gscal = xtb_control%gscal
shift = xtb_control%shift
CALL neighbor_list_iterator_create(nl_iterator, sab_xtb_pp)
DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
iatom=iatom, jatom=jatom, r=rij, cell=cell)
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, z=za, electronegativity=enta, defined=defined)
IF (.NOT. defined) CYCLE
CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
CALL get_xtb_atom_param(xtb_atom_b, z=zb, electronegativity=entb, defined=defined)
IF (.NOT. defined) CYCLE
dr = SQRT(SUM(rij(:)**2))
! short-ranged correction term
IF (dr > 0.001_dp) THEN
IF (za >= 5 .AND. za <= 9 .AND. zb >= 5 .AND. zb <= 9 .AND. za /= zb) THEN
rra0 = r0srb(za) + cnfac(za)*cnumbers(iatom) + shift
rrb0 = r0srb(zb) + cnfac(zb)*cnumbers(jatom) + shift
den1 = ABS(ensrb(za) - ensrb(zb))
dr0 = (rra0 + rrb0)*(1._dp - c1srb*den1 - c2srb*den1*den1)
den2 = (enta - entb)**2
esrbij = ksrb*EXP(-etasrb*(1._dp + gscal*den2)*(dr - dr0)**2)
esrb = esrb + esrbij
IF (atprop%energy) THEN
atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*esrbij
atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*esrbij
END IF
IF (calculate_forces) THEN
desrbij = 2.0_dp*esrbij*(-etasrb*(1._dp + gscal*den2)*(dr - dr0))
force_rr(1) = desrbij*rij(1)/dr
force_rr(2) = desrbij*rij(2)/dr
force_rr(3) = desrbij*rij(3)/dr
atom_a = atom_of_kind(iatom)
atom_b = atom_of_kind(jatom)
force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - force_rr(:)
force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + force_rr(:)
IF (use_virial) THEN
f1 = 1.0_dp
IF (iatom == jatom) f1 = 0.5_dp
CALL virial_pair_force(virial%pv_virial, -f1, force_rr, rij)
END IF
! coordination number derivatives
! iatom
fhua = -desrbij*cnfac(za)*(1._dp - c1srb*den1 - c2srb*den1*den1)
DO i = 1, dcnum(iatom)%neighbors
katom = dcnum(iatom)%nlist(i)
kkind = kind_of(katom)
atom_c = atom_of_kind(katom)
rik = dcnum(iatom)%rik(:, i)
drk = SQRT(SUM(rik(:)**2))
IF (drk > 1.e-3_dp) THEN
fdika(:) = fhua*dcnum(iatom)%dvals(i)*rik(:)/drk
force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - fdika(:)
force(kkind)%repulsive(:, atom_c) = force(kkind)%repulsive(:, atom_c) + fdika(:)
IF (use_virial) THEN
fdik = fdika + fdikb
CALL virial_pair_force(virial%pv_virial, -1._dp, fdik, rik)
END IF
END IF
END DO
! jatom
fhub = -desrbij*cnfac(zb)*(1._dp - c1srb*den1 - c2srb*den1*den1)
DO i = 1, dcnum(jatom)%neighbors
katom = dcnum(jatom)%nlist(i)
kkind = kind_of(katom)
atom_c = atom_of_kind(katom)
rik = dcnum(jatom)%rik(:, i)
drk = SQRT(SUM(rik(:)**2))
IF (drk > 1.e-3_dp) THEN
fdik(:) = fhub*dcnum(jatom)%dvals(i)*rik(:)/drk
force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) - fdik(:)
force(kkind)%repulsive(:, atom_c) = force(kkind)%repulsive(:, atom_c) + fdik(:)
IF (use_virial) THEN
CALL virial_pair_force(virial%pv_virial, -1._dp, fdik, rik)
END IF
END IF
END DO
END IF
END IF
END IF
END DO
CALL neighbor_list_iterator_release(nl_iterator)
CALL timestop(handle)
END SUBROUTINE srb_potential
! **************************************************************************************************
!> \brief ...
!> \param qs_kind_set ...
!> \param ppradius ...
!> \param eps_pair ...
!> \param kfparam ...
! **************************************************************************************************
SUBROUTINE xtb_pp_radius(qs_kind_set, ppradius, eps_pair, kfparam)
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT) :: ppradius
REAL(KIND=dp), INTENT(IN) :: eps_pair, kfparam
INTEGER :: ikind, ir, jkind, nkind
LOGICAL :: defa, defb
REAL(KIND=dp) :: alphaa, alphab, erep, rab, rab0, rcova, &
rcovb, saa, zneffa, zneffb
TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
ppradius = 0.0_dp
nkind = SIZE(ppradius, 1)
DO ikind = 1, nkind
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, rcov=rcova, alpha=alphaa, zneff=zneffa, defined=defa)
IF (.NOT. defa) CYCLE
DO jkind = ikind, nkind
CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
CALL get_xtb_atom_param(xtb_atom_b, rcov=rcovb, alpha=alphab, zneff=zneffb, defined=defb)
IF (.NOT. defb) CYCLE
rab = 0.0_dp
DO ir = 1, 24
rab = rab + 1.0_dp
saa = SQRT(alphaa*alphab)
erep = zneffa*zneffb/rab*EXP(-saa*rab**kfparam)
IF (erep < eps_pair) EXIT
END DO
rab0 = rcova + rcovb
rab = MAX(rab, rab0 + 2.0_dp)
ppradius(ikind, jkind) = rab
ppradius(jkind, ikind) = ppradius(ikind, jkind)
END DO
END DO
END SUBROUTINE xtb_pp_radius
! **************************************************************************************************
!> \brief ...
!> \param qs_env ...
!> \param exb ...
!> \param calculate_forces ...
! **************************************************************************************************
SUBROUTINE xb_interaction(qs_env, exb, calculate_forces)
TYPE(qs_environment_type), POINTER :: qs_env
REAL(KIND=dp), INTENT(INOUT) :: exb
LOGICAL, INTENT(IN) :: calculate_forces
CHARACTER(LEN=*), PARAMETER :: routineN = 'xb_interaction'
INTEGER :: atom_a, atom_b, handle, iatom, ikind, &
jatom, jkind, na, natom, nkind, zat
INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of
INTEGER, DIMENSION(3) :: cell
LOGICAL :: defined, use_virial
REAL(KIND=dp) :: dr, kx2, kxr, rcova, rcovb
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: kx
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rcab
REAL(KIND=dp), DIMENSION(3) :: rij
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
TYPE(atprop_type), POINTER :: atprop
TYPE(dft_control_type), POINTER :: dft_control
TYPE(mp_para_env_type), POINTER :: para_env
TYPE(neighbor_atoms_type), ALLOCATABLE, &
DIMENSION(:) :: neighbor_atoms
TYPE(neighbor_list_iterator_p_type), &
DIMENSION(:), POINTER :: nl_iterator
TYPE(neighbor_list_set_p_type), DIMENSION(:), &
POINTER :: sab_xb, sab_xtb_pp
TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
TYPE(qs_force_type), DIMENSION(:), POINTER :: force
TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
TYPE(virial_type), POINTER :: virial
TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
TYPE(xtb_control_type), POINTER :: xtb_control
CALL timeset(routineN, handle)
CALL get_qs_env(qs_env=qs_env, &
atomic_kind_set=atomic_kind_set, &
qs_kind_set=qs_kind_set, &
para_env=para_env, &
atprop=atprop, &
dft_control=dft_control, &
sab_xb=sab_xb, &
sab_xtb_pp=sab_xtb_pp)
nkind = SIZE(atomic_kind_set)
xtb_control => dft_control%qs_control%xtb_control
! global parameters
kxr = xtb_control%kxr
kx2 = xtb_control%kx2
NULLIFY (particle_set)
CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
natom = SIZE(particle_set)
CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind)
CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
IF (calculate_forces) THEN
CALL get_qs_env(qs_env=qs_env, virial=virial, force=force)
use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
END IF
! list of neighbor atoms for XB term
ALLOCATE (neighbor_atoms(nkind))
DO ikind = 1, nkind
NULLIFY (neighbor_atoms(ikind)%coord)
NULLIFY (neighbor_atoms(ikind)%rab)
NULLIFY (neighbor_atoms(ikind)%katom)
CALL get_atomic_kind(atomic_kind_set(ikind), z=zat, natom=na)
IF (zat == 17 .OR. zat == 35 .OR. zat == 53 .OR. zat == 85) THEN
ALLOCATE (neighbor_atoms(ikind)%coord(3, na))
neighbor_atoms(ikind)%coord(1:3, 1:na) = 0.0_dp
ALLOCATE (neighbor_atoms(ikind)%rab(na))
neighbor_atoms(ikind)%rab(1:na) = HUGE(0.0_dp)
ALLOCATE (neighbor_atoms(ikind)%katom(na))
neighbor_atoms(ikind)%katom(1:na) = 0
END IF
END DO
! kx parameters
ALLOCATE (kx(nkind))
DO ikind = 1, nkind
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, kx=kx(ikind))
END DO
!
ALLOCATE (rcab(nkind, nkind))
DO ikind = 1, nkind
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, rcov=rcova)
DO jkind = 1, nkind
CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
CALL get_xtb_atom_param(xtb_atom_b, rcov=rcovb)
rcab(ikind, jkind) = kxr*(rcova + rcovb)
END DO
END DO
CALL neighbor_list_iterator_create(nl_iterator, sab_xtb_pp)
DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
iatom=iatom, jatom=jatom, r=rij, cell=cell)
CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
CALL get_xtb_atom_param(xtb_atom_a, defined=defined)
IF (.NOT. defined) CYCLE
CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
CALL get_xtb_atom_param(xtb_atom_b, defined=defined)
IF (.NOT. defined) CYCLE
dr = SQRT(SUM(rij(:)**2))
! neighbor atom for XB term
IF (dr > 1.e-3_dp) THEN
IF (ASSOCIATED(neighbor_atoms(ikind)%rab)) THEN
atom_a = atom_of_kind(iatom)
IF (dr < neighbor_atoms(ikind)%rab(atom_a)) THEN
neighbor_atoms(ikind)%rab(atom_a) = dr
neighbor_atoms(ikind)%coord(1:3, atom_a) = rij(1:3)
neighbor_atoms(ikind)%katom(atom_a) = jatom
END IF
END IF
IF (ASSOCIATED(neighbor_atoms(jkind)%rab)) THEN
atom_b = atom_of_kind(jatom)
IF (dr < neighbor_atoms(jkind)%rab(atom_b)) THEN
neighbor_atoms(jkind)%rab(atom_b) = dr
neighbor_atoms(jkind)%coord(1:3, atom_b) = -rij(1:3)
neighbor_atoms(jkind)%katom(atom_b) = iatom
END IF
END IF
END IF
END DO
CALL neighbor_list_iterator_release(nl_iterator)
exb = 0.0_dp
CALL xb_neighbors(neighbor_atoms, para_env)
CALL xb_energy(exb, neighbor_atoms, atom_of_kind, kind_of, sab_xb, kx, kx2, rcab, &
calculate_forces, use_virial, force, virial, atprop)
DO ikind = 1, nkind
IF (ASSOCIATED(neighbor_atoms(ikind)%coord)) THEN
DEALLOCATE (neighbor_atoms(ikind)%coord)
END IF
IF (ASSOCIATED(neighbor_atoms(ikind)%rab)) THEN
DEALLOCATE (neighbor_atoms(ikind)%rab)
END IF
IF (ASSOCIATED(neighbor_atoms(ikind)%katom)) THEN
DEALLOCATE (neighbor_atoms(ikind)%katom)
END IF
END DO
DEALLOCATE (neighbor_atoms)
DEALLOCATE (kx, rcab)
CALL timestop(handle)
END SUBROUTINE xb_interaction
! **************************************************************************************************
!> \brief Distributes the neighbor atom information to all processors
!>
!> \param neighbor_atoms ...
!> \param para_env ...
!> \par History
!> 1.2019 JGH
!> \version 1.1
! **************************************************************************************************
SUBROUTINE xb_neighbors(neighbor_atoms, para_env)
TYPE(neighbor_atoms_type), DIMENSION(:), &
INTENT(INOUT) :: neighbor_atoms
TYPE(mp_para_env_type), POINTER :: para_env
INTEGER :: iatom, ikind, natom, nkind
INTEGER, ALLOCATABLE, DIMENSION(:) :: matom
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: dmloc
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: coord
nkind = SIZE(neighbor_atoms)
DO ikind = 1, nkind
IF (ASSOCIATED(neighbor_atoms(ikind)%rab)) THEN
natom = SIZE(neighbor_atoms(ikind)%rab)
ALLOCATE (dmloc(2*natom), matom(natom), coord(3, natom))
dmloc = 0.0_dp
DO iatom = 1, natom
dmloc(2*iatom - 1) = neighbor_atoms(ikind)%rab(iatom)
dmloc(2*iatom) = REAL(para_env%mepos, KIND=dp)
END DO
CALL para_env%minloc(dmloc)
coord = 0.0_dp
matom = 0
DO iatom = 1, natom
neighbor_atoms(ikind)%rab(iatom) = dmloc(2*iatom - 1)
IF (NINT(dmloc(2*iatom)) == para_env%mepos) THEN
coord(1:3, iatom) = neighbor_atoms(ikind)%coord(1:3, iatom)
matom(iatom) = neighbor_atoms(ikind)%katom(iatom)
END IF
END DO
CALL para_env%sum(coord)
neighbor_atoms(ikind)%coord(1:3, :) = coord(1:3, :)
CALL para_env%sum(matom)
neighbor_atoms(ikind)%katom(:) = matom(:)
DEALLOCATE (dmloc, matom, coord)
END IF
END DO
END SUBROUTINE xb_neighbors
! **************************************************************************************************
!> \brief Computes a correction for nonbonded interactions based on a generic potential
!>
!> \param enonbonded energy contribution
!> \param force ...
!> \param qs_env ...
!> \param xtb_control ...
!> \param sab_xtb_nonbond ...
!> \param atomic_kind_set ...
!> \param calculate_forces ...
!> \param use_virial ...
!> \param virial ...
!> \param atprop ...
!> \param atom_of_kind ..
!> \par History
!> 12.2018 JGH
!> \version 1.1
! **************************************************************************************************
SUBROUTINE nonbonded_correction(enonbonded, force, qs_env, xtb_control, sab_xtb_nonbond, &
atomic_kind_set, calculate_forces, use_virial, virial, atprop, atom_of_kind)
REAL(dp), INTENT(INOUT) :: enonbonded
TYPE(qs_force_type), DIMENSION(:), INTENT(INOUT), &
POINTER :: force
TYPE(qs_environment_type), POINTER :: qs_env
TYPE(xtb_control_type), POINTER :: xtb_control
TYPE(neighbor_list_set_p_type), DIMENSION(:), &
INTENT(IN), POINTER :: sab_xtb_nonbond
TYPE(atomic_kind_type), DIMENSION(:), INTENT(IN), &
POINTER :: atomic_kind_set
LOGICAL, INTENT(IN) :: calculate_forces, use_virial
TYPE(virial_type), INTENT(IN), POINTER :: virial
TYPE(atprop_type), INTENT(IN), POINTER :: atprop
INTEGER, DIMENSION(:), INTENT(IN) :: atom_of_kind
CHARACTER(len=*), PARAMETER :: routineN = 'nonbonded_correction'
CHARACTER(LEN=default_string_length) :: def_error, this_error
INTEGER :: atom_i, atom_j, handle, iatom, ikind, &
jatom, jkind, kk, ntype
INTEGER, DIMENSION(3) :: cell
LOGICAL :: do_ewald
REAL(KIND=dp) :: dedf, dr, dx, energy_cutoff, err, fval, &
lerr, rcut
REAL(KIND=dp), DIMENSION(3) :: fij, rij
TYPE(ewald_environment_type), POINTER :: ewald_env
TYPE(neighbor_list_iterator_p_type), &
DIMENSION(:), POINTER :: nl_iterator
TYPE(pair_potential_p_type), POINTER :: nonbonded
TYPE(pair_potential_pp_type), POINTER :: potparm
TYPE(pair_potential_single_type), POINTER :: pot
TYPE(section_vals_type), POINTER :: nonbonded_section
CALL timeset(routineN, handle)
NULLIFY (nonbonded)
NULLIFY (potparm)
NULLIFY (ewald_env)
nonbonded => xtb_control%nonbonded
do_ewald = xtb_control%do_ewald
CALL get_qs_env(qs_env=qs_env, ewald_env=ewald_env)
ntype = SIZE(atomic_kind_set)
CALL pair_potential_pp_create(potparm, ntype)
!Assign input and potential info to potparm_nonbond
CALL force_field_pack_nonbond_pot_correction(atomic_kind_set, nonbonded, potparm, ewald_env, do_ewald)
!Initialize genetic potential
CALL init_genpot(potparm, ntype)
NULLIFY (pot)
enonbonded = 0._dp
energy_cutoff = 0._dp
CALL neighbor_list_iterator_create(nl_iterator, sab_xtb_nonbond)
DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
iatom=iatom, jatom=jatom, r=rij, cell=cell)
pot => potparm%pot(ikind, jkind)%pot
dr = SQRT(rij(1)**2 + rij(2)**2 + rij(3)**2)
rcut = SQRT(pot%rcutsq)
IF (dr <= rcut .AND. dr > 1.E-3_dp) THEN
fval = 1.0_dp
IF (ikind == jkind) fval = 0.5_dp
! splines not implemented
enonbonded = enonbonded + fval*ener_pot(pot, dr, energy_cutoff)
IF (atprop%energy) THEN
atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*fval*ener_pot(pot, dr, energy_cutoff)
atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*fval*ener_pot(pot, dr, energy_cutoff)
END IF
END IF
IF (calculate_forces) THEN
kk = SIZE(pot%type)
IF (kk /= 1) THEN
CALL cp_warn(__LOCATION__, "Generic potential with type > 1 not implemented.")
CPABORT("pot type")
END IF
! rmin and rmax and rcut
IF ((pot%set(kk)%rmin /= not_initialized) .AND. (dr < pot%set(kk)%rmin)) CYCLE
! An upper boundary for the potential definition was defined
IF ((pot%set(kk)%rmax /= not_initialized) .AND. (dr >= pot%set(kk)%rmax)) CYCLE
! If within limits let's compute the potential...
IF (dr <= rcut .AND. dr > 1.E-3_dp) THEN
NULLIFY (nonbonded_section)
nonbonded_section => section_vals_get_subs_vals(qs_env%input, "DFT%QS%xTB%NONBONDED")
CALL section_vals_val_get(nonbonded_section, "DX", r_val=dx)
CALL section_vals_val_get(nonbonded_section, "ERROR_LIMIT", r_val=lerr)
dedf = fval*evalfd(pot%set(kk)%gp%myid, 1, pot%set(kk)%gp%values, dx, err)
IF (ABS(err) > lerr) THEN
WRITE (this_error, "(A,G12.6,A)") "(", err, ")"
WRITE (def_error, "(A,G12.6,A)") "(", lerr, ")"
CALL compress(this_error, .TRUE.)
CALL compress(def_error, .TRUE.)
CALL cp_warn(__LOCATION__, &
'ASSERTION (cond) failed at line '//cp_to_string(__LINE__)// &
' Error '//TRIM(this_error)//' in computing numerical derivatives larger then'// &
TRIM(def_error)//' .')
END IF
atom_i = atom_of_kind(iatom)
atom_j = atom_of_kind(jatom)
fij(1:3) = dedf*rij(1:3)/pot%set(kk)%gp%values(1)
force(ikind)%repulsive(:, atom_i) = force(ikind)%repulsive(:, atom_i) - fij(:)
force(jkind)%repulsive(:, atom_j) = force(jkind)%repulsive(:, atom_j) + fij(:)
IF (use_virial) THEN
CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
END IF
END IF
END IF
NULLIFY (pot)
END DO
CALL neighbor_list_iterator_release(nl_iterator)
CALL finalizef()
IF (ASSOCIATED(potparm)) THEN
CALL pair_potential_pp_release(potparm)
END IF
CALL timestop(handle)
END SUBROUTINE nonbonded_correction
! **************************************************************************************************
!> \brief ...
!> \param atomic_kind_set ...
!> \param nonbonded ...
!> \param potparm ...
!> \param ewald_env ...
!> \param do_ewald ...
! **************************************************************************************************
SUBROUTINE force_field_pack_nonbond_pot_correction(atomic_kind_set, nonbonded, potparm, ewald_env, do_ewald)
! routine based on force_field_pack_nonbond
TYPE(atomic_kind_type), DIMENSION(:), INTENT(IN), &
POINTER :: atomic_kind_set
TYPE(pair_potential_p_type), INTENT(IN), POINTER :: nonbonded
TYPE(pair_potential_pp_type), INTENT(INOUT), &
POINTER :: potparm
TYPE(ewald_environment_type), INTENT(IN), POINTER :: ewald_env
LOGICAL, INTENT(IN) :: do_ewald
CHARACTER(LEN=default_string_length) :: name_atm_a, name_atm_a_local, &
name_atm_b, name_atm_b_local
INTEGER :: ikind, ingp, iw, jkind
LOGICAL :: found
REAL(KIND=dp) :: ewald_rcut
TYPE(atomic_kind_type), POINTER :: atomic_kind
TYPE(cp_logger_type), POINTER :: logger
TYPE(pair_potential_single_type), POINTER :: pot
NULLIFY (pot, logger)
logger => cp_get_default_logger()
iw = cp_logger_get_default_io_unit(logger)
DO ikind = 1, SIZE(atomic_kind_set)
atomic_kind => atomic_kind_set(ikind)
CALL get_atomic_kind(atomic_kind=atomic_kind, name=name_atm_a_local)
DO jkind = ikind, SIZE(atomic_kind_set)
atomic_kind => atomic_kind_set(jkind)
CALL get_atomic_kind(atomic_kind=atomic_kind, name=name_atm_b_local)
found = .FALSE.
name_atm_a = name_atm_a_local
name_atm_b = name_atm_b_local
CALL uppercase(name_atm_a)
CALL uppercase(name_atm_b)
pot => potparm%pot(ikind, jkind)%pot
IF (ASSOCIATED(nonbonded)) THEN
DO ingp = 1, SIZE(nonbonded%pot)
IF ((TRIM(nonbonded%pot(ingp)%pot%at1) == "*") .OR. &
(TRIM(nonbonded%pot(ingp)%pot%at2) == "*")) CYCLE
!IF (iw > 0) WRITE (iw, *) "TESTING ", TRIM(name_atm_a), TRIM(name_atm_b), &
! " with ", TRIM(nonbonded%pot(ingp)%pot%at1), &
! TRIM(nonbonded%pot(ingp)%pot%at2)
IF ((((name_atm_a) == (nonbonded%pot(ingp)%pot%at1)) .AND. &
((name_atm_b) == (nonbonded%pot(ingp)%pot%at2))) .OR. &
(((name_atm_b) == (nonbonded%pot(ingp)%pot%at1)) .AND. &
((name_atm_a) == (nonbonded%pot(ingp)%pot%at2)))) THEN
CALL pair_potential_single_copy(nonbonded%pot(ingp)%pot, pot)
! multiple potential not implemented, simply overwriting
IF (found) &
CALL cp_warn(__LOCATION__, &
"Multiple NONBONDED declaration: "//TRIM(name_atm_a)// &
" and "//TRIM(name_atm_b)//" OVERWRITING! ")
!IF (iw > 0) WRITE (iw, *) " FOUND ", TRIM(name_atm_a), " ", TRIM(name_atm_b)
found = .TRUE.
END IF
END DO
END IF
IF (.NOT. found) THEN
CALL pair_potential_single_clean(pot)
!IF (iw > 0) WRITE (iw, *) " NOTFOUND ", TRIM(name_atm_a), " ", TRIM(name_atm_b)
END IF
END DO !jkind
END DO !ikind
! Cutoff is defined always as the maximum between the FF and Ewald
IF (do_ewald) THEN
CALL ewald_env_get(ewald_env, rcut=ewald_rcut)
pot%rcutsq = MAX(pot%rcutsq, ewald_rcut*ewald_rcut)
!IF (iw > 0) WRITE (iw, *) " RCUT ", SQRT(pot%rcutsq), ewald_rcut
END IF
END SUBROUTINE force_field_pack_nonbond_pot_correction
! **************************************************************************************************
!> \brief Computes the interaction term between Br/I/At and donor atoms
!>
!> \param exb ...
!> \param neighbor_atoms ...
!> \param atom_of_kind ...
!> \param kind_of ...
!> \param sab_xb ...
!> \param kx ...
!> \param kx2 ...
!> \param rcab ...
!> \param calculate_forces ...
!> \param use_virial ...
!> \param force ...
!> \param virial ...
!> \param atprop ...
!> \par History
!> 12.2018 JGH
!> \version 1.1
! **************************************************************************************************
SUBROUTINE xb_energy(exb, neighbor_atoms, atom_of_kind, kind_of, sab_xb, kx, kx2, rcab, &
calculate_forces, use_virial, force, virial, atprop)
REAL(dp), INTENT(INOUT) :: exb
TYPE(neighbor_atoms_type), DIMENSION(:), &
INTENT(IN) :: neighbor_atoms
INTEGER, DIMENSION(:), INTENT(IN) :: atom_of_kind, kind_of
TYPE(neighbor_list_set_p_type), DIMENSION(:), &
POINTER :: sab_xb
REAL(dp), DIMENSION(:), INTENT(IN) :: kx
REAL(dp), INTENT(IN) :: kx2
REAL(dp), DIMENSION(:, :), INTENT(IN) :: rcab
LOGICAL, INTENT(IN) :: calculate_forces, use_virial
TYPE(qs_force_type), DIMENSION(:), POINTER :: force
TYPE(virial_type), POINTER :: virial
TYPE(atprop_type), POINTER :: atprop
INTEGER :: atom_a, atom_b, atom_c, iatom, ikind, &
jatom, jkind, katom, kkind
INTEGER, DIMENSION(3) :: cell
REAL(KIND=dp) :: alp, aterm, cosa, daterm, ddab, ddax, &
ddbx, ddr, ddr12, ddr6, deval, dr, &
drab, drax, drbx, eval, xy
REAL(KIND=dp), DIMENSION(3) :: fia, fij, fja, ria, rij, rja
TYPE(neighbor_list_iterator_p_type), &
DIMENSION(:), POINTER :: nl_iterator
! exonent in angular term
alp = 6.0_dp
! loop over all atom pairs
CALL neighbor_list_iterator_create(nl_iterator, sab_xb)
DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
iatom=iatom, jatom=jatom, r=rij, cell=cell)
! ikind, iatom : Halogen
! jkind, jatom : Donor
atom_a = atom_of_kind(iatom)
katom = neighbor_atoms(ikind)%katom(atom_a)
IF (katom == 0) CYCLE
dr = SQRT(rij(1)**2 + rij(2)**2 + rij(3)**2)
ddr = rcab(ikind, jkind)/dr
ddr6 = ddr**6
ddr12 = ddr6*ddr6
eval = kx(ikind)*(ddr12 - kx2*ddr6)/(1.0_dp + ddr12)
! angle
ria(1:3) = neighbor_atoms(ikind)%coord(1:3, atom_a)
rja(1:3) = rij(1:3) - ria(1:3)
drax = ria(1)**2 + ria(2)**2 + ria(3)**2
drbx = dr*dr
drab = rja(1)**2 + rja(2)**2 + rja(3)**2
xy = SQRT(drbx*drax)
! cos angle B-X-A
cosa = (drbx + drax - drab)/xy
aterm = (0.5_dp - 0.25_dp*cosa)**alp
!
exb = exb + aterm*eval
IF (atprop%energy) THEN
atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*aterm*eval
atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*aterm*eval
END IF
!
IF (calculate_forces) THEN
kkind = kind_of(katom)
atom_b = atom_of_kind(jatom)
atom_c = atom_of_kind(katom)
!
deval = 6.0_dp*kx(ikind)*ddr6*(kx2*ddr12 + 2.0_dp*ddr6 - kx2)/(1.0_dp + ddr12)**2
deval = -rcab(ikind, jkind)*deval/(dr*dr)/ddr
fij(1:3) = aterm*deval*rij(1:3)/dr
force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - fij(:)
force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + fij(:)
IF (use_virial) THEN
CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
END IF
!
fij(1:3) = 0.0_dp
fia(1:3) = 0.0_dp
fja(1:3) = 0.0_dp
daterm = -0.25_dp*alp*(0.5_dp - 0.25_dp*cosa)**(alp - 1.0_dp)
ddbx = 0.5_dp*(drab - drax + drbx)/xy/drbx
ddax = 0.5_dp*(drab + drax - drbx)/xy/drax
ddab = -1._dp/xy
fij(1:3) = 2.0_dp*daterm*ddbx*rij(1:3)*eval
fia(1:3) = 2.0_dp*daterm*ddax*ria(1:3)*eval
fja(1:3) = 2.0_dp*daterm*ddab*rja(1:3)*eval
force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - fij(:) - fia(:)
force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + fij(:) + fja(:)
force(kkind)%repulsive(:, atom_c) = force(kkind)%repulsive(:, atom_c) + fia(:) - fja(:)
IF (use_virial) THEN
CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
CALL virial_pair_force(virial%pv_virial, -1._dp, fia, ria)
CALL virial_pair_force(virial%pv_virial, -1._dp, fja, rja)
END IF
END IF
END DO
CALL neighbor_list_iterator_release(nl_iterator)
END SUBROUTINE xb_energy
END MODULE xtb_potentials

View file

@ -69,6 +69,15 @@ MODULE xtb_types
REAL(KIND=dp), DIMENSION(5) :: kappa = -1.0_dp
REAL(KIND=dp), DIMENSION(5) :: hen = -1.0_dp
REAL(KIND=dp), DIMENSION(5) :: zeta = -1.0_dp
! gfn0 params
REAL(KIND=dp) :: en = -1.0_dp
REAL(KIND=dp) :: kqat2 = -1.0_dp
REAL(KIND=dp), DIMENSION(5) :: kq = -1.0_dp
REAL(KIND=dp), DIMENSION(5) :: kcn = -1.0_dp
! charge equilibration parameter gfn0
REAL(KIND=dp) :: xi = -1.0_dp
REAL(KIND=dp) :: kappa0 = -1.0_dp
REAL(KIND=dp) :: alpg = -1.0_dp
! AO to shell pointer
INTEGER, DIMENSION(25) :: nao = -1, lao = -1
! Upper limit of Mulliken charge
@ -119,6 +128,13 @@ CONTAINS
xtb_parameter%kappa = 0.0_dp
xtb_parameter%hen = 0.0_dp
xtb_parameter%zeta = 0.0_dp
xtb_parameter%en = 0.0_dp
xtb_parameter%kqat2 = 0.0_dp
xtb_parameter%kq = 0.0_dp
xtb_parameter%kcn = 0.0_dp
xtb_parameter%xi = 0.0_dp
xtb_parameter%kappa0 = 0.0_dp
xtb_parameter%alpg = 0.0_dp
xtb_parameter%nao = 0
xtb_parameter%lao = 0
xtb_parameter%chmax = 0.0_dp
@ -165,13 +181,21 @@ CONTAINS
!> \param kappa ...
!> \param hen ...
!> \param zeta ...
!> \param xi ...
!> \param kappa0 ...
!> \param alpg ...
!> \param occupation ...
!> \param electronegativity ...
!> \param chmax ...
!> \param en ...
!> \param kqat2 ...
!> \param kcn ...
!> \param kq ...
! **************************************************************************************************
SUBROUTINE get_xtb_atom_param(xtb_parameter, symbol, aname, typ, defined, z, zeff, natorb, lmax, nao, lao, &
rcut, rcov, kx, eta, xgamma, alpha, zneff, nshell, nval, lval, kpoly, kappa, &
hen, zeta, occupation, electronegativity, chmax)
hen, zeta, xi, kappa0, alpg, occupation, electronegativity, chmax, &
en, kqat2, kcn, kq)
TYPE(xtb_atom_type), POINTER :: xtb_parameter
CHARACTER(LEN=2), INTENT(OUT), OPTIONAL :: symbol
@ -186,8 +210,10 @@ CONTAINS
INTEGER, INTENT(OUT), OPTIONAL :: nshell
INTEGER, DIMENSION(5), INTENT(OUT), OPTIONAL :: nval, lval
REAL(KIND=dp), DIMENSION(5), INTENT(OUT), OPTIONAL :: kpoly, kappa, hen, zeta
REAL(KIND=dp), INTENT(OUT), OPTIONAL :: xi, kappa0, alpg
INTEGER, DIMENSION(5), INTENT(OUT), OPTIONAL :: occupation
REAL(KIND=dp), INTENT(OUT), OPTIONAL :: electronegativity, chmax
REAL(KIND=dp), INTENT(OUT), OPTIONAL :: electronegativity, chmax, en, kqat2
REAL(KIND=dp), DIMENSION(5), INTENT(OUT), OPTIONAL :: kcn, kq
CPASSERT(ASSOCIATED(xtb_parameter))
@ -219,6 +245,13 @@ CONTAINS
IF (PRESENT(hen)) hen = xtb_parameter%hen
IF (PRESENT(zeta)) zeta = xtb_parameter%zeta
IF (PRESENT(chmax)) chmax = xtb_parameter%chmax
IF (PRESENT(xi)) xi = xtb_parameter%xi
IF (PRESENT(kappa0)) kappa0 = xtb_parameter%kappa0
IF (PRESENT(alpg)) alpg = xtb_parameter%alpg
IF (PRESENT(en)) en = xtb_parameter%en
IF (PRESENT(kqat2)) kqat2 = xtb_parameter%kqat2
IF (PRESENT(kcn)) kcn = xtb_parameter%kcn
IF (PRESENT(kq)) kq = xtb_parameter%kq
END SUBROUTINE get_xtb_atom_param
@ -248,13 +281,21 @@ CONTAINS
!> \param kappa ...
!> \param hen ...
!> \param zeta ...
!> \param xi ...
!> \param kappa0 ...
!> \param alpg ...
!> \param electronegativity ...
!> \param occupation ...
!> \param chmax ...
!> \param en ...
!> \param kqat2 ...
!> \param kcn ...
!> \param kq ...
! **************************************************************************************************
SUBROUTINE set_xtb_atom_param(xtb_parameter, aname, typ, defined, z, zeff, natorb, lmax, nao, lao, &
rcut, rcov, kx, eta, xgamma, alpha, zneff, nshell, nval, lval, kpoly, kappa, &
hen, zeta, electronegativity, occupation, chmax)
hen, zeta, xi, kappa0, alpg, electronegativity, occupation, chmax, &
en, kqat2, kcn, kq)
TYPE(xtb_atom_type), POINTER :: xtb_parameter
CHARACTER(LEN=default_string_length), INTENT(IN), &
@ -268,9 +309,10 @@ CONTAINS
INTEGER, INTENT(IN), OPTIONAL :: nshell
INTEGER, DIMENSION(5), INTENT(IN), OPTIONAL :: nval, lval
REAL(KIND=dp), DIMENSION(5), INTENT(IN), OPTIONAL :: kpoly, kappa, hen, zeta
REAL(KIND=dp), INTENT(IN), OPTIONAL :: electronegativity
REAL(KIND=dp), INTENT(IN), OPTIONAL :: xi, kappa0, alpg, electronegativity
INTEGER, DIMENSION(5), INTENT(IN), OPTIONAL :: occupation
REAL(KIND=dp), INTENT(IN), OPTIONAL :: chmax
REAL(KIND=dp), INTENT(IN), OPTIONAL :: chmax, en, kqat2
REAL(KIND=dp), DIMENSION(5), INTENT(IN), OPTIONAL :: kcn, kq
CPASSERT(ASSOCIATED(xtb_parameter))
@ -301,17 +343,27 @@ CONTAINS
IF (PRESENT(hen)) xtb_parameter%hen = hen
IF (PRESENT(zeta)) xtb_parameter%zeta = zeta
IF (PRESENT(chmax)) xtb_parameter%chmax = chmax
!
IF (PRESENT(xi)) xtb_parameter%xi = xi
IF (PRESENT(kappa0)) xtb_parameter%kappa0 = kappa0
IF (PRESENT(alpg)) xtb_parameter%alpg = alpg
IF (PRESENT(en)) xtb_parameter%en = en
IF (PRESENT(kqat2)) xtb_parameter%kqat2 = kqat2
IF (PRESENT(kcn)) xtb_parameter%kcn = kcn
IF (PRESENT(kq)) xtb_parameter%kq = kq
END SUBROUTINE set_xtb_atom_param
! **************************************************************************************************
!> \brief ...
!> \param xtb_parameter ...
!> \param gfn_type ...
!> \param subsys_section ...
! **************************************************************************************************
SUBROUTINE write_xtb_atom_param(xtb_parameter, subsys_section)
SUBROUTINE write_xtb_atom_param(xtb_parameter, gfn_type, subsys_section)
TYPE(xtb_atom_type), POINTER :: xtb_parameter
INTEGER, INTENT(IN) :: gfn_type
TYPE(section_vals_type), POINTER :: subsys_section
CHARACTER(LEN=default_string_length) :: aname, bb
@ -333,31 +385,39 @@ CONTAINS
extension=".Log")
IF (io_unit > 0) THEN
CALL get_xtb_atom_param(xtb_parameter, aname=aname, defined=defined, zeff=zeff, natorb=natorb)
CALL get_xtb_atom_param(xtb_parameter, nshell=nshell, lval=lval, nval=nval, occupation=occupation)
CALL get_xtb_atom_param(xtb_parameter, kpoly=kpoly, kappa=kappa, hen=hen, zeta=zeta)
CALL get_xtb_atom_param(xtb_parameter, electronegativity=en, xgamma=xgamma, eta=eta, alpha=alpha, zneff=zneff)
SELECT CASE (gfn_type)
CASE (0)
CPABORT("gfn_type = 0 missing code")
CASE (1)
CALL get_xtb_atom_param(xtb_parameter, aname=aname, defined=defined, zeff=zeff, natorb=natorb)
CALL get_xtb_atom_param(xtb_parameter, nshell=nshell, lval=lval, nval=nval, occupation=occupation)
CALL get_xtb_atom_param(xtb_parameter, kpoly=kpoly, kappa=kappa, hen=hen, zeta=zeta)
CALL get_xtb_atom_param(xtb_parameter, electronegativity=en, xgamma=xgamma, eta=eta, alpha=alpha, zneff=zneff)
bb = " "
WRITE (UNIT=io_unit, FMT="(/,A,T67,A14)") " xTB parameters: ", TRIM(aname)
IF (defined) THEN
m = 5 - nshell
WRITE (UNIT=io_unit, FMT="(T16,A,T71,F10.2)") "Effective core charge:", zeff
WRITE (UNIT=io_unit, FMT="(T16,A,T71,I10)") "Number of orbitals:", natorb
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5(A4,I1,I2,A1))") "Basis set [nl]", bb(1:8*m), &
(" [", nval(i), lval(i), "]", i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5F8.3)") "Slater Exponent", bb(1:8*m), (zeta(i), i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5I8)") "Ref. occupation", bb(1:8*m), (occupation(i), i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5F8.3)") "Energy levels [au]", bb(1:8*m), (hen(i), i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5F8.3)") "Kpoly", bb(1:8*m), (kpoly(i), i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T71,F10.3)") "Electronegativity", en
WRITE (UNIT=io_unit, FMT="(T16,A,T71,F10.3)") "Mataga-Nishimoto constant (eta)", eta
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5F8.3)") "Mataga-Nishimoto scaling kappa", bb(1:8*m), (kappa(i), i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T71,F10.3)") "3rd Order constant", xgamma
WRITE (UNIT=io_unit, FMT="(T16,A,T61,2F10.3)") "Repulsion potential [Z,alpha]", zneff, alpha
ELSE
WRITE (UNIT=io_unit, FMT="(T55,A)") "Parameters are not defined"
END IF
bb = " "
WRITE (UNIT=io_unit, FMT="(/,A,T67,A14)") " xTB parameters: ", TRIM(aname)
IF (defined) THEN
m = 5 - nshell
WRITE (UNIT=io_unit, FMT="(T16,A,T71,F10.2)") "Effective core charge:", zeff
WRITE (UNIT=io_unit, FMT="(T16,A,T71,I10)") "Number of orbitals:", natorb
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5(A4,I1,I2,A1))") "Basis set [nl]", bb(1:8*m), &
(" [", nval(i), lval(i), "]", i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5F8.3)") "Slater Exponent", bb(1:8*m), (zeta(i), i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5I8)") "Ref. occupation", bb(1:8*m), (occupation(i), i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5F8.3)") "Energy levels [au]", bb(1:8*m), (hen(i), i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5F8.3)") "Kpoly", bb(1:8*m), (kpoly(i), i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T71,F10.3)") "Electronegativity", en
WRITE (UNIT=io_unit, FMT="(T16,A,T71,F10.3)") "Mataga-Nishimoto constant (eta)", eta
WRITE (UNIT=io_unit, FMT="(T16,A,T41,A,5F8.3)") "Mataga-Nishimoto scaling kappa", bb(1:8*m), &
(kappa(i), i=1, nshell)
WRITE (UNIT=io_unit, FMT="(T16,A,T71,F10.3)") "3rd Order constant", xgamma
WRITE (UNIT=io_unit, FMT="(T16,A,T61,2F10.3)") "Repulsion potential [Z,alpha]", zneff, alpha
ELSE
WRITE (UNIT=io_unit, FMT="(T55,A)") "Parameters are not defined"
END IF
CASE (2)
CPABORT("gfn_type = 2 not yet defined")
END SELECT
END IF
CALL cp_print_key_finished_output(io_unit, logger, subsys_section, "PRINT%KINDS")
END IF

View file

@ -40,7 +40,6 @@
&PROPERTIES
&ATOMIC
ENERGY
PRESSURE
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -67,7 +67,6 @@
&PROPERTIES
&ATOMIC
ENERGY
PRESSURE
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -67,7 +67,6 @@
&PROPERTIES
&ATOMIC
ENERGY
PRESSURE
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -63,7 +63,6 @@
&PROPERTIES
&ATOMIC
ENERGY
PRESSURE
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -39,7 +39,6 @@
&PROPERTIES
&ATOMIC
ENERGY
PRESSURE
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -46,7 +46,6 @@
&PROPERTIES
&ATOMIC
ENERGY
PRESSURE
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -47,7 +47,6 @@
&PROPERTIES
&ATOMIC
ENERGY
PRESSURE
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -47,7 +47,6 @@
&PROPERTIES
&ATOMIC
ENERGY
PRESSURE
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -138,7 +138,6 @@
&PROPERTIES
&ATOMIC
ENERGY on
PRESSURE off
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -4,6 +4,10 @@
# 1 compares the last total energy in the file
# for details see cp2k/tools/do_regtest
pbe_dftd4.inp 33 1.0E-14 -0.00283102230260
pbe_dftd4_force.inp 72 1.0E-07 0.00007217
pbe_dftd4_stress.inp 31 1.0E-07 -2.14003785359E-02
pbe_dftd4_force.inp 72 1.0E-07 0.00004379
pbe_dftd4_stress.inp 31 1.0E-07 -2.03123914683E-02
ta1.inp 0
ta2.inp 0
ta3.inp 0
ta4.inp 31 1.0E-07 2.83597961983E+00
#EOF

View file

@ -7,7 +7,7 @@
&FORCE_EVAL
METHOD QS
&DFT
BASIS_SET_FILE_NAME BASIS_MOLOPT_UZH
BASIS_SET_FILE_NAME BASIS_SET
POTENTIAL_FILE_NAME POTENTIAL_UZH
&MGRID
CUTOFF 300
@ -15,11 +15,10 @@
&END MGRID
&POISSON
PERIODIC none
POISSON_SOLVER ANALYTIC
POISSON_SOLVER MT
&END POISSON
&QS
EPS_DEFAULT 1.0E-12
METHOD GAPW
&END QS
&SCF
EPS_SCF 1.0E-6
@ -54,11 +53,11 @@
PERIODIC NONE
&END CELL
&KIND H
BASIS_SET ORB DZVP-MOLOPT-PBE-GTH-q1
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q1
&END KIND
&KIND C
BASIS_SET ORB DZVP-MOLOPT-PBE-GTH-q4
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q4
&END KIND
&TOPOLOGY

View file

@ -7,7 +7,7 @@
&FORCE_EVAL
METHOD QS
&DFT
BASIS_SET_FILE_NAME BASIS_MOLOPT_UZH
BASIS_SET_FILE_NAME BASIS_SET
POTENTIAL_FILE_NAME POTENTIAL_UZH
&MGRID
CUTOFF 300
@ -15,14 +15,10 @@
&END MGRID
&POISSON
PERIODIC none
POISSON_SOLVER ANALYTIC
POISSON_SOLVER MT
&END POISSON
&PRINT
&XRAY_DIFFRACTION_SPECTRUM OFF
&END XRAY_DIFFRACTION_SPECTRUM
&END PRINT
&QS
EPS_DEFAULT 1.0E-12
EPS_DEFAULT 1.0E-10
METHOD GPW
&END QS
&SCF
@ -62,11 +58,11 @@
PERIODIC NONE
&END CELL
&KIND H
BASIS_SET ORB DZVP-MOLOPT-PBE-GTH-q1
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q1
&END KIND
&KIND C
BASIS_SET ORB DZVP-MOLOPT-PBE-GTH-q4
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q4
&END KIND
&TOPOLOGY

View file

@ -8,7 +8,7 @@
METHOD QS
STRESS_TENSOR ANALYTICAL
&DFT
BASIS_SET_FILE_NAME BASIS_MOLOPT
BASIS_SET_FILE_NAME BASIS_SET
POTENTIAL_FILE_NAME POTENTIAL
&MGRID
CUTOFF 600
@ -16,18 +16,13 @@
&END MGRID
&POISSON
PERIODIC XYZ
POISSON_SOLVER ANALYTIC
&END POISSON
&PRINT
&XRAY_DIFFRACTION_SPECTRUM OFF
&END XRAY_DIFFRACTION_SPECTRUM
&END PRINT
&QS
EPS_DEFAULT 1.0E-14
EPS_DEFAULT 1.0E-10
METHOD GPW
&END QS
&SCF
EPS_SCF 1.0E-7
EPS_SCF 1.0E-6
MAX_SCF 100
SCF_GUESS ATOMIC
&END SCF
@ -41,7 +36,7 @@
&END PRINT_DFTD
&END PAIR_POTENTIAL
&END VDW_POTENTIAL
&XC_FUNCTIONAL PBE
&XC_FUNCTIONAL PADE
&END XC_FUNCTIONAL
&END XC
&END DFT
@ -65,7 +60,7 @@
Ar 0.0 0.5 0.5
&END COORD
&KIND Ar
BASIS_SET SZV-MOLOPT-SR-GTH
BASIS_SET DZVP-GTH-PADE
POTENTIAL GTH-PBE-q8
&END KIND
&TOPOLOGY

View file

@ -0,0 +1,73 @@
&GLOBAL
PRINT_LEVEL LOW
PROJECT test
RUN_TYPE DEBUG
&END GLOBAL
&DEBUG
CHECK_ATOM_FORCE 1 y
DEBUG_FORCES T
DEBUG_STRESS_TENSOR F
DX 0.001
STOP_ON_MISMATCH T
&END DEBUG
&FORCE_EVAL
METHOD QS
&DFT
BASIS_SET_FILE_NAME BASIS_SET
POTENTIAL_FILE_NAME POTENTIAL_UZH
&MGRID
CUTOFF 200
REL_CUTOFF 30
&END MGRID
&POISSON
PERIODIC none
POISSON_SOLVER MT
&END POISSON
&QS
EPS_DEFAULT 1.0E-10
&END QS
&SCF
EPS_SCF 1.0E-7
MAX_SCF 100
SCF_GUESS ATOMIC
&END SCF
&XC
&VDW_POTENTIAL
DISPERSION_FUNCTIONAL PAIR_POTENTIAL
&PAIR_POTENTIAL
CALCULATE_C9_TERM T
D4_CUTOFF 20.
D4_REFERENCE_CODE F
REFERENCE_FUNCTIONAL PBE
R_CUTOFF 9.
TYPE DFTD4
&END PAIR_POTENTIAL
&END VDW_POTENTIAL
&XC_FUNCTIONAL PADE
&END XC_FUNCTIONAL
&END XC
&END DFT
&SUBSYS
&CELL
ABC 9.0 9.0 9.0
PERIODIC NONE
&END CELL
&KIND H
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q1
&END KIND
&KIND C
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q4
&END KIND
&TOPOLOGY
CONNECTIVITY OFF
COORDINATE XYZ
COORD_FILE_NAME ../sample_xyz/ch4-ch4-in.xyz
&CENTER_COORDINATES
&END CENTER_COORDINATES
&END TOPOLOGY
&END SUBSYS
&END FORCE_EVAL

View file

@ -0,0 +1,73 @@
&GLOBAL
PRINT_LEVEL LOW
PROJECT test
RUN_TYPE DEBUG
&END GLOBAL
&DEBUG
CHECK_ATOM_FORCE 1 y
DEBUG_FORCES T
DEBUG_STRESS_TENSOR F
DX 0.001
STOP_ON_MISMATCH T
&END DEBUG
&FORCE_EVAL
METHOD QS
&DFT
BASIS_SET_FILE_NAME BASIS_SET
POTENTIAL_FILE_NAME POTENTIAL_UZH
&MGRID
CUTOFF 200
REL_CUTOFF 30
&END MGRID
&POISSON
PERIODIC none
POISSON_SOLVER MT
&END POISSON
&QS
EPS_DEFAULT 1.0E-10
&END QS
&SCF
EPS_SCF 1.0E-7
MAX_SCF 100
SCF_GUESS ATOMIC
&END SCF
&XC
&VDW_POTENTIAL
DISPERSION_FUNCTIONAL PAIR_POTENTIAL
&PAIR_POTENTIAL
CALCULATE_C9_TERM T
D4_CUTOFF 20.
D4_REFERENCE_CODE T
REFERENCE_FUNCTIONAL PBE
R_CUTOFF 9.
TYPE DFTD4
&END PAIR_POTENTIAL
&END VDW_POTENTIAL
&XC_FUNCTIONAL PADE
&END XC_FUNCTIONAL
&END XC
&END DFT
&SUBSYS
&CELL
ABC 9.0 9.0 9.0
PERIODIC NONE
&END CELL
&KIND H
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q1
&END KIND
&KIND C
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q4
&END KIND
&TOPOLOGY
CONNECTIVITY OFF
COORDINATE XYZ
COORD_FILE_NAME ../sample_xyz/ch4-ch4-in.xyz
&CENTER_COORDINATES
&END CENTER_COORDINATES
&END TOPOLOGY
&END SUBSYS
&END FORCE_EVAL

View file

@ -0,0 +1,68 @@
&GLOBAL
PRINT_LEVEL LOW
PROJECT test
RUN_TYPE DEBUG
&END GLOBAL
&DEBUG
CHECK_ATOM_FORCE 1 y
DEBUG_FORCES T
DEBUG_STRESS_TENSOR F
DX 0.001
STOP_ON_MISMATCH T
&END DEBUG
&FORCE_EVAL
METHOD QS
&DFT
BASIS_SET_FILE_NAME BASIS_SET
POTENTIAL_FILE_NAME POTENTIAL_UZH
&MGRID
CUTOFF 200
REL_CUTOFF 30
&END MGRID
&QS
EPS_DEFAULT 1.0E-10
&END QS
&SCF
EPS_SCF 1.0E-7
MAX_SCF 100
SCF_GUESS ATOMIC
&END SCF
&XC
&VDW_POTENTIAL
DISPERSION_FUNCTIONAL PAIR_POTENTIAL
&PAIR_POTENTIAL
CALCULATE_C9_TERM T
D4_CUTOFF 20.
D4_REFERENCE_CODE F
REFERENCE_FUNCTIONAL PBE
R_CUTOFF 9.
TYPE DFTD4
&END PAIR_POTENTIAL
&END VDW_POTENTIAL
&XC_FUNCTIONAL PADE
&END XC_FUNCTIONAL
&END XC
&END DFT
&SUBSYS
&CELL
ABC 9.0 9.0 9.0
&END CELL
&KIND H
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q1
&END KIND
&KIND C
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q4
&END KIND
&TOPOLOGY
CONNECTIVITY OFF
COORDINATE XYZ
COORD_FILE_NAME ../sample_xyz/ch4-ch4-in.xyz
&CENTER_COORDINATES
&END CENTER_COORDINATES
&END TOPOLOGY
&END SUBSYS
&END FORCE_EVAL

View file

@ -0,0 +1,71 @@
&GLOBAL
PRINT_LEVEL LOW
PROJECT test
RUN_TYPE ENERGY_FORCE
&END GLOBAL
&FORCE_EVAL
METHOD QS
STRESS_TENSOR ANALYTICAL
&DFT
BASIS_SET_FILE_NAME BASIS_SET
POTENTIAL_FILE_NAME POTENTIAL_UZH
&MGRID
CUTOFF 300
REL_CUTOFF 40
&END MGRID
&QS
EPS_DEFAULT 1.0E-14
&END QS
&SCF
EPS_SCF 1.0E-7
MAX_SCF 100
SCF_GUESS ATOMIC
&END SCF
&XC
&VDW_POTENTIAL
DISPERSION_FUNCTIONAL PAIR_POTENTIAL
&PAIR_POTENTIAL
CALCULATE_C9_TERM T
D4_CUTOFF 30.
D4_REFERENCE_CODE F
REFERENCE_FUNCTIONAL PBE
R_CUTOFF 20.
TYPE DFTD4
&EEQ
EPS_DIIS 1.E-12
&END EEQ
&END PAIR_POTENTIAL
&END VDW_POTENTIAL
&XC_FUNCTIONAL PADE
&END XC_FUNCTIONAL
&END XC
&END DFT
&PRINT
&FORCES ON
&END FORCES
&STRESS_TENSOR
COMPONENTS
&END STRESS_TENSOR
&END PRINT
&SUBSYS
&CELL
ABC 9.0 9.0 9.0
&END CELL
&KIND H
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q1
&END KIND
&KIND C
BASIS_SET ORB SZV-GTH-PADE
POTENTIAL GTH-PBE-q4
&END KIND
&TOPOLOGY
CONNECTIVITY OFF
COORDINATE XYZ
COORD_FILE_NAME ../sample_xyz/ch4-ch4-in.xyz
&CENTER_COORDINATES
&END CENTER_COORDINATES
&END TOPOLOGY
&END SUBSYS
&END FORCE_EVAL

View file

@ -14,6 +14,8 @@
CUTOFF 280
&END MGRID
&PRINT
&EEQ_CHARGES ON
&END EEQ_CHARGES
&LOWDIN OFF
&END LOWDIN
&MULLIKEN ON

View file

@ -5,5 +5,5 @@ LiH-stress-pbe-uks.inp 31 1.0E-09
SiC-stress-pbe-nlcc.inp 31 1.0E-09 -1.84632367133E+01
SiC-stress-tpss.inp 31 1.0E-09 1.33145056114E+00
SiC-stress-br89.inp 31 1.0E-09 -5.12223409624E+00
LiH-stress-pbe-uks-vdW.inp 31 1.0E-09 -2.66523490021E-01
LiH-stress-pbe-uks-vdW.inp 31 1.0E-09 -2.66548358795E-01
#EOF

View file

@ -38,5 +38,5 @@ O2-UKS-MNDO-relax_multip.inp 3 1.0E-14 -
# dispersion
2h2o_disp1.inp 3 1.0E-14 -649.05174548613479
2h2o_disp2.inp 3 1.0E-14 -649.05174548613479
2h2o_disp3.inp 3 1.0E-14 -649.14047694570991
2h2o_disp3.inp 3 1.0E-14 -649.14047694554415
#EOF

View file

@ -215,6 +215,7 @@ QMMM/QS/regtest-2-swave
QS/regtest-dm-ls-scf-4
QS/regtest-hybrid-3 libint
xTB/regtest-4
xTB/regtest-gfn0 libdftd4
QS/regtest-bs
QS/regtest-gpw-6-2
QS/regtest-dft-vdw-corr-4 libdftd4

View file

@ -10,14 +10,14 @@ ch2o_smear.inp 1 1.0E-12 -7.19650182
tmol.inp 1 1.0E-12 -41.90845660778482
h2.inp 1 1.0E-12 -1.03458223634251
h2_kab.inp 1 1.0E-12 -0.99816707611986
h2o-md.inp 1 1.0E-12 -185.14385714384289
h2o-md.inp 1 1.0E-12 -185.14385714438652
h2o_str.inp 1 1.0E-12 -5.76524673249110
h2o_strsym.inp 0
h2o-atprop.inp 1 1.0E-10 -185.16262201741714
h2o-atprop0.inp 1 1.0E-12 -187.45499307089042
h2o-atprop0.inp 1 1.0E-12 -187.45499307126425
si_geo.inp 1 1.0E-11 -14.51194886943525
si_kp.inp 1 1.0E-12 -14.73191413260763
si_kp.inp 1 1.0E-12 -14.73191526347151
h2o_dimer.inp 1 1.0E-12 -11.54506384435821
ghost.inp 1 1.0E-12 -1.03458221876736
tcif.inp 1 1.0E-12 -27.71649842836537
tcif.inp 1 1.0E-12 -27.71649842848894
#EOF

View file

@ -27,14 +27,6 @@
METHOD xTB
&XTB
COULOMB_INTERACTION T
&ATOM_PARAMETER
N 0.476106 0.042507 1.727773 5.498808 2s -12.745585 0.0 -20.058000 2.050067
2p -1.428367 0.315090 -12.889326 2.113682
O 0.583349 -0.005102 2.004253 5.171786 2s -13.729047 0.0 -23.398376 2.345365
2p -4.453341 0.374608 -17.886554 2.153060
C 0.479988 1.053856 1.281954 4.428763 2s -7.082170 0.0 -13.587210 1.960324
2p 0.812216 -0.471181 -10.052785 1.832096
&END ATOM_PARAMETER
&PARAMETER
DISPERSION_PARAMETER_FILE dftd3.dat
&END PARAMETER

View file

@ -19,14 +19,6 @@
&QS
METHOD xTB
&XTB
&ATOM_PARAMETER
N 0.476106 0.042507 1.727773 5.498808 2s -12.745585 0.0 -20.058000 2.050067
2p -1.428367 0.315090 -12.889326 2.113682
O 0.583349 -0.005102 2.004253 5.171786 2s -13.729047 0.0 -23.398376 2.345365
2p -4.453341 0.374608 -17.886554 2.153060
C 0.479988 1.053856 1.281954 4.428763 2s -7.082170 0.0 -13.587210 1.960324
2p 0.812216 -0.471181 -10.052785 1.832096
&END ATOM_PARAMETER
&PARAMETER
DISPERSION_PARAMETER_FILE dftd3.dat
&END PARAMETER

View file

@ -54,7 +54,6 @@
&PROPERTIES
&ATOMIC
ENERGY
PRESSURE
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -37,7 +37,6 @@
&PROPERTIES
&ATOMIC
ENERGY
PRESSURE
&END ATOMIC
&END PROPERTIES
&SUBSYS

View file

@ -5,9 +5,9 @@
# for details see cp2k/tools/do_regtest
NdF3.inp 1 1.0E-12 -16.30904020314352
h2o_rtp.inp 1 1.0E-12 -5.76539152285971
h2o_emd.inp 1 1.0E-12 -5.76621483845024
si8_wan.inp 1 1.0E-12 -14.36325382143829
si_kp.inp 1 1.0E-12 -14.73032998731771
h2o_emd.inp 1 1.0E-12 -5.76621483534992
si8_wan.inp 1 1.0E-12 -14.36588818966667
si_kp.inp 1 1.0E-12 -14.73033123294306
tmol.inp 1 1.0E-12 -41.90845660778482
ch2o.inp 1 1.0E-12 -7.84456570305608
ch2o_print.inp 1 1.0E-12 -7.84456570305608
@ -15,9 +15,9 @@ ch2o_cube.inp 1 1.0E-12 -7.84456570
ch2o_dens.inp 1 1.0E-12 -7.84456570305607
ch2o_loc.inp 1 1.0E-12 -13.55045387785839
ch2o_mos.inp 1 1.0E-12 -7.84456570305607
si_print.inp 1 1.0E-12 -14.73032998731853
si_band.inp 1 1.0E-12 -14.73032998731853
si_print.inp 1 1.0E-12 -14.73033123294387
si_band.inp 1 1.0E-12 -14.73033123294387
H2O-geo-pdos.inp 1 1.0E-12 -5.76872484344198
graphite-stm.inp 1 1.0E-12 -7.91403228335400
si_dos.inp 1 1.0E-12 -14.73032998731853
graphite-stm.inp 1 1.0E-12 -7.91403228336802
si_dos.inp 1 1.0E-12 -14.73033123294387
#EOF

Some files were not shown because too many files have changed in this diff Show more