Ejemplo n.º 1
0
def calculate_phir(phi, dphi, s, xq, K_fine, eps, LorY, kappa):

    phir = 0
    for i in range(len(s.triangle)):
        panel = s.vertex[s.triangle[i]]

        K, V = gaussIntegration_fine(xq, panel, s.normal[i], s.Area[i], K_fine, kappa, LorY, eps)
        phir += (-K*phi[i] + V*dphi[i])/(4*pi)
        
    return phir
Ejemplo n.º 2
0
def calculate_phir(phi, dphi, s, xq, K_fine, eps, LorY, kappa, E, m_E, m_a, infty):

    phir = 0
    dummy = array([[0,0,0]])
    for i in range(len(s.triangle)):
        panel = s.vertex[s.triangle[i]]
        K, V, Kp = gaussIntegration_fine(xq, panel, s.normal[i], s.Area[i], dummy, K_fine, kappa, E, m_E, m_a, LorY, eps, infty)
        # s.normal is dummy: needed for Kp, which we don't use here.
        phir += (-K*phi[i] + V*dphi[i])/(4*pi)
        
    return phir
Ejemplo n.º 3
0
def calculate_phir(phi, dphi, s, xq, K_fine, eps, LorY, kappa):

    phir = 0
    dummy = array([[0,0,0]])
    for i in range(len(s.triangle)):
        panel = s.vertex[s.triangle[i]]

        K, V, Kp = gaussIntegration_fine(xq, panel, s.normal[i], s.Area[i], dummy, K_fine, kappa, LorY, eps)
        # s.normal is dummy: needed for Kp, which we don't use here.
        phir += (-K*phi[i] + V*dphi[i])/(4*pi)
        
    return phir
