20 #include "UnitConversionFactory.hpp"
21 #include "sbml/UnitKind.h"
28 unsigned int UnitConversionFactory::SBML_LEVEL = 2;
33 unsigned int UnitConversionFactory::SBML_VERSION = 1;
40 std::vector<std::string> UnitConversionFactory::usedIds = std::vector<std::string>();
53 UnitDefinition* UnitConversionFactory::convertToSI(
const Unit& unit)
55 UnitDefinition* pUdef = NULL;
58 if (!unit.isSetKind())
return pUdef;
60 UnitKind_t uKind = unit.getKind();
64 case UNIT_KIND_AMPERE:
65 pUdef = convertAmpereToSI(unit);
68 case UNIT_KIND_BECQUEREL:
70 pUdef = convertFrequencyToSI(unit);
73 case UNIT_KIND_CANDELA:
74 pUdef = convertCandelaToSI(unit);
77 case UNIT_KIND_CELSIUS:
78 pUdef = convertCelsiusToSI(unit);
81 case UNIT_KIND_COULOMB:
82 pUdef = convertCoulombToSI(unit);
85 case UNIT_KIND_DIMENSIONLESS:
87 case UNIT_KIND_RADIAN:
88 case UNIT_KIND_STERADIAN:
89 pUdef = convertDimensionlessToSI(unit);
93 pUdef = convertFaradToSI(unit);
98 pU->setScale(pU->getScale() - 3);
99 pU->setKind(UNIT_KIND_KILOGRAM);
100 pUdef = convertKilogramToSI(*pU);
105 case UNIT_KIND_SIEVERT:
106 pUdef = convertDoseToSI(unit);
109 case UNIT_KIND_HENRY:
110 pUdef = convertHenryToSI(unit);
113 case UNIT_KIND_JOULE:
114 pUdef = convertJouleToSI(unit);
117 case UNIT_KIND_KATAL:
118 pUdef = convertKatalToSI(unit);
121 case UNIT_KIND_KELVIN:
122 pUdef = convertKelvinToSI(unit);
125 case UNIT_KIND_KILOGRAM:
126 pUdef = convertKilogramToSI(unit);
129 case UNIT_KIND_LITER:
130 case UNIT_KIND_LITRE:
132 pU->setKind(UNIT_KIND_METER);
133 pU->setExponent(pU->getExponent()*3);
134 pU->setScale(pU->getScale() - 3);
135 pUdef = convertMeterToSI(*pU);
139 case UNIT_KIND_LUMEN:
140 pUdef = convertLumenToSI(unit);
144 pUdef = convertLuxToSI(unit);
147 case UNIT_KIND_METER:
148 case UNIT_KIND_METRE:
149 pUdef = convertMeterToSI(unit);
153 #if LIBSBML_VERSION >= 40100
156 case UNIT_KIND_AVOGADRO:
157 #endif // LIBSBML_VERSION
158 pUdef = convertMoleToSI(unit);
161 case UNIT_KIND_NEWTON:
162 pUdef = convertNewtonToSI(unit);
166 pUdef = convertOhmToSI(unit);
169 case UNIT_KIND_PASCAL:
170 pUdef = convertPascalToSI(unit);
173 case UNIT_KIND_SECOND:
174 pUdef = convertSecondToSI(unit);
177 case UNIT_KIND_SIEMENS:
178 pUdef = convertSiemensToSI(unit);
181 case UNIT_KIND_TESLA:
182 pUdef = convertTeslaToSI(unit);
186 pUdef = convertVoltToSI(unit);
190 pUdef = convertWattToSI(unit);
193 case UNIT_KIND_WEBER:
194 pUdef = convertWeberToSI(unit);
197 case UNIT_KIND_INVALID:
205 unsigned int num = 1;
206 std::stringstream ss;
207 ss <<
"UnitDefinition_" << num;
209 while (!UnitConversionFactory::isIdUnused(ss.str()))
213 ss <<
"UnitDefinition_" << num;
216 std::string
id = ss.str();
217 usedIds.push_back(
id);
219 UnitKind_t uKind = unit.getKind();
220 pUdef->setName(UnitKind_toString(uKind));
237 UnitDefinition* UnitConversionFactory::convertAmpereToSI(
const Unit& unit)
239 UnitKind_t uKind = unit.getKind();
241 if (uKind != UNIT_KIND_AMPERE)
return NULL;
243 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
244 Unit* pU =
new Unit(unit);
262 UnitDefinition* UnitConversionFactory::convertFrequencyToSI(
const Unit& unit)
264 UnitKind_t uKind = unit.getKind();
266 if (uKind != UNIT_KIND_HERTZ && uKind != UNIT_KIND_BECQUEREL)
return NULL;
268 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
269 Unit* pU =
new Unit(unit);
270 pU->setKind(UNIT_KIND_SECOND);
272 pU->setExponent(-1*pU->getExponent());
287 UnitDefinition* UnitConversionFactory::convertCandelaToSI(
const Unit& unit)
289 UnitKind_t uKind = unit.getKind();
291 if (uKind != UNIT_KIND_CANDELA)
return NULL;
293 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
294 Unit* pU =
new Unit(unit);
312 UnitDefinition* UnitConversionFactory::convertCelsiusToSI(
const Unit& unit)
314 UnitKind_t uKind = unit.getKind();
316 if (uKind != UNIT_KIND_CELSIUS)
return NULL;
318 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
319 Unit* pU =
new Unit(unit);
320 pU->setKind(UNIT_KIND_KELVIN);
338 UnitDefinition* UnitConversionFactory::convertCoulombToSI(
const Unit& unit)
340 UnitKind_t uKind = unit.getKind();
342 if (uKind != UNIT_KIND_COULOMB)
return NULL;
344 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
345 Unit* pU =
new Unit(unit);
346 pU->setKind(UNIT_KIND_AMPERE);
350 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
351 pU->setKind(UNIT_KIND_SECOND);
352 pU->setExponent(unit.getExponent());
369 UnitDefinition* UnitConversionFactory::convertDimensionlessToSI(
const Unit& unit)
371 UnitKind_t uKind = unit.getKind();
373 if (uKind != UNIT_KIND_DIMENSIONLESS && uKind != UNIT_KIND_ITEM && uKind != UNIT_KIND_RADIAN && uKind != UNIT_KIND_STERADIAN)
return NULL;
375 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
376 Unit* pU =
new Unit(unit);
377 pU->setKind(UNIT_KIND_DIMENSIONLESS);
395 UnitDefinition* UnitConversionFactory::convertFaradToSI(
const Unit& unit)
397 UnitKind_t uKind = unit.getKind();
399 if (uKind != UNIT_KIND_FARAD)
return NULL;
401 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
402 Unit* pU =
new Unit(unit);
404 pU->setKind(UNIT_KIND_AMPERE);
405 pU->setExponent(2*unit.getExponent());
408 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
409 pU->setKind(UNIT_KIND_KILOGRAM);
410 pU->setExponent(-1*unit.getExponent());
413 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
414 pU->setKind(UNIT_KIND_METER);
415 pU->setExponent(-2*unit.getExponent());
418 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
419 pU->setKind(UNIT_KIND_SECOND);
420 pU->setExponent(4*unit.getExponent());
437 UnitDefinition* UnitConversionFactory::convertKilogramToSI(
const Unit& unit)
439 UnitKind_t uKind = unit.getKind();
441 if (uKind != UNIT_KIND_KILOGRAM)
return NULL;
443 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
444 Unit* pU =
new Unit(unit);
463 UnitDefinition* UnitConversionFactory::convertDoseToSI(
const Unit& unit)
465 UnitKind_t uKind = unit.getKind();
467 if (uKind != UNIT_KIND_GRAM && uKind != UNIT_KIND_SIEVERT)
return NULL;
469 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
470 Unit* pU =
new Unit(unit);
472 pU->setKind(UNIT_KIND_METER);
473 pU->setExponent(2*unit.getExponent());
476 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
477 pU->setKind(UNIT_KIND_SECOND);
478 pU->setExponent(-2*unit.getExponent());
495 UnitDefinition* UnitConversionFactory::convertHenryToSI(
const Unit& unit)
497 UnitKind_t uKind = unit.getKind();
499 if (uKind != UNIT_KIND_HENRY)
return NULL;
501 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
502 Unit* pU =
new Unit(unit);
504 pU->setKind(UNIT_KIND_AMPERE);
505 pU->setExponent(-2*unit.getExponent());
508 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
509 pU->setKind(UNIT_KIND_KILOGRAM);
510 pU->setExponent(unit.getExponent());
513 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
514 pU->setKind(UNIT_KIND_METER);
515 pU->setExponent(2*unit.getExponent());
518 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
519 pU->setKind(UNIT_KIND_SECOND);
520 pU->setExponent(-2*unit.getExponent());
537 UnitDefinition* UnitConversionFactory::convertJouleToSI(
const Unit& unit)
539 UnitKind_t uKind = unit.getKind();
541 if (uKind != UNIT_KIND_JOULE)
return NULL;
543 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
544 Unit* pU =
new Unit(unit);
546 pU->setKind(UNIT_KIND_KILOGRAM);
547 pU->setExponent(unit.getExponent());
550 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
551 pU->setKind(UNIT_KIND_METER);
552 pU->setExponent(2*unit.getExponent());
555 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
556 pU->setKind(UNIT_KIND_SECOND);
557 pU->setExponent(-2*unit.getExponent());
574 UnitDefinition* UnitConversionFactory::convertKatalToSI(
const Unit& unit)
576 UnitKind_t uKind = unit.getKind();
578 if (uKind != UNIT_KIND_KATAL)
return NULL;
580 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
581 Unit* pU =
new Unit(unit);
583 pU->setKind(UNIT_KIND_MOLE);
584 pU->setExponent(unit.getExponent());
587 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
588 pU->setKind(UNIT_KIND_SECOND);
589 pU->setExponent(-1*unit.getExponent());
606 UnitDefinition* UnitConversionFactory::convertKelvinToSI(
const Unit& unit)
608 UnitKind_t uKind = unit.getKind();
610 if (uKind != UNIT_KIND_KELVIN)
return NULL;
612 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
613 Unit* pU =
new Unit(unit);
631 UnitDefinition* UnitConversionFactory::convertLumenToSI(
const Unit& unit)
633 UnitKind_t uKind = unit.getKind();
635 if (uKind != UNIT_KIND_LUMEN)
return NULL;
637 Unit* pU =
new Unit(unit);
638 pU->setKind(UNIT_KIND_CANDELA);
639 UnitDefinition* pUdef = convertCandelaToSI(*pU);
655 UnitDefinition* UnitConversionFactory::convertLuxToSI(
const Unit& unit)
657 UnitKind_t uKind = unit.getKind();
659 if (uKind != UNIT_KIND_LUX)
return NULL;
661 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
662 Unit* pU =
new Unit(unit);
663 pU->setKind(UNIT_KIND_CANDELA);
667 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
668 pU->setKind(UNIT_KIND_METER);
669 pU->setExponent(-2*unit.getExponent());
686 UnitDefinition* UnitConversionFactory::convertMeterToSI(
const Unit& unit)
688 UnitKind_t uKind = unit.getKind();
690 if (uKind != UNIT_KIND_METER)
return NULL;
692 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
693 Unit* pU =
new Unit(unit);
711 UnitDefinition* UnitConversionFactory::convertMoleToSI(
const Unit& unit)
713 UnitKind_t uKind = unit.getKind();
715 if (uKind != UNIT_KIND_MOLE)
return NULL;
717 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
718 Unit* pU =
new Unit(unit);
736 UnitDefinition* UnitConversionFactory::convertNewtonToSI(
const Unit& unit)
738 UnitKind_t uKind = unit.getKind();
740 if (uKind != UNIT_KIND_NEWTON)
return NULL;
742 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
743 Unit* pU =
new Unit(unit);
745 pU->setKind(UNIT_KIND_KILOGRAM);
748 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
749 pU->setKind(UNIT_KIND_METER);
750 pU->setExponent(unit.getExponent());
753 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
754 pU->setKind(UNIT_KIND_SECOND);
755 pU->setExponent(-2*unit.getExponent());
772 UnitDefinition* UnitConversionFactory::convertOhmToSI(
const Unit& unit)
774 UnitKind_t uKind = unit.getKind();
776 if (uKind != UNIT_KIND_OHM)
return NULL;
778 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
779 Unit* pU =
new Unit(unit);
781 pU->setKind(UNIT_KIND_AMPERE);
782 pU->setExponent(-2*unit.getExponent());
785 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
786 pU->setKind(UNIT_KIND_KILOGRAM);
787 pU->setExponent(unit.getExponent());
790 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
791 pU->setKind(UNIT_KIND_METER);
792 pU->setExponent(2*unit.getExponent());
795 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
796 pU->setKind(UNIT_KIND_SECOND);
797 pU->setExponent(-3*unit.getExponent());
814 UnitDefinition* UnitConversionFactory::convertPascalToSI(
const Unit& unit)
816 UnitKind_t uKind = unit.getKind();
818 if (uKind != UNIT_KIND_PASCAL)
return NULL;
820 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
821 Unit* pU =
new Unit(unit);
822 pU->setKind(UNIT_KIND_KILOGRAM);
826 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
827 pU->setKind(UNIT_KIND_METER);
828 pU->setExponent(-1*unit.getExponent());
831 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
832 pU->setKind(UNIT_KIND_SECOND);
833 pU->setExponent(-2*unit.getExponent());
850 UnitDefinition* UnitConversionFactory::convertSecondToSI(
const Unit& unit)
852 UnitKind_t uKind = unit.getKind();
854 if (uKind != UNIT_KIND_SECOND)
return NULL;
856 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
857 Unit* pU =
new Unit(unit);
875 UnitDefinition* UnitConversionFactory::convertSiemensToSI(
const Unit& unit)
877 UnitKind_t uKind = unit.getKind();
879 if (uKind != UNIT_KIND_SIEMENS)
return NULL;
881 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
882 Unit* pU =
new Unit(unit);
884 pU->setKind(UNIT_KIND_AMPERE);
885 pU->setExponent(2*unit.getExponent());
888 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
889 pU->setKind(UNIT_KIND_KILOGRAM);
890 pU->setExponent(-1*unit.getExponent());
893 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
894 pU->setKind(UNIT_KIND_METER);
895 pU->setExponent(-2*unit.getExponent());
898 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
899 pU->setKind(UNIT_KIND_SECOND);
900 pU->setExponent(3*unit.getExponent());
917 UnitDefinition* UnitConversionFactory::convertTeslaToSI(
const Unit& unit)
919 UnitKind_t uKind = unit.getKind();
921 if (uKind != UNIT_KIND_TESLA)
return NULL;
923 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
924 Unit* pU =
new Unit(unit);
926 pU->setKind(UNIT_KIND_AMPERE);
927 pU->setExponent(-1*unit.getExponent());
930 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
931 pU->setKind(UNIT_KIND_KILOGRAM);
932 pU->setExponent(unit.getExponent());
935 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
936 pU->setKind(UNIT_KIND_SECOND);
937 pU->setExponent(-2*unit.getExponent());
954 UnitDefinition* UnitConversionFactory::convertVoltToSI(
const Unit& unit)
956 UnitKind_t uKind = unit.getKind();
958 if (uKind != UNIT_KIND_VOLT)
return NULL;
960 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
961 Unit* pU =
new Unit(unit);
963 pU->setKind(UNIT_KIND_AMPERE);
964 pU->setExponent(-1*unit.getExponent());
967 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
968 pU->setKind(UNIT_KIND_KILOGRAM);
969 pU->setExponent(unit.getExponent());
972 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
973 pU->setKind(UNIT_KIND_METER);
974 pU->setExponent(2*unit.getExponent());
977 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
978 pU->setKind(UNIT_KIND_SECOND);
979 pU->setExponent(-3*unit.getExponent());
996 UnitDefinition* UnitConversionFactory::convertWattToSI(
const Unit& unit)
998 UnitKind_t uKind = unit.getKind();
1000 if (uKind != UNIT_KIND_WATT)
return NULL;
1002 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
1003 Unit* pU =
new Unit(unit);
1005 pU->setKind(UNIT_KIND_KILOGRAM);
1006 pU->setExponent(unit.getExponent());
1009 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
1010 pU->setKind(UNIT_KIND_METER);
1011 pU->setExponent(2*unit.getExponent());
1014 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
1015 pU->setKind(UNIT_KIND_SECOND);
1016 pU->setExponent(-3*unit.getExponent());
1033 UnitDefinition* UnitConversionFactory::convertWeberToSI(
const Unit& unit)
1035 UnitKind_t uKind = unit.getKind();
1037 if (uKind != UNIT_KIND_WATT)
return NULL;
1039 UnitDefinition* pUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
1040 Unit* pU =
new Unit(unit);
1042 pU->setKind(UNIT_KIND_AMPERE);
1043 pU->setExponent(-1*unit.getExponent());
1046 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
1047 pU->setKind(UNIT_KIND_KILOGRAM);
1048 pU->setExponent(unit.getExponent());
1051 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
1052 pU->setKind(UNIT_KIND_METER);
1053 pU->setExponent(2*unit.getExponent());
1056 pU =
new Unit(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
1057 pU->setKind(UNIT_KIND_SECOND);
1058 pU->setExponent(-2*unit.getExponent());
1144 UnitDefinition* UnitConversionFactory::combine(
const UnitDefinition& uDef1,
const UnitDefinition& uDef2)
1149 UnitDefinition* pResult =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
1150 unsigned int maxUnits = uDef1.getNumUnits();
1153 for (i = 0; i < maxUnits; ++i)
1155 const Unit* pSrcUnit = uDef1.getUnit(i);
1156 unsigned int maxUnits2 = pResult->getNumUnits();
1158 bool exists =
false;
1160 for (j = 0; j < maxUnits2; ++j)
1162 Unit* pResultUnit = pResult->getUnit(j);
1164 if (pResultUnit->getKind() == pSrcUnit->getKind())
1169 if (pResultUnit->getOffset() != pSrcUnit->getOffset())
1175 pResultUnit->setMultiplier(pResultUnit->getMultiplier()*pSrcUnit->getMultiplier()*pow(10.0, pResultUnit->getScale() - pSrcUnit->getScale()));
1176 pResultUnit->setExponent(pResultUnit->getExponent() + pSrcUnit->getExponent());
1181 if (pResultUnit->getExponent() == 0)
1183 pResultUnit->setKind(UNIT_KIND_DIMENSIONLESS);
1190 Unit* tmpUnit =
new Unit(*pSrcUnit);
1191 pResult->addUnit(tmpUnit);
1196 maxUnits = uDef2.getNumUnits();
1198 for (i = 0; i < maxUnits; ++i)
1200 const Unit* pSrcUnit = uDef2.getUnit(i);
1201 unsigned int maxUnits2 = pResult->getNumUnits();
1203 bool exists =
false;
1205 for (j = 0; j < maxUnits2; ++j)
1207 Unit* pResultUnit = pResult->getUnit(j);
1209 if (pResultUnit->getKind() == pSrcUnit->getKind())
1214 if (pResultUnit->getOffset() != pSrcUnit->getOffset())
1220 pResultUnit->setMultiplier(pResultUnit->getMultiplier()*pSrcUnit->getMultiplier()*pow(10.0, pResultUnit->getScale() - pSrcUnit->getScale()));
1221 pResultUnit->setExponent(pResultUnit->getExponent() + pSrcUnit->getExponent());
1226 if (pResultUnit->getExponent() == 0)
1228 pResultUnit->setKind(UNIT_KIND_DIMENSIONLESS);
1235 Unit* tmpUnit =
new Unit(*pSrcUnit);
1236 pResult->addUnit(tmpUnit);
1241 UnitDefinition* pTmp = UnitConversionFactory::eliminateDimensionless(pResult);
1261 UnitDefinition* UnitConversionFactory::eliminateDimensionless(UnitDefinition* pUdef)
1263 unsigned int maxUnits = pUdef->getNumUnits();
1264 UnitDefinition* pTmpUdef = NULL;
1270 double multiplier = 1.0;
1272 pTmpUdef =
new UnitDefinition(UnitConversionFactory::SBML_LEVEL, UnitConversionFactory::SBML_VERSION);
1274 while (i < maxUnits)
1276 pU =
new Unit(*(pUdef->getUnit(i)));
1278 if (pU->getKind() != UNIT_KIND_DIMENSIONLESS)
1280 pTmpUdef->addUnit(pU);
1285 scale = scale + pU->getScale();
1286 multiplier = multiplier * pU->getMultiplier();
1293 i = pTmpUdef->getNumUnits();
1295 if (i > 0 && i < maxUnits)
1297 pTmpUdef->setName(pUdef->getName());
1298 pTmpUdef->setId(pUdef->getId());
1299 pU = pTmpUdef->getUnit(0);
1300 pU->setScale(pU->getScale() + scale);
1301 pU->setMultiplier(pU->getMultiplier()*multiplier);
1324 UnitDefinition* UnitConversionFactory::convertToSI(
const UnitDefinition& uDef)
1328 UnitDefinition* pResult = NULL;
1329 UnitDefinition* pTmpDef = NULL;
1331 unsigned int maxUnits = uDef.getNumUnits();
1335 pTmpDef = UnitConversionFactory::convertToSI(*(uDef.getUnit(0)));
1338 for (i = 1; i < maxUnits; ++i)
1340 UnitDefinition* pTmpDef2 = UnitConversionFactory::convertToSI(*(uDef.getUnit(i)));
1341 pResult = UnitConversionFactory::combine(*pTmpDef, *pTmpDef2);
1346 if (!pResult)
break;
1367 bool UnitConversionFactory::areEquivalent(
const UnitDefinition& uDef1,
const UnitDefinition& uDef2)
1369 bool equivalent =
true;
1370 UnitDefinition* pTmpUdef1 = UnitConversionFactory::convertToSI(uDef1);
1371 UnitDefinition* pTmpUdef2 = UnitConversionFactory::convertToSI(uDef2);
1373 if (pTmpUdef1 && pTmpUdef2)
1375 unsigned int maxUnits = pTmpUdef1->getNumUnits();
1377 if (maxUnits == pTmpUdef2->getNumUnits())
1383 for (i = 0; i < maxUnits; ++i)
1385 Unit* pUnit1 = pTmpUdef1->getUnit(i);
1386 Unit* pUnit2 = pTmpUdef2->getUnit(i);
1388 if (pUnit1->getKind() != pUnit2->getKind())
1394 if (pUnit1->getExponent() != pUnit2->getExponent())
1427 bool UnitConversionFactory::areEqual(
const UnitDefinition& uDef1,
const UnitDefinition& uDef2)
1430 UnitDefinition* pTmpUdef1 = UnitConversionFactory::convertToSI(uDef1);
1431 UnitDefinition* pTmpUdef2 = UnitConversionFactory::convertToSI(uDef2);
1433 if (pTmpUdef1 && pTmpUdef2)
1435 unsigned int maxUnits = pTmpUdef1->getNumUnits();
1437 if (maxUnits == pTmpUdef2->getNumUnits())
1443 for (i = 0; i < maxUnits; ++i)
1445 Unit* pUnit1 = pTmpUdef1->getUnit(i);
1446 Unit* pUnit2 = pTmpUdef2->getUnit(i);
1448 if (pUnit1->getKind() != pUnit2->getKind())
1454 if (pUnit1->getExponent() != pUnit2->getExponent())
1460 if (pUnit1->getScale() != pUnit2->getScale())
1495 bool UnitConversionFactory::convertValue(
double *value,
const UnitDefinition& srcUdef,
const UnitDefinition& destUdef)
1497 bool success =
true;
1499 if (UnitConversionFactory::areEquivalent(srcUdef, destUdef))
1501 UnitDefinition* pTmpUdef1 = UnitConversionFactory::convertToSI(srcUdef);
1502 UnitDefinition* pTmpUdef2 = UnitConversionFactory::convertToSI(destUdef);
1504 double factor = pTmpUdef1->getUnit(0)->getMultiplier() / pTmpUdef2->getUnit(0)->getMultiplier();
1505 int scaleDiff = pTmpUdef1->getUnit(0)->getScale() - pTmpUdef2->getUnit(0)->getScale();
1506 factor = factor * pow(10.0, scaleDiff);
1507 *value = (*value) * factor;
1527 bool UnitConversionFactory::containsOnlyGivenUnits(
const UnitDefinition& uDef,
const ListOf& unitList)
1530 UnitDefinition* pTmpUdef = UnitConversionFactory::convertToSI(uDef);
1535 unsigned int maxUnits = pTmpUdef->getNumUnits();
1537 for (i = 0; i < maxUnits; ++i)
1539 Unit* pU = pTmpUdef->getUnit(i);
1540 UnitKind_t kind = pU->getKind();
1542 unsigned int maxUnits2 = unitList.size();
1545 for (j = 0; j < maxUnits2; ++j)
1547 const Unit* pU2 =
dynamic_cast<const Unit*
>(unitList.get(j));
1551 if (pU2->getKind() == kind)
1582 bool UnitConversionFactory::isIdUnused(
const std::string&
id)
1586 size_t maxIds = usedIds.size();
1588 for (i = 0; i < maxIds; ++i)
1590 if (
id == usedIds[i])
1607 std::string UnitConversionFactory::toString(
const UnitDefinition& uDef)
1609 unsigned int maxUnits = uDef.getNumUnits();
1611 std::stringstream ss;
1613 for (i = 0; i < maxUnits; ++i)
1615 ss <<
"(" << UnitConversionFactory::toString(*(uDef.getUnit(i))) <<
") ";
1628 std::string UnitConversionFactory::toString(
const Unit& unit)
1630 double multiplier = unit.getMultiplier();
1631 double offset = unit.getOffset();
1632 int scale = unit.getScale();
1633 int exponent = unit.getExponent();
1634 UnitKind_t kind = unit.getKind();
1635 std::stringstream ss;
1636 ss << multiplier <<
" * (" << UnitKind_toString(kind) <<
" * 10^" << scale <<
" + " << offset <<
")^" << exponent;
1643 unsigned int UnitConversionFactory::getSBMLLevel()
1651 unsigned int UnitConversionFactory::getSBMLVersion()
1653 return SBML_VERSION;
1659 void UnitConversionFactory::setSBMLLevel(
unsigned int level)
1667 void UnitConversionFactory::setSBMLVersion(
unsigned int version)
1669 SBML_VERSION = version;