From eaff7e58366ca504529b46d61d503f493473b99d Mon Sep 17 00:00:00 2001
From: joulinp <joulin.pierre-antoine@ifpen.fr>
Date: Fri, 7 Apr 2023 17:52:52 +0200
Subject: [PATCH] Integration of ADR in existing EOL subroutines

---
 src/MNH/eol_error.f90          |  29 ++
 src/MNH/eol_main.f90           |   8 +
 src/MNH/eol_maths.f90          |  58 +++-
 src/MNH/eol_printer.f90        | 300 +++++++++++++++++++-
 src/MNH/eol_reader.f90         | 493 +++++++++++++++++++++++++++++++--
 src/MNH/modd_eol_shared_io.f90 |  14 +
 6 files changed, 875 insertions(+), 27 deletions(-)

diff --git a/src/MNH/eol_error.f90 b/src/MNH/eol_error.f90
index c6c221f9f..1c45428b6 100644
--- a/src/MNH/eol_error.f90
+++ b/src/MNH/eol_error.f90
@@ -40,6 +40,15 @@ SUBROUTINE EOL_BLADEDATA_ERROR(PDELTARAD)
    REAL, INTENT(IN) :: PDELTARAD               ! Span lenght of an element
 END SUBROUTINE EOL_BLADEDATA_ERROR
 !
+!
+! ***
+! ADR
+! ***
+!
+SUBROUTINE EOL_ADRELT_ERROR(PDXX,PDYY,PDZZ,XRAD,NNB_RADELT,NNB_AZIELT)
+   REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ    ! mesh size
+END SUBROUTINE EOL_ADRELT_ERROR  
+!
 END INTERFACE
 !
 END MODULE MODI_EOL_ERROR
@@ -164,3 +173,23 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'EOL_BLADEDATA_ERROR' )
 END SUBROUTINE EOL_BLADEDATA_ERROR
 !#########################################################
 !
+SUBROUTINE EOL_ADRELT_ERROR(PDXX,PDYY,PDZZ)
+!
+USE MODD_EOL_ADR, ONLY: BLADE, NNB_RADELT, NNB_AZIELT
+USE MODE_MSG
+USE MODD_CST,     ONLY: XPI
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ    ! mesh size
+!
+!IF (NNB_RADELT < (XRAD/PDXX)) THEN
+! CMNHMSG(1) = 'EOL error: error in radial elements number '
+! CMNHMSG(2) = 'The number of radial elements is too small '
+
+! IF (NNB_AZIELT < (2d0*XPI*XRAD/PDXX)) THEN
+!  CMNHMSG(1) = 'EOL error: error in azimutal elements number '
+!  CMNHMSG(2) = 'The number of azimutal elements is too small '
+
+! END IF 
+!END IF 
+!CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'EOL_ADRELT_ERROR' )
+END SUBROUTINE EOL_ADRELT_ERROR 
diff --git a/src/MNH/eol_main.f90 b/src/MNH/eol_main.f90
index 6b0633c1d..d3813e016 100644
--- a/src/MNH/eol_main.f90
+++ b/src/MNH/eol_main.f90
@@ -59,6 +59,7 @@ END MODULE MODI_EOL_MAIN
 !!    MODIFICATIONS
 !!    -------------
 !!     21/10/20      Original
+!!        09/22      H. Toumi : adding ADR model
 !!
 !!---------------------------------------------------------------
 !
@@ -69,6 +70,7 @@ END MODULE MODI_EOL_MAIN
 ! To work with wind turbines
 USE MODD_EOL_MAIN
 USE MODI_EOL_ADNR
+USE MODI_EOL_ADR
 USE MODI_EOL_ALM
 USE MODI_EOL_SMEAR
 ! To play with MPI
@@ -205,6 +207,12 @@ SELECT CASE(CMETH_EOL)
                 ZUT_M, ZVT_M, ZWT_M,    &
                 XFX_RG, XFY_RG, XFZ_RG  )
 !
+ CASE('ADR') ! Actuator Disc Rotating
+   CALL EOL_ADR(KTCOUNT, PTSTEP,        &
+                PDXX, PDYY, PDZZ,       &
+                ZRHO_M,                 & 
+                ZUT_M, ZVT_M, ZWT_M,    &
+                XFX_RG, XFY_RG, XFZ_RG  )
 END SELECT
 !
 !*       3.2    Sharing 3D field
diff --git a/src/MNH/eol_maths.f90 b/src/MNH/eol_maths.f90
index 81e2a0a88..465af6593 100644
--- a/src/MNH/eol_maths.f90
+++ b/src/MNH/eol_maths.f90
@@ -3,8 +3,24 @@
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-! Modifications:
-!  P. Wautelet 19/07/2021: replace double precision by real to allow MNH_REAL=4 compilation
+!!
+!!****  *MODI_EOL_MATHS* -
+!!
+!!    PURPOSE
+!!    -------
+!!     Contains all mathematical functions for EOL computations.
+!!    
+!!    AUTHOR
+!!    ------
+!!     PA. Joulin               *CNRM & IFPEN*
+!!
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!     Original     24/01/17
+!!     P. Wautelet  19/07/2021: replace double precision by real to allow MNH_REAL=4 compilation
+!!     H. Toumi     04/23 : adding ADR functions   
+!!
 !-----------------------------------------------------------------
 !     #######################
        MODULE MODI_EOL_MATHS
@@ -37,6 +53,16 @@ SUBROUTINE GET_ORI_MAT_Z(PTHETA, PORI_MAT_Z)
         REAL, DIMENSION(3,3), INTENT(OUT)  :: PORI_MAT_Z  ! Matrix
 END SUBROUTINE GET_ORI_MAT_Z
 !
