def get_SoR(self, T, raise_error=True, raise_warning=True, **kwargs): """Calculate the dimensionless entropy Parameters ---------- T : float or (N,) `numpy.ndarray`_ Temperature(s) in K raise_error : bool, optional If True, raises an error if any of the modes do not have the quantity of interest. Default is True raise_warning : bool, optional Only relevant if raise_error is False. Raises a warning if any of the modes do not have the quantity of interest. Default is True kwargs : key-word arguments Arguments to calculate mixture model properties, if any Returns ------- SoR : float or (N,) `numpy.ndarray`_ Dimensionless entropy .. _`numpy.ndarray`: https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.ndarray.html """ if _is_iterable(T): SoR = np.zeros_like(T) for i, T_i in enumerate(T): a = self.get_a(T=T_i) SoR[i] = get_nasa_SoR(a=a, T=T_i) \ + np.sum(_get_mix_quantity(mix_models=self.mix_models, method_name='get_SoR', raise_error=raise_error, raise_warning=raise_warning, default_value=0., T=T_i, **kwargs)) else: a = self.get_a(T=T) SoR = get_nasa_SoR(a=a, T=T) \ + np.sum(_get_mix_quantity(mix_models=self.mix_models, method_name='get_SoR', raise_error=raise_error, raise_warning=raise_warning, default_value=0., T=T, **kwargs)) return SoR
def get_CpoR(self, T, raise_error=True, raise_warning=True, **kwargs): """Calculate the dimensionless heat capacity Parameters ---------- T : float or (N,) `numpy.ndarray`_ Temperature(s) in K raise_error : bool, optional If True, raises an error if any of the modes do not have the quantity of interest. Default is True raise_warning : bool, optional Only relevant if raise_error is False. Raises a warning if any of the modes do not have the quantity of interest. Default is True kwargs : key-word arguments Arguments to calculate mixture model properties, if any Returns ------- CpoR : float or (N,) `numpy.ndarray`_ Dimensionless heat capacity .. _`numpy.ndarray`: https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.ndarray.html """ # Convert T to 1D numpy format if not _is_iterable(T): T = [T] T = np.array(T) # Calculate pure properties CpoR = get_shomate_CpoR(a=self.a, T=T) # Calculate mixing properties for T_i in T: CpoR_mix = _get_mix_quantity(mix_models=self.mix_models, method_name='get_CpoR', raise_error=raise_error, raise_warning=raise_warning, default_value=0., T=T_i, **kwargs) # Add mixing quantity in appropriate format if len(T) == 1: CpoR += CpoR_mix[0] else: CpoR += CpoR_mix return CpoR
def get_quantity(self, method_name, raise_error=True, raise_warning=True, operation='sum', verbose=False, **kwargs): """Generic method to get any quantity from modes. Parameters ---------- method_name : str Name of method to use to calculate quantity. Calculates any quantity as long as the relevant objects have the same method name raise_error : bool, optional If True, raises an error if any of the modes do not have the quantity of interest. Default is True raise_warning : bool, optional Only relevant if raise_error is False. Raises a warning if any of the modes do not have the quantity of interest. Default is True operation : str, optional Operation to apply when combining the modes. Supported options include: - sum (Default) - prod verbose : bool, optional If False, returns the total Gibbs energy. If True, returns contribution of each mode. kwargs : key-word arguments Parameters passed to each mode Returns ------- quantity : float or (N+5,) `numpy.ndarray`_ Desired quantity. N represents the number of mixing models. If verbose is True, contribution to each mode are as follows: [trans, vib, rot, elec, nucl, mixing_models (if any)] .. _`numpy.ndarray`: https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.ndarray.html """ # Get the default value operation = operation.lower() if operation == 'sum': default_value = 0. elif operation == 'prod': default_value = 1. else: raise ValueError('Operation: {} not supported'.format(operation)) # Calculate the quantity for each mode specie_kwargs = _get_specie_kwargs(specie_name=self.name, **kwargs) quantity = np.array([ _get_mode_quantity(mode=self.trans_model, method_name=method_name, raise_error=raise_error, raise_warning=raise_warning, default_value=default_value, **specie_kwargs), _get_mode_quantity(mode=self.vib_model, method_name=method_name, raise_error=raise_error, raise_warning=raise_warning, default_value=default_value, **specie_kwargs), _get_mode_quantity(mode=self.rot_model, method_name=method_name, raise_error=raise_error, raise_warning=raise_warning, default_value=default_value, **specie_kwargs), _get_mode_quantity(mode=self.elec_model, method_name=method_name, raise_error=raise_error, raise_warning=raise_warning, default_value=default_value, **specie_kwargs), _get_mode_quantity(mode=self.nucl_model, method_name=method_name, raise_error=raise_error, raise_warning=raise_warning, default_value=default_value, **specie_kwargs) ]) # Calculate contribution from mixing models if any mix_quantity = _get_mix_quantity(mix_models=self.mix_models, method_name=method_name, raise_error=raise_error, raise_warning=raise_warning, default_value=default_value, verbose=verbose, **kwargs) # Add mixing quantities onto quantity quantity = np.concatenate([quantity, mix_quantity]) quantity = _apply_numpy_operation(quantity, verbose=verbose, operation=operation) return quantity