# 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)
#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.

## 4References

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$, . If you are unfamiliar with this argument you should refer to Section 4 in the Introduction to the NAG Library FL Interface for details.
For environments where it might be inappropriate to halt program execution when an error is detected, the value is recommended. If the output of error messages is undesirable, then the value $1$ is recommended. Otherwise, if you are not familiar with this argument, the recommended value is $0$. When the value 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.
${\mathbf{ifail}}=2$
On entry, ${\mathbf{n}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{n}}\ge 0$.
${\mathbf{ifail}}=-99$
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.

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)