+FUNCTION GET_VEC_CYL(VEC_CART)
+        REAL, DIMENSION(3), INTENT(IN)     :: VEC_CART    ! cartesian vector
+        REAL, DIMENSION(3)                 :: GET_VEC_CYL ! cylindrical vector
+END FUNCTION GET_VEC_CYL
+!
+FUNCTION GET_VEC_CART(VEC_CYL)
+        REAL, DIMENSION(3), INTENT(IN)     :: VEC_CYL      ! cartesian vector
+        REAL, DIMENSION(3)                 :: GET_VEC_CART ! cylindrical vector
+END FUNCTION GET_VEC_CART
+!
 FUNCTION INTERP_SPLCUB(PAV, PX, PY)
         REAL                           :: INTERP_SPLCUB ! interface
         REAL,               INTENT(IN) :: PAV  ! Abscissa where spline is to be evaluate
@@ -157,6 +183,34 @@ END SUBROUTINE GET_ORI_MAT_Z
 !#########################################################
 !
 !#########################################################
+FUNCTION GET_VEC_CYL(VEC_CART)
+! Obtain cylindrical coordinates from a cartesian vector
+!
+        REAL, DIMENSION(3), INTENT(IN)     :: VEC_CART    ! cartesian vector
+        REAL, DIMENSION(3)                 :: GET_VEC_CYL     ! cylindrical vector
+!
+        GET_VEC_CYL(1) = SQRT(VEC_CART(1)**2+VEC_CART(2)**2)
+        GET_VEC_CYL(2) = ATAN2(VEC_CART(2),VEC_CART(1))
+        GET_VEC_CYL(3) = VEC_CART(3)
+!
+END FUNCTION GET_VEC_CYL
+!#########################################################
+!
+!#########################################################
+FUNCTION GET_VEC_CART(VEC_CYL)
+! Obtain cylindrical coordinates from a cartesian vector
+!
+        REAL, DIMENSION(3), INTENT(IN)     :: VEC_CYL    ! cartesian vector
+        REAL, DIMENSION(3)                 :: GET_VEC_CART     ! cylindrical vector
+!
+        GET_VEC_CART(1) = VEC_CYL(1)*COS(VEC_CYL(2))
+        GET_VEC_CART(2) = VEC_CYL(1)*SIN(VEC_CYL(2))
+        GET_VEC_CART(3) = VEC_CYL(3)
+!
+END FUNCTION GET_VEC_CART
+!#########################################################
+!
+!#########################################################
 FUNCTION INTERP_SPLCUB(PAV, PX, PY)
 ! adapted from https://ww2.odu.edu/~agodunov/computing/programs/book2/Ch01/spline.f90
 !
diff --git a/src/MNH/eol_printer.f90 b/src/MNH/eol_printer.f90
index b4fe72816..c4198d4b6 100644
--- a/src/MNH/eol_printer.f90
+++ b/src/MNH/eol_printer.f90
@@ -26,6 +26,40 @@ SUBROUTINE PRINT_DATA_TURBINE_ADNR(KFILE,TPTURBINE)
 END SUBROUTINE PRINT_DATA_TURBINE_ADNR
 !
 ! ***
+! ADR
+! ***
+!
+SUBROUTINE PRINT_DATA_FARM_ADR(KFILE,TPFARM)
+        USE MODD_EOL_ADR, ONLY: FARM
+        INTEGER,                     INTENT(IN) :: KFILE         ! output file
+        TYPE(FARM),                  INTENT(IN) :: TPFARM        ! stored farm data
+END SUBROUTINE PRINT_DATA_FARM_ADR
+!
+SUBROUTINE PRINT_DATA_TURBINE_ADR(KFILE,TPTURBINE)
+        USE MODD_EOL_ADR, ONLY : TURBINE
+        INTEGER,                     INTENT(IN) :: KFILE         ! output file
+        TYPE(TURBINE),               INTENT(IN) :: TPTURBINE     ! stored turbine data
+END SUBROUTINE PRINT_DATA_TURBINE_ADR
+!
+SUBROUTINE PRINT_DATA_BLADE_ADR(KFILE,TPBLADE)
+        USE MODD_EOL_ADR, ONLY : BLADE
+        INTEGER,                     INTENT(IN) :: KFILE         ! output file
+        TYPE(BLADE),                 INTENT(IN) :: TPBLADE       ! stored blade data
+END SUBROUTINE PRINT_DATA_BLADE_ADR
+!
+SUBROUTINE PRINT_DATA_AIRFOIL_ADR(KFILE,TPAIRFOIL)
+        USE MODD_EOL_ADR, ONLY : AIRFOIL
+        INTEGER,                     INTENT(IN) :: KFILE         ! output file
+        TYPE(AIRFOIL), DIMENSION(:), INTENT(IN) :: TPAIRFOIL     ! stored airfoil data
+END SUBROUTINE PRINT_DATA_AIRFOIL_ADR
+!
+SUBROUTINE OPEN_TECOUT_ADR(KFILE, KTCOUNT)
+        INTEGER,                     INTENT(IN)   :: KFILE       ! File index
+        INTEGER,                     INTENT(IN)   :: KTCOUNT     ! Time step index
+END SUBROUTINE OPEN_TECOUT_ADR
+!
+!
+! ***
 ! ALM
 ! ***
 !
@@ -53,11 +87,11 @@ SUBROUTINE PRINT_DATA_AIRFOIL_ALM(KFILE,TPAIRFOIL)
         TYPE(AIRFOIL), DIMENSION(:), INTENT(IN) :: TPAIRFOIL     ! stored airfoil data
 END SUBROUTINE PRINT_DATA_AIRFOIL_ALM
 !
