program main_NR_total
  implicit none
  Double Precision :: G_GHI, G_DNI, u_Air, T_a, T_sky, T_in_HTF, T_PVi
  Double Precision :: T_abs, T_sub, T_out_HTF, T_PTC, T_PV

  Double Precision :: R_cond_abs, R_cond_PV, R_cond_sub
  Double Precision :: R_conv_abs, R_conv_PV, R_conv_PTC
  
  !Double Precision :: W_PV, W_abs, L, A_PV, A_abs, A_ap, A_PTC
  !Double Precision :: CR_PTC, alpha_PV, alpha_abs, epsilon_PV, epsilon_abs
  !Double Precision :: IAM_elec, IAM_th, eta_opt, sigma
  !Double Precision :: m_dot_HTF, C_p_HTF, U, A_hx, P_PV, T_PV

  !Double Precision :: alpha_PTC, epsilon_PTC
  
  Double Precision :: C_p_HTF, rho_Water
  
  Double Precision :: D,W_PV,W_abs,W_PTC, L_PTC,L_SRC_PVT          ! Geometry of the PTC and SRC-PVT (Definir en el Type)
  Double Precision :: A_PV,A_abs,A_sub,A_ap,A_PTC, CR_PTC

  Double Precision :: alpha_PV,alpha_abs,alpha_PTC                 ! Design parameters
  Double Precision :: epsilon_PV,epsilon_abs,epsilon_PTC
  Double Precision :: IAM_elec,IAM_th,eta_opt,sigma
  Double Precision :: P_Air,P_HTF,m_dot_HTF, th_PV,th_abs,th_sub,k_PV,k_abs,k_sub

  Double Precision :: r_pipe,h_triangle,h_inscribed, th_min,th_max ! Thickness of the substrate
  Double Precision :: A_cs_pipe,u_Water, A_hx,NTU,E, U                ! Water (HTF) velocity and NTU number

  Double Precision :: eta_PV,P_PV, q_dot_HTF,eta_elec,eta_th       !


Double Precision :: h_abs, h_PTC, h_PV, h_HTF

  
  
  integer :: iter

  ! ===== Inicialización de constantes =====

  ! ---- ---- ---- ---- Boundary conditions
  
  G_GHI = 1000.0d0
  G_DNI = 800.0d0
  u_Air = 5.0d0

  T_a      = 25.0d0 + 273.15d0
  T_sky    = 25.0d0 + 273.15d0
  T_in_HTF = 70.0d0 + 273.15d0
  T_PVi    = 355.45d0

  ! ---- ---- ---- ---- Geometry of the PTC and SRC-PVT
    
  D     = 0.03d0
  W_PV  = 0.12d0
  W_abs = 0.06d0
  W_PTC = 1.2d0

  L_PTC     = 10.0d0
  L_SRC_PVT = L_PTC
    
  A_PV  = W_PV * L_SRC_PVT   !1.2d0
  A_abs = W_abs * L_SRC_PVT  !0.6d0
  A_sub = A_PV + A_abs       !OJO aquí
  A_ap  = 1.2d0 * L_PTC
  A_PTC = 3.0d0 * L_PTC      !30.0d0
  CR_PTC = A_ap / A_PV

  ! ---- ---- ---- ---- Design parameters

  alpha_PV  = 0.97d0
  alpha_abs = 0.90d0
  alpha_PTC = 0.03d0

  epsilon_PV   = 0.2d0
  epsilon_abs  = 0.2d0
  epsilon_PTC  = 0.3d0

  IAM_elec = 0.72d0
  IAM_th   = 0.86d0
  eta_opt  = 0.83d0
  sigma    = 5.67d-8   !5.670374d-8

  m_dot_HTF = 0.15d0
  C_p_HTF   = 4187.0d0
  h_HTF     = 1665.0d0

  P_Air     = 1.01325
  P_HTF     = 0.3119
  m_dot_HTF = 0.15
      
  th_PV  = 0.003d0
  th_abs = 0.003d0
  !th_sub = 0.02541d0
  k_PV   = 50.0d0 
  k_abs  = 205.0d0 
  k_sub  = 250.0d0

  !U    = 780.1d0
  !A_hx = 0.9425d0
  !P_PV = 1723.0d0

  !R_cond_abs = 0.00002439d0
  !R_cond_PV  = 0.00005d0
  !R_cond_sub = 0.00008472d0
  !R_conv_abs = 0.4848d0
  !R_conv_PV  = 0.3428d0
  !R_conv_PTC = 0.04336d0

