Changeset 24207


Ignore:
Timestamp:
10/04/19 15:09:07 (5 years ago)
Author:
wchu28
Message:

added power

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Radar.cpp

    r24205 r24207  
    2121#include "./Radar.h"
    2222
     23/*Element macros*/
     24#define NUMVERTICES   6
     25#define NUMVERTICES2D 3
     26
    2327/*Radar constructors, destructors :*/
    2428Radar::Radar(){/*{{{*/
     
    7882        for(i=0;i<femmodel->elements->Size();i++){
    7983                Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
    80                 element->ComputeRadarAttenuation();
    81                 element->ComputeRadarPower();
     84                this->ComputeRadarAttenuation(element);
     85                this->ComputeRadarPower(element);
    8286        }
    8387        return 0.;
    8488}
    8589        /*}}}*/
    86 
     90IssmDouble 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}/*}}}*/
     182IssmDouble 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.