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; }
/****************************************************************************** * 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); }