1 |
#define EXTERN extern |
2 |
#include "pcwin.h" |
3 |
#include "pcmod.h" |
4 |
|
5 |
#include "angles.h" |
6 |
#include "pot.h" |
7 |
#include "field.h" |
8 |
|
9 |
EXTERN struct t_ooplane_k { |
10 |
int nopbend; |
11 |
char iopb[MAXOOP][13]; |
12 |
float copb[MAXOOP]; |
13 |
} ooplane_k; |
14 |
|
15 |
void numeral(int,char *,int); |
16 |
EXTERN int Missing_constants; |
17 |
EXTERN FILE *errfile; |
18 |
|
19 |
void kopbend() |
20 |
{ |
21 |
int i, j, ia,ib,ic,id, jj, ierr; |
22 |
int ita,itb, itc,itd, itd_class; |
23 |
int it, it1; |
24 |
long mask5, mask6, mask8; |
25 |
char pa[4],pb[4],pc[4],pd[4],pdc[4],pt[13],pt1[13],pt2[13]; |
26 |
|
27 |
mask5 = 1L << SATMET_MASK; |
28 |
mask6 = 1L << GT18e_MASK; |
29 |
mask8 = 1L << SQPLAN_MASK; |
30 |
|
31 |
if (ooplane_k.nopbend <= 0) |
32 |
{ |
33 |
pot.use_opbend = FALSE; |
34 |
return; |
35 |
} |
36 |
angles.nopb = 0; |
37 |
for (i=0; i < angles.nang; i++) |
38 |
{ |
39 |
ia = angles.i13[i][0]; |
40 |
ib = angles.i13[i][1]; |
41 |
ic = angles.i13[i][2]; |
42 |
ita = atom[ia].type; |
43 |
itb = atom[ib].type; |
44 |
itc = atom[ic].type; |
45 |
ierr = FALSE; |
46 |
if (angles.i13[i][3] != 0 ) |
47 |
{ |
48 |
// angle ia-ib-id-ic |
49 |
id = angles.i13[i][3]; |
50 |
itd = atom[id].type; |
51 |
itd_class = atom[id].tclass; |
52 |
numeral(ita,pa,3); |
53 |
numeral(itb,pb,3); |
54 |
numeral(itc,pc,3); |
55 |
numeral(itd,pd,3); |
56 |
numeral(itd_class,pdc,3); |
57 |
if (field.type == MMX || field.type == MM3) |
58 |
{ |
59 |
strcpy(pt," 0"); strcat(pt,pb); strcat(pt,pd); strcat(pt," 0"); |
60 |
}else if (field.type == MMFF94) |
61 |
{ |
62 |
if (ita <= itc && ita <= itd) |
63 |
{ |
64 |
if (itc <= itd) |
65 |
{ |
66 |
strcpy(pt,pa); strcat(pt,pb); strcat(pt,pc); strcat(pt,pd); |
67 |
} else |
68 |
{ |
69 |
strcpy(pt,pa); strcat(pt,pb); strcat(pt,pd); strcat(pt,pc); |
70 |
} |
71 |
} else if ( itc <= ita && itc <= itd) |
72 |
{ |
73 |
if (ita <= itd) |
74 |
{ |
75 |
strcpy(pt,pc); strcat(pt,pb); strcat(pt,pa); strcat(pt,pd); |
76 |
} else |
77 |
{ |
78 |
strcpy(pt,pc); strcat(pt,pb); strcat(pt,pd); strcat(pt,pa); |
79 |
} |
80 |
} else if (itd <= ita && itd <= itc) |
81 |
{ |
82 |
if ( ita <= itc) |
83 |
{ |
84 |
strcpy(pt,pd); strcat(pt,pb); strcat(pt,pa); strcat(pt,pc); |
85 |
} else |
86 |
{ |
87 |
strcpy(pt,pd); strcat(pt,pb); strcat(pt,pc); strcat(pt,pa); |
88 |
} |
89 |
} |
90 |
} |
91 |
strcpy(pt1," 0"); strcat(pt1,pb); strcat(pt1,pdc); strcat(pt1," 0"); |
92 |
strcpy(pt2," 0"); strcat(pt2,pb); strcat(pt2," 0"); strcat(pt2," 0"); |
93 |
it = itb*100 + itd; |
94 |
it1 = itb*100; |
95 |
ierr = FALSE; |
96 |
for (j=0; j < ooplane_k.nopbend; j++) |
97 |
{ |
98 |
if (strcmp(pt,ooplane_k.iopb[j]) == 0 || strcmp(pt1,ooplane_k.iopb[j]) == 0 || strcmp(pt2,ooplane_k.iopb[j]) == 0) |
99 |
{ |
100 |
angles.copb[i] = ooplane_k.copb[j]; |
101 |
angles.angin[i] = TRUE; |
102 |
angles.nopb++; |
103 |
ierr = TRUE; |
104 |
break; |
105 |
} |
106 |
} |
107 |
} |
108 |
} |
109 |
// look for sq planar metals |
110 |
for (i=1; i <= natom; i++) |
111 |
{ |
112 |
if (atom[i].type >= 300) |
113 |
{ |
114 |
jj = 0; |
115 |
for (j=0; j < MAXIAT; j++) |
116 |
{ |
117 |
if (atom[i].iat[j] != 0) |
118 |
jj++; |
119 |
} |
120 |
if (jj == 4) |
121 |
{ |
122 |
strcpy(pt1," 0"); strcat(pt1,"300"); strcat(pt1," 0"); strcat(pt1," 0"); |
123 |
if ( (atom[i].flags & mask5) && (atom[i].flags & mask6) && (atom[i].flags & mask8) ) |
124 |
{ |
125 |
for (j=0; j < ooplane_k.nopbend; j++) |
126 |
{ |
127 |
if (strcmp(pt,ooplane_k.iopb[j]) == 0 || strcmp(pt1,ooplane_k.iopb[j]) == 0) |
128 |
{ |
129 |
angles.i13[angles.nang][0] = atom[i].iat[0]; |
130 |
angles.i13[angles.nang][1] = i; |
131 |
angles.i13[angles.nang][2] = atom[i].iat[1]; |
132 |
angles.i13[angles.nang][3] = atom[i].iat[2]; |
133 |
angles.copb[angles.nang] = ooplane_k.copb[j]; |
134 |
angles.angin[angles.nang] = TRUE; |
135 |
angles.nang++; |
136 |
angles.nopb++; |
137 |
angles.i13[angles.nang][0] = atom[i].iat[0]; |
138 |
angles.i13[angles.nang][1] = i; |
139 |
angles.i13[angles.nang][2] = atom[i].iat[2]; |
140 |
angles.i13[angles.nang][3] = atom[i].iat[1]; |
141 |
angles.copb[angles.nang] = ooplane_k.copb[j]; |
142 |
angles.angin[angles.nang] = TRUE; |
143 |
angles.nang++; |
144 |
angles.nopb++; |
145 |
angles.i13[angles.nang][0] = atom[i].iat[0]; |
146 |
angles.i13[angles.nang][1] = i; |
147 |
angles.i13[angles.nang][2] = atom[i].iat[3]; |
148 |
angles.i13[angles.nang][3] = atom[i].iat[1]; |
149 |
angles.copb[angles.nang] = ooplane_k.copb[j]; |
150 |
angles.angin[angles.nang] = TRUE; |
151 |
angles.nang++; |
152 |
angles.nopb++; |
153 |
|
154 |
angles.i13[angles.nang][0] = atom[i].iat[1]; |
155 |
angles.i13[angles.nang][1] = i; |
156 |
angles.i13[angles.nang][2] = atom[i].iat[2]; |
157 |
angles.i13[angles.nang][3] = atom[i].iat[0]; |
158 |
angles.copb[angles.nang] = ooplane_k.copb[j]; |
159 |
angles.angin[angles.nang] = TRUE; |
160 |
angles.nang++; |
161 |
angles.nopb++; |
162 |
angles.i13[angles.nang][0] = atom[i].iat[1]; |
163 |
angles.i13[angles.nang][1] = i; |
164 |
angles.i13[angles.nang][2] = atom[i].iat[3]; |
165 |
angles.i13[angles.nang][3] = atom[i].iat[0]; |
166 |
angles.copb[angles.nang] = ooplane_k.copb[j]; |
167 |
angles.angin[angles.nang] = TRUE; |
168 |
angles.nang++; |
169 |
angles.nopb++; |
170 |
|
171 |
angles.i13[angles.nang][0] = atom[i].iat[2]; |
172 |
angles.i13[angles.nang][1] = i; |
173 |
angles.i13[angles.nang][2] = atom[i].iat[3]; |
174 |
angles.i13[angles.nang][3] = atom[i].iat[0]; |
175 |
angles.copb[angles.nang] = ooplane_k.copb[j]; |
176 |
angles.angin[angles.nang] = TRUE; |
177 |
angles.nang++; |
178 |
angles.nopb++; |
179 |
break; |
180 |
} |
181 |
} |
182 |
} |
183 |
} |
184 |
} |
185 |
} |
186 |
// |
187 |
if (angles.nopb == 0) |
188 |
pot.use_opbend = FALSE; |
189 |
} |