def __init__(self, gridpts, dtdx, ic, scheme, bc, tmax=50, spaceDomain=[0, 100]): self.grid = mesh(gridpts, dtdx, tmax, spaceDomain) self.grid.Q[:, :, 0] = ic(self.grid.x) self.bc = bc left_bc, right_bc = bc(0, self.grid.Q[:, :, 0]) self.grid.Q[:, 0, 0] = left_bc self.grid.Q[:, -1, 0] = right_bc self.grid.E[:, :, 0] = self.grid.compute_E(0) self.scheme = scheme(self.grid.dtdx, bc)
def convergence_viscoelastic_study(): um1, nodes1, delta_t1, num_of_elements1, u_analytical, nr, uvalues = main( E, v, Q, T, a, b, p_max, tL, tF, mesh_refinement_factor, 10, 2) um2, nodes2, delta_t2, num_of_elements2, u_analytical, nr, uvalues = main( E, v, Q, T, a, b, p_max, tL, tF, mesh_refinement_factor, 8, 4) um3, nodes3, delta_t3, num_of_elements3, u_analytical, nr, uvalues = main( E, v, Q, T, a, b, p_max, tL, tF, mesh_refinement_factor, 5, 5) um4, nodes4, delta_t4, num_of_elements4, u_analytical, nr, uvalues = main( E, v, Q, T, a, b, p_max, tL, tF, mesh_refinement_factor, 2, 15) fig, ax = plt.subplots() ax.scatter(mesh(a, b, 20, 2), u_analytical, c='black', marker='*', label="analytical") ax.plot(nodes1, um1, '--', label=f'time interval={delta_t1}, #elements={num_of_elements1}') ax.plot(nodes2, um2, '--', label=f'time interval={delta_t2}, #elements={num_of_elements2}') ax.plot(nodes3, um3, '--', label=f'time interval={delta_t3}, #elements={num_of_elements3}') ax.plot(nodes4, um4, marker='+', label=f'time interval={delta_t4}, #elements={num_of_elements4}') ax.set_xlabel('Radius(r)') ax.set_ylabel('Displacement(u)') plt.legend() plt.title('Viscoelastic') plt.savefig('convergence_study_viscoelastic.png')
def convergence_elastic_study(): um1, nodes1, delta_t1, num_of_elements1, u_analytical, nr, uvalues = main( E, v, 0, T, a, b, p_max, tL, tF, mesh_refinement_factor, 0.5, 1) um2, nodes2, delta_t2, num_of_elements2, u_analytical, nr, uvalues = main( E, v, 0, T, a, b, p_max, tL, tF, mesh_refinement_factor, 0.5, 2) um3, nodes3, delta_t3, num_of_elements3, u_analytical, nr, uvalues = main( E, v, 0, T, a, b, p_max, tL, tF, mesh_refinement_factor, 0.5, 5) um4, nodes4, delta_t4, num_of_elements4, u_analytical, nr, uvalues = main( E, v, 0, T, a, b, p_max, tL, tF, mesh_refinement_factor, 0.5, 10) fig, ax = plt.subplots() ax.scatter(mesh(a, b, 20, 2), u_analytical, marker='*', c='black', label="analytical") ax.plot(nodes1, um1, '--', label=f'time interval={delta_t1}, #elements={num_of_elements1}') ax.plot(nodes2, um2, '--', label=f'time interval={delta_t2}, #elements={num_of_elements2}') ax.plot(nodes3, um3, '--', label=f'time interval={delta_t3}, #elements={num_of_elements3}') ax.plot(nodes4, um4, label=f'time interval={delta_t4}, #elements={num_of_elements4}') plt.text(56, 0.0465, f'#NR runs for each time step={nr}') ax.set_xlabel('Radius(r)') ax.set_ylabel('Displacement(u)') plt.legend() plt.title('Elastic') plt.savefig('convergence_study_elastic.png')
def main(E, v, Q, T, a, b, p_max, tL, tF, mesh_refinement_factor, delta_t, num_of_elements): """ Global routine using a black box scheme. """ zeeta = 0 rnodes = mesh(a, b, num_of_elements, mesh_refinement_factor) num_of_iterations = np.size(np.arange(0, tF + delta_t, delta_t)) def assignment_matrix(i, num_elements): """Transformation matrix calculation""" A = np.zeros((2, num_elements + 1)) A[0, 0] = 1 A[1, 1] = 1 A[0] = np.roll(A[0], i - 1) A[1] = np.roll(A[1], i - 1) return A ##analytical solution def analytical_elastic(E, v, p, a, b, element_nodes): """Analytical solution""" r = element_nodes return (1 + v) * (p / E) * (a**2 / (b**2 - a**2)) * ((1 - 2 * v) * r + (b**2 / r)) def Infinity_norm(X): """returns Infinity Norm""" return np.linalg.norm(X, np.inf) ##load scaling delta_p = p_max / (tL / delta_t) ps = 0 p = 0 #initialisation of variables. ue = np.zeros((2, 1)) um = np.zeros((num_of_elements + 1, 1)) uk = np.zeros((num_of_elements + 1, 1)) uvalues = np.zeros((num_of_elements + 1, num_of_iterations)) strain_values = np.zeros((num_of_elements + 1, num_of_iterations), dtype=object) over_stress_values = np.zeros((num_of_elements + 1, num_of_iterations), dtype=object) stress_values = np.zeros((num_of_elements + 1, 2)) m = 1 delta_strain = np.zeros((2, 1)) count = 1 for time in np.arange(delta_t, tF + delta_t, delta_t): """Looping in time to find the displacements""" ##load scaling if time < tL: ps = ps + delta_p p = ps else: p = p_max uk = um nr = 0 ##NR runs counter delta_uk = np.zeros((num_of_elements + 1, 1)) um = um * 0 while True: """Newton Rapson for finding the displacement um at the given time""" Kt = np.zeros((num_of_elements + 1, num_of_elements + 1)) Rk = np.zeros((num_of_elements + 1, 1)) F_ext = np.zeros((num_of_elements + 1, 1)) F_int = np.zeros((num_of_elements + 1, 1)) for e in range( 1, num_of_elements + 1 ): ###assembling of internal and external forces and calculating displacements ##elemental structural data calculation element_length = rnodes[e] - rnodes[e - 1] element_nodes = np.reshape( np.asanyarray((rnodes[e - 1], rnodes[e])), (2, 1)) A = assignment_matrix(e, num_of_elements) ue = A @ uk ##elemental material data calculation C_ = C(E, v) N_ = N(0) J_ = J(element_length) B_ = B(N_, element_length, element_nodes) Ct = material_tangent_stiffness(C_, delta_t, Q, T) Kte = tangent_stiffness_matrix(J_, N_, B_, Ct, element_nodes) strain_values[e, m] = strain(B_, ue) delta_strain = strain_values[e, m] - strain_values[e, m - 1] over_stress_values[e, m] = over_stress( Q, over_stress_values[e, m - 1], delta_strain, tL, tF, delta_t, T) stress_ = stress(C_, strain_values[e, m], over_stress_values[e, m]) stress_values[e, 0] = stress( C_, strain_values[e, m], over_stress_values[e, m])[ 0] ##saving sigma rr for result extraction stress_values[e, 1] = stress( C_, strain_values[e, m], over_stress_values[e, m])[ 1] ##saving sigma phi for result extraction ##Elemental forces f_internal_e = f_internal(B_, stress_, N_, J_, element_nodes) f_external_e = f_external(p, a, e) #Tangent stiffness matrix Kt = Kt + ((A.T) @ (Kte) @ (A)) Rk = Rk + A.T @ (f_internal_e - f_external_e) ##Total Forces F_ext = F_ext + A.T @ (f_external_e) F_int = F_int + A.T.dot(f_internal_e) ###Data generation part - part of PPP### f = open('data_linear_elastic.txt', 'a+') G = E / (2 * (1 + v)) #to reduce dimensionality if f_internal_e[0, 0] != 0 and f_internal_e[1, 0] != 0: #print(G,e,p,np.format_float_scientific(f_internal_e[0,0]),np.format_float_scientific(f_internal_e[1,0]),f_external_e[0,0],Kte[0,0],Kte[1,0],Kte[1,1],sep=',', file=f) print(G, e, p, np.format_float_scientific(f_internal_e[0, 0]), sep=',', file=f) f.close() ######### count += 1 delta_uk = -1 * (np.linalg.inv(Kt) @ Rk) um = uk + delta_uk nr = nr + 1 if not Infinity_norm( delta_uk) < 0.005 * Infinity_norm(um) or Infinity_norm( F_int - F_ext) < 0.005 * Infinity_norm( F_int): ##Exit statement as given in question break uvalues[:, m] = np.reshape( um, num_of_elements + 1) ##array of displacement values in each time step m = m + 1 if Q > 0: ##for plotting purposes type_ = 'Viscoelastic' else: type_ = 'Elastic' u_analytical = analytical_elastic(E, v, p, a, b, mesh(a, b, num_of_elements, 2)) ##analytical solution if (abs(u_analytical - um.T)).max() > 1e-10: print('inaccurate solution', abs(u_analytical - um.T).max()) return um, rnodes, delta_t, num_of_elements, u_analytical, nr, uvalues
specie('13C' , specType = 0 , charge=0 , init=1), specie('Na' , specType = 0 , charge=0 , init=1), specie('Mg' , specType = 0 , charge=0 , init=1), specie('Si' , specType = 0 , charge=0 , init=1), specie('Cl' , specType = 0 , charge=0 , init=1), specie('Fe' , specType = 0 , charge=0 , init=1), specie('He' , specType = 0 , charge=0 , init=1), specie('H' , specType = 0 , charge=0 , init=1), specie('M' , specType = -1, charge=0 , init=1), specie('C' , specType = 0 , charge=0 , init=1), specie('N' , specType = 0 , charge=0 , init=1), specie('O' , specType = 0 , charge=0 , init=1), specie('P' , specType = 0 , charge=0 , init=1), specie('S' , specType = 0 , charge=0 , init=1), specie('e-' , specType = 0 , charge=-1, init=1) ] #------------------------------------------------------------------ net = chemicalNetwork(rxnFile, baseSpec, UMISTVER = 'umist99') # reading the species to be removed from a file net.remove_species( underAbunFile = underAbunFile ) net.remove_species( species = removeManual ) # reading the species number and their corresponding indies and abundances from ascii files net.assign_numbers_to_species(fileName = specNumFile) m = mesh(meshFname, chemNet=net, metallicity=metallicity) m.plot(plot_Av_range=[0,30]) pyl.show() print 'done'
def buildBeamMod(modelName, x, z, y, seed, slabSeed): ''' Builds a beam model without step ''' col_height = 3000.0 beam_len = 7500.0 steel = 'DOMEX_S355' concrete = 'Concrete' rebarSteel = steel M=mdb.models[modelName] #=========== Parts ============# #Create Column createColumn(M, height=col_height, mat=steel, partName='COLUMN') #Create Beam createBeam(M, length=beam_len, mat=steel, partName='BEAM') #Create slab createSlab(M, t=200.0, mat=concrete, dim=beam_len, rebarMat=rebarSteel, partName='SLAB') #Add beam fluid inertia to beams and columns airDensity = 1.225e-12 #1.225 kg/m^3 M.sections['HEB300'].setValues(useFluidInertia=ON, fluidMassDensity=airDensity, crossSectionRadius=300.0, lateralMassCoef=1.0) M.sections['HUP300x300'].setValues(useFluidInertia=ON, fluidMassDensity=airDensity, crossSectionRadius=300.0, lateralMassCoef=1.0) #=========== Sets and surfaces ============# #A lot of surfaces are created with the joints createSets(M, col_height) createSurfs(M) #=========== Assembly ============# createAssembly(M, x, z, y, x_d = beam_len, z_d = beam_len, y_d = col_height) #=========== Mesh ============# mesh(M, seed, slabSeed) #=========== Joints ============# createJoints(M, x, z, y, x_d = beam_len, z_d = beam_len, y_d = col_height) #=========== Fix column base ============# mergeColBase(M,x,z) M.DisplacementBC( createStepName='Initial', name='fixColBases', region= M.rootAssembly.sets['col-bases'], u1=0.0, u2=0.0, u3=0.0, ur1=0.0, ur2=0.0, ur3=0.0)
# run with ./pyfem boxes_union_ng.py from mesh import * # define mesher parameters and outer box m = mesh(frequency=100, rod_length=0.7, bbox=[[-2.0, -2.0, -2.0], [2.0, 2.0, 2.0]]) # create a first box box1 = box(coords=[[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]], shifting=[-0.5, -0.5, -0.5]) # create a secod box box2 = box(coords=[[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]], shifting=[-0.0, -0.0, -0.0]) # unite them box3 = box1.unite(box2) # mesh the union m.mesh_it([box3], visual=True, save=["box_example_ng.ps", "/tmp/box_example_ng.vtk"])
def main(E, v, Q, T, a, b, p_max, tL, tF, mesh_refinement_factor, delta_t, num_of_elements): zeeta = 0 rnodes = mesh(a, b, num_of_elements, mesh_refinement_factor) num_of_iterations = np.size(np.arange(0, tF + delta_t, delta_t)) def assignment_matrix(i, num_elements): """Transformation matrix calculation""" A = np.zeros((2, num_elements + 1)) A[0, 0] = 1 A[1, 1] = 1 A[0] = np.roll(A[0], i - 1) A[1] = np.roll(A[1], i - 1) return A ##analytical solution def analytical_elastic(E, v, p, a, b, element_nodes): """Analytical solution""" r = element_nodes return (1 + v) * (p / E) * (a**2 / (b**2 - a**2)) * ((1 - 2 * v) * r + (b**2 / r)) def Infinity_norm(X): """returns Infinity Norm""" return np.linalg.norm(X, np.inf) ##load scaling delta_p = p_max / (tL / delta_t) ps = 0 p = 0 ue = np.zeros((2, 1)) um = np.zeros((num_of_elements + 1, 1)) uk = np.zeros((num_of_elements + 1, 1)) uvalues = np.zeros((num_of_elements + 1, num_of_iterations)) strain_values = np.zeros((num_of_elements + 1, num_of_iterations), dtype=object) over_stress_values = np.zeros((num_of_elements + 1, num_of_iterations), dtype=object) stress_values = np.zeros((num_of_elements + 1, 2)) m = 1 delta_strain = np.zeros((2, 1)) for time in np.arange(delta_t, tF + delta_t, delta_t): """Looping in time to find the displacements""" ##load scaling if time < tL: ps = ps + delta_p p = ps else: p = p_max uk = um nr = 0 ##NR runs counter delta_uk = np.zeros((num_of_elements + 1, 1)) um = um * 0 while True: """Newton Rapson for finding the displacement um at the given time""" Kt = np.zeros((num_of_elements + 1, num_of_elements + 1)) Rk = np.zeros((num_of_elements + 1, 1)) F_ext = np.zeros((num_of_elements + 1, 1)) F_int = np.zeros((num_of_elements + 1, 1)) for e in range( 1, num_of_elements + 1 ): ###assembling of internal and external forces and calculating displacements start_time = ti.time() ##elemental structural data calculation element_length = rnodes[e] - rnodes[e - 1] element_nodes = np.reshape( np.asanyarray((rnodes[e - 1], rnodes[e])), (2, 1)) A = assignment_matrix(e, num_of_elements) ue = A @ uk ##elemental material data calculation element_start_time = ti.time() C_ = C(E, v) N_ = N(0) J_ = J(element_length) B_ = B(N_, element_length, element_nodes) Ct = material_tangent_stiffness(C_, delta_t, Q, T) Kte = tangent_stiffness_matrix(J_, N_, B_, Ct, element_nodes) strain_values[e, m] = strain(B_, ue) delta_strain = strain_values[e, m] - strain_values[e, m - 1] over_stress_values[e, m] = over_stress( Q, over_stress_values[e, m - 1], delta_strain, tL, tF, delta_t, T) stress_ = stress(C_, strain_values[e, m], over_stress_values[e, m]) stress_values[e, 0] = stress( C_, strain_values[e, m], over_stress_values[e, m])[ 0] ##saving sigma rr for result extraction stress_values[e, 1] = stress( C_, strain_values[e, m], over_stress_values[e, m])[ 1] ##saving sigma phi for result extraction ##Elemental forces f_internal_e = f_internal(B_, stress_, N_, J_, element_nodes) f_external_e = f_external(p, a, e) element_end_time = ti.time() print('element_duration', (element_end_time - element_start_time), e) Kt = Kt + ((A.T) @ (Kte) @ (A)) Rk = Rk + A.T @ (f_internal_e - f_external_e) ##Total Forces F_ext = F_ext + A.T @ (f_external_e) F_int = F_int + A.T.dot(f_internal_e) elaspsed_time = start_time - ti.time() print('total time =', elaspsed_time) delta_uk = -1 * (np.linalg.inv(Kt) @ Rk) um = uk + delta_uk nr = nr + 1 if not Infinity_norm(delta_uk) < 0.005 * Infinity_norm( um) or Infinity_norm(Rk) < 0.005 * Infinity_norm( F_int): ##Exit statement as given in question break uvalues[:, m] = np.reshape( um, num_of_elements + 1) ##array of displacement values in each time step m = m + 1 f = open('results.txt', 'w') ##writing to output file print("At final loading(tf):\n\n", "Stresses\n\n\nRadial Stress(Sigma_rr):\n\n", stress_values[1:, 0], "\n\nCircumfrential Stress(Sigma_phi):\n\n", stress_values[1:, 1], file=f) print("\n\nDisplacements\n\nU(r):\n ", um.T, file=f) if Q > 0: ##for plotting purposes type_ = 'Viscoelastic' else: type_ = 'Elastic' u_analytical = analytical_elastic(E, v, p, a, b, mesh(a, b, 20, 2)) ##analytical solution fig, ax = plt.subplots() ax.scatter(mesh(a, b, 20, mesh_refinement_factor), u_analytical, marker='*', c='green', label="analytical") ax.plot(rnodes, um, marker='+', color='orange', label="fea") ax.set_xlabel('Radius(r)') ax.set_ylabel('Displacement(u)') plt.text(60, 0.047, f'Time Interval(s)={delta_t}') plt.text(60, 0.049, f'Number of elements={num_of_elements}') plt.title(f'Convergence - {type_}') plt.legend() plt.savefig('convergence.png') return um, rnodes, delta_t, num_of_elements, u_analytical, nr, uvalues
def buildBeamMod(modelName, x, z, y, seed, slabSeed): ''' Builds a beam model without step ''' col_height = 3000.0 beam_len = 7500.0 steel = 'DOMEX_S355' concrete = 'Concrete' rebarSteel = steel M = mdb.models[modelName] #=========== Parts ============# #Create Column createColumn(M, height=col_height, mat=steel, partName='COLUMN') #Create Beam createBeam(M, length=beam_len, mat=steel, partName='BEAM') #Create slab createSlab(M, t=200.0, mat=concrete, dim=beam_len, rebarMat=rebarSteel, partName='SLAB') #Add beam fluid inertia to beams and columns airDensity = 1.225e-12 #1.225 kg/m^3 M.sections['HEB300'].setValues(useFluidInertia=ON, fluidMassDensity=airDensity, crossSectionRadius=300.0, lateralMassCoef=1.0) M.sections['HUP300x300'].setValues(useFluidInertia=ON, fluidMassDensity=airDensity, crossSectionRadius=300.0, lateralMassCoef=1.0) #=========== Sets and surfaces ============# #A lot of surfaces are created with the joints createSets(M, col_height) createSurfs(M) #=========== Assembly ============# createAssembly(M, x, z, y, x_d=beam_len, z_d=beam_len, y_d=col_height) #=========== Mesh ============# mesh(M, seed, slabSeed) #=========== Joints ============# createJoints(M, x, z, y, x_d=beam_len, z_d=beam_len, y_d=col_height) #=========== Fix column base ============# mergeColBase(M, x, z) M.DisplacementBC(createStepName='Initial', name='fixColBases', region=M.rootAssembly.sets['col-bases'], u1=0.0, u2=0.0, u3=0.0, ur1=0.0, ur2=0.0, ur3=0.0)
# run with ./pyfem fixed_points_2d.py from mesh import * # define mesher parameters and outer box m = mesh(frequency = 1000, rod_length = 0.5, bbox = [[-4.0,-4.0],[4.0,4.0]]) m.fixed_points = [[0.,0.],[-0.5,0.],[-0.5,0.5],[0.,0.5]] box1 = box(coords=[[0.0,0.0],[1.0,2.0]]) a = m.mesh_it([box1],visual=False, save=["fixed_points.ps"])