!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
!MNH_LIC for details. version 1.
!     #######################
       MODULE MODI_EOL_READER
!     #######################
!
INTERFACE
!
! ADNR
! 
SUBROUTINE READ_CSVDATA_FARM_ADNR(KLUNAM,HFILE,TPFARM)
        USE MODD_EOL_ADNR, ONLY: FARM
        INTEGER,            INTENT(IN)  :: KLUNAM       ! logical unit of the file
        CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
        TYPE(FARM),         INTENT(OUT) :: TPFARM       ! stored farm data
END SUBROUTINE READ_CSVDATA_FARM_ADNR
!
SUBROUTINE READ_CSVDATA_TURBINE_ADNR(KLUNAM,HFILE,TPTURBINE)
        USE MODD_EOL_ADNR, ONLY : TURBINE
        INTEGER,            INTENT(IN)  :: KLUNAM       ! logical unit of the file
        CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
        TYPE(TURBINE),      INTENT(OUT) :: TPTURBINE    ! stored turbine data
END SUBROUTINE READ_CSVDATA_TURBINE_ADNR
!
! ALM
!
SUBROUTINE READ_CSVDATA_FARM_ALM(KLUNAM,HFILE,TPFARM)
        USE MODD_EOL_ALM, ONLY: FARM
        INTEGER,            INTENT(IN)  :: KLUNAM       ! logical unit of the file
        CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
        TYPE(FARM),         INTENT(OUT) :: TPFARM       ! stored farm data
END SUBROUTINE READ_CSVDATA_FARM_ALM
!
SUBROUTINE READ_CSVDATA_TURBINE_ALM(KLUNAM,HFILE,TPTURBINE)
        USE MODD_EOL_ALM, ONLY : TURBINE
        INTEGER,            INTENT(IN)  :: KLUNAM       ! logical unit of the file
        CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
        TYPE(TURBINE),      INTENT(OUT) :: TPTURBINE    ! stored turbine data
END SUBROUTINE READ_CSVDATA_TURBINE_ALM

SUBROUTINE READ_CSVDATA_BLADE_ALM(KLUNAM,HFILE,TPTURBINE,TPBLADE)
        USE MODD_EOL_ALM, ONLY : TURBINE, BLADE
        INTEGER,            INTENT(IN)  :: KLUNAM       ! logical unit of the file
        CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
        TYPE(TURBINE),      INTENT(IN)  :: TPTURBINE    ! stored turbine data
        TYPE(BLADE),        INTENT(OUT) :: TPBLADE      ! stored blade data
END SUBROUTINE READ_CSVDATA_BLADE_ALM
!
SUBROUTINE READ_CSVDATA_AIRFOIL_ALM(KLUNAM,HFILE,TPBLADE,TPAIRFOIL)
        USE MODD_EOL_ALM, ONLY : BLADE, AIRFOIL
        INTEGER,            INTENT(IN)  :: KLUNAM       ! logical unit of the file
        CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
        TYPE(BLADE),        INTENT(IN)  :: TPBLADE      ! stored blade data (to select airfoils)
        TYPE(AIRFOIL), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: TPAIRFOIL  ! stored airfoil data
END SUBROUTINE READ_CSVDATA_AIRFOIL_ALM
!
SUBROUTINE HOW_MANY_LINES_OF(KLUNAM,HFILE,HNAME,KLINE) 
        INTEGER,            INTENT(IN)  :: KLUNAM       ! logical unit of the file
        CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
        CHARACTER(LEN=*),   INTENT(IN)  :: HNAME        ! turbine's name  
        INTEGER,            INTENT(OUT) :: KLINE
