From f8c65b4e99f82883d4cfaab348d45f8f4df5fabc Mon Sep 17 00:00:00 2001
From: iwia06 <christoph.pflaum@fau.de>
Date: Fri, 30 Jul 2021 12:32:08 +0200
Subject: [PATCH] im wesentlichen bei FFT variablen scale eingefuegt

---
 program2D/main.cc                         | 1143 ++-------------------
 program2D/source/extemp/variableFFT.cc    |   19 +
 program2D/source/extemp/variableFFT.h     |   13 +-
 program2D/source/grid/blockgrid2D.h       |    3 +
 program2D/source/interpol/interpolTwoD.cc |    1 +
 5 files changed, 103 insertions(+), 1076 deletions(-)

diff --git a/program2D/main.cc b/program2D/main.cc
index 7cf6766..1253275 100644
--- a/program2D/main.cc
+++ b/program2D/main.cc
@@ -9,70 +9,15 @@
 #include <string>
 #include <vector>
 #include <memory>
-#include "ugblock.h"
+//#include "ugblock.h"
 #include "source/ugblock2D.h"
-#include "source/ugblock2D3D.h"
+//#include "source/ugblock2D3D.h"
 
 
 using std::complex;
 using namespace ::_COLSAMM_;
 
-#define L2NORM(vector) sqrt(product(vector,vector).real())
-#define RESTART 0
-
-
-double isZero(double x)
-{
-    return fabs(x) < 1e-10?1.0:0.0;
-}
-
-complex<double> I(0.0,1.0);
-
-std::complex<double> expi(double x) {
-   return exp(I*x);
-}
-
-std::complex<double> expComplex(std::complex<double>  x) {
-   return exp(x.real());
-}
-
-
-std::complex<double> sinExp(double x) {
-   return sin(x);
-}
-
-std::complex<double> cosExp(double x) {
-   return cos(x);
-}
-
-double realPart(std::complex<double> x) {
-   return x.real();
-}
-
-double imPart(std::complex<double> x) {
-   return x.imag();
-}
-
-double complexAngle(std::complex<double> x) {
-    return (std::arg(x)+2.0*M_PI);
- }
-
-double radiusLoch;
-std::complex<double> loch(double x, double y) {
-   if(sqrt(x*x+y*y) < radiusLoch) return 1.0;
-   return 0.0;
-}
-
-double lochDouble(double x, double y) {
-   if(sqrt(x*x+y*y) < radiusLoch) return 1.0;
-   return 0.0;
-}
-
-double radiusGauss;
-double curvature;
-double distanceFromWaist;
-double lambda;
-double rayleighrange;
+/*
 std::complex<double> gauss(double x, double y) {
     //gauss electric fielöd
     double k = 2.0 * M_PI / lambda;
@@ -83,1037 +28,95 @@ std::complex<double> gauss(double x, double y) {
     }
     else
     {
-        return exp(-(x*x+y*y)/(waist*waist))*expi(-1.0 * k * (x*x+y*y) / (2.0 * curvature));
+//        return exp(-(x*x+y*y)/(waist*waist))*expi(-1.0 * k * (x*x+y*y) / (2.0 * curvature));
     }
 }
-std::complex<double> spalt(double x, double y) {
-   if(fabs(x) < radiusLoch) return 1.0;
-   return 0.0;
-}
-double myRealSqrt(std::complex<double> z) {
-    return sqrt(z.real());
-}
-
-std::complex<double> myLimitToOne(std::complex<double> in)
-{
-    if (in.real() < 1.0)
-    {
-        return std::complex<double>(1,0);
-    }
-    return in;
-}
-
-void CalcFresnel(std::complex<double> (*aperture) (double x, double y),
-                 double distance,
-                 double wavenumber,
-                 VariableFFT& varIn,
-                 VariableFFT& varFar) {
-    Blockgrid2D* blockGridRec = varFar.Give_blockgrid();
-
-    X_coordinate2d X(*blockGridRec);
-    Y_coordinate2d Y(*blockGridRec);
-
-    Function2d2<std::complex<double>,double> Aperture(aperture);
-    Function2d1<std::complex<double>,double> Expi(expi);
-
-    varFar = Aperture(X,Y) * Expi(wavenumber * (X*X+Y*Y) / (2.0 * distance));
-    varIn  = varFar;
-    varFar.FFT();
-}
-
-
-void spectrumPlaneWave(std::complex<double> (*aperture) (double x, double y),
-                       double distance,
-                       double wavenumber,
-                       VariableFFT& varIn,
-                       VariableFFT& varFar,
-                       X_coordinate2d& X,
-                       Y_coordinate2d& Y,
-                       VariableFFT& Kx,
-                       VariableFFT& Ky,
-                       VariableFFT& temp) {
-          Blockgrid2D* blockGridRec = varFar.Give_blockgrid();
-
-//          X_coordinate2d X(*blockGridRec);
-//          Y_coordinate2d Y(*blockGridRec);
-//          VariableFFT Kx(varFar);
-//          VariableFFT Ky(varFar);
-
-//          double dx = varIn.getHx();
-//          double dy = varIn.getHy();
-
-//          double ukx = 2.0 * M_PI / varIn.getSizeX();
-//          double uky = 2.0 * M_PI / varIn.getSizeY();
-
-//          Kx = X / dx * ukx ;
-//          Ky = Y / dy * uky ;
-
-          Function2d2<std::complex<double>,double> Aperture(aperture);
-          Function2d1<double, std::complex<double> > absolute(ABS);
-          Function2d1<double, std::complex<double> > myRealFunc(myReal);
-          Function2d1<std::complex<double>,double> Expi(expi);
-          Function2d1<double, std::complex<double> > Sqrt(myRealSqrt);
-
-
-          //VariableFFT temp(varFar);
-          temp = Sqrt(wavenumber*wavenumber - Kx*Kx - Ky*Ky) * (distance) ;
-          std::ofstream DATEIA;
-
-          DATEIA.open("varWaveK.vtk");
-          temp.Print_VTK(DATEIA);
-          DATEIA.close();
-
-          //varIn = varIn * Expi(myRealFunc(temp));
-
-          varFar = Aperture(X,Y);
-          varIn  = varFar;
-          varFar.FFT();
-          varFar = varFar * Expi( myRealFunc(temp));
-          varFar.inversFFT();
-      }
-
-void amplification(double dz,
-                   VariableFFT& pumppower,
-                   VariableFFT& varIn,
-                   VariableFFT& varWavenumber,
-                   VariableFFT& temp)
-{
-
-    // varIn : Intensity = |varIn|^2
-    // also das E-Feld so skaliert, dass es quadriert direkt die Intensität ergibt.
-
-    double c = 3e11;// mm / s
-    //c = 3e8;// m / s
-    double planck = 6.626e-34;
-    double emissionCrosssection = 2.5* 1e-17;//mm²
-    double upperLevelLifetime = 230e-6;
-    double Ntot = 1.39e+17; //( 1 / mm^3)
-    double lambdaPump = 808e-6;
-          // lambda   = 1064e-6;
-    //doping 0.1&
-    //Ntot = 1.3e+26; //( 1 / m^3)
-
-    //nd:yag 1%
-    upperLevelLifetime = 225e-6;
-    Ntot = 1.39e+17;
-    //pumppower : W / mm³
-
-    VariableFFT photonDensity(temp);
-    VariableFFT inversion(temp);
-    VariableFFT pumpPhotons(temp);
-    Function2d1<double, std::complex<double> > absolute(ABS);
-    // photonDensity : Intensity / energie_photon , unit: 1 / (s mm^2)
-    photonDensity = absolute(varIn) * absolute(varIn)/ (planck * c / lambda);
-    // pumpPhotons : pumppower / energie_photon , unit: 1 / (s mm^3)
-    pumpPhotons = pumppower / (planck * c / lambdaPump); // N / s mm³
-
-    // exp complex: normale exp funktion, die aber den realteil des arguments in den exponenten packe, also exp(real(arg)) und einen complexen wert (imag = 0) zurückgibt
-    //noetig, weil multipliziert mit komplexer variable
-    Function2d1<std::complex<double>,std::complex<double>> Exp(expComplex);
-
-    //inversion : stimmt das so?
-    inversion = pumpPhotons / (emissionCrosssection * photonDensity   + 1.0 / upperLevelLifetime + pumpPhotons / Ntot);
-    //inversion = pumpPhotons / (emissionCrosssection * photonDensity * 2.0  + 1.0 / upperLevelLifetime + pumpPhotons / Ntot);
-
-    //temp : argument, welches in den exponenten zur verstärkung kommt
-    temp= emissionCrosssection * inversion * dz   ;
-
-
-    Function2d1<double, std::complex<double> > Sqrt(myRealSqrt);
-
-    //verstärkungsschritt. hier muss mit der wurzel der verstärkung multipliziert werden, da varIn die wurzel der Intensität ist
-    temp = Sqrt(Exp(temp));
-    //temp = Sqrt(1.0 + emissionCrosssection * inversion * dz);
-
-    varIn = varIn * temp;
-
-
-}
-
-void virtualLensCorrection(double dz, double wavenumberAverage,
-                           VariableFFT& varIn,
-                           VariableFFT& varWavenumber,
-                           VariableFFT& temp)
-{
-    std::cout << "virtualLensCorrection skpped\n";
-    return;
-
-
-
-
-
-    Function2d1<std::complex<double>,double> Expi(expi);
-    Function2d1<double, std::complex<double> > absolute(ABS);
-    Function2d1<double, std::complex<double> > myRealFunc(myReal);
-
-    temp = myRealFunc(varWavenumber - wavenumberAverage ) * dz;
-//    std::ofstream DATEIC;
-//    DATEIC.open("varTEMPAVERAGE.vtk");
-//    temp.Print_VTK(DATEIC);
-//    DATEIC.close();
-
-
-
-//    temp = myRealFunc(varWavenumber - minimumWavenmumber ) * dz;
-//    DATEIC.open("varTEMPMINIMA.vtk");
-//    temp.Print_VTK(DATEIC);
-//    DATEIC.close();
-    //sampling
-    double samplingTest =Maximum(myRealFunc(temp)) ;
-    double samplingMax = M_PI / samplingTest;
-    if (samplingMax < 1.0)
-    {
-        std::cout << "undersampling \n";
-        std::cout << "dz = " << dz << "\n";
-        std::cout << "dzMax = " << samplingMax * dz << std::endl;
-    }
-
-//    std::ofstream DATEIB;
-
-//    DATEIB.open("varTEMPTEST.vtk");
-//    temp.Print_VTK(DATEIB);
-//    DATEIB.close();
-
-
-
-    varIn = varIn * Expi(1.0*myRealFunc(temp));
-
-//    std::ofstream DATEIA;
-
-//    DATEIA.open("varInAfterCorrection.vtk");
-//    varIn.Print_VTK(DATEIA);
-//    DATEIA.close();
+*/
 
 
+double fRealPart(std::complex< double > x) {
+   return x.real();
 }
 
