/*******************************************************************************
* This file is part of SWIFT.
* Copyright (c) 2012 Matthieu Schaller (schaller@strw.leidenuniv.nl).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
******************************************************************************/
#ifndef SWIFT_UNITS_H
#define SWIFT_UNITS_H
/* Config parameters. */
#include
/* Local includes. */
#include "parser.h"
/**
* @brief The unit system used internally.
*
* This structure contains the conversion factors to the 5 cgs base units to the
* internal units. It is used everytime a conversion is performed or an i/o
* function is called.
**/
struct unit_system {
/*! Conversion factor from grams to internal mass units */
double UnitMass_in_cgs;
/*! Conversion factor from centimeters to internal length unit */
double UnitLength_in_cgs;
/*! Conversion factor from seconds to internal time units */
double UnitTime_in_cgs;
/*! Conversion factor from Ampere to internal current units */
double UnitCurrent_in_cgs;
/*! Conversion factor from Kelvins to internal temperature units. */
double UnitTemperature_in_cgs;
};
/**
* @brief The base units used in the cgs (and internal) system. All units are
* derived from those.
*/
enum base_units {
UNIT_MASS = 0,
UNIT_LENGTH = 1,
UNIT_TIME = 2,
UNIT_CURRENT = 3,
UNIT_TEMPERATURE = 4
};
/**
* @brief The different conversion factors supported by default
*/
enum unit_conversion_factor {
UNIT_CONV_NO_UNITS,
UNIT_CONV_MASS,
UNIT_CONV_LENGTH,
UNIT_CONV_TIME,
UNIT_CONV_DENSITY,
UNIT_CONV_NUMBER_DENSITY,
UNIT_CONV_SPEED,
UNIT_CONV_VELOCITY,
UNIT_CONV_ACCELERATION,
UNIT_CONV_POTENTIAL,
UNIT_CONV_MOMENTUM,
UNIT_CONV_ANGULAR_MOMENTUM,
UNIT_CONV_FORCE,
UNIT_CONV_TIDAL_TENSOR,
UNIT_CONV_ENERGY,
UNIT_CONV_ENERGY_PER_UNIT_MASS,
UNIT_CONV_ENERGY_VELOCITY,
UNIT_CONV_ENTROPY,
UNIT_CONV_ENTROPY_PER_UNIT_MASS,
UNIT_CONV_PHYSICAL_ENTROPY_PER_UNIT_MASS,
UNIT_CONV_POWER,
UNIT_CONV_PRESSURE,
UNIT_CONV_FREQUENCY,
UNIT_CONV_FREQUENCY_SQUARED,
UNIT_CONV_ELECTRIC_CHARGE,
UNIT_CONV_ELECTRIC_VOLTAGE,
UNIT_CONV_ELECTRIC_CAPACITANCE,
UNIT_CONV_ELECTRIC_RESISTANCE,
UNIT_CONV_ELECTRIC_CONDUCTANCE,
UNIT_CONV_MAGNETIC_FLUX,
UNIT_CONV_MAGNETIC_FIELD,
UNIT_CONV_MAGNETIC_FIELD_PER_TIME,
UNIT_CONV_MAGNETIC_FIELD_SQUARED,
UNIT_CONV_MAGNETIC_DIVERGENCE,
UNIT_CONV_MAGNETIC_CURL,
UNIT_CONV_MAGNETIC_INDUCTANCE,
UNIT_CONV_MAGNETIC_HELICITY,
UNIT_CONV_MAGNETIC_CROSS_HELICITY,
UNIT_CONV_MAGNETIC_FIELD_VECTOR_POTENTIAL,
UNIT_CONV_ELECTRIC_CHARGE_FIELD_STRENGTH,
UNIT_CONV_ELECTRIC_CHARGE_FIELD_STRENGTH_RATE,
UNIT_CONV_TEMPERATURE,
UNIT_CONV_AREA,
UNIT_CONV_VOLUME,
UNIT_CONV_INV_VOLUME,
UNIT_CONV_SFR,
UNIT_CONV_SSFR,
UNIT_CONV_DIFF_RATE,
UNIT_CONV_DIFF_COEFF,
UNIT_CONV_MASS_PER_UNIT_TIME,
UNIT_CONV_VELOCITY_SQUARED,
UNIT_CONV_INV_TIME,
UNIT_CONV_INV_AREA,
UNIT_CONV_RADIATION_FLUX,
UNIT_CONV_ENERGY_FLUX_PER_UNIT_SURFACE,
UNIT_CONV_ENERGY_FLUX_DENSITY,
UNIT_CONV_ENERGY_DENSITY,
UNIT_CONV_POWER_DENSITY,
UNIT_CONV_GASOLINE_DIFF_RATE,
UNIT_CONV_THERMAL_DIFFUSIVITY,
UNIT_CONV_NUMBER_DENSITY_PER_TIME,
UNIT_CONV_PHOTONS_PER_TIME,
UNIT_CONV_PHOTON_FLUX_PER_UNIT_SURFACE,
};
void units_init_cgs(struct unit_system*);
void units_init_si(struct unit_system*);
void units_init(struct unit_system* us, double U_M_in_cgs, double U_L_in_cgs,
double U_t_in_cgs, double U_C_in_cgs, double U_T_in_cgs);
void units_init_from_params(struct unit_system*, struct swift_params*,
const char* category);
void units_init_default(struct unit_system* us, struct swift_params* params,
const char* category, const struct unit_system* def);
void units_copy(struct unit_system* dest, const struct unit_system* src);
int units_are_equal(const struct unit_system* a, const struct unit_system* b);
/* Base units */
double units_get_base_unit(const struct unit_system*, enum base_units);
const char* units_get_base_unit_internal_symbol(enum base_units);
const char* units_get_base_unit_cgs_symbol(enum base_units);
void units_get_base_unit_exponents_array(float baseUnitsExp[5],
enum unit_conversion_factor unit);
/* Cosmology factors */
float units_general_h_factor(const struct unit_system* us,
const float baseUnitsExponents[5]);
float units_h_factor(const struct unit_system* us,
enum unit_conversion_factor unit);
/* Conversion to CGS */
double units_general_cgs_conversion_factor(const struct unit_system* us,
const float baseUnitsExponents[5]);
double units_cgs_conversion_factor(const struct unit_system* us,
enum unit_conversion_factor unit);
void units_general_cgs_conversion_string(char* buffer,
const struct unit_system* us,
const float baseUnitsExponents[5],
float scale_factor_exponent);
void units_cgs_conversion_string(char* buffer, const struct unit_system* us,
enum unit_conversion_factor unit,
float scale_factor_exponent);
/* Conversion between systems */
double units_general_conversion_factor(const struct unit_system* from,
const struct unit_system* to,
const float baseUnitsExponents[5]);
double units_conversion_factor(const struct unit_system* from,
const struct unit_system* to,
enum unit_conversion_factor unit);
void units_print(const struct unit_system* us);
/* Dump/restore. */
void units_struct_dump(const struct unit_system* us, FILE* stream);
void units_struct_restore(const struct unit_system* us, FILE* stream);
#endif /* SWIFT_UNITS_H */