00001
00005 #pragma once
00006
00007 #include <usml/ocean/reflect_loss_constant.h>
00008 #include <usml/ocean/scattering_constant.h>
00009
00010 namespace usml {
00011 namespace ocean {
00012
00013 using boost::numeric::ublas::vector;
00014
00017
00058 class USML_DECLSPEC boundary_model : public reflect_loss_model, scattering_model {
00059
00060
00061
00062
00063 public:
00064
00074 virtual void height( const wposition& location,
00075 matrix<double>* rho, wvector* normal=NULL, bool quick_interp=false ) = 0 ;
00076
00086 virtual void height( const wposition1& location,
00087 double* rho, wvector1* normal=NULL, bool quick_interp=false ) = 0 ;
00088
00089
00090
00091
00097 void reflect_loss( reflect_loss_model* reflect_loss ) {
00098 if ( _reflect_loss ) delete _reflect_loss ;
00099 _reflect_loss = reflect_loss ;
00100 }
00101
00111 virtual void reflect_loss(
00112 const wposition1& location,
00113 const seq_vector& frequencies, double angle,
00114 vector<double>* amplitude, vector<double>* phase=NULL )
00115 {
00116 _reflect_loss->reflect_loss( location,
00117 frequencies, angle, amplitude, phase ) ;
00118 }
00119
00120
00121
00122
00128 void scattering( scattering_model* scattering ) {
00129 if( _scattering ) delete _scattering ;
00130 _scattering = scattering ;
00131 }
00132
00144 virtual void scattering( const wposition1& location,
00145 const seq_vector& frequencies, double de_incident, double de_scattered,
00146 double az_incident, double az_scattered, vector<double>* amplitude )
00147 {
00148 _scattering->scattering( location,
00149 frequencies, de_incident, de_scattered,
00150 az_incident, az_scattered, amplitude ) ;
00151 }
00152
00168 virtual void scattering( const wposition& location,
00169 const seq_vector& frequencies, double de_incident, matrix<double> de_scattered,
00170 double az_incident, matrix<double> az_scattered, matrix< vector<double> >* amplitude )
00171 {
00172 _scattering->scattering( location,
00173 frequencies, de_incident, de_scattered,
00174 az_incident, az_scattered, amplitude ) ;
00175 }
00176
00177
00178
00179
00186 boundary_model( reflect_loss_model* reflect_loss=NULL,
00187 scattering_model* scattering=NULL )
00188 {
00189 if ( reflect_loss ) {
00190 _reflect_loss = reflect_loss ;
00191 } else {
00192 _reflect_loss = new reflect_loss_constant( 0.0, 0.0 ) ;
00193 }
00194 if ( scattering ) {
00195 _scattering = scattering ;
00196 } else {
00197 _scattering = new scattering_constant() ;
00198 }
00199 }
00200
00204 virtual ~boundary_model() {
00205 if ( _reflect_loss ) delete _reflect_loss ;
00206 if ( _scattering ) delete _scattering ;
00207 }
00208
00209 private:
00210
00212 reflect_loss_model* _reflect_loss ;
00213
00215 scattering_model* _scattering ;
00216
00217 };
00218
00220 }
00221 }