initial upload

This commit is contained in:
2024-09-10 20:25:18 +08:00
parent b8de03ee4f
commit f1cc876972
377 changed files with 2721267 additions and 34 deletions

View 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
View 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
View 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
View 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
View 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)