59 real(
double),
intent(in) :: angi, nref1,nref2
60 real(
double),
intent(out) :: runp
61 real(
double),
intent(out),
optional :: rprp,rpar, tunp,tprp,tpar, angt
62 real(
double) :: var, langt, cosangi,cosangt, lrprp,lrpar
64 var = nref1/nref2 * sin(angi)
65 if(var.gt.1.d0 .or. abs(angi).gt.
pio2)
then
76 lrprp = ( (nref1 * cosangi - nref2 * cosangt) / (nref1 * cosangi + nref2 * cosangt) )**2
77 lrpar = ( (nref1 * cosangt - nref2 * cosangi) / (nref1 * cosangt + nref2 * cosangi) )**2
81 runp = 0.5d0 * (lrprp + lrpar)
84 if(
present(rprp)) rprp = lrprp
85 if(
present(rpar)) rpar = lrpar
87 if(
present(tunp)) tunp = 1.d0 - runp
88 if(
present(tprp)) tprp = 1.d0 - lrprp
89 if(
present(tpar)) tpar = 1.d0 - lrpar
91 if(
present(angt)) angt = langt
115 real(
double),
intent(in) :: wavelength, temperature, pressure, humidity
117 real(
double) :: s,t, omega, a,b,c,x, a1,a2,theta,y, psv, pv
118 real(
double) :: d,e,f,g, ns,ntp
120 t = temperature + 273.15d0
122 if(temperature.ge.0.d0)
then
123 omega = t - 2.38555575678d-1/(t-6.50175348448d2)
124 a = omega**2 + 1.16705214528d3*omega - 7.24213167032d5
125 b = -1.70738469401d1*omega**2 + 1.20208247025d4*omega - 3.23255503223d6
126 c = 1.49151086135d1*omega**2 - 4.82326573616d3*omega + 4.05113405421d5
127 x = -b + sqrt(b**2 - 4*a*c)
129 psv = 1.d6*(2*c/x)**4
136 y = a1*(1.d0 - theta**(-1.5d0)) + a2*(1.d0 - theta**(-1.25d0))
137 psv = 611.657d0 * exp(y)
140 pv = (humidity/100.d0)*psv
151 s = 1.d6/wavelength**2
152 ns = 1.d0 + 1.d-8 * (a + b/(130.d0-s) + c/(38.9d0-s))
153 x = (1.d0 + 1.d-8 * (e - f*temperature) * (100*pressure)) / (1.d0 + g*temperature)
154 ntp = 1.d0 + (100*pressure) * (ns-1.d0) * x/d
210 real(
double),
intent(in) :: wl,df
211 integer,
parameter :: nc = 6
213 real(
double) ::
wavelength2rgb(3), xipol,dxipol(nc),xipol0(nc), cbbnd(nc+1),cbctr(0:nc),cbdst(nc+1), rgb(3)
217 cbbnd = dble([390,450,492,577,597,622,770])
219 cbctr(ic) = (cbbnd(ic) + cbbnd(ic+1))/2.d0
220 if(ic.gt.1) cbdst(ic) = cbctr(ic) - cbctr(ic-1)
222 cbdst(1) = cbctr(1)-cbbnd(1)
223 cbdst(nc+1) = cbbnd(nc+1)-cbctr(nc)
227 dxipol = dble([0.5,1.0,1.0,0.5,0.5,0.5])
228 xipol0 = dble([0.5,1.0,2.0,3.0,3.5,4.0])
229 xipol = (wl-390.d0)/30.d0*0.5d0
231 if(wl.gt.cbctr(ic)) xipol = (wl-cbctr(ic)) / cbdst(ic+1) * dxipol(ic) + xipol0(ic)
233 xipol = min(4.5d0, max(0.d0, xipol) )
237 rgb = [0.d0, 0.d0, 0.d0]
238 if(xipol.ge.0.d0 .and. xipol.le.0.5d0)
then
239 rgb = [xipol, 0.d0, xipol]
240 else if(xipol.le.1.0d0)
then
241 rgb = [1.d0-xipol, 0.d0, xipol]
242 else if(xipol.le.2.0d0)
then
243 rgb = [0.d0, xipol-1.d0, 2.d0-xipol]
244 else if(xipol.le.3.0d0)
then
245 rgb = [xipol-2.d0, 1.d0, 0.d0]
246 else if(xipol.le.3.5d0)
then
247 rgb = [1.d0, 4.d0-xipol, 0.d0]
248 else if(xipol.le.4.0d0)
then
249 rgb = [1.d0, 4.d0-xipol, 0.d0]
250 else if(xipol.le.4.5d0)
then
251 rgb = [(4.5d0-xipol)*2, 0.d0, 0.d0]
253 call warn(
'SUFR_optics/wavelength2RGB(): xIpol out of bounds')
elemental subroutine reflectance_transmittance(angi, nref1, nref2, runp, tunp, rprp, rpar, tprp, tpar, angt)
Compute the reflectance for the transition from a medium with refractive index Nref1 to one with Nref...
pure real(double) function refractive_index_air(wavelength, temperature, pressure, humidity)
Computes real index of refraction of air given wavelength, temperature, pressure and relative humidit...
real(double) function, dimension(3) wavelength2rgb(wl, df)
Return an RGB-value representing the colour corresponding to a light ray with a given wavelength.