mirror of
https://github.com/arcan1s/moldyn.git
synced 2025-06-28 14:51:41 +00:00
Added envir
This commit is contained in:
219
envir/envir.c
Normal file
219
envir/envir.c
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
/* envir
|
||||||
|
* Version: 1.0
|
||||||
|
* License: GPL
|
||||||
|
* Author: Evgeniy Alexeev aka arcanis
|
||||||
|
* Email: esalexeev@gmail.com
|
||||||
|
*
|
||||||
|
* 'envir' is a program for search environment for chosen molecule by geometric
|
||||||
|
* criterion
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* envir -i FILENAME -o FILEMANE [ -n NUM_OF_MOLECULE ] [ -r RADIUS ] [ -h ]
|
||||||
|
*
|
||||||
|
* Compile:
|
||||||
|
* gcc envir.c -o envir -lm
|
||||||
|
* Dependence:
|
||||||
|
* * gcc
|
||||||
|
* * libs: stdio.h, stdlib.h, string.h, math.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<stdlib.h>
|
||||||
|
#include<string.h>
|
||||||
|
#include<math.h>
|
||||||
|
|
||||||
|
|
||||||
|
char atom_type[5000][30][2];
|
||||||
|
double centr_coord[5000][3], coord[5000][30][3], rad;
|
||||||
|
int at_in_mol[5000], mol, needed_mol[50], num_of_mol;
|
||||||
|
/* at_in_mol - number of atoms in molecules
|
||||||
|
* atom_type - massive of atom names
|
||||||
|
* centr_coord - coordinates of molecule mass center
|
||||||
|
* coord - coordinates of atoms
|
||||||
|
* mol - number of molecule in system
|
||||||
|
* needed_mol - massive of mulecules found
|
||||||
|
* num_of_mol - number of molecule for search
|
||||||
|
* rad - geometric criterion
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void printing(char output_file[])
|
||||||
|
{
|
||||||
|
int cur_mol=0, i, j=1;
|
||||||
|
FILE *out;
|
||||||
|
|
||||||
|
out = fopen (output_file, "w+");
|
||||||
|
while (needed_mol[cur_mol] != 10000)
|
||||||
|
{
|
||||||
|
for (i=0; i<at_in_mol[needed_mol[cur_mol]]; i++)
|
||||||
|
{
|
||||||
|
fprintf(out, "ATOM %5i %c%c MOL %4i %8.3f%8.3f%8.3f\n", j, atom_type[needed_mol[cur_mol]][i][0], \
|
||||||
|
atom_type[needed_mol[cur_mol]][i][1], cur_mol+1, coord[needed_mol[cur_mol]][i][0], \
|
||||||
|
coord[needed_mol[cur_mol]][i][1], coord[needed_mol[cur_mol]][i][2]);
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
cur_mol++;
|
||||||
|
}
|
||||||
|
fclose (out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void search()
|
||||||
|
{
|
||||||
|
double r;
|
||||||
|
int i, k=0;
|
||||||
|
|
||||||
|
for (i=0; i<50; i++)
|
||||||
|
needed_mol[i] = 10000;
|
||||||
|
|
||||||
|
for (i=0; i<mol; i++)
|
||||||
|
{
|
||||||
|
r = sqrt(pow((centr_coord[i][0]-centr_coord[num_of_mol-1][0]), 2) + \
|
||||||
|
pow((centr_coord[i][1]-centr_coord[num_of_mol-1][1]), 2) + \
|
||||||
|
pow((centr_coord[i][2]-centr_coord[num_of_mol-1][2]), 2));
|
||||||
|
if (r < rad)
|
||||||
|
{
|
||||||
|
needed_mol[k] = i;
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void set_center()
|
||||||
|
{
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
for (i=0; i<mol; i++)
|
||||||
|
for (j=0; j<3; j++)
|
||||||
|
centr_coord[i][j] = 0;
|
||||||
|
|
||||||
|
for (i=0; i<mol; i++)
|
||||||
|
for (j=0; j<at_in_mol[i]; j++)
|
||||||
|
for (k=0; k<3; k++)
|
||||||
|
centr_coord[i][k] += coord[i][j][k] / at_in_mol[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void reading(char input_file[])
|
||||||
|
{
|
||||||
|
char tmp[256];
|
||||||
|
int atom_num, cur_mol=0, i, summ;
|
||||||
|
FILE *inp;
|
||||||
|
|
||||||
|
inp = fopen (input_file, "r+");
|
||||||
|
fscanf (inp, "%i", &summ);
|
||||||
|
fgets (tmp, 256, inp);
|
||||||
|
printf ("Atoms in system: %i\n", summ);
|
||||||
|
for (i=0; i<summ; i++)
|
||||||
|
{
|
||||||
|
fgets (tmp, 256, inp);
|
||||||
|
if (atoi(&tmp[53]) != mol+1)
|
||||||
|
{
|
||||||
|
at_in_mol[mol] = cur_mol;
|
||||||
|
mol++;
|
||||||
|
cur_mol = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
atom_type[mol][cur_mol][0] = tmp[7];
|
||||||
|
atom_type[mol][cur_mol][1] = tmp[8];
|
||||||
|
coord[mol][cur_mol][0] = atof(&tmp[10]);
|
||||||
|
coord[mol][cur_mol][1] = atof(&tmp[22]);
|
||||||
|
coord[mol][cur_mol][2] = atof(&tmp[34]);
|
||||||
|
|
||||||
|
cur_mol++;
|
||||||
|
}
|
||||||
|
fclose (inp);
|
||||||
|
mol++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char input_file[256], output_file[256];
|
||||||
|
int error_label=0, i, j;
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
printf ("Starting program '%s'\n", argv[0]);
|
||||||
|
mol = 0;
|
||||||
|
rad = 6.0;
|
||||||
|
num_of_mol = 1;
|
||||||
|
|
||||||
|
|
||||||
|
printf ("\n1) Reading arguments\n");
|
||||||
|
if (argc == 1)
|
||||||
|
{
|
||||||
|
printf ("Arguments are not set\nType 'envir -h' for help message\nExiting\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=1; i<argc; i++)
|
||||||
|
{
|
||||||
|
if ((argv[i][0] == '-') && (argv[i][1] == 'i'))
|
||||||
|
{
|
||||||
|
strcpy(input_file, argv[i+1]);
|
||||||
|
f = fopen (argv[i+1], "r+");
|
||||||
|
if (f == NULL)
|
||||||
|
{
|
||||||
|
printf ("File '%s' does not exist!\nExiting\n", argv[i+1]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
printf ("Set input file to '%s'\n", input_file);
|
||||||
|
i++;
|
||||||
|
error_label++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((argv[i][0] == '-') && (argv[i][1] == 'o'))
|
||||||
|
{
|
||||||
|
strcpy(output_file, argv[i+1]);
|
||||||
|
printf ("Set output file to '%s'\n", output_file);
|
||||||
|
i++;
|
||||||
|
error_label++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((argv[i][0] == '-') && (argv[i][1] == 'n'))
|
||||||
|
{
|
||||||
|
num_of_mol = atoi(argv[i+1]);
|
||||||
|
printf ("Set number of molecule to '%i'\n", num_of_mol);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((argv[i][0] == '-') && (argv[i][1] == 'r'))
|
||||||
|
{
|
||||||
|
rad = atof(argv[i+1]);
|
||||||
|
printf ("Set radius to '%lf' A\n", rad);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((argv[i][0] == '-') && (argv[i][1] == 'h'))
|
||||||
|
{
|
||||||
|
printf ("Usage: envir -i FILENAME -o FILEMANE [ -n NUM_OF_MOLECULE ] [ -r RADIUS ] [ -h ]\n\n");
|
||||||
|
printf (" -i - input file with coordinates\n");
|
||||||
|
printf (" -o - output file with coordinates\n");
|
||||||
|
printf (" -n - number of molecule for search\n");
|
||||||
|
printf (" -r - radius of environment\n");
|
||||||
|
printf (" -h - show this help and exit\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// error check
|
||||||
|
if (error_label < 2)
|
||||||
|
{
|
||||||
|
printf ("Input files aren't set\nType 'en_disp -h' for help message\nExiting\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf ("Reading file '%s'\n", input_file);
|
||||||
|
reading (input_file);
|
||||||
|
printf ("Set center of molecules\n");
|
||||||
|
set_center ();
|
||||||
|
printf ("Search environments\n");
|
||||||
|
search ();
|
||||||
|
printf ("Printing\n");
|
||||||
|
printing (output_file);
|
||||||
|
printf ("Exiting without errors\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Reference in New Issue
Block a user