o
    [Yb                    @   s  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
mZ d dlmZ d dlmZmZmZmZ d dlZd dlmZ dZdZd	Zd
ZdZdZdZee Zee Zde Z dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dd Z*dd Z+dd Z,dd Z-dd Z.dd  Z/d!d" Z0d#d$ Z1d%d& Z2dId)d*Z3dId+d,Z4dJd-d.Z5dJd/d0Z6d1d2 Z7G d3d4 d4e8Z9G d5d6 d6e8Z:G d7d8 d8e8Z;G d9d: d:e8Z<G d;d< d<e8Z=G d=d> d>e8Z>G d?d@ d@e8Z?G dAdB dBe8Z@G dCdD dDe8ZAdEdF ZBeCdGkreDdH dS dS )K    )print_functiondivisionabsolute_import)rangeN)interp1d)read_nc)MLUTLUTIdxread_mlut_hdf5gkHc2@g-C<@g oG@ggK҅Dg:#@g;  @g^t0;      ?geWѧ?gn#@g7̉Zwk?gP#@linearg     [@c                 C   sB   |   }|  }|dr|   }|  }|ds| | d S )N#)tellreadline
startswithseek)fpostmp r   f/Users/jing/Downloads/radiative_transfer_demo/ARTDECO/artdeco/pyartdeco/f2py_utils/pyartdeco_runlib.pyskipcomment;   s   

r   c                 C   s    t | } t | |  }|S )N)npasarrayabsargmin)arrayvalueidxr   r   r   find_nearestE   s   
r    c                 C   s(   t ddt t |   }| | | | S N   rdryeps)Z	d_kgperkgtemppaphumrmoistr   r   r   get_densL      r*   c                 C   s(   t ddt t |   }| | | | S r!   r#   )Zwcr&   r'   r(   r)   r   r   r   get_massratioT   r+   r,   c                 C   s   |dv rdt d|d d  d  |d d  d d   }n|dkr;dt d|d d  d  |d d  d d   }|d d  |d d   | d d   }|| d	 }|S 
Nliquidliq	cn@QE1@fffffq@皙m@iceQk6@fffffq@      Y@r   exp)ptuairuh2ophaseppsppvrhr   r   r   get_rh_   s   42$rC   c                 C   s   |dv rdt d|d d  d  |d d  d d   }n|dkr;dt d|d d  d  |d d  d d   }|| d	 }|d d  | | d d   }|S r-   r9   )r;   r<   r=   rB   r?   r@   rA   ur   r   r   get_u_from_rhi   s   42rE   c                 C   s   |d d  |d d   | d d   }|| d }|dv r2t |d d dt |d   d }|S |dkrJt |d d d	t |d   d }|S )
Nr8   r.   r1   r4   r2   r3   r5   r7   r6   )r   log)r;   rB   r=   r>   r?   rA   r@   r<   r   r   r   get_t_from_rh_us   s   $((rG   c                 C   s   | dd|   S Nr   ư>r   ppmvh2o_ppmv_moistr   r   r   moist_to_dry_ppmv      rM   c                 C   s   | dd|   S rH   r   rJ   r   r   r   dry_to_moist_ppmv   rN   rO   FTc                 C   sJ   |r| dd|    }n| }dt  t | }d|d  }|s#|d|  }|S )Nr   rI       .Ar"   mairmh2o)Zh2o_Z	h2o_moistZ	hum_moisth2oar(   r   r   r   get_hum   s   rV   c                 C   sJ   |r| ddt |   }n| }|d d|  t t }|s#|d|  }|S )Nr   rI   rP   )get_h2o_ppmv_moistmo3rR   )Zo3_r(   Zo3_moistZ	ozo_moisto3ozor   r   r   get_ozo   s   r[   c                 C   s4   d|  d|   t  t }|dd|   }|r|S |S NrP   r   rI   rQ   )r(   dryZh2o_ppmv_dryrL   r   r   r   rW      
   rW   c                 C   s4   d|  d|  t  t }|dd|   }|r|S |S r\   )rR   rX   )rZ   r(   rL   r]   Zozo_ppmv_dryZozo_ppmv_moistr   r   r   get_o3_ppmv_moist   r^   r_   c              	   C   sR  dt  d }td td  t }d| d t  d| t  d  }t d| t   d }	ttd | t| tj d d |t| tj d d    }
