Example #1
0
	def steadyStateDirichlet(self):
		# -------------------- Find out size of the complete system -------------------------------------
		self.nrCtrlPoints = 0
		for i in range(self.nrPanelObjects):
			self.nrCtrlPoints += self.panelObjects[i].mesh.nrFaces

		# Global matrix system to solve, A x = b
		A = np.zeros((self.nrCtrlPoints, self.nrCtrlPoints))
		b = np.zeros(self.nrCtrlPoints)
		
		# For each panel object, calculate influence matrix
		startTime = time.clock()
		i_start = 0
		for i in range(self.nrPanelObjects):
			pCtrl = self.panelObjects[i].mesh.face_center
			nCtrl = self.panelObjects[i].mesh.face_n

			nrCtrlPoints = self.panelObjects[i].mesh.nrFaces

			i_stop  = i_start + nrCtrlPoints
			j_start = 0
			for j in range(self.nrPanelObjects):
				panelObject = self.panelObjects[j]
				mesh        = panelObject.mesh
				wake_mesh   = panelObject.wake_mesh

				j_stop = j_start + mesh.nrFaces

				# Calculate influence on current ctrl points from current mesh
				A_local = Computation.potentialInfluence(pCtrl, mesh, 'doublet')
				A_wake  = Computation.potentialInfluence(pCtrl, wake_mesh, 'doublet')
						
				# Combine influence from individual panels to influence from strips
				for k in range(nrCtrlPoints):
					for l in range(panelObject.nrStrips):
						wakeSum = np.sum(A_wake[k, panelObject.wake_stripFaces[l]])

						faceIndex = panelObject.stripFaces[l, 0]
						n1 = mesh.face_n[faceIndex]
						A_local[k, faceIndex] += wakeSum*np.sign(n1[1])

						faceIndex = panelObject.stripFaces[l, -1]
						n2 = mesh.face_n[faceIndex]
						A_local[k, faceIndex] += wakeSum*np.sign(n2[1])
				
				# Put resulting influence matrix into global matrix
				A[i_start:i_stop, j_start:j_stop] = A_local

				j_start += mesh.nrFaces

			# Compute right side of linear system
			sigma = Computation.freeStreamNewmann(self.Uinf, nCtrl, nrCtrlPoints)/(4*np.pi)
			B     = Computation.potentialInfluence(pCtrl, mesh, 'source')

			b[i_start:i_stop] = -np.dot(B, sigma)
			panelObject.source_strength = sigma

			i_start += nrCtrlPoints

		stopTime = time.clock()
		print('Matrix assembly time:', stopTime - startTime, 's')

		# Solve system
		startTime = time.clock()
		strength = np.linalg.solve(A, b)
		stopTime = time.clock()
		print('Linear solver time:', stopTime - startTime, 's')

		# Transfer global strength values to individual panel objects
		i_start = 0
		for i in range(self.nrPanelObjects):
			panelObject = self.panelObjects[i]
			i_stop = i_start + panelObject.mesh.nrFaces

			panelObject.doublet_strength = strength[i_start:i_stop]

			j_start = 0
			for j in range(panelObject.nrStrips):
				j_stop = j_start + panelObject.wake_nrPanelsPrStrip

				faceIndex1 = panelObject.stripFaces[j, 0]
				n1 = self.panelObjects[i].mesh.face_n[faceIndex1]
				faceIndex2 = panelObject.stripFaces[j, -1]
				n2 = self.panelObjects[i].mesh.face_n[faceIndex2]

				stripStrength = panelObject.doublet_strength[faceIndex1]*np.sign(n1[1]) + panelObject.doublet_strength[faceIndex2]*np.sign(n2[1])

				panelObject.wake_strength[j_start:j_stop] = stripStrength

				j_start += panelObject.wake_nrPanelsPrStrip

			i_start += panelObject.mesh.nrFaces