Example #1
0
def distanceToFiber(c, s, q, qsym, **kwargs):
    """
    """
    csymFlag = False
    B = I3

    arglen = len(kwargs)

    if len(c) != 3 or len(s) != 3:
        raise RuntimeError('c and/or s are not 3-vectors')

    # argument handling
    if arglen > 0:
        argkeys = list(kwargs.keys())
        for i in range(arglen):
            if argkeys[i] == 'centrosymmetry':
                csymFlag = kwargs[argkeys[i]]
            elif argkeys[i] == 'bmatrix':
                B = kwargs[argkeys[i]]
            else:
                raise RuntimeError("keyword arg \'%s\' is not recognized"
                                   % (argkeys[i]))

    c = unitVector(dot(B, asarray(c)))
    s = unitVector(asarray(s).reshape(3, 1))

    nq = q.shape[1]  # number of quaternions
    rmats = rotMatOfQuat(q)  # (nq, 3, 3)

    csym = applySym(c, qsym, csymFlag)  # (3, m)
    m = csym.shape[1]  # multiplicity

    if nq == 1:
        rc = dot(rmats, csym)  # apply q's to c's

        sdotrc = dot(s.T, rc).max()
    else:
        rc = multMatArray(
            rmats, tile(csym, (nq, 1, 1))
        )  # apply q's to c's

        sdotrc = dot(
            s.T,
            rc.swapaxes(1, 2).reshape(nq*m, 3).T
        ).reshape(nq, m).max(1)

    d = arccosSafe(array(sdotrc))

    return d
Example #2
0
def applySym(vec, qsym, csFlag=False, cullPM=False, tol=1e-8):
    """
    apply symmetry group to a single 3-vector (columnar) argument

    csFlag : centrosymmetry flag
    cullPM : cull +/- flag
    """
    nsym  = qsym.shape[1]
    Rsym  = rotMatOfQuat(qsym)

    allhkl = multMatArray(Rsym, tile(vec, (nsym, 1, 1))).swapaxes(1, 2).reshape(nsym, 3).T

    if csFlag:
        allhkl = hstack([allhkl, -1*allhkl])
    eqv, uid = findDuplicateVectors(allhkl, tol=tol, equivPM=cullPM)

    return allhkl[ix_(range(3), uid)]
Example #3
0
def distanceToFiber(c, s, q, qsym, **kwargs):
    """
    """
    csymFlag = False
    B = I3

    arglen = len(kwargs)

    if len(c) != 3 or len(s) != 3:
        raise RuntimeError, 'c and/or s are not 3-vectors'

    # argument handling
    if arglen > 0:
        argkeys = kwargs.keys()
        for i in range(arglen):
            if argkeys[i] == 'centrosymmetry':
                csymFlag = kwargs[argkeys[i]]
            elif argkeys[i] == 'bmatrix':
                B = kwargs[argkeys[i]]
            else:
                raise RuntimeError('keyword arg \'%s\' is not recognized' \
                                   % (argkeys[i]))

    c = unitVector( dot(B, asarray(c)) )
    s = unitVector( asarray(s).reshape(3, 1) )

    nq    = q.shape[1]                  # number of quaternions
    rmats = rotMatOfQuat(q)             # (nq, 3, 3)

    csym = applySym(c, qsym, csymFlag)  # (3, m)
    m    = csym.shape[1]                # multiplicity

    if nq == 1:
        rc = dot(rmats, csym)           # apply q's to c's

        sdotrc = dot( s.T, rc ).max()
    else:
        rc = multMatArray( rmats, tile(csym, (nq, 1, 1)) ) # apply q's to c's

        sdotrc = dot( s.T, rc.swapaxes(1, 2).reshape(nq*m, 3).T ).reshape(nq, m).max(1)

    d = arccosSafe( array(sdotrc) )

    return d