root / examples / Test / PES_HCN_ana.f90 @ 12
Historique | Voir | Annoter | Télécharger (3,99 ko)
1 | 1 | pfleura2 | PROGRAM PES2D |
---|---|---|---|
2 | 1 | pfleura2 | |
3 | 1 | pfleura2 | IMPLICIT NONE |
4 | 1 | pfleura2 | integer, parameter :: KINT = kind(1) |
5 | 1 | pfleura2 | integer, parameter :: KREAL = kind(1.0d0) |
6 | 1 | pfleura2 | |
7 | 1 | pfleura2 | REAL(KREAL) :: E |
8 | 1 | pfleura2 | |
9 | 1 | pfleura2 | ! Bohr --> Angstr |
10 | 1 | pfleura2 | real(KREAL), parameter :: BOHR = 0.52917726D+00 |
11 | 1 | pfleura2 | ! |
12 | 1 | pfleura2 | ! Parameters to define the surface |
13 | 1 | pfleura2 | INTEGER(KINT), DIMENSION(6), PARAMETER :: IECOEF = (/-1,9,-45,45,-9,1/) |
14 | 1 | pfleura2 | INTEGER(KINT), DIMENSION(6), PARAMETER :: ISCOEF = (/-3,-2,-1,1,2,3/) |
15 | 1 | pfleura2 | REAL(KREAL), PARAMETER :: hh=0.01d0 |
16 | 1 | pfleura2 | |
17 | 1 | pfleura2 | ! Variables |
18 | 1 | pfleura2 | INTEGER(KINT) :: i,j,iat,jat |
19 | 1 | pfleura2 | REAL(KREAL), ALLOCATABLE :: Xyztmp(:,:),GradTmp(:,:) |
20 | 1 | pfleura2 | REAL(KREAL) :: xp,yp |
21 | 1 | pfleura2 | |
22 | 1 | pfleura2 | CHARACTER(132) :: Line |
23 | 1 | pfleura2 | LOGICAL :: Debug |
24 | 1 | pfleura2 | |
25 | 1 | pfleura2 | real(KREAL), parameter :: zero = 0.0_KREAL, one = 1.0_KREAL |
26 | 1 | pfleura2 | REAL(KREAL), external :: Eint |
27 | 1 | pfleura2 | |
28 | 1 | pfleura2 | REAL(KREAL) :: dCH,dCN,aHCN |
29 | 1 | pfleura2 | REAL(KREAL), PARAMETER :: dCHmin=1., dCHmax=2.5 |
30 | 1 | pfleura2 | REAL(KREAL), PARAMETER :: aHCNmin=0., aHCNmax=180. |
31 | 1 | pfleura2 | REAL(KREAL) :: StepdCH, StepaHCN |
32 | 1 | pfleura2 | INTEGER(KINT) :: NbStpdCH,NbStpaHCN |
33 | 1 | pfleura2 | |
34 | 1 | pfleura2 | |
35 | 1 | pfleura2 | |
36 | 1 | pfleura2 | ! For now dCN=1.16 is fixed. Next version should optimize it at each step ! |
37 | 1 | pfleura2 | dCN=1.16 |
38 | 1 | pfleura2 | NbStpdCH=100 |
39 | 1 | pfleura2 | NbStpaHCN=100 |
40 | 1 | pfleura2 | StepdCH=(dCHmax-dCHmin)/(NbStpdCH-1) |
41 | 1 | pfleura2 | StepaHCN=(aHCNmax-aHCNmin)/(NbStpaHCN-1) |
42 | 1 | pfleura2 | dCH=dCHmin |
43 | 1 | pfleura2 | DO I=1,NbStpdCH |
44 | 1 | pfleura2 | aHCN=aHCNmin |
45 | 1 | pfleura2 | DO J=1,NbStpaHCN |
46 | 1 | pfleura2 | e=Eint(dCH,dCN,aHCN) |
47 | 1 | pfleura2 | WRITE(*,'(1X,F10.4,1X,F10.4,1X,F8.2,1X,F15.6)') dCH,dCN,aHCN,e |
48 | 1 | pfleura2 | aHCN=aHCN+StepaHCN |
49 | 1 | pfleura2 | END DO |
50 | 1 | pfleura2 | WRITE(*,*) |
51 | 1 | pfleura2 | dCH=dCH+StepdCH |
52 | 1 | pfleura2 | END DO |
53 | 1 | pfleura2 | |
54 | 1 | pfleura2 | !==================================================================== |
55 | 1 | pfleura2 | end |
56 | 1 | pfleura2 | |
57 | 1 | pfleura2 | |
58 | 1 | pfleura2 | function Eint(dCH,dCN,aHCN) |
59 | 1 | pfleura2 | |
60 | 1 | pfleura2 | IMPLICIT NONE |
61 | 1 | pfleura2 | integer, parameter :: KINT = kind(1) |
62 | 1 | pfleura2 | integer, parameter :: KREAL = kind(1.0d0) |
63 | 1 | pfleura2 | |
64 | 1 | pfleura2 | |
65 | 1 | pfleura2 | REAL(KREAL) ,INTENT(IN) :: dCH,dCN,aHCN |
66 | 1 | pfleura2 | REAL(KREAL) :: Eint |
67 | 1 | pfleura2 | |
68 | 1 | pfleura2 | INTEGER(KINT) :: i |
69 | 1 | pfleura2 | REAL(KREAL) :: dNH |
70 | 1 | pfleura2 | |
71 | 1 | pfleura2 | real(KREAL) :: autoA,autoeV,Pi |
72 | 1 | pfleura2 | parameter (autoA=0.52917715d0) |
73 | 1 | pfleura2 | parameter (autoeV=27.21183d0) |
74 | 1 | pfleura2 | |
75 | 1 | pfleura2 | |
76 | 1 | pfleura2 | real(KREAL) :: Q(3) |
77 | 1 | pfleura2 | real(KREAL) :: TT,gR,pR |
78 | 1 | pfleura2 | |
79 | 1 | pfleura2 | real(KREAL) :: mB,mC,mH |
80 | 1 | pfleura2 | real(KREAL) :: T,RN,RC,r1,r2,r3 |
81 | 1 | pfleura2 | |
82 | 1 | pfleura2 | real(KREAL) :: Z1,Z12,V1 |
83 | 1 | pfleura2 | real(KREAL) :: Z2,Z22,V2 |
84 | 1 | pfleura2 | real(KREAL) :: Z3,Z32,V3 |
85 | 1 | pfleura2 | |
86 | 1 | pfleura2 | real(KREAL) :: S1,S2,S3,S12,S22,S32,POLY |
87 | 1 | pfleura2 | real(KREAL) :: E1,E2,E3,HY1,HY2,HY3,SWITCH,V123 |
88 | 1 | pfleura2 | |
89 | 1 | pfleura2 | pi=dacos(-1.0d0) |
90 | 1 | pfleura2 | |
91 | 1 | pfleura2 | dNH=sqrt(dCH**2+dCN**2-2*dCH*dCN*cos(aHCN*pi/180.)) |
92 | 1 | pfleura2 | |
93 | 1 | pfleura2 | R1=dCH |
94 | 1 | pfleura2 | R2=dCN |
95 | 1 | pfleura2 | R3=dNH |
96 | 1 | pfleura2 | |
97 | 1 | pfleura2 | |
98 | 1 | pfleura2 | |
99 | 1 | pfleura2 | ! R1=R1*autoA |
100 | 1 | pfleura2 | ! R2=R2*autoA |
101 | 1 | pfleura2 | ! R3=R3*autoA |
102 | 1 | pfleura2 | |
103 | 1 | pfleura2 | !.....CH |
104 | 1 | pfleura2 | Z1=R1-1.0823 |
105 | 1 | pfleura2 | Z12=Z1*Z1 |
106 | 1 | pfleura2 | V1=-2.8521*(1.0+5.5297*Z1+8.7166*Z12+5.3082*Z1*Z12)*dexp(-5.5297*Z1) |
107 | 1 | pfleura2 | !.....CN |
108 | 1 | pfleura2 | Z2=R2-1.1718 |
109 | 1 | pfleura2 | Z22=Z2*Z2 |
110 | 1 | pfleura2 | V2=-7.9282*(1.0+5.2448*Z2+7.3416*Z22+4.9785*Z2*Z22)*dexp(-5.2448*Z2) |
111 | 1 | pfleura2 | !.....NH |
112 | 1 | pfleura2 | Z3=R3-1.0370 |
113 | 1 | pfleura2 | Z32=Z3*Z3 |
114 | 1 | pfleura2 | V3=-3.9938*(1.0+3.0704*Z3)*dexp(-3.0704*Z3) |
115 | 1 | pfleura2 | |
116 | 1 | pfleura2 | ! write(6,*) v1,v2,v3 |
117 | 1 | pfleura2 | |
118 | 1 | pfleura2 | !.....THREE BODY TERMS |
119 | 1 | pfleura2 | Z1=R1-1.9607 |
120 | 1 | pfleura2 | Z2=R2-2.2794 |
121 | 1 | pfleura2 | Z3=R3-1.8687 |
122 | 1 | pfleura2 | S1=0.4436*Z1+0.6091*Z2+0.6575*Z3 |
123 | 1 | pfleura2 | S2=-.8941*Z1+0.2498*Z2+0.3718*Z3 |
124 | 1 | pfleura2 | S3=0.0622*Z1-0.7527*Z2+0.6554*Z3 |
125 | 1 | pfleura2 | |
126 | 1 | pfleura2 | S12=S1*S1 |
127 | 1 | pfleura2 | S22=S2*S2 |
128 | 1 | pfleura2 | S32=S3*S3 |
129 | 1 | pfleura2 | POLY=-3.0578*(1.0+1.9076*S1-0.5008*S2-0.0149*S3+0.6695*S12 & |
130 | 1 | pfleura2 | -1.3535*S22-1.0501*S32+0.2698*S1*S2-1.1120*S1*S3 & |
131 | 1 | pfleura2 | +1.9310*S2*S3-0.0877*S1*S12+0.0044*S2*S22+0.0700 & |
132 | 1 | pfleura2 | *S3*S32+0.0898*S12*S2-1.0186*S1*S22-0.0911*S12 & |
133 | 1 | pfleura2 | *S3+0.0017*S1*S32+0.4567*S22*S3-0.8840*S2*S32 & |
134 | 1 | pfleura2 | +0.3333*S1*S2*S3-0.0367*S12*S12+0.4821*S22*S22 & |
135 | 1 | pfleura2 | +0.2564*S32*S32-0.0017*S12*S1*S2-0.2278*S12*S22 & |
136 | 1 | pfleura2 | -0.1287*S1*S2*S22+0.1759*S1*S12*S3-0.0399*S12*S32 & |
137 | 1 | pfleura2 | -0.1447*S1*S3*S32-0.3147*S2*S22*S3+0.1233*S22*S32 & |
138 | 1 | pfleura2 | +0.3161*S2*S3*S32+0.0919*S12*S2*S3-0.0954*S1*S22*S3 & |
139 | 1 | pfleura2 | +0.1778*S1*S2*S32-0.1892*S22*S22*S2) |
140 | 1 | pfleura2 | |
141 | 1 | pfleura2 | |
142 | 1 | pfleura2 | E1=dexp(3.9742*Z1/2.) |
143 | 1 | pfleura2 | E2=dexp(4.3688*Z2/2.) |
144 | 1 | pfleura2 | E3=dexp(1.5176*Z3/2.) |
145 | 1 | pfleura2 | HY1=(E1-1.0/E1)/(E1+1.0/E1) |
146 | 1 | pfleura2 | HY2=(E2-1.0/E2)/(E2+1.0/E2) |
147 | 1 | pfleura2 | HY3=(E3-1.0/E3)/(E3+1.0/E3) |
148 | 1 | pfleura2 | SWITCH=(1.0-HY1)*(1.0-HY2)*(1.0-HY3) |
149 | 1 | pfleura2 | V123=SWITCH*POLY |
150 | 1 | pfleura2 | |
151 | 1 | pfleura2 | ! write(6,*) v123,V1+V2+V3+V123 |
152 | 1 | pfleura2 | |
153 | 1 | pfleura2 | Eint=(V1+V2+V3+V123)/autoeV |
154 | 1 | pfleura2 | |
155 | 1 | pfleura2 | |
156 | 1 | pfleura2 | |
157 | 1 | pfleura2 | return |
158 | 1 | pfleura2 | end function Eint |
159 | 1 | pfleura2 |