|
|
TODO |
|
|
\ No newline at end of file |
|
|
Programming language:
|
|
|
* static codes `st-wslda`: [C99](https://en.wikipedia.org/wiki/C99) standard
|
|
|
* time dependent codes `td-wslda`: mixture of [C99](https://en.wikipedia.org/wiki/C99) and [CUDA](https://en.wikipedia.org/wiki/CUDA).
|
|
|
|
|
|
In general CUDA is compatible with C99. Thus, in practice when editing files (*predefines.h*, *problem-definition.h* or *logger.h*) you can use C language irrespectively to code variants (`st` or `td`). There is only one exception related to function `delta_ext` in *problem-definition.h* file. It declaration is
|
|
|
* static codes `st-wslda`:
|
|
|
```c
|
|
|
double complex delta_ext(int ix, int iy, int iz, int it, double complex delta, double *params, size_t extra_data_size, void *extra_data)
|
|
|
```
|
|
|
* time dependent codes `td-wslda`:
|
|
|
```cuda
|
|
|
__device__ Complex delta_ext(int ix, int iy, int iz, int it, Complex delta, double *params, size_t extra_data_size, void *extra_data)
|
|
|
```
|
|
|
|
|
|
The change arises from incompatibility of complex type in C99 and CUDA. Namely:
|
|
|
* `st-wslda`: return type must be C99 [double complex](https://en.cppreference.com/w/c/numeric/complex)
|
|
|
* `td-wslda`: return type must be compatible with [CUDA Complex](https://thrust.github.io/doc/group__complex__numbers.html)
|
|
|
|
|
|
Below we provide example of the same code written in both standards:
|
|
|
* C99
|
|
|
```c
|
|
|
double complex delta_ext(int ix, int iy, int iz, int it, double complex delta, double *params, size_t extra_data_size, void *extra_data)
|
|
|
{
|
|
|
double complex D = 1.0 + I*2.0; // assign value
|
|
|
double complex Dc = conj(D); // complex conjugate
|
|
|
double absolute_value = cabs(D);
|
|
|
double phase = carg(D);
|
|
|
double real_part = creal(D);
|
|
|
double imginary_part = cimag(D);
|
|
|
double complex exponentiation = cexp(D);
|
|
|
double complex power = cpow(D, 2);
|
|
|
// ...
|
|
|
|
|
|
return D;
|
|
|
}
|
|
|
```
|
|
|
* CUDA
|
|
|
```cuda
|
|
|
__device__ Complex delta_ext(int ix, int iy, int iz, int it, Complex delta, double *params, size_t extra_data_size, void *extra_data)
|
|
|
{
|
|
|
Complex D = Complex(1.0,2.0); // assign value
|
|
|
Complex Dc = thrust::conj(D); // complex conjugate
|
|
|
double absolute_value = thrust::abs(D);
|
|
|
double phase = thrust::arg(D);
|
|
|
double real_part = D.real();
|
|
|
double imginary_part = D.imag();
|
|
|
Complex exponentiation = thrust::exp(D);
|
|
|
Complex power = thrust::pow(D, 2);
|
|
|
// ...
|
|
|
|
|
|
return D;
|
|
|
}
|
|
|
``` |