Skip to content

Commit f17537c

Browse files
authored
Merge pull request #86 from jcapriot/complex_mu_kernel
Allows complex mu values in rTE kernel
2 parents 10c3346 + 1bea0df commit f17537c

File tree

4 files changed

+29
-26
lines changed

4 files changed

+29
-26
lines changed

geoana/kernels/_extensions/_rTE.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,20 @@ void funcs::rTE(
99
double * frequencies,
1010
double * lambdas,
1111
complex_t * sigmas,
12-
double * mus,
12+
complex_t * mus,
1313
double * h,
1414
size_t n_frequency,
1515
size_t n_filter,
1616
size_t n_layers
17-
){
17+
) noexcept(true){
1818
double mu_0 = 4.0E-7*M_PI;
1919
complex_t j(0.0, 1.0);
2020

2121
complex_t k2, u, Yh, Y, tanhuh, Y0;
2222
complex_t *sigi;
23-
double *mui;
24-
double omega, mu_c, l2;
23+
complex_t *mui;
24+
double omega, l2;
25+
complex_t mu_c;
2526

2627
for(size_t i_filt=0, i=0; i_filt<n_filter; ++i_filt){
2728
l2 = lambdas[i_filt] * lambdas[i_filt];
@@ -55,12 +56,12 @@ void funcs::rTEgrad(
5556
double * frequencies,
5657
double * lambdas,
5758
complex_t * sigmas,
58-
double * mus,
59+
complex_t * mus,
5960
double * h,
6061
size_t n_frequency,
6162
size_t n_filter,
6263
size_t n_layers
63-
){
64+
) noexcept(true){
6465
double mu_0 = 4.0E-7*M_PI;
6566
complex_t j(0.0, 1.0);
6667

@@ -74,7 +75,7 @@ void funcs::rTEgrad(
7475
vec_complex_t k2s(n_layers), us(n_layers), Yhs(n_layers);
7576
vec_complex_t Ys(n_layers-1), tanhs(n_layers-1);
7677

77-
double *mui;
78+
complex_t *mui;
7879
complex_t *sigi, *TE_dhi, *TE_dmui, *TE_dsigmai;
7980
complex_t gyh0, bot, gy, gtanh, Y0;
8081
complex_t gu, gmu, gk2;

geoana/kernels/_extensions/_rTE.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ namespace funcs {
1414
double *frequencies,
1515
double *lambdas,
1616
complex_t *sigmas,
17-
double *mus,
17+
complex_t *mus,
1818
double *depths,
1919
size_t n_frequency,
2020
size_t n_filter,
2121
size_t n_layers
22-
);
22+
) noexcept(true);
2323

2424
void rTEgrad(
2525
complex_t * TE_dsigma,
@@ -28,12 +28,12 @@ namespace funcs {
2828
double * frequencies,
2929
double * lambdas,
3030
complex_t * sigmas,
31-
double * mus,
31+
complex_t * mus,
3232
double * h,
3333
size_t n_frequency,
3434
size_t n_filter,
3535
size_t n_layers
36-
);
36+
) noexcept(true);
3737
}
3838

3939
#endif

geoana/kernels/_extensions/rTE.pyx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ cdef extern from "_rTE.h" namespace "funcs":
1919
double *frequencies,
2020
double *lambdas,
2121
complex_t *sigmas,
22-
double *mus,
22+
complex_t *mus,
2323
double *thicks,
2424
SIZE_t n_frequency,
2525
SIZE_t n_filter,
2626
SIZE_t n_layers
27-
) nogil
27+
) noexcept nogil
2828

2929
void rTEgrad(
3030
complex_t * TE_dsigma,
@@ -33,12 +33,12 @@ cdef extern from "_rTE.h" namespace "funcs":
3333
double * frequencies,
3434
double * lambdas,
3535
complex_t * sigmas,
36-
double * mus,
36+
complex_t * mus,
3737
double * h,
3838
SIZE_t n_frequency,
3939
SIZE_t n_filter,
4040
SIZE_t n_layers
41-
) nogil
41+
) noexcept nogil
4242

4343
def rTE_forward(frequencies, lamb, sigma, mu, thicknesses):
4444
"""Compute reflection coefficients for Transverse Electric (TE) mode.
@@ -67,7 +67,7 @@ def rTE_forward(frequencies, lamb, sigma, mu, thicknesses):
6767
"""
6868
# Sigma and mu must be fortran contiguous
6969
sigma = np.require(sigma, dtype=np.complex128, requirements="F")
70-
mu = np.require(mu, dtype=np.float64, requirements="F")
70+
mu = np.require(mu, dtype=np.complex128, requirements="F")
7171

7272
# These just must be contiguous
7373
lamb = np.require(lamb, dtype=np.float64, requirements="C")
@@ -92,7 +92,7 @@ def rTE_forward(frequencies, lamb, sigma, mu, thicknesses):
9292
REAL_t[:] f = frequencies
9393
REAL_t[:] lam = lamb
9494
COMPLEX_t[:, :] sig = sigma
95-
REAL_t[:, :] c_mu = mu
95+
COMPLEX_t[:, :] c_mu = mu
9696
REAL_t[:] hs = thicknesses
9797

