Source code for mechelastic.core.elastic_properties_2d

# -*- coding: utf-8 -*-
import numpy as np
from ..comms import printer
from ..tests import ductile
from ..tests import eigenvals
from ..utils.constants import *
from ..utils.elements import ELEMENTS
from ..utils.crystalutils import *
from .structure import Structure
from ..tests import stability

[docs]class ElasticProperties2D: """Convert the units from GPa or N/m2 to N/m for two-dimensional systems 1 GPa = 10^9 N/m2 Here, we use second Piola-Kirchhoff stress method to express the 2D forces per unit length in N/m units. Ref: [Peng et al., Acta Mechanica 223 (2012), 2591-2596; Comput. Mater. Sci. 68, 320 (2013); Mech. Mater. 64, 135 (2013). ] [Singh et al., Phys. Rev. B 95, 165444 (2017)] We multiply elastic tensor by the thickness of the simulation cell to consider the vacuum thickness. In 2D: Cij = bulk_Cij * C_latticevector (final units N/m) For example: if bulk_Cij = 15 GPa and out-of-plane cell parameter c = 10 Angs. Then 2D_Cij = [15*10^9 N/m2] * [10*10^(-10) m] ; i.e 15*(0.1*c) N/m """ def __init__(self, elastic_tensor, lattice_constant, structure = None , lattice_type = None): self.elastic_tensor = elastic_tensor self.lattice_constant = lattice_constant self.c2d = np.zeros((6, 6)) self.structure = structure self.lattice_type = lattice_type self._c2d() # if self.structure is not None: #or self.lattice_type is not None: lattice_select( cnew=self.c2d, cell=None, lattice_type=self.lattice_type, ) def _c2d(self): for i in range(0, 6): for j in range(0, 6): self.c2d[i, j] = ( self.elastic_tensor[i, j] * 0.1 * float(self.lattice_constant[2]) ) print("\n \n Elastic tensor for two-dimensional system in N/m units \n") np.set_printoptions(precision=3, suppress=True) printer.print_matrix(self.c2d) # if self.lattice_type is not None or self.structure is not None: # print( # "\n------------------------------------------------------------------" # ) # print("Mechanical Stability Tests") # print( # "------------------------------------------------------------------\n") # self.elastic_stability # Elastic Properties @property def Lm(self): """ Layer modulus: represents the resistance of a 2D sheet to stretching; Lm = (1/4)*[c11 + c22 + 2*c12] [Ref: Andrew et al.; Phys. Rev. B 85, 125428 (2012)] Returns ------- Lm : float Layer modulus """ Lm = 0.25 * (self.c2d[0][0] + self.c2d[1][1] + 2 * self.c2d[0][1]) return Lm @property def layer_modulus(self): """ Returns ------- layer_modulus : float Layer modulus """ return self.Lm @property def Y10(self): """ 2D Young's modulus or in-plane stiffness: Y[10] = [c11c22 - c12^2]/[c22] Returns ------- Y10 : float 2D Young's modulus (in-plane stiffness) """ Y10 = (self.c2d[0][0] * self.c2d[1][1] - self.c2d[0][1] * self.c2d[0][1]) / ( self.c2d[1][1] ) return Y10 @property def Y01(self): """ 2D Young's modulus or in-plane stiffness: Y[01] = [c11c22 - c12^2]/[c11] Returns ------- Y01 : float 2D Young's modulus (in-plane stiffness) """ Y01 = (self.c2d[0][0] * self.c2d[1][1] - self.c2d[0][1] * self.c2d[0][1]) / ( self.c2d[0][0] ) return Y01 @property def nu10(self): """ 2D Poisson's ratio; nu10 = c12/c22 Returns ------- nu10 : float 2D Poisson's ratio """ nu10 = self.c2d[0][1] / self.c2d[1][1] return nu10 @property def nu01(self): """ 2D Poisson's ratio; nu01 = c12/c11 Returns ------- nu01 : float 2D Poisson's ratio """ nu01 = self.c2d[0][1] / self.c2d[0][0] return nu01 @property def G2d(self): """ 2D shear modulus; G2d = C66 Returns ------- G2d : float 2D shear modulus """ G2d = self.c2d[5][5] return G2d @property def shear_modulus_2d(self): """ 2D shear modulus; G2d = C66 Returns ------- G2d : float 2D shear modulus """ return self.G2d @property def elastic_stability(self): return stability.stability_test_2d(self.c2d, self.lattice_type)
[docs] def print_properties(self): print("\n \n Elastic properties in two-dimensions \n") print( "[Useful refs. Andrew et al.; Phys. Rev. B 85, 125428 (2012), Peng et al., Acta Mechanica 223 (2012), 2591-2596; Comput. Mater. Sci. 68, 320 (2013); Mech. Mater. 64, 135 (2013) ]" ) print(" ") print("-------------------------------------------------------") print("2D layer modulus (N/m) : %10.3f " % self.Lm) print("2D Young's modulus Y[10] (N/m) : %10.3f " % self.Y10) print("2D Young's modulus Y[01] (N/m) : %10.3f " % self.Y01) print("2D Shear modulus G (N/m) : %10.3f " % self.G2d) print("2D Poisson ratio v[10] : %10.3f " % self.nu10) print("2D Poisson ratio v[01] : %10.3f " % self.nu01) print("-------------------------------------------------------")
#print( # "Note: The elastic stabilty test for 2D systems is not yet implemented. " #) #printer.print_warning_2D()