1 /* OrbitalsQChem.c */
2 /**********************************************************************************************************
3 Copyright (c) 2002-2013 Abdul-Rahman Allouche. All rights reserved
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6 documentation files (the Gabedit), to deal in the Software without restriction, including without limitation
7 the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
8 and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9
10 The above copyright notice and this permission notice shall be included in all copies or substantial portions
11 of the Software.
12
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
14 TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
16 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17 DEALINGS IN THE SOFTWARE.
18 ************************************************************************************************************/
19
20 #include "../../Config.h"
21 #include "GlobalOrb.h"
22 #include "../Utils/AtomsProp.h"
23 #include "../Utils/UtilsInterface.h"
24 #include "../Utils/Utils.h"
25 #include "../Utils/Constants.h"
26 #include "../Utils/Zlm.h"
27 #include "../Geometry/GeomGlobal.h"
28 #include "GeomDraw.h"
29 #include "GLArea.h"
30 #include "UtilsOrb.h"
31 #include "Basis.h"
32 #include "GeomOrbXYZ.h"
33 #include "AtomicOrbitals.h"
34 #include "StatusOrb.h"
35 #include "Basis.h"
36 #include "Orbitals.h"
37 #include "GeomOrbXYZ.h"
38 #include "BondsOrb.h"
39
40 /********************************************************************************/
41 typedef enum
42 {
43 GABEDIT_ORBLOCALTYPE_BOYS=0,
44 GABEDIT_ORBLOCALTYPE_EDMISTON,
45 GABEDIT_ORBLOCALTYPE_PIPEK,
46 GABEDIT_ORBLOCALTYPE_UNKNOWN
47 } GabEditOrbLocalType;
48
49 static gchar* titlesLocalOrb[GABEDIT_ORBLOCALTYPE_PIPEK+1]=
50 {
51 "BOYS ORBITAL LOCALIZATION",
52 "EDMISTON-RUEDENBERG ENERGY LOCALIZATION",
53 "MOLECULAR ORBITALS LOCALIZED BY THE POPULATION METHOD"
54 };
55
56 typedef enum
57 {
58 GABEDIT_ORBTYPE_ALPHA = 0,
59 GABEDIT_ORBTYPE_BETA,
60 GABEDIT_ORBTYPE_RESTRICTED,
61 GABEDIT_ORBTYPE_MCSCF,
62 GABEDIT_ORBTYPE_EIGENVECTORS,
63 GABEDIT_ORBTYPE_BOYS_ALPHA,
64 GABEDIT_ORBTYPE_BOYS_BETA,
65 GABEDIT_ORBTYPE_BOYS,
66 GABEDIT_ORBTYPE_EDMISTON_ALPHA,
67 GABEDIT_ORBTYPE_EDMISTON_BETA,
68 GABEDIT_ORBTYPE_EDMISTON,
69 GABEDIT_ORBTYPE_PIPEK_ALPHA,
70 GABEDIT_ORBTYPE_PIPEK_BETA,
71 GABEDIT_ORBTYPE_PIPEK,
72 } GabEditOrbType;
73 static gchar* titlesOrb[GABEDIT_ORBTYPE_PIPEK+1]=
74 {
75 "ALPHA MOLECULAR ORBITAL COEFFICIENTS",
76 "BETA MOLECULAR ORBITAL COEFFICIENTS",
77 "RESTRICTED (RHF) MOLECULAR ORBITAL COEFFICIENTS",
78 "MCSCF OPTIMIZED ORBITALS",
79 "EIGENVECTORS",
80 "***** ALPHA ORBITAL LOCALIZATION *****",
81 "****** BETA ORBITAL LOCALIZATION *****",
82 "THE BOYS LOCALIZED ORBITALS ARE",
83 "***** ALPHA ORBITAL LOCALIZATION *****",
84 "****** BETA ORBITAL LOCALIZATION *****",
85 "EDMISTON-RUEDENBERG ENERGY LOCALIZED ORBITALS",
86 "***** ALPHA ORBITAL LOCALIZATION *****",
87 "****** BETA ORBITAL LOCALIZATION *****",
88 "THE PIPEK-MEZEY POPULATION LOCALIZED ORBITALS ARE"
89 };
90 /********************************************************************************/
91 static gboolean sphericalBasis = FALSE;
92 /********************************************************************************/
read_geomorb_qchem_file_geom(gchar * FileName)93 static gboolean read_geomorb_qchem_file_geom(gchar *FileName)
94 {
95 gchar *t;
96 gchar *tmp = NULL;
97 gboolean OK;
98 gchar *AtomCoord[5];
99 FILE *fd;
100 guint taille=BSIZE;
101 guint i;
102 gint j=0;
103 guint numgeom;
104 long geompos=0;
105 gint idummy;
106 gint l;
107
108 for(i=0;i<5;i++) AtomCoord[i]=g_malloc(taille*sizeof(char));
109
110 if ((!FileName) || (strcmp(FileName,"") == 0))
111 {
112 Message(_("Sorry\n No file selected"),_("Error"),TRUE);
113 for(i=0;i<5;i++) g_free(AtomCoord[i]);
114 return FALSE;
115 }
116
117 t=g_malloc(taille);
118 fd = FOpen(FileName, "rb");
119 if(fd ==NULL)
120 {
121 Message(_("Sorry\nI can not open this file"),_("Error"),TRUE);
122 g_free(t);
123 for(i=0;i<5;i++) g_free(AtomCoord[i]);
124 return FALSE;
125 }
126
127 init_dipole();
128 free_data_all();
129 tmp = get_name_file(FileName);
130 set_status_label_info(_("File name"),tmp);
131 g_free(tmp);
132 set_status_label_info(_("File type"),"Q-Chem");
133 numgeom =1;
134 do
135 {
136 set_status_label_info(_("Geometry"),"Reading");
137 OK=FALSE;
138 while(!feof(fd))
139 {
140 if(!fgets(t,taille,fd))break;
141 if ( strstr( t,"Atom") && strstr( t,"X") && strstr( t,"Y") && strstr( t,"Z"))
142 {
143 if(!fgets(t,taille,fd))break;
144 if(!strstr( t,"----------------------------------")) break;
145 numgeom++;
146 OK = TRUE;
147 break;
148 }
149 }
150 if(!OK && (numgeom == 1) )
151 {
152 Message(_("Sorry\nI can not read geometry from this file"),_("Error"),TRUE);
153 fclose(fd);
154 g_free(t);
155 for(i=0;i<5;i++) g_free(AtomCoord[i]);
156 set_status_label_info(_("File name"),_("Nothing"));
157 set_status_label_info(_("File type"),_("Nothing"));
158 set_status_label_info(_("Geometry"),_("Nothing"));
159 return FALSE;
160 }
161 if(!OK)break;
162
163 j=-1;
164 while(!feof(fd) )
165 {
166 { char* e = fgets(t,taille,fd);}
167 if (strstr( t, "----------------------------------" ))
168 {
169 geompos = ftell(fd);
170 break;
171 }
172
173 j++;
174 if(GeomOrb==NULL) GeomOrb=g_malloc(sizeof(TypeGeomOrb));
175 else GeomOrb=g_realloc(GeomOrb,(j+1)*sizeof(TypeGeomOrb));
176
177 sscanf(t,"%d %s %s %s %s",&idummy,AtomCoord[0],AtomCoord[1],AtomCoord[2],AtomCoord[3]);
178
179 AtomCoord[0][0]=toupper(AtomCoord[0][0]);
180 l=strlen(AtomCoord[0]);
181 if (l==2) AtomCoord[0][1]=tolower(AtomCoord[0][1]);
182 if(isdigit(AtomCoord[0][1]))l=1;
183 if(l==1)sprintf(t,"%c",AtomCoord[0][0]);
184 else sprintf(t,"%c%c",AtomCoord[0][0],AtomCoord[0][1]);
185
186 GeomOrb[j].Symb=g_strdup(t);
187 for(i=0;i<3;i++) GeomOrb[j].C[i]=atof(ang_to_bohr(AtomCoord[i+1]));
188
189 GeomOrb[j].Prop = prop_atom_get(GeomOrb[j].Symb);
190 }
191 geompos = ftell(fd);
192
193 }while(!feof(fd));
194
195 nCenters = j+1;
196 if(nCenters>0)
197 {
198 fseek(fd, geompos, SEEK_SET);
199 get_dipole_from_qchem_output_file(fd);
200 }
201 fclose(fd);
202 g_free(t);
203 for(i=0;i<5;i++) g_free(AtomCoord[i]);
204 if(nCenters == 0 )
205 {
206 g_free(GeomOrb);
207 }
208 else
209 {
210 DefineType();
211 /* PrintGeomOrb();*/
212 }
213 buildBondsOrb();
214 RebuildGeom = FALSE;
215 return TRUE;
216 }
217 /********************************************************************************/
DefineQChemCartBasis()218 static void DefineQChemCartBasis()
219 {
220 gint i,j,k,n;
221 gint l1,l2,l3;
222 gint L;
223 gint *l[3]={NULL,NULL,NULL};
224 gint m;
225
226 NAOrb = 0;
227 for(i=0;i<nCenters;i++)
228 {
229 for(j=0;j<Type[GeomOrb[i].NumType].Norb;j++)
230 {
231 L=Type[GeomOrb[i].NumType].Ao[j].L;
232 NAOrb += (L+1)*(L+2)/2;
233 }
234 }
235
236 AOrb = g_malloc(NAOrb*sizeof(CGTF));
237 if(SAOrb) g_free(SAOrb);
238 SAOrb = NULL;
239
240 k=-1;
241 for(i=0;i<nCenters;i++)
242 for(j=0;j<Type[GeomOrb[i].NumType].Norb;j++)
243 {
244 L = Type[GeomOrb[i].NumType].Ao[j].L;
245
246 for(m=0;m<3;m++)
247 {
248 if(l[m])
249 g_free(l[m]);
250 l[m] = g_malloc((L+1)*(L+2)/2*sizeof(gint));
251 }
252 switch(L)
253 {
254 case 1 :
255 m=0;
256 l[0][m] = 1;l[1][m] = 0;l[2][m] = 0; /* X */
257 m++;
258 l[0][m] = 0;l[1][m] = 1;l[2][m] = 0; /* Y */
259 m++;
260 l[0][m] = 0;l[1][m] = 0;l[2][m] = 1; /* Z */
261 break;
262 case 2 :
263 m=0; l[0][m] = 2;l[1][m] = 0;l[2][m] = 0; /* XX */
264 m++; l[0][m] = 1;l[1][m] = 1;l[2][m] = 0; /* XY */
265 m++; l[0][m] = 0;l[1][m] = 2;l[2][m] = 0; /* YY */
266 m++; l[0][m] = 1;l[1][m] = 0;l[2][m] = 1; /* XZ */
267 m++; l[0][m] = 0;l[1][m] = 1;l[2][m] = 1; /* YZ */
268 m++; l[0][m] = 0;l[1][m] = 0;l[2][m] = 2; /* ZZ */
269 break;
270 case 3 :
271 m=0; l[0][m] = 3;l[1][m] = 0;l[2][m] = 0; /* XXX */
272 m++; l[0][m] = 2;l[1][m] = 1;l[2][m] = 0; /* XXY */
273 m++; l[0][m] = 1;l[1][m] = 2;l[2][m] = 0; /* YYX */
274 m++; l[0][m] = 0;l[1][m] = 3;l[2][m] = 0; /* YYY */
275 m++; l[0][m] = 2;l[1][m] = 0;l[2][m] = 1; /* XXZ */
276 m++; l[0][m] = 1;l[1][m] = 1;l[2][m] = 1; /* XYZ */
277 m++; l[0][m] = 0;l[1][m] = 2;l[2][m] = 1; /* YYZ */
278 m++; l[0][m] = 1;l[1][m] = 0;l[2][m] = 2; /* ZZX */
279 m++; l[0][m] = 0;l[1][m] = 1;l[2][m] = 2; /* ZZY */
280 m++; l[0][m] = 0;l[1][m] = 0;l[2][m] = 3; /* ZZZ */
281 break;
282 case 4 :
283 /* I think that Qchem can n ot print orb with G cartz */
284 m=0; l[0][m] = 4;l[1][m] = 0;l[2][m] = 0; /* XXXX */
285 m++; l[0][m] = 0;l[1][m] = 4;l[2][m] = 0; /* YYYY */
286 m++; l[0][m] = 0;l[1][m] = 0;l[2][m] = 4; /* ZZZZ */
287 m++; l[0][m] = 3;l[1][m] = 1;l[2][m] = 0; /* XXXY */
288 m++; l[0][m] = 3;l[1][m] = 0;l[2][m] = 1; /* XXXZ */
289 m++; l[0][m] = 1;l[1][m] = 3;l[2][m] = 0; /* YYYX */
290 m++; l[0][m] = 0;l[1][m] = 3;l[2][m] = 1; /* YYYZ */
291 m++; l[0][m] = 1;l[1][m] = 0;l[2][m] = 3; /* ZZZX */
292 m++; l[0][m] = 0;l[1][m] = 1;l[2][m] = 3; /* ZZZY */
293 m++; l[0][m] = 2;l[1][m] = 2;l[2][m] = 0; /* XXYY */
294 m++; l[0][m] = 2;l[1][m] = 0;l[2][m] = 2; /* XXZZ */
295 m++; l[0][m] = 0;l[1][m] = 2;l[2][m] = 2; /* YYZZ */
296 m++; l[0][m] = 2;l[1][m] = 1;l[2][m] = 1; /* XXYZ */
297 m++; l[0][m] = 1;l[1][m] = 2;l[2][m] = 1; /* YYXZ */
298 m++; l[0][m] = 1;l[1][m] = 1;l[2][m] = 2; /* ZZXY */
299 break;
300 default :
301 m=0;
302 for(l3=Type[GeomOrb[i].NumType].Ao[j].L;l3>=0;l3--)
303 for(l2=Type[GeomOrb[i].NumType].Ao[j].L-l3;l2>=0;l2--)
304 {
305 l1 = Type[GeomOrb[i].NumType].Ao[j].L-l2-l3;
306 l[0][m] = l1;
307 l[1][m] = l2;
308 l[2][m] = l3;
309 m++;
310 }
311 }
312 for(m=0;m<(L+1)*(L+2)/2;m++)
313 {
314 l1 = l[0][m];
315 l2 = l[1][m];
316 l3 = l[2][m];
317 k++;
318 AOrb[k].numberOfFunctions=Type[GeomOrb[i].NumType].Ao[j].N;
319 AOrb[k].NumCenter = i;
320 AOrb[k].Gtf =g_malloc(AOrb[k].numberOfFunctions*sizeof(GTF));
321 for(n=0;n<AOrb[k].numberOfFunctions;n++)
322 {
323 AOrb[k].Gtf[n].Ex = Type[GeomOrb[i].NumType].Ao[j].Ex[n];
324 AOrb[k].Gtf[n].Coef = Type[GeomOrb[i].NumType].Ao[j].Coef[n];
325 AOrb[k].Gtf[n].C[0] = GeomOrb[i].C[0];
326 AOrb[k].Gtf[n].C[1] = GeomOrb[i].C[1];
327 AOrb[k].Gtf[n].C[2] = GeomOrb[i].C[2];
328 AOrb[k].Gtf[n].l[0] = l1;
329 AOrb[k].Gtf[n].l[1] = l2;
330 AOrb[k].Gtf[n].l[2] = l3;
331 }
332
333 }
334 }
335
336 NOrb = NAOrb;
337 DefineAtomicNumOrb();
338 /* DefineNorb();*/
339 }
340 /**********************************************/
DefineQChemSphericalBasis()341 static void DefineQChemSphericalBasis()
342 {
343 gint i,j,k;
344 gint c;
345 gint kl;
346 gint L,M;
347 CGTF *temp;
348 Zlm Stemp;
349 gint N,Nc,n;
350 gint klbeg;
351 gint klend;
352 gint klinc;
353
354
355 NOrb = 0;
356 for(i=0;i<nCenters;i++)
357 {
358 for(j=0;j<Type[GeomOrb[i].NumType].Norb;j++)
359 {
360 L=Type[GeomOrb[i].NumType].Ao[j].L;
361 NOrb += 2*L+1;
362 }
363 }
364
365 temp = g_malloc(NOrb*sizeof(CGTF));
366
367 k=-1;
368 for(i=0;i<nCenters;i++)
369 for(j=0;j<Type[GeomOrb[i].NumType].Norb;j++)
370 {
371 L =Type[GeomOrb[i].NumType].Ao[j].L;
372
373 if(L==1)
374 {
375 klbeg = L;
376 klend = -L;
377 klinc = -1;
378 }
379 else
380 {
381 klbeg = -L;
382 klend = L;
383 klinc = +1;
384 }
385 for(kl = klbeg;(klbeg == -L && kl<=klend) || (klbeg == L && kl>=klend);kl +=klinc)
386 {
387 M = kl;
388 k++;
389 Stemp = getZlm(L,M);
390
391 temp[k].numberOfFunctions=Stemp.numberOfCoefficients*Type[GeomOrb[i].NumType].Ao[j].N;
392 temp[k].NumCenter=i;
393 temp[k].Gtf =g_malloc(temp[k].numberOfFunctions*sizeof(GTF));
394 Nc=-1;
395 for(N=0;N<Type[GeomOrb[i].NumType].Ao[j].N;N++)
396 for(n=0;n<Stemp.numberOfCoefficients;n++)
397 {
398 Nc++;
399
400 temp[k].Gtf[Nc].Ex = Type[GeomOrb[i].NumType].Ao[j].Ex[N];
401 temp[k].Gtf[Nc].Coef = Type[GeomOrb[i].NumType].Ao[j].Coef[N]*Stemp.lxyz[n].Coef;
402 for(c=0;c<3;c++)
403 {
404 temp[k].Gtf[Nc].C[c] = GeomOrb[i].C[c];
405 temp[k].Gtf[Nc].l[c] = Stemp.lxyz[n].l[c];
406 }
407 }
408 if(L==0) break;
409 if(L==1 && kl == -1)
410 {
411 /* switch -1 and 0 */
412 CGTF dum = temp[k];
413 temp[k] = temp[k-1];
414 temp[k-1] = dum;
415 }
416 }
417 }
418 for(i=0;i<NAOrb;i++) g_free(AOrb[i].Gtf);
419 g_free(AOrb);
420 NAOrb = NOrb;
421 AOrb = temp;
422 if(SAOrb) g_free(SAOrb);
423 SAOrb = NULL;
424 DefineAtomicNumOrb();
425 }
426 /********************************************************************************/
read_basis_from_a_qchem_output_file(gchar * FileName,gint * nrs)427 static gchar** read_basis_from_a_qchem_output_file(gchar *FileName, gint* nrs)
428 {
429 gchar **strbasis;
430 gchar *t;
431 FILE *fd;
432 gint taille=BSIZE;
433 gint nrows=0;
434 gboolean OK = FALSE;
435
436 if ((!FileName) || (strcmp(FileName,"") == 0))
437 {
438 Message(_("Sorry No file selected\n"),_("Error"),TRUE);
439 return NULL;
440 }
441
442 fd = FOpen(FileName, "rb");
443 if(fd ==NULL)
444 {
445 gchar buffer[BSIZE];
446 sprintf(buffer,_("Sorry, I can not open '%s' file\n"),FileName);
447 Message(buffer,_("Error"),TRUE);
448 return NULL;
449 }
450
451 t=g_malloc(taille*sizeof(gchar));
452 while(!feof(fd))
453 {
454 if(!fgets(t,taille,fd))break;
455 if(strstr(t,"Basis set in general basis input format:"))
456 {
457 if(!fgets(t,taille,fd))break;
458 if(!strstr(t,"----------------------------"))break;
459 if(!fgets(t,taille,fd))break;
460 if(!strstr(t,"$basis"))break;
461 OK = TRUE;
462 break;
463 }
464 }
465 if(!OK)
466 {
467 g_free(t);
468 Message(_("Sorry I can read basis from this file. Add \nPRINT_GENERAL_BASIS true\nPRINT_ORBITALS true\n to your input file"),_("Error"),TRUE);
469 return NULL;
470 }
471
472 strbasis=g_malloc(sizeof(gchar*));;
473 while(!feof(fd))
474 {
475 if(!fgets(t,taille,fd))break;
476 if(strstr(t,"$end") || strstr(t,"$END") ) break;
477 nrows++;
478 strbasis = g_realloc(strbasis,nrows*sizeof(gchar*));
479 strbasis[nrows-1] = g_strdup(t);
480 }
481 if(nrows == 0)
482 {
483 g_free(t);
484 g_free(strbasis);
485 Message(_("Sorry I can read basis from this file\n"),_("Error"),TRUE);
486 return NULL;
487 }
488
489 /*
490 Debug("End of read \n");
491 Debug("Atomic basis nrows = %d \n",nrows);
492 for(i=0;i<nrows;i++)
493 {
494 Debug("%s",strbasis[i]);
495 }
496 */
497
498 fclose(fd);
499 g_free(t);
500 *nrs = nrows;
501 return strbasis;
502 }
503 /**********************************************/
get_num_type_from_symbol(gchar * symbol)504 static gint get_num_type_from_symbol(gchar* symbol)
505 {
506 gint k;
507 for(k=0;k<nCenters;k++)
508 {
509 if(strcmp(symbol,GeomOrb[k].Symb)==0)
510 return (gint)GeomOrb[k].NumType;
511 }
512 return -1;
513 }
514 /**********************************************/
addOneBasis(gint i,gint j,gchar * shell,gint ncont,gdouble * ex,gdouble * coef)515 static gboolean addOneBasis(gint i,gint j,gchar *shell,gint ncont, gdouble* ex, gdouble* coef)
516 {
517 gint jj;
518 Type[i].Ao[j].N = ncont;
519 Type[i].Ao[j].Ex=g_malloc(Type[i].Ao[j].N*sizeof(gdouble));
520 Type[i].Ao[j].Coef=g_malloc(Type[i].Ao[j].N*sizeof(gdouble));
521 for(jj=0;jj<Type[i].Ao[j].N;jj++)
522 {
523 Type[i].Ao[j].Ex[jj] = ex[jj];
524 Type[i].Ao[j].Coef[jj] = coef[jj];
525 }
526 switch(shell[0])
527 {
528 /* L =SP with QChem */
529 case 'l' :
530 case 'L' :
531 case 's' :
532 case 'S' : Type[i].Ao[j].L=0;break;
533 case 'p' :
534 case 'P' : Type[i].Ao[j].L=1;break;
535 case 'd' :
536 case 'D' : Type[i].Ao[j].L=2;break;
537 case 'f' :
538 case 'F' : Type[i].Ao[j].L=3;break;
539 case 'g' :
540 case 'G' : Type[i].Ao[j].L=4;break;
541 case 'h' :
542 case 'H' : Type[i].Ao[j].L=5;break;
543 case 'i' :
544 case 'I' : Type[i].Ao[j].L=6;break;
545 case 'j' :
546 case 'J' : Type[i].Ao[j].L=7;break;
547 case 'k' :
548 case 'K' : Type[i].Ao[j].L=8;break;
549
550 default : return FALSE;
551 }
552 return TRUE;
553 }
554 /**********************************************/
DefineQChemBasisType(gchar ** strbasis,gint nrows)555 static gboolean DefineQChemBasisType(gchar** strbasis, gint nrows)
556 {
557 gchar sym[50];
558 gchar shell[10];
559 gchar t[10];
560 gint i;
561 gint j;
562 gint nconts;
563 gint k;
564 gdouble *ex=NULL;
565 gdouble *coef1=NULL;
566 gdouble *coef2=NULL;
567 gchar* temp[10];
568 gint ne;
569 gboolean Ok;
570 gint jj;
571 gint c;
572 gboolean newAtom = TRUE;
573
574 if(Ntype<1) return FALSE;
575 if(nrows<1) return FALSE;
576 ex = g_malloc(nrows*sizeof(gdouble));
577 coef1 = g_malloc(nrows*sizeof(gdouble));
578 coef2 = g_malloc(nrows*sizeof(gdouble));
579 for(i=0;i<10;i++) temp[i] = g_malloc(BSIZE*sizeof(gchar));
580
581 /*
582 for(k=0;k<nCenters;k++)
583 {
584 printf("%s %d\n",GeomOrb[k].Symb,GeomOrb[k].NumType);
585 }
586 */
587
588 Type = g_malloc(Ntype*sizeof(TYPE));
589 for(i=0;i<Ntype;i++)
590 {
591 Type[i].Ao = NULL;
592 Type[i].Norb=0;
593 }
594 for(k=0;k<nCenters;k++)
595 {
596 sprintf(sym,"%s",GeomOrb[k].Symb);
597 i = GeomOrb[k].NumType;
598 /* printf("numType = %d\n",k);*/
599 Type[i].Symb=g_strdup(sym);
600 Type[i].N=GetNelectrons(sym);
601 }
602 /* set number of basis by type */
603 i = -1;
604 sprintf(shell,"S");
605 nconts=-1;
606 Ok = TRUE;
607 nconts = 0;
608 newAtom = TRUE;
609 for(k=0;k<nrows;k++)
610 {
611 if(strstr(strbasis[k],"**"))
612 {
613 newAtom = TRUE;
614 k++;
615 if(k>=nrows)break;
616 }
617 sscanf(strbasis[k],"%s",t);
618 if(newAtom && !isdigit(t[0])) /* symbol of atom*/
619 {
620 newAtom = FALSE;
621 i=get_num_type_from_symbol(t);
622 if(i<0)
623 {
624 Ok = FALSE;
625 break;
626 }
627 Type[i].Norb=0;
628 nconts=0;
629 continue;
630 }
631 sscanf(strbasis[k],"%s %d",shell, &nconts);
632 for(c=0;c<nconts;c++)
633 {
634 k++;
635 ne = sscanf(strbasis[k],"%s %s %s",temp[0],temp[1],temp[2]);
636 if(ne<2)
637 {
638 Ok = FALSE;
639 break;
640 }
641 for(j=0;j<ne;j++)
642 {
643 gchar* d=strstr(temp[j],"D");
644 if(d) *d='e';
645 }
646 if(ne>=1) ex[c]=atof(temp[0]);
647 if(ne>=2) coef1[c]=atof(temp[1]);
648 if(ne==3) coef2[c]=atof(temp[2]);
649 }
650 if(nconts != 0)
651 {
652 gint j = Type[i].Norb;
653 uppercase(shell);
654 if(strcmp(shell,"SP")==0) Type[i].Norb+=2;
655 else Type[i].Norb++;
656 if(Type[i].Ao == NULL)
657 Type[i].Ao=g_malloc(Type[i].Norb*sizeof(AO));
658 else
659 Type[i].Ao=g_realloc(Type[i].Ao,Type[i].Norb*sizeof(AO));
660 for(jj=j;jj< Type[i].Norb;jj++)
661 {
662 Type[i].Ao[jj].Ex = NULL;
663 Type[i].Ao[jj].Coef = NULL;
664 }
665
666
667 if(!addOneBasis(i,j,shell,nconts, ex, coef1))
668 {
669 Ok = FALSE;
670 break;
671 }
672 if(strcmp(shell,"SP")==0)
673 {
674 if(!addOneBasis(i,j+1,"P",nconts, ex, coef2))
675 {
676 Ok = FALSE;
677 break;
678 }
679 }
680
681 /*
682 printf("shell =%s ",shell);
683 printf("nconts =%d\n",nconts);
684 */
685 nconts=0;
686 }
687 }
688 if(!Ok)
689 {
690 if(Type)
691 for(i=0;i<Ntype;i++)
692 {
693 if(Type[i].Ao != NULL)
694 {
695 for(j=0;j<Type[i].Norb;j++)
696 {
697 if(Type[i].Ao[j].Ex != NULL) g_free(Type[i].Ao[j].Ex);
698 if(Type[i].Ao[j].Coef != NULL) g_free(Type[i].Ao[j].Coef);
699 }
700 g_free(Type[i].Ao);
701 }
702 }
703
704 if(Type) g_free(Type);
705 if(ex) g_free(ex);
706 if(coef1) g_free(coef1);
707 if(coef2) g_free(coef2);
708 for(j=0;j<10;j++) g_free(temp[j]);
709 return FALSE;
710 }
711 if(ex) g_free(ex);
712 if(coef1) g_free(coef1);
713 if(coef2) g_free(coef2);
714 for(j=0;j<10;j++) g_free(temp[j]);
715
716 return TRUE;
717 }
718 /********************************************************************************/
get_number_of_occ(FILE * file,gchar * t)719 static gint get_number_of_occ(FILE* file, gchar* t)
720 {
721 gint n = 0;
722 gint nr;
723 if(!fgets(t,BSIZE,file)) return 0;
724 if(!strstr(t,"-- Occupied --")) return 0;
725 n = 0;
726 do{
727 if(!fgets(t,BSIZE,file))break;
728 nr = numb_of_reals_by_row(t);
729 if(numb_of_string_by_row(t)!=nr) nr = 0;
730 n += nr;
731
732 }while(!strstr(t,"-- ") && !this_is_a_backspace(t));
733 return n;
734 }
735 /********************************************************************************/
get_number_of_occuped_orbitals(gchar * FileName,gint * nAlpha,gint * nBeta)736 static void get_number_of_occuped_orbitals(gchar* FileName, gint* nAlpha, gint* nBeta)
737 {
738 gchar *t;
739 FILE *file;
740
741 *nAlpha=0;
742 *nBeta=0;
743 if ((!FileName) || (strcmp(FileName,"") == 0)) return;
744
745 t=g_malloc(BSIZE*sizeof(gchar));
746 file = FOpen(FileName, "rb");
747 if(file ==NULL) return;
748
749 while(!feof(file))
750 {
751 if(!fgets(t,BSIZE,file))break;
752 if(strstr(t,"Orbital Energies (a.u.)")) break;
753 }
754 if(!strstr(t,"Orbital Energies (a.u.)"))
755 {
756 if(t!=NULL) g_free(t);
757 if(file) fclose(file);
758 return;
759 }
760 { char* e = fgets(t,BSIZE,file);}
761
762 while(!feof(file))
763 {
764 if(!fgets(t,BSIZE,file))break;
765 if(strstr(t,"----")) break;
766 if(strstr(t,"Alpha MOs"))
767 *nAlpha = get_number_of_occ(file, t);
768 if(strstr(t,"Beta MOs"))
769 *nBeta = get_number_of_occ(file, t);
770
771 }
772 if(t!=NULL) g_free(t);
773 if(file) fclose(file);
774 }
775 /********************************************************************************/
get_local_orbital_type(gchar * fileName)776 static GabEditOrbLocalType get_local_orbital_type(gchar *fileName)
777 {
778 gchar *t;
779 FILE *file;
780 gint taille=BSIZE;
781
782 if ((!fileName) || (strcmp(fileName,"") == 0)) return GABEDIT_ORBLOCALTYPE_UNKNOWN;
783
784 t=g_malloc(taille);
785 file = FOpen(fileName, "rb");
786 if(file ==NULL) return GABEDIT_ORBLOCALTYPE_UNKNOWN;
787 while(!feof(file))
788 {
789 GabEditOrbLocalType i;
790 if(!fgets(t,taille,file))break;
791 for(i=GABEDIT_ORBLOCALTYPE_BOYS;i<=GABEDIT_ORBLOCALTYPE_PIPEK;i++)
792 {
793 if(strstr( t,titlesLocalOrb[i]))
794 {
795 g_free(t);
796 return i;
797 }
798 }
799 }
800 g_free(t);
801 return GABEDIT_ORBLOCALTYPE_UNKNOWN;
802 }
803 /********************************************************************************/
read_last_orbitals_in_qchem_file(gchar * fileName,GabEditOrbType itype,gint nAlpha,gint nBeta)804 static gboolean read_last_orbitals_in_qchem_file(gchar *fileName,GabEditOrbType itype, gint nAlpha, gint nBeta)
805 {
806 #define NO 6
807 gchar *t;
808 gboolean OK;
809 gchar *dum[NO];
810 FILE *fd;
811 gint taille=BSIZE;
812 gint i;
813 gint numorb;
814 gchar *pdest = NULL;
815 gint NumOrb[NO];
816 gdouble EnerOrb[NO];
817 gint ncart;
818 gint n;
819 gint k,k1,k2,k3;
820 gint j;
821 gdouble **CoefOrbitals;
822 gdouble *EnerOrbitals;
823 gchar **SymOrbitals;
824 gchar* tmp = NULL;
825
826 if ((!fileName) || (strcmp(fileName,"") == 0))
827 {
828 Message(_("Sorry No file selected\n"),_("Error"),TRUE);
829 return FALSE;
830 }
831
832 t=g_malloc(taille);
833 fd = FOpen(fileName, "rb");
834 if(fd ==NULL)
835 {
836 gchar buffer[BSIZE];
837 sprintf(buffer,_("Sorry, I can not open '%s' file\n"),fileName);
838 Message(buffer,_("Error"),TRUE);
839 return FALSE;
840 }
841 for(i=0;i<NO;i++) dum[i]=g_malloc(BSIZE*sizeof(gchar));
842
843 /* Debug("Norb = %d\n",NOrb);*/
844 CoefOrbitals = CreateTable2(NOrb);
845 EnerOrbitals = g_malloc(NOrb*sizeof(gdouble));
846 SymOrbitals = g_malloc(NOrb*sizeof(gchar*));
847
848 numorb =1;
849 do
850 {
851 OK=FALSE;
852 while(!feof(fd))
853 {
854 if(!fgets(t,taille,fd))break;
855 switch(itype)
856 {
857 case GABEDIT_ORBTYPE_ALPHA :
858 pdest = strstr( t, titlesOrb[itype]);
859 break;
860 case GABEDIT_ORBTYPE_BETA :
861 pdest = strstr( t, titlesOrb[itype]);
862 break;
863 case GABEDIT_ORBTYPE_RESTRICTED:
864 pdest = strstr( t, titlesOrb[itype] );
865 break;
866 case GABEDIT_ORBTYPE_MCSCF:
867 pdest = strstr( t,titlesOrb[itype]);
868 break;
869 case GABEDIT_ORBTYPE_EIGENVECTORS:
870 pdest = strstr( t, titlesOrb[itype] );
871 {
872 gchar dump1[50];
873 gchar dump2[50];
874 gint k = sscanf(t,"%s %s",dump1,dump2);
875 if(k!=1 || strcmp(dump1,titlesOrb[itype])!=0) pdest=NULL;
876 }
877 break;
878 case GABEDIT_ORBTYPE_BOYS_ALPHA:
879 pdest = strstr( t,titlesOrb[itype]);
880 break;
881 case GABEDIT_ORBTYPE_BOYS_BETA:
882 pdest = strstr( t,titlesOrb[itype]);
883 break;
884 case GABEDIT_ORBTYPE_BOYS:
885 pdest = strstr( t,titlesOrb[itype]);
886 break;
887 case GABEDIT_ORBTYPE_EDMISTON_ALPHA:
888 pdest = strstr( t,titlesOrb[itype]);
889 break;
890 case GABEDIT_ORBTYPE_EDMISTON_BETA:
891 pdest = strstr( t,titlesOrb[itype]);
892 break;
893 case GABEDIT_ORBTYPE_EDMISTON:
894 pdest = strstr( t,titlesOrb[itype]);
895 break;
896 case GABEDIT_ORBTYPE_PIPEK_ALPHA:
897 pdest = strstr( t,titlesOrb[itype]);
898 break;
899 case GABEDIT_ORBTYPE_PIPEK_BETA:
900 pdest = strstr( t,titlesOrb[itype]);
901 break;
902 case GABEDIT_ORBTYPE_PIPEK:
903 pdest = strstr( t,titlesOrb[itype]);
904 break;
905 }
906 if ( pdest != NULL )
907 {
908 numorb++;
909 OK = TRUE;
910 break;
911 }
912 }
913 if(!OK && (numorb == 1) )
914 {
915 if(
916 itype==GABEDIT_ORBTYPE_BETA ||
917 itype==GABEDIT_ORBTYPE_EIGENVECTORS ||
918 itype==GABEDIT_ORBTYPE_BOYS_BETA ||
919 itype==GABEDIT_ORBTYPE_EDMISTON_BETA ||
920 itype==GABEDIT_ORBTYPE_PIPEK_BETA
921 )
922 {
923 gchar buffer[BSIZE];
924 sprintf(buffer,_("Sorry, I can not read orbitals from '%s' file\n"),fileName);
925 Message(buffer,_("Error"),TRUE);
926 }
927 FreeTable2(CoefOrbitals,NOrb);
928 g_free(EnerOrbitals);
929 g_free(SymOrbitals);
930 fclose(fd);
931 g_free(t);
932 return FALSE;
933 }
934 if(!OK)
935 {
936 /* Debug("End of read \n");*/
937 fclose(fd);
938 g_free(t);
939 for(i=0;i<NO;i++) g_free(dum[i]);
940
941 switch(itype)
942 {
943 case GABEDIT_ORBTYPE_ALPHA :
944 case GABEDIT_ORBTYPE_BOYS_ALPHA:
945 case GABEDIT_ORBTYPE_EDMISTON_ALPHA:
946 case GABEDIT_ORBTYPE_PIPEK_ALPHA:
947 CoefAlphaOrbitals = CoefOrbitals;
948 EnerAlphaOrbitals = EnerOrbitals;
949
950 SymAlphaOrbitals = SymOrbitals;
951
952 OccAlphaOrbitals = g_malloc(NOrb*sizeof(gdouble));
953 for(i=0;i<nAlpha;i++) OccAlphaOrbitals[i] = 1.0;
954 for(i=nAlpha;i<NOrb;i++) OccAlphaOrbitals[i] = 0.0;
955
956 NAlphaOcc = nAlpha;
957 NAlphaOrb = NOrb;
958 break;
959
960 case GABEDIT_ORBTYPE_BETA :
961 case GABEDIT_ORBTYPE_BOYS_BETA:
962 case GABEDIT_ORBTYPE_EDMISTON_BETA:
963 case GABEDIT_ORBTYPE_PIPEK_BETA:
964 CoefBetaOrbitals = CoefOrbitals;
965 EnerBetaOrbitals = EnerOrbitals;
966 SymBetaOrbitals = SymOrbitals;
967
968 OccBetaOrbitals = g_malloc(NOrb*sizeof(gdouble));
969 for(i=0;i<nBeta;i++) OccBetaOrbitals[i] = 1.0;
970 for(i=nBeta;i<NOrb;i++) OccBetaOrbitals[i] = 0.0;
971
972 NBetaOcc = nBeta;
973 NBetaOrb = NOrb;
974 break;
975
976 case GABEDIT_ORBTYPE_RESTRICTED:
977 case GABEDIT_ORBTYPE_MCSCF:
978 case GABEDIT_ORBTYPE_EIGENVECTORS:
979 case GABEDIT_ORBTYPE_BOYS:
980 case GABEDIT_ORBTYPE_EDMISTON:
981 case GABEDIT_ORBTYPE_PIPEK:
982 CoefAlphaOrbitals = CoefOrbitals;
983 EnerAlphaOrbitals = EnerOrbitals;
984 SymAlphaOrbitals = SymOrbitals;
985 OccAlphaOrbitals = g_malloc(NOrb*sizeof(gdouble));
986 if(itype==GABEDIT_ORBTYPE_RESTRICTED && nBeta==0) nBeta = nAlpha;
987
988 for(i=0;i<nAlpha;i++) OccAlphaOrbitals[i] = 1.0;
989 for(i=nAlpha;i<NOrb;i++) OccAlphaOrbitals[i] = 0.0;
990
991 CoefBetaOrbitals = CoefOrbitals;
992 EnerBetaOrbitals = EnerOrbitals;
993 OccBetaOrbitals = OccAlphaOrbitals;
994 SymBetaOrbitals = SymOrbitals;
995 NAlphaOcc = nAlpha;
996 NBetaOcc = nBeta;
997 NAlphaOrb = NOrb;
998 NBetaOrb = NOrb;
999 break;
1000 }
1001 return TRUE;
1002 }
1003 switch(itype)
1004 {
1005 case GABEDIT_ORBTYPE_BOYS_ALPHA:
1006 case GABEDIT_ORBTYPE_BOYS_BETA:
1007 while(!feof(fd))
1008 {
1009 if(!fgets(t,taille,fd))break;
1010 if(strstr(t,titlesOrb[GABEDIT_ORBTYPE_BOYS]))
1011 {
1012 { char* e = fgets(t,taille,fd);}
1013 break;
1014 }
1015 }
1016 break;
1017 case GABEDIT_ORBTYPE_EDMISTON_ALPHA:
1018 case GABEDIT_ORBTYPE_EDMISTON_BETA:
1019 while(!feof(fd))
1020 {
1021 if(!fgets(t,taille,fd))break;
1022 if(strstr(t,titlesOrb[GABEDIT_ORBTYPE_EDMISTON]))
1023 {
1024 { char* e = fgets(t,taille,fd);}
1025 break;
1026 }
1027 }
1028 break;
1029 case GABEDIT_ORBTYPE_PIPEK_ALPHA:
1030 case GABEDIT_ORBTYPE_PIPEK_BETA:
1031 while(!feof(fd))
1032 {
1033 if(!fgets(t,taille,fd))break;
1034 if(strstr(t,titlesOrb[GABEDIT_ORBTYPE_PIPEK]))
1035 {
1036 { char* e = fgets(t,taille,fd);}
1037 break;
1038 }
1039 }
1040 break;
1041 case GABEDIT_ORBTYPE_ALPHA :
1042 case GABEDIT_ORBTYPE_BETA :
1043 break;
1044 case GABEDIT_ORBTYPE_RESTRICTED:
1045 case GABEDIT_ORBTYPE_MCSCF:
1046 case GABEDIT_ORBTYPE_EIGENVECTORS:
1047 break;
1048 case GABEDIT_ORBTYPE_BOYS:
1049 case GABEDIT_ORBTYPE_EDMISTON:
1050 case GABEDIT_ORBTYPE_PIPEK:
1051 { char* e = fgets(t,taille,fd);}
1052 }
1053
1054 ncart=NOrb/NO;
1055 if(NOrb%NO>0) ncart++;
1056 gint no=0;
1057 for(n=0;n<ncart;n++)
1058 {
1059 if(!fgets(t,taille,fd))break;
1060 k1 = sscanf(t,"%d %d %d %d %d %d",&NumOrb[0],&NumOrb[1],&NumOrb[2],&NumOrb[3],&NumOrb[4],&NumOrb[5]);
1061 for(i=0;i<k1;i++) NumOrb[i]--;
1062 if(k1<1)
1063 {
1064 break;
1065 }
1066
1067
1068 if(!fgets(t,taille,fd))break;
1069 k2 = sscanf(t,"%s %lf %lf %lf %lf %lf %lf", dum[0], &EnerOrb[0], &EnerOrb[1], &EnerOrb[2], &EnerOrb[3], &EnerOrb[4], &EnerOrb[5]);
1070 k2--;
1071 for(i=0;i<k2;i++) EnerOrbitals[NumOrb[i]] = EnerOrb[i];
1072 if(k2>0)
1073 {
1074 for(i=0;i<k2;i++) SymOrbitals[NumOrb[i]] = g_strdup("UNK");
1075 k3 = k2;
1076 }
1077 else
1078 {
1079 for(i=0;i<k1;i++) EnerOrbitals[NumOrb[i]] = 0.0;
1080 if(
1081 itype==GABEDIT_ORBTYPE_BOYS_ALPHA
1082 || itype==GABEDIT_ORBTYPE_BOYS_BETA
1083 || itype==GABEDIT_ORBTYPE_BOYS
1084 )
1085 for(i=0;i<k1;i++) SymOrbitals[NumOrb[i]] = g_strdup("BOYS");
1086 else
1087 if(
1088 itype==GABEDIT_ORBTYPE_EDMISTON_ALPHA
1089 || itype==GABEDIT_ORBTYPE_EDMISTON_BETA
1090 || itype==GABEDIT_ORBTYPE_EDMISTON
1091 )
1092 for(i=0;i<k1;i++) SymOrbitals[NumOrb[i]] = g_strdup("EDMISTON-RUEDENBERG");
1093
1094 else
1095 if(
1096 itype==GABEDIT_ORBTYPE_PIPEK_ALPHA
1097 || itype==GABEDIT_ORBTYPE_PIPEK_BETA
1098 || itype==GABEDIT_ORBTYPE_PIPEK
1099 )
1100 for(i=0;i<k1;i++) SymOrbitals[NumOrb[i]] = g_strdup("PIPEK-MEZEY");
1101 else for(i=0;i<k1;i++) SymOrbitals[NumOrb[i]] = g_strdup("UNK");
1102 k3 = k1;
1103 }
1104 for(i=0;i<NOrb;i++)
1105 {
1106 { char* e = fgets(t,taille,fd);}
1107 tmp = t + 19;
1108 k = sscanf(tmp,"%s %s %s %s %s %s",dum[0], dum[1], dum[2], dum[3], dum[4], dum[5]);
1109 for(j=0;j<k;j++) CoefOrbitals[NumOrb[j]][i]=atof(dum[j]);
1110 }
1111 no+=k3;
1112 if(k3<NO)break;
1113 }
1114 if(no<NOrb)
1115 {
1116 for(j=no;j<NOrb;j++)
1117 {
1118 EnerOrbitals[j]=0;
1119 SymOrbitals[j] = g_strdup("DELETED");
1120 for(i=0;i<NOrb;i++)
1121 {
1122 CoefOrbitals[j][i]=0.0;
1123 }
1124 }
1125 }
1126 /* Debug("End ncart\n"); */
1127
1128 }while(!feof(fd));
1129
1130 /* Debug("End of read \n"); */
1131 fclose(fd);
1132 g_free(t);
1133 for(i=0;i<NO;i++) g_free(dum[i]);
1134
1135 CoefAlphaOrbitals = CoefOrbitals;
1136 EnerAlphaOrbitals = EnerOrbitals;
1137 return TRUE;
1138 }
1139 /********************************************************************************/
read_qchem_orbitals(gchar * FileName)1140 void read_qchem_orbitals(gchar* FileName)
1141 {
1142 gint typefile;
1143 gchar *t = NULL;
1144 gint nrs;
1145 gchar** strbasis=NULL;
1146 gint i;
1147 gboolean Ok;
1148 gint nAlpha;
1149 gint nBeta;
1150 GabEditOrbLocalType typeLocal;
1151 gint typebasis = -1;
1152 /* gint j,jj; */
1153
1154 typefile =get_type_file_orb(FileName);
1155 if(typefile==GABEDIT_TYPEFILE_UNKNOWN) return;
1156
1157
1158 if(typefile != GABEDIT_TYPEFILE_QCHEM)
1159 {
1160 gchar buffer[BSIZE];
1161 sprintf(buffer,_("Sorry, I can not read this format from '%s' file\n"),FileName);
1162 Message(buffer,_("Error"),TRUE);
1163 return ;
1164 }
1165
1166 free_data_all();
1167 t = get_name_file(FileName);
1168 set_status_label_info(_("File name"),t);
1169 g_free(t);
1170 set_status_label_info(_("File type"),"QChem");
1171 set_status_label_info(_("Mol. Orb."),"Reading");
1172
1173 free_orbitals();
1174
1175 typebasis =get_type_basis_in_qchem_file(FileName);
1176 if(typebasis == -1)
1177 {
1178 gchar buffer[BSIZE];
1179 sprintf(buffer,
1180 _(
1181 "Sorry, Gabedit does not support mixed spherical and contaminant cartezian basis functions\n\n"
1182 "Use 'purecart 11111' or 'purecart 22222' in $rem block"
1183 )
1184 );
1185 Message(buffer,_("Error"),TRUE);
1186 set_status_label_info(_("File name"),_("Nothing"));
1187 set_status_label_info(_("File type"),_("Nothing"));
1188 set_status_label_info(_("Mol. Orb."),_("Nothing"));
1189 return;
1190 }
1191
1192 if(!read_geomorb_qchem_file_geom(FileName) )
1193 {
1194 free_geometry();
1195 set_status_label_info(_("File name"),_("Nothing"));
1196 set_status_label_info(_("File type"),_("Nothing"));
1197 set_status_label_info(_("Mol. Orb."),_("Nothing"));
1198 return;
1199 }
1200 strbasis=read_basis_from_a_qchem_output_file(FileName, &nrs);
1201 if(strbasis==NULL)
1202 {
1203 if(GeomOrb)
1204 {
1205 init_atomic_orbitals();
1206 for(i=0;i<nCenters;i++) GeomOrb[i].Prop = prop_atom_get("H");
1207 free_geometry();
1208 }
1209 set_status_label_info(_("File name"),_("Nothing"));
1210 set_status_label_info(_("File type"),_("Nothing"));
1211 set_status_label_info(_("Mol. Orb."),_("Nothing"));
1212 return;
1213 }
1214
1215 set_status_label_info(_("Mol. Orb."),"Reading");
1216 InitializeAll();
1217 if(!DefineQChemBasisType(strbasis,nrs))
1218 {
1219 gchar buffer[BSIZE];
1220 sprintf(buffer,_("Sorry, I can not read basis from '%s' file\n"),FileName);
1221 Message(buffer,_("Error"),TRUE);
1222 set_status_label_info(_("File name"),_("Nothing"));
1223 set_status_label_info(_("File type"),_("Nothing"));
1224 set_status_label_info(_("Mol. Orb."),_("Nothing"));
1225 return;
1226 }
1227 for(i=0;i<Ntype;i++)
1228 if(Type[i].Ao == NULL)
1229 {
1230 gchar buffer[BSIZE];
1231 sprintf(buffer,_("Sorry, I can not read '%s' file, problem with basis set \n"),FileName);
1232 Message(buffer,_("Error"),TRUE);
1233 return;
1234 }
1235
1236 /*
1237 for(i=0;i<Ntype;i++)
1238 for(j=0;j<Type[i].Norb;j++)
1239 {
1240 printf(" L = %d\n",Type[i].Ao[j].L);
1241 for(jj=0;jj<Type[i].Ao[j].N;jj++)
1242 {
1243 printf(" %lf ",Type[i].Ao[j].Ex[jj]);
1244 printf(" %lf ",Type[i].Ao[j].Coef[jj]);
1245 }
1246 printf("\n");
1247 }
1248 */
1249 DefineType();
1250 buildBondsOrb();
1251 RebuildGeom = TRUE;
1252 reset_grid_limits();
1253 init_atomic_orbitals();
1254 set_status_label_info(_("Geometry"),_("Ok"));
1255 glarea_rafresh(GLArea); /* for geometry*/
1256
1257
1258 if(typebasis == 1)
1259 {
1260 DefineQChemSphericalBasis();
1261 sphericalBasis = TRUE;
1262 }
1263 else
1264 {
1265 DefineQChemCartBasis();
1266 sphericalBasis = FALSE;
1267 }
1268
1269 /*PrintAllBasis();*/
1270 NormaliseAllBasis();
1271 /*PrintAllBasis();*/
1272 DefineNOccs();
1273
1274 get_number_of_occuped_orbitals(FileName, &nAlpha, &nBeta);
1275
1276 /*
1277 printf("Number of ALPHA occ = %d\n",nAlpha);
1278 printf("Number of BETA occ = %d\n",nBeta);
1279 printf("NOrb = %d\n",NOrb);
1280 */
1281
1282
1283 typeLocal = get_local_orbital_type(FileName);
1284 if(typeLocal!=GABEDIT_ORBLOCALTYPE_UNKNOWN)
1285 {
1286 if(typeLocal==GABEDIT_ORBLOCALTYPE_BOYS)
1287 {
1288 Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_BOYS_ALPHA,nAlpha,nBeta);
1289 if(Ok) Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_BOYS_BETA, nAlpha, nBeta);
1290 else Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_BOYS, nAlpha, nBeta);
1291
1292 }
1293 else
1294 if(typeLocal==GABEDIT_ORBLOCALTYPE_EDMISTON)
1295 {
1296 Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_EDMISTON_ALPHA,nAlpha,nBeta);
1297 if(Ok) Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_EDMISTON_BETA, nAlpha, nBeta);
1298 else Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_EDMISTON, nAlpha, nBeta);
1299 }
1300 else
1301 {
1302 Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_PIPEK_ALPHA,nAlpha,nBeta);
1303 if(Ok) Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_PIPEK_BETA, nAlpha, nBeta);
1304 else Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_PIPEK, nAlpha, nBeta);
1305
1306 }
1307
1308 }
1309 else
1310 {
1311 Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_ALPHA,nAlpha,nBeta);
1312 if(Ok)
1313 {
1314 Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_BETA, nAlpha, nBeta);
1315 }
1316 else
1317 {
1318 if(!Ok) Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_RESTRICTED, nAlpha, nBeta);
1319
1320 if(!Ok) Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_MCSCF, nAlpha, nBeta);
1321 if(!Ok) Ok = read_last_orbitals_in_qchem_file(FileName,GABEDIT_ORBTYPE_EIGENVECTORS, nAlpha, nBeta);
1322 }
1323 }
1324
1325 if(Ok)
1326 {
1327 /*PrintAllOrb(CoefAlphaOrbitals);*/
1328 set_status_label_info(_("Mol. Orb."),_("Ok"));
1329 glarea_rafresh(GLArea); /* for geometry*/
1330 NumSelOrb = NAlphaOcc-1;
1331 create_list_orbitals();
1332 }
1333 else
1334 {
1335 free_orbitals();
1336 set_status_label_info(_("File name"),_("Nothing"));
1337 set_status_label_info(_("File type"),_("Nothing"));
1338 set_status_label_info(_("Mol. Orb."),_("Nothing"));
1339 }
1340
1341 }
1342