File size: 3,675 Bytes
10f2621
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
109
110
111
112
113
114
115
116
117
118
#ifndef H_TABIPB_PARTICLES_STRUCT_H
#define H_TABIPB_PARTICLES_STRUCT_H

#include <vector>
#include <cstdlib>

#include "timer.h"
#include "molecule.h"
#include "params.h"

struct Timers_Particles;

class Particles
{
private:
    const class Molecule& molecule_;
    const struct Params& params_;
    struct Timers_Particles& timers_;
    
    std::size_t num_;
    std::size_t num_faces_;
    double surface_area_;
    
    std::vector<std::size_t> face_x_;
    std::vector<std::size_t> face_y_;
    std::vector<std::size_t> face_z_;
    
    std::vector<double> x_;
    std::vector<double> y_;
    std::vector<double> z_;
    
    std::vector<double> nx_;
    std::vector<double> ny_;
    std::vector<double> nz_;
    
    std::vector<double> area_;
    std::vector<double> source_term_;
    
    std::vector<double> target_charge_;
    std::vector<double> target_charge_dx_;
    std::vector<double> target_charge_dy_;
    std::vector<double> target_charge_dz_;
    
    std::vector<double> source_charge_;
    std::vector<double> source_charge_dx_;
    std::vector<double> source_charge_dy_;
    std::vector<double> source_charge_dz_;

    std::vector<std::size_t> order_;
    
    void generate_particles(Params::Mesh, double, double);
    void update_source_term_on_host() const;
    
public:
    Particles(const class Molecule&, const struct Params&, struct Timers_Particles&);
    ~Particles() = default;
    
    int partition_8(std::size_t, std::size_t, std::array<std::size_t, 16>&);
    void reorder();
    void unorder(std::vector<double>& potential);
    
    void compute_charges(const double* potential);
    
    const std::array<double, 6> bounds(std::size_t begin, std::size_t end) const;
    double compute_solvation_energy(std::vector<double>& potential) const;
    
    void output_VTK(const std::vector<double>& potential) const;
    
    std::size_t num() const { return num_; };
    double surface_area() const { return surface_area_; };
    
    const double* x_ptr() const { return x_.data(); };
    const double* y_ptr() const { return y_.data(); };
    const double* z_ptr() const { return z_.data(); };
    
    const double* nx_ptr() const { return nx_.data(); };
    const double* ny_ptr() const { return ny_.data(); };
    const double* nz_ptr() const { return nz_.data(); };
    
    const double* area_ptr() const { return area_.data(); };
    const double* source_term_ptr() const { return source_term_.data(); };
    
    const double* target_charge_ptr()    const { return target_charge_.data(); };
    const double* target_charge_dx_ptr() const { return target_charge_dx_.data(); };
    const double* target_charge_dy_ptr() const { return target_charge_dy_.data(); };
    const double* target_charge_dz_ptr() const { return target_charge_dz_.data(); };
    
    const double* source_charge_ptr()    const { return source_charge_.data(); };
    const double* source_charge_dx_ptr() const { return source_charge_dx_.data(); };
    const double* source_charge_dy_ptr() const { return source_charge_dy_.data(); };
    const double* source_charge_dz_ptr() const { return source_charge_dz_.data(); };
    
    void compute_source_term();
    void copyin_to_device() const;
    void delete_from_device() const;
};


struct Timers_Particles
{
    Timer ctor;
    Timer compute_source_term;
    Timer compute_charges;
    Timer compute_solvation_energy;
    Timer copyin_to_device;
    Timer delete_from_device;
    Timer output_VTK;
    
    void print() const;
    std::string get_durations() const;
    std::string get_headers() const;

    Timers_Particles() = default;
    ~Timers_Particles() = default;
};

#endif /* H_PARTICLE_STRUCT_H */