def test_engineering_strain_(self): # Tolerance toll = 1e-7 # Generate random numbers in [0.5,1.5] rand_nrs = (np.random.random_sample(1000)) + 0.5 # Format as [nEl,i,j,...] F = np.reshape(rand_nrs, (5, 2, 2, 5, 5, 2)) green_strain = Fields._green_strain_(F) eng_strain = Fields._engineering_strain_(green_strain) # Calculate green strain from engineering strain E11 = 0.5 * ((eng_strain[:, 0, 0, :, :, :] + 1.) ** 2. - 1.) E22 = 0.5 * ((eng_strain[:, 1, 1, :, :, :] + 1.) ** 2. - 1.) E12 = 0.5 * np.sin(2. * eng_strain[:, 0, 1, :, :, :]) * (1. + eng_strain[:, 0, 0, :, :, :]) * ( 1. + eng_strain[:, 1, 1, :, :, :]) # Deterine absolute error deviation11 = np.abs(E11 - green_strain[:, 0, 0, :, :, :]) deviation22 = np.abs(E22 - green_strain[:, 1, 1, :, :, :]) deviation12 = np.abs(E12 - green_strain[:, 0, 1, :, :, :]) self.assertEqual(True, all([dev < toll for dev in deviation11.flatten()])) self.assertEqual(True, all([dev < toll for dev in deviation12.flatten()])) self.assertEqual(True, all([dev < toll for dev in deviation22.flatten()]))
def test_shear_(self): # Small strain pure shear compared to rotated tension-compression # Tolerance toll = 1e-7 # Deformation gradient F_shear = np.array([[1., 0.00001], [0.00001, 1.]]) F_shear_stack = np.ones( (5, 2, 2, 5, 5, 2)) * F_shear[np.newaxis, :, :, np.newaxis, np.newaxis, np.newaxis] E_shear = Fields._green_strain_(F_shear_stack) eng_strain_shear = Fields._engineering_strain_(E_shear) # Rotate to tension-compression orientation alpha = np.pi / 4. R = np.array([[np.cos(alpha), -np.sin(alpha)], [np.sin(alpha), np.cos(alpha)]]) F_tc = np.dot(R.transpose(), np.dot(F_shear, R)) F_tc_stack = np.ones( (5, 2, 2, 5, 5, 2)) * F_tc[np.newaxis, :, :, np.newaxis, np.newaxis, np.newaxis] E_tc = Fields._green_strain_(F_tc_stack) eng_strain_tc = Fields._engineering_strain_(E_tc) # Rotate back to pure shear alpha = -np.pi / 4. R = np.array([[np.cos(alpha), -np.sin(alpha)], [np.sin(alpha), np.cos(alpha)]]) eng_strain_shear_rot = np.einsum('ij,njk...,kl...->nil...', R.transpose(), eng_strain_tc, R) deviation = np.abs(eng_strain_shear - eng_strain_shear_rot) # deviation = np.abs(eng_strain - (F-np.eye(2))[np.newaxis,:,:,np.newaxis,np.newaxis,np.newaxis]) self.assertEqual(True, all([dev < toll for dev in deviation.flatten()]))
def test_biaxial_tension_(self): # Tolerance toll = 1e-7 # Deformation gradient F = np.array([[1.1, 0.], [0., 1.1]]) F_stack = np.ones((5, 2, 2, 5, 5, 2)) * F[np.newaxis, :, :, np.newaxis, np.newaxis, np.newaxis] E = Fields._green_strain_(F_stack) eng_strain = Fields._engineering_strain_(E) eng_strain - (F - np.eye(2))[np.newaxis, :, :, np.newaxis, np.newaxis, np.newaxis] # Determine absolute error deviation = np.abs(eng_strain - (F - np.eye(2))[np.newaxis, :, :, np.newaxis, np.newaxis, np.newaxis]) self.assertEqual(True, all([dev < toll for dev in deviation.flatten()]))