43 #if defined(DEBUG) && !defined(NDEBUG) 119 const int n_iter = (k > n-
k) ? n-k : k;
120 for (
int j = 1; j <= n_iter; j++, n--) {
123 else if (ret % j == 0)
270 v[0] = xb[0] - xa[0];
271 v[1] = xb[1] - xa[1];
272 v[2] = xb[2] - xa[2];
274 return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
294 return ((xb[0] - xa[0])*xc[0]+(xb[1] - xa[1])*xc[1]+(xb[2] - xa[2])*xc[2]);
317 return (v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
335 cs_real_t uv = u[0]*v[0] + u[1]*v[1] + u[2]*v[2];
358 = ( n1[0]*t[0][0]*n2[0] + n1[1]*t[1][0]*n2[0] + n1[2]*t[2][0]*n2[0]
359 + n1[0]*t[0][1]*n2[1] + n1[1]*t[1][1]*n2[1] + n1[2]*t[2][1]*n2[1]
360 + n1[0]*t[0][2]*n2[2] + n1[1]*t[1][2]*n2[2] + n1[2]*t[2][2]*n2[2]);
385 return ( n1[0] * (t[0]*n2[0] + t[3]*n2[1] + t[5]*n2[2])
386 + n1[1] * (t[3]*n2[0] + t[1]*n2[1] + t[4]*n2[2])
387 + n1[2] * (t[5]*n2[0] + t[4]*n2[1] + t[2]*n2[2]));
403 return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
419 cs_real_t v2 = v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
443 vout[0] = inv_norm * vin[0];
444 vout[1] = inv_norm * vin[1];
445 vout[2] = inv_norm * vin[2];
467 vout[0] = inv_norm * vin[0];
468 vout[1] = inv_norm * vin[1];
469 vout[2] = inv_norm * vin[2];
488 vout[0] = v[0]*(1.-n[0]*n[0])- v[1]* n[1]*n[0] - v[2]* n[2]*n[0];
489 vout[1] = -v[0]* n[0]*n[1] + v[1]*(1.-n[1]*n[1])- v[2]* n[2]*n[1];
490 vout[2] = -v[0]* n[0]*n[2] - v[1]* n[1]*n[2] + v[2]*(1.-n[2]*n[2]);
510 for (
int i = 0; i < 3; i++)
511 v[i] += v_dot_n * n[i];
532 ( n[0] * t[0][0] * n[0] + n[1] * t[1][0] * n[0] + n[2] * t[2][0] * n[0]
533 + n[0] * t[0][1] * n[1] + n[1] * t[1][1] * n[1] + n[2] * t[2][1] * n[1]
534 + n[0] * t[0][2] * n[2] + n[1] * t[1][2] * n[2] + n[2] * t[2][2] * n[2]);
535 for (
int i = 0; i < 3; i++) {
536 for (
int j = 0; j < 3; j++)
537 t[i][j] += n_t_n * n[i] * n[j];
556 mv[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];
557 mv[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];
558 mv[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];
577 mv[0] += m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];
578 mv[1] += m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];
579 mv[2] += m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];
598 mv[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2];
599 mv[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2];
600 mv[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2];
620 mv[0] = m[0]*v[0] + m[3]*v[1] + m[5]*v[2];
621 mv[1] = m[3]*v[0] + m[1]*v[1] + m[4]*v[2];
622 mv[2] = m[5]*v[0] + m[4]*v[1] + m[2]*v[2];
642 mv[0] += m[0] * v[0] + m[3] * v[1] + m[5] * v[2];
643 mv[1] += m[3] * v[0] + m[1] * v[1] + m[4] * v[2];
644 mv[2] += m[5] * v[0] + m[4] * v[1] + m[2] * v[2];
660 return (t[0] + t[1] + t[2]);
679 for (
int i = 0; i < 6; i++) {
680 for (
int j = 0; j < 6; j++)
681 mv[i] = m[i][j] * v[j];
701 for (
int i = 0; i < 6; i++) {
702 for (
int j = 0; j < 6; j++)
703 mv[i] += m[i][j] * v[j];
720 const cs_real_t com0 = m[1][1]*m[2][2] - m[2][1]*m[1][2];
721 const cs_real_t com1 = m[2][1]*m[0][2] - m[0][1]*m[2][2];
722 const cs_real_t com2 = m[0][1]*m[1][2] - m[1][1]*m[0][2];
724 return m[0][0]*com0 + m[1][0]*com1 + m[2][0]*com2;
740 const cs_real_t com0 = m[1]*m[2] - m[4]*m[4];
741 const cs_real_t com1 = m[4]*m[5] - m[3]*m[2];
742 const cs_real_t com2 = m[3]*m[4] - m[1]*m[5];
744 return m[0]*com0 + m[3]*com1 + m[5]*com2;
757 #if defined(__INTEL_COMPILER) 758 #pragma optimization_level 0 766 uv[0] = u[1]*v[2] - u[2]*v[1];
767 uv[1] = u[2]*v[0] - u[0]*v[2];
768 uv[2] = u[0]*v[1] - u[1]*v[0];
783 #if defined(__INTEL_COMPILER) 784 #pragma optimization_level 0 792 return (u[1]*v[2] - u[2]*v[1]) * w[0]
793 + (u[2]*v[0] - u[0]*v[2]) * w[1]
794 + (u[0]*v[1] - u[1]*v[0]) * w[2];
850 out[0][0] = in[1][1]*in[2][2] - in[2][1]*in[1][2];
851 out[0][1] = in[2][1]*in[0][2] - in[0][1]*in[2][2];
852 out[0][2] = in[0][1]*in[1][2] - in[1][1]*in[0][2];
854 out[1][0] = in[2][0]*in[1][2] - in[1][0]*in[2][2];
855 out[1][1] = in[0][0]*in[2][2] - in[2][0]*in[0][2];
856 out[1][2] = in[1][0]*in[0][2] - in[0][0]*in[1][2];
858 out[2][0] = in[1][0]*in[2][1] - in[2][0]*in[1][1];
859 out[2][1] = in[2][0]*in[0][1] - in[0][0]*in[2][1];
860 out[2][2] = in[0][0]*in[1][1] - in[1][0]*in[0][1];
862 const double det = in[0][0]*out[0][0]+in[1][0]*out[0][1]+in[2][0]*out[0][2];
863 const double invdet = 1./det;
865 out[0][0] *= invdet, out[0][1] *= invdet, out[0][2] *= invdet;
866 out[1][0] *= invdet, out[1][1] *= invdet, out[1][2] *= invdet;
867 out[2][0] *= invdet, out[2][1] *= invdet, out[2][2] *= invdet;
881 cs_real_t a00 = a[1][1]*a[2][2] - a[2][1]*a[1][2];
882 cs_real_t a01 = a[2][1]*a[0][2] - a[0][1]*a[2][2];
883 cs_real_t a02 = a[0][1]*a[1][2] - a[1][1]*a[0][2];
884 cs_real_t a10 = a[2][0]*a[1][2] - a[1][0]*a[2][2];
885 cs_real_t a11 = a[0][0]*a[2][2] - a[2][0]*a[0][2];
886 cs_real_t a12 = a[1][0]*a[0][2] - a[0][0]*a[1][2];
887 cs_real_t a20 = a[1][0]*a[2][1] - a[2][0]*a[1][1];
888 cs_real_t a21 = a[2][0]*a[0][1] - a[0][0]*a[2][1];
889 cs_real_t a22 = a[0][0]*a[1][1] - a[1][0]*a[0][1];
891 double det_inv = 1. / (a[0][0]*a00 + a[1][0]*a01 + a[2][0]*a02);
893 a[0][0] = a00 * det_inv;
894 a[0][1] = a01 * det_inv;
895 a[0][2] = a02 * det_inv;
896 a[1][0] = a10 * det_inv;
897 a[1][1] = a11 * det_inv;
898 a[1][2] = a12 * det_inv;
899 a[2][0] = a20 * det_inv;
900 a[2][1] = a21 * det_inv;
901 a[2][2] = a22 * det_inv;
916 cs_real_t a00 = a[1][1]*a[2][2] - a[2][1]*a[1][2];
917 cs_real_t a01 = a[2][1]*a[0][2] - a[0][1]*a[2][2];
918 cs_real_t a02 = a[0][1]*a[1][2] - a[1][1]*a[0][2];
919 cs_real_t a11 = a[0][0]*a[2][2] - a[2][0]*a[0][2];
920 cs_real_t a12 = a[1][0]*a[0][2] - a[0][0]*a[1][2];
921 cs_real_t a22 = a[0][0]*a[1][1] - a[1][0]*a[0][1];
923 double det_inv = 1. / (a[0][0]*a00 + a[1][0]*a01 + a[2][0]*a02);
925 a[0][0] = a00 * det_inv;
926 a[0][1] = a01 * det_inv;
927 a[0][2] = a02 * det_inv;
928 a[1][0] = a01 * det_inv;
929 a[1][1] = a11 * det_inv;
930 a[1][2] = a12 * det_inv;
931 a[2][0] = a02 * det_inv;
932 a[2][1] = a12 * det_inv;
933 a[2][2] = a22 * det_inv;
954 sout[0] = s[1]*s[2] - s[4]*s[4];
955 sout[1] = s[0]*s[2] - s[5]*s[5];
956 sout[2] = s[0]*s[1] - s[3]*s[3];
957 sout[3] = s[4]*s[5] - s[3]*s[2];
958 sout[4] = s[3]*s[5] - s[0]*s[4];
959 sout[5] = s[3]*s[4] - s[1]*s[5];
961 detinv = 1. / (s[0]*sout[0] + s[3]*sout[3] + s[5]*sout[5]);
986 mout[0][0] = m1[0][0]*m2[0][0] + m1[0][1]*m2[1][0] + m1[0][2]*m2[2][0];
987 mout[0][1] = m1[0][0]*m2[0][1] + m1[0][1]*m2[1][1] + m1[0][2]*m2[2][1];
988 mout[0][2] = m1[0][0]*m2[0][2] + m1[0][1]*m2[1][2] + m1[0][2]*m2[2][2];
990 mout[1][0] = m1[1][0]*m2[0][0] + m1[1][1]*m2[1][0] + m1[1][2]*m2[2][0];
991 mout[1][1] = m1[1][0]*m2[0][1] + m1[1][1]*m2[1][1] + m1[1][2]*m2[2][1];
992 mout[1][2] = m1[1][0]*m2[0][2] + m1[1][1]*m2[1][2] + m1[1][2]*m2[2][2];
994 mout[2][0] = m1[2][0]*m2[0][0] + m1[2][1]*m2[1][0] + m1[2][2]*m2[2][0];
995 mout[2][1] = m1[2][0]*m2[0][1] + m1[2][1]*m2[1][1] + m1[2][2]*m2[2][1];
996 mout[2][2] = m1[2][0]*m2[0][2] + m1[2][1]*m2[1][2] + m1[2][2]*m2[2][2];
1017 _m[0][0] = m[0][0]*q[0][0] + m[0][1]*q[1][0] + m[0][2]*q[2][0];
1018 _m[0][1] = m[0][0]*q[0][1] + m[0][1]*q[1][1] + m[0][2]*q[2][1];
1019 _m[0][2] = m[0][0]*q[0][2] + m[0][1]*q[1][2] + m[0][2]*q[2][2];
1021 _m[1][0] = m[1][0]*q[0][0] + m[1][1]*q[1][0] + m[1][2]*q[2][0];
1022 _m[1][1] = m[1][0]*q[0][1] + m[1][1]*q[1][1] + m[1][2]*q[2][1];
1023 _m[1][2] = m[1][0]*q[0][2] + m[1][1]*q[1][2] + m[1][2]*q[2][2];
1025 _m[2][0] = m[2][0]*q[0][0] + m[2][1]*q[1][0] + m[2][2]*q[2][0];
1026 _m[2][1] = m[2][0]*q[0][1] + m[2][1]*q[1][1] + m[2][2]*q[2][1];
1027 _m[2][2] = m[2][0]*q[0][2] + m[2][1]*q[1][2] + m[2][2]*q[2][2];
1030 mout[0][0] = q[0][0]*_m[0][0] + q[1][0]*_m[1][0] + q[2][0]*_m[2][0];
1031 mout[0][1] = q[0][0]*_m[0][1] + q[1][0]*_m[1][1] + q[2][0]*_m[2][1];
1032 mout[0][2] = q[0][0]*_m[0][2] + q[1][0]*_m[1][2] + q[2][0]*_m[2][2];
1034 mout[1][0] = q[0][1]*_m[0][0] + q[1][1]*_m[1][0] + q[2][1]*_m[2][0];
1035 mout[1][1] = q[0][1]*_m[0][1] + q[1][1]*_m[1][1] + q[2][1]*_m[2][1];
1036 mout[1][2] = q[0][1]*_m[0][2] + q[1][1]*_m[1][2] + q[2][1]*_m[2][2];
1038 mout[2][0] = q[0][2]*_m[0][0] + q[1][2]*_m[1][0] + q[2][2]*_m[2][0];
1039 mout[2][1] = q[0][2]*_m[0][1] + q[1][2]*_m[1][1] + q[2][2]*_m[2][1];
1040 mout[2][2] = q[0][2]*_m[0][2] + q[1][2]*_m[1][2] + q[2][2]*_m[2][2];
1061 _m[0][0] = m[0]*q[0][0] + m[3]*q[1][0] + m[5]*q[2][0];
1062 _m[0][1] = m[0]*q[0][1] + m[3]*q[1][1] + m[5]*q[2][1];
1063 _m[0][2] = m[0]*q[0][2] + m[3]*q[1][2] + m[5]*q[2][2];
1065 _m[1][0] = m[3]*q[0][0] + m[1]*q[1][0] + m[4]*q[2][0];
1066 _m[1][1] = m[3]*q[0][1] + m[1]*q[1][1] + m[4]*q[2][1];
1067 _m[1][2] = m[3]*q[0][2] + m[1]*q[1][2] + m[4]*q[2][2];
1069 _m[2][0] = m[5]*q[0][0] + m[4]*q[1][0] + m[2]*q[2][0];
1070 _m[2][1] = m[5]*q[0][1] + m[4]*q[1][1] + m[2]*q[2][1];
1071 _m[2][2] = m[5]*q[0][2] + m[4]*q[1][2] + m[2]*q[2][2];
1074 mout[0] = q[0][0]*_m[0][0] + q[1][0]*_m[1][0] + q[2][0]*_m[2][0];
1075 mout[1] = q[0][1]*_m[0][1] + q[1][1]*_m[1][1] + q[2][1]*_m[2][1];
1076 mout[2] = q[0][2]*_m[0][2] + q[1][2]*_m[1][2] + q[2][2]*_m[2][2];
1078 mout[3] = q[0][0]*_m[0][1] + q[1][0]*_m[1][1] + q[2][0]*_m[2][1];
1079 mout[4] = q[0][1]*_m[0][2] + q[1][1]*_m[1][2] + q[2][1]*_m[2][2];
1080 mout[5] = q[0][0]*_m[0][2] + q[1][0]*_m[1][2] + q[2][0]*_m[2][2];
1102 _m[0][0] = m[0][0]*q[0][0] + m[0][1]*q[0][1] + m[0][2]*q[0][2];
1103 _m[0][1] = m[0][0]*q[1][0] + m[0][1]*q[1][1] + m[0][2]*q[1][2];
1104 _m[0][2] = m[0][0]*q[2][0] + m[0][1]*q[2][1] + m[0][2]*q[2][2];
1106 _m[1][0] = m[1][0]*q[0][0] + m[1][1]*q[0][1] + m[1][2]*q[0][2];
1107 _m[1][1] = m[1][0]*q[1][0] + m[1][1]*q[1][1] + m[1][2]*q[1][2];
1108 _m[1][2] = m[1][0]*q[2][0] + m[1][1]*q[2][1] + m[1][2]*q[2][2];
1110 _m[2][0] = m[2][0]*q[0][0] + m[2][1]*q[0][1] + m[2][2]*q[0][2];
1111 _m[2][1] = m[2][0]*q[1][0] + m[2][1]*q[1][1] + m[2][2]*q[1][2];
1112 _m[2][2] = m[2][0]*q[2][0] + m[2][1]*q[2][1] + m[2][2]*q[2][2];
1115 mout[0][0] = q[0][0]*_m[0][0] + q[0][1]*_m[1][0] + q[0][2]*_m[2][0];
1116 mout[0][1] = q[0][0]*_m[0][1] + q[0][1]*_m[1][1] + q[0][2]*_m[2][1];
1117 mout[0][2] = q[0][0]*_m[0][2] + q[0][1]*_m[1][2] + q[0][2]*_m[2][2];
1119 mout[1][0] = q[1][0]*_m[0][0] + q[1][1]*_m[1][0] + q[1][2]*_m[2][0];
1120 mout[1][1] = q[1][0]*_m[0][1] + q[1][1]*_m[1][1] + q[1][2]*_m[2][1];
1121 mout[1][2] = q[1][0]*_m[0][2] + q[1][1]*_m[1][2] + q[1][2]*_m[2][2];
1123 mout[2][0] = q[2][0]*_m[0][0] + q[2][1]*_m[1][0] + q[2][2]*_m[2][0];
1124 mout[2][1] = q[2][0]*_m[0][1] + q[2][1]*_m[1][1] + q[2][2]*_m[2][1];
1125 mout[2][2] = q[2][0]*_m[0][2] + q[2][1]*_m[1][2] + q[2][2]*_m[2][2];
1146 _m[0][0] = m[0]*q[0][0] + m[3]*q[0][1] + m[5]*q[0][2];
1147 _m[0][1] = m[0]*q[1][0] + m[3]*q[1][1] + m[5]*q[1][2];
1148 _m[0][2] = m[0]*q[2][0] + m[3]*q[2][1] + m[5]*q[2][2];
1150 _m[1][0] = m[3]*q[0][0] + m[1]*q[0][1] + m[4]*q[0][2];
1151 _m[1][1] = m[3]*q[1][0] + m[1]*q[1][1] + m[4]*q[1][2];
1152 _m[1][2] = m[3]*q[2][0] + m[1]*q[2][1] + m[4]*q[2][2];
1154 _m[2][0] = m[5]*q[0][0] + m[4]*q[0][1] + m[2]*q[0][2];
1155 _m[2][1] = m[5]*q[1][0] + m[4]*q[1][1] + m[2]*q[1][2];
1156 _m[2][2] = m[5]*q[2][0] + m[4]*q[2][1] + m[2]*q[2][2];
1159 mout[0] = q[0][0]*_m[0][0] + q[0][1]*_m[1][0] + q[0][2]*_m[2][0];
1160 mout[1] = q[1][0]*_m[0][1] + q[1][1]*_m[1][1] + q[1][2]*_m[2][1];
1161 mout[2] = q[2][0]*_m[0][2] + q[2][1]*_m[1][2] + q[2][2]*_m[2][2];
1164 mout[3] = q[0][0]*_m[0][1] + q[0][1]*_m[1][1] + q[0][2]*_m[2][1];
1165 mout[4] = q[1][0]*_m[0][2] + q[1][1]*_m[1][2] + q[1][2]*_m[2][2];
1166 mout[5] = q[0][0]*_m[0][2] + q[0][1]*_m[1][2] + q[0][2]*_m[2][2];
1186 m_sym[0][0] = 0.5 * (m[0][0] + m[0][0]);
1187 m_sym[0][1] = 0.5 * (m[0][1] + m[1][0]);
1188 m_sym[0][2] = 0.5 * (m[0][2] + m[2][0]);
1189 m_sym[1][0] = 0.5 * (m[1][0] + m[0][1]);
1190 m_sym[1][1] = 0.5 * (m[1][1] + m[1][1]);
1191 m_sym[1][2] = 0.5 * (m[1][2] + m[2][1]);
1192 m_sym[2][0] = 0.5 * (m[2][0] + m[0][2]);
1193 m_sym[2][1] = 0.5 * (m[2][1] + m[1][2]);
1194 m_sym[2][2] = 0.5 * (m[2][2] + m[2][2]);
1197 m_ant[0][0] = 0.5 * (m[0][0] - m[0][0]);
1198 m_ant[0][1] = 0.5 * (m[0][1] - m[1][0]);
1199 m_ant[0][2] = 0.5 * (m[0][2] - m[2][0]);
1200 m_ant[1][0] = 0.5 * (m[1][0] - m[0][1]);
1201 m_ant[1][1] = 0.5 * (m[1][1] - m[1][1]);
1202 m_ant[1][2] = 0.5 * (m[1][2] - m[2][1]);
1203 m_ant[2][0] = 0.5 * (m[2][0] - m[0][2]);
1204 m_ant[2][1] = 0.5 * (m[2][1] - m[1][2]);
1205 m_ant[2][2] = 0.5 * (m[2][2] - m[2][2]);
1223 mout[0][0] += m1[0][0]*m2[0][0] + m1[0][1]*m2[1][0] + m1[0][2]*m2[2][0];
1224 mout[0][1] += m1[0][0]*m2[0][1] + m1[0][1]*m2[1][1] + m1[0][2]*m2[2][1];
1225 mout[0][2] += m1[0][0]*m2[0][2] + m1[0][1]*m2[1][2] + m1[0][2]*m2[2][2];
1227 mout[1][0] += m1[1][0]*m2[0][0] + m1[1][1]*m2[1][0] + m1[1][2]*m2[2][0];
1228 mout[1][1] += m1[1][0]*m2[0][1] + m1[1][1]*m2[1][1] + m1[1][2]*m2[2][1];
1229 mout[1][2] += m1[1][0]*m2[0][2] + m1[1][1]*m2[1][2] + m1[1][2]*m2[2][2];
1231 mout[2][0] += m1[2][0]*m2[0][0] + m1[2][1]*m2[1][0] + m1[2][2]*m2[2][0];
1232 mout[2][1] += m1[2][0]*m2[0][1] + m1[2][1]*m2[1][1] + m1[2][2]*m2[2][1];
1233 mout[2][2] += m1[2][0]*m2[0][2] + m1[2][1]*m2[1][2] + m1[2][2]*m2[2][2];
1258 sout[0] = s1[0]*s2[0] + s1[3]*s2[3] + s1[5]*s2[5];
1260 sout[1] = s1[3]*s2[3] + s1[1]*s2[1] + s1[4]*s2[4];
1262 sout[2] = s1[5]*s2[5] + s1[4]*s2[4] + s1[2]*s2[2];
1264 sout[3] = s1[0]*s2[3] + s1[3]*s2[1] + s1[5]*s2[4];
1266 sout[4] = s1[3]*s2[5] + s1[1]*s2[4] + s1[4]*s2[2];
1268 sout[5] = s1[0]*s2[5] + s1[3]*s2[4] + s1[5]*s2[2];
1285 const int t2v[3][3] = {{0, 3, 5},
1289 const int iv2t[6] = {0, 1, 2, 0, 1, 0};
1290 const int jv2t[6] = {0, 1, 2, 1, 2, 2};
1292 for (
int i = 0; i < 6; i++) {
1293 for (
int j = 0; j < 6; j++)
1301 for (
int i = 0; i < 6; i++) {
1304 for (
int k = 0;
k < 3;
k++) {
1305 int ik = t2v[
k][ii];
1306 int jk = t2v[
k][jj];
1308 sout[
ik][i] += s[
k][jj];
1309 sout[jk][i] += s[
k][ii];
1337 _sout[0][0] = s1[0]*s2[0] + s1[3]*s2[3] + s1[5]*s2[5];
1339 _sout[1][1] = s1[3]*s2[3] + s1[1]*s2[1] + s1[4]*s2[4];
1341 _sout[2][2] = s1[5]*s2[5] + s1[4]*s2[4] + s1[2]*s2[2];
1343 _sout[0][1] = s1[0]*s2[3] + s1[3]*s2[1] + s1[5]*s2[4];
1345 _sout[1][0] = s2[0]*s1[3] + s2[3]*s1[1] + s2[5]*s1[4];
1347 _sout[1][2] = s1[3]*s2[5] + s1[1]*s2[4] + s1[4]*s2[2];
1349 _sout[2][1] = s2[3]*s1[5] + s2[1]*s1[4] + s2[4]*s1[2];
1351 _sout[0][2] = s1[0]*s2[5] + s1[3]*s2[4] + s1[5]*s2[2];
1353 _sout[2][0] = s2[0]*s1[5] + s2[3]*s1[4] + s2[5]*s1[2];
1355 sout[0][0] = _sout[0][0]*s3[0] + _sout[0][1]*s3[3] + _sout[0][2]*s3[5];
1357 sout[1][1] = _sout[1][0]*s3[3] + _sout[1][1]*s3[1] + _sout[1][2]*s3[4];
1359 sout[2][2] = _sout[2][0]*s3[5] + _sout[2][1]*s3[4] + _sout[2][2]*s3[2];
1361 sout[0][1] = _sout[0][0]*s3[3] + _sout[0][1]*s3[1] + _sout[0][2]*s3[4];
1363 sout[1][0] = s3[0]*_sout[1][0] + s3[3]*_sout[1][1] + s3[5]*_sout[1][2];
1365 sout[1][2] = _sout[1][0]*s3[5] + _sout[1][1]*s3[4] + _sout[1][2]*s3[2];
1367 sout[2][1] = s3[3]*_sout[2][0] + s3[1]*_sout[2][1] + s3[4]*_sout[2][2];
1369 sout[0][2] = _sout[0][0]*s3[5] + _sout[0][1]*s3[4] + _sout[0][2]*s3[2];
1371 sout[2][0] = s3[0]*_sout[2][0] + s3[3]*_sout[2][1] + s3[5]*_sout[2][2];
1387 cs_real_t magnitude = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
1389 qv->
meas = magnitude;
1393 qv->
unitv[0] = inv * v[0];
1394 qv->
unitv[1] = inv * v[1];
1395 qv->
unitv[2] = inv * v[2];
static void cs_math_sym_33_inv_cramer(const cs_real_t s[6], cs_real_t sout[restrict 6])
Compute the inverse of a symmetric matrix using Cramer's rule.
Definition: cs_math.h:949
Definition: cs_field_pointer.h:70
integer, save ik
Definition: numvar.f90:75
static cs_real_t cs_math_fabs(cs_real_t x)
Compute the absolute value of a real value.
Definition: cs_math.h:143
static cs_real_t cs_math_3_distance_dot_product(const cs_real_t xa[3], const cs_real_t xb[3], const cs_real_t xc[3])
Compute .
Definition: cs_math.h:290
#define restrict
Definition: cs_defs.h:142
static cs_real_t cs_math_3_dot_product(const cs_real_t u[3], const cs_real_t v[3])
Compute the dot product of two vectors of 3 real values.
Definition: cs_math.h:332
static const cs_real_6_t cs_math_sym_33_identity
Definition: cs_math.h:95
static cs_real_t cs_math_6_trace(const cs_real_t t[6])
Compute the trace of a symmetric tensor.
Definition: cs_math.h:658
static cs_real_t cs_math_fmin(cs_real_t x, cs_real_t y)
Compute the min value of two real values.
Definition: cs_math.h:161
cs_real_t cs_real_6_t[6]
vector of 6 floating-point values
Definition: cs_defs.h:337
const cs_real_t cs_math_big_r
static void cs_math_sym_33_3_product_add(const cs_real_t m[6], const cs_real_t v[3], cs_real_t mv[restrict 3])
Compute the product of a symmetric matrix of 3x3 real values by a vector of 3 real values and add it ...
Definition: cs_math.h:638
static void cs_math_33t_3_product(const cs_real_t m[3][3], const cs_real_t v[3], cs_real_t mv[restrict 3])
Compute the product of the transpose of a matrix of 3x3 real values by a vector of 3 real values...
Definition: cs_math.h:594
cs_math_sym_tensor_component_t
Definition: cs_math.h:61
static void cs_math_66_6_product(const cs_real_t m[6][6], const cs_real_t v[6], cs_real_t mv[restrict 6])
Compute the product of a matrix of 6x6 real values by a vector of 6 real values.
Definition: cs_math.h:675
static cs_real_t cs_math_pow3(cs_real_t x)
Compute the cube of a real value.
Definition: cs_math.h:231
static void cs_math_33_inv_cramer_in_place(cs_real_t a[3][3])
Inverse a 3x3 matrix in place, using Cramer's rule.
Definition: cs_math.h:879
const cs_real_t cs_math_pi
static void cs_math_3_normalise(const cs_real_t vin[3], cs_real_t vout[3])
Normalize a vector of 3 real values.
Definition: cs_math.h:436
static void cs_math_33_normal_scaling_add(const cs_real_t n[3], cs_real_t factor, cs_real_t t[3][3])
Add the dot product with a normal vector to the normal,normal component of a tensor: t += factor * n...
Definition: cs_math.h:527
static cs_real_t cs_math_3_triple_product(const cs_real_t u[3], const cs_real_t v[3], const cs_real_t w[3])
Compute the triple product.
Definition: cs_math.h:788
const cs_real_t cs_math_1ov6
#define BEGIN_C_DECLS
Definition: cs_defs.h:512
void cs_math_fw_and_bw_lu(const cs_real_t a_lu[], const int n, cs_real_t x[], const cs_real_t b[])
Block Jacobi utilities. Compute forward and backward to solve an LU P*P system.
Definition: cs_math.c:715
const cs_real_t cs_math_epzero
static cs_real_t cs_math_sym_33_determinant(const cs_real_6_t m)
Compute the determinant of a 3x3 symmetric matrix.
Definition: cs_math.h:738
const cs_real_t cs_math_1ov24
const cs_real_t cs_math_1ov12
const cs_real_t cs_math_2ov3
const cs_real_t cs_math_4ov3
static cs_real_t cs_math_3_distance(const cs_real_t xa[3], const cs_real_t xb[3])
Compute the (euclidean) distance between two points xa and xb in a Cartesian coordinate system of dim...
Definition: cs_math.h:265
void cs_math_33_eigen(const cs_real_t m[3][3], cs_real_t *eig_ratio, cs_real_t *eig_max)
Compute max/min eigenvalues ratio and max. eigenvalue of a 3x3 symmetric matrix with non-symmetric st...
Definition: cs_math.c:351
static void cs_math_sym_33_double_product(const cs_real_t s1[6], const cs_real_t s2[6], const cs_real_t s3[6], cs_real_t sout[restrict 3][3])
Compute the product of three symmetric matrices.
Definition: cs_math.h:1329
double cs_real_t
Floating-point value.
Definition: cs_defs.h:322
static cs_real_t cs_math_3_33_3_dot_product(const cs_real_t n1[3], const cs_real_t t[3][3], const cs_real_t n2[3])
Compute the dot product of a tensor t with two vectors, n1 and n2.
Definition: cs_math.h:353
Definition: cs_defs.h:370
static cs_real_t cs_math_3_square_norm(const cs_real_t v[3])
Compute the square norm of a vector of 3 real values.
Definition: cs_math.h:417
static void cs_math_3_normalize(const cs_real_t vin[3], cs_real_t vout[3])
Normalise a vector of 3 real values.
Definition: cs_math.h:460
static cs_real_t cs_math_sq(cs_real_t x)
Compute the square of a real value.
Definition: cs_math.h:199
static int cs_math_binom(int n, int k)
Computes the binomial coefficient of n and k.
Definition: cs_math.h:113
double cs_math_surftri(const cs_real_t xv[3], const cs_real_t xe[3], const cs_real_t xf[3])
Compute the area of the convex_hull generated by 3 points. This corresponds to the computation of the...
Definition: cs_math.c:471
double precision, dimension(:,:,:), allocatable v
Definition: atimbr.f90:114
static void cs_math_sym_33_transform_r_to_a(const cs_real_t m[6], const cs_real_t q[3][3], cs_real_t mout[6])
Compute transformation from relative to absolute reference frame Q^t M Q.
Definition: cs_math.h:1055
static void cs_math_3_normal_scaling(const cs_real_t n[3], cs_real_t factor, cs_real_t v[3])
Add the dot product with a normal vector to the normal direction to a vector.
Definition: cs_math.h:505
static void cs_math_sym_33_product(const cs_real_t s1[6], const cs_real_t s2[6], cs_real_t sout[restrict 6])
Compute the product of two symmetric matrices.
Definition: cs_math.h:1253
const cs_real_t cs_math_1ov3
static void cs_math_33_transform_a_to_r(const cs_real_t m[3][3], const cs_real_t q[3][3], cs_real_t mout[3][3])
Compute transformation from absolute to relative reference frame Q M Q^t.
Definition: cs_math.h:1096
static void cs_math_66_6_product_add(const cs_real_t m[6][6], const cs_real_t v[6], cs_real_t mv[restrict 6])
Compute the product of a matrix of 6x6 real values by a vector of 6 real values and add it to the vec...
Definition: cs_math.h:697
double cs_math_get_machine_epsilon(void)
Get the value related to the machine precision.
Definition: cs_math.c:245
static void cs_math_33_product_add(const cs_real_t m1[3][3], const cs_real_t m2[3][3], cs_real_t mout[restrict 3][3])
Add the product of two 3x3 real matrices to a matrix.
Definition: cs_math.h:1219
static void cs_math_33_inv_cramer_sym_in_place(cs_real_t a[3][3])
Inverse a 3x3 symmetric matrix (with non-symmetric storage) in place, using Cramer's rule...
Definition: cs_math.h:914
static void cs_math_33_transform_r_to_a(const cs_real_t m[3][3], const cs_real_t q[3][3], cs_real_t mout[3][3])
Compute transformation from relative to absolute reference frame Q^t M Q.
Definition: cs_math.h:1011
void cs_math_set_machine_epsilon(void)
Compute the value related to the machine precision.
Definition: cs_math.c:224
static cs_real_t cs_math_pow2(cs_real_t x)
Compute the square of a real value.
Definition: cs_math.h:215
double precision, save a
Definition: cs_fuel_incl.f90:148
double cs_math_voltet(const cs_real_t xv[3], const cs_real_t xe[3], const cs_real_t xf[3], const cs_real_t xc[3])
Compute the volume of the convex_hull generated by 4 points. This is equivalent to the computation of...
Definition: cs_math.c:501
double meas
Definition: cs_defs.h:372
void cs_math_sym_33_eigen(const cs_real_t m[6], cs_real_t eig_vals[3])
Compute all eigenvalues of a 3x3 symmetric matrix with symmetric storage.
Definition: cs_math.c:265
static cs_real_t cs_math_33_determinant(const cs_real_t m[3][3])
Compute the determinant of a 3x3 matrix.
Definition: cs_math.h:718
const cs_real_t cs_math_5ov3
double precision, dimension(:,:,:), allocatable u
Definition: atimbr.f90:113
static cs_real_t cs_math_3_norm(const cs_real_t v[3])
Compute the euclidean norm of a vector of dimension 3.
Definition: cs_math.h:401
static void cs_math_33_inv_cramer(const cs_real_t in[3][3], cs_real_t out[3][3])
Inverse a 3x3 matrix.
Definition: cs_math.h:847
void cs_math_33_eig_val_vec(const cs_real_t m_in[3][3], const cs_real_t tol_err, cs_real_t eig_val[restrict 3], cs_real_t eig_vec[restrict 3][3])
Evaluate eigenvalues and eigenvectors of a real symmetric matrix m1[3,3]: m1*m2 = lambda*m2...
Definition: cs_math.c:533
cs_real_t cs_real_3_t[3]
vector of 3 floating-point values
Definition: cs_defs.h:335
static void cs_math_3_orthogonal_projection(const cs_real_t n[3], const cs_real_t v[3], cs_real_t vout[restrict 3])
Orthogonal projection of a vector with respect to a normalised vector.
Definition: cs_math.h:484
static void cs_math_3_cross_product(const cs_real_t u[3], const cs_real_t v[3], cs_real_t uv[restrict 3])
Compute the cross product of two vectors of 3 real values.
Definition: cs_math.h:762
const cs_real_t cs_math_zero_threshold
static const cs_real_33_t cs_math_33_identity
Definition: cs_math.h:92
double unitv[3]
Definition: cs_defs.h:373
int cs_lnum_t
local mesh entity id
Definition: cs_defs.h:316
static cs_real_t cs_math_pow4(cs_real_t x)
Compute the 4-th power of a real value.
Definition: cs_math.h:247
static cs_real_t cs_math_3_square_distance(const cs_real_t xa[3], const cs_real_t xb[3])
Compute the squared distance between two points xa and xb in a Cartesian coordinate system of dimensi...
Definition: cs_math.h:310
static void cs_nvec3(const cs_real_3_t v, cs_nvec3_t *qv)
Define a cs_nvec3_t structure from a cs_real_3_t.
Definition: cs_math.h:1384
#define END_C_DECLS
Definition: cs_defs.h:513
static void cs_math_33_product(const cs_real_t m1[3][3], const cs_real_t m2[3][3], cs_real_t mout[3][3])
Compute the product of two 3x3 real valued matrices.
Definition: cs_math.h:982
static void cs_math_3_orthonormal_basis(const cs_real_t vect[3], cs_real_t axes[3][3])
Build an orthonormal basis based on a first vector "vect". axes[0] is vect normalized, while (axes[0], axes[1], axes[23]) is an orthonormal base.
Definition: cs_math.h:810
cs_real_t cs_real_33_t[3][3]
3x3 matrix of floating-point values
Definition: cs_defs.h:344
static cs_real_t cs_math_3_sym_33_3_dot_product(const cs_real_t n1[3], const cs_real_t t[6], const cs_real_t n2[3])
Compute the dot product of a symmetric tensor t with two vectors, n1 and n2.
Definition: cs_math.h:381
Definition: cs_field_pointer.h:92
static void cs_math_sym_33_3_product(const cs_real_t m[6], const cs_real_t v[3], cs_real_t mv[restrict 3])
Compute the product of a symmetric matrix of 3x3 real values by a vector of 3 real values...
Definition: cs_math.h:616
void cs_math_3_length_unitv(const cs_real_t xa[3], const cs_real_t xb[3], cs_real_t *len, cs_real_3_t unitv)
Compute the length (Euclidean norm) between two points xa and xb in a Cartesian coordinate system of ...
Definition: cs_math.c:438
static void cs_math_33_extract_sym_ant(const cs_real_t m[3][3], cs_real_t m_sym[3][3], cs_real_t m_ant[3][3])
Extract from the given matrix its symmetric and anti-symmetric part.
Definition: cs_math.h:1181
static cs_real_t cs_math_fmax(cs_real_t x, cs_real_t y)
Compute the max value of two real values.
Definition: cs_math.h:180
static void cs_math_33_3_product_add(const cs_real_t m[3][3], const cs_real_t v[3], cs_real_t mv[restrict 3])
Compute the product of a matrix of 3x3 real values by a vector of 3 real values add.
Definition: cs_math.h:573
const cs_real_t cs_math_infinite_r
static void cs_math_33_3_product(const cs_real_t m[3][3], const cs_real_t v[3], cs_real_t mv[restrict 3])
Compute the product of a matrix of 3x3 real values by a vector of 3 real values.
Definition: cs_math.h:552
void cs_math_fact_lu(cs_lnum_t n_blocks, const int b_size, const cs_real_t *a, cs_real_t *a_lu)
Compute LU factorization of an array of dense matrices of identical size.
Definition: cs_math.c:657
static void cs_math_reduce_sym_prod_33_to_66(const cs_real_t s[3][3], cs_real_t sout[restrict 6][6])
Compute a 6x6 matrix A, equivalent to a 3x3 matrix s, such as: A*R_6 = R*s^t + s*R.
Definition: cs_math.h:1282
static void cs_math_sym_33_transform_a_to_r(const cs_real_t m[6], const cs_real_t q[3][3], cs_real_t mout[6])
Compute transformation from absolute to relative reference frame Q M Q^t.
Definition: cs_math.h:1140
double precision, save b
Definition: cs_fuel_incl.f90:148