|
d	 }td|t| tj d d   |	dt| tj d  t| tj d  d    }|
d
|  }t	|}t	|}t	|}t	|}t	|}dt
 dt  }|d d  ||d d    |d d < |||t|d    }t	|}tt|d D ]}|| ||d   ||< q|t|d  | |t|d < t|d }||  |||   t|||   ||< |d |d| |   d||  d |  }|dkr1|t| d ||< nd}|d ||< tt|d ddD ]]}||  ||d  ||   t||d  ||   ||< |d d||d   d| d||d      d||  d |  }|dkr|t| d ||< qCd}|d ||< qC|d |d fS )Nr   g       @     @@      @g      1@g      ,@g       @     f@g     @@gMb`?r8   r"           MbP?g0.++   )flattomegaeqradgraver   sqrtsinpicos
zeros_likergcrR   lenr   rF   )latr&   r'   psurf	elevationqZdflatfacbetaetaZrearthZrlhZgravlZgravh_rZ	int_dmairdmairZppwZztempZhgplcZ
dmair_surfdpZilevr   r   r   	calc_hgpl   sF   % FX




$
 ,,
<D
r|   c                   @   s*   e Zd ZdZddg dfddZdd ZdS )	solar_irradiance
    noneasciic                 C   s  || _ dd }|jdkr<|dkr>d| _|dkrtj|rt|d}t| | }t	|
 d | _t| | }t|
 d | _t| jd	 | _d
dg}	t| j| _t| j| _t| t| jD ]}
| }t	|
 d | j|
< t	|
 d	 | j|
< qj|  d| _t|dkrt|| _| j|d	  | _| j|d	  | _| j|d	  | _nstd td| t  nf|dkr%d| _t|d}t|d d | _t|d d | _|d d jd | _ |  t| j| _t| jd	 | _d| _t|dkr%t|| _| j|d	  | _| j|d	  | _| j|d	  | _|| jd d  s@td td t  d S d S d S d S )Nc                 S      t | d d | dd  kS Nrf   r"   r   allrU   r   r   r   <lambda>       z+solar_irradiance.__init__.<locals>.<lambda>kdisr   Fr   rr   r"   wlr   Tz(solar_spectrum) ERRORz                 Missing file:h5_kdisdefcentral_wvlsolradZsolspecrf   z solrad ERRORz8          wavelengths must be sorted in increasing order)
solar_specmodeZkdis_solradospathisfileopenr   r   floatsplitZkdis_solrad_solcsteintkdis_solrad_nwvlr   arangekdis_solrad_channelszeroskdis_solrad_wvlkdis_solrad_F0r   closerq   printexith5pyFilecopyattrs)self
artdeco_in	file_pathfile_formatchannel_listr   	is_sortedr   r   namesiwvlffr   r   r   __init__  sl   





9zsolar_irradiance.__init__c              	   C   sv   d|vr9g }t |D ]\}}|tt|| jk q
t|}t|| _| j| | _| j	| | _	| j
| | _
d S )Nrf   )	enumerateappendr   squeezeargwherer   r   rq   r   r   r   r   Z	list_chanZind_chanZichanchanr   r   r   select_chan_solrada  s   

z#solar_irradiance.select_chan_solradN)__name__
__module____qualname____doc__r   r   r   r   r   r   r}     s    Fr}   c                   @   s   e Zd ZdddZdS )ptcle_optical_propertiesr   FTc	                 C   sL  t |dkrdS t |dkrtd td td t  g | _g | _tt |D ]B}	||	 d | jvrI| j||	 d  | j||	 d  q)| j| j||	 d  ||	 d krktd td	 td
 t  q)t | j| _|| _	t
|| _|| _|| _dg| j | _dg| j | _dg| j | _|| _dg| j | _dg| j | _dg| j | _t| jD ]+}	|rtd| j|	 d | j|	 dd dvrtd t  q| j|	 }
tj|
std td td|
 t  t|
d}| j|	 | vrtd td td| j|	 d|
 t  || j|	  }d}g d}|rM|d d jd dkrGtd td td td t  |g d }d|d  v r[|d d |d  v ri|d  d!|d  v rw|d! d"|d  v rd#}|d" |d$ |r|d d jd | j|	< |   t!|
|| j|	 d%d&}|j"d' t
|j"d' k# rtd td td(|
 t  t$|j"d' |d }t$|j"d' |d) }|j"d' | |d kr|dkr|d) }|j"d' | |d) k r|t |j"d' d) kr|d) }d't%||d) i}| js=| j	|j"d' vr=td td td*|
 td+ t  n| j	|j"d' v rPd't&| j	d%d,i}nd't&| j	i}|r| j|j"d- vrxtd td td.|
 td/ t  n|'d-t&| jd%d,i |d0 (|| j|	< |rtd | j|	 )  d|v r|d (|| j|	< d |v r|d  (|| j|	< d!|v r|d! (|| j|	< |(|| j|	< |rtd | j|	 )  qt| jD ]>}	|	|krqt
*| j| j"d1 | j|	 j"d1 s"|rtd2| j|	 d | j|	 (d1t&| j| j"d1 i| j|	< qdS )3a          
        ptcle_type_list : list of dictionnary
                          e.g. ptcle = [{"name":, "file_path":}
                                        {"name":, "file_path":}]

        wl  : is a wavelength interval
              all optical properties found in the given file 
              will be loaded for wavelengths falling in this interval
              e.g [0.70, 0.80]        

        wlref : the reference wavelength for the opacity
        r   Nre   z(optical_properties) ERRORz1                     wl is a wavelength interval z2                     It must be [wvl_min, wvl_max]namer   z=                     Same ptcle_name with different opt_path z                     rf   z#

(optical_propertie) read opt for 
.)h5Zhdf5z'(optical_propertie) format must be HDF5 z(optical_propertie) ERROR            Missing file:r   z           Missing particle z	 in file    )Cextsingle_scattering_albedop11_phase_functionp44_phase_functionp21_phase_functionp34_phase_functiondataalpha1_betalZ
truncationdmK           pyARTDECO only suited for DeltaM truncated optical prop. library)r   alpha2_betalalpha3_betalalpha4_betalbeta1_betalbeta2_betalrecomposed_p11_phase_functionrecomposed_p22_phase_functionrecomposed_p33_phase_functionrecomposed_p44_phase_functionrecomposed_p21_phase_functionrecomposed_p34_phase_functiontruncation_coefficientintegrate_p11_recompZextinction_coefficient_over_wcZ"extinction_coefficient_over_dry_acZ#extinction_coefficient_over_rh80_acp22_phase_function   p33_phase_functionT)groupZlazywavelengthszG           Wavelength axe should be sorted in increasing order in file r"   z@          Required reference wavelength value is not sampled in '          and no interpolation allowed roundnbetalz4          Required -nbetal- value is not sampled in 
          r   muz0

(optical_propertie) angular interpolation for )+rq   r   r   	type_namer   r   r   indexntypewlrefr   sortr   r   
opt_interptrunc_methodcext_reflambopt
read_betalZSext_o_wc_reflambZSext_o_dry_ac_reflambZSext_o_rh80_ac_reflambr   r   r   r   r   r   keysr   getdecoder   r   axesr   r    slicer
   updatesubZ
print_infoarray_equal)r   Zptcle_type_listr   r   r   Zind_ref_angr   verboser   ifilenamer   r   nelemZls_datasetsmZiwvl1Ziwvl2sub_lut_dicsub_reflamb_dicr   r   r   r   s  s   &






 
"0





&*z!ptcle_optical_properties.__init__N)r   FFT)r   r   r   r   r   r   r   r   r   q  s    r   c                   @   s   e Zd Zdd ZdddZdS )	particlec                    s  t |dkrd| _dS t || _dd |D | _tdd |D | _dg| j | _j| _j| _dd |D | _	t
| j| _t
| j| _t| jD ]p}| j	| dvrmtd	 td
 td| j	|  td t  | j	| dv r~|| d | j|< nd| j|< | j	| dv rd||  vrtd td	 td td|| d  td t  || d | j|< qMd| j|< qMd| j	v r0d}|D ]}|d dkrt |d |krt |d }qtj| jdd| _t| j|f| _t| j|f| _t| jD ]0}|| d dkr/t || d | j|< || d | j|ddf< || d | j|ddf< qg | _t| jD ]
}| j| jvrWtd td	 td| j|  t  tt| j| tjk j  jd }t |}tt fddt|D }	tj|t j  jd td}
td|f}td t|
|f}i }i }g d!}|D ]}|j  d" jv rc|||  vrtd td	 td#|d$|| d  t  | js|| | j  j| vrtd td	 td%|d& td' t|| |  tj  j|  t  q|| | j  j| v rI| |t!|| | d(d)i | |t!|| | d(d)i q| |t!|| | i | |t!|| | i qd*d j  j"D }t | dkrj#  $|j"}nj#  j"}t | dkrgj  d+ $|j"|dddf< j  d, $|j"|d-ddf< d.|d/ddf< j  d" $|j"|dddddf< j  d0 $|j"|dddddf< j  d1 $|j"|d2ddddf< j  d3 $|j"|d4ddddf< d5|v r<d }j  d5 $|j"|d-ddddf< j  d6 $|j"|d/ddddf< nd2}|dddddf |d-ddddf< |dddddf |d/ddddf< nj  d+ j"|dddf< j  d, j"|d-ddf< d.|d/ddf< j  d" j"|dddddf< j  d0 j"|dddddf< j  d1 j"|d2ddddf< j  d3 j"|d4ddddf< d5|v rd }j  d5 j"|d-ddddf< j  d6 j"|d/ddddf< n*d2}|dddddf |d-ddddf< |dddddf |d/ddddf< j%rj&  d7ks5|j&d7krHtd td	 td8 td t  j&  }|j'j(krgtd td	 td9 td# t  td |j'd- |f}t|}t|}td t|
|f}t | dkrj  d: $|j"d|j'd- ddf |dddddf< j  d; $|j"d|j'd- ddf |d-ddddf< j  d< $|j"d|j'd- ddf |d/ddddf< j  d= $|j"d|j'd- ddf |dddddf< j  d> $|j"d|j'd- ddf |d2ddddf< j  d? $|j"d|j'd- ddf |d4ddddf< j  d@ $|j"|dddddf< j  dA $|j"|d-ddddf< j  dB $|j"|d/ddddf< j  dC $|j"|dddddf< j  dD $|j"|d2ddddf< j  dE $|j"|d4ddddf< j  dF $|j"|dd< j  dG $|j"|dd< n&j  d: j"d|j'd- ddf |dddddf< j  d; j"d|j'd- ddf |d-ddddf< j  d< j"d|j'd- ddf |d/ddddf< j  d= j"d|j'd- ddf |dddddf< j  d> j"d|j'd- ddf |d2ddddf< j  d? j"d|j'd- ddf |d4ddddf< j  d@ j"|dddddf< j  dA j"|d-ddddf< j  dB j"|d/ddddf< j  dC j"|dddddf< j  dD j"|d2ddddf< j  dE j"|d4ddddf< j  dF j"|dd< j  dG j"|dd< | j)||||
||	|d(|j'|||||dH n| j)||||
||	|ddI t j  jd | _*j  jd | _+q8dS )Ja*          

        wlref is the reference wavelength for the opacity

        ptcle is a list of dictionnary. One dictionnary per particle to use.
              e.g. [ {"file":string, "name":string, "tau":float, "alt_distrib":string, "z":float, "dz":float, "user_vdist":np.array, "user_alt":np.array, "reff":float, "veff":float, "humidity":float} ]
              If alt_distrib is "layer"         z (z top) must be given 
                             is  "homogeneous"  z (z top) and dz must be given
                             is  "gauss"        z (z middle) and dz must be given
                             is  "sh"           z (scale height) must be given
                             is  "user"         "user_vdist" and "user_alt" must be given

        optical_prop :  optical properties class

        r   Nc                 S      g | ]}|d  qS )r   r   .0xr   r   r   
<listcomp>e      z%particle.__init__.<locals>.<listcomp>c                 S   r   )taur   r   r   r   r   r  g  r  Fc                 S   r   )alt_distribr   r   r   r   r   r  q  r  )layerhomogeneousshgaussuserz(particle) ERRORzF           -alt_distrib- must be layer, homogeneous, sh, gauss or userz           required:r   )r  r  r  r	  z      )r  r	  dzzR           dz must be provided for -homogeneous- and -gauss- vertical distributionz           for particle r   r
  r  Zuser_altr   dtype
user_vdistz,            Missing optical properties for :r   c                    s   g | ]
}j   jd  qS )r   )r   r   )r   Ziiiiioptical_propr   r   r    s    r      r   )humidityZreffZveffr&   Zlogiwcr   r   z9 should be provided in the description (dictionnary) for z          Required -z- value is not sampledr   Tr   c                 S   r   )r   r   r   r   r   r   r    r  r   r   r"    re   r   r   r   r      r   r   r   r   zF          Required -nbetal- value is not sampled in optical propertiesr   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   opt_wvlnang_phasematr   
u_phasematphasemat
betal_flagr   r   betaltrunc_coefftrunc_phasemattrunc_normphasemat)r   r   r  r  r   r  r  r  ),rq   nptcletyper   r   Ztau_reflambZhgr   r   Z
vdist_typero   Zh_vdistZsd_gauss_vdistr   r   r   r   r   Zuser_vdist_naltZuser_vdist_altr  optical_propertiesr   r   r   r   r   	transposefullr   maxr   r   r
   r   r   r   r   r   nstreamsr   r   r  r  )r   r   ptcler  r   Znaltmaxr  r  Znopt_wvlr  r  r   r  r   r   Z	prop_listpropdatasetsr   r   r   r  r  r   r  r   r  r   r   J  s  

"$ &
"""((((
(*(*""""
"$((


>>>>>>(((((("888888""""""
 zparticle.__init__F/tmp/c              
   C   s  t |}t| jd| j|f}t| jd|f}tj| j|fdtd}	|dkrOt| jd|d |f}
t| j|f}t| jd| j|f}t| j|f}nd }
d }d }d }t| jD ][}t| j	| d t
d| j| j	| d	 gg d
d}t| j	| d t
d| j	| d	 gddgd}|dkr| j	| d r|| j	| d kr|| j	| d krd|	|d d f< t| j	| d t
dt
| j	| d d | j	| d	 gg dd}t| j	| d | j	| d	 gdgd}t| j	| d t
d| j| j	| d	 gg d
d}t| j	| d | j	| d	 gdgd}t|D ]}| js?|| | j	| d	 vr?td td t  n|| | j	| d	 v rVdt|| ddi}ndt|| i}||j||d d |f< ||j||d d d d |f< |	||f r||j|
|d d d d |f< ||j|||f< ||j||d d d d |f< ||j|||f< q!q\|rt| jD ]}t|d | j|  d d}|d |d  |d! |d" |d# |d" |d$ |d% |d& |d'| d(  |d) t|D ]0}d*||  d+| j  d*||d|f   d*||d|f   d*||d,|f   d- }|| q|d. t|D ]f}|d/||  d-  |d0 t| jD ]M}d1| j|  d1||d||f   d1||d||f   d1||d,||f   d1||d||f   d1||d2||f   d1||d3||f   d- }|| qaqJ|  q|| j||
|	|||fS )4Nr   r  Fr  r   r"   r  g      @r  )imatr   wvl)r   r   r   g      @Zioptr-  r  r   r   Tr  )r,  lr-  r  r  r   z (particle.get_it) ERRORzN                   No wavelength interpolation allowed in the class definitionr   Zopt_.datwz,# Optical properties to be used by ARTDECO 
z# 
z,# Used model to obtain that properties is: 
z
 unknown 
z# Used material is: 
z%# Number of phase matrix elements : 
z 6 
z# number of wavelengths 
z%iz  
zI#  lambda(microns)   nteta   Cext (microns^2)       SSA              g  
z   %.9ez   %ire    
z# Phase matrix  
z# lambda = %.4fzu#         u              F11            F22             F33            F44               F21               F34      
z   %.17er   r  )rq   r   r   r!  r  r%  boolr   r	   r#  r   r  r   r   r   r
   r   r   r   r"  writer   )r   r   r   r   Z
ascii_saveZdir_ascii_savenwlr  r   r  r  Z
trunccoeffr  r   ZiptcleZlut_phasematZlut_optZ	lut_betalZlut_trunccoeffZlut_trunc_phasematZlut_trunc_normphasematiwlr   Zfoptr   sZiangr   r   r   get_opt]  s   B,    









P

zparticle.get_optN)Fr+  )r   r   r   r   r7  r   r   r   r   r   H  s
      r   c                   @   s    e Zd Zg fddZdd ZdS )
kdis_coeffc                 C   s  |j dkrd S |j| _dd }|dkr|d |j d }t|d}t|d d	 | _t|d
 	 }t
|| _d| _g | _g | _d| _g | _g | _t|D ]W\}	}
dt|d
 |
 j	 v rp|d
 |
 jd rmd}nd}nd}|s| jd | _| j|
 | j|d
 |
 jd  qP| jd | _| j|
 | j|d
 |
 jd  qPt| j| _t| j| _t
|d d | _td| jf| _t|d d | jdd d f< t|d d | jdd d f< t|d d | jdd d f< t| jd | _t|d d | _t|d d | _t
| j| _t
| j| _| jdkrUt|d d | _|d d jd  | _ t
| j| _!|| jsTt"d t"d t#  nd| _ || jdd d f sot"d t"d t#  || jst"d t"d t#  || jst"d t"d t#  t
|dkrEt
|| _| jd d |d f | _| j|d  | _| jdkrvtj| j| jfd d!| _$t| j| j| j| j| jf| _%t| j| j| jf| _&t| j| jf| _'t| jD ]\}	}
t|d D ]{\}}t|d
 |
 d" | | j$|	|f< t|d
 |
 d# |d| j$|	|f d d d d f | j%|	|d| j$|	|f d d d d f< t|d
 |
 d$ |d| j$|	|f f | j&|	|d| j$|	|f f< t|d
 |
 d% | | j'|	|f< qq| jdkrCtj| j| jfd d!| _(t| j| j| j| j| j| j!f| _)t| j| j| jf| _*t| j| jf| _+t| jD ]\}	}
t|d D ]\}}t|d
 |
 d" | | j(|	|f< t|d
 |
 d# |d| j(|	|f d d d d d d f | j)|	|d| j(|	|f d d d d d d f< t|d
 |
 d$ |d| j(|	|f f | j*|	|d| j(|	|f f< t|d
 |
 d% | | j+|	|f< qqnt| jdkrtj| j| jfd d!| _$t| j| j| j| j| jf| _%t| j| j| jf| _&t| j| jf| _'t| jD ]{\}	}
t|d
 |
 d" | j$|	d d f< t,| j$|	d d f }t|d
 |
 d# d d d|d d d d f | j%|	d d d|d d d d f< t|d
 |
 d$ d d d|f | j&|	d d d|f< t|d
 |
 d% | j'|	d d f< q| jdkrtj| j| jfd d!| _(t| j| j| j| j| j| j!f| _)t| j| j| jf| _*t| j| jf| _+t| jD ]{\}	}
t|d
 |
 d" | j(|	d d f< t,| j(|	d d f }t|d
 |
 d# d d d|d d d d f | j)|	d d d|d d d d f< t|d
 |
 d$ d d d|f | j*|	d d d|f< t|d
 |
 d% | j+|	d d f< q=|-  t| jD ]\}	}
| j|	 . | j|	< qt| jD ]\}	}
| j|	 . | j|	< qd S |d&k	r|d |j d' }t/j01|s
t"d( t"d)| t#  t2|d}t3| |4 }t5|6 d | _t3| |4 }t5|6 d | _d| _g | _g | _d| _g | _g | _t3| t7| jD ]W}|4 }t5|6 d dkr{| jd | _| j|6 d  | jt8|6 d  qLt5|6 d dkr| jd | _| j|6 d  | jt8|6 d  qLt| j| _t| j| _t3| |4 }t5|6 d | _td| jf| _t| jd | _t3| t7| jD ]O}|4 }t8|6 d | jd|f< t8|6 d | jd|f< t8|6 d | jd|f< |dkr,| jd|f | jd|d f k r,t"d t"d* t#  qt3| |4 }t3| t5|6 d | _t| j| _t7| jD ]/}|4 }t8|6 d | j|< |dkr}| j| | j|d  k r}t"d t"d t#  qOt3| |4 }t3| t5|6 d | _t| j| _t7| jD ]/}|4 }t8|6 d | j|< |dkr| j| | j|d  k rt"d t"d t#  q| jdkr't3| |4 }t3| t5|6 d | _!t| j!| _t7| j!D ]/}|4 }t8|6 d | j|< |dkr%| j| | j|d  k r%t"d t"d t#  q|-  | jdkrctj| j| jfd d!| _$t| j| j| j| j| jf| _%t| j| j| jf| _&t| j| jf| _'| jdkrtj| j| jfd d!| _(t| j| j| j| j| j| j!f| _)t| j| j| jf| _*t| j| jf| _+t7| jD ]}	|d |j d+ | j|	  d, }t/j01|st"d( t"d)| t#  t2|d}t3| t7| jD ]!}|4 }t5|6 d | j$|	|f< t8|6 d | j'|	|f< qt7| jD ]c}| j$|	|f dkr^t3| |4 }t7| j$|	|f D ]}t8|6 | | j&|	||f< qt7| jD ]-}t7| jD ]$}|4 }t7| j$|	|f D ]}t8|6 | | j%|	||||f< qFq7q0q|-  q| jdkrpd-| _ nd| _ t7| jD ]}	|d |j d+ | j|	  d, }t/j01|st"d( t"d)| t#  t2|d}t3| t7| jD ]!}|4 }t5|6 d | j(|	|f< t8|6 d | j+|	|f< qt7| jD ]m}| j(|	|f dk	r>t3| |4 }t7| j(|	|f D ]}t8|6 | | j*|	||f< qt7| j!D ]7}t7| jD ].}t7| jD ]%}|4 }t7| j(|	|f D ]}t8|6 | | j)|	|||||f< 	q#	q	q	qq|-  qxt
|dk	r| j|d  | _| jd d |d f | _| jdk	r| j$d d |d f | _$| j%d d |d d d d d d d f | _%| j&d d |d d d f | _&| j'd d |d f | _'| jdk	r| j(d d |d f | _(| j)d d |d d d d d d d d d f | _)| j*d d |d d d f | _*| j+d d |d f | _+| jj9d | _d S ).Nr   c                 S   r   r   r   r   r   r   r   r     r   z%kdis_coeff.__init__.<locals>.<lambda>r   Zkdis_z.h5r   r   Zmaxnaicoeffr   rho_depTFr"   Zadd_continuumr   r  Zmin_wvlZmax_wvlre   pressureZtemperaturerhodescz kdis_coeff ERRORz<            concentration must be sorted in increasing orderr   zF            (h5 format) wavelengths must be sorted in increasing orderz7            pressure must be sorted in increasing orderz:            temperature must be sorted in increasing orderr   r  naikiaixsectr   z_def.datz(kdis_coef) ERRORr   z:            wavelengths must be sorted in increasing order_r/  density):r   
kdis_modelmodelr   r   r   r   Znmaxailistr   rq   Znsp_totZnspZfcontspeciesnsp_cZfcont_c	species_cr   r   r   r   nwvlr   wvlbandr   channelsr;   r<   ntrz   r   Zc_descncr   r   r>  r?  r@  rA  nai_cki_cai_cxsect_cnanmaxr   lowerr   r   r   r   r   r   r   r   r   r   shape)r   r   dir_dataformatr   r   r   r   Zspecies_totispZspecier:  r   Z	iwvl_fileZnai_tmpZfdefr   r   Ziaiitipicr   r   r   r     sX  
	

   
 $^F($$jF( $R:($$R:( ; 



"


 $ 

 $ 

 &*0zkdis_coeff.__init__c              	   C   sR  d|vrg }t |D ]\}}|tt|| jk q
t|}t|| _| j	d d |f | _	| j| | _| j
d d |f | _
| jd d |d d d d d d f | _| jd d |d d f | _| jd d |f | _| jdkr| jd d |f | _| jd d |d d d d d d d d f | _| jd d |d d f | _| jd d |f | _d S )Nrf   r   )r   r   r   r   r   rL  r   rq   rJ  rK  r>  r?  r@  rA  rH  rO  rP  rQ  rR  r   r   r   r   select_chan_kdis  s$   

&
,zkdis_coeff.select_chan_kdisN)r   r   r   r   r\  r   r   r   r   r8    s
      Xr8  c                   @   s8   e Zd Z										dd
dZdd Zdd ZdS )surfaceFrc   NTra   r  fffff&A@rf   r  c                 C   s  || _ || _|| _|| _|| _|| _|| _| js7|dkr7td td td td td td t  |rX|dkrXtd td td td td td t  || _	| j	dvrktd td t  | j	d	kr|| _
|t| | _|t| | _dS || _
|d
vrtd td t  |dkr|| _|| _|| _|| _|| _|| _|| _|| _dS |	t| | _|
t| | _|t| | _|t| | _|r|t| | _|t| | _|t| | _dS dS )a  
        
        sdistr  : 3  = isotropic surface
                : 2  = Anisotropic Gaussian distribution
                : 1  = Anisotropic Gaussian distribution with Gram Charlier series correction

        azw     :  phi_sun - phi_wind (for sdistr = 2 or 1)

        _6s_glitter :   True  = 6SV glitter
                        False = M. I. Mishchenko and L. D. Travis, J. Geophys. Res. 102, 16989-17013 (1997).

        Rsw is an irradiance reflectance

        r  r   zERROR : zN  6S glitter must be used (_6s_glitter = True) if anisotropic surface requiredz3  Shadow possible only if isotropic ocean surface  )brdflambertERRORz,  Surface family must be -brdf- or -lambert-r`  )oceanZlandz*  Surface family must be -ocean- or -land-rb  N)r   r&   interpbpdftest_glitterocean_whitecaps_6s_glitterr   r   familykindr   argsortr   albwdspdsdistrazwshadowxsalpclRswwvl_Rswisovolgeocvnrni)r   r   rh  ri  rc  rd  r&   r   rk  rt  ru  rv  rw  rx  ry  re  rf  rg  ro  rl  rm  rn  rp  rq  rs  rr  r   r   r   r   8  sn   


