예제 #1
0
    def execute(self, context):
        #Solving with Liner elements
        coord = ADDONNAME_OT_prepare.coord
        elem = ADDONNAME_OT_prepare.elem
        print(f'{len(elem)} elements. Starting BEM...')
        surf = ADDONNAME_OT_submit.surf
        print(f"...{len(surf)} boundary conditions...")
        k = 1
        t_inicio = time.time()
        print('\nPrograma iniciado.')
        CCSup = {'flux0': 0., 'temp1': 1., 'temp2': 0.}
        # Cria a malha
        #malha = meshio.read(arquivo + '.msh') # Lê a malha do arquivo .msh
        # Cria a matriz NOS a partir da malha
        #NOS = malha.points
        NOS = coord
          # NOS: Matriz [NNx3] que contém as coordenadas dos vértices da malha criada,
          #      onde NN é o número de nós do problema
        # Cria a matriz ELEM a partir da malha
        #ELEM = malha.cells_dict['triangle']
        ELEM = elem
          # ELEM: Matriz [NEx3] que contém os números dos nós que formam cada elemento,
          #       onde NE é o número de elementos do problema
        print('Número de nós:',NOS.shape[0])
        print('Número de elementos:',ELEM.shape[0])
        # Cria a matriz de condições de contorno dos elementos
        CDC = contorno.gera_cdc(elem,surf,CCSup)
        #CDC = elem_bc
          # CDC: Matriz [NEx3] que contém a condição de contorno de cada nó dos
          #      elementos
        # MONTAGEM E SOLUÇÃO DO SISTEMA
        # Calcula as matrizes H e G
        npg_s = 8   # Número de pontos de Gauss para a integração singular
        npg_r = 6   # Número de pontos de Gauss para a integração regular
        qsi,w = np.polynomial.legendre.leggauss(npg_r); # Pontos e pesos de Gauss para a integração regular (triângulo)
        qsi_quad,w_quad = np.polynomial.legendre.leggauss(npg_s) # Pontos e pesos de Gauss para a integração singular (quadrilátero)
        nelem = ELEM.shape[0]           # Número de elementos
        nnos = NOS.shape[0]             # Número de nós
        H=np.zeros((nnos, nnos))        
        G=np.zeros((nnos,3*nelem))    
        t_gera_dados=time.time()-t_inicio
        t_matriz_inicio = time.time()
        print('Calculando as matrizes H e G.')
        ncores = 8      #número de threads
        H[:,:],G[:,:] = integ.cal_HeG(NOS, ELEM, k,qsi,w,qsi_quad,w_quad,ncores) # Cython
        t_matriz=time.time()-t_matriz_inicio # tempo para montagens das matrizes H e G
          # H: Matriz [NNxNN] que contém o resultado da integração de q* no contorno
          # G: Matriz [NNx3NE] que contém o resultado da integração de T* no contorno
        print('Aplicando as condições de contorno.')
        t_aplica_cdc_inicio = time.time()
        A, b, T_pr = sistema.aplica_cdc(G, H, NOS, ELEM, CDC)
        t_aplica_cdc = time.time()-t_aplica_cdc_inicio 
          # A: Matriz [NNxNN] contendo colunas de H e G
          # b: Vetor [NNx1] resultante da multiplicação de N colunas de H e G pelas
          #    CDC's conhecidas
        print('Resolvendo o sistema linear.')
        t_sistema_inicio = time.time()
        # Resolve o sistema de equações A.x = b
        x = np.linalg.solve(A, b)
          # x: Vetor [NNx1] que contém os termos calculados (antes desconhecidos) de
          #    temperatura e fluxo
        t_sistema=time.time()-t_sistema_inicio # tempo para montagens das matrizes H e G
        t_ordena_inicio=time.time()
        # Separa os valores de temperatura e fluxo
        print('Separando as variáveis.')
        T, q = sistema.monta_Teq(NOS, ELEM, CDC, x, T_pr)
          # T: Vetor [NNx1] que contém os valores de temperatura calculados
          # q: Vetor [3NEx1] que contém os valores de fluxo calculados
        t_ordena=time.time()-t_ordena_inicio
        print('Gerando o arquivo de pós-processamento.')
        t_saida_inicio=time.time()
        # Calcula os valores de temperatura no centróide do elemento
        T_centroide = contorno.calcTcentroide(T,ELEM,NOS)
        # Mostra os valores de temperatura no mapa de cor
        
        # Create material slot and material with the a color corresponding to a normalized interpolation of a color ramp.
        obj=bpy.context.object
        me = bpy.context.object.data
        ADDONNAME_OT_run.color_verts(me,T)
#        for poly in me.polygons:
#            i = poly.index
#            mat = obj.material_slots[i].material
#            mat.diffuse_color = 254*T_centroide[i]+1, 0, 0, 1

        print('Tempo para ler e gerar os dados iniciais:',t_gera_dados)
        print('Tempo para montagem das matrizes H e G:',t_matriz)
        print('Tempo para aplicas as condições de contorno:',t_aplica_cdc)
        print('Tempo para resolver o sistema linear:',t_sistema)
        print('Tempo para ordenar os dados:',t_ordena)
        #print('Tempo para gerar o arquivo de pós-processamento:',t_saida)
        print('Tempo de processamento:',time.time()-t_inicio,'s.\nPrograma finalizado.')

        return {'FINISHED'}
예제 #2
0
npg_r = 6  # Número de pontos de Gauss para a integração regular
qsi, w = np.polynomial.legendre.leggauss(npg_r)
# Pontos e pesos de Gauss para a integração regular (triângulo)
qsi_quad, w_quad = np.polynomial.legendre.leggauss(
    npg_s)  # Pontos e pesos de Gauss para a integração singular (quadrilátero)
nelem = ELEM.shape[0]  # Número de elementos
nnos = NOS.shape[0]  # Número de nós
H = np.zeros((nnos, nnos))
G = np.zeros((nnos, 3 * nelem))

t_gera_dados = time.time() - t_inicio

t_matriz_inicio = time.time()
print('Calculando as matrizes H e G.')

H[:, :], G[:, :] = integ.cal_HeG(NOS, ELEM, k, qsi, w, qsi_quad,
                                 w_quad)  # Cython

t_matriz = time.time(
) - t_matriz_inicio  # tempo para montagens das matrizes H e G
# H: Matriz [NNxNN] que contém o resultado da integração de q* no contorno
# G: Matriz [NNx3NE] que contém o resultado da integração de T* no contorno
print('Aplicando as condições de contorno.')
t_aplica_cdc_inicio = time.time()

A, b, T_pr = sistema.aplica_cdc(G, H, NOS, ELEM, CDC)
t_aplica_cdc = time.time() - t_aplica_cdc_inicio

# A: Matriz [NNxNN] contendo colunas de H e G
# b: Vetor [NNx1] resultante da multiplicação de N colunas de H e G pelas
#    CDC's conhecidas
print('Resolvendo o sistema linear.')