rl_Multilayer.cc
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <rl_Multilayer.h>
00029
00030 #include <cstdio>
00031 #include <cstddef>
00032 #include <cmath>
00033 #include <mathconst/mathconst.h>
00034
00035 #include <rl_DielectricData.h>
00036 #include <rl_DielectricLayer.h>
00037 #include <rl_ReflectionCoefPOD.h>
00038
00039 using namespace std;
00040
00041
00042
00043
00044
00045 rl_Multilayer::
00046 ~rl_Multilayer()
00047 {
00048 if ( own_data_ && layer_ ) { delete [] layer_; }
00049 }
00050
00051
00052 rl_Multilayer::
00053 rl_Multilayer( int num_layers,
00054 rl_DielectricLayer* layers,
00055 rl_Traits::Bool adopt_data )
00056 : num_layers_(num_layers),
00057 vacuum_( "vacuum" ),
00058 layer_(layers),
00059 own_data_(adopt_data)
00060 {}
00061
00062
00063 void rl_Multilayer::
00064 init( int num_layers,
00065 rl_DielectricLayer* layers,
00066 rl_Traits::Bool adopt_data )
00067 {
00068 if ( own_data_ && layer_ ) { delete [] layer_; }
00069 num_layers_ = num_layers;
00070 layer_ = layers;
00071 own_data_ = adopt_data;
00072 }
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 int
00089 rl_Multilayer::
00090 multilayer_reflect_coef( rl_ReflectionCoefPOD& rfl,
00091 double energy,
00092 double sinphi )
00093 {
00094 vacuum_.setup_for( energy, sinphi );
00095
00096 int rc = 0;
00097 int n;
00098 for ( n = 0 ; n < num_layers_ ; ++n )
00099 {
00100 rc = layer_[n].setup_for( energy, sinphi );
00101 if ( rc )
00102 {
00103 rc = n+1;
00104 break;
00105 }
00106 }
00107
00108 if (! rc )
00109 {
00110
00111
00112
00113
00114 layer_[0].reflect_amp( vacuum_, sinphi );
00115
00116 for ( n = 1 ; n < num_layers_ ; ++n )
00117 {
00118 layer_[n].reflect_amp( layer_[n-1], sinphi );
00119 }
00120
00121
00122
00123
00124 layer_->reflect_nlayer( layer_, num_layers_ );
00125 }
00126 else
00127 {
00128 cerr << "Problem setting up layer " << (rc-1) << endl;
00129 }
00130 rfl = layer_[0].reflection_coef();
00131
00132 return rc;
00133 }
00134
00135 int rl_Multilayer::
00136 multilayer_reflectivity(
00137 double& rfl,
00138 double energy,
00139 double sg,
00140 double polarization_factor
00141 )
00142 {
00143 rl_ReflectionCoefPOD rflcoef;
00144 rflcoef.init();
00145 int rc = multilayer_reflect_coef( rflcoef, energy, sg );
00146 rfl = rflcoef.reflectivity( polarization_factor );
00147
00148 return rc;
00149 }
00150
00151
00152
00153
00154
00155 rl_DielectricLayer const& rl_Multilayer::
00156 layer( int layer_no ) const
00157 { return layer_[layer_no]; }
00158
00159
00160
00161
00162
00163 std::ostream& rl_Multilayer::
00164 dump_on( std::ostream& os, int layer_no,
00165 char const pre[],
00166 char const pst[] ) const
00167 {
00168 if ( strlen(pre) )
00169 { os << pre; }
00170
00171 layer_[layer_no].dump_on( os, pre, pst );
00172
00173 if ( strlen(pst) )
00174 { os << pst; }
00175
00176 return os;
00177 }
00178
00179
00180 void rl_Multilayer::
00181 cdump_on( std::FILE* of, int layer_no,
00182 char const pre[],
00183 char const pst[] ) const
00184 {
00185 if ( strlen(pre) )
00186 { fprintf(of, "%s", pre); }
00187
00188 layer_[layer_no].cdump_on( of, "", "" );
00189
00190 if ( strlen(pst) )
00191 { fprintf(of, "%s", pst); }
00192 }