! ==============================================================================
! PROGRAMA: Simulacion Celda GaAs - Salida Monitor + MPPT
! MODELO: Explicito (Benghanem & Alamri)
! AUTOR: Generado por Gemini
! ==============================================================================

PROGRAM Model_GaAs_Monitor
    IMPLICIT NONE

    ! --- Definicion de precision ---
    INTEGER, PARAMETER :: DP = KIND(1.0D0)

    ! --- Parametros Fisicos (Calculados previamente) ---
    REAL(DP), PARAMETER :: I_SC_ref = 0.2036_DP       ! A
    REAL(DP), PARAMETER :: I_0      = 1.78E-12_DP     ! A
    REAL(DP), PARAMETER :: R_PV     = 0.1316_DP       ! Ohms
    REAL(DP), PARAMETER :: V_T      = 0.1033_DP       ! V

    ! --- Variables ---
    INTEGER :: i, N_points
    REAL(DP) :: I_load, V_out, P_out
    REAL(DP) :: log_term, step_I
    
    ! --- Variables para encontrar el Maximo (MPP) ---
    REAL(DP) :: P_max_found = 0.0_DP
    REAL(DP) :: V_at_Pmax   = 0.0_DP
    REAL(DP) :: I_at_Pmax   = 0.0_DP

    ! --- Configuracion ---
    N_points = 50  ! Reducido a 50 puntos para que quepa bien en pantalla

    ! --- Encabezado de la Tabla ---
    PRINT *, '============================================================'
    PRINT *, '            CURVA I-V : CELDA GaAs (Triple Union)           '
    PRINT *, '============================================================'
    PRINT *, '   Corriente (A)  |    Voltaje (V)   |    Potencia (W)    '
    PRINT *, '------------------|------------------|--------------------'

    step_I = I_SC_ref / REAL(N_points, DP)

    ! --- Bucle Principal ---
    DO i = 0, N_points
        
        I_load = REAL(i, DP) * step_I
        
        ! Limite fisico para evitar error en Logaritmo
        IF (I_load >= I_SC_ref) I_load = I_SC_ref - 1.0E-6_DP

        ! 1. Calculo del Modelo Explicito
        log_term = (I_SC_ref - I_load + I_0) / I_0
        
        IF (log_term > 0.0_DP) THEN
            V_out = (V_T * LOG(log_term)) - (R_PV * I_load)
        ELSE
            V_out = 0.0_DP
        END IF

        ! Si el voltaje cae por debajo de cero, cortamos y salimos
        IF (V_out < 0.0_DP) THEN
            V_out = 0.0_DP
            P_out = 0.0_DP
            ! Imprimir ultima linea (cortocircuito)
            WRITE(*, '(3(4X, F10.6, 5X, "|"))') I_load, V_out, P_out
            EXIT 
        END IF

        ! 2. Calculo de Potencia
        P_out = V_out * I_load

        ! 3. Imprimir linea en el monitor
        ! Formato: F10.6 significa numero decimal con 6 digitos tras la coma
        WRITE(*, '(3(4X, F10.6, 5X, "|"))') I_load, V_out, P_out

        ! 4. Algoritmo de busqueda del Maximo (MPPT)
        IF (P_out > P_max_found) THEN
            P_max_found = P_out
            V_at_Pmax   = V_out
            I_at_Pmax   = I_load
        END IF

    END DO

    ! --- Reporte Final del Punto de Maxima Potencia ---
    PRINT *, '------------------|------------------|--------------------'
    PRINT *, ''
    PRINT *, 'RESULTADOS DEL ANALISIS:'
    PRINT *, '========================'
    PRINT *, 'Punto de Maxima Potencia Encontrado (MPP Simulado):'
    WRITE(*, *) ' > P_max (W): ', P_max_found
    WRITE(*, *) ' > V_mp  (V): ', V_at_Pmax
    WRITE(*, *) ' > I_mp  (A): ', I_at_Pmax
    PRINT *, ''
    PRINT *, 'Comparacion con Datasheet:'
    PRINT *, ' > V_mp (Datasheet): 2.29 V'
    PRINT *, ' > I_mp (Datasheet): 0.1939 A'
    
END PROGRAM Model_GaAs_Monitor

Embed on website

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