program Newton3Vars_HTF
    implicit none
    integer, parameter :: dp = selected_real_kind(15,300)
    ! variables incógnitas
    real(dp) :: T_abs, T_sub, T_out
    ! datos y constantes
    real(dp) :: T_a, T_sky, T_PV, T_in_HTF, T_PTC
    real(dp) :: q_dot_sol_PV, P_PV
    real(dp) :: G_GHI, A_abs, alpha_abs, epsilon_abs, A_PV, epsilon_PV
    real(dp) :: sigma, R_conv_abs, R_cond_abs, R_cond_sub, R_cond_PV, R_conv_PV
    real(dp) :: m_dot_HTF, C_p_HTF, h_HTF
    real(dp) :: UA, A_pipe, NTU, eff_HTF
    ! funciones y jacobiano
    real(dp) :: f1, f2, f3
    real(dp) :: J(3,3)
    real(dp) :: rhs(3), dx(3)
    real(dp) :: tol
    integer :: iter, max_iter, i

    ! Inicializar datos (tus valores)
    sigma = 5.67d-8
    G_GHI      = 1000.0d0
    q_dot_sol_PV = 540.0d0
    P_PV = 1722.0d0

    A_abs      = 0.6d0
    alpha_abs  = 0.9d0
    epsilon_abs= 0.2d0
    A_PV       = 1.2d0
    epsilon_PV = 0.2d0

    T_a        = 298.2d0
    T_sky      = 298.2d0
    T_PV       = 355.5d0
    T_in_HTF   = 343.2d0
    T_PTC      = 301.5d0

    R_conv_abs = 0.0464d0
    R_cond_abs = 0.00002439d0
    R_cond_sub = 0.00004623d0
    R_cond_PV  = 0.00005d0
    R_conv_PV  = 0.03281d0

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

    ! geometría tubería
    A_pipe = 3.1416d0 * 0.03d0 * 10.0d0

    ! calcular UA, NTU, eff (constantes)
    UA = 1.0d0 / (1.0d0/h_HTF + R_cond_sub)
    NTU = (UA * A_pipe) / (m_dot_HTF * C_p_HTF)
    eff_HTF = 1.0d0 - exp(-NTU)

    ! iniciales (elige valores razonables)
    T_abs = 330.0d0
    T_sub = 320.0d0
    T_out = 345.0d0

    tol = 1.0d-8
    max_iter = 100

    do iter = 1, max_iter
        ! --- calcular f ---
        f1 = q_dot_sol_PV - P_PV - (T_PV - T_a)/R_conv_PV &
             - epsilon_PV * sigma * A_PV * (T_PV**4 - T_PTC**4) &
             + G_GHI*A_abs*alpha_abs &
             - (T_abs - T_a)/R_conv_abs &
             - epsilon_abs * sigma * A_abs * (T_abs**4 - T_sky**4) &
             - (T_abs - T_sub)/(R_cond_abs + R_cond_sub) &
             - eff_HTF * m_dot_HTF * C_p_HTF * (T_sub - T_in_HTF)

        f2 = G_GHI*A_abs*alpha_abs &
             - (T_abs - T_a)/R_conv_abs &
             - epsilon_abs * sigma * A_abs * (T_abs**4 - T_sky**4) &
             - (T_abs - T_sub)/(R_cond_abs + R_cond_sub)

        f3 = m_dot_HTF * C_p_HTF * (T_out - T_in_HTF) &
             - eff_HTF * m_dot_HTF * C_p_HTF * (T_sub - T_in_HTF)

        ! --- montar J (parciales) ---
        J(1,1) = -1.0d0/R_conv_abs - 4.0d0*epsilon_abs*sigma*A_abs*T_abs**3 - 1.0d0/(R_cond_abs + R_cond_sub)
        J(1,2) =  1.0d0/(R_cond_abs + R_cond_sub) - eff_HTF * m_dot_HTF * C_p_HTF
        J(1,3) =  0.0d0

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

        J(3,1) =  0.0d0
        J(3,2) = - eff_HTF * m_dot_HTF * C_p_HTF
        J(3,3) =   m_dot_HTF * C_p_HTF

        ! --- rhs = -f ---
        rhs(1) = -f1
        rhs(2) = -f2
        rhs(3) = -f3

        ! --- resolver J * dx = rhs por eliminación gaussiana (3x3) ---
        call solve3x3(J, rhs, dx)

        ! actualizar
        T_abs = T_abs + dx(1)
        T_sub = T_sub + dx(2)
        T_out = T_out + dx(3)

        ! condición de paro
        if (max(abs(dx(1)), max(abs(dx(2)), abs(dx(3)))) < tol) exit

        ! opcional: traza
        ! print *, iter, T_abs, T_sub, T_out, dx(1), dx(2), dx(3)
    end do

    print *
    print *, "Iteraciones:", iter
    print *, "T_abs (K) = ", T_abs, "  (°C) = ", T_abs - 273.15d0
    print *, "T_sub (K) = ", T_sub, "  (°C) = ", T_sub - 273.15d0
    print *, "T_out (K) = ", T_out, "  (°C) = ", T_out - 273.15d0
    print *, "eff_HTF = ", eff_HTF

contains

    subroutine solve3x3(A, b, x)
        ! simple eliminacion gaussiana sin pivoteo parcial (stablea para casos normales)
        real(dp), intent(inout) :: A(3,3)
        real(dp), intent(in) :: b(3)
        real(dp), intent(out) :: x(3)
        real(dp) :: M(3,3), rhs(3)
        integer :: i,j,k
        real(dp) :: factor

        ! copiar para no modificar A externamente
        M = A
        rhs = b

        ! forward elimination
        do k = 1, 2
            if (abs(M(k,k)) < 1.0d-14) then
                print *, "Pivote casi cero en fila ", k, ". Abortando."
                stop
            end if
            do i = k+1, 3
                factor = M(i,k) / M(k,k)
                do j = k, 3
                    M(i,j) = M(i,j) - factor * M(k,j)
                end do
                rhs(i) = rhs(i) - factor * rhs(k)
            end do
        end do

        ! back substitution
        x(3) = rhs(3) / M(3,3)
        x(2) = (rhs(2) - M(2,3)*x(3)) / M(2,2)
        x(1) = (rhs(1) - M(1,2)*x(2) - M(1,3)*x(3)) / M(1,1)
    end subroutine solve3x3

end program Newton3Vars_HTF

Embed on website

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