def test_nastran_importer(self): from spyfe.fields.nodal_field import NodalField from spyfe.meshing.importers import nastran_importer from spyfe.fesets.volumelike import FESetT4, FESetT10 from spyfe.meshing.exporters.vtkexporter import vtkexport fens, feslist = nastran_importer.import_mesh('Slot-coarser.nas') print(feslist[0].count()) geom = NodalField(fens=fens) vtkexport("test_nastran_importer", feslist[0], geom) print('Done')
def test_Abaqus_importer(self): from spyfe.fields.nodal_field import NodalField from spyfe.meshing.importers import abaqus_importer from spyfe.meshing.exporters.vtkexporter import vtkexport fens, feslist = abaqus_importer.import_mesh('LE11_H20.inp') for fes in feslist: print(fes.count()) fes = feslist[0] geom = NodalField(fens=fens) vtkexport("test_Abaqus_importer", fes, geom) print('Done')
def test_Q8_meshing(self): from spyfe.fields.nodal_field import NodalField from spyfe.meshing.exporters.vtkexporter import vtkexport from spyfe.meshing.generators.quadrilaterals import q4_block, q4_to_q8 N = 2 Length, Width, nL, nW = 10.0, 7.0, N, N fens, fes = q4_block(Length, Width, nL, nW) fens, fes = q4_to_q8(fens, fes) print(fes.conn) geom = NodalField(fens=fens) vtkexport("test_Q8_meshing_mesh", fes, geom)
def plot_temperature(model_data): file = 'temp' if 'postprocessing' in model_data: if 'file' in model_data['postprocessing']: file = model_data['postprocessing']['file'] for r in range(len(model_data['regions'])): region = model_data['regions'][r] femm = region['femm'] vtkexport(file + str(r), femm.fes, model_data['geom'], {'temperature': model_data['temp']}) return True
def plot_stress(model_data): file = 'displacement' if 'postprocessing' in model_data: if 'file' in model_data['postprocessing']: file = model_data['postprocessing']['file'] for r in range(len(model_data['regions'])): region = model_data['regions'][r] femm = region['femm'] vtkexport(file + str(r), femm.fes, model_data['geom'], {'displacement': model_data['u']}) return True
def plot_stress(model_data): """Algorithm for plotting stress results. :param model_data: Model data dictionary. model_data['fens'] = finite element node set (mandatory) For each region (connected piece of the domain made of a particular material), mandatory: model_data['regions']= list of dictionaries, one for each region Each region: region['femm'] = finite element set that covers the region (mandatory) For essential boundary conditions (optional): model_data['boundary_conditions']['essential']=list of dictionaries, one for each application of an essential boundary condition. For each EBC dictionary ebc: ebc['node_list'] = node list, ebc['comp'] = displacement component (zero-based), ebc['value'] = function to supply the prescribed value, default is lambda x: 0.0 :return: Success? True or false. The model_data object is modified. model_data['geom'] =the nodal field that is the geometry model_data['temp'] =the nodal field that is the computed temperature model_data['timings'] = timing of the individual operations """ file = 'stresses' if 'postprocessing' in model_data: if 'file' in model_data['postprocessing']: file = model_data['postprocessing']['file'] outcs = model_data['postprocessing']['outcs'] if 'outcs' in model_data['postprocessing']\ else CSys() geom = model_data['geom'] u = model_data['u'] dtemp = model_data['dtemp'] if 'dtemp' in model_data else None for r in range(len(model_data['regions'])): region = model_data['regions'][r] femm = region['femm'] stresses = femm.nodal_field_from_integr_points( geom, u, u, dtempn1=dtemp, output=OUTPUT_CAUCHY, component=[0, 1, 2, 3, 4, 5], outcs=outcs) vtkexport(file + str(r), femm.fes, model_data['geom'], { 'displacement': u, 'stresses': stresses }) return True
def plot_mesh(model_data): """Generate a VTK file for the plotting of the mesh. :param model_data: model dictionary, the following keys need to have values: model_data['fens'] model_data['regions'] :return: Boolean """ file = 'mesh' if 'postprocessing' in model_data: if 'file' in model_data['postprocessing']: file = model_data['postprocessing']['file'] fens = model_data['fens'] geom = NodalField(fens=fens) for r in range(len(model_data['regions'])): region = model_data['regions'][r] femm = region['femm'] vtkexport(file + str(r), femm.fes, geom) return True
def test_fusing_nodes(self): import numpy from spyfe.fields.nodal_field import NodalField from spyfe.meshing.exporters.vtkexporter import vtkexport from spyfe.meshing.generators.quadrilaterals import q4_block, q4_to_q8 from spyfe.meshing.modification import fuse_nodes, merge_meshes N = 10 Length, Width, nL, nW = 2.0, 3.0, N, N fens, fes = q4_block(Length, Width, nL, nW) fens1, fes1 = q4_to_q8(fens, fes) fens1.xyz[:, 0] += Length fens, fes = q4_block(Length, Width, nL, nW) fens2, fes2 = q4_to_q8(fens, fes) tolerance = Length / 1000 fens, new_indexes_of_fens1_nodes = fuse_nodes(fens1, fens2, tolerance) print(fens.xyz) print(new_indexes_of_fens1_nodes) fens, fes1, fes2 = merge_meshes(fens1, fes1, fens2, fes2, tolerance) fes = fes1.cat(fes2) print(fens.xyz) print(fes.conn) geom = NodalField(fens=fens) vtkexport("test_fusing_nodes_mesh", fes, geom)
start = time.time() K = femm.stiffness(geom, u) print('Matrix assembly', time.time() - start) start = time.time() U, info = minres(K, F) print(info) u.scatter_sysvec(U) print('Solution', time.time() - start) # print('Done', time.time() - start0) tipn = fenode_select(fens, box=[0, W, L, L, 0, H]) uv = u.values[tipn, :] uz = sum(uv[:, 2]) / len(tipn) print('Tip displacement uz =', uz, ', ', (uz / uzex * 100), ' %') stresses = femm.nodal_field_from_integr_points(geom, u, u, output=OUTPUT_CAUCHY, component=[0, 1, 2, 3, 4, 5]) # vtkexport("rltb3d_H8_results", fes, geom, flds={ "displacements": u, 'Cauchy': stresses })
start = time.time() K = femm.stiffness(geom, u) print('Matrix assembly', time.time() - start) start = time.time() U, info = minres(K, F) print(info) u.scatter_sysvec(U) print('Solution', time.time() - start) # print('Done', time.time() - start0) tipn = fenode_select(fens, box=[0, W, L, L, 0, H]) uv = u.values[tipn, :] uz = sum(uv[:, 2]) / len(tipn) print('Tip displacement uz =', uz, ', ', (uz / uzex * 100), ' %') stresses = femm.nodal_field_from_integr_points(geom, u, u, output=OUTPUT_CAUCHY, component=[0, 1, 2, 3, 4, 5]) # vtkexport("beamiso_H8_results", fes, geom, flds={ "displacement": u, 'Cauchy': stresses })
lu = splu(K) del K U = lu.solve(F) u.scatter_sysvec(U) print('Solution', time.time() - start) # print('Done', time.time() - start0) stresses = femm.nodal_field_from_integr_points(geom, u, u, dtempn1=dT, output=OUTPUT_CAUCHY, component=[0, 1, 2, 3, 4, 5]) pointA = fenode_select( fens, box=[707.107E-03, 707.107E-03, -707.107E-03, -707.107E-03, 0., 0.], inflate=htol) print(pointA) sigzzA = stresses.values[pointA, 2] print('Stress sigz @ A=', sigzzA / 1.e6, ', ', (sigzzA / sigma_z_A_ref * 100), ' %') # stresses.values /= 1.0e6 vtkexport("LE11_H8_90deg_results", fes, geom, { "displacements": u, 'dT': dT, 'stresses': stresses })
from spyfe.femms.femm_heatdiff import FEMMHeatDiff from spyfe.fields.nodal_field import NodalField from spyfe.fields.gen_field import GenField from spyfe.integ_rules import TriRule from spyfe.force_intensity import ForceIntensity from scipy.sparse.linalg import spsolve, minres import time from spyfe.meshing.exporters.vtkexporter import vtkexport Length, Width, nL, nW = 10.0, 10.0, 7, 8 fens, fes = t3_ablock(Length, Width, nL, nW) geom = NodalField(nfens=fens.count(), dim=3) for index in range(fens.count()): for j in range(2): geom.values[index, j] = fens.xyz[index, j] vtkexport("show_basis_funcs-geom", fes, geom) bf1 = GenField(data=geom.values) bf1.values[0, 2] = 1.0 vtkexport("show_basis_funcs-bf1", fes, bf1) bf13 = GenField(data=geom.values) bf13.values[12, 2] = 1.0 vtkexport("show_basis_funcs-bf13", fes, bf13) bf16 = GenField(data=geom.values) bf16.values[15, 2] = 1.0 vtkexport("show_basis_funcs-bf16", fes, bf16) bf30 = GenField(data=geom.values) bf30.values[29, 2] = 1.0
start = time.time() femmm = FEMMDeforLinear(material=m, fes=fes, integration_rule=GaussRule(dim=3, order=3)) M = femmm.mass(geom, u) M = (M.T + M) / 2. print('Mass assembly', time.time() - start) start = time.time() v = numpy.random.rand(u.nfreedofs, 10) tol = 1.e-3 maxiter = 20 shift = (2 * math.pi * 0.2)**2 lamb, v, converged = gepbinvpwr2(K + shift * M, M, v, tol, maxiter) if converged: lamb -= shift ix = numpy.argsort(numpy.abs(lamb)) lamb = lamb[ix].real v = v[:, ix] print([math.sqrt(om) / 2.0 / math.pi for om in lamb]) print('Solution', time.time() - start) u.scatter_sysvec(v[:, 6].real) vtkexport("unit_cube_h20_results", fes, geom, {"displacements": u}) else: print('Not converged!') print('Done', time.time() - start0) #
print(F) print('Load vector assembly', time.time() - start) start = time.time() # U, info = lgmres(K, F) # print(info) lu = splu(K) del K U = lu.solve(F) u.scatter_sysvec(U) print('Solution', time.time() - start) # print('Done', time.time() - start0) stresses = femm.nodal_field_from_integr_points(geom, u, u, dtempn1=dT, output=OUTPUT_CAUCHY, component=[0, 1, 2, 3, 4, 5]) pointA = fenode_select(fens, box=[0, 0, 0, 0, 0., 0.], inflate=htol) sigxA = stresses.values[pointA, 0] print('Stress sigx @ A=', sigxA, ', ', (sigxA / sigma_x_A_ref * 100), ' %') # vtkexport("simple_thermal_expansion", fes, geom, { "displacements": u, 'stresses': stresses })
dtemp = NodalField(nfens=fens.count(), dim=1) dtemp.fun_set_values(fens.xyz, lambda x: math.sqrt(x[0] ** 2 + x[1] ** 2) + x[2]) print(numpy.max(dtemp.values)) print(numpy.min(dtemp.values)) F = femm.thermal_strain_loads(geom, u, dtemp) print('Load vector assembly', time.time() - start) print(numpy.max(F), numpy.min(F)) start = time.time() # U, info = lgmres(K, F) # print(info) lu = splu(K) del K U = lu.solve(F) u.scatter_sysvec(U) print('Solution', time.time() - start) # print('Done', time.time() - start0) stresses = femm.nodal_field_from_integr_points_spr(geom, u, u, dtempn1=dtemp, output=OUTPUT_CAUCHY, component=[0, 1, 2, 3, 4, 5]) pointA = fenode_select(fens, box=[707.107E-03, 707.107E-03, -707.107E-03, -707.107E-03, 0., 0.], inflate=htol) print(pointA) sigzzA = stresses.values[pointA, 2] print('Stress sigz @ A=', sigzzA / 1.e6, ', ', (sigzzA / sigma_z_A_ref * 100), ' %') # stresses.values /= 1.0e6 vtkexport("LE11_H20_90deg_results", fes, geom, {"displacements": u, 'dtemp': dtemp, 'stresses': stresses})
start = time.time() K = femm.stiffness(geom, u) print('Matrix assembly', time.time() - start) start = time.time() # U, info = lgmres(K, F) # print(info) lu = splu(K) del K U = lu.solve(F) #R = cho_factor(K, overwrite_a=True) #y = spsolve(R, spsolve(R.T, F)) # U = spsolve(K, F) # import scipy.sparse.linalg as spla # ilu = spilu(K, diag_pivot_thresh=0.0, fill_factor=1000) # M = spla.LinearOperator(K.shape, ilu.solve) # U, info = lgmres(K, F, x0=ilu.solve(F), M=M) #, callback=lambda x: print('iteration', numpy.linalg.norm(x-U))) # print(info) u.scatter_sysvec(U) print('Solution', time.time() - start) # print('Done', time.time() - start0) tipn = fenode_select(fens, box=[0, W, L, L, 0, H]) uv = u.values[tipn, :] uz = sum(uv[:, 2]) / len(tipn) print('Tip displacement uz =', uz, ', ', (uz / uzex * 100), ' %') # vtkexport("rltb3dms_H8_results", fes, geom, u, fldname="displacements")
for index in cn: temp.set_ebc([index], val=boundaryf(fens.xyz[index, 0], fens.xyz[index, 1])) temp.apply_ebc() femm = FEMMHeatDiff(material=m, fes=fes, integration_rule=GaussRule(dim=2, order=3)) # S = femm.connection_matrix(geom) # perm = reverse_cuthill_mckee(S,symmetric_mode=True) # temp.numberdofs(node_perm=perm) temp.numberdofs() start = time.time() fi = ForceIntensity(magn=lambda x, J: Q) F = femm.distrib_loads(geom, temp, fi, 3) print('Heat generation load', time.time() - start) start = time.time() F += femm.nz_ebc_loads_conductivity(geom, temp) print('NZ EBC load', time.time() - start) start = time.time() K = femm.conductivity(geom, temp) print('Matrix assembly', time.time() - start) start = time.time() temp.scatter_sysvec(spsolve(K, F)) print('Solution', time.time() - start) print('Done', time.time() - start0) # print(temp.values.T) vtkexport("Poisson_fe_Q8_results", fes, geom, {"temp": temp})
print('Load vector assembly', time.time() - start) print(numpy.max(F), numpy.min(F)) start = time.time() # U, info = lgmres(K, F) # print(info) lu = splu(K) del K U = lu.solve(F) u.scatter_sysvec(U) print('Solution', time.time() - start) # print('Done', time.time() - start0) stresses = femm.nodal_field_from_integr_points_spr( geom, u, u, dtempn1=dT, output=OUTPUT_CAUCHY, component=[0, 1, 2, 3, 4, 5]) pointA = fenode_select( fens, box=[707.107E-03, 707.107E-03, -707.107E-03, -707.107E-03, 0., 0.], inflate=htol) print(pointA) sigzzA = stresses.values[pointA, 2] print('Stress sigz @ A=', sigzzA / 1.e6, ', ', (sigzzA / sigma_z_A_ref * 100), ' %') # stresses.values /= 1.0e6 vtkexport("LE11_H20_90deg_u", fes, geom, {"displacements": u}) vtkexport("LE11_H20_90deg_dT", fes, geom, {'dT': dT}) vtkexport("LE11_H20_90deg_s", fes, geom, {'stresses': stresses})
start = time.time() K = femm.stiffness(geom, u) print('Matrix assembly', time.time() - start) start = time.time() # U, info = lgmres(K, F) # print(info) lu = splu(K) del K U = lu.solve(F) #R = cho_factor(K, overwrite_a=True) #y = spsolve(R, spsolve(R.T, F)) # U = spsolve(K, F) # import scipy.sparse.linalg as spla # ilu = spilu(K, diag_pivot_thresh=0.0, fill_factor=1000) # M = spla.LinearOperator(K.shape, ilu.solve) # U, info = lgmres(K, F, x0=ilu.solve(F), M=M) #, callback=lambda x: print('iteration', numpy.linalg.norm(x-U))) # print(info) u.scatter_sysvec(U) print('Solution', time.time() - start) # print('Done', time.time() - start0) tipn = fenode_select(fens, box=[0, W, L, L, 0, H]) uv = u.values[tipn, :] uz = sum(uv[:, 2]) / len(tipn) print('Tip displacement uz =', uz, ', ', (uz / uzex * 100), ' %') # vtkexport("rltb3dms_QT10MS_results", fes, geom, {"displacements": u})
Length, Width, nL, nW = 1.0, 1.0, N, N fens, fes = t3_ablock(Length, Width, nL, nW) print('Mesh generation', time.time() - start) bfes = mesh_boundary(fes) cn = connected_nodes(bfes) geom = NodalField(fens=fens) temp = NodalField(nfens=fens.count(), dim=1) for index in cn: temp.set_ebc([index], val=boundaryf(fens.xyz[index, 0], fens.xyz[index, 1])) temp.apply_ebc() temp.numberdofs() femm = FEMMHeatDiff(material=m, fes=fes, integration_rule=TriRule(npts=1)) start = time.time() fi = ForceIntensity(magn=lambda x, J: Q) F = femm.distrib_loads(geom, temp, fi, 3) print('Heat generation load', time.time() - start) start = time.time() F += femm.nz_ebc_loads_conductivity(geom, temp) print('NZ EBC load', time.time() - start) start = time.time() K = femm.conductivity(geom, temp) print('Matrix assembly', time.time() - start) start = time.time() temp.scatter_sysvec(spsolve(K, F)) print('Solution', time.time() - start) print(temp.values) print('Done', time.time() - start0) vtkexport("Poisson_fe_results", fes, geom, temp, fldname="temp")
start = time.time() K = femm.stiffness(geom, u) print('Matrix assembly', time.time() - start) start = time.time() # U, info = lgmres(K, F) # print(info) lu = splu(K) del K U = lu.solve(F) #R = cho_factor(K, overwrite_a=True) #y = spsolve(R, spsolve(R.T, F)) # U = spsolve(K, F) # import scipy.sparse.linalg as spla # ilu = spilu(K, diag_pivot_thresh=0.0, fill_factor=1000) # M = spla.LinearOperator(K.shape, ilu.solve) # U, info = lgmres(K, F, x0=ilu.solve(F), M=M) #, callback=lambda x: print('iteration', numpy.linalg.norm(x-U))) # print(info) u.scatter_sysvec(U) print('Solution', time.time() - start) # print('Done', time.time() - start0) tipn = fenode_select(fens, box=[0, W, L, L, 0, H]) uv = u.values[tipn, :] uz = sum(uv[:, 2]) / len(tipn) print('Tip displacement uz =', uz, ', ', (uz / uzex * 100), ' %') # vtkexport("rltb3dH20_results", fes, geom, {"displacements": u})
# These are the constants in the problem, k is kappa boundaryf = lambda x, y, z: 1.0 + x**2 + 2 * y**2 Q = -6 # internal heat generation rate k = 1.0 # thermal conductivity m = MatHeatDiff(thermal_conductivity=k * numpy.identity(3)) start = time.time() N = 4 xs = numpy.linspace(0.0, 1.0, N + 1) ys = numpy.linspace(0.0, 1.0, N + 1) zs = numpy.linspace(0.0, 1.0, N + 1) fens, fes = h8_blockx(xs, ys, zs) fens, fes = h8_to_h20(fens, fes) fes.gradbfunpar(numpy.array([0, 0, 0])) geom = NodalField(fens=fens) vtkexport("Poisson_fe_H20_mesh", fes, geom) print('Mesh generation', time.time() - start) bfes = mesh_boundary(fes) cn = connected_nodes(bfes) temp = NodalField(nfens=fens.count(), dim=1) for j in cn: temp.set_ebc([j], val=boundaryf(fens.xyz[j, 0], fens.xyz[j, 1], fens.xyz[j, 2])) temp.apply_ebc() femm = FEMMHeatDiff(material=m, fes=fes, integration_rule=GaussRule(dim=3, order=3)) S = femm.connection_matrix(geom) perm = reverse_cuthill_mckee(S, symmetric_mode=True) temp.numberdofs(node_perm=perm)
for index in cn: temp.set_ebc([index], val=boundaryf(fens.xyz[index, 0], fens.xyz[index, 1])) temp.apply_ebc() femm = FEMMHeatDiff(material=m, fes=fes, integration_rule=GaussRule(dim=2, order=2)) # S = femm.connection_matrix(geom) # perm = reverse_cuthill_mckee(S,symmetric_mode=True) # temp.numberdofs(node_perm=perm) temp.numberdofs() start = time.time() fi = ForceIntensity(magn=lambda x, J: Q) F = femm.distrib_loads(geom, temp, fi, 3) print('Heat generation load', time.time() - start) start = time.time() F += femm.nz_ebc_loads_conductivity(geom, temp) print('NZ EBC load', time.time() - start) start = time.time() K = femm.conductivity(geom, temp) print('Matrix assembly', time.time() - start) start = time.time() temp.scatter_sysvec(spsolve(K, F)) print('Solution', time.time() - start) print('Done', time.time() - start0) # print(temp.values.T) vtkexport("Poisson_fe_Q4_results", fes, geom, {'temperature': temp})
maxiter=150 lamb, v, converged = spyfe.bipwr.gepbinvpwr2(K,M,v,tol,maxiter) if converged: ix = numpy.argsort(numpy.abs(lamb)) lamb = lamb[ix].real v = v[:, ix] print([math.sqrt(om) / 2.0 / math.pi for om in lamb]) print("Reference frequencies:") print([0.421, 1.029, 2.582, 3.306, 3.753, 6.555]) print('Solution', time.time() - start) else: print( 'Not converged!' ) # start = time.time() # w, v = eigsh(K, k=10, M=M, which='SM') # ix = numpy.argsort(numpy.abs(w)) # w = w[ix].real # v = v[:,ix] # print('EP solution', time.time() - start) # print([math.sqrt(om)/2.0/math.pi for om in w]) # print(w, v[:,0]) u.scatter_sysvec(v[:,0].real) # print('Done', time.time() - start0) # vtkexport("FV16_cantilevered_plate_abaqus_results", fes, geom, {"displacements": u})
start = time.time() K = femm.stiffness(geom, u) print('Matrix assembly', time.time() - start) start = time.time() # U, info = lgmres(K, F) # print(info) lu = splu(K) del K U = lu.solve(F) #R = cho_factor(K, overwrite_a=True) #y = spsolve(R, spsolve(R.T, F)) # U = spsolve(K, F) # import scipy.sparse.linalg as spla # ilu = spilu(K, diag_pivot_thresh=0.0, fill_factor=1000) # M = spla.LinearOperator(K.shape, ilu.solve) # U, info = lgmres(K, F, x0=ilu.solve(F), M=M) #, callback=lambda x: print('iteration', numpy.linalg.norm(x-U))) # print(info) u.scatter_sysvec(U) print('Solution', time.time() - start) # print('Done', time.time() - start0) tipn = fenode_select(fens, box=[0, W, L, L, 0, H]) uv = u.values[tipn, :] uz = sum(uv[:, 2]) / len(tipn) print('Tip displacement uz =', uz, ', ', (uz / uzex * 100), ' %') # vtkexport("rltb3dms_H8MSGSO_results", fes, geom, {"displacements": u})