def test_energy(self): tol = 1e-10 L = 2 + rand() # domain length a = 3 + rand() # amplitude of force E = 4 + rand() # Young's Mod for res in [4, 8, 16]: area_per_pt = L / res x = np.arange(res) * area_per_pt force = a * np.cos(2 * np.pi / L * x) # theoretical FFT of force Fforce = np.zeros_like(x) Fforce[1] = Fforce[-1] = res / 2. * a # theoretical FFT of disp Fdisp = np.zeros_like(x) Fdisp[1] = Fdisp[-1] = res / 2. * a / E * L / (np.pi) # verify consistency hs = PeriodicFFTElasticHalfSpace(res, E, L) fforce = rfftn(force.T).T fdisp = hs.greens_function * fforce self.assertTrue( Tools.mean_err(fforce, Fforce, rfft=True) < tol, "fforce = \n{},\nFforce = \n{}".format(fforce.real, Fforce)) self.assertTrue( Tools.mean_err(fdisp, Fdisp, rfft=True) < tol, "fdisp = \n{},\nFdisp = \n{}".format(fdisp.real, Fdisp)) # Fourier energy E = .5 * np.dot(Fforce / area_per_pt, Fdisp) / res disp = hs.evaluate_disp(force) e = hs.evaluate_elastic_energy(force, disp) kdisp = hs.evaluate_k_disp(force) self.assertTrue( abs(disp - irfftn(kdisp.T).T).sum() < tol, ("disp = {}\n" "ikdisp = {}").format(disp, irfftn(kdisp.T).T)) ee = hs.evaluate_elastic_energy_k_space(fforce, kdisp) self.assertTrue( abs(e - ee) < tol, "violate Parseval: e = {}, ee = {}, ee/e = {}".format( e, ee, ee / e)) self.assertTrue( abs(E - e) < tol, "theoretical E = {}, computed e = {}, diff(tol) = {}({})". format(E, e, E - e, tol))
def test_parabolic_shape_disp(self): """ test whether the Elastic energy is a quadratic function of the applied displacement""" hs = PeriodicFFTElasticHalfSpace(self.res, self.young, self.physical_sizes) disp = random(self.res) disp -= disp.mean() nb_tests = 4 El = np.zeros(nb_tests) for i in range(nb_tests): force = hs.evaluate_force(i * disp) El[i] = hs.evaluate_elastic_energy(i * force, disp) tol = 1e-10 error = norm(El / El[1] - np.arange(nb_tests)**2) self.assertTrue(error < tol)