-SUBROUTINE OPEN_TECOUT(KFILE, KTCOUNT, KTSUBCOUNT)
+SUBROUTINE OPEN_TECOUT_ALM(KFILE, KTCOUNT, KTSUBCOUNT)
         INTEGER,                     INTENT(IN)   :: KFILE       ! File index
         INTEGER,                     INTENT(IN)   :: KTCOUNT     ! Time step index
         INTEGER,                     INTENT(IN)   :: KTSUBCOUNT  ! Subtime step index
-END SUBROUTINE OPEN_TECOUT
+END SUBROUTINE OPEN_TECOUT_ALM
 !
 SUBROUTINE PRINT_TECOUT(KFILE,PVAR)
         INTEGER,                     INTENT(IN)   :: KFILE       ! File index
@@ -69,6 +103,25 @@ SUBROUTINE PRINT_TSPLIT(KNBSUBCOUNT,PTSUBSTEP)
         REAL,                        INTENT(IN)   :: PTSUBSTEP   ! sub timestep
 END SUBROUTINE PRINT_TSPLIT
 !
+! 3D FRAMES
+!
+SUBROUTINE OPEN_3DCSV_ADR(KFILE, KTCOUNT)
+        INTEGER,                     INTENT(IN)   :: KFILE       ! File index
+        INTEGER,                     INTENT(IN)   :: KTCOUNT     ! Time step index
+END SUBROUTINE OPEN_3DCSV_ADR
+!
+SUBROUTINE OPEN_3DCSV_ALM(KFILE, KTCOUNT, KTSUBCOUNT)
+        INTEGER,                     INTENT(IN)   :: KFILE       ! File index
+        INTEGER,                     INTENT(IN)   :: KTCOUNT     ! Time step index
+        INTEGER,                     INTENT(IN)   :: KTSUBCOUNT  ! Subtime step index
+END SUBROUTINE OPEN_3DCSV_ALM
+!
+SUBROUTINE PRINT_3DFRM(KFILE,HPART,PMAT,PPOS)
+        INTEGER,                     INTENT(IN)   :: KFILE       ! File index
+        CHARACTER(LEN=3),            INTENT(IN)   :: HPART       ! Part of the wind turbine
+        REAL, DIMENSION(3,3),        INTENT(IN)   :: PMAT        ! Frame to plot
+        REAL, DIMENSION(3),          INTENT(IN)   :: PPOS        ! Frame origin
+END SUBROUTINE PRINT_3DFRM
 !
 END INTERFACE
 !
@@ -88,6 +141,7 @@ END MODULE MODI_EOL_PRINTER
 !!    MODIFICATIONS
 !!    -------------
 !!    Original     26/10/2020  
+!!    H. Toumi     09/22 adding ADR functions
 !!
 !!---------------------------------------------------------------
 !
@@ -151,6 +205,135 @@ END IF
 END SUBROUTINE PRINT_DATA_TURBINE_ADNR
 !#########################################################
 !
