# NAG FL Interfaces15drf (erfc_​complex_​vector)

## 1Purpose

s15drf computes values of the function $w\left(z\right)={e}^{-{z}^{2}}\mathrm{erfc}\left(-iz\right)$, for an array of complex values $z$.

## 2Specification

Fortran Interface
 Subroutine s15drf ( n, z, f,
 Integer, Intent (In) :: n Integer, Intent (Inout) :: ifail Integer, Intent (Out) :: ivalid(n) Complex (Kind=nag_wp), Intent (In) :: z(n) Complex (Kind=nag_wp), Intent (Out) :: f(n)
C Header Interface
#include <nag.h>
 void s15drf_ (const Integer *n, const Complex z[], Complex f[], Integer ivalid[], Integer *ifail)
The routine may be called by the names s15drf or nagf_specfun_erfc_complex_vector.

## 3Description

s15drf computes values of the function $w\left({z}_{\mathit{i}}\right)={e}^{-{{z}_{\mathit{i}}}^{2}}\mathrm{erfc}\left(-\mathit{i}{z}_{\mathit{i}}\right)$, for $\mathit{i}=1,2,\dots ,n$, where $\mathrm{erfc}\left({z}_{i}\right)$ is the complementary error function
 $erfcz = 2π ∫z∞ e-t2 dt ,$
for complex $z$. The method used is that in Gautschi (1970) for $z$ in the first quadrant of the complex plane, and is extended for $z$ in other quadrants via the relations $w\left(-z\right)=2{e}^{-{z}^{2}}-w\left(z\right)$ and $w\left(\overline{z}\right)=\overline{w\left(-z\right)}$. Following advice in Gautschi (1970) and van der Laan and Temme (1984), the code in Gautschi (1969) has been adapted to work in various precisions up to $18$ decimal places. The real part of $w\left(z\right)$ is sometimes known as the Voigt function.
Gautschi W (1969) Algorithm 363: Complex error function Comm. ACM 12 635
Gautschi W (1970) Efficient computation of the complex error function SIAM J. Numer. Anal. 7 187–198
van der Laan C G and Temme N M (1984) Calculation of special functions: the gamma function, the exponential integrals and error-like functions CWI Tract 10 Centre for Mathematics and Computer Science, Amsterdam

## 5Arguments

1: $\mathbf{n}$Integer Input
On entry: $n$, the number of points.
Constraint: ${\mathbf{n}}\ge 0$.
2: $\mathbf{z}\left({\mathbf{n}}\right)$Complex (Kind=nag_wp) array Input
On entry: the argument ${z}_{\mathit{i}}$ of the function, for $\mathit{i}=1,2,\dots ,{\mathbf{n}}$.
3: $\mathbf{f}\left({\mathbf{n}}\right)$Complex (Kind=nag_wp) array Output
On exit: $w\left({z}_{i}\right)={e}^{-{{z}_{i}}^{2}}$, the function values.
4: $\mathbf{ivalid}\left({\mathbf{n}}\right)$Integer array Output
On exit: ${\mathbf{ivalid}}\left(\mathit{i}\right)$ contains the error code for ${z}_{\mathit{i}}$, for $\mathit{i}=1,2,\dots ,{\mathbf{n}}$.
${\mathbf{ivalid}}\left(i\right)=0$
No error.
${\mathbf{ivalid}}\left(i\right)=1$
Real part of result overflows.
${\mathbf{ivalid}}\left(i\right)=2$
Imaginary part of result overflows.
${\mathbf{ivalid}}\left(i\right)=3$
Both real and imaginary part of result overflows.
${\mathbf{ivalid}}\left(i\right)=4$
Result has less than half precision.
${\mathbf{ivalid}}\left(i\right)=5$
Result has no precision.
5: $\mathbf{ifail}$Integer Input/Output
On entry: ifail must be set to $0$, $-1$ or $1$ to set behaviour on detection of an error; these values have no effect when no error is detected.
A value of $0$ causes the printing of an error message and program execution will be halted; otherwise program execution continues. A value of $-1$ means that an error message is printed while a value of $1$ means that it is not.
If halting is not appropriate, the value $-1$ or $1$ is recommended. If message printing is undesirable, then the value $1$ is recommended. Otherwise, the value $0$ is recommended. When the value $-\mathbf{1}$ or $\mathbf{1}$ is used it is essential to test the value of ifail on exit.
On exit: ${\mathbf{ifail}}={\mathbf{0}}$ unless the routine detects an error or a warning has been flagged (see Section 6).

## 6Error Indicators and Warnings

If on entry ${\mathbf{ifail}}=0$ or $-1$, explanatory error messages are output on the current error message unit (as defined by x04aaf).
Errors or warnings detected by the routine:
${\mathbf{ifail}}=1$
On entry, at least one value of z produced a result with reduced accuracy.
Check ivalid for more information.
${\mathbf{ifail}}=2$
On entry, ${\mathbf{n}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{n}}\ge 0$.
${\mathbf{ifail}}=-99$
An unexpected error has been triggered by this routine. Please contact NAG.
See Section 7 in the Introduction to the NAG Library FL Interface for further information.
${\mathbf{ifail}}=-399$
Your licence key may have expired or may not have been installed correctly.
See Section 8 in the Introduction to the NAG Library FL Interface for further information.
${\mathbf{ifail}}=-999$
Dynamic memory allocation failed.
See Section 9 in the Introduction to the NAG Library FL Interface for further information.

## 7Accuracy

The accuracy of the returned result depends on the argument ${z}_{i}$. If ${z}_{i}$ lies in the first or second quadrant of the complex plane (i.e., $\mathrm{Im}\left({z}_{i}\right)$ is greater than or equal to zero), the result should be accurate almost to machine precision, except that there is a limit of about $18$ decimal places on the achievable accuracy because constants in the routine are given to this precision. With such arguments, ${\mathbf{ivalid}}\left(i\right)$ can only return as ${\mathbf{ivalid}}\left(i\right)=0$.
If however, $\mathrm{Im}\left({z}_{i}\right)$ is less than zero, accuracy may be lost in two ways; firstly, in the evaluation of ${e}^{-{{z}_{i}}^{2}}$, if $\mathrm{Im}\left(-{{z}_{i}}^{2}\right)$ is large, in which case a warning will be issued through ${\mathbf{ivalid}}\left(i\right)=4$ or $5$; and secondly, near the zeros of the required function, where precision is lost due to cancellation, in which case no warning is given – the result has absolute accuracy rather than relative accuracy. Note also that in this half-plane, one or both parts of the result may overflow – this is signalled through ${\mathbf{ivalid}}\left(i\right)=1$, $2$ or $3$.

## 8Parallelism and Performance

s15drf is not threaded in any implementation.

## 9Further Comments

The time taken for a call of s15drf depends on the argument ${z}_{i}$, the time increasing as $\left|{z}_{i}\right|\to 0.0$.
s15drf may be used to compute values of $\mathrm{erfc}\left({z}_{i}\right)$ and $\mathrm{erf}{z}_{i}$ for complex ${z}_{i}$ by the relations $\mathrm{erfc}\left({z}_{i}\right)={e}^{-{{z}_{i}}^{2}}w\left(i{z}_{i}\right)$, $\mathrm{erf}{z}_{i}=1-\mathrm{erfc}\left({z}_{i}\right)$. (For real arguments, s15arf and s15asf should be used.)

## 10Example

This example reads values of the argument ${z}_{i}$ from a file, evaluates the function at each value of ${z}_{i}$ and prints the results.

### 10.1Program Text

Program Text (s15drfe.f90)

### 10.2Program Data

Program Data (s15drfe.d)

### 10.3Program Results

Program Results (s15drfe.r)