program explicit_model_IV
    implicit none
    
    ! --- Variables originales ---
    integer :: ii, max_iter
    double precision :: q, k_boltz, beta, alpha  ! Renombro k a k_boltz para evitar conflicto con iterador k
    double precision :: G, G_ref, CR_PTC, T, T_cell, T_ref
    double precision :: Voc_ref, Isc_ref, Jsc_ref, APV
    double precision :: Vt, n_min, n_max, coef, n
    double precision :: Voc, Isc, I0, IL
    double precision :: Vmp, Imp, Pmp, MPPT
    double precision :: Rpv
    double precision :: dI, f, df, tol
    double precision :: Vm, Im, C1, C2
    double precision, dimension(501) :: Vdata, Idata

    ! --- Nuevas variables para la Tabla y MPP ---
    double precision :: V, I, P_act
    double precision :: paso_v
    integer :: k, num_puntos

    ! --- Parámetros Físicos ---
    q = 1.602e-19
    k_boltz = 1.381e-23
    beta  = -0.0023
    alpha =  0.0006

    G = 960.0 !* 0.86   ! Ojo a las perdidas opticas del colector
    G_ref = 1353.0
    CR_PTC = 30!16.92 

    T_cell = 59.4  
    T = T_cell + 273.15
    T_ref = 25.0 + 273.15

    Jsc_ref = 10.8e-3 
    APV = 12.0
    
    Voc_ref = 3.075!2.63  
    Isc_ref = Jsc_ref * APV

    Vt = (k_boltz*T)/q

    n_max = 2.0
    n_min = 1.0
    coef = 0.0015
    n = n_max + (n_min - n_max)*exp(-coef*G)

    ! --- Cálculo de parámetros del modelo ---
    Voc = Voc_ref + ((n*k_boltz*T)/q)*log(G/G_ref) + beta*(T - T_ref)
    Isc = Isc_ref * (G/G_ref) * (1.0 + alpha*(T - T_ref)) * CR_PTC

    I0 = Isc / (exp(Voc/(n*Vt)) - 1.0)
    IL = Isc * (G/G_ref) * (1.0 + (alpha * (T - T_ref)))

    ! Estimación analítica inicial para obtener C1 y C2
    Vm = ((n * k_boltz * T)/q) * log( ((n * k_boltz * T)/(q * I0)) * (Isc/Voc) )
    Im = IL + I0 - ((n * 1.0 * k_boltz * T)/q) * (Isc/Voc)

    ! Cálculo de Constantes del Modelo Explícito
    C2 = ((Vm / Voc) - 1.0) / log(1.0 - (Im / Isc))
    C1 = (1.0 - (Im / Isc)) * EXP(-Vm / (C2 * Voc))

    ! ============================================================
    ! SECCIÓN INTEGRADA: GENERACIÓN DE TABLA Y BÚSQUEDA DE MPP
    ! ============================================================
    
    ! Configuración del barrido
    num_puntos = 20
    paso_v = Voc / dble(num_puntos)
    
    ! Inicializar variables de búsqueda de MPP
    Pmp = 0.0d0
    Vmp = 0.0d0
    Imp = 0.0d0

    print *, "--------------------------------------------------------"
    print *, " TABLA DE RESULTADOS (Modelo Explicito) & BUSQUEDA MPP"
    print *, "--------------------------------------------------------"
    print *, " Voltaje (V)      Corriente (I)      Potencia (W)"
    print *, " -----------      -------------      ------------"

    DO k = 0, num_puntos
        ! 1. Calcular Voltaje para este paso
        V = dble(k) * paso_v
        
        ! 2. Ecuación del Modelo Explícito
        ! Se añade protección IF para evitar errores numéricos si V > Voc por redondeo
        IF (V > Voc) THEN
            I = 0.0d0
        ELSE
            I = Isc * (1.0d0 - C1 * (EXP(V / (C2 * Voc)) - 1.0d0))
        END IF
        
        ! 3. Corrección física (I no puede ser negativa)
        IF (I < 0.0d0) I = 0.0d0
        
        ! 4. Calcular Potencia Instantánea
        P_act = V * I
        
        ! 5. Buscar el Máximo (MPP Tracking en la tabla)
        IF (P_act > Pmp) THEN
            Pmp = P_act
            Vmp = V
            Imp = I
        END IF
        
        ! 6. Guardar en arrays (opcional, si se usan después)
        if (k+1 <= 501) then
            Vdata(k+1) = V
            Idata(k+1) = I
        endif

        ! 7. Imprimir fila de la tabla
        WRITE(*, '(F10.4, T20, F10.4, T40, F10.4)') V, I, P_act
    END DO
    
    print *, "--------------------------------------------------------"
    print *, ""

    ! ============================================================
    ! FIN DE SECCIÓN INTEGRADA
    ! ============================================================

    ! Calculo final de MPPT del sistema (según lógica original)
    ! Nota: Pmp ahora contiene el valor máximo real encontrado en el bucle anterior
    MPPT = Pmp * 40.0d0 

    print *, " RESUMEN DE PARAMETROS CALCULADOS:"
    print *, " Voc_ref = ", Voc_ref
    print *, " Isc_ref = ", Isc_ref
    print *, " "
    print *, " Voc (calc) = ", Voc
    print *, " Isc (calc) = ", Isc
    print *, " "
    print *, " PUNTO DE MAXIMA POTENCIA (Extraido de la Tabla):"
    print *, " Vmp = ", Vmp, " V"
    print *, " Imp = ", Imp, " A"
    print *, " Pmp = ", Pmp, " W"
    print *, " "
    print *, " Potencia Total Estimada (Pmp * 40):"
    print *, " MPPT = ", MPPT, " W"
    print *, " "

    ! call plot_IV_ascii(Vdata, Idata, num_puntos+1)

end program explicit_model_IV

Embed on website

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