END SUBROUTINE HOW_MANY_LINES_OF
!
FUNCTION GET_AIRFOIL_ID(TPTURBINE,TPBLADE,TPAIRFOIL,PRADIUS) 
        USE MODD_EOL_ALM, ONLY : TURBINE, BLADE, AIRFOIL
        IMPLICIT NONE
        INTEGER                                   :: GET_AIRFOIL_ID
        TYPE(TURBINE),                INTENT(IN)  :: TPTURBINE    ! stored turbine data
        TYPE(BLADE),                  INTENT(IN)  :: TPBLADE      ! stored blade data
        TYPE(AIRFOIL), DIMENSION(:),  INTENT(IN)  :: TPAIRFOIL    ! stored airfoil data 
        REAL,                         INTENT(IN)  :: PRADIUS      ! Radius position studied
END FUNCTION GET_AIRFOIL_ID
!
END INTERFACE
!
END MODULE MODI_EOL_READER
!-------------------------------------------------------------------
!
!!****  *EOL_READER* -
!!
!!    PURPOSE
!!    -------
!!    Some usefull subs to read wind turbine's datas
!!
!!    AUTHOR
!!    ------
!!     PA. Joulin 		*CNRM & IFPEN*
!!
!!    MODIFICATIONS
!!    -------------
!!    Original     05/2018  
!!    Modification 21/10/20 (PA. Joulin) Updated for a main version
!!
!!---------------------------------------------------------------
!
!#########################################################
SUBROUTINE READ_CSVDATA_FARM_ADNR(KLUNAM,HFILE,TPFARM)
!        
USE MODD_EOL_ADNR,  ONLY: FARM
USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
!
IMPLICIT NONE
!
INTEGER,            INTENT(IN)    :: KLUNAM     ! logical unit of the file
CHARACTER(LEN=*),   INTENT(IN)    :: HFILE      ! file to read    
TYPE(FARM),         INTENT(OUT)   :: TPFARM     ! dummy stored data blade
!
LOGICAL                           :: GEXIST     ! Existence of file
!
INTEGER                           :: INBLINE    ! Nb of line in csv file
!
CHARACTER(LEN=400)                :: YSTRING   
!
! Read data
REAL                              :: ZPOS_X
REAL                              :: ZPOS_Y
REAL                              :: ZCT_INF
!
! Checking file existence
INQUIRE(FILE=HFILE, EXIST=GEXIST)
IF (.NOT.GEXIST) THEN
 CALL EOL_CSVNOTFOUND_ERROR(HFILE)
END IF
!
! Opening the file 
OPEN(UNIT=KLUNAM,FILE=HFILE, FORM='formatted', STATUS='OLD')
! Counting number of line  
REWIND(KLUNAM)
INBLINE=0
DO
 READ(KLUNAM,END=101,FMT='(A400)') YSTRING
 IF (LEN_TRIM(YSTRING) > 0) THEN
  INBLINE = INBLINE + 1
 END IF
END DO
!
101 CONTINUE
IF (INBLINE < 2) THEN
 CALL EOL_CSVEMPTY_ERROR(HFILE,INBLINE)
 STOP
ELSE
 ! Saving number of wind turbine 
 TPFARM%NNB_TURBINES = INBLINE - 1 
 ! Allocations 
 ALLOCATE(TPFARM%XPOS_X(TPFARM%NNB_TURBINES))
 ALLOCATE(TPFARM%XPOS_Y(TPFARM%NNB_TURBINES))
 ALLOCATE(TPFARM%XCT_INF(TPFARM%NNB_TURBINES))
 !
 ! New read 
 REWIND(KLUNAM)
 READ(KLUNAM,FMT='(A400)') YSTRING ! Header reading 
 !
 ! Saving data 
 DO INBLINE=1, TPFARM%NNB_TURBINES
  READ(KLUNAM,FMT='(A400)') YSTRING
  READ(YSTRING,*) ZPOS_X, ZPOS_Y, ZCT_INF
  TPFARM%XPOS_X(INBLINE)  = ZPOS_X
  TPFARM%XPOS_Y(INBLINE)  = ZPOS_Y
  TPFARM%XCT_INF(INBLINE) = ZCT_INF
 END DO
 CLOSE(KLUNAM)
 RETURN
