! ==============================================================================
! 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
To embed this program on your website, copy the following code and paste it into your website's HTML: