WIP T-matrix of axially symmetric T-matrix.
Former-commit-id: b699e21f6693607b1a790cbdf7a0d7986c6ddff9
This commit is contained in:
parent
c3831eec52
commit
beef0ea9b8
|
@ -582,4 +582,40 @@ complex double *qpms_apply_tmatrix(
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qpms_arc_function_retval_t qpms_arc_sphere(double theta, const void *R) {
|
||||||
|
qpms_arc_function_retval_t retval = {*(const double*)R, 0};
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
qpms_arc_function_retval_t qpms_arc_cylinder(double theta, const void *param) {
|
||||||
|
const qpms_arc_cylinder_params_t *p = param;
|
||||||
|
double thresh = atan(2 * p->R / p->h);
|
||||||
|
QPMS_ENSURE(theta >= 0 && theta <= M_PI,
|
||||||
|
"theta = %g, but it must lie in interval [0, M_PI]", theta);
|
||||||
|
qpms_arc_function_retval_t res;
|
||||||
|
if (theta < thresh) {
|
||||||
|
// Upper base
|
||||||
|
res.r = 0.5 * p->h / cos(theta);
|
||||||
|
res.beta = -theta;
|
||||||
|
} else if (theta <= M_PI - thresh) {
|
||||||
|
// Side
|
||||||
|
res.r = p->R / cos(theta - M_PI_2);
|
||||||
|
res.beta = -theta + M_PI_2;
|
||||||
|
} else {
|
||||||
|
// Lower base
|
||||||
|
res.r = 0.5 * p->h / cos(theta - M_PI);
|
||||||
|
res.beta = -theta + M_PI;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
qpms_errno_t qpms_tmatrix_axialsym_fill(
|
||||||
|
qpms_tmatrix_t *t, complex double omega, qpms_epsmu_generator_t outside,
|
||||||
|
qpms_epsmu_generator_t inside,qpms_arc_function_t shape)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -345,8 +345,72 @@ static inline qpms_tmatrix_t *qpms_tmatrix_spherical_mu0(
|
||||||
) {
|
) {
|
||||||
qpms_tmatrix_t *t = qpms_tmatrix_init(bspec);
|
qpms_tmatrix_t *t = qpms_tmatrix_init(bspec);
|
||||||
qpms_tmatrix_spherical_mu0_fill(t, a, omega, epsilon_fg, epsilon_bg);
|
qpms_tmatrix_spherical_mu0_fill(t, a, omega, epsilon_fg, epsilon_bg);
|
||||||
|
return t;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Return value type for qpms_arc_function_t.
|
||||||
|
typedef struct qpms_arc_function_retval_t {
|
||||||
|
double r; ///< Distance from the origin.
|
||||||
|
double beta; ///< Angle between surface normal and radial direction.
|
||||||
|
} qpms_arc_function_retval_t;
|
||||||
|
|
||||||
|
/// Prototype for general parametrisation of \f$ C_\infty \f$-symmetric particle's surface.
|
||||||
|
typedef struct qpms_arc_function_t {
|
||||||
|
/// Arc parametrisation function.
|
||||||
|
/** TODO link to notes.
|
||||||
|
*
|
||||||
|
* Implemented by:
|
||||||
|
* qpms_arc_cylinder(),
|
||||||
|
* qpms_arc_sphere().
|
||||||
|
*/
|
||||||
|
qpms_arc_function_retval_t (*function) (
|
||||||
|
double theta, ///< Polar angle from interval \f$ [0, \pi] \f$.
|
||||||
|
const void *params ///< Pointer to implementation specific parameters.
|
||||||
|
);
|
||||||
|
const void *params;
|
||||||
|
} qpms_arc_function_t;
|
||||||
|
|
||||||
|
/// Parameter structure for qpms_arc_cylinder().
|
||||||
|
typedef struct qpms_arc_cylinder_params_t {
|
||||||
|
double R; ///< Cylinder radius.
|
||||||
|
double h; ///< Cylinder height.
|
||||||
|
} qpms_arc_cylinder_params_t;
|
||||||
|
|
||||||
|
/// Arc parametrisation of cylindrical particle; for qpms_arc_function_t.
|
||||||
|
qpms_arc_function_retval_t qpms_arc_cylinder(double theta,
|
||||||
|
const void *params; ///< Points to qpms_arc_cylinder_params_t
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Arc parametrisation of spherical particle; for qpms_arc_function_t.
|
||||||
|
/** Useful mostly only for benchmarks, as one can use the Mie-Lorentz solution. */
|
||||||
|
qpms_arc_function_retval_t qpms_arc_sphere(double theta,
|
||||||
|
const void *R; ///< Points to double containing particle's radius.
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/// Replaces T-matrix contents with those of a particle with \f$ C_\infty \f$ symmetry.
|
||||||
|
qpms_errno_t qpms_tmatrix_axialsym_fill(
|
||||||
|
qpms_tmatrix_t *t, ///< T-matrix whose contents are to be replaced. Not NULL.
|
||||||
|
complex double omega, ///< Angular frequency.
|
||||||
|
qpms_epsmu_generator_t outside, ///< Optical properties of the outside medium.
|
||||||
|
qpms_epsmu_generator_t inside, ///< Optical properties of the particle's material.
|
||||||
|
qpms_arc_function_t shape ///< Particle surface parametrisation.
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Creates a new T-matrix of a particle with \f$ C_\infty \f$ symmetry.
|
||||||
|
static inline qpms_tmatrix_t *qpms_tmatrix_axialsym(
|
||||||
|
const qpms_vswf_set_spec_t *bspec,
|
||||||
|
complex double omega, ///< Angular frequency.
|
||||||
|
qpms_epsmu_generator_t outside, ///< Optical properties of the outside medium.
|
||||||
|
qpms_epsmu_generator_t inside, ///< Optical properties of the particle's material.
|
||||||
|
qpms_arc_function_t shape ///< Particle surface parametrisation.
|
||||||
|
) {
|
||||||
|
qpms_tmatrix_t *t = qpms_tmatrix_init(bspec);
|
||||||
|
qpms_tmatrix_axialsym_fill(t, omega, outside, inside, shape);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// Abstract types that describe T-matrix/particle/scatsystem symmetries
|
// Abstract types that describe T-matrix/particle/scatsystem symmetries
|
||||||
|
|
Loading…
Reference in New Issue