h_abs = 35.22d0     !3.438d0  !35.22d0
h_PTC = 7.87d0      !0.7687d0 !7.87d0
h_PV  = 24.90d0      !2.431d0  !24.90d0
h_HTF = 1684.90d0      !835.3d0  !1684.90d0
!h_HTF = hh_HTF

rho_Water = 977.7d0

! ======================= Thickness of the substrate using a circle inscribed in a triangle

    r_pipe      = D/2.0d0
    h_triangle  = (sqrt(3.0d0)/3.0d0) * W_abs
    h_inscribed = (sqrt(3.0d0)/6.0d0) * W_abs
      
    th_min = h_inscribed - r_pipe
    th_max = h_triangle - r_pipe

    th_sub = (th_min + 2.0d0 * th_max)/3.0d0  !Substrate thickness

! ======================= Calculation of thermal resistances

      R_cond_abs = th_abs/(k_abs * A_abs)
      R_cond_sub = th_sub/(k_sub * A_sub)
      R_cond_PV  = th_PV/(k_PV * A_PV)
      
      R_conv_abs = 1.0d0/(h_abs * A_abs)
      R_conv_PTC = 1.0d0/(h_PTC * A_PTC)
      R_conv_PV  = 1.0d0/(h_PV * A_PV)

! ======================= Water (HTF) velocity

    A_cs_pipe = (3.1416d0 * (D/2.0d0)**(2))         !Pipe cross-sectional area
    u_Water   = (m_dot_HTF)/(rho_Water * A_cs_pipe) !Water velocity

! ======================= Calculation of heat transfer efficiency (NTU number)

    A_hx = 3.1416d0 * D * 10.0d0                                                 ! Heat exchanger area
    NTU  = ((1.0d0/((1.0d0/h_HTF) + R_cond_sub)) * A_hx)/(m_dot_HTF * (C_p_HTF)) ! NTU number
    E    = 1.0d0 - exp(- NTU)

! ======================= Calculation of the electrical power of the PV

    eta_PV = 0.298d0 + 0.0142d0 * (log(CR_PTC)) + (- 0.000715d0 +0.0000697d0 * (log(CR_PTC))) * (T_PV - 298.0d0)
    P_PV   = G_DNI * A_PV * CR_PTC * eta_opt * IAM_elec * eta_PV !1723.0d0

! ======================= Calculation of electrical and thermal efficiency

    q_dot_HTF = (T_out_HTF - T_in_HTF) * m_dot_HTF * C_p_HTF
    
    eta_elec = (P_PV)/(G_DNI * A_ap)
    eta_th   = (q_dot_HTF)/(G_DNI * A_ap)

