/*! \brief Generate the data for the radiation pattern */ void nec_radiation_pattern::analyze(nec_context* m_context) { if (m_analysis_done) return; int pol_sense_index; nec_float exrm=0., exra=0., prad, gcon, gcop; nec_float phi, thet; nec_float tilta, emajr2, eminr2, pol_axial_ratio; nec_float dfaz, dfaz2, cdfaz, tstor1=0., tstor2, stilta; if ((m_context->m_excitation_type == EXCITATION_VOLTAGE) || (m_context->m_excitation_type == EXCITATION_VOLTAGE_DISC) ) { gcop= _wavelength * _wavelength * 2.0 * pi()/(em::impedance() * _pinr); prad= _pinr- m_context->structure_power_loss- _pnlr; gcon= gcop; if ( m_context->ipd != 0) gcon= gcon* _pinr/ prad; } else if ( m_context->m_excitation_type == EXCITATION_CURRENT) { _pinr=394.51* m_context->xpr6* m_context->xpr6* _wavelength* _wavelength; gcop= _wavelength* _wavelength*2.* pi()/(em::impedance() * _pinr); prad= _pinr- m_context->structure_power_loss- _pnlr; gcon= gcop; if ( m_context->ipd != 0) gcon= gcon* _pinr/ prad; } else { prad=0.; gcon=4.* pi()/(1.0+ m_context->xpr6* m_context->xpr6); gcop= gcon; } if ( m_range >= 1.0e-20) { exrm=1./ m_range; exra= m_range/ _wavelength; exra=-360.*( exra- floor( exra)); } int result_counter=0; nec_float pint = 0.0; nec_float delta_phi_rad = degrees_to_rad(delta_phi); nec_float tmp2 = 0.5 * degrees_to_rad(delta_theta); phi= m_phi_start- delta_phi; for (int kph = 1; kph <= n_phi; kph++ ) { phi += delta_phi; nec_float pha = degrees_to_rad(phi); thet= m_theta_start- delta_theta; for (int kth = 1; kth <= n_theta; kth++ ) { thet += delta_theta; if ( m_ground.present() && (thet > 90.01) && (_ifar != 1) ) continue; nec_float tha = degrees_to_rad(thet); nec_complex eth, eph; if ( 1 == _ifar) { bool space_wave_only = (false == m_ground.present()); nec_complex erd; m_context->gfld(m_range/_wavelength, pha, thet/_wavelength, ð, &eph, &erd, space_wave_only, _wavelength ); _e_theta[result_counter] = eth; _e_phi[result_counter] = eph; _e_r[result_counter] = erd; } else { m_context->ffld(tha, pha, ð, &eph, _wavelength); nec_float ethm2= norm(eth); nec_float ethm= sqrt(ethm2); nec_float etha= arg_degrees(eth); nec_float ephm2= norm(eph); nec_float ephm= sqrt( ephm2); nec_float epha= arg_degrees( eph); /* elliptical polarization calc. */ if ( (ethm2 <= 1.0e-20) && (ephm2 <= 1.0e-20) ) { tilta=0.; emajr2=0.; eminr2=0.; pol_axial_ratio=0.; pol_sense_index = 3; } else { dfaz= epha- etha; if ( epha >= 0.) dfaz2= dfaz-360.; else dfaz2= dfaz+360.; if ( fabs(dfaz) > fabs(dfaz2) ) dfaz= dfaz2; cdfaz= cos(degrees_to_rad(dfaz)); tstor1= ethm2- ephm2; tstor2=2.* ephm* ethm* cdfaz; tilta=.5* atan2( tstor2, tstor1); stilta= sin( tilta); tstor1= tstor1* stilta* stilta; tstor2= tstor2* stilta* cos( tilta); emajr2=- tstor1+ tstor2+ ethm2; eminr2= tstor1- tstor2+ ephm2; if ( eminr2 < 0.) eminr2=0.; pol_axial_ratio= sqrt( eminr2/ emajr2); tilta= rad_to_degrees(tilta); if ( pol_axial_ratio <= 1.0e-5) pol_sense_index = POL_LINEAR; else if ( dfaz <= 0.) pol_sense_index = POL_RIGHT; else pol_sense_index = POL_LEFT; } /* if ( (ethm2 <= 1.0e-20) && (ephm2 <= 1.0e-20) ) */ /* Gain Normalization Variables */ nec_float gnmj= db10( gcon* emajr2); nec_float gnmn= db10( gcon* eminr2); nec_float gnv = db10( gcon* ethm2); nec_float gnh = db10( gcon* ephm2); nec_float gtot= db10( gcon*(ethm2+ ephm2) ); { nec_float temp_gain; switch(m_rp_normalization ) { case 0: temp_gain = gtot; break; case 1: temp_gain = gnmj; break; case 2: temp_gain = gnmn; break; case 3: temp_gain = gnv; break; case 4: temp_gain = gnh; break; case 5: temp_gain = gtot; break; default: throw new nec_exception("Unknown Gain Normalization Encountered."); } _gain[result_counter] = temp_gain; } /* if ( m_rp_normalization > 0) */ if ( m_rp_power_average != 0) { // compute the numerical integral of the power gain in angular co-ordinates tstor1= gcop*( ethm2+ ephm2); nec_float tmp3 = tha - tmp2; nec_float tmp4 = tha + tmp2; if ( kth == 1) tmp3= tha; else if ( kth == n_theta) tmp4= tha; nec_float da = fabs( delta_phi_rad*( cos(tmp3)- cos(tmp4))); if ( (kph == 1) || (kph == n_phi) ) da *=.5; pint += tstor1 * da; if ( m_rp_power_average == 2) // do not print the power gain values (just compute the average) continue; } if ( m_rp_output_format != 1) { _power_gain_vert[result_counter] = gnmj; _power_gain_horiz[result_counter] = gnmn; } else { _power_gain_vert[result_counter] = gnv; _power_gain_horiz[result_counter] = gnh; } ethm *= _wavelength; ephm *= _wavelength; if ( m_range >= 1.0e-20 ) { ethm= ethm* exrm; etha= etha+ exra; ephm= ephm* exrm; epha= epha+ exra; } _e_theta[result_counter] = deg_polar(ethm, etha); _e_phi[result_counter] = deg_polar(ephm, epha); _power_gain_tot[result_counter] = gtot; { nec_float a = pol_axial_ratio; if (pol_sense_index == POL_RIGHT) a = -a; nec_float gain = from_db10(gtot); nec_float lhcp_f =(1+2*a+a*a)/(2*(1+a*a)); nec_float rhcp_f =(1-2*a+a*a)/(2*(1+a*a)); _power_gain_rhcp[result_counter] = db10(gain * rhcp_f); _power_gain_lhcp[result_counter] = db10(gain * lhcp_f); } _polarization_axial_ratio[result_counter] = pol_axial_ratio; _polarization_tilt[result_counter] = tilta; _polarization_sense_index[result_counter] = pol_sense_index; _averaging_scales[result_counter] = (sin(tha) * (n_theta - 1) / n_theta) + 1.0/n_theta; } /* if ( _ifar == 1) */ result_counter++; } /* for( kth = 1; kth <= n_theta; kth++ ) */ } /* for( kph = 1; kph <= n_phi; kph++ ) */ if ( m_rp_power_average != 0) { /* nec_float tmp3 = degrees_to_rad(m_theta_start); tmp4 = tmp3 + degrees_to_rad(delta_theta) * (nec_float)(n_theta-1); tmp3 = fabs( degrees_to_rad(delta_phi) * (nec_float)( n_phi-1)*( cos( tmp3)- cos( tmp4))); pint /= tmp3; tmp3 /= pi(); _average_power_gain = pint; _average_power_solid_angle = tmp3; */ // We now compute the solid angle over which the power is averaged nec_float theta_start_rad = degrees_to_rad(m_theta_start); nec_float theta_range = degrees_to_rad(delta_theta) * (nec_float)(n_theta-1); nec_float phi_range = degrees_to_rad(delta_phi) * (nec_float)(n_phi-1); nec_float total_theta = theta_start_rad + theta_range; nec_float solid_angle = fabs(phi_range * (cos(theta_start_rad) - cos(total_theta)) ); _average_power_gain = pint / solid_angle; _average_power_solid_angle = solid_angle / pi(); // We display it as a multiple of pi() } _maximum_gain = _gain.maxCoeff(); m_analysis_done = true; }
int main(){ chdir(QUERY_DATA_PATH); EnvDB *env = new EnvDB(); env->open(); BDBOpe db1(env->getEnv(), DB1); BDBOpe db2(env->getEnv(), DB2); BDBOpe db3(env->getEnv(), DB3); BDBOpe db4(env->getEnv(), DB4); BDBOpe db5(env->getEnv(), DB5); BDBOpe db6(env->getEnv(), DB6); BDBOpe db7(env->getEnv(), DB7); BDBOpe db8(env->getEnv(), DB8); BDBOpe db9(env->getEnv(), DB9); BDBOpe db10(env->getEnv(), DB10); BDBOpe db11(env->getEnv(), DB11); BDBOpe db12(env->getEnv(), DB12); BDBOpe db13(env->getEnv(), DB13); BDBOpe db14(env->getEnv(), DB14); BDBOpe db15(env->getEnv(), DB15); BDBOpe db16(env->getEnv(), DB16); Operator *o1, *o2, *o3, *o4, *o5, *o6, *o7, *o8, *o9, *o10; Operator *o11, *o12, *o13, *o14, *o15, *o16, *o17, *o18, *o19, *o20; Operator *o21, *o22, *o23, *o24, *o25, *o26, *o27, *o28, *o29, *o30; Operator *o31, *o32; db1.open(); db2.open(); db3.open(); db4.open(); db5.open(); db6.open(); db7.open(); db8.open(); db9.open(); db10.open(); db11.open(); db12.open(); db13.open(); db14.open(); db15.open(); db16.open(); TABLE_REC tableRec; tableRec.tableID = DB_tableID; tableRec.attriNum = DB_attriNum; ATTRIBUTE_REC attriRec[tableRec.attriNum]; AttributeManager AM(env->getEnv()); AM.getForTableID(tableRec, attriRec); OPERATION_NODE op1; op1.tableID = 16; op1.attributeID = 1; OPERATION_NODE op2; op2.tableID = 16; op2.attributeID = 4; o1 = new ScanDSM(&db1, &attriRec[0], 1); o2 = new ScanDSM(&db2, &attriRec[1], 1); o3 = new ScanDSM(&db3, &attriRec[2], 1); o4 = new ScanDSM(&db4, &attriRec[3], 1); o5 = new ScanDSM(&db5, &attriRec[4], 1); o6 = new ScanDSM(&db6, &attriRec[5], 1); o7 = new ScanDSM(&db7, &attriRec[6], 1); o8 = new ScanDSM(&db8, &attriRec[7], 1); o9 = new ScanDSM(&db9, &attriRec[8], 1); o10 = new ScanDSM(&db10, &attriRec[9], 1); o11 = new ScanDSM(&db11, &attriRec[10], 1); o12 = new ScanDSM(&db12, &attriRec[11], 1); o13 = new ScanDSM(&db13, &attriRec[12], 1); o14 = new ScanDSM(&db14, &attriRec[13], 1); o15 = new ScanDSM(&db15, &attriRec[14], 1); o16 = new ScanDSM(&db16, &attriRec[15], 1); /* o17 = new ScanFromJI(o2, o1, &op1); o18 = new ScanFromJI(o3, o17, &op1); o19 = new ScanFromJI(o4, o18, &op1); o20 = new ScanFromJI(o5, o19, &op1); o21 = new ScanFromJI(o6, o20, &op1); o22 = new ScanFromJI(o7, o21, &op1); o23 = new ScanFromJI(o8, o22, &op1); o24 = new ScanFromJI(o9, o23, &op1); o25 = new ScanFromJI(o10, o24, &op1); o26 = new ScanFromJI(o11, o25, &op1); o27 = new ScanFromJI(o12, o26, &op1); o28 = new ScanFromJI(o13, o27, &op1); o29 = new ScanFromJI(o14, o28, &op1); o30 = new ScanFromJI(o15, o29, &op1); o31 = new ScanFromJI(o16, o30, &op1); */ o17 = new OutPut(TIME_OUT); o18 = new OutPut(TIME_OUT); o19 = new OutPut(TIME_OUT); o20 = new OutPut(TIME_OUT); o21 = new OutPut(TIME_OUT); o22 = new OutPut(TIME_OUT); o23 = new OutPut(TIME_OUT); o24 = new OutPut(TIME_OUT); o25 = new OutPut(TIME_OUT); o26 = new OutPut(TIME_OUT); o27 = new OutPut(TIME_OUT); o28 = new OutPut(TIME_OUT); o29 = new OutPut(TIME_OUT); o30 = new OutPut(TIME_OUT); o31 = new OutPut(TIME_OUT); o32 = new OutPut(TIME_OUT); o17->setPreOperator(o1); o17->init(env->getEnv()); o17->exec(); o18->setPreOperator(o2); o18->init(env->getEnv()); o18->exec(); o19->setPreOperator(o3); o19->init(env->getEnv()); o19->exec(); o20->setPreOperator(o4); o20->init(env->getEnv()); o20->exec(); o21->setPreOperator(o5); o21->init(env->getEnv()); o21->exec(); o22->setPreOperator(o6); o22->init(env->getEnv()); o22->exec(); o23->setPreOperator(o7); o23->init(env->getEnv()); o23->exec(); o24->setPreOperator(o8); o24->init(env->getEnv()); o24->exec(); o25->setPreOperator(o9); o25->init(env->getEnv()); o25->exec(); o26->setPreOperator(o10); o26->init(env->getEnv()); o26->exec(); o27->setPreOperator(o11); o27->init(env->getEnv()); o27->exec(); o28->setPreOperator(o12); o28->init(env->getEnv()); o28->exec(); o29->setPreOperator(o13); o29->init(env->getEnv()); o29->exec(); o30->setPreOperator(o14); o30->init(env->getEnv()); o30->exec(); o31->setPreOperator(o15); o31->init(env->getEnv()); o31->exec(); o32->setPreOperator(o16); o32->init(env->getEnv()); o32->exec(); }