00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 #include <math.h>
00083 #include <lal/AVFactories.h>
00084 #include <lal/FlatMesh.h>
00085 #include <lal/LALConfig.h>
00086 #include <lal/LALConstants.h>
00087 #include <lal/LALDatatypes.h>
00088 #include <lal/LALInspiralBank.h>
00089 #include <lal/LALMalloc.h>
00090 #include <lal/LALStatusMacros.h>
00091 #include <lal/LALStdlib.h>
00092 #include <lal/LIGOMetadataTables.h>
00093 #include <lal/MatrixUtils.h>
00094 #include <lal/SeqFactories.h>
00095 #include <lal/TemplateBankGeneration.h>
00096
00097
00098 NRCSID(INSPIRALSPINBANKWNDTEMPLATEBANKC, "$Id: InspiralSpinBankwNDTemplateBank.c,v 1.3 2007/06/08 14:41:42 bema Exp $");
00099
00100
00101
00102 void
00103 LALInspiralSpinBankMetric(
00104 LALStatus *status,
00105 NDTemplateBankInput *input,
00106 REAL4Array *metric
00107 )
00108 {
00109 InspiralMomentsEtc moments;
00110 InspiralTemplate inspiralTemplate;
00111
00112 INT2 loop = 0;
00113 REAL4 f0 = input->f0;
00114 REAL8 J1 = 0.0;
00115 REAL8 J4 = 0.0;
00116 REAL8 J6 = 0.0;
00117 REAL8 J9 = 0.0;
00118 REAL8 J11 = 0.0;
00119 REAL8 J12 = 0.0;
00120 REAL8 J14 = 0.0;
00121 REAL8 J17 = 0.0;
00122
00123 INITSTATUS( status, "LALInspiralSpinBankMetric", INSPIRALSPINBANKWNDTEMPLATEBANKC );
00124 ATTATCHSTATUSPTR( status );
00125
00126
00127 inspiralTemplate.fLower = 30;
00128 inspiralTemplate.fCutoff = 2000;
00129
00130 LALGetInspiralMoments( status->statusPtr, &moments, input->PSD, &inspiralTemplate );
00131
00132
00133 for(loop = 1; loop <=17; loop++){
00134 moments.j[loop] *= pow((inspiralTemplate.fLower/(f0)), ((7.0-(REAL4) loop)/3.0));
00135 }
00136
00137
00138 J1 = moments.j[1];
00139 J4 = moments.j[4];
00140 J6 = moments.j[6];
00141 J9 = moments.j[9];
00142 J11 = moments.j[11];
00143 J12 = moments.j[12];
00144 J14 = moments.j[14];
00145 J17 = moments.j[17];
00146
00147
00148 metric->data[0] = (REAL4) (1.5)*(J17-J12*J12-(J9-J4*J12)*(J9-J4*J12)/(J1-J4*J4));
00149 metric->data[1] = (REAL4) (1.5)*(J14-J9*J12-(J6-J4*J9)*(J9-J4*J12)/(J1-J4*J4));
00150 metric->data[2] = (REAL4) 0.0;
00151 metric->data[3] = (REAL4) (1.5)*(J14-J9*J12-(J6-J4*J9)*(J9-J4*J12)/(J1-J4*J4));
00152 metric->data[4] = (REAL4) (1.5)*(J11-J9*J9-(J6-J4*J9)*(J6-J4*J9)/(J1-J4*J4));
00153 metric->data[5] = (REAL4) 0.0;
00154 metric->data[6] = (REAL4) 0.0;
00155 metric->data[7] = (REAL4) 0.0;
00156 metric->data[8] = (REAL4) J11-J9*J9-(J6-J4*J9)*(J6-J4*J9)/(J1-J4*J4);
00157
00158 DETATCHSTATUSPTR( status );
00159 RETURN( status );
00160 }
00161
00162
00163
00164
00165 void
00166 LALInspiralSpinBankwNDTemplateBank(
00167 LALStatus *status,
00168 InspiralTemplateList **tiles,
00169 INT4 *ntiles,
00170 InspiralCoarseBankIn coarseIn
00171 )
00172
00173 {
00174
00175
00176 REAL4Array *metric = NULL;
00177 UINT4Vector *metricDimensions = NULL;
00178 NDTemplateBankInput NDinput;
00179 NDTemplateBankOutput *NDoutput = NULL;
00180 NDTemplateBankOutput *NDFirst = NULL;
00181 NDTemplateBankFunctionPtrs NDFunctionPtrs;
00182 INT4 cnt = 0;
00183 REAL4 f0, m1Max, m1Min, m2Max, m2Min;
00184
00185
00186 INITSTATUS( status, "LALInspiralSpinBankwNDTemplateBank", INSPIRALSPINBANKWNDTEMPLATEBANKC );
00187 ATTATCHSTATUSPTR( status );
00188
00189
00190 if (coarseIn.mmCoarse <= 0){
00191 ABORT(status, LALINSPIRALBANKH_ECHOICE, LALINSPIRALBANKH_MSGECHOICE);
00192 }
00193
00194 if ((coarseIn.mMin <= 0) || (coarseIn.MMax <= 0) ||
00195 (coarseIn.mMin >= coarseIn.MMax) || (3.0*coarseIn.MMax >= 15.0)){
00196 ABORT(status, LALINSPIRALBANKH_ECHOICE, LALINSPIRALBANKH_MSGECHOICE);
00197 }
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 LALU4CreateVector( status->statusPtr, &metricDimensions, (UINT4) 2 );
00211 metricDimensions->data[0] = 3;
00212 metricDimensions->data[1] = 3;
00213 LALSCreateArray( status->statusPtr, &metric, metricDimensions );
00214
00215
00216
00217 m2Min = NDinput.minParameters[1] = coarseIn.mMin*LAL_MTSUN_SI;
00218 m2Max = NDinput.maxParameters[1] = coarseIn.MMax*LAL_MTSUN_SI;
00219 m1Min = NDinput.minParameters[0] = 2.0*m2Max;
00220 m1Max = NDinput.maxParameters[0] = 15.0*LAL_MTSUN_SI - m2Max;
00221 f0 = NDinput.f0 = 153.0;
00222
00223
00224 NDinput.mm = coarseIn.mmCoarse;
00225 NDinput.type = PrecessingType;
00226 NDinput.dimension = 3;
00227 NDinput.PSD = &coarseIn.shf;
00228
00229
00230 NDinput.minCoordinates[0] = 0.9*(3.0/128) / (pow(LAL_PI*f0*(m1Max+m2Max),1.666667)*(m1Max*m2Max/pow(m1Max+m2Max,2)));
00231 NDinput.minCoordinates[1] = 1.1*(-.375*LAL_PI) / (pow(LAL_PI*f0*(m1Max+m2Min),0.6666667)*(m1Max*m2Min/pow(m1Max+m2Min,2)));
00232 NDinput.minCoordinates[2] = 0;
00233 NDinput.maxCoordinates[0] = 1.1*(3.0/128) / (pow(LAL_PI*f0*(m1Min+m2Min),1.666667)*(m1Min*m2Min/pow(m1Min+m2Min,2)));
00234 NDinput.maxCoordinates[1] = .9*(-.375*LAL_PI) / (pow(LAL_PI*f0*(m1Min+m2Max),0.6666667)*(m1Min*m2Max/pow(m1Min+m2Max,2)));
00235 NDinput.maxCoordinates[2] = 3.8* LAL_PI/29.961432 * (1+0.75*m2Max/m1Min) * (m1Max/m2Min) * pow(LAL_MTSUN_SI*100.0/(m1Min+m2Min), 0.6666667);
00236
00237
00238 NDFunctionPtrs.metric = LALInspiralSpinBankMetric;
00239 NDFunctionPtrs.test = LALInspiralSpinBankBoundary;
00240
00241 printf("\ncalling LALNDTemplateBank()...\n");
00242 LALNDTemplateBank(status->statusPtr, &NDinput, &NDFunctionPtrs, &NDFirst);
00243
00244 printf("\nconverting output...\n");
00245 NDoutput = NDFirst;
00246 while(NDoutput->next){
00247 (*ntiles)++;
00248 NDoutput = NDoutput->next;
00249 }
00250
00251 printf("\n...counter is %i\n", *ntiles);
00252
00253 *tiles = (InspiralTemplateList *) LALCalloc( *ntiles, sizeof(InspiralTemplateList));
00254 NDoutput = NDFirst;
00255 cnt = 0;
00256
00257 for (cnt = 0; cnt < *ntiles; cnt++)
00258 {
00259 (*tiles)[cnt].params.mass1 = NDoutput->parameterVals[0];
00260 (*tiles)[cnt].params.mass2 = NDoutput->parameterVals[1];
00261 (*tiles)[cnt].params.psi0 = NDoutput->coordinateVals[0];
00262 (*tiles)[cnt].params.psi3 = NDoutput->coordinateVals[1];
00263 (*tiles)[cnt].params.beta = NDoutput->coordinateVals[2];
00264
00265
00266 NDoutput = NDoutput->next;
00267 }
00268
00269 DETATCHSTATUSPTR(status);
00270 RETURN(status);
00271 }
00272
00273 void
00274 LALInspiralSpinBankBoundary(
00275 LALStatus *status,
00276 NDTemplateBankInput *input,
00277 NDTemplateBankOutput *output,
00278 INT2 *testFlag
00279 )
00280 {
00281 REAL4 f0, mass, eta, m1, m2, m1Min, m1Max, m2Min, m2Max, betaMax, x, y, z;
00282 x = output->coordinateVals[0];
00283 y = output->coordinateVals[1];
00284 z = output->coordinateVals[2];
00285 f0 = input->f0;
00286 m1Min = input->minParameters[0];
00287 m1Max = input->maxParameters[0];
00288 m2Min = input->minParameters[1];
00289 m2Max = input->maxParameters[1];
00290 betaMax = input->maxParameters[2];
00291 *testFlag = 1;
00292
00293 mass = -y/x / (16.0*LAL_PI*LAL_PI*f0);
00294 eta = 16.0457 * pow( -x*x/y/y/y/y/y, 0.3333333 );
00295 if (eta > 0.25 || eta < 0)
00296 *testFlag = 0;
00297 output->parameterVals[0] = m1 = 0.5*mass* (1 + sqrt(1 - 4*eta));
00298 output->parameterVals[1] = m2 = 0.5*mass* (1 - sqrt(1 - 4*eta));
00299 if (m1 > m1Max || m1 < m1Min || m2 > m2Max || m2 < m2Min)
00300 *testFlag = 0;
00301 betaMax = 3.8*LAL_PI/29.961432 * (1+0.75*m2/m1)*(m1/m2) * pow((LAL_MTSUN_SI*100.0/mass),0.6666667);
00302 if (z > betaMax)
00303 *testFlag = 0;
00304 }
00305
00306
00307
00308
00309
00310