Commit 26c292bb6629bd14f349c4f27cad8986aa709779
1 parent
6164710c3d
Exists in
master
and in
3 other branches
Contribution de Sylvain :
fonction e1 avec arguments complexes ze1 git-svn-id: https://lxsd.femto-st.fr/svn/fvn@55 b657c933-2333-4658-acf2-d3c7c2708721
Showing 5 changed files with 2347 additions and 2298 deletions Side-by-side Diff
doc/fvn.pdf
No preview for this file type
doc/fvn.tex
... | ... | @@ -66,10 +66,11 @@ |
66 | 66 | Copyright, this License, and the Availability note are retained, |
67 | 67 | and a notice that the code was modified is included. |
68 | 68 | |
69 | -\subsubsection*{Authors} | |
70 | -As of the day this manuel is written there's only one author of fvn :\newline | |
71 | -William Daniau\newline | |
72 | -william.daniau@femto-st.fr\newline | |
69 | +\subsubsection*{Authors and Contributors} | |
70 | +\begin{itemize} | |
71 | + \item William Daniau (william.daniau@femto-st.fr) | |
72 | + \item Sylvain Ballandras (sylvain.ballandras@femto-st.fr) | |
73 | +\end{itemize} | |
73 | 74 | |
74 | 75 | \section{Naming scheme and convention} |
75 | 76 | The naming scheme of the routines is as follow : |
76 | 77 | |
77 | 78 | |
... | ... | @@ -1228,15 +1229,28 @@ |
1228 | 1229 | e1(x) |
1229 | 1230 | \end{verbatim} |
1230 | 1231 | \begin{itemize} |
1231 | - \item x is a real | |
1232 | + \item x is a real or complex | |
1232 | 1233 | \end{itemize} |
1233 | -This function evaluates the exponential integral for argument greater than 0 and the Cauchy principal value for argument less than 0. It is define by equation \ref{e1} for $x \neq 0$. | |
1234 | +For a real argument, this function evaluates the exponential integral for argument greater than 0 and the Cauchy principal value for argument less than 0. It is define by equation \ref{e1} for $x \neq 0$. | |
1234 | 1235 | \begin{equation} |
1235 | 1236 | \label{e1} |
1236 | 1237 | e1(x)= \int _{x} ^\infty {e^{-t}\over t}dt |
1237 | 1238 | \end{equation} |
1238 | 1239 | |
1239 | -Specific interfaces : \verb'e1,de1' | |
1240 | +For a complex argument, the notation in equation \ref{e1cplx} is used (Abramowitz and Stegun, p.228 \url{http://www.math.ucla.edu/~cbm/aands/page_228.htm}): | |
1241 | +\begin{equation} | |
1242 | +\label{e1cplx} | |
1243 | + e1(z) = \int _{z} ^\infty {e^{-t}\over t}dt \textrm{~with~} \left| arg(z) \right| < \pi | |
1244 | +\end{equation} | |
1245 | +For positive values of real part of $z$, this can be written as in equation \ref{e1cplx_pos} : | |
1246 | +\begin{equation} | |
1247 | +\label{e1cplx_pos} | |
1248 | + e1(z)= \int _{1} ^\infty {e^{-tz}\over t}dt \textrm{~with~} Re(z) > 0 | |
1249 | +\end{equation} | |
1250 | + | |
1251 | + | |
1252 | + | |
1253 | +Specific interfaces : \verb'e1,de1,ze1' | |
1240 | 1254 | |
1241 | 1255 | \subsubsection{ali} |
1242 | 1256 | \begin{verbatim} |
fvn_fnlib/Makefile
fvn_fnlib/fvn_fnlib.f90
fvn_fnlib/ze1.f90
1 | +function ze1(z) | |
2 | +! | |
3 | +! ==================================================== | |
4 | +! Purpose: Compute complex exponential integral E1(z) | |
5 | +! Input : z --- Argument of E1(z) | |
6 | +! Output: CE1 --- E1(z) | |
7 | +! ==================================================== | |
8 | +! | |
9 | +! Déclaration des variables en passage de paramètre | |
10 | +! | |
11 | +implicit none | |
12 | +complex(8), intent(in) :: z | |
13 | +complex(8) :: ze1 | |
14 | +! | |
15 | +! Déclaration des variables locales | |
16 | +! | |
17 | +integer(4) :: k | |
18 | +real(8) :: pi,el,x,a0 | |
19 | +complex(8) :: cr,ct0,ct | |
20 | +parameter(pi=3.141592653589793D0,el=0.5772156649015328D0) | |
21 | +! | |
22 | +! traitement en fonction des différents cas | |
23 | +! - Z nul entraîne E1 infini | |
24 | +! - module de Z inférieur à 10 ou 20 : formule log+gam+somme | |
25 | +! - module de Z supérieur à 10 ou 20 : formule asymptotique | |
26 | +! | |
27 | + x=dreal(z) | |
28 | + a0=cdabs(z) | |
29 | + if (a0==0.0D0) then | |
30 | + ze1 = dcmplx(1.0D+300,0.0D0) | |
31 | + else if ((a0 <= 10.D0).or.(x <= 0.D0.and.a0 <= 20.D0)) then | |
32 | + ze1 = dcmplx(1.0D0,0.0D0) | |
33 | + cr = dcmplx(1.0D0,0.0D0) | |
34 | + k=0 | |
35 | + do while (cdabs(cr)<=cdabs(ze1)*1.0D-15) | |
36 | + k = k+1 | |
37 | + cr = -cr*k*z/(k+1.0D0)**2 | |
38 | + ze1 = ze1+cr | |
39 | + end do | |
40 | + ze1 = -el-cdlog(z)+z*ze1 | |
41 | + else | |
42 | + ct0 = dcmplx(0.0D0,0.0D0) | |
43 | + do k=120,1,-1 | |
44 | + ct0 = k/(1.0D0+k/(z+ct0)) | |
45 | + end do | |
46 | + ct = 1.0D0/(z+ct0) | |
47 | + ze1 = cdexp(-z)*ct | |
48 | + if (x <= 0.D0.AND.dimag(z) == 0.0) ze1 = ze1-pi*dcmplx(0.D0,1.D0) | |
49 | + end if | |
50 | +! | |
51 | + return | |
52 | +end function |