static int laue4m(int axes[3], SPGCONST PointSymmetry * pointsym) { int i, num_ortho_axis, norm, min_norm, is_found, tmpval; int axis_vec[3]; int prop_rot[3][3], t_mat[3][3]; int ortho_axes[NUM_ROT_AXES]; for (i = 0; i < pointsym->size; i++) { get_proper_rotation(prop_rot, pointsym->rot[i]); /* Search foud-fold rotation */ if ( mat_get_trace_i3(prop_rot) == 1) { /* The first axis */ axes[2] = get_rotation_axis(prop_rot); break; } } /* The second axis */ num_ortho_axis = get_orthogonal_axis(ortho_axes, prop_rot, 4); if (! num_ortho_axis) { goto err; } min_norm = 8; is_found = 0; for (i = 0; i < num_ortho_axis; i++) { norm = mat_norm_squared_i3(rot_axes[ortho_axes[i]]); if (norm < min_norm) { min_norm = norm; axes[0] = ortho_axes[i]; is_found = 1; } } if (! is_found) { goto err; } /* The third axis */ mat_multiply_matrix_vector_i3(axis_vec, prop_rot, rot_axes[axes[0]]); is_found = 0; for (i = 0; i < NUM_ROT_AXES; i++) { if (is_exist_axis(axis_vec, i)) { is_found = 1; axes[1] = i; break; } } if (! is_found) { goto err; } set_transformation_matrix(t_mat, axes); if (mat_get_determinant_i3(t_mat) < 0) { tmpval = axes[0]; axes[0] = axes[1]; axes[1] = tmpval; } return 1; err: return 0; }
static int laue2m( int axes[3], const Symmetry * symmetry ) { int i, num_ortho_axis, norm, min_norm, is_found, tmpval; int prop_rot[3][3], t_mat[3][3]; int ortho_axes[NUM_ROT_AXES]; for ( i = 0; i < symmetry->size; i++ ) { get_proper_rotation( prop_rot, symmetry->rot[i] ); /* Search two-fold rotation */ if ( ! ( mat_get_trace_i3( prop_rot ) == -1 ) ) { continue; } /* The first axis */ axes[1] = get_rotation_axis( prop_rot ); break; } /* The second axis */ num_ortho_axis = get_orthogonal_axis( ortho_axes, prop_rot, 2 ); if ( ! num_ortho_axis ) { goto err; } min_norm = 8; is_found = 0; for ( i = 0; i < num_ortho_axis; i++ ) { norm = mat_norm_squared_i3( rot_axes[ortho_axes[i]] ); if ( norm < min_norm ) { min_norm = norm; axes[0] = ortho_axes[i]; is_found = 1; } } if ( ! is_found ) { goto err; } /* The third axis */ min_norm = 8; is_found = 0; for ( i = 0; i < num_ortho_axis; i++ ) { norm = mat_norm_squared_i3( rot_axes[ortho_axes[i]] ); if ( norm < min_norm && ( ! ( ortho_axes[i] == axes[0] ) ) ) { min_norm = norm; axes[2] = ortho_axes[i]; is_found = 1; } } if ( ! is_found ) { goto err; } get_transform_matrix( t_mat, axes ); if ( mat_get_determinant_i3( t_mat ) < 0 ) { tmpval = axes[0]; axes[0] = axes[2]; axes[2] = tmpval; } return 1; err: return 0; }