Exemple #1
0
    inline mat4 inverse(mat4 const& m)
    {
        float coef00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
        float coef02 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
        float coef03 = m[1][2] * m[2][3] - m[2][2] * m[1][3];

        float coef04 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
        float coef06 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
        float coef07 = m[1][1] * m[2][3] - m[2][1] * m[1][3];

        float coef08 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
        float coef10 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
        float coef11 = m[1][1] * m[2][2] - m[2][1] * m[1][2];

        float coef12 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
        float coef14 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
        float coef15 = m[1][0] * m[2][3] - m[2][0] * m[1][3];

        float coef16 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
        float coef18 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
        float coef19 = m[1][0] * m[2][2] - m[2][0] * m[1][2];

        float coef20 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
        float coef22 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
        float coef23 = m[1][0] * m[2][1] - m[2][0] * m[1][1];

        vec4 fac0(coef00, coef00, coef02, coef03);
        vec4 fac1(coef04, coef04, coef06, coef07);
        vec4 fac2(coef08, coef08, coef10, coef11);
        vec4 fac3(coef12, coef12, coef14, coef15);
        vec4 fac4(coef16, coef16, coef18, coef19);
        vec4 fac5(coef20, coef20, coef22, coef23);

        vec4 v0(m[1][0], m[0][0], m[0][0], m[0][0]);
        vec4 v1(m[1][1], m[0][1], m[0][1], m[0][1]);
        vec4 v2(m[1][2], m[0][2], m[0][2], m[0][2]);
        vec4 v3(m[1][3], m[0][3], m[0][3], m[0][3]);

        vec4 inv0(v1 * fac0 - v2 * fac1 + v3 * fac2);
        vec4 inv1(v0 * fac0 - v2 * fac3 + v3 * fac4);
        vec4 inv2(v0 * fac1 - v1 * fac3 + v3 * fac5);
        vec4 inv3(v0 * fac2 - v1 * fac4 + v2 * fac5);

        vec4 signA(+1, -1, +1, -1);
        vec4 signB(-1, +1, -1, +1);
        mat4 inv(inv0 * signA, inv1 * signB, inv2 * signA, inv3 * signB);

        vec4 row0(inv[0][0], inv[1][0], inv[2][0], inv[3][0]);

        vec4 dot0(m[0] * row0);
        float dot1 = (dot0.x + dot0.y) + (dot0.z + dot0.w);

        float one_over_det = 1.f / dot1;

        return inv * one_over_det;
    }
Exemple #2
0
double clebschgordanwork(int J1, int M1, int J2, int M2, int J, int M) {
  // This is from CACM
  // This gives <J/2,M/2;J1/2,J2/2|J1/2,M1/2;J2/2,M2/2>
  /* printf("\n Calculating <");
     printinthalfint(J);  printf(", "); printinthalfint(M);  printf("; ");
     printinthalfint(J1); printf(", "); printinthalfint(J2); printf(" | ");
     printinthalfint(J1); printf(", "); printinthalfint(M1); printf("; ");
     printinthalfint(J2); printf(", "); printinthalfint(M2); printf(">\n");
  */
  testthejm(J1,M1,"J1","M1");
  testthejm(J2,M2,"J2","M2");
  testthejm(J ,M ,"J ","M ");
  
  if( (M1 + M2 != M) ||
      (abs(M1) > abs(J1)) ||	( (M1+J1) != 2*((M1+J1)/2) ) ||
      (abs(M2) > abs(J2)) ||	( (M2+J2) != 2*((M2+J2)/2) ) ||
      (abs(M ) > abs(J )) ||	( (M +J ) != 2*((M +J )/2) ) ||
      (J >     J1 + J2 )  ||	(J < abs(J1 - J2)) || 
      ( (J1 + J2 + J) != 2*((J1+J2+J)/2) ) ||
      (M1+M2!=M) )
    return(0.);
  else {
    if(J1==1 || J2==1) {
      if(J==2)
	if(M1==-1)
	  if(M2==-1)	           return(1.);
	  else /* M2==+1 */        return(sqrt(0.5));
	else // M1==+1
	  if(M2==-1)	           return(sqrt(0.5));
	  else /* M2==+1 */        return(1.);
      else // J=0 -> M=0
	if(M1==-1) /* M2==+1 */    return(-sqrt(0.5));
	else /* M1==+1, M2==-1 */  return(+sqrt(0.5));
    } else {
      int zmin = 0;
      if( J-J2+M1+zmin < 0) zmin = -J+J2-M1;
      if( J-J1-M2+zmin < 0) zmin = -J+J1+M2;
      int zmax = J1+J2-J;
      if( J2+M2-zmax < 0) zmax = J2+M2;
      if( J1-M1-zmax < 0) zmax = J1-M1;
      double cc = 0.;
      for(int z=zmin; z<=zmax; z += 2)
	cc += (z==4*(z/4) ? 1. : -1.)/(fac2(z)*
				       fac2(J1 + J2 - J - z)*
				       fac2(J1 - M1 - z)*
				       fac2(J2 + M2 - z)*
				       fac2(J  - J2 + M1 + z)*
				       fac2(J  - J1 - M2 + z));
      return(cc*sqrt( ((J + 1)*
		       fac2( J1 + J2 - J)*
		       fac2( J1 - J2 + J)*
		       fac2(-J1 + J2 + J)*
		       fac2(J1 + M1)*   fac2(J1 - M1)*
		       fac2(J2 + M2)*   fac2(J2 - M2)*
		       fac2(J  + M )*   fac2(J  - M ))/
		      (1.*fac2(J1 + J2 + J + 2)) ) );
    }
  }
} // clebschgordanwork