! ======================= LMTD
    U    = 1d0/((1d0/h_HTF) + R_cond_sub)

  

  ! ==== Paso 1: Calcular T_PTC ====
  call calc_T_PTC(T_a, T_sky, T_PVi, T_PTC, sigma, G_GHI, A_PTC, alpha_PTC, &
                  epsilon_PV, A_PV, epsilon_PTC, R_conv_PTC, iter)

  print *, "--------------------------------------"
  print *, "Cálculo de T_PTC"
  print *, "Iteraciones: ", iter
  print *, "T_PTC [K]: ", T_PTC

  ! ==== Paso 2: Calcular T_abs, T_sub, T_out_HTF ====
  call solve_NR_3x3(T_abs, T_sub, T_out_HTF, &
       G_GHI, G_DNI, T_a, T_sky, T_in_HTF, T_PVi, T_PTC, &
       A_PV, A_abs, CR_PTC, alpha_PV, alpha_abs, epsilon_PV, epsilon_abs, &
       sigma, m_dot_HTF, C_p_HTF, U, A_hx, P_PV, &
       R_cond_abs, R_cond_sub, R_conv_abs, R_conv_PV)

  print *, "--------------------------------------"
  print *, "Resultados Newton–Raphson 3x3:"
  print *, "T_abs     [K]: ", T_abs
  print *, "T_sub     [K]: ", T_sub
  print *, "T_out_HTF [K]: ", T_out_HTF
  print *, "--------------------------------------"

  ! ==== Paso 3: Calcular T_PV ====
  call calc_T_PV(T_abs, T_sub, T_out_HTF, T_in_HTF, R_cond_PV, R_cond_sub, R_cond_abs, &
                 m_dot_HTF, C_p_HTF, T_PV)

  print *, "--------------------------------------"
  print *, "Cálculo de T_PV:"
  print *, "T_PV [K]: ", T_PV
  print *, "--------------------------------------"

end program main_NR_total

!===============================================================
subroutine calc_T_PTC(T_a, T_sky, T_PVi, T_PTC, sigma, G_GHI, A_PTC, alpha_PTC, &
                       epsilon_PV, A_PV, epsilon_PTC, R_conv_PTC, iter)
  implicit none
  Double Precision, intent(out) :: T_PTC
  Double Precision, intent(in)  :: T_a, T_sky, T_PVi
  Double Precision, intent(in)  :: sigma, G_GHI, A_PTC, alpha_PTC
  Double Precision, intent(in)  :: epsilon_PV, A_PV, epsilon_PTC, R_conv_PTC
  integer, intent(out) :: iter
  Double Precision :: f_T_PTC, df_T_PTC, T_PTCe, tol
  integer :: max_iter

  T_PTC = 320.0d0
  tol = 1.0d-6
  max_iter = 100

  do iter = 1, max_iter
     f_T_PTC = G_GHI * A_PTC * alpha_PTC & 
             - (T_PTC**4 - T_sky**4) * A_PTC * epsilon_PTC * sigma & 
             + (T_PVi**4 - T_PTC**4) * A_PV * epsilon_PV * sigma & 
             - ((T_PTC - T_a)/(R_conv_PTC))

     df_T_PTC = - 4.0d0 * T_PTC**3 * A_PTC * epsilon_PTC * sigma &
                - 4.0d0 * T_PTC**3 * A_PV * epsilon_PV * sigma &
                - 1.0d0/R_conv_PTC

     T_PTCe = T_PTC - f_T_PTC/df_T_PTC
     if (abs(T_PTCe - T_PTC) < tol) then
        T_PTC = T_PTCe
        exit
     endif
     T_PTC = T_PTCe
  end do
end subroutine calc_T_PTC

