/* // isoconv.c // convert from g94 output to d2p binary data // since 1996.03.22 by F.Mizutani, IMS // modify 1996.03.27 for orbitals // modify 1996.04.23 add program code // modify 1996.05.01 unix, dos support */ #include #include #include #define PCODE 11002 #define DOSCOD 0x1111 #define UNXCOD 0x2222 #ifdef DOS #define DCODE DOSCOD #else #define DCODE UNXCOD #endif #define BUFMAX 4096 #define OBTMAX 256 char buf[BUFMAX]; long itype,n[3],ct; float b[3]; float s[3]; float d1, d2, d3; float z[OBTMAX][BUFMAX]; int cmode = 0; long oct = 0; long obt[BUFMAX]; typedef struct { long mn; float mw; float x; float y; float z; } MOL; MOL *mol; float mx[OBTMAX], mn[OBTMAX]; ProgramEnd(sw) { printf("USAGE: ISOCONV input\n"); printf(" output is ISO.DAT [Density data]\n"); printf(" output is ISOxx.DAT [Orbital data]\n"); exit(1); } void WritePara(fo, sw) FILE *fo; int sw; { int i, oo; long dcode, pcode; dcode = (long)DCODE; pcode = (long)PCODE; fwrite(&dcode, sizeof(long), 1, fo); fwrite(&pcode, sizeof(long), 1, fo); fwrite(&itype, sizeof(long), 1, fo); fwrite(&mx[sw],sizeof(float), 1, fo); fwrite(&mn[sw],sizeof(float), 1, fo); fwrite(n, sizeof(long), 3, fo); fwrite(b, sizeof(float), 3, fo); fwrite(s, sizeof(float), 3, fo); fwrite(&ct, sizeof(long), 1, fo); fwrite(mol, sizeof(MOL), ct, fo); if (itype == 1){ oo = 1; fwrite(&oo, sizeof(long), 1, fo); fwrite(&obt[sw], sizeof(long), 1, fo); } } main(argc, argv) int argc; char **argv; { FILE *fi, *fo[OBTMAX]; int i, j, k, o, ix, iy, iz; char *sp; for (i = 0; i < OBTMAX; i++){ mx[i] = 1.0E-30; mn[i] = 1.0E+30; } printf("\n"); printf("ISOCONV Copyright(C) 1996 Computer Center of IMS\n"); if (argc != 2 && argc != 3) ProgramEnd(0); if ((fi = fopen(argv[1], "rb")) == NULL) ProgramEnd(1); if (argc == 3){ if (argv[2][0] == '-' || argv[2][0] == '/'){ if (toupper(argv[2][1]) == 'S') cmode = 1; } } /* skip comment, 2 lines */ fgets(buf, BUFMAX, fi); fgets(buf, BUFMAX, fi); /* molecular count, begin point XYZ */ fgets(buf, BUFMAX, fi); sscanf(buf,"%d%f%f%f",&ct,&b[0],&b[1],&b[2]); if (ct > 0) itype=0; else { itype = 1; ct = -ct; } /* resolution count and skip count */ fgets(buf, BUFMAX, fi); sscanf(buf,"%d%f%f%f",&n[0],&s[0], &d2, &d3); fgets(buf, BUFMAX, fi); sscanf(buf,"%d%f%f%f",&n[1], &d1,&s[1], &d3); fgets(buf, BUFMAX, fi); sscanf(buf,"%d%f%f%f",&n[2], &d1, &d2,&s[2]); ix = n[0]; iy = n[1]; iz = n[2]; if (itype == 0) printf("This file is Density data\n"); if (itype == 1) printf("This file is Orbital data\n"); /* moleculars */ printf("Moleculers=%d\n", ct); if ((mol = (MOL *)malloc(ct * sizeof(MOL))) == NULL){ perror("mol malloc error"); exit(1); } for (i = 0; i < ct; i++){ fgets(buf, BUFMAX, fi); sscanf(buf,"%d%f%f%f%f", &mol[i].mn, &mol[i].mw, &mol[i].x, &mol[i].y, &mol[i].z); } if (itype == 1){ /* orbital count, orbital points */ fgets(buf, BUFMAX, fi); sp = strtok(buf, " "); sscanf(sp, "%d", &oct); if (oct > OBTMAX) oct = OBTMAX; sp = strtok(NULL, " \r\n\t"); for (i = 0; i < oct; i++){ sscanf(sp, "%d", &obt[i]); sp = strtok(NULL, " \r\n\t"); if (i != oct - 1 && sp == NULL){ fgets(buf, BUFMAX, fi); sp = strtok(buf, " "); } } printf("Orbital Count=%d\nOrbital ", oct); for (i = 0; i < oct; i++) printf("No.%d ", obt[i]); printf("\n"); } printf("Resolution X=%d Y=%d Z=%d\n", n[0], n[1], n[2]); printf("Begin AXIS X=%+f Y=%+f Z=%+f\n", b[0], b[1], b[2]); printf("Step AXIS X=%+f Y=%+f Z=%+f\n", s[0], s[1], s[2]); if (itype == 0){ if ((fo[0] = fopen("iso.dat", "wb")) == NULL){ fclose(fi); printf("Output file open error.\n"); exit(1); } WritePara(fo[0], 0); printf("X loop "); for (i = 0; i < ix; i++){ printf("[%d]", i + 1); fflush(stdout); for (j = 0; j < iy; j++){ fgets(buf, BUFMAX, fi); sp = strtok(buf, " "); for (k = 0; k < iz; k++){ sscanf(sp, "%f", &z[0][k]); sp = strtok(NULL, " \r\n\t"); if (k != iz - 1 && sp == NULL){ fgets(buf, BUFMAX, fi); sp = strtok(buf, " "); } } for (k = 0; k < iz; k++){ if (z[0][k] > mx[0]) mx[0] = z[0][k]; if (z[0][k] < mn[0]) mn[0] = z[0][k]; } fwrite(z[0], sizeof(float), iz, fo[0]); } } fseek(fo[0], 4L * 3, SEEK_SET); printf("\nMin=%+e Max=%+e\n", mn[0], mx[0]); fwrite(&mx[0], sizeof(float), 1, fo[0]); fwrite(&mn[0], sizeof(float), 1, fo[0]); fclose(fo[0]); } if (itype == 1){ for (o = 0; o < oct; o++){ sprintf(buf, "iso%d.dat", obt[o]); if ((fo[o] = fopen(buf, "wb")) == NULL){ fclose(fi); printf("Output file open error.\n"); exit(1); } WritePara(fo[o], o); } printf("X loop "); for (i = 0; i < ix; i++){ printf("[%d]", i + 1); fflush(stdout); for (j = 0; j < iy; j++){ fgets(buf, BUFMAX, fi); sp = strtok(buf, " "); for (k = 0; k < iz; k++){ for (o = 0; o < oct; o++){ sscanf(sp, "%f", &z[o][k]); sp = strtok(NULL, " \r\n\t"); if (sp == NULL && k != iz - 1){ fgets(buf, BUFMAX, fi); sp = strtok(buf, " "); continue; } if (sp == NULL && k == iz - 1 && o != oct - 1){ fgets(buf, BUFMAX, fi); sp = strtok(buf, " "); continue; } } } for (k = 0; k < iz; k++){ for (o = 0; o < oct; o++){ /* if (z[o][k] > mx[o]) mx[o] = z[o][k];*/ /* if (z[o][k] < mn[o]) mn[o] = z[o][k];*/ if ((float)fabs(z[o][k]) > mx[o]) mx[o]=(float)fabs(z[o][k]); if ((float)fabs(z[o][k]) < mn[o]) mn[o]=(float)fabs(z[o][k]); } } for (o = 0; o < oct; o++){ fwrite(z[o], sizeof(float), iz, fo[o]); } } } printf("\n"); for (o = 0; o < oct; o++){ fseek(fo[o], 4L * 3, SEEK_SET); printf("No.%d: Min=%+e Max=%+e\n", obt[o], mn[o], mx[o]); fwrite(&mx[o], sizeof(float), 1, fo[o]); fwrite(&mn[o], sizeof(float), 1, fo[o]); fclose(fo[o]); } } fclose(fi); }