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
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
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
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
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