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
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 #include <stdio.h>
00154 #include <lal/LALInspiralBank.h>
00155 #include <lal/AVFactories.h>
00156 #include <lal/SeqFactories.h>
00157 #include <lal/LALStdio.h>
00158 #include <lal/FindRoot.h>
00159
00160
00161 NRCSID(LALINSPIRALBCVBANKC, "$Id: LALInspiralBCVBank.c,v 1.8 2007/06/13 13:33:10 thomas Exp $");
00162
00163
00164 void
00165 LALInspiralCreateBCVBank (
00166 LALStatus *status,
00167 InspiralTemplateList **list,
00168 INT4 *nlist,
00169 InspiralCoarseBankIn coarseIn
00170 )
00171
00172 {
00173 INT4 j = 0;
00174 INT4 nlistOld = 0;
00175
00176 static InspiralBankParams bankParams;
00177 static InspiralMetric metric;
00178 static InspiralTemplate params;
00179 static CreateVectorSequenceIn in;
00180 static REAL4VectorSequence *tempList = NULL;
00181
00182 INITSTATUS( status, "LALInspiralCreateBCVBank",
00183 LALINSPIRALBCVBANKC );
00184 ATTATCHSTATUSPTR( status );
00185
00186 ASSERT( coarseIn.psi0Min > 0., status,
00187 LALINSPIRALBANKH_ESIZE, LALINSPIRALBANKH_MSGESIZE );
00188 ASSERT( coarseIn.psi0Max > coarseIn.psi0Min, status,
00189 LALINSPIRALBANKH_ESIZE, LALINSPIRALBANKH_MSGESIZE );
00190 ASSERT( coarseIn.psi3Min < 0., status,
00191 LALINSPIRALBANKH_ESIZE, LALINSPIRALBANKH_MSGESIZE );
00192 ASSERT( coarseIn.psi3Max > coarseIn.psi3Min, status,
00193 LALINSPIRALBANKH_ESIZE, LALINSPIRALBANKH_MSGESIZE );
00194 ASSERT( coarseIn.LowGM < coarseIn.HighGM, status,
00195 LALINSPIRALBANKH_ESIZE, LALINSPIRALBANKH_MSGESIZE );
00196
00197
00198
00199 params.fLower = coarseIn.fLower;
00200 params.fCutoff = coarseIn.fUpper;
00201 params.alpha = coarseIn.alpha;
00202
00203 LALInspiralComputeMetricBCV( status->statusPtr,
00204 &metric, &coarseIn.shf, ¶ms );
00205 CHECKSTATUSPTR( status );
00206
00207
00208 if ( lalDebugLevel & LALINFO )
00209 {
00210 REAL8 dx0 = sqrt( 2.L * (1.L-coarseIn.mmCoarse)/metric.g00 );
00211 REAL8 dx1 = sqrt( 2.L * (1.L-coarseIn.mmCoarse)/metric.g11 );
00212 LALPrintError( "G00=%e G01=%e G11=%e\n",
00213 metric.G00, metric.G01, metric.G11 );
00214 LALPrintError( "g00=%e g11=%e theta=%e\n",
00215 metric.g00, metric.g11, metric.theta );
00216 LALPrintError( "dp0=%e dp1=%e\n", dx0, dx1 );
00217 }
00218
00219
00220
00221
00222
00223 bankParams.metric = &metric;
00224 bankParams.minimalMatch = coarseIn.mmCoarse;
00225 bankParams.x0Min = coarseIn.psi0Min;
00226 bankParams.x0Max = coarseIn.psi0Max;
00227 bankParams.x1Min = coarseIn.psi3Min;
00228 bankParams.x1Max = coarseIn.psi3Max;
00229
00230
00231 in.length = 1;
00232 in.vectorLength = 2;
00233 LALSCreateVectorSequence( status->statusPtr, &tempList, &in );
00234 CHECKSTATUSPTR( status );
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247 if (coarseIn.gridSpacing != S2BCV)
00248 {
00249 LALInspiralCreateFlatBankS3S4( status->statusPtr, tempList, &bankParams , coarseIn);
00250 CHECKSTATUSPTR( status );
00251 }
00252 else
00253 {
00254 LALInspiralCreateFlatBank( status->statusPtr, tempList, &bankParams);
00255 CHECKSTATUSPTR( status );
00256 }
00257
00258 *nlist = tempList->length;
00259 *list = (InspiralTemplateList *)
00260 LALCalloc( *nlist, sizeof(InspiralTemplateList) );
00261 if ( ! *list )
00262 {
00263 ABORT (status, LALINSPIRALBANKH_EMEM, LALINSPIRALBANKH_MSGEMEM);
00264 }
00265
00266
00267 for ( j = 0; j < *nlist; ++j )
00268 {
00269 (*list)[j].params.psi0 = (REAL8) tempList->data[2*j];
00270 (*list)[j].params.psi3 = (REAL8) tempList->data[2*j+1];
00271 (*list)[j].params.fLower = params.fLower;
00272 (*list)[j].params.nStartPad = 0;
00273 (*list)[j].params.nEndPad = 0;
00274 (*list)[j].params.tSampling = coarseIn.tSampling;
00275 (*list)[j].params.distance = 1.;
00276 (*list)[j].params.signalAmplitude = 1.;
00277 (*list)[j].params.approximant = BCV;
00278 (*list)[j].params.massChoice = psi0Andpsi3;
00279 (*list)[j].params.order = twoPN;
00280 (*list)[j].metric = metric;
00281 (*list)[j].params.alpha = coarseIn.alpha;
00282 }
00283 nlistOld = *nlist;
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297 if (coarseIn.gridSpacing != S2BCV)
00298 {
00299 LALInspiralBCVBankFcutS3S4( status->statusPtr,
00300 list, nlist, coarseIn);
00301 CHECKSTATUSPTR( status );
00302 }
00303 else if (coarseIn.LowGM == -1)
00304 {
00305 LALInspiralBCVRegularFcutBank( status->statusPtr,
00306 list, nlist, coarseIn);
00307 CHECKSTATUSPTR( status );
00308 }
00309 else
00310 {
00311 LALInspiralBCVFcutBank( status->statusPtr,
00312 list, nlist, coarseIn);
00313 CHECKSTATUSPTR( status );
00314 }
00315
00316 if ( lalDebugLevel & LALINFO )
00317 {
00318 LALPrintError(
00319 "LALInspiralBCVBank: template numbers before %d and after %d calling LALInspiralBCVBank\n",
00320 nlistOld, *nlist );
00321 }
00322
00323 LALSDestroyVectorSequence( status->statusPtr, &tempList );
00324 CHECKSTATUSPTR( status );
00325
00326 DETATCHSTATUSPTR( status );
00327 RETURN( status );
00328 }
00329
00330
00331 void
00332 LALInspiralCreateFlatBank (
00333 LALStatus *status,
00334 REAL4VectorSequence *list,
00335 InspiralBankParams *bankParams
00336 )
00337
00338 {
00339 InspiralMetric *metric;
00340 REAL8 minimalMatch;
00341 REAL8 x0, x1;
00342 UINT4 nlist = 0;
00343
00344 INITSTATUS( status, "LALInspiralCreateFlatBank",
00345 LALINSPIRALBCVBANKC );
00346 ATTATCHSTATUSPTR( status );
00347
00348
00349
00350 metric = bankParams->metric;
00351 minimalMatch = bankParams->minimalMatch;
00352 LALInspiralUpdateParams( status->statusPtr,
00353 bankParams, *metric, minimalMatch );
00354 CHECKSTATUSPTR( status );
00355
00356
00357 for (x1 = bankParams->x1Min; x1 <= bankParams->x1Max; x1 += bankParams->dx1)
00358 {
00359 for (x0 = bankParams->x0Min; x0 <= bankParams->x0Max; x0 += bankParams->dx0)
00360 {
00361 UINT4 ndx = 2 * nlist;
00362 list->data = (REAL4 *) LALRealloc( list->data, (ndx+2) * sizeof(REAL4) );
00363 if ( !list->data )
00364 {
00365 ABORT(status, LALINSPIRALBANKH_EMEM, LALINSPIRALBANKH_MSGEMEM);
00366 }
00367 list->data[ndx] = x0;
00368 list->data[ndx + 1] = x1;
00369 ++nlist;
00370 }
00371 }
00372
00373 list->length = nlist;
00374
00375 DETATCHSTATUSPTR(status);
00376 RETURN (status);
00377 }
00378
00379
00380
00381 void
00382 LALInspiralBCVFcutBank (
00383 LALStatus *status,
00384 InspiralTemplateList **list,
00385 INT4 *NList,
00386 InspiralCoarseBankIn coarseIn
00387 )
00388
00389 {
00390 UINT4 nf;
00391 UINT4 nlist;
00392 UINT4 j;
00393 UINT4 ndx;
00394 REAL8 frac;
00395 REAL8 fendBCV;
00396 REAL4 LowGM;
00397 REAL4 HighGM;
00398
00399 INITSTATUS( status, "LALInspiralBCVFcutBank", LALINSPIRALBCVBANKC );
00400
00401 nf = coarseIn.numFcutTemplates;
00402 ndx = nlist = *NList;
00403
00404 LowGM = coarseIn.LowGM;
00405 HighGM = coarseIn.HighGM;
00406
00407
00408
00409 if ( nf == 1 )
00410 {
00411 frac = 1;
00412 }
00413 else
00414 {
00415 frac = (1.L - 1.L/pow(HighGM/3., 1.5L)) / (nf-1.L);
00416 }
00417
00418
00419 for ( j = 0; j < nlist; ++j )
00420 {
00421 UINT4 valid = 0;
00422
00423 LALPSItoMasses(status, &((*list)[j].params), &valid , LowGM);
00424
00425 if ( valid )
00426 {
00427 UINT4 i;
00428 REAL8 fMax;
00429
00430 fMax = (*list)[j].params.fFinal;
00431
00432 for ( i = 0; i < nf; ++i )
00433 {
00434 fendBCV = fMax * (1.L - (REAL8) i * frac);
00435
00436 if ( (*list)[j].params.tSampling <= 0 )
00437 {
00438 ABORT( status, LALINSPIRALBANKH_ESIZE, LALINSPIRALBANKH_MSGESIZE );
00439 }
00440
00441
00442 if ( fendBCV > (*list)[j].params.fLower &&
00443 fendBCV < (*list)[j].params.tSampling / 2.0 )
00444 {
00445 ++ndx;
00446
00447 *list = (InspiralTemplateList *)
00448 LALRealloc( *list, ndx * sizeof(InspiralTemplateList) );
00449 if ( ! *list )
00450 {
00451 ABORT( status, LALINSPIRALBANKH_EMEM, LALINSPIRALBANKH_MSGEMEM );
00452 }
00453 memset( *list + ndx - 1, 0, sizeof(InspiralTemplate) );
00454 (*list)[ndx-1] = (*list)[j];
00455 (*list)[ndx-1].params.fFinal = fendBCV;
00456 (*list)[ndx-1].metric = (*list)[0].metric;
00457 (*list)[ndx-1].nLayer = i;
00458 }
00459 }
00460 }
00461 }
00462
00463 for ( j = nlist; j < ndx; ++j )
00464 {
00465 (*list)[j-nlist] = (*list)[j];
00466 }
00467
00468 *NList = ndx - nlist;
00469 *list = LALRealloc( *list, *NList * sizeof(InspiralTemplateList) );
00470 if ( ! *list )
00471 {
00472 ABORT( status, LALINSPIRALBANKH_EMEM, LALINSPIRALBANKH_MSGEMEM );
00473 }
00474
00475 RETURN( status );
00476 }
00477
00478
00479 void
00480 LALPSItoMasses (
00481 LALStatus *status,
00482 InspiralTemplate *params,
00483 UINT4 *valid,
00484 REAL4 HighGM
00485 )
00486 {
00487
00488 INITSTATUS( status, "LALPSItoMasses",
00489 LALINSPIRALBCVBANKC );
00490 ATTATCHSTATUSPTR( status );
00491
00492 if ( params->psi0 <= 0.L || params->psi3 >= 0.L )
00493 {
00494 *valid = 0;
00495 }
00496 else
00497 {
00498 REAL8 totalMass;
00499 REAL8 eta;
00500 REAL8 eightBy3 = 8.L/3.L;
00501 REAL8 twoBy3 = 2.L/3.L;
00502 REAL8 fiveBy3 = 5.L/3.L;
00503
00504 params->totalMass = -params->psi3/(16.L*LAL_PI * LAL_PI * params->psi0);
00505 eta = params->eta =
00506 3.L/(128.L * params->psi0 * pow(LAL_PI*params->totalMass, fiveBy3));
00507 totalMass = params->totalMass;
00508 params->fFinal = 1.L/( LAL_PI * pow(HighGM, 1.5L) * params->totalMass );
00509 params->totalMass /= LAL_MTSUN_SI;
00510 *valid = 1;
00511
00512 #if 0
00513 if (params->eta > 0.25L)
00514 {
00515 *valid = 0;
00516 }
00517 else
00518 {
00519 LALInspiralParameterCalc( status->statusPtr, params );
00520 CHECKSTATUSPTR( status );
00521 *valid = 1;
00522 }
00523 #endif
00524
00525 params->t0 = 5.0 / ( 256.0*eta*pow(totalMass, fiveby3) *
00526 pow(LAL_PI * params->fLower, eightBy3));
00527 params->t3 = LAL_PI/(8.0*eta*pow(totalMass, twoBy3) *
00528 pow(LAL_PI * params->fLower, fiveBy3));
00529 }
00530 DETATCHSTATUSPTR(status);
00531 RETURN (status);
00532 }
00533
00534
00535
00536
00537
00538
00539
00540 void
00541 LALInspiralBCVBankFcutS3S4 (
00542 LALStatus *status,
00543 InspiralTemplateList **list,
00544 INT4 *NList,
00545 InspiralCoarseBankIn coarseIn
00546 )
00547
00548 {
00549 UINT4 nf;
00550 UINT4 nlist;
00551 UINT4 j;
00552 UINT4 ndx;
00553 REAL8 frac;
00554 REAL8 fendBCV;
00555 REAL4 LowGM;
00556 REAL4 HighGM;
00557
00558 INITSTATUS( status, "LALInspiralBCVBankFcutS3S4", LALINSPIRALBCVBANKC );
00559
00560 nf = coarseIn.numFcutTemplates;
00561 ndx = nlist = *NList;
00562 LowGM = 3.;
00563 HighGM = coarseIn.HighGM;
00564
00565
00566 for ( j = 0; j < nlist; ++j )
00567 {
00568 UINT4 valid = 0;
00569 LALEmpiricalPSItoMassesConversion(status,
00570 &((*list)[j].params), &valid , LowGM);
00571
00572 if (valid)
00573 {
00574 UINT4 i;
00575 REAL8 fMax;
00576
00577 fMax = (*list)[j].params.fFinal;
00578 if ( (*list)[j].params.tSampling <= 0 )
00579 {
00580 ABORT( status, LALINSPIRALBANKH_ESIZE, LALINSPIRALBANKH_MSGESIZE );
00581 }
00582
00583 if (nf == 1)
00584 {
00585 frac = 1;
00586 }
00587 else
00588 {
00589 frac = (1.L - 1.L/pow(HighGM/3., 1.5L)) / (nf-1.L);
00590 }
00591
00592
00593
00594
00595
00596 if (((fMax * (1.L - (REAL4) (nf-1) * frac)) >= (*list)[j].params.tSampling/2.0))
00597 {
00598 fMax = (*list)[j].params.tSampling/2.0 - 1. ;
00599 frac = -1;
00600 }
00601
00602
00603
00604
00605
00606
00607
00608 for (i=0; i<nf; i++)
00609 {
00610 fendBCV = fMax * (1.L - (REAL4) i * frac);
00611
00612 if ( fendBCV >= (*list)[j].params.fLower * 1.5 &&
00613 fendBCV < (*list)[j].params.tSampling / 2.0 )
00614 {
00615 ++ndx;
00616 *list = (InspiralTemplateList *)
00617 LALRealloc( *list, ndx * sizeof(InspiralTemplateList) );
00618 if ( ! *list )
00619 {
00620 ABORT( status, LALINSPIRALBANKH_EMEM, LALINSPIRALBANKH_MSGEMEM );
00621 }
00622 memset( *list + ndx - 1, 0, sizeof(InspiralTemplate) );
00623 (*list)[ndx-1] = (*list)[j];
00624 (*list)[ndx-1].params.fFinal = fendBCV;
00625 (*list)[ndx-1].metric = (*list)[0].metric;
00626 (*list)[ndx-1].nLayer = i;
00627 }
00628 }
00629 }
00630 }
00631 for ( j = nlist; j < ndx; ++j )
00632 {
00633 (*list)[j-nlist] = (*list)[j];
00634 }
00635 *NList = ndx - nlist;
00636 *list = LALRealloc( *list, *NList * sizeof(InspiralTemplateList) );
00637 if ( ! *list )
00638 {
00639 ABORT( status, LALINSPIRALBANKH_EMEM, LALINSPIRALBANKH_MSGEMEM );
00640 }
00641
00642
00643 RETURN( status );
00644 }
00645
00646
00647
00648
00649 void
00650 LALInspiralBCVRegularFcutBank (
00651 LALStatus *status,
00652 InspiralTemplateList **list,
00653 INT4 *NList,
00654 InspiralCoarseBankIn coarseIn
00655 )
00656
00657 {
00658
00659
00660 UINT4 i,nf, nlist, j, ndx;
00661 REAL8 fendBCV;
00662
00663 INITSTATUS( status, "LALInspiralBCVFcutBank", LALINSPIRALBCVBANKC );
00664
00665 nf = coarseIn.numFcutTemplates;
00666 ndx = nlist = *NList;
00667
00668 for ( j = 0; j < nlist; ++j )
00669 {
00670 for ( i = 1; i <=nf; ++i )
00671 {
00672 fendBCV = (*list)[j].params.fLower
00673 + i * ((*list)[j].params.tSampling/2.0 - (*list)[j].params.fLower) / nf ;
00674 ++ndx;
00675
00676 *list = (InspiralTemplateList *)
00677 LALRealloc( *list, ndx * sizeof(InspiralTemplateList) );
00678 if ( ! *list )
00679 {
00680 ABORT( status, LALINSPIRALBANKH_EMEM, LALINSPIRALBANKH_MSGEMEM );
00681 }
00682 memset( *list + ndx - 1, 0, sizeof(InspiralTemplate) );
00683 (*list)[ndx-1] = (*list)[j];
00684 (*list)[ndx-1].params.fFinal = fendBCV;
00685 (*list)[ndx-1].metric = (*list)[0].metric;
00686 (*list)[ndx-1].nLayer = i;
00687 }
00688 }
00689
00690
00691 for ( j = nlist; j < ndx; ++j )
00692 {
00693 (*list)[j-nlist] = (*list)[j];
00694 }
00695
00696 *NList = ndx - nlist;
00697 *list = LALRealloc( *list, *NList * sizeof(InspiralTemplateList) );
00698 if ( ! *list )
00699 {
00700 ABORT( status, LALINSPIRALBANKH_EMEM, LALINSPIRALBANKH_MSGEMEM );
00701 }
00702
00703 RETURN( status );
00704 }
00705
00706
00707
00708
00709
00710
00711
00712 void
00713 LALEmpiricalPSItoMassesConversion (
00714 LALStatus *status,
00715 InspiralTemplate *params,
00716 UINT4 *valid,
00717 REAL4 lightring
00718 )
00719 {
00720
00721 INITSTATUS( status, "LALEmpiricalPSItoMassesConversion",
00722 LALINSPIRALBCVBANKC );
00723 ATTATCHSTATUSPTR( status );
00724
00725 if ( params->psi0 <= 0.L || params->psi3 >= 0.L )
00726 {
00727 *valid = 0;
00728 }
00729 else
00730 {
00731 params->totalMass = -params->psi3/(16.L*LAL_PI * LAL_PI * params->psi0);
00732 params->totalMass = params->totalMass * 2. ;
00733
00734
00735
00736
00737
00738
00739 params->fFinal = 1.L/( LAL_PI * pow(lightring, 1.5L) * params->totalMass );
00740 params->totalMass /= LAL_MTSUN_SI;
00741
00742 *valid = 1;
00743 }
00744
00745 DETATCHSTATUSPTR(status);
00746 RETURN (status);
00747 }
00748
00749
00750
00751
00752 void
00753 LALInspiralCreateFlatBankS3S4 (
00754 LALStatus *status,
00755 REAL4VectorSequence *list,
00756 InspiralBankParams *bankParams,
00757 InspiralCoarseBankIn coarseIn
00758 )
00759
00760 {
00761 InspiralMetric *metric;
00762 REAL8 minimalMatch;
00763 REAL8 x0, x1, dx1=0, dx0=0, x=0, y=0;
00764 UINT4 nlist = 0;
00765 INT4 layer = 1;
00766 INT4 valid = -1;
00767 REAL4 xp[8] = {3000, 40000, 100000, 300000, 550000, 550000, 250000,3000};
00768 REAL4 yp[8] = {0, -3000, -3000, -2000, -1500, -300, -300, 0};
00769 INT4 npol = 8;
00770
00771
00772 INITSTATUS( status, "LALInspiralCreateFlatBankS3S4",
00773 LALINSPIRALBCVBANKC );
00774 ATTATCHSTATUSPTR( status );
00775
00776
00777
00778
00779
00780 metric = bankParams->metric;
00781 minimalMatch = bankParams->minimalMatch;
00782
00783 switch (coarseIn.gridSpacing){
00784 case HybridHexagonal:
00785 case S2BCV:
00786 case Hexagonal:
00787 dx0 = sqrt(2.L * (1.L - minimalMatch)/metric->g00 );
00788 dx1 = sqrt(2.L * (1.L - minimalMatch)/metric->g11 );
00789 dx0 *=3./2./sqrt(2.);
00790 dx1 *=sqrt(3./2.);
00791 break;
00792 case Square:
00793 dx0 = sqrt(2.L * (1.L - minimalMatch)/metric->g00 );
00794 dx1 = sqrt(2.L * (1.L - minimalMatch)/metric->g11 );
00795 break;
00796 case HexagonalNotOriented:
00797 LALInspiralUpdateParams( status->statusPtr,
00798 bankParams, *metric, minimalMatch );
00799 CHECKSTATUSPTR( status );
00800 dx0 = bankParams->dx0 * 3./2./sqrt(2.);
00801 dx1 = bankParams->dx1 * sqrt(3./2.);
00802 break;
00803
00804 case SquareNotOriented:
00805 LALInspiralUpdateParams( status->statusPtr,
00806 bankParams, *metric, minimalMatch );
00807 CHECKSTATUSPTR( status );
00808 dx0 = bankParams->dx0;
00809 dx1 = bankParams->dx1;
00810 break;
00811 }
00812
00813
00814 switch (coarseIn.gridSpacing)
00815 {
00816 case HybridHexagonal:
00817 case S2BCV:
00818 case Hexagonal:
00819 case HexagonalNotOriented:
00820
00821
00822 for (x1 = bankParams->x1Min -1e6; x1 <= bankParams->x1Max + 1e6; x1 += dx1)
00823 {
00824 layer++;
00825 for (x0 = bankParams->x0Min - 1e6 +dx0/2.*(layer%2); x0 <= bankParams->x0Max+1e6; x0 += dx0 )
00826 {
00827 UINT4 ndx = 2 * nlist;
00828 if ( coarseIn.gridSpacing == Hexagonal)
00829 {
00830 x = x0 *cos(metric->theta) + sin(metric->theta)* x1;
00831 y = x0 *sin(metric->theta) - cos(metric->theta)* x1;
00832 }
00833 else
00834 {
00835 x = x0;
00836 y = x1;
00837 }
00838
00839 if ( (x > bankParams->x0Min -dx0/2.) && (y < bankParams->x1Max + dx1/2.) &&
00840 (x < bankParams->x0Max +dx0/2.) && (y > bankParams->x1Min - dx1/2.))
00841 {
00842
00843 if (coarseIn.insidePolygon == True)
00844 {
00845 LALInsidePolygon(status->statusPtr, xp, yp, npol, x, y, &valid);
00846 }
00847 else
00848 {
00849 LALExcludeTemplate(status->statusPtr, &valid, bankParams, x, y);
00850 }
00851
00852
00853 if (valid == 1)
00854 {
00855 list->data = (REAL4 *) LALRealloc( list->data, (ndx+2) * sizeof(REAL4) );
00856 if ( !list->data )
00857 {
00858 ABORT(status, LALINSPIRALBANKH_EMEM, LALINSPIRALBANKH_MSGEMEM);
00859 }
00860 list->data[ndx] = x;
00861 list->data[ndx + 1] = y;
00862 ++nlist;
00863 }
00864 }
00865 }
00866 }
00867 break;
00868
00869 case Square:
00870 case SquareNotOriented:
00871
00872
00873
00874 for (x1 = bankParams->x1Min -1e6; x1 <= bankParams->x1Max + 1e6; x1 += dx1)
00875 {
00876 for (x0 = bankParams->x0Min - 1e6 ; x0 <= bankParams->x0Max+1e6; x0 += dx0 )
00877 {
00878 UINT4 ndx = 2 * nlist;
00879
00880 if (coarseIn.gridSpacing == Square)
00881 {
00882 x = x0 *cos(metric->theta) + sin(metric->theta)* x1 ;
00883 y = x0 *sin(metric->theta) - cos(metric->theta)* x1;
00884 }
00885 else if (coarseIn.gridSpacing == SquareNotOriented)
00886 {
00887 x = x0;
00888 y = x1;
00889 }
00890 if ( (x > bankParams->x0Min - dx0/2.) && (y < bankParams->x1Max + dx1/2.) &&
00891 (x < bankParams->x0Max + dx0/2.) && (y > bankParams->x1Min - dx1/2.))
00892
00893 {
00894
00895 if (coarseIn.insidePolygon == True)
00896 {
00897 LALInsidePolygon(status->statusPtr, xp, yp, npol, x, y, &valid);
00898 }
00899 else
00900 {
00901 LALExcludeTemplate(status->statusPtr, &valid, bankParams, x, y);
00902 }
00903 if (valid)
00904 {
00905 list->data = (REAL4 *) LALRealloc( list->data, (ndx+2) * sizeof(REAL4) );
00906 if ( !list->data )
00907 {
00908 ABORT(status, LALINSPIRALBANKH_EMEM, LALINSPIRALBANKH_MSGEMEM);
00909 }
00910 list->data[ndx] = x;
00911 list->data[ndx + 1] = y;
00912 ++nlist;
00913 }
00914 }
00915 }
00916 }
00917 break;
00918 }
00919
00920 list->length = nlist;
00921
00922 DETATCHSTATUSPTR(status);
00923 RETURN (status);
00924 }
00925
00926
00927
00928
00929
00930
00931 void
00932 LALExcludeTemplate(
00933 LALStatus *status,
00934 INT4 *valid,
00935 InspiralBankParams *bankParams,
00936 REAL4 x,
00937 REAL4 y)
00938 {
00939 REAL4 psi0Int = 2500000.;
00940 REAL4 psi3Int = -10000.;
00941
00942 INITSTATUS( status, "LALExcludeTemplate",
00943 LALINSPIRALBCVBANKC );
00944 ATTATCHSTATUSPTR( status );
00945
00946 if (x > psi0Int && y < psi3Int )
00947 {
00948 *valid = 0 ;
00949 }
00950 else
00951 {
00952 *valid = 1;
00953 }
00954
00955 DETATCHSTATUSPTR(status);
00956 RETURN (status);
00957 }
00958
00959
00960