END IF
!
END SUBROUTINE READ_CSVDATA_FARM_ADNR
!#########################################################
!
!#########################################################
SUBROUTINE READ_CSVDATA_TURBINE_ADNR(KLUNAM,HFILE,TPTURBINE)
!        
USE MODD_EOL_ADNR,  ONLY: TURBINE
USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
!
IMPLICIT NONE
!
INTEGER,            INTENT(IN)  :: KLUNAM     ! logical unit of the file
CHARACTER(LEN=*),   INTENT(IN)  :: HFILE      ! file to read    
TYPE(TURBINE),      INTENT(OUT) :: TPTURBINE  ! dummy stored data turbine
!
LOGICAL                         :: GEXIST     ! Existence of file
!
INTEGER                         :: INBLINE    ! Nb of line in csv file
!
CHARACTER(LEN=400)              :: YSTRING   
!
CHARACTER(LEN=80)               :: YWT_NAME
REAL                            :: ZH_HEIGHT
REAL                            :: ZR_MAX
!
! Checking file existence
INQUIRE(FILE=HFILE, EXIST=GEXIST)
IF (.NOT.GEXIST) THEN
 CALL EOL_CSVNOTFOUND_ERROR(HFILE)
END IF
!
! Opening 
OPEN(UNIT=KLUNAM,FILE=HFILE, FORM='formatted', STATUS='OLD')
!
! Counting number of line  
REWIND(KLUNAM)
INBLINE=0
DO
 READ(KLUNAM,END=101,FMT='(A400)') YSTRING
 IF (LEN_TRIM(YSTRING) > 0) THEN
  INBLINE = INBLINE + 1
 END IF
END DO
!
101 CONTINUE
IF (INBLINE /= 2) THEN
 CALL EOL_CSVEMPTY_ERROR(HFILE,INBLINE)
 STOP
ELSE 
 REWIND(KLUNAM)
 READ(KLUNAM,FMT='(A400)') YSTRING                    ! Header reading 
 READ(KLUNAM,FMT='(A400)') YSTRING                    ! Reading next line
 ! Read data 
 READ(YSTRING,*) YWT_NAME, ZH_HEIGHT, ZR_MAX          ! reading data
 TPTURBINE%CNAME      = YWT_NAME                      ! Saving them
 TPTURBINE%XH_HEIGHT  = ZH_HEIGHT
 TPTURBINE%XR_MAX     = ZR_MAX
 REWIND(KLUNAM)                                        ! Rembobinage, plutôt 2 fois qu'1 !
 RETURN
 CLOSE(KLUNAM)
END IF
!
END SUBROUTINE READ_CSVDATA_TURBINE_ADNR
!#########################################################
!
!#########################################################
SUBROUTINE READ_CSVDATA_FARM_ALM(KLUNAM,HFILE,TPFARM)
!        
USE MODD_EOL_ALM,   ONLY: FARM
USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
!
IMPLICIT NONE
!
INTEGER,            INTENT(IN)    :: KLUNAM     ! logical unit of the file
CHARACTER(LEN=*),   INTENT(IN)    :: HFILE      ! file to read    
TYPE(FARM),         INTENT(OUT)   :: TPFARM     ! dummy stored data blade
!
LOGICAL                           :: GEXIST     ! Existence of file
!
INTEGER                           :: INBLINE    ! Nb of line in csv file
!
CHARACTER(LEN=400)                :: YSTRING   
!
! Read data
REAL                              :: ZPOS_X
REAL                              :: ZPOS_Y
REAL                              :: ZOMEGA
REAL                              :: ZYAW
REAL                              :: ZPITCH
!
! Checking file existence
INQUIRE(FILE=HFILE, EXIST=GEXIST)
IF (.NOT.GEXIST) THEN
 CALL EOL_CSVNOTFOUND_ERROR(HFILE)
