00001
00002
00003
00004
00005
00006
00007 #include "cddefines.h"
00008 #include "trace.h"
00009 #include "optimize.h"
00010 #include "grid.h"
00011 #include "input.h"
00012 #include "prt.h"
00013 #include "parse.h"
00014 #include "lines_service.h"
00015
00016 static const float DEFERR = 0.05f;
00017
00018
00019 static void GetOptLineInt(char *chCard );
00020
00021
00022 static void GetOptColDen(char *chCard );
00023
00024
00025 static void GetOptTemp(char *chCard );
00026
00027 void ParseOptimize(
00028
00029 char *chCard)
00030 {
00031 bool lgEOL;
00032 long int i;
00033
00034 DEBUG_ENTRY( "ParseOptimize()" );
00035
00036
00037 if( nMatch("FILE",chCard) )
00038 {
00039
00040
00041
00042
00043
00044
00045 if( optimize.ioOptim == NULL )
00046 {
00047
00048
00049
00050 GetQuote( chOptimFileName , chCard , true );
00051
00052
00053 optimize.ioOptim = fopen( chOptimFileName , "w" );
00054 if( optimize.ioOptim == NULL )
00055 {
00056 fprintf(ioQQQ," error opening file %s\n", chOptimFileName );
00057 cdEXIT(EXIT_FAILURE);
00058 }
00059 }
00060
00061 }
00062
00063
00064
00065 else if( nMatch("COLU",chCard) )
00066 {
00067
00068 optimize.lgOptCol = true;
00069
00070
00071 GetOptColDen(chCard);
00072 }
00073
00074 else if( nMatch("CONT",chCard) )
00075 {
00076
00077 optimize.lgOptCont = true;
00078 }
00079
00080
00081 else if( nMatch("INCR",chCard) && !nMatch("GRID",chCard) )
00082 {
00083
00084 if( optimize.nparm > 0 )
00085 {
00086
00087 i = 5;
00088 optimize.OptIncrm[optimize.nparm-1] =
00089 (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00090 }
00091 }
00092
00093 else if( nMatch("LUMI",chCard) || nMatch("INTE",chCard) )
00094 {
00095
00096 i = 5;
00097 optimize.optint = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00098 optimize.optier = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00099 if( lgEOL )
00100 {
00101 optimize.optier = DEFERR;
00102 }
00103
00104
00105 optimize.lgOptLum = true;
00106 }
00107
00108 else if( nMatch("ITER",chCard) )
00109 {
00110
00111 i = 5;
00112 optimize.nIterOptim = (long)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00113 }
00114
00115 else if( nMatch("LINE",chCard) )
00116 {
00117
00118 GetOptLineInt(chCard);
00119
00120
00121 optimize.lgOptLin = true;
00122 }
00123
00124 else if( nMatch("PHYM",chCard) )
00125 {
00126
00127 strcpy( optimize.chOptRtn, "PHYM" );
00128 # ifdef __unix
00129 optimize.lgParallel = ! nMatch("SEQU",chCard);
00130 # else
00131 optimize.lgParallel = false;
00132 # endif
00133 if( optimize.lgParallel )
00134 {
00135 i = 5;
00136 long dum = (long)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00137
00138 optimize.useCPU = lgEOL ? cpu.nCPU() : dum;
00139 }
00140 else
00141 {
00142 optimize.useCPU = 1;
00143 }
00144 }
00145
00146
00147
00148 else if( nMatch("RANG",chCard) && !nMatch("GRID",chCard) )
00149 {
00150
00151 if( optimize.nparm > 0 )
00152 {
00153 bool lgFirstOneReal = false;
00154
00155 i = 5;
00156 optimize.varang[optimize.nparm-1][0] =
00157 (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00158 if( lgEOL )
00159 {
00160 optimize.varang[optimize.nparm-1][0] = -1e38f;
00161 }
00162 else
00163 {
00164 lgFirstOneReal = true;
00165 }
00166
00167 optimize.varang[optimize.nparm-1][1] =
00168 (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00169 if( lgEOL )
00170 {
00171 optimize.varang[optimize.nparm-1][1] = 1e38f;
00172 }
00173 else if( lgFirstOneReal )
00174 {
00175
00176
00177 ++optimize.nRangeSet;
00178 if( optimize.varang[optimize.nparm-1][1] < optimize.varang[optimize.nparm-1][0] )
00179 {
00180 float temp = optimize.varang[optimize.nparm-1][0];
00181 optimize.varang[optimize.nparm-1][0] = optimize.varang[optimize.nparm-1][1];
00182 optimize.varang[optimize.nparm-1][1] = temp;
00183 }
00184 }
00185 }
00186 }
00187
00188 else if( nMatch("SUBP",chCard) )
00189 {
00190
00191 strcpy( optimize.chOptRtn, "SUBP" );
00192 }
00193
00194
00195 else if( nMatch("TEMP",chCard) )
00196 {
00197
00198 GetOptTemp(chCard);
00199
00200
00201 optimize.lgOptTemp = true;
00202 }
00203
00204 else if( nMatch("TOLE",chCard) )
00205 {
00206
00207
00208 i = 5;
00209 optimize.OptGlobalErr = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00210 }
00211
00212 else if( nMatch("TRAC",chCard) )
00213 {
00214 if( nMatch("STAR",chCard) )
00215 {
00216
00217
00218 i = 5;
00219 optimize.nTrOpt = (long)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00220 if( lgEOL )
00221 {
00222 fprintf( ioQQQ, " optimize trace start command:\n" );
00223 fprintf( ioQQQ, " The iteration number must appear.\n" );
00224 puts( "[Stop in ParseOptimize]" );
00225 cdEXIT(EXIT_FAILURE);
00226 }
00227 optimize.lgTrOpt = true;
00228 }
00229 else if( nMatch("FLOW",chCard) )
00230 {
00231
00232
00233 optimize.lgOptimFlow = true;
00234 }
00235 else
00236 {
00237 fprintf( ioQQQ, " optimize trace flow command:\n" );
00238 fprintf( ioQQQ, " One of the sub keys START or FLOW must appear.\n" );
00239 puts( "[Stop in ParseOptimize]" );
00240 cdEXIT(EXIT_FAILURE);
00241 }
00242 }
00243
00244 else if( nMatch("GRID",chCard) || nMatch("XSPE",chCard) )
00245 {
00246
00247
00248 strcpy( optimize.chOptRtn, "XSPE" );
00249 grid.lgGrid = true;
00250
00251
00252
00253 if( optimize.nparm > 0 )
00254 {
00255 float highvalue;
00256 long numPoints=0;
00257
00258 ASSERT( optimize.nparm < LIMPAR );
00259
00260 i = 5;
00261 optimize.varang[optimize.nparm-1][0] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00262 optimize.varang[optimize.nparm-1][1] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00263 grid.paramIncrements[optimize.nparm-1] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00264
00265 if( grid.paramIncrements[optimize.nparm-1] <= 0. )
00266 {
00267 fprintf( ioQQQ," The increment (third parameter) must be a positive number.\n" );
00268 fprintf( ioQQQ," Sorry.\n" );
00269 puts( "[Stop in ParseOptimize]" );
00270 cdEXIT( EXIT_FAILURE );
00271 }
00272
00273 if( grid.paramIncrements[optimize.nparm-1] > ( optimize.varang[optimize.nparm-1][1] - optimize.varang[optimize.nparm-1][0] ) )
00274 {
00275 fprintf( ioQQQ," The increment (third parameter) must not be greater than the difference between the limits (first and second parameters.\n" );
00276 fprintf( ioQQQ," Sorry.\n" );
00277 puts( "[Stop in ParseOptimize]" );
00278 cdEXIT( EXIT_FAILURE );
00279 }
00280
00281 if( lgEOL )
00282 {
00283 fprintf( ioQQQ," This command has changed since the definition given in Porter et al. 2006, PASP, 118, 920.\n" );
00284 fprintf( ioQQQ," The grid command now requires three parameters: lower limit, upper limit, and increment.\n" );
00285 fprintf( ioQQQ," The keywords RANGE and STEPS are no longer necessary.\n" );
00286 fprintf( ioQQQ," Sorry.\n" );
00287 puts( "[Stop in ParseOptimize]" );
00288 cdEXIT( EXIT_FAILURE );
00289 }
00290 else
00291 {
00292 ++optimize.nRangeSet;
00293 }
00294
00295
00296 if( optimize.varang[optimize.nparm-1][1] < optimize.varang[optimize.nparm-1][0] )
00297 {
00298 float temp = optimize.varang[optimize.nparm-1][0];
00299 optimize.varang[optimize.nparm-1][0] = optimize.varang[optimize.nparm-1][1];
00300 optimize.varang[optimize.nparm-1][1] = temp;
00301 }
00302
00303 ASSERT( optimize.varang[optimize.nparm-1][1] - optimize.varang[optimize.nparm-1][0] > 0. );
00304
00305 {
00306 float integer, tempNumPoints = (optimize.varang[optimize.nparm-1][1] -
00307 optimize.varang[optimize.nparm-1][0])/grid.paramIncrements[optimize.nparm-1];
00308 float fraction = modf( tempNumPoints, &integer );
00309
00310 if( fraction > 0.99f || fraction < 0.01f )
00311 {
00312 optimize.varang[optimize.nparm-1][1] += 0.01f * grid.paramIncrements[optimize.nparm-1];
00313 fprintf( ioQQQ,"\n The range is very nearly (or exactly) an integer multiple of the increment.\n" );
00314 fprintf( ioQQQ," The upper limit has been increased by a small fraction of the increment to ensure that\n" );
00315 fprintf( ioQQQ," the specified upper limit is included in the grid.\n\n" );
00316 }
00317 }
00318
00319 numPoints = 0;
00320 highvalue = optimize.varang[optimize.nparm-1][0];
00321
00322 while( highvalue <= optimize.varang[optimize.nparm-1][1] )
00323 {
00324 ++numPoints;
00325 highvalue += grid.paramIncrements[optimize.nparm-1];
00326 }
00327
00328 grid.numParamValues[optimize.nparm-1] = numPoints;
00329
00330 if( grid.numParamValues[optimize.nparm-1] < 2 )
00331 {
00332 fprintf( ioQQQ, " must have at least two grid points\n" );
00333 }
00334 else if( grid.numParamValues[optimize.nparm-1] > 20 )
00335 {
00336 fprintf( ioQQQ, " Are you sure you want that many grid points?\n" );
00337 }
00338
00339 grid.numParamValues[optimize.nparm-1] = MAX2( 2, grid.numParamValues[optimize.nparm-1] );
00340 }
00341 }
00342
00343 else
00344 {
00345 fprintf( ioQQQ, " ==%s== is unrecognized keyword, consult HAZY.\n", chCard );
00346 puts( "[Stop in ParseOptimize]" );
00347 cdEXIT(EXIT_FAILURE);
00348 }
00349
00350 DEBUG_EXIT( "ParseOptimize()" );
00351 return;
00352 }
00353
00354
00355 static void GetOptColDen(char *chCard )
00356 {
00357 char chCap[INPUT_LINE_LENGTH];
00358 bool lgEOF,
00359 lgEOL;
00360 long int i;
00361
00362 DEBUG_ENTRY( "GetOptColDen()" );
00363
00364
00365 optimize.ncobs = 0;
00366
00367
00368 input_readarray(chCard,&lgEOF);
00369 if( lgEOF )
00370 {
00371 fprintf( ioQQQ, " Hit EOF while reading column density list; use END to end list.\n" );
00372 puts( "[Stop in GetOptColDen]" );
00373 cdEXIT(EXIT_FAILURE);
00374 }
00375
00376
00377 strcpy( chCap, chCard );
00378 caps(chCap);
00379
00380 while( !lgEOF )
00381 {
00382 if( optimize.ncobs > NCOLLM )
00383 {
00384 fprintf( ioQQQ, " Too many column densities have been entered; the limit is%4ld. Increase variable NCOLLM.\n",
00385 NCOLLM );
00386 puts( "[Stop in GetOptColDen]" );
00387 cdEXIT(EXIT_FAILURE);
00388 }
00389
00390
00391
00392 cap4((char*)optimize.chColDen_label[optimize.ncobs] , chCard );
00393
00394
00395
00396 i = 5;
00397 optimize.ion_ColDen[optimize.ncobs] = (long int)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00398 if( lgEOL )
00399 {
00400 fprintf( ioQQQ, " %s\n", chCard );
00401 fprintf( ioQQQ, " The ionization stage MUST appear on this line. Sorry.\n" );
00402 puts( "[Stop in GetOptColDen]" );
00403 cdEXIT(EXIT_FAILURE);
00404 }
00405
00406
00407
00408
00409
00410 if( optimize.ion_ColDen[optimize.ncobs] < 0 )
00411 {
00412 fprintf( ioQQQ, " %s\n", chCard );
00413 fprintf( ioQQQ, " An ionization stage of%4ld does not make sense. Sorry.\n",
00414 optimize.ion_ColDen[optimize.ncobs] );
00415 puts( "[Stop in GetOptColDen]" );
00416 cdEXIT(EXIT_FAILURE);
00417 }
00418
00419 optimize.ColDen_Obs[optimize.ncobs] = (float)pow(10.,FFmtRead(chCard,&i,
00420 INPUT_LINE_LENGTH,&lgEOL));
00421 if( lgEOL )
00422 {
00423 fprintf( ioQQQ, " %80.80s\n", chCard );
00424 fprintf( ioQQQ, " An observed column density MUST be entered. Sorry.\n" );
00425 puts( "[Stop in GetOptColDen]" );
00426 cdEXIT(EXIT_FAILURE);
00427 }
00428
00429 optimize.chColDen_error[optimize.ncobs] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00430 if( optimize.chColDen_error[optimize.ncobs] <= 0.0 )
00431 {
00432
00433 optimize.chColDen_error[optimize.ncobs] = (float)DEFERR;
00434 }
00435
00436
00437 if( strchr( chCard , '<' ) != NULL )
00438 {
00439
00440 optimize.chColDen_error[optimize.ncobs] = -optimize.chColDen_error[optimize.ncobs];
00441 }
00442
00443 input_readarray(chCard,&lgEOF);
00444 strcpy( chCap, chCard );
00445 caps(chCap);
00446 if( lgEOF )
00447 {
00448 fprintf( ioQQQ, " Hit EOF while reading column density list; use END to end list.\n" );
00449 puts( "[Stop in GetOptColDen]" );
00450 cdEXIT(EXIT_FAILURE);
00451 }
00452
00453 if( strncmp( chCap , "END" , 3) == 0 )
00454 {
00455 lgEOF = true;
00456 }
00457
00458
00459 optimize.ncobs += 1;
00460 }
00461
00462 if( trace.lgTrace && optimize.lgTrOpt )
00463 {
00464 fprintf( ioQQQ, "%4ld columns were entered, they were;\n",
00465 optimize.ncobs );
00466 for( i=0; i < optimize.ncobs; i++ )
00467 {
00468 fprintf( ioQQQ, " %4.4s ion=%5ld%10.2e%10.2e\n",
00469 optimize.chColDen_label[i], optimize.ion_ColDen[i], optimize.ColDen_Obs[i],
00470 optimize.chColDen_error[i] );
00471 }
00472 }
00473
00474 DEBUG_EXIT( "GetOptColDen()" );
00475 return;
00476 }
00477
00478
00479 static void GetOptLineInt(char *chCard )
00480 {
00481 char chCap[INPUT_LINE_LENGTH];
00482
00483 bool lgEOF,
00484 lgEOL;
00485 long int i;
00486
00487 DEBUG_ENTRY( "GetOptLineInt()" );
00488
00489
00490 optimize.nlobs = 0;
00491
00492 input_readarray(chCard,&lgEOF);
00493 if( lgEOF )
00494 {
00495 fprintf( ioQQQ, " Hit EOF while reading line list; use END to end list.\n" );
00496 puts( "[Stop in GetOptLineInt]" );
00497 cdEXIT(EXIT_FAILURE);
00498 }
00499
00500 strcpy( chCap, chCard );
00501 caps(chCap);
00502
00503 while( !lgEOF )
00504 {
00505 if( optimize.nlobs >= NOBSLM )
00506 {
00507 fprintf( ioQQQ,
00508 " Too many lines have been entered; the limit is %ld. Increase variable NOBSLM.\n",
00509 NOBSLM );
00510 puts( "[Stop in GetOptLineInt]" );
00511 cdEXIT(EXIT_FAILURE);
00512 }
00513
00514
00515 strncpy( optimize.chLineLabel[optimize.nlobs], chCard , 4 );
00516
00517 optimize.chLineLabel[optimize.nlobs][4] = 0;
00518
00519 i = 5;
00520
00521 optimize.wavelength[optimize.nlobs] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00522
00523
00524
00525 if( input.chCARDCAPS[i-1] == 'M' )
00526 {
00527
00528 optimize.wavelength[optimize.nlobs] *= 1e4f;
00529 }
00530 else if( input.chCARDCAPS[i-1] == 'C' )
00531 {
00532
00533 optimize.wavelength[optimize.nlobs] *= 1e8f;
00534 }
00535
00536
00537 optimize.errorwave[optimize.nlobs] =
00538 WavlenErrorGet( optimize.wavelength[optimize.nlobs] );
00539
00540
00541 optimize.xLineInt_Obs[optimize.nlobs] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00542 if( lgEOL )
00543 {
00544 fprintf( ioQQQ, " %s\n", chCard );
00545 fprintf( ioQQQ, " The wavelength and relative intensity MUST be entered on this line. Sorry.\n" );
00546 fprintf( ioQQQ, " The command line is the following:\n %s\n", chCard );
00547 puts( "[Stop in GetOptLineInt]" );
00548 cdEXIT(EXIT_FAILURE);
00549 }
00550
00551 if( optimize.xLineInt_Obs[optimize.nlobs] <= 0. )
00552 {
00553 fprintf( ioQQQ, " An observed intensity of %.2e is not allowed. Sorry.\n",
00554 optimize.xLineInt_Obs[optimize.nlobs] );
00555 fprintf( ioQQQ, " The command line is the following:\n %s\n", chCard );
00556 puts( "[Stop in GetOptLineInt]" );
00557 cdEXIT(EXIT_FAILURE);
00558 }
00559
00560
00561 optimize.xLineInt_error[optimize.nlobs] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00562
00563 if( optimize.xLineInt_error[optimize.nlobs] <= 0.0 )
00564 {
00565
00566 optimize.xLineInt_error[optimize.nlobs] = (float)DEFERR;
00567 }
00568
00569
00570 if( strchr( chCard , '<' ) != NULL )
00571 {
00572
00573 optimize.xLineInt_error[optimize.nlobs] = -optimize.xLineInt_error[optimize.nlobs];
00574 }
00575
00576
00577 input_readarray(chCard,&lgEOF);
00578 if( lgEOF )
00579 {
00580 fprintf( ioQQQ, " Hit EOF while reading line list for optimize command; use END to end list.\n" );
00581 puts( "[Stop in GetOptLineInt]" );
00582 cdEXIT(EXIT_FAILURE);
00583 }
00584
00585 strcpy( chCap, chCard );
00586 caps(chCap);
00587 if( strncmp( chCap ,"END" , 3 ) == 0 )
00588 lgEOF = true;
00589
00590
00591 ++optimize.nlobs;
00592 }
00593
00594 if( trace.lgTrace && trace.lgTrOptm )
00595 {
00596 fprintf( ioQQQ, "%4ld lines were entered, they were;\n",
00597 optimize.nlobs );
00598
00599 for( i=0; i < optimize.nlobs; i++ )
00600 {
00601 fprintf( ioQQQ, " %4.4s ", optimize.chLineLabel[i] );
00602 prt_wl( ioQQQ, optimize.wavelength[i] );
00603
00604 fprintf( ioQQQ, " %10.2e%10.2e\n",
00605 optimize.xLineInt_Obs[i],
00606 optimize.xLineInt_error[i] );
00607 }
00608 }
00609
00610 DEBUG_EXIT( "GetOptLineInt()" );
00611 return;
00612 }
00613
00614
00615 static void GetOptTemp(char *chCard )
00616 {
00617 char chCap[INPUT_LINE_LENGTH];
00618
00619 bool lgEOF,
00620 lgEOL;
00621 long int i;
00622
00623 DEBUG_ENTRY( "GetOptTemp()" );
00624
00625
00626 optimize.nTempObs = 0;
00627
00628 input_readarray(chCard,&lgEOF);
00629 if( lgEOF )
00630 {
00631 fprintf( ioQQQ, " Hit EOF while reading line list; use END to end list.\n" );
00632 puts( "[Stop in GetOptTemp]" );
00633 cdEXIT(EXIT_FAILURE);
00634 }
00635
00636
00637 strcpy( chCap, chCard );
00638 caps(chCap);
00639
00640 while( !lgEOF )
00641 {
00642 if( optimize.nTempObs >= NOBSLM )
00643 {
00644 fprintf( ioQQQ,
00645 " Too many temperatures have been entered; the limit is %ld. Increase variable NOBSLM.\n",
00646 NOBSLM );
00647 puts( "[Stop in GetOptTemp]" );
00648 cdEXIT(EXIT_FAILURE);
00649 }
00650
00651
00652 strncpy( optimize.chTempLab[optimize.nTempObs], chCard , 4 );
00653
00654 optimize.chTempLab[optimize.nTempObs][4] = 0;
00655
00656 i = 5;
00657
00658 optimize.ionTemp[optimize.nTempObs] = (long)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00659
00660
00661 optimize.temp_obs[optimize.nTempObs] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00662 if( lgEOL )
00663 {
00664 fprintf( ioQQQ, " %s\n", chCard );
00665 fprintf( ioQQQ, " The ion stage and temperature MUST be entered on this line. Sorry.\n" );
00666 fprintf( ioQQQ, " The command line is the following:\n %s\n", chCard );
00667 puts( "[Stop in GetOptTemp]" );
00668 cdEXIT(EXIT_FAILURE);
00669 }
00670
00671
00672 if( optimize.temp_obs[optimize.nTempObs] <= 10. )
00673 {
00674 optimize.temp_obs[optimize.nTempObs] = (float)pow( 10. , (double)optimize.temp_obs[optimize.nTempObs] );
00675 }
00676
00677
00678 optimize.temp_error[optimize.nTempObs] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00679
00680 if( optimize.temp_error[optimize.nTempObs] <= 0.0 )
00681 {
00682
00683 optimize.temp_error[optimize.nTempObs] = (float)DEFERR;
00684 }
00685
00686
00687 if( strchr( chCard , '<' ) != NULL )
00688 {
00689
00690 optimize.temp_error[optimize.nTempObs] = -optimize.temp_error[optimize.nTempObs];
00691 }
00692
00693
00694
00695 strcpy( optimize.chTempWeight[optimize.nTempObs] , "radius" );
00696
00697
00698
00699
00700
00701
00702 if( nMatch( "VOLUME" , chCap ) )
00703 {
00704 strcpy( optimize.chTempWeight[optimize.nTempObs] , "volume" );
00705 }
00706
00707
00708 input_readarray(chCard,&lgEOF);
00709 if( lgEOF )
00710 {
00711 fprintf( ioQQQ, " Hit EOF while reading line list for optimize command; use END to end list.\n" );
00712 puts( "[Stop in GetOptTemp]" );
00713 cdEXIT(EXIT_FAILURE);
00714 }
00715
00716 strcpy( chCap, chCard );
00717 caps(chCap);
00718 if( strncmp( chCap ,"END" , 3 ) == 0 )
00719 lgEOF = true;
00720
00721
00722 ++optimize.nTempObs;
00723 }
00724
00725 if( trace.lgTrace && trace.lgTrOptm )
00726 {
00727 fprintf( ioQQQ, "%4ld temperatures were entered, they were;\n",
00728 optimize.nTempObs );
00729
00730 for( i=0; i < optimize.nTempObs; i++ )
00731 {
00732 fprintf( ioQQQ, " %4.4s ", optimize.chTempLab[i] );
00733 fprintf( ioQQQ, " %li " , optimize.ionTemp[i] );
00734
00735 fprintf( ioQQQ, " %.2e %.2e\n",
00736 optimize.temp_obs[i],
00737 optimize.temp_error[i] );
00738 }
00739 }
00740
00741 DEBUG_EXIT( "GetOptTemp()" );
00742 return;
00743 }