main() { int i, j, p[100], r0, *r, *s; r0 = 5; r = &r0; s = p + 30; rabs(100, 300, r, p, 100); printf("\n"); for (i = 0; i <= 9; i++) { for (j = 0; j <= 9; j++) { printf("%d ", p[10 * i + j]); } printf("\n"); } printf("\n"); ihap(s, 50); for (i = 0; i <= 9; i++) { for (j = 0; j <= 9; j++) { printf("%d ", p[10 * i + j]); } printf("\n"); } printf("\n"); }
int BetterVBalance(idx_t ncon, real_t *invtvwgt, idx_t *v_vwgt, idx_t *u1_vwgt, idx_t *u2_vwgt) { idx_t i; real_t sum1=0.0, sum2=0.0, diff1=0.0, diff2=0.0; for (i=0; i<ncon; i++) { sum1 += (v_vwgt[i]+u1_vwgt[i])*invtvwgt[i]; sum2 += (v_vwgt[i]+u2_vwgt[i])*invtvwgt[i]; } sum1 = sum1/ncon; sum2 = sum2/ncon; for (i=0; i<ncon; i++) { diff1 += rabs(sum1 - (v_vwgt[i]+u1_vwgt[i])*invtvwgt[i]); diff2 += rabs(sum2 - (v_vwgt[i]+u2_vwgt[i])*invtvwgt[i]); } return (diff1 - diff2 >= 0); }
void Matrix::Evalq(DipoleData *theDipoleData, Vect3<real> &ak, int nat3, real e02, real &cabs, real &cext, real &cpha, int imethd) { /* ** Given: CXADIA(J,1-3)=(a_11,a_22,a_33) for dipoles J=1-NAT, where symmetric 3x3 matrix a_ij is inverse of Complex polarizability tensor alpha_ij for dipole J CXAOFF(J,1-3)=(a_23,a_31,a_12) for dipoles J=1-NAT AK(1-3) = (k_x,k_y,k_z)*d d = (d_x*d_y*d_z)**(1/3) = effective lattice spacing NAT3 = 3*number of dipoles E02 = |E_0|^2 , where E_0 = incident Complex E field. CXE(1-NAT3) = components of E field at each dipole, in order E_1x,E_2x,...,E_NATx,E_1y,E_2y,...,E_NATy,E_1z,E_2z,...,E_NATz CXP(1-NAT3) = components of polarization vector at each dipole, in order P_1x,P_2x,...,P_NATx,P_1y,P_2y,...,P_NATy,P_1z,P_2z,...,P_NATz IMETHD = 0 or 1 Finds: CEXT = extinction cross section /d**2 and, if IMETHD=1, also computes CPHA = phase-lag cross section /d**2 CABS = absorption cross section /d**2 Note: present definition of CPHA is 1/2 of Martin's definition B.T.Draine, Princeton Univ. Obs., 87/1/4 History: Fortran version history removed. Copyright (C) 1993,1997,1998,2008 B.T. Draine and P.J. Flatau This code is covered by the GNU General Public License. ** */ // // Compute magnitude of kd Complex *cxe = theDipoleData->Cxe_tf(); Complex *cxp = theDipoleData->Cxxi(); int j1; int nat = nat3 / 3; cext = cabs = cpha = (real)0.; real ak2 = ak.ModSquared(); real ak1 = Sqrt(ak2); real ak3 = ak1 * ak2; // // Initialization complete. if (imethd == 0) { for(j1=0; j1<nat3; ++j1) { cext = cext + cxp[j1].im * cxe[j1].re - cxp[j1].re * cxe[j1].im; } cext = FourPi * ak1 * cext / e02; } else // imethd == 1 { // C_abs= (4*pi*k/|E_0|^2)*sum_J { Im[P_J*conjg(a_J*P_J)] - (2/3)*k^3*|P_J|^2 } = (4*pi*k/|E_0|^2)*sum_J {-Im[conjg(P_J)*a_J*P_J] - Im[i*(2/3)*k^3*P_J*conjg(P_J)]} // = -(4*pi*k/|E_0|^2)*Im{ sum_J [ conjg(P_J)*(a_J*P_J + i*(2/3)*k^3*P_J) ] } Complex cxa; Complex rabs((real)0., ak3 / 1.5); for(j1=0; j1<nat; ++j1) { int index = 3*j1; Complex dcxa = cxp[index ].conjg() * ((cxadia[index ] + rabs) * cxp[index ] + cxaoff[index+1] * cxp[index+2] + cxaoff[index+2] * cxp[index+1]) + cxp[index+1].conjg() * ((cxadia[index+1] + rabs) * cxp[index+1] + cxaoff[index+2] * cxp[index ] + cxaoff[index ] * cxp[index+2]) + cxp[index+2].conjg() * ((cxadia[index+2] + rabs) * cxp[index+2] + cxaoff[index ] * cxp[index+1] + cxaoff[index+1] * cxp[index ]); cxa += dcxa; } cabs = -FourPi * ak1 * cxa.im / e02; // cxa.clear(); for(j1=0; j1<nat3; ++j1) { cxa += cxp[j1] * cxe[j1].conjg(); } cext = FourPi * ak1 * cxa.im / e02; cpha = TwoPi * ak1 * cxa.re / e02; } }
void find_dist() { int i, j, k, ii; real t, r; for (i = 0; i < w; i++) for (k = 0; k < w; k++) { b[i][k] = 0; for (j = 0; j < m; j++) b[i][k] += a[i][j] * a[k][j]; } for (i = 0; i < w; i++) { q[i] = 0; for (j = 0; j < m; j++) q[i] += a[i][j] * p[j]; } for (k = 0; k < w; k++) { ii = k; for (i = k+1; i < w; i++) { if (rabs(b[i][k]) > rabs(b[ii][k])) ii = i; } if (ii > k) { for (j = 0; j < w; j++) { t = b[k][j]; b[k][j] = b[ii][j]; b[ii][j] = t; } t = q[k]; q[k] = q[ii]; q[ii] = t; } t = b[k][k]; if (rabs(t) < 1e-20) { printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); return; } t = 1 / t; for (j = 0; j < w; j++) b[k][j] *= t; q[k] *= t; for (i = k+1; i < w; i++) { t = -b[i][k]; for (j = 0; j < w; j++) b[i][j] += t * b[k][j]; q[i] += t * q[k]; } } for (k = w-1; k >= 0; k--) { for (i = 0; i < k; i++) q[i] -= b[i][k] * q[k]; } for (i = 0; i < w; i++) { if (q[i] < 0) q[i] = 0; else if (q[i] > 1) q[i] = 1; } r = 0; for (i = 0; i < m; i++) { t = -p[i]; for (j = 0; j < w; j++) t += q[j] * a[j][i]; r += t*t; } for (j = 0; j < w; j++) cur_koeff[where_koeff[j]] = q[j]; if (sdist > r) { sdist = r; for (i = 0; i < n; i++) koeff[i] = cur_koeff[i]; } }