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 #define TWODMESHTESTC_ENORM 0
00088 #define TWODMESHTESTC_ESUB 1
00089 #define TWODMESHTESTC_EARG 2
00090 #define TWODMESHTESTC_EBAD 3
00091 #define TWODMESHTESTC_EMEM 4
00092 #define TWODMESHTESTC_EFILE 5
00093 #define TWODMESHTESTC_EMETRIC 6
00094
00095 #define TWODMESHTESTC_MSGENORM "Normal exit"
00096 #define TWODMESHTESTC_MSGESUB "Subroutine failed"
00097 #define TWODMESHTESTC_MSGEARG "Error parsing arguments"
00098 #define TWODMESHTESTC_MSGEBAD "Bad argument value"
00099 #define TWODMESHTESTC_MSGEMEM "Memory allocation error"
00100 #define TWODMESHTESTC_MSGEFILE "Could not open file"
00101 #define TWODMESHTESTC_MSGEMETRIC "Axis length is zero or negative within specified region"
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
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 #include <math.h>
00265 #include <stdlib.h>
00266 #include <lal/LALStdio.h>
00267 #include <lal/FileIO.h>
00268 #include <lal/LALStdlib.h>
00269 #include <lal/LALConstants.h>
00270 #include <lal/Grid.h>
00271 #include <lal/StreamInput.h>
00272 #include <lal/TwoDMesh.h>
00273 #include "TwoDMeshPlot.h"
00274
00275 NRCSID( TWODMESHTESTC, "$Id: TwoDMeshTest.c,v 1.8 2007/06/08 14:41:52 bema Exp $" );
00276
00277
00278 int lalDebugLevel = 0;
00279 #define X1 (1.0)
00280 #define Y1 (0.0)
00281 #define X2 (0.0)
00282 #define Y2 (1.0)
00283 #define A_DEFAULT (0.1)
00284 #define B_DEFAULT (0.05)
00285 #define C_DEFAULT (1.0)
00286 #define DADX (0.0)
00287 #define DBDX (0.0)
00288 #define DCDX (0.0)
00289 #define DADY (0.0)
00290 #define DBDY (0.0)
00291 #define DCDY (0.0)
00292 #define MISMATCH (1.0)
00293
00294
00295 #define USAGE "Usage: %s [-o outfile] [-p psfile flags] [-d debug]\n" \
00296 "\t[-m mismatch nmax cmax] [-b x1 y1 x2 y2 ] [-e a b c]\n" \
00297 "\t[-x dadx dbdx dcdx] [-y dady dbdy dcdy] [-i metricfile rangefile]\n"
00298
00299
00300 #define ERROR( code, msg, statement ) \
00301 if ( lalDebugLevel & LALERROR ) \
00302 { \
00303 LALPrintError( "Error[0] %d: program %s, file %s, line %d, %s\n" \
00304 " %s %s\n", (code), *argv, __FILE__, \
00305 __LINE__, TWODMESHTESTC, statement ? statement : \
00306 "", (msg) ); \
00307 } \
00308 else (void)(0)
00309
00310 #define INFO( statement ) \
00311 if ( lalDebugLevel & LALINFO ) \
00312 { \
00313 LALPrintError( "Info[0]: program %s, file %s, line %d, %s\n" \
00314 " %s\n", *argv, __FILE__, __LINE__, \
00315 TWODMESHTESTC, (statement) ); \
00316 } \
00317 else (void)(0)
00318
00319 #define SUB( func, statusptr ) \
00320 if ( (func), (statusptr)->statusCode ) \
00321 { \
00322 ERROR( TWODMESHTESTC_ESUB, TWODMESHTESTC_MSGESUB, \
00323 "Function call \"" #func "\" failed:" ); \
00324 return TWODMESHTESTC_ESUB; \
00325 } \
00326 else (void)(0)
00327
00328
00329 #ifndef NDEBUG
00330 char *lalWatch;
00331 #endif
00332
00333
00334 void
00335 LALRangeTest( LALStatus *stat, REAL4 range[2], REAL4 x, void *params );
00336
00337 void
00338 LALMetricTest( LALStatus *stat,
00339 REAL4 metric[3],
00340 REAL4 position[2],
00341 void *params );
00342
00343 int
00344 main(int argc, char **argv)
00345 {
00346 INT4 arg;
00347 static LALStatus stat;
00348 REAL4 rangeParams[4];
00349 REAL4 metricParams[9];
00350 REAL4Grid *metricGrid = NULL;
00351 REAL4Grid *rangeGrid = NULL;
00352 TwoDMeshParamStruc params;
00353 TwoDMeshNode *mesh = NULL;
00354
00355
00356 CHAR *outfile = NULL;
00357 CHAR *psfile = NULL;
00358 UINT2 flags = 0;
00359 CHAR *metricfile = NULL, *rangefile = NULL;
00360 REAL4 mismatch = MISMATCH;
00361 UINT4 nmax = 0, cmax = 0;
00362 REAL4 x1 = X1, y1 = Y1, x2 = X2, y2 = Y2;
00363 REAL4 a = A_DEFAULT, b = B_DEFAULT, c = C_DEFAULT;
00364 REAL4 dadx = DADX, dbdx = DBDX, dcdx = DCDX;
00365 REAL4 dady = DADY, dbdy = DBDY, dcdy = DCDY;
00366
00367
00368
00369
00370
00371
00372 arg = 1;
00373 while ( arg < argc ) {
00374
00375 if ( !strcmp( argv[arg], "-o" ) ) {
00376 if ( argc > arg + 1 ) {
00377 arg++;
00378 outfile = argv[arg++];
00379 } else {
00380 ERROR( TWODMESHTESTC_EARG, TWODMESHTESTC_MSGEARG, 0 );
00381 LALPrintError( USAGE, *argv );
00382 return TWODMESHTESTC_EARG;
00383 }
00384 }
00385
00386 else if ( !strcmp( argv[arg], "-p" ) ) {
00387 if ( argc > arg + 2 ) {
00388 arg++;
00389 psfile = argv[arg++];
00390 flags = atoi( argv[arg++] );
00391 } else {
00392 ERROR( TWODMESHTESTC_EARG, TWODMESHTESTC_MSGEARG, 0 );
00393 LALPrintError( USAGE, *argv );
00394 return TWODMESHTESTC_EARG;
00395 }
00396 }
00397
00398 else if ( !strcmp( argv[arg], "-d" ) ) {
00399 if ( argc > arg + 1 ) {
00400 arg++;
00401 lalDebugLevel = atoi( argv[arg++] );
00402 } else {
00403 ERROR( TWODMESHTESTC_EARG, TWODMESHTESTC_MSGEARG, 0 );
00404 LALPrintError( USAGE, *argv );
00405 return TWODMESHTESTC_EARG;
00406 }
00407 }
00408
00409 else if ( !strcmp( argv[arg], "-m" ) ) {
00410 if ( argc > arg + 2 ) {
00411 arg++;
00412 nmax = atoi( argv[arg++] );
00413 cmax = atoi( argv[arg++] );
00414 mismatch = atof( argv[arg++] );
00415 } else {
00416 ERROR( TWODMESHTESTC_EARG, TWODMESHTESTC_MSGEARG, 0 );
00417 LALPrintError( USAGE, *argv );
00418 return TWODMESHTESTC_EARG;
00419 }
00420 }
00421
00422 else if ( !strcmp( argv[arg], "-b" ) ) {
00423 if ( argc > arg + 4 ) {
00424 arg++;
00425 x1 = atof( argv[arg++] );
00426 y1 = atof( argv[arg++] );
00427 x2 = atof( argv[arg++] );
00428 y2 = atof( argv[arg++] );
00429 } else {
00430 ERROR( TWODMESHTESTC_EARG, TWODMESHTESTC_MSGEARG, 0 );
00431 LALPrintError( USAGE, *argv );
00432 return TWODMESHTESTC_EARG;
00433 }
00434 }
00435
00436 else if ( !strcmp( argv[arg], "-e" ) ) {
00437 if ( argc > arg + 3 ) {
00438 arg++;
00439 a = atof( argv[arg++] );
00440 b = atof( argv[arg++] );
00441 c = atof( argv[arg++] );
00442 } else {
00443 ERROR( TWODMESHTESTC_EARG, TWODMESHTESTC_MSGEARG, 0 );
00444 LALPrintError( USAGE, *argv );
00445 return TWODMESHTESTC_EARG;
00446 }
00447 }
00448
00449 else if ( !strcmp( argv[arg], "-x" ) ) {
00450 if ( argc > arg + 3 ) {
00451 arg++;
00452 dadx = atof( argv[arg++] );
00453 dbdx = atof( argv[arg++] );
00454 dcdx = atof( argv[arg++] );
00455 } else {
00456 ERROR( TWODMESHTESTC_EARG, TWODMESHTESTC_MSGEARG, 0 );
00457 LALPrintError( USAGE, *argv );
00458 return TWODMESHTESTC_EARG;
00459 }
00460 }
00461
00462 else if ( !strcmp( argv[arg], "-y" ) ) {
00463 if ( argc > arg + 3 ) {
00464 arg++;
00465 dady = atof( argv[arg++] );
00466 dbdy = atof( argv[arg++] );
00467 dcdy = atof( argv[arg++] );
00468 } else {
00469 ERROR( TWODMESHTESTC_EARG, TWODMESHTESTC_MSGEARG, 0 );
00470 LALPrintError( USAGE, *argv );
00471 return TWODMESHTESTC_EARG;
00472 }
00473 }
00474
00475 else if ( !strcmp( argv[arg], "-i" ) ) {
00476 if ( argc > arg + 2 ) {
00477 arg++;
00478 metricfile = argv[arg++];
00479 rangefile = argv[arg++];
00480 } else {
00481 ERROR( TWODMESHTESTC_EARG, TWODMESHTESTC_MSGEARG, 0 );
00482 LALPrintError( USAGE, *argv );
00483 return TWODMESHTESTC_EARG;
00484 }
00485 }
00486
00487 else if ( argv[arg][0] == '-' ) {
00488 ERROR( TWODMESHTESTC_EARG, TWODMESHTESTC_MSGEARG, 0 );
00489 LALPrintError( USAGE, *argv );
00490 return TWODMESHTESTC_EARG;
00491 }
00492 }
00493
00494
00495
00496
00497
00498 if ( !metricfile ) {
00499 REAL4 axisMin, axisTemp;
00500
00501
00502 if ( ( x1 == 0.0 ) && ( x2 == 0.0 ) ) {
00503 ERROR( TWODMESHTESTC_EBAD, TWODMESHTESTC_MSGEBAD,
00504 "x1 = x2 = 0:" );
00505 return TWODMESHTESTC_EBAD;
00506 }
00507 if ( x1 < x2 ) {
00508 rangeParams[0] = x1;
00509 rangeParams[1] = y1;
00510 rangeParams[2] = x2;
00511 rangeParams[3] = y2;
00512 } else {
00513 rangeParams[0] = x2;
00514 rangeParams[1] = y2;
00515 rangeParams[2] = x1;
00516 rangeParams[3] = y1;
00517 }
00518 params.getRange = LALRangeTest;
00519 params.rangeParams = (void *)( rangeParams );
00520 if ( x1*x2 <= 0.0 ) {
00521 if ( x1 < x2 ) {
00522 params.domain[0] = x1;
00523 params.domain[1] = x2;
00524 } else {
00525 params.domain[0] = x2;
00526 params.domain[1] = x1;
00527 }
00528 } else {
00529 if ( x1 < 0.0 ) {
00530 params.domain[0] = x1 + x2;
00531 params.domain[1] = 0.0;
00532 } else {
00533 params.domain[0] = 0.0;
00534 params.domain[1] = x1 + x2;
00535 }
00536 }
00537
00538
00539 axisMin = a;
00540 axisTemp = a + dadx*x1 + dady*y1;
00541 if ( axisTemp < axisMin ) axisMin = axisTemp;
00542 axisTemp = a + dadx*x2 + dady*y2;
00543 if ( axisTemp < axisMin ) axisMin = axisTemp;
00544 axisTemp = a + dadx*( x1 + x2 ) + dady*( y1 + y2 );
00545 if ( axisTemp < axisMin ) axisMin = axisTemp;
00546 if ( axisMin <= 0.0 ) {
00547 ERROR( TWODMESHTESTC_EMETRIC, TWODMESHTESTC_MSGEMETRIC,
00548 "axis a:" );
00549 return TWODMESHTESTC_EBAD;
00550 }
00551 axisTemp = b;
00552 if ( axisTemp < axisMin ) axisMin = axisTemp;
00553 axisTemp = b + dbdx*x1 + dbdy*y1;
00554 if ( axisTemp < axisMin ) axisMin = axisTemp;
00555 axisTemp = b + dbdx*x2 + dbdy*y2;
00556 if ( axisTemp < axisMin ) axisMin = axisTemp;
00557 axisTemp = b + dbdx*( x1 + x2 ) + dbdy*( y1 + y2 );
00558 if ( axisTemp < axisMin ) axisMin = axisTemp;
00559 if ( axisMin <= 0.0 ) {
00560 ERROR( TWODMESHTESTC_EMETRIC, TWODMESHTESTC_MSGEMETRIC,
00561 "axis b:" );
00562 return TWODMESHTESTC_EBAD;
00563 }
00564
00565
00566 metricParams[0] = a;
00567 metricParams[1] = b;
00568 metricParams[2] = c;
00569 metricParams[3] = dadx;
00570 metricParams[4] = dbdx;
00571 metricParams[5] = dcdx;
00572 metricParams[6] = dady;
00573 metricParams[7] = dbdy;
00574 metricParams[8] = dcdy;
00575 params.getMetric = LALMetricTest;
00576 params.metricParams = (void *)( metricParams );
00577 }
00578
00579
00580
00581
00582
00583 else {
00584 FILE *fp = fopen( metricfile, "r" );
00585 if ( !fp ) {
00586 ERROR( TWODMESHTESTC_EFILE, "- " TWODMESHTESTC_MSGEFILE,
00587 metricfile );
00588 return TWODMESHTESTC_EFILE;
00589 }
00590 SUB( LALSReadGrid( &stat, &metricGrid, fp ), &stat );
00591 fclose( fp );
00592 fp = fopen( rangefile, "r" );
00593 if ( !fp ) {
00594 ERROR( TWODMESHTESTC_EFILE, "- " TWODMESHTESTC_MSGEFILE,
00595 rangefile );
00596 return TWODMESHTESTC_EFILE;
00597 }
00598 SUB( LALSReadGrid( &stat, &rangeGrid, fp ), &stat );
00599 fclose( fp );
00600 params.getMetric = LALInterpolateMetricGrid;
00601 params.metricParams = (void *)( metricGrid );
00602 params.getRange = LALInterpolateRangeGrid;
00603 params.rangeParams = (void *)( rangeGrid );
00604 params.domain[0] = rangeGrid->offset->data[0];
00605 params.domain[1] = rangeGrid->offset->data[0]
00606 + rangeGrid->interval->data[0]
00607 *( rangeGrid->data->dimLength->data[0] - 1 );
00608 }
00609
00610
00611
00612
00613
00614
00615 params.mThresh = mismatch;
00616 params.widthMaxFac = 0.0;
00617 params.widthRetryFac = 0.0;
00618 params.maxColumns = cmax;
00619 params.nIn = nmax;
00620
00621
00622 SUB( LALCreateTwoDMesh( &stat, &mesh, ¶ms ), &stat );
00623
00624
00625 if ( outfile ) {
00626 FILE *fp = fopen( outfile, "w" );
00627 TwoDMeshNode *here;
00628
00629 if ( !fp ) {
00630 ERROR( TWODMESHTESTC_EFILE, "- " TWODMESHTESTC_MSGEFILE,
00631 outfile );
00632 return TWODMESHTESTC_EFILE;
00633 }
00634 for ( here = mesh; here; here = here->next )
00635 fprintf( fp, "%f %f %f %f %f\n", here->x, here->y, here->dx,
00636 here->dy[0], here->dy[1] );
00637 fclose( fp );
00638 }
00639
00640
00641 if ( psfile && flags ) {
00642 FILE *fp = fopen( psfile, "w" );
00643 INT2 plotPoints = flags & 1;
00644 BOOLEAN plotTiles = flags & 2;
00645 BOOLEAN plotEllipses = flags & 4;
00646 TwoDMeshPlotStruc plotParams;
00647
00648 if ( !fp ) {
00649 ERROR( TWODMESHTESTC_EFILE, "- " TWODMESHTESTC_MSGEFILE,
00650 psfile );
00651 return TWODMESHTESTC_EFILE;
00652 }
00653
00654
00655
00656
00657 if ( !metricfile ) {
00658 REAL4 theta1, theta2;
00659 REAL4 xSum = x1 + x2, xDiff = x2 - x1;
00660 REAL4 ySum = y1 + y2, yDiff = y2 - y1;
00661 theta1 = LAL_180_PI*atan2( (REAL4)( TWODMESHPLOTH_YSIZE ),
00662 (REAL4)( TWODMESHPLOTH_XSIZE ) );
00663 if ( xSum*xSum + ySum*ySum >= xDiff*xDiff + yDiff*yDiff )
00664 theta1 -= LAL_180_PI*atan2( ySum, xSum );
00665 else
00666 theta1 -= LAL_180_PI*atan2( yDiff, xDiff );
00667 theta2 = theta1 + LAL_180_PI*atan2( y1, x1 );
00668 while ( theta2 < -180.0 ) theta2 += 360.0;
00669 while ( theta2 > 180.0 ) theta2 -= 360.0;
00670 if ( theta2 > 90.0 )
00671 theta1 -= theta2 - 90.0;
00672 else if ( ( -90.0 < theta2 ) && ( theta2 < 0.0 ) )
00673 theta1 -= theta2 + 90.0;
00674 theta2 = theta1 + LAL_180_PI*atan2( y2, x2 );
00675 while ( theta2 < -180.0 ) theta2 += 360.0;
00676 while ( theta2 > 180.0 ) theta2 -= 360.0;
00677 if ( theta2 > 90.0 )
00678 theta1 -= theta2 - 90.0;
00679 else if ( ( -90.0 < theta2 ) && ( theta2 < 0.0 ) )
00680 theta1 -= theta2 + 90.0;
00681 plotParams.theta = theta1;
00682 } else
00683 plotParams.theta = 0.0;
00684
00685
00686 plotParams.xScale = plotParams.yScale = 100.0;
00687 plotParams.bBox[0] = 36.0;
00688 plotParams.bBox[1] = 36.0;
00689 plotParams.bBox[2] = 576.0;
00690 plotParams.bBox[3] = 756.0;
00691 plotParams.autoscale = 1;
00692 memset( plotParams.clipBox, 0, 4*sizeof(REAL4) );
00693 plotParams.nLevels = 1;
00694 if ( flags & 8 )
00695 plotParams.nBoundary = 2 +
00696 (UINT4)( ( params.domain[1] - params.domain[0] )/a );
00697 else
00698 plotParams.nBoundary = 0;
00699 plotParams.plotPoints = &plotPoints;
00700 plotParams.plotTiles = &plotTiles;
00701 plotParams.plotEllipses = &plotEllipses;
00702 plotParams.params = ¶ms;
00703 SUB( LALPlotTwoDMesh( &stat, fp, mesh, &plotParams ), &stat );
00704 fclose( fp );
00705 }
00706
00707
00708 if ( metricfile ) {
00709 SUB( LALSDestroyGrid( &stat, &metricGrid ), &stat );
00710 SUB( LALSDestroyGrid( &stat, &rangeGrid ), &stat );
00711 }
00712 SUB( LALDestroyTwoDMesh( &stat, &mesh, NULL ), &stat );
00713 LALCheckMemoryLeaks();
00714 INFO( TWODMESHTESTC_MSGENORM );
00715 return TWODMESHTESTC_ENORM;
00716 }
00717
00718
00719 void
00720 LALRangeTest( LALStatus *stat, REAL4 range[2], REAL4 x, void *params )
00721 {
00722 REAL4 *xy = (REAL4 *)( params );
00723 REAL4 ya, yb;
00724
00725
00726
00727 INITSTATUS( stat, "LALRangeTest", TWODMESHTESTC );
00728 ASSERT( range, stat, TWODMESHH_ENUL, TWODMESHH_MSGENUL );
00729 ASSERT( params, stat, TWODMESHH_ENUL, TWODMESHH_MSGENUL );
00730
00731
00732 if ( xy[0] == 0.0 ) {
00733 ya = xy[3]*( x/xy[2] );
00734 yb = ya + xy[1];
00735 }
00736 else if ( xy[2] == 0.0 ) {
00737 ya = xy[1]*( x/xy[0] );
00738 yb = ya + xy[3];
00739 }
00740
00741
00742
00743 else if ( ( xy[0] > 0.0 ) || ( xy[2] < 0.0 ) ) {
00744 if ( fabs( x ) < fabs( xy[0] ) )
00745 ya = xy[1]*( x/xy[0] );
00746 else
00747 ya = xy[1] + xy[3]*( ( x - xy[0] )/xy[2] );
00748 if ( fabs( x ) < fabs( xy[2] ) )
00749 yb = xy[3]*( x/xy[2] );
00750 else
00751 yb = xy[3] + xy[1]*( ( x - xy[2] )/xy[0] );
00752 }
00753
00754
00755
00756 else {
00757 if ( x < 0.0 )
00758 ya = xy[1]*( x/xy[0] );
00759 else
00760 ya = xy[3]*( x/xy[2] );
00761 if ( x - xy[0] - xy[2] < 0.0 )
00762 yb = xy[1] + xy[3]*( ( x - xy[0] )/xy[2] );
00763 else
00764 yb = xy[3] + xy[1]*( ( x - xy[2] )/xy[0] );
00765 }
00766
00767
00768 if ( ya < yb ) {
00769 range[0] = ya;
00770 range[1] = yb;
00771 } else {
00772 range[0] = yb;
00773 range[1] = ya;
00774 }
00775 RETURN( stat );
00776 }
00777
00778
00779 void
00780 LALMetricTest( LALStatus *stat,
00781 REAL4 metric[3],
00782 REAL4 position[2],
00783 void *params )
00784 {
00785 REAL4 *abc = (REAL4 *)( params );
00786 REAL4 a, b, c;
00787 REAL4 lambda1, lambda2;
00788 REAL4 cosc, sinc;
00789
00790 INITSTATUS( stat, "LALMetricTest", TWODMESHTESTC );
00791 ASSERT( metric, stat, TWODMESHH_ENUL, TWODMESHH_MSGENUL );
00792 ASSERT( position, stat, TWODMESHH_ENUL, TWODMESHH_MSGENUL );
00793 ASSERT( params, stat, TWODMESHH_ENUL, TWODMESHH_MSGENUL );
00794
00795
00796 a = abc[0] + position[0]*abc[3] + position[1]*abc[6];
00797 b = abc[1] + position[0]*abc[4] + position[1]*abc[7];
00798 c = abc[2] + position[0]*abc[5] + position[1]*abc[8];
00799 if ( a*b == 0.0 ) {
00800 ABORT( stat, TWODMESHTESTC_EMETRIC, TWODMESHTESTC_MSGEMETRIC );
00801 }
00802
00803
00804 lambda1 = MISMATCH/( a*a );
00805 lambda2 = MISMATCH/( b*b );
00806 cosc = cos( c );
00807 sinc = sin( c );
00808
00809
00810 metric[0] = lambda1*cosc*cosc + lambda2*sinc*sinc;
00811 metric[1] = lambda1*sinc*sinc + lambda2*cosc*cosc;
00812 metric[2] = ( lambda1 - lambda2 )*cosc*sinc;
00813 RETURN( stat );
00814 }