+! ADR
+!
+!#########################################################
+SUBROUTINE PRINT_DATA_FARM_ADR(KFILE,TPFARM)
+!        
+USE MODD_EOL_ADR,  ONLY : FARM
+USE MODD_EOL_SHARED_IO, ONLY : CFARM_CSVDATA
+USE MODD_VAR_ll,   ONLY : IP                    ! only master cpu
+!
+IMPLICIT NONE
+!
+INTEGER,    INTENT(IN) :: KFILE    ! File index
+TYPE(FARM), INTENT(IN) :: TPFARM   ! dummy stored farm data
+!
+INTEGER  :: JROT    ! Loop index
+!
+IF (IP==1) THEN
+ WRITE(KFILE,*) ''
+ WRITE(KFILE,*) '======================== WIND TURBINE DATA ========================'
+ WRITE(KFILE,*) ''
+ WRITE(KFILE,*) '---- Farm ----'
+ WRITE(KFILE,*) 'Data from file                  : ', TRIM(CFARM_CSVDATA)
+ WRITE(KFILE,*) 'Number of turbines              : ', TPFARM%NNB_TURBINES
+ WRITE(KFILE,*) 'Tower base positions (X,Y) [m]  : '
+ DO JROT=1, TPFARM%NNB_TURBINES
+  WRITE(KFILE, '(1X,A,I3,A,F10.1,A,F10.1,A)') 'n.', JROT,&
+         ': (', TPFARM%XPOS_X(JROT),',',TPFARM%XPOS_Y(JROT),')'
+ END DO
+ WRITE(KFILE,*) 'Working state (rad/s,rad,rad)   : '
+ DO JROT=1, TPFARM%NNB_TURBINES
+  WRITE(KFILE, '(1X,A,I3,A,F10.5,A,F10.5,A,F10.5)') 'n.', JROT,&
+         ': Omega = ',   TPFARM%XOMEGA(JROT),  &
+         ' ; Yaw = ',     TPFARM%XNAC_YAW(JROT),&
+         ' ; Pitch = ',   TPFARM%XBLA_PITCH(JROT)
+ END DO
+ WRITE(KFILE,*) ''
+END IF
+!
+END SUBROUTINE PRINT_DATA_FARM_ADR
+!#########################################################
+!
+!#########################################################
+SUBROUTINE PRINT_DATA_TURBINE_ADR(KFILE,TPTURBINE)
+!        
+USE MODD_EOL_ADR,  ONLY : TURBINE
+USE MODD_EOL_SHARED_IO, ONLY : CTURBINE_CSVDATA
+USE MODD_VAR_ll,   ONLY : IP                    ! only master cpu
+!
+IMPLICIT NONE
+!
+INTEGER,       INTENT(IN)  :: KFILE      ! File index
+TYPE(TURBINE), INTENT(IN)  :: TPTURBINE  ! dummy stored turbine data
+!
+IF (IP==1) THEN
+ WRITE(KFILE,*) '---- Turbine ----'
+ WRITE(KFILE,*             ) 'Data from file                  : ', TRIM(CTURBINE_CSVDATA)
+ WRITE(KFILE,'(1X,A,A10)'  ) 'Wind turbine                    : ', TPTURBINE%CNAME
+ WRITE(KFILE,'(1X,A,I10)'  ) 'Number of blades                : ', TPTURBINE%NNB_BLADES
+ WRITE(KFILE,'(1X,A,F10.1)') 'Hub height [m]                  : ', TPTURBINE%XH_HEIGHT
+ WRITE(KFILE,'(1X,A,F10.3)') 'Blade min radius [m]            : ', TPTURBINE%XR_MIN
+ WRITE(KFILE,'(1X,A,F10.3)') 'Blade max radius [m]            : ', TPTURBINE%XR_MAX
+ WRITE(KFILE,'(1X,A,F10.3)') 'Nacelle tilt [rad]              : ', TPTURBINE%XNAC_TILT
+ WRITE(KFILE,'(1X,A,F10.3)') 'Hub deport [m]                  : ', TPTURBINE%XH_DEPORT
+ WRITE(KFILE,*) ''
+END IF
+!
+END SUBROUTINE PRINT_DATA_TURBINE_ADR
+!#########################################################
+!
+!#########################################################
+SUBROUTINE PRINT_DATA_BLADE_ADR(KFILE,TPBLADE)
+!        
+USE MODD_EOL_ADR,  ONLY : BLADE
+USE MODD_EOL_SHARED_IO, ONLY : CBLADE_CSVDATA
+USE MODD_VAR_ll,   ONLY : IP                    ! only master cpu
+!
+IMPLICIT NONE
+!
+INTEGER,     INTENT(IN)  :: KFILE    ! File index
+TYPE(BLADE), INTENT(IN)  :: TPBLADE  ! dummy stored blade data
+!
+IF (IP==1) THEN
+ WRITE(KFILE,*) '---- Blade ----'
+ WRITE(KFILE,*             ) 'Data from file                    : ', TRIM(CBLADE_CSVDATA)
+ WRITE(KFILE,'(1X,A,I10)'  ) 'Nb of data (from data file)       : ', TPBLADE%NNB_BLADAT
+ WRITE(KFILE,'(1X,A,F10.1)') 'First node radius [m]             : ', TPBLADE%XRAD(1)
+ WRITE(KFILE,'(1X,A,F10.1)') 'Last node radius [m]              : ', TPBLADE%XRAD(TPBLADE%NNB_BLADAT)
+ WRITE(KFILE,'(1X,A,F10.1)') 'Chord max. [m]                    : ', MAXVAL(TPBLADE%XCHORD(:))
+ WRITE(KFILE,'(1X,A,I10)'  ) 'Nb of radial element (from nam)   : ', TPBLADE%NNB_RADELT
+ WRITE(KFILE,'(1X,A,I10)'  ) 'Nb of azimutal element (from nam) : ', TPBLADE%NNB_AZIELT
+ WRITE(KFILE,*) ''
+END IF
+!
+END SUBROUTINE PRINT_DATA_BLADE_ADR
+!#########################################################
+!
+!#########################################################
+SUBROUTINE PRINT_DATA_AIRFOIL_ADR(KFILE,TPAIRFOIL)
+!        
+USE MODD_EOL_ADR,  ONLY : AIRFOIL
+USE MODD_EOL_SHARED_IO, ONLY : CAIRFOIL_CSVDATA
+USE MODD_VAR_ll,   ONLY : IP                    ! only master cpu
+!
+IMPLICIT NONE
+!
+INTEGER,                     INTENT(IN)  :: KFILE        ! File index
+TYPE(AIRFOIL), DIMENSION(:), INTENT(IN)  :: TPAIRFOIL    ! dummy stored airfoil data
+!
+INTEGER :: JA                  
+!
+IF (IP==1) THEN
+ WRITE(KFILE,*) '---- Airfoils ----'
+ WRITE(KFILE,*             ) 'Data from file                  : ', TRIM(CAIRFOIL_CSVDATA)
+ WRITE(KFILE,'(1X,A,I10)'  ) 'Nb of airfoils (from data file) : ', SIZE(TPAIRFOIL)
+ WRITE(KFILE,'(1X,A)'      ) 'Different airfoils              : '
+ DO JA=1,SIZE(TPAIRFOIL)
+  WRITE(KFILE,'(1X,A,I3,A,A)') 'Airfoil n.', JA,&
+       ': ', TPAIRFOIL(JA)%CNAME
+ END DO
+ WRITE(KFILE,*) ''
+ WRITE(KFILE,*) '==================================================================='
+ WRITE(KFILE,*) ''
+END IF
+!
+END SUBROUTINE PRINT_DATA_AIRFOIL_ADR
+!#########################################################
+!
+! ALM
+!
 !#########################################################
 SUBROUTINE PRINT_DATA_FARM_ALM(KFILE,TPFARM)
 !        
@@ -274,10 +457,47 @@ END IF
 !
 END SUBROUTINE PRINT_DATA_AIRFOIL_ALM
 !#########################################################
