from qLWR_calculator import qLWR def Tmostra(Taire, v_vent, Tdp, t, HR, Irrad): #Dades Tmostra_i = 1.2*Taire #ºC tol = 0.001 #per acabar procés iteració #Propietats de l'aire patm = 101.325 #kPa dens = 3.484*patm/(Taire+273.15) cp = 1004 cond = (3.807+0.074*(Taire+273.15))*0.001 vis = (2.469+0.0536*(Taire+273.15)+patm/8280)*0.000001 #Dimensiones (cm) de la mesa, cuboEPS y muestraRC xmesa = 0.24 ymesa = 0.24 zmesa = 0.02 xcubo = 0.14 ycubo = 0.14 zcubo = 0.1 xmuestra = 0.14 ymuestra = 0.14 zmuestra = 0.005 desp_x = 0.05 # Desplazamiento en X para centrar el cubo y muestra desp_y = 0.05 # Desplazamiento en Y para centrar el cubo y muestra cond_muestra = 200 #Conductividad de la mmuestra (material RC) W/m2 cond_cubo = 0.04 #Conductividad del cubo (material RC) W/m2 cond_mesa = 0.1 #Conductividad de la mesa (material madera) W/m2 #Absorciones abs_mesa = 0.15 abs_cubo = 0.15 abs_muestra = 0.05 #Fraccions irradiación solar fracc_dif = 0.3 #Fracción de irradiación que llega de la total (atomsferica) --> Irrad total = 0.3 * Irrad difusa + 0.7 * Irrad directa (aprox) ################################################################################ import numpy as np from ansys.mapdl.core import launch_mapdl mapdl = launch_mapdl() diferencia = float('inf') while abs(diferencia) > tol: #Procés iteratiu fins compliment tolerancia #Coeficient convecció natural L_c = 0.035 #A/P Gr = 9.81/(Taire+273.15)*abs(Taire-Tmostra_i)*L_c**3*dens**2/vis**2 #Grashof Pr = vis*cp/cond #Prandtl Ra = Gr*Pr #Rayleigh if Ra < 10e7: #càlcul Nu en funció Ra Nu_n = 0.54*Ra**(1/4) else: Nu_n = 0.15*Ra**(1/3) h_nat = Nu_n*cond/L_c #W/(K·m2) #Coeficient convecció forçada v = v_vent*1000/3600 #v_vent m/s L = 0.14 #Longitud característica pel càlcul Re Re = dens*v*L/vis #Reynolds if Re < 500000: #càlcul Nu en funció Re laminar/turbulent Nu_f = 0.664*Re**(1/2)*Pr**(1/3) else: Nu_f = 0.037*Re**(4/5)*Pr**(1/3) h_for = Nu_f*cond/L #W/(K·m2) #Elecció convecció natural o forçada if Gr/Re**2 < 1: #correlació. Compleix --> convecció forçada negligible h = h_for else: h = h_nat #Càlcul flux de calor N=1 #AJUSTAR hf_rad = qLWR(Tmostra_i,Taire,N,Tdp,t,HR) hf_conv = h*(Taire-Tmostra_i) mapdl.clear() mapdl.prep7() #Preprocés: material, element, geometria, mallat, condicions de contorn mapdl.et(1, "SOLID70") #Definir el tipo de elemento (sólido 3D) mapdl.mp("KXX", 1, cond_muestra) #Conductividad del material RC en X. mapdl.mp("KYY", 1, cond_muestra) #Conductividad del material RC en Y. mapdl.mp("KZZ", 1, cond_muestra) #Conductividad del material RC en Z. mapdl.mp("KXX", 2, cond_cubo) #Conductividad del material EPS en X. mapdl.mp("KYY", 2, cond_cubo) #Conductividad del material EPS en Y. mapdl.mp("KZZ", 2, cond_cubo) #Conductividad del material EPS en Z. mapdl.mp("KXX", 3, cond_mesa) #Conductividad del material madera en X. mapdl.mp("KYY", 3, cond_mesa) #Conductividad del material madera en Y. mapdl.mp("KZZ", 3, cond_mesa) #Conductividad del material madera en Z. mapdl.block(0, xmesa, 0, ymesa, 0, zmesa) # Geom. RC material (superficie superior) mapdl.vsel("S", "VOLU","", 1) # Seleccionamos volumen 1 (geometria creada anteriormente) mapdl.vatt(3, 1, 1, 1) # Mat, Tipo, Real, Secnum mapdl.allsel() #print(mapdl.get("VOLU", "NUM")) # Verifica el número de volúmenes seleccionados #mapdl.vsweep(3) # Asignar material Madera al bloque 1 mapdl.block(desp_x, desp_x + xcubo, desp_y, desp_y + ycubo, zmesa, zmesa + zcubo) # Geom. EPS material (capa media) mapdl.vsel("S", "VOLU","", 2) # Seleccionamos volumen 2 (geometria creada anteriormente) mapdl.vatt(2, 1, 1, 1) # Mat, Tipo, Real, Secnum mapdl.allsel() #mapdl.vsweep(2) # Asignar material EPS al bloque 2 mapdl.block(desp_x, desp_x + xmuestra, desp_y, desp_y + ymuestra, zmesa + zcubo, zmesa + zcubo + zmuestra) # Geom. Madera material (capa inferior) mapdl.vsel("S", "VOLU","", 3) mapdl.vatt(1, 1, 1, 1) # Mat, Tipo, Real, Secnum mapdl.allsel() #mapdl.vsweep(1) # Asignar material RC al bloque 3 mapdl.esize(0.005) # Medida del mallado mapdl.vsel("ALL") mapdl.vmesh("ALL") # Creación del mallado mapdl.allsel() #mapdl.eplot() # Obtener coordenadas del nodo 12035 x = mapdl.get_value("NODE", 12035, "LOC", "X") y = mapdl.get_value("NODE", 12035, "LOC", "Y") z = mapdl.get_value("NODE", 12035, "LOC", "Z") print(f"Nodo {12035} está en X={x:.4f}, Y={y:.4f}, Z={z:.4f}") x = mapdl.get_value("NODE", 14244, "LOC", "X") y = mapdl.get_value("NODE", 14244, "LOC", "Y") z = mapdl.get_value("NODE", 14244, "LOC", "Z") print(f"Nodo {14244} está en X={x:.4f}, Y={y:.4f}, Z={z:.4f}") x = mapdl.get_value("NODE", 14255, "LOC", "X") y = mapdl.get_value("NODE", 14255, "LOC", "Y") z = mapdl.get_value("NODE", 14255, "LOC", "Z") print(f"Nodo {14255} está en X={x:.4f}, Y={y:.4f}, Z={z:.4f}") x = mapdl.get_value("NODE", 2402, "LOC", "X") y = mapdl.get_value("NODE", 2402, "LOC", "Y") z = mapdl.get_value("NODE", 2402, "LOC", "Z") print(f"Nodo {2402} está en X={x:.4f}, Y={y:.4f}, Z={z:.4f}") x = mapdl.get_value("NODE", 2, "LOC", "X") y = mapdl.get_value("NODE", 2, "LOC", "Y") z = mapdl.get_value("NODE", 2, "LOC", "Z") print(f"Nodo {2} está en X={x:.4f}, Y={y:.4f}, Z={z:.4f}") ##Mesa de madera #Conducción mapdl.nsel("S", "LOC", "Z", zmesa) # Superficie superior de la mesa de madera mapdl.nsel("R", "LOC", "X", desp_x, desp_x + xcubo) # Solo dentro del área del EPS mapdl.nsel("R", "LOC", "Y", desp_y, desp_y + ycubo) mapdl.cm("mesa_nodos_sup", "NODE") # Guardamos los nodos superiores en contacto de la mesa mapdl.nsel("S", "LOC", "Z", zmesa) # Superficie inferior del bloque EPS mapdl.nsel("R", "LOC", "X", desp_x, desp_x + xcubo) mapdl.nsel("R", "LOC", "Y", desp_y, desp_y + ycubo) mapdl.cm("eps_nodos_inf", "NODE") # Guardamos los nodos del EPS mapdl.cmap("mesa_nodos_sup", "eps_nodos_inf", "NODE", "TEMP") # Acoplamos temperaturas mapdl.allsel() #Convección mapdl.nsel("S", "LOC", "Z", 0) #Seleccionamos cara inferior de la mesa mapdl.sf("ALL", "HFLUX", 0) #Aplicación de flujo de calor 0 = adiabático mapdl.allsel() mapdl.nsel("S", "LOC", "X", 0) #Seleccionamos superficies laterales de la mesa de madera mapdl.nsel("R", "LOC", "Z", 0, zmesa) #Filtramos/refinamos dentro de la selec anterior entre z=0 y z=zmesa. mapdl.sf("ALL", "CONV", h, Taire) #Aplicación convección laterales de la mesa de madera mapdl.allsel() mapdl.nsel("S", "LOC", "X", xmesa) mapdl.nsel("R", "LOC", "Z", 0, zmesa) mapdl.sf("ALL", "CONV", h, Taire) #idem mapdl.allsel() mapdl.nsel("S", "LOC", "Y", 0) mapdl.nsel("R", "LOC", "Z", 0, zmesa) mapdl.sf("ALL", "CONV", h, Taire) #idem mapdl.allsel() mapdl.nsel("S", "LOC", "Y", ymesa) mapdl.nsel("R", "LOC", "Z", 0, zmesa) mapdl.sf("ALL", "CONV", h, Taire) #idem mapdl.allsel() ####CONTINUAR POR AQUÍ REPASANDO #IMPORTANTE Excluir la región central de 14 cm x 14 cm (EPS) en X y Y!! mapdl.nsel("S", "LOC", "Z", zmesa) #Seleccionamos cara superior de la mesa mapdl.nsel("A", "LOC", "X", 0, desp_x) #Seleccionamos zona izquierda del bloque EPS (X < desp_x) mapdl.nsel("R", "LOC", "Y", 0, ymesa) mapdl.nsel("A", "LOC", "X", desp_x + xcubo, xmesa)#Seleccionamos zona derecha del bloque EPS (X > desp_x + xcubo) mapdl.nsel("R", "LOC", "Y", 0, ymesa) mapdl.nsel("A", "LOC", "Y", 0, desp_y) #Seleccionamos zona frontal del bloque EPS (Y < desp_y) mapdl.nsel("R", "LOC", "X", 0, xmesa) mapdl.nsel("A", "LOC", "Y", desp_y + ycubo, ymesa)#Seleccionamos zona trasera del bloque EPS (Y > desp_y + ycubo) mapdl.nsel("R", "LOC", "X", 0, xmesa) mapdl.sf("ALL", "CONV", h, Taire) #Aplicaicón convección superior mesa # Radiación solar hf_solar_mesa = abs_mesa * Irrad mapdl.nsel("S", "LOC", "Z", zmesa) #Seleccionamos superficie superior de la mesa mapdl.nsel("A", "LOC", "X", 0, desp_x) #Seleccionamos zona izquierda del bloque EPS (X < desp_x) mapdl.nsel("R", "LOC", "Y", 0, ymesa) mapdl.nsel("A", "LOC", "X", desp_x + xcubo, xmesa)#Seleccionamos zona derecha del bloque EPS (X > desp_x + xcubo) mapdl.nsel("R", "LOC", "Y", 0, ymesa) mapdl.nsel("A", "LOC", "Y", 0, desp_y) #Seleccionamos zona frontal del bloque EPS (Y < desp_y) mapdl.nsel("R", "LOC", "X", 0, xmesa) mapdl.nsel("A", "LOC", "Y", desp_y + ycubo, ymesa)#Seleccionamos zona trasera del bloque EPS (Y > desp_y + ycubo) mapdl.nsel("R", "LOC", "X", 0, xmesa) mapdl.sf("ALL", "HFLUX", hf_solar_mesa) mapdl.allsel() ##Cubo EPS y muestra RC #Conducción mapdl.nsel("S", "LOC", "Z", zmesa + zcubo) # Seleccionamos superficie inferior del RC mapdl.nsel("R", "LOC", "X", desp_x, desp_x + xmuestra) mapdl.nsel("R", "LOC", "Y", desp_y, desp_y + ymuestra) mapdl.cm("rc_nodos_inf", "NODE") # Guardamos los nodos como un componente mapdl.nsel("S", "LOC", "Z", zmesa + zcubo) # Seleccionamos superficie superior del EPS mapdl.nsel("R", "LOC", "X", desp_x, desp_x + xcubo) mapdl.nsel("R", "LOC", "Y", desp_y, desp_y + ycubo) mapdl.cm("eps_nodos_sup", "NODE") # Guardamos también mapdl.cmap("rc_nodos_inf", "eps_nodos_sup", "NODE", "TEMP") # Acoplamos sus temperaturas mapdl.allsel() #Convección mapdl.nsel("S", "LOC", "X", desp_x) #Seleccionamos superficies laterales de EPS y RC mapdl.nsel("R", "LOC", "Z", zmesa, zmesa + zcubo + zmuestra) mapdl.sf("ALL", "CONV", h, Taire) #Aplicació convección laterales de cubo EPS y muestra RC mapdl.allsel() mapdl.nsel("S", "LOC", "X", desp_x + xcubo) #En este caso la xcubo = xmuestra mapdl.nsel("R", "LOC", "Z", zmesa, zmesa + zcubo + zmuestra) mapdl.sf("ALL", "CONV", h, Taire) #idem mapdl.allsel() mapdl.nsel("S", "LOC", "Y", desp_y) mapdl.nsel("R", "LOC", "Z", zmesa, zmesa + zcubo + zmuestra) mapdl.sf("ALL", "CONV", h, Taire) #idem mapdl.allsel() mapdl.nsel("S", "LOC", "Y", desp_y + ycubo) #En este caso la ycubo = ymuestra mapdl.nsel("R", "LOC", "Z", zmesa, zmesa + zcubo + zmuestra) mapdl.sf("ALL", "CONV", h, Taire) #idem mapdl.allsel() #Radiación térmica y solar muestra RC hf_solar_muestra = abs_muestra * Irrad ## hf_net = - (hf_rad - hf_conv) + hf_solar_muestra #W/m2 hf_net_rad = hf_solar_muestra - hf_rad ## mapdl.nsel("S", "LOC", "Z", zmesa + zcubo) ## mapdl.sf("ALL", "HFLUX", hf_net) mapdl.nsel("S", "LOC", "Z", zmesa + zcubo) #Intercambia radiación térmica con el espacio mapdl.sf("ALL", "HFLUX", hf_net_rad) #Aplicación flujo de calor en la muestra mapdl.nsel("S", "LOC", "Z", zmesa + zcubo + zmuestra) mapdl.sf("ALL", "CONV", h, Taire) #Aplicació convección en la muestra mapdl.allsel() # Radiación solar EPS y RC caras laterales irr_difusa_atmosferica = fracc_dif * Irrad #Fracción de irradiancia difusa atmosférica irr_reflejada_por_mesa = (1 - abs_mesa) * Irrad #Fracción reflejada por la mesa hf_solar_cubo = abs_cubo * (irr_difusa_atmosferica + irr_reflejada_por_mesa) # Cara izquierda del EPS mapdl.nsel("S", "LOC", "X", desp_x) mapdl.nsel("R", "LOC", "Y", desp_y , desp_y + ycubo) mapdl.nsel("R", "LOC", "Z", zmesa, zmesa+zcubo) mapdl.sf("ALL", "HFLUX", hf_solar_cubo) mapdl.allsel() # Cara derecha del EPS mapdl.nsel("S", "LOC", "X", desp_x + xcubo) mapdl.nsel("R", "LOC", "Y", desp_y, desp_y + ycubo) mapdl.nsel("R", "LOC", "Z", zmesa, zmesa + zcubo) mapdl.sf("ALL", "HFLUX", hf_solar_cubo) mapdl.allsel() # Cara frontal del EPS (Y = desp_y) mapdl.nsel("S", "LOC", "Y", desp_y) mapdl.nsel("R", "LOC", "X", desp_x, desp_x + xcubo) mapdl.nsel("R", "LOC", "Z", zmesa, zmesa + zcubo) mapdl.sf("ALL", "HFLUX", hf_solar_cubo) mapdl.allsel() # Cara trasera del EPS mapdl.nsel("S", "LOC", "Y", desp_y + ycubo) mapdl.nsel("R", "LOC", "X", desp_x, desp_x + xcubo) mapdl.nsel("R", "LOC", "Z", zmesa, zmesa + zcubo) mapdl.sf("ALL", "HFLUX", hf_solar_cubo) mapdl.allsel() mapdl.finish() #Acaba preprocés mapdl.run("/SOLU") #Arrenca solució mapdl.antype("STATIC") #Es resol Steady-State Thermal mapdl.solve() mapdl.post1() #Postproceso #mapdl.set(1, 1) #altura_z = zmesa + zcubo + zmuestra / 2 #mapdl.nsel("S", "LOC", "Z", altura_z - 1e-5, altura_z + 1e-5) # Pequeña tolerancia #mapdl.nsel("R", "LOC", "X", desp_x - 1e-5, desp_x + xmuestra + 1e-5) #mapdl.nsel("R", "LOC", "Y", desp_y - 1e-5, desp_y + ymuestra + 1e-5) #mapdl.nsel("S", "LOC", "Z", zmesa + zcubo + zmuestra/2) #Seleccionamos el plano justo entre EPS y RC, el substrato del PRDC. #mapdl.nsel("R", "LOC", "X", desp_x, desp_x + xmuestra) #mapdl.nsel("R", "LOC", "Y", desp_y, desp_y + ymuestra) mapdl.nsel("NONE") mapdl.allsel() mapdl.nsel("S", "LOC", "Z", zmesa + zcubo) temperaturas_rc = mapdl.get_array(entity='NODE', item1='TEMP') #print(f"temperaturas_rc: {temperaturas_rc} (Tipo: {type(temperaturas_rc)})") #print(type(temperaturas_rc)) # Debería ser un array o lista de temperaturas #print(temperaturas_rc) Tmostra_rc = np.median(temperaturas_rc) # Temperatura media de la muestra RC #print(f"Tmostra_rc: {Tmostra_rc} (Tipo: {type(Tmostra_rc)})") print(Tmostra_rc) # Para ver el resultado en cada iteración Tmostra_i = float(Tmostra_i) #print(f"Tmostra_i: {Tmostra_i} (Tipo: {type(Tmostra_i)})") diferencia = Tmostra_rc - Tmostra_i #si Tmostra_i > Taire --> diferencia < 0 #print(f"Diferencia entre Tmostra_rc y Tmostra_i: {diferencia}") Tmostra_i = Tmostra_i + 0.5*diferencia # Tmostra_i (n+1) < Tmostra_i (n) hf_rad = qLWR(Tmostra_i,Taire,N,Tdp,t,HR) hf_conv = h*(Taire-Tmostra_i) hf_net = - (hf_rad - hf_conv) + hf_solar_muestra # Recalculo del flujo de calor #mapdl.eplot() # Si se quiere ver el mallado #mapdl.post_processing.plot_nodal_temperature() # Si se quiere ver la distribución de la Tmostra mapdl.exit() return { "Tmostra": Tmostra_i, "Coef_conv": h, "Heat_flux_net": hf_net, "Heat_flux_radiation": hf_rad, "Heat_flux_convection": hf_conv, }