diff options
author | simulation <simulation@nlo-ext3.ioq.uni-jena.de> | 2016-02-09 09:54:46 +0100 |
---|---|---|
committer | simulation <simulation@nlo-ext3.ioq.uni-jena.de> | 2016-02-09 09:54:46 +0100 |
commit | 6be0f285adb27f60f058c2937a7885899e17cb88 (patch) | |
tree | be50a15314fe28c5b7b8f721233a34e71ca5b3b4 /fresnel/propagate.C | |
download | lpic-6be0f285adb27f60f058c2937a7885899e17cb88.tar.xz |
Diffstat (limited to 'fresnel/propagate.C')
-rw-r--r-- | fresnel/propagate.C | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/fresnel/propagate.C b/fresnel/propagate.C new file mode 100644 index 0000000..0dae533 --- /dev/null +++ b/fresnel/propagate.C @@ -0,0 +1,228 @@ +/* + This file is part of LPIC++, a particle-in-cell code for + simulating the interaction of laser light with plasma. + + Copyright (C) 1994-1997 Roland Lichters + + LPIC++ is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include <propagate.h> + + +////////////////////////////////////////////////////////////////////////////////////////// + +propagate::propagate(parameter &p) + : zeit(p) +{ + sprintf( errname, "%s/error", p.path ); + static error_handler bob("propagate::Constructor",errname); + + dt = 1.0 / p.prop.spp; + dw = 1.0 / ( p.prop.time_stop - p.prop.time_start ) / 50; + wmax = 5; + t = p.prop.time_start; + T = p.pulse.duration; + + reflex_avg = 0; + + strcpy(p.errname,errname); +} + +////////////////////////////////////////////////////////////////////////////////////////// + +void propagate::loop(parameter &p) +{ + static error_handler bob("propagate::loop",errname); + + out_int(p); // plot the integrand + + for( t = p.prop.time_start, t_avg=0; t <= p.prop.time_stop+dt; t += dt, t_avg++ ) + { + w = 0.5*dw; reflex = 0; + do + { + r = reflectivity( w, p.plasma.wp, p.pulse.angle_rad, p.pulse.polarization ); + phi = phase( w, p.plasma.wp, p.pulse.angle_rad, p.pulse.polarization ); + integrand = r * ( dif((w-1)*PI*T) - dif((w+1)*PI*T) ) * sin( w*PI*(2*t-T)-phi ); + reflex += dw * T * integrand; + + w += dw; + } + while( w<wmax ); + + out(p); // plot the flux (f(t)/f0)^2 + + reflex_avg += 2 * pow( reflex, 2 ) / p.prop.spp; + + // plot the ratio of time averaged fluxes once per period + if ( t_avg==p.prop.spp ) { out_avg(p); t_avg=0; reflex_avg=0; } + + zeit.proc(); // update clock + } + + zeit.exit(); +} + + +////////////////////////////////////////////////////////////////////////////////////////// + +double propagate::reflectivity( double w, double wp, double angle, int polarization ) +{ + static error_handler bob("propagate::reflectivity",errname); + + if (w*cos(angle)>wp) { + + double n = sqrt( 1 - pow(wp/w,2) ); + + rs = cos(angle) - sqrt( n*n-sin(angle)*sin(angle) ); + rs /= ( cos(angle) + sqrt( n*n-sin(angle)*sin(angle) ) ); + + rp = sqrt( 1-pow(sin(angle)/n,2) ) - n*cos(angle); + rp /= ( sqrt( 1-pow(sin(angle)/n,2) ) + n*cos(angle) ); + } + else { + rs = rp = 1; + } + + if (polarization==1) return rs; + else return rp; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +double propagate::phase( double w, double wp, double angle, int polarization ) +{ + static error_handler bob("propagate::phase",errname); + double brev = w*cos(angle)/wp; + + + if (brev>=1) { + + double n = sqrt( 1 - pow(wp/w,2) ); + + phis = phip = 0; + } + else { + + // from Born and Wolf, page 49 + phis = - 2 * atan( sqrt( 1-brev*brev ) / brev ); + + // from Born and Wolf, page 49 + phip = + 2 * atan( wp/w * cos(angle) * ( pow(w/wp,2)-1 ) / sqrt( 1-brev*brev ) ); + } + + if (polarization==1) return phis; + else return phip; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +double propagate::dif( double x ) +{ + static error_handler bob("propagate::dif",errname); + + if ( x==0 ) return 1; + else return sin(x)/x; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +void propagate::out( parameter &p ) +{ + static error_handler bob("propagate::out",errname); + + char filename[filename_size]; + + sprintf(filename,"%s/reflex", p.path ); + + reflex_file.open(filename,ios::app); + if (!reflex_file) bob.error( "cannot open file", filename ); + + reflex_file.precision( 3 ); + reflex_file.setf( ios::showpoint | ios::scientific ); + + reflex_file << setw(10) << t << setw(10) << pow( p.pulse.amplitude*reflex,2 ) << endl; + + reflex_file.close(); +} + +////////////////////////////////////////////////////////////////////////////////////////// + +void propagate::out_avg( parameter &p ) +{ + static error_handler bob("propagate::out_avg",errname); + + char filename[filename_size]; + + sprintf(filename,"%s/reflex-avg", p.path ); + + reflex_file_avg.open(filename,ios::app); + if (!reflex_file_avg) bob.error( "cannot open file", filename ); + + reflex_file_avg.precision( 3 ); + reflex_file_avg.setf( ios::showpoint | ios::scientific ); + + reflex_file_avg << setw(10) << t << setw(10) << reflex_avg << endl; + + reflex_file_avg.close(); +} + +////////////////////////////////////////////////////////////////////////////////////////// + +void propagate::out_int( parameter &p ) +{ + static error_handler bob("propagate::out_int",errname); + + char filename[filename_size]; + + sprintf(filename,"%s/reflex-int", p.path ); + + reflex_file_int.open(filename,ios::app); + if (!reflex_file_int) bob.error( "cannot open file", filename ); + + reflex_file_int.precision( 3 ); + reflex_file_int.setf( ios::showpoint | ios::scientific ); + + reflex_file_int << "#" + << setw(12) << "w" << setw(13) << "r(w)" + << setw(13) << "phase" + << setw(13) << "dif()" << setw(13) << "r(w)*dif()" << endl; + + w = 0; reflex = 0; + do + { + r = reflectivity( w, p.plasma.wp, p.pulse.angle_rad, p.pulse.polarization ); + phi = phase( w, p.plasma.wp, p.pulse.angle_rad, p.pulse.polarization ); + integrand = r * ( dif( (w-1)*PI*T ) - dif( (w+1)*PI*T) ); + + reflex_file_int << setw(13) << w + << setw(13) << r + << setw(13) << phi + << setw(13) << dif( (w-1)*PI*T ) - dif( (w+1)*PI*T) + << setw(13) << integrand << endl; + + w += 5*dw; + } + while( w<2 ); + + reflex_file_int.close(); +} + +////////////////////////////////////////////////////////////////////////////////////////// +//EOF + + + |