aboutsummaryrefslogtreecommitdiff
path: root/Source/QED/QuantumSyncEngineWrapper.cpp
blob: 90bd9cefc2e03794d58fababb239fd1036b1e38e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "QuantumSyncEngineWrapper.h"
//This file provides a wrapper aroud the quantum_sync engine
//provided by the PICSAR library

// Functors ==================================

// Initialization of the optical depth
AMREX_GPU_DEVICE
amrex::Real
QuantumSynchrotronGetOpticalDepth::operator() () const
{
    return WarpXQuantumSynchrotronWrapper::
        internal_get_optical_depth(amrex::Random());
}
//____________________________________________

// Evolution of the optical depth (returns true if
// an event occurs)
AMREX_GPU_DEVICE
bool QuantumSynchrotronEvolveOpticalDepth::operator()(
    amrex::Real px, amrex::Real py, amrex::Real pz, 
    amrex::Real ex, amrex::Real ey, amrex::Real ez,
    amrex::Real bx, amrex::Real by, amrex::Real bz,
    amrex::Real dt, amrex::Real& opt_depth) const
{
    bool has_event_happend = false;
    amrex::Real dummy_lambda = 1.0;
    amrex::Real unused_event_time = 0.0;

    const auto table = picsar::multi_physics::lookup_1d<amrex::Real>
        (innards->KKfunc_data.size(),
         innards->KKfunc_coords.data(),
         innards->KKfunc_data.data());

    WarpXQuantumSynchrotronWrapper::internal_evolve_opt_depth_and_determine_event(
        px, py, pz,
        ex, ey, ez,
        bx, by, bz,
        dt, opt_depth, 
        has_event_happend, unused_event_time,
        dummy_lambda, 
        table,
        innards->ctrl);

    return has_event_happend;
}

// Factory class =============================

QuantumSynchrotronEngine::QuantumSynchrotronEngine (){}

//Builds the functor to evolve the optical depth
QuantumSynchrotronGetOpticalDepth
QuantumSynchrotronEngine::build_optical_depth_functor ()
{
    return QuantumSynchrotronGetOpticalDepth();
}

//Builds the functor to evolve the optical depth
QuantumSynchrotronEvolveOpticalDepth QuantumSynchrotronEngine::build_evolve_functor ()
{
    AMREX_ALWAYS_ASSERT(lookup_tables_initialized);

    return QuantumSynchrotronEvolveOpticalDepth(&innards);         
}

//Initializes the Lookup tables using the default settings 
//provided by the library
void QuantumSynchrotronEngine::computes_lookup_tables_default ()
{
    //A control parameters structure
    //with the default values provided by the library
    WarpXQuantumSynchrotronWrapperCtrl ctrl_default;

    computes_lookup_tables(ctrl_default);

    lookup_tables_initialized = true;
}

bool QuantumSynchrotronEngine::are_lookup_tables_initialized () const
{
    return lookup_tables_initialized;
}

//Private function which actually computes the lookup tables
void QuantumSynchrotronEngine::computes_lookup_tables (
    WarpXQuantumSynchrotronWrapperCtrl ctrl)
{
    //Lambda is not actually used if S.I. units are enabled
    WarpXQuantumSynchrotronWrapper qs_engine(std::move(DummyStruct()), 1.0, ctrl);
    
    qs_engine.compute_dN_dt_lookup_table();
    //qs_engine.compute_cumulative_pair_table();

    auto qs_innards_picsar = qs_engine.export_innards();  

    //Copy data in a GPU-friendly data-structure
    innards.ctrl = qs_innards_picsar.qs_ctrl;
    innards.KKfunc_coords.assign(qs_innards_picsar.KKfunc_table_coords_ptr, 
        qs_innards_picsar.KKfunc_table_coords_ptr + 
        qs_innards_picsar.KKfunc_table_coords_how_many);
    innards.KKfunc_data.assign(qs_innards_picsar.KKfunc_table_data_ptr,
        qs_innards_picsar.KKfunc_table_data_ptr + 
        qs_innards_picsar.KKfunc_table_data_how_many);
    //____
}

//============================================