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