END IF
!
! Opening the file 
OPEN(UNIT=KLUNAM,FILE=HFILE, FORM='formatted', STATUS='OLD')
! Counting number of line  
REWIND(KLUNAM)
INBLINE=0
DO
 READ(KLUNAM,END=101,FMT='(A400)') YSTRING
 IF (LEN_TRIM(YSTRING) > 0) THEN
  INBLINE = INBLINE + 1
 END IF
END DO
!
101 CONTINUE
IF (INBLINE < 2) THEN
 CALL EOL_CSVEMPTY_ERROR(HFILE,INBLINE)
 STOP
ELSE
 ! Saving number of wind turbine 
 TPFARM%NNB_TURBINES = INBLINE - 1 
 ! Allocations 
 ALLOCATE(TPFARM%XPOS_X    (TPFARM%NNB_TURBINES))
 ALLOCATE(TPFARM%XPOS_Y    (TPFARM%NNB_TURBINES))
 ALLOCATE(TPFARM%XOMEGA    (TPFARM%NNB_TURBINES))
 ALLOCATE(TPFARM%XNAC_YAW  (TPFARM%NNB_TURBINES))
 ALLOCATE(TPFARM%XBLA_PITCH(TPFARM%NNB_TURBINES))
 !
 ! New read 
 REWIND(KLUNAM)
 READ(KLUNAM,FMT='(A400)') YSTRING ! Header reading 
 !
 ! Saving data 
 DO INBLINE=1, TPFARM%NNB_TURBINES
  READ(KLUNAM,FMT='(A400)') YSTRING
  READ(YSTRING,*) ZPOS_X, ZPOS_Y, ZOMEGA, ZYAW, ZPITCH
  TPFARM%XPOS_X(INBLINE)     = ZPOS_X
  TPFARM%XPOS_Y(INBLINE)     = ZPOS_Y
  TPFARM%XOMEGA(INBLINE)     = ZOMEGA
  TPFARM%XNAC_YAW(INBLINE)   = ZYAW
  TPFARM%XBLA_PITCH(INBLINE) = ZPITCH
 END DO
 CLOSE(KLUNAM)
 RETURN
END IF
!
END SUBROUTINE READ_CSVDATA_FARM_ALM
!#########################################################
!
!#########################################################
SUBROUTINE READ_CSVDATA_TURBINE_ALM(KLUNAM,HFILE,TPTURBINE)
!        
USE MODD_EOL_ALM,   ONLY: TURBINE
USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
!
IMPLICIT NONE
!
INTEGER,            INTENT(IN)  :: KLUNAM     ! logical unit of the file
CHARACTER(LEN=*),   INTENT(IN)  :: HFILE      ! file to read    
TYPE(TURBINE),      INTENT(OUT) :: TPTURBINE  ! dummy stored data turbine
!
LOGICAL                         :: GEXIST     ! Existence of file
!
INTEGER                         :: INBLINE    ! Nb of line in csv file
!
CHARACTER(LEN=400)              :: YSTRING   
!
CHARACTER(LEN=80)               :: YWT_NAME
INTEGER                         :: INB_BLADE
REAL                            :: ZH_HEIGHT
REAL                            :: ZR_MIN
REAL                            :: ZR_MAX
REAL                            :: ZNAC_TILT
REAL                            :: ZHUB_DEPORT
!
! Checking file existence
INQUIRE(FILE=HFILE, EXIST=GEXIST)
IF (.NOT.GEXIST) THEN
 CALL EOL_CSVNOTFOUND_ERROR(HFILE)
END IF
!
! Opening 
OPEN(UNIT=KLUNAM,FILE=HFILE, FORM='formatted', STATUS='OLD')
!
! Counting number of line  
REWIND(KLUNAM)
INBLINE=0
DO
 READ(KLUNAM,END=101,FMT='(A400)') YSTRING
 IF (LEN_TRIM(YSTRING) > 0) THEN
  INBLINE = INBLINE + 1
 END IF
END DO
!
101 CONTINUE
IF (INBLINE /= 2) THEN
 CALL EOL_CSVEMPTY_ERROR(HFILE,INBLINE)
 STOP
