diff --git a/src/MNH/eol_error.f90 b/src/MNH/eol_error.f90 index 1c45428b6e28a3422919233047e30fc418442d6c..d52f099f02264a76815fc4b917c513a6668fc401 100644 --- a/src/MNH/eol_error.f90 +++ b/src/MNH/eol_error.f90 @@ -23,31 +23,39 @@ SUBROUTINE EOL_CSVEMPTY_ERROR(HFILE,KNBLINE) END SUBROUTINE EOL_CSVEMPTY_ERROR ! ! -! *** -! ALM -! *** +! ********* +! ALM & ADR +! ********* ! SUBROUTINE EOL_AIRFOILNOTFOUND_ERROR(HFILE,HVAR) CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file read CHARACTER(LEN=*), INTENT(IN) :: HVAR ! missing data END SUBROUTINE EOL_AIRFOILNOTFOUND_ERROR ! -SUBROUTINE EOL_WTCFL_ERROR(PMAXTSTEP) - REAL, INTENT(IN) :: PMAXTSTEP ! maximum acceptable time-step -END SUBROUTINE EOL_WTCFL_ERROR -! SUBROUTINE EOL_BLADEDATA_ERROR(PDELTARAD) REAL, INTENT(IN) :: PDELTARAD ! Span lenght of an element END SUBROUTINE EOL_BLADEDATA_ERROR ! +SUBROUTINE EOL_DR_ERROR(KNB_RELT_MIN) + INTEGER, INTENT(IN) :: KNB_RELT_MIN ! minimum number of rad elt for ADR +END SUBROUTINE EOL_DR_ERROR +! +! *** +! ALM +! *** +! +SUBROUTINE EOL_WTCFL_ERROR(PMAXTSTEP) + REAL, INTENT(IN) :: PMAXTSTEP ! maximum acceptable time-step +END SUBROUTINE EOL_WTCFL_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 +SUBROUTINE EOL_DA_ERROR(KNB_AELT_MIN) + INTEGER, INTENT(IN) :: KNB_AELT_MIN ! minimum number of rad elt for ADR +END SUBROUTINE EOL_DA_ERROR +! ! END INTERFACE ! @@ -157,7 +165,7 @@ USE MODE_IO_FILE, ONLY: IO_File_close USE MODE_MSG USE MODD_EOL_SHARED_IO, ONLY: CBLADE_CSVDATA ! -REAL, INTENT(IN) :: PDELTARAD ! hals section width +REAL, INTENT(IN) :: PDELTARAD ! aero section width ! CHARACTER(LEN=4) :: YDELTARAD ! @@ -173,23 +181,47 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'EOL_BLADEDATA_ERROR' ) END SUBROUTINE EOL_BLADEDATA_ERROR !######################################################### ! -SUBROUTINE EOL_ADRELT_ERROR(PDXX,PDYY,PDZZ) +!######################################################### +SUBROUTINE EOL_DR_ERROR(KNB_RELT_MIN) +! +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODE_IO_FILE, ONLY: IO_File_close +USE MODE_MSG +! +INTEGER, INTENT(IN) :: KNB_RELT_MIN ! minimum number of radial element +! +CHARACTER(LEN=4) :: YNB_RELT_MIN +! +WRITE( YNB_RELT_MIN, '( I3 )' ) KNB_RELT_MIN +! +CMNHMSG(1) = 'EOL Initialization error: error while meshing blades.' +CMNHMSG(2) = 'Considering the grid, the number of discretized radial' +CMNHMSG(3) = 'element should be at least : ' // TRIM(YNB_RELT_MIN) +CMNHMSG(4) = 'Please, modify NNB_RADELT (NAM_ADR) or NNB_BLAELT (NAM_ALM)' +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'EOL_MESH_ERROR' ) +! +END SUBROUTINE EOL_DR_ERROR +! +!######################################################### +! +!######################################################### +SUBROUTINE EOL_DA_ERROR(KNB_AELT_MIN) ! -USE MODD_EOL_ADR, ONLY: BLADE, NNB_RADELT, NNB_AZIELT +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODE_IO_FILE, ONLY: IO_File_close USE MODE_MSG -USE MODD_CST, ONLY: XPI ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ ! mesh size +INTEGER, INTENT(IN) :: KNB_AELT_MIN ! minimum number of radial element +! +CHARACTER(LEN=4) :: YNB_AELT_MIN +! +WRITE( YNB_AELT_MIN, '( I3 )' ) KNB_AELT_MIN +! +CMNHMSG(1) = 'EOL Initialization error: error while meshing blades.' +CMNHMSG(2) = 'Considering the grid, the number of discretized azimutal' +CMNHMSG(3) = 'element should be at least : ' // TRIM(YNB_AELT_MIN) +CMNHMSG(4) = 'Please, modify NNB_AZIELT in NAM_ADR' +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'EOL_MESH_ERROR' ) +! +END SUBROUTINE EOL_DA_ERROR ! -!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/ini_eol_adr.f90 b/src/MNH/ini_eol_adr.f90 index 89e937f54bb87c7beba7e2b985b5fd02b9ec9aee..2ecf8c777af6fa68543d6e8dce608a4cc55995c8 100644 --- a/src/MNH/ini_eol_adr.f90 +++ b/src/MNH/ini_eol_adr.f90 @@ -9,9 +9,9 @@ ! INTERFACE ! -SUBROUTINE INI_EOL_ADR(PDXX,PDYY) +SUBROUTINE INI_EOL_ADR(PDXX,PDYY,PDZZ) ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY ! mesh size +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ ! mesh size ! END SUBROUTINE INI_EOL_ADR ! @@ -20,7 +20,7 @@ END INTERFACE END MODULE MODI_INI_EOL_ADR ! ! ############################################################ - SUBROUTINE INI_EOL_ADR(PDXX,PDYY) + SUBROUTINE INI_EOL_ADR(PDXX,PDYY,PDZZ) ! ############################################################ ! !!**** *INI_EOL_ADR* - routine to initialize the Actuator Disc @@ -97,6 +97,7 @@ END MODULE MODI_INI_EOL_ADR !* 0.1 Modules ! USE MODD_EOL_ADR +USE MODI_EOL_ERROR, ONLY: EOL_DR_ERROR, EOL_DA_ERROR USE MODD_EOL_SHARED_IO, ONLY: CFARM_CSVDATA, CTURBINE_CSVDATA USE MODD_EOL_SHARED_IO, ONLY: CBLADE_CSVDATA, CAIRFOIL_CSVDATA USE MODD_EOL_SHARED_IO, ONLY: XTHRUT, XTORQT, XPOWT @@ -126,12 +127,13 @@ USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_VAR_ll, ONLY: NMNH_COMM_WORLD USE MODD_PRECISION, ONLY: MNHREAL_MPI USE MODD_MPIF, ONLY: MPI_SUM +USE MODE_SUM_ll, ONLY: MIN_ll ! !* 0.2 Variables ! IMPLICIT NONE ! Interface -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY ! mesh size +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ ! mesh size ! ! Some loop controlers ! .. for wind turbines @@ -145,11 +147,14 @@ INTEGER :: IIB,IJB,IKB ! Begin of a CPU domain INTEGER :: IIE,IJE ! End of a CPU domain INTEGER :: JI,JJ ! Domain index ! Some variables to be coder-friendly -INTEGER :: INB_WT, INB_B ! Total numbers of wind turbines, blade -INTEGER :: INB_RELT, INB_AELT ! Total numbers of radial elt and azimut elt -INTEGER :: INB_TELT, INB_NELT ! Total numbers of tower elt and nacelle elt -REAL :: ZRAD ! Radius along the blade -REAL :: ZDELTA_AZI, ZDELTA_RAD ! Azimuthal and radial step +INTEGER :: INB_WT, INB_B ! Total numbers of wind turbines, blade +INTEGER :: INB_RELT, INB_AELT ! Total numbers of radial elt and azimut elt +INTEGER :: INB_TELT, INB_NELT ! Total numbers of tower elt and nacelle elt +REAL :: ZRAD ! Radius along the blade +REAL :: ZDELTA_AZI, ZDELTA_RAD ! Azimuthal and radial step +REAL :: ZMIN_SIZE ! Minimum size of a mesh side +REAL :: ZDELTA_RAD_MAX, ZDELTA_AZI_MAX ! Max size of ADR element +INTEGER :: INB_RELT_MIN, INB_AELT_MIN ! Minimum number of ADR mesh elements ! Tower base folowing the terrain REAL,DIMENSION(:,:),ALLOCATABLE :: ZPOSINI_TOWO_RG ! Initial tower origin position INTEGER :: IINFO ! code info return @@ -206,18 +211,38 @@ CALL PRINT_DATA_AIRFOIL_ADR(TLUOUT%NLU,TAIRFOIL) ! -------------------- ! !* 3.0 Preliminaries +! +!* 3.0.a) Shortening the names of the most frequently used var INB_WT = TFARM%NNB_TURBINES INB_B = TTURBINE%NNB_BLADES INB_AELT = TBLADE%NNB_AZIELT INB_RELT = TBLADE%NNB_RADELT -! Hard coded variables, but they will be usefull in next updates -INB_TELT = 2 -INB_NELT = 2 +INB_TELT = 2 ! Hard coded variable, usefull for next updates +INB_NELT = 2 ! Hard coded variable, usefull for next updates ! +!* 3.0.b) Mesh variable ZDELTA_AZI = 2d0*XPI/INB_AELT ! Rotor disc azimutal devision ZDELTA_RAD = (TTURBINE%XR_MAX - TTURBINE%XR_MIN)/INB_RELT ! Rotor disc radialal devision - - +! +!* 3.0.c) Checking mesh +! Finding the minimum size of a cell, in the whole domain. +! (Later, the research could be done only in wind turbine area) +ZMIN_SIZE = MIN(MIN_ll(PDXX(:,:,:),IINFO),& + MIN_ll(PDYY(:,:,:),IINFO),& + MIN_ll(PDZZ(:,:,:),IINFO)) +! 3.0.c)i) Check the number of radial elements: +ZDELTA_RAD_MAX = ZMIN_SIZE +IF (ZDELTA_RAD > ZDELTA_RAD_MAX) THEN + INB_RELT_MIN = INT(CEILING((TTURBINE%XR_MAX - TTURBINE%XR_MIN)/ZDELTA_RAD_MAX)) ! User proper value + CALL EOL_DR_ERROR(INB_RELT_MIN) +END IF +! 3.0.c)ii) Check the number of azimutal elements: +ZDELTA_AZI_MAX = ATAN2(ZMIN_SIZE,TTURBINE%XR_MAX) +IF (ZDELTA_AZI > ZDELTA_AZI_MAX) THEN + INB_AELT_MIN = INT(CEILING(2d0*XPI/ZDELTA_AZI_MAX)) ! User proper value + CALL EOL_DA_ERROR(INB_AELT_MIN) +END IF +! !* 3.1 MODD_EOL_ADR variables ! at t ALLOCATE(XELT_RAD (INB_WT,INB_AELT,INB_RELT )) diff --git a/src/MNH/ini_eol_alm.f90 b/src/MNH/ini_eol_alm.f90 index 6f913c2ede5b374d7fe0a19e63ee7a45e70549e8..301f7d35d7ee1fcd1f1efc6f0cf36813e7e5a78a 100644 --- a/src/MNH/ini_eol_alm.f90 +++ b/src/MNH/ini_eol_alm.f90 @@ -9,9 +9,9 @@ ! INTERFACE ! -SUBROUTINE INI_EOL_ALM(PDXX,PDYY) +SUBROUTINE INI_EOL_ALM(PDXX,PDYY,PDZZ) ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY ! mesh size +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ ! mesh size ! END SUBROUTINE INI_EOL_ALM ! @@ -20,7 +20,7 @@ END INTERFACE END MODULE MODI_INI_EOL_ALM ! ! ############################################################ - SUBROUTINE INI_EOL_ALM(PDXX,PDYY) + SUBROUTINE INI_EOL_ALM(PDXX,PDYY,PDZZ) ! ############################################################ ! !!**** *INI_EOL_ALM* - routine to initialize the Actuator Line Model @@ -96,6 +96,7 @@ END MODULE MODI_INI_EOL_ALM !* 0.1 Modules ! USE MODD_EOL_ALM +USE MODI_EOL_ERROR, ONLY: EOL_DR_ERROR USE MODD_EOL_SHARED_IO, ONLY: CFARM_CSVDATA USE MODD_EOL_SHARED_IO, ONLY: CTURBINE_CSVDATA USE MODD_EOL_SHARED_IO, ONLY: CBLADE_CSVDATA @@ -127,12 +128,13 @@ USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_VAR_ll, ONLY: NMNH_COMM_WORLD USE MODD_PRECISION, ONLY: MNHREAL_MPI USE MODD_MPIF, ONLY: MPI_SUM +USE MODE_SUM_ll, ONLY: MIN_ll ! !* 0.2 Variables ! IMPLICIT NONE ! Interface -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY ! mesh size +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ ! mesh size ! ! Some loop controlers ! .. for wind turbines @@ -149,6 +151,11 @@ INTEGER :: JI,JJ ! Domain index INTEGER :: INB_WT, INB_B, INB_BELT ! Total numbers of wind turbines, blades, and blade elt INTEGER :: INB_TELT, INB_NELT ! Total numbers of tower elt, and nacelle elt REAL :: ZRAD ! Radius along the blade +REAL :: ZDELTA_RAD ! Radial size of blade element +REAL :: ZMIN_SIZE ! Minimum size of a mesh side +REAL :: ZDELTA_RAD_MAX ! Max size of ALM rad element +INTEGER :: INB_BELT_MIN ! Minimum number of ALM mesh elements +! ! Tower base folowing the terrain REAL,DIMENSION(:,:),ALLOCATABLE :: ZPOSINI_TOWO_RG ! Initial tower origin position INTEGER :: IINFO ! code info return @@ -205,12 +212,29 @@ CALL PRINT_DATA_AIRFOIL_ALM(TLUOUT%NLU,TAIRFOIL) ! -------------------- ! !* 3.0 Preliminaries +! +!* 3.0.a) Shortening the names of the most frequently used var INB_WT = TFARM%NNB_TURBINES INB_B = TTURBINE%NNB_BLADES -INB_BELT = TBLADE%NNB_BLAELT -! Hard coded variables, but they will be usefull in next updates -INB_TELT = 2 -INB_NELT = 2 +INB_BELT = TBLADE%NNB_BLAELT +INB_TELT = 2 ! Hard coded variable, usefull for next updates +INB_NELT = 2 ! Hard coded variable, usefull for next updates +! +!* 3.0.b) Mesh variable +ZDELTA_RAD = (TTURBINE%XR_MAX-TTURBINE%XR_MIN)/INB_BELT ! Radial element size +! +!* 3.0.c) Checking mesh +! Finding the minimum size of a cell, in the whole domain. +! Later, the research could be done only in wind turbine area. +ZMIN_SIZE = MIN(MIN_ll(PDXX(:,:,:),IINFO),& + MIN_ll(PDYY(:,:,:),IINFO),& + MIN_ll(PDZZ(:,:,:),IINFO)) +! 3.0.c)i) Check the number of radial elements: +ZDELTA_RAD_MAX = ZMIN_SIZE +IF (ZDELTA_RAD > ZDELTA_RAD_MAX) THEN + INB_BELT_MIN = INT(CEILING((TTURBINE%XR_MAX-TTURBINE%XR_MIN)/ZDELTA_RAD_MAX)) ! User proper value + CALL EOL_DR_ERROR(INB_BELT_MIN) +END IF ! !* 3.1 MODD_EOL_ALM variables ! at t diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 5b2bc0c1c792a27793db58d4a1da6b78e854802c..f4423a0b0fc9316180afa6b4068d7a2e77c520c5 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -2877,9 +2877,9 @@ IF (LMAIN_EOL .AND. KMI == NMODEL_EOL) THEN CASE('ADNR') CALL INI_EOL_ADNR CASE('ADR') - CALL INI_EOL_ADR(XDXX,XDYY) + CALL INI_EOL_ADR(XDXX,XDYY,XDZZ) CASE('ALM') - CALL INI_EOL_ALM(XDXX,XDYY) + CALL INI_EOL_ALM(XDXX,XDYY,XDZZ) END SELECT END IF !