1 /****************************************************************************
2 * program for create QChem function for create default qchemBasis file
3 *
4 * compile createQChemFuncForGabedit :
5 * gcc -o createQChemFuncForGabedit createQChemFuncForGabedit.c
6 * createQChemFuncForGabedit and enter for create the qchem.cc file
7 * for Gabedit.
8 *****************************************************************************/
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <sys/stat.h>
13 #include <ctype.h>
14
15
16 #ifndef G_OS_WIN32
17 #include <dirent.h>
18 #else
19 #include <windows.h>
20 #endif
21
22
23 #define NBASIS 120
24 #define BSIZE 1024
25
26 typedef struct _Atom
27 {
28 char symb[10];
29 int nbas;
30 char basisName[NBASIS][BSIZE];
31 }Atom;
32
33 typedef struct _Basis
34 {
35 char name[BSIZE];
36 int nAtoms;
37 char symbols[NBASIS][BSIZE];
38 }Basis;
39
40 /***********************************************************************************/
41 #define NROW 18
42 #define NCOL 10
43 char *SymbAtoms[18][10]={
44 {"H" ,"Li","Na","K" ,"Rb","Cs","Fr","00","00","00"},
45 {"00","Be","Mg","Ca","Sr","Ba","Ra","00","X","00"},
46 {"00","00","00","Sc","Y" ,"La","Ac","00","00","00"},
47 {"00","00","00","Ti","Zr","Hf","00","00","00","00"},
48 {"00","00","00","V" ,"Nb","Ta","00","Ce","Th","00"},
49 {"00","00","00","Cr","Mo","W" ,"00","Pr","Pa","00"},
50 {"00","00","00","Mn","Tc","Re","00","Nd","U" ,"00"},
51 {"00","00","00","Fe","Ru","Os","00","Pm","Np","00"},
52 {"00","00","00","Co","Rh","Ir","00","Sm","Pu","00"},
53 {"00","00","00","Ni","Pd","Pt","00","Eu","Am","00"},
54 {"00","00","00","Cu","Ag","Au","00","Gd","Cm","00"},
55 {"00","00","00","Zn","Cd","Hg","00","Tb","Bk","00"},
56 {"00","B" ,"Al","Ga","In","Tl","00","Dy","Cf","00"},
57 {"00","C" ,"Si","Ge","Sn","Pb","00","Ho","Es","00"},
58 {"00","N" ,"P" ,"As","Sb","Bi","00","Er","Fm","00"},
59 {"00","O" ,"S" ,"Se","Te","Po","00","Tm","Md","00"},
60 {"00","F" ,"Cl","Br","I" ,"At","00","Yb","No","00"},
61 {"He","Ne","Ar","Kr","Xe","Rn","00","Lu","Lr","00"},
62 };
63 /***********************************************************************************/
get_list_of_files(char * dirname,int * n)64 static char** get_list_of_files(char* dirname, int* n)
65 {
66 DIR* dir;
67 struct stat st;
68 struct dirent *File;
69 int nFiles = 0;
70 char** filesList = NULL;
71
72 dir = opendir(dirname);
73 if(dir)
74 {
75 File = readdir(dir);
76 while(File)
77 {
78
79 if( strlen(File->d_name)>0 && File->d_name[0] != '.' )
80 {
81 char all_name[BSIZE];
82 printf("%s\n",File->d_name);
83 sprintf(all_name,"%s%s%s",dirname,"/",File->d_name);
84 stat(all_name,&st);
85 if(!(st.st_mode & S_IFDIR))
86 {
87 nFiles++;
88 filesList = realloc(filesList, nFiles*sizeof(char*));
89 filesList[nFiles-1] = strdup(all_name);
90 printf("allname = %s\n",all_name);
91 }
92 }
93 File = readdir(dir);
94 }
95 closedir(dir);
96 }
97 *n = nFiles;
98 return filesList;
99 }
100 /***********************************************************************************/
addOneBasis(Basis * listOfBasis,char * basis,char * atom)101 Basis* addOneBasis(Basis* listOfBasis, char* basis, char* atom)
102 {
103 int n = 1;
104 int i,j;
105 if(listOfBasis==NULL)
106 {
107 listOfBasis = malloc(1*sizeof(Basis));
108 listOfBasis[0].nAtoms = -1;
109 }
110 for(i=0;listOfBasis[i].nAtoms>=0; i++)
111 {
112 n++;
113 if(strcmp(listOfBasis[i].name,basis)==0)
114 {
115 for(j=0;j<listOfBasis[i].nAtoms; j++)
116 if(strcmp(listOfBasis[i].symbols[j],atom)==0)
117 {
118 return listOfBasis;
119 }
120 sprintf(listOfBasis[i].symbols[j],"%s",atom);
121 listOfBasis[i].nAtoms++;
122 return listOfBasis;
123 }
124 }
125 listOfBasis = realloc(listOfBasis,(n+1)*sizeof(Basis));
126 listOfBasis[n].nAtoms = -1;
127 listOfBasis[n-1].nAtoms = 1;
128 sprintf(listOfBasis[n-1].symbols[0],"%s",atom);
129 sprintf(listOfBasis[n-1].name,"%s",basis);
130 return listOfBasis;
131 }
132 /***********************************************************************************/
newAtomList()133 Atom* newAtomList()
134 {
135 Atom* listOfAtoms=NULL;
136 int n = 0;
137 int i, j;
138
139 for(i=0;i<NCOL;i++)
140 for(j=0;j<NROW;j++)
141 {
142 if(strcmp(SymbAtoms[j][i],"00")==0) continue;
143 n++;
144 }
145 n++;
146 listOfAtoms = (Atom*)malloc(n*sizeof(Atom));
147 listOfAtoms[n-1].nbas = -1;
148
149 n = 0;
150 for(i=0;i<NCOL;i++)
151 for(j=0;j<NROW;j++)
152 {
153 if(strcmp(SymbAtoms[j][i],"00")==0) continue;
154 n++;
155 listOfAtoms[n-1].nbas = 0;
156 sprintf(listOfAtoms[n-1].symb,"%s",SymbAtoms[j][i]);
157 }
158 return listOfAtoms;
159
160
161 }
162 /***********************************************************************************/
printAllAtomsList(Atom listOfAtoms[])163 void printAllAtomsList(Atom listOfAtoms[])
164 {
165 int i=0;
166 int j=0;
167 for(i=0;listOfAtoms[i].nbas>=0; i++)
168 {
169 printf("%s : %d ",listOfAtoms[i].symb, listOfAtoms[i].nbas);
170 for(j=0;j<listOfAtoms[i].nbas; j++)
171 printf("%s ",listOfAtoms[i].basisName[j]);
172 printf("\n");
173 }
174 }
175 /***********************************************************************************/
printAllBasisList(Basis listOfBasis[])176 void printAllBasisList(Basis listOfBasis[])
177 {
178 int i=0;
179 int j=0;
180 for(i=0;listOfBasis[i].nAtoms>=0; i++)
181 {
182 printf("%s : ",listOfBasis[i].name);
183 for(j=0;j<listOfBasis[i].nAtoms; j++)
184 printf("%s ",listOfBasis[i].symbols[j]);
185 printf("\n");
186 }
187 }
188 /***********************************************************************************/
createBasisList(Atom listOfAtoms[])189 Basis* createBasisList(Atom listOfAtoms[])
190 {
191 Basis* listOfBasis = NULL;
192 int i=0;
193 int j=0;
194 for(i=0;listOfAtoms[i].nbas>=0; i++)
195 {
196 for(j=0;j<listOfAtoms[i].nbas; j++)
197 listOfBasis =addOneBasis(listOfBasis,listOfAtoms[i].basisName[j], listOfAtoms[i].symb);
198 }
199 return listOfBasis;
200 }
201 /***********************************************************************************/
str_delete_n(char * str)202 void str_delete_n(char* str)
203 {
204 char *s;
205
206 if(str == NULL)
207 return;
208
209 if (!*str)
210 return;
211 for (s = str + strlen (str) - 1; s >= str && ((unsigned char)*s)=='\n'; s--)
212 *s = '\0';
213 }
214 /**********************************************/
delete_last_spaces(char * str)215 void delete_last_spaces(char* str)
216 {
217 char *s;
218
219 if(str == NULL)
220 return;
221
222 if (!*str)
223 return;
224 for (s = str + strlen (str) - 1; s >= str && isspace ((unsigned char)*s); s--)
225 *s = '\0';
226 }
227 /**********************************************/
delete_first_spaces(char * str)228 void delete_first_spaces(char* str)
229 {
230 unsigned char *start;
231 int i;
232 int lenSpace = 0;
233
234 if(str == NULL)
235 return;
236 if (!*str)
237 return;
238
239 for (start = str; *start && isspace (*start); start++)lenSpace++;
240
241 for(i=0;i<(int)(strlen(str)-lenSpace);i++)
242 str[i] = str[i+lenSpace];
243 str[strlen(str)-lenSpace] = '\0';
244 }
245 /***********************************************************************************/
getBasisAndAtoms(char * t,char * basis,char * atoms)246 void getBasisAndAtoms(char* t, char* basis, char* atoms)
247 {
248 int i;
249 int j;
250 int k;
251 int OkBasis = 0;
252 int OkAtoms = 0;
253
254 k = 0;
255 for(i=k;i<strlen(t);i++)
256 {
257 if(t[i]!='<') break;
258 for(j=i+1;j<strlen(t);j++)
259 if(t[j]=='>') { i = j; break;}
260 }
261 for(k=j+1;k<strlen(t);k++)
262 {
263 if(t[k]=='<') break;
264 basis[k-j-1] = t[k];
265 }
266 basis[k] = '\0';
267 for(i=k;i<strlen(t);i++)
268 {
269 if(t[i]!='<') break;
270 for(j=i+1;j<strlen(t);j++)
271 if(t[j]=='>') { i = j; break;}
272 }
273 for(k=j+1;k<strlen(t);k++)
274 {
275 if(t[k]=='<') break;
276 atoms[k-j-1] = t[k];
277 }
278 atoms[k] = '\0';
279 /*printf("Basis = %s Atoms = %s\n",basis,atoms);*/
280
281 }
282 /***********************************************************************************/
getListOfGroups(char * atoms)283 char** getListOfGroups(char* atoms)
284 {
285 int n=0;
286 int i;
287 int j;
288 char** m = malloc(1*sizeof(char*));
289 m[0] = NULL;
290
291 for(i=0;i<strlen(atoms);i++)
292 {
293 if(atoms[i]==',') {continue;}
294 n++;
295 m = realloc(m,(n+1)*sizeof(char*));
296 m[n] = NULL;
297 m[n-1] = malloc(BSIZE*sizeof(char));
298 for(j=i;j<strlen(atoms);j++)
299 {
300 if(atoms[j]==',') {break;}
301 m[n-1][j-i] = atoms[j];
302 }
303 i=j;
304 m[n-1][j] = '\0';
305 delete_last_spaces(m[n-1]);
306 delete_first_spaces(m[n-1]);
307 }
308 return m;
309
310 }
311 /***********************************************************************************/
getListOfAtoms(char * oneList)312 char** getListOfAtoms(char* oneList)
313 {
314 if(!strstr(oneList,"-"))
315 {
316 char** m = malloc(2*sizeof(char*));
317 m[1] = NULL;
318 m[0] = strdup(oneList);
319 return m;
320 }
321 else
322 {
323 char* atomMin = malloc(BSIZE*sizeof(char));
324 char* atomMax = malloc(BSIZE*sizeof(char));
325 int i,j;
326 int iMin=-1,jMin=-1;
327 int iMax=-1,jMax=-1;
328 char** m = malloc(1*sizeof(char*));
329 int n=0;
330 m[0] = NULL;
331
332 for(i=0;i<strlen(oneList);i++)
333 {
334 if(oneList[i]=='-')break;
335 atomMin[i] = oneList[i];
336 }
337 atomMin[i] = '\0';
338 for(j=i+1;j<strlen(oneList);j++)
339 {
340 atomMax[j-i-1] = oneList[j];
341 }
342 atomMin[j] = '\0';
343
344 for(i=0;i<NCOL;i++)
345 for(j=0;j<NROW;j++)
346 {
347 if(strcmp(SymbAtoms[j][i],atomMin)==0)
348 {
349 iMin = i;
350 jMin = j;
351 }
352 if(strcmp(SymbAtoms[j][i],atomMax)==0)
353 {
354 iMax = i;
355 jMax = j;
356 }
357
358 }
359
360 if(iMin>=0 && jMin>=0 && iMax>=0 && jMax>=0)
361 {
362 for(i=iMin;i<=iMax;i++)
363 {
364 if(i==iMin) j = jMin;
365 else j = 0;
366 for( ; (i==iMax)?j<=jMax:j<NROW ; j++)
367 {
368 if(strcmp(SymbAtoms[j][i],"00")==0)continue;
369 {
370 n++;
371 m = realloc(m,(n+1)*sizeof(char*));
372 m[n] = NULL;
373 m[n-1] = strdup(SymbAtoms[j][i]);
374 }
375 }
376 }
377 }
378 return m;
379
380 return NULL;
381 }
382 }
383 /***********************************************************************************/
strup(char * str)384 static void strup(char* str)
385 {
386 int i=0;
387 if(!str) return;
388 for(i=0;i<strlen(str);i++)
389 str[i] = toupper(str[i]);
390 }
391 /***********************************************************************************/
atomInFile(FILE * file,char * symb)392 static int atomInFile(FILE* file, char* symb)
393 {
394 int ok = 0;
395 char t[BSIZE];
396 char s1[10];
397 char s2[10];
398 int i;
399 int k;
400 char* ss = strdup(symb);
401
402 strup(ss);
403 while(!feof(file))
404 {
405 if(!fgets(t,BSIZE,file)) break;
406 strup(t);
407 k = sscanf(t,"%s %d %s",s1,&i,s2);
408 if(k != 2) continue;
409 if(strcmp(s1,ss)==0)
410 {
411 ok = 1;
412 break;
413 }
414 }
415 return ok;
416 }
417 /***********************************************************************************/
createQChemFunction(Atom * listOfAtoms,Basis * listOfBasis)418 void createQChemFunction(Atom* listOfAtoms, Basis* listOfBasis)
419 {
420 int nBasis = 0;
421 int nAtoms = 0;
422 FILE* file;
423 int i;
424 int j;
425
426 file = fopen("qchemBasis.cc","w");
427 if(!file) return;
428 fprintf(file,"gboolean create_libqchem_file(gchar* filename)\n");
429 fprintf(file,"{\n");
430 fprintf(file,"\tFILE* file = fopen(filename,\"w\");\n\n");
431 fprintf(file,"\tif(file==NULL)\n");
432 fprintf(file,"\t{\n");
433 fprintf(file,"\t\treturn FALSE;\n");
434 fprintf(file,"\t}\n");
435 /*
436 for(i=0;listOfBasis[i].nAtoms>=0;i++) nBasis++;
437 fprintf(file,"\tfprintf(file,\"Begin List of basis\\n\");\n");
438 fprintf(file,"\tfprintf(file,\"Nbasis = %d\\n\");\n",nBasis);
439 printf("nBasis = %d\n",nBasis);
440 for(i=0;i<nBasis;i++)
441 {
442 int j=0;
443 fprintf(file,"\tfprintf(file,\"Basis %s\\n\");\n",listOfBasis[i].name);
444 fprintf(file,"\tfprintf(file,\"%d\\n\");\n",listOfBasis[i].nAtoms);
445 for(j=0;j<listOfBasis[i].nAtoms;j++)
446 {
447 int k = 0;
448 fprintf(file,"\tfprintf(file,\"%s %s", listOfBasis[i].name, listOfBasis[i].symbols[j]);
449 fprintf(file,"\\n\");\n");
450 }
451 }
452 fprintf(file,"\tfprintf(file,\"End List of basis\\n\\n\");\n\n");
453 */
454 for(i=0;listOfAtoms[i].nbas>=0;i++) nAtoms++;
455 /* fprintf(file,"\tfprintf(file,\"Begin List of atoms\\n\");\n");*/
456 fprintf(file,"\tfprintf(file,\"NAtoms = %d\\n\");\n",nAtoms);
457 for(i=0;i<nAtoms;i++)
458 {
459 int j=0;
460 fprintf(file,"\tfprintf(file,\"Atom %s\\n\");\n",listOfAtoms[i].symb);
461 fprintf(file,"\tfprintf(file,\"%d\\n\");\n",listOfAtoms[i].nbas);
462 for(j=0;j<listOfAtoms[i].nbas;j++)
463 {
464 int k = 0;
465 fprintf(file,"\tfprintf(file,\"%s %s ", listOfAtoms[i].symb, listOfAtoms[i].basisName[j]);
466 fprintf(file,"\\n\");\n");
467 }
468 }
469 /* fprintf(file,"\tfprintf(file,\"End List of atoms\\n\");\n");*/
470 fprintf(file,"\tfclose(file);\n");
471 fprintf(file,"\treturn TRUE;\n");
472 fprintf(file,"}\n");
473 fclose(file);
474 }
475
476 /***********************************************************************************/
setBaseNameFromFileName(char * baseName,FILE * file,char * fileName)477 static void setBaseNameFromFileName(char* baseName, FILE* file, char* fileName)
478 {
479 int k;
480 char t[BSIZE];
481 int i;
482 int begin;
483 int end;
484
485 fseek(file, 0L, SEEK_SET);
486 sprintf(baseName,"UNK");
487 while(!feof(file))
488 {
489 if(!fgets(t,BSIZE,file)) break;
490 if(strstr(t,"BASIS="))
491 {
492 char* p = strstr(t,"BASIS=")+7;
493 for(i=0;i<strlen(t);i++)
494 {
495 if(t[i] == '"') t[i] = ' ';
496 if(t[i] == '(') t[i] = ' ';
497 if(t[i] == ')') t[i] = ' ';
498 }
499 p = strstr(t,"BASIS=")+7;
500 k = sscanf(p,"%s",baseName);
501 if(k!=1)
502 sprintf(baseName,"UNK");
503 break;
504 }
505 }
506 if(strcmp(baseName,"Pople")!=0 && strcmp(baseName,"UNK")!=0) return;
507 printf("baseName = %s\n", baseName);
508 printf("fileName = %s\n", fileName);
509 for(i=0;i<strlen(fileName);i++)
510 {
511 if(fileName[i] == '/') begin = i;
512 if(fileName[i] == '.') end = i;
513 }
514 begin++;
515 for(i=0;i<end-begin;i++)
516 {
517 baseName[i] = fileName[i+begin];
518 }
519 baseName[end] = '\0';
520
521 }
522 /***********************************************************************************/
swap(char * x,char * y)523 static void swap(char* x, char* y)
524 {
525 char buffer[BSIZE];
526 sprintf(buffer,"%s",x);
527 sprintf(x,"%s",y);
528 sprintf(y,"%s",buffer);
529 }
530 /***********************************************************************************/
sort0(Atom * atom)531 static void sort0(Atom* atom)
532 {
533 int nbas = 0;
534 int i;
535 int j;
536 int k;
537
538 nbas = atom->nbas;
539 for(i=0; i<nbas-1; i++)
540 {
541 k = i;
542 for(j=i+1; j<nbas; j++)
543 if(strcasecmp(atom->basisName[k],atom->basisName[j])>0) { k = j;}
544
545
546 if(k != i)
547 {
548 swap(atom->basisName[i],atom->basisName[k]);
549 }
550 }
551 }
552 /***********************************************************************************/
sortBasisForAnAtom(Atom * atom)553 static void sortBasisForAnAtom(Atom* atom)
554 {
555 int nbas = 0;
556 int i;
557 int j;
558 int k;
559
560 nbas = atom->nbas;
561 for(i=0; i<nbas-1; i++)
562 {
563 for(j=i+1; j<nbas; j++)
564 if(strcasecmp(atom->basisName[i],atom->basisName[j])==0)
565 sprintf(atom->basisName[j],"ZZZZZZZZZZZ");
566 if(strstr(atom->basisName[i],"STO"))
567 {
568 char buffer[100];
569 sprintf(buffer,"00-%s",atom->basisName[i]);
570 sprintf(atom->basisName[i],"%s",buffer);
571 }
572 if(strstr(atom->basisName[i],"5Z"))
573 {
574 char* p = strstr(atom->basisName[i],"5Z");
575 *p = 'Y';
576 }
577 if(strstr(atom->basisName[i],"6Z"))
578 {
579 char* p = strstr(atom->basisName[i],"5Z");
580 *p = 'Z';
581 }
582 if(strstr(atom->basisName[i],"QZ"))
583 {
584 char* p = strstr(atom->basisName[i],"QZ");
585 *p = 'X';
586 }
587 }
588 sort0(atom);
589 k = 0;
590 for(i=0; i<nbas; i++)
591 {
592 if(strcasecmp(atom->basisName[i],"ZZZZZZZZZZZ")==0)
593 {
594 if(k==0) k = i;
595 }
596 if(strstr(atom->basisName[i],"00-"))
597 {
598 int len = strlen(atom->basisName[i]);
599 for(j=3;j<len;j++)
600 atom->basisName[i][j-3] = atom->basisName[i][j];
601 atom->basisName[i][len-3] ='\0';
602 }
603 if(strstr(atom->basisName[i],"YZ"))
604 {
605 char* p = strstr(atom->basisName[i],"YZ");
606 *p = '5';
607 }
608 if(strstr(atom->basisName[i],"ZZ"))
609 {
610 char* p = strstr(atom->basisName[i],"ZZ");
611 *p = '6';
612 }
613 if(strstr(atom->basisName[i],"XZ"))
614 {
615 char* p = strstr(atom->basisName[i],"XZ");
616 *p = 'Q';
617 }
618 }
619 atom->nbas = k;
620 }
621 /***********************************************************************************/
main(int argc,char * argv[])622 int main(int argc,char* argv[])
623 {
624 Atom* atom = malloc(NROW*NCOL*sizeof(Atom));
625 FILE* file;
626 char* fileName = "qchem.bas";
627 char* dirName = "usr/local/QChem/aux/basis";
628 Atom* listOfAtoms = NULL;
629 Basis* listOfBasis = NULL;
630 char** listOfFiles = NULL;
631 int nFiles = 0;
632 int l,c,k,i,n = 0;
633
634 if(argc < 2)
635 {
636 printf("Sorry, You should the directory name of Q-Chem basis\n");
637 printf(" Example : createQChemFuncForGabedit $QC/aux/basis\n");
638 return 1;
639 }
640 dirName = argv[1];
641 listOfFiles = get_list_of_files(dirName, &nFiles);
642 if(!listOfFiles)
643 {
644 printf("Error, a void directory\n");
645 printf("No files found in %s directory\n",dirName);
646 return 1;
647 }
648 listOfAtoms = newAtomList();
649 for(i=0;i<nFiles;i++)
650 {
651 file = fopen(listOfFiles[i],"r");
652 if(!file)
653 {
654 printf("Sorry, I can not open %s file\n",listOfFiles[i]);
655 return 1;
656 }
657 n = 0;
658 for(c=0;c<NCOL;c++)
659 for(l=0;l<NROW;l++)
660 {
661 if(strcmp(SymbAtoms[l][c],"00")==0) continue;
662 n++;
663 if(atomInFile(file, SymbAtoms[l][c]))
664 {
665 listOfAtoms[n-1].nbas++;
666 k = listOfAtoms[n-1].nbas-1;
667 setBaseNameFromFileName(listOfAtoms[n-1].basisName[k],file, listOfFiles[i]);
668 }
669 }
670 fclose(file);
671 }
672
673 i = 0;
674 for(c=0;c<NCOL;c++)
675 for(l=0;l<NROW;l++)
676 {
677 if(strcmp(SymbAtoms[l][c],"00")==0) continue;
678 sortBasisForAnAtom(&listOfAtoms[i]);
679 i++;
680 }
681
682
683 /* printAllAtomsList(listOfAtoms);*/
684 listOfBasis = createBasisList(listOfAtoms);
685 printf("Fin de listOfBasis \n");
686 /* printAllBasisList(listOfBasis);*/
687 createQChemFunction(listOfAtoms, listOfBasis);
688 return 0;
689 }
690