00001
00005 #pragma once
00006
00007 #include <usml/types/data_grid.h>
00008
00009 namespace usml {
00010 namespace ocean {
00011
00014
00057 class data_grid_mackenzie {
00058
00059 public:
00060
00061
00062
00063
00074 static data_grid<double,3>* construct(
00075 const data_grid<double,3>* temperature,
00076 const data_grid<double,3>* salinity,
00077 bool clean_up=true )
00078 {
00079 data_grid<double,3>* ssp = new data_grid<double,3>(*temperature,false) ;
00080 ssp->interp_type(0,GRID_INTERP_PCHIP) ;
00081 ssp->interp_type(1,GRID_INTERP_LINEAR) ;
00082 ssp->interp_type(2,GRID_INTERP_LINEAR) ;
00083
00084 size_t index[3] ;
00085 for ( index[0]=0 ; index[0] < temperature->axis(0)->size() ; ++index[0] ) {
00086 for ( index[1]=0 ; index[1] < temperature->axis(1)->size() ; ++index[1] ) {
00087 for ( index[2]=0 ; index[2] < temperature->axis(2)->size() ; ++index[2] ) {
00088
00089
00090
00091 double D = wposition::earth_radius -
00092 (*temperature->axis(0))[ index[0] ] ;
00093 double T = temperature->data( index ) ;
00094 double S = salinity->data( index ) ;
00095
00096
00097
00098 double c = 1448.96 + 4.591 * T - 5.304e-2 * T*T
00099 + 2.374e-4 * T*T*T
00100 + ( 1.340 - 1.025e-2 * T ) * ( S - 35.0 )
00101 + 1.630e-2 * D + 1.675e-7 * D*D
00102 - 7.139e-13 * T * D*D*D ;
00103
00104 ssp->data( index, c ) ;
00105 }
00106 }
00107 }
00108 if( clean_up ) {
00109 delete temperature ;
00110 delete salinity ;
00111 }
00112 return ssp ;
00113 }
00114
00115 };
00116
00118 }
00119 }