9898
cdef:
@@ -109,12 +109,13 @@ def rTE_forward(frequencies, lamb, sigma, mu, thicknesses):
109109
# Types are same size and both pairs of numbers (r, i), so can cast one to the other
110110
complex_t *out_p = <complex_t *> &out[0, 0]
111111
complex_t *sig_p = <complex_t *> &sig[0, 0]
112+
complex_t *mu_p = <complex_t *> &c_mu[0, 0]
112113
REAL_t *h_p = NULL
113114
if n_layers > 1:
114115
h_p = &hs[0]
115116

116117
with nogil:
117-
rTE(out_p, &f[0], &lam[0], sig_p, &c_mu[0, 0], h_p,
118+
rTE(out_p, &f[0], &lam[0], sig_p, mu_p, h_p,
118119
n_frequency, n_filter, n_layers)
119120

120121
return np.array(out)
@@ -153,7 +154,7 @@ def rTE_gradient(frequencies, lamb, sigma, mu, thicknesses):
153154
"""
154155
# Require that they are all the same ordering as sigma
155156
sigma = np.require(sigma, dtype=np.complex128, requirements="F")
156-
mu = np.require(mu, dtype=np.float64, requirements="F")
157+
mu = np.require(mu, dtype=np.complex128, requirements="F")
157158
lamb = np.require(lamb, dtype=np.float64, requirements="C")
158159
frequencies = np.require(frequencies, dtype=np.float64, requirements="C")
159160
thicknesses = np.require(thicknesses, dtype=np.float64, requirements="C")
@@ -176,7 +177,7 @@ def rTE_gradient(frequencies, lamb, sigma, mu, thicknesses):
176177
REAL_t[:] f = frequencies
177178
REAL_t[:] lam = lamb
178179
COMPLEX_t[:, :] sig = sigma
179-
REAL_t[:, :] c_mu = mu
180+
COMPLEX_t[:, :] c_mu = mu
180181
REAL_t[:] hs = thicknesses
181182

182183
cdef:
@@ -194,6 +195,7 @@ def rTE_gradient(frequencies, lamb, sigma, mu, thicknesses):
194195
cdef:
195196
# Types are same size and both pairs of numbers (r, i), so can cast one to the other
196197
complex_t *sig_p = <complex_t *> &sig[0, 0]
198+
complex_t *mu_p = <complex_t *> &c_mu[0, 0]
197199
complex_t *gsig_p = <complex_t *> &gsig[0, 0, 0]
198200
complex_t *gmu_p = <complex_t *> &gmu[0, 0, 0]
199201
complex_t *gh_p = NULL
@@ -203,7 +205,7 @@ def rTE_gradient(frequencies, lamb, sigma, mu, thicknesses):
203205
gh_p = <complex_t *> &gh[0, 0, 0]
204206

205207
with nogil:
206-
rTEgrad(gsig_p, gmu_p, gh_p, &f[0], &lam[0], sig_p, &c_mu[0, 0], h_p,
208+
rTEgrad(gsig_p, gmu_p, gh_p, &f[0], &lam[0], sig_p, mu_p, h_p,
207209
n_frequency, n_filter, n_layers)
208210

209211
return np.array(gsig), np.array(gh), np.array(gmu)

tests/em/fdem/test_em_fdem_layered.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -294,9 +294,9 @@ def test_rTE_jacobian(self):
294294
thicknesses = np.ones(n_layer-1)
295295
lamb = np.logspace(0, 3, n_lambda)
296296
np.random.seed(0)
297-
sigma = 1E-1*(1 + 0.1 * np.random.rand(n_layer, n_frequency))
298-
mu = mu_0 * (1 + 0.1 * np.random.rand(n_layer, n_frequency))
299-
dmu = mu_0 * 0.1 * np.random.rand(n_layer, n_frequency)
297+
sigma = 1E-1*(1 + 1E-4j + 0.1 * np.random.rand(n_layer, n_frequency))
298+
mu = mu_0 * (1 + 1.0E-4j + 0.1 * np.random.rand(n_layer, n_frequency))
299+
dmu = mu_0 * (0.1 + 1.0E-5j) * np.random.rand(n_layer, n_frequency)
300300

301301
def rte_sigma(x):
302302
sigma = x.reshape(n_layer, n_frequency)
@@ -354,8 +354,8 @@ def setUp(self):
354354
thicknesses = np.ones(n_layer-1)
355355
lamb = np.logspace(-5, -3, n_lambda)
356356
np.random.seed(123)
357-
sigma = 1E-1 * (1 + 1.0/(n_layer*n_frequency) * np.arange(n_layer*n_frequency).reshape(n_layer, n_frequency))
358-
mu = mu_0 * (1 + 1.0/(n_layer*n_frequency) * np.arange(n_layer*n_frequency).reshape(n_layer, n_frequency))
357+
sigma = 1E-1 * (1 + 1E-4j + 1.0/(n_layer*n_frequency) * np.arange(n_layer*n_frequency).reshape(n_layer, n_frequency))
358+
mu = mu_0 * (1 + 1.0E-4j + 1.0/(n_layer*n_frequency) * np.arange(n_layer*n_frequency).reshape(n_layer, n_frequency))
359359

360360
self.rTE1 = rTE_forward(frequencies, lamb, sigma, mu, thicknesses)
361361
self.rTE2 = _rTE_forward(frequencies, lamb, sigma, mu, thicknesses)

0 commit comments

Comments
 (0)