00001
00002
00003
00004 #include "cddefines.h"
00005 #include "cddrive.h"
00006 #include "radius.h"
00007 #include "lines.h"
00008 #include "input.h"
00009
00010 #define NRDSUM 300L
00011 #include "prt.h"
00012
00013 double PrtLineSum(
00014
00015 const char *chDo)
00016 {
00017 char chCCap[INPUT_LINE_LENGTH],
00018 chCard[INPUT_LINE_LENGTH];
00019
00020
00021 static char **chSMLab;
00022 bool lgEND,
00023 lgEOF,
00024 lgEOL;
00025 long int i;
00026 static long int *ipLine;
00027
00028
00029 static bool lgFirst=true;
00030
00031
00032 static long nlsum;
00033 static float *wavelength;
00034
00035 double absint,
00036 relint ,
00037 sum=-1.;
00038
00039 DEBUG_ENTRY( "PrtLineSum()" );
00040
00041 if( strcmp(chDo,"READ") == 0 )
00042 {
00043 # if 0
00044 if( !lgFirst )
00045 {
00046
00047 fprintf(ioQQQ," more than one print line sum has appeared - only first one is used.\n");
00048 fprintf(ioQQQ," Sorry.\n");
00049 puts( "[Stop in PrtLineSum]" );
00050 cdEXIT(EXIT_FAILURE);
00051 }
00052 else
00053 # endif
00054
00055
00056
00057 if( lgFirst )
00058 {
00059
00060 lgFirst = false;
00061 wavelength = ((float *)MALLOC( sizeof(float )*NRDSUM ));
00062
00063
00064 ipLine = ((long int *)MALLOC(NRDSUM*sizeof(long)));
00065
00066
00067 chSMLab = ((char **)MALLOC(NRDSUM*sizeof(char *)));
00068
00069 for( i=0; i<NRDSUM; ++i )
00070 {
00071 chSMLab[i] = ((char *)MALLOC(5*sizeof(char )));
00072 }
00073 }
00074
00075
00076 nlsum = 0;
00077 lgEND = false;
00078 while( !lgEND )
00079 {
00080 input_readarray(chCard,&lgEOF);
00081 if( lgEOF )
00082 {
00083 fprintf( ioQQQ, " Hit EOF while reading line list; use END to end list.\n" );
00084 puts( "[Stop in PrtLineSum]" );
00085 cdEXIT(EXIT_FAILURE);
00086 }
00087 strcpy( chCCap, chCard );
00088 caps(chCCap);
00089
00090 if( strncmp(chCCap , "END" , 3) != 0 )
00091 {
00092 if( nlsum >= NRDSUM )
00093 {
00094 fprintf( ioQQQ,
00095 " Too many lines have been entered; the limit is %li. Increase NRDSUM in PrtLineSum.\n",
00096 NRDSUM );
00097 puts( "[Stop in PrtLineSum]" );
00098 cdEXIT(EXIT_FAILURE);
00099 }
00100
00101
00102 strncpy( chSMLab[nlsum], chCCap , 4 );
00103 chSMLab[nlsum][4] = 0;
00104 i = 5;
00105 wavelength[nlsum] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00106
00107 if( input.chCARDCAPS[i-1] == 'M' )
00108 {
00109
00110 wavelength[nlsum] *= 1e4;
00111 }
00112 else if( input.chCARDCAPS[i-1] == 'C' )
00113 {
00114
00115 wavelength[nlsum] *= 1e8;
00116 }
00117 ++nlsum;
00118 }
00119 else
00120 {
00121 lgEND = true;
00122 }
00123 }
00124 }
00125
00126 else if( strcmp(chDo," SUM" ) == 0 )
00127 {
00128 sum = 0.;
00129
00130 if( LineSave.ipass <= 0 )
00131 {
00132 DEBUG_EXIT( "PrtLineSum()" );
00133 return( sum );
00134 }
00135
00136 if( nzone == 1 )
00137 {
00138 for( i=0; i < nlsum; i++ )
00139 {
00140
00141 if( (ipLine[i] = cdLine((char*)chSMLab[i],wavelength[i],&relint,&absint) ) <=0 )
00142 {
00143 fprintf( ioQQQ, " PrtLineSum could not fine line %4.4s %5f\n",
00144 chSMLab[i], wavelength[i] );
00145 puts( "[Stop in PrtLineSum]" );
00146 cdEXIT(EXIT_FAILURE);
00147 }
00148 }
00149 }
00150
00151
00152 for( i=0; i < nlsum; i++ )
00153 {
00154
00155 cdLine_ip(ipLine[i],&relint,&absint);
00156 absint = pow(10.,absint - radius.Conv2PrtInten);
00157 sum += absint;
00158 }
00159 }
00160
00161 else
00162 {
00163 fprintf( ioQQQ, " unrecognized key for PrtLineSum=%s\n",
00164 chDo );
00165 puts( "[Stop in PrtLineSum]" );
00166 cdEXIT(EXIT_FAILURE);
00167 }
00168
00169 DEBUG_EXIT( "PrtLineSum()" );
00170 return( sum );
00171 }