<reponame>arifyunando/FEM_Python
import numpy as np

def uniform_mesh(d1, d2, p, m , element_type : str):
    PD  = 2  # Problem Dimension
    q   = np.array([[0, 0], [d1, 0], [0, d2], [d1, d2]]) # 4 corners
    NoN = (p + 1) * (m + 1)
    NoE = p*m
    NPE = 4

    ### Nodes ###
    NL  = np.zeros([NoN, PD])
    a   = (q[1, 0] - q[0, 0])/p # Increment in the horizontal dir.
    b   = (q[2, 1] - q[0, 1])/m # Increment in the Vertical dir.

    n   = 0 # This will allow us to go through rows in NL
    for i in range(1, m+2):         # Vertical loop
        for j in range(1, p+2):     # Horizontal loop
            NL[n, 0]    = q[0, 0] + (j - 1)*a   # x values
            NL[n, 1]    = q[0, 1] + (i - 1)*b   # y values
            n += 1
    
    ### Elements ###
    EL = np.zeros([NoE, NPE])
    for i in range(1, m+1):         # Vertical loop
        for j in range(1, p+1):     # Horizontal loop
            if j == 1:
                EL[(i-1)*p + j - 1, 0] = (i - 1)*(p + 1) + j
                EL[(i-1)*p + j - 1, 1] = EL[(i-1)*p + j - 1, 0] + 1
                EL[(i-1)*p + j - 1, 3] = EL[(i-1)*p + j - 1, 0] + (p + 1)
                EL[(i-1)*p + j - 1, 2] = EL[(i-1)*p + j - 1, 3] + 1
            else:
                EL[(i-1)*p + j - 1, 0] = EL[(i-1)*p + j - 2, 1]
                EL[(i-1)*p + j - 1, 3] = EL[(i-1)*p + j - 2, 2] 
                EL[(i-1)*p + j - 1, 1] = EL[(i-1)*p + j - 1, 0] + 1
                EL[(i-1)*p + j - 1, 2] = EL[(i-1)*p + j - 1, 3] + 1

    if element_type == 'D2TR3N':
        NPE_new = 3
        NoE_new = 2*NoE
        EL_new  = np.zeros([NoE_new, NPE_new])

        for i in range(1, NoE+1):
            #for the first triangular element
            EL_new[2*(i-1), 0] = EL[i-1, 0]
            EL_new[2*(i-1), 1] = EL[i-1, 1]
            EL_new[2*(i-1), 2] = EL[i-1, 2]

            #for the second triangular element
            EL_new[2*(i-1) + 1, 0] = EL[i-1, 0]
            EL_new[2*(i-1) + 1, 1] = EL[i-1, 2]
            EL_new[2*(i-1) + 1, 2] = EL[i-1, 3]

        EL = EL_new

    EL = EL.astype(int)
    return (NL, EL)










import numpy as np

def uniform_mesh(d1, d2, p, m , element_type : str):
    PD  = 2  # Problem Dimension
    q   = np.array([[0, 0], [d1, 0], [0, d2], [d1, d2]]) # 4 corners
    NoN = (p + 1) * (m + 1)
    NoE = p*m
    NPE = 4

    ### Nodes ###
    NL  = np.zeros([NoN, PD])
    a   = (q[1, 0] - q[0, 0])/p # Increment in the horizontal dir.
    b   = (q[2, 1] - q[0, 1])/m # Increment in the Vertical dir.

    n   = 0 # This will allow us to go through rows in NL
    for i in range(1, m+2):         # Vertical loop
        for j in range(1, p+2):     # Horizontal loop
            NL[n, 0]    = q[0, 0] + (j - 1)*a   # x values
            NL[n, 1]    = q[0, 1] + (i - 1)*b   # y values
            n += 1
    
    ### Elements ###
    EL = np.zeros([NoE, NPE])
    for i in range(1, m+1):         # Vertical loop
        for j in range(1, p+1):     # Horizontal loop
            if j == 1:
                EL[(i-1)*p + j - 1, 0] = (i - 1)*(p + 1) + j
                EL[(i-1)*p + j - 1, 1] = EL[(i-1)*p + j - 1, 0] + 1
                EL[(i-1)*p + j - 1, 3] = EL[(i-1)*p + j - 1, 0] + (p + 1)
                EL[(i-1)*p + j - 1, 2] = EL[(i-1)*p + j - 1, 3] + 1
            else:
                EL[(i-1)*p + j - 1, 0] = EL[(i-1)*p + j - 2, 1]
                EL[(i-1)*p + j - 1, 3] = EL[(i-1)*p + j - 2, 2] 
                EL[(i-1)*p + j - 1, 1] = EL[(i-1)*p + j - 1, 0] + 1
                EL[(i-1)*p + j - 1, 2] = EL[(i-1)*p + j - 1, 3] + 1

    if element_type == 'D2TR3N':
        NPE_new = 3
        NoE_new = 2*NoE
        EL_new  = np.zeros([NoE_new, NPE_new])

        for i in range(1, NoE+1):
            #for the first triangular element
            EL_new[2*(i-1), 0] = EL[i-1, 0]
            EL_new[2*(i-1), 1] = EL[i-1, 1]
            EL_new[2*(i-1), 2] = EL[i-1, 2]

            #for the second triangular element
            EL_new[2*(i-1) + 1, 0] = EL[i-1, 0]
            EL_new[2*(i-1) + 1, 1] = EL[i-1, 2]
            EL_new[2*(i-1) + 1, 2] = EL[i-1, 3]

        EL = EL_new

    EL = EL.astype(int)
    return (NL, EL)
# Problem Dimension # 4 corners ### Nodes ### # Increment in the horizontal dir. # Increment in the Vertical dir. # This will allow us to go through rows in NL # Vertical loop # Horizontal loop # x values # y values ### Elements ### # Vertical loop # Horizontal loop #for the first triangular element #for the second triangular element