a
    %łb9                     @   s   d dl Zd dlmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZmZmZ d dlmZ d dlZd dlZd dlZd dlZdZdd	 Zd d
dZG dd dZdS )    N)	saftvrmie)	BoltzmannAvogadro)quad)cpp_KineticGasbcolorssuppress_stdout)OmegaDbg-q=c                 C   s.   t t| d tkr*tdtt|   d S )N   z-Mole fractions do not sum to unity, sum(x) = )abssumFLT_EPSwarningswarnstr)x r   f/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/pykingas/py_KineticGas.pycheck_valid_composition   s    r   r
   )Zhsmiec                   @   s   e Zd Zd,dd	Zd
d Zd-ddZd.ddZd/ddZd0ddZd1ddZ	d2ddZ
d3ddZd4ddZd5ddZd6ddZd7d d!Zd"d# Zd8d$d%Zd&d' Zd(d) Zd*d+ ZdS )9py_KineticGasNr   F   additiveHSTc              	      s  t |ddkrtd|_t |ddkrB|d\}}n|}|}t|d | _|_|	_|
_|	 _
i _i _|du s|du s|du rt _||krj| nj| ||g}|du rtfdd|D }t|d t _tj_jj _j\__|_|_|_t||k |du rr fd	dtt |D }||_t j_!|du rt fd
dtt |D }"|_#|du rt fddtt |D }"|_$|du r*t fddtt |D }%|_&t j&_'j
dkrj|du rjj( \}}ng }g }t)jj&jj#j$t*j
 ||_+t)jj&jj#j$t*j
 _,j
dkr|du rt-.j/ dS )a  
        :param comps (str): Comma-separated list of components, following Thermopack-convention
        :param BH (bool) : Use Barker-Henderson diameters?

        Default parameters are equal to default parameters for saft-vr-mie (saftvrmie_parameters.f90)
        If parameters are explicitly supplied, these will be used instead of defaults
        :param mole_weights : (1D array) Molar weights [g/mol]
        :param sigma : (1D array) hard-sphere diameters [m]
        :param eps_div_k : (1D array) epsilon parameter / Boltzmann constant [-]
        :param la, lr : (1D array) attractive and repulsive exponent of the pure components [-]
        :param lij : (float) Mixing parameter for sigma (lij > 0 => smaller sigma_12, lij < 0 => larger sigma_12)
        :param kij : (float) Mixing parameter for epsilon (kij > 0 => favours mixing, kij < 0 => favours separation)
        :param default_BH : (bool) Use Barker-Henderson diameters as default?
        :param hs_mixing_rule : If "additive", sigma_12 = (1 - lij) * 0.5 * (sigma_1 + sigma_2),
                                else: Compute sigma_12 from BH using epsilon_12 and additive sigma_12
                                Only applicable if BH is True
        :param potential_mode (str) : What potential to use for collision integrals. Options are
                                        'HS' : Use hard-sphere potential
                                        'Mie' : Use Mie-potential
        :param use_db (bool) : Use precomputed database values for omega_integrals if available
        ,   z1Current implementation is only binary-compatible!r
   Nc                    s    g | ]} j  j |qS r   )eosZcompmoleweightZgetcompindex).0compselfr   r   
<listcomp>H       z*py_KineticGas.__init__.<locals>.<listcomp>gMbP?c                    s$   g | ]}j |  d  d qS )r
   r   r   get_pure_fluid_paramr   iZit_modr    r   r   r!   U   r"   c                    s$   g | ]}j |  d  d qS )r
      r#   r%   r'   r   r   r!   Z   r"   c                    s$   g | ]}j |  d  d qS )r
   r   r#   r%   r'   r   r   r!   ^   r"   c                    s$   g | ]}j |  d  d  qS )r
   r#   r%   r'   r   r   r!   b   r"   r   T)0lensplit
IndexErrorcompsr	   _py_KineticGas__omega_dbZ_py_KineticGas__using_db
default_BH	default_Nlower_py_KineticGas__potential_modecomputed_d_pointscomputed_a_pointsr   r   initnparrayr   mole_weightsr   m0MM1M2lijkijhs_mixing_ruleintrangeget_epsilon_matrix
epsilon_ijZdiagepsilonget_lambda_matrixlalrget_sigma_matrixsigma_ijsigmaZdb_to_vectorsr   potential_mode_map
cpp_kingascpp_kingas_BHatexitregisterupdate_omega_db)r    r,   r7   rI   	eps_div_krE   rF   r<   r=   BHNr>   	potentialZuse_dbZc1Zc2ZcomplistZomegapointsZ	omegavalsr   r'   r   __init__   sp    



"
"
"zpy_KineticGas.__init__c                 C   s   | j | jj | j   d S N)r-   updaterK   	omega_mapdumpr   r   r   r   rO   v   s    zpy_KineticGas.update_omega_dbc                 C   sv   |d u r| j }t| |du rb| j| j||d}t| j|| j| j| jt	| j
 | _| j|||S | j|||S d S NT)rQ   T)r/   r   rG   rI   r   r7   rB   rE   rF   rJ   r1   rL   get_A_matrixrK   r    rZ   
mole_fracsrQ   rR   sigmaijr   r   r   r[   z   s    "zpy_KineticGas.get_A_matrixc                 C   sn   |d u r| j }|du rZ| j| j||d}t| j|| j| j| jt| j	 | _
| j
|||S | j|||S d S rY   )r/   rG   rI   r   r7   rB   rE   rF   rJ   r1   rL   get_delta_vectorrK   )r    rZ   particle_densityrQ   rR   r^   r   r   r   r_      s    "zpy_KineticGas.get_delta_vectorc                 C   sv   |d u r| j }t| |du rb| j| j||d}t| j|| j| j| jt	| j
 | _| j|||S | j|||S d S rY   )r/   r   rG   rI   r   r7   rB   rE   rF   rJ   r1   rL   get_reduced_A_matrixrK   r\   r   r   r   ra      s    "z"py_KineticGas.get_reduced_A_matrixc                 C   sr   |d u r| j }|du r\| j| j||d}t| j|| j| j| jt| j	 | _
| j
||||S | j||||S d S rY   )r/   rG   rI   r   r7   rB   rE   rF   rJ   r1   rL   get_alpha_vectorrK   )r    rZ   r`   r]   rQ   rR   r^   r   r   r   rb      s    "zpy_KineticGas.get_alpha_vectorc                 C   s   |d u r| j }t| ||t|||f| j v rJ| j||t|||f S | j||||d}| j||||d}tt	t
| rtd t
dd |D }nt||}||d  || ||d    }	}
}|	|
|f| j||t|||f< |	|
|fS )NrQ   rR    A-matrix contained NAN elements!c                 S   s   g | ]
}t jqS r   r5   nanr   _r   r   r   r!      r"   z2py_KineticGas.compute_d_vector.<locals>.<listcomp>r
   )r/   r   tupler2   keysr[   r_   anyr5   isnanr6   flattenr   r   linsolve)r    rZ   r`   r]   rR   rQ   AZdeltadd_1d0d1r   r   r   compute_d_vector   s    
$zpy_KineticGas.compute_d_vectorc                 C   s   |d u r| j }t| ||t|||f| j v rJ| j||t|||f S | j||||d}| j|||||d}tt	t
| rtd t
dd |D }nt||}||d  ||  }	}
|	|
f| j||t|||f< |	|
fS )Nrc   rd   c                 S   s   g | ]
}t jqS r   re   rg   r   r   r   r!      r"   z2py_KineticGas.compute_a_vector.<locals>.<listcomp>r
   )r/   r   ri   r3   rj   ra   rb   rk   r5   rl   r6   rm   r   r   rn   ro   )r    rZ   r`   r]   rR   rQ   rp   Zalphaaa_1a1r   r   r   compute_a_vector   s    
zpy_KineticGas.compute_a_vectorc                 C   s   |d u r| j }|d u r| j}t| t| }| j|||||d\}}}	dd|   |d |	 t| jd  |d | t| jd    }
t|
|
 g}|dt| ddt|    S )NrR   rQ      r   r   r
   )	r/   r.   r   r   ru   r5   sqrtr9   r6   )r    rZ   Vmr   rR   rQ   r`   rr   rs   rt   ZkTZkT_vecr   r   r   alpha_T0   s    Fzpy_KineticGas.alpha_T0c                 C   s&   |d u r| j }| j|||||d| S )Nrz   )r/   r~   )r    rZ   r}   r   rR   rQ   r   r   r   soret   s    zpy_KineticGas.soretc           	      C   sp   |d u r| j }|d u r| j}t| t| }| j|||||d\}}}dt| tdt | | j	  | S )Nrz         ?r   )
r/   r.   r   r   ru   r5   productr|   r   r8   )	r    rZ   r}   r   rR   rQ   r`   rh   rs   r   r   r   interdiffusion   s    zpy_KineticGas.interdiffusionc           
      C   s   |d u r| j }|d u r| j}t| t| }| j|||||d\}}}	dt| tdt | | j	  |d |	 t| j
 |d | t| j   S Nrz   g      r   r   r
   )r/   r.   r   r   ru   r5   r   r|   r   r8   r:   r;   )
r    rZ   r}   r   rR   rQ   r`   rr   rh   rt   r   r   r   thermal_diffusion   s    $.zpy_KineticGas.thermal_diffusionc           	      C   s   |d u r| j }|d u r| j}t| t| }| j|||||d\}}dt | tdt | | j  |d | t| j	 |d | t| j
   S r   )r/   r.   r   r   ry   r   r5   r|   r8   r:   r;   )	r    rZ   r}   r   rR   rQ   r`   rw   rx   r   r   r   thermal_conductivity   s    ".z"py_KineticGas.thermal_conductivityc                 C   sF   t |t }t d| jt dt d   t |t |  S )Nr   r   r   )r5   r6   r   onesr=   identityr|   vstack)r    rP   r=   rC   r   r   r   rA     s    z py_KineticGas.get_epsilon_matrixc                    s   |du rj }tdjtdtd   d tjt|t|dd |rt fddt	t
D |d	krdd
 d    d< d< n|dkrntdt| S S dS )a  
        Get Barker-Henderson diameters for each pair of particles.
        Using Lorentz-Berthleot rules for combining Mie-parameters for each pair of particles

        :param sigma: (1D array) hard sphere diameters [m]
        :return: N x N matrix of hard sphere diameters, where sigma_ij = 0.5 * (sigma_i + sigma_j),
                such that the diagonal is the diameter of each component, and off-diagonals are the cross-collision distances.
        Nr   r   r   r   )Zaxisc                    s,   g | ]$  fd dt tD qS )c                    sZ   g | ]R}t jd |f |f j|f j|f j|f  fdd  qS )r   )args)r   BH_integrandrB   rE   rF   r%   )rZ   jr    rH   r   r   r!     s   z=py_KineticGas.get_sigma_matrix.<locals>.<listcomp>.<listcomp>)r@   r)   )r   rZ   r    rH   )r   r   r!     s   
z2py_KineticGas.get_sigma_matrix.<locals>.<listcomp>r   )r   r   )r
   r
   )r   r
   )r
   r   znon-additivez<hs_mixing_rule must be 'additive' or 'non-additive' but was )r>   r5   r   r<   r   r   Zmeshgridr   r6   r@   r)   KeyErrorr   )r    rI   rQ   rZ   r>   r   r   r   rG     s    	D
"zpy_KineticGas.get_sigma_matrixc              
   C   s&   dt | ||||| |t   S )Nr
   )r5   Zexpu_Mier   )r    rrI   rC   lambda_alambda_rrZ   r   r   r   r   (  s    zpy_KineticGas.BH_integrandc                 C   s@   |||  || |||    }|| || | || |   S rU   r   )r    r   rI   rC   r   r   Cr   r   r   r   +  s     zpy_KineticGas.u_Miec                 C   s*   t |}dt |d t |d   S )Nr(   )r5   r6   r|   r   )r    Zlambdaslr   r   r   rD   /  s    
zpy_KineticGas.get_lambda_matrix)NNNNNr   r   Fr   r   r   T)FN)FN)FN)FN)NF)NF)NN)NN)NN)NN)NN)FNN)__name__
__module____qualname__rT   rO   r[   r_   ra   rb   ru   ry   r~   r   r   r   r   rA   rG   r   r   rD   r   r   r   r   r      s.        
b













r   )numpyr5   pyctpr   Zscipy.linalgZlinalgrn   Zscipy.constantsr   r   Zscipy.integrater   pykingasr   r   r   Zpykingas.OmegaDbr	   r   systimerM   r   r   rJ   r   r   r   r   r   <module>   s    