+!!
+!#########################################################
+SUBROUTINE OPEN_TECOUT_ADR(KFILE, KTCOUNT)
+!
+USE MODD_EOL_ADR, ONLY:TFARM,TTURBINE,TBLADE
+!
+IMPLICIT NONE
+!
+INTEGER, INTENT(OUT)  :: KFILE      ! File index
+INTEGER, INTENT(IN)   :: KTCOUNT    ! Time step index
+!
+INTEGER  :: INB_WT, INB_RADELT, INB_AZIELT        ! Total numbers of wind turbines, radial elt, and azimutal elt
+INTEGER  :: INB_TELT, INB_NELT                    ! Total numbers of tower elt, and nacelle elt
+INTEGER  :: ITOTELT                               ! Total number of points
+!
+CHARACTER(LEN=1024) :: HFILE      ! File name
+!
+INB_WT        = TFARM%NNB_TURBINES
+INB_RADELT    = TBLADE%NNB_RADELT
+INB_AZIELT    = TBLADE%NNB_AZIELT
+! Hard coded variables, but they will be useful in next updates
+INB_TELT = 2
+INB_NELT = 2
+!
+ITOTELT = INB_WT*(INB_TELT+INB_NELT+INB_AZIELT*INB_RADELT)
+!
+! File name and opening
+WRITE(HFILE, "(A18,I4.4,A3)") "Tecplot2.0_Output_", KTCOUNT,".tp"
+OPEN( NEWUNIT=KFILE, file=HFILE, form="FORMATTED")
+!
+! Tecplot Header
+WRITE(KFILE,*) 'TITLE="Wind Turbines Points"'
+WRITE(KFILE,*) 'VARIABLES="X" "Y" "Z"'
+WRITE(KFILE,*) 'ZONE I=',ITOTELT,' J=3 K=1 DATAPACKING=POINT'
+!
+END SUBROUTINE OPEN_TECOUT_ADR
+!#########################################################
 !
 !
 !#########################################################
-SUBROUTINE OPEN_TECOUT(KFILE, KTCOUNT, KTSUBCOUNT)
+SUBROUTINE OPEN_TECOUT_ALM(KFILE, KTCOUNT, KTSUBCOUNT)
 !
 USE MODD_EOL_ALM, ONLY:TFARM,TTURBINE,TBLADE
 !
@@ -311,7 +531,7 @@ WRITE(KFILE,*) 'TITLE="Wind Turbines Points"'
 WRITE(KFILE,*) 'VARIABLES="X" "Y" "Z"'
 WRITE(KFILE,*) 'ZONE I=',ITOTELT,' J=3 K=1 DATAPACKING=POINT'
 !
-END SUBROUTINE OPEN_TECOUT
+END SUBROUTINE OPEN_TECOUT_ALM
 !#########################################################
 !
 !#########################################################
@@ -354,4 +574,76 @@ WRITE(KFILE,'(A,A,A,A,A,F10.8,A)')                                 &
  'Please, turn on the time-splitting method (LTIMESPLIT=.TRUE.), ',&
  'or decrease XTSTEP to a value lower than ', PMAXTSTEP, ' sec.'
 END SUBROUTINE PRINT_ERROR_WTCFL
+!#########################################################
+!
+!#########################################################
+SUBROUTINE OPEN_3DCSV_ALM(KFILE, KTCOUNT, KTSUBCOUNT)
+!
+IMPLICIT NONE
+!
+INTEGER, INTENT(OUT)           :: KFILE      ! File index
+INTEGER, INTENT(IN)            :: KTCOUNT    ! Time step index
+INTEGER, INTENT(IN)            :: KTSUBCOUNT ! Subtime step index
+!
+!
+CHARACTER(LEN=1024) :: HFILE      ! File name
+!
+! File name and opening
+WRITE(HFILE, "(A6,I4.4,I2.2,A4)") "CSV3D_", KTCOUNT, KTSUBCOUNT,".csv"
+OPEN( NEWUNIT=KFILE, file=HFILE, form="FORMATTED")
+!
+! CSV Header
+WRITE(KFILE,'(A50)') 'Frame;&
+                      R11;R12;R13;&
+                      R21;R22;R23;&
+                      R31;R32;R33;&
+                      P1;P2;P3'
+!
+END SUBROUTINE OPEN_3DCSV_ALM
+!#########################################################
+!
+!#########################################################
+SUBROUTINE OPEN_3DCSV_ADR(KFILE, KTCOUNT)
+!
+IMPLICIT NONE
+!
+INTEGER, INTENT(OUT)           :: KFILE      ! File index
+INTEGER, INTENT(IN)            :: KTCOUNT    ! Time step index
+!
+!
+CHARACTER(LEN=1024) :: HFILE      ! File name
+!
+! File name and opening
+WRITE(HFILE, "(A6,I4.4,A4)") "CSV3D_", KTCOUNT,".csv"
+OPEN( NEWUNIT=KFILE, file=HFILE, form="FORMATTED")
+!
+! CSV Header
+WRITE(KFILE,'(A50)') 'Frame;&
+                      R11;R12;R13;&
+                      R21;R22;R23;&
+                      R31;R32;R33;&
+                      P1;P2;P3'
+!
+END SUBROUTINE OPEN_3DCSV_ADR
+!#########################################################
+!
+!#########################################################
+SUBROUTINE PRINT_3DFRM(KFILE,HPART,PMAT,PPOS)
+IMPLICIT NONE
+INTEGER,              INTENT(IN) :: KFILE     ! File index
+CHARACTER(LEN=3),     INTENT(IN) :: HPART     ! Part of the wind turbine
+REAL, DIMENSION(3,3), INTENT(IN) :: PMAT      ! Frame to plot
+REAL, DIMENSION(3),   INTENT(IN) :: PPOS      ! Point to plot
+!
+! It writes frames informations
+WRITE(KFILE, '(A3,A1,E14.7,A1,E14.7,A1,E14.7,A1,E14.7,A1,E14.7,A1,E14.7,A1,E14.7,A1,E14.7,A1,E14.7,A1,E14.7,A1,E14.7,A1,E14.7)')&
+!'(A3,A1,F,A1,F,A1,F,A1,F,A1,F,A1,F,A1,F,A1,F,A1,F,A1,F,A1,F,A1,F)')& 
+               HPART, ';',                                &
+               PMAT(1,1),';',PMAT(1,2),';',PMAT(1,3),';', &
+               PMAT(2,1),';',PMAT(2,2),';',PMAT(2,3),';', &
+               PMAT(3,1),';',PMAT(3,2),';',PMAT(3,3),';', &
+               PPOS(1),';',PPOS(2),';',PPOS(3)
+!
+END SUBROUTINE PRINT_3DFRM
+!#########################################################
 !
