Page MenuHomec4science

transfer_previous_layer2.py
No OneTemporary

File Metadata

Created
Fri, Oct 18, 15:24

transfer_previous_layer2.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 2 13:47:04 2022
@author: ekinkubilay
"""
import os
import sys
#import h5py
sys.path.insert(0, os.path.join(os.getcwd(), "/home/kubilay/muspectre/build/language_bindings/python"))
sys.path.insert(0, os.path.join(os.getcwd(), "/home/kubilay/muspectre/build/language_bindings/libmufft/python"))
sys.path.insert(0, os.path.join(os.getcwd(), "/home/kubilay/muspectre/build/language_bindings/libmugrid/python"))
print("current working directory: '{}'".format(os.getcwd()))
#import muFFT
import muSpectre as msp
import numpy as np
import muGrid
#from muFFT import Stencils2D
from muFFT import Stencils3D
#import cProfile, pstats
#import time as timer
#from fenics import Mesh, XDMFFile, MeshTransformation, Point
#from petsc4py import PETSc
#import argparse
#import gc
def transfer_previous_layer(layer_no, x_max, y_max, z_max, x_min, y_min, z_min):
from mpi4py import MPI
comm_py = MPI.COMM_SELF
comm = muGrid.Communicator(comm_py)
os.chdir('/scratch/kubilay/mechanical_model/results/mu_layer')
#nb_steps = 20
dim = 3
nb_quad = 1
dx, dy, dz = 0.0002, 0.0003125, 0.00003
z_lim = 0.00801
x_lim = 0.055
z_max -= dz
element_dimensions = [dx, dy, dz]
#nb_domain_grid_pts = [11,11,11]
domain_lengths = [x_lim-x_min,y_max-y_min,z_max-z_lim]
nb_domain_grid_pts = list(np.array(domain_lengths)/np.array(element_dimensions)+1)
nb_domain_grid_pts = [round(i) for i in nb_domain_grid_pts]
#domain_lengths = [x_max-x_min,y_max-y_min,z_max-z_min]
#domain_lengths = [x_max-x_min,y_max-y_min,z_max-z_min]
#element_dimensions = np.array(domain_lengths)/np.array(nb_domain_grid_pts-np.ones(dim))
#define constant material properties
young = 208 #GPa
poisson = 0.3 #unitless
alpha_s = 0.55 #unitless
Delta_E_bs = 1 #eV
epsilon_sat = 0.35 # unitless
sigma_gb = 0.150 #GPa
sigma_s0 = 0.320 #GPa
sigma_f = 1.240 #GPa
## define the convergence tolerance for the Newton-Raphson increment
newton_tol = 1e-6
equil_tol = newton_tol
## tolerance for the solver of the linear cell
cg_tol = 1e-6
maxiter = 1000 # for linear cell solver
#bulk = np.load("bulk.npy")
#coords = np.load("coords.npy")
#nb_domain_grid_pts = np.load("nb_domain_grid_pts.npy")
#domain_lengths = np.load("domain_lengths.npy")
#add base plate at the bottom and vacuum on top and sides
# bulk = np.insert(bulk, nb_domain_grid_pts[2], 0, axis=2)
# nb_domain_grid_pts[2] += 1
# domain_lengths[2] += element_dimensions[2]
# bulk = np.insert(bulk, nb_domain_grid_pts[1], 0, axis=1)
# nb_domain_grid_pts[1] += 1
# domain_lengths[1] += element_dimensions[1]
# bulk = np.insert(bulk, nb_domain_grid_pts[0], 0, axis=0)
# nb_domain_grid_pts[0] += 1
# domain_lengths[0] += element_dimensions[0]
bulk = np.ones(nb_domain_grid_pts)
bulk[:,:,-1] = 0
bulk[:,-1,:] = 0
bulk[-1,:,:] = 0
bulk = np.insert(bulk, 0, 2, axis=2)
nb_domain_grid_pts[2] += 1
domain_lengths[2] += element_dimensions[2]
#x_dim = np.linspace(x_min, x_max, nb_domain_grid_pts[0])
#y_dim = np.linspace(y_min, y_max, nb_domain_grid_pts[1])
#z_dim = np.linspace(z_min-element_dimensions[2], z_max, nb_domain_grid_pts[2])
#coords = np.zeros([nb_domain_grid_pts[0],nb_domain_grid_pts[1],nb_domain_grid_pts[2],3])
#for i in range(nb_domain_grid_pts[0]):
# coords[i,:,:,0] = x_dim[i]
#for i in range(nb_domain_grid_pts[1]):
# coords[:,i,:,1] = y_dim[i]
#for i in range(nb_domain_grid_pts[2]):
# coords[:,:,i,2] = z_dim[i]
cell = msp.cell.CellData.make(list(nb_domain_grid_pts), list(domain_lengths))
cell.nb_quad_pts = nb_quad
cell.get_fields().set_nb_sub_pts("quad", nb_quad)
#define materials
material = msp.material.MaterialHEA_3d.make(cell, "material", young, poisson, alpha_s, Delta_E_bs, epsilon_sat, sigma_gb, sigma_s0, sigma_f)
vacuum = msp.material.MaterialLinearElastic1_3d.make(cell, "vacuum", 0.0, poisson)
base = msp.material.MaterialLinearElastic1_3d.make(cell, "base", 20*young, poisson)
for pixel_index, pixel in enumerate(cell.pixels):
if bulk[tuple(pixel)]==1:
material.add_pixel(pixel_index)
elif bulk[tuple(pixel)]==0:
vacuum.add_pixel(pixel_index)
elif bulk[tuple(pixel)]==2:
base.add_pixel(pixel_index)
gradient = Stencils3D.trilinear_1q_finite_element
weights = nb_quad * [1]
## use solver
krylov_solver = msp.solvers.KrylovSolverCG(cg_tol, maxiter)
solver = msp.solvers.SolverNewtonCG(cell, krylov_solver, msp.Verbosity.Full, newton_tol, equil_tol, maxiter, gradient, weights)
solver.formulation = msp.Formulation.small_strain
solver.initialise_cell()
output_filename = "layer_"+str(layer_no).zfill(3)+".nc"
file_io_object_read = muGrid.FileIONetCDF(output_filename,
muGrid.FileIONetCDF.OpenMode.Read,
comm)
#register fields and field collection
#material_phase = cell.get_fields().register_int_field("material2", 1, 'quad')
#coordinates = cell.get_fields().register_real_field("coordinates", 3, 'quad')
#temperature_field = cell.get_fields().register_real_field("temperature2", 1, 'quad')
#vacuum_strain_field = cell.get_fields().register_real_field("vacuum_strain2", (3,3), "quad")
# register global fields of the cell which you want to write
# print("cell field names:\n", cell.get_field_names())
#cell_field_names = cell.get_field_names()
file_io_object_read.register_field_collection(field_collection=cell.get_fields(),field_names=cell.get_field_names())
file_io_object_read.register_field_collection(field_collection=material.collection)
# register global fields of the cell which you want to write
#print("cell field names:\n", cell.get_field_names())
#cell_field_names = cell.get_field_names()
#file_io_object_read.register_field_collection(field_collection=material.collection)
file_io_object_read.read(
frame=-1,
field_names=["flux","grad", "epsilon_bar", "epsilon_plastic","temperature", "vacuum_strain", "melt_pool"])
material.save_history_variables()
previous_stress = cell.get_fields().get_field('flux').array()
previous_strain = cell.get_fields().get_field('grad').array()
#previous_temperature = cell.get_fields().get_field('temperature2').array()
#previous_vacuum_strain = cell.get_fields().get_field('vacuum_strain2').array()
previous_epsilon_bar = np.insert(cell.get_globalised_current_real_field('epsilon_bar').array(), -1, 0, axis=-1)
#previous_epsilon_bar = previous_epsilon_bar[:,:,sub_dx:sub_dx+sub_gx,sub_dy:sub_dy+sub_gy,sub_dz:sub_dz+sub_gz]
previous_melt_pool = np.insert(cell.get_globalised_internal_int_field('melt_pool').array(), -1, 0, axis=-1)
previous_melt_pool[:,:,-2] = -1
#previous_melt_pool = previous_melt_pool[:,:,sub_dx:sub_dx+sub_gx,sub_dy:sub_dy+sub_gy,sub_dz:sub_dz+sub_gz]
previous_material_temperature = np.insert(cell.get_globalised_internal_real_field('temperature').array(), -1, 0, axis=-1)
#previous_material_temperature = previous_material_temperature[:,:,sub_dx:sub_dx+sub_gx,sub_dy:sub_dy+sub_gy,sub_dz:sub_dz+sub_gz]
#previous_native_stress = np.insert(cell.get_globalised_internal_real_field('native_stress').array(), -1, 0, axis=-1)
#previous_native_stress = previous_native_stress[:,:,sub_dx:sub_dx+sub_gx,sub_dy:sub_dy+sub_gy,sub_dz:sub_dz+sub_gz]
previous_epsilon_plastic = np.insert(cell.get_globalised_current_real_field('epsilon_plastic').array(), -1, 0, axis=-1)
#previous_epsilon_plastic = previous_epsilon_plastic[:,:,sub_dx:sub_dx+sub_gx,sub_dy:sub_dy+sub_gy,sub_dz:sub_dz+sub_gz]
previous_material_vacuum_strain = np.insert(cell.get_globalised_internal_real_field('vacuum_strain').array(), -1, 0, axis=-1)
previous_material_vacuum_strain[:,:,:,:,-2] = previous_strain.reshape((dim*dim, nb_quad) + tuple(nb_domain_grid_pts),order='f')[:,:,:,:,-1]
#previous_material_vacuum_strain = previous_material_vacuum_strain[:,:,sub_dx:sub_dx+sub_gx,sub_dy:sub_dy+sub_gy,sub_dz:sub_dz+sub_gz]
file_io_object_read.close()
return [previous_stress, previous_strain, previous_epsilon_bar, previous_melt_pool, previous_material_temperature, previous_epsilon_plastic, previous_material_vacuum_strain]

Event Timeline