Boost logo

Boost Users :

Subject: [Boost-users] [units][ublas] how would i use typedef in units?
From: David Carricajo (david.carricajo_at_[hidden])
Date: 2009-10-08 09:58:23


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.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net