Ejemplo n.º 1
0
	void updateDisp() {
		if (editHours) {
			dprintd(disp, eTime.h/10, eTime.h%10, DIG_UNDER_N, DIG_UNDER_N);
		} else {
			dprintd(disp, DIG_UNDER_N, DIG_UNDER_N, eTime.m/10, eTime.m%10);
		}
		disp[1] |= DIG_DOT_MASK;
	}
Ejemplo n.º 2
0
void dprintdint(byte* dst, int i) {
	dprintd(dst, 
		i / 1000,
		i / 100 % 10,
		i / 10 % 10,
		i % 10);
}
Ejemplo n.º 3
0
void dprintd2(byte* dst, ubyte d1, ubyte d2) {
	dprintd(dst, d1/10, d1%10, d2/10, d2%10);
}
Ejemplo n.º 4
0
void dust_interaction(photon *P, int ip)
{
	double xilow,xihigh;
	long i;
    double cosph0 , sinph0 , costh0 , sinth0 ; 
    double Arg1_uper , Arg2_uper , uper1 , uper2 ;
    double n1_i , n1_j , n1_k , n2_i , n2_j , n2_k , v_i , v_j , v_k , utot ; 
    double alpha , cosalpha , sinalpha , Inv_sinalpha ;
    double v_pi , v_pj , v_pk , vpn ; 
    float g;
    double k_p_par , k_p_per;
    double mulow , muhigh , cosmu , sinmu , mu , cosmu2 , sinmu2 , mu2;
    double ko1 , ko2 , ko3 , nko0 ;
    double th_ , costh_ , sinth_ ; 
    double k_po_par , k_po_per , k_o_par , k_o_per , Inv_kpoper , v_po_i , v_po_j , v_po_k , ko_x , ko_y , ko_z , n_ko , v_ko; 


	interd = (xi1 <= Albedo) ? 1 : 0;
	if (interd == 1)	//scattering
	{

        // creamos estas viariables para no repetir el mismo calculo muchas veces
        cosph0 = cos(ph0);
        sinph0 = sin(ph0);
        costh0 = cos(th0);
        sinth0 = sin(th0);

        // Estos son los angulos de la velocidad del grano de polvo ( eq. 5.37 y eq. 5.38 ) 
        Arg1_uper = sqrt(SQR(xcrit) - log(xi3));       
        Arg2_uper = 2*Pi*xi4;

        uper1 = Arg1_uper * cos(Arg2_uper); // esta es la velocidad perpendicular 1 (eq. 5.37)
        uper2 = Arg1_uper * sin(Arg2_uper); // esta es la velocidad perpendicular 2 (eq. 5.38)

        // Estos son unos vectores muy convenientes para algo.
        // parte paralela ??
        n1_i = sinph0;
        n1_j = -cosph0;
        n1_k = 0;
    
        // parte transversal ??
        n2_i = cosph0 * costh0 ;
        n2_j = sinph0 * costh0; 
        n2_k = -sinth0; 

        // creo que esto es la velocidad del photon en el sistema de referencia del laboratio
        v_i = upar*sinth0*cosph0 + uper1 * n1_i + uper2 *n2_i ;
        v_j = upar*sinth0*sinph0 + uper1 * n1_j + uper2 *n2_j ;
        v_k = upar*costh0 + uper1 * n1_k + uper2 *n2_k;

        // Tal vez esto se deberia llamar vtot, pero que le vamos a hacer. Es el modulo de v.
        utot = sqrt(SQR(v_i) + SQR(v_j) + SQR(v_k));
        if (utot == 0.)
        {
            dprintd(utot);
            exit(0);
        }

        // Este alpha es el angulo entre la componente paralela del movimiento del grano de polvo la vel del photon. (eq. 5.54)
        alpha           = acos(upar/utot);
        cosalpha        = upar/utot;
        sinalpha        = sqrt(1 - SQR(cosalpha));
        Inv_sinalpha    = 1./sinalpha;

        // Aqui se normaliza v ... se podria hacer antes ...
        v_i = v_i/utot;
        v_j = v_j/utot;
        v_k = v_k/utot;

        // Sera esto algo asi como la velocidad proyectada???
        v_pi = Inv_sinalpha* (sinth0*cosph0 - cosalpha*v_i);
        v_pj = Inv_sinalpha* (sinth0*sinph0 - cosalpha*v_j);
        v_pk = Inv_sinalpha* (costh0 - cosalpha*v_k);

        // Este es el modulo de la velocidad esa, que vete tu a saber que es, y se normaliza
        vpn = sqrt( SQR(v_pi) + SQR(v_pj) + SQR(v_pk));
        v_pi = v_pi/vpn;
        v_pj = v_pj/vpn;
        v_pk = v_pk/vpn;
        
        //Esto si que no tengo ni idea de que es, pero no le hace daño a nadie... o eso espero :(
        g = 1./(sqrt(1 - SQR(utot*vth/c)));

        //Estas cosas son importantes, todas las lineas de antes es para poder calcularlo.
        k_p_par = (c*cosalpha - utot*vth)/(1 - (upar*vth*Inv_c));
        k_p_per = (c*sinalpha)/((1 - (upar*vth*Inv_c)));

        // Ahora vamos a obtener el coseno del angulo en el que sale disparado el photon en el frame del grano de polvo
		i = 0;
		while (xi2 >= HGList[i] && i < nHG)
		{
			xilow = HGList[i];
			mulow = HGList[i + NTAB2];
			i++;
		}
		xihigh = HGList[i];
		muhigh = HGList[i+NTAB2];

		cosmu = (muhigh-mulow)/(xihigh-xilow) * (xi2- xihigh) + muhigh;

		if (i == nHG)
            cosmu = mulow;

        // Este es el angulo polar en el sistema de referencia del atomo de hidrogeno
        mu =  acos(cosmu); 
        sinmu = sin(mu);

        // Este es el angulo azimutal en el sistema de referencia del atomo de hidrogeno
        mu2 = 2*Pi*xi6; 
        cosmu2 = cos(mu2);
        sinmu2 = sin(mu2);

        // Esto me supera, la verdad. Es posible que sea la direccion del photon en el sistema del grano de polvo.
        ko1 = Inv_c*(cosmu * k_p_par + sinmu*(k_p_per)*cosmu2);
        ko2 = Inv_c*(cosmu * k_p_per - sinmu*(k_p_par)*cosmu2);
        ko3 = sinmu * sinmu2;

        // Se calcula el modulo y se normaliza
        nko0 = sqrt( SQR(ko1) + SQR(ko2) + SQR(ko3));
        ko1 = ko1/nko0;
        ko2 = ko2/nko0;
        ko3 = ko3/nko0;

        // Este angulo hace llorar al ninio jesus...
        th_ = acos(ko1);
        costh_ = cos(th_);
        sinth_ = sin(th_);

        // Estoy empezando a pensar que tal vez la 'p' en el nombre se refiere a un sistema de referencia
        k_po_par = ko1;
        k_po_per = sqrt(SQR(ko2) + SQR(ko3));

        // Aqui hace magia...
        k_o_par = (c*costh_ + utot*vth)/(1 + (utot*costh_*vth)*Inv_c);
        k_o_per = (c*sinth_)/((1 + (utot*costh_*vth)*Inv_c));

        // Alvaro es un mago
        Inv_kpoper = 1./k_po_per;

        v_po_i = Inv_kpoper * (ko2*v_pi + ko3*(v_pk*v_j - v_k*v_pj));
        v_po_j = Inv_kpoper * (ko2*v_pj - ko3*(v_pk*v_i - v_k*v_pi));
        v_po_k = Inv_kpoper * (ko2*v_pk + ko3*(v_pj*v_i - v_j*v_pi));

        // Estas son las coordenadas finales de la V del photon en el Lab Sys
        ko_x = Inv_c * (k_o_par * v_i + k_o_per *v_po_i); 
        ko_y = Inv_c * (k_o_par * v_j + k_o_per *v_po_j); 
        ko_z = Inv_c * (k_o_par * v_k + k_o_per *v_po_k);

        // Calcula el modulo y normaliza
        n_ko = sqrt( SQR(ko_x) + SQR(ko_y) + SQR(ko_z));
        ko_x = ko_x/n_ko;
        ko_y = ko_y/n_ko;
        ko_z = ko_z/n_ko;

        // Pruedo prometer y prometo que no se que es esto, pero parace ser para el cambio en frecuencia, que aquí no se aplica.
        v_ko = utot * (v_i*ko_x + v_j*ko_y + v_k*ko_z);

        // Finalmente obtenemos los angulos en el sistema de referencia del laboratorio.
        th0 = acos(ko_z);
        ph0 = atan2(ko_y,ko_x);
        ph0 = (ph0 < 0) ? (ph0 + 2*Pi) : ph0; // si ph0 es menor que 0 le suma 2Pi???

        // Le asignamos los angulos que hemos sacado del cajon de los angulos buenos al photon.
		P[ip].th = th0;
		P[ip].ph = ph0;
		end_syg = 0;

        // Un aplauso para Alvaro por favor.

	}
	else 
	{
		absorbed:
		P[ip].xp += (ni*vbulk_x + nj*vbulk_y + nk*vbulk_z)/vth;
//			printf("Photon has been absorbed by dust after %ld scatters.\n",nscat);
		inter = 3;
//		(void) time(&t2);
//		op_time = (float) (t2-t1)/60.;
//				printf("Total calculation took %f minutes.\n",op_time);
		if (strcmp(OutMode,"Long")==0)
		{
			record_data_long(nscat,ip,x,rxf,ryf,rzf,radius,upar,uper1,uper2,H_x,\
			xp,inter);
			dprintl(nscat);
			printf("\n");
		}
								
//							record_data_short(nscat,ip,x,rxf,ryf,rzf,radius,H_x,inter,flag_zero,op_time);
//							record_data_short(nscat,ip,x,ph0,th0,radius,inter,op_time,flag_zero);

		XArr[ip] = P[ip].xp;
		X0Arr[ip]=xp0;
		InterArr[ip] = inter;
		NscatArr[ip] = nscat;
#ifdef GETPOSDIR
		PosArr[3*ip] 	= P[ip].x;//rxf;
		PosArr[3*ip+1]	= P[ip].y;//ryf;
		PosArr[3*ip+2]	= P[ip].z;//rzf;
		AngleArr[2*ip]	= th0;
		AngleArr[2*ip+1]= ph0;	

//						record_data_pos(nscat,ip,x,ph0,th0,rxf,ryf,rzf,inter,op_time,flag_zero);
//#else
//						record_data_short(nscat,ip,x,ph0,th0,radius,inter,op_time,flag_zero);
#endif
/*
#ifdef GETPOSDIR
						record_data_pos(nscat,ip,x,ph0,th0,rxf,ryf,rzf,inter,op_time,flag_zero);
#else
						record_data_short(nscat,ip,x,ph0,th0,radius,inter,op_time,flag_zero);
#endif
*/	
		idc = -1;
		P[ip].idc = idc;
		end_syg = 1;
	}
}