diff --git a/src/MNH/eol_reader.f90 b/src/MNH/eol_reader.f90
index 8d5ecc6cf..1d965e23e 100644
--- a/src/MNH/eol_reader.f90
+++ b/src/MNH/eol_reader.f90
@@ -23,6 +23,45 @@ SUBROUTINE READ_CSVDATA_TURBINE_ADNR(HFILE,TPTURBINE)
         TYPE(TURBINE),      INTENT(OUT) :: TPTURBINE    ! stored turbine data
 END SUBROUTINE READ_CSVDATA_TURBINE_ADNR
 !
+! ADR
+!
+SUBROUTINE READ_CSVDATA_FARM_ADR(HFILE,TPFARM)
+        USE MODD_EOL_ADR, ONLY: FARM
+        CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
+        TYPE(FARM),         INTENT(OUT) :: TPFARM       ! stored farm data
+END SUBROUTINE READ_CSVDATA_FARM_ADR
+!
+SUBROUTINE READ_CSVDATA_TURBINE_ADR(HFILE,TPTURBINE)
+        USE MODD_EOL_ADR, ONLY : TURBINE
+        CHARACTER(LEN=*),   INTENT(IN)  :: HFILE        ! file to read    
+        TYPE(TURBINE),      INTENT(OUT) :: TPTURBINE    ! stored turbine data
+END SUBROUTINE READ_CSVDATA_TURBINE_ADR
+
+SUBROUTINE READ_CSVDATA_BLADE_ADR(HFILE,TPTURBINE,TPBLADE)
+        USE MODD_EOL_ADR, ONLY : TURBINE, BLADE
+        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_ADR
+!
+SUBROUTINE READ_CSVDATA_AIRFOIL_ADR(HFILE,TPBLADE,TPAIRFOIL)
+        USE MODD_EOL_ADR, ONLY : BLADE, AIRFOIL
+        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_ADR
+!
+FUNCTION GET_AIRFOIL_ID_ADR(TPTURBINE,TPBLADE,TPAIRFOIL,PRADIUS) 
+        USE MODD_EOL_ADR, ONLY : TURBINE, BLADE, AIRFOIL
+        IMPLICIT NONE
+        INTEGER                                   :: GET_AIRFOIL_ID_ADR
+        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_ADR
+!
+
 ! ALM
 !
 SUBROUTINE READ_CSVDATA_FARM_ALM(HFILE,TPFARM)
@@ -57,16 +96,17 @@ SUBROUTINE HOW_MANY_LINES_OF(KLUNAM,HFILE,HNAME,KLINE)
         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) 
+FUNCTION GET_AIRFOIL_ID_ALM(TPTURBINE,TPBLADE,TPAIRFOIL,PRADIUS) 
         USE MODD_EOL_ALM, ONLY : TURBINE, BLADE, AIRFOIL
         IMPLICIT NONE
-        INTEGER                                   :: GET_AIRFOIL_ID
+        INTEGER                                   :: GET_AIRFOIL_ID_ALM
         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 FUNCTION GET_AIRFOIL_ID_ALM
 !
 END INTERFACE
 !
@@ -87,6 +127,7 @@ END MODULE MODI_EOL_READER
 !!    -------------
 !!    Original     05/2018  
 !!    Modification 21/10/20 (PA. Joulin) Updated for a main version
+!!    H. Toumi     09/22 adding ADR functions
 !!
 !!---------------------------------------------------------------
 !
@@ -223,9 +264,9 @@ END SUBROUTINE READ_CSVDATA_TURBINE_ADNR
 !#########################################################
 !
 !#########################################################
-SUBROUTINE READ_CSVDATA_FARM_ALM(HFILE,TPFARM)
+SUBROUTINE READ_CSVDATA_FARM_ADR(HFILE,TPFARM)
 !        
-USE MODD_EOL_ALM,   ONLY: FARM
+USE MODD_EOL_ADR,   ONLY: FARM
 USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
 !
 IMPLICIT NONE
@@ -296,13 +337,13 @@ ELSE
  RETURN
 END IF
 !
-END SUBROUTINE READ_CSVDATA_FARM_ALM
+END SUBROUTINE READ_CSVDATA_FARM_ADR
 !#########################################################
 !
 !#########################################################
-SUBROUTINE READ_CSVDATA_TURBINE_ALM(HFILE,TPTURBINE)
+SUBROUTINE READ_CSVDATA_TURBINE_ADR(HFILE,TPTURBINE)
 !        
-USE MODD_EOL_ALM,   ONLY: TURBINE
+USE MODD_EOL_ADR,   ONLY: TURBINE
 USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
 !
 IMPLICIT NONE
@@ -367,13 +408,13 @@ ELSE
  CLOSE(ILU)
 END IF
 !
-END SUBROUTINE READ_CSVDATA_TURBINE_ALM
+END SUBROUTINE READ_CSVDATA_TURBINE_ADR
 !#########################################################
 !
 !#########################################################
-SUBROUTINE READ_CSVDATA_BLADE_ALM(HFILE,TPTURBINE,TPBLADE)
+SUBROUTINE READ_CSVDATA_BLADE_ADR(HFILE,TPTURBINE,TPBLADE)
 !       
-USE MODD_EOL_ALM,   ONLY: TURBINE, BLADE, NNB_BLAELT
+USE MODD_EOL_ADR,   ONLY: TURBINE, BLADE, NNB_RADELT, NNB_AZIELT
 USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
 USE MODI_EOL_ERROR, ONLY: EOL_BLADEDATA_ERROR
 !
@@ -416,7 +457,8 @@ END DO
 IF (INBLINE < 2) THEN
  CALL EOL_CSVEMPTY_ERROR(HFILE,INBLINE)
 ELSE