-void powerTest(VariableFFT& varIn)
-{
-    Function2d1<double, std::complex<double> > absolute(ABS);
-    double power = product(absolute(varIn),absolute(varIn));
-    std::cout << "power  = " << power << "\n";
-
+double fImagPart(std::complex< double > x) {
+   return x.imag();
 }
-void spectrumPlaneWavePropagation(double distance,
-                       double wavenumber,
-                       VariableFFT& varIn,
-                       VariableFFT& varFar,
-                       VariableFFT& Kx,
-                       VariableFFT& Ky,
-                       VariableFFT& temp ) {
-         // Blockgrid2D* blockGridRec = varFar.Give_blockgrid();
-
-//          X_coordinate2d X(*blockGridRec);
-//          Y_coordinate2d Y(*blockGridRec);
-//          VariableFFT Kx(varFar);
-//          VariableFFT Ky(varFar);
-
-//          double dx = varIn.getHx();
-//          double dy = varIn.getHy();
-
-//          double ukx = 2.0 * M_PI / varIn.getSizeX();
-//          double uky = 2.0 * M_PI / varIn.getSizeY();
-
-//          Kx = X / dx * ukx ;
-//          Ky = Y / dy * uky ;
-
-
-                  Function2d1<double, std::complex<double> > MYREAL(myReal);
-
-          double maxKx = Maximum(MYREAL(Kx));
-          double maxKy = Maximum(MYREAL(Ky));
-
-          Function2d1<std::complex<double>,double> Expi(expi);
-          Function2d1<double, std::complex<double> > Sqrt(myRealSqrt);
-          Function2d1<double, std::complex<double> > absolute(ABS);
-
-         // VariableFFT temp(varIn);
-          temp = wavenumber*wavenumber - Kx*Kx - Ky*Ky;
-          temp = Sqrt(temp) * (distance);
-
-//          std::ofstream DATEIA;
-//          DATEIA.open("varTempA.vtk");
-//          temp.Print_VTK(DATEIA);
-//          DATEIA.close();
-
-
-          if ((wavenumber*wavenumber - maxKx*maxKx - maxKy*maxKy) < 0)
-          {
-              std::cout << "warning : negative sqrt() ! decrease step size or increase resolution" << std::endl;
-          }
-
-         // varIn.FFTShift();
-
-          varIn.FFT();
-          //varIn.FFTShift();
-
-
-//          DATEIB.open("varIn.FFTShift-FFT-FFTShift.vtk");
-//          varIn.Print_VTK(DATEIB);
-//          DATEIB.close();
-
-//          std::ofstream DATEIC;
-//          DATEIC.open("varTempWithOutExp.vtk");
-//          temp.Print_VTK(DATEIC);
-//          DATEIC.close();
-          varFar = varIn;
-          temp = Expi( 1.0*MYREAL(temp));
-          varIn = varIn * temp;
-
-          temp = varIn;
-
-
-
-
-          //varIn.FFTShift();
-          varIn.inversFFT();
-          //varIn.FFTShift();
-
-//          std::ofstream DATEID;
-//          DATEID.open("varTempD.vtk");
-//          varIn.Print_VTK(DATEID);
-//          DATEID.close();
-//varFar = varFar;
-         // varFar = varIn;
-      }
-void applyLens(VariableFFT& varIn,VariableFFT& varOPL, double wavenumber = 1)
-{
-
-        Function2d1<std::complex<double>,double> Expi(expi);
-        Function2d1<double, std::complex<double> > absolute(ABS);
-        Function2d1<double, std::complex<double> > myRealPart(realPart);
-
-
-
-        varIn = varIn * Expi(-1.0*myRealPart(varOPL) * wavenumber);
-
-
 
+std::complex< double > fexpi(double x) {
+   std::complex< double > I(0.0,1.0);
+   return exp(I*x);
 }
 
-double C_4;
-double focalLength;
-
-void estimateBeamWaist(VariableFFT& varIn,
-                       X_coordinate2d& X,
-                       Y_coordinate2d& Y)
-{
-
-    Variable2D<double>  unity(*(varIn.Give_blockgrid()));
-    Variable2D<double>  Intensity(*(varIn.Give_blockgrid()));
-   unity = 1.0;
-   Function2d1<double, std::complex<double> > absolute(ABS);
-   Intensity = absolute(varIn) * absolute(varIn);
-
-   double powerHelper = product(absolute(Intensity),absolute(unity));
-
-    double medianX = product(Intensity * X * X,unity) / powerHelper;
-    double medianY = product(Intensity * Y * Y,unity) / powerHelper;
-    powerHelper = powerHelper *varIn.getHx() * varIn.getHy();
-    std::cout << "power = " << powerHelper <<std::endl;
-    std::cout << "beamwaistX = " << 2.0 * sqrt(medianX) <<std::endl;
-    std::cout << "beamwaistY = " << 2.0 * sqrt(medianY) <<std::endl;
+double fexp(double x) {
+   return exp(x);
 }
 
-void estimateBeamQuality(VariableFFT& varIn,
-                         VariableFFT& Kx,
-                         VariableFFT& Ky,
-                         X_coordinate2d& X,
-                         Y_coordinate2d& Y,
-                         VariableFFT& temp,
-                         double lambda)
-{
-//    std::cout << "Beamquality not estimated! " << std::endl;
-//    return;
-
-    Function2d1<double, std::complex<double> > absolute(ABS);
-    Function2d1<double, std::complex<double> > myRealFunc(myReal);
-    Function2d1<double, std::complex<double> > winkel(complexAngle);
-    Local_stiffness_matrix2D<double> dx(*(varIn.Give_blockgrid()));
-    dx.Calculate(d_dx(v_())*w_());
-    Local_stiffness_matrix2D<double> dy(*(varIn.Give_blockgrid()));
-    dy.Calculate(d_dy(v_())*w_());
-
-    CalcContinuousArg cont(*(varIn.Give_blockgrid()));
-    int gaussIterations = 100;
-    Variable2D<double> f(*(varIn.Give_blockgrid()));
-    Variable2D<double> TEMP(*(varIn.Give_blockgrid()));
-     Variable2D<double>  ux(*(varIn.Give_blockgrid()));
-     Variable2D<double>  uy(*(varIn.Give_blockgrid()));
-     Variable2D<double>  px(*(varIn.Give_blockgrid()));
-     Variable2D<double>  py(*(varIn.Give_blockgrid()));
-     Variable2D<double>  unity(*(varIn.Give_blockgrid()));
-     Variable2D<double>  Intensity(*(varIn.Give_blockgrid()));
-     Variable2D<double>  IntensityFFT(*(varIn.Give_blockgrid()));
-     Variable2D<double>  phase(*(varIn.Give_blockgrid()));
-     Variable2D<double>  REALPART(*(varIn.Give_blockgrid()));
-
-//     X_coordinate2d X(*(varIn.Give_blockgrid()));
-//     Y_coordinate2d Y(*(varIn.Give_blockgrid()));
-//    VariableFFT temp(varIn);
-
-
-    unity = 1.0;
-    Intensity = absolute(varIn) * absolute(varIn);
-
-    temp = varIn;
-    temp.FFT();
-    IntensityFFT = absolute(temp) * absolute(temp);
-
-    double incREAL = varIn.getHx();
-    double incFREQ = 2.0 * M_PI / varIn.getSizeY();
-    incFREQ = 0.000248;
-
-    incFREQ = varIn.getHx() / varIn.getNx();
-    double powerT = product(Intensity,unity);// * incREAL * incREAL;
-    double powerFFTT = product(IntensityFFT,unity);// * incFREQ * incFREQ;
-    Intensity = Intensity / powerT;
-    IntensityFFT = IntensityFFT / powerFFTT;
-    std::ofstream DATEIX;
-
-
-
-//    phase = winkel(varIn) - 2.0*M_PI;
-//    DATEIX.open("diff_phase_noncontinuous.vtk");
-//    phase.Print_VTK(DATEIX);
-//    DATEIX.close();
-
-    cont.calcArg(phase,varIn);
-    phase = phase * (-1.0);
-
-//    DATEIX.open("diff_phase_from_calcArg.vtk");
-//    phase.Print_VTK(DATEIX);
-//    DATEIX.close();
-//    DATEIX.open("diff_field.vtk");
-//    varIn.Print_VTK(DATEIX);
-//    DATEIX.close();
-
-
-    double waveNumber = 2.0 * M_PI / lambda;
-    phase = phase / waveNumber;
-    //phase = phase;
-
-     Local_stiffness_matrix2D<double> helm(*(varIn.Give_blockgrid())); // also in FEA_Def and solverFEA
-    helm.Calculate(v_()*w_());
-
-
-     (ux) = 0;
-    Function2d1<double, std::complex<double> > myRealPart(realPart);
-    REALPART = (myRealPart(varIn));
-     f = (dy)(Intensity);
-
-     for(int i=0;i<gaussIterations;++i)
-     {
-         TEMP = ux;
-         (ux) = (ux) - ((helm)(ux) -f) / (helm).diag();
-         if (L_infty(TEMP-ux) < 1e-13)
-             i = gaussIterations;
-     }
-     f = (dx)(Intensity);
-     for(int i=0;i<gaussIterations;++i)
-     {
-         TEMP = uy;
-         (uy) = (uy) - ((helm)(uy) -f) / (helm).diag();
-         if (L_infty(TEMP-uy) < 1e-13)
-             i = gaussIterations;
-     }
-     f = (dx)(phase);
-     for(int i=0;i<gaussIterations;++i)
-     {
-         TEMP = px;
-         (px) = (px) - ((helm)(px) -f) / (helm).diag();
-         if (L_infty(TEMP-px) < 1e-13)
-             i = gaussIterations;
-     }
-     f = (dy)(phase);
-     for(int i=0;i<gaussIterations;++i)
-     {
-         TEMP = py;
-         (py) = (py) - ((helm)(py) -f) / (helm).diag();
-         if (L_infty(TEMP-py) < 1e-13)
-             i = gaussIterations;
-     }
-
-
-//         DATEIX.open("diff_phase_continuous.vtk");
-//         px.Print_VTK(DATEIX);
-//         DATEIX.close();
-//     px = 2.0*X / focalLength / 2.0 + (X*X*X * 4.0 + 4.0 * X*Y*Y) * C_4;
-//     //px = px * waveNumber;
-//     DATEIX.open("diff_phase_continuous_analytic.vtk");
-//     px.Print_VTK(DATEIX);
-//     DATEIX.close();
-//     py = 2.0*Y / focalLength / 2.0 + (Y*Y*Y * 4.0 + 4.0 * X*X*Y) * C_4;
-
-
-
-//     VariableFFT Kx(varIn);
-//     VariableFFT Ky(varIn);
-
-//     double delx = varIn.getHx();
-//     double dely = varIn.getHy();
-
-//     double ukx = 2.0 * M_PI / varIn.getSizeX();
-//     double uky = 2.0 * M_PI / varIn.getSizeY();
-
-//     Kx = (X-0.5*delx) / delx * ukx ;
-//     Ky = (Y-0.5*dely) / dely * uky ;
-//     DATEIX.open("diff_Ky.vtk");
-//     Ky.Print_VTK(DATEIX);
-//     DATEIX.close();
-//     DATEIX.open("diff_I_FFT.vtk");
-//     IntensityFFT.Print_VTK(DATEIX);
-//     DATEIX.close();
-
-
-     double power = product(Intensity,unity);
-     double powerFFT = product(IntensityFFT,unity);
-
- //    std::cout << "ratio of dx / ux " << delx / ukx << std::endl;
-     f = myRealFunc(IntensityFFT * Kx * Kx);
-     double phiX_FFT = product(f,unity) / powerFFT / waveNumber/ waveNumber;
-     f = myRealFunc(IntensityFFT * Ky * Ky);
-     double phiY_FFT = product(f,unity) / powerFFT / waveNumber/ waveNumber;
-
-     f = myRealFunc(IntensityFFT * X * Kx);
-     double medianXphiX_FFT = product(f,unity)/ waveNumber/ waveNumber;
-     f = myRealFunc(absolute(varIn) * absolute(temp) * Y * Ky);// fehler hier!
-     f = myRealFunc(IntensityFFT * Intensity * Y);// fehler hier!
-     double medianYphiY_FFT = product(f,unity)/ waveNumber/ waveNumber;
-
-
-     double medianX = product(Intensity * X * X,unity) / power;
-     double medianX4 = product(Intensity * X * X * X * X,unity) / power;
-     double medianX6 = product(Intensity * X * X * X * X* X * X,unity) / power;
-     double betaX = sqrt((medianX * medianX6 - medianX4 * medianX4)/(medianX4 * medianX4));
-     double C4abb = 16.0 * M_PI / lambda * 0.816 * C_4 * medianX4 ;
-     C4abb = 16.0 * M_PI / lambda * C_4 * medianX4 ;
-     std::cout << "aberration due to C4 " << C4abb << std::endl;
-     double medianY = product(Intensity * Y * Y,unity) / power;
-     std::cout << "beamwaistX = " << 2.0 * sqrt(medianX) <<std::endl;
-     std::cout << "beamwaistY = " << 2.0 * sqrt(medianY) <<std::endl;
-
-     f = 1.0 / 4.0 / waveNumber / waveNumber / power * ux * ux / Intensity;
-     f = f + 1.0 / power * Intensity * px * px;
-     double phiX = product(f,unity);
-     f = 1.0 / 4.0 / waveNumber / waveNumber / power * uy * uy / Intensity;
-     f = f + 1.0 / power * Intensity * py * py;
-     double phiY = product(f,unity);
-     f = 1.0 / power * Intensity * X * px;
-     double medianXphiX = product(f,unity);
-     f = 1.0 / power * Intensity * Y * py;
-     double medianYphiY = product(f,unity);
-     double M2X = 2.0 * waveNumber * sqrt(fabs(medianX * phiX_FFT - medianXphiX * medianXphiX));
-     double M2Y = 2.0 * waveNumber * sqrt(fabs(medianY * phiY_FFT - medianYphiY * medianYphiY));
-     double M2X_FFT = 2.0 * waveNumber * sqrt(fabs(medianX * phiX_FFT - medianXphiX_FFT*medianXphiX_FFT));
-     double M2Y_FFT = 2.0 * waveNumber * sqrt(fabs(medianY * phiY_FFT - medianYphiY_FFT*medianYphiY_FFT));
-     double M2X_direct = 2.0 * waveNumber * sqrt(fabs(medianX * phiX - medianXphiX * medianXphiX));
-     double M2Y_direct = 2.0 * waveNumber * sqrt(fabs(medianY * phiY - medianYphiY * medianYphiY));
-
-     double REffX = medianX / medianXphiX;
-     double REffY = medianY / medianYphiY;
-
-     f = medianX / power * ux * ux / Intensity;
-     double M2diffX = sqrt(product(f,unity));
-     f = Intensity * (px - X / REffX)*(px - X / REffX);
-     double M2abbX = sqrt(product(f,unity) / power) * 2.0 * waveNumber * medianY;
-     f = medianY / power * uy * uy / Intensity;
-     double M2diffY = sqrt(product(f,unity));
-     f = Intensity * (py - Y / REffY)*(py - Y / REffY);
-     double M2abbY = sqrt(product(f,unity) / power) * 2.0 * waveNumber * medianY;
-
-//     std::cout << "medianX = " << medianX <<std::endl;
-//     std::cout << "medianX4 = " << medianX4 <<std::endl;
-//     std::cout << "medianX6 = " << medianX6 <<std::endl;
-//     std::cout << "medianY = " << medianY <<std::endl;
-//     std::cout << "phiX = " << phiX <<std::endl;
-//     std::cout << "phiY = " << phiY <<std::endl;
-//     std::cout << "phiX_FFT = " << phiX_FFT <<std::endl;
-//     std::cout << "phiY_FFT = " << phiY_FFT <<std::endl;
-
-
-//     std::cout << "REffX = " << REffX <<std::endl;
-//     std::cout << "REffY = " << REffY <<std::endl;
-//     std::cout << "medianXphiX = " << medianXphiX <<std::endl;
-//     std::cout << "medianYphiY = " << medianYphiY <<std::endl;
-
-
-     std::cout << "M2X_with_fft " << M2X << std::endl;
-     std::cout << "M2Y_with_fft " << M2Y << std::endl;
-     std::cout << "M2X_direct " << M2X_direct << std::endl;
-     std::cout << "M2Y_direct " << M2Y_direct << std::endl;
-     std::cout << "M2X_FFT " << M2X_FFT << std::endl;
-     std::cout << "M2Y_FFT " << M2Y_FFT << std::endl;
-
-
-     std::cout << "M2diffX " << M2diffX << std::endl;
-     std::cout << "M2abbX " << M2abbX << std::endl;
-     std::cout << "M2diffY " << M2diffY << std::endl;
-     std::cout << "M2abbY " << M2abbY << std::endl;
-//     std::cout << "M2TotalY " << sqrt(M2abbY*M2abbY+M2diffY*M2diffY) << std::endl;
-//     std::cout << "C4 / M2Abb " << C4abb / M2abbY << std::endl;
-//     std::cout << "C4 / M2Abb " << C4abb / M2abbX << std::endl;
-//     std::cout << "M2TotalY " << sqrt(M2abbY*M2abbY+M2diffY*M2diffY) << std::endl;
-
-//         std::ofstream DATEIR;
-//         DATEIR.open("diffDX.vtk");
-//         ux.Print_VTK(DATEIR);
-//         DATEIR.close();
-
-    //CalcContinuousArg;
-
-
+double SG_extern;
+double stretch_extern;
+double rSG(double x, double y) {
+     double r = sqrt(x*x+y*y);     
+     r = r / stretch_extern;
+     return pow(r,SG_extern);
 }
 
 int main(int argc, char** argv) {
     std::ofstream DATEI;
 
-    int n = 8;
-
-    double R1 = 100;
-    double R2 = 100;
-
-    focalLength = 100.0;
-
-    int distanceIncrements = 15;
-    double distance = 50 ;      //[mm]
-    double dz = distance / double(distanceIncrements);
-    lambda   = 1064e-6;  //[mm]
-    radiusLoch = 0.1;   //[mm]
-
-
-    distance = fabs(distanceFromWaist * 2.0);
-
-    distance = 150 ;
-    dz = distance / double(distanceIncrements);
-    double geometrySize  =  5.0; //[mm]
-    geometrySize =  1.0;
-
-    radiusGauss = geometrySize / 4.0;   //[mm]
-    radiusGauss = 0.2;
-    rayleighrange = M_PI *radiusGauss*radiusGauss /lambda;
-    std::cout << "rayleighrange " << rayleighrange<< std::endl;
-    distanceFromWaist = -rayleighrange;
-    distanceFromWaist = 0;
-    curvature = distanceFromWaist * (1.0 + pow(rayleighrange / distanceFromWaist,2) );
-
-    double radiusGeo = 0.5 * geometrySize;
+    double lambda   = 1064e-6;  //[mm]
+
+    
+    Function2d1< double, std::complex< double > > realPart(fRealPart);
+    Function2d1< double, std::complex< double > > imagPart(fImagPart);
+    
+    Function2d1< std::complex< double >, double > Expi(fexpi);
+    Function2d1< double, double > Exp(fexp);    
+    Function2d2< double, double > powSG(rSG);      
+    
+    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;
-
-
-    cout << " Test CalcFresnel!!" << endl;
-
-    std::cout << "distance = " << distance << std::endl;
-    std::cout << "lambda = " << lambda << std::endl;
-    std::cout << "aperture = " << radiusLoch << std::endl;
-    std::cout << "geometrySize = " << geometrySize << std::endl;
-
-    std::cout << "Fresnelnumber = " << radiusLoch*radiusLoch / distance / lambda << std::endl;
-    std::cout << "Fresnelnumber >> 1 : near field "      << std::endl;
-    std::cout << "Fresnelnumber ~  1 : fresnel zone"     << std::endl;
-    std::cout << "Fresnelnumber << 1 : fraunhofer zone"  << std::endl;
-
-    double deltaX = geometrySize / pow(2,n-1);
-    double deltaXFourierPlane = lambda * distance / pow(2,n-1) / deltaX;
-    std::cout << "deltaX initial plane (z = 0) = " << deltaX << std::endl;
-    std::cout << "deltaX fourier plane (z = " <<distance<<")  = " << deltaXFourierPlane << std::endl;
-    std::cout << "dxInitial / dxFourier   = " << deltaX / deltaXFourierPlane << std::endl;
-    std::cout << "curvature " << curvature << std::endl;
-
-
-    //wenn daten gelesen werden
-//    VTK_Reader reader(         QString("C:/Users/rall/FAUbox/Promotion/Vectorial_BPM/fibercryst_exmaple/RefractionIndexTherm_last.vtk"));
-//    VTK_Reader readerPumppower(QString("C:/Users/rall/FAUbox/Promotion/Vectorial_BPM/fibercryst_exmaple/abspower.vtk"));
-//    Variable<double> * thermalRefractiveIndex3D = reader.give_first_variable();
-//    Variable<double> * pumpPowerRaytracing = readerPumppower.give_first_variable();
-    //wenn analytisch beschrieben
-    Cylinder *cyl = new Cylinder(0.5,0.25,20.0);
-    Blockgrid *bg = new Blockgrid(cyl,8,8,128);
-    Variable<double> *thermalRefractiveIndex3D = new Variable<double>(*bg);
-    Variable<double> *pumpPowerRaytracing = new Variable<double>(*bg);
-
-    Function2<double> flatTopPump(lochDouble);
-    *pumpPowerRaytracing = *pumpPowerRaytracing * 140.0;
-
-    std::cout << "manually setting pumppower:" << std::endl;
-
-    //homogeneous
-    //*pumpPowerRaytracing = 140.0 / (0.5*0.5*M_PI*20.0);
-    X_coordinate X3D(*(pumpPowerRaytracing->Give_blockgrid()));
-    Y_coordinate Y3D(*(pumpPowerRaytracing->Give_blockgrid()));
-    *pumpPowerRaytracing =flatTopPump(X3D,Y3D)* 140.0 / (radiusLoch*radiusLoch*M_PI*20.0);
-
-
-
-//    Unstructured_grid *ug = new Cylinder(2,1,20);
-//    Blockgrid *bg = new Blockgrid(ug,10,10,20);
-//    Variable<double> * thermalRefractiveIndex3D = new Variable<double>(*bg);
-
-
-
-    UGFrom3DSlice slice(thermalRefractiveIndex3D->Give_Ug(),0.0);
-    UGFrom3DSlice slicePumppower(pumpPowerRaytracing->Give_Ug(),0.0);
-
-    Blockgrid2DFrom3D D2block(&slice,thermalRefractiveIndex3D->Give_blockgrid());
-    Blockgrid2DFrom3D D2blockPumppower(&slicePumppower,pumpPowerRaytracing->Give_blockgrid());
-    Variable2D<std::complex<double> > vardDeltaNComplex(D2block);
-    Variable2D<std::complex<double> > varPumppowerComplex(D2blockPumppower);
-
-    Variable2D<double > varDeltaN(D2block);
-    Variable2D<double > varPumppower(D2blockPumppower);
-
-    IteratorZDirection zIterator(thermalRefractiveIndex3D->Give_blockgrid());
-    zIterator.next();
-   varDeltaN.interpolateSlizeZ(thermalRefractiveIndex3D,0.0);
-
-
-    vardDeltaNComplex = varDeltaN;
-    VariableFFT varE(n,n,geo);
-
-    VariableFFT deltaN(varE);
-    VariableFFT pumppower(varE);
-
-    deltaN.interpolate(vardDeltaNComplex,0.0);
-
-    VariableFFT varIn(varE);
-    VariableFFT unit(varE);
-    unit = 1.0;
-    VariableFFT varIntensity(varE);
-    VariableFFT varPhase(varE);
-    VariableFFT varTempX(varE);
-    VariableFFT varTempY(varE);
-    VariableFFT varRefr(varE);
-    VariableFFT varPhaseLens(varE);
-    VariableFFT temp(varE);
-    VariableFFT varWavenumber(varE);
-
-
-    Blockgrid2D* blockGridRec = varE.Give_blockgrid();
-    X_coordinate2d X(*blockGridRec);
-    Y_coordinate2d Y(*blockGridRec);
-    VariableFFT varPumpslice(varE);
-
-
-    Function2d2<std::complex<double>,double> flatTopSlice(loch);
-    varPumpslice = 140.0 * flatTopSlice(X,Y) / (radiusLoch*radiusLoch*M_PI*20.0);
-
-      VariableFFT Kx(varE);
-      VariableFFT Ky(varE);
-
-
-    double dx = varIn.getHx();
-    double dy = varIn.getHy();
-
-    double ukx = 2.0 * M_PI / varIn.getSizeX();
-    double uky = 2.0 * M_PI / varIn.getSizeY();
-
-    varTempX =(X  - 0.5*dx);
-    varTempY =(Y  - 0.5*dy);
-    Kx = varTempX / dx * ukx ;
-    Ky = varTempY / dy * uky ;
-
-
-    Function2d1<double, std::complex<double> > absolute(ABS);
-    double incFREQ = (fabs(Maximum(absolute(Kx) * 2.0))) /double(Kx.getSizeX())  ;
-
-    Function2d2<std::complex<double>,double> Aperture(gauss);
-//    Function2d1<std::complex<double>,double> Expi(expi);
-//    Function2d1<double, std::complex<double> > Sqrt(myRealSqrt);
-
-    //sampling criterion
-
-
-    varE = Aperture(X,Y);
-
-    double power = 1.0; // unit : Watt
-
-    double amp = sqrt(2.0 * power / M_PI / radiusGauss / radiusGauss); // unit = Watt / mm^2
-    varE = varE * amp;
-
-//    std::ofstream DATEIG;
-//    DATEIG.open("/local/er96apow/FFT_results/varE___before.vtk");
-//    varE.Print_VTK(DATEIG);
-//    DATEIG.close();
-
-    C_4 = 0.00015;
-    //C_4 = 0.0;
-//    std::ofstream DATEIX;
-
-//    DATEIX.open("varE_bef_fft.vtk");
-//    varE.Print_VTK(DATEIX);
-//    DATEIX.close();
-
-    //varE.FFT();
-//    std::ofstream DATEIR;
-//    DATEIR.open("varE_fft.vtk");
-//    varE.Print_VTK(DATEIR);
-//    DATEIR.close();
-
-//    varE.inversFFT();
-//    std::ofstream DATEIH;
-//    DATEIH.open("varE_fft_ifft.vtk");
-//    varE.Print_VTK(DATEIH);
-//    DATEIH.close();
-
-
-    varIn = varE;
-
-    Function2d1<double, double > wurzel(sqrt);
-    //varPhaseLens =(-1.83+1.0) * (X*X+Y*Y)/2.0 * (1.0 / R1 + 1.0 / R2) *wavenumber;
-
-    varPhaseLens = (X*X + Y*Y) / 2.0 / focalLength + C_4 * ( X * X + Y * Y ) * ( X * X + Y * Y );
-
-
-    //varPhaseLens = (X*X + Y*Y) / 2.0 / focalLength;// + C_4 * ( X * X + Y * Y ) * ( X * X + Y * Y );
-    //    *convergenceVariable = n_0 * wurzel(absolut( 1 - alpha * alpha * ( X * X + Y * Y ) + alpha * alpha * 4.0 * ( X * X + Y * Y ) * ( X * X + Y * Y ) )); //with C4 aberration
-
-
-    //varPhaseLens = wurzel(X*X + Y*Y) / focalLength;
-
-
-    Function2d1<std::complex<double>, std::complex<double> > limitToOne(myLimitToOne);
-    double alpha = 2.0 * M_PI /  distance / 2.0 ;//200.0;
-    alpha = alpha / 2.0;
-
-    double n0 = 1.8230;
-    alpha = 1.0/1000.0 * 2.0 * M_PI ;
-    varRefr = wurzel( 1.5 * 1.5 * (1.0 - alpha * alpha * (X*X+Y*Y)));
-   // varRefr = wurzel( 1.5 * 1.5 * (1.0 - alpha * alpha * (X*X)));
-    //varRefr = wurzel(1.8 * 1.8 * (1 - alpha * (X*X)));
-
-    varRefr = limitToOne(varRefr);
-
-    //varRefr = 1.83+deltaN ;
-
-    varWavenumber = 2.0 * M_PI * varRefr / lambda;
-
-    Function2d1<double, std::complex<double> > myRealFunc(myReal);
-    std::cout << "Minimum( (myRealFunc(varRefr))) " << Minimum( (myRealFunc(varRefr))) << std::endl;
-    std::cout << "Minimum( X) " << Minimum( (myRealFunc(X))) << std::endl;
-    std::cout << "Maximum( X) " << Maximum( (myRealFunc(X))) << std::endl;
-    std::cout << " Maximum( (myRealFunc(varRefr))" << Maximum( (myRealFunc(varRefr))) << std::endl;
-
-
-
-    double refrAverage = 0.1 *  Minimum( (myRealFunc(varRefr))) + 0.9 * Maximum( (myRealFunc(varRefr)));
-    double wavenumberAverage = 2.0 * M_PI * refrAverage / lambda;
-
-    //double focalLength = 1.0 / refrAverage / alpha / sin(alpha * distance);
-    double peroid = 2.0 * M_PI / alpha;
-    std::cout << "focal  length approx: " << focalLength<< std::endl;
-    std::cout << "peroid length approx: " << peroid<< std::endl;
-    std::cout << "z-dir      increment: " << dz<< std::endl;
-
-//    DATEIG.open("varWavenumber.vtk");
-//    varWavenumber.Print_VTK(DATEIG);
-//    DATEIG.close();
-//    DATEIG.open("varvarPhaseLens.vtk");
-//    varPhaseLens.Print_VTK(DATEIG);
-//    DATEIG.close();
-//    DATEIG.open("varE___before.vtk");
-//    varIn.Print_VTK(DATEIG);
-//    DATEIG.close();
-
-    double dzMax = M_PI / ( sqrt(wavenumberAverage*wavenumberAverage-pow((pow(2,n)/2-1) * ukx,2))
-                           -sqrt(wavenumberAverage*wavenumberAverage-pow((pow(2,n)/2) * ukx,2))) ;
-
-    if (dzMax < dz)
-    {
-        std::cout << "undersampling " << std::endl;
-    }
-    //virtualLensCorrection(distance,wavenumberAverage,varIn,varWavenumber);
-//    applyLens(varIn, varPhaseLens,wavenumber);
-//    estimateBeamQuality(varIn,Kx,Ky,X,Y,temp,lambda);
-
-
-//        spectrumPlaneWavePropagation(100,
-//                     wavenumber,
-//                     varIn,
-//                     varE,Kx,Ky,X,Y,temp);
-
-
-    double totalPumpPower = 0;
-    Function2d1<double, std::complex<double> > absolute2(ABS);
-
-    temp = absolute2(varE)*absolute2(varE);
-    double powerHelper = product(absolute2(temp),absolute2(unit));
-    powerHelper = powerHelper *varE.getHx() * varE.getHy();
-    std::cout << "power before : "<<powerHelper << std::endl;
-    estimateBeamWaist(varIn,X,Y);
-//    spectrumPlaneWave(gauss,
-//                      118.105,
-//                      //wavenumber,
-//                      2.0 * M_PI / lambda,
-//                     varIn,
-//                     varE,X,Y,Kx,Ky,temp);
-//    spectrumPlaneWavePropagation( 118.105,
-//                 wavenumber * 2,
-//                 varIn,
-//                 varE,Kx,Ky,temp);
-//        CalcFresnel(gauss,
-//                     118.105,
-//                     wavenumber,
-//                     varIn,
-//                     varE);
-//    estimateBeamWaist(varIn,X,Y);
-//    return 0;
-
-
-    double distanceTotal{0};
-    int iterCounter{0};
-    for (int iter = 0 ; iter < zIterator.getSize()-1;iter++)
-    {
-        std::cout << "iter " << iter<< "\n";
-
-        std::cout << "progress : " << double(iter) / double(zIterator.getSize()) * 100 << "%" << std::endl;
-        std::ofstream DATEIQ;
-        varDeltaN.interpolateSlizeZ(thermalRefractiveIndex3D,zIterator.get_z());
-
-        varPumppower.interpolateSlizeZ(pumpPowerRaytracing, zIterator.get_z());
-         vardDeltaNComplex = varDeltaN;
-         varPumppowerComplex = varPumppower;
-         deltaN.interpolate(vardDeltaNComplex,0.0);
-         pumppower.interpolate(varPumppowerComplex,0.0);
-
-            //varPumpslice
-         std::cout << "pumpslice direct on fft domain calculated\n";
-         pumppower =varPumpslice;
-         totalPumpPower += product(absolute2(pumppower),absolute(unit)) * varE.getHx() * varE.getHy() * zIterator.get_hz();
-
-
-//         deltaN = 0.0;
-//         n0 = 1.0;
-
-         std::cout << "refrindex gradeint neglected" << std::endl;
-         //varWavenumber = (n0 + deltaN) * 2.0 * M_PI / lambda;
-         varWavenumber = (n0) * 2.0 * M_PI / lambda;
-        double wavenumberAverage_ = 0.1 *  Minimum( (myRealFunc(varWavenumber))) + 0.9 * Maximum( (myRealFunc(varWavenumber)));
-
-        virtualLensCorrection(zIterator.get_hz(),wavenumberAverage_,varIn,varWavenumber, temp);
-
-
-        double fac = 1.0;
-        iter--;
-        for (int iterFactor = 0 ; iterFactor < 1.0 / fac;iterFactor++ )
-        {
-            iter++;
-        }
-        for (int iterDiscret = 0 ; iterDiscret < fac; iterDiscret++)
-        {
-            iterCounter++;
-            distanceTotal += zIterator.get_hz() / fac;
-            amplification(zIterator.get_hz() / fac,pumppower,varIn,varWavenumber, temp);
-            spectrumPlaneWavePropagation( zIterator.get_hz() / fac,
-                         wavenumberAverage_,
-                         varIn,
-                         varE,Kx,Ky,temp);
-        }
-
-
-
-
-        int plotevery = 100;
-        if (iter % plotevery == 0)
-        {
-
-            //estimateBeamQuality(varIn,Kx,Ky,X,Y,temp,lambda);
-            estimateBeamWaist(varIn,X,Y);
-
-
-
-            std::ofstream DATEIA;
-
-            DATEIA.open("FFT_results/fibercryst_lowres_"+std::to_string(iter)+".vtk");
-            varIntensity = absolute(varIn) * absolute(varIn);
-            varIntensity.Print_VTK(DATEIA);
-            DATEIA.close();
-            DATEIA.open("FFT_results/fibercryst_lowres_Field_"+std::to_string(iter)+".vtk");
-            varIntensity = absolute(varIn);
-            varIntensity.Print_VTK(DATEIA);
-            DATEIA.close();
-            DATEIA.open("FFT_results/pump_power"+std::to_string(iter)+".vtk");
-            pumppower.Print_VTK(DATEIA);
-            DATEIA.close();
-
-//            DATEIA.open("/local/er96apow/FFT_results/fibercryst_fftspace_lowres_"+std::to_string(iter)+".vtk");
-//            temp.Print_VTK(DATEIA);
-//            DATEIA.close();
-
-//            vardDeltaNComplex.interpolateSlizeZ(varIntensity,0.0);
-
-//            DATEIA.open("/local/er96apow/FFT_results/interpolated_"+std::to_string(iter)+".vtk");
-//            //varIntensity = absolute(varIn) * absolute(varIn);
-//            vardDeltaNComplex.Print_VTK(DATEIA);
-//            DATEIA.close();
-//            if (iter == 101)
-//                iter += 500;
-        }
-
-        zIterator.next();
-    }
-    estimateBeamQuality(varIn,Kx,Ky,X,Y,temp,lambda);
-    temp = absolute2(varIn)*absolute2(varIn);
-    powerHelper = product(absolute2(temp),absolute2(unit));
-        powerHelper = powerHelper *varE.getHx() * varE.getHy();
-        std::cout << "power after  : "<<powerHelper << std::endl;
-
-        std::cout << "total pump power : " << totalPumpPower << std::endl;
-        std::cout << "distanceTotal " << distanceTotal << std::endl;
-        std::cout << "iterCounter " << iterCounter << std::endl;
-//    VariableFFT varB(varA);
-/*
-    Blockgrid2D* blockGridRec = varE.Give_blockgrid();
-
-    X_coordinate2d X(*blockGridRec);
-    Y_coordinate2d Y(*blockGridRec);
-*/
-
-
-
-
-
-
-//    CalcFresnel(loch,
-//                 distance,
-//                 wavenumber,
-//                 varIn,
-//                 varE);
-
-//    spectrumPlaneWave(loch,
-//                 distance,
-//                 wavenumber,
-//                 varIn,
-//                 varE);
-//    spectrumPlaneWave(gauss,
-//                 distance,
-//                 wavenumber,
-//                 varIn,
-//                 varE,X,Y,Kx,Ky,temp);
-
-//   // varE = varE / L_infty(  varE);
-
-
-//    std::ofstream DATEIA;
-
-//    DATEIA.open("varIn.vtk");
-//    varIn.Print_VTK(DATEIA);
-//    DATEIA.close();
-
-//    DATEIA.open("varE.vtk");
-//    varE.Print_VTK(DATEIA);
-//    DATEIA.close();
-
-//    DATEIA.open("varEimag.vtk");
-//	varE.Print_VTK(DATEIA,imPart);
-//	DATEIA.close();
-
-//    DATEIA.open("varEreal.vtk");
-//	varE.Print_VTK(DATEIA,realPart);
-//	DATEIA.close();
-
-    cout << " Test CalcFresnel finished!!" << endl;
-
+    int depth = 8;
+    
+    VariableFFT  testU (depth, depth, geo);
+    Blockgrid2D* bg = testU.Give_blockgrid();
+    
+    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) );
+    
+//    testU = Y;
+
+   DATEI.open("testU.vtk");
+   testU.Print_VTK(DATEI);
+   DATEI.close();
+
+   RealPart = realPart(testU);
+   ImagPart = imagPart(testU);
+
+   DATEI.open("realU.vtk");
+   RealPart.Print_VTK(DATEI);
+   DATEI.close();
+
+   DATEI.open("imagU.vtk");
+   ImagPart.Print_VTK(DATEI);
+   DATEI.close();
+   
 }
 
diff --git a/program2D/source/extemp/variableFFT.cc b/program2D/source/extemp/variableFFT.cc
index 49c380a..a17e592 100644
--- a/program2D/source/extemp/variableFFT.cc
+++ b/program2D/source/extemp/variableFFT.cc
@@ -125,6 +125,25 @@ void VariableFFT::init() {
     assignmentBlockgrid    = NULL;
 }
 
+void VariableFFT::setDomainStrech(double strechX, double strechY) {
+   Blockgrid2D* blockGridFFT = Give_blockgrid(); 
+   blockGridFFT->SetDomainStrech(strechX,strechY);        
+}
+
+double VariableFFT::getHx() const { 
+  return Hx * Give_blockgrid()->getStrechX(); 
+}
+double VariableFFT::getHy() const { 
+  return Hy * Give_blockgrid()->getStrechY(); 
+}
+double VariableFFT::getNx() { return Nx; }
+double VariableFFT::getNy() { return Ny; }
+double VariableFFT::getSizeX() { 
+  return Hx*Nx * Give_blockgrid()->getStrechX();
+}
+double VariableFFT::getSizeY() { 
+  return Hy*Ny * Give_blockgrid()->getStrechY();
+}
 
 VariableFFT::~VariableFFT() {
     if(ownBlockGrid) blockgrid;
diff --git a/program2D/source/extemp/variableFFT.h b/program2D/source/extemp/variableFFT.h
index cb4dd48..8477929 100644
--- a/program2D/source/extemp/variableFFT.h
+++ b/program2D/source/extemp/variableFFT.h
@@ -50,6 +50,7 @@ public:
     VariableFFT(VariableFFT* other);    
     VariableFFT(const VariableFFT& other);      
     ~VariableFFT();
+    void setDomainStrech(double strechX, double strechY); 
 
     void FFT();
     void inversFFT();     
@@ -67,12 +68,12 @@ public:
                      std::complex<double> defaultInterpolation);
 
     
-    double getHx() const { return Hx; }
-    double getHy() const { return Hy; }
-    double getNx() const { return Nx; }
-    double getNy() const { return Ny; }
-    double getSizeX() const { return Hx*Nx; }
-    double getSizeY() const { return Hy*Ny; }
+    double getHx() const;
+    double getHy() const;
+    double getNx();
+    double getNy();
+    double getSizeX();
+    double getSizeY();
     
     
     /*
diff --git a/program2D/source/grid/blockgrid2D.h b/program2D/source/grid/blockgrid2D.h
index adaf24e..6249cca 100644
--- a/program2D/source/grid/blockgrid2D.h
+++ b/program2D/source/grid/blockgrid2D.h
@@ -61,6 +61,9 @@ class  Blockgrid2D {
    * @param strechDomainY streched die Geometrie um Faktor strechDomainY in y-Richtung
    */
   void SetDomainStrech(double strechDomainX_,double strechDomainY_) { strechDomainX = strechDomainX_; strechDomainY = strechDomainY_; }
+  double getStrechX() const { return strechDomainX; }
+  double getStrechY() const { return strechDomainY; }
+  
   inline bool inStrechedDomain(const D2vector& point_coord);
   double MinimumStrechedX() { return ug->MinimumX()*strechDomainX; };
   double MinimumStrechedY() { return ug->MinimumY()*strechDomainY; };
diff --git a/program2D/source/interpol/interpolTwoD.cc b/program2D/source/interpol/interpolTwoD.cc
index 9b89887..83f4bca 100644
--- a/program2D/source/interpol/interpolTwoD.cc
+++ b/program2D/source/interpol/interpolTwoD.cc
@@ -906,6 +906,7 @@ void VectorOfArrowsCreatorComplex::createVectorList(QVector<QPointF>& startP, QV
                                     
                    double signX = 1.0;
                    double signY = 1.0;
+//test NOW		   
                    if(valueUx.real() < 0.0) signX = -1.0;
                    if(valueUy.real() < 0.0) signY = -1.0;
                    
-- 
GitLab