! -*- Mode: f90 -*- MODULE formula USE declare USE modeles CONTAINS ELEMENTAL FUNCTION dedans (pa, x1, x2) !> TRUE if one point is between to others IMPLICIT NONE LOGICAL :: dedans REAL (kind=rl), INTENT (in) :: pa, x1, x2 dedans = (pa > MIN (x1, x2)) .AND. (pa <= MAX (x1, x2)) RETURN END FUNCTION dedans ! ---------------------------------------------------------------------------- ELEMENTAL FUNCTION dehors (pa1, pa2, x1, x2) !> TRUE if one segment is disconnected from the other IMPLICIT NONE LOGICAL :: dehors REAL (kind=rl), INTENT (in) :: pa1, pa2, x1, x2 dehors = (MAX (pa1, pa2) < MIN (x1, x2)) .OR. (MIN (pa1, pa2) > MAX (x1, x2)) RETURN END FUNCTION dehors ! ---------------------------------------------------------------------------- ELEMENTAL FUNCTION clo_lon (zlon, zlon0) !> Find closest longitude IMPLICIT NONE REAL (kind=rl) :: clo_lon REAL (kind=rl), INTENT (in) :: zlon, zlon0 REAL (kind=rl) :: zz, zp, zm, z0 INTEGER (kind=il) :: jn z0 = zlon DO jn = 1_il, 2_il zz = ABS ((z0 ) - zlon0) zp = ABS ((z0 + 360.0_rl) - zlon0) zm = ABS ((z0 - 360.0_rl) - zlon0) IF ( zp < MIN (zm, zz)) THEN z0 = z0 + 360.0_rl ELSE IF (zm < MIN (zp, zz)) THEN z0 = z0 - 360.0_rl END IF END DO clo_lon = z0 END FUNCTION clo_lon ! ---------------------------------------------------------------------------- ELEMENTAL FUNCTION lon_180 (zlon) !> Set lon in [0-360] REAL (kind=rl) :: lon_180 REAL (kind=rl), INTENT (in) :: zlon REAL (kind=rl) :: z0 z0 = zlon IF ( z0 < 0.0_rl) z0 = z0 + 360.0_rl IF ( z0 > 360.0_rl) z0 = z0 - 360.0_rl lon_180 = z0 END FUNCTION lon_180 ! ---------------------------------------------------------------------------- !$$$ FUNCTION tri_surf (plon, plat) !> Surface of triangle on the sphere !$$$ USE declare !$$$ IMPLICIT NONE !$$$ REAL (kind=rl) :: tri_surf !$$$ REAL (kind=rl), DIMENSION (3), INTENT (in) :: plon, plat !$$$ tri_surf = 0.0_rl !$$$ END FUNCTION tri_surf !$$$ !! END MODULE formula