[Fortran] 纯文本查看 复制代码 SUBROUTINE dcrec(x, y, u, v)
!-----------------------------------------------------------------------
! COMPLEX RECIPROCAL U + I*V = 1/(X + I*Y)
!-----------------------------------------------------------------------
REAL (dp), INTENT(IN) :: x, y
REAL (dp), INTENT(OUT) :: u, v
! Local variables
REAL (dp) :: t, d
IF (ABS(x) <= ABS(y)) THEN
t = x / y
d = y + t * x
u = t / d
v = -1.0_dp / d
RETURN
END IF
t = y / x
d = x + t * y
u = 1.0_dp / d
v = -t / d
RETURN
END SUBROUTINE dcrec
FUNCTION cdiv(a,b) RESULT(fn_val)
!-----------------------------------------------------------------------
! COMPLEX DIVISION A/B WHERE B IS NONZERO
!-----------------------------------------------------------------------
COMPLEX (dp), INTENT(IN) :: a, b
COMPLEX (dp) :: fn_val
REAL (dp) :: ai, ar, bi, br, d, t
REAL (dp) :: u, v
ar = REAL(a, KIND=dp)
ai = AIMAG(a)
br = REAL(b, KIND=dp)
bi = AIMAG(b)
IF (ABS(br) >= ABS(bi)) THEN
t = bi / br
d = br + t * bi
u = (ar+ai*t) / d
v = (ai-ar*t) / d
fn_val = CMPLX(u,v, KIND=dp)
RETURN
END IF
t = br / bi
d = bi + t * br
u = (ar*t+ai) / d
v = (ai*t-ar) / d
fn_val = CMPLX(u,v, KIND=dp)
RETURN
END FUNCTION cdiv
|