ELSE 
 REWIND(KLUNAM)
 READ(KLUNAM,FMT='(A400)') YSTRING                    ! Header reading 
 READ(KLUNAM,FMT='(A400)') YSTRING                    ! Reading next line
 ! Read data 
 READ(YSTRING,*) YWT_NAME, INB_BLADE, ZH_HEIGHT,&     ! reading data
                 ZR_MIN, ZR_MAX, ZNAC_TILT,     &
                 ZHUB_DEPORT 
 TPTURBINE%CNAME       = YWT_NAME                     ! Saving them
 TPTURBINE%NNB_BLADES  = INB_BLADE
 TPTURBINE%XH_HEIGHT   = ZH_HEIGHT
 TPTURBINE%XR_MIN      = ZR_MIN
 TPTURBINE%XR_MAX      = ZR_MAX
 TPTURBINE%XNAC_TILT   = ZNAC_TILT
 TPTURBINE%XH_DEPORT   = ZHUB_DEPORT
 REWIND(KLUNAM)                                       
 RETURN
 CLOSE(KLUNAM)
END IF
!
END SUBROUTINE READ_CSVDATA_TURBINE_ALM
!#########################################################
!
!#########################################################
SUBROUTINE READ_CSVDATA_BLADE_ALM(KLUNAM,HFILE,TPTURBINE,TPBLADE)
!       
USE MODD_EOL_ALM,   ONLY: TURBINE, BLADE, NNB_BLAELT
USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
USE MODI_EOL_ERROR, ONLY: EOL_BLADEDATA_ERROR
!
INTEGER,            INTENT(IN)  :: KLUNAM     ! logical unit of the file
CHARACTER(LEN=*),   INTENT(IN)  :: HFILE      ! file to read    
TYPE(TURBINE),      INTENT(IN)  :: TPTURBINE  ! stored turbine data
TYPE(BLADE),        INTENT(OUT) :: TPBLADE    ! dummy stored data blade
!
LOGICAL                         :: GEXIST     ! Existence of file
!
INTEGER                         :: INBLINE    ! Nb of line in csv file
INTEGER                         :: INBDATA    ! Nb of data (line/section) of blade
!
CHARACTER(LEN=400)              :: YSTRING
!
REAL              :: ZCENTER     ! Center pos. of elmt [m]
REAL              :: ZCHORD      ! Blade chord of elmt [m]
REAL              :: ZTWIST      ! Twist of elmt [rad]
CHARACTER(LEN=20) :: YAIRFOIL    ! Airfoil name [-]
!
! Checking file existence
INQUIRE(FILE=HFILE, EXIST=GEXIST)
IF (.NOT.GEXIST) THEN
 CALL EOL_CSVNOTFOUND_ERROR(HFILE)
END IF
!
! Ouverture 
OPEN(UNIT=KLUNAM,FILE=HFILE, FORM='formatted', STATUS='OLD')
! Counting number of line  
REWIND(KLUNAM)
INBLINE=0
DO
 READ(KLUNAM,END=101,FMT='(A400)') YSTRING
 IF (LEN_TRIM(YSTRING) > 0) THEN
  INBLINE = INBLINE + 1
 END IF
END DO
!
101 CONTINUE
IF (INBLINE < 2) THEN
 CALL EOL_CSVEMPTY_ERROR(HFILE,INBLINE)
 STOP