- TPBLADE%NNB_BLAELT = NNB_BLAELT 
+ TPBLADE%NNB_RADELT = NNB_RADELT 
+ TPBLADE%NNB_AZIELT = NNB_AZIELT 
  ! Saving number of data 
  TPBLADE%NNB_BLADAT = INBLINE - 1 
  ALLOCATE(TPBLADE%XRAD(TPBLADE%NNB_BLADAT))
@@ -448,13 +490,13 @@ ELSE
  RETURN
 END IF
 !
-END SUBROUTINE READ_CSVDATA_BLADE_ALM
+END SUBROUTINE READ_CSVDATA_BLADE_ADR
 !#########################################################
 !
 !#########################################################
-SUBROUTINE READ_CSVDATA_AIRFOIL_ALM(HFILE,TPBLADE,TPAIRFOIL)
+SUBROUTINE READ_CSVDATA_AIRFOIL_ADR(HFILE,TPBLADE,TPAIRFOIL)
 !        
-USE MODD_EOL_ALM,   ONLY: BLADE, AIRFOIL
+USE MODD_EOL_ADR,   ONLY: BLADE, AIRFOIL
 USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
 USE MODI_EOL_ERROR, ONLY: EOL_AIRFOILNOTFOUND_ERROR 
 !
@@ -559,9 +601,10 @@ CLOSE(ILU)
  IF (INBLINE == 0) THEN
   CALL EOL_AIRFOILNOTFOUND_ERROR(HFILE,YAIRFOIL(IA))
  END IF
-END SUBROUTINE READ_CSVDATA_AIRFOIL_ALM
+END SUBROUTINE READ_CSVDATA_AIRFOIL_ADR
 !#########################################################
 !
+!
 !#########################################################
 SUBROUTINE HOW_MANY_LINES_OF(KLUNAM,HFILE,HNAME,KLINE)
 !
@@ -601,9 +644,76 @@ END DO
  END IF
 END SUBROUTINE HOW_MANY_LINES_OF
 !#########################################################