!===============================================================
subroutine solve_NR_3x3(T_abs, T_sub, T_out_HTF, &
       G_GHI, G_DNI, T_a, T_sky, T_in_HTF, T_PV, T_PTC, &
       A_PV, A_abs, CR_PTC, alpha_PV, alpha_abs, epsilon_PV, epsilon_abs, &
       sigma, m_dot_HTF, C_p_HTF, U, A_hx, P_PV, &
       R_cond_abs, R_cond_sub, R_conv_abs, R_conv_PV)

  implicit none
  Double Precision, intent(out) :: T_abs, T_sub, T_out_HTF
  Double Precision, intent(in)  :: G_GHI, G_DNI, T_a, T_sky, T_in_HTF, T_PV, T_PTC
  Double Precision, intent(in)  :: A_PV, A_abs, CR_PTC, alpha_PV, alpha_abs
  Double Precision, intent(in)  :: epsilon_PV, epsilon_abs, sigma
  Double Precision, intent(in)  :: m_dot_HTF, C_p_HTF, U, A_hx, P_PV
  Double Precision, intent(in)  :: R_cond_abs, R_cond_sub, R_conv_abs, R_conv_PV

  Integer :: it, maxit
  Double Precision :: tol, normF
  Double Precision :: F(3), dx(3), J(3,3)

  tol   = 1.0d-8
  maxit = 100

  T_abs     = 355.0d0
  T_sub     = 355.0d0
  T_out_HTF = 355.0d0

  do it = 1, maxit
     call residual_and_jacobian(T_abs, T_sub, T_out_HTF, F, J, &
          G_GHI, G_DNI, T_a, T_sky, T_in_HTF, T_PV, T_PTC, &
          A_PV, A_abs, CR_PTC, alpha_PV, alpha_abs, epsilon_PV, epsilon_abs, &
          sigma, m_dot_HTF, C_p_HTF, U, A_hx, P_PV, &
          R_cond_abs, R_cond_sub, R_conv_abs, R_conv_PV)

     normF = max( max(abs(F(1)),abs(F(2))), abs(F(3)) )
     if (normF < tol) exit

     call solve_3x3(J, -F, dx)

     T_abs     = T_abs + dx(1)
     T_sub     = T_sub + dx(2)
     T_out_HTF = T_out_HTF + dx(3)
  end do

  print *, "Iteraciones: ", it-1
  print *, "||F||_inf  : ", normF

end subroutine solve_NR_3x3

!===============================================================
subroutine residual_and_jacobian(T_abs, T_sub, T_out_HTF, F, J, &
       G_GHI, G_DNI, T_a, T_sky, T_in_HTF, T_PV, T_PTC, &
       A_PV, A_abs, CR_PTC, alpha_PV, alpha_abs, epsilon_PV, epsilon_abs, &
       sigma, m_dot_HTF, C_p_HTF, U, A_hx, P_PV, &
       R_cond_abs, R_cond_sub, R_conv_abs, R_conv_PV)

  implicit none
  Double Precision, intent(in) :: T_abs, T_sub, T_out_HTF
  Double Precision, intent(out):: F(3), J(3,3)
  Double Precision, intent(in) :: G_GHI, G_DNI, T_a, T_sky, T_in_HTF, T_PV, T_PTC
  Double Precision, intent(in) :: A_PV, A_abs, CR_PTC, alpha_PV, alpha_abs
  Double Precision, intent(in) :: epsilon_PV, epsilon_abs, sigma
  Double Precision, intent(in) :: m_dot_HTF, C_p_HTF, U, A_hx, P_PV
  Double Precision, intent(in) :: R_cond_abs, R_cond_sub, R_conv_abs, R_conv_PV

  Double Precision :: q_solar_abs, q_solar_ptc
  Double Precision :: rad_abs, rad_pv, conv_pv, conv_abs
  Double Precision :: DT, eps_log, denom, Lmtd, Rcond_sum

  Rcond_sum = R_cond_abs + R_cond_sub
  q_solar_abs = G_GHI*A_abs*alpha_abs
  q_solar_ptc = G_DNI*A_PV*alpha_PV*CR_PTC*0.83d0*0.86d0
  rad_abs = epsilon_abs*sigma*A_abs*(T_abs**4 - T_sky**4)
  rad_pv  = epsilon_PV *sigma*A_PV*(T_PV**4  - T_PTC**4)
  conv_pv = (T_PV - T_a)/R_conv_PV
  conv_abs= (T_abs - T_a)/R_conv_abs

  DT = T_out_HTF - T_in_HTF
  eps_log = 1.0d-9
  denom = max( (T_sub - T_out_HTF), eps_log )
  Lmtd = log( max( (T_sub - T_in_HTF), eps_log ) / denom )

  F(1) = q_solar_abs + q_solar_ptc - P_PV - rad_abs - rad_pv - conv_pv - conv_abs - m_dot_HTF*C_p_HTF*DT
  F(2) = q_solar_abs - rad_abs - conv_abs - (T_abs - T_sub)/Rcond_sum
  F(3) = m_dot_HTF*C_p_HTF*DT - U*A_hx * ( DT / Lmtd )

  J(1,1) = -4.0d0*epsilon_abs*sigma*A_abs*(T_abs**3) - 1.0d0/R_conv_abs
  J(1,2) = 0.0d0
  J(1,3) = - m_dot_HTF*C_p_HTF

  J(2,1) = -4.0d0*epsilon_abs*sigma*A_abs*(T_abs**3) - 1.0d0/R_conv_abs - 1.0d0/Rcond_sum
  J(2,2) =  1.0d0/Rcond_sum
  J(2,3) =  0.0d0

  J(3,1) = 0.0d0
  J(3,2) = U*A_hx * DT / (Lmtd*Lmtd) * ( 1.0d0/(max(T_sub - T_in_HTF,eps_log)) - 1.0d0/(denom) )
  J(3,3) = m_dot_HTF*C_p_HTF - U*A_hx * ( ( Lmtd - DT/(denom) ) / (Lmtd*Lmtd) )

