v0.16.0
Loading...
Searching...
No Matches
SourceFunction.hpp
Go to the documentation of this file.
1/**
2 * \file SourceFunction.hpp
3 * \example mofem/tutorials/scl-10/src/SourceFunction.hpp
4 *
5 * Source function for photon diffusion problem.
6 */
7
8#include <boost/math/quadrature/gauss_kronrod.hpp>
9using namespace boost::math::quadrature;
10
11#include <stdlib.h>
12#include <cmath>
13#include <MoFEM.hpp>
14
15using namespace MoFEM;
16
17
18namespace SourceFunction {
19 /**
20 * @brief Pulse is infinitely short.
21 *
22 * \note It is good approximation of pulse in femtosecond scale. To make it
23 * longer one can apply third integral over time.
24 *
25 * \note Note analysis in photon_diffusion is shifted in time by initial_time.
26 *
27 * @param x
28 * @param y
29 * @param z
30 * @return double
31 */
32
33 //! [sourceFunction]
34 double sourceFunctionEval(const double x, const double y, const double z, const double beam_radius, const double beam_centre_x,
35 const double beam_centre_y, const double slab_thickness, const double mu_a, const double mu_sp,
36 const double flux_magnitude, double initial_time, const double v, const double D) {
37 const double A = 4. * D * v * initial_time;
38 const double T =
39 (v / pow(M_PI * A, 3. / 2.)) * exp(-mu_a * v * initial_time);
40
41 auto phi_pulse = [&](const double r_s, const double phi_s) {
42 const double xs = r_s * cos(phi_s);
43 const double ys = r_s * sin(phi_s);
44 const double xp = x - xs - beam_centre_x;
45 const double yp = y - ys - beam_centre_y;
46 const double zp1 = z + slab_thickness / 2. - 1. / mu_sp;
47 const double zp2 = z + slab_thickness / 2. + 1. / mu_sp;
48 const double P1 = xp * xp + yp * yp + zp1 * zp1;
49 const double P2 = xp * xp + yp * yp + zp2 * zp2;
50 return r_s * (exp(-P1 / A) - exp(-P2 / A));
51 };
52
53 auto f = [&](const double r_s) {
54 auto g = [&](const double phi_s) { return phi_pulse(r_s, phi_s); };
55 return gauss_kronrod<double, 15>::integrate(
56 g, 0, 2 * M_PI, 0, std::numeric_limits<float>::epsilon());
57 };
58
59 return T * flux_magnitude *
60 gauss_kronrod<double, 15>::integrate(
61 f, 0, beam_radius, 0, std::numeric_limits<float>::epsilon());
62 };
63 //! [sourceFunction]
64 };
double mu_sp
scattering coefficient (cm^-1)
double flux_magnitude
impulse magnitude
double beam_centre_y
double beam_centre_x
double slab_thickness
double beam_radius
double initial_time
double D
double mu_a
absorption coefficient (cm^-1)
const double v
phase velocity of light in medium (cm/ns)
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
double sourceFunctionEval(const double x, const double y, const double z, const double beam_radius, const double beam_centre_x, const double beam_centre_y, const double slab_thickness, const double mu_a, const double mu_sp, const double flux_magnitude, double initial_time, const double v, const double D)
Pulse is infinitely short.
constexpr AssemblyType A
constexpr double g