123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- #include "AerosolConcentration.h"
- #include "AtmosModel.h"
- #include "common.h"
- /**********************************************************************c
- c aerosol model (concentration) c
- c ---------------------------- c
- c c
- c c
- c v if you have an estimate of the meteorological c
- c parameter: the visibility v, enter directly the c
- c value of v in km (the aerosol optical depth will c
- c be computed from a standard aerosol profile) c
- c c
- c v=0, taer55 if you have an estimate of aerosol optical depth , c
- c enter v=0 for the visibility and enter the aerosol c
- c optical depth at 550 c
- c c
- c v=-1 warning: if iaer=0, enter v=-1 c
- c c
- c**********************************************************************/
- void AerosolConcentration::parse(const long int _iaer, const AtmosModel& atms)
- {
- iaer = _iaer;
- taer55 = 0.f;
- cin >> v;
- cin.ignore(numeric_limits<int>::max(),'\n'); /* ignore comments */
- if(v == 0)
- {
- cin >> taer55;
- cin.ignore(numeric_limits<int>::max(),'\n'); /* ignore comments */
- v = (float)(exp(-log(taer55/2.7628f)/0.79902f));
- }
- else if(v > 0) oda550(v, atms);
- }
- void AerosolConcentration::oda550(const float v, const AtmosModel& atms)
- {
- /* aerosol optical depth at wl=550nm */
- /* vertical repartition of aerosol density for v=23km */
- /* ( in nbr of part/cm3 ) */
- static const float an23[34] = {
- 2.828e+03,1.244e+03,5.371e+02,2.256e+02,1.192e+02,
- 8.987e+01,6.337e+01,5.890e+01,6.069e+01,5.818e+01,
- 5.675e+01,5.317e+01,5.585e+01,5.156e+01,5.048e+01,
- 4.744e+01,4.511e+01,4.458e+01,4.314e+01,3.634e+01,
- 2.667e+01,1.933e+01,1.455e+01,1.113e+01,8.826e+00,
- 7.429e+00,2.238e+00,5.890e-01,1.550e-01,4.082e-02,
- 1.078e-02,5.550e-05,1.969e-08,0.000e+00
- };
- /* vertical repartition of aerosol density for v=5km */
- /* ( in nbr of part/cm3 ) */
- static const float an5[34] = {
- 1.378e+04,5.030e+03,1.844e+03,6.731e+02,2.453e+02,
- 8.987e+01,6.337e+01,5.890e+01,6.069e+01,5.818e+01,
- 5.675e+01,5.317e+01,5.585e+01,5.156e+01,5.048e+01,
- 4.744e+01,4.511e+01,4.458e+01,4.314e+01,3.634e+01,
- 2.667e+01,1.933e+01,1.455e+01,1.113e+01,8.826e+00,
- 7.429e+00,2.238e+00,5.890e-01,1.550e-01,4.082e-02,
- 1.078e-02,5.550e-05,1.969e-08,0.000e+00
- };
- taer55 = 0;
- if(fabs(v) <= 0) return;
- if(iaer == 0) return;
- for(int k = 0; k < 32; k++)
- {
- float dz = atms.z[k+1] - atms.z[k];
- float az = (115.f / 18.f) * (an5[k] - an23[k]);
- float az1 = (115.f / 18.f) * (an5[k+1] - an23[k+1]);
- float bz = (5.f * an5[k] / 18.f) - (23.f * an23[k] / 18.f);
- float bz1 = (5.f * an5[k+1] / 18.f) - (23.f * an23[k+1] / 18.f);
- float bnz = az / v - bz;
- float bnz1 = az1 / v - bz1;
- float ev = (float)(dz * exp((log(bnz) + log(bnz1)) / 2));
- taer55 += ev * sigma * 1.0e-03f;
- }
- }
- void AerosolConcentration::print()
- {
- /* --- aerosol model (concentration) ---- */
- Output::Begin();
- Output::End();
- if(iaer == 0) return;
- Output::Begin();
- Output::Repeat(10, ' ');
- Output::Print(" optical condition identity :");
- Output::End();
- if(fabs(v) <= xacc)
- {
- Output::Begin();
- Output::Repeat(15, ' ');
- Output::Print(" user def. opt. thick. at 550nm :");
- ostringstream s;
- s.setf(ios::fixed, ios::floatfield);
- s << setprecision(4);
- s << setw(11) << taer55 << ends;
- Output::Print(s.str());
- Output::End();
- }
- else
- {
- Output::Begin();
- Output::Repeat(15, ' ');
- Output::Print(" visibility :");
- ostringstream s1;
- s1.setf(ios::fixed, ios::floatfield);
- s1 << setprecision(2);
- s1 << setw(8) << v << ends;
- Output::Print(s1.str());
- Output::Print(" km opt. thick. 550nm :");
- ostringstream s2;
- s2.setf(ios::fixed, ios::floatfield);
- s2 << setprecision(4);
- s2 << setw(9) << taer55 << ends;
- Output::Print(s2.str());
- Output::End();
- }
- Output::Begin();
- Output::End();
- }
- AerosolConcentration AerosolConcentration::Parse(const long int iaer, const AtmosModel& atms)
- {
- AerosolConcentration aerocon;
- aerocon.parse(iaer, atms);
- return aerocon;
- }
|