Select Git revision
calculated_qualities.py
-
Nico Vermaas authoredNico Vermaas authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
WH_BGL_Processing.cc 86.54 KiB
//# WH_BGL_Processing.cc: Blue Gene processing for 1 second of sampled data
//#
//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
//#
//# This program is free software; you can redistribute it and/or modify
//# it under the terms of the GNU General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or
//# (at your option) any later version.
//#
//# This program is distributed in the hope that it will be useful,
//# but WITHOUT ANY WARRANTY; without even the implied warranty of
//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//# GNU General Public License for more details.
//#
//# You should have received a copy of the GNU General Public License
//# along with this program; if not, write to the Free Software
//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//#
//# $Id$
//# Always #include <lofar_config.h> first!
#include <lofar_config.h>
//# Includes
#include <CS1_BGLProc/WH_BGL_Processing.h>
#include <CS1_BGLProc/Correlator.h>
#include <CS1_BGLProc/FFT.h>
#include <CS1_BGLProc/FIR.h>
#include <Common/Timer.h>
#include <Transport/TH_MPI.h>
#include <complex>
#include <cmath>
#if defined HAVE_MASS
#include <mass.h>
#endif
#if defined HAVE_BGL
#include <rts.h>
#endif
namespace LOFAR {
namespace CS1 {
#if !defined HAVE_MASS
inline static dcomplex cosisin(double x)
{
return makedcomplex(cos(x), sin(x));
}
#endif
vector<double> WH_BGL_Processing::itsCenterFrequencies;
FIR WH_BGL_Processing::itsFIRs[NR_STATIONS][NR_POLARIZATIONS][NR_SUBBAND_CHANNELS] CACHE_ALIGNED;
fcomplex WH_BGL_Processing::samples[NR_SUBBAND_CHANNELS][NR_STATIONS][NR_SAMPLES_PER_INTEGRATION | 2][NR_POLARIZATIONS] CACHE_ALIGNED;
#if defined SPARSE_FLAGS
SparseSet WH_BGL_Processing::flags[NR_STATIONS];
#else
bitset<NR_SAMPLES_PER_INTEGRATION> WH_BGL_Processing::flags[NR_STATIONS] CACHE_ALIGNED;
#endif
unsigned WH_BGL_Processing::itsNrValidSamples[NR_BASELINES] CACHE_ALIGNED;
float WH_BGL_Processing::correlationWeights[NR_SAMPLES_PER_INTEGRATION + 1] CACHE_ALIGNED;
#if defined HAVE_BGL && !defined C_IMPLEMENTATION
static BGL_Mutex *mutex;
#endif
static NSTimer computeFlagsTimer("computeFlags", true);
static NSTimer FIRtimer("FIRtimer", true);
static NSTimer FFTtimer("FFT", true);
static NSTimer doPPFtimer("doPPF()", true);
static NSTimer doCorrelateTimer("doCorrelate()", true);
static NSTimer weightTimer("weight", true);
static NSTimer computeTimer("computing", true);
// The first subband is from -98 KHz to 98 KHz, rather than from 0 to 195 KHz.
// To avoid that the FFT outputs the channels in the wrong order (from 128 to
// 255 followed by channels 0 to 127), we multiply each second FFT input by -1.
// This is efficiently achieved by negating the FIR filter constants of all
// uneven FIR filters.
const float FIR::weights[NR_SUBBAND_CHANNELS][NR_TAPS] CACHE_ALIGNED = {
#if NR_SUBBAND_CHANNELS == 256 && NR_TAPS == 16
{ 0.011659500, -0.011535200, 0.005131880, 0.001219900,
-0.006891530, 0.011598600, -0.015420900, 1.000000000,
-0.011661800, 0.009847130, -0.005852040, 0.000558600,
0.005549120, -0.011758700, 0.011716500, 0.000414833 },
{ -0.011602000, 0.011311400, -0.004715490, -0.001878750,
0.007926170, -0.013340200, 0.019147200, -0.999948000,
0.007870030, -0.008086100, 0.004807840, 0.000105072,
-0.005967150, 0.011982000, -0.011773000, -0.000414623 },
{ 0.011544100, -0.011087500, 0.004299990, 0.002535060,
-0.008955820, 0.015071700, -0.022840300, 0.999843000,
-0.004045800, 0.006315690, -0.003759060, -0.000771025,
0.006385910, -0.012205000, 0.011829000, 0.000414214 },
{ -0.011485700, 0.010863400, -0.003885440, -0.003188740,
0.009980360, -0.016793100, 0.026500200, -0.999686000,
0.000189332, -0.004536100, 0.002705860, 0.001439170,
-0.006805360, 0.012427700, -0.011884500, -0.000413633 },
{ 0.011426900, -0.010639200, 0.003471880, 0.003839710,
-0.010999700, 0.018503900, -0.030126600, 0.999477000,
0.003699140, 0.002747570, -0.001648360, -0.002109420,
0.007225430, -0.012650100, 0.011939500, 0.000412915 },
{ -0.011367600, 0.010414900, -0.003059380, -0.004487890,
0.012013600, -0.020204200, 0.033719300, -0.999215000,
-0.007619390, -0.000950314, 0.000586709, 0.002781680,
-0.007646080, 0.012872200, -0.011993900, -0.000412106 },
{ 0.011307900, -0.010190500, 0.002647990, 0.005133180,
-0.013021900, 0.021893500, -0.037278100, 0.998901000,
0.011571200, -0.000855436, 0.000478948, -0.003455870,
0.008067240, -0.013093800, 0.012047800, 0.000411265 },
{ -0.011247800, 0.009966110, -0.002237740, -0.005775510,
0.014024700, -0.023571800, 0.040802900, -0.998535000,
-0.015554300, 0.002669450, -0.001548470, 0.004131890,
-0.008488880, 0.013315100, -0.012101100, -0.000410456 },
{ 0.011187300, -0.009741670, 0.001828700, 0.006414810,
-0.015021700, 0.025238900, -0.044293400, 0.998117000,
0.019568500, -0.004491510, 0.002621710, -0.004809650,
0.008910910, -0.013535900, 0.012153900, 0.000409752 },
{ -0.011126400, 0.009517230, -0.001420910, -0.007050970,
0.016012700, -0.026894500, 0.047749500, -0.997646000,
-0.023613500, 0.006321360, -0.003698520, 0.005489070,
-0.009333300, 0.013756200, -0.012206100, -0.000409230 },
{ 0.011065200, -0.009292840, 0.001014430, 0.007683930,
-0.016997800, 0.028538400, -0.051171100, 0.997124000,
0.027689100, -0.008158790, 0.004778750, -0.006170040,
0.009755990, -0.013976000, 0.012257600, 0.000408972 },
{ -0.011003500, 0.009068510, -0.000609294, -0.008313610,
0.017976700, -0.030170600, 0.054557800, -0.996549000,
-0.031795100, 0.010003500, -0.005862260, 0.006852470,
-0.010178900, 0.014195300, -0.012308600, -0.000409063 },
{ 0.010941500, -0.008844280, 0.000205562, 0.008939920,
-0.018949300, 0.031790600, -0.057909700, 0.995922000,
0.035931100, -0.011855400, 0.006948890, -0.007536270,
0.010602000, -0.014414000, 0.012358900, 0.000409585 },
{ -0.010879200, 0.008620160, 0.000196720, -0.009562800,
0.019915600, -0.033398500, 0.061226400, -0.995244000,
-0.040096900, 0.013714100, -0.008038500, 0.008221360,
-0.011025300, 0.014632100, -0.012408600, -0.000410621 },
{ 0.010816400, -0.008396190, -0.000597505, 0.010182200,
-0.020875300, 0.034994000, -0.064507900, 0.994513000,
0.044292300, -0.015579400, 0.009130930, -0.008907620,
0.011448600, -0.014849700, 0.012457700, 0.000412251 },
{ -0.010753400, 0.008172400, 0.000996745, -0.010797900,
0.021828400, -0.036576900, 0.067754100, -0.993731000,
-0.048517000, 0.017451100, -0.010226000, 0.009594970,
-0.011871900, 0.015066500, -0.012506100, -0.000414547 },
{ 0.010690100, -0.007948800, -0.001394390, 0.011410000,
-0.022774800, 0.038147100, -0.070964600, 0.992897000,
0.052770700, -0.019328800, 0.011323700, -0.010283300,
0.012295200, -0.015282700, 0.012553800, 0.000417579 },
{ -0.010626400, 0.007725430, 0.001790400, -0.012018300,
0.023714300, -0.039704400, 0.074139500, -0.992011000,
-0.057053200, 0.021212500, -0.012423600, 0.010972500,
-0.012718300, 0.015498200, -0.012600900, -0.000421406 },
{ 0.010562400, -0.007502300, -0.002184730, 0.012622900,
-0.024646800, 0.041248500, -0.077278600, 0.991074000,
0.061364100, -0.023101700, 0.013525800, -0.011662600,
0.013141300, -0.015712900, 0.012647200, 0.000426080 },
{ -0.010498200, 0.007279450, 0.002577320, -0.013223500,
0.025572200, -0.042779400, 0.080381600, -0.990085000,
-0.065703200, 0.024996400, -0.014630100, 0.012353300,
-0.013564100, 0.015926800, -0.012692900, -0.000431643 },
{ 0.010433600, -0.007056910, -0.002968140, 0.013820200,
-0.026490500, 0.044296800, -0.083448600, 0.989045000,
0.070070300, -0.026896100, 0.015736200, -0.013044600,
0.013986600, -0.016140000, 0.012737800, 0.000438126 },
{ -0.010368800, 0.006834680, 0.003357130, -0.014412800,
0.027401400, -0.045800700, 0.086479400, -0.987953000,
-0.074464900, 0.028800600, -0.016844000, 0.013736500,
-0.014408800, 0.016352300, -0.012782000, -0.000445550 },
{ 0.010303700, -0.006612810, -0.003744260, 0.015001400,
-0.028304900, 0.047290800, -0.089473800, 0.986810000,
0.078886800, -0.030709800, 0.017953500, -0.014428700,
0.014830600, -0.016563700, 0.012825500, 0.000453924 },
{ -0.010238400, 0.006391310, 0.004129480, -0.015585700,
0.029200900, -0.048766900, 0.092431700, -0.985617000,
-0.083335800, 0.032623200, -0.019064300, 0.015121200,
-0.015251900, 0.016774300, -0.012868200, -0.000463250 },
{ 0.010172900, -0.006170210, -0.004512750, 0.016165800,
-0.030089200, 0.050229000, -0.095353100, 0.984372000,
0.087811500, -0.034540800, 0.020176400, -0.015814000,
0.015672700, -0.016983900, 0.012910200, 0.000473514 },
{ -0.010107100, 0.005949540, 0.004894020, -0.016741600,
0.030969900, -0.051676900, 0.098237800, -0.983076000,
-0.092313600, 0.036462100, -0.021289600, 0.016506800,
-0.016092900, 0.017192600, -0.012951400, -0.000484696 },
{ 0.010041100, -0.005729310, -0.005273240, 0.017313100,
-0.031842600, 0.053110400, -0.101086000, 0.981730000,
0.096841900, -0.038386900, 0.022403700, -0.017199700,
0.016512500, -0.017400200, 0.012991800, 0.000496767 },
{ -0.009974950, 0.005509550, 0.005650390, -0.017880100,
0.032707500, -0.054529300, 0.103897000, -0.980333000,
-0.101396000, 0.040315000, -0.023518600, 0.017892400,
-0.016931400, 0.017606900, -0.013031400, -0.000509689 },
{ 0.009908570, -0.005290280, -0.006025420, 0.018442500,
-0.033564300, 0.055933600, -0.106671000, 0.978886000,
0.105975000, -0.042246100, 0.024634100, -0.018585000,
0.017349500, -0.017812500, 0.013070200, 0.000523415 },
{ -0.009842020, 0.005071530, 0.006398270, -0.019000400,
0.034413000, -0.057323100, 0.109408000, -0.977388000,
-0.110580000, 0.044180000, -0.025750100, 0.019277200,
-0.017766900, 0.018017000, -0.013108200, -0.000537896 },
{ 0.009775290, -0.004853320, -0.006768930, 0.019553700,
-0.035253500, 0.058697600, -0.112107000, 0.975840000,
0.115210000, -0.046116200, 0.026866300, -0.019969100,
0.018183300, -0.018220400, 0.013145400, 0.000553077 },
{ -0.009708410, 0.004635680, 0.007137330, -0.020102300,
0.036085600, -0.060057000, 0.114770000, -0.974242000,
-0.119864000, 0.048054700, -0.027982600, 0.020660400,
-0.018598800, 0.018422700, -0.013181700, -0.000568899 },
{ 0.009641370, -0.004418620, -0.007503460, 0.020646100,
-0.036909400, 0.061401200, -0.117395000, 0.972595000,
0.124542000, -0.049995000, 0.029098800, -0.021351200,
0.019013400, -0.018623700, 0.013217200, 0.000585302 },
{ -0.009574200, 0.004202160, 0.007867250, -0.021185100,
0.037724600, -0.062730000, 0.119983000, -0.970897000,
-0.129244000, 0.051936900, -0.030214800, 0.022041200,
-0.019426800, 0.018823600, -0.013251800, -0.000602227 },
{ 0.009506900, -0.003986340, -0.008228680, 0.021719200,
-0.038531200, 0.064043400, -0.122533000, 0.969150000,
0.133970000, -0.053880200, 0.031330400, -0.022730400,
0.019839200, -0.019022200, 0.013285600, 0.000619615 },
{ -0.009439470, 0.003771170, 0.008587720, -0.022248400,
0.039329200, -0.065341100, 0.125045000, -0.967354000,
-0.138719000, 0.055824500, -0.032445500, 0.023418700,
-0.020250300, 0.019219600, -0.013318400, -0.000637409 },
{ 0.009371930, -0.003556670, -0.008944310, 0.022772500,
-0.040118300, 0.066623100, -0.127520000, 0.965508000,
0.143491000, -0.057769600, 0.033559800, -0.024106000,
0.020660300, -0.019415600, 0.013350400, 0.000655555 },
{ -0.009304290, 0.003342870, 0.009298430, -0.023291700,
0.040898700, -0.067889200, 0.129958000, -0.963614000,
-0.148285000, 0.059715200, -0.034673200, 0.024792100,
-0.021068900, 0.019610300, -0.013381400, -0.000674005 },
{ 0.009236550, -0.003129790, -0.009650030, 0.023805700,
-0.041670100, 0.069139400, -0.132357000, 0.961670000,
0.153101000, -0.061661000, 0.035785500, -0.025477100,
0.021476100, -0.019803700, 0.013411500, 0.000692716 },
{ -0.009168730, 0.002917450, 0.009999080, -0.024314500,
0.042432500, -0.070373400, 0.134719000, -0.959678000,
-0.157939000, 0.063606700, -0.036896600, 0.026160600,
-0.021882000, 0.019995700, -0.013440700, -0.000711649 },
{ 0.009100820, -0.002705870, -0.010345600, 0.024818200,
-0.043185700, 0.071591300, -0.137043000, 0.957637000,
0.162799000, -0.065552000, 0.038006300, -0.026842800,
0.022286300, -0.020186200, 0.013469000, 0.000730774 },
{ -0.009032840, 0.002495060, 0.010689400, -0.025316500,
0.043929900, -0.072792800, 0.139329000, -0.955548000,
-0.167680000, 0.067496700, -0.039114400, 0.027523400,
-0.022689100, 0.020375300, -0.013496200, -0.000750066 },
{ 0.008964800, -0.002285070, -0.011030600, 0.025809600,
-0.044664700, 0.073977900, -0.141578000, 0.953411000,
0.172581000, -0.069440400, 0.040220700, -0.028202300,
0.023090300, -0.020562800, 0.013522500, 0.000769507 },
{ -0.008896700, 0.002075890, 0.011369100, -0.026297300,
0.045390300, -0.075146500, 0.143788000, -0.951226000,
-0.177503000, 0.071382800, -0.041325100, 0.028879500,
-0.023489900, 0.020748900, -0.013547900, -0.000789086 },
{ 0.008828540, -0.001867560, -0.011704900, 0.026779500,
-0.046106400, 0.076298500, -0.145960000, 0.948994000,
0.182445000, -0.073323800, 0.042427300, -0.029554900,
0.023887600, -0.020933400, 0.013572200, 0.000808800 },
{ -0.008760350, 0.001660090, 0.012037900, -0.027256300,
0.046813100, -0.077433700, 0.148095000, -0.946714000,
-0.187407000, 0.075262900, -0.043527300, 0.030228300,
-0.024283600, 0.021116400, -0.013595500, -0.000828649 },
{ 0.008692120, -0.001453500, -0.012368200, 0.027727600,
-0.047510200, 0.078552200, -0.150191000, 0.944386000,
0.192388000, -0.077199800, 0.044624900, -0.030899600,
0.024677800, -0.021297700, 0.013617800, 0.000848641 },
{ -0.008623860, 0.001247820, 0.012695600, -0.028193200,
0.048197700, -0.079653700, 0.152249000, -0.942012000,
-0.197388000, 0.079134300, -0.045719800, 0.031568700,
-0.025070000, 0.021477300, -0.013639100, -0.000868789 },
{ 0.008555590, -0.001043050, -0.013020200, 0.028653300,
-0.048875600, 0.080738200, -0.154269000, 0.939591000,
0.202406000, -0.081066100, 0.046811900, -0.032235500,
0.025460200, -0.021655300, 0.013659300, 0.000889109 },
{ -0.008487300, 0.000839230, 0.013341900, -0.029107700,
0.049543700, -0.081805600, 0.156252000, -0.937123000,
-0.207442000, 0.082994900, -0.047901000, 0.032900000,
-0.025848400, 0.021831600, -0.013678500, -0.000909621 },
{ 0.008419010, -0.000636364, -0.013660700, 0.029556500,
-0.050202100, 0.082855900, -0.158196000, 0.934609000,
0.212496000, -0.084920300, 0.048986900, -0.033562000,
0.026234500, -0.022006200, 0.013696600, 0.000930348 },
{ -0.008350720, 0.000434476, 0.013976600, -0.029999400,
0.050850500, -0.083888900, 0.160102000, -0.932049000,
-0.217568000, 0.086842200, -0.050069600, 0.034221300,
-0.026618500, 0.022179000, -0.013713600, -0.000951314 },
{ 0.008282450, -0.000233582, -0.014289400, 0.030436600,
-0.051489100, 0.084904600, -0.161970000, 0.929443000,
0.222657000, -0.088760100, 0.051148700, -0.034878000,
0.027000200, -0.022350000, 0.013729500, 0.000972545 },
{ -0.008214200, 0.000033699, 0.014599300, -0.030868000,
0.052117600, -0.085902800, 0.163800000, -0.926792000,
-0.227762000, 0.090673700, -0.052224200, 0.035531800,
-0.027379600, 0.022519100, -0.013744400, -0.000994065 },
{ 0.008145980, 0.000165153, -0.014906200, 0.031293500,
-0.052736100, 0.086883600, -0.165592000, 0.924095000,
0.232883000, -0.092582800, 0.053295800, -0.036182700,
0.027756600, -0.022686400, 0.013758100, 0.001015900 },
{ -0.008077800, -0.000362959, 0.015210000, -0.031713100,
0.053344600, -0.087846900, 0.167346000, -0.921353000,
-0.238020000, 0.094487100, -0.054363300, 0.036830600,
-0.028131300, 0.022851800, -0.013770700, -0.001038070 },
{ 0.008009680, 0.000559702, -0.015510700, 0.032126700,
-0.053942900, 0.088792500, -0.169062000, 0.918566000,
0.243173000, -0.096386300, 0.055426700, -0.037475400,
0.028503500, -0.023015300, 0.013782200, 0.001060610 },
{ -0.007941610, -0.000755366, 0.015808300, -0.032534400,
0.054531000, -0.089720400, 0.170740000, -0.915735000,
-0.248340000, 0.098280000, -0.056485700, 0.038117000,
-0.028873100, 0.023176800, -0.013792600, -0.001083520 },
{ 0.007873600, 0.000949933, -0.016102800, 0.032936000,
-0.055108900, 0.090630600, -0.172380000, 0.912859000,
0.253523000, -0.100168000, 0.057540100, -0.038755100,
0.029240200, -0.023336400, 0.013801800, 0.001106820 },
{ -0.007805680, -0.001143390, 0.016394100, -0.033331600,
0.055676400, -0.091523000, 0.173982000, -0.909939000,
-0.258719000, 0.102050000, -0.058589800, 0.039389900,
-0.029604600, 0.023493900, -0.013809800, -0.001130530 },
{ 0.007737840, 0.001335720, -0.016682300, 0.033721100,
-0.056233700, 0.092397600, -0.175546000, 0.906976000,
0.263929000, -0.103925000, 0.059634500, -0.040021100,
0.029966300, -0.023649400, 0.013816700, 0.001154660 },
{ -0.007670090, -0.001526900, 0.016967200, -0.034104500,
0.056780500, -0.093254300, 0.177073000, -0.903969000,
-0.269153000, 0.105794000, -0.060674200, 0.040648600,
-0.030325200, 0.023802800, -0.013822400, -0.001179210 },
{ 0.007602450, 0.001716930, -0.017248900, 0.034481800,
-0.057317000, 0.094092900, -0.178561000, 0.900919000,
0.274389000, -0.107656000, 0.061708600, -0.041272400,
0.030681200, -0.023954100, 0.013826900, 0.001204190 },
{ -0.007534920, -0.001905780, 0.017527400, -0.034852800,
0.057842900, -0.094913600, 0.180012000, -0.897826000,
-0.279638000, 0.109510000, -0.062737600, 0.041892300,
-0.031034400, 0.024103300, -0.013830200, -0.001229590 },
{ 0.007467500, 0.002093450, -0.017802500, 0.035217700,
-0.058358400, 0.095716300, -0.181426000, 0.894690000,
0.284899000, -0.111357000, 0.063761000, -0.042508200,
0.031384600, -0.024250300, 0.013832300, 0.001255410 },
{ -0.007400210, -0.002279910, 0.018074400, -0.035576300,
0.058863300, -0.096500800, 0.182801000, -0.891512000,
-0.290172000, 0.113196000, -0.064778500, 0.043120000,
-0.031731800, 0.024395100, -0.013833100, -0.001281660 },
{ 0.007333050, 0.002465150, -0.018342900, 0.035928600,
-0.059357700, 0.097267200, -0.184139000, 0.888292000,
0.295456000, -0.115027000, 0.065790100, -0.043727700,
0.032075900, -0.024537700, 0.013832800, 0.001308310 },
{ -0.007266020, -0.002649160, 0.018608200, -0.036274700,
0.059841400, -0.098015500, 0.185440000, -0.885030000,
-0.300751000, 0.116849000, -0.066795600, 0.044331000,
-0.032416900, 0.024678000, -0.013831200, -0.001335360 },
{ 0.007199140, 0.002831930, -0.018870000, 0.036614400,
-0.060314500, 0.098745500, -0.186703000, 0.881727000,
0.306057000, -0.118663000, 0.067794800, -0.044930000,
0.032754700, -0.024816100, 0.013828300, 0.001362810 },
{ -0.007132410, -0.003013430, 0.019128500, -0.036947800,
0.060777000, -0.099457400, 0.187929000, -0.878383000,
-0.311372000, 0.120467000, -0.068787400, 0.045524500,
-0.033089200, 0.024951900, -0.013824200, -0.001390630 },
{ 0.007065840, 0.003193670, -0.019383500, 0.037274800,
-0.061228700, 0.100151000, -0.189118000, 0.874998000,
0.316697000, -0.122261000, 0.069773400, -0.046114300,
0.033420400, -0.025085300, 0.013818800, 0.001418820 },
{ -0.006999420, -0.003372610, 0.019635200, -0.037595400,
0.061669700, -0.100826000, 0.190269000, -0.871573000,
-0.322032000, 0.124046000, -0.070752600, 0.046699500,
-0.033748200, 0.025216300, -0.013812100, -0.001447370 },
{ 0.006933170, 0.003550250, -0.019883400, 0.037909600,
-0.062100000, 0.101483000, -0.191383000, 0.868108000,
0.327374000, -0.125821000, 0.071724700, -0.047279900,
0.034072600, -0.025345000, 0.013804200, 0.001476260 },
{ -0.006867080, -0.003726580, 0.020128100, -0.038217400,
0.062519400, -0.102122000, 0.192461000, -0.864602000,
-0.332726000, 0.127585000, -0.072689700, 0.047855300,
-0.034393500, 0.025471200, -0.013794900, -0.001505490 },
{ 0.006801170, 0.003901590, -0.020369400, 0.038518700,
-0.062928100, 0.102742000, -0.193501000, 0.861058000,
0.338085000, -0.129339000, 0.073647200, -0.048425700,
0.034710800, -0.025595000, 0.013784300, 0.001535060 },
{ -0.006735430, -0.004075260, 0.020607200, -0.038813500,
0.063325900, -0.103344000, 0.194505000, -0.857474000,
-0.343451000, 0.131082000, -0.074597300, 0.048991000,
-0.035024600, 0.025716300, -0.013772400, -0.001564950 },
{ 0.006669880, 0.004247570, -0.020841500, 0.039101900,
-0.063712900, 0.103928000, -0.195471000, 0.853851000,
0.348824000, -0.132813000, 0.075539700, -0.049551100,
0.035334600, -0.025835000, 0.013759200, 0.001595150 },
{ -0.006604510, -0.004418520, 0.021072300, -0.039383700,
0.064089100, -0.104493000, 0.196402000, -0.850190000,
-0.354204000, 0.134532000, -0.076474100, 0.050105900,
-0.035641000, 0.025951300, -0.013744600, -0.001625680 },
{ 0.006539330, 0.004588100, -0.021299500, 0.039659100,
-0.064454400, 0.105040000, -0.197295000, 0.846491000,
0.359590000, -0.136240000, 0.077400500, -0.050655300,
0.035943500, -0.026065000, 0.013728700, 0.001656520 },
{ -0.006474340, -0.004756290, 0.021523200, -0.039927800,
0.064808800, -0.105568000, 0.198153000, -0.842754000,
-0.364982000, 0.137935000, -0.078318700, 0.051199100,
-0.036242200, 0.026176100, -0.013711400, -0.001687680 },
{ 0.006409560, 0.004923090, -0.021743400, 0.040190100,
-0.065152300, 0.106078000, -0.198974000, 0.838980000,
0.370379000, -0.139618000, 0.079228600, -0.051737300,
0.036537000, -0.026284600, 0.013692700, 0.001719160 },
{ -0.006344970, -0.005088480, 0.021959900, -0.040445700,
0.065484900, -0.106570000, 0.199758000, -0.835168000,
-0.375780000, 0.141287000, -0.080129800, 0.052269800,
-0.036827900, 0.026390400, -0.013672700, -0.001750970 },
{ 0.006280600, 0.005252450, -0.022172900, 0.040694800,
-0.065806500, 0.107043000, -0.200507000, 0.831320000,
0.381186000, -0.142944000, 0.081022300, -0.052796500,
0.037114800, -0.026493600, 0.013651200, 0.001783110 },
{ -0.006216440, -0.005415000, 0.022382300, -0.040937300,
0.066117300, -0.107498000, 0.201220000, -0.827436000,
-0.386596000, 0.144586000, -0.081905900, 0.053317300,
-0.037397500, 0.026594100, -0.013628400, -0.001815590 },
{ 0.006152510, 0.005576110, -0.022588000, 0.041173200,
-0.066417100, 0.107935000, -0.201897000, 0.823515000,
0.392009000, -0.146215000, 0.082780500, -0.053832000,
0.037676200, -0.026691800, 0.013604200, 0.001848420 },
{ -0.006088800, -0.005735770, 0.022790200, -0.041402500,
0.066706000, -0.108353000, 0.202539000, -0.819559000,
-0.397425000, 0.147830000, -0.083645800, 0.054340600,
-0.037950700, 0.026786800, -0.013578500, -0.001881610 },
{ 0.006025320, 0.005893980, -0.022988700, 0.041625200,
-0.066983900, 0.108753000, -0.203145000, 0.815568000,
0.402843000, -0.149431000, 0.084501700, -0.054843000,
0.038221000, -0.026879000, 0.013551500, 0.001915170 },
{ -0.005962090, -0.006050720, 0.023183600, -0.041841300,
0.067250900, -0.109135000, 0.203715000, -0.811542000,
-0.408264000, 0.151016000, -0.085348100, 0.055339100,
-0.038486900, 0.026968500, -0.013523000, -0.001949110 },
{ 0.005899110, 0.006205990, -0.023374800, 0.042050800,
-0.067507000, 0.109498000, -0.204250000, 0.807481000,
0.413686000, -0.152586000, 0.086184700, -0.055828800,
0.038748600, -0.027055100, 0.013493100, 0.001983430 },
{ -0.005836370, -0.006359780, 0.023562400, -0.042253600,
0.067752100, -0.109843000, 0.204751000, -0.803387000,
-0.419109000, 0.154141000, -0.087011400, 0.056312000,
-0.039005800, 0.027138800, -0.013461700, -0.002018150 },
{ 0.005773900, 0.006512080, -0.023746300, 0.042449800,
-0.067986300, 0.110170000, -0.205216000, 0.799258000,
0.424533000, -0.155681000, 0.087828100, -0.056788600,
0.039258600, -0.027219700, 0.013428900, 0.002053260 },
{ -0.005711700, -0.006662890, 0.023926500, -0.042639300,
0.068209600, -0.110479000, 0.205646000, -0.795096000,
-0.429957000, 0.157204000, -0.088634500, 0.057258500,
-0.039506900, 0.027297700, -0.013394600, -0.002088790 },
{ 0.005649770, 0.006812190, -0.024103100, 0.042822200,
-0.068422000, 0.110769000, -0.206042000, 0.790902000,
0.435380000, -0.158711000, 0.089430600, -0.057721700,
0.039750700, -0.027372700, 0.013358900, 0.002124730 },
{ -0.005588130, -0.006959980, 0.024275900, -0.042998500,
0.068623400, -0.111041000, 0.206403000, -0.786674000,
-0.440803000, 0.160201000, -0.090216100, 0.058177900,
-0.039989900, 0.027444800, -0.013321700, -0.002161090 },
{ 0.005526770, 0.007106250, -0.024445100, 0.043168100,
-0.068814000, 0.111295000, -0.206731000, 0.782415000,
0.446225000, -0.161674000, 0.090990900, -0.058627200,
0.040224400, -0.027514000, 0.013283000, 0.002197860 },
{ -0.005465700, -0.007251000, 0.024610600, -0.043331100,
0.068993700, -0.111531000, 0.207023000, -0.778123000,
-0.451645000, 0.163130000, -0.091754800, 0.059069400,
-0.040454200, 0.027580100, -0.013242800, -0.002235060 },
{ 0.005404930, 0.007394220, -0.024772300, 0.043487500,
-0.069162500, 0.111750000, -0.207282000, 0.773801000,
0.457063000, -0.164568000, 0.092507700, -0.059504500,
0.040679200, -0.027643200, 0.013201200, 0.002272680 },
{ -0.005344460, -0.007535900, 0.024930400, -0.043637200,
0.069320400, -0.111950000, 0.207508000, -0.769447000,
-0.462478000, 0.165988000, -0.093249500, 0.059932300,
-0.040899500, 0.027703300, -0.013158100, -0.002310720 },
{ 0.005284290, 0.007676030, -0.025084700, 0.043780300,
-0.069467500, 0.112132000, -0.207699000, 0.765063000,
0.467891000, -0.167391000, 0.093979900, -0.060352800,
0.041114900, -0.027760300, 0.013113400, 0.002349170 },
{ -0.005224440, -0.007814610, 0.025235300, -0.043916800,
0.069603800, -0.112296000, 0.207857000, -0.760649000,
-0.473299000, 0.168774000, -0.094698800, 0.060765800,
-0.041325400, 0.027814200, -0.013067200, -0.002388040 },
{ 0.005164890, 0.007951640, -0.025382200, 0.044046600,
-0.069729300, 0.112442000, -0.207982000, 0.756204000,
0.478704000, -0.170139000, 0.095406000, -0.061171400,
0.041530900, -0.027865000, 0.013019600, 0.002427310 },
{ -0.005105670, -0.008087110, 0.025525400, -0.044169900,
0.069844000, -0.112571000, 0.208074000, -0.751731000,
-0.484104000, 0.171485000, -0.096101500, 0.061569300,
-0.041731400, 0.027912700, -0.012970400, -0.002466990 },
{ 0.005046750, 0.008221000, -0.025664900, 0.044286500,
-0.069947900, 0.112682000, -0.208133000, 0.747228000,
0.489500000, -0.172811000, 0.096785000, -0.061959600,
0.041926900, -0.027957300, 0.012919600, 0.002507070 },
{ -0.004988160, -0.008353330, 0.025800600, -0.044396600,
0.070041100, -0.112775000, 0.208159000, -0.742698000,
-0.494890000, 0.174118000, -0.097456400, 0.062342100,
-0.042117300, 0.027998600, -0.012867400, -0.002547540 },
{ 0.004929880, 0.008484080, -0.025932700, 0.044500000,
-0.070123600, 0.112850000, -0.208153000, 0.738138000,
0.500274000, -0.175405000, 0.098115500, -0.062716700,
0.042302600, -0.028036800, 0.012813600, 0.002588390 },
{ -0.004871920, -0.008613240, 0.026060900, -0.044596900,
0.070195500, -0.112908000, 0.208114000, -0.733552000,
-0.505652000, 0.176671000, -0.098762300, 0.063083500,
-0.042482700, 0.028071700, -0.012758200, -0.002629630 },
{ 0.004814280, 0.008740820, -0.026185500, 0.044687200,
-0.070256600, 0.112949000, -0.208043000, 0.728938000,
0.511023000, -0.177917000, 0.099396500, -0.063442100,
0.042657500, -0.028103500, 0.012701300, 0.002671240 },
{ -0.004756970, -0.008866800, 0.026306400, -0.044771000,
0.070307200, -0.112972000, 0.207941000, -0.724297000,
-0.516386000, 0.179142000, -0.100018000, 0.063792700,
-0.042827100, 0.028131900, -0.012642800, -0.002713230 },
{ 0.004699970, 0.008991190, -0.026423500, 0.044848200,
-0.070347100, 0.112977000, -0.207806000, 0.719630000,
0.521742000, -0.180346000, 0.100627000, -0.064135100,
0.042991400, -0.028157100, 0.012582800, 0.002755580 },
{ -0.004643290, -0.009113970, 0.026536900, -0.044918900,
0.070376500, -0.112966000, 0.207641000, -0.714936000,
-0.527090000, 0.181528000, -0.101222000, 0.064469200,
-0.043150300, 0.028179000, -0.012521200, -0.002798310 },
{ 0.004586940, 0.009235160, -0.026646600, 0.044983100,
-0.070395400, 0.112937000, -0.207444000, 0.710218000,
0.532429000, -0.182688000, 0.101805000, -0.064795000,
0.043303700, -0.028197600, 0.012458000, 0.002841390 },
{ -0.004530910, -0.009354740, 0.026752600, -0.045040800,
0.070403800, -0.112891000, 0.207216000, -0.705474000,
-0.537759000, 0.183827000, -0.102374000, 0.065112400,
-0.043451800, 0.028212900, -0.012393300, -0.002884840 },
{ 0.004475210, 0.009472700, -0.026854800, 0.045092000,
-0.070401800, 0.112828000, -0.206957000, 0.700705000,
0.543079000, -0.184943000, 0.102930000, -0.065421200,
0.043594300, -0.028224800, 0.012327000, 0.002928660 },
{ -0.004419840, -0.009589060, 0.026953400, -0.045136800,
0.070389300, -0.112748000, 0.206667000, -0.695912000,
-0.548389000, 0.186036000, -0.103473000, 0.065721500,
-0.043731300, 0.028233400, -0.012259000, -0.002972840 },
{ 0.004364790, 0.009703800, -0.027048300, 0.045175100,
-0.070366500, 0.112651000, -0.206347000, 0.691096000,
0.553689000, -0.187106000, 0.104001000, -0.066013100,
0.043862800, -0.028238600, 0.012189500, 0.003017380 },
{ -0.004310080, -0.009816920, 0.027139400, -0.045207000,
0.070333300, -0.112537000, 0.205997000, -0.686256000,
-0.558978000, 0.188154000, -0.104516000, 0.066296000,
-0.043988600, 0.028240400, -0.012118400, -0.003062300 },
{ 0.004255710, 0.009928420, -0.027226900, 0.045232400,
-0.070289900, 0.112406000, -0.205617000, 0.681393000,
0.564255000, -0.189177000, 0.105017000, -0.066570100,
0.044108700, -0.028238700, 0.012045700, 0.003107590 },
{ -0.004201670, -0.010038300, 0.027310700, -0.045251500,
0.070236200, -0.112259000, 0.205208000, -0.676508000,
-0.569520000, 0.190177000, -0.105504000, 0.066835300,
-0.044223200, 0.028233700, -0.011971400, -0.003153250 },
{ 0.004147990, 0.010146600, -0.027390800, 0.045264300,
-0.070172300, 0.112096000, -0.204769000, 0.671600000,
0.574773000, -0.191153000, 0.105976000, -0.067091500,
0.044332000, -0.028225200, 0.011895500, 0.003199290 },
{ -0.004094650, -0.010253200, 0.027467200, -0.045270600,
0.070098300, -0.111916000, 0.204300000, -0.666671000,
-0.580013000, 0.192105000, -0.106435000, 0.067338800,
-0.044435000, 0.028213200, -0.011818000, -0.003245720 },
{ 0.004041660, 0.010358200, -0.027540000, 0.045270700,
-0.070014200, 0.111719000, -0.203803000, 0.661721000,
0.585239000, -0.193032000, 0.106879000, -0.067576900,
0.044532100, -0.028197800, 0.011738900, 0.003292530 },
{ -0.003989040, -0.010461600, 0.027609100, -0.045264500,
0.069920000, -0.111506000, 0.203277000, -0.656750000,
-0.590452000, 0.193934000, -0.107308000, 0.067805900,
-0.044623500, 0.028178800, -0.011658200, -0.003339730 },
{ 0.003936790, 0.010563400, -0.027674600, 0.045252000,
-0.069815800, 0.111277000, -0.202722000, 0.651759000,
0.595651000, -0.194811000, 0.107722000, -0.068025700,
0.044708900, -0.028156400, 0.011575800, 0.003387320 },
{ -0.003884900, -0.010663500, 0.027736400, -0.045233300,
0.069701700, -0.111032000, 0.202139000, -0.646748000,
-0.600834000, 0.195663000, -0.108122000, 0.068236100,
-0.044788500, 0.028130400, -0.011491900, -0.003435300 },
{ 0.003833390, 0.010762100, -0.027794600, 0.045208300,
-0.069577700, 0.110771000, -0.201528000, 0.641718000,
0.606003000, -0.196489000, 0.108507000, -0.068437200,
0.044862100, -0.028101000, 0.011406300, 0.003483680 },
{ -0.003782260, -0.010859000, 0.027849100, -0.045177200,
0.069443800, -0.110495000, 0.200890000, -0.636669000,
-0.611156000, 0.197289000, -0.108877000, 0.068628900,
-0.044929800, 0.028067900, -0.011319200, -0.003532460 },
{ 0.003731520, 0.010954200, -0.027900100, 0.045139900,
-0.069300200, 0.110202000, -0.200223000, 0.631601000,
0.616292000, -0.198062000, 0.109231000, -0.068811100,
0.044991400, -0.028031300, 0.011230400, 0.003581630 },
{ -0.003681160, -0.011047900, 0.027947400, -0.045096500,
0.069146800, -0.109894000, 0.199530000, -0.626516000,
-0.621413000, 0.198809000, -0.109570000, 0.068983800,
-0.045047000, 0.027991200, -0.011139900, -0.003631200 },
{ 0.003631200, 0.011139900, -0.027991200, 0.045047000,
-0.068983800, 0.109570000, -0.198809000, 0.621413000,
0.626516000, -0.199530000, 0.109894000, -0.069146800,
0.045096500, -0.027947400, 0.011047900, 0.003681160 },
{ -0.003581630, -0.011230400, 0.028031300, -0.044991400,
0.068811100, -0.109231000, 0.198062000, -0.616292000,
-0.631601000, 0.200223000, -0.110202000, 0.069300200,
-0.045139900, 0.027900100, -0.010954200, -0.003731520 },
{ 0.003532460, 0.011319200, -0.028067900, 0.044929800,
-0.068628900, 0.108877000, -0.197289000, 0.611156000,
0.636669000, -0.200890000, 0.110495000, -0.069443800,
0.045177200, -0.027849100, 0.010859000, 0.003782260 },
{ -0.003483680, -0.011406300, 0.028101000, -0.044862100,
0.068437200, -0.108507000, 0.196489000, -0.606003000,
-0.641718000, 0.201528000, -0.110771000, 0.069577700,
-0.045208300, 0.027794600, -0.010762100, -0.003833390 },
{ 0.003435300, 0.011491900, -0.028130400, 0.044788500,
-0.068236100, 0.108122000, -0.195663000, 0.600834000,
0.646748000, -0.202139000, 0.111032000, -0.069701700,
0.045233300, -0.027736400, 0.010663500, 0.003884900 },
{ -0.003387320, -0.011575800, 0.028156400, -0.044708900,
0.068025700, -0.107722000, 0.194811000, -0.595651000,
-0.651759000, 0.202722000, -0.111277000, 0.069815800,
-0.045252000, 0.027674600, -0.010563400, -0.003936790 },
{ 0.003339730, 0.011658200, -0.028178800, 0.044623500,
-0.067805900, 0.107308000, -0.193934000, 0.590452000,
0.656750000, -0.203277000, 0.111506000, -0.069920000,
0.045264500, -0.027609100, 0.010461600, 0.003989040 },
{ -0.003292530, -0.011738900, 0.028197800, -0.044532100,
0.067576900, -0.106879000, 0.193032000, -0.585239000,
-0.661721000, 0.203803000, -0.111719000, 0.070014200,
-0.045270700, 0.027540000, -0.010358200, -0.004041660 },
{ 0.003245720, 0.011818000, -0.028213200, 0.044435000,
-0.067338800, 0.106435000, -0.192105000, 0.580013000,
0.666671000, -0.204300000, 0.111916000, -0.070098300,
0.045270600, -0.027467200, 0.010253200, 0.004094650 },
{ -0.003199290, -0.011895500, 0.028225200, -0.044332000,
0.067091500, -0.105976000, 0.191153000, -0.574773000,
-0.671600000, 0.204769000, -0.112096000, 0.070172300,
-0.045264300, 0.027390800, -0.010146600, -0.004147990 },
{ 0.003153250, 0.011971400, -0.028233700, 0.044223200,
-0.066835300, 0.105504000, -0.190177000, 0.569520000,
0.676508000, -0.205208000, 0.112259000, -0.070236200,
0.045251500, -0.027310700, 0.010038300, 0.004201670 },
{ -0.003107590, -0.012045700, 0.028238700, -0.044108700,
0.066570100, -0.105017000, 0.189177000, -0.564255000,
-0.681393000, 0.205617000, -0.112406000, 0.070289900,
-0.045232400, 0.027226900, -0.009928420, -0.004255710 },
{ 0.003062300, 0.012118400, -0.028240400, 0.043988600,
-0.066296000, 0.104516000, -0.188154000, 0.558978000,
0.686256000, -0.205997000, 0.112537000, -0.070333300,
0.045207000, -0.027139400, 0.009816920, 0.004310080 },
{ -0.003017380, -0.012189500, 0.028238600, -0.043862800,
0.066013100, -0.104001000, 0.187106000, -0.553689000,
-0.691096000, 0.206347000, -0.112651000, 0.070366500,
-0.045175100, 0.027048300, -0.009703800, -0.004364790 },
{ 0.002972840, 0.012259000, -0.028233400, 0.043731300,
-0.065721500, 0.103473000, -0.186036000, 0.548389000,
0.695912000, -0.206667000, 0.112748000, -0.070389300,
0.045136800, -0.026953400, 0.009589060, 0.004419840 },
{ -0.002928660, -0.012327000, 0.028224800, -0.043594300,
0.065421200, -0.102930000, 0.184943000, -0.543079000,
-0.700705000, 0.206957000, -0.112828000, 0.070401800,
-0.045092000, 0.026854800, -0.009472700, -0.004475210 },
{ 0.002884840, 0.012393300, -0.028212900, 0.043451800,
-0.065112400, 0.102374000, -0.183827000, 0.537759000,
0.705474000, -0.207216000, 0.112891000, -0.070403800,
0.045040800, -0.026752600, 0.009354740, 0.004530910 },
{ -0.002841390, -0.012458000, 0.028197600, -0.043303700,
0.064795000, -0.101805000, 0.182688000, -0.532429000,
-0.710218000, 0.207444000, -0.112937000, 0.070395400,
-0.044983100, 0.026646600, -0.009235160, -0.004586940 },
{ 0.002798310, 0.012521200, -0.028179000, 0.043150300,
-0.064469200, 0.101222000, -0.181528000, 0.527090000,
0.714936000, -0.207641000, 0.112966000, -0.070376500,
0.044918900, -0.026536900, 0.009113970, 0.004643290 },
{ -0.002755580, -0.012582800, 0.028157100, -0.042991400,
0.064135100, -0.100627000, 0.180346000, -0.521742000,
-0.719630000, 0.207806000, -0.112977000, 0.070347100,
-0.044848200, 0.026423500, -0.008991190, -0.004699970 },
{ 0.002713230, 0.012642800, -0.028131900, 0.042827100,
-0.063792700, 0.100018000, -0.179142000, 0.516386000,
0.724297000, -0.207941000, 0.112972000, -0.070307200,
0.044771000, -0.026306400, 0.008866800, 0.004756970 },
{ -0.002671240, -0.012701300, 0.028103500, -0.042657500,
0.063442100, -0.099396500, 0.177917000, -0.511023000,
-0.728938000, 0.208043000, -0.112949000, 0.070256600,
-0.044687200, 0.026185500, -0.008740820, -0.004814280 },
{ 0.002629630, 0.012758200, -0.028071700, 0.042482700,
-0.063083500, 0.098762300, -0.176671000, 0.505652000,
0.733552000, -0.208114000, 0.112908000, -0.070195500,
0.044596900, -0.026060900, 0.008613240, 0.004871920 },
{ -0.002588390, -0.012813600, 0.028036800, -0.042302600,
0.062716700, -0.098115500, 0.175405000, -0.500274000,
-0.738138000, 0.208153000, -0.112850000, 0.070123600,
-0.044500000, 0.025932700, -0.008484080, -0.004929880 },
{ 0.002547540, 0.012867400, -0.027998600, 0.042117300,
-0.062342100, 0.097456400, -0.174118000, 0.494890000,
0.742698000, -0.208159000, 0.112775000, -0.070041100,
0.044396600, -0.025800600, 0.008353330, 0.004988160 },
{ -0.002507070, -0.012919600, 0.027957300, -0.041926900,
0.061959600, -0.096785000, 0.172811000, -0.489500000,
-0.747228000, 0.208133000, -0.112682000, 0.069947900,
-0.044286500, 0.025664900, -0.008221000, -0.005046750 },
{ 0.002466990, 0.012970400, -0.027912700, 0.041731400,
-0.061569300, 0.096101500, -0.171485000, 0.484104000,
0.751731000, -0.208074000, 0.112571000, -0.069844000,
0.044169900, -0.025525400, 0.008087110, 0.005105670 },
{ -0.002427310, -0.013019600, 0.027865000, -0.041530900,
0.061171400, -0.095406000, 0.170139000, -0.478704000,
-0.756204000, 0.207982000, -0.112442000, 0.069729300,
-0.044046600, 0.025382200, -0.007951640, -0.005164890 },
{ 0.002388040, 0.013067200, -0.027814200, 0.041325400,
-0.060765800, 0.094698800, -0.168774000, 0.473299000,
0.760649000, -0.207857000, 0.112296000, -0.069603800,
0.043916800, -0.025235300, 0.007814610, 0.005224440 },
{ -0.002349170, -0.013113400, 0.027760300, -0.041114900,
0.060352800, -0.093979900, 0.167391000, -0.467891000,
-0.765063000, 0.207699000, -0.112132000, 0.069467500,
-0.043780300, 0.025084700, -0.007676030, -0.005284290 },
{ 0.002310720, 0.013158100, -0.027703300, 0.040899500,
-0.059932300, 0.093249500, -0.165988000, 0.462478000,
0.769447000, -0.207508000, 0.111950000, -0.069320400,
0.043637200, -0.024930400, 0.007535900, 0.005344460 },
{ -0.002272680, -0.013201200, 0.027643200, -0.040679200,
0.059504500, -0.092507700, 0.164568000, -0.457063000,
-0.773801000, 0.207282000, -0.111750000, 0.069162500,
-0.043487500, 0.024772300, -0.007394220, -0.005404930 },
{ 0.002235060, 0.013242800, -0.027580100, 0.040454200,
-0.059069400, 0.091754800, -0.163130000, 0.451645000,
0.778123000, -0.207023000, 0.111531000, -0.068993700,
0.043331100, -0.024610600, 0.007251000, 0.005465700 },
{ -0.002197860, -0.013283000, 0.027514000, -0.040224400,
0.058627200, -0.090990900, 0.161674000, -0.446225000,
-0.782415000, 0.206731000, -0.111295000, 0.068814000,
-0.043168100, 0.024445100, -0.007106250, -0.005526770 },
{ 0.002161090, 0.013321700, -0.027444800, 0.039989900,
-0.058177900, 0.090216100, -0.160201000, 0.440803000,
0.786674000, -0.206403000, 0.111041000, -0.068623400,
0.042998500, -0.024275900, 0.006959980, 0.005588130 },
{ -0.002124730, -0.013358900, 0.027372700, -0.039750700,
0.057721700, -0.089430600, 0.158711000, -0.435380000,
-0.790902000, 0.206042000, -0.110769000, 0.068422000,
-0.042822200, 0.024103100, -0.006812190, -0.005649770 },
{ 0.002088790, 0.013394600, -0.027297700, 0.039506900,
-0.057258500, 0.088634500, -0.157204000, 0.429957000,
0.795096000, -0.205646000, 0.110479000, -0.068209600,
0.042639300, -0.023926500, 0.006662890, 0.005711700 },
{ -0.002053260, -0.013428900, 0.027219700, -0.039258600,
0.056788600, -0.087828100, 0.155681000, -0.424533000,
-0.799258000, 0.205216000, -0.110170000, 0.067986300,
-0.042449800, 0.023746300, -0.006512080, -0.005773900 },
{ 0.002018150, 0.013461700, -0.027138800, 0.039005800,
-0.056312000, 0.087011400, -0.154141000, 0.419109000,
0.803387000, -0.204751000, 0.109843000, -0.067752100,
0.042253600, -0.023562400, 0.006359780, 0.005836370 },
{ -0.001983430, -0.013493100, 0.027055100, -0.038748600,
0.055828800, -0.086184700, 0.152586000, -0.413686000,
-0.807481000, 0.204250000, -0.109498000, 0.067507000,
-0.042050800, 0.023374800, -0.006205990, -0.005899110 },
{ 0.001949110, 0.013523000, -0.026968500, 0.038486900,
-0.055339100, 0.085348100, -0.151016000, 0.408264000,
0.811542000, -0.203715000, 0.109135000, -0.067250900,
0.041841300, -0.023183600, 0.006050720, 0.005962090 },
{ -0.001915170, -0.013551500, 0.026879000, -0.038221000,
0.054843000, -0.084501700, 0.149431000, -0.402843000,
-0.815568000, 0.203145000, -0.108753000, 0.066983900,
-0.041625200, 0.022988700, -0.005893980, -0.006025320 },
{ 0.001881610, 0.013578500, -0.026786800, 0.037950700,
-0.054340600, 0.083645800, -0.147830000, 0.397425000,
0.819559000, -0.202539000, 0.108353000, -0.066706000,
0.041402500, -0.022790200, 0.005735770, 0.006088800 },
{ -0.001848420, -0.013604200, 0.026691800, -0.037676200,
0.053832000, -0.082780500, 0.146215000, -0.392009000,
-0.823515000, 0.201897000, -0.107935000, 0.066417100,
-0.041173200, 0.022588000, -0.005576110, -0.006152510 },
{ 0.001815590, 0.013628400, -0.026594100, 0.037397500,
-0.053317300, 0.081905900, -0.144586000, 0.386596000,
0.827436000, -0.201220000, 0.107498000, -0.066117300,
0.040937300, -0.022382300, 0.005415000, 0.006216440 },
{ -0.001783110, -0.013651200, 0.026493600, -0.037114800,
0.052796500, -0.081022300, 0.142944000, -0.381186000,
-0.831320000, 0.200507000, -0.107043000, 0.065806500,
-0.040694800, 0.022172900, -0.005252450, -0.006280600 },
{ 0.001750970, 0.013672700, -0.026390400, 0.036827900,
-0.052269800, 0.080129800, -0.141287000, 0.375780000,
0.835168000, -0.199758000, 0.106570000, -0.065484900,
0.040445700, -0.021959900, 0.005088480, 0.006344970 },
{ -0.001719160, -0.013692700, 0.026284600, -0.036537000,
0.051737300, -0.079228600, 0.139618000, -0.370379000,
-0.838980000, 0.198974000, -0.106078000, 0.065152300,
-0.040190100, 0.021743400, -0.004923090, -0.006409560 },
{ 0.001687680, 0.013711400, -0.026176100, 0.036242200,
-0.051199100, 0.078318700, -0.137935000, 0.364982000,
0.842754000, -0.198153000, 0.105568000, -0.064808800,
0.039927800, -0.021523200, 0.004756290, 0.006474340 },
{ -0.001656520, -0.013728700, 0.026065000, -0.035943500,
0.050655300, -0.077400500, 0.136240000, -0.359590000,
-0.846491000, 0.197295000, -0.105040000, 0.064454400,
-0.039659100, 0.021299500, -0.004588100, -0.006539330 },
{ 0.001625680, 0.013744600, -0.025951300, 0.035641000,
-0.050105900, 0.076474100, -0.134532000, 0.354204000,
0.850190000, -0.196402000, 0.104493000, -0.064089100,
0.039383700, -0.021072300, 0.004418520, 0.006604510 },
{ -0.001595150, -0.013759200, 0.025835000, -0.035334600,
0.049551100, -0.075539700, 0.132813000, -0.348824000,
-0.853851000, 0.195471000, -0.103928000, 0.063712900,
-0.039101900, 0.020841500, -0.004247570, -0.006669880 },
{ 0.001564950, 0.013772400, -0.025716300, 0.035024600,
-0.048991000, 0.074597300, -0.131082000, 0.343451000,
0.857474000, -0.194505000, 0.103344000, -0.063325900,
0.038813500, -0.020607200, 0.004075260, 0.006735430 },
{ -0.001535060, -0.013784300, 0.025595000, -0.034710800,
0.048425700, -0.073647200, 0.129339000, -0.338085000,
-0.861058000, 0.193501000, -0.102742000, 0.062928100,
-0.038518700, 0.020369400, -0.003901590, -0.006801170 },
{ 0.001505490, 0.013794900, -0.025471200, 0.034393500,
-0.047855300, 0.072689700, -0.127585000, 0.332726000,
0.864602000, -0.192461000, 0.102122000, -0.062519400,
0.038217400, -0.020128100, 0.003726580, 0.006867080 },
{ -0.001476260, -0.013804200, 0.025345000, -0.034072600,
0.047279900, -0.071724700, 0.125821000, -0.327374000,
-0.868108000, 0.191383000, -0.101483000, 0.062100000,
-0.037909600, 0.019883400, -0.003550250, -0.006933170 },
{ 0.001447370, 0.013812100, -0.025216300, 0.033748200,
-0.046699500, 0.070752600, -0.124046000, 0.322032000,
0.871573000, -0.190269000, 0.100826000, -0.061669700,
0.037595400, -0.019635200, 0.003372610, 0.006999420 },
{ -0.001418820, -0.013818800, 0.025085300, -0.033420400,
0.046114300, -0.069773400, 0.122261000, -0.316697000,
-0.874998000, 0.189118000, -0.100151000, 0.061228700,
-0.037274800, 0.019383500, -0.003193670, -0.007065840 },
{ 0.001390630, 0.013824200, -0.024951900, 0.033089200,
-0.045524500, 0.068787400, -0.120467000, 0.311372000,
0.878383000, -0.187929000, 0.099457400, -0.060777000,
0.036947800, -0.019128500, 0.003013430, 0.007132410 },
{ -0.001362810, -0.013828300, 0.024816100, -0.032754700,
0.044930000, -0.067794800, 0.118663000, -0.306057000,
-0.881727000, 0.186703000, -0.098745500, 0.060314500,
-0.036614400, 0.018870000, -0.002831930, -0.007199140 },
{ 0.001335360, 0.013831200, -0.024678000, 0.032416900,
-0.044331000, 0.066795600, -0.116849000, 0.300751000,
0.885030000, -0.185440000, 0.098015500, -0.059841400,
0.036274700, -0.018608200, 0.002649160, 0.007266020 },
{ -0.001308310, -0.013832800, 0.024537700, -0.032075900,
0.043727700, -0.065790100, 0.115027000, -0.295456000,
-0.888292000, 0.184139000, -0.097267200, 0.059357700,
-0.035928600, 0.018342900, -0.002465150, -0.007333050 },
{ 0.001281660, 0.013833100, -0.024395100, 0.031731800,
-0.043120000, 0.064778500, -0.113196000, 0.290172000,
0.891512000, -0.182801000, 0.096500800, -0.058863300,
0.035576300, -0.018074400, 0.002279910, 0.007400210 },
{ -0.001255410, -0.013832300, 0.024250300, -0.031384600,
0.042508200, -0.063761000, 0.111357000, -0.284899000,
-0.894690000, 0.181426000, -0.095716300, 0.058358400,
-0.035217700, 0.017802500, -0.002093450, -0.007467500 },
{ 0.001229590, 0.013830200, -0.024103300, 0.031034400,
-0.041892300, 0.062737600, -0.109510000, 0.279638000,
0.897826000, -0.180012000, 0.094913600, -0.057842900,
0.034852800, -0.017527400, 0.001905780, 0.007534920 },
{ -0.001204190, -0.013826900, 0.023954100, -0.030681200,
0.041272400, -0.061708600, 0.107656000, -0.274389000,
-0.900919000, 0.178561000, -0.094092900, 0.057317000,
-0.034481800, 0.017248900, -0.001716930, -0.007602450 },
{ 0.001179210, 0.013822400, -0.023802800, 0.030325200,
-0.040648600, 0.060674200, -0.105794000, 0.269153000,
0.903969000, -0.177073000, 0.093254300, -0.056780500,
0.034104500, -0.016967200, 0.001526900, 0.007670090 },
{ -0.001154660, -0.013816700, 0.023649400, -0.029966300,
0.040021100, -0.059634500, 0.103925000, -0.263929000,
-0.906976000, 0.175546000, -0.092397600, 0.056233700,
-0.033721100, 0.016682300, -0.001335720, -0.007737840 },
{ 0.001130530, 0.013809800, -0.023493900, 0.029604600,
-0.039389900, 0.058589800, -0.102050000, 0.258719000,
0.909939000, -0.173982000, 0.091523000, -0.055676400,
0.033331600, -0.016394100, 0.001143390, 0.007805680 },
{ -0.001106820, -0.013801800, 0.023336400, -0.029240200,
0.038755100, -0.057540100, 0.100168000, -0.253523000,
-0.912859000, 0.172380000, -0.090630600, 0.055108900,
-0.032936000, 0.016102800, -0.000949933, -0.007873600 },
{ 0.001083520, 0.013792600, -0.023176800, 0.028873100,
-0.038117000, 0.056485700, -0.098280000, 0.248340000,
0.915735000, -0.170740000, 0.089720400, -0.054531000,
0.032534400, -0.015808300, 0.000755366, 0.007941610 },
{ -0.001060610, -0.013782200, 0.023015300, -0.028503500,
0.037475400, -0.055426700, 0.096386300, -0.243173000,
-0.918566000, 0.169062000, -0.088792500, 0.053942900,
-0.032126700, 0.015510700, -0.000559702, -0.008009680 },
{ 0.001038070, 0.013770700, -0.022851800, 0.028131300,
-0.036830600, 0.054363300, -0.094487100, 0.238020000,
0.921353000, -0.167346000, 0.087846900, -0.053344600,
0.031713100, -0.015210000, 0.000362959, 0.008077800 },
{ -0.001015900, -0.013758100, 0.022686400, -0.027756600,
0.036182700, -0.053295800, 0.092582800, -0.232883000,
-0.924095000, 0.165592000, -0.086883600, 0.052736100,
-0.031293500, 0.014906200, -0.000165153, -0.008145980 },
{ 0.000994065, 0.013744400, -0.022519100, 0.027379600,
-0.035531800, 0.052224200, -0.090673700, 0.227762000,
0.926792000, -0.163800000, 0.085902800, -0.052117600,
0.030868000, -0.014599300, -0.000033699, 0.008214200 },
{ -0.000972545, -0.013729500, 0.022350000, -0.027000200,
0.034878000, -0.051148700, 0.088760100, -0.222657000,
-0.929443000, 0.161970000, -0.084904600, 0.051489100,
-0.030436600, 0.014289400, 0.000233582, -0.008282450 },
{ 0.000951314, 0.013713600, -0.022179000, 0.026618500,
-0.034221300, 0.050069600, -0.086842200, 0.217568000,
0.932049000, -0.160102000, 0.083888900, -0.050850500,
0.029999400, -0.013976600, -0.000434476, 0.008350720 },
{ -0.000930348, -0.013696600, 0.022006200, -0.026234500,
0.033562000, -0.048986900, 0.084920300, -0.212496000,
-0.934609000, 0.158196000, -0.082855900, 0.050202100,
-0.029556500, 0.013660700, 0.000636364, -0.008419010 },
{ 0.000909621, 0.013678500, -0.021831600, 0.025848400,
-0.032900000, 0.047901000, -0.082994900, 0.207442000,
0.937123000, -0.156252000, 0.081805600, -0.049543700,
0.029107700, -0.013341900, -0.000839230, 0.008487300 },
{ -0.000889109, -0.013659300, 0.021655300, -0.025460200,
0.032235500, -0.046811900, 0.081066100, -0.202406000,
-0.939591000, 0.154269000, -0.080738200, 0.048875600,
-0.028653300, 0.013020200, 0.001043050, -0.008555590 },
{ 0.000868789, 0.013639100, -0.021477300, 0.025070000,
-0.031568700, 0.045719800, -0.079134300, 0.197388000,
0.942012000, -0.152249000, 0.079653700, -0.048197700,
0.028193200, -0.012695600, -0.001247820, 0.008623860 },
{ -0.000848641, -0.013617800, 0.021297700, -0.024677800,
0.030899600, -0.044624900, 0.077199800, -0.192388000,
-0.944386000, 0.150191000, -0.078552200, 0.047510200,
-0.027727600, 0.012368200, 0.001453500, -0.008692120 },
{ 0.000828649, 0.013595500, -0.021116400, 0.024283600,
-0.030228300, 0.043527300, -0.075262900, 0.187407000,
0.946714000, -0.148095000, 0.077433700, -0.046813100,
0.027256300, -0.012037900, -0.001660090, 0.008760350 },
{ -0.000808800, -0.013572200, 0.020933400, -0.023887600,
0.029554900, -0.042427300, 0.073323800, -0.182445000,
-0.948994000, 0.145960000, -0.076298500, 0.046106400,
-0.026779500, 0.011704900, 0.001867560, -0.008828540 },
{ 0.000789086, 0.013547900, -0.020748900, 0.023489900,
-0.028879500, 0.041325100, -0.071382800, 0.177503000,
0.951226000, -0.143788000, 0.075146500, -0.045390300,
0.026297300, -0.011369100, -0.002075890, 0.008896700 },
{ -0.000769507, -0.013522500, 0.020562800, -0.023090300,
0.028202300, -0.040220700, 0.069440400, -0.172581000,
-0.953411000, 0.141578000, -0.073977900, 0.044664700,
-0.025809600, 0.011030600, 0.002285070, -0.008964800 },
{ 0.000750066, 0.013496200, -0.020375300, 0.022689100,
-0.027523400, 0.039114400, -0.067496700, 0.167680000,
0.955548000, -0.139329000, 0.072792800, -0.043929900,
0.025316500, -0.010689400, -0.002495060, 0.009032840 },
{ -0.000730774, -0.013469000, 0.020186200, -0.022286300,
0.026842800, -0.038006300, 0.065552000, -0.162799000,
-0.957637000, 0.137043000, -0.071591300, 0.043185700,
-0.024818200, 0.010345600, 0.002705870, -0.009100820 },
{ 0.000711649, 0.013440700, -0.019995700, 0.021882000,
-0.026160600, 0.036896600, -0.063606700, 0.157939000,
0.959678000, -0.134719000, 0.070373400, -0.042432500,
0.024314500, -0.009999080, -0.002917450, 0.009168730 },
{ -0.000692716, -0.013411500, 0.019803700, -0.021476100,
0.025477100, -0.035785500, 0.061661000, -0.153101000,
-0.961670000, 0.132357000, -0.069139400, 0.041670100,
-0.023805700, 0.009650030, 0.003129790, -0.009236550 },
{ 0.000674005, 0.013381400, -0.019610300, 0.021068900,
-0.024792100, 0.034673200, -0.059715200, 0.148285000,
0.963614000, -0.129958000, 0.067889200, -0.040898700,
0.023291700, -0.009298430, -0.003342870, 0.009304290 },
{ -0.000655555, -0.013350400, 0.019415600, -0.020660300,
0.024106000, -0.033559800, 0.057769600, -0.143491000,
-0.965508000, 0.127520000, -0.066623100, 0.040118300,
-0.022772500, 0.008944310, 0.003556670, -0.009371930 },
{ 0.000637409, 0.013318400, -0.019219600, 0.020250300,
-0.023418700, 0.032445500, -0.055824500, 0.138719000,
0.967354000, -0.125045000, 0.065341100, -0.039329200,
0.022248400, -0.008587720, -0.003771170, 0.009439470 },
{ -0.000619615, -0.013285600, 0.019022200, -0.019839200,
0.022730400, -0.031330400, 0.053880200, -0.133970000,
-0.969150000, 0.122533000, -0.064043400, 0.038531200,
-0.021719200, 0.008228680, 0.003986340, -0.009506900 },
{ 0.000602227, 0.013251800, -0.018823600, 0.019426800,
-0.022041200, 0.030214800, -0.051936900, 0.129244000,
0.970897000, -0.119983000, 0.062730000, -0.037724600,
0.021185100, -0.007867250, -0.004202160, 0.009574200 },
{ -0.000585302, -0.013217200, 0.018623700, -0.019013400,
0.021351200, -0.029098800, 0.049995000, -0.124542000,
-0.972595000, 0.117395000, -0.061401200, 0.036909400,
-0.020646100, 0.007503460, 0.004418620, -0.009641370 },
{ 0.000568899, 0.013181700, -0.018422700, 0.018598800,
-0.020660400, 0.027982600, -0.048054700, 0.119864000,
0.974242000, -0.114770000, 0.060057000, -0.036085600,
0.020102300, -0.007137330, -0.004635680, 0.009708410 },
{ -0.000553077, -0.013145400, 0.018220400, -0.018183300,
0.019969100, -0.026866300, 0.046116200, -0.115210000,
-0.975840000, 0.112107000, -0.058697600, 0.035253500,
-0.019553700, 0.006768930, 0.004853320, -0.009775290 },
{ 0.000537896, 0.013108200, -0.018017000, 0.017766900,
-0.019277200, 0.025750100, -0.044180000, 0.110580000,
0.977388000, -0.109408000, 0.057323100, -0.034413000,
0.019000400, -0.006398270, -0.005071530, 0.009842020 },
{ -0.000523415, -0.013070200, 0.017812500, -0.017349500,
0.018585000, -0.024634100, 0.042246100, -0.105975000,
-0.978886000, 0.106671000, -0.055933600, 0.033564300,
-0.018442500, 0.006025420, 0.005290280, -0.009908570 },
{ 0.000509689, 0.013031400, -0.017606900, 0.016931400,
-0.017892400, 0.023518600, -0.040315000, 0.101396000,
0.980333000, -0.103897000, 0.054529300, -0.032707500,
0.017880100, -0.005650390, -0.005509550, 0.009974950 },
{ -0.000496767, -0.012991800, 0.017400200, -0.016512500,
0.017199700, -0.022403700, 0.038386900, -0.096841900,
-0.981730000, 0.101086000, -0.053110400, 0.031842600,
-0.017313100, 0.005273240, 0.005729310, -0.010041100 },
{ 0.000484696, 0.012951400, -0.017192600, 0.016092900,
-0.016506800, 0.021289600, -0.036462100, 0.092313600,
0.983076000, -0.098237800, 0.051676900, -0.030969900,
0.016741600, -0.004894020, -0.005949540, 0.010107100 },
{ -0.000473514, -0.012910200, 0.016983900, -0.015672700,
0.015814000, -0.020176400, 0.034540800, -0.087811500,
-0.984372000, 0.095353100, -0.050229000, 0.030089200,
-0.016165800, 0.004512750, 0.006170210, -0.010172900 },
{ 0.000463250, 0.012868200, -0.016774300, 0.015251900,
-0.015121200, 0.019064300, -0.032623200, 0.083335800,
0.985617000, -0.092431700, 0.048766900, -0.029200900,
0.015585700, -0.004129480, -0.006391310, 0.010238400 },
{ -0.000453924, -0.012825500, 0.016563700, -0.014830600,
0.014428700, -0.017953500, 0.030709800, -0.078886800,
-0.986810000, 0.089473800, -0.047290800, 0.028304900,
-0.015001400, 0.003744260, 0.006612810, -0.010303700 },
{ 0.000445550, 0.012782000, -0.016352300, 0.014408800,
-0.013736500, 0.016844000, -0.028800600, 0.074464900,
0.987953000, -0.086479400, 0.045800700, -0.027401400,
0.014412800, -0.003357130, -0.006834680, 0.010368800 },
{ -0.000438126, -0.012737800, 0.016140000, -0.013986600,
0.013044600, -0.015736200, 0.026896100, -0.070070300,
-0.989045000, 0.083448600, -0.044296800, 0.026490500,
-0.013820200, 0.002968140, 0.007056910, -0.010433600 },
{ 0.000431643, 0.012692900, -0.015926800, 0.013564100,
-0.012353300, 0.014630100, -0.024996400, 0.065703200,
0.990085000, -0.080381600, 0.042779400, -0.025572200,
0.013223500, -0.002577320, -0.007279450, 0.010498200 },
{ -0.000426080, -0.012647200, 0.015712900, -0.013141300,
0.011662600, -0.013525800, 0.023101700, -0.061364100,
-0.991074000, 0.077278600, -0.041248500, 0.024646800,
-0.012622900, 0.002184730, 0.007502300, -0.010562400 },
{ 0.000421406, 0.012600900, -0.015498200, 0.012718300,
-0.010972500, 0.012423600, -0.021212500, 0.057053200,
0.992011000, -0.074139500, 0.039704400, -0.023714300,
0.012018300, -0.001790400, -0.007725430, 0.010626400 },
{ -0.000417579, -0.012553800, 0.015282700, -0.012295200,
0.010283300, -0.011323700, 0.019328800, -0.052770700,
-0.992897000, 0.070964600, -0.038147100, 0.022774800,
-0.011410000, 0.001394390, 0.007948800, -0.010690100 },
{ 0.000414547, 0.012506100, -0.015066500, 0.011871900,
-0.009594970, 0.010226000, -0.017451100, 0.048517000,
0.993731000, -0.067754100, 0.036576900, -0.021828400,
0.010797900, -0.000996745, -0.008172400, 0.010753400 },
{ -0.000412251, -0.012457700, 0.014849700, -0.011448600,
0.008907620, -0.009130930, 0.015579400, -0.044292300,
-0.994513000, 0.064507900, -0.034994000, 0.020875300,
-0.010182200, 0.000597505, 0.008396190, -0.010816400 },
{ 0.000410621, 0.012408600, -0.014632100, 0.011025300,
-0.008221360, 0.008038500, -0.013714100, 0.040096900,
0.995244000, -0.061226400, 0.033398500, -0.019915600,
0.009562800, -0.000196720, -0.008620160, 0.010879200 },
{ -0.000409585, -0.012358900, 0.014414000, -0.010602000,
0.007536270, -0.006948890, 0.011855400, -0.035931100,
-0.995922000, 0.057909700, -0.031790600, 0.018949300,
-0.008939920, -0.000205562, 0.008844280, -0.010941500 },
{ 0.000409063, 0.012308600, -0.014195300, 0.010178900,
-0.006852470, 0.005862260, -0.010003500, 0.031795100,
0.996549000, -0.054557800, 0.030170600, -0.017976700,
0.008313610, 0.000609294, -0.009068510, 0.011003500 },
{ -0.000408972, -0.012257600, 0.013976000, -0.009755990,
0.006170040, -0.004778750, 0.008158790, -0.027689100,
-0.997124000, 0.051171100, -0.028538400, 0.016997800,
-0.007683930, -0.001014430, 0.009292840, -0.011065200 },
{ 0.000409230, 0.012206100, -0.013756200, 0.009333300,
-0.005489070, 0.003698520, -0.006321360, 0.023613500,
0.997646000, -0.047749500, 0.026894500, -0.016012700,
0.007050970, 0.001420910, -0.009517230, 0.011126400 },
{ -0.000409752, -0.012153900, 0.013535900, -0.008910910,
0.004809650, -0.002621710, 0.004491510, -0.019568500,
-0.998117000, 0.044293400, -0.025238900, 0.015021700,
-0.006414810, -0.001828700, 0.009741670, -0.011187300 },
{ 0.000410456, 0.012101100, -0.013315100, 0.008488880,
-0.004131890, 0.001548470, -0.002669450, 0.015554300,
0.998535000, -0.040802900, 0.023571800, -0.014024700,
0.005775510, 0.002237740, -0.009966110, 0.011247800 },
{ -0.000411265, -0.012047800, 0.013093800, -0.008067240,
0.003455870, -0.000478948, 0.000855436, -0.011571200,
-0.998901000, 0.037278100, -0.021893500, 0.013021900,
-0.005133180, -0.002647990, 0.010190500, -0.011307900 },
{ 0.000412106, 0.011993900, -0.012872200, 0.007646080,
-0.002781680, -0.000586709, 0.000950314, 0.007619390,
0.999215000, -0.033719300, 0.020204200, -0.012013600,
0.004487890, 0.003059380, -0.010414900, 0.011367600 },
{ -0.000412915, -0.011939500, 0.012650100, -0.007225430,
0.002109420, 0.001648360, -0.002747570, -0.003699140,
-0.999477000, 0.030126600, -0.018503900, 0.010999700,
-0.003839710, -0.003471880, 0.010639200, -0.011426900 },
{ 0.000413633, 0.011884500, -0.012427700, 0.006805360,
-0.001439170, -0.002705860, 0.004536100, -0.000189332,
0.999686000, -0.026500200, 0.016793100, -0.009980360,
0.003188740, 0.003885440, -0.010863400, 0.011485700 },
{ -0.000414214, -0.011829000, 0.012205000, -0.006385910,
0.000771025, 0.003759060, -0.006315690, 0.004045800,
-0.999843000, 0.022840300, -0.015071700, 0.008955820,
-0.002535060, -0.004299990, 0.011087500, -0.011544100 },
{ 0.000414623, 0.011773000, -0.011982000, 0.005967150,
-0.000105072, -0.004807840, 0.008086100, -0.007870030,
0.999948000, -0.019147200, 0.013340200, -0.007926170,
0.001878750, 0.004715490, -0.011311400, 0.011602000 },
{ -0.000414833, -0.011716500, 0.011758700, -0.005549120,
-0.000558600, 0.005852040, -0.009847130, 0.011661800,
-1.000000000, 0.015420900, -0.011598600, 0.006891530,
-0.001219900, -0.005131880, 0.011535200, -0.011659500 },
#else
0
#endif
};
#if defined C_IMPLEMENTATION
FIR::FIR()
{
memset(itsDelayLine, 0, sizeof itsDelayLine);
}
fcomplex FIR::processNextSample(fcomplex sample, const float weights[NR_TAPS])
{
fcomplex sum = sample * weights[0];
itsDelayLine[0] = sample;
for (int tap = NR_TAPS; -- tap > 0;) {
sum += weights[tap] * itsDelayLine[tap];
itsDelayLine[tap] = itsDelayLine[tap - 1];
}
return sum;
}
#endif
WH_BGL_Processing::WH_BGL_Processing(const string& name, unsigned coreNumber, const ACC::APS::ParameterSet &ps)
:
WorkHolder(NR_IN_CHANNELS, NR_OUT_CHANNELS, name, "WH_Correlator"),
itsPS(ps),
itsCoreNumber(coreNumber)
{
ASSERT(ps.getInt32("BGLProc.NPPFTaps") == NR_TAPS);
ASSERT(ps.getInt32("Observation.NStations") == NR_STATIONS);
ASSERT(ps.getInt32("Observation.NPolarisations") == NR_POLARIZATIONS);
ASSERT(ps.getInt32("Observation.NSubbandSamples") == NR_SUBBAND_SAMPLES);
ASSERT(ps.getInt32("Observation.NChannels") == NR_SUBBAND_CHANNELS);
#if !defined C_IMPLEMENTATION
ASSERT(NR_SAMPLES_PER_INTEGRATION % 16 == 0);
ASSERT(_FIR_constants_used.input_type == INPUT_TYPE);
ASSERT(_FIR_constants_used.nr_stations == NR_STATIONS);
ASSERT(_FIR_constants_used.nr_samples_per_integration == NR_SAMPLES_PER_INTEGRATION);
ASSERT(_FIR_constants_used.nr_subband_channels == NR_SUBBAND_CHANNELS);
ASSERT(_FIR_constants_used.nr_taps == NR_TAPS);
ASSERT(_FIR_constants_used.nr_polarizations == NR_POLARIZATIONS);
ASSERT(_correlator_constants_used.nr_stations == NR_STATIONS);
ASSERT(_correlator_constants_used.nr_samples_per_integration == NR_SAMPLES_PER_INTEGRATION);
ASSERT(_correlator_constants_used.nr_subband_channels == NR_SUBBAND_CHANNELS);
ASSERT(_correlator_constants_used.nr_polarizations == NR_POLARIZATIONS);
#endif
if (itsCenterFrequencies.size() == 0)
itsCenterFrequencies = ps.getDoubleVector("Observation.RefFreqs");
itsChannelBandwidth = ps.getDouble("Observation.SampleRate") / NR_SUBBAND_CHANNELS;
unsigned nrSubbandsPerPset = ps.getUint32("General.SubbandsPerPset");
unsigned nrNodesPerPset = ps.getUint32("BGLProc.NodesPerPset");
itsFirstSubband = (coreNumber / nrNodesPerPset) * nrSubbandsPerPset;
itsLastSubband = itsFirstSubband + nrSubbandsPerPset;
itsCurrentSubband = itsFirstSubband + coreNumber % nrNodesPerPset % nrSubbandsPerPset;
itsSubbandIncrement = nrNodesPerPset % nrSubbandsPerPset;
itsInputConnected = ps.getBool("Connections.InputToBGLProc");
getDataManager().addInDataHolder(SUBBAND_CHANNEL, new DH_Subband("input", ps));
//getDataManager().addInDataHolder(RFI_MITIGATION_CHANNEL, new DH_RFI_Mitigation("RFI"));
getDataManager().addOutDataHolder(VISIBILITIES_CHANNEL, new DH_Visibilities("output", ps));
getDataManager().setAutoTriggerIn(SUBBAND_CHANNEL, false);
getDataManager().setAutoTriggerOut(VISIBILITIES_CHANNEL, false);
}
WH_BGL_Processing::~WH_BGL_Processing()
{
}
WorkHolder* WH_BGL_Processing::construct(const string &name, unsigned coreNumber, const ACC::APS::ParameterSet &ps)
{
return new WH_BGL_Processing(name, coreNumber, ps);
}
WH_BGL_Processing* WH_BGL_Processing::make(const string &name)
{
return new WH_BGL_Processing(name, itsCoreNumber, itsPS);
}
#if defined HAVE_BGL
void FFTtest()
{
fftw_plan plan = fftw_create_plan(256, FFTW_FORWARD, FFTW_ESTIMATE);
fcomplex in[256], fout[256], sout[256];
for (int i = 0; i < 256; i ++)
in[i] = makefcomplex(2 * i, 2 * i + 1);
fftw_one(plan, (fftw_complex *) in, (fftw_complex *) fout);
_fft256(in, sout);
for (int i = 0; i < 256; i ++) {
fcomplex diff = fout[i] / sout[i];
std::cout << i << " (" << real(fout[i]) << ',' << imag(fout[i]) << ") / (" << real(sout[i]) << ',' << imag(sout[i]) << ") = (" << real(diff) << ',' << imag(diff) << ")\n";
}
//std::exit(0);
}
#endif
void WH_BGL_Processing::preprocess()
{
#if defined HAVE_MPI
std::clog << "node " << TH_MPI::getCurrentRank() << " filters subbands " << itsFirstSubband << " to " << itsLastSubband << " starting at " << itsCurrentSubband << " with " << itsSubbandIncrement << " as increment\n";
#endif
#if defined HAVE_FFTW3
fftwf_complex cbuf1[NR_SUBBAND_CHANNELS], cbuf2[NR_SUBBAND_CHANNELS];
itsFFTWPlan = fftwf_plan_dft_1d(NR_SUBBAND_CHANNELS, cbuf1, cbuf2, FFTW_FORWARD, FFTW_ESTIMATE);
#elif defined HAVE_FFTW2
#if defined HAVE_BGL && NR_SUBBAND_CHANNELS == 256
fftw_import_wisdom_from_string("(FFTW-2.1.5 (256 529 -1 0 1 1 1 352 0) (128 529 -1 0 1 1 0 2817 0) (64 529 -1 0 1 1 0 1409 0) (32 529 -1 0 1 1 0 705 0) (16 529 -1 0 1 1 0 353 0) (8 529 -1 0 1 1 0 177 0) (4 529 -1 0 1 1 0 89 0) (2 529 -1 0 1 1 0 45 0))");
itsFFTWPlan = fftw_create_plan(NR_SUBBAND_CHANNELS, FFTW_FORWARD, FFTW_USE_WISDOM);
#else
itsFFTWPlan = fftw_create_plan(NR_SUBBAND_CHANNELS, FFTW_FORWARD, FFTW_ESTIMATE);
#endif
#endif
//FFTtest();
for (int i = 1; i <= NR_SAMPLES_PER_INTEGRATION; i ++) {
#if INPUT_TYPE == I4COMPLEX_TYPE
correlationWeights[i] = 1.0 / i;
#else
correlationWeights[i] = 1.0e-6 / i;
#endif
}
#if defined HAVE_BGL && !defined C_IMPLEMENTATION
mutex = rts_allocate_mutex();
#endif
}
void WH_BGL_Processing::computeFlags()
{
computeFlagsTimer.start();
#if NR_SUBBAND_CHANNELS == 1
#if defined SPARSE_FLAGS
#error Not implementated
#else
DH_Subband::AllFlagsType *input = get_DH_Subband()->getFlags();
bitset<NR_INPUT_SAMPLES> (&flags)[NR_STATIONS] = *input;
#endif
#else
#if defined SPARSE_FLAGS
for (int stat = 0; stat < NR_STATIONS; stat ++) {
flags[stat].reset();
const std::vector<SparseSet::range> &ranges = get_DH_Subband()->getFlags(stat).getRanges();
for (std::vector<SparseSet::range>::const_iterator it = ranges.begin(); it != ranges.end(); it ++) {
int begin = std::max(0, (int) it->begin / NR_SUBBAND_CHANNELS - NR_TAPS + 1);
int end = std::min(NR_SAMPLES_PER_INTEGRATION, (int) (it->end - 1) / NR_SUBBAND_CHANNELS + 1);
flags[stat].include(begin, end);
}
}
#else
typedef bitset<NR_SUBBAND_CHANNELS> inputType[NR_STATIONS][NR_TAPS - 1 + NR_SAMPLES_PER_INTEGRATION];
inputType *input = (inputType *) get_DH_Subband()->getFlags();
memset(flags, 0, sizeof flags);
for (int stat = 0; stat < NR_STATIONS; stat ++) {
int invalid_count = 0;
for (int time = 0; time < NR_TAPS - 1; time ++, invalid_count --) {
if ((*input)[stat][time].any()) {
invalid_count = NR_TAPS;
}
}
for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time ++, invalid_count --) {
if ((*input)[stat][NR_TAPS - 1 + time].any()) {
invalid_count = NR_TAPS;
}
if (invalid_count > 0) {
flags[stat][time] = true;
}
}
}
#endif
#endif
for (int stat2 = 0; stat2 < NR_STATIONS; stat2 ++) {
for (int stat1 = 0; stat1 <= stat2; stat1 ++) {
itsNrValidSamples[DH_Visibilities::baseline(stat1, stat2)] = NR_SAMPLES_PER_INTEGRATION - (flags[stat1] | flags[stat2]).count();
}
}
computeFlagsTimer.stop();
}
#if defined DELAY_COMPENSATION
#if defined C_IMPLEMENTATION
fcomplex WH_BGL_Processing::phaseShift(int time, int chan, double baseFrequency, const DH_Subband::DelayIntervalType &delay) const
{
double timeInterpolatedDelay = delay.delayAtBegin + ((double) time / NR_SAMPLES_PER_INTEGRATION) * (delay.delayAfterEnd - delay.delayAtBegin);
double frequency = baseFrequency + chan * itsChannelBandwidth;
double phaseShift = timeInterpolatedDelay * frequency;
double phi = 2.0 * M_PI * phaseShift;
return makefcomplex(std::cos(phi), std::sin(phi));
}
#else
void WH_BGL_Processing::computePhaseShifts(struct phase_shift phaseShifts[NR_SAMPLES_PER_INTEGRATION], const DH_Subband::DelayIntervalType &delay, double baseFrequency) const
{
double phiBegin = 2 * M_PI * delay.delayAtBegin;
double phiEnd = 2 * M_PI * delay.delayAfterEnd;
double deltaPhi = (phiEnd - phiBegin) / NR_SAMPLES_PER_INTEGRATION;
dcomplex v = cosisin(phiBegin * baseFrequency);
dcomplex dv = cosisin(phiBegin * itsChannelBandwidth);
dcomplex vf = cosisin(deltaPhi * baseFrequency);
dcomplex dvf = cosisin(deltaPhi * itsChannelBandwidth);
for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time ++) {
phaseShifts[time].v0 = v; v *= vf;
phaseShifts[time].dv = dv; dv *= dvf;
}
}
#endif
#endif
void WH_BGL_Processing::doPPF(double baseFrequency)
{
doPPFtimer.start();
#if defined HAVE_BGL && !defined C_IMPLEMENTATION
_bgl_mutex_lock(mutex);
#endif
#if defined C_IMPLEMENTATION && defined WORDS_BIGENDIAN
get_DH_Subband()->swapBytes();
#endif
typedef DH_Subband::SampleType inputType[NR_STATIONS][NR_TAPS - 1 + NR_SAMPLES_PER_INTEGRATION][NR_SUBBAND_CHANNELS][NR_POLARIZATIONS];
inputType *input = (inputType *) get_DH_Subband()->getSamples();
#if defined DELAY_COMPENSATION
DH_Subband::AllDelaysType *delays = get_DH_Subband()->getDelays();
#endif
for (int stat = 0; stat < NR_STATIONS; stat ++) {
#if 0 && defined DELAY_COMPENSATION
std::clog << "stat " << stat << ", basefreq " << baseFrequency << ": delay from " << (*delays)[stat].delayAtBegin << " to " << (*delays)[stat].delayAfterEnd << " sec" << std::endl;
#endif
#if defined C_IMPLEMENTATION
fcomplex fftOutData[NR_SUBBAND_CHANNELS];
static fcomplex fftInData[NR_TAPS - 1 + NR_SAMPLES_PER_INTEGRATION][NR_POLARIZATIONS][NR_SUBBAND_CHANNELS];
FIRtimer.start();
for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
for (int chan = 0; chan < NR_SUBBAND_CHANNELS; chan ++) {
for (int time = 0; time < NR_TAPS - 1 + NR_SAMPLES_PER_INTEGRATION; time ++) {
fcomplex sample = makefcomplex((*input)[stat][time][chan][pol]);
fftInData[time][pol][chan] = itsFIRs[stat][pol][chan].processNextSample(sample, FIR::weights[chan]);
}
}
}
FIRtimer.stop();
FFTtimer.start();
for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time ++) {
for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
#if defined SPARSE_FLAGS
if (flags[stat].test(time)) {
#else
if (flags[stat][time]) {
#endif
for (int chan = 0; chan < NR_SUBBAND_CHANNELS; chan ++) {
samples[chan][stat][time][pol] = makefcomplex(0, 0);
}
} else {
#if defined HAVE_FFTW3
fftwf_execute_dft(itsFFTWPlan,
(fftwf_complex *) fftInData[NR_TAPS - 1 + time][pol],
(fftwf_complex *) fftOutData);
#else
fftw_one(itsFFTWPlan,
(fftw_complex *) fftInData[NR_TAPS - 1 + time][pol],
(fftw_complex *) fftOutData);
#endif
for (int chan = 0; chan < NR_SUBBAND_CHANNELS; chan ++) {
#if defined DELAY_COMPENSATION
fftOutData[chan] *= phaseShift(time, chan, baseFrequency, (*delays)[stat]);
#endif
samples[chan][stat][time][pol] = fftOutData[chan];
}
}
}
}
FFTtimer.stop();
#else // assembly implementation
static fcomplex tmp1[4][NR_SAMPLES_PER_INTEGRATION] CACHE_ALIGNED;
static fcomplex fftInData[NR_SAMPLES_PER_INTEGRATION][NR_POLARIZATIONS][NR_SUBBAND_CHANNELS + 4] CACHE_ALIGNED;
static fcomplex fftOutData[2][NR_POLARIZATIONS][NR_SUBBAND_CHANNELS] CACHE_ALIGNED;
for (int chan = 0; chan < NR_SUBBAND_CHANNELS; chan += 4) {
for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
#if defined __GNUC__ // work around bug ???
for (register int ch asm ("r28") = 0; ch < 4; ch ++) {
#else
for (int ch = 0; ch < 4; ch ++) {
#endif
FIRtimer.start();
_filter(0, // itsFIRs[stat][pol][chan + ch].itsDelayLine,
FIR::weights[chan + ch],
&(*input)[stat][0][chan + ch][pol],
tmp1[ch],
NR_SAMPLES_PER_INTEGRATION / NR_TAPS);
FIRtimer.stop();
}
_transpose_4x8(&fftInData[0][pol][chan],
&tmp1[0][0],
NR_SAMPLES_PER_INTEGRATION,
sizeof(fcomplex) * NR_SAMPLES_PER_INTEGRATION,
sizeof(fcomplex) * NR_POLARIZATIONS * (NR_SUBBAND_CHANNELS + 4));
}
}
#if defined DELAY_COMPENSATION
struct phase_shift phaseShifts[NR_SAMPLES_PER_INTEGRATION];
computePhaseShifts(phaseShifts, (*delays)[stat], baseFrequency);
#endif
#if defined SPARSE_FLAGS
const std::vector<SparseSet::range> &ranges = flags[stat].getRanges();
std::vector<SparseSet::range>::const_iterator it = ranges.begin();
for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; it ++) {
int firstBad, firstGood;
if (it != ranges.end()) {
firstBad = it->begin;
firstGood = it->end;
} else {
firstBad = firstGood = NR_SAMPLES_PER_INTEGRATION;
}
for (; time < firstBad; time ++) {
FFTtimer.start();
#if 0
_prefetch(fftInData[time],
sizeof(fcomplex[NR_POLARIZATIONS][NR_SUBBAND_CHANNELS]) / CACHE_LINE_SIZE,
CACHE_LINE_SIZE);
#endif
for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
#if 0
fftw_one(itsFFTWPlan,
(fftw_complex *) fftInData[time][pol],
(fftw_complex *) fftOutData[time & 1][pol]);
#else
_fft256(fftInData[time][pol], fftOutData[time & 1][pol]);
#endif
}
FFTtimer.stop();
if (time & 1) {
#if defined DELAY_COMPENSATION
_phase_shift_and_transpose(&samples[0][stat][time - 1][0],
&fftOutData[0][0][0],
&phaseShifts[time - 1]);
#else
_transpose_4x8(&samples[0][stat][time - 1][0],
&fftOutData[0][0][0],
NR_SUBBAND_CHANNELS,
sizeof(fcomplex) * NR_SUBBAND_CHANNELS,
sizeof(fcomplex) * NR_POLARIZATIONS * (NR_SAMPLES_PER_INTEGRATION | 2) * NR_STATIONS);
#endif
}
}
for (; time < firstGood; time ++) {
_memzero(fftOutData[time & 1], sizeof(fftOutData[time & 1]));
if (time & 1) {
#if defined DELAY_COMPENSATION
_phase_shift_and_transpose(&samples[0][stat][time - 1][0],
&fftOutData[0][0][0],
&phaseShifts[time - 1]);
#else
_transpose_4x8(&samples[0][stat][time - 1][0],
&fftOutData[0][0][0],
NR_SUBBAND_CHANNELS,
sizeof(fcomplex) * NR_SUBBAND_CHANNELS,
sizeof(fcomplex) * NR_POLARIZATIONS * (NR_SAMPLES_PER_INTEGRATION | 2) * NR_STATIONS);
#endif
}
}
}
#else // !SPARSE_FLAGS
for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time += 2) {
FFTtimer.start();
for (int t = 0; t < 2; t ++) {
if (flags[stat][time + t]) {
_memzero(fftOutData[t], sizeof(fftOutData[t]));
} else {
_prefetch(fftInData[time + t],
sizeof(fcomplex[NR_POLARIZATIONS][NR_SUBBAND_CHANNELS]) / CACHE_LINE_SIZE,
CACHE_LINE_SIZE);
for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
#if 0
fftw_one(itsFFTWPlan,
(fftw_complex *) fftInData[time + t][pol],
(fftw_complex *) fftOutData[t][pol]);
#else
_fft256(fftInData[time + t][pol], fftOutData[t][pol]);
#endif
}
}
}
FFTtimer.stop();
#if defined DELAY_COMPENSATION
_phase_shift_and_transpose(&samples[0][stat][time][0],
&fftOutData[0][0][0],
&phaseShifts[time]);
#else
_transpose_4x8(&samples[0][stat][time][0],
&fftOutData[0][0][0],
NR_SUBBAND_CHANNELS,
sizeof(fcomplex) * NR_SUBBAND_CHANNELS,
sizeof(fcomplex) * NR_POLARIZATIONS * (NR_SAMPLES_PER_INTEGRATION | 2) * NR_STATIONS);
#endif
}
#endif // SPARSE_FLAGS
#endif // C_IMPLEMENTATION
}
#if defined HAVE_BGL && !defined C_IMPLEMENTATION
_bgl_mutex_unlock(mutex);
#endif
doPPFtimer.stop();
}
void WH_BGL_Processing::bypassPPF()
{
DH_Subband::AllSamplesType *input = get_DH_Subband()->getSamples();
for (int stat = 0; stat < NR_STATIONS; stat ++) {
for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time ++) {
for (int pol = 0; pol < NR_POLARIZATIONS; pol ++) {
samples[0][stat][time][pol] = makefcomplex((*input)[stat][time][pol]);
}
}
}
}
void WH_BGL_Processing::doCorrelate()
{
doCorrelateTimer.start();
// Use zeroed space for RFI_Flags since they are currently not in a dataholder
static bitset<NR_SUBBAND_CHANNELS> Scratch_RFI_Flags[NR_STATIONS];
bitset<NR_SUBBAND_CHANNELS> (*RFI_Flags)[NR_STATIONS] = &Scratch_RFI_Flags;
//DH_RFI_Mitigation::ChannelFlagsType *RFI_Flags = get_DH_RFI_Mitigation()->getChannelFlags();
DH_Visibilities::AllVisibilitiesType *visibilities = get_DH_Visibilities()->getVisibilities();
DH_Visibilities::AllNrValidSamplesType *nrValidSamples = get_DH_Visibilities()->getNrValidSamples();
#if defined C_IMPLEMENTATION
for (int ch = 0; ch < NR_SUBBAND_CHANNELS; ch ++) {
for (int stat2 = 0; stat2 < NR_STATIONS; stat2 ++) {
for (int stat1 = 0; stat1 <= stat2; stat1 ++) {
int bl = DH_Visibilities::baseline(stat1, stat2), nrValid = 0;
if (!(*RFI_Flags)[stat1][ch] && !(*RFI_Flags)[stat2][ch]) {
for (int pol1 = 0; pol1 < NR_POLARIZATIONS; pol1 ++) {
for (int pol2 = 0; pol2 < NR_POLARIZATIONS; pol2 ++) {
dcomplex sum = makedcomplex(0, 0);
for (int time = 0; time < NR_SAMPLES_PER_INTEGRATION; time ++) {
sum += samples[ch][stat1][time][pol1] * conj(samples[ch][stat2][time][pol2]);
}
sum *= correlationWeights[itsNrValidSamples[bl]];
(*visibilities)[bl][ch][pol1][pol2] = sum;
}
}
nrValid = itsNrValidSamples[bl];
}
if (nrValid == 0) {
for (int pol1 = 0; pol1 < NR_POLARIZATIONS; pol1 ++) {
for (int pol2 = 0; pol2 < NR_POLARIZATIONS; pol2 ++) {
(*visibilities)[bl][ch][pol1][pol2] = makefcomplex(0, 0);
}
}
}
(*nrValidSamples)[bl][ch] = nrValid;
}
}
}
#else
// Blue Gene/L assembler version.
for (int bl = 0; bl < NR_BASELINES; bl ++) {
for (int ch = 0; ch < NR_SUBBAND_CHANNELS; ch ++) {
(*nrValidSamples)[bl][ch] = itsNrValidSamples[bl];
}
}
for (int ch = 0; ch < NR_SUBBAND_CHANNELS; ch ++) {
// build a map of valid stations
int nrValidStations = 0, map[NR_STATIONS];
for (int stat2 = 0; stat2 < NR_STATIONS; stat2 ++) {
if (!(*RFI_Flags)[stat2][ch]) {
map[nrValidStations ++] = stat2;
} else { // clear correlations that involve invalided stations
for (int stat1 = 0; stat1 < NR_STATIONS; stat1 ++) {
int bl = stat1 < stat2 ? DH_Visibilities::baseline(stat1, stat2) :
DH_Visibilities::baseline(stat2, stat1);
//_clear_correlation(&(*visibilities)[bl][ch]);
(*nrValidSamples)[bl][ch] = 0;
}
}
}
if (nrValidStations == 0) {
break;
}
// Divide the correlation matrix into blocks of 3x2, 2x2, 3+2, 2+1, and 1x1.
// do the first (auto)correlation(s) (these are the "left"most 1 or 3
// squares in the corner of the triangle)
if (nrValidStations % 2 == 0) {
int stat10 = map[0], stat11 = map[1];
_auto_correlate_2(&samples[ch][stat10],
&samples[ch][stat11],
&(*visibilities)[DH_Visibilities::baseline(stat10, stat10)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat10, stat11)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat11, stat11)][ch]);
} else {
int stat10 = map[0];
_auto_correlate_1(&samples[ch][stat10],
&(*visibilities)[DH_Visibilities::baseline(stat10, stat10)][ch]);
}
for (int stat2 = nrValidStations % 2 ? 1 : 2; stat2 < nrValidStations; stat2 += 2) {
int stat1 = 0;
// do as many 3x2 blocks as possible
for (; stat1 + 3 <= stat2; stat1 += 3) {
int stat10 = map[stat1], stat11 = map[stat1+1], stat12 = map[stat1+2];
int stat20 = map[stat2], stat21 = map[stat2+1];
_correlate_3x2(&samples[ch][stat10],
&samples[ch][stat11],
&samples[ch][stat12],
&samples[ch][stat20],
&samples[ch][stat21],
&(*visibilities)[DH_Visibilities::baseline(stat10, stat20)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat10, stat21)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat11, stat20)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat11, stat21)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat12, stat20)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat12, stat21)][ch]);
}
// see if a 2x2 block is necessary
if (stat1 + 2 <= stat2) {
int stat10 = map[stat1], stat11 = map[stat1+1];
int stat20 = map[stat2], stat21 = map[stat2+1];
_correlate_2x2(&samples[ch][stat10],
&samples[ch][stat11],
&samples[ch][stat20],
&samples[ch][stat21],
&(*visibilities)[DH_Visibilities::baseline(stat10, stat20)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat10, stat21)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat11, stat20)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat11, stat21)][ch]);
stat1 += 2;
}
// do the remaining (auto)correlations near the diagonal
if (stat1 == stat2) {
int stat10 = map[stat1], stat11 = map[stat1+1];
_auto_correlate_2(&samples[ch][stat10],
&samples[ch][stat11],
&(*visibilities)[DH_Visibilities::baseline(stat10,stat10)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat10,stat11)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat11,stat11)][ch]);
} else {
int stat10 = map[stat1], stat11 = map[stat1+1], stat12 = map[stat1+2];
_auto_correlate_3(&samples[ch][stat10],
&samples[ch][stat11],
&samples[ch][stat12],
&(*visibilities)[DH_Visibilities::baseline(stat10,stat11)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat10,stat12)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat11,stat11)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat11,stat12)][ch],
&(*visibilities)[DH_Visibilities::baseline(stat12,stat12)][ch]);
}
}
}
weightTimer.start();
#if 0
for (int bl = 0; bl < NR_BASELINES; bl ++) {
for (int ch = 0; ch < NR_SUBBAND_CHANNELS; ch ++) {
for (int pol1 = 0; pol1 < NR_POLARIZATIONS; pol1 ++) {
for (int pol2 = 0; pol2 < NR_POLARIZATIONS; pol2 ++) {
(*visibilities)[bl][ch][pol1][pol2] *= correlationWeights[(*nrValidSamples)[bl][ch]];
}
}
}
}
#else
_weigh_visibilities(visibilities, nrValidSamples, correlationWeights);
#endif
weightTimer.stop();
#endif
doCorrelateTimer.stop();
}
void WH_BGL_Processing::process()
{
NSTimer totalTimer("total", true);
totalTimer.start();
#if defined HAVE_MPI
std::clog.precision(15);
std::clog << "core " << TH_MPI::getCurrentRank() << ": start reading at " << MPI_Wtime() << '\n';
#endif
static NSTimer readTimer("receive timer", true);
readTimer.start();
getDataManager().readyWithInHolder(SUBBAND_CHANNEL);
#if defined SPARSE_FLAGS
if (itsInputConnected)
get_DH_Subband()->getExtraData();
#endif
readTimer.stop();
#if defined HAVE_MPI
std::clog << "core " << TH_MPI::getCurrentRank() << ": start processing at " << MPI_Wtime() << '\n';
#endif
computeTimer.start();
computeFlags();
#if NR_SUBBAND_CHANNELS > 1
doPPF(itsCenterFrequencies[itsCurrentSubband] - (NR_SUBBAND_CHANNELS / 2) * itsChannelBandwidth);
#else
bypassPPF();
#endif
doCorrelate();
if ((itsCurrentSubband += itsSubbandIncrement) >= itsLastSubband)
itsCurrentSubband -= itsLastSubband - itsFirstSubband;
computeTimer.stop();
#if defined HAVE_MPI
std::clog << "core " << TH_MPI::getCurrentRank() << ": start writing at " << MPI_Wtime() << '\n';
#endif
static NSTimer writeTimer("send timer", true);
writeTimer.start();
getDataManager().readyWithOutHolder(VISIBILITIES_CHANNEL);
writeTimer.stop();
#if defined HAVE_MPI
std::clog << "core " << TH_MPI::getCurrentRank() << ": start idling at " << MPI_Wtime() << '\n';
#endif
#if 0
static int count = 0;
if (TH_MPI::getCurrentRank() == 5 && ++ count == 9)
for (double time = MPI_Wtime() + 4.0; MPI_Wtime() < time;)
;
#endif
totalTimer.stop();
}
void WH_BGL_Processing::postprocess()
{
#if defined HAVE_FFTW3
fftwf_destroy_plan(itsFFTWPlan);
#elif defined HAVE_FFTW2
fftw_destroy_plan(itsFFTWPlan);
#endif
}
void WH_BGL_Processing::dump() const
{
}
} // namespace CS1
} // namespace LOFAR