Changeset 24207
- Timestamp:
- 10/04/19 15:09:07 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Radar.cpp
r24205 r24207 21 21 #include "./Radar.h" 22 22 23 /*Element macros*/ 24 #define NUMVERTICES 6 25 #define NUMVERTICES2D 3 26 23 27 /*Radar constructors, destructors :*/ 24 28 Radar::Radar(){/*{{{*/ … … 78 82 for(i=0;i<femmodel->elements->Size();i++){ 79 83 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i); 80 element->ComputeRadarAttenuation();81 element->ComputeRadarPower();84 this->ComputeRadarAttenuation(element); 85 this->ComputeRadarPower(element); 82 86 } 83 87 return 0.; 84 88 } 85 89 /*}}}*/ 86 90 IssmDouble Radar::ComputeRadarAttenuation(Element* element){/*{{{*/ 91 //int numvertices = element->GetNumberOfVertices(); 92 IssmDouble eps0=8.85418782e-12; 93 IssmDouble eps_ice=3.17; 94 IssmDouble e=2.7183; 95 IssmDouble c=299792458; 96 IssmDouble k=1.3806488e-23; 97 IssmDouble eVtoJ=1.6e-19; 98 IssmDouble Tr_M07=252.1500; 99 IssmDouble Tr_W97=258.1500; 100 IssmDouble sig_ice_M07=9.2; 101 IssmDouble sig_ice_W97=9; 102 IssmDouble cond_H_M07=3.2; 103 IssmDouble cond_H_W97=4; 104 IssmDouble cond_Cl_M07=0.43; 105 IssmDouble cond_Cl_W97=0.55; 106 IssmDouble cond_NH_M07=0.8; 107 IssmDouble cond_NH_W97=1; 108 IssmDouble E_M07=8.1600e-20; 109 IssmDouble E_W97=9.2800e-20; 110 IssmDouble E_H_M07=3.2000e-20; 111 IssmDouble E_H_W97=3.3600e-20; 112 IssmDouble E_Cl_M07=3.0400e-20; 113 IssmDouble E_Cl_W97=3.6800e-20; 114 IssmDouble E_NH=3.6800e-20; 115 IssmDouble mol_H, mol_Cl, mol_NH; 116 IssmDouble attenuation_rate_macgregor[NUMVERTICES]; 117 IssmDouble attenuation_rate_wolff[NUMVERTICES]; 118 IssmDouble temperature, attenuation_rate_M07_pureice, attenuation_rate_M07_H, attenuation_rate_M07_Cl, attenuation_rate_M07_NH; 119 IssmDouble attenuation_rate_W97_pureice, attenuation_rate_W97_H, attenuation_rate_W97_Cl, attenuation_rate_W97_NH; 120 IssmDouble m1, m2, m3, m4, m5, m6, m7, m8; 121 IssmDouble w2, w3, w4, w5, w6, w7, w8; 122 GaussPenta* gauss=NULL; 123 124 /*Retrieve all inputs we will be needing: */ 125 Input* temp_input=element->GetInput(TemperatureEnum); _assert_(temp_input); 126 127 /* Start looping on the number of vertices: */ 128 gauss=new GaussPenta(); 129 130 for (int iv=0;iv<NUMVERTICES;iv++){ 131 gauss->GaussVertex(iv); 132 133 /*Get ice temperature: */ 134 temp_input->GetInputValue(&temperature,gauss); 135 136 mol_H=1.6; 137 mol_Cl=0.4; 138 mol_NH=0.5; 139 140 /*Compute M07 radar conductivity constant: */ 141 m1=(10*log10(e))/(1000*eps0*sqrt(eps_ice)*c); 142 m2=E_M07/k; 143 m3=cond_H_M07*mol_H; 144 m4=E_H_M07/k; 145 m5=cond_Cl_M07*mol_Cl; 146 m6=E_Cl_M07/k; 147 m7=cond_NH_M07*mol_NH; 148 m8=E_NH/k; 149 150 /*Compute MacGregor (M07) attenuation rate: */ 151 attenuation_rate_M07_pureice=m1*sig_ice_M07*exp(m2*((1/Tr_M07)-(1/temperature))); 152 attenuation_rate_M07_H=m3*exp(m4*((1/Tr_M07)-(1/temperature))); 153 attenuation_rate_M07_Cl=m5*exp(m6*((1/Tr_M07)-(1/temperature))); 154 attenuation_rate_M07_NH=m7*exp(m8*((1/Tr_M07)-(1/temperature))); 155 attenuation_rate_macgregor[iv]=attenuation_rate_M07_pureice+attenuation_rate_M07_H+attenuation_rate_M07_Cl+attenuation_rate_M07_NH; 156 157 /*Compute Wolff (W97) radar conductivity constant: */ 158 w2=E_W97/k; 159 w3=cond_H_W97*mol_H; 160 w4=E_H_W97/k; 161 w5=cond_Cl_W97*mol_Cl; 162 w6=E_Cl_W97/k; 163 w7=cond_NH_W97*mol_NH; 164 w8=E_NH/k; 165 166 /*Compute Wolff attenuation rate: */ 167 attenuation_rate_W97_pureice=m1*sig_ice_W97*exp(w2*((1/Tr_W97)-(1/temperature))); 168 attenuation_rate_W97_H=w3*exp(w4*((1/Tr_W97)-(1/temperature))); 169 attenuation_rate_W97_Cl=w5*exp(w6*((1/Tr_W97)-(1/temperature))); 170 attenuation_rate_W97_NH=w7*exp(w8*((1/Tr_W97)-(1/temperature))); 171 attenuation_rate_wolff[iv]=attenuation_rate_W97_pureice+attenuation_rate_W97_H+attenuation_rate_W97_Cl+attenuation_rate_W97_NH; 172 } 173 174 /*Add Attenuation rate results into inputs*/ 175 element->AddInput(new PentaInput(RadarAttenuationMacGregorEnum,&attenuation_rate_macgregor[0],P1Enum)); 176 element->AddInput(new PentaInput(RadarAttenuationWolffEnum,&attenuation_rate_wolff[0],P1Enum)); 177 178 /*Clean up*/ 179 delete gauss; 180 181 }/*}}}*/ 182 IssmDouble Radar::ComputeRadarPower(Element* element){/*{{{*/ 183 184 IssmDouble *xyz_list=NULL; 185 IssmDouble power_M07[NUMVERTICES]; 186 IssmDouble power_W97[NUMVERTICES]; 187 IssmDouble depth[NUMVERTICES]; 188 IssmDouble aircraft_elev=0.5; 189 IssmDouble eps_ice=3.15; 190 IssmDouble t_tp=273.15; /* triple point temperature [K] */ 191 IssmDouble p_tp=611.73; /* water pressure [Pa] */ 192 IssmDouble gamma=7.4200e-07; /* Clausius-Clapeyron constant [K/kPa] */ 193 IssmDouble attenuation_rate_macgregor, attenuation_rate_wolff, attenuation_total_M07, attenuation_total_W97; 194 IssmDouble thickness, surface, z, temperature, geometric_loss, reflectivity; 195 IssmDouble rho_ice, gravity, pressure, pressure_melting_pt, frozen_temp, basal_temp, basal_pmp; 196 GaussPenta* gauss=NULL; 197 198 /* Get node coordinates*/ 199 element->GetVerticesCoordinates(&xyz_list); 200 Input* atten_input_M07=element->GetInput(RadarAttenuationMacGregorEnum); _assert_(atten_input_M07); 201 Input* atten_input_W97=element->GetInput(RadarAttenuationWolffEnum); _assert_(atten_input_W97); 202 Input* surf_input=element->GetInput(SurfaceEnum); _assert_(surf_input); 203 Input* thick_input=element->GetInput(ThicknessEnum); _assert_(thick_input); 204 Input* temp_input=element->GetInput(TemperatureEnum); _assert_(temp_input); 205 206 /* Start looping on the number of vertices: */ 207 gauss=new GaussPenta(); 208 for (int iv=0;iv<NUMVERTICES;iv++){ 209 gauss->GaussVertex(iv); 210 211 /*Get all the inputs: */ 212 atten_input_M07->GetInputValue(&attenuation_rate_macgregor,gauss); 213 atten_input_W97->GetInputValue(&attenuation_rate_wolff,gauss); 214 thick_input->GetInputValue(&thickness,gauss); 215 temp_input->GetInputValue(&temperature,gauss); 216 surf_input->GetInputValue(&surface,gauss); 217 218 /*Compute depth below the ice surface: */ 219 z=xyz_list[3*iv+2]; 220 depth[iv]=(surface-z)/1e3; 221 222 /*Compute total attenuation: */ 223 attenuation_total_M07=attenuation_rate_macgregor*depth[iv]; 224 attenuation_total_W97=attenuation_rate_wolff*depth[iv]; 225 226 /*Compute geometric loss: */ 227 geometric_loss=10*log10((depth[iv]+aircraft_elev)/sqrt(eps_ice)); 228 229 /*Compute radar power: */ 230 power_M07[iv]=-geometric_loss-attenuation_total_M07; 231 power_W97[iv]=-geometric_loss-attenuation_total_W97; 232 233 /*Identify basal elements: */ 234 if(element->IsOnBase() && iv<NUMVERTICES2D){ 235 236 /*Compute pressure melting point: */ 237 rho_ice=element->FindParam(MaterialsLatentheatEnum); 238 gravity=element->FindParam(ConstantsGEnum); 239 pressure=rho_ice*gravity*thickness; 240 pressure_melting_pt=t_tp-gamma*(pressure-p_tp); 241 242 if((temperature-pressure_melting_pt)<=-1){ 243 reflectivity=-40; 244 } 245 else if((temperature-pressure_melting_pt)>-1 && (temperature-pressure_melting_pt)<0){ 246 reflectivity=0; 247 } 248 else{ 249 reflectivity=70; 250 } 251 power_M07[iv]=power_M07[iv]+reflectivity; 252 power_W97[iv]=power_W97[iv]+reflectivity; 253 } 254 } 255 256 /*Add power results into inputs*/ 257 element->AddInput(new PentaInput(RadarPowerMacGregorEnum,&power_M07[0],P1Enum)); 258 element->AddInput(new PentaInput(RadarPowerWolffEnum,&power_W97[0],P1Enum)); 259 260 /*Clean up and return*/ 261 delete gauss; 262 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.