Figure 11#

Imports#

import dolfin
import matplotlib.pyplot as plt
import numpy
import seaborn
import sympy
import sys

import dolfin_mech                    as dmech
import micro_poro_structure_generator as gen

Parameters#

Geometry#

seeds_filename = "Fig11-seeds.dat"
mesh_filebasename = "Fig11-mesh"

domain_y = 1.
domain_x = domain_y * numpy.sqrt(3)/1.5/2
thickness = 0.092

gen.generate_seeds_semi_regular(
    DoI=0.,
    row=1,
    domain_y=domain_y,
    seeds_filename=seeds_filename)
gen.generate_mesh_2D_rectangle_w_voronoi_inclusions(
    mesh_filename=mesh_filebasename,
    seeds_filename=seeds_filename,
    h=thickness,
    lcar=thickness/5,
    domain_x=domain_x,
    domain_y=domain_y,
    shift_y=0.,
    remove_seeds=True)

mesh = dolfin.Mesh()
dolfin.XDMFFile(mesh_filebasename+".xdmf").read(mesh)

mesh_coord = mesh.coordinates()
mesh_xmax = max(mesh_coord[:,0]); mesh_xmin = min(mesh_coord[:,0])
mesh_ymax = max(mesh_coord[:,1]); mesh_ymin = min(mesh_coord[:,1])
mesh_bbox = [mesh_xmin, mesh_xmax, mesh_ymin, mesh_ymax]
mesh_bbox_V0 = (mesh_xmax-mesh_xmin) * (mesh_ymax-mesh_ymin)

Solid material parameters#

Es  = 1.
nus = 0.499
mat_params = {"model":"CGNH", "parameters":{"E":Es, "nu":nus}}

Loading#

beta = 1.25
pf_lst = [0.0, 0.2]

Symbolic expression of the macroscopic model response#

lmbda_macro, mu_macro = sympy.symbols("lambda, mu")

C_macro = sympy.MatrixSymbol("C", 3, 3).as_explicit()
I_C_macro = sympy.trace(C_macro)
III_C_macro = sympy.det(C_macro)
J_macro = sympy.sqrt(III_C_macro)

pf = sympy.symbols("p_f")
W_skel  = (lmbda_macro/4) * (J_macro**2 - 1 - 2*sympy.ln(J_macro))
W_skel += (mu_macro/2) * (I_C_macro - 3 - 2*sympy.ln(J_macro))

Sigma_macro  = 2*sympy.diff(W_skel, C_macro)
Sigma_macro -= pf * J_macro * C_macro.inv()

p_hydro_macro = - sympy.trace(Sigma_macro.T * C_macro)/3/J_macro

Sigma_D_macro = Sigma_macro + p_hydro_macro * J_macro * C_macro.inv()
Sigma_VM_macro = sympy.sqrt(3/2 * sympy.trace(Sigma_D_macro.T * Sigma_D_macro))

Computing macroscopic model response#

F = sympy.Matrix(
    [[beta, 0     , 0],\
     [0   , 1/beta, 0],\
     [0   , 0     , 1]])
J = F.det()
C = F.T * F

p_hydro_macro = p_hydro_macro.subs(list(zip(C_macro, C)))
Sigma_VM_macro = Sigma_VM_macro.subs(list(zip(C_macro, C)))
homogenization_problem = dmech.HomogenizationProblem(
    dim=2,
    mesh=mesh,
    mat_params=mat_params["parameters"],
    vol=mesh_bbox_V0,
    bbox=mesh_bbox)
lmbda_tilde, mu_tilde = homogenization_problem.get_lambda_and_mu()

p_hydro_macro = p_hydro_macro.subs(lmbda_macro, lmbda_tilde).subs(mu_macro, mu_tilde)
Sigma_VM_macro = Sigma_VM_macro.subs(lmbda_macro, lmbda_tilde).subs(mu_macro, mu_tilde)
p_hydro_macro_lst = []
Sigma_VM_macro_lst = []
for pf_ in pf_lst:
    p_hydro_macro_lst.append(p_hydro_macro.subs(pf, pf_))
    Sigma_VM_macro_lst.append(Sigma_VM_macro.subs(pf, pf_))