end subroutine residual_and_jacobian

!===============================================================
subroutine solve_3x3(A, b, x)
  implicit none
  Double Precision, intent(in)  :: A(3,3), b(3)
  Double Precision, intent(out) :: x(3)
  Double Precision :: M(3,3), det

  M = A
  det =  M(1,1)*(M(2,2)*M(3,3)-M(2,3)*M(3,2))  &
       - M(1,2)*(M(2,1)*M(3,3)-M(2,3)*M(3,1))  &
       + M(1,3)*(M(2,1)*M(3,2)-M(2,2)*M(3,1))

  if (abs(det) < 1.0d-16) then
     print *, "Jacobiano casi singular."
  end if

  x(1) = ( b(1)*(M(2,2)*M(3,3)-M(2,3)*M(3,2))  &
         - b(2)*(M(1,2)*M(3,3)-M(1,3)*M(3,2))  &
         + b(3)*(M(1,2)*M(2,3)-M(1,3)*M(2,2)) ) / det

  x(2) = ( - b(1)*(M(2,1)*M(3,3)-M(2,3)*M(3,1))  &
           + b(2)*(M(1,1)*M(3,3)-M(1,3)*M(3,1))  &
           - b(3)*(M(1,1)*M(2,3)-M(1,3)*M(2,1)) ) / det

  x(3) = ( b(1)*(M(2,1)*M(3,2)-M(2,2)*M(3,1))  &
         - b(2)*(M(1,1)*M(3,2)-M(1,2)*M(3,1))  &
         + b(3)*(M(1,1)*M(2,2)-M(1,2)*M(2,1)) ) / det

end subroutine solve_3x3

!===============================================================
subroutine calc_T_PV(T_abs, T_sub, T_out_HTF, T_in_HTF, R_cond_PV, R_cond_sub, R_cond_abs, &
                     m_dot_HTF, C_p_HTF, T_PV)
  implicit none
  Double Precision, intent(in) :: T_abs, T_sub, T_out_HTF, T_in_HTF
  Double Precision, intent(in) :: R_cond_PV, R_cond_sub, R_cond_abs
  Double Precision, intent(in) :: m_dot_HTF, C_p_HTF
  Double Precision, intent(out) :: T_PV
  Double Precision :: term1, term2

  term1 = m_dot_HTF*C_p_HTF*(T_out_HTF - T_in_HTF)        ! q_dot_HTF
  term2 = (T_abs - T_sub)/(R_cond_abs + R_cond_sub)       ! q_dot_cond_abs_x_sub

  T_PV = T_sub + (term1 - term2)*(R_cond_PV + R_cond_sub)
end subroutine calc_T_PV

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: