a
    B^bK                     @   s:   d dl mZ d dlmZ d dlZd dlZG dd dZdS )    )	saftvrmie)minimizeNc                   @   sV   e Zd ZdddZdd Zdd	 ZdddZdddZdddZdddZ	dd Z
dS )NumericSoret皙?     @@   c                 C   s,   t   | _| j| || _|| _|| _dS )zn
        :param comps:
        :param dT:
        :param nT:
        :param bulb_ratio: r = V_A / V_B
        N)r   eosinitdTnT
bulb_ratio)selfcompsr
   r   r    r   K/Users/vegardjervell/Documents/master/model/kempers_V2/numeric_minimizer.py__init__   s
    
zNumericSoret.__init__c                 C   s<   | j |  | j |  | j |  | j |  d S N)r   model_control_chainmodel_control_a3model_control_a2model_control_a1)r   valr   r   r   set_HS   s    zNumericSoret.set_HSc                 C   sZ   | j | | _|d| j  | _|d| j  | _| j| j | jd  | _| j| jd  | _d S )N      ?r   )r   Vr
   T_AT_Br   V_AV_B)r   Trhor   r   r   set_bulb_values   s
    zNumericSoret.set_bulb_valuespc                    sT   || j|   fdd} fdd} fdd} fdd} fd	d
}	 fdd}
 fdd}|dkrd|d}nP|dkrd|	d}n<|dkrdtddtdf}n|du rd}ntdt|  dj  dj  }t|||tdd  D |d}|j	}|j
du rPtdt| d t| d t|  |S )z
        :param T:
        :param rho:
        :param x:
        :param constraint: Can be 'p' for equal pressure, 'V' for equal volume, 'V_bulb' for both volumes equal to V_bulb
        :return:
        c                    sL    |  d } |  d }j jj|\}j jj|\}|| S N   )r   helmholtz_tvr   r   r   r   )dnnAnBhelmholtz_Ahelmholtz_Bnr   r   r   	Helmholtz-   s
    z&NumericSoret.get_dn.<locals>.Helmholtzc                    sN    |  d } |  d }j jj|\}j jj|\}| | S r#   r   chemical_potential_tvr   r   r   r   )r&   r'   r(   mu_Amu_Br+   r   r   Helmholtz_jacobian6   s
    z/NumericSoret.get_dn.<locals>.Helmholtz_jacobianc                    sZ    |  d } |  d }j jjj|dd\}}j jjj|dd\}}| | S )Nr$   T)dmudnr.   )r&   r'   r(   _ZdmuAdnZdmuBdnr+   r   r   Helmholtz_hessian?   s
    z.NumericSoret.get_dn.<locals>.Helmholtz_hessianc                    sL    |  d } |  d }j jj|\}j jj|\}|| S r#   )r   pressure_tvr   r   r   r   )r&   r'   r(   pApBr+   r   r   equal_pressure_conditionH   s
    z5NumericSoret.get_dn.<locals>.equal_pressure_conditionc                    sd    |  d } |  d }j jjttddd\}}j jjttddd\}}t|| ||  S Nr$   r   Tdvdn)r   specific_volumer   r"   xAr   xBsum)r&   r'   r(   r4   vAvBr+   r   r   equal_volume_conditionO   s
    z3NumericSoret.get_dn.<locals>.equal_volume_conditionc                    s:    |  d }j jjttddd\}}t|| j S r:   )r   r=   r   r"   r>   r@   r   )r&   r'   r4   rA   r+   r   r   bulb_volume_condition_AV   s    z4NumericSoret.get_dn.<locals>.bulb_volume_condition_Ac                    s:    |  d }j jjttddd\}}t|| j S r:   )r   r=   r   r"   r?   r@   r   )r&   r(   r4   rB   r+   r   r   bulb_volume_condition_B[   s    z4NumericSoret.get_dn.<locals>.bulb_volume_condition_Br"   eq)typefunr   V_bulbNz=Constraint must be either 'p', 'V', 'V_bulb' or None but was r   c                 s   s   | ]}| |fV  qd S r   r   ).0Znir   r   r   	<genexpr>n       z&NumericSoret.get_dn.<locals>.<genexpr>)jacx0boundsconstraintsFz5Numeric minimizer did not converge for (T, rho, x) = z, )r!   r   Zequal_volume_condition_AZequal_volume_condition_BKeyErrorstrr   r   tuplexsuccesswarningswarn)r   r   r    rT   
constraintr-   r2   r5   r9   rC   rD   rE   rP   Z
init_guesssolr&   r   r+   r   get_dn!   s8    	
			*zNumericSoret.get_dnc                 C   sT   | j | }| j||||d}|| d }|| d }|t| }	|t| }
|
|	 S )NrX   r$   )r   rZ   r@   )r   r   r    rT   rX   r,   r&   r'   r(   r>   r?   r   r   r   get_dxu   s    
zNumericSoret.get_dxc                 C   s*   | j ||||d}| |d|  | j  S )Nr[   r   )r\   r
   )r   r   r    rT   rX   dxr   r   r   	get_Soret~   s    zNumericSoret.get_Soretc                 C   s   | j ||||d}| j| }|  |||}|| d }|| d }|t| }	|t| }
d| j| j| j|d | j| j| j|d   S )Nr[   r$   r   r   )	rZ   r   r@   r   r6   r   r   r   r   )r   r   r    rT   rX   r&   r,   r'   r(   r>   r?   r   r   r   get_pressure   s    
zNumericSoret.get_pressurec                 C   s\  |  || | j| }| |||}|| d }|| d }|t| }|t| }	| j| j| j|\}
| j| j| j	|\}| j
| j| j|\}| j
| j| j	|\}d||  }| jj| j||ddd\}}| jj| j||	ddd\}}|
d d | j |d d | j  |d d |d d  |d |d   |
d | j |d | j    }|S )Nr$   r   r   Tr;   )r!   r   rZ   r@   r   r/   r   r   r   r   r6   r=   )r   r   r    rT   r,   r&   r'   r(   r>   r?   r0   r1   r7   r8   r"   r4   rA   rB   eq_setr   r   r   kempers89_condition   s     
hz NumericSoret.kempers89_conditionN)r   r   r   )r"   )r"   )r"   )r"   )__name__
__module____qualname__r   r   r!   rZ   r\   r^   r_   rb   r   r   r   r   r      s   

T
	


r   )pyctpr   scipy.optimizer   numpynprV   r   r   r   r   r   <module>   s   