GSkyDir.cpp

Knödlseder Jürgen, 03/28/2013 04:15 PM

Download (7.26 KB)

 
1
/* __ Includes ___________________________________________________________ */
2
#include <iostream>
3
#include <cmath>
4
#include "GSkyDir.hpp"
5

    
6

    
7
/***********************************************************************//**
8
 * @brief GSkyDir::dist
9
 ***************************************************************************/
10
double GSkyDir::dist(const GSkyDir& dir) const
11
{
12
    double cosdis = std::sin(m_dec)*std::sin(dir.m_dec) +
13
                    std::cos(m_dec)*std::cos(dir.m_dec) *
14
                    std::cos(dir.m_ra - m_ra);
15
    double dist   = std::acos(cosdis);
16
    return dist;
17
}
18

    
19

    
20
/***********************************************************************//**
21
 * @brief GSkyDir2::dist
22
 ***************************************************************************/
23
double GSkyDir2::dist(const GSkyDir2& dir) const
24
{
25
    double cosdis = sin_dec() * dir.sin_dec() +
26
                    cos_dec() * dir.cos_dec() *
27
                    std::cos(dir.m_ra - m_ra);
28
    double dist   = std::acos(cosdis);
29
    return dist;
30
}
31

    
32

    
33
/***********************************************************************//**
34
 * @brief GSkyDir3::dist
35
 ***************************************************************************/
36
double GSkyDir3::dist(const GSkyDir3& dir) const
37
{
38
    if (!m_has_cache) {
39
        m_has_cache = true;
40
        m_sin_dec   = std::sin(m_dec);
41
        m_cos_dec   = std::cos(m_dec);
42
    }
43
    if (!dir.m_has_cache) {
44
        dir.m_has_cache = true;
45
        dir.m_sin_dec   = std::sin(dir.m_dec);
46
        dir.m_cos_dec   = std::cos(dir.m_dec);
47
    }
48
    double cosdis = m_sin_dec * dir.m_sin_dec +
49
                    m_cos_dec * dir.m_cos_dec *
50
                    std::cos(dir.m_ra - m_ra);
51
    double dist   = std::acos(cosdis);
52
    return dist;
53
}
54

    
55

    
56
/***********************************************************************//**
57
 * @brief GSkyDir4::dist
58
 ***************************************************************************/
59
double GSkyDir4::dist(const GSkyDir4& dir) const
60
{
61
    if (m_cache == NULL) {
62
        m_cache          = new cache;
63
        m_cache->sin_dec = std::sin(m_dec);
64
        m_cache->cos_dec = std::cos(m_dec);
65
    }
66
    if (dir.m_cache == NULL) {
67
        dir.m_cache          = new cache;
68
        dir.m_cache->sin_dec = std::sin(dir.m_dec);
69
        dir.m_cache->cos_dec = std::cos(dir.m_dec);
70
    }
71
    double cosdis = m_cache->sin_dec * dir.m_cache->sin_dec +
72
                    m_cache->cos_dec * dir.m_cache->cos_dec *
73
                    std::cos(dir.m_ra - m_ra);
74
    double dist   = std::acos(cosdis);
75
    return dist;
76
}
77

    
78

    
79
/***********************************************************************//**
80
 * @brief test_GSkyDir
81
 ***************************************************************************/
82
void test_GSkyDir(int nouter, int ninner)
83
{
84
    // Start timer
85
    clock_t t_start = clock();
86

    
87
    // Loop
88
    double sum = 0.0;
89
    for (int outer = 0; outer < nouter; ++outer) {
90
        GSkyDir crab( 83.6331,  22.0145);
91
        GSkyDir vela(128.8361, -45.1764);
92
        for (int inner = 0; inner < ninner; ++inner) {
93
            double dist = crab.dist(vela);
94
            sum += dist;
95
        }
96
    }
97

    
98
    // Stop timer
99
    double t_elapse = (double)(clock() - t_start) / (double)CLOCKS_PER_SEC;
100
    std::cout << "  test_GSkyDir1: CPU usage = " << t_elapse << " sec";
101
    std::cout << " sum=" << sum << std::endl;
102

    
103
    // Return
104
    return;
105
}
106

    
107

    
108
/***********************************************************************//**
109
 * @brief test_GSkyDir2
110
 ***************************************************************************/