Ejemplo n.º 4
0
def blockMatrix(tar, src, WK, kappa, threshold, LorY, xk, wk, K_fine, eps):

    Ns = len(src.xi)
    Nt = len(tar.xi)
    K = len(WK)

    dx = transpose(ones((Ns * K, Nt)) * tar.xi) - src.xj
    dy = transpose(ones((Ns * K, Nt)) * tar.yi) - src.yj
    dz = transpose(ones((Ns * K, Nt)) * tar.zi) - src.zj
    r = sqrt(dx * dx + dy * dy + dz * dz + eps * eps)

    dx = reshape(dx, (Nt, Ns, K))
    dy = reshape(dy, (Nt, Ns, K))
    dz = reshape(dz, (Nt, Ns, K))
    r = reshape(r, (Nt, Ns, K))

    if LorY == 1:  # if Laplace
        #       Double layer
        K_lyr = src.Area * (sum(WK / r**3 * dx, axis=2) * src.normal[:, 0] +
                            sum(WK / r**3 * dy, axis=2) * src.normal[:, 1] +
                            sum(WK / r**3 * dz, axis=2) * src.normal[:, 2])
        #       Single layer
        V_lyr = src.Area * sum(WK / r, axis=2)
        #       Adjoint double layer
        Kp_lyr = -src.Area * (
            transpose(
                transpose(sum(WK / r**3 * dx, axis=2)) * tar.normal[:, 0]) +
            transpose(
                transpose(sum(WK / r**3 * dy, axis=2)) * tar.normal[:, 1]) +
            transpose(
                transpose(sum(WK / r**3 * dz, axis=2)) * tar.normal[:, 2]))

    else:  # if Yukawa
        #       Double layer
        K_lyr = src.Area * (
            sum(WK / r**2 * exp(-kappa * r) *
                (kappa + 1 / r) * dx, axis=2) * src.normal[:, 0] +
            sum(WK / r**2 * exp(-kappa * r) *
                (kappa + 1 / r) * dy, axis=2) * src.normal[:, 1] +
            sum(WK / r**2 * exp(-kappa * r) *
                (kappa + 1 / r) * dz, axis=2) * src.normal[:, 2])
        #       Single layer
        V_lyr = src.Area * sum(WK * exp(-kappa * r) / r, axis=2)
        #       Adjoint double layer
        Kp_lyr = zeros(shape(K_lyr))  #TO BE IMPLEMENTED

    same = zeros((Nt, Ns), dtype=int32)
    if abs(src.xi[0] - tar.xi[0]) < 1e-10:
        for i in range(Nt):
            same[i, i] = 1

    tri_ctr = average(src.vertex[src.triangle[:]], axis=1)
    dx = transpose(ones((Ns, Nt)) * tar.xi) - tri_ctr[:, 0]
    dy = transpose(ones((Ns, Nt)) * tar.yi) - tri_ctr[:, 1]
    dz = transpose(ones((Ns, Nt)) * tar.zi) - tri_ctr[:, 2]
    r_tri = sqrt(dx * dx + dy * dy + dz * dz)
    L_d = logical_and(
        greater_equal(sqrt(2 * src.Area) / (r_tri + eps), threshold),
        same == 0)

    #    L_d  = logical_and(greater_equal(sqrt(2*src.Area)/average(r,axis=2),threshold), same==0)

    N_analytical = 0

    for i in range(Ns):
        panel = src.vertex[src.triangle[i]]
        an_integrals = nonzero(L_d[:, i])[0]
        local_center = zeros((len(an_integrals), 3))
        local_center[:, 0] = tar.xi[an_integrals]
        local_center[:, 1] = tar.yi[an_integrals]
        local_center[:, 2] = tar.zi[an_integrals]
        normal_tar = tar.normal[an_integrals]

        K_aux, V_aux, Kp_aux = gaussIntegration_fine(local_center, panel,
                                                     src.normal[i],
                                                     src.Area[i], normal_tar,
                                                     K_fine, kappa, LorY, eps)
        K_lyr[an_integrals, i] = K_aux[:, 0]
        V_lyr[an_integrals, i] = V_aux[:, 0]
        Kp_lyr[an_integrals, i] = Kp_aux[:, 0]

        N_analytical += len(an_integrals)

        if abs(src.xi[0] - tar.xi[0]) < 1e-10:
            if same[i, i] == 1:
                local_center = array([tar.xi[i], tar.yi[i], tar.zi[i]])
                G_Y = zeros(1)
                dG_Y = zeros(1)
                G_L = zeros(1)
                dG_L = zeros(1)
                SA_wrap_arr(ravel(panel), local_center, G_Y, dG_Y, G_L, dG_L,
                            kappa, array([1], dtype=int32), xk, wk)

                if LorY == 1:  # if Laplace
                    K_lyr[i, i] = dG_L
                    V_lyr[i, i] = G_L
                    Kp_lyr[i, i] = dG_L
                else:  # if Yukawa
                    K_lyr[i, i] = dG_Y
                    V_lyr[i, i] = G_Y
                    Kp_lyr[i, i] = dG_Y

                N_analytical += 1

    print '\t%i analytical integrals' % (N_analytical / Ns)

    return K_lyr, V_lyr, Kp_lyr
Ejemplo n.º 5
0
def blockMatrix(tar, src, WK, kappa, threshold, LorY, xk, wk, K_fine, eps):
    
    Ns = len(src.xi)
    Nt = len(tar.xi)
    K  = len(WK)

    dx = transpose(ones((Ns*K,Nt))*tar.xi) - src.xj
    dy = transpose(ones((Ns*K,Nt))*tar.yi) - src.yj
    dz = transpose(ones((Ns*K,Nt))*tar.zi) - src.zj
    r = sqrt(dx*dx+dy*dy+dz*dz+eps*eps)

    dx = reshape(dx,(Nt,Ns,K))
    dy = reshape(dy,(Nt,Ns,K))
    dz = reshape(dz,(Nt,Ns,K))
    r  = reshape(r,(Nt,Ns,K))

    if LorY==1:   # if Laplace
#       Double layer 
        K_lyr = src.Area * (sum(WK/r**3*dx, axis=2)*src.normal[:,0]
                          + sum(WK/r**3*dy, axis=2)*src.normal[:,1]
                          + sum(WK/r**3*dz, axis=2)*src.normal[:,2])
