PROGRAM ModeloExplicitoPV
  IMPLICIT NONE
  
  ! --- Declaración de Variables ---
  ! Parámetros del módulo (Datos de entrada)
  REAL :: Isc, Voc, Im, Vm
  
  ! Constantes del modelo
  REAL :: C1, C2
  
  ! Variables para el bucle de la curva
  REAL :: V, I
  INTEGER :: k, num_puntos
  REAL :: paso_v

  ! --- 1. Definición de Parámetros (Ejemplo 1: Isophoton) ---
  ! Estos valores corresponden a la Sección "Example 1" del paper
  Isc = 16.8e-3  ! Corriente de Cortocircuito (A)
  Voc = 2.63     ! Voltaje de Circuito Abierto (V)
  Im  = 16.0e-3  ! Corriente en Máxima Potencia (A)
  Vm  = 2.29     ! Voltaje en Máxima Potencia (V)

  WRITE(*,*) "------------------------------------------------"
  WRITE(*,*) "   SIMULACION DEL MODELO EXPLICITO (SEC 2.1)    "
  WRITE(*,*) "------------------------------------------------"
  WRITE(*,*) "Parametros de entrada:"
  WRITE(*,*) "Isc =", Isc, "A"
  WRITE(*,*) "Voc =", Voc, "V"
  WRITE(*,*) "Im  =", Im,  "A"
  WRITE(*,*) "Vm  =", Vm,  "V"
  WRITE(*,*) ""

  ! --- 2. Cálculo de Constantes Intermedias ---
  
  ! Cálculo de C2
  ! Fórmula: C2 = ((Vm/Voc) - 1) / ln(1 - Im/Isc)
  ! Nota: LOG() en Fortran es el logaritmo natural
  C2 = ((Vm / Voc) - 1.0) / LOG(1.0 - (Im / Isc))
  
  ! Cálculo de C1
  ! Fórmula: C1 = (1 - Im/Isc) * exp(-Vm / (C2 * Voc))
  C1 = (1.0 - (Im / Isc)) * EXP(-Vm / (C2 * Voc))

  WRITE(*,*) "Constantes calculadas:"
  WRITE(*,*) "C2 =", C2
  WRITE(*,*) "C1 =", C1
  WRITE(*,*) ""

  ! --- 3. Generación de la Serie de Puntos (Curva I-V) ---
  ! Generaremos 21 puntos desde 0V hasta Voc
  num_puntos = 20
  paso_v = Voc / REAL(num_puntos)

  WRITE(*,*) "------------------------------------------------"
  WRITE(*,*) "   TABLA DE RESULTADOS (CURVA I-V FIG. 3)       "
  WRITE(*,*) "------------------------------------------------"
  WRITE(*,*) "Voltaje (V)      Corriente (I)"
  WRITE(*,*) "-----------      -------------"

  DO k = 0, num_puntos
     ! Calcular voltaje actual
     V = REAL(k) * paso_v
     
     ! Ecuación Principal (Eq. 1 del artículo):
     ! I = Isc * [ 1 - C1 * ( exp( V / (C2 * Voc) ) - 1 ) ]
     
     ! Desglose para claridad y evitar overflow numérico si V es muy alto
     IF (V > Voc) THEN
        I = 0.0
     ELSE
        I = Isc * (1.0 - C1 * (EXP(V / (C2 * Voc)) - 1.0))
     END IF

     ! Corrección física: La corriente no puede ser negativa
     IF (I < 0.0) I = 0.0

     ! Imprimir con formato (F10.2 para voltaje, F10.4 para corriente)
     WRITE(*, '(F10.2, T20, F10.4)') V, I
  END DO

  WRITE(*,*) "------------------------------------------------"
  
END PROGRAM ModeloExplicitoPV

Embed on website

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