SUBROUTINE PickEpsilon( BeamType, omega, c, Dalpha, Dbeta, rLoop, EpsMultiplier, epsilon )
! Picks the optimum value for epsilon
REAL (KIND=8), INTENT( IN ) :: omega, c ! angular frequency, sound speed
REAL (KIND=8), INTENT( IN ) :: Dalpha, Dbeta ! angular spacing for ray fan
REAL (KIND=8), INTENT( IN ) :: epsMultiplier, Rloop ! multiplier, loop range
COMPLEX (KIND=8), INTENT( OUT ) :: epsilon( 2 ) ! beam initial conditions
CHARACTER (LEN= 2), INTENT( IN ) :: BeamType
LOGICAL, SAVE :: INIFlag = .TRUE.
REAL (KIND=8), SAVE :: HalfWidth( 2 ) = [ 0.0, 0.0 ]
COMPLEX (KIND=8) :: epsilonOpt( 2 )
CHARACTER (LEN=80) :: TAG
! LP: BUG: Multiple codepaths do not set epsilonOpt, leads to UB
SELECT CASE ( BeamType( 1 : 1 ) )
CASE ( 'C', 'R' ) ! Cerveny beams
TAG = 'Cerveny style beam'
SELECT CASE ( BeamType( 2 : 2 ) )
CASE ( 'F' )
TAG = 'Space filling beams'
HalfWidth( 1 ) = 2.0 / ( ( omega / c ) * Dalpha )
HalfWidth( 2 ) = 0.0
IF ( Dbeta /= 0.0 ) HalfWidth( 2 ) = 2.0 / ( ( omega / c ) * Dbeta )
epsilonOpt = i * 0.5 * omega * HalfWidth ** 2
CASE ( 'M' )
TAG = 'Minimum width beams'
HalfWidth( 1 ) = SQRT( 2.0 * c * 1000.0 * rLoop / omega )
HalfWidth( 2 ) = HalfWidth( 1 )
epsilonOPT = i * 0.5 * omega * HalfWidth **2
CASE ( 'C' )
TAG = 'Cerveny style beam'
END SELECT
CASE ( 'g' )
TAG = 'Geometric beam, hat-shaped, Ray coord.'
epsilonOPT = 0.0
CASE ( 'G', '^' )
TAG = 'Geometric beam, hat-shaped, Cart. coord.'
epsilonOPT = 0.0
CASE ( 'b' )
TAG = 'Geometric beam, Gaussian-shaped, Ray coord.'
epsilonOPT = 0.0
CASE ( 'B' )
TAG = 'Geometric beam, Gaussian-shaped, Cart. coord.'
epsilonOPT = 0.0
CASE ( 'S' )
TAG = 'Simple Gaussian beams'
halfwidth = 2.0 / ( ( omega / c ) * Dalpha )
epsilonOpt = i * 0.5 * omega * halfwidth ** 2
END SELECT
epsilon = epsMultiplier * epsilonOPT
! On first call write info to prt file
IF ( INIFlag ) THEN
WRITE( PRTFile, * )
WRITE( PRTFile, * ) TAG
WRITE( PRTFile, * ) 'HalfWidth1 = ', HalfWidth( 1 )
WRITE( PRTFile, * ) 'HalfWidth2 = ', HalfWidth( 2 )
WRITE( PRTFile, * ) 'epsilonOPT1 = ', epsilonOPT( 1 )
WRITE( PRTFile, * ) 'epsilonOPT2 = ', epsilonOPT( 2 )
WRITE( PRTFile, * ) 'EpsMult = ', EpsMultiplier
WRITE( PRTFile, * )
INIFlag = .FALSE.
END IF
END SUBROUTINE PickEpsilon