gctl_toolkits/archive/grad2d/main.cpp

156 lines
4.3 KiB
C++
Raw Permalink Normal View History

2024-09-10 20:25:18 +08:00
//计算二维平面数据的三方向导数因为有很多方法可以得到xyz三列数据文件所以数据类型为xyz的三列数据文件
//数据排列方式: x坐标 y坐标 v数值
//坐标方向: z轴向下的右旋坐标系
#include "datafunc.h"
#include "grad_z.h"
#include "grad_hx.h"
#include "grad_hy.h"
void disp_help()
{
cout<<"grad2d 0.2 - calculate horizontal and vertical gradients for an equal-grid plane data set"<<endl<<endl
<<"usage: grad2d -t<input-file> -x|-y|-z -r<xmin>/<xmax>/<ymin>/<ymax> -i<x-spacing>/<y-spacing> -w<power> [-c<col-x>,<col-y>,<col-val>] [-o<output-file>]"<<endl<<endl
<<"syntax: " << endl << "-t\tinput table data. The program takes a three-columns table data file. The order of columns are \'x\', \'y\'' and \'point-value\'. lines starts with '#' will be skipped."<<endl
<<"-x|-y|-z\tselect calculating objective. Only one objective can be chosen at a time."<<endl
<<"-r\tspecify the range of calculating area."<<endl
<<"-i\tspecify intervals of the input data."<<endl
<<"-c\tset data columns, the default is 0,1,2."<<endl
<<"-w\torders of output gradient data."<<endl
<<"-o\tspecify output-file's name. \'_gradhx|_gradhy|_gradz\' will be attached at the end of the input-name if \'-o\' is absent."<<endl<<endl
<<"example: grad2d -tin.dat -x -r0/100/0/100 -i10/10 -w1 -oout.dat"<<endl;
}
int main(int argc, char* argv[])
{
if (argc==1)
{
disp_help();
}
else
{
int caltype = 0;
int power = 1;
char cmd_type[1024] = {0};
char filename[1024] = {0};
char filetype[1024] = {0};
char outname[1024] = {0};
char colname[1024] = "0,1,2";
double range[4] = {1e+30,1e+30,1e+30,1e+30};
double interval[2] = {1e+30,1e+30};
for (int i = 1; i < argc; i++)
{
sscanf(argv[i],"%2s",cmd_type);
if (!strcmp(cmd_type,RANGE))
{
if (4!=sscanf(argv[i],"%*2s%lf/%lf/%lf/%lf",&range[0],&range[1],&range[2],&range[3]))
{
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
return 0;
}
else
{
if (range[0]>range[1])
{
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
return 0;
}
else if (range[2]>range[3])
{
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
return 0;
}
}
}
else if (!strcmp(cmd_type,DATA))
{
if (2!=sscanf(argv[i],"%*2s%[^.]%s",filename,filetype))
{
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
return 0;
}
}
else if (!strcmp(cmd_type,COLS))
{
if (1!=sscanf(argv[i],"%*2s%s",colname))
{
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
return 0;
}
}
else if (!strcmp(cmd_type,POWER))
{
if (1!=sscanf(argv[i],"%*2s%d",&power))
{
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
return 0;
}
}
else if (!strcmp(cmd_type,INTERVAL))
{
if (2!=sscanf(argv[i],"%*2s%lf/%lf",&interval[0],&interval[1]))
{
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
return 0;
}
else
{
if (interval[0]<=0||interval[1]<=0)
{
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
return 0;
}
}
}
else if (!strcmp(cmd_type,HORIZATION_X)) caltype = 1;
else if (!strcmp(cmd_type,HORIZATION_Y)) caltype = 2;
else if (!strcmp(cmd_type,VERTICAL)) caltype = 3;
else if (!strcmp(cmd_type,OUTPUT))
{
if (-1==sscanf(argv[i],"%*2s%s",outname))
{
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
return 0;
}
}
}
switch(caltype)
{
case 1:
{
if(!strcmp(outname,""))
{
strcat(outname,filename);
strcat(outname,"_gradhx.xyz");
}
strcat(filename,filetype);
cal_2d_hx(filename,outname,colname,range,interval,power);
}break;
case 2:
{
if(!strcmp(outname,""))
{
strcat(outname,filename);
strcat(outname,"_gradhy.xyz");
}
strcat(filename,filetype);
cal_2d_hy(filename,outname,colname,range,interval,power);
}break;
case 3:
{
if(!strcmp(outname,""))
{
strcat(outname,filename);
strcat(outname,"_gradz.xyz");
}
strcat(filename,filetype);
cal_2d_z(filename,outname,colname,range,interval,power);
}break;
default:
{
cout<<BOLDRED<<"==> "<<RESET<<"bad cal_type"<<endl;
return 0;
}
}
}
return 0;
}