zsurface.__init__c                 C   s`   t | jtst | jtrt|| j}|S d| jv r t|d}t| j| jtdtj	d|}|S )Nrf   F)ri  bounds_error
fill_value)

isinstancerr  r   r   r   	full_liker   rs  surf_interpnan)r   r   rr  r   r   r   get_Rsw  s   
zsurface.get_Rswc                 C   s~  | j dkrtd d S | jdkrCt|}t|}t|}t|}|rB| js3td td t  t|}t|}t|}	n	t|}t|}
| jst	|D ]m}|| | j
vrdtd t  qS| jdkr| j| j
|| k ||< | j| j
|| k ||< | j| j
|| k ||< |r| j| j
|| k ||< | j| j
|| k ||< | j| j
|| k |	|< qS| j| j
|| k |
|< qSne| jdkrt| j
| jtd}t| j
| jtd}t| j
| jtd}||}||}||}|rt| j
| jtd}t| j
| jtd}t| j
| jtd}||}||}||}	nt| j
| jtd}||}
| jdkr/|
S |r:||||||	fS |||fS )	Nrb  z%surface.get_it() is useless for oceanr_  z(surface.get_it) ERRORz0                 BPDF was not defined in surfacezL(surface.get_it) : No wavelength interpolation allowed in surface definitionri  r`  )ri  r   rh  rq   r   r   rd  r   rc  r   r   rt  ru  rv  rw  rx  ry  rk  r   r~  )r   r   rd  r4  rt  ru  rv  rw  rx  ry  rk  r5  ZfisoZfvolZfgeoZfcvZfnrZfniZfalbr   r   r   get_it  sr   










