Hi,
Using units and ublas for new code is great, but how about using both in legacy code? I’ve got some legacy numerical code using primitive types, i plan to use units for some reasons, i.e. to check performance using both primitive types and boost::units types, and to check my code at compile time which is its whole purpose after all. I spent a day and my code it’s already broken, specially because of the initializations and ublas, some self-explanatory code follows:
----- calculations.hpp -----------
//typedefs to get library-free code
#include <complex>
#include <iostream>
#if USING_BOOST_UNITS
#include <boost/typeof/std/complex.hpp>
#include <boost/units/systems/si/power.hpp>
//...
using namespace boost::units;
using namespace boost::units::si;
using namespace std;
typedef std::complex<double> complex_type;
typedef quantity<electric_potential,complex_type> tPotencial;
typedef quantity<current,complex_type> tIntensidad;
typedef quantity<resistance,complex_type> tResistancia;
//...
#elif
typedef double tPotencial;
typedef double tIntensidad;
typedef double tResistancia;
//...
#endif
------------------------------------------
----- some_legacy_calculations.cpp ------
#define USING_BOOST_UNITS
tPotencial tension = complex_type(12.5,0.0)*volts; //ok
tPotencial tension2 = complex_type(12.5,0.0); //auch!
some_file << tesion + tension2 << std::endl;
some_file.close();
//get Real part from 'tension' and pretend it's a current
quantity<current, double> phony_tension = tension.value().real * amperes;//compiler doesn't complain, but how do I prevent this to compile?
#undef USING_BOOST_UNITS
tPotencial tension = complex_type(12.5,0.0)*volts; //auch!
tPotencial tension2 = complex_type(12.5,0.0); //ok
some_file.open("/*some_file*/");
some_file >> tesion + tension2 >> std::endl; //auch!
#define USING_BOOST_UNITS
//use ublas
ublas::matrix<tAdmitancia, ublas::column_major> admi(2, 2);
ublas::matrix<tPotencia, ublas::column_major> ind(2, 1);
ind(0, 0) = complex_type (1, 0)*volts;
ind(1, 0) = complex_type (-1, 0)*volts;
admi(0, 0) = complex_type (0, -2)*siemens;
admi(0, 1) = complex_type (0, 2)*siemens;
admi(1, 0) = complex_type (0, 2)*siemens;
admi(1, 1) = complex_type (0, -2)*siemens;
int er = lapack::gesv(admi, ind);//auch!
------------------------------------------
For each of those problems i found some workaround but I'd like to discuss whether it's ok or not.
Thanks for your time.