Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
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')
Ejemplo n.º 3
0
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')
Ejemplo n.º 4
0
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'

Ejemplo n.º 6
0
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)
Ejemplo n.º 7
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"])
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
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"])