zsurface.get_it)FFrc   NNNNNNNNFTFFra   r  rc   r^  rc   rf   r  )r   r   r   r   r  r  r   r   r   r   r]  6  s    
V	r]  c                   @   s8   e Zd Zddddi dddfddZddd	Zd
d ZdS )ptqo_atmosphereTg     F@Nr0   Fc           !   	   C   s"  || _ |t| | _|t| | _|| _|| _|| _|dv r$d| _n|dv r+d| _|dkr3d| _	n|| _	|
 | _|jdkrd|v rOtd td	 t  |D ]}||jvrp||jvrptd
 td|d td|j t  qQd|v syd|v rd|vr|d d|v rd| _nt|| _| jdkr|| _d}nd| _t|}t|||||
|\}}t|}t
|d | _t
|| _t
|d | _t|| _t|D ]<}|dkr| j|d  | j| krt|d D ]}td| d| j|   d| j|    qtd td t  q|| d }|d | }|t t |t  t  | _| jd | _| jdkrt| j|f| _!t| jD ]}| j| dkro|t t d | j!|ddf< t"| j| j| j| j!|ddf | j| _#q@| j| dkr|| d t$ t d | j!|ddf< q@| j| t%|	& vrtd
 td td| j|  td t  | jd  |	| j|  t'| j d!d |   | j!|ddf< q@nd| _!|s|dur|rt|d d"d"D ]>}d#| j|  d| j|   d| j|   d$| j|   }t| jD ]}|d$| j!||f | j|  d   }q
