initial upload
This commit is contained in:
21
archive/grad1d/data_func.h
Normal file
21
archive/grad1d/data_func.h
Normal file
@@ -0,0 +1,21 @@
|
||||
#ifndef _DATA_FUNC_H
|
||||
#define _DATA_FUNC_H
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <cmath>
|
||||
#include <iomanip>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <list>
|
||||
#include "fftw3.h"
|
||||
#define HORIZATION "-h"
|
||||
#define VERTICAL "-v"
|
||||
#define OUTPUT "-o"
|
||||
#define HELP "--help"
|
||||
#define pi (4.0*atan(1.0))
|
||||
using namespace std;
|
||||
typedef list<double> valuelist;
|
||||
valuelist::iterator iv;
|
||||
#endif
|
88
archive/grad1d/grad1d.cpp
Normal file
88
archive/grad1d/grad1d.cpp
Normal file
@@ -0,0 +1,88 @@
|
||||
#include "data_func.h"
|
||||
#include "grad_h.h"
|
||||
#include "grad_v.h"
|
||||
|
||||
void disp_help()
|
||||
{
|
||||
cout<<"grad1d 0.0.1 - calculate horizontal and vertical gradient data for 1-D data"<<endl<<endl
|
||||
<<"usage: grad1d input-file -h|-v [-o output-file]"<<endl
|
||||
<<" -h calculate horizontal gradient"<<endl
|
||||
<<" -v calculate vertical gradient"<<endl
|
||||
<<" -o specify output-file's name. '_gradh|_gradv‘ will be attached at the end of the input"<<endl
|
||||
<<" file's name as an output name if -o is absent"<<endl<<endl
|
||||
<<"example: grad1d in.dat -h -o out.dat"<<endl;
|
||||
}
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
if (argc==1)
|
||||
{
|
||||
disp_help();
|
||||
}
|
||||
else if (argc==2)
|
||||
{
|
||||
cout<<"unsufficient arguments, program stopped..."<<endl;
|
||||
return 0;
|
||||
}
|
||||
else if (argc==3)
|
||||
{
|
||||
if (!strcmp(argv[2],HORIZATION))
|
||||
{
|
||||
string temp = argv[1];
|
||||
temp+="_gradh.dat";
|
||||
const char* outname = temp.c_str();
|
||||
if(cal_1d_h(argv[1],outname)) return 0;
|
||||
}
|
||||
else if (!strcmp(argv[2],VERTICAL))
|
||||
{
|
||||
string temp = argv[1];
|
||||
temp+="_gradv.dat";
|
||||
const char* outname = temp.c_str();
|
||||
if(cal_1d_v(argv[1],outname)) return 0;
|
||||
}
|
||||
else cout<<argv[2]<<" not found, program stopped..."<<endl;
|
||||
}
|
||||
else if (argc==4&&!strcmp(argv[3],OUTPUT)&&!strcmp(argv[2],HORIZATION))
|
||||
{
|
||||
cout<<"No output name, program stopped..."<<endl;
|
||||
return 0;
|
||||
}
|
||||
else if (argc==4&&!strcmp(argv[3],OUTPUT)&&!strcmp(argv[2],VERTICAL))
|
||||
{
|
||||
cout<<"No output name, program stopped..."<<endl;
|
||||
return 0;
|
||||
}
|
||||
else if (argc==4)
|
||||
{
|
||||
if (!strcmp(argv[3],OUTPUT))
|
||||
{
|
||||
cout<<argv[2]<<" not found, program stopped..."<<endl;
|
||||
return 0;
|
||||
}
|
||||
else if (!strcmp(argv[2],HORIZATION)||!strcmp(argv[2],VERTICAL))
|
||||
{
|
||||
cout<<argv[3]<<" not found, program stopped..."<<endl;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
cout<<argv[2]<<" "<<argv[3]<<" not found, program stopped..."<<endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if (argc>4)
|
||||
{
|
||||
if (!strcmp(argv[3],OUTPUT)&&!strcmp(argv[2],HORIZATION))
|
||||
{
|
||||
if(cal_1d_h(argv[1],argv[4])) return 0;
|
||||
}
|
||||
else if (!strcmp(argv[3],OUTPUT)&&!strcmp(argv[2],VERTICAL))
|
||||
{
|
||||
if(cal_1d_v(argv[1],argv[4])) return 0;
|
||||
}
|
||||
else if (!strcmp(argv[2],VERTICAL)||!strcmp(argv[2],HORIZATION)) cout<<argv[3]<<" not found, program stopped..."<<endl;
|
||||
else if (!strcmp(argv[3],OUTPUT)) cout<<argv[2]<<" not found, program stopped..."<<endl;
|
||||
else cout<<argv[2]<<" "<<argv[3]<<" not found, program stopped..."<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
145
archive/grad1d/grad_h.h
Normal file
145
archive/grad1d/grad_h.h
Normal file
@@ -0,0 +1,145 @@
|
||||
#include "data_func.h"
|
||||
|
||||
int cal_1d_h(const char* inname,const char* outname)
|
||||
{
|
||||
ifstream infile(inname);
|
||||
if (!infile)
|
||||
{
|
||||
cout<<inname<<" not found, program stopped..."<<endl;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
stringstream temp_xz;
|
||||
string templine;
|
||||
valuelist list_x;
|
||||
valuelist list_z;
|
||||
double temp_x,temp_z;
|
||||
int dnum,Dnum,Lnum,Rnum,half_Dnum;
|
||||
double endmean;
|
||||
double du;
|
||||
double dx;
|
||||
|
||||
while(getline(infile,templine))
|
||||
{
|
||||
if (templine!="")
|
||||
{
|
||||
temp_xz.clear();
|
||||
temp_xz.str(templine);
|
||||
temp_xz>>temp_x>>temp_z;
|
||||
list_x.push_back(temp_x);
|
||||
list_z.push_back(temp_z);
|
||||
}
|
||||
}
|
||||
infile.close();
|
||||
|
||||
dnum = list_x.size();
|
||||
double* array_x = new double [dnum];
|
||||
double* array_z = new double [dnum];
|
||||
|
||||
double tempvalue;
|
||||
int count = 0;
|
||||
for (iv=list_x.begin();iv!=list_x.end(); ++iv)
|
||||
{
|
||||
tempvalue = *iv;
|
||||
array_x[count]=tempvalue;
|
||||
count++;
|
||||
}
|
||||
count = 0;
|
||||
for (iv=list_z.begin();iv!=list_z.end(); ++iv)
|
||||
{
|
||||
tempvalue = *iv;
|
||||
array_z[count]=tempvalue;
|
||||
count++;
|
||||
}
|
||||
dx = abs(array_x[1]-array_x[0]);
|
||||
|
||||
//testing
|
||||
/*
|
||||
for (int i = 0; i < dnum; i++)
|
||||
{
|
||||
cout<<array_x[i]<<" "<<array_z[i]<<endl;
|
||||
}
|
||||
*/
|
||||
|
||||
Dnum = pow(2,ceil(log(dnum)/log(2))+1);//对数据进行扩边
|
||||
Lnum = floor((Dnum-dnum)/2.0);
|
||||
Rnum = ceil((Dnum-dnum)/2.0);
|
||||
double* Array_z = new double [Dnum];
|
||||
|
||||
endmean = (array_z[0]+array_z[dnum-1])/2.0;//求取扩边的端点值
|
||||
for (int i = 0; i < Lnum; i++)
|
||||
{
|
||||
Array_z[i] = endmean + (array_z[0]-endmean)*cos(-0.5*pi*(i-Lnum)/Lnum);
|
||||
}
|
||||
for (int i = 0; i < dnum; i++)
|
||||
{
|
||||
Array_z[Lnum+i] = array_z[i];
|
||||
}
|
||||
for (int i = 0; i < Rnum; i++)
|
||||
{
|
||||
Array_z[Lnum+dnum+i] = endmean + (array_z[dnum-1]-endmean)*cos(0.5*pi*(i+1)/Rnum);
|
||||
}
|
||||
half_Dnum = Dnum/2;
|
||||
du = pi*2/(Dnum*dx);
|
||||
|
||||
//testing
|
||||
/*
|
||||
for (int i = 0; i < Dnum; i++)
|
||||
{
|
||||
cout<<Array_z[i]<<endl;
|
||||
}
|
||||
*/
|
||||
|
||||
fftw_complex *in, *out, *after_out, *reout;
|
||||
fftw_plan p;
|
||||
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
||||
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
||||
after_out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
||||
reout = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
||||
|
||||
for (int i = 0; i < Dnum; i++)
|
||||
{
|
||||
in[i][0] = Array_z[i];
|
||||
in[i][1] = 0.0;
|
||||
}
|
||||
|
||||
p=fftw_plan_dft_1d(Dnum,in,out, FFTW_FORWARD, FFTW_ESTIMATE);
|
||||
fftw_execute(p); /* repeat as needed*/
|
||||
|
||||
double u;
|
||||
int k;
|
||||
for (int i = 0; i < half_Dnum; i++)
|
||||
{
|
||||
u = du*i;
|
||||
after_out[i][1] = out[i][0]*u;
|
||||
after_out[i][0] = -1*out[i][1]*u;
|
||||
if (i!=0&&i!=half_Dnum)
|
||||
{
|
||||
k = Dnum-i;
|
||||
after_out[k][1] = -1*out[k][0]*u;
|
||||
after_out[k][0] = out[k][1]*u;
|
||||
}
|
||||
}
|
||||
|
||||
p=fftw_plan_dft_1d(Dnum,after_out,reout, FFTW_BACKWARD, FFTW_ESTIMATE);
|
||||
fftw_execute(p);
|
||||
|
||||
ofstream outfile(outname);
|
||||
for (int i = 0; i < dnum; i++)
|
||||
{
|
||||
outfile<<array_x[i]<<" "<<1e+4*reout[i+Lnum][0]/Dnum<<endl;
|
||||
}
|
||||
outfile.close();
|
||||
|
||||
fftw_destroy_plan(p);
|
||||
fftw_free(in);
|
||||
fftw_free(out);
|
||||
fftw_free(after_out);
|
||||
fftw_free(reout);
|
||||
delete[] Array_z;
|
||||
delete[] array_x;
|
||||
delete[] array_z;
|
||||
return 0;
|
||||
}
|
||||
}
|
137
archive/grad1d/grad_v.h
Normal file
137
archive/grad1d/grad_v.h
Normal file
@@ -0,0 +1,137 @@
|
||||
#include "data_func.h"
|
||||
|
||||
int cal_1d_v(const char* inname,const char* outname)
|
||||
{
|
||||
ifstream infile(inname);
|
||||
if (!infile)
|
||||
{
|
||||
cout<<inname<<" not found, program stopped..."<<endl;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
stringstream temp_xz;
|
||||
string templine;
|
||||
valuelist list_x;
|
||||
valuelist list_z;
|
||||
double temp_x,temp_z;
|
||||
int dnum,Dnum,Lnum,Rnum,half_Dnum;
|
||||
double endmean;
|
||||
double du;
|
||||
double dx;
|
||||
|
||||
while(getline(infile,templine))
|
||||
{
|
||||
if (templine!="")
|
||||
{
|
||||
temp_xz.clear();
|
||||
temp_xz.str(templine);
|
||||
temp_xz>>temp_x>>temp_z;
|
||||
list_x.push_back(temp_x);
|
||||
list_z.push_back(temp_z);
|
||||
}
|
||||
}
|
||||
infile.close();
|
||||
|
||||
dnum = list_x.size();
|
||||
double* array_x = new double [dnum];
|
||||
double* array_z = new double [dnum];
|
||||
|
||||
double tempvalue;
|
||||
int count = 0;
|
||||
for (iv=list_x.begin();iv!=list_x.end(); ++iv)
|
||||
{
|
||||
tempvalue = *iv;
|
||||
array_x[count]=tempvalue;
|
||||
count++;
|
||||
}
|
||||
count = 0;
|
||||
for (iv=list_z.begin();iv!=list_z.end(); ++iv)
|
||||
{
|
||||
tempvalue = *iv;
|
||||
array_z[count]=tempvalue;
|
||||
count++;
|
||||
}
|
||||
dx = abs(array_x[1]-array_x[0]);
|
||||
|
||||
//testing
|
||||
/*
|
||||
for (int i = 0; i < dnum; i++)
|
||||
{
|
||||
cout<<array_x[i]<<" "<<array_z[i]<<endl;
|
||||
}
|
||||
*/
|
||||
|
||||
Dnum = pow(2,ceil(log(dnum)/log(2))+1);//对数据进行余弦扩边
|
||||
Lnum = floor((Dnum-dnum)/2.0);
|
||||
Rnum = ceil((Dnum-dnum)/2.0);
|
||||
double* Array_z = new double [Dnum];
|
||||
|
||||
endmean = (array_z[0]+array_z[dnum-1])/2.0;//求取扩边的端点值
|
||||
for (int i = 0; i < Lnum; i++)
|
||||
{
|
||||
Array_z[i] = endmean + (array_z[0]-endmean)*cos(-0.5*pi*(i-Lnum)/Lnum);
|
||||
}
|
||||
for (int i = 0; i < dnum; i++)
|
||||
{
|
||||
Array_z[Lnum+i] = array_z[i];
|
||||
}
|
||||
for (int i = 0; i < Rnum; i++)
|
||||
{
|
||||
Array_z[Lnum+dnum+i] = endmean + (array_z[dnum-1]-endmean)*cos(0.5*pi*(i+1)/Rnum);
|
||||
}
|
||||
half_Dnum = Dnum/2;
|
||||
du = pi*2/(Dnum*dx);
|
||||
|
||||
fftw_complex *in, *out, *after_out, *reout;
|
||||
fftw_plan p;
|
||||
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
||||
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
||||
after_out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
||||
reout = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
||||
|
||||
for (int i = 0; i < Dnum; i++)
|
||||
{
|
||||
in[i][0] = Array_z[i];
|
||||
in[i][1] = 0.0;
|
||||
}
|
||||
|
||||
p=fftw_plan_dft_1d(Dnum,in,out, FFTW_FORWARD, FFTW_ESTIMATE);
|
||||
fftw_execute(p); /* repeat as needed*/
|
||||
|
||||
double u;
|
||||
int k;
|
||||
for (int i = 0; i < half_Dnum; i++)
|
||||
{
|
||||
u = du*i;
|
||||
after_out[i][1] = out[i][1]*u;
|
||||
after_out[i][0] = out[i][0]*u;
|
||||
if (i!=0&&i!=half_Dnum)
|
||||
{
|
||||
k = Dnum-i;
|
||||
after_out[k][1] = out[k][1]*u;
|
||||
after_out[k][0] = out[k][0]*u;
|
||||
}
|
||||
}
|
||||
|
||||
p=fftw_plan_dft_1d(Dnum,after_out,reout, FFTW_BACKWARD, FFTW_ESTIMATE);
|
||||
fftw_execute(p);
|
||||
|
||||
ofstream outfile(outname);
|
||||
for (int i = 0; i < dnum; i++)
|
||||
{
|
||||
outfile<<array_x[i]<<" "<<1e+4*reout[i+Lnum][0]/Dnum<<endl;
|
||||
}
|
||||
outfile.close();
|
||||
|
||||
fftw_destroy_plan(p);
|
||||
fftw_free(in);
|
||||
fftw_free(out);
|
||||
fftw_free(after_out);
|
||||
fftw_free(reout);
|
||||
delete[] Array_z;
|
||||
delete[] array_x;
|
||||
delete[] array_z;
|
||||
return 0;
|
||||
}
|
||||
}
|
15
archive/grad1d/makefile
Normal file
15
archive/grad1d/makefile
Normal file
@@ -0,0 +1,15 @@
|
||||
CC = g++-8
|
||||
PROM = grad1d
|
||||
CFLAGS = /usr/local/Cellar/fftw/3.3.7_1/lib/libfftw3.3.dylib
|
||||
DEPS = $(shell find . -name "*.h")
|
||||
SRC = $(shell find . -name "*.cpp")
|
||||
OBJ = $(SRC:%.cpp=%.o)
|
||||
|
||||
$(PROM): $(OBJ)
|
||||
$(CC) -o $(PROM) $(OBJ) $(CFLAGS)
|
||||
|
||||
%.o:%.cpp $(DEPS)
|
||||
$(CC) -c $< -o $@
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJ)
|
Reference in New Issue
Block a user