18 #include "itkNumericTraits.h"
21 #include <boost/math/special_functions/expint.hpp>
22 #include <boost/shared_ptr.hpp>
26 #define EPSILON 0.0000000000000000000000001
35 this->ProcessObject::SetNumberOfRequiredInputs(2);
36 this->ProcessObject::SetNumberOfRequiredOutputs(2);
72 if(this->GetNumberOfInputs() != 2)
92 if(this->GetNumberOfInputs() != 2)
105 return static_cast<itk::DataObject*
>(SpectralResponseType::New().GetPointer());
113 if(this->GetNumberOfOutputs() < 2)
126 if(this->GetNumberOfOutputs() < 2)
141 if(params.
Size()!=8) itkExceptionMacro( <<
"Must have 8 parameters in that order : LAI, Angl, PSoil, Skyl, HSpot, TTS, TTO, PSI" );
142 this->SetParameters(params);
159 if(parameters.
Size()!=8)
162 parameters[1]=m_Angl;
163 parameters[2]=m_PSoil;
164 parameters[3]=m_Skyl;
165 parameters[4]=m_HSpot;
169 this->SetParameters(parameters);
171 return this->GetParameters();
189 this->Calc_LIDF(m_Angl, lidf);
191 double cts, cto, ctscto, tants, tanto, cospsi, dso;
192 cts = vcl_cos(rd*m_TTS);
193 cto = vcl_cos(rd*m_TTO);
195 tants = vcl_tan(rd*m_TTS);
196 tanto = vcl_tan(rd*m_TTO);
197 cospsi = vcl_cos(rd*m_PSI);
198 dso = vcl_sqrt(tants*tants+tanto*tanto-2.*tants*tanto*cospsi);
208 double ttl, ctl, ksli, koli, sobli, sofli, bfli;
209 double chi_s, chi_o, frho, ftau;
213 for(
unsigned int i=0; i<lidf.size(); ++i)
216 ctl = vcl_cos(rd*ttl);
220 this->Volscatt(m_TTS, m_TTO, m_PSI, ttl, result);
249 ks = ks+ksli*lidf[i];
250 ko = ko+koli*lidf[i];
251 bf = bf+bfli*lidf[i];
252 sob = sob+sobli*lidf[i];
253 sof = sof+sofli*lidf[i];
257 double sdb, sdf, dob, dof, ddb, ddf;
265 double lambda, Es, Ed, Rsoil1, Rsoil2, rsoil0, rho, tau, PARdiro, PARdifo;
266 double sigb, sigf, att, m2, m, sb, sf, vb, vf, w;
267 double tss, too, tsstoo, rdd, tdd, rsd, tsd, rdo, tdo, rsos, rsod;
268 double rddt, rsdt, rdot, rsodt, rsost, rsot, dn;
269 double e1, e2, rinf, rinf2, re, denom, J1ks, J2ks, J1ko, J2ko;
270 double Ps, Qs, Pv, Qv, z, g1, g2, Tv1, Tv2, T1, T2, T3;
271 double alf, sumint, fhot, x1, y1, f1, fint, x2, y2, f2;
275 for (
int i = 0; i < nbdata; ++i)
282 rho = inRefl->GetResponse()[i].second;
283 tau = inTrans->GetResponse()[i].second;
288 PARdiro = (1-m_Skyl/100.)*Es;
289 PARdifo = (m_Skyl/100.)*Ed;
294 rsoil0 = m_PSoil*Rsoil1+(1-m_PSoil)*Rsoil2;
297 sigb = ddb*rho+ddf*tau;
298 sigf = ddf*rho+ddb*tau;
300 m2 = (att+sigb)*(att-sigb);
305 sb = sdb*rho+sdf*tau;
306 sf = sdf*rho+sdb*tau;
307 vb = dob*rho+dof*tau;
308 vf = dof*rho+dob*tau;
344 J1ks=Jfunc1(ks, m, m_LAI);
345 J2ks=Jfunc2(ks, m, m_LAI);
346 J1ko=Jfunc1(ko, m, m_LAI);
347 J2ko=Jfunc2(ko, m, m_LAI);
349 Ps = (sf+sb*rinf)*J1ks;
350 Qs = (sf*rinf+sb)*J2ks;
351 Pv = (vf+vb*rinf)*J1ko;
352 Qv = (vf*rinf+vb)*J2ko;
354 rdd = rinf*(1.-e2)/denom;
355 tdd = (1.-rinf2)*e1/denom;
356 tsd = (Ps-re*Qs)/denom;
357 rsd = (Qs-re*Ps)/denom;
358 tdo = (Pv-re*Qv)/denom;
359 rdo = (Qv-re*Pv)/denom;
361 tss = exp(-ks*m_LAI);
362 too = exp(-ko*m_LAI);
363 z = Jfunc3(ks, ko, m_LAI);
364 g1 = (z-J1ks*too)/(ko+m);
365 g2 = (z-J1ko*tss)/(ks+m);
367 Tv1 = (vf*rinf+vb)*g1;
368 Tv2 = (vf+vb*rinf)*g2;
369 T1 = Tv1*(sf+sb*rinf);
370 T2 = Tv2*(sf*rinf+sb);
371 T3 = (rdo*Qs+tdo*Ps)*rinf;
374 rsod = (T1+T2-T3)/(1.-rinf2);
379 if (m_HSpot>0) alf=(dso/m_HSpot)*2./(ks+ko);
380 if (alf>200) alf=200;
385 sumint = (1-tss)/(ks*m_LAI);
390 fhot=m_LAI*vcl_sqrt(ko*ks);
397 fint=(1.-exp(-alf))*0.05;
400 for(
unsigned int j=1; j<=20; ++j)
402 if (j<20) x2 = -vcl_log(1.-j*fint)/alf;
404 y2 = -(ko+ks)*m_LAI*x2+fhot*(1.-exp(-alf*x2))/alf;
406 sumint = sumint+(f2-f1)*(x2-x1)/(y2-y1);
416 rsos = w*m_LAI*sumint;
422 rddt = rdd+tdd*rsoil0*tdd/dn;
423 rsdt = rsd+(tsd+tss)*rsoil0*tdd/dn;
424 rdot = rdo+tdd*rsoil0*(tdo+too)/dn;
426 rsodt = rsod+((tss+tsd)*tdo+(tsd+tss*rsoil0*rdd)*too)*rsoil0/dn;
427 rsost = rsos+tsstoo*rsoil0;
430 resh = (rddt*PARdifo+rsdt*PARdiro)/(PARdiro+PARdifo);
431 resv = (rdot*PARdifo+rsot*PARdiro)/(PARdiro+PARdifo);
434 tmp1.first=lambda/1000.0;
436 tmp2.first=lambda/1000.0;
439 outVRefl->GetResponse().push_back(tmp2);
440 outHRefl->GetResponse().push_back(tmp1);
463 double excent = exp(-1.6184e-5*vcl_pow(ala, 3)+2.1145e-3*ala*ala-1.2390e-1*ala+3.2491);
465 unsigned int tx2, tx1;
466 double tl1, tl2, x1, x2, v, alpha, alpha2, x12, x22, alpx1, alpx2, dum, almx1, almx2;
469 for(
unsigned int i=0; i<n; ++i)
477 x1 = excent/sqrt(1.+excent*excent*vcl_tan(tl1)*vcl_tan(tl1));
478 x2 = excent/sqrt(1.+excent*excent*vcl_tan(tl2)*vcl_tan(tl2));
481 v = abs(cos(tl1)-cos(tl2));
487 alpha = excent/vcl_sqrt(vcl_abs(1.-excent*excent));
488 alpha2 = alpha*alpha;
493 alpx1 = vcl_sqrt(alpha2+x12);
494 alpx2 = vcl_sqrt(alpha2+x22);
495 dum = x1*alpx1+alpha2*log(x1+alpx1);
496 v = vcl_abs(dum-(x2*alpx2+alpha2*log(x2+alpx2)));
502 almx1 = sqrt(alpha2-x12);
503 almx2 = sqrt(alpha2-x22);
504 dum = x1*almx1+alpha2*asin(x1/alpha);
505 v = vcl_abs(dum-(x2*almx2+alpha2*asin(x2/alpha)));
512 for(
unsigned int i=0; i<n; ++i)
514 freq.push_back(temp[i]/sum);
526 double costs = vcl_cos(rd*tts);
527 double costo = vcl_cos(rd*tto);
528 double sints = vcl_sin(rd*tts);
529 double sinto = vcl_sin(rd*tto);
530 double cospsi = vcl_cos(rd*psi);
531 double psir = rd*psi;
532 double costl = vcl_cos(rd*ttl);
533 double sintl = vcl_sin(rd*ttl);
534 double cs = costl*costs;
535 double co = costl*costo;
536 double ss = sintl*sints;
537 double so = sintl*sinto;
547 double cosbts, cosbto, bts, ds, chi_s, bto, doo, chi_o;
548 double btran1, btran2, bt1, bt2, bt3, t1, t2 , denom, frho, ftau;
551 if (vcl_abs(ss)>1e-6) cosbts = -cs/ss;
554 if (vcl_abs(so)>1e-6) cosbto = -co/so;
557 if (vcl_abs(cosbts)<1)
559 bts = vcl_acos(cosbts);
570 if (vcl_abs(cosbto)<1)
572 bto = vcl_acos(cosbto);
592 btran1 = vcl_abs(bts-bto);
616 t1 = 2.*cs*co+ss*so*cospsi;
618 if (bt2>0) t2=sin(bt2)*(2.*ds*doo+ss*so*cos(bt1)*cos(bt3));
620 frho = ((CONST_PI-bt2)*t1+t2)/denom;
621 ftau = (-bt2*t1+t2)/denom;
623 if (frho<0) frho = 0;
624 if (ftau<0) ftau = 0;
636 ::Jfunc1(
const double k,
const double l,
const double t)
641 if(vcl_abs(del)>1e-3)
643 v = (exp(-l*t)-exp(-k*t))/(k-l);
648 v = 0.5*t*(exp(-k*t)+exp(-l*t))*(1.-del*del/12.);
656 ::Jfunc2(
const double k,
const double l,
const double t)
659 v = (1.-exp(-(k+l)*t))/(k+l);
666 ::Jfunc3(
const double k,
const double l,
const double t)
669 v = (1.-exp(-(k+l)*t))/(k+l);
678 Superclass::PrintSelf(os, indent);