#       Single layer
        V_lyr = src.Area * sum(WK/r, axis=2)
#       Adjoint double layer
        Kp_lyr = -src.Area * ( transpose(transpose(sum(WK/r**3*dx, axis=2))*tar.normal[:,0])
                             + transpose(transpose(sum(WK/r**3*dy, axis=2))*tar.normal[:,1])
                             + transpose(transpose(sum(WK/r**3*dz, axis=2))*tar.normal[:,2]) )

    else:           # if Yukawa
#       Double layer 
        K_lyr = src.Area * (sum(WK/r**2*exp(-kappa*r)*(kappa+1/r)*dx, axis=2)*src.normal[:,0]
                          + sum(WK/r**2*exp(-kappa*r)*(kappa+1/r)*dy, axis=2)*src.normal[:,1]
                          + sum(WK/r**2*exp(-kappa*r)*(kappa+1/r)*dz, axis=2)*src.normal[:,2])
#       Single layer
        V_lyr = src.Area * sum(WK * exp(-kappa*r)/r, axis=2)
#       Adjoint double layer
        Kp_lyr = zeros(shape(K_lyr))      #TO BE IMPLEMENTED
        

    same = zeros((Nt,Ns),dtype=int32)
    if abs(src.xi[0]-tar.xi[0])<1e-10:
        for i in range(Nt):
            same[i,i]   = 1 

    tri_ctr = average(src.vertex[src.triangle[:]], axis=1)
    dx = transpose(ones((Nt,Nt))*tar.xi) - tri_ctr[:,0]
    dy = transpose(ones((Nt,Nt))*tar.yi) - tri_ctr[:,1]
    dz = transpose(ones((Nt,Nt))*tar.zi) - tri_ctr[:,2]
    r_tri = sqrt(dx*dx+dy*dy+dz*dz)
    L_d  = logical_and(greater_equal(sqrt(2*src.Area)/(r_tri+eps),threshold), same==0) 

#    L_d  = logical_and(greater_equal(sqrt(2*src.Area)/average(r,axis=2),threshold), same==0) 

    N_analytical = 0 

    for i in range(Ns):
        panel = src.vertex[src.triangle[i]]
        an_integrals = nonzero(L_d[:,i])[0]
        local_center = zeros((len(an_integrals),3))
        local_center[:,0] = tar.xi[an_integrals]
        local_center[:,1] = tar.yi[an_integrals]
        local_center[:,2] = tar.zi[an_integrals]
        normal_tar = tar.normal[an_integrals]

        K_aux, V_aux, Kp_aux = gaussIntegration_fine(local_center, panel, src.normal[i], src.Area[i], normal_tar, K_fine, kappa, LorY, eps)
        K_lyr[an_integrals,i]  = K_aux[:,0]
        V_lyr[an_integrals,i]  = V_aux[:,0]
        Kp_lyr[an_integrals,i] = Kp_aux[:,0]

        N_analytical += len(an_integrals)

        if same[i,i] == 1:
            local_center = array([tar.xi[i], tar.yi[i], tar.zi[i]])
            G_Y  = zeros(1)
            dG_Y = zeros(1)
            G_L  = zeros(1)
            dG_L = zeros(1)
            SA_wrap_arr(ravel(panel), local_center, G_Y, dG_Y, G_L, dG_L, kappa, array([1], dtype=int32), xk, wk) 

            if LorY==1:   # if Laplace
                K_lyr[i,i]  = dG_L
                V_lyr[i,i]  = G_L
                Kp_lyr[i,i] = dG_L
            else:           # if Yukawa
                K_lyr[i,i]  = dG_Y
                V_lyr[i,i]  = G_Y  
                Kp_lyr[i,i] = dG_Y

            N_analytical += 1

    print '\t%i analytical integrals'%(N_analytical/Ns)

    return K_lyr, V_lyr, Kp_lyr