p_hydro_macro_lst

Computing microscopic model response#

p_hydro_micro_lst = []
Sigma_VM_micro_lst = []

for pf_ in pf_lst:
    load_params = {}
    load_params["U_bar_00"] = beta-1
    load_params["sigma_bar_01"] = 0.
    load_params["sigma_bar_10"] = 0.
    load_params["U_bar_11"] = 1/beta-1
    load_params["pf"] = pf_

    step_params = {}
    step_params["Deltat"] = 1.
    step_params["dt_ini"] = 0.1
    step_params["dt_min"] = 0.01
    step_params["dt_max"] = 0.1

    res_basename = "Fig11"
    qois_filename = res_basename+"-qois.dat"

    problem = dmech.run_HollowBox_MicroPoroHyperelasticity(
        dim=2,
        mesh=mesh,
        displacement_perturbation_degree=2,
        quadrature_degree=4,
        mat_params=mat_params,
        load_params=load_params,
        step_params=step_params,
        res_basename=res_basename,
        add_p_hydro_and_Sigma_VM_FoI=True,
        verbose=1)

    p_hydro_micro_lst.append(problem.get_foi("p_hydro").func.vector().get_local())
    Sigma_VM_micro_lst.append(problem.get_foi("Sigma_VM").func.vector().get_local())

Generating plots#

Hydrostatic pressure distribution#

pf_min = -0.3
pf_max = +0.3
for (pf, p_hydro_micro, p_hydro_macro) in zip(pf_lst, p_hydro_micro_lst, p_hydro_macro_lst):
    plt.figure()
    plt.rc("xtick", labelsize=14)
    plt.rc("ytick", labelsize=14)
    plt.rc("legend", fontsize=12)
    plt.xlabel("Hydrostatic pressure (kPa)", fontsize=16)
    plt.ylabel("Frequency distribution"    , fontsize=16)
    seaborn.histplot(
        p_hydro_micro,
        bins=51,
        binrange=[pf_min, pf_max],
        color="#084594",
        stat="density",
        kde=True,
        kde_kws=dict(cut=3, bw_adjust=0.9),
        alpha=0.4,
        edgecolor=(1, 1, 1, 0.4))
    plt.axvline(
        x=p_hydro_macro,
        color="#99000D",
        label="axvline - full height")
    plt.legend(
        ["Microscopic model",\
        "Macroscopic model"])
    plt.xlim(pf_min, pf_max)
    plt.ylim(0., 17.)
    plt.savefig("Fig11-p_hydro_density_pf="+str(pf)+".pdf", bbox_inches="tight")
    plt.show()

Von Mises stress distribution#

Sigma_VM_min = 0.0
Sigma_VM_max = 0.5
for (pf, Sigma_VM_micro, Sigma_VM_macro) in zip(pf_lst, Sigma_VM_micro_lst, Sigma_VM_macro_lst):
    plt.figure()
    plt.rc("xtick", labelsize=14)
    plt.rc("ytick", labelsize=14)
    plt.rc("legend", fontsize=12)
    plt.xlabel("Von Mises stress (kPa)", fontsize=16)
    plt.ylabel("Frequency distribution", fontsize=16)
    seaborn.histplot(
        Sigma_VM_micro,
        bins=51,
        binrange=[Sigma_VM_min, Sigma_VM_max],
        color="#084594",
        stat="density",
        kde=True,
        kde_kws=dict(cut=0, bw_adjust=0.6),
        alpha=0.4,
        edgecolor=(1, 1, 1, 0.4))
    plt.axvline(
        x=Sigma_VM_macro,
        color="#99000D",
        label="axvline - full height")
    plt.legend(
        ["Microscopic model",\
        "Macroscopic model"])
    plt.xlim(Sigma_VM_min, Sigma_VM_max)
    plt.ylim(0., 20.)
    plt.savefig("Fig11-Sigma_VM_density_pf="+str(pf)+".pdf", bbox_inches="tight")
    plt.show()