Source code for model_package.Tardigrade_MOOSE.finite_stVK_calculation

import sys
import os
import argparse
import pathlib

import numpy


[docs] def finite_stVK_calculation(diameter=5.0, material_E=250., material_nu=0.2, eps_z=-0.01): '''Solution for uniaxial stress of a cylinder for finite deformation using the St. Venant-Kirchhoff elasticity model :params float diameter: The diameter of the cylinder in millimeters :params float material_E: The elastic modulus in MPa :params float material_nu: The Poisson ratio :params float eps_z: The applied nominal strain in the z-direction :returns: Print various solution quantities to the terminal ''' # Convert to Lame' parameters lamb = (material_E*material_nu)/((1. + material_nu)*(1. - 2.*material_nu)) mu = material_E/(2*(1. + material_nu)) print(f'lambda* = {lamb}') print(f'mu* = {mu}\n') # Applied stretch stretch_z = 1. + eps_z # Solve for lateral stretch term1 = ((3 - stretch_z**2)*0.5*lamb) + mu term2 = lamb + mu stretch_x = numpy.sqrt(term1/term2) print(f'stretch_x = {stretch_x}\n') stretch_y = stretch_x nominal_lateral_strain = stretch_x - 1. lateral_displacement = diameter*nominal_lateral_strain/2 print(f'lateral displacement x = {lateral_displacement}\n') # Construct deformation gradient F = numpy.array([[stretch_x, 0.0, 0.0], [0.0, stretch_y, 0.0], [0.0, 0.0, stretch_z]]) print(f'F = {F}\n') # Misc tensor calculations Ft = numpy.transpose(F) Finv = numpy.linalg.inv(F) J = numpy.linalg.det(F) # Construct Green-Lagrange Strain E = 0.5*(numpy.dot(Ft,F) - numpy.eye(3)) Ekk = numpy.trace(E) print(f'E = {E}') print(f'Ekk = {Ekk}\n') # PK2 S = lamb*Ekk*numpy.eye(3) + 2*mu*E print(f'PK2 = {S}\n') # push forward for Cauchy cauchy = (1./J)*numpy.einsum("kK,KL,Ll->kl", F, S, F) print(f'cauchy = {cauchy}\n') # Calculate Forces initial_area = 0.25*numpy.pi*diameter**2 print(f'initial_area area = {initial_area}') initial_force = initial_area*cauchy[2,2] print(f'Force using initial_area area = {initial_force} N\n') current_area = 0.25*numpy.pi*(diameter*stretch_x)**2 print(f'current area = {current_area}') current_force = current_area*cauchy[2,2] print(f'Force using original area = {current_force} N\n') return current_force, lateral_displacement
def get_parser(): script_name = pathlib.Path(__file__) prog = f"python {script_name.name} " cli_description = "Solution for uniaxial stress of a cylinder for finite deformation using the St. Venant-Kirchhoff elasticity model" parser = argparse.ArgumentParser(description=cli_description, prog=prog) parser.add_argument('--diameter', type=float, required=False, default=5.0, help='The diameter of the cylinder in millimeters') parser.add_argument('--material-E', type=float, required=False, default=250., help='The elastic modulus in MPa') parser.add_argument('--material-nu', type=float, required=False, default=0.2, help='The Poisson ratio') parser.add_argument('--eps-z', type=float, required=False, default=-0.01, help='The applied nominal strain in the z-direction') return parser if __name__ == '__main__': parser = get_parser() args = parser.parse_args() sys.exit(finite_stVK_calculation(diameter=args.diameter, material_E=args.material_E, material_nu=args.material_nu, eps_z=args.eps_z, ))