diff --git a/program2D/main.cc b/program2D/main.cc index 125327575abe9e75a8909036c6e1058a9168fe78..d71342be32f14e3723491171ec7c499c8b3acb6b 100644 --- a/program2D/main.cc +++ b/program2D/main.cc @@ -17,23 +17,6 @@ using std::complex; using namespace ::_COLSAMM_; -/* -std::complex<double> gauss(double x, double y) { - //gauss electric fielöd - double k = 2.0 * M_PI / lambda; - double waist = radiusGauss * sqrt(1+pow(distanceFromWaist / rayleighrange,2)); - if (curvature == 0.0 || std::isnan(curvature)) - { - return exp(-(x*x+y*y)/(waist*waist)); - } - else - { -// return exp(-(x*x+y*y)/(waist*waist))*expi(-1.0 * k * (x*x+y*y) / (2.0 * curvature)); - } -} -*/ - - double fRealPart(std::complex< double > x) { return x.real(); } @@ -42,7 +25,11 @@ double fImagPart(std::complex< double > x) { return x.imag(); } -std::complex< double > fexpi(double x) { +double absSquared(std::complex<double> value) { + return value.real()*value.real() + value.imag()*value.imag(); +} + +std::complex< double > expi(double x) { std::complex< double > I(0.0,1.0); return exp(I*x); } @@ -51,64 +38,200 @@ double fexp(double x) { return exp(x); } +double mySqrt(std::complex<double> v) { + return sqrt(v.real()); +} + +void spectrumPlaneWave(double distance, + double wavenumber, + VariableFFT& varE, + VariableFFT& Kx, + VariableFFT& Ky) { + Blockgrid2D* blockGridRec = varE.Give_blockgrid(); + + X_coordinate2d X(*blockGridRec); + Y_coordinate2d Y(*blockGridRec); + + double dx = varE.getHx(); + double dy = varE.getHy(); + + double ukx = 2.0 * M_PI / varE.getSizeX(); + double uky = 2.0 * M_PI / varE.getSizeY(); + + Kx = X / dx * ukx ; + Ky = Y / dy * uky ; + + Function2d1<double, std::complex<double> > Sqrt(mySqrt); + Function2d1<std::complex<double>, double > Expi(expi); + + + varE.FFT(); +//Test NOW + varE = varE * Expi(-Sqrt(wavenumber*wavenumber - Kx*Kx - Ky*Ky) * distance); +//varE = Expi(Sqrt(wavenumber*wavenumber - Kx*Kx - Ky*Ky) * distance); + varE.inversFFT(); + + +//varE = Sqrt(wavenumber*wavenumber - Kx*Kx - Ky*Ky); + +std::ofstream DATEIA; + DATEIA.open("varFarOut_test.vtk"); + varE.Print_VTK(DATEIA); + DATEIA.close(); + + +} + + +void CalcFresnel(double distance, + double lambda, + VariableFFT& varE) { + Blockgrid2D* blockGridRec = varE.Give_blockgrid(); + + int Nx = varE.getNx(); + double sizeX = varE.getSizeX(); + + double wavenumber = 2.0 * M_PI / lambda; + + X_coordinate2d X(*blockGridRec); + Y_coordinate2d Y(*blockGridRec); + + Function2d1<std::complex<double>,double> Expi(expi); + + varE = varE * Expi(-wavenumber * (X*X+Y*Y) / (2.0 * distance)); + varE.FFT(); + + double strech = distance * lambda * Nx / (sizeX*sizeX); + varE.setDomainStrech(strech,strech); +} + + + double SG_extern; -double stretch_extern; +double wSG_extern; double rSG(double x, double y) { double r = sqrt(x*x+y*y); - r = r / stretch_extern; + r = r / wSG_extern; return pow(r,SG_extern); } int main(int argc, char** argv) { - std::ofstream DATEI; + cout.precision(10); + cout.setf(std::ios::fixed,std::ios::floatfield); + std::ifstream PARAMETER; + ofstream DATEI; + + int levelFFT; + int typ; // 0: plane wave, 1: Fresnel + double zScreen; + double radiusGeo; + + + PARAMETER.open("para.dat",std::ios::in); + PARAMETER >> levelFFT >> typ >> zScreen >> radiusGeo; + PARAMETER.close(); + + // feste input parameter double lambda = 1064e-6; //[mm] + double angle = 2.0; //[grad] + double zw = -2.0; //[mm] + double SG = 15.6; + + // berechnete Werte + double angleRad = angle/180.0*M_PI; + double a = -zw; + double b = lambda / (M_PI * tan(angleRad) * tan(angleRad)); + double R = (a*a+b*b)/a; + double wavenumber = 2.0 * M_PI / lambda; + double w = sqrt(2.0 * (a*a+b*b) / (b * wavenumber)); + double wSG = sqrt(2.0) * w; + + cout << " a: " << a << " b: " << b << endl + << " w: " << w << " wSG: " << wSG << endl + << " R: " << R + << endl; + + SG_extern = SG; + wSG_extern = wSG; + Function2d1< double, std::complex< double > > realPart(fRealPart); Function2d1< double, std::complex< double > > imagPart(fImagPart); - Function2d1< std::complex< double >, double > Expi(fexpi); + Function2d1< std::complex< double >, double > Expi(expi); Function2d1< double, double > Exp(fexp); Function2d2< double, double > powSG(rSG); + Function2d1<double, std::complex<double> > AbsSquared(absSquared); + + double h = radiusGeo / (pow(2,levelFFT)); + Rechteck geo(-radiusGeo, -radiusGeo, radiusGeo-h, radiusGeo-h); - double radiusGeo = 0.1; -// double radiusGeo = 1.0; - Rechteck geo(-radiusGeo, -radiusGeo, radiusGeo, radiusGeo); - - double w = 0.0705; - stretch_extern = 1.41421; -// double w = 0.5; - double SG = 15.6; -// double SG = 2.0; - SG_extern = SG; - double R = 2.03; - - double wavenumber = 2.0 * M_PI / lambda; - int depth = 8; - - VariableFFT testU (depth, depth, geo); - Blockgrid2D* bg = testU.Give_blockgrid(); + VariableFFT varE (levelFFT, levelFFT, geo); + VariableFFT Kx(varE); + VariableFFT Ky(varE); + + Blockgrid2D* bg = varE.Give_blockgrid(); + + Variable2D<double> powerField(*bg); Variable2D<double> RealPart(*bg); Variable2D<double> ImagPart(*bg); X_coordinate2d X(*bg); Y_coordinate2d Y(*bg); - testU = Exp(-powSG(X/w,Y/w)); -// testU = Exp(-powSG(X,Y)/(w*w)); - - testU = testU * Expi(-wavenumber*(X*X+Y*Y)/(2.0*R) ); + //input + varE = Exp(-powSG(X,Y)); + varE = varE * Expi(-wavenumber*(X*X+Y*Y)/(2.0*R) ); -// testU = Y; + //varE = X; + + DATEI.open("varEin.vtk"); + varE.Print_VTK(DATEI); + DATEI.close(); + + RealPart = realPart(varE); + ImagPart = imagPart(varE); - DATEI.open("testU.vtk"); - testU.Print_VTK(DATEI); + DATEI.open("realUin.vtk"); + RealPart.Print_VTK(DATEI); DATEI.close(); - RealPart = realPart(testU); - ImagPart = imagPart(testU); + DATEI.open("imagUin.vtk"); + ImagPart.Print_VTK(DATEI); + DATEI.close(); + + + if(typ==0) { + spectrumPlaneWave(zScreen, + wavenumber, + varE, Kx, Ky); + } + else { + CalcFresnel(zScreen,lambda,varE); + } + + powerField = AbsSquared(varE); + ImagPart = varE.getHx() * varE.getHy(); + + double power = product(powerField,ImagPart); + powerField = powerField / power; + + DATEI.open("powerField.vtk"); + powerField.Print_VTK(DATEI); + DATEI.close(); + + /* + DATEI.open("varEout.vtk"); + varE.Print_VTK(DATEI); + DATEI.close(); + */ + + + RealPart = realPart(varE); + ImagPart = imagPart(varE); DATEI.open("realU.vtk"); RealPart.Print_VTK(DATEI); @@ -117,6 +240,7 @@ int main(int argc, char** argv) { DATEI.open("imagU.vtk"); ImagPart.Print_VTK(DATEI); DATEI.close(); - + + }