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