mirror of
https://github.com/cp2k/cp2k.git
synced 2026-07-21 06:25:15 -04:00
gfn0-xTB and parallel DFT-D4 (#3765)
This commit is contained in:
parent
b5a5e3a0a2
commit
8e5fe4401f
129 changed files with 61561 additions and 3236 deletions
1799
data/xTB0_parameters
Normal file
1799
data/xTB0_parameters
Normal file
File diff suppressed because it is too large
Load diff
1180
data/xTB1_parameters
Normal file
1180
data/xTB1_parameters
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)") &
|
||||
|
|
|
|||
|
|
@ -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
262
src/eeq_data.F
Normal 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
124
src/eeq_input.F
Normal 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
1809
src/eeq_method.F
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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 )') &
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
30
src/ewalds.F
30
src/ewalds.F
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
! **************************************************************************************************
|
||||
|
|
|
|||
28
src/header.F
28
src/header.F
|
|
@ -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 ...
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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", &
|
||||
|
|
|
|||
|
|
@ -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.)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
65
src/pme.F
65
src/pme.F
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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.)
|
||||
|
|
|
|||
|
|
@ -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, &
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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, &
|
||||
|
|
|
|||
|
|
@ -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.)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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.)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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('-'), "// &
|
||||
|
|
|
|||
209
src/spme.F
209
src/spme.F
|
|
@ -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 ...
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
491
src/xtb_eeq.F
Normal 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
|
||||
|
|
@ -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, &
|
||||
|
|
|
|||
|
|
@ -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
486
src/xtb_hab_force.F
Normal 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
402
src/xtb_hcore.F
Normal 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
475
src/xtb_ks_matrix.F
Normal 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
|
||||
|
||||
2341
src/xtb_matrices.F
2341
src/xtb_matrices.F
File diff suppressed because it is too large
Load diff
|
|
@ -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
954
src/xtb_potentials.F
Normal 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
|
||||
120
src/xtb_types.F
120
src/xtb_types.F
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -40,7 +40,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY
|
||||
PRESSURE
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -67,7 +67,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY
|
||||
PRESSURE
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -67,7 +67,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY
|
||||
PRESSURE
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -63,7 +63,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY
|
||||
PRESSURE
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY
|
||||
PRESSURE
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -46,7 +46,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY
|
||||
PRESSURE
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY
|
||||
PRESSURE
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY
|
||||
PRESSURE
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -138,7 +138,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY on
|
||||
PRESSURE off
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
73
tests/QS/regtest-dft-vdw-corr-4/ta1.inp
Normal file
73
tests/QS/regtest-dft-vdw-corr-4/ta1.inp
Normal 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
|
||||
73
tests/QS/regtest-dft-vdw-corr-4/ta2.inp
Normal file
73
tests/QS/regtest-dft-vdw-corr-4/ta2.inp
Normal 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
|
||||
68
tests/QS/regtest-dft-vdw-corr-4/ta3.inp
Normal file
68
tests/QS/regtest-dft-vdw-corr-4/ta3.inp
Normal 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
|
||||
71
tests/QS/regtest-dft-vdw-corr-4/ta4.inp
Normal file
71
tests/QS/regtest-dft-vdw-corr-4/ta4.inp
Normal 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
|
||||
|
|
@ -14,6 +14,8 @@
|
|||
CUTOFF 280
|
||||
&END MGRID
|
||||
&PRINT
|
||||
&EEQ_CHARGES ON
|
||||
&END EEQ_CHARGES
|
||||
&LOWDIN OFF
|
||||
&END LOWDIN
|
||||
&MULLIKEN ON
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -54,7 +54,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY
|
||||
PRESSURE
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
&PROPERTIES
|
||||
&ATOMIC
|
||||
ENERGY
|
||||
PRESSURE
|
||||
&END ATOMIC
|
||||
&END PROPERTIES
|
||||
&SUBSYS
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue