Esempio n. 1
0
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);
}
Esempio n. 3
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;
	}
}
Esempio n. 4
0
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];
	}
}