units icon indicating copy to clipboard operation
units copied to clipboard

Suggest adding two new units for molar mass and molar concentration

Open rsivek opened this issue 6 years ago • 7 comments

Currently the units::substance_unit is somewhat detached from the rest of the library (i.e. mole_t doesn't have any relationships to other units without adding custom types).

I suggest adding two new units to rectify this: molar mass and molar concentration.

My thoughts are these may be defined as follows:

units::substance_mass namespace containing molar_mass which is a compound type defined as compound_unit<mass::kilograms, substance::mole>.

and

units::substance_concentration namespace containing molar_concentration compound type defined as compound_unit<substance::moles, inverse<cubed<length::meter>>

Note that although these units are commonly expressed as g/mol and mol/L respectively, the above definitions are in accordance with their SI unit definitions.

In case you're wondering, I'm working on a physiology engine of sorts for which these units are particularly relevant. Existing physiological & pharmacological models often use these types of units (particularly molar concentration).

rsivek avatar Jul 12 '18 21:07 rsivek

Along the same lines, it may be prudent to define the molar mass constant in the units::constants namespace.

rsivek avatar Jul 12 '18 22:07 rsivek

absolutely!

Thanks for providing your use-case, it definitely helps me prioritize the direction of the library. Substance is the black sheep of the library right now since most applications have been gaming, physics, or related to spacial processing like drones/self driving vehicles. Glad to see we're moving into chemistry and life sciences too.

nholthaus avatar Jul 13 '18 17:07 nholthaus

Here's how I ended up defining things in my modified version of units.h for now.

// ...
namespace category
{
// ...
		typedef base_unit<detail::meter_ratio<0>,	std::ratio<1>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<-1>>    substance_mass_unit;			 		///< Represents an SI base unit of substance mass
		typedef base_unit<detail::meter_ratio<-3>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<0>,	std::ratio<1>>	     substance_concentration_unit;			 		///< Represents an SI base unit of substance concentration
// ...
}

// ...

	//-----------------------------------
	//	UNITS OF SUBSTANCE MASS
	//-----------------------------------

#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_SUBSTANCE_MASS_UNITS)
	UNIT_ADD(substance_mass, molar_mass, molar_mass, mol_mass, unit<std::ratio<1>, units::category::substance_mass_unit>)
	UNIT_ADD_WITH_METRIC_PREFIXES(substance_mass, gram_per_mole, grams_per_mole, g_per_mol, unit<std::ratio<1, 1000>, molar_mass>)

	UNIT_ADD_CATEGORY_TRAIT(substance_mass)
#endif

	//------------------------------------------------
	//	UNITS OF SUBSTANCE CONCENTRATION
	//------------------------------------------------

#if !defined(DISABLE_PREDEFINED_UNITS) || defined(ENABLE_PREDEFINED_SUBSTANCE_CONCENTRATION_UNITS)
	UNIT_ADD(substance_concentration, molar_concentration, molar_concentration, mol_conc, unit<std::ratio<1>, units::category::substance_concentration_unit>)
	UNIT_ADD_WITH_METRIC_PREFIXES(substance_concentration, mole_per_liter, moles_per_liter, mol_per_L, unit<std::ratio<1, 1000>, molar_concentration>)
	UNIT_ADD(substance_concentration, mole_per_milliliter, moles_per_milliliter, mol_per_mL, unit<std::ratio<1, 1000000>, molar_concentration>)
	UNIT_ADD(substance_concentration, mole_per_microliter, moles_per_microliter, mol_per_uL, unit<std::ratio<1, 1000000000>, molar_concentration>)
	UNIT_ADD(substance_concentration, mole_per_nanoliter, moles_per_nanoliter, mol_per_nL, unit<std::ratio<1, 1000000000000>, molar_concentration>)
	UNIT_ADD(substance_concentration, mole_per_picoliter, moles_per_picoliter, mol_per_pL, unit<std::ratio<1, 1000000000000000>, molar_concentration>)

	UNIT_ADD_CATEGORY_TRAIT(substance_concentration)
#endif

// ...

Matter of fact I could fork and submit pull requests for these and other units which may be helpful in the chemistry / life sciences arena in a few weeks.

I probably won't have time to do so in the near future though. I'm on crunch time to get this project completed before the end of July. Come August, however, I would be more than happy to contribute these additions to your lib if you'd like.

rsivek avatar Jul 14 '18 16:07 rsivek

@nanowizard Still want to put a PR together? I was about to incorporate this but don't want to rob you of your GitHub contributor status. Only thing to watch out for is we split each dimension into it's own header... should be easy enough to follow the pattern.

If you're not into it or don't have time, just send me a byline and I'll add a shout-out for you in the code and documentation somewhere.

Thanks again!

nholthaus avatar Sep 04 '18 22:09 nholthaus

@nholthaus thanks for putting this back on my radar. Past few months have been crazy. I'll put a PR together and try to have that to you tonight or tomorrow. :)

rsivek avatar Sep 06 '18 21:09 rsivek

thanks! No rush though

nholthaus avatar Sep 06 '18 22:09 nholthaus

Could I ask if this is going anywhere? I have just posted an issue and this looks directly relevant to that. Thanks, Andy

a-jp avatar Jul 23 '19 10:07 a-jp