+!!
+!#########################################################
+FUNCTION GET_AIRFOIL_ID_ADR(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_ADR, ONLY : TURBINE, BLADE, AIRFOIL
+!
+USE MODE_MSG
+!
+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_ADR
+!
+CHARACTER(LEN=:), ALLOCATABLE             :: YMSG
+CHARACTER(LEN=10)                         :: YRADIUS, YRMIN, YRMAX
+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
+  WRITE( YRADIUS, '( F10.2 )' ) PRADIUS
+  WRITE( YRMIN,   '( F10.2 )' ) TPTURBINE%XR_MIN
+  WRITE( YRMAX,   '( F10.2 )' ) TPTURBINE%XR_MAX
+  YMSG = 'The studied radius R=' // TRIM( YRADIUS ) // ' is out of blade range : [' // TRIM( YRMIN ) // ';' // TRIM( YRMAX ) // ']'
+  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GET_AIRFOIL_ID_ADR', YMSG )
+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_ADR = JA
+    EXIT
+   END IF
+  END DO
+!
+  EXIT
+ END IF
+END DO
+!
+END FUNCTION GET_AIRFOIL_ID_ADR
+!#########################################################
 !
 !#########################################################
-FUNCTION GET_AIRFOIL_ID(TPTURBINE,TPBLADE,TPAIRFOIL,PRADIUS)
+FUNCTION GET_AIRFOIL_ID_ALM(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 :
@@ -620,7 +730,7 @@ 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                                   :: GET_AIRFOIL_ID_ALM
 !
 CHARACTER(LEN=:), ALLOCATABLE             :: YMSG
 CHARACTER(LEN=10)                         :: YRADIUS, YRMIN, YRMAX
@@ -635,7 +745,7 @@ IF ((PRADIUS < TPTURBINE%XR_MIN) .OR. (PRADIUS > TPTURBINE%XR_MAX)) THEN
   WRITE( YRMIN,   '( F10.2 )' ) TPTURBINE%XR_MIN
   WRITE( YRMAX,   '( F10.2 )' ) TPTURBINE%XR_MAX
   YMSG = 'The studied radius R=' // TRIM( YRADIUS ) // ' is out of blade range : [' // TRIM( YRMIN ) // ';' // TRIM( YRMAX ) // ']'
-  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GET_AIRFOIL_ID', YMSG )
+  CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GET_AIRFOIL_ID_ALM', YMSG )
 END IF
 !
 ! Preliminaires
@@ -657,7 +767,7 @@ DO JBDATA=1,INB_BDATA
 ! 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
+    GET_AIRFOIL_ID_ALM = JA
     EXIT
    END IF
   END DO
@@ -666,5 +776,346 @@ DO JBDATA=1,INB_BDATA
  END IF
 END DO
 !
-END FUNCTION GET_AIRFOIL_ID
+END FUNCTION GET_AIRFOIL_ID_ALM
+!#########################################################
+!
+!#########################################################
+SUBROUTINE READ_CSVDATA_FARM_ALM(HFILE,TPFARM)
+!        
+USE MODD_EOL_ALM,   ONLY: FARM
+USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
+!
+IMPLICIT NONE
+!
+CHARACTER(LEN=*),   INTENT(IN)    :: HFILE      ! file to read    
+TYPE(FARM),         INTENT(OUT)   :: TPFARM     ! dummy stored data blade
+!
+LOGICAL                           :: GEXIST     ! Existence of file
+!
+INTEGER                           :: ILU        ! logical unit of the 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(NEWUNIT=ILU,FILE=HFILE, FORM='formatted', STATUS='OLD')
+! Counting number of line  
+REWIND(ILU)
+INBLINE=0
+DO
+ READ(ILU,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)
+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(ILU)
+ READ(ILU,FMT='(A400)') YSTRING ! Header reading
+ !
+ ! Saving data 
+ DO INBLINE=1, TPFARM%NNB_TURBINES
+  READ(ILU,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(ILU)
+ RETURN
+END IF
+!
+END SUBROUTINE READ_CSVDATA_FARM_ALM
 !#########################################################
+!
+!#########################################################
+SUBROUTINE READ_CSVDATA_TURBINE_ALM(HFILE,TPTURBINE)
+!        
+USE MODD_EOL_ALM,   ONLY: TURBINE
+USE MODI_EOL_ERROR, ONLY: EOL_CSVNOTFOUND_ERROR, EOL_CSVEMPTY_ERROR
+!
+IMPLICIT NONE
+!
+CHARACTER(LEN=*),   INTENT(IN)  :: HFILE      ! file to read    
+TYPE(TURBINE),      INTENT(OUT) :: TPTURBINE  ! dummy stored data turbine
+!
+LOGICAL                         :: GEXIST     ! Existence of file
+!
+INTEGER                         :: ILU        ! logical unit of the 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(NEWUNIT=ILU,FILE=HFILE, FORM='formatted', STATUS='OLD')
+!
+! Counting number of line  
+REWIND(ILU)
+INBLINE=0
+DO
+ READ(ILU,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)
+ELSE 
+ REWIND(ILU)
+ READ(ILU,FMT='(A400)') YSTRING                    ! Header reading
+ READ(ILU,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(ILU)
+ RETURN
+ CLOSE(ILU)
+END IF
+!
+END SUBROUTINE READ_CSVDATA_TURBINE_ALM
+!#########################################################
+!
+!#########################################################
+SUBROUTINE READ_CSVDATA_BLADE_ALM(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
+!
+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                         :: ILU        ! logical unit of the 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(NEWUNIT=ILU,FILE=HFILE, FORM='formatted', STATUS='OLD')
+! Counting number of line  
+REWIND(ILU)
+INBLINE=0
+DO
+ READ(ILU,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)
+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(ILU)
+ READ(ILU,FMT='(A400)') YSTRING                    ! Header reading
+ !
+ ! Saving data
+ DO INBLINE=1, TPBLADE%NNB_BLADAT
+  READ(ILU,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(ILU)
+ RETURN
+END IF
+!
+END SUBROUTINE READ_CSVDATA_BLADE_ALM
+!#########################################################
+!
+!#########################################################
+SUBROUTINE READ_CSVDATA_AIRFOIL_ALM(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 
+!
+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                         :: ILU        ! logical unit of the 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(NEWUNIT=ILU,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(ILU,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(ILU)
+ INBLINE = 0
+ DO
+  READ(ILU,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(ILU)         ! .. so it is the end of the data ..
+     EXIT                   ! .. and we can exit :)
+    END IF
+   END IF
+  END IF
+ END DO
+END DO
+!
+CLOSE(ILU)
+101 CONTINUE
+ IF (INBLINE == 0) THEN
+  CALL EOL_AIRFOILNOTFOUND_ERROR(HFILE,YAIRFOIL(IA))
+ END IF
+END SUBROUTINE READ_CSVDATA_AIRFOIL_ALM
+!#########################################################
+!
diff --git a/src/MNH/modd_eol_shared_io.f90 b/src/MNH/modd_eol_shared_io.f90
index 6132fb28f..5cb4b1cb6 100644
--- a/src/MNH/modd_eol_shared_io.f90
+++ b/src/MNH/modd_eol_shared_io.f90
@@ -26,6 +26,7 @@
 !!    MODIFICATIONS
 !!    -------------
 !!    Original 17/11/20
+!!    Modification 09/22 (H. Toumi) ADR integration : new shared var
 !!
 !-----------------------------------------------------------------------------
 !
@@ -42,11 +43,21 @@ CHARACTER(LEN=100) :: CBLADE_CSVDATA    ! Blade file to read
 CHARACTER(LEN=100) :: CAIRFOIL_CSVDATA  ! Airfoil file to read  
 ! * flags
 CHARACTER(LEN=3)   :: CINTERP           ! Interpolation method for wind speed
+LOGICAL            :: LTIPLOSSG         ! Flag to apply Glauert's tip loss correction
+LOGICAL            :: LTECOUTPTS        ! Flag to get Tecplot file output of element points
+LOGICAL            :: LCSVOUTFRM        ! Flag to get CSV files output of frames
 !
 !
 !*       2.   OUTPUTS VAR
 !        -----------------
 !
+! --- Global variables of aerodynamic models (Code & CPU) --- 
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: XELT_RAD       ! Elements radius [m]
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: XAOA_GLB       ! Angle of attack of an element [rad]
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: XFLIFT_GLB     ! Lift force, parallel to Urel [N]
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: XFDRAG_GLB     ! Drag force, perpendicular to Urel [N]
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XFAERO_RG_GLB  ! Aerodyn. force (lift+drag) in RG [N]
+!
 ! --- Thruts torque and power ---
 REAL, DIMENSION(:),       ALLOCATABLE :: XTHRUT         ! Thrust [N]
 REAL, DIMENSION(:),       ALLOCATABLE :: XTORQT         ! Torque [Nm]
@@ -55,4 +66,7 @@ REAL, DIMENSION(:),       ALLOCATABLE :: XTHRU_SUM      ! Sum of thrust (N)
 REAL, DIMENSION(:),       ALLOCATABLE :: XTORQ_SUM      ! Sum of torque (Nm)
 REAL, DIMENSION(:),       ALLOCATABLE :: XPOW_SUM       ! Sum of power (W)
 !
+! Mean values
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: XAOA_SUM        ! Sum of angle of attack [rad]
+!
 END MODULE MODD_EOL_SHARED_IO
-- 
GitLab