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 realnum *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 cdEXIT(EXIT_FAILURE);
00050 }
00051 else
00052 # endif
00053
00054
00055
00056 if( lgFirst )
00057 {
00058
00059 lgFirst = false;
00060 wavelength = ((realnum *)MALLOC( sizeof(realnum )*NRDSUM ));
00061
00062
00063 ipLine = ((long int *)MALLOC(NRDSUM*sizeof(long)));
00064
00065
00066 chSMLab = ((char **)MALLOC(NRDSUM*sizeof(char *)));
00067
00068 for( i=0; i<NRDSUM; ++i )
00069 {
00070 chSMLab[i] = ((char *)MALLOC(5*sizeof(char )));
00071 }
00072 }
00073
00074
00075 nlsum = 0;
00076 lgEND = false;
00077 while( !lgEND )
00078 {
00079 input_readarray(chCard,&lgEOF);
00080 if( lgEOF )
00081 {
00082 fprintf( ioQQQ, " Hit EOF while reading line list; use END to end list.\n" );
00083 cdEXIT(EXIT_FAILURE);
00084 }
00085 strcpy( chCCap, chCard );
00086 caps(chCCap);
00087
00088 if( strncmp(chCCap , "END" , 3) != 0 )
00089 {
00090 if( nlsum >= NRDSUM )
00091 {
00092 fprintf( ioQQQ,
00093 " Too many lines have been entered; the limit is %li. Increase NRDSUM in PrtLineSum.\n",
00094 NRDSUM );
00095 cdEXIT(EXIT_FAILURE);
00096 }
00097
00098
00099 strncpy( chSMLab[nlsum], chCCap , 4 );
00100 chSMLab[nlsum][4] = 0;
00101 i = 5;
00102 wavelength[nlsum] = (realnum)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00103
00104 if( input.chCARDCAPS[i-1] == 'M' )
00105 {
00106
00107 wavelength[nlsum] *= 1e4;
00108 }
00109 else if( input.chCARDCAPS[i-1] == 'C' )
00110 {
00111
00112 wavelength[nlsum] *= 1e8;
00113 }
00114 ++nlsum;
00115 }
00116 else
00117 {
00118 lgEND = true;
00119 }
00120 }
00121 }
00122
00123 else if( strcmp(chDo," SUM" ) == 0 )
00124 {
00125 sum = 0.;
00126
00127 if( LineSave.ipass <= 0 )
00128 {
00129 return( sum );
00130 }
00131
00132 if( nzone == 1 )
00133 {
00134 for( i=0; i < nlsum; i++ )
00135 {
00136
00137 if( (ipLine[i] = cdLine((char*)chSMLab[i],wavelength[i],&relint,&absint) ) <=0 )
00138 {
00139 fprintf( ioQQQ, " PrtLineSum could not fine line %4.4s %5f\n",
00140 chSMLab[i], wavelength[i] );
00141 cdEXIT(EXIT_FAILURE);
00142 }
00143 }
00144 }
00145
00146
00147 for( i=0; i < nlsum; i++ )
00148 {
00149
00150 cdLine_ip(ipLine[i],&relint,&absint);
00151 absint = pow(10.,absint - radius.Conv2PrtInten);
00152 sum += absint;
00153 }
00154 }
00155
00156 else
00157 {
00158 fprintf( ioQQQ, " unrecognized key for PrtLineSum=%s\n",
00159 chDo );
00160 cdEXIT(EXIT_FAILURE);
00161 }
00162 return( sum );
00163 }