t| qd%}t| jD ]}|d&| j|   }q-t| td'tj(|| jd d( d  tj(| j| jd d( }t)| jD ]!\}}td)|tj(| j!|ddf | jd d( | d f  q_|rtd* td+ td* |durt*|d,} t|D ]C}d-| j|  d.| j|   d| j|   d$| j|   }t| jD ]}|d$| j!||f   }qt| |dur| +|d/  qd0}t| jD ]}|d1| j|   }qt| |dur| +|d/  |dur| ,  dS )2ap  
         p          in Pa
         t          in K
         hum        in kg/kg over moist air
         o3         in kg/kg over moist air
         gas        list of gas to be accounted for in absorption
         ppmv       ppmv profile over dry air
                         dictionnary of interp1d( np.log10(p (hPa), ppmv_over_dry_air )
                         for several gases
         surfalt    surface altitude in m
         psurf      surface pressure in Pa
         wvl_depol  Rayleigh depol coeff wavelengths
         depol      Rayleigh depol coeff 
         interp     whether we can interpolate depol
        r0   r/   r0   r5   r5   Nr   r   (atmopshere) ERROR.             kdis mode without absorbing gas !(atmosphere) ERROR             Required gas  for the atmsophere$             is not defined in KDIS o2n2rT   r   rd   r8   r"   re   z  %iz   %.2f(atmospher) ERROR 1            Altitude must be strictly decreasing r`   rP   rY   z,             you must provide a ppmv profile             for gas              rI   r   rf   z   %.3fz   %.5ez)   alt      p         T          uair    z          %sz column of WV (kg/m**2) = r  z   ppmv of %5s is %18.9fr   Z	densitiesr0  z   %8.3fz	   %15.6fr1  z2      alt              p          T          uair z           %s)-rc  r   rj  wldepoldepolZhum_origZo3_origtau_rayrh_phasenewgridr   gasabsr   r   r   rG  rI  rE  r   ngasrq   gasrW   r|   alt_origt_origp_origr   
u_air_origr   rS   narR   u_origrC   rh_origrX   rF  r   log10trapzr   r   r3  r   )!r   r   r;   r<   r(   rY   r  r  r  rK   Zsurfaltrs   rc  rr   r  r   r  r  r   Z
save_asciigrL   Zaltitudery   naltialtZialt1Zwv_gpercubicmeterZddairigasr6  Z
column_airr   r   r   r   r     s   




	
*,*B8( <

8


zptqo_atmosphere.__init__c              	   C   s  | j dkr,t| j}t| j}t| j}t| j}| jdkr)t| j}nd}nt	| j }t
|ddd }t| j| jtdd}t| jt| jtdd}t| jt| jtdd}	||}t||}t|	|}| jdkrt| jt|f}t| jD ]5}
t| jt| j|
ddf tdd}t||||
ddf< d||
ddf t||
ddf < qnd}|||||fS )W Set up (altitude) grid specified in format 'start[step1]stop1[step2]stop' or similar. Nr   rf   Fri  Zassume_sortedrc   )r  r   r   r  r  r  r  r  r  parseGridSpecr   r   
atm_interprF   r:   r   rq   r   isnan)r   debugaltr<   r;   u_airrD   ftfpfuairr   fur   r   r   regrid  s2   



