! $Id: ropp_pp_wopt.f90 r4887 2016-05-25 15:48:28Z sti $ !****m* Modules/ropp_pp_wopt * ! ! NAME ! ropp_pp_wopt - Interface module for the ropp_pp wave optics propagator routines. ! ! SYNOPSIS ! USE ropp_pp_wopt ! ! DESCRIPTION ! This module provides interfaces for the wave optics propagation ! routines contained in the ROPP PP library. ! ! SEE ALSO ! ropp_pp/tools/ropp_pp_wopt_tool(.f90) ! ropp_pp/tools/ropp_pp_wopt_2D_tool(.f90) ! ! NOTES ! See RSR 28 for details ! ! AUTHOR ! Met Office, Exeter, UK. ! Any comments on this software should be given via the ROM SAF ! Helpdesk at http://www.romsaf.org ! ! COPYRIGHT ! (c) EUMETSAT. All rights reserved. ! For further details please refer to the file COPYRIGHT ! which you should have received as part of this distribution. ! !**** MODULE ropp_pp_wopt !------------------------------------------------------------------------------- ! 1. Phase propagation !------------------------------------------------------------------------------- INTERFACE ropp_pp_wopt_mps_1d SUBROUTINE ropp_pp_wopt_mps_1d(x, y, radius, y_apodize, kval, & zed, log_refrac, d2logndy2, U0, U) USE typesizes, ONLY: wp => EightByteReal REAL(wp), INTENT(IN) :: x(:), y(:) REAL(wp), INTENT(IN) :: radius, y_apodize, kval REAL(wp), INTENT(IN) :: zed(:), log_refrac(:), d2logndy2(:) COMPLEX(wp), INTENT(IN) :: U0(:) COMPLEX(wp), INTENT(OUT) :: U(SIZE(y)) END SUBROUTINE ropp_pp_wopt_mps_1d END INTERFACE ropp_pp_wopt_mps_1d INTERFACE ropp_pp_wopt_mps_2d SUBROUTINE ropp_pp_wopt_mps_2d(x, y, radius, y_apodize, kval, dtheta, & zed, log_refrac, d2logndy2, U0, U) USE typesizes, ONLY: wp => EightByteReal REAL(wp), INTENT(IN) :: x(:), y(:) REAL(wp), INTENT(IN) :: radius, y_apodize, kval, dtheta REAL(wp), INTENT(IN) :: zed(:,:), log_refrac(:,:), d2logndy2(:,:) COMPLEX(wp), INTENT(IN) :: U0(:) COMPLEX(wp), INTENT(OUT) :: U(SIZE(y)) END SUBROUTINE ropp_pp_wopt_mps_2d END INTERFACE ropp_pp_wopt_mps_2d INTERFACE SUBROUTINE ropp_pp_wopt_propagate(U0, k, Dy, Dx, U) USE typesizes, ONLY: wp => EightByteReal COMPLEX(wp), INTENT(IN) :: U0(:) REAL(wp), INTENT(IN) :: k REAL(wp), INTENT(IN) :: Dy REAL(wp), INTENT(IN) :: Dx COMPLEX(wp), INTENT(OUT) :: U(SIZE(U0)) END SUBROUTINE ropp_pp_wopt_propagate END INTERFACE INTERFACE SUBROUTINE ropp_pp_wopt_propagate_to_leo(nsample, U0, k, ypos, Dy, x_plane, & x_leo, y_leo, s_geom, U_leo, phase_leo, amp_leo) USE typesizes, ONLY: wp => EightByteReal INTEGER, INTENT(IN) :: nsample COMPLEX(wp), INTENT(IN) :: U0(:) REAL(wp), INTENT(IN) :: k REAL(wp), INTENT(IN) :: Dy REAL(wp), INTENT(IN) :: ypos(:) REAL(wp), INTENT(IN) :: x_plane REAL(wp), INTENT(IN) :: x_leo(:), y_leo(:) REAL(wp), INTENT(IN) :: s_geom(:) COMPLEX(wp), INTENT(OUT) :: U_leo(SIZE(x_leo)) REAL(wp), INTENT(OUT) :: phase_leo(SIZE(x_leo)), amp_leo(SIZE(x_leo)) END SUBROUTINE ropp_pp_wopt_propagate_to_leo END INTERFACE !------------------------------------------------------------------------------- ! 2. Refractivity !------------------------------------------------------------------------------- INTERFACE SUBROUTINE ropp_pp_wopt_ref_1d(x, y, radius, zed, logn, d2logndy2, refrac) USE typesizes, ONLY: wp => EightByteReal REAL(wp), INTENT(IN) :: x REAL(wp), INTENT(IN) :: y(:) REAL(wp), INTENT(IN) :: radius REAL(wp), INTENT(IN) :: zed(:), logn(:) REAL(wp), INTENT(IN) :: d2logndy2(:) REAL(wp), INTENT(OUT) :: refrac(SIZE(y)) END SUBROUTINE ropp_pp_wopt_ref_1d END INTERFACE INTERFACE SUBROUTINE ropp_pp_wopt_ref_2d(dtheta, x, y, radius, zed, logn, d2logndy2, refrac) USE typesizes, ONLY: wp => EightByteReal REAL(wp), INTENT(IN) :: dtheta REAL(wp), INTENT(IN) :: x REAL(wp), INTENT(IN) :: y(:) REAL(wp), INTENT(IN) :: radius REAL(wp), INTENT(IN) :: zed(:,:), logn(:,:) REAL(wp), INTENT(IN) :: d2logndy2(:,:) REAL(wp), INTENT(OUT) :: refrac(SIZE(y)) END SUBROUTINE ropp_pp_wopt_ref_2d END INTERFACE !------------------------------------------------------------------------------- ! 3. Phase and amplitude calculation !------------------------------------------------------------------------------- INTERFACE SUBROUTINE ropp_pp_wopt_phase_and_amplitude(U, phase, amplitude) USE typesizes, ONLY: wp => EightByteReal COMPLEX(wp), INTENT(IN) :: U(:) REAL(wp), INTENT(OUT) :: phase(SIZE(U)), amplitude(SIZE(U)) END SUBROUTINE ropp_pp_wopt_phase_and_amplitude END INTERFACE INTERFACE SUBROUTINE ropp_pp_wopt_phase_and_amplitude_leo(U, phase, amplitude) USE typesizes, ONLY: wp => EightByteReal COMPLEX(wp), INTENT(IN) :: U(:) REAL(wp), INTENT(OUT) :: phase(SIZE(U)), amplitude(SIZE(U)) END SUBROUTINE ropp_pp_wopt_phase_and_amplitude_leo END INTERFACE !------------------------------------------------------------------------------- ! 4. Fresnel integral !------------------------------------------------------------------------------- INTERFACE SUBROUTINE ropp_pp_wopt_fresnel(x, s, c) USE typesizes, ONLY: wp => EightByteReal REAL(wp), INTENT(IN) :: x(:) REAL(wp), INTENT(OUT) :: s(SIZE(x)), c(SIZE(x)) END SUBROUTINE ropp_pp_wopt_fresnel END INTERFACE !------------------------------------------------------------------------------- ! 5. Apodization !------------------------------------------------------------------------------- INTERFACE SUBROUTINE ropp_pp_wopt_window(x, y, rad, ymax, U) USE typesizes, ONLY: wp => EightByteReal REAL(wp), INTENT(IN) :: x, rad, ymax REAL(wp), INTENT(IN) :: y(:) COMPLEX(wp),INTENT(INOUT) :: U(:) END SUBROUTINE ropp_pp_wopt_window END INTERFACE !------------------------------------------------------------------------------- ! 6. Full Spectrum Inversion !------------------------------------------------------------------------------- INTERFACE SUBROUTINE ropp_pp_wopt_fsi_quick(kval, theta_dot, time, s_geom, & phase_leo, amp_leo, x_leo, y_leo, & x_gps, y_gps, & impact, alpha, amp) USE typesizes, ONLY: wp => EightByteReal REAL(wp), INTENT(IN) :: kval ! wave number REAL(wp), INTENT(IN) :: theta_dot ! angular velocity REAL(wp), INTENT(IN) :: time(:) ! time at LEO REAL(wp), INTENT(IN) :: s_geom(:) ! straight line GNSS-to-LEO distance REAL(wp), INTENT(IN) :: x_leo(:),y_leo(:) ! position of LEO REAL(wp), INTENT(IN) :: x_gps(:),y_gps(:) ! position of GPS REAL(wp), INTENT(IN) :: phase_leo(:) ! accumulated phase at LEO REAL(wp), INTENT(IN) :: amp_leo(:) ! amplitude at LEO REAL(wp), INTENT(INOUT) :: impact(:) ! impact height REAL(wp), INTENT(INOUT) :: alpha(:) ! bending angle REAL(wp), INTENT(INOUT) :: amp(:) ! amplitude END SUBROUTINE ropp_pp_wopt_fsi_quick END INTERFACE END MODULE ropp_pp_wopt