ELSE
 TPBLADE%NNB_BLAELT = NNB_BLAELT 
 ! Saving number of data 
 TPBLADE%NNB_BLADAT = INBLINE - 1 
 ALLOCATE(TPBLADE%XRAD(TPBLADE%NNB_BLADAT))
 ALLOCATE(TPBLADE%XCHORD(TPBLADE%NNB_BLADAT))
 ALLOCATE(TPBLADE%XTWIST(TPBLADE%NNB_BLADAT))
 ALLOCATE(TPBLADE%CAIRFOIL(TPBLADE%NNB_BLADAT))
 !
 ! New read
 REWIND(KLUNAM)
 READ(KLUNAM,FMT='(A400)') YSTRING                    ! Header reading 
 !
 ! Saving data
 DO INBLINE=1, TPBLADE%NNB_BLADAT
  READ(KLUNAM,FMT='(A400)') YSTRING
  READ(YSTRING,*) ZCENTER, ZCHORD, ZTWIST, YAIRFOIL  ! Reading data
  IF ((ZCENTER<=0.0) .OR. (ZCENTER>= 1.0)) THEN
   ! Checking data
   CALL EOL_BLADEDATA_ERROR(ZCENTER)
  ELSE
   ! Storing them
   TPBLADE%XRAD(INBLINE)     = ZCENTER*(TPTURBINE%XR_MAX-TPTURBINE%XR_MIN) & ! Data in %
                               + TPTURBINE%XR_MIN
   TPBLADE%XCHORD(INBLINE)   = ZCHORD
   TPBLADE%XTWIST(INBLINE)   = ZTWIST
   TPBLADE%CAIRFOIL(INBLINE) = YAIRFOIL
  END IF
 END DO
 CLOSE(KLUNAM)
 RETURN
END IF
!
END SUBROUTINE READ_CSVDATA_BLADE_ALM
!#########################################################
!
!#########################################################
SUBROUTINE READ_CSVDATA_AIRFOIL_ALM(KLUNAM,HFILE,TPBLADE,TPAIRFOIL)
!        
USE MODD_EOL_ALM,   ONLY: BLADE, AIRFOIL
USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
USE MODI_EOL_ERROR, ONLY: EOL_AIRFOILNOTFOUND_ERROR 
!
INTEGER,            INTENT(IN)  :: KLUNAM     ! logical unit of the file
CHARACTER(LEN=*),   INTENT(IN)  :: HFILE      ! file to read    
TYPE(BLADE),        INTENT(IN)  :: TPBLADE    ! stored blade data (to select airfoils)
TYPE(AIRFOIL), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: TPAIRFOIL  ! dummy stored data blade
!
LOGICAL                         :: GEXIST     ! Existence of file
!
INTEGER                         :: INBDATA    ! Nb of data (line/section) per airfoil
INTEGER                         :: INBLINE    ! Nb of line in csv file
LOGICAL                         :: GAIRFLAG   ! Flag for airfoil counting
!
INTEGER                         :: JI, JJ, IA ! loop control
INTEGER                         :: INBAIRFOIL ! Nb of differents airfoils on one blade
!
CHARACTER(LEN=400)              :: YSTRING
!
CHARACTER(LEN=15), DIMENSION(:), ALLOCATABLE    :: YAIRFOIL
!
CHARACTER(LEN=15) :: YREAD_NAME
REAL              :: ZAA        ! Attack Angle [rad]
REAL              :: ZRE        ! Reynolds Number [-]
REAL              :: ZCL        ! Lift Coef [-]
REAL              :: ZCD        ! Drag Coef [-]
REAL              :: ZCM        ! Moment Coef [-]
!
! Checking file existence
INQUIRE(FILE=HFILE, EXIST=GEXIST)
IF (.NOT.GEXIST) THEN
 CALL EOL_CSVNOTFOUND_ERROR(HFILE)
END IF
!
! Ouverture 
OPEN(UNIT=KLUNAM,FILE=HFILE, FORM='formatted', STATUS='OLD')
!
! 1. Counting number of differents airfoils along the blade and selection :
!
! Allcation of local airfoil array
ALLOCATE(YAIRFOIL(SIZE(TPBLADE%CAIRFOIL)))
!
YAIRFOIL(:) = ''
INBAIRFOIL = 1
YAIRFOIL(1) = TRIM(TPBLADE%CAIRFOIL(1))
!
DO JI=1, SIZE(TPBLADE%CAIRFOIL)
 GAIRFLAG = .FALSE.
 DO JJ=1, INBAIRFOIL
  IF (TRIM(TPBLADE%CAIRFOIL(JI)) == TRIM(YAIRFOIL(JJ))) THEN
   GAIRFLAG = .TRUE.
  END IF
 END DO
 IF (GAIRFLAG .EQV. .FALSE.) THEN
  INBAIRFOIL = INBAIRFOIL + 1
  YAIRFOIL(INBAIRFOIL) = TRIM(TPBLADE%CAIRFOIL(JI))
 END IF