111
void test_GSkyDir2(int nouter, int ninner)
112
{
113
    // Start timer
114
    clock_t t_start = clock();
115

    
116
    // Loop
117
    double sum = 0.0;
118
    for (int outer = 0; outer < nouter; ++outer) {
119
        GSkyDir2 crab( 83.6331,  22.0145);
120
        GSkyDir2 vela(128.8361, -45.1764);
121
        for (int inner = 0; inner < ninner; ++inner) {
122
            double dist = crab.dist(vela);
123
            sum += dist;
124
        }
125
    }
126

    
127
    // Stop timer
128
    double t_elapse = (double)(clock() - t_start) / (double)CLOCKS_PER_SEC;
129
    std::cout << "  test_GSkyDir2: CPU usage = " << t_elapse << " sec";
130
    std::cout << " sum=" << sum << std::endl;
131

    
132
    // Return
133
    return;
134
}
135

    
136

    
137
/***********************************************************************//**
138
 * @brief test_GSkyDir3
139
 ***************************************************************************/
140
void test_GSkyDir3(int nouter, int ninner)
141
{
142
    // Start timer
143
    clock_t t_start = clock();
144

    
145
    // Loop
146
    double sum = 0.0;
147
    for (int outer = 0; outer < nouter; ++outer) {
148
        GSkyDir3 crab( 83.6331,  22.0145);
149
        GSkyDir3 vela(128.8361, -45.1764);
150
        for (int inner = 0; inner < ninner; ++inner) {
151
            double dist = crab.dist(vela);
152
            sum += dist;
153
        }
154
    }
155

    
156
    // Stop timer
157
    double t_elapse = (double)(clock() - t_start) / (double)CLOCKS_PER_SEC;
158
    std::cout << "  test_GSkyDir3: CPU usage = " << t_elapse << " sec";
159
    std::cout << " sum=" << sum << std::endl;
160

    
161
    // Return
162
    return;
163
}
164

    
165

    
166
/***********************************************************************//**
167
 * @brief test_GSkyDir4
168
 ***************************************************************************/
169
void test_GSkyDir4(int nouter, int ninner)
170
{
171
    // Start timer
172
    clock_t t_start = clock();
173

    
174
    // Loop
175
    double sum = 0.0;
176
    for (int outer = 0; outer < nouter; ++outer) {
177
        GSkyDir4 crab( 83.6331,  22.0145);
178
        GSkyDir4 vela(128.8361, -45.1764);
179
        for (int inner = 0; inner < ninner; ++inner) {
180
            double dist = crab.dist(vela);
181
            sum += dist;
182
        }
183
    }
184

    
185
    // Stop timer
186
    double t_elapse = (double)(clock() - t_start) / (double)CLOCKS_PER_SEC;
187
    std::cout << "  test_GSkyDir4: CPU usage = " << t_elapse << " sec";
188
    std::cout << " sum=" << sum << std::endl;
189

    
190
    // Return
191
    return;
192
}
193

    
194

    
195
/***********************************************************************//**
196
 * @brief Main
197
 ***************************************************************************/
198
int main(void)
199
{
200
    // Test 10000000 outer, 1 inner
201
    std::cout << "Test 10000000 outer, 1 inner" << std::endl;
202
    test_GSkyDir(10000000, 1);
203
    test_GSkyDir2(10000000, 1);
204
    test_GSkyDir3(10000000, 1);
205
    test_GSkyDir4(10000000, 1);
206

    
207
    // Test 5000000 outer, 2 inner
208
    std::cout << "Test 5000000 outer, 2 inner" << std::endl;
209
    test_GSkyDir(5000000, 2);
210
    test_GSkyDir2(5000000, 2);
211
    test_GSkyDir3(5000000, 2);
212
    test_GSkyDir4(5000000, 2);
213

    
214
    // Test 3333333 outer, 3 inner
215
    std::cout << "Test 3333333 outer, 3 inner" << std::endl;
216
    test_GSkyDir(3333333, 3);
217
    test_GSkyDir2(3333333, 3);
218
    test_GSkyDir3(3333333, 3);
219
    test_GSkyDir4(3333333, 3);
220

    
221
    // Test 1000000 outer, 10 inner
222
    std::cout << "Test 1000000 outer, 10 inner" << std::endl;
223
    test_GSkyDir(1000000, 10);
224
    test_GSkyDir2(1000000, 10);
225
    test_GSkyDir3(1000000, 10);
226
    test_GSkyDir4(1000000, 10);
227

    
228
    // Test 100000 outer, 100 inner
229
    std::cout << "Test 100000 outer, 100 inner" << std::endl;
230
    test_GSkyDir(100000, 100);
231
    test_GSkyDir2(100000, 100);
232
    test_GSkyDir3(100000, 100);
233
    test_GSkyDir4(100000, 100);
234

    
235
    // Test 10000 outer, 1000 inner
236
    std::cout << "Test 10000 outer, 1000 inner" << std::endl;
237
    test_GSkyDir(10000, 1000);
238
    test_GSkyDir2(10000, 1000);
239
    test_GSkyDir3(10000, 1000);
240
    test_GSkyDir4(10000, 1000);
241

    
242
    // Exit
243
    return 0;
244
}
245