&(zptqo_atmosphere.regridc                 C      t |}t|}| js8t|D ]%}|| | jvr)td td td t  q| j| j|| k ||< q|S t	| j| jt
d}||}|S Nr   zS(atmo.get_depol) : No wavelength interpolation allowed in depolarization definitionr  rq   r   r   rc  r   r  r   r   r  r   depol_interpr   r   r4  r  r5  Zfdepolr   r   r   	get_depol     
zptqo_atmosphere.get_depolF)r   r   r   r   r  r  r   r   r   r   r    s    
 
)*r  c                
   @   s|   e Zd Zddddddi dddf
ddZdd	 Zd
d Zdd Zdd Zdd ZdddZ	dd Z
dd Zdd Zdd ZdS )
atmosphereTNrf   r0   Fc           .   	   C   s  || _ || _|d krd | _n|| _|	| _|t| | _|t| | _|| _|dv r/d| _	n|dv r6d| _	d| _
|jdkrUd|vrRtd td td	 t  nd
| _
dgt| | _|d d  | jd d < |jdkrd|v r|td td t  |D ]}||
jvr||
jvrtd td|d td|
j t  q~d|v sd|v rd|vr|d |d d|v rd}d| _n	t|}t|| _|| jkrtd t  | jdkr|| _d }|| _d }nd| _| j
rd| _t|jdkrtd td td td td t  |dkrJtd||  || }tj|s/td td| t  t|d }t| | }t| d }t| | }t| d }t| t || _!t || _"t || _#t$t| j!tj%| _&t |}t |d! |f}| }t'|D ]}t(| | ||< qt| t'|D ]a}| }t(| d | j!|< t(| d! | j#|< t(| d | j"|< |dkr| j!| | j!|d!  krtd td" td t  t'|D ]}t(| d#|  ||d! |f< qq|)  |jd dkrd}nt*||jd }|jd! dkr%d}nt*||jd! }g | _|||d!  | _+|d d ||d! f | _,| j!| _-|d$kr}td% td& t  td||  t.|| d'| _,t.|| d(| _-t.|| d)d* | _+n|d+krt/0|| d }t1|d, d- | _!t1|d, d. | _"t1|d, d/ | _#t$t| j!tj%| _&| j!| _-t1|d0 d1 } |d0 d1 d |d0 d1 d! krtd td td2||  td3 td t  |jd dkrt*| |d0 d4 }n
t*| d5|jd  }|jd! dkrt*| |d0 d6 }n
t*| d5|jd!  }t || d! t| j!d! f| _,t2|d7 3 }!d8| jv rE|!| _| jD ]}||!vrctd td|d td9||  t  qH|!D ]-}"|"| jv r| j,d d d d f |d7 |" ||d! d d f  | j,d d d d f< qg|)  g | _d5| ||d!   d d d | _+t4| j,d d dd d f | _,n|d:krN|| }tj|std td| t  t|d }t| | }t| d }t| | }t| d }#g }$t| |#dkr t'|#D ]}%| }|$| d  qn| }t| t || _!t || _"t || _#t || _&i }&t'|#D ]}'t ||&|$|' < qFt'|D ]h}| }t(| d | j!|< |dkr| j!|d!  | j!| krtd; td< t  t(| d! | j#|< t(| d | j"|< t(| d# | j&|< t'|#D ]}'t(| d=|'  |&|$|'  |< qqW|)  | jdkrJt | j|f| _5t'| jD ]p}(| j|( |$v r|&| j|(  | j5|(d d f< | j|( dkrtd td>| j|(  td? td@t6 t  q| j|( dkr6td tdA tdB| j|(  tdC td@t6 t  | j&dD | j|(  | j5|(d d f< qnd | _5ntdE g | _7d
| _8d| _9d| _:t'| jD ]H}(| j|( dFkrt;tj<| j5|(d d f | j!dGdH })|)dI | _9| j|( dkrt;tj<| j5|(d d f | j!dGdH })|)t= t>j? | _:qcdF| jv r|dkrt'| jD ])}(| j|( dFkr|| j9 | _@|| _9| j5|(d d f | j@ | j5|(d d f<  nqd| jv rZ|dkrZt'| jD ]c}(| j|( dkrX|dJkrdJ| _:dJ| j5|(d d f< nDtA| j#| j"| j&| j5|(d d f | j	}*|| j: }+|| _:| j5|(d d f |+ | j5|(d d f< | jrVtB| j#|*| j&| j5|(d d f | j	| _" nqd| jv rt'| jD ]k}(| j|( dkrtA| j#| j"| j&| j5|(d d f | j	| _C| j rt| jC| jCtDk dkrtdK tdLtD  t't| j!D ]'}dM| dN| j!|   dN| j#|   dN| j"|   dO| jC|   },t|, q nqedP| _E|| _F|dPkr-| j
rtdQ tdR |tG| j# }-| j#|- | _#| j&|- | _&| jdkr-t'| jD ]%}(| j|( dFkr+| j|( dkr+| j5|(d d f |- | j5|(d d f< q| j!d | j!d! k rEtdQ tdS t  d S d S )TNr  r0   r  r5   Flblz(atmosphere)  ERROR z%              If artdeco mode is lbl zZ              you must provide an atm file with lbl format: -lbl_forum- or -lbl_liradtran-Tr   r   r   r  r  r  r  r  r  r  r  rT   rf   r   z(atmosphere) nppmv != ngasre   z(atmosphere)  zZ(atmosphere)  in lbl mode two boundary wavelengths must be provided in -artdeco_in.wavel- Zlbl_iprtz (atmosphere) read r   r   r"   z@             with -lbl_iprt- fmt, alt must be sorted decreasing r  Zlbl_libradtranz`This must evolve to include, P,T,alt in the file without modifiyng the libRatran format basis...z?   file mustthen include at the / : wvl, z, tau, wvlmin, wvlmaxr  r  r-  rd   Z	lbl_forumZAtmosZAltitudeZTemperaturePressureZSpectral_InformationsZ
Wavenumberz(atmosphere)  In  z>(atmosphere)   Wavenumber should be sorted in increasing orderZWavmaxg     @ZWavminZMol_Optical_Depthr   z             is not defined in r   r  r  r   z!             ppmv must be -1 for z2             cause it is already defined in file :r  z-             you must provide a ppmv not = -1r  z,             cause it is not defined in filerI   z9(atmosphere) ERROR : atmosphere file format not supportedrY   r       j@g PZWCrc   (atmosphere) WARNING 7             Relative humidity superior to %.2f percent%3i	   %10.3f	   %10.2fr  (atm regird) ERROR/             No P0 scale is allowed if lbl modez8             alt_orig must be sorted in decreasing order)Hwarnr  r  rc  r   rj  r  r  scale_t_rh_cster  lbl_atmr   r   r   rq   r  rG  rI  rE  r   r  r  rK   wavelr   r   r   r   r   r   r   r   r   r  r  r  r%  r  r  r   r   r   r    wvl_tauabsgasZ	tauabsgasZalt_tauabsgasr   r   r   r   rF  r   r$  r  Zatm_pathrh100_boundsrh100_wvc_csteDU_o3waterr   r  rS   csteN_Ascale_o3rC   rG   r  limit_rhcloudy_waterP0amax).r   r   rV  Zatm_filer  rK   Zfmt_atmr  r  rc  r   r  r  r  r  r  r  r  r  r  Znppmvr   r   r   r  rJ  r  Z
dtauabsgasr   r  iminimaxZwn_tauabsgasZgas_listZgas_nameZnspeciesrG  r   Z	u_speciesrX  r  column	rh_before	scale_h2or6  factr   r   r   r     sJ  











$

""

H  




$

&(
(&
&
$&"("@

 $
zatmosphere.__init__c                 C   s   || _ |dkrS| jrtd td |t| j }| j| | _| j| | _| jdkrSt| jD ]"}| j	| dkrR| j	| dkrR| j
|d d f | | j
|d d f< q0d S )Nr  r  r  r   rY   rT   )r  r  r   r   r  r  r  r  r   r  r  )r   r  r  r  r   r   r   set_P0y  s   
$zatmosphere.set_P0c                 C   s(   t t| j| jddd}|t|S NFr  rz  r{  )r   r   rF   r  r  )r   r;  r   r   r   r   get_alt  s   zatmosphere.get_altc                 C   s   t | j| jddd}||S r  )r   r  r  r   r  r   r   r   r   get_t  s   zatmosphere.get_tc                 C   s*   t | jt| jdtjd}t||S )NFr  )r   r  r   rF   r  r  r:   r  r   r   r   	get_press  s   zatmosphere.get_pressc                 C   r  r  r  r  r   r   r   r    r  zatmosphere.get_depolc           #   
   C   s  | j dkr/t| j}t| jdkr.| j}| j}| j}| j	dkr,| j
}d| jv r+| j}nd}n| jr=td td t  t| j }t|ddd }t| jdkrt| j| jtdd}t| jt| jtdd}	t| jt| jtdd}
||}t|	|}t|
|}| j	dkrt| j	t|f}t| j	D ]K}t| jt| j
|ddf tdd}t||||ddf< d	||ddf t||ddf < | j| dkrt|||||ddf | j}qnd}t| jdkrtt| jD ]!}t|| j| }t|| j| d
 }t|| j| d
 }qtt|ddd }||t| jk }||t| jk }t| j| jtdd}t| jt| jtdd}	t| jt| jtdd}
