RadLib
Loading...
Searching...
No Matches
rad_planck_mean.cc
Go to the documentation of this file.
1
3
4#include "rad_planck_mean.h"
5#include <iostream>
6#include <cstdlib>
7
8using namespace std;
9
11
12const double rad_planck_mean::pmCoefs_H2O[6] = {-0.23093, -1.12390, 9.41530, -2.99880, 0.51382, -1.86840E-5};
13const double rad_planck_mean::pmCoefs_CO2[6] = {18.741, -121.310, 273.500, -194.050, 56.310, -5.8169};
14const double rad_planck_mean::pmCoefs_CO_lo[5] = {4.7869, -0.06953, 2.95775E-4, -4.25732E-7, 2.02894E-10};
15const double rad_planck_mean::pmCoefs_CO_hi[5] = {10.09, -0.01183, 4.7753E-6, -5.87209E-10, -2.5334E-14};
16const double rad_planck_mean::pmCoefs_CH4[5] = {6.6334, -0.0035686, 1.6682E-08, 2.5611E-10, -2.6558E-14};
17
46
48 double &awts,
49 const int iband,
50 const double T,
51 const double P,
52 const double fvsoot,
53 const double xH2O,
54 const double xCO2,
55 const double xCO,
56 const double xCH4){
57
58 if(iband != 0) {
59 cerr << "\n\n***** rad_planck_mean::get_k_a_oneband: iband should be zero since there is only one band in this model *****\n" << endl;
60 exit(0);
61 }
62
63 //----- the curve fits are in the range 300<T<2500. If T is out of bounds either quit,
64 //----- or just take T to be the limiting value.
65 //----- taking the limiting value is used below when the next few lines are commented.
66
67 // if(T < 300.0 || T > 2500.0) {
68 // cerr << "\n\n***** rad_planck_mean::get_k_a_oneband: T is out of range 300-2500 K *****\n" << endl;
69 // exit(0);
70 // }
71
72 kabs = 0.0;
73 awts = 1.0;
74
75 double K;
76 double Ti = (T<300) ? 1000.0/300 : ((T>2500) ? 1000.0/2500 : 1000.0 / T);
77
78 //------------- H2O
79
80 if(xH2O != 0.0){
81 K = pmCoefs_H2O[0] + Ti*(pmCoefs_H2O[1] + Ti*(pmCoefs_H2O[2] + Ti*(pmCoefs_H2O[3] + Ti*(pmCoefs_H2O[4] + Ti*(pmCoefs_H2O[5])))));
82 kabs += xH2O*P/101325.0*K;
83 }
84
85 //------------- CO2
86
87 if(xCO2 != 0.0){
88 K = pmCoefs_CO2[0] + Ti*(pmCoefs_CO2[1] + Ti*(pmCoefs_CO2[2] + Ti*(pmCoefs_CO2[3] + Ti*(pmCoefs_CO2[4] + Ti*(pmCoefs_CO2[5])))));
89 kabs += xCO2*P/101325.0*K;
90 }
91
92 //------------- CO
93
94 Ti = (T<300) ? 300 : ((T>2500) ? 2500 : T);
95
96 if(xCO != 0.0) {
97 if(T <= 750.0)
98 K = pmCoefs_CO_lo[0] + Ti*(pmCoefs_CO_lo[1] + Ti*(pmCoefs_CO_lo[2] + Ti*(pmCoefs_CO_lo[3] + Ti*(pmCoefs_CO_lo[4]))));
99 else
100 K = pmCoefs_CO_hi[0] + Ti*(pmCoefs_CO_hi[1] + Ti*(pmCoefs_CO_hi[2] + Ti*(pmCoefs_CO_hi[3] + Ti*(pmCoefs_CO_hi[4]))));
101 kabs += xCO*P/101325.0*K;
102 }
103
104 //------------- CH4
105
106 if(xCH4 != 0.0){
107 K = pmCoefs_CH4[0] + Ti*(pmCoefs_CH4[1] + Ti*(pmCoefs_CH4[2] + Ti*(pmCoefs_CH4[3] + Ti*(pmCoefs_CH4[4]))));
108 kabs += xCH4*P/101325.0*K;
109 }
110
111 //------------- soot
112
113 if(fvsoot != 0.0){
114 kabs += 1817 * fvsoot*Ti; // 1817 = 3.72*csoot/C2.
115 }
116}
117
145
146void rad_planck_mean::get_k_a(vector<double> &kabs,
147 vector<double> &awts,
148 const double T,
149 const double P,
150 const double fvsoot,
151 const double xH2O,
152 const double xCO2,
153 const double xCO,
154 const double xCH4){
155
156 double k;
157 double a;
158
159 get_k_a_oneband(k, a, 0, T, P, fvsoot, xH2O, xCO2, xCO, xCH4);
160
161 kabs.resize(1); kabs[0] = k;
162 awts.resize(1); awts[0] = a;
163}
static const double pmCoefs_CO2[]
static const double pmCoefs_CH4[]
void get_k_a_oneband(double &kabs, double &awts, const int iband, const double T, const double P, const double fvsoot, const double xH2O, const double xCO2, const double xCO, const double xCH4)
static const double pmCoefs_CO_hi[]
static const double pmCoefs_CO_lo[]
void get_k_a(std::vector< double > &kabs, std::vector< double > &awts, const double T, const double P, const double fvsoot, const double xH2O, const double xCO2, const double xCO, const double xCH4)
static const double pmCoefs_H2O[]
Header file for child class rad_planck_mean.