예제 #1
0
MatrixXcf Circuit_Handler::calc_S(){
	MatrixXcf S(num_of_nodes,num_of_nodes);
	MatrixXcf I = MatrixXcf::Identity(num_of_nodes,num_of_nodes);
	MatrixXcf X = calc_X();
	MatrixXcf C = calc_C();
	num_of_ports = ports.size();
	MatrixXcf temp2(num_of_nodes,num_of_nodes);

	MatrixXcf temp(num_of_nodes,num_of_nodes);
	temp = C*X;
	temp = I - temp;
	temp2 = temp.inverse();
	S = X*temp2;
	
	return S;
	
}
예제 #2
0
파일: xrr.c 프로젝트: FHe/tdl
/******************************************************************************
* xref()
* Master function for reflectivity and reflection xsw calculations
*
* Parameters
* ---------
*
* Returns
* -------
*
* Notes
* -----
* take all raw arrays, use static copies of structs and assign pointers
* then pass along.  This is the main public function
*
* Note theta array and results
* arrays are dim nthet
* int     nthet;
* double *theta_arr;
* double *R; 
* double *Y;
******************************************************************************/
int xref( int nlayer, int nelem, int nthet, double *calc_params, 
          double *d, double *rho, double *sigma, double **comp,
          double *elem_z, double *fp, double *fpp, double *amu, double *mu_at,
          double *theta_arr, double *R, double *Y, 
          double *del, double *bet, double *amu_t, double *mu_t,
          double *Re_X, double *Im_X, double *Re_Ai, double *Im_Ai, 
          double *Re_Ar, double *Im_Ar, double *Re_g, double *Im_g)
{

    int         j, ret, fy_idx;
    double      energy, ref_scale;
    double      theta, k, lam, y, wconv;
    ref_model   ref;
    layer_calc  lay_c;    
    angle_calc  ang_c;
    gsl_complex Xtop;

    //calc k
    energy = calc_params[0];
    lam = 12398.0 / (energy);
    k = 2*M_PI/lam;

    // get fy_idx 
    fy_idx = (int) calc_params[6];

    //ref scale factor
    ref_scale = calc_params[13];

    //fill in the data structure
    //ref_model
    ref.calc_params = calc_params;
    ref.k           = k;
    ref.nlayer      = nlayer;
    ref.d           = d;
    ref.rho         = rho;
    ref.comp        = comp;    
    ref.sigma       = sigma;
    ref.nelem       = nelem;
    ref.elem_z      = elem_z;    
    ref.fp          = fp;
    ref.fpp         = fpp;
    ref.amu         = amu;
    ref.mu_at       = mu_at;

    //layer_calc
    lay_c.nlayer    = nlayer;
    lay_c.del       = del;
    lay_c.bet       = bet;
    lay_c.mu_t      = mu_t;
    lay_c.amu_t     = amu_t;

    //angle_calc
    ang_c.nlayer    = nlayer;
    ang_c.Re_X      = Re_X;
    ang_c.Im_X      = Im_X;
    ang_c.Re_Ai     = Re_Ai;
    ang_c.Im_Ai     = Im_Ai;
    ang_c.Re_Ar     = Re_Ar;
    ang_c.Im_Ar     = Im_Ar;
    ang_c.Re_g      = Re_g;
    ang_c.Im_g      = Im_g;

    // get layer_calc data
    // this stuff doesnt depend on
    // incidence angle
    ret = calc_del_bet_mu(&ref, &lay_c);
    if (ret == FAILURE) return(FAILURE);

    // loop over theta
    for (j=0;j<nthet;j++){

        theta = theta_arr[j];
   
        // calc X's and compute reflectivity     
        ret = calc_X(theta, &ref, &ang_c, &lay_c);
        if (ret == FAILURE) return(FAILURE);

        GSL_SET_COMPLEX(&Xtop,ang_c.Re_X[nlayer-1],ang_c.Im_X[nlayer-1]);  
        R[j] = gsl_complex_abs2(Xtop);

        if (calc_params[5] > 0.0){
            R[j] = R[j]*calc_spilloff(theta,calc_params[3],calc_params[2]);
        }
        if (ref_scale > 0.0){
            R[j] = R[j]*ref_scale;
        }

        if (fy_idx >= 0) {
            // calculate A's
            ret = calc_A(theta, &ref, &ang_c, &lay_c);
            if (ret == FAILURE) return(FAILURE);
    
            // calc FY
            y = calc_FY(theta, &ref, &ang_c, &lay_c);

            // mult by area
            if (calc_params[5] > 0.0){
                y = y*calc_area(theta,calc_params[3],calc_params[4],calc_params[2]);
                y = y*calc_spilloff(theta,calc_params[3],calc_params[2]);
            }
            Y[j] = y; 
        }
    }

    // convolve and normalize
    wconv = calc_params[1];

    // Note convolve is not padded!
    if (wconv > 0.0) {
        convolve(theta_arr, R, nthet, wconv);
    } 

    if (fy_idx >= 0){
        //convolve yield
        if (wconv > 0.0){
            convolve(theta_arr, Y, nthet, wconv);
        }
        // normalize yield
        norm_array(theta_arr, Y, nthet, calc_params[9], 1.0);
    }

    return(SUCCESS);
}