END DO
ALLOCATE(TPAIRFOIL(INBAIRFOIL))
!
! 2. Reading and storing data :
!
DO IA = 1, INBAIRFOIL
 ! Array allocation
 CALL HOW_MANY_LINES_OF(KLUNAM,HFILE,YAIRFOIL(IA),INBDATA)
 ALLOCATE(TPAIRFOIL(IA)%XAA(INBDATA))
 ALLOCATE(TPAIRFOIL(IA)%XRE(INBDATA))
 ALLOCATE(TPAIRFOIL(IA)%XCL(INBDATA))
 ALLOCATE(TPAIRFOIL(IA)%XCD(INBDATA))
 ALLOCATE(TPAIRFOIL(IA)%XCM(INBDATA))
 !
 REWIND(KLUNAM)
 INBLINE = 0
 DO
  READ(KLUNAM,END=101,FMT='(A400)') YSTRING        ! Header
  !* reads the string
  IF (LEN_TRIM(YSTRING)>0) THEN
   READ(YSTRING,FMT=*) YREAD_NAME
   IF (TRIM(YREAD_NAME)==TRIM(YAIRFOIL(IA))) THEN  ! Read data
    INBLINE = INBLINE + 1
    READ(YSTRING,*) YREAD_NAME, ZAA, ZRE, &
                    ZCL, ZCD, ZCM
    ! Storing data
    TPAIRFOIL(IA)%CNAME            = YREAD_NAME
    TPAIRFOIL(IA)%XAA(INBLINE)     = ZAA
    TPAIRFOIL(IA)%XRE(INBLINE)     = ZRE
    TPAIRFOIL(IA)%XCL(INBLINE)     = ZCL
    TPAIRFOIL(IA)%XCD(INBLINE)     = ZCD
    TPAIRFOIL(IA)%XCM(INBLINE)     = ZCM
   ELSE                     ! The name doesnt appear during a new read..
    IF (INBLINE > 0) THEN   ! .. but it has already been found, ..
     REWIND(KLUNAM)         ! .. so it is the end of the data ..
     EXIT                   ! .. and we can exit :)
    END IF
   END IF
  END IF
 END DO
END DO
!
CLOSE(KLUNAM)
101 CONTINUE
 IF (INBLINE == 0) THEN
  CALL EOL_AIRFOILNOTFOUND_ERROR(HFILE,YAIRFOIL(IA))
  STOP
 END IF
END SUBROUTINE READ_CSVDATA_AIRFOIL_ALM
!#########################################################
!
!#########################################################
SUBROUTINE HOW_MANY_LINES_OF(KLUNAM,HFILE,HNAME,KLINE)
!
USE MODI_EOL_ERROR, ONLY: EOL_AIRFOILNOTFOUND_ERROR 
!
IMPLICIT NONE
!
INTEGER,            INTENT(IN)  :: KLUNAM       ! logical unit of the file
CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
CHARACTER(LEN=*),   INTENT(IN)  :: HNAME        ! turbine's name  
INTEGER,            INTENT(OUT) :: KLINE
!
!
CHARACTER(LEN=400)              :: YSTRING
CHARACTER(LEN=80)               :: HREAD_NAME
!
REWIND(KLUNAM)
KLINE=0
DO
 READ(KLUNAM,END=101,FMT='(A400)') YSTRING