||}t|	|}t|
|}| j	dkrt| j	t|f}t| j	D ]M}t| jt| j
|ddf tdd}t||||ddf< d	||ddf t||ddf < | j| dkrt|||||ddf | j}qtt|d}t| j	D ]}| j| dkrt|}t||ddf }tt| jD ]>}d}t ||krt |}|||t| j| k|t| j| k@ < d||t| j| k|t| j| k@ < qt!||||| j}| j"r2t ||dk }t|}d	||dk< t#tj$||dd t% t&j' }t|}d	||dk||kB < t#tj$||dd t% t&j' }t|}d	||dk||kB < t#tj$||dd t% t&j' }t|}d	||dk< t#tj$||dd t% t&j' }|| }|d	k rtd td t  ||k rd}|||  | }nd}d|dd< | j(||  }|| }|| }d	|dd< ||d	k ||d	k< ||d	k ||d	k< ||d	k ||d	k< |||ddf< t|||||ddf | j}t#tj$||ddf |dd } | t% t&j' | _)|rtd tt|D ]5}!d|! d||!   d||!   d||!   d||!   d||!   d||!   d||!   }"t|" qptd| j) td| j( q| j*rt||t+k dkrtd tdt+  tt|D ]#}!d|! d||!   d||!   d||!   d||!   }"t|" q|||||fS )r  Nr   rT   r  z-             No regrid is allowed if lbl moderf   Fr  rc   h㈵>r8   Tr  r  z             delta_wv_in < 0z(atmosphere regrid) set rh100 r  r  r  zWVC        =zWVC before =z(atmosphere regrid) WARNING z>                    Relative humidity superior to %.2f percent),r  r   r   r  rq   r  r  r  r  r  r  r  r  r  r   r   r  r   r   r  rF   r:   r   r   r  rC   r  r   uniqueminr&  r%  rS  rE   r  r   r  rS   r  r  r  r  r  r  )#r   r  r  r<   r;   r  rD   rB   r  r  r  r   r  ibZflag_cloudyr  r  Zu_h2o_beforeZrh_cloudZu_h2oZmax_alt_cloudZu_inZwater_in_cloudZu_out_upZwater_out_up_cloudZ	u_out_lowZwater_out_low_cloudZu_in_beforeZwater_in_before_cloudZdelta_wv_inZch_upscaler  r  r6  r   r   r   r    s   




&&	&&

,0
	"
"
"
"

