39 #if (defined(MODEL_SICOPOLIS)) 50 #if (!defined(MODEL_SICOPOLIS)) 51 integer,
private,
parameter ::
i4b = selected_int_kind(9)
52 integer,
private,
parameter ::
dp = kind(1.0d0)
53 real(dp),
private,
parameter ::
pi = 3.141592653589793_dp
54 real(dp),
private,
parameter ::
eps = 1.0e-05_dp
63 lambda0, phi0, x_val, y_val)
67 real(dp),
intent(in) :: lambda_val, phi_val, A, B, lambda0, phi0
68 real(dp),
intent(out) :: x_val, y_val
71 integer(i4b) :: sign_phi0
72 real(dp) :: phi_aux, phi0_aux
73 real(dp) :: e, mc, t, tc, kp, rho, phi_p
74 real(dp) :: sinphi0, sinlambda0, cosphi0, coslambda0
78 else if (phi0 < (-
eps))
then 81 stop
' >>> stereo_forw_ellipsoid: phi0 must be different from zero!' 84 phi_aux = phi_val * sign_phi0
85 phi0_aux = phi0 * sign_phi0
87 e=sqrt((a**2-b**2)/(a**2))
89 sinphi0 = sin(phi0_aux)
90 sinlambda0 = sin(lambda0)
91 cosphi0 = cos(phi0_aux)
92 coslambda0 = cos(lambda0)
94 mc=cosphi0/sqrt(1.0_dp-e*e*sinphi0*sinphi0)
95 t=sqrt(((1.0_dp-sin(phi_aux))/(1.0_dp+sin(phi_aux)))* &
96 ((1.0_dp+e*sin(phi_aux))/(1.0_dp-e*sin(phi_aux)))**e)
97 tc=sqrt(((1.0_dp-sinphi0)/(1.0_dp+sinphi0))* &
98 ((1.0_dp+e*sinphi0)/(1.0_dp-e*sinphi0))**e)
101 x_val = rho*sin(lambda_val-lambda0)
102 y_val = -sign_phi0 * rho*cos(lambda_val-lambda0)
110 lambda0, phi0, lambda_val, phi_val)
114 real(dp),
intent(in) :: x_val, y_val, A, B, lambda0, phi0
115 real(dp),
intent(out) :: lambda_val, phi_val
118 integer(i4b) :: sign_phi0
119 real(dp) :: phi_aux, phi0_aux
120 real(dp) :: e, mc, t, tc, kp, rho, phi_p, residual
121 real(dp) :: sinphi0, sinlambda0, cosphi0, coslambda0
123 real(dp),
parameter :: eps_residual = 1.0e-09_dp
127 else if (phi0 < (-
eps))
then 130 stop
' >>> stereo_inv_ellipsoid: phi0 must be different from zero!' 133 phi0_aux = phi0 * sign_phi0
135 e=sqrt((a**2-b**2)/(a**2))
137 sinphi0 = sin(phi0_aux)
138 sinlambda0 = sin(lambda0)
139 cosphi0 = cos(phi0_aux)
140 coslambda0 = cos(lambda0)
142 tc=sqrt(((1.0_dp-sinphi0)/(1.0_dp+sinphi0))* &
143 ((1.0_dp+e*sinphi0)/(1.0_dp-e*sinphi0))**e)
144 mc=cosphi0/sqrt(1.0_dp-e*e*sinphi0*sinphi0)
145 rho=sqrt(x_val*x_val+y_val*y_val)
148 lambda_val = lambda0 + sign_phi0*atan2(y_val,x_val) + 0.5_dp*
pi 152 phi_p=0.5_dp*
pi-2.0_dp*atan(t)
155 do while(residual >= eps_residual)
157 phi_aux=0.5_dp*
pi-2.0_dp*atan(t*((1.0_dp-e*sin(phi_p))/ &
158 (1.0_dp+e*sin(phi_p)))**(0.5_dp*e))
159 residual=abs(phi_aux-phi_p)
163 phi_val = phi_aux * sign_phi0
165 if (lambda_val < 0.0_dp)
then 166 lambda_val = lambda_val + 2.0_dp*
pi 167 else if (lambda_val >= (2.0_dp*
pi))
then 168 lambda_val = lambda_val - 2.0_dp*
pi 181 real(dp),
intent(in) :: lambda_val, phi_val, R, lambda0, phi0
182 real(dp),
intent(out) :: x_val, y_val
188 k = (cos(0.25_dp*
pi-0.5_dp*phi0))**2
190 x_val = 2.0_dp*r*k*tan(0.25_dp*
pi-0.5_dp*phi_val) &
191 *sin(lambda_val-lambda0)
192 y_val = -2.0_dp*r*k*tan(0.25_dp*
pi-0.5_dp*phi_val) &
193 *cos(lambda_val-lambda0)
195 else if (phi0 < (-
eps))
then 197 k = (cos(0.25_dp*
pi+0.5_dp*phi0))**2
199 x_val = 2.0_dp*r*k*tan(0.25_dp*
pi+0.5_dp*phi_val) &
200 *sin(lambda_val-lambda0)
201 y_val = 2.0_dp*r*k*tan(0.25_dp*
pi+0.5_dp*phi_val) &
202 *cos(lambda_val-lambda0)
206 stop
' >>> stereo_forw_sphere: phi0 must be different from zero!' 220 real(dp),
intent(in) :: x_val, y_val, R, lambda0, phi0
221 real(dp),
intent(out) :: lambda_val, phi_val
227 k = (cos(0.25_dp*
pi-0.5_dp*phi0))**2
229 phi_val = 0.5_dp*
pi &
230 -2.0_dp*atan(sqrt(x_val**2+y_val**2)/(2.0_dp*r*k))
231 lambda_val = lambda0 + atan2(y_val,x_val)+0.5_dp*
pi 233 if (lambda_val < 0.0_dp)
then 234 lambda_val = lambda_val + 2.0_dp*
pi 235 else if (lambda_val >= (2.0_dp*
pi))
then 236 lambda_val = lambda_val - 2.0_dp*
pi 239 else if (phi0 < (-
eps))
then 241 k = (cos(0.25_dp*
pi+0.5_dp*phi0))**2
243 phi_val = -0.5_dp*
pi &
244 +2.0_dp*atan(sqrt(x_val**2+y_val**2)/(2.0_dp*r*k))
245 lambda_val = lambda0 - atan2(y_val,x_val)+0.5_dp*
pi 247 if (lambda_val < 0.0_dp)
then 248 lambda_val = lambda_val + 2.0_dp*
pi 249 else if (lambda_val >= (2.0_dp*
pi))
then 250 lambda_val = lambda_val - 2.0_dp*
pi 255 stop
' >>> stereo_inv_sphere: phi0 must be different from zero!' subroutine, public stereo_inv_sphere(x_val, y_val, R, lambda0, phi0, lambda_val, phi_val)
Inverse stereographic projection for a spherical planet.
subroutine, public stereo_forw_sphere(lambda_val, phi_val, R, lambda0, phi0, x_val, y_val)
Forward stereographic projection for a spherical planet.
real(dp), parameter eps
eps: Small number
subroutine, public stereo_inv_ellipsoid(x_val, y_val, A, B, lambda0, phi0, lambda_val, phi_val)
Inverse stereographic projection for an ellipsoidal planet.
Declarations of kind types for SICOPOLIS.
integer, parameter i4b
4-byte integers
subroutine, public stereo_forw_ellipsoid(lambda_val, phi_val, A, B, lambda0, phi0, x_val, y_val)
Forward stereographic projection for an ellipsoidal planet.
Computation of the forward or inverse stereographic projection, alternatively for a spherical or an e...
real(dp), parameter pi
pi: Constant pi
integer, parameter dp
Double-precision reals.
Declarations of global variables for SICOPOLIS.