!* reads the string
 IF (LEN_TRIM(YSTRING) > 0) THEN
 READ(YSTRING,FMT=*) HREAD_NAME
  IF (TRIM(HREAD_NAME)==TRIM(HNAME)) THEN
   KLINE = KLINE + 1
  ELSE                   ! The name doesnt appear during a new read..
   IF (KLINE > 0) THEN   ! .. but it has already been found, ..
    REWIND(KLUNAM)       ! .. so it is the end of the data ..
    RETURN               ! .. and we can return :)
   END IF
  END IF
 END IF
END DO
101 CONTINUE
 IF (KLINE == 0) THEN
  CALL EOL_AIRFOILNOTFOUND_ERROR(HFILE,HNAME)
  STOP
 END IF
END SUBROUTINE HOW_MANY_LINES_OF
!#########################################################
!
!#########################################################
FUNCTION GET_AIRFOIL_ID(TPTURBINE,TPBLADE,TPAIRFOIL,PRADIUS)
! Allows to link an airfoil from a TPBLADE, at a specific radius (PRADIUS)
! to the airfoils characteristics (TPAIRFOIL).
! The result is an integer (IAID) that should be used like that :
! IAID = GET_GET_AIRFOIL_ID(TPTURBINE,TPBLADE,TPAIRFOIL,PRADIUS)
! TPAIRFOIL(IAID)%MEMBER_OF_TPAIRFOIL
!
USE MODD_EOL_ALM, ONLY : TURBINE, BLADE, AIRFOIL
!
IMPLICIT NONE
!
TYPE(TURBINE),                INTENT(IN)  :: TPTURBINE    ! stored turbine data
TYPE(BLADE),                  INTENT(IN)  :: TPBLADE      ! stored blade data
TYPE(AIRFOIL), DIMENSION(:),  INTENT(IN)  :: TPAIRFOIL    ! stored arifoil data
REAL,                         INTENT(IN)  :: PRADIUS      ! Radius position studied
INTEGER                                   :: GET_AIRFOIL_ID
!
INTEGER                                   :: INB_BDATA    ! Total number of blade data
INTEGER                                   :: JBDATA       ! Index over blade's data
INTEGER                                   :: JA           ! Index over diffetents airfoils
REAL, DIMENSION(SIZE(TPBLADE%XRAD))       :: ZDELTARAD    ! 2*ZDELTARAD = section lenght
!
! Checking data
IF ((PRADIUS < TPTURBINE%XR_MIN) .OR. (PRADIUS > TPTURBINE%XR_MAX)) THEN
 PRINT*, 'The studied radius R = ', PRADIUS, ' is out of blade range : [', &
          TPTURBINE%XR_MIN, ';', TPTURBINE%XR_MAX, ']'
 RETURN
END IF
!
! Preliminaires
INB_BDATA = SIZE(TPBLADE%XRAD)
!
! Computes half length of sections
ZDELTARAD(1) = TPBLADE%XRAD(1) - TPTURBINE%XR_MIN
DO JBDATA=2,INB_BDATA-1
 ZDELTARAD(JBDATA) = TPBLADE%XRAD(JBDATA) &
                   - TPBLADE%XRAD(JBDATA-1) &
                   - ZDELTARAD(JBDATA-1)
END DO
ZDELTARAD(INB_BDATA) = TPTURBINE%XR_MAX - TPBLADE%XRAD(INB_BDATA)
!
! Looking for the section at r=PRADIUS 
DO JBDATA=1,INB_BDATA
 IF ((PRADIUS >= TPBLADE%XRAD(JBDATA)-ZDELTARAD(JBDATA)) .AND. &
     (PRADIUS <  TPBLADE%XRAD(JBDATA)+ZDELTARAD(JBDATA))) THEN
! Looking for the ID of the airfoil of this section
  DO JA=1,SIZE(TPAIRFOIL)
   IF (TRIM(TPBLADE%CAIRFOIL(JBDATA)) == TRIM(TPAIRFOIL(JA)%CNAME)) THEN
    GET_AIRFOIL_ID = JA
    EXIT
   END IF
  END DO
!
  EXIT
 END IF
END DO
!
END FUNCTION GET_AIRFOIL_ID
!#########################################################