$\(8zatmosphere.regridc                 C   sr   d| j v r7|dkr7t| jD ](}| j | dkr6|| j | _|| _| j|d d f | j | j|d d f<  d S qd S )NrY   rf   )r  r   r  r  r  r  )r   r  r  r   r   r   apply_scale_O3	  s   &zatmosphere.apply_scale_O3c              	   C   st  d| j v r|dkrt| jD ]}| j | dkr|dkr*d| _d| j|d d f<  d S t| j| j| j| j|d d f | j	}|| j }|| _| j|d d f | | j|d d f< | j
rmt| j|| j| j|d d f | j	| _| jrt| j| jtk dkrtd tdt  tt| jD ]&}d| d| j|   d| j|   d| j|   d	| j|   }t| q d S qd S )
NrT   rf   rc   r   r  r  r  r  r  )r  r   r  r  r  rC   r  r  r  r  r  rG   r  rq   r  r  r   r  )r   r  r  r  r  r  r6  r   r   r   apply_scale_h2o	  s0   &
$&@
zatmosphere.apply_scale_h2oc                 C   s   t | j dkrtd t  tt |t |f}t| jd t| jd dd}t	|D ]\}}t
||}|| t| |d d |f< q/|S )Nr   z>No tau_ray dict was set when initializing the atmosphere classr-  r  T)rz  )rq   r  r   r   r   r   r   r   rF   r   r:   r&  )r   Zp_profZwvlarrZtau_odZfrayr   r-  Ztau_tmpr   r   r   
get_ray_od	  s     zatmosphere.get_ray_odc              	   C   s   t |tstd td td td td t  d| jv r[g | _tt|D ].}t || tsJtd td td td td t  | jt	
t	||  q*d S td td td d S )Nr   zF(set_h2o_in_cloud) alt_bounds should be a list of altitude boundaries zW                   e.g. alt_bounds = [ [alt_min1, alt_max_1], [[alt_min2, alt_max_2]] ]rT   z5(set_h2o_in_cloud) No water vapour in the atmosphere )r|  rF  r   r   r  r  r   rq   r   r   r   r   )r   Z
alt_boundsr  r   r   r   set_rh100_limits	  s.   

	zatmosphere.set_rh100_limitsr  )r   r   r   r   r  r  r  r  r  r  r  r  r  r  r   r   r   r   r    s"       +
  %r  c                   @   s   e Zd ZdZdd ZdS )geometryr~   c                 C   s   || _ t|t|d d d s td td td t  || _t|t|s;td td td t  || _d| _d S )Nrf   r   z3(geometry) : vza must be sorted in decreasing orderz3(geometry) : vaa must be sorted in increasing orderr   )	szar   r   r   r   r   vzavaaZlon_lat_day_time)r   r  r  r  r   r   r   r   (
  s   
zgeometry.__init__Nr   r   r   r   r   r   r   r   r   r  %
  s    r  c                   @   sR   e Zd ZdZdgddgddgddddd	d
dddddd	ddddd	d	dd	fddZdS )r   r~   r   z	kdis totorf   r      doadTFr"   rc   r  i  
   g      $@g      &@c                 C   sF  d|v r	dg| _ n|| _ | d dvrtd td t  | d | _| jdkr2| d | _d|v r:d| _ntd td t  || _| jdkr^t|d	vr^td td
 t  | jdkr~t	|t
|swtd td t  t
|| _nd|vrt
|| _n|| _|dvrtd td t  || _|dkr|dks|dk rtd td t  || _|| _|dkr|dks|dk s|dks|dk rtd td t  ||krtd td t  || _|| _t|| _|dkrt|| _|| _t|| _t| jd | _nN|dkr1|dkr| j| _n|| _|| _|| _|| _|| _|| _n,|dkrQ|r;d}|	rMtd td td t  d| _ntd td| t  || _|| _| jdkrw|	rwtd td  t  |	| _|
dkr| jd!vrtd td" t  |
| _ |dkr| j| _!d S || _!d S )#Nr   r   )monor   r  z(artdeco_in) ERRORz1             mode must be -mono-, -lbl- or -kdis-r   r"   z'             filter use not implemented)r"   re   z>             In kdis mode, you must provide 1 or 2 wavelenghtsr  zI             In mono mode, wavelengths must be sorted in increasing orderr  )r   r   dfitpotterzB             Trunc_method must be -none-, -dfir-, -potter- or -dm-r  rb   rc   z5             Angular cut for dfit must be >0 and <180r  zN             theta_min and theta_max for Potter truncation must be >0 and <180zK             theta_min must be smaller than theta_max for Potter truncationr  re   Zdisortrf   sinscaFz3             Thermal emission is not accounted for z)             with the -sinsca- RTE solverz/             rt_model not implemented for f2py:zA             To account for thermal IR, rt model must be -disort-)r  r  zM             To account for polarization, rt model must be -doad- or -sinsca-)"keywordsr   r   r   r   rD  filtersrq   r   r   r   r  r   dfit_thetacdfit_fitallpotter_theta_minpotter_theta_maxr   r'  doad_ncoef_min_brdfdoad_epsdoad_nfoumxZ	doad_nmugod_nstr	od_deltam	od_corintod_do_secscaod_accurod_use_fisotrt_modelcorintthermalnmatcorint_brdf)r   r  r   r  r  r   r'  r	  r
  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r   r   r   r   B
  s   


 










zartdeco_in.__init__Nr  r   r   r   r   r   ?
  s6    r   c              
   C   s  g }g }t t| D ]}| | dkr|| q
| | dkr$|| q
	 q
t|t|kr4td tg }g }g }t t|D ]}|dkrO||d  d }nd}|t|d k r`||d  }nt| }z|t| |||   W n ty   td tw z|t| || d ||   W n ty   td tw z|t| || d |  W q@ ty   td tw g }	t t|D ]4}ttt	|| ||  ||  }
|t|d k}|r|
d7 }
|	
ttj|| || |
|d	 qt|	S )
r  []zhcannot parse grid specification
number of opening and closing braces differs!
Use format start[step]stopr   r"   z:cannot parse grid start specification
string not a number!z9cannot parse grid step specification
string not a number!z9cannot parse grid stop specification
string not a number!)endpoint)r   rq   r   r   
SystemExitr   
ValueErrorr   r   r   extendrF  r   linspacer   )ZgridSpeclpZrpr   Z	gridStartZgridStopZgridStepstartstopZnewGridnr  r   r   r   r  
  sN   &"$&
r  __main__zpyartdeco_runlib is a library)FTr  )E
__future__r   r   r   builtinsr   numpyr   stringr   Zscipy.interpolater   Zncutilsr   Zlutsr   r	   r
   r   r   Zscipy.constants	constantsr  rS   rR   rX   r  Zgravityrp   Zkbr$   r%   Z	scale_epsrh   ri   rg   rj   Zphasemat_interpr~  r  r  r  r   r    r*   r,   rC   rE   rG   rM   rO   rV   r[   rW   r_   r|   objectr}   r   r   r8  r]  r  r  r  r   r  r   r   r   r   r   r   <module>   s   








bY X  z  x , p      [ 0