#ifndef _INCLUDED_L3_RAD_H #define _INCLUDED_L3_RAD_H // *Radial part of wavefunction - antiproton scattering* Copyright (C) Krzysztof Bosak, 2000-01-16...2000-03-31 // All rights reserved. // kbosak@box43.pl // http://www.kbosak.prv.pl #include "l3_mat5.h" #include "l3_comp.h" #include "l3_tool.h" #include double PhaseShift( double (*potential)(double), double rmax, int steps, int l, double beta, double k ) { assert(potential!=NULL); assert(rmax>=0); assert(steps>=10); assert(k>0); assert(l>=0); assert(beta!=0); const int stepsm1=steps-1; const double stepsize=rmax/steps; const double off_diag_elem=1.0/(stepsize*stepsize); int i; basearray diagonal(steps); double r=stepsize; const double diag_elem=-2.0/(stepsize*stepsize); for(i=0; i under_diagonal(stepsm1); for(i=0; i y(steps); y[0]=0; for(i=1; i=0; i--) { diagonal[i]=(y[i]-diagonal[i+1]*off_diag_elem)/diagonal[i]; } const int phase_look_index=steps-8; r=phase_look_index*stepsize; //const double deriv1=(diagonal[phase_look_index+1]-diagonal[phase_look_index-1])/(2*stepsize); const double deriv1=( (diagonal[phase_look_index-2]-diagonal[phase_look_index+2])/12+ (diagonal[phase_look_index+1]-diagonal[phase_look_index-1])*2/3 )/stepsize; return atan(static_cast(diagonal[phase_look_index]*k/deriv1))+l*_PIdiv2-k*r; } const ComplexNumber ComplexPhaseShift( const ComplexNumber (*potential)(double), double rmax, int steps, int l, double beta, double k ) { assert(potential!=NULL); assert(rmax>=0); assert(steps>=10); assert(k>0); assert(l>=0); assert(beta!=0); const int stepsm1=steps-1; const double stepsize=rmax/steps; const double off_diag_elem=1.0/(stepsize*stepsize); int i; basearray > diagonal(steps); double r=stepsize; const double diag_elem=-2.0/(stepsize*stepsize); for(i=0; i > under_diagonal(stepsm1); for(i=0; i(off_diag_elem)/diagonal[i]; diagonal[i+1]-=under_diagonal[i]*off_diag_elem; } basearray > y(steps); y[0]=0; for(i=1; i=0; i--) { diagonal[i]=(y[i]-diagonal[i+1]*off_diag_elem)/diagonal[i]; } const int phase_look_index=steps-8; r=phase_look_index*stepsize; //const ComplexNumber deriv1=(diagonal[phase_look_index+1]-diagonal[phase_look_index-1])/(2*stepsize); const ComplexNumber deriv1=( (diagonal[phase_look_index-2]-diagonal[phase_look_index+2])/12+ (diagonal[phase_look_index+1]-diagonal[phase_look_index-1])*2/3 )/stepsize; const ComplexNumber phaseshift=ComplexArcTan(diagonal[phase_look_index]*k/deriv1) +l*static_cast(3.1415926535897932384626433832795/2)-k*r; return phaseshift; } double ScatteringLength( double (*potential)(double), double rmax, int steps, double k1, double k2 ) { const double a1=PhaseShift(potential, rmax, steps, 0, 1, k1)/k1; const double a2=PhaseShift(potential, rmax, steps, 0, 1, k2)/k2; const double k21=k2/k1; return a1-(a2-a1)/(k21*k21-1); } const ComplexNumber ComplexScatteringLength( const ComplexNumber (*potential)(double), double rmax, int steps, double k1, double k2 ) { const ComplexNumber a1=ComplexPhaseShift(potential, rmax, steps, 0, 1, k1)/k1; const ComplexNumber a2=ComplexPhaseShift(potential, rmax, steps, 0, 1, k2)/k2; const ComplexNumber k21=k2/k1; return a1-(a2-a1)/(k21*k21-1); } double EnergyEigenstate( double (*func)(double), double x1, double x2, double precision ) { if(x2<=x1) { cerr<<"x2 must be >x1\n"; exit(1); } const double f1=func(x1); const double f2=func(x2); if(f2<=f1) { cerr<<"func(x2) must be >func(x1)\n"; cerr<<"f1="<