Files
2026-06-30 08:59:47 +09:00

196 lines
7.9 KiB
C

#include <unistd.h>
#include <getopt.h>
#include "ilt.h"
void Error(){
printf("Usage: osilap [options] infile.int\n\n");
printf("Options:\n");
printf(" -i confirm calculation condition\n");
printf(" -h --help show this help message\n");
printf(" --dimension=%%d one- or two-dimension [2]\n");
printf(" --alpha=%%f initial value of alpha (only BRD) [0.1]\n");
printf(" --sigma=%%f standard error, 0=auto [0.0]\n");
printf(" --sfactor=%%f sfactor for SVD [1e-4]\n");
printf(" --output=%%s basename of output file [basename]\n");
printf(" --TXspace=%%s TX space (log | linear) [log]\n");
printf(" --TXtype=%%s TX data type (T1 | T1inf | T1p | T2 | D) [T1]\n");
printf(" --TXmin=%%f TX minimum [0.0001]\n");
printf(" --TXmax=%%f TX maximum [10]\n");
printf(" --TXnum=%%d TX points [50]\n");
printf(" --TYspace=%%s TY space (log | linear) [log]\n");
printf(" --TYtype=%%s TY data type (T1 | T2 | D) [T2]\n");
printf(" --TYmin=%%f TY minimum [0.0001]\n");
printf(" --TYmax=%%f TY maximum [10]\n");
printf(" --TYnum=%%d TY points [50]\n");
printf(" --alpha_loop_max=%%d maximum iteration for alpha [5000]\n");
printf(" --alpha_tol=%%f alpha tolerance [1e-3]\n");
printf(" --newton_loop_max=%%d maximum iteration for newton method [5000]\n");
printf(" --newton_tol=%%f newton tolerance [1e-8]\n");
printf(" --Scurve=%%f target for dlog10(chi)/dlog10(alpha) [0.0]\n");
printf(" --Smin=%%f search grid for s-curve [1e+6]\n");
printf(" --Smax=%%f search grid for s-curve [1e-6]\n");
printf(" --Snum=%%d search grid number for s-curve [20]\n");
printf(" --Atype=%%d calculation method of alpha for BRD routine [0]\n");
exit(1);
}
void Confirm(HEAD *head, INDATA *d){
int ch;
printf("\n");
printf("-------- Solving condition -------\n");
printf(" dimension: %d\n", head->dimension);
printf(" sfactor: %g\n", head->sfactor);
printf(" initial alpha: %g\n", head->alpha0);
printf(" sigma: %g\n", head->sigma0);
printf(" alpha max Loop: %d\n", head->alpha_loop_max);
printf(" alpha tol: %g\n", head->alpha_tol);
printf(" Newton max Loop: %d\n", head->newton_loop_max);
printf(" Newton tol: %g\n", head->newton_tol);
printf(" A_opt method: %d\n", head->Atype);
printf("--------- TX information ---------\n");
printf(" Grid space: %s\n", head->TXspace);
printf(" Data type: %s\n", head->TXtype);
printf(" (TXmin, TXmax, TXpoints) =");
printf(" (%g, %g, %d)\n", head->TXmin, head->TXmax, head->TXnum);
if (head->dimension>1){
printf("--------- TY information ---------\n");
printf(" Grid space: %s\n", head->TYspace);
printf(" Data type: %s\n", head->TYtype);
printf(" (TYmin, TYmax, TYpoints) =");
printf(" (%g, %g, %d)\n", head->TYmin, head->TYmax, head->TYnum);
}
if (head->s_taget != 0){
printf("------ S-curve configuration -----\n");
printf(" Alpha grid space: \n");
printf(" (start, end, points) =");
printf(" (%g, %g, %d)\n", head->alpha_start, head->alpha_end, head->alpha_num);
}
printf("----------- Input data -----------\n");
printf(" Input file: %s\n", head->infile);
printf(" Input data size:");
if (head->dimension == 1){
printf(" %d\n", d->u.m);
}
if (head->dimension == 2){
printf(" (X, Y)=(%d, %d)\n", d->u.m, d->v.m);
}
printf(" Output basename: %s\n", head->outbase);
printf("\n");
fflush(stdout);
if (head->confirm == 1){
printf("Start calculation? [y/n]: ");
while ((ch = getchar()) != EOF) { /* 文字の入力 */
if (ch == 'y') break;
if (ch == 'n') exit(1);
}
}
fflush(stdin);
}
/* ####################################################################### */
/* ベース名を決める */
/* ####################################################################### */
void GetBaseName(HEAD *head)
{
int nLen;
char *res = NULL;
char szPath[1024];
strcpy(szPath, head->infile);
nLen = sizeof (szPath);
memset(head->outbase, 0, sizeof(head->outbase));
if ((nLen > 0) && (nLen <= 1024)) {
res = strrchr( szPath, '.' );
if(res != NULL)
*res = '\0';
}
strcpy(head->outbase, szPath);
}
int SetArgment(int argc, char * argv[], HEAD *head){
int opt, option_index;
struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"confirm", no_argument, NULL, 'i'},
{"DX", required_argument, NULL, 'A'},
{"DY", required_argument, NULL, 'B'},
{"TXtype", required_argument, NULL, 'C'},
{"TXspace", required_argument, NULL, 'D'},
{"TXmin", required_argument, NULL, 'E'},
{"TXmax", required_argument, NULL, 'F'},
{"TXnum", required_argument, NULL, 'G'},
{"TYtype", required_argument, NULL, 'H'},
{"TYspace", required_argument, NULL, 'I'},
{"TYmin", required_argument, NULL, 'J'},
{"TYmax", required_argument, NULL, 'K'},
{"TYnum", required_argument, NULL, 'L'},
{"output", required_argument, NULL, 'M'},
{"sfactor", required_argument, NULL, 'N'},
{"dimension", required_argument, NULL, 'O'},
{"alpha", required_argument, NULL, 'P'},
{"alpha_loop_max", required_argument, NULL, 'Q'},
{"alpha_tol", required_argument, NULL, 'R'},
{"newton_loop_max", required_argument, NULL, 'S'},
{"newton_tol", required_argument, NULL, 'T'},
{"sigma", required_argument, NULL, 'U'},
{"Scurve", required_argument, NULL, 'V'},
{"Smin", required_argument, NULL, 'W'},
{"Smax", required_argument, NULL, 'X'},
{"Snum", required_argument, NULL, 'Y'},
{"Atype", required_argument, NULL, 'Z'},
{0, 0, 0, 0}// 配列の最後はすべて0で埋める
};
//opterr = 0;/* エラーメッセージを非表示にする */
if (argc == 1) Error();
//while((opt = getopt(argc, argv, "mes:")) != -1){
while((opt = getopt_long(argc, argv, "ih",
long_options, &option_index)) != -1){
switch(opt){
case 'i':
head->confirm = 1;
break;
case 'A': head->DXnum = atoi(optarg); break;
case 'B': head->DYnum = atoi(optarg); break;
case 'C': strcpy(head->TXtype, optarg); break;
case 'D': strcpy(head->TXspace, optarg); break;
case 'E': head->TXmin = atof(optarg); break;
case 'F': head->TXmax = atof(optarg); break;
case 'G': head->TXnum = atoi(optarg); break;
case 'H': strcpy(head->TYtype, optarg); break;
case 'I': strcpy(head->TYspace, optarg); break;
case 'J': head->TYmin = atof(optarg); break;
case 'K': head->TYmax = atof(optarg); break;
case 'L': head->TYnum = atoi(optarg); break;
case 'M': strcpy(head->outbase, optarg); break;
case 'N': head->sfactor = atof(optarg); break;
case 'O': head->dimension = atoi(optarg); break;
case 'P': head->alpha0 = atof(optarg); break;
case 'Q': head->alpha_loop_max = atoi(optarg); break;
case 'R': head->alpha_tol = atoi(optarg); break;
case 'S': head->newton_loop_max = atoi(optarg); break;
case 'T': head->newton_tol = atof(optarg); break;
case 'U': head->sigma0 = atof(optarg); break;
case 'V': head->s_taget = atof(optarg); break;
case 'W': head->alpha_start = atof(optarg); break;
case 'X': head->alpha_end = atof(optarg); break;
case 'Y': head->alpha_num = atoi(optarg); break;
case 'Z': head->Atype = atoi(optarg); break;
// 解析できないオプションが見つかった場合は「?」を返す
// オプション引数が不足している場合も「?」を返す
case '?':
Error();
}
}
strcpy(head->infile, argv[optind]);
if (strcmp(head->outbase, "")==0) GetBaseName(head);
/* if (head->dimension == 1 && head->TXnum < 100){ */
/* head->TXnum = 200; */
/* strcpy(head->TXtype, "T2"); */
/* } */
return 0;
}