Files
2022-03-12 18:23:22 +09:00

113 lines
3.6 KiB
C

#include <unistd.h>
#include <getopt.h>
#include "dump2sq.h"
void Error(){
printf("usage: dump2sq [options] inputfile\n");
printf("inputfile format\n");
printf(" LAMMPS: *.lammpstrj\n");
printf(" FEMTECK: *.10\n");
printf("\n");
printf("options:\n");
printf(" -h --help show this help message\n");
printf(" --SQmin=%%f Q minimum [0.2]\n");
printf(" --SQmax=%%f Q maximum [30]\n");
printf(" --SQdel=%%d Q delta [0.02]\n");
printf(" --GRmin=%%f r minimum [0.025]\n");
printf(" -r --GRmax=%%f r maximum [L(minium cell length)*0.5]\n");
printf(" -s --GRdel=%%d r delta [0.05]\n");
printf(" -o --output=%%s Output basename [basename]\n");
exit(1);
}
/* ####################################################################### */
/* ベース名を決める */
/* ####################################################################### */
void SetBaseName(COMMAND *com){
int nLen;
char *res = NULL;
int i;
char buf[1024];
char infile[1024];
strcpy(infile, com->infile);
nLen = sizeof(infile);
if ((nLen > 0) && (nLen <= 1030)) {
res = strrchr(infile, '.');
if(res != NULL) *res = '\0';
}
strcpy(com->outbase, infile);
/* 拡張子 */
for (i=strlen(com->infile); i>0; i-- ) {
if (com->infile[i] == '.' ) break;
}
if (i == 0) strcpy(buf, "");
else strncpy(buf, com->infile+i+1, strlen(com->infile)-i);
/* ファイル形式の決定 */
if (strcmp(buf, "lammpstrj") == 0) strcpy(com->filetype, "lammpstrj");
else if (strcmp(buf, "xyz") == 0) strcpy(com->filetype, "xyz");
else if (strcmp(buf, "10") == 0) strcpy(com->filetype, "xyz");
else {
printf("Input file extension: %s\n", buf);
printf("The file format is unknown.\n");
printf("Acceptable file formats are .lammpstrj, .xyz, .10\n");
}
}
int SetArgment(int argc, char **argv, COMMAND *com){
int opt, option_index;
struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"SQmin", required_argument, NULL, 'E'},
{"SQmax", required_argument, NULL, 'F'},
{"SQdel", required_argument, NULL, 'G'},
{"GRmin", required_argument, NULL, 'J'},
{"GRmax", required_argument, NULL, 'r'},
{"GRdel", required_argument, NULL, 's'},
{"output", required_argument, NULL, 'o'},
{0, 0, 0, 0}// 配列の最後はすべて0で埋める
};
//opterr = 0;/* エラーメッセージを非表示にする */
if (argc == 1) Error();
FILE* fp = fopen(argv[argc-1], "r");
if (fp == NULL) Error();
/* default値 */
strcpy(com->infile, argv[argc-1]);
com->SQmin = 0.2;
com->SQmax = 30.0;
com->SQdel = 0.02;
com->GRmin = 0.025;
com->GRmax = -1; /* default Lmin*1.0 */
com->GRdel = 0.05;
SetBaseName(com);
while((opt = getopt_long(argc, argv, "hE:F:G:J:r:s:o:",
long_options, &option_index)) != -1){
switch(opt){
case 'h': Error(); break;
case 'E': com->SQmin = atof(optarg); break;
case 'F': com->SQmax = atof(optarg); break;
case 'G': com->SQdel = atof(optarg); break;
case 'J': com->GRmin = atof(optarg); break;
case 'r': com->GRmax = atof(optarg); break;
case 's': com->GRdel = atof(optarg); break;
case 'o': strcpy(com->outbase, optarg); break;
// 解析できないオプションが見つかった場合は「?」を返す
// オプション引数が不足している場合も「?」を返す
case '?':
Error();
}
continue;
}
if (com->GRmax == 0.0) Error();
printf("basename: %s\n", com->outbase);
sprintf(com->gr_file, "%s.gr", com->outbase);
sprintf(com->cn_file, "%s.cn", com->outbase);
return 0;
}