WIP T-matrix of axially symmetric T-matrix.

Former-commit-id: b699e21f6693607b1a790cbdf7a0d7986c6ddff9
This commit is contained in:
Marek Nečada 2019-08-08 22:18:42 +03:00
parent c3831eec52
commit beef0ea9b8
2 changed files with 100 additions and 0 deletions

View File

@ -582,4 +582,40 @@ complex double *qpms_apply_tmatrix(
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

View File

@ -345,8 +345,72 @@ static inline qpms_tmatrix_t *qpms_tmatrix_spherical_mu0(
) {
qpms_tmatrix_t *t = qpms_tmatrix_init(bspec);
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
// Abstract types that describe T-matrix/particle/scatsystem symmetries