/*! \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,
					&eth, &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, &eth, &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;
}
Exemplo n.º 2
0
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();
}